之前的版本发完,有空来更新一下之前的gcc和llvm+clang工具链的编译脚本了。其实GCC 7是才release没多久但是llvm 4.0发布其实有一段时间了。

GCC

这回是GCC的脚本有一些改动。因为我现在开发机的环境很多组件并没有装,所以顺带发现了之前的构建脚本的一些问题。

在写这篇文章前,我突然想到以前流行了一段时间的服务器面试题:当一个BUG只有几百万分之一的概率会出现,怎么办?这个问题在这个BUG里只是毛毛雨而已,因为这次的BUG的出现概率是夸张的三亿分之一

我在好几年前自己开发了一个用于服务器进程间通信的框架,libatbus,以前用在了客户端的模块隔离的通信心痛中。并且现在开始正式用于服务器。但是前两天看了一下服务器的日志,发现了比较奇怪的-202错误。

之前我的域名只有owent.net和www.owent.net买了SSL证书,现在有letsencrypt可以拿到免费的SSL签证,就稍微花了点时间把我的域名的其他部分接入了letsencrypt签证系统。另外根据其他人的一些配置建议,提高了HTTPS的安全性配置和性能配置(主要是缓存)。另外原本我的blog就已经启用了spdy,然而现在新版本的nginx1.10)已经release,原先的spdy模块被取消,新增了http/2模块。但是直接换nginx掉包是不行滴(后面有说原因),所以顺带自己处理了一下HTTP/2和nginx新版本的问题。

并且也对公司里的域名和webserver也这么搞了一下。全面启用HTTPS。

接入letsencrypt

letsencrypt是Mozilla发起的一个提倡大家用加密的HTTP连接的项目,它允许大家申请到免费的SSL证书,用于HTTPS的证书认证。并且现在它的CA已经被大部分浏览器所接受。我这里本地Win10里使用的IE11,Edge,Firefox 46,Chrome 50全部都能认证通过了。当然手机上也可以。

libatbus

经过茫茫长时间的编写+过年在家无聊补充和修正单元测试,再加上这两天的整理,终于把以前的这个关于服务器通信中间件的基本功能和相应的单元测试完成啦。还是可以热烈庆祝一下的。

《关于BUS通信系统的一些思考(一)》 《关于BUS通信系统的一些思考(二)》 《关于BUS通信系统的一些思考(三)》

主要的思路还是在自动选择共享内存或是tcp或是unix socket进行通信。使用节点ID,屏蔽底层通信细节,屏蔽自动重连细节和节点之间自动建立直连的细节。同时基于目前的游戏服务器架构设计方式预留了一些拓展性的设计,以便于后续服务器框架的实现。主要是指全异步,树形结构,自动化的容灾设计和动态扩容缩容,不停服更新,统计等等。

小记最近踩得两个C++坑

记一下最近踩得两个C++独有的暗坑,其中一个和ABI相关。第二个坑其实之前研究过,但是没有实例,这次算是碰到了个典型的实例。

坑一:常量引用失效

在项目中碰到的实例的大致流程是:

  1. 获取某个容易的迭代器,迭代器内包含智能指针(std::shared_ptr)
  2. 把智能指针通过常量引用方式传入函数
  3. 执行过程中智能指针被释放
  4. 于是这时候,我们有了一个空悬的智能指针引用了

用代码表示的话,流程如下:

LLVM和Clang工具链的生成配置文件写得比较搓,所以略微麻烦,另外这个脚本没有经过多环境测试,不保证在其他Linux发行版里正常使用。

如果第一次执行出现安装失败,可以再执行一次。llvm的安装脚本问题多多

今年准备安安心心写一个协程库。一方面是觉得协程挺有意思,另一方面也是因为C/C++在这方面没有一个非常权威的解决方案。 按照我自己风格还是喜欢C++,所以协程库定名为 libcopp 。 源码托管在 github: https://github.com/owent/libcopp 镜像托管 http://git.oschina.net/owent/distinctionpp

首先介绍: 什么是协程

