update:2010.1.25这个问题的状态终于被改成Fixed。 Google Code的项目控制因为其简洁深受很多开源作者的喜欢,PT好几个项目都是存放在Google Code上,不过之前遇到了一个些少恼人的Bug: 当建立了Wiki页,因为某种原因重置了SVN仓库,那原来的Wiki页将无法修改、无法删除(返回500 Server Error)。 重置SVN一般属于特殊情况,比如要把另外一个服务器的SVN仓库搬到另外一个SVN,而只保留后来的版本数据,才需要重置SVN仓库。我当时的情况是,不小心把包含自己帐号密码的测试脚本提交了上去SVN;版本管理的特点是版本修改是无法被抹除的,情急之下只好放弃版本痕迹,备份了文件,请求了SVN重置;之后就发现原先的Wiki页无法修改了。 一番查找后,发现Google Code自身的Support里面早有人发现了这个问题,可以看到,这个Bug第一次在2007年11月就有人提出了,一直到现在都陆续有人确认Bug依然存在……所以当时我就没管那个有问题的Ghost Page了,任其放着;两年都没有修复的bug看了没什么好指望的了; 不过最近这个问题有人提出了个颇为纠结的解决办法:创建wiki/the_page文件(跟之前的wikipage同名),然后不断修改递交svn,当svn的revision版本号高于重置之前wiki page最后修改的版本号,就可以修改或者删除这个Ghost Page了…… 想到我那个项目现在的版本号早就超过了之前重置SVN仓库时候的版本号,直接跑去wikipage点Delete this page,哈,直接搞定了! 从这个Bug可以透视到Google Code的Wiki页构建机制:Wiki页跟SVN仓库内相应文件是紧密互动的,在Web对Wiki页的修改就相对于直接提交了相应SVN内的文件,当直接修改SVN内的Wiki文件时候,Web上的Page自动根据SVN刷新WEB页的缓冲,并记录文件的修改版本号;而重置了SVN仓库将导致SVN的版本号从0重新开始,这样Wiki页的缓冲模块没法找到相应的版本号对应的wiki文件进行操作,所以报告500错误;只能当版本号重新达到原先的最后修改时,Wiki Web才能正常的和SVN交互。 另外有趣的是,Google的程序员似乎对修复这个Bug没什么兴趣;可能容易引起新的bug吧,呵呵。
Insion同学之前发来一段可以在MacOS/BSD编译运行获取网卡MAC地址的代码,于是整理了一下,让几个802.1x Client都能支持MacOS/BSD了。 下载了个FreeBSD 7.2在vbox虚拟机里面装了下,发现FreeBSD比Linux好像原始多了[呃,我说安装程序],分区的时候他不叫Create Partition,叫Create Slice,我对着界面看了半天才猜到,囧;退出那里写着:Q = Finish,Quit就Quit嘛,什么Finish,纠结……但还好,其他的配置跟Linux还是很相像的,调试了一下就有了全可编译的代码了。 代码部分修改倒没多少,就添加了一个专门给BSD系系统获取MAC的函数,再用maroc判断一下,以及几个头文件,就完事了,有点麻烦的是makefile,发现freebsd默认那个make好像是很古老很古老的版本,我程序里面那个Makefile是用了vim里面c-support插件里面带的Makefile模板,有点复杂,但是freebsd居然不支持!所以整理了个简单的版本,专门给MacOS/BSD编译,也方便别人的修改;另外一个原因是,程序里面转换服务器消息时候用了iconv库,linux里面iconv是系统内嵌库来的,用不着链接的时候给出参数,但MacOS/BSD偏偏就要-liconv…… 需要编译MacOS/BSD版本的同学,可以check出项目里面trunk的代码,运行make -f Makefile.bsd来编译。Insion同学已经编译成功,而且在他的主页上有二进制版下载了。 相对的说,可能在MacOS里面编译是最麻烦的,我大概说说流程(实际上我没试过,我可没Mac机器[T.T]) 1.安装gcc,参考这里从http://connect.apple.com/的Dev Tools里面下载Xcode Tools,安装。2.编译安装libpcap,从http://www.tcpdump.org/release/libpcap-1.0.0.tar.gz下载源码,tar xvfz libpcap-1.0.0.tar.gz解压,进去该目录,./configure、make、make install安装完成;3.编译802.1x客户端,从所用项目内签出源码,在目录内make,没出什么差错的话,已经完成了。然后按Readme.txt的方法安装运行,即可! 项目主页 锐捷:http://code.google.com/p/zruijie4gzhu/联想:http://code.google.com/p/zlevoclient/神州数码:http://code.google.com/p/zdcclient/
油猴脚本:Twitter Picture Preview Feature: Adding preview thumbs right after a short url to an popular image-service site in twitter.功能:给twitter内包含指向图片服务的网址加上该图片的缩略图。 客户端支持/Client Supports:twitter.com / itweet.net / twitese.appspot.com 图片服务支持/Image-Service Supports:twitpic / flic.kr / moby.to / yfrog / ts1.in / hellotxt.com / twitxr.com / twitgoo.com 维护了一下之前写的油猴脚本:Twitpic in itweet,从另外一个相同功能的脚本TwitterPhotoShow的代码,通过监控items容器的DOM的事件DOMNodeInserted、DOMSubtreeModified来相应内容的变化,这样就可以把原来的定时器什么一大堆的代码去掉了; 同时利用了一下javascript的对象特性,原先的代码可能看起来还跟C类似的,重写一下语法看起来好像差很远了……改写的好处是添加新的图片服务处理就容易多了。比如一个处理器是这么写的: 1 2 3 4 5 6 7 img_processor['ts1in'] = { [...]
昨天的技术沙龙上,清风大妈Zoom.Quiet给大家提了个“很基础很基本”的问题,什么是pythonic? 自己没特地做过功课,但pythonic这个词不陌生,应该见过几次,但是要说具体是什么,确实很空白。说起python,我首先想起来的是其很让人愉悦的编码体验,一些很常用的封装让人感觉很“惊艳”,比如说,for line in open('file'):ooxxooxx,替代了C++、Java等里面的readline,更不会让人产生在C里面打开文件时候那种恐惧感;还有一些很贴心的细节就是,高度对象化,比如说gtk的TreeViewModel,可以直接送给SQL cursor的execute,直接把用户界面的数据写入到数据库里面去……因为都是list。 像这样的“愉悦感”,就是我理解的pythonic。昨天会场上有人的答案是:“简洁,优雅,高效”,获得比较多人的认可(得到了奖品带大妈签名的《可爱的Python》一本)。 回来后看了看华蟒用户组的首页,呃,很明显写着嘛:申明 pythonic == "大道至简",也八九不离十了。 这两天也是这个邮件组里面有人讨论实现小时候铅笔盒上的九九乘法表,最获得大家认可的答案是: print "".join([('%s*%s=%s%s' % (y,x,x*y,'\n' if x==y else '\t')) for x in range(1,10) for y in range(1,10) if x >= y]) 看了犯晕,这很明显跟python给人“惊艳感”的做法背道而驰的,但怎么会这么多人认可呢……同时想起咋们群主“逆”说一直没搞懂的一句算素数的python: print reduce(lambda l,y:not 0 in map(lambda x:y % x, l) and l+[y] or l,xrange(2,1000), [] ) 这叫做pythonic?既不简洁,又不优雅,更不高效,充其量作为一个脑力游戏,还不如玩玩数独! 玩小聪明一直都是天朝人的传统,人家孔乙己还会“茴”字的N个写法呢,但这类小聪明,着实应该远离python。
先来一段他们的广告式简介: 广州技术沙龙,是由珠三角地区的 web、游戏开发人员自发组织的线下交流活动,计划每月举办一期,以主题演讲和松散交流为形式;吸引来自广州、珠海、深圳等珠三角城市的很多位技术人员参加活动,其中不乏来自网易、金山、腾讯、中国移动等公司的开发人员,活动举办后,大家通过 twitter、python-cn maillist 和 blog 持续交流,取得了比较好的线下交流效果。 https://groups.google.com/group/guangzhou-tech-party 第二期活动的两个主要演讲题目: 《深入 nginx 源码》 Zhu Zhaoyuan 广州梦境网络 《 MMOrpg 副本自动地图生成》 林伟 广州网易 我刚开始看到他们的题目预告时候,第一感觉是,啊,那么高深的东西,我去怎么听得懂阿……不过想到如果都是听自己熟悉的东西,那更不是浪费时间么,而且看了第一期录像,《选好业务与技术,单枪匹马做游戏》 (赖勇浩),感觉虽然不是自己感兴趣的题材,但是收获还是不少的,这是很难得的“基层人员”的信息啊!所以一早就报名参加了此次活动。 《深入 nginx 源码》让我了解到nginx内部代码的实现是如何精益求精,比如说处理HTTP Request时候的指令,GET、PUT等的指令,nginx里面可不是用C库里面的strcmp,而是自己写了比较函数(似乎是一个maroc),具体实现我没看清楚,但我估计是把指令的前两个char放入一个short里面来比较,这样只需在switch之类的处理时候,单比较就完成了!当然这可不是nginx性能的突出点,只是冰山一角的例子罢了。nginx自己实现了一个很巧妙的内存池,使用排序链来管理获得分配的内存(减少内存碎片,这点是lighttpd没有的),跟apahe相比,更加在进程处理上面的洁癖。 虽然我自己在机器上配置过nginx,但很难想象我会花时间去看其代码,但发现这么看确实能学到不少东西…… 《游戏自动地图生成》这个题材,自己也没想过做游戏开发或者之类的,但是听小林介绍下去几种地图生成算法时,兴趣大增了;其提到一个“细胞自动机算法”觉得颇为经典,在在自动生成地图的整个过程里面也用的比较多。其实就是一个很现实化的思想,局部性原理;现实世界中,某个坐标跟它相邻坐标对应的物体,很大几率就是相同的;操作系统的磁盘调度、内存调度、缓存快写,通通都用到局部性原理,当请求了A地址的内容,A+1地址的内容很可能将会被访问到。其他如平滑连接随机点算法(集合、概率)、侵蚀算法、次优选择等等一大堆的思想,颇让我大开眼界。 收集一下资料吧: 广州技术沙龙第二期流程笔记Ayou的nginx、Linux服务器配置笔记(推荐!很多很重要很实用的资料!)
paste.ubuntu.org.cn是国内很多linuxer喜爱的“在线剪贴板”,在跟网友交流时把代码、截图等发在这里,然后把网址发送给对方即可,而且对多种常见代码支持语法高亮,功能简单贴心。(不用像某网友在这个博客上篇帖子里面那样,在留言里面贴一大堆乱哄哄的代码……=。=) 虽说方便,但平时要发送文件时候还是要打开浏览器,再贴代码或者选择文件,多少有点繁琐,所以打算用python写个上传脚本,跟nautilous结合的话,上传截图就方便多了。 首先问球猫要了个ubpaste的perl的脚本,虽然我不懂perl,但发现上传部分只有10来行代码嘛……看来挺简单的,可能用urllib随便弄一下就可以了……结果发现,不行!paste.ubuntu.org.cn用的是mutipart/form协议方式的上传,而python标准库里面没有直接支持这种协议(perl却有……而且自动支持……所以几行代码搞定=。=)…… 查了一下资料后自己写了个class来实现mutipart的boundary,才知道用http来发送文件,特别是上传大文件是这么麻烦的事情……不过还好,不算很复杂,但是整个脚本下来居然有150行代码了……=。= 现在还不能直接拿来当nautilous script用,因为第一个参数是读入文字而不是文件,还在犹豫用bash来重新封装(使用curl一行就搞定上面所说的上传了)……[懒ing]
暑假之前就注意了LCD4Linux这个Project,简单说,这就是个硬件版conky的驱动服务,用户自己DIY各式各样的硬件屏幕,自己编写驱动、编写各种插件来控制输出到屏幕上的信息,LCD4Linux就是这样一个平台,也是一个geek味道非常浓郁的、可玩性相当高的一个Project。 图片里面是LCD4Linux项目页里面收集的部分人实现的一些屏幕,有像我这样一块小小的1602,也有用块10多寸的液晶屏作成很拉风的监控屏,甚至,挂一个户外广告那样的LED阵列,你也可以转换成VGA信号输出给大屏幕的电视机,或者弄个天线发射出外太空都是可能的…… 这个项目的可玩性就在于硬件的多样性,很可能每个人实现的屏幕都不一样,而作为开源项目,geek们只需或多或少地修改一下别人的驱动就可让屏幕跑起来了。 我实现的这块,是用了一块通用AVR单片机,通过USB接口直接取电和传输的数据的架构,硬件和协议参考的是LCD2USB项目。其原来用的是atmega8芯片,而我手边只有atmega48,算是类似吧,但换换IO口还是在所难免的。 实现一个系统,同时也藉此了解一下相关的技术(不然还真的很难做得出来),首先是USB,USB我们天天在用,但是学校的《微机接口》之类的课程可从来不涉及这些“时髦”技术的,虽然USB已经流行了10多年了。通过V-USB库,在AVR单片机上实现USB设备还真没什么难度,只需要填写设备ID设备名称之类的,然后再实现协议处理函数就完了,在Linux下使用是直接支持,一插上运行lsusb就能认出(Win下需要另外装驱动)。我第一个实验USB就是接了几个二极管开关,用libusb的python binding, pyusb,很容易就控制几个灯。(想起The Big Bang Theory S1E9开头那一段,再import个SimpleHTTPServer,然后让单片机连接几个继电器,就能像他们那样让别人用浏览器来开关我的台灯了,哈!) 其实单纯几个LED都能够作为LCD4Linux的一个设备了,比如能够用来做邮件提醒、pidgin消息之类。同样是用V-USB,有个德国人做了个叫USB-LED-Fader的东东,同样是几个LED,人家可实现了每个灯在pwm控制下以独立的方式闪亮,要知道,atmega8只有两个pwm channel,而USB-LED-Fader里面没有用硬件pwm,而是用io口来输出的,为了实现独立波形,还实现了一个message queue,俨然一个操作系统了……所以他的固件编译出来4K多,即使我修改后也刷不进去mega48里面,就没得看看他的效果了。不过赞一下的是,这个项目虽然是玩具级别的,但是人家的电路、电路板、固件代码(注释)、文档、上位机控制(包括win版、win驱动)通通一应俱全,非常规范和详细,俨然一个商业项目。 将USB模块跟显示屏驱动模块合起来并没什么难度,几个月前我自己写过这个1602的驱动程序,虽然当时花了好几天,但实际上都只是很简单的几个函数。不过这次,因为接上USB后这块28针的mega48就没那么多io给我挥霍了,此前的驱动用的都是8位数据线,现在只能用4位,分两次传送。不过还好,这类HD44780的驱动几乎满地都是,一般外国人写的不像国内一些网站上面的,扔几个函数在那里就完事,LCD2USB的代码里面用的是Peter Fleury的LCD Library,封装得很漂亮,不过原来的代码只能讲4位数据线连接在一组io口的高四位上,而接上外置晶振后的mega48仅剩的带高位PortD,刚好又是几个pwm波输出,我打算另外再扩展协议让LCD2USB带有几个漂亮的提示灯,就重写了一下LCD的两个底层函数,当然不是仅仅重写,不然对不起原来那些漂亮的代码,用了宏定义来设置数据线是接在HIGHER_BIT or LOWER_BIT。 其实相比之下,LCD4Linux最精彩的地方在于它的驱动、插件的编写,新版里面其也支持了Python,意味着做个硬件版twitter器不是什么难事了!不过LCD4Linux本身的安装让我困扰了一天,大概作者没有时间吧,这个项目的主代码很几年没更新了,一个版本更新的跨幅有好几年,以致稍旧点的版本在新版本的内核里面编译不了,比如有个rdtscl的宏调用,在新内核里面被移除了……这个问题在LCD4Linux的SVN里面的版本倒是解决了,但是因为autotool的更新,编译过程又出错,折腾了半天,发现原来autoconf检查python的模块ac_python_devel 因为莫名的原因会让configure文件出错,下载一个新版的ax_python_devel.m4覆盖掉就好了。另外发现AUR里面的lcd4linux-svn包是“弃婴”,于是“收养”了回来更新,添加了个编译的patch,现在Archer们直接yaourt lcd4linux就可以编译安装了,O.O . 还是一句,LCD4Linux的可玩性非常高,说技术性嘛,不算高也不算低吧,召唤大家一起玩一起交流哈……
联想的认证协议是我写的这几个802.1x实现里面相对简单的版本,没有太多古古怪怪的信息头信息尾部。 我们学校并没有使用过联想协议的认证系统,而是受了一位网友的邀请才写的,所以我连联想官方客户端的样子都没看到过,一直是由那网友抓包后发送过来,而我猜测地将其套入到此前我写的神州数码的认证程序里面,经过几天的调试,确实能用,虽然并不完全了解认证报文的每个细节。 PT实现的联想Linux客户端项目主页:http://code.google.com/p/zlevoclient/ 以下的说明是基于EAP协议过程的补充描述,如果不清楚EAP,可先读深入了解校园网802.1x认证的EAP协议(1)——EAP的总体流程。 认证过程报文的细节描述: EAPOL-Start、EAPOL-Logoff设置长度为0的协议包头,然后紧接6个意义不明的字节(可能是版本号之类),直接复制即可: {0x00, 0x00, 0x2f, 0xfc, 0x03, 0x00}; EAP-RESPONSE-Identity长度为5(头部) + username_length,无特别,跟EAP标准一致, EAP-RESPONSE-MD5_Challenge长度为6(头部) + 16(MD5值) + username_length,在MD5值之后,先紧接用户名,然后是4字节的本机IP地址,以及9个意义不明的字节,直接复制:{0x00, 0x00, 0x2f, 0xfc, 0x00, 0x03, 0x01, 0x01, 0x00}; EAPOL-KEEP-ALIVE当认证成功后,需要每60秒发送一次该报文,否则会断线;该报文的b:EAPOL 报文类型为0xFC,帧长值为12,其携带信息的前8字节在实际中似乎是随机变化,找不出其规律,不过实际上全部设0也可;后4字节则是本机IP。 在部分版本中,如吉林大学珠海学院,每隔5分钟(可能就在第五个EAPOL-KEEP-ALIVE发出之后)服务器会重新发来EAP-REQUEST-Identity,程序需要正确应答,特别要设置各个应答报文中的e:EAP通信id。 关于服务器返回的数据包,Success和Failure通常包含有中文编码的信息,标志是,EAP报文结束后,紧接0x00002ffc(大概0x18、0x19),其后接着是一个字节的报文长度,再后就是gb2312编码的中文信息。 由于协助我测试的湖南人文科技学院的网友他们的系统是纯手工设置网卡IP的,所以我也不清楚是否有像其他品牌的协议那样有动态静态IP位之类的信息位,如果发现这个版本的程序不能通过认证,可以自己抓包分析,或邮件联系PT。
Page optimized by WP Minify WordPress Plugin