之前做了一个转Excel表到lua/二进制/json/xml的工具-xresloader。目的一方面是方便策划。另一方面是统一客户端和服务器的转表模式,并且要灵活适应环境变化。

最初做的时候考虑到既要方便Windows下策划和前端使用,又要方便后台部署在服务器上使用,甚至要集成在一些自动化的系统里。所以必须要跨平台。

libcopp更新 (merge boost 1.59 context)

之前由于兴趣写了一个协程框架,目前这个框架已经投入项目中使用。

这个框架的上下文部分是使用了boost.context,但是从开始写libcopp到现在,boost.context也更新了几个版本。而之前几次merge基本都是简单地跟进了make_fcontextjump_fcontext两个函数,这次就再稍微翻了一遍其他部分的代码。

boost.context的变化

首先是它在非windows栈分配的时候,增加了valgrind的适配。不过boost.context里的不同平台的栈缓冲区其实结构差不多,但是boost的实现里给复制粘贴了很多遍,所以我就干脆把这些地方合并啦。减少了一些重复代码。

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

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

坑一:常量引用失效

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

Redis全异步高可用Driver设计稿

前言

现在Redis的集群功能已经Release。但是并没有一个官方直接提供的高可用性的API可以使用。有的只有解决方案,Sentinel和Cluster。所以有必要自己设计一套高可用的Driver层以供业务使用。

之前有搜集过一些常用的命令脚本,其中有vim的部分。但是vim内置的很多功能那些个命令显然是不够的,而且那些记录的很多也不常用,于是想到专门开一个页面记录vim常用的命令集。

前言

搭建自动化构建(jenkins)的过程中碰到了挺多问题,需要装各种插件解决。为了方便下次部署,这里先记录一下用到的插件及用途

Jenkins插件

  1. Ant Plugin java打包工具
  2. Authorize Project 项目权限管理
  3. Clang Scan-Build Plugin clang静态分析(尚未使用)
  4. Cppcheck Plug-in cppcheck静态代码分析
  5. Credentials Plugin 登入凭据管理
  6. Dashboard View 总览
  7. disk-usage plugin 磁盘使用量统计
  8. Doxygen Plug-in doxygen插件(没使用成功,我还是自己命令行生成的)
  9. Email Extension Plugin 定制化邮件
  10. embeddable-build-status 提供接口嵌入构建状态到外部系统
  11. Environment Injector Plugin 把参数化构建的参数导入到环境变量
  12. GIT client pluginGIT plugin
  13. Github和Gitlab集成插件
  14. Gravatar插件
  15. Matrix Authorization Strategy PluginMatrix Project Plugin 项目矩阵授权策略
  16. Maven Integration plugin 更高级的java构建工具
  17. openid和OpenID4Java API
  18. Publish Over SSH
  19. Release Plugin
  20. Slave SetupPluginslave-statusSSH Slaves pluginWindows Slaves Plugin
  21. SSH Agent PluginSSH Credentials Plugin
  22. Static Analysis Utilities
  23. Xcode integration 用于集成xcode工程文件 上面没有链接的插件属于我没有主动去使用(自动开启或者装了没用过的)的。没写注解的是反正一看就知道什么意思。

Written with StackEdit.

前言

最近一个人搞后台,框架底层+逻辑功能茫茫多,扛得比较辛苦,一直没抽出空来写点东西。

空闲的时间,完善了LLVM+Clang+libc++和libc++abi的编译脚本。不得不说clang的编译脚本质量比gcc差不是一点点。为了在centos下尽可能编译出更多的功能和llvm的子项目,要各种改各种试才终于自举通过,并且这种情况编出来的二进制大得夸张。不过总算是告一段落。

因为项目需要,买了本《Redis的设计与实现》的电子版,顺便给这本书的作者贡献了一丢丢的Redis文档的翻译。这本书通篇贴代码,有点看blog的感觉,写得还是很简单易懂的。(不过谁告诉我为毛我花了30大洋买完不到半个月就变成10块了,坑爹么不是。T_T)

另外还零零散散地看了些《程序员的自我修养-链接、装载与库》 这本书云风之前推荐过。并且在我看得这些里国人写得书里,这确实是一本值得推荐,并且不可多得的佳作。

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

CHANGE

相对于上一个版本Linux 编译安装 LLVM + Clang 3.5的变化:

  1. 这个版本llvm的源码修复了一个会导致开启exception功能之后的编译bug,所以编译脚本不再会修改llvm的源代码
  2. 编译过程改成了两次编译
  3. 编译过程完全使用cmake。
  4. 终于自举编译成功啦,第二次自举编译完成后,不再依赖libstdc++,转而依赖编译出来的libc++和libc++abi,但是仍然会依赖libgcc_s.so
  5. 多线程编译的时候时不时会出现奇怪的失败,所以默认改成单线程编译
  6. 修复编译完成后的提示输出

NOTICE

由于生成动态库会出现一些问题,所以目前都是采用llvm默认的静态链接的方式。但是静态链接生成的文件比较大,并且链接的东西很多,有可能会出现链接超时的错误。 这时候可以通过手动cd到编译目录,执行 make && make install 即可

例行回顾一下2014年学习和看到的技术、思路、方案总结:

Native Code 型语言

C/C++

脚本 & 托管语言

Lua

  • 《Lua性能分析》 – 做这个得原因是lua profile不支持lua5.2。其他好用的工具都不免费。干脆就自己搞个性能分析工具,比较开心的是被gaccob拿去改装啦
  • 《tolua++内存释放坑》 – tolua++的坑真不少,已经发现的已经两个了,没发现的还不知道,所以为了保险起见,自己写了个lua函数绑定机制。等新的机制趋于成熟了再发分享出来

