2009年6月9日星期二

Windows下编译pychm模块

环境: Windows XP SP2, Python 2.5, Visual C++ Toolkit 2003, Platform SDK (2005.04)

1. 编译chmlib
源代码带了Visual Studio的工程文件,直接编译,可得到静态库libchm.lib
将libchm.lib改名为chm.lib

2. 编译pychm
1) 执行python-build-env.bat (具体说明见上次blog文章),其内容如下@echo off 
set VC_TOOLKIT_DIR=d:\Program Files\Microsoft Visual C++ Toolkit 2003\ 
call "%VC_TOOLKIT_DIR%\vcvars32.bat" 

set DISTUTILS_USE_SDK=1 

set MSSDK=d:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\ 
rem set MSSDK=e:\msys\1.0.11\mingw\ 

set include=%MSSDK%include;%include% 
set lib=%MSSDK%lib;%lib% 

echo "Now you can continue with 'python setup.py build/install'" 

2) 将chmlib的目录加入include和lib环境变量
set include=e:\python\pychm-0.8.4\chmlib\src;%include%  
set lib=e:\python\pychm-0.8.4\chmlib\src\release;%lib% 

2) VC没有inttypes.h和strings.h,我也没有找到其它定义了uint8_t等类型和strcasecmp等函数的头文件,所以修改extra.c的如下两行
#include   
#include  
修改为:

#if !defined(_MSC_VER)
#include
#include
#else
    /* MSVC's C compiler doesn't support `inline' */
#define inline
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned   uint32_t;
typedef unsigned long long   uint64_t;
#define strcasecmp  stricmp
#define strncasecmp strnicmp
#endif
3) 修改distutils\msvccompiler.py中MSVCCompiler.initialize()函数
 
self.ldflags_shared = ['/DLL''/nologo''/INCREMENTAL:NO']  
改为
self.ldflags_shared = ['/DLL''/nologo''/INCREMENTAL:NO''/NODEFAULTLIB:libc'


否则libc和msvcrt里面的一些函数会打架

4) python setup.py install

搞定

2009年5月19日星期二

Linux下使用NTFS几则

1. 不久前买了500G的移动硬盘,但为搞成什么格式的分区头疼了两天,因为我想Linux和Windows下都可以读写,但满足条件的FAT32又不能超过32G,并且不支持4G以上的文件。

后来想起原来一直在用的那个40G移动硬盘也没有分过区,也用得挺好啊。一查,原来用的就是NTFS,只不过每次GNOME自动采用ntfs-3g驱动挂接上来,我都没留意(mount命令显示为 /dev/hda6 on /mnt/e type fuseblk (rw,nosuid,nodev,allow_other,blksize=512) ,注意type显示为fuseblk)。

于是格式化为200G NTFS, 200G ext3, 32G FAT32,依靠GNOME自动挂接。

2. 为了下载iDeneb的ISO镜像 (4.3G),其它分区都没有这么大的空间了,只得删掉一个FAT32分区,改为NTFS。注意修改/etc/fstab时不能照抄上面mount命令的结果写成
       /dev/hda6  /mnt/e  fuseblk  rw,nosuid,nodev,allow_other,blksize=512   0  0
因为这个fuse在用户空间挂接的。在/etc/fstab中应该写成
   /dev/hda6  /mnt/e  ntfs-3g  rw    0  0

P.S. gparted挺不错的,俺现在不用去下载Partition Magic了并重启到Windows了
P.S. vuze(原名azureus)个BT下载软件很不错,下载国外的一些资源相当快,毕竟在sf.net受欢迎程度排名第一啊。我用amule下载iDeneb 1.4,开了一天一夜,才下了1.2G,换用vuze后,几乎一直是占满2M的ADSL带宽,睡前家的任务,早上起来就已经完成了。

3. 这两天注意到Linux下显示的NTFS分区的文件数不对,少了不少文件,我以为是因为休眠Linux期间又进入Windows往该目录下写文件造成了不同步引起的,于是umount后再mount,文件又回来了。以为真是不同步的原因。

但几天后Linux重新开机,问题又来了,但这几天没进Windows啊,于是上网找,说会消失的文件都是文件名包含非ANSI字符的(还真是),原因大概是系统启动时系统locale尚未得知,碰到非ANSI字符的文件名,就扔掉了,但后面mount时,能够根据locale设置自动处理。有两个解决方法
1) NTFS-3G的网站上说,升级到2009.1.1之后的版本就可以了,自带UTF-8支持
2) 在/etc/fstab中,添加"locale=zh_CN.UTF-8"到options部分
   /dev/hda6  /mnt/e  ntfs-3g  rw,locale=zh_CN.UTF-8    0  0

