合并 Debian 补丁的 OpenBSD netcat Linux 源码

前几天在我的 CentOS 4.3 古董服务器上想使用 ProxyCommand 给 ssh 配置 socks 代理,ssh -o "ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p" 选项在我的 OSX/Ubuntu 上挺好用的,但是在 CentOS 4.3 却发现 " invalid option -- x",没有这个参数。

本来我以为是 netcat 没有更新到最新,特地去下载了 GNU netcat 最新的源码包,结果源码编译后还是没有 “-x” 这个参数。后来仔细看 man page,看起来根本就不是一个版本。调研了下,才发现 netcat 居然有好多的版本:

你们城里人可真会玩儿啊!

因为 OSX/Ubuntu 都是用的 OpenBSD netcat(移植或修改版),所以 -x/X 参数是存在的,能够实现代理功能;但是 CentOS 4 因为版本太老,用的还是 GNU netcat。本来找个移植后的源码包,直接编译安装就好了呗。但可是,我 Google 了半天 (打脸,谁让你还用 CentOS 4),还是没找到能直接编译的 OpenBSD netcat Linux 源码包,最后还是在 Arch 的某个网站上找到使用 Debian 源码进行 Patch 然后再编译的脚本,才搞明白怎么能在 Linux 编出来 OpenBSD netcat 。

可能是出于易维护的考虑吧,Debian 把源码分成了两个包,一个是原始的 OpenBSD netcat,一个是 Debian 的 N 个 Patch 源码。编译时要先把 Patch 打到 OpenBSD 源码上,然后再编译。可这样的过程不是维护者很难理解,为什么不多发布个打完 Patch 的源码呢?而且这种补丁包形式也没个官方网站介绍下,真的好难懂。

为了避免其它古董 Linux 发行版用户再有我这样的苦恼,我把 patch 后的代码上传到了 Github: https://github.com/solrex/netcat ,有需要的朋友可以自取。

修改exvim目录过滤逻辑为匹配拒绝

exVim 是一个非常优秀的 Vim 环境,通过它能够省去很多 Vim 插件的配置工作。自从使用上 exVim 后,我基本没有再自定义 Vim 插件,完全依赖 exVim 打包的辅助功能。

最近让我略有不爽的使用问题是:exVim 默认的 file filter 和 dir filter 都是匹配通过的,即“匹配 filter 过滤条件的目录和文件被通过,列入项目目录、文件列表中”。

exVim 的 dir filter

对于文件来说,设置匹配通过毫无问题。因为我也想要项目中仅包含 “.cpp,.c,.h,.py” 这样的源代码文件,选出来匹配这些模式的文件就是我希望的结果。

但是对于目录来说,设置匹配通过就与我通常的需求相悖了。一般情况下,项目目录下的所有目录都是程序需要的。但是一些专门存放测试程序、测试框架、输出文件的目录,我其实不希望显示在我的项目中。而且 exVim 中的目录过滤貌似仅限在项目顶层目录中,过滤的意义不大。

所以我修改了一下 exVim 的代码,将默认的 dir filter 含义修改为匹配拒绝,即:“匹配 dir filter 的目录被拒绝(被过滤掉),无论它在哪一级。"例如,我将 dir filter 设置为 “test,output”,那么我项目目录下所有叫做 test 或者 output 的子目录都不会显示到项目目录列表中,而不妨碍其它名称目录的通过。

可以想见两个 filter 采用不同的通过逻辑并不是 exVim 开发者希望看到的,所以我想这个修改也没必要提交给开发者。不过我仍然觉得这是很有用的一个修改,所以拿出来分享一下。修改的补丁文件见:http://share.solrex.org/ibuild/exvim-dir_filter-8.05_b2.patch

PS: patch 文件中还有一个改动是将 quick_gen_project_PROJECT_autogen.sh 文件从项目目录下,移动到项目目录下的 .vimfiles.PROJECT/ 目录中,原因是看起来碍眼 :)

代码行统计工具-CLOC

在工作中有时会有需要统计代码的行数,一般会用 wc 给出一个大致的结果。只不过在源代码文件分布比较分散,且存在多种不同类型语言的源代码时,wc 就不是特别适合了。

在公司内部也见过一些同事实现类似功能的脚本,但我想这应该是一个通用的需求,于是就找到了这个工具 - CLOC。其实就是一个 perl 脚本,很好用,统计报告也很清晰。在这里推荐一下。下面是一个统计 leveldb 源代码行数的例子。

$ cloc .
     128 text files.
     123 unique files.                                          
     353 files ignored.

http://cloc.sourceforge.net v 1.55  T=0.5 s (238.0 files/s, 46718.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C++                             60           2012           1258          13124
C/C++ Header                    52            968           1458           2690
HTML                             3             84              0           1094
C                                1             33              7            255
make                             1             43             17            153
CSS                              1             10              1             78
Bourne Shell                     1              9             19             46
-------------------------------------------------------------------------------
SUM:                           119           3159           2760          17440
-------------------------------------------------------------------------------

Poderosa 项目复活了

Poderosa截图,图片来自官网
Poderosa 截图

四年之前我就开始关注 Poderosa 这个项目,因为我认为它是我能找到的最好的 Cygwin 终端客户端——没有之一。当然,如果你把它当做 ssh 客户端去跟其它软件比,你就输了。

由于它在 2006 年 11 月以后再也没有更新过新版本,两年前,我曾经因为它有了一个“同人” 2009 特别版 而激动不已。

前两天,我偶尔去逛论坛,居然发现这个项目复活了!作者在开放讨论区里面声明发布了 4.3.0b,真是太让人兴奋了!

令人奇怪的是,xjzhang1979 君虽然提供了 N 个 Poderosa 特别版升级版本,但从来没有释出过源代码,看起来也没有打算这样做。作者 kzmi这里也提到:

5.7.x has more new features, but their source code has not been disclosed.

4.3.x are developed on the Poderosa project and you can get their source code.
Some features from 5.7.x were added to 4.3.x.
...
I believe that the terminal emulation of 4.3.x would be better than 5.7.x's.

由于 5.7.x 不开放的源代码,相比 4.3.x 而言用户肯定对其安全性有一定怀疑。现在有了更好选择,恐怕特别版的拥护者会越来越少了。这真的让人很遗憾!

这货还是Kindle吗?

自从大家了解到 Kindle 的系统是 Linux 后,无数仁人志士前赴后继地尝试以各种方式 hack 这个系统,对于我等用户来说真是一大幸事!

好久没有跟进电纸书论坛,居然不知道神器 FBReader Kindle 版 —— fbKindle 的发布。mobileread 网站的原帖中,已经给出了安装和配置修改方法。不过我是遵从这篇帖子中的步骤,无它,摘要读起来更快。

没用过的朋友可能不太了解 FBReader,它是一个开源的跨平台电子书阅读器,支持很多种格式,包括我们常用的 GBK 编码 txt 文档以及 epub 格式。由于 epub 格式电子资源很多,以前我还纠结于为了这些资源要不要装多看系统。现在有了原生的 fbKindle,从 epub 支持这点来看,多看是没有什么必要装了。

此外,还有国人开发的Kindle 原生系统拼音输入法,可以支持在书中或者浏览器中输入中文。虽然我没有安装成功,但我对作者的努力是相当的佩服!

Kindle 原生系统拼音输入法
图片截取于输入法作者相册

在最近的使用中,我也发现了一个 Kindle3 离线读网上文章的小技巧。用 pdfcreator 将网页打印成 A6 幅面的 pdf 文件,并且在页面设置中设置四周页边距为 0(Chrome不支持,Firefox/IE可以),上下不打印网址、页数等信息。这样的 pdf 文件在 Kindle3 上会有比较好的展示效果(字体很小时顶多需要横屏),并且也有比较好的打印效果。由于 pdfcreator 还可以设置自动保存位置和自动文件命名规则,用起来还是挺方便的。

当然,如果你是可注册 K3-wifi 版用户,SendToKindle 浏览器插件可能更有用。

在越来越多有趣的事情发生在 Kindle 上之后,真期待这个生态圈将会变成什么样子。

更新 JabRef 2.7 中文版

JabRef 的中文版是我翻译的。但是好久没有关注邮件列表,偶然瞄到才发现又有新增的部分需要翻译。于是今天就花了些时间更新了一下中文翻译,将会集成到 JabRef 的 2.7 版本中。“抢先版”请看这里 ^_^

另外,在我 Windows 平台下的 JabRef 2.6 以后版本中,列表页中文文献名都显示为方框,由于下方细节中有正确显示,我也就没管它。但是 Linux 下却显示正常,这点让我比较好奇。今天才发现 Windows 平台下需要设置列表页字体为中文字体才能正确显示。这样看原来的显示正常到方框,大概与 Java 不同版本的默认字体设置有关系。

