Archive for July, 2008

纠结啊,纠结

Tuesday, July 29th, 2008

豆瓣上的twisted小组是我建立的,发现一个朋友把twisted称为“纠结”,发现很切题,我喜欢。

那个累死人的项目接近尾声以来,帖子越来越水了。

python-memcache内存泄露问题

Monday, July 28th, 2008

作为广为流行的、独霸一方的一个组件,python-memcache是给python连接memcache用的(废话)。可是就这么个东西居然是如此的垃圾,每每让我惊叹。

1、跟同事合作开发系统,他用Java/PHP,我用Python,需要共同通信的部分用了4台memcache做分布。Java与PHP连接memcache的组件用得相同的分布算法,兼容很好,如果一个键存到一台机器上,就绝对不用再去另外一台上遍历。而Python的这个,用了作者自己写的一套山寨分布算法,与Java/PHP的不兼容。丫的要是Python在TIOBE上排第一名也就算了。Java和PHP都是牛x大发了的东西,你还敢搞不兼容。

2、一套系统,需要定期清除memcache,使另一个系统在发现找不到cache时来访问我的接口。每秒钟执行20次左右,遍历4台memcache上清除共8个键(我也没写兼容的分布算法,于是遍历)。正常运行状况下发现服务器启动时占用8MB内存,可是每10秒左右就增加 2MB的内存使用量。系统上线后两三个小时就把2GB内存占光了,于是死掉。丫的调试了我4天时间,还熬过两次到4:00,最后才发现是python-memcache里面的内存泄露。我已经不在乎具体哪个点在泄漏了。愤怒之下,自己用socket实现了memcache的通信协议,实现了清除指定键的功能。

见过山寨的东西(Pylons),没见过这么山寨的(python-memcache)。

附使用socket实现的memcache协议,清除key部分:
def clear_cache(md5v):
“””使用socket方式清除memcache”””
key1=KEY_CDNJAVA_MEMCACHE1%{‘md5v':md5v}
key2=KEY_CDNJAVA_MEMCACHE2%{‘md5v':md5v}
for mcs in setting.mcserverlist:
hostport=mcs.split(‘:’,1)
if len(hostport)==1:
host=hostport[0]
port=11211
else:
host,port=hostport
port=int(port)
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(1)
s.connect((host,port))
cmd=’delete %s\r\n’%key1
s.send(cmd)
s.recv(1024)
cmd=’delete %s\r\n’%key2
s.send(cmd)
s.recv(1024)
s.close()
except socket.error,ex:
print ‘[EX][clear_cache] %s’%str(ex)
return

twisted线程池的一种实现方式

Monday, July 28th, 2008

一个具有并发控制的计数器,控制当前线程数量。线程数不足时就用reactor.callInThread()启动线程。并任线程自然结束。当然,需要在让主控函数形成循环来不停的生成新的线程。这种循环比较适合用reactor.callLater()来实现,而不是用while True的循环。毕竟twisted是事件驱动的,如果一个函数死循环了,那么其他函数就没有执行的机会了。

在对twisted中使用线程,多次尝试之后,我就是使用了上面的方法。感觉比以前靠谱了很多。

不写代码,使用twistd实现ftp服务器

Sunday, July 27th, 2008

用twisted很久了,常常惊叹于其内置的N多小功能,每次发现都有惊喜。今天调试程序期间看了一眼twistd这个程序的参数,发现ftp等等一堆子命令。尝试一番后还真的启动了一个临时的ftp服务器,对调试有很大帮助。使用方法如下:

twistd ftp

这时启动的ftp服务器的HOME目录为/usr/local/ftp,匿名用户名为anonymous,密码为随便的一个邮箱地址,端口号为2121。

可以通过如下命令查看此服务器的其他参数:

twistd ftp –help

比较有用的就是–root,来指定登陆的根目录。还有就是–port指定端口号。

不过要注意的是,这个服务器仅用于调试,不要应用于产品环境,因为它并没有做安全性方面的工作。

在Windows下会抛出一个ImportError异常。虽然我尝试修改源代码,不过看来还是不支持。再次鄙视一下M$。

PyS60编写的Nokia手机短信备份程序

Wednesday, July 23rd, 2008

用于将手机的收件箱、发件箱、已发信箱、草稿箱中的全部短信备份到存储卡上。分成4个文件来备份以示区分。适用于怕老婆检查手机者,哈哈哈哈。

需要在手机上安装好PyS60的最新版。至于源程序,请跟帖留下电子邮件地址,我会选择时间发邮件给你。

越来越看好S60这个平台了,甚至略有希望于google andriod出现之前symbian可以迅速的完成开源流程并占领山寨机操作系统市场。由于PyS60的文档尚没有翻译完的任何一章,所以还要过些时候才会贴出来。

Why I choose AVR

Sunday, July 20th, 2008

想学单片机,因为我学无线电比学编程要早4年,而却中断了好久好久,多年后回头看看,兴趣不减当年。

学单片机总要先定一下基本学习方向。也就是选芯片。

大学时买了个PIC开发板,MCD1,芯片是PIC16F877A。后来借给朋友玩了无数年,而自己一直懒得动。等我真的开始准备看看时,发现碰钉子无数。如下:

1、比较喜欢free的工作方式,可是PIC只有MPLAB一种可选,几乎完全封闭。

2、工作以后就很少可以稳定的使用台式机,笔记本上又没有串口。最后逼我买了个转换器。

3、我讨厌IDE。

然后谈谈pass掉的几种芯片的原因:

1、51,这个,网上要求淘汰的声音十分强大。虽然价格可以低到3元钱,不过貌似10元钱的芯片(AVR)也不能算贵 。技术体系太落后。

2、ARM,嵌入式linux的好平台。不过MCU开发方面,满足需求以后的第一要务是成本,而不是性能。我现在想学微控制器,而不是复习linux。

3、MIPS……,开发板贵到离谱,性能彪悍。

总之,选了AVR。谈谈AVR的优点:

1、有gcc支持,也有开源的下载器。

2、arduino项目使用了AVR,可见开源支持的好处。

3、MCU上的bootloader工作方式。

4、比PIC还risc的risc。

硬笔书法

Saturday, July 19th, 2008

几乎累死人的项目,我负责的部分终于上线了。运行还算稳定,不管了。

想想最近很想培养一点内秀,以发扬闷骚的本质,于是想练习一下写字。每次在公司食堂吃饭时都要写下自己的名字,每次都要羞愧一下。

工欲善其事,必先利其器。多年不好好写字,连钢笔都没有了。大学时虽然很疯狂的写笔记,钢笔也没能带来上海。于是先去网上买钢笔。发现无论价格如何,钢笔都很丑。最后找到一款很熟悉的,很亲切的钢笔-英雄329。发现居然是40元10只装的,便宜到可以跟圆珠笔抢地盘。后来想想,反正是用来练习闷骚的,自己用着喜欢就好。

于是,买了当年用坏过两只的英雄329。

最近还买了atmel avr atmega16的开发板,准备开始玩玩了。 作为一个变态的人,我追求一种无所不能的境界。

google protobuf基本分析

Tuesday, July 8th, 2008

安装尝试了一下,谈一下感受:

 

1、该库是C/C++编写的。编译过程缓慢,看来规模庞大。

2、写好的.proto文件仅仅是一个格式定义文件。需要用protoc编译器将其编译为C++/Python/Java的代码,我测试过程编译为Python代码。

3、生成的源码文件为标准的Python源码,包含了.proto中同等意义的类定义,可以方便的进行属性赋值。

4、可以通过对象的SerializeToString()方法输出串行化数据。经分析串行化数据是语言无关的。

 

一个简单的串行化数据示例:

 

‘\n\x02hi\x10\x1d\x1a\x0ehliu@tudou.com’

 

这是Python例子中提供的一处,可以看到是二进制编码格式,此数据并不具有XML的传输过程中仍然可读的特点。不过性能是可以保证的。按照.proto定义的数据来定位每个字段。每个字段前加上了后面数据的长度。对于数字也是使用二进制编码,不过我没有分析出其使用的字节序。

 

总结:

 

1、性能足够高

2、可以提供C++/Python/Java三种语言之间的数据共享

3、串行化数据传输过程中不可读

4、串行化数据中没有见到校验字段

5、历史上出现过无数种二进制数据传输标准,估计有google推荐的东西会传播的广一些

劳累的项目

Wednesday, July 2nd, 2008

劳累的项目

一个月没更新了,都在公司忙一个项目,我放弃了所有的周末休息,还通宵了三四次。项目终于对付着上线了,bug成群,需要人工监控。还在不断的上线调试中。

前几天去了鼓浪屿,海滩挺好玩的。

最近闲时看看PyS60,感觉不错。在嵌入式Python开发平台上,也就是PyS60功能比较全面。包含了整套的UI绑定,甚至还有个简化版本的OpenGL绑定(OpenGL ES)。比起PSP之类的平台好多了。也许我会抽空研究一下PyS60上面实现的PKM。PyS60 1.4.4的文档也在翻译中。