The Ejabberd Socket Infrastructure

作者:JerryXia | 发表于 , 阅读 (20)
The Ejabberd Socket InfrastructureMay 23, 2012
Welcome to my first blog about ejabberd source code hacking. In these series of blogs, I want to take notes about how the ejabberdworks, and how to hack it to get customized features.
The source code version in discussion is ejabberd 2.1.10 release, which is the latest stable version at this time.
IntroThe first step to source hacking is code reading. Ejabberd is a big project (with 80k+lines of erlang code), so it’s impossible for us to understa...阅读全文

Writing a Simple Echo Service Module

作者:JerryXia | 发表于 , 阅读 (19)
Writing a Simple Echo Service ModuleMay 25, 2012
In this blog, I will continue my discussion on ejabberd’s socket infrastructure.For the sake of simplicity, let’s write a simple echo service module, which receives any packet from the client, and echo the packet back.
Register our listenerFirst, we must register our service in the ejabberd’s config file:
%% file: ejabberd.cfg{listen,[%% ...{5555, echo_service, []},%% …]}Quick and dirty echo serviceOur echo service will be listening at 5555/tcp...阅读全文

使用virtualenv创建隔离的python环境

作者:JerryXia | 发表于 , 阅读 (15)
使用virtualenv创建隔离的python环境Jul 28, 2013
python各种版本之间的不兼容性着实让人头疼, 工作中使用python常常需要一个团队中统一python以及各种库的版本. 在ruby中有一个好用的工具rvm可以在用户的家目录下安装一个(或多个)本地的ruby, 然后各个工程可以使用自己的ruby和gem的版本.Python里面有没有类似的工具呢? 有的, 这就是virtualenv.
本地安装python虽然virtualenv可以直接从系统本身的python中使用, 但是这偏离了我们的初衷: 使用完全隔离的, 和系统默认的python无关的环境. 为什么要这样呢? 因为系统中有很多程序依赖于系统的python, 如果我们替代掉系统的python, 会导致一些程序出错. 例如在centos上, 如果把系统默认的python给换掉, ibus和yum就很有可能起不来了. 如果使用系统的python版本, 又可能让我们开发的应用程序跑不起来, 比较头疼. 所以最好的解决方案还是本地安装一个和系统无关的python.
如果在ubuntu上编译安装pytho...阅读全文

Bash在cd进入目录时自动启动脚本

作者:JerryXia | 发表于 , 阅读 (19)
玩android代码进入目录后总是需要source build/envsetup.sh, 比较烦, 能不能在cd进入时自动完成这个功能呢?
可以的, 首先我们在.bashrc中重新定义cd这个函数:
mycd() {\cd $@local hook_file=.cd_hookif [[ -f $hook_file ]]; then. $hook_filefi}alias cd='mycd'这样, 在进入一个目录后就会检测该目录下是否有.cd_hook文件, 如果有的话就自动source之.然后我们在源代码目录下新建一个.cd_hook文件:
type lunch >/dev/null 2>&1  # 用检测lunch函数是否有的方式确定是不是已经source过了if [[ $? -ne 0 ]]; thensource build/envsetup.shfi注意, 这样修改cd是有一定安全性问题的, 因为恶意程序可以在目录下放置.cd_hook文件来做任何事情. 因此最好还是不要alias cd. 在实际使用的时候, 我用的是alias c='mycd', 这样我只有用”c”命令...阅读全文

使用Key Indexing来避免初始化

作者:JerryXia | 发表于 , 阅读 (17)
在c/c++中, 使用new或者malloc来分配int数组是很快的, 因为没有初始化过程. 但是在使用时会有问题: 如果不初始化, 如何知道哪一项的数据是有效的? 如果初始化, 那么效率又会比较低下.
假设有一个比较大数组a[0..n-1], 数组里每项是一个int变量, 但只有k项被使用(k « n). 如何设计一个数据结构, 避免初始化a中所有的元素, 又能正确的访问数组中的每一项? 假设内存足够.
可以使用两个长度为n的辅助数组from和to. 例如:
0 1 2 3 4 5 6 7 8 9a    = [?|1|?|?|2|?|?|9|?|?|]from = [?|0|?|?|2|?|?|1|?|?|]to   = [1|7|4|?|?|?|?|?|?|?|]topfrom数组表示的是, a[i]被初始化时, a数组中元素的个数, 也就是说, a[i]是第from[i]个被初始化的.
to数组表示的是, 第i个被初始化的元素, 它在a中的下标是to[i].
top表示的是to数组中有效元素的个数, 指向to数组中所有有效元素的下一项, 它的值等于目前a数组中有效元素...阅读全文