'Programming' Category

  • 神州数码客户端ZDClient升级到0.3,支持武汉大学的校园网

    May 20, 2009

    0.3更新-客户端默认版本号更新为3.5.04.1013fk-修正对SUCCESS数据包的识别-后台运行改为在认证成功后主程序返回-根据状态区分用户名、用户配置信息错误与密码错误的两种提示-在接收和发送Keep Alive报文时提示当前线程的pid-改善pcap的抓包过滤器,只抓发往本机的报文 在姚老大的群里面找到武汉大学的同学micheal帮忙测试了ZDClient,昨天晚上把他们的官方客户端的数据包抓了过来看,原来版本是3.5.04.1013fk,比我们的新!不过奇怪的是广州大学的认证服务器除了用户名密码别的似乎什么都不认证,我怎么乱填都能认证成功 = .= 顺便提醒一下武大的同学,记得在zdcrun里面加上--dhcp参数…… 大家可从项目主页下载最新的源码包:http://code.google.com/p/zdcclient/

  • 完美主义的Coder

    May 16, 2009

    今年年初的时候加入了iptux的项目,这是个Unix平台下的“飞鸽传书”,虽然一开始只是关心一下,后来给它写了英文版文档、整理了资料,以及对软件界面的一些调整,原来的作者Jally居然把我也设成Project Owner之一了。 据说程序员总有完美主义的倾向,一开始我还没给iptux写多少行代码,Jally就在邮件里面给我大说代码风格代码风格,很郁闷,我很想对他说,我是看你的代码风格那么乱,我才用了“乱风格”的。iptux是使用C++为架构,但是使用基于C的GTK为底层库,C和C++的代码风格是相当不同的,两者一旦混合起来就很难说什么固定风格了(不然人家基于C++的gtkmm要来干吗),不过我也在邮件里面给他挑骨头,几番下来他说代码先交给我来写了。不过两个月下来我也没再怎么给iptux写过多少行代码,上星期iptux的邮件列表突然热闹了一下,想到之前要实现“URL识别并可点击”的功能,就用了一个晚上加入了400多行代码来实现,惊叹的是原来实现鼠标指到一个链接变成手势那样的事情居然那么复杂,不过还好,gtk-demo里面有现成的例子,这400多行代码有不少是从demo里面抄的。 说程序员是完美主义者,且看看Gtk的邮件列表的人,我发邮件去问了一个关于Glib的链表内存释放的问题,却引来一堆回复,后面的人针对有的人表达得的不完美批一通,毫不客气的说,比之前我和jally的邮件有过之余无不及: 我的问题Why there's still ONE element left after g_slist_free () ?已经很完善的解释:我的总结:围观的群众:English Lession

  • 数据库课程作业:图书管理系统

    May 16, 2009

    上学期混混沌沌学完《数据库原理》,感觉除了会写几条SQL外没什么收获,至于DBMS的工作原理那些,在《操作系统》完全都有,但教数据库的老师不仅不知道这些联系,一丁点数据库技术前沿的信息也没“透露”过。这个学期的数据库课程设计,我用了一个通宵把基本要求的一个“图书管理系统”做完,用了pygtk作为界面和SQLite作为数据源。不过课程设计是需要搞文档的,一个字,很烦,在Google上面用“数据库课程 学生作品”搜出来了某某学校网页上面的作品,把别人的文档重新组合一下,配上我程序的插图,yeah,完工。 Python虽然在这几年逐渐流行,但是它很历史悠久(1990),一直以简洁和功能强大著称,比如内建对SQLite的支持。SQLite是“文件式数据库系统”,也是近年来发展很快的数据库系统之一,比如Firefox等软件都使用其作为后台数据的管理。SQLite秉承了Python弱类型的特点(呃,其实Python和SQLite没什么关系的,说不上秉承...),创建表的时候那些类型你可以天花龙凤地写,插入数据时更是“没王管”。这个LibiaryManager很可能是大家能在Google上能找到的技术最潮的数据库设计作业了。 为了给老师验收,pygtk在Windows下运行的环境也要设置下,不过还好,在pygtk的FTP上可以找到很新的win32版本(主页上面的链接很旧...),而且pygtk、pygobject、pycairo是单独打包的,缺一无法运行(= .=)。 程序中基本使用Treeview来处理输入和显示,不过后来感觉Treeview对录入数据很不方便。 当然啦,这次作业来自网络,当然还要回到网络中去,不保留任何版权,从这里下载:http://code.google.com/p/ptcoding/source/browse/trunk/LIBManager/

  • 错误生涯:Warning: unable to set property `editable' of type `gboolean' from value of type `gchararray'

    May 4, 2009

    Warning: unable to set property `editable' of type `gboolean' from value of type `gchararray' 做GTK编程的时候,使用TreeView控件时出现这个警告,也就是无法使单元格变为“editable”,原因出在这里: column = gtk.TreeViewColumn(columName[columnNum], renderer, editable=True) 原理解TreeViewColumn的构造函数接受的参数里面可以接受设置Cellrenderer的属性,就直接给editable设True,于是就得到以上警告。 换用add_attribute、set_attributes,均是如此。 Google上搜到同样错误警告,但是他的原因是设错值类型,我明明设了True啊…… 自己观察pygtk-demo的代码和手册,突然发现在构造函数里面给出的属性设置值不应该是直接的值,而是对应Model里面的相应column的值!看手册的描述: Zero or more attribute=column pairs may be added to specify from which tree model column to retrieve the attribute value. 呃,果然是看手册时候大意了,这么多年来还是让英语介词搞的晕头转向。如果在构造函数里面设True这个值,就会被解析为1,去对应Model里面第二栏的类型,是字符串的gchararray,当然对不上了。 解决办法是renderer.set_property("editable", True),调用继承自GObject的set_property方法来设置对象属性。

  • 一个面向对象实现的银行家算法

    April 28, 2009

    最近完成学校《操作系统》课程的试验报告,其中的题目是用程序实现银行家算法。什么是银行家算法,这里就不详提了,具体参看Wikipedia-zh。 Wikipedia的页面里面有整个银行家算法的伪代码,加起来只有12行,很清晰地表达出整个算法的思想,然而如果你到别的地方看看一些具体的银行家算法实现,往往会被吓一跳(可以看看百度百科的词条)。 银行家算法本来并不复杂,只是其运算涉及向量、集合,实现起来还是花要一点功夫。我使用C++来实现银行家算法,为了实现和伪代码描述尽可能接近,重载对象的运算符等,最后整个算法的实现和伪代码没太大差别,也就20行的样子。 伪代码 while (P != ∅) { found = FALSE; foreach (p ∈ P) { if (Mp − Cp ≤ A) { A = A + Cp ; P = P − {p}; found = TRUE; } } if (! found) return FAIL; } return OK; C++代码 1 2 3 4 5 6 [...]

  • ibus数据库高频词错误修正脚本

    April 24, 2009

    使用ibus时间长了,常常突然发现有些本来常驻的首选或者常用字词突然掉到后面,甚至到了第二页,并不是被其他词挤掉,而是可能ibus的用户数据库出现错乱了。 不知道这是ibus程序的bug,还是ibus所用的SQLite数据库系统本身的问题,本来当用户输入一个拼音,ibus从用户数据库里面提出对应字的用户输入频数,决定字词的位置;如果用户第一次选择输入某个字,那么该字的记录就添加到用户数据库中,下次输入时便以此记录来提前该字的位置。理论上,在用户数据库里面一个词条的记录最多只能出现一次(多音字算多个字),然而,在实际的使用中,有时不知什么原因,某个本来常用的字被当作第一次输入再次加入到数据库当中,下次输入时,该字便作为低频字来排序,导致位置变得很后,带来不少不便。 这个Python脚本就是把这样的词条找出来,并把后来加入的记录删掉,把词条频数还原。 脚本下载:http://code.google.com/p/ptcoding/source/browse/trunk/ibus_fix (svn目录内的ibux_db_fix.py,其他的两个是测试脚本) 程序功能: 自动备份用户词库 检出用户数据库中出现了两次,但不是多音字词的词条 将后加入的词条删除 检出错词的SQL: SELECT * FROM py_phrase WHERE phrase IN (SELECT phrase FROM py_phrase GROUP BY phrase HAVING COUNT(*) = 2) 尚存缺陷: 如果同一个词条的记录出现了3次或以上,程序不能鉴别(极少可能出现,可修改脚本内的SQL语句来查询出来) 如果一个字本身是多音字,其中一个音节出现了上述情况,程序不能鉴别(貌似概率也挺低的) 如果两个记录中的用户输入频数相同,两条记录都会被删掉(倒不是坏事,影响不大) Python源码:

  • 为AVR写的1602A液晶屏幕驱动程序

    April 12, 2009

    为1602ALCD屏幕实现的基本驱动功能,8位数据线,3位控制线,可自定义端口,可从LCD_Init函数设定工作方式,实现发送单字符和字符串的基本功能,带busy_wait。使用avr-gcc 编译。 代码下载:http://code.google.com/p/ptcoding/source/browse/trunk/AVR 更新:SVN目录内还有串口通讯的模块,以及串口和LCD驱动结合起来的一个试验性程序 参考资料:lcd1602a_398762.pdf(英文) ourAVR (注意两份资料的出入,前者更详细) 开发手记: 之前从天河赛格买了个1602的液晶屏,折腾了两天,终于让ATmega48驱动起来。 1602本来是一个挺简单的器件,8位数据线和3位控制线,其工作时序图初看起来挺复杂,但其实也就E端使能脉冲的事情,但是折腾下来,再一次验证了“简体中文”资料的不可靠,还有就是“这就是传说中的‘驱动程序’”。 首先我是从ourAVR网站提供的1602B液晶使用范例提供的资料入手(1602A、B好像没太大区别),借鉴了人家用ICCAVR写的代码(虽然代码是我敲的,但是基本上还是抄的),当LCD上显示出第一个字母时,还挺兴奋的,然而,这只是刚刚开始……(才100多行代码,加上看资料个把小时什么都好了。) 接下来才是噩梦般的调试,要么给黑方块,要么乱码,不稳定,这次能显示,重启就不行……还是ourAVR那篇资料提醒了我,初始化工作做的不够,写个循环发20次初始化信号,果然稳定了…… 奇怪阿,我明明按照Datasheet的数据来写的,怎么初始化不够呢?……说起1602的Datasheet,ourAVR那里提供了一份中文版,由“长沙太阳人电子有限公司”整理的,区区5页PDF,我另外Google了一份英文版的,顶,80多页,仔细一看,时序图居然有出入!转念一想,1602作为一种标准产品,一般的厂商只是兼容罢了,有多少出入还是正常的吧?不能全相信网上的Datasheet... 也从网上找了其他人写的1602驱程,51的、汇编的什么都来,有些的E使能脉冲居然是下降沿的,如此借鉴来借鉴去,折腾了两天。 最后还是被编译器“跹”了一回,比如把字符串写在发送函数的参数里就给我显示黑方块、乱码,又看了半天AVR的Flash空间、SRAM空间、EEPROM空间等的一大堆,最后才确定,是因为我使用之前《初尝Linux下的AVR单片机开发》里面的avr-objcopy -j .text参数,导致被放在.data段的字符串根本没有放到烧录文件内。 最后还有时序问题。一开始我使用了Busy Wait(读LCD的D7),认为以后就不用考虑命令时序了(LCD接受的命令有us级的一般命令ms级的两条清屏命令),结果还是乱的一团糟,最后往Busy Wait里面放了个死循环,发现程序根本都不绕进去,原来AVR芯片太快的,输出E信号后等不及LCD输出。 其他人写的驱动中,有些根本不考虑Busy标志的问题(干脆R/W接地),只要等候的时间足够,就可以保证写入的正常。在我最后写好的驱动中,我尝试把调用LCD_Busy_Wait的地方换成_delay_ms(5),把整个LCD_Busy_Wait注释掉,这样工作起来是完全正常的,而且还省了36字节的程序,只是感觉上屏幕的反应就有那么一点的拖滞感。也可以把这个delay换成_delay_us(100),这样没有拖滞感,但注意0x01这样的复位命令要注意要加个ms级的延时,但如果这样的延时语句多几条,程序在延时上膨胀的体积就远不止36字节了(别小看_delay_ms(),延时越久代码就越大),还不如用上Busy_Wait,这就需要应用在的来衡量了。

  • 初尝Linux下的AVR单片机开发

    April 2, 2009

    此前接触过AVR单片机,发现无论是书店里面的教材,还是网上一大堆的中文资料,无一例外都是说windows下使用WinAVR、ICCAVR之类的,Linux方面的简直只字不提,难道这就是传说中的中国国情?外国情况可很不一样,玩单片机的Geek一般都很哈Linux,做单片机开发的软件一应俱全,当然还是开源的。 昨天从淘宝重新买了条USB的下载线,回来一看是USBasp的设计,附送的光盘当然也是win下的驱动和说明了,忽略。 插上下载器,lsusb,认倒是认出来了,叫做VOIT,那怎么用呢?上网一搜,原来USBasp是德国人的设计http://www.fischl.de/usbasp/,GPL的,其中提到AVRDUDE支持USBasp,当然也有源码下载。不过我用的是Ubuntu,发挥超级牛力的时候到了:sudo apt-get install avrdude,恩,几秒钟搞定,让他们去编译吧! Linux下做单片机开发当然首选GCC,就如这些英文教程说的,下载源码?No,No,APT has Super Cow Powers,继续sudo apt-get install gcc-avr binutils-avr avr-libc 几分钟装完,很好,估计那些下载源码回来编译的同学要去喝两个小时茶才能用了。 万事俱全,先写个单片机的HelloWorld,借用micahcarrick的源码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #define F_CPU 1000000UL /* 1 MHz CPU clock */   #include <util/delay.h> #include <avr/io.h> [...]

Page optimized by WP Minify WordPress Plugin

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org