新的键盘 & usbhidaction

从同学那边借了一个键盘用,反正他有好几个键盘,这个放在旁边也不用。型号是 Microsoft Natural Ergonomic Keyboard 4000,很大的一个键盘,还是人体工程学设计的。 装载ukbd和uhid模块,插上键盘,显示出来两个设备: ukbd0 和 uhid0。 貌似ukbd0马上就被Xorg接受了,插上后按键就能够被Xorg接收到。 而那个uhid0,貌似就是用来发送特殊键的了。这个键盘上有不少特殊键,比如一对滚轮一样的Zoom键,Back/Forward, 控制音量和播放器的,启动程序的,以及可以自定义的特殊键。 研究了一下,有两个现成的工具。usbhidctl能够接受并显示 uhid 设备发过来的信息,而 usbhidaction 能够根据预先指定的配置文件,在接收到 uhid 设备的时候,执行对应的程序。 其实 FreeBSD 自带的 usbhidctl 和 usbhidaction 都有问题,他们对于 Report ID 这个HID设备的参数没有处理好。 一个HID设备允许其上的各个组件利用同一个接口发送信息,而这些信息就通过 Report ID 区分。在信息格式描述符中提到 Report ID 的设备,在发出来的数据包的前面会多一个字节,就是这个数据包所属部分的Report ID。 usbhidaction没有处理这个多出来的字节,导致它每次都少收一个字节,然后再收一个一字节的包…… 改了就好了。但是这个修改其实涉及到libusbhid,因此光修改usbhidaction还不行。但是要把这整个需要修改的地方做成patch提交,还要花一些功夫。 于是我改了一下 usbhidaction 和 usbhidctl,还有libusbhid,临时把 Report ID 指定为1,并且根据描述符的处理结果决定接受的字节数。原来的 usbhidaction 默认的 Report ID 是用一个ioctl获取的,这个令我难以理解…… 不是可以有不止一个么…… 关于这个,我发了封信给freebsd-stable,但是没人回…… 看来还是需要完整的patch才比较容易得到接受。 …

Continue reading ‘新的键盘 & usbhidaction’ »

英语46级查分的程序

昨天46级能够查分了,研究了一下…… 主页面调用了一段javascript,验证码竟然是本地验证的…… 这个不说,其实最后查分就是通过XMLHttpRequest直接查…… 就没什么加密一类的事情…… 之后找了一下,好像XMLHttpRequest这个东西还只有Javascript里面才有,python用起来还不方便…… 用FireBug试了一下,因为这个查分系统的请求里面没有数据,所以这个请求其实很简单,拿urllib糊弄一下就好了…… 另外关于FireFox里面不能查的问题,貌似是FireFox的XMLHttpRequest在send(null)的时候HTTP头里面没有Content Length字段,其实send(“”)就可以了…… 另外,最后这个系统还检查一下Referer,至少不是什么都不干……  1 import urllib  2 import urllib2  3  4 id = “Your ID“  5 t = “4“  6 url = ‘http://cet.99sushe.com/cetscore_99sushe0902.html?t=‘ + t + ‘&id=‘ + id  7 values = {}  8 headers = { “Referer“ : “http://cet.99sushe.com“ }  9 10 data = urllib.urlencode(values) 11 req = urllib2.Request(url, data, headers) 12 response = …

Continue reading ‘英语46级查分的程序’ »

博客转移记(1)——关于metaWeblog接口

