博客

对面的男孩看过来

前天在出租车上,听到改编的《对面的男孩看过来》,顿时陷入 yy 中,想像如下唱歌场景:

dada:对面的男孩看过来
dada:看过来看过来
dada:这里的表演很精彩
data:...
data:不要被我爸爸样子吓坏
qyb:其实我,很可爱
....

现在她喜欢看《蚯蚓日记》,里面有一幕:
小蚯蚓走过父母的结婚照前,那照片上是两只蚯蚓在互吻,小蚯蚓撇嘴说:"恶心"

dada 学会"恶心"这个词后乐不可滋,我和老婆就故意在她面前碰碰嘴,她就大笑着说"恶心"

 
Topic: dada

黄河舰队

前天晚上看电视的体育节目。山东鲁能赢了一个5:1,主持人反复说了一个词——黄河舰队

以前一直听说山东鲁能号称中国的皇马。皇马前两年因穿白色队服、巨星无数、球场上所向披靡被誉为银河舰队。听到这个词,眼前浮现的是一支由许多飞船(带攻击性)组成的太空舰队游弋在浩瀚银河的壮观场面。可听到黄河舰队这个词,我只想笑,几支破木船在黄河里游荡(可能是这两天黄易的《边荒传说》看多了,里面有许多帮会船只在江河里水战的描述)。

这个名字不知是谁想出来的,主持人端正地坐在笔记本电脑前庄重地说出这个词,应该是褒义吧。可一个是太空中飞的船,一个是内陆河里游的船,这境界也差得太远了吧。我总觉得想出这个名字的人不是为了赞扬鲁能,而是对它号称中国皇马的一种反讽。


Topic: 搞笑 运动

相当地负责

blogchina的管理员真是相当地负责任啊,而且手快得不可思议。

我上周五写了告别blog,没想到两三个小时后,原来的blog首页就空了。原因不祥,是因为明确说不再更新该blog?还是因为写了一个Blogchina To Drupal犯了BSP的大忌?最可惜的是,最后写得那个解释红旗下的蛋的blog在首页上看不到了(本来都已经置顶了)。

blogchina够狠。


更新:偶然发现原来的blog显示又正常了。奇怪...

Topic: 商业

We could be together

芝华士的广告非常好,从画面到音乐到意境。

我们不在阿拉斯加,没有钓竿,更没有冰面,连小冰块也懒得碎,随便冻了点大冰块,找找感觉,哈哈。

Topic: 搞笑 生活

“京ICP备06026314号”这个备案号倒是不错,结尾是4!而且还是14!!很讨厌那种从广东流传过来的厌四喜八的恶俗。

文化和经济的关系联系可谓紧密。广东最先从改革开放中获得经济好处,而粤语里面“四”和“死”发音相近,广东的这个习俗也随着经济优势在内陆流毒甚广。而商家正是利用了大多数人厌四喜八的心理从中获取暴利。

其实从中国传统文化来看,一到九,每个数字都能说出好的彩头。经济发达固然好,可是学习它的时候舍本逐末就万万要不得了

Topic: 文化 社会

Blogchina To Drupal

三月初,注册了一个域名dup2.org,作为我和我哥的个人网站,并于第一时间在上面搭了一个Drupal的blog服务。于是我面临了许多blogger都曾遇到的一个痛苦问题——搬家。虽然我的blog不多(127篇),就算重新发布一遍工作量也不算太大,可是如果搬家不把blog的发布时间也同时搬过去,意义不大。

上个周末的目标就是和我哥解决这个搬家的问题。我的想法是把所有blog都先下载到本地,用perl或者其它脚本语言把blog的标题、发布时间、正文内容从这些本地文件中抽取出来,然后分析Drupal的数据库表结构,再写个程序把这些抽取出来的东东插入到数据库中。其中难点是1.perl不熟悉,需要再学习;2.研究Drupal的程序,找出存数据库中存blog的表结构;3.需要找找perl的数据库操作范例依葫芦画瓢写个插入数据库的程序。

周六白天去了植物园,下午五点来到哥哥家,他已经用python写了个程序提取blog中的数据(利用python中现成的库把html变成xml,然后取对应标签中的数据。可是这个程序碰到blog中含有表格时,处理的结果有问题)。同时又找了一个Drupal的模块Node Import,通过此模块可以把CSV文件(用逗号分隔字段的文本文件)直接导入到Drupal中。这样一来搬家任务几乎就没啥障碍了,如果提取的数据没有问题,只需把python再顺便做一个CSV文件出来就搞定了(以后再有类似需求,首先想到的就是python而不是perl了)。

在我的注视与参与下,重新写了一个python程序,抛弃了html转xml的思路,直接按字符串处理html(顺便我也领略了python的简单强大的字符串处理方法),把需要的数据完美地从blog中提取出来:)。因为CSV文件要用“,”分隔字段,为了避免混淆再把数据中的“,”变成别的符号;将日期处理成模块中要求的格式;当然最后还要把数据变成UTF-8编码,用iconv命令,这我哥熟,交给他搞定了。

公元二○○六年四月一日晚十时许,先备份数据库(万一失败,还可以恢复),开始导入,几十秒过后,导入完成,进入blog页面检查,搬家成功。

Topic: 技术

红旗下的蛋

目前,在google和百度上搜“红旗下的蛋”,这个blogchina上的网志分别排在第一和第二。看到这种结果,我诚惶诚恐且不甚欢喜。这本是崔健在94年出版的个人第三张专辑的名子。我怀着崇敬的心情用它作blog名,没想到却在搜索引擎上抢了它的风头。真切地期望介绍这张专辑的网页能永远排在搜索引擎的第一位。

红旗下的蛋

词:崔健 曲:崔健

突然的开放实际并不突然
现在机会到了可谁知道该干什么
红旗还在飘扬没有固定方向
革命还在继续老头儿更有力量
钱在空中飘荡我们没有理想
虽然空气新鲜可看不见更远地方
虽然机会到了可胆量还是太小
我们的个性都是圆的
象红旗下的蛋

头突然出来是多年的期待
挺胸抬头叫喊是天生的遗传
心里当然明白我们是谁的后代
无论行为好坏内心还是清白
权力在空中飘荡经常打在肩上
突然一个念头不再跟着别人乱走
虽然身体还软虽然只会叫喊
看那八九点钟的太阳
象红旗下的蛋

肚子已经吃饱了脑子已经想开了
别说这是恩情永远报答不尽
我们不再是棋子儿走着别人划的印
自己想试着站一站走起来四处看看
现实象个石头精神象个蛋
石头虽然坚硬可蛋才是生命
妈妈仍然活着爸爸是个旗杆子
若问我们是什么
红旗下的蛋

Topic: 音乐

当用 Python ctypes 模块调用动态链接库,如何传入一个结构体指针

最近用 dv2xvid 这个东东很多,上两周几乎每天都用它跑一个晚上压缩2个小时的视频。于是又萌发了把它改进得更通用的念头。

目前 dv2xvid 有一个很严重的问题,就是只支持 xvid-1.1.0-beta2 的压缩。而事实上目前大家用的最多的是应该都是正式版本,比如 1.0.3 或者 1.1.0 之类。如果想能支持更多版本的 xvid codec,就必须能在压缩之前判断 xvid 的版本。

恶心的是安装的 xvid 的目标文件没有 Windows Dll 的版本属性,查了半天,调用 xvidcore.dll 里面的一个函数可以获得 xvidcore.dll 的版本号

  1. #include "xvid.h"
  2.  
  3. {
  4.   xvid_gbl_info_t info;
  5.   HINSTANCE m_hdll;
  6.  
  7.   memset(&info, 0, sizeof(info));
  8.   info.version = XVID_VERSION;
  9.   m_hdll = LoadLibrary(XVID_DLL_NAME);
  10.   if (m_hdll != NULL) {
  11.     ((int (__cdecl *)(void *, int, void *, void*))
  12. GetProcAddress(m_hdll, "xvid_global"))(0, XVID_GBL_INFO, &info, NULL);
  13.    
  14.    printf("xvidcore.dll version %d.%d.%d (\"%s\")",
  15.                 XVID_VERSION_MAJOR(info.actual_version),
  16.                 XVID_VERSION_MINOR(info.actual_version),
  17.                 XVID_VERSION_PATCH(info.actual_version),
  18.                 info.build);
  19.  
  20.     FreeLibrary(m_hdll);
  21.   } else {
  22.     printf("xvidcore.dll not found!");
  23.   }
  24. }

如果在 python 里面做到这个事情,可以通过 ctypes 模块来完成。但查遍 ctypes 有关的中文文档,都没有关于怎样在函数中传入结构体指针的说明,只能自己 google 之,后来发现应该这么来做:

  1. from ctypes import *
  2.  
  3. ### 定义结构体
  4. class xvid_gbl_info_t(Structure):
  5.     _fields_ = [("version", c_int),
  6.                 ("actual_version", c_int),
  7.                 ("build", c_char_p),
  8.                 ("cpu_flags", c_uint),
  9.                 ("num_threads", c_int)]
  10.  
  11. XVID_GBL_INFO = 1
  12.  
  13. dll = cdll.load("c:\\windows\\system32\\xvidcore.dll")
  14. xvid_global = dll.xvid_global
  15.  
  16. ### 构造 pinfo 结构体, 然后赋值
  17. pinfo = xvid_gbl_info_t()
  18. pinfo.version = ((((1)&0xff)<<16) | (((0)&0xff)<<8) | ((0)&0xff))
  19.  
  20. x = c_voidp(0)
  21. y = c_voidp(0)
  22. ### 用 byref 传入指针
  23. if xvid_global(x, c_int(XVID_GBL_INFO), byref(pinfo), y) == 0:
  24.     major_version = (pinfo.actual_version>>16)&0xff
  25.     minor_version = (pinfo.actual_version>>8)&0xff
  26.     patch_version = (pinfo.actual_version>>0)&0xff
  27.     print major_version, minor_version, patch_version
  28.     print pinfo.build
  29.     print pinfo.cpu_flags
  30.     print pinfo.num_threads
  31. else:
  32.     print "ERROR"

另:最近一周: qyt 完成了 blog 搬家, www.dup2.org 已经通过 ICP 备案. Logo 和 favicon 也正在热情实施中...(不得不承认我弟比我有美术天赋)

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