2009年3月30日星期一

逃脱不了做炮灰的宿命──看《我的团长我的团》有感

之前各种媒介关于《我的团长我的团》的信息铺天盖地,临播了还出现几个电视台打架的事情。反正俺最近挺闲,每天回家后也挺无聊,那就跟个电视剧吧。

没想到看了两三集之后觉得很没有意思,就几个溃兵在瞎喷,一点正经没有。于是就在换台的空隙偶尔看看,有一段没一段的。没想到看到二十来集的时候逐渐摸到了这个故事在讲啥,于是越来越有兴趣了。

其实整个40来集得连起来看,单独看几集似乎根本找不到其它电视剧那种感觉,它只讲了一个故事: 一群兵被送往缅甸参加第一次滇缅之战,乱七八糟的指挥使得大部分人都做了炮灰,侥幸活下来的人就再也不甘愿当炮灰,于是他们混日子,他们行尸走肉般活着。他们心底其实都藏着一个梦:那就是再跟日本人打一仗,像个真正的军人那样,打败日本人,但他们不愿面对这个梦,因为周围的一切都注定了他们做炮灰的命运。终于有一天,他们有了一个机会,使得他们虽然也几乎是必死,但也许能够死得其所。

上周三云南台看完了电视,但后来在当当网逛时,发现小说并没有结束在南天门38天,这之后还有不少情节,大约10%的篇幅。在网上看完了后面的部分,发现这部分不是可有可无的,它们使得这个故事更完整,而悲剧性也更强,让人不禁掩卷长叹,唏嘘不已。

在南天门守了38天之后,终于等来了原定只需要等4个小时的后援,难道他们就能成为英雄,就能逃脱做炮灰的宿命?

──南天门刚下来就碰上日军飞机轰炸,在山上就打红了眼的迷龙因担心自己家被炸,枪毙了一个临阵退缩的高炮指挥员,结果被以“恃功自傲,抢械行凶”罪名军法处决。

──在后面的表彰会上,虞啸卿展望了以后西进、北上的大业,但死啦死啦却不愿北上去打共匪,并且嚷嚷说根本不可能打得过──祸乱军心,枪决,不过他找到个机会自杀了。

──孟烦了、阿译、张立宪(不错,小说中他没死在南天门上,并且后来小醉跟了他)都参加了后面的内战,还是炮灰。孟烦了被一个十来岁的解放军俘虏了,劝降了阿译和张立宪的部队。阿译自杀了。

其实对于他们最好的结局,就是那时一起战死在南天门。但命运让他们的团长说,我带你们回家。

后来他们一直没再见过虞啸卿。而电视结尾在纪念碑前献花圈的那个老人,却是信誓旦旦说过“斩我民族头颅的,我砍他们脑袋”,曾经以屈平子岳武穆为精神标杆的虞啸卿。

======================================================
本来说“有感”,是的确在工作上有一些类似的感觉,也怕做了炮灰──唉,算了,不说了。

顺便说点身边的事: 陡然想到其实我们这个产品现在就是一帮炮灰在支撑着。三年前在相关部门的指挥下我们“打了个大仗”,结果因为出击面太大,大部分功能没有发挥作用; 也曾有精英规划了三个子业务给外包做,但做出来的东西现在一点没用上。现在当初做决定的领导们和做规划的精英们都高升或者迁到别处做官去了,而留下来的兄弟们不仅要收拾烂摊子,还被领导骂:你们都做了些什么垃圾?

有时候我也想一走了之,但兄弟们又怎么办?我是团长么,我能带他们圆一个梦么?──恐怕不行,我怎么都觉得自己更像那个心懒得不得了的孟烦了。

2009年3月3日星期二

python脚本取网络小说

说明:
1. lxml是个很不错的库,除了elementtree风格的XML解析之外,还支持html的解析,尤其是支持按照css选择器来查找节点。详细请参看lxml: an underappreciated web scraping library这篇文章以及lxml.html的文档(可惜文档不是太详细,得自己多试验)
2. 1742, 1709, 1705等章节取不出来(数量占19/196),第19行cssselect返回为空,具体原因还没看出来,明天再查吧


====== 8< ===================================
#!/usr/bin/python

# -*- coding: utf-8 -*-
# vim: set fileencoding=utf-8

from __future__ import with_statement

import sys
import os.path
import urllib2
import lxml.html

def parse_article(url, id):
if os.path.exists("%s.txt" % id):
return
r = urllib2.urlopen(url)
p = lxml.html.parse(r)
root = p.getroot()

