博客

最近报告出去的两个 bug

一个是腾讯 TT 的 bug,keydown 事件无法捕获 'l'、'n'、'o'、's' 四个按键。这个 bug 真是匪夷所思,不晓得开发人员怎么犯下的如此的弱智错误。不过我们的项目最后还是绕过了过去,就是额外写了不少垃圾代码。然后在 QQ 的论坛上报告,昨天有一个腾讯的测试人员联系我要测试用例,于是写了这个 http://www.dup2.net/tt.html,今天一大早就告诉我开发人员已经改过来了,等下个版本了。估计 TT 的开发人员也经常加班工作,呵呵。

另一个是 twisted.words.protocols.msn 的 bug。严格来说不是它的问题,而是 MSN Shell 没有很好的遵从 MSN 协议规范发消息;但结果会导致无法和 MSN Shell 正常通话。写了一个 patch 解决这个问题提交给 twisted,还不晓得维护人员愿不愿意为了一个中国的 MSN 插件而接受这个 patch

Topic: 技术

老婆果然是比我聪明...

听说北京神州行、动感地带即将单向收费后,我今天在下班的公交上突然想到这样就可以一有来电就自动接通,然后向打电话的人放 mp3,甚至可以做到不同的拨打者放不同的歌;按下接听则将声音输入从 mp3 转到 Mic 上。

这样岂不是比现有的彩铃灵活很多?简直是语音业务的又一大 killer app 啊。就算手机厂商不做这个功能,在 S60/WindowsMobile 这样开发性很好的平台上应该是很容易实现的。貌似唯一的遗憾就是有些费电.....

于是俺回家后兴冲冲的把这个主意告诉了老婆。老婆想都没想就一棒子把我打回原形:接电话是不掏钱了,那打电话的呢?

......无语......

Topic: 技术

回家

每次快要回家的时候,MSN 上的名字都会换成"那刻着我的名字/年老的树/是否依然茁壮",虽然我大抵是从来没有在树上刻过自己的名字,但每当想起这歌的时候,总好像家里有这么棵树在等着我回去一般。

买到的是 16 号的车票,T15,终点站广州。

细想就会觉得到武汉的火车真是很多,除了暴多的 Z、T 字车,去长沙、广州的车也通常会在汉口武昌停一下,所以每次春运都能有惊无险的拿到车票。

票是托人(其实也可以算是一个票贩子)买的,因为信任他的能力,也从没有考虑从别的途径去买票。结果 15 号晚上才拿到票,而 qyt 同志已经实在等不及又搞了一张票上车走了。于是晚上立刻上网登出一条火车票转让信息。

网上卖票从另一侧面印证了北京到武汉的车票之充裕,反正是在 n 个网站上都发布了消息,但只有一个人来询问信息,听说我是在清华东门附近后也打消了念头。

直到坐上前往西站的 47,才有人打手机联系,最后敲定在西站交易,一起上车。到了西站,就听广播说还剩余到武汉、青岛、南京.. n 多热门地点的卧铺,乘客可到 18 号窗口购买云云,实在是令人 faint.

T15 发车甚早,下午 6 点多就开了,晚饭就在餐车上解决,正好也尝尝粤式餐车的特色。平心而论 T15 做的菜还是很可口的,老婆和我要了 2 菜 1 汤,2 碗米饭,吃的干干净净。总价 69 不算便宜,但考虑餐厅特殊的地理位置,也确实不算贵。

吃完饭后还是远没到睡觉的时候,幸亏我早准备了一本关于萨特的书。作为理科学生,以前大学里面从来没有接触过萨特——尽管其大名在还没有上大学的时候就如雷贯耳的——看的是津津有味。存在主义的确很有意思,尤其适合当代中国从小学习马列再寻求哲学突破的境遇。估计看我 blog 的人也以理科生为主,这里推荐补补课。