再另外,sourceforge 的 svn checkout 速度可是真慢啊!不知道是不是帝国的网络条件导致的。

Shell Tips: GNU Screen 的一些小技巧

由于工作环境的问题,最近越来越感觉到 screen 命令的可贵,下面总结一点使用 screen 命令的小技巧。

最常用的参数组合:

screen -ls // 列出已有的 screen
screen -D -R // 进入指定的 screen 名,如果没有,则以该名称创建 screen

由于很常用,我把这两个命令取了个 alias:

alias sl='screen -ls'
alias sr='screen -D -R'

除了命令之外,还有快捷键 Ctrl+ac 创建 screen;Ctrl+aa 在两个 screen 之间相互切换;Ctrl+ad 从 screen 中 detach;Ctrl+a数字,跳转到数字指代的 screen。

在 screen 最下方显示状态栏,状态栏包括已经打开的 screen 标签列表,当前的 screen 和时间。其中在 screen 标签处显示该 screen 所处的目录名。显示 screen 所处的目录名这一点实现起来要困难一些,首先得修改 .bashrc,加入 screen term 对应的信息

case $TERM in
    screen*)
        # This is the escape sequence ESC k \w ESC
        # Use current dir as the title
        SCREENTITLE='\[\ek\W\e\\\]'
        PS1="${SCREENTITLE}${PS1}"
        ;;
    *)
        ;;
esac

然后 . 或者 source 一下,再修改 screen 的配置文件,添加状态栏,在 .screenrc 中添加:

caption always '%{=b cw}%-w%{=rb db}%>%n %t%{-}%+w%{-b}%< %{= kG}%-=%D %c%{-}'
shelltitle '$ |bash'

最终效果为:

GNU Screen 多标签状态栏

Windows Tips: 修改热键和文件访问权限

我平时习惯使用 Win+E 打开 Windows 的资源管理器,但对资源管理器的左侧栏一直不感冒。用热键打开我的电脑本身就是为了键盘操作方便,但是多了个左侧栏使方向键选择文件夹相当不方便。昨天我总算找到了覆盖 Win+E 热键的方法。

AutoHotKey 是一个编辑和管理 Windows 热键的开源软件,SciTEAutoHotkey 是编辑 AutoHotKey 脚本的开源软件。(也许某些人会惊讶,AutoHotKey 居然不自带脚本编辑器,还要别人帮它写,我想这也许是受到 Unix 哲学的影响:Do one thing and do it well.)

AutoHotKey 脚本的基本语法是很简单的,前面是热键,后面是执行的命令,启动脚本后热键就会起作用了。键盘上每个特殊键对应的符号在热键列表中有列出,像我前面替换热键 Win+E 为打开“我的电脑”且无左侧栏的语句是:

#e::Run ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}

::{20D04FE0-3AEA-1069-A2D8-08002B30309D} 是“我的电脑”的 CLSID(多谢 IronFeet 的提示),如果需要打开非特种文件夹,就不需要这么麻烦了,直接类似于 #e::Run C:WINDOWS 即可。同理,设置用 Win+C 打开控制面板可以写成:

#c::Run ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}::{21EC2020-3AEA-1069-A2DD-08002B30309D}

利用 AutoHotKey 可以做很强大的事情。比如我在 Linux 下使用 Evince 查看 pdf,可以使用 vim 的习惯,jkhl 上下左右移动 pdf 文档,那么我们可以在 Windows 下用 AutoHotKey 来实现对 Adobe Reader 同样的操控,语句如下:

#IfWinActive ahk_class AcrobatSDIWindow
j::Send {Down}
k::Send {Up}
h::Send {Left}
l::Send {Right}
#IfWinActive

这几句话的意思是,如果 AcrobatSDIWindow 这个 ahk_class 窗口在激活状态下的话,那么 jkhl 就被换成键盘上的上下左右键。AutoHotKey 的高级使用还是很麻烦的,它网站上的 Tutorial 是一个不错的入门教程。其实一般我都是用 Launchy 启动程序,对 AutoHotKey 的需求不是那么多,简单的几个组合键就够了。

我昨天才发现 Windows XP 家庭版和专业版的一个大区别:家庭版没有“组策略”编辑器。我电脑的“所有程序”->"启动"目录不知道被什么安全软件设置成只读了,我以为 ATTRIB 命令是修改文件权限的,却发现无法修改“启动”文件夹的权限。后来找到 CACLS 命令,可以用来指定特定用户对文件的访问权限,才把"启动"文件夹访问权限修改成了完全控制:

cacls 启动 /G Solrex:F

设置可写以后就可以把 AutoHotKey 脚本的快捷方式拖到“启动”文件夹,随系统一起启动了。

那些搅屎棍儿们

最近在社区或者列表里闲逛,总发现有一些有意思的人,他们根本不懂自己在讨论什么东西,却像行家一样置评,还纠缠不休,像搅屎棍似的,搞得让人抓狂。特摘录几个,以飨大家:

1. 我的朋友王聪的博客

... 谁知道这人怎么回复?第一条回复是问我是不是在说判断endian的技巧?扯淡!你自己的留言什么意思你自己不知道?!第二条回复中他似乎意识到自己前一个回复很白痴,于是补了一句Linux内核中没有。放屁!它有才怪呢!它凭什么要有?!貌似他们家的C语言技巧都是出自Linux内核!一个人能傻到这种地步真的挺不容易的!

别慌。他还能继续向我们证明他更傻呢!这个人在链接中给出了这么个地址,稍微有常识的人都看的出来,那是一个patch,那个patch的作者是Changli Gao,我review了这补丁,认为可以接受,然后Linus回复了,回复的意思也很简单,他不喜欢那个patch,他解释说如果用户程序能触发这个问题就说明你那程序是一坨shit。稍微有常识的人都明白这话什么意思:Linus只不过是借虚构的“你那程序”来说明这个问题不应该在内核中修复。而精彩的事情这时发生了!lovecreatesbeauty@gmail.c0m同学成功地把这话联想到了Linus所说的“你那程序”就是我写的程序!太伟大了!真不知道这人上小学时语文怎么学的?!估计他的语文老师看了都会气得跳楼自杀了!唉,语文没学好也就罢了,你找找整个邮件的存档,看看里面到底有没有shit程序啊。问题是他连找到没找就脑残式地下结论了。没找就没找吧,你仔细看看patch不行么?很不幸,他连patch是谁发的到看不出来!所以这个人不光脑残,眼也有问题,那么大大的一行Signed-off-by他看不到!!...more

2. Ubuntu 的 BUG tracker: Kubuntu 9.04 alpha6 panel corruption

#46 dotancohen wrote on 2009-06-14:

Are you trying to piss him off by any way that you can? You are not a developer, and you go around confirming and invalidating components, and playing ping pong confirmed/invalid with a dev. Then you make a remark like that?!? I personally am angry at you right now. I need this bug fixed, and you are going to piss off the developer so that he leaves us _both_ here to rot.

Go away. File a different bug, you have every right to as the dev implies that your issue is not the same as the OP (yes, that's me). Piss the devs off there. But let them do their work here and help those of us who appreciate it. ...more

简单地来说,就是开发者把该 BUG 标记为 Invalid,说该 BUG 应该是属于 Driver 的 BUG,有个用户不满意开发者对 BUG 的处理,就跟开发者对着干,开发者标记为 Invalid,他重新标记成 Confirmed,开发者开启一个新 BUG 报告,他去给人家改成 Invalid。一般来说修改 BUG 的状态应该是开发者来做,用户可以提交 BUG,assign 给某个开发者,但是不应该修改 BUG 状态,这是一种非常不礼貌的行为。一个用户一般情况下不可能比开发者对目标系统了解更多。

3. WordPress 2.8.x(x<4) 的一个密码重设漏洞

From: laurent gaffie < laurent.gaffie_at_gmail.com >
Date: Tue, 11 Aug 2009 01:11:07 -0400

Mr Fabio,

You dont even understand the bug, so please shut the hell up.

2009/8/11 Fabio N Sarmento [ Gmail ] < fabior2_at_gmail.com >

> if this is an bug, please close Twitter.com, MSN.com and other services,
> because they have the same stupid "Reset password" service.
>
> So please make my day, and create a stupid script to flood with mutiple
> request to reset password. ...more

翻译过来就是,某个人发现了一个 WordPress 2.8.x(x<4) 的密码重设漏洞,报告了出来。有个人评论说:“如果密码重设是 BUG 的话,那么所有网站都有 BUG 了,你没事干就写点儿傻逼程序去到处重设别人的密码吧。”然后报告漏洞的人就无奈了:“你根本没有理解这个 BUG,那么就请闭上你的臭嘴吧。”过了两天,Wordpress 就紧急发布了新版本 2.8.4,fix 了这个 BUG。

于是,我现在非常理解为什么 Linus 大神说话经常那么难听了,要是我成天跟这种人打交道,我也会抓狂。

有些人根本不了解和别人交流、在社区中交流应该遵循什么样的礼仪,应该使用什么样的方法。我遇到过的不礼貌行为包括(但不限于):不去搜索 BUG 列表和邮件列表,一遍又一遍地提出重复的问题;有 BUG 列表和邮件列表时,还直接与开发者联系,或者只 reply 开发者,不知道 reply all 到邮件列表;提交 patch 时,不知道如何使用 diff 和 patch 工具,而是直接提交整个文件;描述 BUG 时,不提供 BUG 出现的环境和步骤,就来一句“xx出问题了”。尽管有时候我都懒的搭理这些人,但是我不想被别人认为是一个没礼貌的人,所以我都尽量回复,但的确心中很不爽。

我希望那些想要在社区中和别人讨论、交流并想赢得别人尊重的朋友能够多了解点儿社区交往的礼仪,起码应该去了解点儿入门的知识,免得遭受挫折打击积极性,反倒以为别人非常不友好不礼貌。推荐的基本资料包括:

1. 如果您想在邮件列表或者社区中提问,那么请首先阅读 “How To Ask Questions The Smart Way ”,中文翻译《提问的智慧

2. 如果您想提交软件 bug, patch, feature request 并想得到开发者的尊重和重视,那么请首先阅读“The Art of Unix Programming” 第 19 章的“Best Practices for Working with Open-Source Developers”。

JPerf Single Jar with UDP BW Unit Fixed

JPerf is the GUI frond-end of IPerf, a TCP and UDP bandwidth performance measurement tool which allows the tuning of various parameters and UDP characteristics.

The official JPerf release (2.0.2 version) has some flaws. First, it mistakenly uses bytes/sec as the unit of UDP bandwidth, which should be bits/sec according to IPerf man-page:

-b, --bandwidth #[KM]
       for  UDP,  bandwidth  to  send  at  in  bits/sec (default 1 Mbit/sec,
       implies -u)

Second, starting it from command line is error prone. The command to start it (jperf.sh) is:

java -classpath jperf.jar:lib/forms-1.1.0.jar:lib/jcommon-1.0.10.jar:lib/jfreechart-1.0.6.jar:lib/swingx-0.9.6.jar net.nlanr.jperf.JPerf

We can see that all jar paths in classpath are relative paths. So if we create a symbol link to the jperf.sh script, e.g. /usr/bin/jperf -> /opt/jperf-2.0.2/jperf.sh. Then calling /usr/bin/jperf will result in some errors like:

Exception in thread "main" java.lang.NoClassDefFoundError: net/nlanr/jperf/JPerf
Caused by: java.lang.ClassNotFoundException: net.nlanr.jperf.JPerf
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: net.nlanr.jperf.JPerf. Program will exit.

This error can be fixed by resolving the real path of the symbol link, as I reported.

However, a better way to solve this problem is to pack all libs JPerf needed(i.e. forms*.jar, jcommon*.jar, jfreechart*.jar, swingx*.jar) to a single jar, and add a proper "Manifest". Then we will be able to start JPerf with a much simpler command:

java -jar jperf.jar

And finally, I gave a try to solve the above 2 flaws and put my work (deb/jar/src packets) on my site. You can find them here .

解决 GAppProxy Set-Cookie 和 HTTPS Cert Bugs

我自己写了一个类似 GAppProxy 的工具,支持 Python 和 PHP,有兴趣可以看这里

研究 GAppProxy 有两个原因:一、最近 Twitter 不能用,而我常用的 GAppProxy 却不支持我登录 Twitter;二、我最近在琢磨 SSL 证书的问题,正好用 GAppProxy 登录 Twitter 也有证书错误。

第一个 BUG:Set-Cookie Bug

GAPPProxy 目前对 Cookie 的处理有一些问题,主要出在对 header 中的多个 Set-Cookie 域处理错误,就会导致用户登录一些网站错误,无法获得正确的会话 Cookie。

举例,当服务器返回的 header 中有多个 Set-Cookie 域时,比如一般的 wordpress 返回的 header 中,Set-Cookie 域至少有三个:

Set-Cookie:
wordpress_776c41a2fee8d137928f3750eb1f0736=admin%7C1247298611%7C8b89cfc80161853957182ddfc481cd72;
path=/wp-content/plugins; httponly
Set-Cookie:
wordpress_776c41a2fee8d137928f3750eb1f0736=admin%7C1247298611%7C8b89cfc80161853957182ddfc481cd72;
path=/wp-admin; httponly
Set-Cookie:
wordpress_logged_in_776c41a2fee8d137928f3750eb1f0736=admin%7C1247298611%7C545dcea44d5e69aec5c1203c64bee061;
path=/; httponly

GAPPProxy 会把它作为一个串传给本地浏览器:

Set-Cookie:
wordpress_776c41a2fee8d137928f3750eb1f0736=admin%7C1247298611%7C8b89cfc80161853957182ddfc481cd72;
path=/wp-content/plugins; httponly,
wordpress_776c41a2fee8d137928f3750eb1f0736=admin%7C1247298611%7C8b89cfc80161853957182ddfc481cd72;
path=/wp-admin; httponly,
wordpress_logged_in_776c41a2fee8d137928f3750eb1f0736=admin%7C1247298611%7C545dcea44d5e69aec5c1203c64bee061;
path=/; httponly

这样本地浏览器对 Cookie 的设置就会错误。解决办法很简单,将这个长串用split(', ')切开,同样设置三个 Set-Cookie 域即可。

Update 20090710/Solrex:
有人评论说 ', ' 也是可能在 Cookie 中出现的合法字符串;那么我就另外想了一个办法,先用正则表达式替换将 ', ***=' 替换成 'n***=',再用 'n' 对字符串进行切割。由于在 Cookie 中正常出现的 ', ' 后面会首先跟着 ';' 或 ',',然后才可能出现 =,因此用 ‘, ([^,;]+=)’ 匹配就可以了。而且这次把修改放到服务器端了,原来的客户端就不需要修改了

Patch:

Index: fetchserver/fetch.py
===================================================================
--- fetchserver/fetch.py    (revision 92)
+++ fetchserver/fetch.py    (working copy)
@@ -29,6 +29,7 @@
from google.appengine.ext import webapp
from google.appengine.api import urlfetch
from google.appengine.api import urlfetch_errors
+import re
# from accesslog import logAccess

@@ -153,14 +154,12 @@
             if header.strip().lower() in self.HtohHdrs:
                 # don't forward
                 continue
-            ## there may have some problems on multi-cookie process in urlfetch.
-            #if header.lower() == 'set-cookie':
-            #    logging.info('O %s: %s' % (header, resp.headers[header]))
-            #    scs = resp.headers[header].split(',')
-            #    for sc in scs:
-            #        logging.info('N %s: %s' % (header, sc.strip()))
-            #        self.response.out.write('%s: %srn' % (header, sc.strip()))
-            #    continue
+            # NOTE 20090710/Solrex: Fix multi-cookie process problem
+            if header.lower() == 'set-cookie':
+                scs = re.sub(r', ([^,;]+=)', r'n1', resp.headers[header]).split('n')
+                for sc in scs:
+                    self.response.out.write('%s: %srn' % (header, sc.strip()))
+                continue
             # other
             self.response.out.write('%s: %srn' % (header, resp.headers[header]))
             # check Content-Type

第二个 BUG:HTTPS Cert Bug

简单地来说,GAppProxy HTTPS 连接的实现是一个欺骗本地浏览器的过程,类似于中间人攻击。它首先用 GAE 获得页面的明文,抓到本地,然后假冒 HTTPS 站点与本地浏览器通信。因此它就需要提供一个 SSL 证书,来完成 HTTPS 连接的建立。

但这就有一个问题,SSL 证书哪儿来的?目前 GAppProxy 对所有的站点都使用一个证书,而且这个证书是未经任何授权 CA 认证的证书,因此就会产生很多错误。首先,该证书中的授权机构不是可信 CA,Firefox 和 IE 中捆绑的证书中没有该 CA 的证书;其次,该证书的 CN (Common Name)与站点域名不同,不可用于站点的通信。因此可能每次都需要用户自己点击添加证书例外。

为了避免这种缺陷,我想出来的做法是——自己做 CA,正所谓做事情要专业,要骗就骗彻底点,骗得浏览器神不知鬼不觉。首先,建立 CA 的密钥,自己给自己签发一个证书作为 CA 的根证书,将该 CA 的证书安装到 Firefox 浏览器中,在运行时使用该 CA 为每个 HTTPS 连接的站点签发对应于该站点的证书。由于 Firefox 中已经安装了该 CA 的证书,那么所有该 CA 签发的证书都能够通过 Firefox 的检测了。

这个方法比较麻烦,而且需要电脑上有 openssl,对于 Linux 完全没有问题,对于 Windows 可能就有点儿困难了。所以我这里就给出个思路,具体实现就不谈了。
您可以在 http://share.solrex.org/ibuild/ 找到我修改后的代码,感兴趣的话可以下载下来看看。

ACM 图灵奖演讲论文集

今天尝试了一下 JabRef 论文数据库的 HTML 导出,将我搜集的 ACM Turing Award Lectures 的 BibTeX 信息输出到了这个页面

由于版权问题,无法给出 PDF 文件下载,但是每篇论文后面都给出了 DOI 链接,有 ACM 数据库访问权限的用户可以自己去下载。如果您是我的朋友且对此感兴趣且无法访问 ACM Portal,可以在 IM 上联系我索取 PDF 包(为个人学习、研究或者欣赏使用),Email 是不行的,因为太大了。

事实上,这个页面的大部分文章是收入《ACM Turing Award Lectures -- The First Twenty Years : 1966 to 1985》中的,中国的苏运霖教授翻译后出版了《ACM图灵奖演讲集:前20年》。

再为 JabRef 做个广告。我不知道其它的论文管理工具能否做这样的事情,不过 JabRef 输出的 HTML 页面真的很不错。我以后要是成为学术男,就用它来发布我发表的论文列表 :)

跨平台音乐播放软件 Songbird

Songbird 是一款开源音乐播放软件,目前可以支持在 Windows, Linux 和 Mac 操作系统上运行。从我的角度来看,它有几大特性:(1)支持 iPod——对我来说没诱惑,我又没有 iPod;(2)类 iTunes 界面,这一点我还是很欣赏的,管理音乐比较方便;(3)内嵌浏览器,用某篇文章的话说就是:“如果iTunes和Firefox来一场甜蜜的网络性爱,他们产下的卵就是Songbird。”虽然形同鸡肋,不过也蛮有趣的;(4)支持类似于 Firefox 的插件功能,这将会是 Songbird 的杀手锏;(5)支持大部分中文歌曲 ID3 标签——这一点使我不得不喜欢它,下面我还会说到;(6)可用插件支持歌词显示。

总的来说,Songbird 吸引我的主要原因是后两条,因为我很难在 Linux 下找到实现这两条的播放软件,但是这后两条特性又貌似不那么完全。本地化、本地化,Linux 的本地化一直是一个问题,再加上像我这样的“事儿妈”喜欢在 en_US.UTF-8 的 LOCALE 下追求中文使用的无障碍,使得问题更糟糕。Linux 下的经典播放软件 xmms, RhythmBox, Amarok,无一例外都被中文 ID3 标签显示问题打败(或者说我不知道如何配置?)。

Songbird 让我看到了一丝希望。我目前歌曲库中所有歌曲都是从 Google Music 下载的,乍一装上 Songbird 运行后,我发现它居然能识别出大部分歌曲的 ID3 信息(Windows 和 Linux 平台下效果是一样的),不过仍然有乱码存在。我想可能是 ID3 标签自身问题,于是到 Windows 下用千千静听编辑了一下这些显示为乱码的歌曲信息。经过多次尝试,发现用千千静听将 ID3 信息先写入为 ID3v1,然后再重新以 UTF-16 格式写入为 ID3v1 & ID3v2 貌似可以解决 Songbird 的乱码问题,至少我的歌曲库已经没有乱码了。

这个乱码解决方案的重要之处在于:Windows Explorer 支持该方案,也意味着大部分 MP3 音乐播放器(随身听)支持该方案。不像通常为使 Linux 下的播放软件(比如 Amarok)支持 ID3 标签,要强行将 mp3 文件的 ID3 标签转换为 UTF-8 编码,这样会造成大部分 mp3 随身听和 Windows Explorer 无法显示歌曲信息。(插一句:在我使用过的 mp3 里,只有魅族 Miniplayer(M6) 支持 UTF-8 格式的 ID3 标签和 UTF-8 格式的 txt 文档,这也是我对魅族这间公司有很大好感的原因之一。)

Songbird 的歌词插件也很奇怪,貌似它只支持内嵌于 ID3 标签中的歌词,而且没有时间轴,还好 Google Music 的歌曲大部分内嵌有歌词。不知道存不存在可以从外部文件读取歌词并且以时间轴显示的插件?

关于 ID3 标签,我还有一些疑问,下面列出来,希望对此有了解的朋友能够指点一二。

1. 网上讨论 Linux ID3 标签编码问题时经常会说 ID3 标签的编码是 GBK, BIG5 所以造成了乱码问题。但 Wikipedia 上说,ID3v1 只支持 ISO-8859-1,ID3v2.1 增加了 UTF-16 支持,ID3v2.4 增加了 UTF-8 支持,貌似 ID3 标签根本没有 GBK 编码这一说。那么乱码问题到底和 GBK 有关系吗?

Li Fanxi 网友的重要评论:ID3v1只支持ISO-8859-1,不过很多传统的软件,比如WinAMP或Tag&Rename,都会用System Code Page去存放非ISO-8859-1中的字符。对于CP936,自然就是GB2312了。一些严格符合标准的软件如果没有考虑到这个问题,就会出现乱码。

2. 这篇疑似 Amarok 开发人员的博客中说:“(我们限制自动检测编码功能仅检测 ID3v1 )基于这样的假设:所有的 ID3v2 使用的是 UTF-8 编码,所有的 ID3v1 使用的是非 UTF-8 编码。”但是要知道大部分中文 MP3 歌曲使用的是 ID3v2.3,根本不支持 UTF-8。那是否能得出这样的结论:Amarok 乱码问题是因为 Amarok 不支持 ID3v2 标准,而不是 Windows Explorer 和其他 mp3 播放器厂家不支持标准?那么我想,有了 Songbird,是放弃 Amarok 的时候了。

Li Fanxi 网友的重要评论:ID3v2.3不支持UTF-8,如果用UTF-8存ID3v2.3 Tag可以看成是软件的Bug,我不太确定有多少软件会这么做。

3. 为什么某些同样是 ID3v2.3 编码的 MP3,Windows Explorer 和千千静听能读取正确,Songbird 中却有可能显示为乱码呢?

Li Fanxi 网友的重要评论:这个问题还是要具体问题再具体分析,可以用软件分析一下这个文件中倒底存了多少种Tag,一个文件中可以同时存在几种版本的Tag,比如ID3v1、ID3v2、APE,不同的软件可能对不同的Tag的识别优先级不一样,导致显示结果不一样。

虽然我天天在Linux下工作,不过管理Tag我还是wine一个Windows下的Mp3tag来用,因为以前在Windows下用惯了,而且我也在维护这个软件的简体中文语言文件。这个软件Usability不算好,不过功能很强,适合对MP3 Tag管理有比较高要求的朋友用用。http://www.mp3tag.de/en

对于解决乱码MP3的问题,我用Mp3tag的方案是先对用System Code Page存放的Tag做一次Convert Codepage的Action。然后把MP3 Tag清除动作设成清除所有,写入动作设成只写入ID3v2.3 UTF-16,然后对所有的文件做一次Ctrl+X再Ctrl+V。世界就清静了。

PS: 一定要试试 Songbird 的 MashTape 插件,很好很强大!

Vim 中文输入法插件 Vimim

有位朋友在 TopLanguage 讨论组里向我推荐了一款非常 cool 的 vim 输入法插件:vimim,您可以从 Vim 插件页下载 Vimim,演示程序和码表可以在 Vimim Googlepage下载。Vimim 作为一个 Vim 插件项目起始于 09 年一月份,可能知晓它的用户还比较少,所以我觉得有必要向大家推荐一下这款优秀的 Vim 插件。

作为中文用户,在 Vim 里输入中文往往是一件非常痛苦的事情,最别扭的地方在于使用中文输入法时进行 Vim 编辑模式之间切换比较麻烦,还容易误操作,这也是我一般不使用 Vim 编辑中文文档的原因。

简单地来说,这个插件使得你在 Vim 里直接输入中文(使用 Ctrl+\ 开启选词单而不是通常输入法使用的空格键)。当你不按 Ctrl+\ 时,你就是在输入英文字母,这样就避免了中英文输入法切换的问题。这个插件的使用方法和演示在 Demo 页展示得很清楚,这里我就不再赘述了。

不过在使用上我仍然面临着一个小问题,Vimim 目前提供的双拼码表是基于微软双拼的,而我习惯于智能 ABC 双拼,所以我在 Vimim 的讨论组里抱怨了一下:《希望双拼音节映射独立于码表》。

------------------------------ 我是分割线 ------------------------------

我的 BSP yo2.cn 服务器宕机从 09 年 5 月 12 日起延续了将近三天,期间可能导致部分用户遇到无法访问问题,请见谅。

谈谈 CoolSIP

说明:本文有一些内容是基于本人的合理猜测。如果您知道更多细节,请不吝指出,但最好请提供事实依据,而不是仅仅指责我主观臆测,不尊重事实。我不知道事实,才会猜测,我如果知道事实,就不用猜测了。

CoolSIP 是清华大学信息网络工程研究中心建设的 IPV6“下一代互联网应用示范平台”提供的一个在 IPV6 网络上运行的 VoIP 软件,该软件提供了主机间通话和主机拨打传统 PSTN 电话的功能。目前该服务仅提供给 IPV6 教育和科研网用户使用,注册该服务需要 edu.cn 或者 ac.cn 后缀的大学或科研机构电子信箱。测试期间是免费的,但需要用在线时长换取话费。

我这里呢,就是说几句闲话,谈谈我对这个软件和服务的看法。

1. CoolSIP 的知识产权问题

我对 CoolSIP 软件的结构并不清楚,但基本可以肯定的一点是 CoolSIP 使用了开源的 osipeXosip。不用逆向工程该软件,查看 CoolSIP 帐户信息的保存位置就可以知道,CoolSIP 的帐户信息保存在 C:Documents and SettingsUsernameeXosip 目录下。

由于 osip 遵从的是 LGPL 协议,eXosip 遵从的却是 GPL 协议,那么从我有限的对知识产权的了解(关于 LGPL 和 GPL 可以参考这里),CoolSIP 也应该遵从 GPL 协议(对这点有问题您可以在评论中指出)。而目前来看,清华大学信息网络工程研究中心并没有发布 CoolSIP 的源代码,而且 CoolSIP 貌似将 osip 和 eXosip 库静态链接进了程序里(大概有隐藏的意图),那么可以认为他们并不认可 GPL 许可证——不过他们还没有错误地在安装文件中包含一份私有版权声明。

另外,http://ngmylife.wirelesslan.edu.cn/multimedia.html 页面中说:“当eTone出现无法登录的问题时,可以使用CoolSIP试试。”可以猜测 eTone 和 CoolSIP 有非常紧密的关系,而 eTone 又是一款流行 VoIP 软件“快门” 的前身,那么我对“快门”软件的版权也持谨慎地怀疑态度——不过我更倾向于快门不大可能犯这种错误。

2. CoolSIP 本身的程序设计问题

CoolSIP 是一个极不成熟的软件,使用过程中居然会出现程序错误,点“忽略”才能继续运行的情况;由于其版本历史仅仅显示到 2007 年 9 月 3 日 ,我想其对 SIP 协议的实现是存在问题的,例如在拨打一个通话中的电话号码时,CoolSIP 不会提示对方正在通话中。总之,该软件除了是 sip6.edu.cn 提供的 VoIP 服务的官方客户端以外,几乎一无是处。

3. CoolSIP 的 VoIP 服务

虽然 CoolSIP 客户端没有什么优点,但是 sip6.edu.cn 的 VoIP 服务器端对 SIP 协议的实现应该还算很标准的。由于 CoolSIP 使用了 eXosip 库,那么我就尝试使用另一款使用 eXosip 库的遵从 GPL 协议的开源软件 Linphone 尝试连接了一下 CoolSIP 服务器,居然能正常连接。

并且 Linphone 显示出比 CoolSIP 更友好的用户体验,例如:Linphone 支持 Windows 和 Linux 系统,更完整地支持 SIP 协议,支持自定义电话联系人列表,多帐户同时在线,通话统计记录显示,多种音频编码,更好的视频支持。像上面提到的 CoolSIP 不支持的“您拨打的电话正在通话中”提示,也可以在 Linphone 中听到。

官方提供的专门客户端 CoolSIP 竟然不如一个开源的通用客户端 Linphone,这大概是“下一代互联网应用示范平台”服务的一个笑柄吧。

PS: 使用 Linphone 登录 CoolSIP 的服务器,需要 libexosip2 和 libosip2 版本大于 3.3,我的经验表明 3.1 会出现较多问题。推荐手动依次编译 libosip2->libeXosip2->linphone。Windows 版的可执行安装程序包含了这两个库,所以不存在库版本低的问题。

《使用开源软件-自己动手写操作系统》Rev 2发布

免费电子书《使用开源软件-自己动手写操作系统》的主页在:http://share.solrex.org/WriteOS/ ,您可以到这里下载 pdf 格式电子书和随书源代码。

免费电子书《使用开源软件-自己动手写操作系统》(无法看到此图,可能因为您无法连接国外网站)

2008 年 2 月 21 日发布第一版,拖了十个月我才发布了第二版。虽然有一些懒惰的原因在里面,但更重要的原因是没有很多可以大块利用的时间。从开始动手,才知道写书是一件非常痛苦的工作,尤其是有代码的书。再加上本书目前的主要代码都是汇编语言,一旦出错就要花好长时间调试,代码运行正确了,要在不同的 Linux 进行编译以确保能正确通过,又要加注释、除去冗余指令,代码的工作结束就要接着关注排版、查资料、填补内容、做插图,总之写一天书下来我累得精神都会振奋不起来。

本来打算十月底就发布第二版,但是因为研究工作稍微耽误了一下,就又拖到了十一月底,总之我还是完成了这一章。这一版虽然只增加了第三章,但页码却从 40 页增加到了 104 页,示例代码也从 2 个增加到 10 个,与第一版的工作量不可同日而语。由于这一版的发布周期过长,我在按版本发布的基础上增加了每周发布,也因此在编写过程中得到了不少帮助。

这本书从计划开始就得到很多朋友的肯定,在编写的过程中也得到了很多朋友的帮助。不计刚发布第一版时几乎每天一千次的下载量,从 2008 年 5 月 9 号把所有源代码迁移到 Google Code 项目后,加上每周发布,就有共计两万一千多次下载。我非常感谢大家对我一如既往的支持,感谢那些在我的博客评论或者发电子邮件给我打气的朋友,尤其感谢那些在邮件中或者错误报告页中指出本书错误或者提供很好建议的朋友!

我尤为高兴的是听一位朋友说北京邮电大学某位教授操作系统课程的老师向同学推荐这本电子书,这正与我写这本书的初衷相合,就像我在前言中所说:

本书的最终目标是成为一本大学“计算机操作系统”课程的参考工具书,为学生提供一个step by step 的引导去实现一个操作系统。这不是一个容易实现的目标,因为我本人现在并不自信有那个实力了解操作系统的方方面面。但是我想,立志百里行九十总好过于踯躅不前。

我将继续努力将这本书写下去,也希望大家能够继续对这本书保持关注,并帮助我完善此书。下面是本书这次发布的章节信息,如果您发现本书中的错误(那是不可避免的),或者有更好的建议,请您一定到本书的错误报告页指出,兄弟我将非常感谢!

第三章进入保护模式
3.1 实模式和保护模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.1 一段历史. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.2 实模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.3 保护模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.1.4 实模式和保护模式的寻址模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2 与保护模式初次会面. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.2.1 GDT 数据结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2.2 保护模式下的demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2.3 加载GDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.2.4 进入保护模式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.2.5 特别的混合跳转指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.2.6 生成镜像并测试. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.3 段式存储. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.3.1 LDT 数据结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.2 段描述符属性. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.3.3 使用LDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.3.4 生成镜像并测试. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3.5 段式存储总结. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.4 特权级. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.4.1 不合法的访问请求示例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.4.2 控制权转移的特权级检查. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.4.3 使用调用门转移. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.4.4 栈切换和TSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.5 页式存储. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.5.1 分页机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
3.5.2 启动分页机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.5.3 修正内存映射的错误. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
3.5.4 体验虚拟内存. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.6 结语. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

解决了一个 Linux 版飞信 GUI 的一个重要 Bug

江苏移动一直有飞信答奥运题奖话费的活动,所以我女友每天都有登录飞信答题的习惯。Libfetion 是针对飞信协议开发的第三方程序库,在此基础上有 Linux 和 Mac 版 GUI 软件(GUI 是开源的,但库不是),虽然不算好用吧,但总比没有强。前两天我将 Libfetion 从 0.2.1 升级到 0.2.2 版,忽然发现不能用了,没法在 Linux 下答飞信题,在女友面前很没面子。

于是今天晚上就找了点儿时间将源代码下载下来,加 -g 编译,调试了一下。虽然没有文档帮助,找 bug 的过程还是相当之顺利,用 gdb 跑了三遍就定位到了问题所在,把问题解决,将 patch 提交给了 Libfetion 开发组

自从 0.2.2 更新之后, libfetion 在登录后就会直接退出,我调试了一下,发现其原因在于错误的先 delete 掉 longinWin 对象。下面是 patch:

$ diff -urN fxmain.cpp new_fxmain.cpp
--- fxmain.cpp        2008-07-05 22:48:22.000000000 +0800
+++ new_fxmain.cpp        2008-07-07 20:01:58.000000000 +0800
@@ -66,7 +66,7 @@
        isLoginIn = true;
        mainWin = new FxMainWindow(0);
        loginWin->hide();
-        delete loginWin;
        mainWin->show();
+        delete loginWin;
}

之所以提这件事情就是想说明一点开源软件的优越性:由于所有人都能得到源代码,遇到问题不必非得等官方的补丁,自己动手就可以解决;由于平台或工具的原因,有时候开发者未必意识到的错误,反而可以被某一特定用户解决。在这一点上,闭源软件要差很多,这也是我喜欢开源运动的原因之一。

15 Minutes of Fame

短暂的荣光

——对 免费电子书《使用开源软件-自己动手写操作系统》 的一点点说明

我前几日发布了免费电子书《使用开源软件-自己动手写操作系统》,本以为只是在和我相关的一些圈子,主要是南京大学和南京大学毕业的 Linux 爱好者中得到传播。虽然我预计到了它会慢慢的扩散开来,但是从没有想过它在发布之初就产生了这么大的影响,我的个人主页和博客的点击量在这几日都迅速上升到日近千次访问。

从统计结果来看,JservsolidotLinuxGem 对此消息的分享功不可没。特别是对岸的 Jserv,繁体发布页的一千多次访问几乎都是他带来的(其实这也是我准备繁体发布页的原因,只可惜暂时没有精力发布繁体电子书)。在这里我对他们的无私帮助表示感谢。

再来说说这本电子书,其实我是将其当作对《自己动手写操作系统》一书的读书报告和扩展来写的。之所以将其发布出来,是想让更多人得益于我的共享,从零开始去理解一个操作系统,因为很多讲操作系统的书不会讲这些体验,了解了这些就能得到更完整的体验。

有很多人诟病本书的英文名“Write OS with Free Software”从语法上来讲有错误。我不得不承认我没有认真考虑这个名字,只是随手写了上去,所以可能下次发布的时候本书英文名会更改为“Write Your Own OS with Free and Open Source Software”,不知道各位可有更好提议?

我不敢说自己写这本书就是大公无私,回报开源社区,没有一点私心。私心是有的,不过只是为了出一点小名。现在的杨文博仅仅是无名小卒一个,有一些小小名气之后,于找工作交朋友都有益处。我花费了不少的气力在这本书上面,除了一点点名气并没有要求其它的什么,所以我欢迎中肯的批评和建议,而不是对本书毛病的横加指责。谁不想得到别人对自己工作的尊重呢?

我仍是研究生一年级学生,上个学期周五和周末都会去一间公司兼职来赚点生活费。因为作息和饮食一直不够规律引发了身体的一些零件出现问题,所以这个学期辞去了兼职工作专心学习。我有我的正常生活,网络仅仅是我生活的一小部分,这些小小名气也不能解决我的吃饭问题。我不保证电子书的更新发布速率会满足某些读者的要求,所以我只能说我尽力,非常感谢你们能喜欢这本书,很抱歉但请不要在这一点上指责我。

我的一些关于盗版的观点

前段时间我写了篇 扔掉你 Windows 操作系统中的盗版软件吧 的博客文章,那是因为我不得不使用 Windows 下的 QQ 来和我女友进行视频聊天,而我又不想在我的系统中再次塞满盗版软件,所以就尝试着完全使用免费软件来工作,结果我发现效果还很好。不使用盗版软件并没有影响我的工作,有时候反而能促进我的工作效率,所以我想打破“使用 Windows(正版) => 不得不使用盗版软件工作”这种神话。

我并不是一个无条件反对使用盗版的人。我认为版权保护的目的就是为了促进人类知识和智慧的发展,就像林肯说的那句话:The patent system added the fuel of interest to the fire of genius. (专利制度是为了用利益燃料来浇灌天才之火。) 而在当前的某些状况下,版权保护体系其实是在实现某些团体的利益,而阻碍了人类知识和智慧的发展。因为有很多后发国家,有很多落后社会,版权保护体系在它们和先进国家之间划分了一道巨大的数字鸿沟。从某种意义上来讲,这有点像垄断组织对资源的控制和对其它后起企业的挤压一样,虽然垄断组织也是从自由竞争中发展起来的,但是当它成为阻碍市场发展的力量时,它就应该被拆散。

所以说,我不反对“贫困却希望享有平等获得信息权利”的盗版行为(比如盗版音乐、电影、书籍),我也不反对“由需要而只能使用无法替代的应用”的盗版行为,但是我反对“了解到有替代的东西而不去使用它”的盗版行为,更反对“知道这一切却我行我素并不以使用盗版为耻”的盗版行为。总的来说我的观点是:如果一个人使用盗版,必须感到抱歉,认识到这是一种违法行为;如果某种东西无法替代,为了自身的发展,可以在很抱歉的情况下来使用它;如果某种东西可以替代,那么就应该采取行动避免使用盗版。

关于盗版不仅仅是道德层面的问题,还有一些其它的影响。这些警钟已经被敲过很多遍了,就比如关于 Windows:微软的新操作系统 Vista 引入了一些 DRM(Digital Right Management)的新特性,微软喜欢把这种概念叫做“可信计算”,有一个计划叫做“palladium”,后来改名叫做“NGSCB(下一代安全计算基础,Next Generation Secure Computing Base)”,意思是为了用户安全。但是关于这个说法,Richard Stallman 的一句话 说的很正确:

When Microsoft speaks of “security” in connection with palladium, they do not mean what we normally mean by that word: protecting your machine From things you do not want. They mean protecting your copies of data on your machine From access by you in ways others do not want.(当微软提到和 palladium 有关的“安全”时,它的意思不是我们所说的“安全”的通常意义:“保护你的机器,不做你不想做的事情”。他们的意思是:“保护你机器中的数据拷贝,在他人(和微软相关的企业或者组织)不允许的情况下,你不得访问。”)

那么这个的实际意义就是:你在 Windows 下用 QQ,不是你觉得“我相信 QQ,我要用。”你才能用,而是需要 Windows 说“我相信 QQ,你能用!”,你才能用。这才是可信计算的真正意思,可信计算组织要控制你访问自己系统资源的能力,所以不要相信什么带有安全芯片的笔记本电脑,那个安全和你的安全是不一样的。况且,任何国家生产的安全芯片,都是需要加入某些国家安全部门产品的。

这些大公司大企业(就是你正在侵犯他们版权的那些企业)并没有那么慷慨,盗版的代价迟早是要付出的。他们所做的是让你先陷入盗版的深渊,然后再剥夺你的自由权利,最终获取更大的控制权和更多的利益。Trusted computing 就是其中的一步,当每台电脑都被微软强制安上安全芯片后(这可能是由盗版用户的市场贡献给微软带来的特权),恐怕你运行自己写的程序也要先给微软发封电子邮件以得到许可了。

那么如何避免这种现象的发生呢?只需要提几个问题你就明白了:如果 Linux 占桌面市场操作系统份额 50% 以上,微软会/能这样做吗?如果 Loongson(龙芯) 在中国个人电脑芯片市场占统治地位,Intel 会/能这样做吗?如果世界前 10 名高性能计算机中 Lenovo 占一半以上,IBM 会/能这样做吗?

所以不使用盗版软件,也是你为后代人做的贡献,恐怕你不想听到你的孙子问你:“爷爷,为什么我爸爸要花掉收入的一半去买操作系统和其它软件的授权呢?”

扔掉你 Windows 中的盗版软件吧

——Windows 下常用盗版软件的替代免费软件列表

最后更新时间:2009年8月30日

本文不是一篇对开源软件或者 Linux 的宣传,本文仅仅针对那些在 Windows 下不愿意使用盗版软件,和不能忍耐寻找盗版软件注册码、注册机带来的麻烦的用户。本文的主要内容就是介绍一些用来替代 Windows 下流行盗版软件的开源和免费软件。请注意替代的免费软件并不一定比流行的盗版软件功能差,很多甚至比商业软件还要好。

当您看完这篇文章,我相信您完全可以把您 Windows 系统里安装的盗版软件清理干净而不影响您的任何工作。如果您仍然希望并且喜欢、享受做一个盗版软件用户的话,那也没有办法,但是请您记住,非常非常重要的一点:您已经不是一个历史清白的人,因为一打开电脑,您就在犯罪(侵犯知识产权,侵犯软件版权)。以后像“我是一个遵纪守法的好公民”这种话,想想再说吧!

目录:

1. 压缩解压缩软件
2. 文本编辑软件
3. 杀毒软件
4. 软件防火墙
5. 辞典软件
6. FTP 下载工具
7. 邮件客户端 & RSS 阅读器
8. 办公软件
9. 图片查看器
10. 集成开发环境
11. C/CPP 编译器
12. 科技文献排版
13. 图片编辑软件
14. 远程登录软件
15. 统计计算软件
16. 数学计算软件
17. 反汇编软件
18. 参考文献管理
19. 影音播放
20. 刻录工具

内容:

1. 压缩解压缩软件
流行盗版软件:WinRAR
替代开源软件:7-Zip http://www.7-zip.org

7-Zip 在 2007 年被 SourceForge 网站评为社区选择最佳项目奖,最佳技术设计奖。7-Zip 可以说是能完美替换 WinRAR(甚至更好),它可以解压所有流行压缩格式的压缩文件,可以解压或压缩 7z, ZIP, GZIP, BZIP2 和 TAR 压缩文件格式。注意,7-Zip 不可压缩为 rar 文件格式,这样做有版权问题。

2. 文本编辑软件
流行盗版软件:UltraEdit
替代开源软件:Notepad++ http://notepad-plus.sourceforge.net
文本比较软件:WinMerge http://winmerge.org

相信用过 UltraEdit 的人都会赞不绝口,因为它强大的语法高亮,十六进制编辑,文件对比等等功能令人爱不释手,但是可以的是,它是一个收费软件。那么开源社区有没有相应的替代品呢,答案是肯定的,Notepad++ 一定不会让你失望。更强大的语法高亮,更具扩展性的插件,除了文件对比功能还比不上 UE,我真的是挑不出来一点儿毛病,这篇文章就是在 Notepad++ 中写的,赶快去下载一个尝试一把吧。而且 Notepad++ 还带有很多插件,如果你的 Notepad++ 带有 Nppexec 插件,那么你就可以在 Notepad++ 中打开一个类似于命令行的窗口,想想用这个写 Latex 文档多爽吧,在侧栏中直接输入 latex xx.tex 就可以直接调用 latex 进行编译了,这总比打开一个新的命令行窗口要省事多了吧。

感谢 bbbush 推荐的开源软件 WinMerge,这是一个强大的文本比较和整合工具。

3. 杀毒软件
流行杀毒软件:Kaspersky, Norton, NOD32, Rising 等等太多了
替代开源软件:ClamWin http://www.clamwin.com
替代免费软件:AVG http://free.grisoft.com
替代免费软件:Avira AntiVir Personal http://www.free-av.com
替代免费软件:Avast Home Edition http://www.avast.com

相信大家对病毒都一直很头痛,杀毒软件这个东西,平常用不着,真到用着时候却发现起不了啥作用。上面推荐的杀毒软件中,第一款是开源软件,所以功能稍微弱一些,后面三款都是有商业公司支持的,包括收费版和个人用户免费版两种,所以软件的质量还是可以保证的。感谢 Abcx 推荐 Avira AntiVir. 我个人比较推荐 Avast,功能真的很强大,不比某些软件的商业版本少什么东西。

4. 软件防火墙
流行盗版软件:ZoneAlarm, 天网,瑞星 等等也太多了
替代免费软件:COMODO Firewall Pro http://www.personalfirewall.comodo.com

如果说 COMODO Firewall Pro 是“完美替代”瑞星防火墙,我都觉得侮辱它了。COMODO Firewall Pro 曾获得 Web User 杂志 2007 年金奖,它不仅仅是一个防火墙,而且还可以监视系统文件的更改,它监视文件范围之广泛简直都让我崩溃了,总之它是一个防火墙,但是包含了一些杀毒软件才有的功能,至于它的强大,用了才知道。用 COMODO Firewall Pro 和 Avast 可以帮你打造一个不逊于任何杀毒软件和防火墙组合的安全系统。COMODO 在 2009 后将杀毒功能也引入了防火墙功能中,它的安全套件目前显得比较臃肿,已经不太适合追求简约的用户使用了。

5. 辞典软件
流行盗版软件:金山词霸
替代开源软件:StarDict(星际译王) http://stardict.sourceforge.net
替代免费软件:灵格斯词霸 http://www.lingoes.cn
替代免费软件:谷歌金山词霸合作版 http://g.ciba.com

如果你用过 StarDict,我相信你不会再夸金山词霸好。StarDict 可以自定义辞典库,仅仅中英互译辞典你就有二十多种选择(其中包含金山词霸的辞典库哎),还有其它很多语言的辞典库,而且翻译中有很好玩的词义发散树。为什么它叫译王呢?因为它还有全文翻译功能,动心了吧,把金山词霸删了吧,换 StarDict,我保证你不会失望。

感谢 SteamedFish 推荐灵格斯词霸,这也是一款相当不错的辞典软件,尤其适合 Windows 下的用户习惯。灵格斯和星际译王最大的问题是没有解决好辞典的 license 问题,尤其是灵格斯词霸,这是它以后发展的隐忧。

2008年5月 Google 联合金山公司推出谷歌金山词霸合作版,虽然自带辞典少了点儿,但是有在线辞典功能。也许你想尝试一把!

6. FTP 下载工具
流行盗版软件:FlashFXP
替代开源软件:FileZilla http://filezilla-project.org
替代免费软件:UltraFXP http://www.click-now.net/html/UltraFXP.htm

FTP 下载工具,其实这个东西没什么讲头,大家用起来都差不多,只是换一个软件换一个使用方式而已。窗口布局,菜单内容变一变,基本功能都没差别。世事真的很多变,我以前强烈推荐 SmartFTP 在 2008 年 7 月全面转向了收费软件,这件事让我很伤心,因为这个软件我用的很舒服,sigh!不过幸好我们有开源软件 FileZilla,FileZilla 也支持 IPV6 协议以及使用代理服务器,唯一有点儿不舒服的是它的窗口分布有点儿乱,不过相信会很容易适应的。

7. 邮件客户端 & RSS 阅读器
流行盗版软件:Outlook, FeedDemon
替代开源软件:ThunderBird http://www.mozilla.com/thunderbird

ThunderBird,其实算是 Firefox 的兄弟,两者同是 mozilla 的开源项目。要说邮件客户端,ThunderBird 可能不是最优秀的,但是要说邮件客户端 + RSS 阅读器,恐怕直接支持两者的不太多吧。我之所以用它有一个很重要的理由,ThunderBird 是一款跨平台的阅读器,这样我就不用在 Windows 下和 Linux 下分别设置两次邮件客户端了,只需要把一个平台下的数据文件拷贝到另一平台下,就完全可以使用了。

8. 办公软件
流行盗版软件:MS Office
替代开源软件:OpenOffice http://www.openoffice.org
替代开源软件:AbiWord http://www.abisource.com
替代免费软件:WPS Office 2007 个人版http://www.wps.com.cn
替代免费软件:永中 Office 2009 个人版http://www.evermoresw.com/webch/product/personal.jsp

MS Office 我就不说了,有几个人不是盗版?正版 Office 2007 可是最便宜 400 多美元一套呢!用微软的口吻来说,您可是每年给微软带来好几百美元的直接经济损失啊(再加上Visual Studio, Windows 呢,上千美元了吧)!OpenOffice 现在虽然不敢说完美支持 MS Office 文档,但至少大部分兼容是没有问题的,而且 OpenOffice 文档可以直接保存成多种文件格式,像小气的微软在 2007 里还需要安装插件支持输出 pdf,太吝啬了吧。所以呢,OpenOffice 给你提供了替换 MS Office 的绝大部分功能,为什么还做一个盗版者呢?下载一个吧,至少可以当作一个 pdf 转换工具,要知道低于 2007 的 MS Office 可必须得安装 Adobe Acrobat 才能实现转换 pdf 功能,sigh,又是一个盗版软件!

对于中文用户,在这里我特别推荐金山公司的 WPS Office 套装个人版,对 MS Office 文档的支持到让人吃惊的地步,也没有 OpenOffice 一些启动速度慢等一些问题,非常适合一般用户使用;永中 Office 也在 2008 年 10 月 13 日宣布了个人版免费这一令人振奋的消息,这一消息使得 Linux 用户们有福了,因为永中不仅有 Windows 版,也有 Linux 版,对中文的支持要比 OpenOffice 好很多。但是从测试效果来看,Linux 版本对文档字体兼容性不如 Windows 下的 WPS,不知道 Windows 下的永中表现怎么样。

9. 图片查看器
流行盗版软件:ACDSee
替代开源软件:IrfanView http://www.irfanview.com

其实我对图片浏览软件并不感冒,因为 GFans 都是用 Picasa 嘛!但是看到很多人用 ACDSee 就让我很不爽,IrfanView 挺好的啊,而且速度更快。note:第一次看到有人用 IrfanView,是西门子公司 PSE 的工程师演示流程图。

10. 集成开发环境
流行盗版软件:MS Visual Studio, Intel C++, Turbo C, Delphi
替代开源软件:Eclipse(Almost Every Language) http://www.eclipse.org
替代开源软件:Code::Blocks (Only C/C++) http://www.codeblocks.org/
替代开源软件:NetBeans (Only JAVA) http://www.netbeans.org

如果你是个程序员,还没听说过 Eclipse?太老土了吧。先别说 eclipse 好不好,就拿现在大部分软件公司(尤其是JAVA软件开发公司)都在用 eclipse 来说,你也应该使用它。别给我说 Visual Studio 更顺手,我宁愿用 Notepad++ 写代码再调用命令行编译也不愿意用 Visual Studio 的代码编辑器(当然我这里指 Visual Studio 6.0,俺太土,就用过古董)。Eclipse 强大的插件功能,代码管理功能,自动补全功能,支持多种程序语言...好处我就不列举了(因为我发现自己总是经常不经意发现 Eclipse 的优点,点点惊喜太多了),自己用吧。

但是 Eclipse 最大的缺点就是“慢”!Code::Blocks 作为一个跨平台的 IDE,在速度上要比 Eclipse 好上很多。Code::Blocks 某些版本自带 C/C++ 编译器,如果您是个 C++ Programmer,您可以选择 Code::Blocks。

11. C/C++ 编译器
流行盗版软件:MS Visual Studio, Turbo C
替代开源软件:DevC++ http://www.bloodshed.net/devcpp.html

其实这个真的不好说,我没用过 DevC++,因为我基本上不在 windows 下写 C 代码了。但是 DevC++ 的编译器基础 GCC,我是太经常用了,我不相信你没听说过它,所以我就不解释了。为了写一段 hello world 满世界找注册码,找盗版光盘,值得吗?而且 VC6 对 C++ 标准的实现那么差,而 VS2003 以上动辄几个 G 的大小,相比而言 DevC++ 要比它们好很多。

12. 科技文献排版
流行盗版软件:MS Word
你应该使用的开源软件:LaTeX http://www.latex-project.org
中文 TeX 套装:CTeX http://www.ctex.org

如果我说 LaTex 是 MS Word 的替代软件,肯定有人会骂我:“有没有搞错?MS Word 能算科技文献排版软件?”所以对于那些习惯于用 word + Mathtype(哦,又是一个盗版软件!)写论文的同学,温习一下 LaTeX 的历史吧。你可以仔细看一下下载的 ieee, acm 论文,pdf 文件请看属性,有多少是用 word 的 adobe acrobat 插件生成的?又有多少是 TeX 相关程序或者 dvi, ghostscript 转化成的?当然了,中文的垃圾杂志就不要看了。如果是写中文文章,你可以更欢迎 CTeX 这一省去很多中文配置的套装,学了 LaTeX 你就会知道,什么叫做漂亮的科技文献排版!

13. 图片编辑软件
流行盗版软件:Photoshop
替代免费软件:Paint.net http://www.getpaint.net
替代开源软件:Gimp http://www.gimp.org

用 Linux 的人对 Gimp 不陌生,这是 Linux 下标准的图片编辑程序,这里指其 Windows 版本,Gimp 功能非常强大,但是编辑方式和习惯与 Photoshop 有些区别,可能需要稍微长点儿的学习周期。感谢 Cofyc 推荐 Paint.net,Paint.net 是一个更轻量级的图片编辑工具,功能比 Gimp 和 PS 都弱一点儿,但是编辑习惯和 PS 比较相似,用起来较为容易。有人会说,Photoshop 有这个,有那个,它们有吗?但是请问,你是专业的 PSer 吗?如果你是专业的 PSer,为什么不用苹果机再装个 Photoshop 进行处理呢?对于一般非专业人士的使用,我相信上面两款软件提供的功能足够你探索了。

14. 远程登录软件
流行盗版软件:SecureCRT
替代开源软件:Poderosa http://en.poderosa.org/

不喜欢 Putty 的黑色界面和难操作性?又不想使用盗版的 Secure CRT?这里像你隆重推荐终端登陆器 Poderosa,Poderosa 对 Telnet, SSH 各种登录方式均支持,还支持标签窗口,如果你电脑上还安装有 Cygwin,那么别再用那个黑黑的 Cygwin 启动窗口了,Poderosa 内建有对本地 Cygwin Shell 的支持,而且,Poderosa 支持插件扩展哦,你可以自己为它设置更多功能。

15. 统计计算软件
流行盗版软件:SAS
替代开源软件:R http://www.r-project.org/

大概学统计的学生都会很头痛使用什么软件做统计计算,SAS 那庞大的体积让人望而生畏,再加上用它的人不多,注册码和破解版也非常难找。其实你不必担心,R 软件在统计学领域的使用范围绝对要比 SAS 要广,因为不是每个教授都有钱买正版的 SAS 的,而且基于 R 开发的软件包也是多如牛毛,相信你一定能找到你需要的函数包,在这点上,SAS 要差一些。

16. 数学计算软件
流行盗版软件:Matlab, Mathematica
替代开源软件:GNU Octave+GNUPlot http://www.gnu.org/software/octave/ + http://www.gnuplot.info

虽然 Matlab 在数学计算领域非常流行,但是它的价钱也太贵了。这里我向您隆重推出 GNU Octave,一款开源数学计算软件,它兼容 Matlab 大部分语法,在它的发行版中您能找到很多 .m 文件,所以也许您写的 .m 文件都可以不加修改地在 Octave 上运行。如果需要画图功能,GNUPlot 会给您提供强大的画图工具支持。

17. 反汇编软件
流行盗版软件:Win32Dasm
替代免费软件:IDA Pro(旧版本) http://www.hex-rays.com/idapro/

其实 IDA Pro 更应该说是流行的盗版软件,但是 IDA Pro 的低版本是个人免费使用的,比如现在可以免费使用 IDA Pro 4.9 版,对于一般用户,旧的版本功能已经“非常非常非常”强大了。

18. 参考文献管理
流行盗版软件:Endnote
替代开源软件:JabRef http://jabref.sourceforge.net/

EndNote 是差不多 Windows 下文献管理的权威软件,某些学校可能会买下来这个软件给学生用。但是总有一些学校没钱,或者用户希望保持文献数据库在 Linux 下和 Windows 下的兼容性,那么 JabRef 可能是你最好的选择,因为 JabRef 使用 JAVA 语言编写,是跨平台的。尤其是对 bibtex 论文数据库的支持上,JabRef 已经相当完美了。

19. 影音播放
流行软件:暴风影音
替代开源软件:SMplayer http://smplayer.sourceforge.net/
替代免费软件:K-Lite Codec Pack http://www.codecguide.com/

其实暴风影音也是免费软件,但是暴风影音做的很多事情实在令人不敢恭维。因此我认为有必要推荐一下一些开源软件。SMplayer 是一个 mplayer 的前端,它将 mplayer 包装得更加用户友好,但是中文用户使用的话,有必要配置一下:字幕编码和文件缓存,否则在加载中文字幕或者高清电影时,会有一些问题。K-Lite Codec Pack 是著名的编解码库,很多播放器包括暴风影音、KMplayer 对媒体文件编解码都是使用的它。K-Lite Codec Pack 自带的 Media Player Classic 是经典的短小精悍型播放器,媒体加载速度极快,但是在控制功能上要少一些。

20. 刻录工具
流行盗版软件:Nero
替代免费软件:Nero Free Version http://www.nero.com/enu/downloads-nero9-free.php

本项内容是最奇怪的,盗版软件也是 Nero,免费软件也是 Nero。主要是因为 2009 年 Nero 推出了 Nero 9 的免费版本。我自己的刻录经验告诉我,很多看似很好的刻录软件都难以让人信任,很容易刻坏盘,而 Nero 是一款我足够信任的软件,它推出的免费版本包括了一般刻录时需要的基本功能,很值得使用。

本人的经验也就写到这里了,如果您有什么想补充的,您可以在本博客最底下的 CC 协议的基础上自由转载、修改或者添加内容。