qyb的博客

超级腐败..

周四晚上去超级腐败了一次,后来看帐单,平均每人的消费额是 250¥(对,我没有弄错,不是后面多写一个 0,也不是前面多写一个 2),不过在一张优惠券的帮助下,只付了一点小钱就顺利逃脱了...

这就是位于东二环华润大厦顶层的美洲俱乐部。华润大厦号称是二环内最高的建筑,那这个餐厅也可以说是全北京视野最好的餐厅——整个 CBD 都在你的脚下,确实感觉当富人不错,hoho。

既然好不容易去这里腐败一次,当然点的还是西餐。服务生推荐了牛排,但是价钱严重超出预算,只好很俭省的去看那些标价 1xx 的主菜。服务生个子不高,但气质绝对比我们吃饭的几个更像上流人,不晓得 15% 的服务费他能拿到多少。

美洲俱乐部的菜单比较有意思,分主客两种——给客人的菜单上是没有价格的。于是不幸分配到客人菜单的根本没有了点菜的心思,只好面露微笑,装作内行的慢慢浏览。

最后偶要了是鹅肝(138¥),好小的一块,而且很腻,如果不是还供应免费的面包,当晚肯定要饿肚子了。另外还要了黑方,估计也就 1 杯底,收费 40 ¥,杀人啊。

最后总结:如果要正常吃好的话,大概平均一人应该是 300 ¥的预算,不过如没有该俱乐部的会员身份,估计还很难混进去。下回再去,一定要份牛排来吃,哼!!

Topic: 生活

本 blog 系统更新了!!

更新到最新的 drupal 4.7.3。现在增加了如下模块
captcha: 防止垃圾评论
geshifilter: 格式化代码, 可以看看python代码的效果
service_links: 在每篇文章下面增加一个 "delicious | digg | technorati" 的链接

similar: 相关文章. 查看每篇文章的时候自动在左侧提示相关文章, 看起来还挺智能.

qyt 制作了 favicon,一朵"BT 的花";以及相关动态图标(在 firefox 下才能看到效果),超级酷!

本人在 bluemarine 的基础上, 稍稍变化了一下, 做了一套新的模板.. 那些用 rss reader 订阅的同志们, 请上来看看评论评论..

DV-2-XviD 0.6 发布

见本站项目DV-2-XviD

0.6 版本解决了老版本只能同 XviD-1.1-beta2 协同工作的问题... 这个让人尴尬的 bug 拖到现在才解决实在是抱歉. 也因此觉得这个软件的可用性现在高了很多,这才敢放出来公开供人下载.

计划下面需要解决的问题依次是:
a. 文件大小/码流的精确控制
b. 对目标文件各项参数的配置

c. wxPython 相关问题

不过以上目标暂时要搁置了....

下面要集中精力, 早日完成我的手机同步程序。最近又免费弄了一部早期的 S60 机 (Nokia 3650), 正好又多一个测试设备.

Topic: 技术

男人得掌握一门手艺

很久很久以前,大概也有十好几年了。看 PC Magazine 里面的一篇专栏文章,说的是作者的小孩回外婆家玩,看到一台很久没有使用的 PC,于是问他老爹(也就是作者)能不能想办法让机器运行起来。作者本来以为这机器只是一台 286,结果居然是 386! 而且还有 4M 内存!!于是换了一块新硬盘,装了一套 Windows 3.1 和 WordPerfect (都是厂商送来评测的),于是小孩的假期就很快乐的和这台电脑为伴了..

接着作者充满感情的回忆到他父亲有一次给家里的旧车更换化油器的事情,然后感叹: 几十年前男人以自己修理汽车为荣,现在的男人则负责给家里的电脑升级(没错,有谁听说过女生帮自己男朋友修理电脑的??),虽然时代在变,但男人干起这种手工活来还是很自豪的..

下面是我本周末的经历:老婆的妹妹刚刚毕业,分配到北京某事业单位,住集体宿舍。但宿舍内的上网条件很不好,因为宿舍楼位于军队大院,整栋楼只有一个人接入了 512K 的线路,然后同宿舍楼有另外三个屋子从那里接入,4个人均分网络费用。我这小姨子还没有男朋友,于是这"布线"的责任就义无反顾的落在了俺的身上。

我这个周六的任务就是去把同一层的一个接入点那里再引一根线到她们屋内。具体这活怎么弄的就不细说了,总之得益于在网络中心工作时的经验,虽然以前没怎么动手干活(最难忘的一次是在墙上钻眼,结果怎么也把不住钻),但没见过猪跑总吃过猪肉。宿舍楼内的环境和我事先预料的没有什么太大差异,工具也准备齐全,很顺利的就搞定了。

在该上级接入点的称赞俺办事利落的时候,就想起了 PC Magazine 上的这篇故事. 再联想起上周电梯里听两个程序员讨论做 RJ-45 头的对话。遂有感叹:时代在继续前进,我们男人不仅仅需要会更换硬盘,还需要能压头、布线、跑管.. 下一步偶就要学习怎么利用铁锅或漏勺来研发 wifi 增益天线了.