武昌车站正在大修(后来知道是要修很多配套以及地铁),拐了好多个弯才走出车站。然后就是到处找过早的地方,这里不禁要赞一下南方的早点——可以舒舒服服的坐下来要一份云吞或者米粉热干面什么的吃下去。大概是南方多雨,为了避免受天气影响生意,所以早餐点全都是有自己的临街铺面。而且也不是北京天津这样套一个塑料袋避免洗碗,用的是专门的一次性餐具,类似“来一桶”。

T15 临晨 5 点多就到了武昌,下车吃完早饭后马路上仍是冷冷清清。“我走在清晨六点/无人的街/带着一身疲倦”,我突然有预感,这次回家肯定会有和以往完全不同的感受....

Topic: 社会

twisted 简单的 daemonize,以及 cron 功能的实现

年前系统监控脚本已经写好了,同事实现了检查 resin 状态和 https 用户口令校验,出状况则短信通知... 春节期间一直没有收到报警短信 :)

但还是比较粗糙,比如脚本是要依赖 nohup 启动的,想起以前写 echo server 的时候曾考察过 daemonize ,于是把代码抄来试试

结果发现直接 copy 过来的东东在 twisted 2.5 下不能运行。追踪了一下,发现是不知道从什么版本开始完善了对 win32 平台的支持,它将原来 twistd 的东西又封装了一遍。现在把 "from twisted.scripts import twistd" 这行改成 "from twisted.scripts import _twistd_unix as twistd" 就好了。

另外貌似 twisted 并不推荐这种直接初始化 App() 的方法,而是用 twistd 程序来启动 app,回头需要再学习学习..

顺便又了解一下怎么实现一个简单的 cron,发现可以用 twisted.internet.task 封装的 LoopingCall 来完成,核心应该算是一个叫 callLater 的东东。

Sample:

  1. import os, time
  2. from twisted.internet import selectreactor as bestreactor
  3. bestreactor.install()
  4.  
  5. from twisted.internet import reactor
  6.  
  7. def crontask():
  8.     open("/tmp/crontask",'ab+').write(str(time.time())+"\n")
  9.     time.sleep(2)
  10.  
  11. class App:
  12.     pidfile = "/tmp/cron.pid"
  13.  
  14.     def __init__(self):
  15.         twistd.checkPID(self.pidfile)
  16.         # checkPID 后再 daemonize,否则看不到 checkPID 向终端输出的错误报告
  17.         twistd.daemonize()
  18.         # 先 daemonize 再写 pidfile。因为写入的得是 daemonize 后的 PID
  19.         open(self.pidfile,'wb').write(str(os.getpid()))
  20.         reactor.addSystemEventTrigger('before', 'shutdown', self.shuttingDown)
  21.         cron = task.LoopingCall(crontask)
  22.         cron.start(5)
  23.  
  24.     def shuttingDown(self):
  25.         twistd.removePID(self.pidfile)
  26.  
  27. #from twisted.scripts import twistd
  28. from twisted.scripts import _twistd_unix as twistd
  29.  
  30. from twisted.internet import task
  31.  
  32. def main():
  33.     app = App()
  34.     reactor.run()
  35.  
  36. if __name__ == "__main__":
  37.     main()
Topic: 技术

【转载】京官方把“台邮”与香港邮政并列,台方气炸了

这个搞笑,转一个。