Javascript

  • 《基于Chrome插件的开发工具链》 – 之前在腾讯的时候,跨部门沟通效率太低,所以干脆自己写浏览器插件来做一些自动化和多个工具集成方面的工作。于是研究了一下浏览器插件的编写,实际上后来还研究了Firefox的,总结发到腾讯KM里但是忘记转发一份到blog了。现在离职了拿不到,过两天找人问问看能不能拿回来。

PHP

工具及其他

新增的开源项目

  1. WP Code Highlight.js
  2. libatbus
  3. xresloader
  4. libiniloader
  5. client-debuger

2014年的规划完成情况

  • [已完成] 第一是学习下Python,这玩意现在很火,有空得研究下;(目前挺多工具用python写得,但是都是小工具,不成体系所以并没有发布)
  • [已完成] 第二是看看Java的垃圾回收的一些实现,看看能不能用在C++里(java实现在语言层,算法比较多且复杂,c++的话暂时还没想到什么好办法移植)
  • [部分] 第三是继续看一些底层的技术书籍,比如TCP/IP详解等等(这本书没看,其他的倒是不少)
  • [已完成] 第四是基本完成协程框架(功能基本完成)
  • [已完成] 第五是重拾Java,使用Java制作小工具而不是C++,以达到更好地跨平台特性( xresloader 这货就是我一直想做没时间做,现在终于做出来的东东,java编写。跨平台,至少我自己这里Linux和Windows下都在用)

总结

总的来说,2014年感觉看得东西都更加深入一些,量少一些。今年没看多少书,大致浏览了下《C++ Primer 第五版》,精读了《深度探索C++对象模型 》,第一遍过了一下《Unix环境高级编程》这本书看一遍果断是不能完全理解的,我看完第一遍的感觉最模糊的地方是终端控制那一块。还有看了一点点的《Linux内核设计艺术》果然如gaccob所说,看起来没什么意思,有点教科书的感觉。其他的零零散散的也没什么意思的书也有,比如一个讲类似libevent的事件框架的,一个讲libuv框架的,等等。目前正在抽时间精读《程序员的自我修养—链接、装载与库》,这确实算是国人写得不多得的好书哇。

介于配置gitlab邮箱测试起来补交麻烦而且看日志还不明朗,这里记录一下成功配置好的企业邮箱方案。

模板如下:

    # mail config
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
    gitlab_rails['smtp_port'] = 465
    gitlab_rails['smtp_user_name'] = "完整邮件账户"
    gitlab_rails['smtp_password'] = "密码"
    gitlab_rails['smtp_domain'] = "邮件账户所在域"
    gitlab_rails['smtp_authentication'] = "login"
    gitlab_rails['smtp_enable_starttls_auto'] = true
    gitlab_rails['smtp_tls'] = true  # 这个很重要,而且是官方文档里没提及的 

    # If your SMTP server does not like the default 'From: gitlab@localhost' you
    # # can change the 'From' with this setting.
    gitlab_rails['gitlab_email_from'] = '完整邮件账户'
比如我的邮箱admin@owent.net

配置如下:
    # mail config
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
    gitlab_rails['smtp_port'] = 465
    gitlab_rails['smtp_user_name'] = "admin@owent.net"
    gitlab_rails['smtp_password'] = "admin@owent.net的密码"
    gitlab_rails['smtp_domain'] = "owent.net"
    gitlab_rails['smtp_authentication'] = "login"
    gitlab_rails['smtp_enable_starttls_auto'] = true
    gitlab_rails['smtp_tls'] = true

    # If your SMTP server does not like the default 'From: gitlab@localhost' you
    # # can change the 'From' with this setting.
    gitlab_rails['gitlab_email_from'] = 'admin@owent.net'

done.

前言

本来想参考下tolua++的对象生命周期维护方式。一不小心发现了一个坑。

代码追踪

我这里用得是tolua++ 1.0.93版本。

tolua++在new一个类的时候,会把类指针作为userdata传入lua,建立metatable并通过tolua_classevents函数给metatable注册魔术方法。

github是程序员经常上的网站,但如果是在一家苦逼不能访问外网的公司,那不能把自己的代码托管在github上绝对是一件非常痛苦的事情。如 果想要在公司内网也可以用github托管自己的代码,那就要自己搭建类似github的服务器,好在类似github的框架有很多,基本上都是基于 git的,可以无缝衔接github而无需额外学习其他技术。

前言

Lua性能分析本来有一些现成的工具,比如LuaProfile,不幸的是这货不支持luajit,另外LuaStudio虽然挺好用但是是收费的。 比较不爽,刚好Lua本身提供钩子功能,用来写调试工具和性能分析工具都比较简单,索性就自己写一个。

前言

近期倒腾下客户端,想搞个cocos2d的工具。 之前的那个集成到Win32工具下的调试辅助工具是直接用的windows api。拓展起来巨麻烦。而且Windows默认的字符集是宽字符集,和cocos2d与lua交互起来得到utf-8之间转来转去,十分麻烦。所以干脆花点时间一口气搞完这货。

近期由于一些需要(特别是上Google),研究了下在VPS上搭建VPN服务器的方法。其中遇到一些坑,顺带记下来以备下次使用。

其实在有VPS的情况下,还有另外一种替代方案。那就是在路由器上直接ssh隧道+sock5代理+使用autossh自动重连+使用polipo作HTTP代理+PAC文件自动代理切换。实现,最终我在家里就是这么搞得,而且这样对网络结构没有其他影响。

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

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