本来想直接用网上的博客转移服务,无奈找了好几个,比如http://blogmover.redv.com,但是这家的Blogger写入插件好像坏了…… 又如maikr,这个要注册,而且还是windows程序…… 最后只好自己写一个,就当练练Python。 首先是读取原mblogger.cn上的。这个支持metaWeblog接口,试了一下,非常好用。基于Python这种脚本语言的灵活性,对象的方法能够动态生成(估计差不多就像perl里面有个函数能处理未定义的方法调用一样……),metaWeblog的接口直接就成了Python里面对象的方法。 首先,引用xmlrpclib,这个东西现在Python自带了。 接下来 server_uri = “http://computer.mblogger.cn/henryhu/services/metablogapi.aspx” sp = xmlrpclib.ServerProxy(server_uri) 这样就搞出来一个能够帮你进行xmlrpc调用的对象了。它有.system.listMethods()方法,还有.system.methodHelp(method)方法,不但能知道有哪些方法,还有使用说明…… 这个实在是很好用…… 随后 blogs = sp.blogger.getUsersBlogs(progname, username, password) 得到一个list,里面每个对象是个dict,就是一个blog。 这个dict里面的blogid,之后就用来代表这个blog了。blogName对应的博客标题。 for post in sp.metaWeblog.getRecentPosts(blogid, username, password, POST_LIMIT): 这个是metaWeblog的方法,获取最近的POST_LIMIT个帖子。自然你希望获取全部的话,取个什么99999之类的就行了…… 这个post就是个dict,里面有title(标题),description(内容),link(帖子链接),dateCreated(写作日期),categories(分类)。 前三个都是字符串。第三个就复杂点。 返回的这个格式,应该是XMLRPC的标准格式,但是Blogger不认,Blogger认datetime对象的isoformat()返回的格式。 datetime.datetime.strptime(post[‘dateCreated’].value,”%Y%m%dT%H:%M:%S”)+datetime.timedelta(hours=-8) 这样能够把它转换成datetime对象。之所以要后面减掉8小时,因为这里返回的是本地时间(UTC+8),而Blogger需要的是UTC时间,所以要-8。 categories是个list,每项是个字符串,就是分类。 后来搞了一天不成,第二天想着把Comments也移过来。 这个不是metaWeblog力所能及的了,只好直接抓网页了。 本来想把comment的内容提取出来用Blogger API的comment功能发上去。无奈这个comment功能目前只能用自己的帐号发comment,这个看上去就很不好看。后来想想,干脆直接把网页的评论部分处理一下,附在内容后面,还能保存原有风格,以及发送时间、发送人信息等。 httpold = urllib2.urlopen(post[‘link’]).read() 这样先把网页抓下来。 草稿也是返回的,而草稿会抓来一个错误网页。另一方面,在抓下来的网页中发现错误,我就认为这个是草稿——虽然这个像dirty hack,但是也能用用~ commentpart = comm_exp.search(httpold).groups()[0] newcommentpart = comm_re2.subn(“”,commentpart) 其中 comm_exp = …

Continue reading ‘博客转移记(1)——关于metaWeblog接口’ »

技术blog搬家完成

今天把程序完善了一下,然后重新运行。在碰见blogger的发布限制之前,我先遇到了程序Bug……今天往程序里面加了转移评论的功能,这个bug就是出在这个地方。有的blog是草稿,然后程序访问的时候,返回的是访问被拒绝。程序在这个页面里面找评论,于是挂了……改了之后,重新运行,碰见了blogger的发布限制……原打算明天再说,但是Roy的话给了我启发。虽然单个blog有限制,但是能够开多个blog,然后把那些blog导出,再导入技术blog。这样就解决了问题,使得整个搬家工作能够在一天内做完。现在看起来,Blogger的限制大约是每天50贴,还算合理。但是那些搬家程序不知道是怎么混的~另外,总结经验,以后要先尝试运行一遍,再将改动予以实行……

技术blog搬家

其实我有一个技术blog,但是没什么人去……原来架在mblogger.cn上,但是这个地方越来越缺乏管理,用户流失严重,就是懒得搬。话说这个也是我一开始写的blog。这个地方基于.Text平台,提供metaWeblog接口。我打算搬到blogger。在网上找了一下,有现成的博客搬家的地方。但是试了一下,都不能用……比如说,http://blogmover.redv.com/,这个地方能够读出原来的blog,但是写到blogger的模块出问题了……又如maikr,需要登录才能用,而网站挂了,于是注册不了……最后只好自己写一个搬家程序了……既然近期学习python,那么练一下也好。python自带xmlrpclib模块,能够和metaWeblog通讯。尝试了一下,metaWeblog的接口还真好用,不一会儿就能够读出blog了。话说python生产力就是高阿,随便弄一下就好了,有什么问题搜一下也能很快解决。如果…… 如果python不是用空格/缩进表示层次的话,那就更好了!然后去研究写到blogger的方法。这时候我发现,虽然metaWeblog基于blogger API,但是那是老的blogger API……新的Blogger被Google整合到了GData API框架里面,于是巨麻烦无比……Google的人们是不是太聪明了…… 总是觉得自己发明的东西比较好,不用现成的…… 然后弄出麻烦的东西,光了解就要不少时间……还好有python的gdata库,自带了访问blogger服务的样例。但是又有一个问题:貌似Blogger的GData访问方法被GFW掉了……只好改了,用SSL,又耗掉一堆时间……最后,折腾了一大堆,终于是把这个搬家程序写出来了……但是,最后用的时候碰见问题了: status 400Blog has exceeded rate limit or otherwise requires word verificationfor new posts COW! 这可怎么搬家啊……