中评社香港2月26日电/“台湾邮政”才正名,就马上被中国邮政纳入地方邮政连结,与香港邮政、澳门邮政并列,台湾政府目前对此束手无策。
  中时报道,台湾邮政总经理吴民佑表示,这只是网站连结,外界不必有过多政治联想。邮政工会则“气炸了”,抨击好端端的中华邮政偏要改名台湾,被大陆顺理成章列为地方邮政,白白被吃豆腐,吞下一记大闷亏。
  对大陆政府这项“矮化”举动,“行政院”“新闻局长”郑文灿声称,大陆政府已不止一次使用这项手法,擅自把台湾列为其地方政府。但事实上,台湾不止是地理名称,也具有政治、主权意涵,大陆此举是“自己安慰自己”。
  中国邮政去年改组为国家邮政局、中国邮政集团公司,由于其幅员广大,每个省分都有独立的邮政局,各省邮政局网站都连结到中国邮政官方网站。其中,北京赫然把台湾邮政纳入其连结。
  在中国邮政网站上,台湾邮政的连结是放在香港、澳门之下,北京显然刻意将台湾特区化。按进“台湾邮政”连结,马上可连到台湾邮政网页,与大陆其他省分、特区邮政局的连结模式,一模一样。
  台湾政府目前对北京的动作束手无策。早在“行政院”决定让“中华邮政”正名为“台湾邮政”之际,就有部分政府官员提出警讯,担心“台湾邮政”比“中华邮政”更容易被大陆“矮化”。
  据了解,目前北京还只是将台湾邮政纳入大陆地方邮政的连结,等二二八邮票出炉,邮票上的“中华民国邮票”字样,改为“台湾邮票”后,部分官员担心被地方化、特区化的危机会更大。

“台邮”被“特区化”,排名更在香港和澳门邮政之下,“台邮”工会气炸了。

Topic: 搞笑 社会

票之 2007(下)

