博客有两个月没更新了吧,先说说这段时间都在做些什么吧,六月初的时候实验室项目验收完,以为可以轻松下来了,于是开了一个新的开源项目在做,这个稍后再说,没过多久就被拉去给实验室的新项目做设计文档去了,这活做起来比硬编码要麻烦得多,于是大多数时间都在为这个事情心烦,稍微有点闲下来的时间就去写点代码,接下来说下最近在做的这个开源项目。
之前的Openfetion虽然也受到了一些开源社区朋友的好评,但软件质量怎么样我心里比谁都明白,在twitter上我也公开承认过Openfetion的代码质量以及软件架构都非常差,说到代码质量,最初在开发Openfetion的时候没有想过会把它作为一个通用的软件拿出来给大家用,而是自己纯粹在写着玩,于是写得很随意,当然这也得怪我这种恶劣的编程习惯,专业的coder即便是写一个测试用的小代码也会严格按规范来,这是一种习惯,我承认之前做得不够好。再说到软件架构,对于IM软件我之前一样没有什么经验,在没有经过调研的情况就盲目开始编码,完全没有参考现有的开源软件架构,甚至没有个合适的事件循环,所以Openfetion目前的状态是勉强能用。
之前考虑过重构Openfetion,但其实重构的成本要远远高于重写,于是我决定终止Openfetion项目,不再为Openfetion增加/修改代码,也不鼓励其它人对它进行修改。
作为Openfetion的替代品,我发起了新的开源项目Hybrid(https://github.com/levin108/hybrid),这同样是一款IM软件,我把它定位为类似于Pidgin/Empathy的IM框架,但即没有使用libpurple也没有使用telepathy,这两个库使用起来都还是有很多限制,我喜欢自由自在的写代码,我不太想考虑太多关于Hybrid这个软件能走多远,能有多少人用,我需要一款这样的软件,我想让它支持飞信和Gtalk,这是我最需要的两种通信协议,这就够了。
Hybrid同样也使用了GTK作为UI库,纯C语言开发,用了OpenSSL处理加密逻辑,使用glib的GIOChannel来实现了异步IO事件循环,同时把libxml2的API做了封装,xml的处理代码看起来简洁多了(libxml2的API命名规则看起来实在太难受了,而且还需要经常对它的自定义数据类型进行转换)。软件的整体架构上参考了一个pidgin,之前的Openfetion用多线程来处理并发逻辑,线程之间的同步开销很大,现在经常还会出现的崩溃问题大多来源于线程同步没有做好。现在采用的方法是采用单线程,将处理逻辑都交给GUI线程来进行处理,当然所有的IO都必须是非阻塞IO,通过异步IO的方法来检测IO事件,当前所有的操作都必须是非阻塞的,包括SSL/TLS握手等,但目前还存在的一个问题是DNS解析过程仍然是阻塞的,我还没有去研究如何实现非阻塞DNS解析,这个会加入TODO List中。至于模块化也是采用了glib中的gmodule来实现的,没有直接使用dlopen的方法,这样应该会提高一点可移植性吧。
关于协议模块,飞信的协议模块在现有的pidgin插件的基础上重写了,使用了封装过的xml接口,同样也使用了一致的编码风格,但在之前的基础上写代码效率就高了很多,很快就完成了。另外关于Gtalk的协议模块也没有花太多时间,用了一个周末的时间就把基础框架弄好了,因为用的是XMPP,开放的协议实现起来非常简单,只需要读一遍协议然后照着开发就好了,一路写下来都很顺,没有遇到什么大的麻烦。
总之到目前为止,这款软件已经基本能满足我的需要了,但还是有很多需要完善的地方,如好友的搜索,webkit的聊天界面,以及自定义请求对话框等,这些等以后慢慢再更新,现在面临毕业找工作,时间相对也较少,有空的时候就更新一点。
还没有想好什么时候要发布一个正式版,有一点点追求完美,总想把它做得更好一点,有感兴趣的同学可以去把代码clone下来玩玩,有用过的同学欢迎反鐀意见。