Category Archives: XylFTP
IN:Life, Python, XylFTP Tags: bsddb, E680, Python Comments:5E680手机使用了Berkeley DB,关于这个数据库的一些信息可以看我给的链接。
很早以前就有打算要写个Python读取native.db(不知道这个的请G之)中联系人,短信的程序,不过没能成功,这两天又接触到了bsddb,于是今天分析了下这个native.db,没想到原来挺简单的。Berkeley DB本来就是一个很简单的数据库,只是在E680中系统把多个数据库同时存放在了一个文件中native.db,所以不可以直接使用bsddb.btopen来直接打开这个文件。由于Berkeley DB中只是一种类似Python中dict的数据库(key=value)所以要存放手机联系人(有很多字段,如地址,电话…),就需要使用多个数据库,然后每个数据库使用索引来与其它数据库建立联系。按照一般的想法应该是多个数据库的key是作为索引,然后value分别存放各种信息,但E680中的native.db恰好相反。
其实这样的结构也是很简单的,但是我在写代码的时候遇到一个问题,从某个数据库中读取一个key,然后使用bsddb中的get方法去取这个key对应的value,结果确是None,以前好像就是卡在了这一块,似乎与这个value的值有关系,这个value是二进制数据:“< x03x00x00”,不理解为什么这里不直接用整数作为索引而用这么奇怪的数据,或者这里是某种编码?
先不理这个,不管这个value是什么,使用sorted把每个数据库按照其value排序,下面是所有代码:
读取E680联系人:
#!/usr/bin/env python
# -*- coding=utf-8 -*-
#Using GPL v2
#Author: cocobear.cn@gmail.com
"""
获取数据库名:
db = bsddb.db.DB()
db.open('native.db',bsddb.db.DB_UNKNOWN,bsddb.db.DB_RDONLY)
db.keys()
"""
import bsddb
db_file = 'native.db'
databases = [('姓名','780_contact_table.first name'),('手机1','780_contact_table.mobile1'),('手机2','780_contact_table.mobile2'),('家庭1','780_contact_table.home1'),('家庭2','780_contact_table.home2'),('工作1','780_contact_table.work1'),('工作1','780_contact_table.work1'),]
databases = [('姓名','780_contact_table.first name'),('手机1','780_contact_table.mobile1')]
out = []
for database in databases:
#进行单文件多数据库操作 需要每次新建一个环境
#因此下面这行在for循环里
db =bsddb.db.DB()
db.open(db_file,database[1],bsddb.db.DB_UNKNOWN,bsddb.db.DB_RDONLY)
#每次读一个数据库
#原本数据库中的value是系统的id key是具体有意义的内容
#下面这行把db.items()得到的list进行反转 为以后有序输出
out.append(sorted(db.items(),key=lambda (k,v): (v,k)))
db.close()
#格式化输出
for i in databases:
print i[0]+":",
print
for i in range(len(out[0])):
for j in range(len(out)):
#如果输出内容属于电话号码需要反转
#根据databases中各位置含义来来判断
if j in [1,2,3,4,5,6]:
print out[j][i][0].decode('utf16')[::-1],
else:
#非ascii字符使用utf16进行解码
print out[j][i][0].decode('utf16'),
print
不到50行就搞定了:-)
IN:Life, XylFTP Tags: Life Comments:8第二天早上还正睡得好着呢,就被一阵电话铃给吵醒了,本来以为是老大打得还准备埋怨两句,没想到是王老师打的:-)
出去吃了个早点,就去了决赛地点,已经有好多参赛的小组来了,都是很年轻的小伙,还看到了嘉宾名单里有徐继哲,呵呵,又一次要见到他了,还有宫敏,程勇(做jfox的),苏哲(google的人,做scim的,不过因为临时有时没能到场)。
没想到的是最后进入决赛的9支队伍除了我们和东软的一队,其它的都是中科院各所的研究生,他们的项目里有两个我比较感兴趣,都是python做的,一个是搜索引擎,另一个是多媒体编辑器,不过多媒体编辑器不太完整,只实现了播放的功能因此最后和我们一样只取得了优秀奖。
值得一提的是东软那组做的东西,具有很浓重的商业气味,就连PPT感觉都很专业,很明显是受过专业的、有实际项目经验的老师培养,东西也具有一定的实际意义:可定制企业管理内核。
比赛的结果并不重要,我们也没有专门为这个比赛去准备,因此项目的技术含量和别人显然不在一个档次,因此没有好的名次是很明显的,不过论开发模式,我们应该算是最纯粹、最全面的开源软件开发模式。而且有些项目甚至只有Windows平台上的东西,让我不爽的很!
评奖完毕后徐继哲又和我们聊了一会儿,宫敏知道我们是西安来的也过来凑热闹一块儿聊了一会儿。然后就一起合了影后,他们便离开了。
由于前一天找了两个多小时没找到清华正门,吃完饭后我们继续去寻找清华正门,没想到离我们住得地方那么近,昨天绕了一个大圈。又逛了逛清华,看了看以前的旧门,就坐公交去北京西站了。
BWT:俺和那个做多媒体的研究生聊了一会儿,他说到北京现在博士学(和海归硕士)历才给解决户口问题,因此他毕业都不打算留北京了。后来又听除哲继说他目前还没有北京的户口,真是太和谐了啊,以后北京全住博士!!
IN:XylFTP, 编程相关 Comments:3原引:http://www.xiyoulinux.cn/blog/?p=14
xylftp服务器端经过了长期测试和修复,现在已经基本完善和稳定。我们宣布正式发布我们的第一个版本供大家使用!
a) 下载:
xylftp项目的的主页在:
https://sourceforge.net/projects/xylftp
xylftp服务器端1.0版本可以在这里下载:
xylftp-server-1.0.tar.gz
b) 安装:
安装方法:用命令 tar -xvzf xylftp-server-1.0.tar.gz解压,然后进入文件目录
xylftp/server/src/,运行”make install”命令即可完成安装。
c) 卸载:
卸载方法:进入文件目录 xylftp/client/src/,运行”make uninstall”命令即可完成
软件卸载。
d) 开发:
xylftp的CVS在:
http://xylftp.cvs.sourceforge.net/
截止目前,服务器端C代码总量为2400行。参与服务器端编写的人员有:
1.董溥:完成守护进程的建立,socket连接以及写日志,实现主程序的流程。
2.郭拓:完成do_list命令。
3.贾孟树:完成parse_cmd.c,telnet.c,以及do_quit命令,以及测试和维护工作。
4.林峰:完成配置文件的解析,完成do_user,do_pass命令,参与do_syst,do_type,do_noop命令以及测试和维护工作。
5.刘伟:完成do_pwd,do_cdup,do_cwd,do_rnfr,do_rnto,do_port命令。
6.刘洋:完成do_stat,do_mode,do_fail命令,以及测试和维护工作。
7.聂海海:完成do_retr,do_mkd,do_rmd,do_dele命令。
8.王聪:完成do_stru命令,完成Makefile编写,并维护了王老师的三个命令以及整个流程的测试和维护工作。
9.王亚刚老师:完成do_abor,do_stor,do_pasv命令。
感谢各位参与!
欢迎大家测试使用,并把信息及时反馈给我们!
(错误报告请发送至xiyoulinux@googlegroups.com)
由于个人原因在编码阶段我做了很少的工作,在这里再次对所有的朋友说一声“对不起!”。一个学期了,终于有了结果,象刘洋同学说的“大家通过一起做一个项目,一起风雨走来,一起体味其中的酸甜苦辣”,不管怎么样,终究是走了过来,确实没有什么槛是过不去的!
IN:XylFTP, 编程相关 Comments:4由于写FTP服务器时有多处需要用到socket套接字,也为了以后写Linux下的网络程序方便就把socket套接字进行了封装。
安装socket套接的的工作原理把socket一套函数(socket,bind,listen,accept,connect)封装为三个函数:_listen,_accept,_connect。
_listen函数中首先使用socket创建一个套接字,因为是在本机监听,所以使用的地址就是本机的IP地址。然后使用bind把socket生成的socket_fd与本机的一个端口号绑定,这个端口号为_listen的唯一参数。最后使用listen开始监听,本函数返回一个文件描述符,也就是socket产生的文件描述符。
_accept函数中直接调用系统的accept函数阻塞自己,直到有客户请求就接受请求,并且返回一个connect_fd的文件描述符(由accept产生),该函数的参数为_listen返回的文件描述符。
_connect函数与_listen函数类似也是先使用socket创建一个套接字,不过这里使用的地址就是服务器的地址与端口号,而不是本机地址与端口,这两个由该函数的参数给出。接下来它就使用connect去连接指定服务器的端口。
在测试的时候发现了一个bug,_accept返回的值一直为0,昨天中午开始找了半天的时间也没有发现问题,最后无耐之下使用了全局变量,才使用整个程序能够正常运行,不过这样一来就没有达到我封装socket的目的,而且也没有找到bug的原因,今天中午继续查bug,结果发现即使我封装的_accept只有一行语句:
return accept(socket_fd,(struct sockaddr *)&client_addr,&len);
仍然出错,最后看了一下调用_accept那一块的代码,原来问题出在下面的代码:
35 if ((connect_fd = _accept(socket_fd,client) == -1)) {
36 exit(0);
37 }
竟然找了N长时间没有发现!
IN:XylFTP, 编程相关 Comments:3五一期间由于我们服务端这边的人基本上都没空,所以五一的时候就和客户端拉下了很大的距离。再加上前面一段时间一直停留在对模块的划分上,所以我们这边是完全跟不上客户端的脚步了。
五一放完假我们似乎又停到了详细设计上,这又是一块难啃的骨头,因为是C语言编程,如果按照软件工程的规范来做,详细设置的时候定义好所有要用到的函数,包括参数,这样对于我们这些没接触过软件工程的人来说无疑是一个巨大的难题。这似乎是不可能的事情,等了两三天毫无进展。在周三的例会上,王老师提出了这个问题,建议我们详细设计与编码同时开始,本来我也打算提出这个建议,没想到王老师先说了:)
接下来我们就开始进行编码了,不过从这几天的情况来看并不是很乐观,有一个很大的问题就是沟通,也许是从也没有在一块试着多人合作写代码,在接口的处理上,一些常用功能的封装上存在着很大的问题。
经过了这段时间的煅炼,觉得一个人在团队中的合作精神确实是非常重要的,而一个既有技术,又有领导才能的人更是难得。
IN:XylFTP, 编程相关 Comments:0在前一次的基础上做了较大的改动,欢迎指正,采用第二个副图:

update1:删除了bind()参数,先前bind()参数使用了IP地址。
update2:使用刘洋同学画的那个,把处理的描述改为了中文描述,而不是一些不太清楚的函数,修改了初始化部分的顺序,最开始读取配置文件。