content = root.cssselect("div.articleContent")
content = content[0].text_content().encode('utf-8')

print >>sys.stderr, id,

with file("%s.txt" % id, 'w') as f:
f.write(content.replace("\n\n", "\n"))
f.write("========================")
f.close()

booktitle="明朝那些事儿-历史应该可以写得好看"

def main():
for i in range(1,5):
#仅第七部的链接
r = urllib2.urlopen("http://blog.sina.com.cn/s/articlelist_1233526741_4_%i.html" % i)
p = lxml.html.parse(r)
root = p.getroot()

links = root.cssselect("div.articleTitle")

for link in links:
a = link.find('a')
title = a.text.encode('utf-8') #(长篇)明朝那些事儿-历史应该可以写得好看[1752]
url = a.get('href')
if title.find(booktitle)>=0:
id = title[-5:-1] # 1752
try:
parse_article(url, id)
except:
print >>sys.stderr, "%s (Error occurred %s)" % (id, url)

if __name__=='__main__':
main()


2009年3月2日星期一

vimperator小技巧两则

Firefox扩展vimperator确实让我很多操作都不用通过鼠标来驱动了,而是改用接近与vim的方式。

但一直有个不太方便的地方: 为了屏幕实用空间,guioptions选项保持为空比较好,但常常要通过菜单访问一些设置等,这时通过set guioptions=mT打开了菜单和工具条,用完了又想隐藏掉,很麻烦。后来发现有如下两个小技巧可以绕开这个问题:
  • emenu命令执行菜单项对应的动作,比如:emenu 文件.打印… 不过奇怪的是这个省略号跟中文全角省略号一样,并不是三个点(英文版上也是这样,:help emenu给出的例子也是这样)
  • 在.vimperatorrc中设置guioptions=mT,Firefox启动后手工设置为空。然后在Firefox中用一个标签页打开chrome://browser/content/ 这个特殊的URL,这样可以在这个特殊的标签页中选择菜单项进行一些设置(这个方法在vimperator 2.0beta中不好使:-( )


2009年2月16日星期一

Weekly Twitter 2009 #7

  • 度假归来,发现lenny已经发布了
  • 怎么大家都很关注1234567890这个时间点,也就是数字特殊点而已啊
  • 刚看到钱列宪遇刺的消息,好在捡回一条命
  • 昨天跟另一老员工组队参加大部门编程比赛,还得了个第三名,嘿,俺两年没写过正经代码了, 不易啊
  • 回退到Firefox 3.0后,Brief的搜索框没有问题了。用3.1无法输入字符。
  • 卸载了 Enthought 的python, 改装官方的版本,没有了那么多杂七杂八的库,启动一些python 应用似乎快了很多
  • 这msi安装程序咋这么繁呢,卸载比安装还慢,十多分钟了还在validating install, 没开始卸载操作
  • tuxcmd进入debian了

2009年2月10日星期二

RSS阅读工具的选择

如俺在twitter中说的,俺上班只能访问python.org, debian.org, sf.net, javaeye.com, ibm.com等少数网站,访问不了其他网站(要单独申请proxy。俺为了防沉迷没申请:-),也就没法使用Google Reader。但俺又觉得到各个网站去看新闻又比较累,而且导航麻烦,于是有了一个RSS阅读工具的需求。

javaeye上的这篇RSS阅读器选择心得给了我不少信息,里面列出的软件我都试用了一下,但我的使用场景和他的不太一样,所以结果也不一样。

我的需求比较简单: 1)能正确读取RSS; 2)历史数据能存档,对于感觉值得收藏的东西可以方便地标记一下; 3)因为我会一直开着这个程序,所以期望内存占用不能过大; 4)当帖子多了之后,性能还能跟得上。

这1)就把似乎还挺有名的feedreader给排除掉了,虽然这其它方面都做得很好,可就是不少RSS解析不正常,帖子内容有50%以上都是parser error,中文还乱码。

因为3),俺把RSSOwl
和Omea Reader也淘汰了,上面javaeye文章作者选定的就是Omea Reader

然后发 现Thunderbird也有作为RSS阅读器的功能,新建一个"News & Blogs"(RSS新闻和网志)账户即可。有一点需要注意的是,它默认是链接到原文地址去看的,需要在账户设置中钩上"默认情况下显示文章概述而不载入 全部网页",并且这个选项只对以后收取的内容有效(当然,如果你喜欢这个默认模式就不用费这劲了)。