协程(coroutine),是一种用户态模拟线程的组件。(具体说明参见:http://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B

前几天我们项目的日志系统出现了一点问题,但是一直没有时间去深究。 昨天在同事的帮助下,无意中猜了一种可能性,结果还真被我猜中了,于是今天就特别研究了一下,记录下来。

其实主要问题是三个模块。

  • 模块 a, 静态库 a
  • 模块 b, 二进制 b, 静态引用a, 动态加载c
  • 模块 c, 动态链接库c, 静态引用a

关键在于静态库a里有一个静态全局变量,没错就是我们的日志模块。 原先的这个静态的模块中的静态全局变量是有构造函数的,也就是构造函数干了点事情。

心情大好,给VPS升级了一下系统,然后自己配了LNMP安装脚本,用yum源安装的话更新比较方便点哈 ​​这个过程挺麻烦啊,所以果断要记下来,以防以后要用到 如果是其他系统的话,几个配置路径和软件源地址还有yum指令替换掉,应该就可以了

最近研究了一下ARM的交叉编译环境搭建,太麻烦了必须作一下记录啊。 前两个方法比较简单一点,关键是淫家Google帮你弄好了大部分功能

方案一:(利用Android ndk + jni)

使用Android NDK的第一步当然是下载Android NDK啦。 http://developer.android.com/tools/sdk/ndk/index.html 使用jni的话,还必须下载相应的Android SDK http://developer.android.com/sdk/index.html 下载完后可以使用 $ANDROID_SDK_ROOT/sdk/tools/android update sdk –no-ui 来更新SDK包 附注:ANDROID_SDK_ROOT指代Android SDK根目录,NDK_ROOT指代Android NDK根目录。下同。 为了方便可以把$ANDROID_SDK_ROOT/sdk/tools:$ANDROID_SDK_ROOT/sdk/platform-tools:$NDK_ROOT 加到环境变量PATH里去 另外,Android 如果要命令行编译,需要ant和ant扩展,需要安装 Android 依赖的32位库 大致上是 glibc.i686 libzip.i686 libzip-devel.i686 libstdc++.i686 ant ant-* jdk 其中 libc.i686 libzip.i686 libzip-devel.i686 libstdc++.i686 ant ant-* 可以用 yum install或apt-get install 安装 jdk最好是官网下一个rpm包安装 rpm -ivh *.rpm

Linux 编译安装 GCC 4.8

详见: Linux 编译安装 GCC 4.8

GCC4.8发布啦,这个脚本在之前4.7的基础上做了点改进,移除一些过时的组件,增加了检测不到时自动下载源码包

PS:4.8.1开始全面支持C++11特性,并且脱离了ppl库,gdb也开始脱离ppl库了

用虚拟机软件虚拟出来的硬盘文件会随着使用而变大,因为磁盘碎片的产生,这个文件里也有很多的没用的空闲空间,为了节省空间,可以对虚拟硬盘文件进行压缩。

以下以Virtual Box的vdi格式为例

指导思想

  1. 虚拟机: 清理系统,卸载、删除系统垃圾文件
  2. 虚拟机: 将磁盘数据靠“前”移动,使用 Free Utility 将剩余磁盘空间写“零”
  3. 物理主机: 清除“零”字节空间,使用 VBoxManage modifyhd 工具压缩 VDI 磁盘镜像文件

Windows 虚拟机

  1. 虚拟机: 删除系统垃圾文件,运行磁盘整理程序…
  2. 虚拟机: 用 SDelete 工具写”零”,下载地址 http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx,下载后存到 Windows\System32\目录中,在命令行下执行 “sdelete -c”

sdelete -c c:

Linux编译安装GCC 4.7

详见: Linux编译安装GCC 4.7

准备环境及依赖项

  1. 支持 ISO C90 的编译器
  2. 用于创建Ada编译器的GNAT
  3. 支持POSIX的shell或GNU bash
  4. POSIX或SVR4的 awk工具
  5. GNU binutils
  6. gzip 版本1.2.4及以上 (可由GNU镜像列表 http://www.gnu.org/prep/ftp.html 或自动选择最佳镜像 http://ftpmirror.gnu.org 下载 )
  7. bzip2 版本 1.0.2及以上 (此处可下载 http://www.bzip.org/
  8. GNU make 工具 版本3.80及以上 (可由GNU镜像列表 http://www.gnu.org/prep/ftp.html 或自动选择最佳镜像 http://ftpmirror.gnu.org 下载 )
  9. GNU tar工具 版本1.14及以上 (可由GNU镜像列表 http://www.gnu.org/prep/ftp.html 或自动选择最佳镜像 http://ftpmirror.gnu.org 下载 )
  10. perl 版本5.6.1及以上 (此处可下载 http://www.perl.org/
  11. jar或zip和unzip工具 (此处可下载 http://www.info-zip.org)
  12. gmp库 版本4.3.2及以上 (可由GNU镜像列表 http://www.gnu.org/prep/ftp.html 或自动选择最佳镜像 http://ftpmirror.gnu.org 下载 )
  13. mpfr库 版本2.4.2及以上 (可由GNU镜像列表 http://www.gnu.org/prep/ftp.html 或自动选择最佳镜像 http://ftpmirror.gnu.org 下载 )
  14. mpc库 版本0.8.1及以上 (可由GNU镜像列表 http://www.gnu.org/prep/ftp.html 或自动选择最佳镜像 http://ftpmirror.gnu.org 下载 )
  15. ppl库 版本0.11及以上 (此处可下载 http://www.cs.unipr.it/ppl/Download/
  16. isl 版本 0.10 (可由GNU镜像列表 http://www.gnu.org/prep/ftp.html 或自动选择最佳镜像 http://ftpmirror.gnu.org 中gcc目录中的infrastructure目录下载 )
  17. cloog-ppl 版本0.15 或cloog 版本0.16(注意不能使用更高版本) (此处可下载 http://cloog.org/
我编译的环境

系统

Linux 常用工具

  • enca: http://dl.cihar.com/enca/   文件名编码转换
  • iconv: 文件编码转换
  • convmv: 文件名编码转换
  • ldd: 查看可执行文件或动态链接库的依赖库
  • getconf: 查看配置信息(如getconf LONG_BIT可知当前系统是32位还是64位版本)
  • tcpdump: 监视网络服务
  • sync: 将缓冲区内容写入磁盘
  • echo 3 > /proc/sys/vm/drop_caches: 手动释放缓存
  • nm: 查看符号表
  • readelf: 查看ELF信息(Executable and Linkable Format)
  • man: 文档
  • top/htop: 查看最高占用
  • perf: 性能数据采集
  • sar: 系统信息采集
  • uptime: 系统1分钟、5分钟和15分钟的系统平均负载
  • free: 内存使用情况
  • iostat: 磁盘IO使用情况
  • pidstat: 查看进程状态
  • ipcs: 查看共享内存、消息、信号量信息,如:ipcs -m 共享内存
  • objdump –CS –l [bin文件]: 不反人类的反编译
  • strace: 系统调用跟踪
  • pstack: 查看当前调用栈
  • lsof: 查看打开的文件
  • ip addr: 查看ip地址

man [章节号] 手册名称: