针对Java JIT的优化(转表工具:xresloader)
之前做了一个转Excel表到lua/二进制/json/xml的工具-xresloader。目的一方面是方便策划。另一方面是统一客户端和服务器的转表模式,并且要灵活适应环境变化。
最初做的时候考虑到既要方便Windows下策划和前端使用,又要方便后台部署在服务器上使用,甚至要集成在一些自动化的系统里。所以必须要跨平台。
libcopp更新 (merge boost 1.59 context)
libcopp更新 (merge boost 1.59 context)
之前由于兴趣写了一个协程框架,目前这个框架已经投入项目中使用。
这个框架的上下文部分是使用了boost.context,但是从开始写libcopp到现在,boost.context也更新了几个版本。而之前几次merge基本都是简单地跟进了make_fcontext和jump_fcontext两个函数,这次就再稍微翻了一遍其他部分的代码。
boost.context的变化
首先是它在非windows栈分配的时候,增加了valgrind的适配。不过boost.context里的不同平台的栈缓冲区其实结构差不多,但是boost的实现里给复制粘贴了很多遍,所以我就干脆把这些地方合并啦。减少了一些重复代码。
小记最近踩得两个C++坑
小记最近踩得两个C++坑
记一下最近踩得两个C++独有的暗坑,其中一个和ABI相关。第二个坑其实之前研究过,但是没有实例,这次算是碰到了个典型的实例。
坑一:常量引用失效
在项目中碰到的实例的大致流程是:
Redis全异步(HA)Driver设计稿
Redis全异步高可用Driver设计稿
前言
现在Redis的集群功能已经Release。但是并没有一个官方直接提供的高可用性的API可以使用。有的只有解决方案,Sentinel和Cluster。所以有必要自己设计一套高可用的Driver层以供业务使用。
关于firewalld和systemd的一些命令速记
前言
CentOS 7 已经用firewalld替换掉了iptables并用systemd来管理启动服务(之前是chkconfig)。而且下一个Ubuntu的长期支持版也要这么干了。
Jenkins(hudson)插件记录
前言
搭建自动化构建(jenkins)的过程中碰到了挺多问题,需要装各种插件解决。为了方便下次部署,这里先记录一下用到的插件及用途
Jenkins插件
- Ant Plugin java打包工具
- Authorize Project 项目权限管理
- Clang Scan-Build Plugin clang静态分析(尚未使用)
- Cppcheck Plug-in cppcheck静态代码分析
- Credentials Plugin 登入凭据管理
- Dashboard View 总览
- disk-usage plugin 磁盘使用量统计
- Doxygen Plug-in doxygen插件(没使用成功,我还是自己命令行生成的)
- Email Extension Plugin 定制化邮件
- embeddable-build-status 提供接口嵌入构建状态到外部系统
- Environment Injector Plugin 把参数化构建的参数导入到环境变量
- GIT client plugin 和GIT plugin
- Github和Gitlab集成插件
- Gravatar插件
- Matrix Authorization Strategy Plugin和Matrix Project Plugin 项目矩阵授权策略
- Maven Integration plugin 更高级的java构建工具
- openid和OpenID4Java API
- Publish Over SSH
- Release Plugin
- Slave SetupPlugin 、slave-status、SSH Slaves plugin、Windows Slaves Plugin
- SSH Agent Plugin、SSH Credentials Plugin
- Static Analysis Utilities
- Xcode integration 用于集成xcode工程文件 上面没有链接的插件属于我没有主动去使用(自动开启或者装了没用过的)的。没写注解的是反正一看就知道什么意思。
Written with StackEdit.
我们的Lua类绑定机制
前言
最近一个人搞后台,框架底层+逻辑功能茫茫多,扛得比较辛苦,一直没抽出空来写点东西。
空闲的时间,完善了LLVM+Clang+libc++和libc++abi的编译脚本。不得不说clang的编译脚本质量比gcc差不是一点点。为了在centos下尽可能编译出更多的功能和llvm的子项目,要各种改各种试才终于自举通过,并且这种情况编出来的二进制大得夸张。不过总算是告一段落。
因为项目需要,买了本《Redis的设计与实现》的电子版,顺便给这本书的作者贡献了一丢丢的Redis文档的翻译。这本书通篇贴代码,有点看blog的感觉,写得还是很简单易懂的。(不过谁告诉我为毛我花了30大洋买完不到半个月就变成10块了,坑爹么不是。T_T)
另外还零零散散地看了些《程序员的自我修养-链接、装载与库》 这本书云风之前推荐过。并且在我看得这些里国人写得书里,这确实是一本值得推荐,并且不可多得的佳作。
LLVM+Clang+Libcxx+Libcxxabi(3.6)工具链编译(完成自举编译)
LLVM和Clang工具链的生成配置文件写得比较搓,所以略微麻烦,另外这个脚本没有经过多环境测试,不保证在其他Linux发行版里正常使用。
CHANGE
相对于上一个版本Linux 编译安装 LLVM + Clang 3.5的变化:
- 这个版本llvm的源码修复了一个会导致开启exception功能之后的编译bug,所以编译脚本不再会修改llvm的源代码
- 编译过程改成了两次编译
- 编译过程完全使用cmake。
- 终于自举编译成功啦,第二次自举编译完成后,不再依赖libstdc++,转而依赖编译出来的libc++和libc++abi,但是仍然会依赖libgcc_s.so
- 多线程编译的时候时不时会出现奇怪的失败,所以默认改成单线程编译
- 修复编译完成后的提示输出
NOTICE
由于生成动态库会出现一些问题,所以目前都是采用llvm默认的静态链接的方式。但是静态链接生成的文件比较大,并且链接的东西很多,有可能会出现链接超时的错误。 这时候可以通过手动cd到编译目录,执行 make && make install 即可
回顾2014
例行回顾一下2014年学习和看到的技术、思路、方案总结:
Native Code 型语言
C/C++
- 《C++11动态模板参数和type_traits》 – 目前最上流C++设计模式就是模板,各种逆天的用法。这个只是冰山一角,也算是个敲门砖
- 《简单C++单元测试框架(支持一键切到GTest或Boost.Test)》 – 无论是Boost.Test还是GTest都过于复杂。而且跨平台方面比较有问题,于是就搞了个自己的单元测试框架。然而为了让一些平台下能利用到GTest和Boost.Test里的一些有用的特性,就在设计之初就做了一些适配层,这样可以很容易地切换到GTest或者Boost.Test。
- 《捣鼓一个协程库》 – 协程还是蛮上流的,参照微信libco库和微软Task系统的API而写出来的一个协程任务系统。基本功能已经完成。
- 《再议 C++ 11 Lambda表达式》 – 稍微深入C++11的lambda表达式和遇到的问题。
- 《[libiniloader] Project》 – 同样是由于现有的ini读取库都过于复杂,而且我这里ini读取主要用于游戏配置,希望接口简单,并且支持像PHP里那种层次关系。所以就有了这个玩意。自己用状态机简单实现的词法分析,并使用模板实现导出数据,还做了对象conf文件用#来注释的支持。最重要的是,所有的实现只有两个文件(一个.cpp和一个.h)。
- 《关于BUS通信系统的一些思考(一)》、《关于BUS通信系统的一些思考(二)》 – 主要是堆现有我接触到的一些通信系统的一个小总结,然后试着设计一个能解决一些问题的设想。具体实现仍在缓慢实现过程中。目前比较让自己满意的部分是性能测试和稳定性测试。
- 《集成Qt Webkit 到cocos2d-x》 – 由于项目工具需要,了解了一下Qt。Qt的设计还是比较有意思的。
- 《Android NDK undefined reference to ___tls_get_addr 错误》 – 写跨平台代码过程中碰到的android的一个奇怪的链接问题而引发的一些小研究。不用不知道,一用吓一跳。
脚本 & 托管语言
Lua
- 《Lua性能分析》 – 做这个得原因是lua profile不支持lua5.2。其他好用的工具都不免费。干脆就自己搞个性能分析工具,比较开心的是被gaccob拿去改装啦
- 《tolua++内存释放坑》 – tolua++的坑真不少,已经发现的已经两个了,没发现的还不知道,所以为了保险起见,自己写了个lua函数绑定机制。等新的机制趋于成熟了再发分享出来
Javascript
- 《基于Chrome插件的开发工具链》 – 之前在腾讯的时候,跨部门沟通效率太低,所以干脆自己写浏览器插件来做一些自动化和多个工具集成方面的工作。于是研究了一下浏览器插件的编写,实际上后来还研究了Firefox的,总结发到腾讯KM里但是忘记转发一份到blog了。现在离职了拿不到,过两天找人问问看能不能拿回来。
PHP
- 《[WP Code Highlight.js] Project》 – 迁移blog写作工具的产物,集成highlight.js用得,并且已发布到wordpress的plugin里
工具及其他
- 《又碰到了这个解谜游戏,顺带记下地址》 – 以前遇到的解谜游戏的地址
- 《Linux 编译安装 GCC 4.9》 – gcc 4.9已发布,在4.8的基础上新增优化了很多功能
- 《记录一些在线编辑器》 – 这是转向使用markdown写作的开始
- 《LLVM + Clang + Libcxx + Libcxxabi 工具链编译》 – 这是主流编译器构建的一个补充,clang的编译系统做的远不如gnu的。编译起来困难重重。
- 《近期研究VPN的一些记录(OpenVPN,pptp,l2tp)》 – 研究的VPN搭建流程,主要是作为软件开发。不翻墙没法活啊。工具、很多优秀的开源项目都搞不到
- 《Gitlab环境搭建小计》、《gitlab腾讯企业邮箱配置》 – 开始主要版本控制系统转向git的开始
新增的开源项目
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框架的,等等。目前正在抽时间精读《程序员的自我修养—链接、装载与库》,这确实算是国人写得不多得的好书哇。
Android NDK undefined reference to ___tls_get_addr 错误
本来看到Android的ndk都开始用gcc4.8和gcc4.9了,而且gcc4.8.1开始支持全部的c++11的特性,我就很happy地用上了。结果出现这么个错误。
gitlab腾讯企业邮箱配置
介于配置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++的对象生命周期维护方式。一不小心发现了一个坑。
代码追踪
我这里用得是tolua++ 1.0.93版本。
tolua++在new一个类的时候,会把类指针作为userdata传入lua,建立metatable并通过tolua_classevents函数给metatable注册魔术方法。
[转]类似github的框架
github是程序员经常上的网站,但如果是在一家苦逼不能访问外网的公司,那不能把自己的代码托管在github上绝对是一件非常痛苦的事情。如 果想要在公司内网也可以用github托管自己的代码,那就要自己搭建类似github的服务器,好在类似github的框架有很多,基本上都是基于 git的,可以无缝衔接github而无需额外学习其他技术。
集成Qt Webkit 到cocos2d-x
前言
近期倒腾下客户端,想搞个cocos2d的工具。 之前的那个集成到Win32工具下的调试辅助工具是直接用的windows api。拓展起来巨麻烦。而且Windows默认的字符集是宽字符集,和cocos2d与lua交互起来得到utf-8之间转来转去,十分麻烦。所以干脆花点时间一口气搞完这货。
Gitlab环境搭建小计
最近给公司搭建Gitlab作源代码管理工具 满满都是坑呐。
Gitlab 开源仓库软件包官方地址: https://about.gitlab.com/
https://about.gitlab.com/downloads/ 这里有各个Linux分支的安装包,下面的说明笔记齐全,直接使用比较简单。
近期研究VPN的一些记录(OpenVPN,pptp,l2tp)
LLVM + Clang + Libcxx + Libcxxabi 工具链编译
LLVM和Clang工具链的生成配置文件写得比较搓,所以略微麻烦,另外这个脚本没有经过多环境测试,不保证在其他Linux发行版里正常使用。
如果第一次执行出现安装失败,可以再执行一次。llvm的安装脚本问题多多