写到这里,想起当年我父亲大修我们家自行车的情景了. sigh.. 我们就这样在手工活里慢慢长大、成熟、老去

远程控制 PC

刚工作的时候,接触网管系统,就知道先进的系统都支持报警模式。最初很不明白,软件怎么去向人报警呢?后来韩爽姐姐和冰河哥哥教育我,这个东西可以接一个modem,然后向寻呼机发一条呼叫(估计只能支持自动台了)。立时做顿悟状,幻想某天晚上睡梦中被一条寻呼信息惊醒,然后直扑图书馆或化学楼的 5505

后来接触湖南的项目,局方有一变态的需求,要邮件系统的监控程序可以实现声光报警。我看了需求很诧异这个东西是怎么答应下来的,于是问 ray 同学,回答是计划调用 mpg123 之类的东西放首歌,至于光报警的实现方式,还没有太想好(后来看到的 MIT 学生自制的 Disco Dance Floor 到是一个不错的方案)。

上面说的是利用 PC 的声卡/音箱、串口来产生信息的方案,但是有谁考虑过怎样远程控制 PC 产生动能呢??

请看 Engadget 的自动猫咪喂食器

Topic: 技术

周末腐败

都是家庭内部活动,老婆,小姨子,我弟,加上我一共4人.

周六下午去 K 歌,。去的是住处附近的京师大厦. 巨大的房间(放下10个人绰绰有余),从 15:00 开唱到 20:00, 只要 80RMB, 好便宜. 不这么便宜当然就不包括吃东西啦,需要自己去买.

音响效果不好,想要唱的开心并不推荐去那里。但它硬件设备做的好玩,有"鼓掌" "欢呼" "倒彩" 等按键。

发现了在钱柜和麦乐迪都没有的歌:《用手走路》 , HAHA.. 加上以前从来没有唱过的林子祥的敢爱敢恨, 这次还算是玩的不错.

周日晚上去必胜客,照例要了一个沙拉,然后去费劲的垒起来,仍只是垒了两层就摇摇欲坠只好放弃了.

然后我想了一个恶搞的主意:随便弄一碗沙拉,吃完以后把碗舔干净,然后再去盛不就行了么?何必一层一层这么麻烦

然后 qyt 同学教育我:何必舔干净,套上塑料袋岂不是更好?

Topic: 搞笑 生活

QQ-YY-BT 的国米写真

二周前,我们兄弟俩各买了一件国际米兰的T-shirt. 距当初到服装街给我们班球队买国米球服已经是过了整整 10 年.

虽然是在 nike 买的,但是袖口上莫明其妙绣的是英格兰的圣乔治旗的图案. 今天下午拍了一套身穿此 T-Shirt 的写真。呵呵,好久没有如此大规模的拍照片了. 照片上载到了我的 Picasa Web Albums

下面是一段典型的邱氏兄弟对话:

qyb: 如果你脸再尖一点就比我帅了

qyt: 。。。。。。放屁

Topic: 运动

Internet Explorer 7 RC1 推出

两个感想:

1. 必须开始重视 IE 7 了,马上我们就会面对一个更加混乱的世界。如果是新起步的网站其实优势还是很大,现在开发界面只需要考虑兼容 IE7 和 Firefox 就好,产品成熟后估计 IE6 就要走下坡路了。

2. 作为开发者还是需要英文版的操作系统,因为现在只有 IE7rc1 的英文版可用。不晓得我的 R51e 的 COA 是否许可我去安装一个英文版的 xp home edition.

Topic: 网络

时光●漫步●那一年

数月前买了一台桌面mini音响,那天翻出来《Nirvana:Unplugged in New York》,大概是十年前买的盗版 CD,结果放到 Plateau 的时候放不下去了,盘面被划伤了。虽然我对乐器一窍不通,但听 Unplugged in New York 总能给人带来一种扒带的冲动,这兴头突然被终止,非常不爽,于是寻找看有没有什么替代品。

结果发现这张《那一年》,它是我弟很久以前丢在我这里的。我以前对许巍的印象只限于,气氛还算接近 Nirvana,于是丢进唱机里。和完全不同,《那一年》里面没有绝望的低吟,换的是爱的欢乐和彷徨。不晦涩,很好听。

第二天去订《Unplugged in New York》,顺手搜索了一下许巍的专辑,决定把《时光·漫步》买回来听听,结果彻底被许巍征服了。

我的整个高中是被港台音乐毒害的,到北方上学后耳朵一下子被拓宽,每天听刚推出的中国歌曲榜。先是红星推出的赤裸裸,然后是魔岩三杰。尤其是《黑梦》,第一次体会到专辑的概念完整性。接着我阴差阳错的选择了和别人合买了一台 PC,而不是去买一把吉他,这辈子的生活道路就这么确定下来了。

然后是我弟也来了北方,他开始给我供应磁带。我记得的有《无能的力量》,《伍佰夏夜晚风》,最后是我买了一张甲壳虫纪念专辑《ONE》,摇滚音乐就从我生活中消失了。