本来以为回来的票很好搞定,同学言之凿凿说有个亲戚的姨妈是汉口火车站售票处主任,回来的票没问题,于是没让家里在湖北提前订票。结果真真是祸不单至,15 号我被告知她亲戚前一天晚上告诉她,那位姨妈今年退了,回来的票,不成了……,赶紧打电话告诉家里,得知订票时间已过,只能想别的办法了 :'( :'( :'( :'(

幸好,此时我的神经已被锻炼得无比坚强,先回到老家再说,天无绝人之路,这点事总能解决。

到湖北后,在酷讯上继续找票,这回时间比较宽裕,没过两三天,找到初六的软卧一张,初八的硬卧两张。初六的票还正好是潜江的人转让,约定时间拿票。初八的票请五表弟找他在武汉的同学帮忙先拿一下票。

虽然早就从刘韧那里知道酷讯,但是没怎么用过,这回发现它确实是个有用的网站,算是帮了大忙了。

票之 2007(上)

票之 2005

去年的票搞定得倒是很简单,早早通过一个老乡同事搞到一个票贩子的电话,然后加了80 买了一张软卧(硬卧的票已经卖完了),提前两个星期把票拿在手上(直达的车在春运期间都是提前二十天出票)。

节前三个星期,打去年的票贩子的电话,已经打不通了。又找了一个,说是没有办法弄到票。班头说她托了两个人,各买 2 张票,如果都能买到,就会多出两张。不过这是没谱的事,所以叫父母找单位驻京办事处的人想办法买我跟高中一哥们 15 号两张票,他们平常跟固定的票贩子有联系,应该有比较大的把握。

事到如此,就开始等着了。

大学兄弟帮人在他工作地点的楼下加 150 买了张 14 号到武汉的票,问我买吗,我想驻京办事处的票应该有谱吧,如果手上有了加 150 买到的票再出手卖的时候会不会碰到便衣,问我高中那哥们,他说手上有张票再说,于是让大学同学先买了一张 15 号的火车票给我高中同学,并说好如果驻京办事处也买到票了,票你自己负责处理。

直到 13 号上午,驻京办事处那边的票也没消息(据说提前两三天才有消息),班头在 msn 上告诉我她托的人都买到票了,每张加 50。立刻决定这两张票先都要了,然后通知高中那哥们把手上加 150 的票处理掉。大家的动作都很快。中午吃完饭,班头又在 msn 上小心翼翼地问,那加 150 的票已经处理了么?有一个关系不错的没有票。头立刻晕了,联系上高中哥们,答曰已经处理了。班头说票都给你们,我实在不行三十晚上走。这个时候,怎么能让别人入地狱?我说我等驻京办事处的票吧(心里绝望地想,终于可以体验一次三十晚上在火车上过年的感觉了,似乎也不错,说不定能上新闻联播哩)。

直到 14 号晚上,驻京办事处的票依然没有着落,说 15 号才有最终消息,我让我哥跟他说如果 15 号的票实在买不到加买一张 16 号的票(我哥是托他买 16 号的票)。我收拾了背包,准备 15 号他突然告诉我票有了然后我背着包下了班就直奔西站。这天晚上我哥告诉我,如果 16 号的票最后也买不到,就去天津过年,初一坐飞机回湖北。

15 号一大早,疯狂地刷酷讯页面,看到一条条转让 15 号的车票的消息。打通一个,这个人是个厚道人,先强调票的情况:铁路系统内部票,票上印了×车×号×铺,如果有铁路的乘车证,凭证免费,如果没有乘车证,拿票上车补一张硬卧就可以了。这张票她花了 50 元买的,转给我也 50 元。而且告诉我,她前面已经接了几个电话了,好像打电话的人听了是这种票都挺犹豫的。我心想最多就亏 50 元,立即说我马上过去取票。

她告诉我在清华东门旁边的威新国际大厦 10 层,到后我才发现原来搜狐就在威信国际大厦,打电话问我哥,原来他在 11 层。

票拿到手后,仔细端详,这张票跟普通的票区别不大,就是票价处写的是¥2元,下面打印着随乘车证有效

没有乘车证,心里依然忐忑不安,万一检票上车时被要求出示乘车证怎么办?后来想了一招,让乘同列车的班头凭她的票买了一张站台票,然后用站台票上车,然后就等着开车吧。就这样,顺顺利利,我终于没上成新闻联播,哈哈。

教训一:如果手上没有第二张票,第一张票无论如何不能出手。
教训二:路子不要太多,谁能最快给票就走哪条路。

如果明年大学同学公司楼下的售票处还能拿到票,就走这一条路了。

16 号的票看样子比较好买,到了 15 号晚上我上车后跟我哥联系,他已经从买票人的身份变成卖票人了。他应该会把这个过程写成 blog 吧。

twisted.words.protocols.msn 协议简述

首先推荐一个关于 MSN 协议描述的网址:

http://www.hypothetic.org/docs/msn/index.php

在试着改写 twisted sample 的过程中,基本上是靠这个网站上的内容来学习 MSN 协议的。

在 twisted 里面定义了三类 ClientFactory,分别对应 dispatch server、notification server、switchboard server

客户端启动的时候首先去请求 dispatch server (messenger.msn.com),它会告诉客户端一个可用的 notification server,然后立刻关闭连接。

客户端接下去连接 notification server,其间还会到别的服务器上去认证一下(就是通过 https 把用户名密码送到一台机器上,然后获得一个临时令牌,再告诉 notification 这个令牌信息,认证就通过了)。最终身份确认后,在 MSN 登录其间就不会再断掉这个 TCP 连接了,所有的 presence 信息就是通过这个链接传递的。

可以想象 MSN 有无数台 NS,那么连接在不同 NS 上的用户之间怎么传递消息呢?Jabber/XMPP 的类似机制是 router,用一个专门的服务来帮助寻径。MSN 的解决方案是 switchboard server。

就是说 A 想和 B 说话的时候,就临时请求一个 switchboard server 资源,然后自己连接上去,B 也会接受到一个通知对话发起的 notification,里面包括 sb server 的地址。B 连接上去以后两个人就可以通过这台 sb server 进行通信了。

写到这里突然想到,notification 好像都是明文传输。理论上我们可以监听 MSN 的 notification 拿到 IP/Port/SessionID/Key,然后先 B 一步连接上 sb server,这样就可以冒充 B 的身份和 A 聊天了,想恶作剧的可以尝试一下(黑客可以利用这个来伪造信任身份传恶意 URL,还是挺可怕的)。

除了 dispatch、notification、switchboard 的概念外,我的例子里面还涉及到了联系人的信任状态,即 forward、reverse、allow、block。其实这篇文档里面介绍的很详细了,英文也很容易懂,就不再多说了。

Topic: 技术
订阅 RSS - 博客 | BT的花