Thunderbird的问题在于,一些RSS解析不出来,比如IBM developerWorks的RSS就压根读不来,而Python Planet的RSS则有一半文章得不到内容,显示为(no subject), 我提了个bugzilla报告,但一点反馈没收到。


本来Firefox扩展我是优先选用的,一方面是好管理,另一方面要查看原文也不用切换程序了。

sage是很久以前就用过的(后来版本没跟上Firefox 2,现在有了sage-too),但一直不太喜欢将全部文章渲染到一个网页去看这种模式,其实这跟直接到网站去看差别不大。主要的问题是不满足需求2)。

newsfox也让我不太满意的主要原因是4): 用了些天帖子一多了之后,性能就不行了,看了一下它的存储目录,居然全用的是XML,怪不得,干吗不用sqlite? 另外搜索功能让我不习惯,还非得针对一个搜索词另外建立一个feed才行;

最后选定的是新晋扩展Brief,虽然易用性还有点不太满意,但基本功能上没有大的问题。



2009年2月8日星期日

Weekly Twitter 2009 #6

  • python in a nutshell 看了一些章节,咋觉得讲语言部分还不错,库就讲得不咋样了,常常只是罗列函数说明
  • (s)mplayer的画面效果似乎比totem(-xine)好得多,但我总觉得进度条有很大问题,尤其是播放有多个章节的DVD的时候...
  • 发现DownThemAll升级后有个bug,得先打开dta主界面,否则直接添加下载任务,就会卡在”加载中...",死翘翘了...
  • 我觉得最强大的笔记软件是TiddlyWiki,不过不适合普通用户,适合geeker和hacker
  • Lenny 要发布了,I am anxious to see ... a bunch of new versions of packages in unstable, so that my system will be more funny than it is....

2009年2月1日星期日

Weekly Twitter 2009 #5

  • @easthero 俺们上班只能访问python.org, debian.org, javaeye.com, ibm.com等少数网站,访问不了google, 要单独申请。俺为了防沉迷没申请:-)...
  • thunderbird读取planet python的rss咋很多文章解析不出来,只能整出个(no subject )呢?
  • 在弘法寺山门口簇拥着人群往里挪,我从来没想到会有这么多人来烧香,也许过去这一年不顺的事太多了

2009年1月19日星期一

Weekly Twitters 2009 #4

  • GF家的三洋电视买来没多久遥控器就相当不好使了,念叨了多次之后今天顺道买了个万能遥控,非常好使
  • 没办法,要看这两张Supernatural压缩DVD还得到Windows下用暴风,但系统慢啊——杀毒软件和防木马软件还不敢关,除非不联网 :-(...
  • feedreader有三点让人很不爽: 文章概要60%解析不出来,中文乱码,没法让我用firefox打开链接
  • feedreader让我很不爽,在javaeye搜了一下,才发现我一直用来收邮件的thunderbird也可作为rss阅读器,试用一段!
  • 得抓紧看python in a nutshell, 否则跟python经典一样,书的内容都过时了,我还没掌握,书白买了

2009年1月12日星期一

Weekly Twitter 2009 #3

  • 让opera的中文字体好看些: 修改/usr/share/opera/ini/font.ini,将35行改为 family:WenQuanYi Bitmap Song=chinese-s try-first
  • 最近发现Programmers' Notepad基本上能满足我的简单编程场景需求,可惜只能windows下用
  • To install PyPN, simply unzip the files into the PN directory and then run “pn --findexts” which will install the extension.

2009年1月5日星期一

iRotate: 横屏/竖屏切换

iRotate这个工具不错,可以进行横屏/竖屏切换(安装后按Ctrl-Alt-Up/Down/Left/Right)就可以了,支持很多种显卡。

用来看Heroes的漫画正合适。

Linux下有没有这样的软件?得去找找。

Jan 5, 22:53补充: Linux下更简单,啥也不用装,用xrandr -o right就可以了(用xrandr -o normal切换回来)

2009年1月4日星期日

Weekly Twitters 2009 #1

  • Supernatual看的人很少么? 电驴上这么多天没下载下来(S4EP1~S4EP4)。Desperate Housewives和Heroes就很快

  • 刚发现Firefox有个智能的功能: 连续激活两个tab并马上点击x之后,所有的tab都会出现x了
  • 继lotus notes之后,我决定thunderbird里的邮件也用tag的方式来管里,不用文件夹的方式存放了,虽然tb里跨目录搜邮件要比notes方便很多...
  • 新年第一天,去园博园逛了一圈。本来打算去东湖公园看菊花展的,那附近交通实在太差了,在路上憋了一个小时决定换地方...