回过头来说许巍,我没有听过专辑《在别处》,但从可以推想他的风格。许巍的音乐变化和我的成长很类似,好像我跨越的这10年许巍都完整的用他的音乐表达出来的。后来看乐迷的评论,这种人生轨迹的契合是我们喜欢许巍的最大原因。

音乐诗人许巍,这是我给他的定义。

Topic: 音乐

Python ctypes 里使用 create_string_buffer, addressof, string_at

已经写了一篇 blog 里面介绍了如何传入结构体指针的方法,而前不久发现了另外一种传入一整块 buffer 的方案,不用定义 Structure class,直接类似 malloc 那样的方法去执行,就是 create_string_buffer addressof string_at 系列函数,感觉更接近底层调用.

首先修正上篇文档里面的一个问题,就是 load 这个方法已经取消了(当时我使用的好像是 0.9.9.3 版的 ctypes),LoadLibrary 这个接口随着 ctypes 1.0 的发布并被集成进 python 2.5,应该是正式确定了名称。

其次注意的是根据源代码里面对函数不同的声明,还得选择采用 cdll 还是 windll 来实例化一个动态库,用 WINAPI 声明的函数需要用 windll.LoadLibrary(dll_file_path)。因为不同的声明导致参数传递的方法不一样,我自己就是费了好长时间的尝试,才搞清楚为什么总是报错"rocedure called with not enough arguments (xx bytes missing) or wrong calling convention"。ctypes 的手册里面还提到另外有 oledll, pydll 两种类型.

如果一个 dll 里面即有普通方法定义的函数,也有 WINAPI 定义的函数,而你只希望只 Load 一次动态库,那么就需要 WINFUNCTYPE 或者 CFUNCTYPE 这样的方法来指定不同的函数类型了。

大家都应该机器上安装 XviD 解码器了吧,:)
现在我们分别用两个不同的方法取出 XviD 编码器的缺省配置(C 源代码参考 xvidcore-x.y.z\vfw\src\driverproc.c)

  1. from ctypes import *
  2. DriverProc = windll.LoadLibrary("c:\\windows\\system32\\xvidvfw.dll").DriverProc
  3.  
  4. configsize = DriverProc(c_int(0), c_int(0), c_int(0x5000), c_voidp(0), c_voidp(0))  
  5. # 获取结构体大小 configsize
  6.  
  7. did = DriverProc(c_int(0), c_int(0), c_int(0x0003), c_voidp(0), c_voidp(0))
  8. # 获取访问句柄 did
  9.  
  10. config = create_string_buffer(configsize, configsize)
  11. # 创建 buffer, 返回一个 Python 对象
  12.  
  13. pconfig = addressof(config)
  14. # buffer 的地址,让我想起了 C 里面的 &
  15.  
  16. DriverProc(c_int(did), c_int(0), c_int(0x5000), pconfig, c_voidp(0))
  17. # 这次调用就是把缺省配置复制到传入的内存区域内
  18.  
  19. s = string_at(pconfig, configsize)
  20. # 最后我们从 pconfig 地址里的内容生成一个字符串对象出来

上面的代码通过 cdll + WINFUNCTYPE 来写就是

  1. from ctypes import *
  2. from ctypes.wintypes import *
  3. xvidvfw = cdll.LoadLibrary("c:\\windows\\system32\\xvidvfw.dll")
  4. # 看好了,这里可用的是 cdll
  5.  
  6. prototype = WINFUNCTYPE(LONG, DWORD, DWORD, UINT, LPARAM, LPARAM)
  7. # LONG 是返回值,DWORD, DWORD, UINT, LPARAM, LPARAM 是参数列表
  8.  
  9. paramflags = (1, "driverid", 0), \
  10.              (1, "hdriver", 0), \
  11.              (1, "umsg", 0), \
  12.              (1, "para1", 0), \
  13.              (1, "para2", 0)
  14. # 设定一下参数表,以及缺省参数,就可以用 key=value 的方式来传递了
  15.  
  16. x = prototype(("DriverProc", xvidvfw), paramflags)
  17. # ...
  18. configsize = x(umsg=0x5000)
  19. # 这里只传入一个参数,其它的就自动用缺省的了;而且无需 c_int 这样来转换
  20. did = x(umsg=0x0003)
  21. # .... 以下就不需要注释了吧
  22. config = create_string_buffer(configsize, configsize)
  23. pconfig = addressof(config)
  24. y = x(driverid=did, umsg=0x5000, para1=pconfig)
  25. s = string_at(pconfig, configsize)

最后要说的是通过 dumpbin.exe /exports dll_file_path,就可以查看一个 dll 里面有哪些函数是被 export 出来,可以给我们来调用的(我自己猜测) . dumpbin.exe 可以从 masm32 里面免费获得

update: 在上述第一个例子里面,传入的参数用 addressof 去做一次转换并不是必须的. 可能 ctypes 会在内部自动处理

Topic: 技术
订阅 RSS - qyb的博客