博客转移记(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 = re.compile(“(

[\d\D]*

)\s*<div id=\”commentform\”>
“) comm_re2 = re.compile(“(&lt;a id=\”_ctl\d+__ctl\d+_CommentList__ctl\d*_EditLink.*</a&rt;)”)#(.*)</a>\r\n</h4>
\s*

\s*(.*)

高中同学聚会

前天鱼头说,老头组织同学聚会。看了手机才发现老头发了短信,顺便还告诉了韩XM。
昨天早上,老头通知十点到附中门口集合,我五十七分左右到的,已经有四五个人了吧。
等了一会儿,来了十一个人。大家决定不再等了,先找个地方坐坐。
于是大家往一条街走过去。老头先去探路,回来之后,大家往一条街深处进发。
经过集体决定,一群人走进了图门烧烤。点了一些饮料之后,大家开始谈天说地。
范围无非学习、生活之类。老头提议说各人说一下各自在研究什么,将来的发展方向。随着钟诚的"说来话长……",这个话题就此结束。
我这桌有LinS,ZhuHY,HanXM,FengCD,后来又把ZhangLW,WuH叫了过来,这样就有7个人,而老头那桌还有鱼头、DongCJ、XuMM、LiJS、ZhongC。
我们这桌大部分人基本上没怎么吃过烧烤,只有FCD好像专业一点,于是一开始点得太少,并且对于生熟程度掌握得也不怎么行……
后来又补点了一批,大部分烤的东西都有过熟的嫌疑……
饭后,大家到复旦南区打篮球。一开始12个人打全场,我在拍照。谁知道碱性电池如此之弱,充电电池拍完后,每组碱性电池大概也就撑了十几张……
于是,接下来分组打球,我也上场了……
13个人,分成4/4/5,我和ZhongC算作一个分在一组。在我们组其他成员努力之下,我们组也胜过好几次,不过体能消耗很快,迅速不支……
我有一年没打过篮球了吧……
接下来,走了3个人,剩下的人到LiJS找的地方打牌。复旦29号楼,门口挂着学生会的牌子。本来想在大厅里面打,看门老大爷说,我干脆开个房间给你们打算了。就情况看起来,貌似管得还是很松的,或许冒充一下也能混过去……
我和HanXM要去买电脑,于是早早离开了。剩下8个人2桌80分。
我们乘车到八佰伴旁的太平洋,花1个小时买了一台台式机的机箱,在麦当劳解决了晚饭,分头回家。
同学见面真令人愉悦~ 大家好像都没有什么变化,或许变化都是内在的吧……
相册可见 http://picasaweb.google.com/Henry.Hu.SH/2009#
鱼头的校内日志: http://blog.xiaonei.com/GetEntry.do?id=358491034&owner=231886837

题外话
整理照片的时候,考虑是传flickr还是Picasa。考虑到flickr容易被封,Picasa从前就传了一些,所以还是picasa。
直接用网页版传,3.4M上去还是3.4M,总共1G空间,还没我存储卡大,这不就很快满了么……
所以去找Picasa软件,看见linux版,3xM,正想下,发现下面说:包含wine,picasa,gecko…… 原来还是wine这条路么……
于是直接下windows版安装程序,只有9M…… 用wine安装运行,非常顺利啊~
传照片也很好,传上去的是1600×1200,~300K每张,也挺清楚的,还有EXIF数据。
看picasa的信息的时候,还说是用于linux的picasa…… 它检测到wine了么……

技术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 400
Blog has exceeded rate limit or otherwise requires word verification
for new posts

COW! 这可怎么搬家啊……

关于A20地址线的那些事情

从前在BIOS里面见过关于A20地址线的选项,后来启动FreeDOS什么的时候好像也见过A20的事情,一直不知道是干嘛的……
后来某天看BSD loader代码的时候,看见启用A20地址线的事情…… 于是去wiki上查了一下,原来是这么回事……
8086那个时候,地址线只有20位,叫做A0~A19,也就是没有A20地址线的。2^20=1M,因此那时能够访问的内存范围是1M。
那个时候也分段,地址由段寄存器左移4位,加上基地址,得到物理地址。
段寄存器和基地址都是16位的,这样就能够访问20位的空间了。但是有个问题……
段寄存器最大FFFF,基地址也是。所以地址最大是FFFF:FFFF,但是FFFF左移四位得到FFFF0,加上FFFF,得到10FFEF,也就是FFFFF+FFF0。但是物理内存只有1M,最大物理地址范围应该是0~FFFFF,因此多了FFF0,超出了物理地址范围。
这样,访问到超出范围的时候,8086会自动做一个处理,把高位的1删掉,也就是10xxxx->xxxx,然后返回对应位置。

按理来说,这是个bug,8086应该返回个错误啥的。但是,既然这已经是事实了,有的程序就开始用这一点,来访问0~FFEF的内存范围,差不多是前64K少一些的范围。这就为日后的新CPU出了难题……

80286,80386等等更NX的处理器出现了,他们支持访问更大的内存范围。自然,10xxxx和xxxx也就指向了不同的地方。但是,跑那些用到从前bug的老程序的时候,就出问题了…… 改了10xxxx的xxxx不变,导致乱七八糟的问题……
IBM他们就脑残了一下,说,我们在A20地址线(也就是那个1的位置……)装个开关吧~ 然后又脑残一下,看见键盘控制器正好有一根线空着,就说,我们让键盘控制器来管这个开关吧~
于是,著名的Gate A20就这么产生了……
打开:输出0xd1到0x64端口,等8042(键盘控制器)空了,再输出0xdf到0x60端口

保护模式的操作系统,自然都需要访问1M以上的内存,而且不希望某一位地址一直是0。所以保护模式的操作系统启动步骤之一,就是打开A20。
但是,IBM那些人们没想到,日后有些环境需要频繁切换A20端口,而键盘控制器是如此之慢…… 他们当初认为,这个切换发生频率很低,因此慢一点没关系……

于是就有了Fast Gate A20的事情。利用0x92端口,读入之后,把第二位改成1,然后写回去,能快一点。
但这个引起了新的bug。毕竟只有某些系统支持0x92端口的这个用发,而有些系统…… 改了0x92会导致没有显示之类的,所以有危险……
后来么,intel也不爽了,就搞了个0xee端口,读打开A20,写关闭…… 速度比从前更快了……

于是,这样就有了3中方法,由慢到快。某些程序就一个一个试,试了一个验证一下。
但是,缓存又来捣乱。有的系统虽然开了A20,还是会把几个字节缓存起来,10xxxx和xxxx一样……

总的来说,A20就是个麻烦的事情,当初搞个BIOS调用之类的也就over了么…… 不过现在的新的系统,基本上都没有A20的问题了,虽然打开A20还是系统启动的必要步骤之一……
参见A20 – a pain from the past