[转]Linux高手:学习Linux的九条忠告

以下是网友王垠写的关于学习Linux的忠告。但只要稍加替换,它完全可以用来解决FF与IE,五笔与拼音,QQ与MSN,IBM与HP,甚至是SONY与任天堂粉丝之间的种种争端。

1. 不要当“传教士”

很多人在讨论区不断的引起 "Linux vs. Windows" 之类的讨论,甚至争的面红耳赤,这是没有必要的。 这种争论是浪费时间而没有任何用处的。对,你花了一下午,用许多事实“捍卫”了 “Linux 比 Windows 好” 这个说法。但是 Windows 的支持者并不会喜欢上 Linux,他们只是稍微退缩一下,然后找一些新的证据来跟你辩论。 世界上的人们都在利用Linux 研究最前沿的科学,我们还在这里讨论 “要不要用Linux” 这种无聊的问题,什么时候才能赶上时代前进的步伐? 什么叫做“Windows 支持者”,什么叫做“Linux 支持者”?我们为什么要支持某一个而反对另外一个?你不需要为 Linux “护法”,不需要成为“Linux 支持者”或者“GNU传教士”,GNU/Linux 已经用事实向世界证明了它们的威力,已经被大多数人接受。你只需要安安静静享受 GNU/Linux 给你的乐趣和自由。 你需要关心的不是你的工具是什么,而是你用它做了什么。精通 Linux 并不说明任何问题,因为它只是一个工具而已。如果你用 Windows 能很好的完成你的任务,那你就没有必要费时间去熟悉 Linux。直到有一天你发现一项任务只有 Linux 才能完成的时候再换也不迟,因为你身边的 Linux 的爱好者一定会很乐意的帮助你。

工具不是人,不应该对工具有感情。这是你在进行任何对工具的讨论前需要提醒自己的事情。面对一些容易引起争论的东西:Word 和 TeX;Emacs 和 VIM;MAXIMA,Mathematica 和 Maple;Gnome, FVWM 和 KDE;Mutt 和 Pine …… 一定要冷静的对自己说:“我不站在它们任何一边,因为它们不是人。” 各人的需要不同,生活的环境不同。对你来说好的东西,对别人来说不一定好,我们需要尊重别人的选择。如果你当面说别人正在用的程序不好,没有人会乐意接受 你的意见。我从来没有建议过我爸爸不用 Windows + WPS,而用 Linux + LaTeX 来处理他的英语试卷。因为 WPS 是我爸爸的选择,他能用 WPS 编辑出很好的试题去测试他的学生,那就足够了。

我曾经帮我爸爸做了一个 perl 程序,能够自动从一种我自己设计的 markup 语言转化成 LaTeX 格式的英语试卷。可以自动对试题编号,乱序排版选择题的选项,自动生成答案表,生成老师用的显示答案的版本,自动对短文改错题进行优化分段,自动拼写检 查,图形化的配置方式…… 我爸爸高兴的用了一段时间,可是后来他想用 WPS 里的一种标题样式,而我不在家,无法为他修改程序。所以他又换回了 WPS。这就像有人送爱因斯坦一罐剃须泡沫一样,刚开始几天,发现他神采飞扬,不断夸这个东西真舒服。过了几天,发现爱因斯坦又开始用白水剃胡子了,因为 剃须泡沫用完了,他懒得自己去买那个东西。这只是习惯问题。

2. 不要强迫自己

喜欢电脑的人总是有某些心理强迫倾向。有的人说:“键盘比鼠标快。我不要用鼠标。这样才有高效率。” 所以他在编辑器里无论什么时候总是用 20w, 10j 这样的命令到达目的点。他甚至觉得图形界面是多余的,干脆 Xwindow 都不装。 全部用键盘看起来的确比让手离开键盘去拿鼠标,再回来“快” 多了,但是快的击键频率不等于工作的高效率,对你的健康更没有什么好处。这只能把你变成打键盘的机器。 当你正在检查你的文章或者程序,思维正在随着字符的含义流动,突然 20w, 10j 这样的东西出现在你的脑子里,是不是会打断思路?不?那说明你当时思考的问题比较简单,这些干扰还不会起到副作用。

其实很多人用电脑的时候,思想都受到某种教条的束缚,上面这个只是众多教条中的一种。某些人制造了很多这种教条,用他的工作方式来要求别人,嘲笑方式 跟他不一样的人。比如有的人嘲笑其它人写 C 程序不按 8 字符缩进,嘲笑别人在 vi 里用方向键,嘲笑别人不知道 PVM 是什么,嘲笑其它人用 JAVA, C# 这种由 GC 回收内存语言…… 你不用管各种各样的教条,电脑只是你的奴隶,你想怎么用就怎么用。没有人能够约束你,没有人可以嘲笑你的工作方式。电脑明天就不再是这个样子,所以今天你 不用完全了解它。你没有必要知道别人创造的一切,因为你需要留点时间自己创造些东西。Just have fun! 当你下次修改文章的时候,不妨试试悠闲的用鼠标在你眼睛看到的地方轻轻点一下。

3. 不要“玩 Linux”

很多人用 Linux 的时候会感觉很迷茫,该用哪个发行呢?是不是我少装了什么?怎么升级这么快啊!怎么这么不稳定!每当遇到新的软件他就想试用,每当新的版本出现,他就更 新,然后用鼠标在新的菜单里选择从来没见过的程序来用用。 其实你是为了Linux而使用Linux,而没有找到正确的理由来利用 Linux。你首先要明确用电脑的目的,你用它是为了解决你的实际问题,而不是为了学习安装操作系统,不是为了测试哪个版本好用,不是为了“赶上潮流”, 更不是因为你硬盘太大了,你想多占点空间。 如果你启动了电脑之后不知道应该干什么,那么最好先不要用电脑,因为你可能有更重要的事情需要做。

4. 不用挑剔发行版本

很多人刚开始用 Linux 的时候,总是在怀疑别的发行版本是否比自己正在用的这个好,总是怀疑自己以后时候会失去支持,不得不换用别的发行。所以很多人今天是 Redhat,明天又换成了 debian, 一会儿又是 gentoo, …… 甚至有的人在一台机器上装了两个版本的 Linux,然后比较哪一个好。 其实你完全没有必要这样做,任何发行,只要你熟悉了,你在上面的工作方式几乎是不会受到任何影响的。

我以前一直用的 Redhat,当我有一天在我的一台新机器上安装 debian 时,我发现使用 Redhat 的经验完全没有浪费。我用了一个下午就配置好了 debian,使它服服贴贴的听我的话,就跟没有换发行一样。 Debian, TurboLinux, SuSE, Redhat, Gentoo, ... 任何一个版本都是不错的。很多人认为自己攒一个 LFS 是高水平黑客的象征,但是不是每个人都有精力去了解所有细节。 如果你是用于个人的日常事物和科研,可以试试 debian。它是我见过的最方便的一个发行。

5. 不要盲目升级

不知道这是心理作用还是什么,有的人看到比较大的版本号,就会很想换成那个。很多人的 Redhat 本来配置的很舒服了,可是一旦 Redhat 发行新的版本,他们就会尽快下载过来,然后选择升级安装。结果很多时候把自己原来修改得很好的配置文件给冲掉了。新的软件又带来了新的问题,比如有一次我 的 rxvt 升级到 2.7.8 就跟 miniChinput 冲突了,升级到 Redhat 8.0,发现 xmms 居然缺省不能放mp3了,XFree86 的 xtt 模块在 I810 上有新的 bug,会导致 Mozilla 突然退出。 如果你已经配置好了一切,千万别再整体升级了,这会浪费你很多很多时间的,不值得。有句话说得好:"If it's not broken, don't fix it." 如果你的程序能够完成你需要做的事情,你何必升级呢?

6. 不要配置你不需要的东西

如果你只想做一个像我这样的普通用户,主要目的是用 Linux 来完成自己的科研任务和日常工作,那就可以不用系统管理员或者网络管理员的标准来要求自己,因为当一个系统和网络管理员确实很辛苦。普通用户学习那些不经 常用到的复杂的维护系统的工具,其实是浪费时间,学了不用是会很快忘记的! 我不是一个合格的网络管理员,我的服务器都只设置了我自己需要的功能,设置好 ssh, ftp 已经足够了,那样可以省去我很多麻烦。我从来不过度考虑“安全”,因为 Linux 缺省已经很安全了。我没有磁带机,就不用管 tar 的那些稀奇古怪的参数了,czf, xzf, ztf 已经可以满足我所有的需要。sed, awk, ... 我也只会几种常用的命令行。

7. 不要习惯的使用 root 帐号。

在需要的时候才 su! 这是很多刚接触 UNIX 类操作系统的人常见的现象,他们不喜欢在管理系统的时候才 su, 而是一直用 root 帐号干所有事情,配置系统,安装程序,浏览网页,玩游戏,编程 …… 结果有一天,他不小心在某个系统目录使用了 rm * ... 后果不堪设想……

8. 不要用商业的眼光来看 Linux。

Linux 不是商业软件,所以不要用要求 Solaris, Windows 那样的眼光来看 Linux. 自由软件的作者们从来不拉拢用户,他们对用户不负有任何责任。实际上在自由软件的世界里,“开发者”和“用户” 并没有明确的界限,大家是朋友。 自由软件很可能只是满足作者和他的朋友的需要,甚至是为了好玩而创造的。自由软件不是完美的,自由软件承认自己有缺点,它不会自吹自擂,蒙蔽“用户”的耳 目。这种对作者责任的解脱激发了作者的创造力,他们不用过分考虑“向上兼容”,他们往往比背上重重包袱的商业软件结构更合理,技术更先进。 所以当你用某个自由软件遇到困难的时候,不应该埋怨软件的作者,因为他们对你并没有义务。

你不应该把自己当成一个挑剔的顾客,而要把自己作为这个软件的顾问和一个和蔼的建议者,这样你才能理解作者写这个程序时的快乐,在遇到问题时向作者反 映,帮助他完善这个软件,成为一个快乐的参与者。就像你的哥哥送你一个他用旧了的自行车,你应该珍惜这份友情,而不要在车坏了,或者骑车摔了一交的时候大 骂你的哥哥。如果你真的不能使用这种合作的心态,那么最好不要使用这个软件。 这是一种先进的文化,它包含了互相合作,科学创新的精神。理解这一点不是很容易,很多人往往是因为不能理解这种文化而离开自由软件。这对于作者来说并没有 什么损失。

9. 干你的正事去

很多人跟我说,你的网页浪费我好多时间来配置这配置那,一会儿是 FVWM,一会儿是 Mutt …… 嗯……那些东西都是我有空的时候一点一点积累的,如果你想一次性搞定所有那些东西,恐怕得花你几个星期甚至几个月的时间!并不是一定要搞定所有这些东西你 才能正常工作的。除非你真的非得利用某个程序,或者你闲着没事,否则你可以不管这些东西。

10. 上面几条仅供参考 以上只是个人意见,不一定适合所有人。取舍由你了!

[转]趣话字符集与字符编码

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为"字节"。

再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为"计算机"。

开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。

他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上 00x10, 终端就换行,遇上0x07, 终端就向人们嘟嘟叫,例好遇上0x1b, 打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0x20以下的字节状态称为"控制码"。

他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字 了。大家看到这样,都感觉很好,于是大家都把这个方案叫做 ANSI 的"Ascii"编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。

后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算 机保存他们的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到 了最后一个状态255。从128到255这一页的字符集被称"扩展字符集"。从此之后,贪婪的人类再没有新的状态可以用了,美帝国主义可能没有想到还有第 三世界国家的人们也希望可以用到计算机吧!

等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客 气地把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。

中国人民看到这样很不错,于是就把这种汉字方案叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展。

但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。

后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不 是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。

中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 "DBCS"(Double Byte Charecter Set 双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处 理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持,会编程的计算机僧侣 们都要每天念下面这个咒语数百遍:

"一个汉字算两个英文字符!一个汉字算两个英文字符......"

因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海 里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码方案。当时的中国人想让电脑显示汉字,就必须装上一个"汉字系统",专门用来处理汉字的显示、输入的问题,但是那个台湾的愚昧封建人士写的算命程序就 必须加装另一套支持 BIG5 编码的什么"倚天汉字系统"才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦人民,他们的文字又怎 么办?

真是计算机的巴比伦塔命题啊!

正在这时,大天使加百列及时出现了:一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们打算叫它"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称 "UNICODE"。

UNICODE 开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,对于ascii里的那些"半角"字符,UNICODE 包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于"半角"英文符号只需要用到低8位,所以其高 8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。

这时候,从旧社会里走过来的程序员开始发现一个奇怪的现象:他们的strlen函数靠不住了,一个汉字不再是相当于两个字符了,而是一个!是的, 从 UNICODE 开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的"一个字符"!同时,也都是统一的"两个字节",请注意"字符"和"字节"两个术语的不 同,"字节"是一个8位的物理存贮单元,而"字符"则是一个文化相关的符号。在UNICODE 中,一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。

从前多种字符集存在时,那些做多语言软件的公司遇上过很大麻烦,他们为了在不同的国家销售同一套软件,就不得不在区域化软件时也加持那个双字节字 符集咒语,不仅要处处小心不要搞错,还要把软件中的文字在不同的字符集中转来转去。UNICODE 对于他们来说是一个很好的一揽子解决方案,于是从 Windows NT 开始,MS 趁机把它们的操作系统改了一遍,把所有的核心代码都改成了用 UNICODE 方式工作的版本,从这时开始,WINDOWS 系统终于无需要加装各种本土语言系统,就可以显示全世界上所有文化的字符了。

但是,UNICODE 在制订时没有考虑与任何一种现有的编码方案保持兼容,这使得 GBK 与UNICODE 在汉字的内码编排上完全是不一样的,没有一种简单的算术方法可以把文本内容从UNICODE编码和另一种编码进行转换,这种转换必须通过查表来进行。

如前所述,UNICODE 是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号。如果还不够也没有关系,ISO已经准备 了UCS-4方案,说简单了就是四个字节来表示一个字符,这样我们就可以组合出21亿个不同的字符出来(最高位有其他用途),这大概可以用到银河联邦成立 那一天吧!

UNICODE 来到时,一起到来的还有计算机网络的兴起,UNICODE 如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到 UTF时并不是直接的对应,而是要过一些算法和规则来转换。

受到过网络编程加持的计算机僧侣们都知道,在网络里传递信息时有一个很重要的问题,就是对于数据高低位的解读方式,一些计算机是采用低位先发送的 方法,例如我们PC机采用的 INTEL 架构,而另一些是采用高位先发送的方式,在网络中交换数据时,为了核对双方对于高低位的认识是否是一致的,采用了一种很简便的方法,就是在文本流的开始时 向对方发送一个标志符。如果之后的文本是高位在位,那就发送"FEFF",反之,则发送"FFFE"。不信你可以用二进制方式打开一个UTF-X格式的文 件,看看开头两个字节是不是这两个字节?

讲到这里,我们再顺便说说一个很著名的奇怪现象:当你在 windows 的记事本里新建一个文件,输入"联通"两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码!呵呵,有人说这就是联通之所以拼不过移动的原因。

其实这是因为GB2312编码与UTF8编码产生了编码冲撞的原因。

从网上引来一段从UNICODE到UTF8的转换规则:

Unicode

UTF-8
0000 - 007F

0xxxxxxx

0080 - 07FF

110xxxxx 10xxxxxx

0800 - FFFF

1110xxxx 10xxxxxx 10xxxxxx

例如"汉"字的Unicode编码是6C49。6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。

而当你新建一个文本文件时,记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字,那么他实际就是GB系列的编码方式,在这种编码下,"联通"的内码是:

c1 1100 0001

aa 1010 1010

cd 1100 1101

a8 1010 1000

注意到了吗?第一二个字节、第三四个字节的起始部分的都是"110"和"10",正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本 时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了"00001 101010",再把各位对齐,补上前导的0,就得到了"0000 0000 0110 1010",不好意思,这是UNICODE的006A,也就是小写的字母"j",而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就 是只有"联通"两个字的文件没有办法在记事本里正常显示的原因。

而如果你在"联通"之后多输入几个字,其他的字的编码不见得又恰好是110和10开始的字节,这样再次打开时,记事本就不会坚持这是一个utf8编码的文件,而会用ANSI的方式解读之,这时乱码又不出现了。
from 说说字符集和编码

寻找失落的传统 《黑客:计算机革命的英雄》

前言:从7月4日晚上10点 开始,“博客中国”网站遭遇强大攻击而瘫痪,持续140多个小时,近乎疯狂,完全超越了黑客的游戏规则。据263的人士说,这是263有史以来遭遇的最持 久、最强大的攻击。而攻击完全是指向一个毫无防备能力的个人博客网站。许多人告诉我,这次攻击与“博客中国”呼唤的互联网“反黄”运动有关。我没有多少惊 讶,惊讶的是自己多年来为之鼓与呼的互联网的颜色。在我心目中,黑客依然是一个值得尊重的字眼。在中国,这些与“黄”同流合污的“黑”势力,我不认为他们 是真正的黑客,但是他们的确在迅速改变着中国互联网的颜色。这几天除了配合公安部门调查,我更多的在读一本书,英文版的书《黑客》,反复思考黑客的传统, 也许已经失落,但是,我依然身怀敬意。写作此文,希望更多的人能够了解真正的黑客,他们的传统,他们的传奇。我希望热爱IT的每一个人,都能够看到这本 书。那些真的敬仰黑客,甚至想成为黑客的人们,更不能不读这本书!因为它封存了美好的历史,同时也映照着我们的现在和未来。正义与邪恶,美好和丑陋,高尚 和卑劣,在黑客这个词语下,是如此泾渭分明!
黑客,我将永远把你潜心钻研
“生 活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。”这是莎士比亚信手写下的诗句。的确,一本真正的好书,如同一道亮丽的阳光,为我们 照彻一片黑暗的土地,为人们的知识插上新的翅膀。1984年,列维出手的《黑客:计算机革命的英雄》一书,就有如此神奇的效应。他追溯黑客传统和历史,讲 述黑客们人生和故事,归纳黑客创造的技术奇迹,总结黑客领域的哲学和伦理。总之,一本书就这样为大众打开了一个隐秘的世界,彻底、生动而详尽。阅读此书, 就是经历一场技术领域的人文畅游。本书还具有赢得黑客界友谊的惊人能力,使得未来无数黑客方面的书籍都得对它致礼。
“诗 歌,我将终生对你流连忘返;散文,我将永远把你潜心钻研”(兰道的自白),而列维则从此将计算机黑客领域的探寻作为自己的终生追求。作为《新闻周刊》首席 科技作家,这位以写作为自己生命的勤勉耕耘者,至今安分地担当一个新闻媒体的记者。不但保持高产的写作状态,一篇篇报道总能达到前人没有企及的深度,一本 本著作总能开启技术领域最隐秘和迷人的一面。无论是《独角兽的秘密》、《疯狂的大师》,还是最新的《隐私的终结:数字时代的密码大战》,每一本都扎扎实 实。因为数十年的勤奋,列维也被业界誉为“数字时代最顶尖的史学家”之一。可以毫不夸张地说,列维为那些被金钱、功利和泡沫反复玷污、污染和亵渎的IT记 者们,撑足了面子,确立了名誉,也设立了走向卓越的标准。
当 然,写于20年前的《黑客》一书,依然是一座列维本人以及后来人,无法超越的高峰。这本成书于80年代初期,当时正是PC崛起,计算机解放浪潮的启始时 刻。当然,不可否认,随着计算机不断社会化,黑客的组成和社会内涵已经发生巨大变化,但是,不管“黑客”这个概念被人类何等曲解、玷污和堕落,列维的《黑 客》一书已经为黑客确立了真正的历史传统和严谨祖训,它们不可动摇地树立着,为无数的黑客带来了积极的影响。也如明镜,映照人类的现在和未来。
黑客本来就是计算机革命的主角和英雄
的 确,黑客曾是一种荣耀,一种美好的传统。它代表着60—70年代反权威却奉公守法的计算机英雄。这群电气工程师和计算机革新者,才华横溢,行为孤僻,也有 个性缺陷。他们沉湎于技术和计算机,视工作为一种艺术。他们不仅仅是计算机革命的重要参与者,而根本就是计算机革命的主角和英雄(这两个词英文就是同一个 词:Heros)。这就是《黑客》一书确立的价值观。
我们不要 说教,而只需要深入历史,进入故事,直面这些人物。列维将我们带回了那段令人怀念的美好岁月。他深入采访和探究,第一次全面叙述了50年代后期至80年代 中期的黑客史,尤其详述了黑客发祥地——麻省理工学院(MIT)的“原型火车俱乐部”(Model Railroad Club)成员的活动情况。他们早期秘密穿梭于笨拙的穿孔大型机,并从Xerox PARC偷取大量技术,开启了计算机革命的历程,促成了PC的诞生,使计算机真正走向大众。这群人中有Richard Greenblatt、Bill Gasper、Captain Crunch、Steve Woz甚至Bill Gates。他们自由不羁,反抗既有体制,却严格遵循黑客道德准则:自由使用,信息免费,打破权威,推动分权。他们认为计算机既可创造艺术与美,也能使生 活更美好。
全书分三部分:第一部分名为“真正的黑客”(True Hacker),探究黑客源头和传统,介绍MIT人工智能实验室的黑客情况。
第 二部分名为“硬件黑客”(Hardware Hacker),讲述硅谷发明PC的黑客。列维很好地捕捉住了70年代PC革命的精神所在。不是MIT所在的波士顿,而是硅谷成为这场革命的中心,设计第 一台便携式电脑“奥斯本1号”的李·费尔森斯坦(Lee Felsenstein),MITS创始人,第一台商业化PC——Altair 8800——的缔造者爱德华·罗伯茨(Edward Roberts),“人民计算机公司”(People’s Computer Company)创始人Bob Albrecht,以及电脑爱好者汇聚的家酿电脑俱乐部“Home-Brew Computer Club)。当然,最能吸引读者的,还是苹果电脑的创造者沃兹和乔布斯(Steve Wozniak,Steve Jobs),后来,他们是黑客中大发其财的人物。
第三部分名为 “游戏黑客”(Game Hacker),讲述了80年代初期的第三代游戏黑客。主要就是软件公司开始崛起,包括受沃兹影响而成长起来的一代年轻黑客John Harris、Richard Garriott和Jay Sullivan等,他们创办了Sierra On-Line、Broderbund等软件公司。那时候,大家编写软件的兴趣主要来自游戏,而不是将计算机作为生产力工具。软件如同即兴的爵士乐一样, 开始招来一夜间暴富的机会。有了巨大的钱眼,美国公司的商业文化开始大举入侵了。盖茨等“反黑客”的价值观和行为,大举掠夺黑客们创造的成果,以精明商人 的手段将这些创新兑换为“美元”。利润最大化的价值观开始颠覆黑客领土。
本 书堪称一部“黑客列传”。最后以“最后一位真正的黑客”收尾,重点介绍了理查德·斯托尔曼(Richard Stallman)的故事。斯托尔曼作为MIT人工智能实验室的精神领袖,启动了自由软件运动,成就了今日Linux的辉煌。在本书完成近20之后的今 天,这位“最后的黑客”频繁地展转在业界和社会的主流讲坛上,继续挑战商业时代的误区和偏颇。现在看来,列维把这顶高帽戴到斯托尔曼的头上,还真是“神来 之笔”,因为除了斯托尔曼,这个世界上没有人(包括那些著名的黑客们)不对世俗和金钱高举双手,缴械投降。
中文版(国内未出版)
英文版
书名
《黑客:计算机革命的英雄》
Hackers: Heroes of the Computer Revolution
作者
史蒂文·列维
Steven Levy
作者国家
美国
Anchor/Doubleday公司,Penguin USA再版平装本
出版时间
1984年第一版,2001年1月2日再版
推荐级别
价格
$15.00
页码
455
作者其他著作
《隐私的终结:数字时代的密码大战》(Crypto: How the Code Rebels Beat the Government Saving Privacy in the Digital Age)(2001年1月1日)
《疯狂的大师》(Insanely Great: The Life and Times of Macintosh, the Computer That Changed Everything)(2000年6月)
《独角兽的秘密》(The Unicorn’s Secret: Murder in the Age of Aquarius)(199年3月)
《Artificial Life: A Report from the Frontier Where Computers Meet Biology》(1993年8月)
作者简介
《新闻周刊》首席科技作家,《连线》杂志的特约撰稿人。被誉为“数字时代最顶尖的史学家”之一。
作者联系
steven@echonyc.com;http://mosaic.echonyc.com/~steven/
根正苗红,黑客传统的“高品质”
计 算机技术越来越先进,越来越强大,这样义无反顾的快速节奏足以让人们丢弃历史,遗忘过去。但是,对于置身IT业的人来说,却无法跟随机器和技术一起“升级 换代”,提升思维的“主频”,胸怀的“容量”,和人格的“友好界面”。黑客就是如此,面对传统和历史,后来人大概只有无限惭愧的份了。
“黑 客”一词来源于英语动词hack,愿意为“劈,砍”,也就意味着“辟出,开辟”。关于“Hack”和“Hacker”的含义,《新黑客网上字典》列举了9 种不同的解释。但该字典也收录了一个MIT黑客菲尔(Phil Agre)的文章。菲尔告诉读者,不要被这些看似很有弹性的解释给蒙了,“Hack”其实只有一个意思,就是用精细高明的手段去挑战传统想法。
虽 然“黑客”定义非常模糊,但是大多数黑客都认同,“hack”这个字源起于50年代初期MIT学生的流行用语。1990年,MIT博物馆发行的刊物中 说,50年代MIT学生所说的“hack”就是指非恶意并且又有创意的行为。50年代之后,“hack”这个字有了更尖锐、更叛逆的意思。
60 年代,MIT校园里第一个自称计算机黑客的人就是50年代末期“原型火车俱乐部”的学生,他属于社内一个严谨的派系——信号动力 (Signal&Power,S&P),他们支持铁道社的电路设计与组件系统,这个系统复杂程度不下于校园的电话系统。对他们而言,少用 一个继电器来操作这条铁轨,意味着多了一个继电器可以用在别的地方。很快地,他们骄傲地宣称,改善铁轨的重点设计和组件,做这件事的人就是“黑客” (hackers)。50年代末期,S&P的成员将玩赏创新的重心转移到TX-0计算机的控制室里,而且重点从硬件转向软件,从硬件的组合加工, 转变为编程和软件的修改。并且逐渐强调集体创新的精神和共享的软件权利,形成了现代意义的黑客含义。
1969 年,互联网的前身ARPANET出现。以ARPANET为网络,以DEC-PDP系列小型机分时系统为硬件基础,以Unix的出现为软件基础,整个黑客文 化开始迅速繁荣。形成了以MIT的人工智能实验室为中心,蔓延到斯坦福大学人工智能实验室(SAIL)与稍后的卡内基梅隆大学(CMU)。三个都是大型的 计算机研究中心及人工智能的权威,聚集著世界各地的精英,不论在技术上或精神层次上,对黑客文化都有极高的贡献。由于,根正苗红,保证了黑客传统的“高品 质”。
“罪恶的对立面不是德行,而是信念。”《黑客》一书最大的影响,就是第一次总结了“黑客伦理”,并将其推向大众。这种伦理原则强调“共享、开放、分散、为操纵机器不惜任何代价”。与PC文化与互联网文化的精神内核一脉相承。
(1)进入(访问)计算机应该是不受限制的和绝对的
(2)总是服从于手指的命令;
(3)一切信息都应该是免费的;
(4)怀疑权威,促进分权;
(5)应该以作为黑客的高超技术水平来评价黑客;
(6)任何一个人都能在计算机上创造艺术和美;
(7)计算机能够使生活变得更美好。
IT业行驶在单向度的商业化铁轨上
计 算机革命浪潮开始了,商人来了,政客来了,罪犯也来了,更多的普通人来了。计算机产业的不断发生彻底的改变。是的,在MIT人工智能实验室中孕育出来的 “纯种”黑客,已经永远成为历史,随着IT应用的不断社会化,黑客的规模、特性和行为也越来越社会化。黑客究竟是天才?是牛仔?是艺术家?是罪犯?是恶作 剧者?也许,更准确的是黑客已经成为上述各类人物的混合体。
黑 客的社会化势不可挡,纯正的传统永远留给了历史。今天,网络不再是黑客们单纯的技术自由空间,而已经是人类经济行为、社会活动、生活交往、政治谋划的新舞 台。自由与责任、崇高与卑微、伦理与放纵、报复与惩罚、公司利益与消费者利益、个人权利与社区价值等等,新时代的黑客正是这些矛盾的体现。网络再虚拟,也 永远是人类真实世界的忠实镜像。在IT业中回归传统,套用克尔凯郭尔的话,“其不可思议的程度,犹如皇帝招一个农夫为婿一样。”
因 此,黑客文化的传统是一面最好的镜子,让我们看到自身的不完美之外,更让我们看到这个现实世界的不完美。因此,仅仅把黑客当作社会文明的毒瘤来切除,仅仅 用“电子恐怖主义”的口号来碾碎,是不可能真正解决问题。要告别互联网的野蛮时代,首先要结束人类社会自身的野蛮作为。
IT 业越来越成为单向度的商业列车。在这趟从不停息的列车上,我们无法在现实中考量自己,总容易沉浸在当下技术进步的欣快和骄傲之中。衰落的文化寄存到最后的 归宿——书籍之中。阅读书籍,可以为我们增添历史的纵深感。可惜,虽然IT业在中国如火如荼,黑客也成为社会时尚一般,可是像《黑客》这样影响几代人的优 秀著作,却依然在中国看不到中译本的影子。

我希望热爱IT的每一个人,都能够看到这本书。那些真的敬仰黑客,甚至想成为黑客的人们,更不能不读这本书!因为它封存了美好的历史,同时也映照着我们的现在和未来。

from http://tech.ccidnet.com/art/3089/20060816/825605_1.html

黑客的价值观(中英对照)

黑客,可能在大家的眼里是那些入侵别人计算机搞破坏的人,其实并不是那样的。如果你这样认为了,只能说明你对计算机文化并不了解,真正的黑客是一种 自由的象征,他们挑战权威,追求自由,并和很多非人类的行为作斗争。如果你想了解黑客文化,你一定要去看看我写的《Unix传奇,上篇下篇》。你会对正宗的计算机文化以及黑客文化有所了解的。而那些只懂得入侵别人计算机搞破坏活动的“黑客”只能称为是街头的小混混,他们根本就不配称黑客。

下面有四篇关于“Hacker’s Code”文章,我觉得相当的不错,可以让你明白什么是黑客的行为规范,道德准则,以及黑客的历史使命,希望能对你有启发。但是翻译水平有限,所以我请Mailper同学帮忙翻译了一下,但还是觉得原文更为传神,尤其是原文中的押韵,双意以及朗朗上口,所以,下面提供了中英文对照。如果有翻译得不好的还请大家指正。

The Hacker’s Code

http://muq.org/~cynbe/hackers-code.html

“A hacker of the Old Code.”

  • Hackers come and go, but a great hack is forever.
    黑客们来来往往,但是只有黑客的壮举是永存的
  • Public goods belong to the public.*
    公众的东西是属于大众的
  • Software hoarding is evil.
    Software does the greatest good given to the greatest number.
    圈养软件是邪恶的,最好的软件是有最多人使用的
  • Don’t be evil.
    不作恶
  • Sourceless software sucks.
    不公开源码的软件是令人厌恶的
  • People have rights.
    Organizations live on sufferance.
    每个人都是有权利的,而组织是建立在互相的容忍上的
  • Governments are organizations.
    政府也是组织
  • If it is wrong when citizens do it,
    it is wrong when governments do it.
    对与错的标准,对于公民和政府是同样适用的。(不能“只许州官放火不许百姓点灯”)
  • Information wants to be free.
    Information deserves to be free.
    信息需要自由(免费),信息也应该是是自由(免费)的
  • Being legal doesn’t make it right.Being illegal doesn’t make it wrong.
    合法的不一定是正确的,不合法不一定就是错误的
  • Subverting tyranny is the highest duty.
    推翻专制是黑客的最高天职
  • Trust your technolust!
    相信你的“技术贪欲”

* Definition: A good is public if the marginal production cost is lower than the marginal billing cost.
定义
一个好的公众事物仅当其边际产值小于其边际广告值。(关于 marginal production是一个经济学术语,我不是很懂,大家可以参考这篇文章

The Hacker’s Code of Ethics

http://courses.cs.vt.edu/cs3604/lib/WorldCodes/Hackers.Code.html

Levy (1984) suggests that there is a “code of ethics” for hacking which, though not pasted on the walls, is in the air:

列维认为黑客有一种准则,这种准则不是墙上贴着的,而是像空气一样无处不在的。

  • Access to Computers - and anything which might teach you something about the way the world works – should be unlimited and total. Always yield to the Hands-On Imperative!
    计算机的使用(就像任何教会你去了解这个世界的东西一样)应该是无限和无所不包的。真理来自实际动手操作。
  • All information should be free.
    所有的信息都应该是自由的(免费和不加限制的)
  • Mistrust Authority – Promote Decentralization.
    不要相信权威,推崇分权和群众的智慧
  • Hackers should be judged by their hacking, not bogus criteria such as degrees, age, race, or position.
    英雄(黑客)不问出处,更不会去计较世俗的标准:学历,年龄,种族和职位高低。
  • You can create art and beauty on a computer.
    黑客可以在计算机上创造艺术和美。
  • Computers can change your life for the better.
    计算机可以提升你的生命。

Reference:

Levy, Steven. 1984. Hackers: Heroes of the Computer Revolution, Anchor Press/Doubleday, Garden City, NY, 458 pp.

史蒂芬.列维 1984  黑客:计算机革命的英豪们, Achor Press… 第458页

DRAFT The Hacker’s Code DRAFT

http://www.petascale.org/code/code.html

Preamble: We, the people of the electronic universe, in order to establish a society of knowledge and skills, do hereby proclaim the following.

导言:我们,数字领域的主宰者,为了建一个知识和技术的社区,我们发出下面的声明。

Hackers are diverse, from all cultures and backgrounds. Every hacker is unique, yet we all share some characteristics. While not every hacker follows this Code, many believe it is a fair description of our shared traditions, goals and values.

黑客是各式各样的,无论是从文化还是背景。每个黑客都是唯一的,然后,我们是有一些相同的特质的。也许并不是所有的黑客都会跟从下面的准则,但大多数黑客都相信这是一个公正的惯例,目标和价值观。

  • Hackers share and are willing to teach their knowledge
    黑客共享并愿意传播他们的知识。
  • Hackers are skilled. Many are self-taught, or learn by interacting with other hackers.
    黑客都是老手。他们中很多人要么是自学,要么是与别的黑客相互共世而成长的。
  • Hackers seek knowledge. This knowledge may come from unauthorized or unusual sources, and is often hidden.
    黑客查找知识。那些知识可能是多一些未授权或是不寻常的通常都是被隐藏起来的地方来的。
  • Hackers are tinkerers. They like to understand how things work, and want to make their own improvements or modifications.
    黑客都是些好管闲事的人。他们总是喜欢对事物刨根问底,而且总是要为改善那些事情加上自己的想法。
  • Hackers often disagree with authority, including parents, employers, social customs and laws. They often seek to circumvent authority they disagree with.
    黑客通常都在挑战权威,包括家长,同事,用户以及法律。他们总是挑战那些他们并不认可以权威。
  • Hackers disagree with each other. Different hackers have different values, and come from all backgrounds. This means that what one hacker is opposed to might be embraced by another.
    黑客也是互不信任的。不同的黑客有不同的价值取向,而且也有相同的背景。也就是说,某个黑客被反对了,但也会被别的黑客所拥护。
  • Hackers are persistent, and are willing to devote hours, days and years to pursuing their individual passions.
    黑客是永不放弃的。他们愿意全身心地把他们的热情投入到每一个小时,每一天,每一年中。
  • This Code is not to prescribe how hackers act. Instead, it is to help us to recognize our own diversity and identify.
    准则并不是说明黑客是什么样的,而说让我们明白我们的不同性和一致性。
  • Every hacker must make his or her own decisions about what is right or wrong, and some might do things they believe are illegal, amoral or anti-social to achieve higher goals.
    每一个黑客必需自己为对和错作决定,有一些事可能是不合法,不道德的,甚至反社会的,但却可以让他们攀上自己价值观的高峰。
  • Hackers’ motivations are their own, and there is no reason for all hackers to agree.
    黑客的动机是他们自己的,而且无需任何理由获得其它的同意。
  • Hackers have a shared identify, however, and many shared interests.
    黑客一般会有共同的认识,然而,许多黑客却是拥有共同的利益。
  • By reading this Code, hackers can recognize themselves and each other, and understand better the group they are a part of. This will be beneficial to all hackers.
    了解了这些准则,黑客们能够赏识自己或相互赏识,并相当明白他们是这个团体的一部分。这会让所有的黑客受益。

The Conscience of a Hacker

http://www.phrack.org/issues.html?issue=7&id=3&mode=html

##=========================================

\/\The Conscience of a Hacker/\/

by

+++The Mentor+++

笔名:导师

Written on January 8, 1986

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Another one got caught today, it’s all over the papers.  “Teenager Arrested in Computer Crime Scandal”, “Hacker Arrested after Bank Tampering”… Damn kids.  They’re all alike.

今天有一个被捕的消息受到媒体热议。“某少年由于计算机犯罪被捕”,“入侵银行的黑客被捕”…一帮臭小子,他们都一样。

But did you, in your three-piece psychology and 1950′s technobrain, ever take a look behind the eyes of the hacker?  Did you ever wonder what made him tick, what forces shaped him, what may have molded him?

但是你们是帮老朽只知道老套的心理学和50年代的技术。你们有没有想想黑客究竟在想什么?你们有没有想想他们为什么这么做,什么造就了他们,什么塑造了这帮黑客?

I am a hacker, enter my world…

我是名黑客,请走进我的世界…

Mine is a world that begins with school… I’m smarter than most of the other kids, this crap they teach us bores me…

我的世界是从学校开始的…我是学校里最聪明的孩子,学校教我的垃圾让我厌倦。

Damn underachiever.  They’re all alike.

都他妈的水货,这帮子成绩不好的都一样烂。

I’m in junior high or high school.  I’ve listened to teachers explain for the fifteenth time how to reduce a fraction.  I understand it.  “No, Ms. Smith, I didn’t show my work.  I did it in my head…”

我初中高中时候就是如此了。白痴老师一个分式化简要解释15次。这些我全懂。所以我说”不用了,XX老师,我不用写这些步骤,我可以心算…”

Damn kid.  Probably copied it.  They’re all alike.

一帮傻同学,估计都只知道抄写老师的板书,一棒子二百五。

I made a discovery today.  I found a computer.  Wait a second, this is cool.  It does what I want it to.  If it makes a mistake, it’s because I screwed it up.  Not because it doesn’t like me…

今天我发现新大陆了。我遇到了一台计算机。真是太酷了,计算机完全按照我的指令执行。如果计算机犯了错,是因为我没搞对。而不是因为它不喜欢我…

Or feels threatened by me…

也不是觉得我成绩太好到威胁它了,也不是因为我是个自是聪明自以为是,而且不对我教条主义

Or thinks I’m a smart ass…

Or doesn’t like teaching and shouldn’t be here…

Damn kid.  All he does is play games.  They’re all alike.

而我的一帮傻逼同学,都他妈只知道玩。

And then it happened… a door opened to a world… rushing through the phone line like heroin through an addict’s veins, an electronic pulse is sent out, a refuge from the day-to-day incompetencies is sought… a board is found.

突然,与计算机相处为我打开了一扇通往另一个世界的门。一股电脉冲从电话线传送出去,就好像海洛因冲过毒瘾者的血脉,我可以逃离那帮子傻逼,一个新大陆!

“This is it… this is where I belong…”

是的!计算机是我的归属。

I know everyone here… even if I’ve never met them, never talked to them, may never hear from them again… I know you all…

在这个世界里,我认识这里的每一个人…虽然我并没有跟他们见面,没跟他们交谈,也许以后也不会再提到他们的消息。但是他们对我是那么的熟悉。

Damn kid.  Tying up the phone line again.  They’re all alike…

一棒子傻逼,大概他们又把我的电话线打结了。

You bet your ass we’re all alike… we’ve been spoon-fed baby food at school when we hungered for steak… the bits of meat that you did let slip through were pre-chewed and tasteless.  We’ve been dominated by sadists, or ignored by the apathetic.  The few that had something to teach found us willing pupils, but those few are like drops of water in the desert.

是的,我们黑客都差不多…我们智力高度成熟,我们想啃牛排的时候只有被喂婴儿食物。好不容易有点肉吃,也是被嚼烂了的。我们被虐待狂欺负,被冷漠者漠视。偶尔有好人理解我们其实是最好学的学生,但是这种人少得跟沙漠中的水滴一样。

This is our world now… the world of the electron and the switch, the beauty of the baud.  We make use of a service already existing without paying for what could be dirt-cheap if it wasn’t run by profiteering gluttons, and you call us criminals.  We explore… and you call us criminals.  We seek after knowledge… and you call us criminals.  We exist without skin color, without nationality, without religious bias… and you call us criminals.

You build atomic bombs, you wage wars, you murder, cheat, and lie to us and try to make us believe it’s for our own good, yet we’re the criminals.

我们这些黑客长大了…这个世界充满着电子,开关,和美丽的波特(信号传输单位)。我们并不是在犯罪,我们只是在免费使用服务,这些服务要不是因为那 些敛财狂本可以是非常廉价的。我们在探索…可你们说我们是在犯罪。我们是在寻求知识…可你们说我们是在犯罪。我们黑客无处不在,不分肤色,没有国界,没有 宗教偏见…可你们说我们是在犯罪。你们这些伪君子制造了原子弹,发动战争,某战争,不忠,并且对我们说谎;你们居然说你们的行径是为我们好,而我们黑客是 犯罪分子。

Yes, I am a criminal.  My crime is that of curiosity.  My crime is that of judging people by what they say and think, not what they look like. My crime is that of outsmarting you, something that you will never forgive me for.

好吧,我是犯罪分子。我所犯的最是好奇心。我的罪过是基于一个人的言行评判一个人,而不是他的长相。我的罪过是我比你聪明,而你大概永远不会原谅我比你聪明。

I am a hacker, and this is my manifesto.  You may stop this individual, but you can’t stop us all… after all, we’re all alike.

我是一名黑客,以上是我的宣言。你可以制止一个个体,但是你阻止不了我们全部…因为,我们黑客都一样。

+++The Mentor+++

署名:导师

(全文完)

from http://coolshell.cn/articles/2439.html

在Linux下实现对Microsoft Access Database(.mdb)查询访问

在Linux下实现对Microsoft Access Database(.mdb)查询访问

You will need the following:
Linux ( I’m running RedHat 9.0)
PHP
Apache
UnixODBC
MDBTools

INSTRUCTIONS
1) Download the UnixODBC RPM, found here. I installed unixODBC version 2.2.5.1.
rpm -ivh unixODBC-2-2.5-1.i386.rpm

2) Download the MDBTools rpm, found here. I installed mdbtools version 0.5.1. Read limitations!
rpm -ivh mdvtools-0.5-1.i386.rpm

3) Download the MDBTools ODBC driver rpm. Again I installed version 0.5-1.i386.rpm. Read limitations!
rpm -ivh mdbtools-odbc-0.5-1.i386.rpm

4) Add the mdbtools driver to your unixODBC config.
Create a new text file. NON-LINUX user: Beware do not do this on windows as you might get werid new lines, use vi.

[MDBToolsODBC]
Description = MDB Tools ODBC drivers
Driver = /usr/lib/libmdbodbc.so.0
Setup =
FileUsage = 1
CPTimeout =
CPReuse =

NOTE: The driver may be in /usr/local/lib/libmdbodbc.so.0. This happens if you build from source and use the make install command. The RPM puts it in /usr/lib.
Now install the driver using the file you created. This is called a template file.
odbcinst -i -d -f template.file

5) Define the datasource name. This is done in the /etc/odbc.ini file. So pull up this file in vi or another text editor and add the following lines.

[Dogs]
Description = Microsoft Access Database of Dogs
Driver = MDBToolsODBC
Database = /var/data/my_dog_db.mdb
Servername = localhost
UserName =
Password =
port = 5432

That’s it you should now have an odbc connection available. I will demonstrate using php, this assumes that your php is compiled with UnixODBC support, the version that ships with Redhat 9 does if yours does not then you can learn how here.

So I will write a quick php script to query my dogs database and print out the names and weights of my dogs.

$myDB = odbc_connect(”Dogs”,”",”");
$query = “select name, weight from dog_list”;
$result = odbc_exec($myDB, $query);
while (odbc_fetch_row($result)) {
print “Name = ” . odbc_result($result,”name”);
print “
Weight = ” . odbc_result($result,”weight”);
}

If you get a php error that says odbc_connect is not a function then see if you have php-odbc installed. Do rpm -qa php-odbc. If you see php-odbc returned then you have it if not install it., the rpm is available on the redhat discs.

Limitations:
- As of the time of writing this entry MDBTools did not support write access to the mdb files. This was fine for my purposes as I was reading data in and sticking it into a mysql database.
- There is a bug in MDBTools v0.5 which does not allow you to query tables or columns with an underscore. This was a bug I hit early on, but it has been fixed in new version 0.6 but that has not been released as of the time of writing this article. So I recompiled the 0.5 source code with the fix from the 0.6 CVS repository. I have bundled it into a 0.5 release and have the two rpms mentioned above here:
mdbtools-0.5-1.i386.rpm
mdbtools-odbc-0.5-1.i386.rpm

I would check the official download site before using my hacked version as I’m sure this bug will be fixed in 0.6 (plus rumor has write access will be present as well).

from http://www.517sou.net/blogview.asp?logID=1069&cateID=12

硬盘分区表的详细结构及自动备份和恢复

本篇题目的发起帖子来自于两个论坛,原帖链接分别如下: http://www.51ct.net/bbs/read.php?tid=500&fpage=1:推荐访问 http://www.cn-dos.net/dosbbs/dispbbs.asp?boardid=9&id=15000

需要参考的两篇资料文章的原链接及内容如下:

===================================================================== 1、硬盘分区结构及windows文件系统结构 =====================================================================

===================================================================== 2、扩展int13h调用详解(点击访问原文)

扩展int13h调用详解 作者:不详·发布日期:2002-12-17·阅读次数:18301

--------------------------------------------------------------------------------

转载自:BBS 水木清华站 (Sat Nov 20 16:12:06 1999)

第一部分 简 介

1,1

一. 硬盘结构简介

1. 硬盘参数释疑

到目前为止, 人们常说的硬盘参数还是古老的 CHS (Cylinder/ Head/Sector)参数. 那么为什么要使用这些参数, 它们的意义是什么? 它们的取值范围是什么? 很久以前, 硬盘的容量还非常小的时候, 人们采用与软盘类似的结 构生产硬盘. 也就是硬盘盘片的每一条磁道都具有相同的扇区数. 由此 产生了所谓的3D参数 (Disk Geometry). 既磁头数(Heads), 柱面数 (Cylinders), 扇区数(Sectors),以及相应的寻址方式.

其中:

磁头数(Heads) 表示硬盘总共有几个磁头,也就是有几面盘片, 最大 为 255 (用 8 个二进制位存储); 柱面数(Cylinders) 表示硬盘每一面盘片上有几条磁道, 最大为 1023 (用 10 个二进制位存储); 扇区数(Sectors) 表示每一条磁道上有几个扇区, 最大为 63 (用 6 个二进制位存储). 每个扇区一般是 512个字节, 理论上讲这不是必须的, 但好象没有取 别的值的.

所以磁盘最大容量为:

255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M = 1048576 Bytes ) 或硬盘厂商常用的单位: 255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M = 1000000 Bytes )

在 CHS 寻址方式中, 磁头, 柱面, 扇区的取值范围分别为 0 到 Heads - 1, 0 到 Cylinders - 1, 1 到 Sectors (注意是从 1 开始).

2. 基本 Int 13H 调用简介

BIOS Int 13H 调用是 BIOS 提供的磁盘基本输入输出中断调用, 它可以 完成磁盘(包括硬盘和软盘)的复位, 读写, 校验, 定位, 诊断, 格式化等功能. 它使用的就是 CHS 寻址方式, 因此最大识能访问 8 GB 左右的硬盘 ( 本文中 如不作特殊说明, 均以 1M = 1048576 字节为单位).

3. 现代硬盘结构简介

在老式硬盘中, 由于每个磁道的扇区数相等, 所以外道的记录密度要远低 于内道, 因此会浪费很多磁盘空间 (与软盘一样). 为了解决这一问题, 进一 步提高硬盘容量, 人们改用等密度结构生产硬盘. 也就是说, 外圈磁道的扇区 比内圈磁道多. 采用这种结构后, 硬盘不再具有实际的3D参数, 寻址方式也改 为线性寻址, 即以扇区为单位进行寻址. 为了与使用3D寻址的老软件兼容 (如使用BIOS Int13H接口的软件), 在硬 盘控制器内部安装了一个地址翻译器, 由它负责将老式3D参数翻译成新的线性 参数. 这也是为什么现在硬盘的3D参数可以有多种选择的原因 (不同的工作模 式, 对应不同的3D参数, 如 LBA, LARGE, NORMAL).

4. 扩展 Int 13H 简介

虽然现代硬盘都已经采用了线性寻址, 但是由于基本 Int 13H 的制约, 使 用 BIOS Int 13H 接口的程序, 如 DOS 等还只能访问 8 G 以内的硬盘空间. 为了打破这一限制, Microsoft 等几家公司制定了扩展 Int 13H 标准 (Extended Int13H), 采用线性寻址方式存取硬盘, 所以突破了 8 G 的限制, 而且还加入了对可拆卸介质 (如活动硬盘) 的支持.

二. Boot Sector 结构简介

1. Boot Sector 的组成

Boot Sector 也就是硬盘的第一个扇区, 它由 MBR (Master Boot Record), DPT (Disk Partition Table) 和 Boot Record ID 三部分组成.

MBR 又称作主引导记录占用 Boot Sector 的前 446 个字节 ( 0 to 0x1BD ), 存放系统主引导程序 (它负责从活动分区中装载并运行系统引导程序). DPT 即主分区表占用 64 个字节 (0x1BE to 0x1FD), 记录了磁盘的基本分区 信息. 主分区表分为四个分区项, 每项 16 字节, 分别记录了每个主分区的信息 (因此最多可以有四个主分区). Boot Record ID 即引导区标记占用两个字节 (0x1FE and 0x1FF), 对于合法 引导区, 它等于 0xAA55, 这是判别引导区是否合法的标志. Boot Sector 的具体结构如下图所示 (参见 NightOwl 大侠的文章):

0000 |------------------------------------------------| | | | | | Master Boot Record | | | | | | 主引导记录(446字节) | | | | | | | 01BD | | 01BE |------------------------------------------------| | | 01CD | 分区信息 1(16字节) | 01CE |------------------------------------------------| | | 01DD | 分区信息 2(16字节) | 01DE |------------------------------------------------| | | 01ED | 分区信息 3(16字节) | 01EE |------------------------------------------------| | | 01FD | 分区信息 4(16字节) | |------------------------------------------------| | 01FE | 01FF | | 55 | AA | |------------------------------------------------|

2. 分区表结构简介

分区表由四个分区项构成, 每一项的结构如下:

BYTE State : 分区状态, 0 = 未激活, 0x80 = 激活 (注意此项) BYTE StartHead : 分区起始磁头号 WORD StartSC : 分区起始扇区和柱面号, 底字节的低6位为扇区号, 高2位为柱面号的第 9,10 位, 高字节为柱面号的低 8 位 BYTE Type : 分区类型, 如 0x0B = FAT32, 0x83 = Linux 等, 00 表示此项未用 BYTE EndHead : 分区结束磁头号 WORD EndSC : 分区结束扇区和柱面号, 定义同前 DWORD Relative : 在线性寻址方式下的分区相对扇区地址 (对于基本分区即为绝对地址) DWORD Sectors : 分区大小 (总扇区数)

注意: 在 DOS / Windows 系统下, 基本分区必须以柱面为单位划分 ( Sectors * Heads 个扇区), 如对于 CHS 为 764/255/63 的硬盘, 分区的 最小尺寸为 255 * 63 * 512 / 1048576 = 7.844 MB.

3. 扩展分区简介

由于主分区表中只能分四个分区, 无法满足需求, 因此设计了一种扩展 分区格式. 基本上说, 扩展分区的信息是以链表形式存放的, 但也有一些特 别的地方. 首先, 主分区表中要有一个基本扩展分区项, 所有扩展分区都隶属于它, 也就是说其他所有扩展分区的空间都必须包括在这个基本扩展分区中. 对于 DOS / Windows 来说, 扩展分区的类型为 0x05. 除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放, 后 一个扩展分区的数据项记录在前一个扩展分区的分区表中, 但两个扩展分区 的空间并不重叠. 扩展分区类似于一个完整的硬盘, 必须进一步分区才能使用. 但每个扩 展分区中只能存在一个其他分区. 此分区在 DOS/Windows 环境中即为逻辑盘. 因此每一个扩展分区的分区表 (同样存储在扩展分区的第一个扇区中)中最多 只能有两个分区数据项(包括下一个扩展分区的数据项). 扩展分区和逻辑盘的示意图如下:

|-----------------------| -------- | 主扩展分区(/dev/hda2) | ^ |-----------------------| | | 扩 展 | 分区项 1 |--\ | | |------------| | | | 分区表 | 分区项 2 |--+--\ | |-----------------------| | | | | | | | | | 逻辑盘 1 (/dev/hda5) |<-/ | | | | | | |-----------------------| | 主 | 扩展分区 2 |<----/ |-----------------------| 扩 | 扩 展 | 分区项 1 |--\ | |------------| | 展 | 分区表 | 分区项 2 |--+--\ |-----------------------| | | 分 | | | | | 逻辑盘 2 (/dev/hda6) |<-/ | 区 | | | | |-----------------------| | | | 扩展分区 3 |<----/ | |-----------------------| | | 扩 展 | 分区项 1 |--\ | | |------------| | | | 分区表 | 分区项 2 | | | |-----------------------| | | | | | | | 逻辑盘 3 (/dev/hda7) |<-/ | | | |

|-----------------------| ---------

三. 系统启动过程简介

系统启动过程主要由一下几步组成(以硬盘启动为例):

1. 开机 :-) 2. BIOS 加电自检 ( Power On Self Test -- POST ) 内存地址为 0ffff:0000 3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector) 读入内存地址 0000:7c00 处. 4. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于 则转去尝试其他启动介质, 如果没有其他启动介质则显示 "No ROM BASIC" 然后死机. 5. 跳转到 0000:7c00 处执行 MBR 中的程序. 6. MBR 首先将自己复制到 0000:0600 处, 然后继续执行. 7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动 分区或有不止一个活动分区, 则转停止. 8. 将活动分区的第一个扇区读入内存地址 0000:7c00 处. 9. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则

显示 "Missing Operating System" 然后停止, 或尝试 软盘启动. 10. 跳转到 0000:7c00 处继续执行特定系统的启动程序. 11. 启动系统 ...

以上步骤中 2,3,4,5 步是由 BIOS 的引导程序完成. 6,7,8,9,10 步由MBR中的引导程序完成.

一般多系统引导程序 (如 SmartFDISK, BootStar, PQBoot 等) 都是将标准主引导记录替换成自己的引导程序, 在运行系统启动程序 之前让用户选择要启动的分区. 而某些系统自带的多系统引导程序 (如 lilo, NT Loader 等) 则可以将自己的引导程序放在系统所处分区的第一个扇区中, 在 Linux 中即为 SuperBlock (其实 SuperBlock 是两个扇区).

注: 以上各步骤中使用的是标准 MBR, 其他多系统引导程序的引导 过程与此不同.

第二部分 技术资料

第一章 扩展 Int13H 技术资料

一. 简介 设计扩展 Int13H 接口的目的是为了扩展 BIOS 的功能, 使其支持 多于1024柱面的硬盘, 以及可移动介质的琐定, 解锁及弹出等功能.

二. 数据结构

1. 数据类型约定 BYTE 1 字节整型 ( 8 位 ) WORD 2 字节整型 ( 16 位 ) DWORD 4 字节整型 ( 32 位 ) QWORD 8 字节整型 ( 64 位 )

2. 磁盘地址数据包 Disk Address Packet (DAP) DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾 越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念. DAP 的结构如下:

struct DiskAddressPacket { BYTE PacketSize; // 数据包尺寸(16字节) BYTE Reserved; // ==0 WORD BlockCount; // 要传输的数据块个数(以扇区为单位) DWORD BufferAddr; // 传输缓冲地址(segment:offset) QWORD BlockNum; // 磁盘起始绝对块地址 };

PacketSize 保存了 DAP 结构的尺寸, 以便将来对其进行扩充. 在 目前使用的扩展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于 16, 扩展 Int13H 将返回错误码( AH=01, CF=1 ). BlockCount 对于输入来说是需要传输的数据块总数, 对于输出来说 是实际传输的数据块个数. BlockCount = 0 表示不传输任何数据块. BufferAddr 是传输数据缓冲区的 32 位地址 (段地址:偏移量). 数据 缓冲区必须位于常规内存以内(1M). BlockNum 表示的是从磁盘开始算起的绝对块地址(以扇区为单位), 与分区无关. 第一个块地址为 0. 一般来说, BlockNum 与 CHS 地址的关系 是: BlockNum = cylinder * NumberOfHeads + head * SectorsPerTrack + sector - 1;

其中 cylinder, head, sector 是 CHS 地址, NumberOfHeads 是磁盘 的磁头数, SectorsPerTrack 是磁盘每磁道的扇区数. 也就是说 BlockNum 是沿着 扇区->磁道->柱面 的顺序记数的. 这一顺 序是由磁盘控制器虚拟的, 磁盘表面数据块的实际排列顺序可能与此不同 (如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序).

3. 驱动器参数数据包 Drive Parameters Packet 驱动器参数数据包是在扩展 Int13H 的取得驱动器参数子功能调用中 使用的数据包. 格式如下: struct DriveParametersPacket { WORD InfoSize; // 数据包尺寸 (26 字节) WORD Flags; // 信息标志 DWORD Cylinders; // 磁盘柱面数 DWORD Heads; // 磁盘磁头数 DWORD SectorsPerTrack; // 每磁道扇区数 QWORD Sectors; // 磁盘总扇区数 WORD SectorSize; // 扇区尺寸 (以字节为单位) }; 信息标志用于返回磁盘的附加信息, 每一位的定义如下:

0 位: 0 = 可能发生 DMA 边界错误 1 = DMA 边界错误将被透明处理 如果这位置 1, 表示 BIOS 将自动处理 DMA 边界错误, 也就是说 错误代码 09H 永远也不会出现.

1 位: 0 = 未提供 CHS 信息 1 = CHS 信息合法 如果块设备的传统 CHS 几何信息不适当的话, 该位将置 0.

2 位: 0 = 驱动器不可移动 1 = 驱动器可移动

3 位: 表示该驱动器是否支持写入时校验.

4 位: 0 = 驱动器不具备介质更换检测线 1 = 驱动器具备介质更换检测线

5 位: 0 = 驱动器不可锁定 1 = 驱动器可以锁定 要存取驱动器号大于 0x80 的可移动驱动器, 该位必须置 1 (某些驱动器号为 0 到 0x7F 的设备也需要置位)

6 位: 0 = CHS 值是当前存储介质的值 (仅对于可移动介质), 如果 驱动器中有存储介质, CHS 值将被返回. 1 = CHS 值是驱动器支持的最大值 (此时驱动器中没有介质).

7 - 15 位: 保留, 必须置 0.

三. 接口规范

1. 寄存器约定 在扩展 Int13H 调用中一般使用如下寄存器约定:

ds:di ==> 磁盘地址数据包( disk address packet ) dl ==> 驱动器号 ah ==> 功能代码 / 返回码

在基本 Int13H 调用中, 0 - 0x7F 之间的驱动器号代表可移动驱动器 0x80 - 0xFF 之间的驱动器号代表固定驱动器. 但在扩展 Int13H 调用中 0x80 - 0xFF 之间还包括一些新出现的可移动驱动器, 比如活动硬盘等. 这些驱动器支持先进的锁定,解锁等功能. ah 返回的错误码除了标准 Int13H 调用规定的基本错误码以外,又增加 了以下错误码:

B0h 驱动器中的介质未被锁定

B1h 驱动器中的介质已经锁定

B2h 介质是可移动的

B3h 介质正在被使用

B4h 锁定记数溢出

B5h 合法的弹出请求失败

2. API 子集介绍 1.x 版的扩展 Int13H 调用中规定了两个主要的 API 子集.

第一个子集提供了访问大硬盘所必须的功能, 包括 检查扩展 In13H 是否存在( 41h ), 扩展读( 42h ), 扩展写( 43h ), 校验扇区( 44h ), 扩展定位( 47h ) 和 取得驱动器参数( 48h ). 第二个子集提供了对软件控制驱动器锁定和弹出的支持, 包括 检查扩展 Int13H 是否存在( 41h ), 锁定/解锁驱动器( 45h ), 弹出驱动器( 46h ), 取得驱动器参数( 48h ), 取得扩展驱动器改变状态( 49h ), int 15h. 如果使用了调用规范中不支持的功能, BIOS 将返回错误码 ah = 01h, CF = 1.

3. API 详解

1) 检验扩展功能是否存在 入口: AH = 41h BX = 55AAh DL = 驱动器号

返回: CF = 0 AH = 扩展功能的主版本号 AL = 内部使用 BX = AA55h CX = API 子集支持位图 CF = 1 AH = 错误码 01h, 无效命令

这个调用检验对特定的驱动器是否存在扩展功能. 如果进位标志置 1 则此驱动器不支持扩展功能. 如果进位标志为 0, 同时 BX = AA55h, 则 存在扩展功能. 此时 CX 的 0 位表示是否支持第一个子集, 1位表示是否 支持第二个子集. 对于 1.x 版的扩展 Int13H 来说, 主版本号 AH = 1. AL 是副版本号, 但这仅限于 BIOS 内部使用, 任何软件不得检查 AL 的值.

2) 扩展读 入口: AH = 42h DL = 驱动器号 DS:DI = 磁盘地址数据包(Disk Address Packet)

返回: CF = 0, AH = 0 成功 CF = 1, AH = 错误码

这个调用将磁盘上的数据读入内存. 如果出现错误, DAP 的 BlockCount 项中则记录了出错前实际读取的数据块个数.

3) 扩展写 入口: AH = 43h AL 0 位 = 0 关闭写校验 1 打开写校验 1 - 7 位保留, 置 0 DL = 驱动器号 DS:DI = 磁盘地址数据包(DAP) 返回: CF = 0, AH = 0 成功 CF = 1, AH = 错误码

这个调用将内存中的数据写入磁盘. 如果打开了写校验选项, 但 BIOS 不支持, 则会返回错误码 AH = 01h, CF = 1. 功能 48h 可以检测BIOS是否 支持写校验. 如果出现错误, DAP 的 BlockCount 项中则记录了出错前实际写入的数 据块个数.

4) 校验扇区 入口: AH = 44h DL = 驱动器号 DS:DI = 磁盘地址数据包(Disk Address Packet)

返回: CF = 0, AH = 0 成功 CF = 1, AH = 错误码

这个调用校验磁盘数据, 但并不将数据读入内存.如果出现错误, DAP 的 BlockCount 项中则记录了出错前实际校验的数据块个数.

5) 锁定/解锁驱动器 入口: AH = 45h AL = 0 锁定驱动器 = 1 驱动器解锁 = 02 返回锁定/解锁状态 = 03h-FFh - 保留 DL = 驱动器号

返回: CF = 0, AH = 0 成功 CF = 1, AH = 错误码

这个调用用来缩定指定驱动器中的介质. 所有标号大于等于 0x80 的可移动驱动器必须支持这个功能. 如果 在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用, 将 会成功返回. 驱动器必须支持最大255次锁定, 在所有锁定被解锁之前, 不能在物理上 将驱动器解锁. 解锁一个未锁定的驱动器,将返回错误码 AH= B0h. 如果锁定一 个已锁定了255次的驱动器, 将返回错误码 AH = B4h. 锁定一个没有介质的驱动器是合法的.

6) 弹出可移动驱动器中的介质 入口: AH = 46h AL = 0 保留 DL = 驱动器号

返回: CF = 0, AH = 0 成功 CF = 1, AH = 错误码

这个调用用来弹出指定的可移动驱动器中的介质. 所有标号大于等于 0x80 的可移动驱动器必须支持这个功能. 如果 在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用, 将 会返回错误码 AH = B2h (介质不可移动). 如果试图弹出一个被锁定的介质 将返回错误码 AH = B1h (介质被锁定). 如果试图弹出一个没有介质的驱动器, 则返回错误码 Ah = 31h (驱动器 中没有介质). 如果试图弹出一个未锁定的可移动驱动器中的介质, Int13h会调用 Int15h (AH = 52h) 来检查弹出请求能否执行. 如果弹出请求被拒绝则返回错误码(同 Int15h). 如果弹出请求被接受,但出现了其他错误, 则返回错误码 AH = B5h.

7) 扩展定位 入口: AH = 47h DL = 驱动器号 DS:DI = 磁盘地址数据包(Disk Address Packet)

返回: CF = 0, AH = 0 成功 CF = 1, AH = 错误码

这个调用将磁头定位到指定扇区.

8) 取得驱动器参数 入口: AH = 48h DL = 驱动器号 DS:DI = 返回数据缓冲区地址

返回: CF = 0, AH = 0 成功 DS:DI 驱动器参数数据包地址, (参见前面的文章) CF = 1, AH = 错误码

这个调用返回指定驱动器的参数.

9) 取得扩展驱动器介质更换检测线状态 入口: AH = 49h DL = 驱动器号

返回: CF = 0, AH = 0 介质未更换 CF = 1, AH = 06h 介质可能已更换

这个调用返回指定驱动器的介质更换状态. 这个调用与 Int13h AH = 16h 子功能调用相同, 只是允许任何驱动器 标号. 如果对一台支持可移动介质功能子集的固定驱动器使用此功能,则永远 返回 CF = 0, AH = 0. 简单地将可移动介质锁定再解锁就可以激活检测线, 而无须真正更换介质.

10) Int 15h 可移动介质弹出支持 入口: AH = 52h DL = 驱动器号 返回: CF = 0, AH = 0 弹出请求可能可以执行 CF = 1, AH = 错误码 B1h 或 B3h 弹出请求不能执行

这个调用是由 Int13h AH=46h 弹出介质功能调用内部使用的.

=================================

crshen网友提供的第一个版本的自动备份和恢复硬盘分区表的C源程序:

[code] #include <stdio.h> #include <bios.h>

#define READ 2 #define WRITE 3

void ShowHelp() { printf("\nHD SECTOR BACKUP & RESTORE TOOLS by CRSHEN\n\n\ Usage: hdsect.exe drive head track sector filename parameter\n\ drive: 1=first HD 2=second HD and so on\n\ head track sector MUST be integer\n\ parameter: /b means backup /r means restore, *case sensitive*\n"); }

void main(int argc,char *argv[]) { int drive=0x80,head=0,track=0,sector=1,nsects=1; unsigned char buf[512]; FILE *fp;

drive=0x80+atoi(argv[1])-1; head=atoi(argv[2]); track=atoi(argv[3]); sector=atoi(argv[4]);

if (argc!=7) { ShowHelp(); exit(2); } if (strcmp(argv[6],"/b")==0) { if (biosdisk(READ,drive,head,track,sector,nsects,buf)) { printf("Failed to read from sector !\n"); exit(1); } if ((fp=fopen(argv[5],"wb"))!=NULL) { fwrite(buf,512,1,fp); fclose(fp); printf("Backup sector to file %s done !\n",argv[5]); exit(0); } else { printf("Open File %s Failed !\n",argv[5]); exit(1); } } if (strcmp(argv[6],"/r")==0) { if ((fp=fopen(argv[5],"rb"))!=NULL) { fread(buf,512,1,fp); fclose(fp); } else { printf("Open File %s Failed !\n",argv[5]); exit(1); } if (biosdisk(WRITE,drive,head,track,sector,nsects,buf)) { printf("Failed to write to sector !\n"); exit(1); } else { printf("Restore sector from file %s done !",argv[5]); exit(0); } } } [/code]

=================================================

crshen网友提供的第二个版本的自动备份和恢复硬盘分区表的C源程序:
以下内容为程序代码:

#include <stdio.h>
#include <bios.h>
#include <dos.h> 

#define READ 2
#define WRITE 3
#define READ_EXT 0x42
#define WRITE_EXT 0x43
#define HD1st 0x80

void ShowHelp();
/*显示帮助信息*/

short _diskop (unsigned char drv, unsigned char cmd,unsigned char verify,unsigned char * buffer, unsigned long startlow, unsigned short copyblks);
/*采用扩展int 13读写扇区*/

short _OldINT13(unsigned char cmd,unsigned char * buffer,unsigned char drv,unsigned char head,unsigned char sector,unsigned char cylinder);
/*老的int 13中断读写扇区,兼容旧机子*/

long cal_add(FILE *fp, int ignore);
/*累加法校验文件*/

void main(int argc,char *argv[])
{
  unsigned char buf[512],tempbuf[512];
  unsigned long StartSector;
  long add;
  int ch,mark,test;
  FILE *fp;

  if (argc!=3)
  {
    ShowHelp();
    exit(6);             /*返回6,帮助信息*/
  }
  /*下面为备份分区信息*/
  if (strcmp(argv[1],"/backup")==0)
  {
    if (biosdisk(READ,HD1st,0,0,1,1,buf))
    {
        printf("Failed to read from sector 0!\n");
        exit(3);           /*返回3,读0扇区出错*/
    }
    if ((fp=fopen(argv[2],"wb"))!=NULL)
        fwrite(buf,512,1,fp);
    else
    {
        printf("Failed to creat file:%s\n",argv[2]);
        exit(1);           /*返回1,磁盘写保护?*/
    }
    for (mark=450;buf[mark]!=0 && mark<512;mark+=16)
    {
        StartSector=buf[mark+7]*16777216L+buf[mark+6]*65536L+buf[mark+5]*256L+buf[mark+4];
        test=_diskop (HD1st, READ_EXT, 0, tempbuf, StartSector, 1);
        if (test!=0)
      {
          printf("READ_EXT ERROR Number: %d\n",test);       /*查看出错信息代码*/
          _OldINT13(READ,tempbuf,HD1st,buf[mark-3],buf[mark-2],buf[mark-1]); /*出错可能为主板不支持扩展int 13,改用老的int 13*/
      }
        fwrite(tempbuf,512,1,fp);
    }
    fclose(fp);

    fp=fopen(argv[2],"ab+");       /*在文件尾部写入校验信息*/
    add=cal_add(fp, 0);
    fseek(fp,0L,SEEK_END);
    ch=add&0xFF;
    fputc(ch,fp);
    add/=0x100;
    ch=add&0xFF;
    fputc(ch,fp);       /*校验信息为文件字节累积和的低4位*/
    fclose(fp);
    exit(0);       /*返回0,操作成功*/
  }
  /*下面为恢复分区信息*/
  if (strcmp(argv[1],"/restore")==0)
  {
    if ((fp=fopen(argv[2],"rb"))!=NULL)
    {
        add=cal_add(fp, 2);
        fseek(fp,-2L,SEEK_END);
        ch=add&0xFF;
        if (ch!=fgetc(fp))         /*首先校验文件正确性*/
      {
          printf("File %s may be wrong !\n",argv[2]);
          exit(5);     /*返回5,文件校验出错*/
      }
        add/=0x100;
        ch=add&0xFF;
        if (ch!=fgetc(fp))
      {
          printf("File %s may be wrong !\n",argv[2]);
          exit(5);
      }
        rewind(fp);
        fread(buf,512,1,fp);
    }
    else
    {
        printf("Failed to open file:%s\n",argv[2]);
        exit(2);     /*返回2,备份文件不存在*/
    }
    if (biosdisk(WRITE,HD1st,0,0,1,1,buf))
    {
        printf("Failed to write to sector 0!\n");
        exit(4);     /*返回4,写扇区0出错*/
    }
    for (mark=450;buf[mark]!=0 && mark<512;mark+=16)
    {
        fread(tempbuf,512,1,fp);
        StartSector=buf[mark+7]*16777216L+buf[mark+6]*65536L+buf[mark+5]*256L+buf[mark+4];
        /*printf("Write sector...\n");*/
        /**/
        test=_diskop (HD1st, WRITE_EXT, 1, tempbuf, StartSector, 1);
        if (test!=0)   /*写扇区出错*/
      {
          test=_diskop (HD1st, WRITE_EXT, 2, tempbuf, StartSector, 1);
          if (test==1)   /*校验与不校验下,两种写入方式均提示invalid function,考虑为主板不支持扩展int 13*/
            _OldINT13(WRITE,tempbuf,HD1st,buf[mark-3],buf[mark-2],buf[mark-1]);
      }
    }
    fclose(fp);
    exit(0);       /*返回0,操作成功*/
  }
  /*下面为重新设置文件校验值*/
  if (strcmp(argv[1],"/checksum")==0)
  if ((fp=fopen(argv[2],"rb+"))!=NULL)
  {
    add=cal_add(fp, 2);
    fseek(fp,-2L,SEEK_END);
    if (fgetc(fp)==0x55 && fgetc(fp)==0xAA)
        printf("Can not checksum of this file (end of 55AA)\n");
    else
    {
        fseek(fp,-2L,SEEK_END);
        ch=add&0xFF;
        fputc(ch,fp);
        add/=0x100;
        ch=add&0xFF;
        fputc(ch,fp);
        fclose(fp);
        printf("Re_Check file: %s done\n",argv[2]);
    }
  }
  else
  {
    printf("Failed to open file:%s\n",argv[2]);
    exit(2);
  }
}

short _OldINT13(unsigned char cmd,unsigned char * buffer,unsigned char drv,unsigned char head,unsigned char sector,unsigned char cylinder)
{
  asm push ds
    asm mov ah,cmd
    asm mov al,1h
    asm mov bx,buffer
    asm mov ch,cylinder
    asm mov cl,sector
    asm mov dh,head
    asm mov dl,drv
    asm int 13h
    asm pop ds
    asm jc error
    return (1);
  error:
    return (-1);
}

short _diskop (unsigned char drv, unsigned char cmd,unsigned char verify,unsigned char * buffer, unsigned long startlow, unsigned short copyblks)
{   /* 磁盘存取数据包结构 */
  struct disk_address_packet
  {
    unsigned char size_of_packet;
    unsigned char reserved;
    unsigned short number_of_blocks_to_transfer;
    unsigned short transfer_buffer_offset;
    unsigned short transfer_buffer_segment;
    unsigned long starting_absolute_block_low;
    unsigned long starting_absolute_block_high;
  };
  struct disk_address_packet dap;
  unsigned char av;
  unsigned char * pt = (unsigned char *) &dap;
  dap.size_of_packet = sizeof (dap);
  dap.reserved = 0;
  dap.number_of_blocks_to_transfer = copyblks;
  dap.transfer_buffer_offset = FP_OFF(buffer);
  dap.transfer_buffer_segment = FP_SEG(buffer);
  dap.starting_absolute_block_low = startlow;
  dap.starting_absolute_block_high = 0; /* 忽略高位 */

  asm push ds
    asm push si
    asm mov ah, cmd
    asm mov al,verify
    asm mov dl, drv
    asm lds si, DWORD PTR pt
    asm int 13h
    asm pop si
    asm pop ds
    asm mov av, ah
    asm jc error
  /*return (dap.number_of_blocks_to_transfer); 返回成功读写的扇区数目*/
    return(0);
  error:
  /*ErrorNum = av;出错信息代码*/
    return (av);
}

long cal_add(FILE *fp, int ignore)
{
  long filelength,add=0;
  fseek(fp,0L,SEEK_END);
  filelength=ftell(fp)-ignore;
  rewind(fp);
  while (filelength--!=0)
    add+=fgetc(fp);   /*文件字节累积求和*/
  return(add);
}

void ShowHelp()
{
  printf("\n=== PATITION TABLE BACKUP & RESTORE TOOLS by CRSHEN ===\n\n\
  Usage: patition.exe </backup|/restore|/checksum> filename\n");
}

----------------------

from http://nufans.net/dvbbs/dispbbs.asp?boardID=1&ID=544&page=3

无线破解利器:Aircrack-ng for Windows下载[附使用教程说明文档]

windows下强大的无线破解软件 Aircrack-ng for Windows 多个版本的下载

aircrack-ng-1.1-win (目前2010-10-10官方最新稳定版本)

aircrack-ng-1.0-rc1-win (上一个版本)

aircrack-ng-0.3-win(比较老的版本,如有兴趣可以试用)

最新版本可以从官方下载,http://download.aircrack-ng.org/

以下是使用教程说明文档

Aircrack-ng (WEP, WPA-PSK Crack)/教程使用用法破解
aircrack-ng 系列工具使用参考(BT,backtrack)
使用bt4(Backtrack)破解无线路由(无线网络/无线AP)密码/wep加密/Aircrack-ng
无线破解攻击工具Aircrack-ng使用详解/破解无线路由AP密码
无线安全及Aircrack-ng for Windows破解无线wep,wap密码(附图)/下载 教程 使用 用法 破解

王垠:完全用 GNU/Linux 工作

完全用 GNU/Linux 工作
理解 GNU/Linux

注:本文是清华“牛仔”王垠的“成名作”,在网上引起很大的争议。对他崇拜地五体投地者有,对他嗤之以鼻者也有,总之成了一年多以前Linux 爱好者的圈子里的一个很有意思的现象。之后他对这篇文章进行了很大的修改,已经没有了原来那种意气风发。现存的版本如白开水一般无味,请参 见:http://learn.tsinghua.edu.cn/homepage/2001315450/
尽管他原来的观点有所偏激,但我还是很欣赏他原来的风格。

“UNIX 是简单的,你不需要成为天才也能理解这种简单。”
由于GNU/Linux这个词太长,下面如果没有特别指明,“Linux”就是指“GNU/Linux”。

在这个年代,恐怕没有人需要我来介绍 Linux 是什么了吧?如果你觉得“Linux 只不过是跟 DOS 差不多的东西”,那你恐怕很久在山洞里没见天日了吧?请问问你旁边的 Linux 用户,Linux 到底是个什么地位?

那为什么我还要写一篇这样的文章?因为,我发现还有很多人不不理解 Linux 和 UNIX,虽然他们也在用它,但是他们有时会问:“为什么 Linux 不能像 Windows 那样 ……?”,“怎么Redhat Linux不能 mount NTFS 分区!”,“Linux下用什么整理硬盘?”,“什么时候OpenOffice才能完全兼容Word文件啊?”,“现在还有什么Windows能干的事情 Linux干不了的?”……

他们有40G的硬盘,却只为 Linux 分配了2G空间,有时还抱怨“这个东西怎么占这么多硬盘!” 似乎 Windows该占用大部分硬盘。他们把重要的数据装在Windows的分区,似乎信不过 Linux。他们总是到处寻找新奇的,好看的GUI程序,对命令行的东西一概不屑一顾。他们对Drag&Drop,菜单配置,自动升级非常感兴 趣。他们如果找到一个很像 Windows 程序的 Linux 程序,一定会很高兴的说:“哈哈!Linux 也能……了!” 如果Linux在某种测试中胜过Windows,他们会高兴得跳起来。他们没有办法用Linux解决问题的时候,甚至用Wine来运行Windows程 序。有时实在没办法,只好重起到 Windows,或者干脆省得麻烦,在 Windows 下装一个 VMWare 虚拟一个 Linux 玩。

你支持 Linux,你喜欢 Linux,你能从中感觉到快乐,这非常好。你现在只需要明白的是:Linux 从来就不是一个玩具,它是天才UNIX的后代。UNIX 是自晶体管发明以来最伟大的发明,它从诞生那一天开始就比 Windows 的设计出色。Linux 并不需要追赶 Windows,不需要打垮微软,它的最终目标是改变整个计算机世界,还人们自由,给人们乐趣和方便。其它UNIX很多都已经败在Linux脚下,更何况 Windows!

你如果出现了以上的情况,说明你的思想受到了 Windows 的某种潜移默化的影响和误导。你没有能够从本质上理解存在于 Linux 身上的 UNIX 思想。UNIX的设计者 Dennis Ritchie 说:“Unix is simple. It just takes a genius to understand its simplicity.” 但是我不这么认为,因为我不是一个天才,但是我却勇敢的把Windows完全删除掉,半年之后我体会到了 UNIX 的思想和好处。因为我相信这样的信念:“Windows 能办到的事 Linux 一定能办到,而且办的更好。”

这小节开头的话应该改成:“Unix 是简单的,但是在这个冲斥着 Windows 错误观念的世界,你需要信念和勇气才能理解它的简单!” 我下面就告诉你一些我理解到的东西。

微软的地位

微软的名声在欧洲和美国的大学里,特别是在计算机系里之坏,大家可能有所耳闻。我认识的 MIT,Stanford 的教授,贝尔实验室的专家,甚至一个欧洲小国的高中计算机老师都绝口不提微软的名字。在他们眼里,微软只是一个没有真技术,专靠在落后国家商业宣传和垄断 经营的小公司。这个“小”并不是说它人少,钱少,而是说它先进技术少。

我上次和王益合作写了一个算法演示程序,那个算法是贝尔实验室一位科学家Steven Fortune很天才的发明,为了程序能够被身边大多数人使用,我们选择了 VC+MFC 作为平台。我在分析算法时还得到 Fortune 很热情的鼓励,寄给我一份资料,还多次回信耐心的给我讲解了很多细节。但是程序完成之后,我把样品发给 Fortune,他回信说:“对不起。我机器上没有 MFC。” 话说的很客气,但是我已经感觉到了他对 Windows 的不屑。然后我把 MFC 静态编译进程序再发给他,他就没有再回信了。他显然不是瞧不起我,而是确实有难处。

你能感觉到这位科学家对微软和 Windows 是什么态度了吧?不是反感,而是他心里根本没有 Windows 这个东西!微软在高科技领域没有发展,那么它怎么生存呢?到发展中国家去发展一下,他们的人民还对电脑一无所知,我说不定甚至可以打入大学的计算机系呢。 我送他们软件,我捐钱盖大楼,我出钱找图灵奖获得者来演讲,让他们觉得我们都是科学家!

好了,现在全国的大学包括清华,几乎所有人机器必装盗版 Win2000,Office XP,学校的选课系统是非IE不能正确浏览,论文用 Word 编辑,演示用ppt做,email 的通知附件是 doc 文件,你不用 Word 打不开,连 863 项目都用 VC 写程序了。我很久以前就看到一份报纸说,“微软为什么不严厉打击盗版?” 这篇文章说,微软非但不打击中国的盗版行为,而且有放任之趋势。放长线吊大鱼,“以后我要你们加倍的来还我!” 确实如此,它的目的快实现了。

Windows 笼罩下的中国计算机教育

说句丢脸的话,比尔盖茨很久以前是我的偶像…… //blush

在中国,比尔盖茨被很多人奉为神圣,“少年电脑天才”,甚至有的人提到他的名字就做出“抱拳对天”的姿势。很多人谈到微软的“新技术”,“高科技” 都是眉飞色舞。各种“VC编程圣经”,“深入了解 Visual C++”之类的书,在开头几页都会出现非常肉麻的字眼,“在那团团的混沌中,一个开天辟地的精灵,Windows 1.0,诞生了……”

微软的软件被这么多人盗用,那么人们是怎样使用这些盗版程序的呢?先看看电脑培训班,教的都是一些 DOS 命令,打字,Windows 基本操作,Word 文档处理,PowerPoint,高级班可能有 Excel,Access…… 参加各种微软认证考试,MCSE,MSDE 的人络绎不绝。考试辅导班都贴出了“280元,考过为止”之类的字样。考试参考资料更是昂贵,有些电脑书店整整两书架都是“Microsoft Press”的东西。我有个同学参加认证考试,每门考试都要200多元。而且你一次考不过可以再考,又要交钱。他后来还津津乐道跟我说,看我,花了 XXXX(一个四位数)元考过了微软认证,得到一张比尔盖茨亲笔签名的证书和价值6000元的 Windows XP 内部发行版。

“电脑要从娃娃抓起”,我们再来看看娃娃们学的是什么。大部分家长给孩子买了电脑之后,他们首先就会装一个盗版的 Windows,然后买来盗版的游戏开始玩。如果哪个孩子会用 Delphi 编程序,那可不得了。报社记者,电视台争相报导,说,某某学校的初中生某某,在别人都还在玩电脑游戏这种“初级阶段”的时候就已经用 Delphi 写程序了。镜头还瞄准了他显示器上面的像框中的比尔盖茨头像!

我刚进入大学计算机系时还不懂得什么是操作系统,因为我以前只用过“中华学习机”。看到新入学的同学们各个谈论的都是 “Windows 95”,“VC”…… 我简直觉得我落后了好几十年一样,整个一土人,根本跟他们答不上话。好不容易找到一个比较熟的同学问了一下:“你们天天谈论的瘟95是什么啊?” 答:“win95就是一个操作系统,跟DOS是一类。”“朵死是什么?” “你连DOS都不知道是什么?别在计算机系混了。” 学校上课当然不讲VC编程之类的东西,但是上 Pascal 的老师有一次就说:“嗨,我们学校真是落后。现在别人都用 C, C++,甚至 VC 了,我们还在讲 Pascal。不知道什么时候才能有VC课啊。你们出去也是要用VC的,只好自学了。” 于是,有些同学很多时候上课都捧着一本很重的“Windows 编程大全”之类的书,根本没有听课。吃饭时就念念有词的跟我说,“代码的优化是无止境的”,“匈牙利命名法真是伟大的发明” …… 这就是中国很多大学计算机系的情况。

感觉到无知了?这不是偶然的,而是微软长久以来埋下的伏笔。它要让无知的大家都把它奉为神圣,它要让支持UNIX,Xwindow的人一旦说 UNIX 好,Xwindow 好的时候,都被一群人围着说教:“这个 Windows 也能做到”,“你对 Windows 有偏见”,“微软才是主流啊”,“你敢瞧不起 win2k?”,“.NET 就是世界潮流”,“微软的毕竟是新技术”,“有钱就是有技术”…… 甚至在一番论战比较后败下来还是要说:“Windows 性能差点,但是易用性强”,“Windows 是老百姓用的,要求别那么高”,“微软那么有钱,以后想超过 UNIX 还不容易吗?”……

发达国家的计算机教育

我前段时间在 USENET 发文问有关 Scheme 语言的问题时,认识了一位丹麦人。他解决了我所有的问题,并且建议我阅读一些很“深奥”的有关程序语言语法,文法的书,他告诉我很多网站可以学习 LISP,Scheme,人工智能,算法。他叫我看 Jonathan Rees 的论文 "Syntactic Closures"。他还打包给我寄过来一份 MIT 的 "How to Design Programs"。他说他在自己的 PC 机上装的是 Linux,他用 Emacs 编辑,运行 Scheme 程序。他对 Emacs 的了解和爱好真是使人惊讶。他大学本科毕业时做的毕业设计是一个 Scheme 解释器。这对于我来说是望尘末及了。

他是那么的不厌其烦,我的每一个问题他都详细的回答。我有时都觉得过于详细了,怎么这么耐心啊?我觉得他似乎是我的高中老师。他是什么样的人呢?我好奇的打听了他的情况。原来,她是丹麦一所普通高中的计算机老师,而且是个女老师!

她说她在高中里讲授程序设计和算法,计算机语言文法。她说用 Scheme,她的学生不用再为内存泄漏等程序语言本身的问题而烦恼,而专注于问题和算法本身。有利于培养学生解决问题的能力,特别是用计算机解决数学问题的能力。

天哪!为什么欧洲出现那么多数学家,几何学家?你看看别人重视的是什么!我们的计算机教育如果继续这样下去,只会沿着弯路越走越远!

微软和它的朋友们的如意算盘

下面来看看微软的收入是怎么来的。首先,Windows 98系列操作系统,一个就是 100 多美元,每次升级又是几乎同样的价钱。Windows NT 还要贵几倍,而且有用户数目限制,5个用户的,10个用户的…… 以后如果要增加用户数目还要按比例付钱。这个奇怪的现象被通用汽车公司的总裁比喻为:“你买的微软牌汽车最开头只有一个座位,每加一个座位你得向汽车公司 付钱,每开100英里要大修一次,每过一年要换一次引擎。”

花了如此多钱买来的操作系统就能用了吗?它竟然连压缩程序都没有提供!你装上 Windows 之后一般第一件事就是去下载一个 WinZip 吧,“只要 29 美元”。Windows 会中病毒啊,马上花 70 美元买一个 Norton AntiVirus 吧。还有黑客呢?再买一个 Norton Internet Security 好了,100 美元。系统需要优化,磁盘需要整理,买一个 Norton System Works 是你最佳的解决方案,100美元。

可是你现在还是不能干正事啊!你想要一个 Word, PowerPoint?那就买一套 Office XP 吧,一起买便宜些,9.90。

那些程序不会用啊!那些菜单怎么设置,到底有什么功能啊?看“帮助”也学不会。买本书看看吧,我推荐“Special Edition Using Microsoft Office XP”,不贵,.99。这本书里面大部分是屏幕抓图,还是买一本旧的比较划算,.85。

你如果只是当个秘书,上面的差不多还凑合了。可是你有更高的追求,你想成为 Windows 程序员。首先买一个 Visual Studio.NET 吧,要不然怎么编译程序。4.95。

为了紧跟微软动向,世界潮流,不能不注册个 MSDN 什么的吧?这个贵一点,不过物有所值啊,,799。

嗯,你现在已经是上层阶级,白领人士了。你现在可以像这样“自由”的,“安全”的生活了:

什么是 Windows 能干而 Linux 干不了的事情?

“Windows 能干而 Linux 干不了的事情,那就是不需要干的事情。”

有个朋友看我半年没有用 Windows,有时就会问我:“你只用 Linux,有没有发现有些 Windows 能处理的事情 Linux 干不了?”

我回答说:“Windows 能干而 Linux 干不了的事情,那就是不需要干的事情。”
Windows 能做的有益的事情 Linux 都能做

Windows 下的某些功能确实是我们需要的,那么 Linux 的开发者们和用户也需要这种功能,他们就会去实现这种功能,而且比Windows 的方式好得多。由于大多数科学家,工程师用的都是 Linux 或者某种商业 UNIX, 所以几乎所有商业的科学工程程序,比如Matlab, Mathematica, AutoCAD, Candence的,Synopsys的,Avant! 的……全都是先有 UNIX 的版本(包括Linux),然后再考虑移植给 Windows,甚至根本不移植给 Windows,因为 Windows 的机器一般没有足够的能力运行这样的程序。你不要以为只有 Windows 才有 PSpice, UNIX 的 HSpice 要好得多,而且可以运行在大型主机上。当然它们不是免费的,但是它们值那个价钱。

但是 Windows 下有些东西在 Linux 下没有很相似的,或者你找到很多类似的,但是它们每一个比起 Windows 的那个程序都要差很多,那么原因有两种可能性:

1. 有一个完全类似的程序,但是由于它乍一看不漂亮,被你忽略了。

而其它程序虽然看起来很漂亮,但是它们是一些初学编程的人写的。现在由于 Gtk+, Qt 的诞生,Linux 下开发图形界面程序极其简单,很多初中生甚至小学生都可以随手编出一些漂亮不中用的程序。如果你整天寻找这样的程序挑来挑去,永远也找不到你满意的。

我曾经也犯过这样的错误,优秀的 FVWM, lftp, Mutt, wget 都被我忽略过!当我找回它们的时候,我是那么的羞愧不已,它们现在都是我的朋友 :) 用这些程序你可以改变它们的一切,我第一次看到 FVWM 觉得它只不过是一个有很厚很难看边框的东西。可是现在,我的同学看到 FVWM 都说:“哇!真漂亮。”

2. 有另一种完全不同的方式可以达到相同的目的,甚至更好。

很多人很关心 Open Office, Star Office, AbiWord, ... 他们多么盼望有一天某一个 Linux 程序能够完全兼容的打开一个复杂的 doc 文档。但是你永远也不可能有那一天。为什么呢?因为微软为了占有市场,必定不会让其它系统的程序能够完全兼容它的文档格式!它一定会不断变化 doc 文档的内部结构,隐藏一些秘密,让其它公司的程序打开 doc 文档时总是有某种问题,从而你必需购买 Microsoft Office 和Windows。

你应该想一下,那么多的高智商的大学教授,科学家,学生,他们用的都是 Linux 或者其它类型的 UNIX,他们没有 Word 可用,怎么处理文档呢?这么多年没有一个像 Open Office 的程序出现,难道大家没有办法写文档吗?

显然不是这样。你看看那些高水平的学术杂志,论文,那些大学教授的网页,那些漂亮的PDF幻灯片,它们是什么做的?原来 UNIX 用户早就有非常方便的 troff, LaTeX, SGML 等东西可以处理文档,而且它们比起 Word 都要高明的多。Word 显然被这些大拿忽略了,以至于很久以来没有人想在 Linux 下开发一个类似 Word 的程序,除非某些公司想抢微软的饭碗。

很多人留着 Windows 在硬盘上的原因无非是为了用 Word 和 PowerPoint。你待会儿可以看看我的TeX网页,你就会知道为什么我可以完全离开 Windows.

Windows 能做的那些没用的事情 Linux 永远做不好

1. 电脑游戏

有些人说 Linux 下不能玩 Windows 下所能得到的所有游戏。的确,Linux 下虽然也有少量的游戏,比如 Quake。但是它没有 Counter Strike, 没有 Star Craft, ……

并不是说电脑游戏不该玩,但是应该适可而止。电脑是用来处理事务,帮助你学习,解决问题的工具,而不是一个玩具!整天沉迷于电脑游戏中,而不出去感觉外面的世界,你会变得越来越冷酷,越来越缺乏人情味。你与真实的世界越来越远。

你可以在 CS 里杀人,你可以在 Tomb Raider 里探险,你甚至可以在 Tony Hawk's Pro Skaters 里滑板…… 但是 It's not real!你虽然有很高的“反恐技巧”,但是遇到歹徒的时候,你是那么的怯懦;你虽然控制 Laura 伸手敏捷,但是你打篮球的时候怎么总是被人断球?你虽然可以轻易的在 THPS 里作出一个 "360 kickflip to hangten grind to fakie",但是你踩在自己的滑板上的时候还不会 ollie!

说回来,如果你偶尔玩一下电脑游戏未尝不可。但是世界上有远比 Windows + PC 更好的游戏方式。Sony 的 PlayStation2, SEGA 的 DreamCast, Nintendo 的 N64,Namco 的街机……每一个都比 Windows 游戏精彩,每一个都有如此高的3D性能,以至于 Pentium4, Itanium + GForce4 都无法与它们比美!

Linux 的用户们都是关心解决世界的关键问题的份子,他们哪里有时间用自己的机器来玩游戏啊?他们每天用Linux高效的做完自己的工作就到阳光下享受自然去了。 要玩游戏也是玩一些类似推箱子,贪吃蛇之类的智力小游戏。所以,你知道为什么 Linux 几乎没有游戏了吧?:)

2. “整理硬盘,优化系统”

这是一个非常有意思的话题,仅次于有关“病毒”的话题。相信很多 Windows 用户都有整理硬盘的经历。在很多 Windows 用户眼里,“硬盘用久了,会出现碎片,速度会减慢,需要一个程序来整理,整理硬盘的时候不要做其它工作”,这好像是天经地义的事情。

我也曾经津津有味的看着 Norton Defrag 一点一点的把我的硬盘排序,调整,用图形的方式显示出来,然后报告:“100% 没有碎片。你的硬盘现在已经达到最佳状态。” 我现在才发觉我那时是多么的幼稚。

Linux 和 UNIX 用户似乎从来没有“整理硬盘”这种说法呢?你觉得很奇怪吗?如果你觉得很奇怪,那说明你的思想在某种程度上被微软的垃圾程序禁锢了。你需要明白,UNIX 的大型主机很多必须是一天24小时,一年365又1/4天不停运转的,要是每个星期都要整理一次硬盘,在整理的时候几乎不能干任何事情,那是绝对行不通 的!

Linux 机器根本不用整理硬盘,这就是为什么没有看到过 Linux 用户整理硬盘。Linux 的文件系统是比 Windows 的 FAT, FAT32, NTFS 高明得多的文件系统,它们不但可以对文件设置权限,实施完全的保护,而且可以“越用越整齐”,“越用碎片越少”!你应该把文件大部分放在 Linux 的分区,而不是 Windows 分区,因为它比 Windows 分区可靠得多。

还有更滑稽的事情就是有很多“Norton System Doctor”,“Windows 优化大师”,“超级兔仔注册表魔法” 之类的程序存在,而且价格昂贵。似乎一个操作系统本来应该有很多问题,需要别的厂商做程序来“优化”它,而且为了得到优化,你需要付钱!这些问题 Linux 根本就没有,所以不需要什么优化。Linux 内核本身就是高度优化的。

3. IDE

有些人在抱怨为什么 Linux 没有一个良好的 IDE 开发环境。Linux 现在已经有一些 IDE 了,但是总是有很多问题。你是不是正在寻找,正在期望 Linux 某一天可以有一个VC那样的开发环境?你有没有发现你正在进入微软给你设下的怪圈?你为什么一定要用 IDE?你说:“IDE 开发迅速,调试方便,适合大型程序……” 那说明微软的程序在你脑子里已经比较根深蒂固,你需要好好清醒一下了,看看我来告诉你。

高明的 UNIX 程序员不用 IDE,IDE 从来就是给初级 Windows 程序员用的。

你看看大型的 UNIX 程序,包括 Linux 内核,各种网络服务程序,Xwindow 程序在内,哪一个是 IDE 搞出来的?我们实验室的 EDA 程序也没有一个是 IDE 弄的,我还知道 Candence, Synopsys,Mentor 的高性能的图形界面 EDA 程序也都不是 IDE 写的。你信不信,微软的人在写 Windows 本身的时候也根本不用 IDE!

有一次某杂志采访一些出名的 Linux 内核程序员,包括 Linus 在内,没有一个人用 IDE,有的人用 VIM,有的用 Emacs,只有 Linus 说“GNU Emacs is evil”,但是其实他用的是一种跟 Emacs 有同样键绑定功能的 MicroEmacs。大家都是用编辑器编辑了程序文件,然后用 make 这样的自动工具调用 gcc 编译器完成编译工作的。

我以前也编过 Windows 程序:应用程序,驱动程序。但是我没有用 VC 的 IDE。Linux 教育了我,我会在命令行调用 CL,我知道 CL 才是 VC 的编译器。我可以在 cygwin 的 Makefile 里使用 CL。我还知道 CL 的参数都有什么用处。但是这些不是一个从一开头就用 IDE 的人能很快理解到的。

我相信: IDE is evil。我有一些用 Windows 的 IDE 写程序的朋友,他们对那套东西已经很精通了。但是我却惊奇的发现,他们竟然把编译器和汇编器的概念都分不清楚,甚至有的人连“编辑器”和“编译器”都搞混 淆了!他们只知道在一个窗口里输入了代码,点击一个按钮就可以编译程序,但是这里面到底是怎么工作的,他们不知道!他们被盖在上面的窗口挡住了视线,甚至 会以为那个按钮就是编译器!

他们对那些 IDE 的热键背的滚瓜烂熟,但是我却看到他们在一个函数一个函数的把别人的 ANSI 风格的代码变成 VC 的风格。想想这件事在 VIM 里有多么简单,一瞬间就可以搞定。

为什么 UNIX 程序员不用 IDE?明白了这个道理你就能体会到 UNIX 的设计思想了。首先,一个 IDE 集成了编辑器,编译器,汇编器,调试器,跟踪器…… 这个编辑器功能肯定比不上 VIM 或 Emacs,编译器比不上 GCC,汇编器比不上 as,调试器比不上 gdb, ddd, 跟踪器比不上 strace, ltrace, truss。你得到的是一套整合的低能的程序。如果你对调试器的功能不满意,你只好换用另外一套 IDE,但是这套 IDE 的热键,菜单,编辑器功能,按钮…… 跟原来那个有很大不同。你不得不花很多时间来熟悉新的环境,而不能保持原来的某些东西。

而在 UNIX 下就不一样了。你可以用你最喜欢的 VIM 编辑程序,你在 VIM 里可以调用 GNU make,make 可以调用 gcc, ld, ... 实际上 make 能帮你很多忙。make 的出错信息可以被 VIM 捕获,VIM 能帮你在源程序里定位。你如果喜欢 icc, 你可以让 make 用 icc 而不是 gcc。你如果觉得 gdb 跟踪变量时比较麻烦,你可以用 ddd 来显示各种数据结构之间的关系。你还可以在 Emacs 里调用 gdb,那样就可以同步显示源代码了。而且 VIM 和 Emacs 还可以编辑很多其它东西,比如信件,LaTeX 文档,HTML,配置文件…… 你不用另外找一个什么编辑器来干这些杂活了。很多程序比如 Mutt, tin 都可以在内部使用 VIM,这样就更方便了。

4. 释放内存

我在 Windows 下做过的一件最傻的事情莫过于“释放内存”了。有一天我看到一个 Windows 程序说:“这个程序可以帮你把大量内存释放出来给一个很大的程序用。”我试了一下,居然一下把我的 64M 内存释放出来 48M!我高兴极了。现在想一想,那是多么傻的事情,那么多的内存留着干什么?不用白不用啊!一个操作系统,居然还需要别人写的程序来释放内存,那是什么 样的操作系统?

在 Linux 下用 free 命令,你会发现你的内存几乎每时每刻都快要被用完。那是因为 Linux 把大部分内存用来作为磁盘缓冲了。Linux 有比 Windows 先进的磁盘缓冲技术。你有没有发现你往硬盘写数据的时候,很快就完成了?那是因为 Linux 在内存里有很多磁盘缓冲区,你要写到硬盘上的数据先被写到了这些内存里,然后 Linux 就告诉你“拷贝完成”,当你马上又想删除刚才写入的某些数据时,Linux 只是把数据从内存里移除,然后报告“删除完成”。在一定的间隔时间后,Linux 才把数据写回硬盘,这样不但高效,避免了多次硬盘操作,而且减少了文件的不连续,也就是减少了“碎片”。Windows 当然也有磁盘缓冲,但是由于它内存管理的低效率,它不敢把大量内存都用来作为磁盘缓冲,因为它没有能力在用的时候随时把内存收回来。

Linux 能干的高级的事情 Windows 都干不了

当然有很多事情是Linux/UNIX的专利了。因为 Windows 只能装在 PC 机上,好像以前也有 Alpha 可以使用 Windows NT,但是就是没见到有人用。PC 机的能力是很低的,像我们编程序处理 NP-Hard 问题的人,用 Windows 的机器显然速度不够,而且有时一个问题算上几天甚至几个星期,Windows 机器是以“死机”著称的,我们怎么能放心?

所以几乎所有科学计算程序,EDA 程序,高性能图像处理程序都不是 Windows 的。他们有时也会移植一些给 Windows,但是常常降低那些程序的能力。你比较过 Windows 版本的 Mathematica 和 Linux 的有什么区别吗?

IBM 制造的最大的并行计算机有 8000 多个处理器,Windows 不可能有能力管理这么多处理器,它用的是什么操作系统?答案是 Linux。

泰坦尼克号》电影里的三维动画,那么细腻逼真,Windows机器能做出来吗?不行。那也是 Linux 机器做的。

民航总局用来训练地情人员的虚拟现实训练设备,Windows 当然无能为力。那都是商业的 IRIX 机器。

UNIX 是最早支持 TCP/IP 网络协议的系统。它上面有很多可以互相协作的网络服务程序,它们经过多年的使用和修订,已经达到比较完善的程度。而就在1997年,微软的比尔盖茨还在扬 言:“Internet 是没有前途的。” 微软的这个“远见卓识”大家应该都已见识,它后来加上的网络服务程序IIS漏洞之多,让公安部都频频发出警报,大家也是见识了的。

其实你知道了,Windows 没有一样有用的事情能比 UNIX 干的更好。
Linux 干不了的有用的事情 Windows 照样干不了

当然 Linux 不是万能的。它也有不能干的事情,电脑也有干不了的事情。但是 Linux 干不了的事情,Windows 肯定也干不了。这些事情就是我们需要探索,需要努力的事情了。在你探索的过程中,Linux 必定是你的好伙伴。
Windows 的流毒

不要用 Windows 的方式来思考问题

什么?你早就知道 Windows 是垃圾?噢!你怎么不早说呢!害我废话这么多。嘿嘿。

“好了。你知道 Windows 是垃圾,你现在用什么?”

“Linux + Xwindow”

“那我问你,Xwindow 是什么样的?”

“不就是跟 Windows 差不多吗?只不过 'Start' 按钮比较方,而且上面不是一个 Windows 标志,而是一个脚丫子。点击一下居然还有很漂亮的中文菜单。我喜欢!”

“你知道什么是‘根窗口’吗?”

“不知道。从来没听说过呢?”

“根窗口就是遮盖整个屏幕的那个最大的窗口。”

“哪儿有什么窗口啊!我没有看到呢?”

你发现了问题吗?这些 Linux 用户说是在用 Linux 和 Xwindow,但是他们对 Linux 和 Xwindow 几乎完全不了解。很多人用了那么久 Xwindow 都不知道根窗口是什么东西,不知道其实按钮也是窗口,不知道窗口管理器和 Gnome,KDE 有什么关系,大家都以为窗口上面的按钮是程序自己放上去的,不知道窗口的“class name”,“resource name”是什么东西。他们被遮在 Linux 之上的一层一层的包装迷惑了!

当我告诉一个既能用 Windows 又能用 Linux Qt 编程的朋友 Xwindow 的“中键粘贴”是怎么回事时,他大吃一惊,说:“Xwindow 怎么这么落后啊!居然请求剪贴板的东西时还要联系剪贴内容的所有者自己来转换格式!你看看 Windows 的剪贴板……” 经过一顿饭的友好的讨论之后,他不得不称认,这个 Xwindow 用了几十年的方法比 Windows 的剪贴板要合理的多。

后来又有一次,我告诉他每个 Xwindow 的按钮都是一个窗口。他说:“不会吧~ 这样效率一定很低。你看看 Windows 的按钮 ……” 又是一顿饭之后,他说:“哎呀。不得不承认 Xwindow 的方式是良好的设计。”

现在很多人已经把能够利用别人的库写出一个好看的程序作为自己编程水平的象征。在这个“图形化”,“可视化” 的年代,你如果还在用 troff, LaTeX 写文档,你还在用 VIM 自己编辑 HTML,用 Mutt 处理邮件,你还在用文本模式的 gdb 调试程序,你还在用 Xlib 写程序, 你还在用 tin 上 USENET,你还在自己写 Makefile,写机器代码,你还在玩 Clossal Cave 这样的字符模式冒险游戏,那你就是老古董,不合时宜,变态。

其实这种思想是错误的。虽然你是一个坚决的 Linux 支持者,但是你的思想是 Windows 的思想。你认为图形界面,菜单,按钮就可以解决一切问题,就可以给你高效方便。你要做坚决的 GUI 派而不是 CLI 派 …… 你还是没能摆脱微软给你的潜移默化的东西。你其实离不开 Windows 那样的环境,你害怕符号,你迟早会删掉自己的 Linux。

GUI vs. CLI

UNIX 和 Xwindow 是一家

大家看到这个标题是不是热血沸腾?两派大虾都可以围攻我了:

GUI派用户:“哇!我一看你这小子就是 CLI 的。要不然自己写什么 Makefile?用什么 Mutt?”

CLI派用户:“切~ 你还用 X!高手都不用 X。你是 GUI 那边的。”

可怜的我:“555~~ 你们都不要我~~ GUI 和 CLI 就那么水火不容吗?”

计算机界这样的门派之分还很多。很有特点的就是 CLI 和 GUI 了。CLI (Command LIne) 的狂热份子声称永远不用 X。我上次在实验室看到一个同学用一个 SecureCRT 登录到 Sun 机器,然后用一个 vanilla vi 编辑程序,我建议他启动一个 GVIM 过来显示在 Exceed 上可以有语法加亮。但是他坚决反对,说:“高手不用X。你想想,要是我在一个很慢的网络连接怎么用 X?而且好多服务器没有装 X 程序。”

但是我们实验室的网速可够快,Windows 机器都有 Exceed 啊,而且 Sun 机器有全套 X 客户程序包括 GVIM。他说他是 CLI 的坚决拥护者,但是他却在用 Windows,他后来打开了好几个 SecureCRT,每次从文本框输入地址,用户名和密码,从下拉菜单选择 "SSH2",然后点击“Connnect”。他还不断的夸SecureCRT是“网络管理员投票选出的最受欢迎的登录方式”。老天,SecureCRT 本身就是个 GUI 啊,他其实是一个 GUI。

你说我是 GUI 的?我虽然很少在 console 下工作。但是我对 bash, VIM 很熟悉,我可以让 bash 按照我的键绑定方式来工作。我可以在 rxvt 里使用 Mutt 来收发 email。我的每个桌面上都常常堆放着一打不同大小的 rxvt。我用 VIM 编辑 LaTeX。我自己写 Makefile 来维护 LaTeX 文档。我有时用 mpg321 来放 mp3。我上BBS用的我自己写的 expect 脚本,定义了很多热键,我只要 Ctrl-H 就可以随机变化我的签名档和说明档。我的 expect 脚本有高级的自动回复功能,甚至可以以假乱真,让你看不出其实我不在,你有可能跟我的机器人聊上10分种才发现那不是我 :p 好了,CLI 派的朋友可以收我做盟友了 :)

你说我是 CLI 的老古董?我的 FVWM 被我配置为可以“手写操作”,我只要画一个"r"就可以启动 rxvt,我只要画一个 "U" 就可以启动 GVIM,…… 我用 GVIM 语法加亮模式编辑程序,我用 Mozilla 浏览网页,…… GUI 派的现在好像认我做朋友了 :)

好了。CLI 派的朋友,虽然我很喜欢命令行,但是我有时在屏幕上左右画一下就可以执行:

Module FvwmConsole -terminal rxvt -geometry 45x5-0+0 \
-bg gold -fg midnightblue  \
-fn "-adobe-courier-medium-r-*-*-14-*-*-*-*-*-*-*"

你是不是现在又想把我逐出师门?

GUI 派的朋友,虽然我很喜欢窗口。但是我可以在 FvwmConsole 里输入:

All (rxvt) MoveToDesk

把我所有的 rxvt 移动到我现在工作的桌面。“这家伙,怎么这么快就叛变了!”

其实何必分什么 GUI 和 CLI,UNIX 和 Xwindow 都是工业标准,它们从设计那天开始就有非常灵活的用法,各个程序,不管是 GUI 还是命令行的都可以互相协作。UNIX 和 X 是一家,何必搞的那么偏激,非此即彼?你从我上面的行为可以看出 GUI 和 CLI 的模糊界线吗?你说我是“花心大萝卜”?花心就花心。hengheng :P
UNIX 的真谛何在?

让聪明人干任何他们想干的事情。

UNIX 的一个特点就是非常高的灵活性,Xwindow 也具有这种灵活性。这种灵活性体现在哪里呢?

UNIX 的程序一般都有很多参数,不管你现在用的着用不着,总有人需要某些参数。它们的行为很多都可以用配置文件来改变。比如 GNU bash, 通常缺省的命令行输入方式是 Emacs 方式,但是只要我编辑一个 .inputrc 文件,就可以把它变成 vi 的输入方式,而且我还可以自己绑定键序列到某些操作。我可以用 shopt 来设置它的很多特点,比如是否进行通配符扩展,是否可以把一个变量当作一个目录来cd,是否可以自动纠正某些明显的目录名打字错误 ……

UNIX 程序设计的思想是提供给用户“机制”,而不限制用户制定“政策”。这是一个重要的尊重用户的作法。

我们再来看看 Xwindow。Xwindow 是一个出色的设计,它把显示服务器和客户程序分开。一个显示上既可以显示本机上的程序,也可以显示别的机器上的 X 程序,而它们都遵守你的窗口管理器的统一指挥,它们之间可以方便的传送剪贴版数据,各种事件 …… 比如有时我的 XFree86 上会出现四个不同机器上的 XTerm,两个不同机器上的 GVIM,…… 它们统一受本机上的 FVWM 指挥。

Xwindow 程序都具有很多很多命令行参数和 resource 参数。你可以随意的在命令行或者 .Xdefaults 文件设置所有的颜色,字体,尺寸…… 而且如果你用 xrdb 把 .Xdefaults 导入到根窗口,那么其它机器上没有经过配置的同样的程序,显示到你的机器上的时候也会遵守同样的外观规定。

Xwindow 的窗口具有 Property, 也就是一些可以自己定义的共享数据(原子)。正是因为这些 Property 的存在,使得 Xwindow 具有无比强大的生命力。X 的窗口管理器和其它客户程序之间并没有统一的协议,但是后来出现了 ICCCM(客户程序间通信规范),这个规范就是通过 property 定义的。现在又有人定义了一套“扩展的窗口协议(EWM Hints)”,使得 Xwindow 可以具有某些 Windows 的特征,比如一个工具条程序可以告诉窗口管理器:“这个屏幕下面被我占据了24个像素的空间,你最大化程序的时候不要越过这个界线。”

一个强大的窗口管理程序比如 FVWM,它收到这样的提示时,可以答应工具条程序的这个要求,也可以不答应。一切选择的权力在于谁?当然是用户了!一切窗口乖乖听话,FVWM 给予用户最大的尊重。

你想想,是不是有些 Windows 程序常常弹出一个窗口要你选择 "Yes or No"?你不点击它它就不下去。你觉不觉得你的程序在侵犯你的尊严?你是一个人,一个智慧的生物,怎能受到一个程序如此的待遇?

还有就是很多 Windows 程序把人当成傻瓜,而它是“智能程序”。比如,有一个程序就是喜欢把你的每句话第一个字母都变成大写,我不说它是谁了,你遇到的时候就知道了。如果连“一 句话开头一个字母要大写”这么明显的问题都需要程序帮你纠正的话,人脑还用来干什么?况且如果你故意想要不大写的话,那就更麻烦了,我楞是没有从它那一大 堆菜单里找到怎么关闭这个愚蠢的选项。

只有符号才能完全操纵计算机。

我们来说说很多初学 Linux 的用户。虽然他们在用 Linux,但是他们打心眼儿里是觉得 Windows 的工作方式好,他们希望 Linux 有一天能“像Windows那样”。你说:“我鼠标一点,我菜单一拉,…… 就可以完成我的操作。” 但是我要告诉你:“Linux 从来没有摹仿 Windows,将来也不会。Linux 从诞生之日起,它的工作方式就比 Windows 的先进。Linux 属于能勇敢面对符号的人。只有符号才能完全操纵计算机。”

看看优秀的 UNIX 程序,XFree86, FVWM, VIM, Emacs, proftpd, Mutt, wget, tin, ... 没有一个不是用配置文件来设置选项的。为什么这些程序没有方便的菜单可以用来配置?难道它们的设计者就那么低能,连个图形配置界面也写不出来?

当然不是。因为图形界面配置方式的能力是极其有限的,而配置文件和程序语言的表达能力却是无限的。用图形界面配置这些程序的话,如果你想达到配置文件的效 果,你需要成百上千的菜单,checkbox, radio button, ... 到时候你根本没办法找到你需要修改的地方了!而各个程序的配置文件的语法都有很多相似之处,一般就是一些命令,设置一些变量,参数,…… 一旦用会了一个,其它的也就容易理解了。如果你用惯了 awk, sed, Perl,你会觉得那才是真正的自动化啊。

鼠标虽然是很好的工具,但是它的表达能力是有限的。你不可能光用鼠标就让电脑完全明白你的意思,它毕竟只有3个按钮。看看我的MetaPost页你就能体会到鼠标的这一弱点。所以我们虽然很喜欢鼠标,但是却不能完全依赖它。

各个小程序的完美配合

这就是UNIX最重要的特点了,它就是UNIX设计的思想。让每个程序只具有一项专门的能力,然后让它们合作。Xwindow也继承了这种好传统。

这恐怕就是Windows和其它操作系统望尘末及的地方了。UNIX 程序设计之统一,配合之完美,真使我难以置信!shell, grep, find, awk, sed, make, Perl, Emacs, vi, tin, Mutt, ... 它们是那么的具有一致性!你一旦学会了 sed 的正则表达式,其它程序基本上都能用了。你一旦学会了 vi 和 VIM, 你会发现它的操作是那么的有规律性,似乎vi的设计者在几十年前就已经设计好了 VIM 在今天的完美而统一的操作方式!而且vi的操作还体现在 Mutt, tin 等很多程序中。你甚至可以把 bash 设置为 vi 的输入方式来输入命令行,我就是这么做的。一个程序可以调用另外一个程序来得到数据,可以把数据交给它处理后返回来,可以在自己的窗口里“嵌入”另外一个 程序。

在 Windows 和其它非 UNIX 操作系统中,这种合作是非常困难的。我曾经在 Windows 下使用 Perl来进行一些自动工作。但是 Windows 的文件操作,管道是如此的不稳定,程序之间基本不能合作。你别想在 Visual Studio 窗口里面嵌入 UltraEdit 编辑器,你别想用一个 expect 脚本来控制 telnet 到水木清华BBS,这就是为什么 helloooo 诞生在 Linux 而不是 Windows。我曾经试图从 Windows + Exceed + SecureCRT ssh 登录到 Sun 机器,然后通过 ssh 的隧道(X11 tunnel)把 X 程序传到 Exceed 上运行,但是搞了两天都没有成功!而在 Linux 下这个事情根本就是不用怎么配置的,OpenSSH 和 XFree86 本来就是完美结合,只要打开 ssh 的 "forward X11" 选项就什么都搞定了。

Windows 的程序都是大而全,大而杂,所有的电子邮件程序都需要自己提供编辑器,自己发送和收取邮件,自己显示邮件的附件。每一个BBS程序都提供自己的 Virtual Terminal, 自己的通讯代码。每一个 IDE 都自己提供编辑器,编译器,汇编器,调试器。人们为了使用一种新的程序,需要适应所有这些它提供的界面,而不能使用自己喜欢的编辑器的键绑定,菜单组 织…… 不能 DIY!

你要知道,最高级的电脑是定做的,自己想要什么什么CPU,什么主板,多少内存,什么硬盘,键盘,鼠标,显示器都是自己选择的。最高级的滑板,自己想要什 么牌子的版面,什么牌子的沙,什么桥,什么轮子,什么轴承,也都是自己选的。最高级的乒乓球拍,木板,胶皮,海绵,胶水都是可以自己选择…… 而用 Windows 程序,你得到的是大杂烩,就像你去买“品牌机”,只有那么几种配置,而且附带很多你不需要的软件和服务;就像你去买组装好的滑板,你想要大一点的轮子和窄 一点的板子,但是你没有这种选择余地!Windows 程序就相当于最廉价,最次的滑板。但是它却会花你更多的钱,因为一旦一个部件坏了,或者你不喜欢了,你不能另外找一个好的换掉它,你必需重新买全套配件!

而 UNIX 和 Xwindow 就是高档的“组装货”。比如我用 Mutt 的时候,我可以用 VIM 也可以用 pico 来编辑邮件,我可以用 ImageMagick 也可以用 xv 来显示附件里的图片,我可以用 lynx 把 HTML 附件转成文本嵌入窗口中,我也可以把 HTML 附件交给 Mozilla 图形显示。我可以让 GnuPG 帮我把邮件进行数字签名和加密,我也可以用其它 PGP 程序。我想让 Postfix 而不是 sendmail 帮我发出邮件,我想让 fetchmail 帮我收邮件,转发给 postfix,然后被我自己写的Perl过滤器处理…… 这一切我都可以办到!我可以选择我最喜欢的专门的程序来完成专门的工作,然后把它们结合在一起,我也可以分别得到它们的好处。
结论

我写这么多的目的是什么?我希望喜欢 Linux 的朋友,完全清除微软和 Windows 灌输在你脑子里的谬论,别再相信它们所谓的“新技术”,别再追赶 Windows,因为追赶 Windows =倒退。马克思有一个思想很重要,“新生事物并不一定是在最近出现的。” UNIX,Xwindow, TeX 虽然都比 Windows 先出现,但是它们才是先进生产力的代表。我们要清楚的认识到什么才是真正的现代化,什么才是真正的自动化。

勇敢的拿起像 bash, FVWM, TeX, VIM, Emacs, Mutt, lftp …… 这样强大的程序,勇敢的面对符号。不要再埋怨“Linux 为什么不能像 Windows 那样”,不要再浪费时间试用这样那样的程序,不要再忙着升级。需要改变的是你自己,而不是 Linux 和 Xwindow,Linux 现在就可以成为你的好朋友。你需要认识它,了解它,信任它,才能完全的靠它来高效的工作,省出时间来处理世界上更加值得处理的事情。
附录: 我用来处理日常事务的 Linux 程序

好了好了。我知道你发现自己应该转向 Linux,你很后悔当初为什么中了微软的邪。但是不要着急。因为这些东西本来只是工具,它们是用来完成你的主要任务的辅助而已。你以前选错了工具,这不 要紧。你还是拥有你自己原来的专业技能,那才是最重要的。工具的东西只有慢慢适应转换,不能一蹴而就,否则你会感到非常没意思,甚至放弃。

这里给出一些推荐使用的可以处理一般事情的程序。至于你的专业上要用到的科学和工程软件比如 Matlab, Mathematica, Maple, HSpice, Design Compiler, …… 还有其它物理上的,化学上的,生物上的 …… 都必然有 Linux 和 UNIX 的版本。当然他们很多不是免费的,不要总是觉得什么都应该免费,它们是经过很多人辛勤劳动的产物,是可靠的程序,他们物有所值。

下面列出我常用的一些 Linux 程序。一个列表里可能有很多,那是为了方便你来选择,我列出了比较信得过的。但其实很多只有第一个是我真正在用的。我不喜欢试用程序。

* Shell: bash。我使用 bash 的 vi 命令行方式。
* 编辑器: VIM, Emacs
* 程序开发: GCC, make, ld, Scheme48, j2sdk, Perl, Python, Tcl/Tk ...
* 论文,幻灯工具:LaTeX, ConTeXt
* 绘图工具:MetaPost。这个语言太强了,以至于我只用它了。你不熟悉的话可以用 dia 来画一些流程图之类的图片。
* 图像处理:ImageMagick。其中的 import 程序可以屏幕抓图,convert 程序可以转换图像格式,display 可以显示图片和简单编辑(缩放,换质量,转格式,简单绘图,简单虑镜)。通常我就这么点需要。如果你要更强大的图像工具可以用 Gimp, 它几乎和 Photoshop 差不多。
* 自动管理工具:make。我可以用make来自动编译程序,自动编译文档,自动更新插图…… 全自动,而且不会重复劳动。
* 加密程序:GnuPG。我的 PGP 密钥就是它搞出来的,我用了 2048 位加密。
* 打包,压缩程序。什么都有: tar, gzip, bzip2, zip, rar, ...
* 虚拟光驱程序。Linux 不需要虚拟光驱程序,直接 mount 就行了。
* ftp 服务器:proftpd, vsftpd
* WWW 服务器:apache。(我一般没有开)
* ftp 客户程序:lftp
* 自动下载工具:wget
* 虚拟终端:rxvt, xterm, gnome-terminal, mlterm, ...
* X server: XFree86
* 窗口管理器:FVWM。编译加入了 libstroke。
* 中文输入:XSIM。被我修改过以适应 FVWM 的需要。另外推荐你还可以用 SCIM。
* email 处理:Mutt + Postfix + fetchmail
* 看 PDF, PS, DJVU 文件:Acrobat Reader, xpdf, GhostScript, gv, djvu工具包和 netscape 插件。
* 看CAJ文档。我从来不看CAJ之类的文档,如果找不到PDF或PS,直接去图书馆借最好。
* 看网页:Mozilla, Phoenix, lynx。Mozilla-Xft 的显示效果比 IE 好很多。
* 英汉字典:IBM智能词典,星际译王。
* 编辑网页:我用 VIM 直接写 HTML。你如果想要图形方式的可以用其它的比如 screem, BlueFish。
* 登录其它 UNIX, Linux 机器:openSSH, telnet。 openSSH 还可以把其它机器的 X 程序通过 ssh 加密的隧道传到我机器上显示。
* 上BBS:rxvt(或任何一种终端) + telnet + chatbot(helloooo 机器人的程序)
* QQ, ICQ: 我没有 QQ 或 ICQ。不过你可以用 Gaim, 它同时支持 QQ, ICQ 和很多其它的即时通信方式。ICQ 用户也可以用 Licq。
* 放录像:MPlayer, RealPlayer。MPlayer 太好了,直接就可以放 VCD, DVD, divx, wma, wmv ... 用 Windows 的同学都很羡慕我,说 Windows 要放这个需要大堆插件。rm 最好还是用 realplayer 放,它也是免费的。
* 放音乐: xmms(mp3,ogg都可以), mpg321(放mp3), ogg123(放ogg).
* 看 Word 文档。请 Word 用户把文档全部转为 PDF 或 PS 再给我,文档里没有特殊的格式就用文本文件,要不我就不看 :P
* 其它程序:还有很多我需要用而你不一定用得着的。比如,Doctor Scheme, Scheme48, Scsh, ...这些程序只有 Doctor Scheme 有Windows版本。还有很多幕后工作但是你一般不察觉的:xinetd, telnetd, sshd, crond, atd, lpd, ... 他们都比 Windows 的对应者强的多。

2004-05-01 17:09
from  http://shaohui.ycool.com/post.21909.html
--------------------------------------------------

这一篇,当然也要转的

王垠:完全用Linux工作及其后续

我已经半年没有使用 Windows 的方式工作了。Linux 高效的完成了我所有的工作。

GNU/Linux 不是每个人都想用的。如果你只需要处理一般的事务,打游戏,那么你不需要了解下面这些了。

我不是一个狂热的自由软件份子,虽然我很喜欢自由软件。这篇文章也不是用来推行自由软件运动的,虽然我觉得自由软件运动是非常好的。

这篇文章也不是用来比较 Linux 和 Windows 内核效率,文件系统,网络服务的。我现在是作为一个用户而不是一个开发者来说话的,我们的讨论是基于操作,应用层面的。是为了告诉大学里还不了解,或者不理解 UNIX 的科学工作者和大学生,UNIX 比 Windows 更适合用于科学研究工作,请大家理解 UNIX 的工作方式,不要用 Windows 的标准来要求 Linux,而要用一个科学工作者的标准来要求自己,用UNIX 的思想来武装自己。

我显然是反对在大学,特别是理工科专业推广 Windows 的。我也反对在对"娃娃"们的计算机启蒙教育中使用 Windows。因为 Windows 不论从技术上,经济上,思想风格上都是与我们培养高科技人才的目标格格不入的。Windows 的流行属于历史遗留问题,爷爷一级的人当然已经不可救药,但是我们不应该让下一代继续走上歧途。

UNIX 不是计算机专家的专利

当我建议一些非计算机专业的人用 Linux 的时候,很多人说:"UNIX 是计算机系的人用的,我们不能理解。" "UNIX 是男孩用的,我们女孩不用。"

但是其实世界上的大多数科学家和工程师几乎用的都是 UNIX 作为他们的电脑工具。就因为它简单,可靠,稳定,强大,有趣。甚至很多时候 UNIX 就是唯一的选择。

你说:"我们都会用 UNIX 的话,你们计算机专业的人还用来干什么?" 很容幸的告诉你,计算机专业的有一部分人就是专门为你们提供这样强大而方便的计算机工具的。如果他们制造的工具只有自己会用的话,那这个工具还有什么用?

理解 GNU/Linux 不要用 Windows 的标准来要求 Linux。

由于GNU/Linux这个词太长,下面如果没有特别指明,"Linux"就是指GNU/Linux"。

在这个年代,恐怕没有人需要我来介绍 Linux 是什么了吧?如果你觉得"Linux 只不过是跟 DOS 差不多的东西",那请问问你旁边的 Linux 用户,Linux 到底是什么?

那为什么我还要写一篇这样的文章?因为,我发现还有很多人不不理解 Linux 和 UNIX,虽然他们也在用它,但是他们有时会问:"为什么 Linux 不能像 Windows 那样 ……?","怎么Redhat Linux不能 mount NTFS 分区!","Linux 下用什么整理硬盘?","什么时候OpenOffice才能完全兼容Word文件啊?","现在还有什么Windows能干的事情Linux干不了的?"……

他们有40G的硬盘,却只为 Linux 分配了2G空间,有时还抱怨"这个东西怎么占这么多硬盘!" 似乎 Windows 该占用大部分硬盘。他们把重要的数据装在Windows的分区,似乎信不过Linux。他们总是到处寻找新奇的,好看的GUI程序,对命令行的东西一概不屑一顾。他们对Drag&Drop,菜单配置,自动升级非常感兴趣。他们如果找到一个很像 Windows 程序的 Linux 程序,一定会很高兴的说:"哈哈!Linux 也能……了!"如果Linux在某种测试中胜过Windows,他们会高兴得跳起来。他们没有办法用Linux 解决问题的时候,甚至用Wine来运行Windows程序。有时实在没办法,只好重起到Windows,或者干脆省得麻烦,在 Windows 下装一个 VMWare 虚拟一个 Linux 玩。

你如果出现了上面的情况,说明你的思想受到了 Windows 的某种潜移默化的影响和误导。你没有能够从本质上理解存在于 Linux 身上的 UNIX 思想。你支持 Linux,你喜欢 Linux,你能从中感觉到快乐,这非常好。你现在只需要明白的是:Linux 从来就不是一个玩具,它是天才UNIX的后代。UNIX 是自晶体管发明以来最伟大的发明,它从诞生那一天开始就比 Windows 的设计出色。

你要体会什么叫做"设计",一个糟糕的设计并不是到后来缝缝补补就可以变好的,而一个出色的设计,不但可以以不变应万变,而且可以影响到后来者。一个出色的设计配上一个出色的实现,那就是非常出色的发明。Linux 就是这样的一个出色的发明。Linux 并不需要追赶 Windows,也不需要打垮微软。它的最终目标是改变整个计算机世界,还人们自由,给人们乐趣和方便。

Unix 是简单的,你不需要成为一个天才也能理解这种简单。

UNIX的设计者 Dennis Ritchie 说:"Unix is simple. It just takes a genius to understand its simplicity." 但是我不这么认为,因为我不是一个天才,但是我却勇敢的把 Windows 完全删除掉,遇到不明白的事情的时候努力用 UNIX 的方式去解决,而不是寻求 Windows 的帮助。现在我体会到了 UNIX 的思想和好处,我可以用比 Windows 高效几倍的效率工作。因为我相信这样的信念:"Windows 能办到的事 Linux 一定能办到,而且办的更好。"

这小节开头的话应该改成:"Unix 是简单的,你不需要成为一个天才或是计算机专家。但是在这个冲斥着 Windows 错误观念的世界,你需要信念和勇气才能理解它的简单。" 我下面就告诉你一些我理解到的东西。首先,你要知道的是微软在国际科学领域是根本没有地位的。

微软的地位

微软的名声在欧洲和美国的大学里,特别是在计算机系里之坏,大家可能有所耳闻。我认识的 MIT,Stanford 的教授,贝尔实验室的专家,甚至一个欧洲小国的高中计算机老师都绝口不提微软的名字。在他们眼里,微软只是一个没有真技术,专靠在落后国家商业宣传和垄断经营的小公司。这个"小"并不是说它人少,钱少,而是说它先进技术少。

我上次和王益合作写了一个算法演示程序,那个算法是贝尔实验室一位科学家Steven Fortune很天才的发明,为了程序能够被身边大多数人使用,我们选择了 VC+MFC 作为平台。我在分析算法时还得到 Fortune 很热情的鼓励,寄给我一份资料,还多次回信耐心的给我讲解了很多细节。但是程序完成之后,我把样品发给 Fortune,他回信说:"对不起。我机器上没有 MFC。" 话说的很客气,但是我已经感觉到了他对 Windows的不屑。然后我把 MFC 静态编译进程序再发给他,他就没有再回信了。他显然不是瞧不起我,而是确实有难处。

你能感觉到这位科学家对微软和 Windows 是什么态度了吧?不是反感,而是他心里根本没有 Windows 这个东西!微软在高科技领域没有发展,那么它怎么生存呢?到发展中国家去发展一下,他们的人民还对电脑一无所知,我说不定甚至可以打入大学的计算机系呢。我送他们软件,我捐钱盖大楼,我出钱找图灵奖获得者来演讲,让他们觉得我们都是科学家!

好了,现在全国的大学包括清华,几乎所有人机器必装盗版 Win2000,Office XP,学校的选课系统是非IE不能正确浏览,论文用 Word 编辑,演示用ppt做,email 的通知附件是 doc 文件,你不用 Word 打不开,连 863 项目都用 VC 写程序了。我很久以前就看到一份报纸说,"微软为什么不严厉打击盗版?" 这篇文章说,微软非但不打击中国的盗版行为,而且有放任之趋势。放长线吊大鱼,"以后我要你们加倍的来还我!" 确实如此,它的目的快实现了。

Windows 笼罩下的中国计算机教育

说句丢脸的话,比尔盖茨很久以前是我的偶像…… //blush

在中国,比尔盖茨被很多人奉为神圣,"少年电脑天才",甚至有的人提到他的名字就做出"抱拳对天"的姿势。很多人谈到微软的"新技术","高科技" 都是眉飞色舞。各种"VC编程圣经","深入了解 Visual C++"之类的书,在开头几页都会出现非常肉麻的字眼,"在那团团的混沌中,一个开天辟地的精灵,Windows 1.0,诞生了……"

微软的软件被这么多人盗用,那么人们是怎样使用这些盗版程序的呢?先看看电脑培训班,教的都是一些 DOS 命令,打字,Windows 基本操作,Word 文档处理,PowerPoint,高级班可能有 Excel,Access…… 参加各种微软认证考试,MCSE,MSDE 的人络绎不绝。考试辅导班都贴出了"280元,考过为止"之类的字样。考试参考资料更是昂贵,有些电脑书店整整两书架都是"Microsoft Press"的东西。我有个同学参加认证考试,每门考试都要200多元。而且你一次考不过可以再考,又要交钱。他后来还津津乐道跟我说,看我,花了XXXX(一个四位数)元考过了微软认证,得到一张比尔盖茨亲笔签名的证书和价值6000元的 Windows XP 内部发行版。

"电脑要从娃娃抓起",我们再来看看娃娃们学的是什么。大部分家长给孩子买了电脑之后,他们首先就会装一个盗版的 Windows,然后买来盗版的游戏开始玩。如果哪个孩子会用 Delphi 编程序,那可不得了。报社记者,电视台争相报导,说,某某学校的初中生某某,在别人都还在玩电脑游戏这种"初级阶段"的时候就已经用 Delphi 写程序了。镜头还瞄准了他显示器上面的像框中的比尔盖茨头像!

我刚进入大学计算机系时还不懂得什么是操作系统,因为我以前只用过"中华学习机"。看到新入学的同学们各个谈论的都是 "Windows 95","VC"…… 我简直觉得我落后了好几十年一样,整个一土人,根本跟他们答不上话。好不容易找到一个比较熟的同学问了一下:"你们天天谈论的瘟95是什么啊?"答:"win95就是一个操作系统,跟DOS是一类。""朵死是什么?" "你连DOS都不知道是什么?别在计算机系混了。" 学校上课当然不讲VC编程之类的东西,但是上 Pascal 的老师有一次就说:"嗨,我们学校真是落后。现在别人都用 C, C++,甚至 VC 了,我们还在讲 Pascal。不知道什么时候才能有VC课啊。你们出去也是要用VC的,只好自学了。" 于是,有些同学很多时候上课都捧着一本很重的"Windows 编程大全"之类的书,根本没有听课。吃饭时就念念有词的跟我说,"代码的优化是无止境的","匈牙利命名法真是伟大的发明" …… 这就是中国很多大学计算机系的情况。

感觉到无知了?这不是偶然的,而是微软长久以来埋下的伏笔。它要让无知的大家都把它奉为神圣,它要让支持UNIX,Xwindow的人一旦说 UNIX 好,Xwindow 好的时候,都被一群人围着说教:"这个 Windows 也能做到","你对 Windows 有偏见","微软才是主流啊","你敢瞧不起 win2k?",".NET 就是世界潮流","微软的毕竟是新技术","有钱就是有技术"…… 甚至在一番论战比较后败下来还是要说:"Windows 性能差点,但是易用性强","Windows 是老百姓用的,要求别那么?quot;,"微软那么有钱,以后想超过 UNIX 还不容易吗?"……

发达国家的计算机教育

我前段时间在 USENET 发文问有关 Scheme 语言的问题时,认识了一位丹麦人。他解决了我所有的问题,并且建议我阅读一些很"深奥"的有关程序语言语法,文法的书,他告诉我很多网站可以学习 LISP,Scheme,人工智能,算法。他叫我看 Jonathan Rees 的论文 "Syntactic Closures"。他还打包给我寄过来一份 MIT 的 "How to Design Programs"。他说他在自己的 PC 机上装的是 Linux,他用 Emacs 编辑,运行Scheme 程序。他对 Emacs 的了解和爱好真是使人惊讶。他大学本科毕业时做的毕业设计是一个 Scheme 解释器。这对于我来说是望尘末及了。

他是那么的不厌其烦,我的每一个问题他都详细的回答。我有时都觉得过于详细了,怎么这么耐心啊?我觉得他似乎是我的高中老师。他是什么样的人呢?我好奇的打听了他的情况。原来,他是丹麦一所普通高中的计算机老师。

他说他在高中里讲授程序设计和算法,计算机语言文法。他说用 Scheme,他的学生不用再为内存泄漏等程序语言本身的问题而烦恼,而专注于问题和算法本身。有利于培养学生解决问题的能力,特别是用计算机解决数学问题的能力。

天哪!为什么欧洲出现那么多数学家,几何学家?你看看别人重视的是什么!我们的计算机教育如果继续这样下去,只会沿着弯路越走越远!

微软和它的朋友们的如意算盘

下面来看看微软的收入是怎么来的。首先,Windows 98系列操作系统,一个就是 100多美元,每次升级又是几乎同样的价钱。Windows NT 还要贵几倍,而且有用户数目限制,5个用户的,10个用户的…… 以后如果要增加用户数目还要按比例付钱。

花了如此多钱买来的操作系统就能用了吗?它竟然连压缩程序都没有提供!你装上Windows 之后一般第一件事就是去下载一个 WinZip 吧,"只要 29 美元"。Windows会中病毒啊,马上花 70 美元买一个 Norton AntiVirus 吧。还有黑客呢?再买一个Norton Internet Security 好了,100 美元。系统需要优化,磁盘需要整理,买一个Norton System Works 是你最佳的解决方案,100美元。

可是你现在还是不能干正事啊!你想要一个 Word, PowerPoint?那就买一套 Office XP 吧,一起买便宜些,$459.90。

那些程序不会用啊!那些菜单怎么设置,到底有什么功能啊?看"帮助"也学不会。买本书看看吧,我推荐"Special Edition Using Microsoft Office XP",不贵,$27.99。这本书里面大部分是屏幕抓图,还是买一本旧的比较划算,$17.85。

你如果只是当个秘书,上面的差不多还凑合了。可是你有更高的追求,你想成为 Windows程序员。首先买一个 Visual Studio.NET 吧,要不然怎么编译程序。$494.95。

为了紧跟微软动向,世界潮流,不能不注册个 MSDN 什么的吧?这个贵一点,不过物有所值啊,$2,799。

嗯,你现在已经是上层阶级,白领人士了。你现在可以像这样"自由"的,"安全"的生活了。

为什么要反对使用 Windows

很多人都说不应该完全否定 Window,Windows 也有它的长处。不应该骂微软。

对。Windows 容易操作,适合普通用户。如果微软把它自己定位在 P&G,Philips 那样的地位,能够给我们的百姓提供周到的,完善的,价廉物美的服务。那我肯定是很喜欢它的。但是从上面的种种情况说明,微软是一个野心极大的国际垄断组织!它的产品没有一个是不出问题的:Windows 不稳定,容易中病毒,而微软不为大家免费提供杀毒软件。我就是要让你们花钱买我的朋友 Symantec 的杀毒软件,谁叫你们已经上了我的贼船?这叫什么售后服务啊!

你买来微软的程序,安装的时候一般都有一个协议,说:"由于微软的程序造成你的数据损坏或丢失,微软概不负责。" 我想很多人肯定觉得这个不合理,不想按那个 "I accept"。但是你的软件买都买来了,钱都花了,现在一按 "I decline",安装程序马上就会退出。你只好被迫点击了 "I accept"!这不是不平等条约吗?

我已经目睹了好几个朋友的文档被 Microsoft Word 损坏,有的是编辑了十多天的30多页的论文,有的是费了很大工夫做出来的个人简历,那个朋友为此失去了到自己向往的P&G 工作的机会。就在他要投简历的前一个晚上,就在那一瞬间…… 不知道他痛哭的时候有没有想起要投诉微软,可是谁叫我们用的都是盗版呢,况且你还点击了 "I accept"。

微软仗势已经占有大部分PC市场,制定不符合国际标准的"微软的标准",以不合理的方式压制其它公司的软件,这个问题已经在美国司法部闹了很久了。他甚至在 Windows系列操作系统中放置能够通过网络泄漏用户信息的代码,以至于 Windows 刚进入澳大利亚时被澳大利亚政府禁止使用。

有些人说:"微软毕竟开创了一个历史,造就了今天的 IT 行业。" 但是,如果没有微软,我们今天早就用上非常稳定,非常可靠,非常方便,非常"傻瓜"的软件了!微软是阻挡信息技术发展的罪魁祸首。

微软的程序的工作方式(注意,我只是说操作方式,病毒的事情另外算)确实适合于一般家庭,上上网,发发邮件,打打游戏都不错。可是微软却要把自己包装成什么"高科技"企业,要在世界各地设置"研究院",在大学计算机系赠送不适合用于科研的 Windows产品,甚至出钱请图灵奖得主来中国畅谈"二十一世纪的计算",还在大会上宣传自己的 .NET 技术。非要把别人认为自己是科学的,自己是领导世界高科技的。但是呢?它什么高科技也没有。欧洲,美国,哪一个关键部门在用微软的东西?NASA? DOE? CERN?你仔细想一想,微软的程序对人类到底有什么重大作用?

什么是 Windows 能干而 Linux 干不了的事情?---
"Windows 能干而 Linux 干不了的事情,那就是不需要干的事情。"

有个朋友看我半年没有用 Windows,有时就会问我:"你只用 Linux,有没有发现有些Windows 能处理的事情 Linux 干不了?"---
我回答说:"Windows 能干而 Linux 干不了的事情,那就是不需要干的事情。"

Windows 能做的有益的事情 Linux 都能做---
Windows 下的某些功能确实是我们需要的,那么 Linux 的开发者们和用户也需要这种功能,他们就会去实现这种功能,而且比 Windows 的方式好得多。由于大多数科学家,工程师用的都是 Linux 或者某种商业 UNIX, 所以几乎所有商业的科学工程程序,比如Matlab, Mathematica, AutoCAD, Candence的,Synopsys的,Avant! 的……全都是先有UNIX 的版本(包括Linux),然后再考虑移植给 Windows,甚至根本不移植给Windows,因为 Windows 的机器一般没有足够的能力运行这样的程序。你不要以为只有 Windows 才有 PSpice, UNIX 的 HSpice 要好得多,而且可以运行在大型主机上。当然它们不是免费的,但是它们值那个价钱。

但是 Windows 下有些东西在 Linux 下没有很相似的,或者你找到很多类似的,但是它们每一个比起 Windows 的那个程序都要差很多,那么原因有两种可能性:

有一个完全类似的程序,但是由于它乍一看不漂亮,被你忽略了。而其它程序虽然看起来很漂亮,但是它们是一些初学编程的人写的。现在由于 Gtk, Qt 的诞生,Linux 下开发图形界面程序极其简单,很多初中生甚至小学生都可以随手编出一些漂亮不中用的程序。如果你整天寻找这样的程序挑来挑去,永远也找不到你满意的。当然也有一流的程序用 Gtk 和 Qt,比如 GVIM 就可以用 Gtk 作为图形界面,我还知道 Synopsys 一些程序用了 Qt。

我曾经也犯过这样的错误,从外表区分一切。结果优秀的 FVWM, lftp, Mutt, wget 都被我忽略过。当我找回它们的时候,我是那么的羞愧不已,它们现在都是我的朋友 我第一次看到 FVWM 觉得它只不过是一个有很厚很难看边框的东西。可是现在,我的同学看到 FVWM 都说:"哇!真漂亮。"

有另一种完全不同的方式可以达到相同的目的,甚至更好。

很多人很关心 Open Office, Star Office, AbiWord, ... 他们多么盼望有一天某一个Linux 程序能够完全兼容的打开一个复杂的 doc 文档。但是你永远也不可能有那一天。为什么呢?因为微软为了占有市场,必定不会让其它系统的程序能够完全兼容它的文档格式。它一定会不断变化 doc 文档的内部结构,隐藏一些秘密,让其它公司的程序打开 doc 文档时总是有某种问题,从而你必需购买 Microsoft Office 和 Windows。

你应该想一下,那么多的高智商的大学教授,科学家,学生,他们用的都是 Linux 或者其它类型的 UNIX,他们没有 Word 可用,怎么处理文档呢?这么多年没有一个像Open Office 的程序出现,难道大家没有办法写文档吗?

显然不是这样。你看看那些高水平的学术杂志,论文,那些大学教授的网页,那些漂亮的幻灯片,它们是什么做的?原来 UNIX 用户早就有非常方便的 troff, LaTeX, SGML等东西可以处理文档,而且它们比起 Word 都要高明的多。Word 显然被这些大拿忽略了,以至于很久以来没有人想在 Linux 下开发一个类似 Word 的程序,除非某些公司想抢微软的饭碗。

很多人留着 Windows 在硬盘上的原因无非是为了用 Word 和 PowerPoint。我见过一个教授,他的 Windows 笔记本电脑上除了 PowerPoint 什么都没有。有一天演示的时候,他指着堆乱字符说:"对不起,这是一个公式……怎么每次都是这样……" 其实有比PowerPoint 好几百倍的东西可以制造幻灯片,你可以用最简单的方法制造世界一流效果的论文和幻灯片。你待会儿可以看看我的TeX网页,你就会知道为什么我可以完全离开 Windows。

Windows 能做的那些没用的事情 Linux 永远做不好

电脑游戏
有些人说 Linux 下不能玩 Windows 下所能得到的所有游戏。的确,Linux 下虽然也有少量的游戏,比如 Quake。但是它没有 Counter Strike, 没有 Star Craft, ……

并不是说电脑游戏不该玩,但是应该适可而止。电脑是用来处理事务,帮助你学习,解决问题的工具,而不是一个玩具!整天沉迷于电脑游戏中,而不出去感觉外面的世界,你会变得越来越冷酷,越来越缺乏人情味。你与真实的世界越来越远。

你可以在 CS 里杀人,你可以在 Tomb Raider 里探险,你甚至可以在 Tony Hawk‘s Pro Skaters 里滑板…… 但是 It‘s not real!你虽然有很高的"反恐技巧",但是遇到歹徒的时候,你是那么的怯懦;你虽然控制 Laura 伸手敏捷,但是你打篮球的时候怎么总是被人断球?你虽然可以轻易的在 THPS 里作出一个 "360 kickflip to hangten grind to fakie",但是你踩在自己的滑板上的时候还不会 ollie!

说回来,如果你偶尔玩一下电脑游戏未尝不可。但是世界上有远比 Windows + PC 更好的游戏方式。Sony 的 PlayStation2, SEGA 的 DreamCast, Nintendo 的 N64,Namco的街机……每一个都比 Windows 游戏精彩,每一个都有如此高的3D性能,以至于Pentium4, Itanium + GForce4 都无法与它们比美!

Linux 的用户们都是关心解决世界的关键问题的份子,他们哪里有时间用自己的机器来玩游戏啊?他们每天用Linux高效的做完自己的工作就到阳光下享受自然去了。要玩游戏也是玩一些类似推箱子,贪吃蛇之类的智力小游戏。所以,你知道为什么 Linux 几乎没有游戏了吧?

"整理硬盘,优化系统"

这是一个非常有意思的话题,仅次于有关"病毒"的话题。相信很多 Windows 用户都有整理硬盘的经历。在很多 Windows 用户眼里,"硬盘用久了,会出现碎片,速度会减慢,需要一个程序来整理,整理硬盘的时候不要做其它工作",这好像是天经地义的事情。

我也曾经津津有味的看着 Norton Defrag 一点一点的把我的硬盘排序,调整,用图形的方式显示出来,然后报告?quot;100% 没有碎片。你的硬盘现在已经达到最佳状态。" 我现在才发觉我那时是多么的幼稚。

Linux 和 UNIX 用户似乎从来没有"整理硬盘"这种说法呢?你觉得很奇怪吗?如果你觉得很奇怪,那说明你的思想在某种程度上被微软的垃圾程序禁锢了。你需要明白,UNIX 的大型主机很多必须是一天24小时,一年365又1/4天不停运转的,要是每个星期都要整理一次硬盘,在整理的时候几乎不能干任何事情,那是绝对行不通的!

Linux 机器根本不用整理硬盘,这就是为什么没有看到过 Linux 用户整理硬盘。Linux 的文件系统是比 Windows 的 FAT, FAT32, NTFS 高明得多的文件系统,它们不但可以对文件设置权限,实施完全的保护,而且可以"越用越整齐","越用碎片越少"!你应该把文件大部分放在 Linux 的分区,而不是 Windows 分区,因为它比 Windows分区可靠得多。

还有更滑稽的事情就是有很多"Norton System Doctor","Windows 优化大师","超级兔仔注册表魔法" 之类的程序存在,而且价格昂贵。似乎一个操作系统本来应该有很多问题,需要别的厂商做程序来"优化"它,而且为了得到优化,你需要付钱!这些问题 Linux 根本就没有,所以不需要什么优化。Linux 内核本身就是高度优化的。

IDE

有些人在抱怨为什么 Linux 没有一个良好的 IDE 开发环境。Linux 现在已经有一些IDE 了,但是总是有很多问题。你是不是正在寻找,正在期望 Linux 某一天可以有一个VC那样的开发环境?你有没有发现你正在进入微软给你设下的怪圈?你为什么一定要用 IDE?你说:"IDE 开发迅速,调试方便,适合大型程序……" 那说明微软的程序在你脑子里已经比较根深蒂固,你需要好好清醒一下了,看看我来告诉你。

高明的 UNIX 程序员不用 IDE,IDE 从来就是给初级 Windows 程序员用的。

你看看大型的 UNIX 程序,包括 Linux 内核,各种网络服务程序,Xwindow 程序在内,哪一个是 IDE 搞出来的?我们实验室的 EDA 程序也没有一个是 IDE 弄的,我还知道Candence, Synopsys,Mentor 的高性能的图形界面 EDA 程序也都不是 IDE 写的。你信不信,微软的人在写 Windows 本身的时候也根本不用 IDE。微软内部程序员最喜欢的编辑器其实是 VIM,用 VIM 的微软程序员上次向乌干达的可怜儿童捐助了1000多美元,这是值得称赞的。

有一次某杂志采访一些出名的 Linux 内核程序员,包括 Linus 在内,没有一个人用IDE,有的人用 VIM,有的用 Emacs,只有 Linus 说"GNU Emacs is evil",但是其实他用的是一种跟 Emacs 有同样键绑定功能的 MicroEmacs。大家都是用编辑器编辑了程序文件,然后用 make 这样的自动工具调用 gcc 编译器完成编译工作的。甚至高级的 Windows 程序员也不用 IDE,他们可以从命令行调用 cl,nmake 来编译自己的程序。虽然这样的 Windows 程序员很少,但是他们却是最了解 Windows,最高明的Windows 程序员。

为什么 UNIX 程序员不用 IDE?明白了这个道理你就能体会到 UNIX 的设计思想了。首先,一个 IDE 集成了编辑器,编译器,汇编器,调试器,跟踪器…… 这个编辑器功能肯定比不上 VIM 或 Emacs,编译器比不上 GCC,汇编器比不上 as,调试器比不上 gdb,ddd, 跟踪器比不上 strace, ltrace, truss。你得到的是一套整合的低能的程序。如果你对调试器的功能不满意,你只好换用另外一套 IDE,但是这套 IDE 的热键,菜单,编辑器功能,按钮…… 跟原来那个有很大不同。你不得不花很多时间来熟悉新的环境,而不能保持原来的某些东西。

而在 UNIX 下就不一样了。你可以用你最喜欢的 VIM 编辑程序,你在 VIM 里可以调用GNU make,make 可以调用 gcc, ld, ... make 的出错信息可以被 VIM 捕获,VIM 能帮你在源程序里定位。你如果喜欢 icc, 你可以让 make 用 icc 而不是 gcc。你如果觉得 gdb 跟踪变量时比较麻烦,你可以用 ddd 来显示各种数据结构之间的关系。你还可以在 Emacs 里调用 gdb,那样就可以同步显示源代码了。而且 VIM 和 Emacs 还可以编辑很多其它东西,比如信件,LaTeX 文档,HTML,配置文件…… 你不用另外找一个什么编辑器来干这些杂活了。很多程序比如 Mutt, tin 都可以在内部使用 VIM,这样就更方便了。实际上 make 在其它方面还能帮你很多忙,我的每一个比较大型的 LaTeX文档都是用 make 维护的。

Linux 能干的高精尖的事情 Windows 都干不了

当然有很多事情是Linux/UNIX的专利了。因为 Windows 只能装在 PC 机上,好像以前也有 Alpha 可以使用 Windows NT,但是就是没见到有人用。PC 机的能力是很低的,像我们编程序处理 NP-Hard 问题的人,用 Windows 的机器显然速度不够,而且有时一个问题算上几天甚至几个星期,Windows 机器是以"死机"著称的,我们怎么能放心?所以几乎所有科学计算程序,EDA 程序,高性能图像处理程序都不是 Windows 的。他们有时也会移植一些给 Windows,但是常常降低那些程序的能力。你比较过 Windows 版本的 Mathematica 和 Linux 的有什么区别吗?

IBM 制造的最大的并行计算机有 8000 多个处理器,Windows 不可能有能力管理这么多处理器,它用的是什么操作系统?答案是 Linux。

《泰坦尼克号》电影里的三维动画,那么细腻逼真,Windows机器能做出来吗?不行。那也是 Linux 机器做的。

民航总局用来训练地情人员的虚拟现实训练设备,Windows 当然无能为力。那都是商业的 IRIX 机器。

UNIX 是最早支持 TCP/IP 网络协议的系统。它上面有很多可以互相协作的网络服务程序,它们经过多年的使用和修订,已经达到比较完善的程度。而就在1997年,微软的比尔盖茨还在扬言:"Internet 是没有前途的。" 微软的这个"远见卓识"大家应该都已见识,它后来加上的网络服务程序IIS漏洞之多,让公安部都频频发出警报,大家也是见识了的。

其实你知道了,Windows 没有一样有用的事情能比 UNIX 干的更好。

Linux 干不了的有用的事情 Windows 照样干不了
当然 Linux 不是万能的。它也有不能干的事情,电脑也有干不了的事情。但是 Linux干不了的事情,Windows 肯定也干不了。这些事情就是我们需要探索,需要努力的事情了。在你探索的过程中,Linux 必定是你的好伙伴。

不要把Linux和Xwindow掩盖起来!不要把我们的用户当成傻瓜。

什么?你早就知道 Windows 是垃圾?噢!你怎么不早说呢!害我废话这么多。嘿嘿。

"好了。你知道 Windows 是垃圾,你现在用什么?quot;

"Linux + Xwindow"

"那我问你,Xwindow 是什么样的?"

"不就是跟 Windows 差不多吗?只不过 ‘Start‘ 按钮比较方,而且上面不是一个Windows 标志,而是一个脚丫子。点击一下居然还有很漂亮的中文菜单。我喜欢!"

"你知道什么是‘根窗口‘吗?"

"不知道。从来没听说过呢?"

"根窗口就是遮盖整个屏幕的那个最大的窗口。"

"哪儿有什么窗口啊!我没有看到呢?"

你发现了问题吗?这些 Linux 用户说是在用 Linux 和 Xwindow,但是他们对 Linux和 Xwindow 几乎完全不了解。很多人用了那么久 Xwindow 都不知道根窗口是什么东西,不知道其实按钮也是窗口,不知道窗口管理器和其它程序有什么关系,大家都以为窗口上面的按钮是程序自己放上去的,不知道窗口?quot;class name","resource name"是什么东西。他们也不知道 .Xdefaults 是用来干什么的。特别是他们很多人都不知道 Xwindow 的字体是如何命名的,什么是 fontset,有了一个新的字体也不知道怎么安装。

他们被遮在 Linux 之上的一层一层的包装迷惑了,他们等待有图形界面的工具来帮助完成一切事情,他们认为 Linux 跟 Windows 一样,只是麻烦一点。他们知道 Linux内核很好,但是他们感觉不到 Linux 和 Xwindow 在操作层面的天生的先进性,随后不久就把 Linux 完全删除掉了。你发现没有,要用户理解 UNIX 和 Xwindow 的操作层面的先进性,才是留住用户的最好办法。如果用户体会不到操作时的方便和高效,内核再好他们也不会理会。

但是用摹仿 Windows 的作法来吸引用户,永远会失败的。因为 Linux 如果摹仿Windows那一套低效率的方式,那么 Linux 的这套"低效率方式"永远比不上Windows 的那一套"低效率方式"。那么用户就会说:"这个 Linux,没有一样比的上 Windows。"

Linux 天生就是继承了 UNIX 的高效的工作方式,为什么我们要把它掩盖起来?我们为什么只告诉用户 KDE 的菜单怎么用?我们为什么不能像早期的 Xwindow 书籍那样第一节就告诉用户什么是 X server, 什么是 X client,什么是 Window Manager, 什么是根窗口。第二章就告诉用户窗口有哪些属性,什么是 classname, resource name, hint,怎样使用 .Xdefaults, xrdb ……

在这里我又不得不说一下那些 Linux 的发行公司和写书的人,他们把 Linux 和Xwindow 包装起来,却没有从基本上告诉用户 Xwindow 的工作原理。很多书籍讲授的层次就是在Gnome, KDE 的菜单操作的层次,靠大量抓图来占篇幅,"繁荣"Linux 书籍市场。

现在很多人已经把能够利用别人的库写出一个好看的程序作为自己编程水平的象征。在这?quot;图形化","可视化" 的年代,你如果还在用 troff, LaTeX 写文档,你还在用VIM 自己编辑 HTML,用 Mutt 处理邮件,你还在用文本模式的 gdb 调试程序,你还在用Xlib 写程序, 你还在用 tin 上 USENET,你还在自己写 Makefile,写机器代码,你还在玩 Clossal Cave 这样的字符模式冒险游戏,那你就是老古董。

其实这种思想是错误的。虽然你是一个坚决的 Linux 支持者,但是你的思想是 Windows的思想。你认为图形界面,菜单,按钮就可以解决一切问题,就可以给你高效方便。你还是没能摆脱微软给你的潜移默化的东西。你其实离不开 Windows 那样的环境,你迟早会删掉自己的 Linux。

GUI vs. CLI
做一个坚定不移的"两面派"

大家看到这个标题是不是热血沸腾?两派大虾都可以围攻我了:

GUI派用户:"哇!我一看你这小子就是 CLI 的。要不然自己写什么 Makefile?用什么Mutt?"

CLI派用户:"切~ 你还用 X!高手都不用 X。你是 GUI 那边的。"

可怜的我:"555~~ 你们都不要我~~ GUI 和 CLI 就那么水火不容吗?"

计算机界这样的门派之分还很多。很有特点的就是 CLI 和 GUI 了。CLI (Command LIne)的狂热份子声称永远不用 X。我上次在实验室看到一个同学用一个 SecureCRT 登录到Sun 机器,然后用一个 vanilla vi 编辑程序,我建议他启动一个 GVIM 过来显示在Exceed 上可以有语法加亮。但是他坚决反对,说:"高手不用X。你想想,要是我在一个很慢的网络连接怎么用 X?而且好多服务器没有装 X 程序。"

但是我们实验室的网速可够快,Windows 机器都有 Exceed 啊,而且 Sun 机器有全套X 客户程序包括 GVIM。他说他是 CLI 的坚决拥护者,但是他却在用 Windows,他后来打开了好几个 SecureCRT,每次从文本框输入地址,用户名和密码,从下拉菜单选择"SSH2",然后点击"Connnect"。他还不断的夸SecureCRT是"网络管理员投票选出的最受欢迎的登录方式"。老天,SecureCRT 本身就是个 GUI 啊,他其实没有明白Xwindow 的好处。

你说我是 GUI 的?我虽然很少在 console 下工作。但是我对 bash, VIM 很熟悉,我可以让 bash 按照我的键绑定方式来工作。我可以在 rxvt 里使用 Mutt 来收发 email。我的每个桌面上都常常堆放着一打不同大小的 rxvt。我用 VIM 编辑 LaTeX。我自己写Makefile 来维护 LaTeX 文档。我有时用 mpg321 来放 mp3。我上BBS用的我自己写的expect 脚本。 好了,CLI 派的朋友可以收我做盟友了

你说我是 CLI 的老古董?我的 FVWM 被我配置为可以"手写操作",我只要画一个"r"就可以启动 rxvt,我只要画一个 "U" 就可以启动 GVIM,…… 我用 GVIM 语法加亮模式编辑程序,我用 Mozilla 浏览网页,…… GUI 派的现在好像认我做朋友了

好了。CLI 派的朋友,虽然我很喜欢命令行,但是我有时在屏幕上左右画一下就可以执行:

Module FvwmConsole -terminal rxvt -geometry 45x5-0+0 -bg gold -fg midnightblue -fn "-adobe-courier-medium-r-*-*-14-*-*-*-*-*-*-*"
你是不是现在又想把我逐出师门?

GUI 派的朋友,虽然我很喜欢窗口。但是我可以在 FvwmConsole 里输入:

All (rxvt) MoveToDesk
把我所有的 rxvt 移动到我现在工作的桌面。"这家伙,怎么这么快就叛变了!"

其实何必分什么 GUI 和 CLI,UNIX 和 Xwindow 都是工业标准,它们从设计那天开始就有非常灵活的用法,各个程序,不管是 GUI 还是命令行的都可以互相协作。UNIX 和X 是一家,何必搞的那么偏激,非此即彼?你从我上面的行为可以看出 GUI 和 CLI的模糊界线吗?我就是坚定不移的"两面派"。

UNIX 是简单的--
"我相信简单就是最好,如果太复杂,我是不能理解的。" -Seymour Cray

很多第一次用 Linux 的人会惊奇的发现,Linux 的程序居然不?quot;安装"就可以运行,程序拷贝到随便那个目录都可以用,而不是一定要占用你第一个分区的空间。程序的设置只是一些简简单单的文本文件。你根本不需要什么"注册表修改器" 就可以改变系统的设置。这就叫做简单,但是简单就是美。虽然这只是 UNIX 简单性的一个肤浅的认识,你已经体会到了某些东西。

但是简单并不意味着功能弱,并不意味着落后。相反,简单意味着强大,意味着生命力。

我不会再继续阐述我理解到的"UNIX 的简单",因为这个需要自己去体会。

UNIX 是永恒的
有人说:"Plan9 会取代 UNIX,Mach 会取代 Linux 内核。"

但是你如果是一个深入体会了 UNIX 的人,你就会知道:UNIX 的思想是永恒的,不管时过境迁,Plan9 是否代替 UNIX,UNIX 的灵魂都会在 Plan9 身上现形!

我为同一个设备写过 Linux 内核和 Windows VxD 驱动程序。写 Linux 驱动程序时,我对 UNIX 设计的完美的一致性,远见性所折服。UNIX 用同样界面的 read(), write()系统调用就可以对不同的对象:普通文件,设备文件,管道,管道文件,socket,……进行统一的读写操作。我跟本不需要写一个测试用的应用程序就可以对我的设备驱动进行测试,因为 cat, cp, dd, 它们也使用了同样的 read(), write(),设备和普通文件在应用程序眼里没有区别。在那个还没有 Smalltalk, 没有 C++ 的年代,UNIX 的设计者已经使用了所谓的 "面向对象方法"。对,C 语言也可以实现面向对象。

UNIX 的系统调用几十年都没有很大变化,这非但不是顽固,不进步的象征,反而是UNIX 的远见卓识的体现!这就跟 TeX 程序几十年都不变的情况差不多。这些才是真正的永恒的 master piece! 你应该改变所有软件都必需从 0.1, 1.0, 1.1, 1.2, 2.0,..., 3.0, 3.1, 95, 98, 2000, XP, ... 不断升级的想法。

Windows 就不同了,它在最开头只是一个 DOS 之上的图形包装而已。后来为了兼容以前的糟糕设计,不得不加上很多累赘。我写 VxD 驱动程序的时候就深有体会,Windows 95 程序对设备的操作只有用 DeviceIoControl,我不得不写了两个应用程序来对设备驱动进行测试。Windows 内核的不一致性和隐密性使我非常恼火。不过 Windows WDM驱动程序现在也有了 ReadFile, WriteFile,…… 那说明什么?那说明 Windows 在向UNIX 学习,或者有可能是某个 UNIX 设计人员在微软打了几天临工,顺手加了几个UNIX 的东西进去。这样做是没有用的,Windows 从一开始就是非常糟糕的设计,它的历史的包袱太沉重了,缝缝补补有什么用?它只能永远的被 UNIX 甩在身后!

UNIX 是强大的
让聪明人干任何他们想干的事情。

UNIX 的一个特点就是非常高的灵活性,Xwindow 也具有这种灵活性。这种灵活性体现在哪里呢?

UNIX 的程序一般都有很多参数,不管你现在用的着用不着,总有人需要某些参数。它们的行为很多都可以用配置文件来改变。比如 GNU bash, 通常缺省的命令行输入方式是 Emacs 方式,但是只要我编辑一个 .inputrc 文件,就可以把它变成 vi 的输入方式,而且我还可以自己绑定键序列到某些操作。我可以用 shopt 来设置它的很多特点,比如是否进行通配符扩展,是否可以把一个变量当作一个目录来cd,是否可以自动纠正某些明显的目录名打字错误 ……

UNIX 程序设计的思想是提供给用户"机制",而不限制用户制定"政策"。这是一个重要的尊重用户的作法。

我们再来看看 Xwindow。Xwindow 是一个出色的设计,它把显示服务器和客户程序分开。一个显示上既可以显示本机上的程序,也可以显示别的机器上的 X 程序,而它们都遵守你的窗口管理器的统一指挥,它们之间可以方便的传送剪贴版数据,各种事件 …… 比如有时我的 XFree86 上会出现四个不同机器上的 XTerm,两个不同机器上的 GVIM,…… 它们统一受本机上的 FVWM 指挥。

Xwindow 程序都具有很多很多命令行参数和 resource 参数。你可以随意的在命令行或者 .Xdefaults 文件设置所有的颜色,字体,尺寸…… 而且如果你用 xrdb 把 .Xdefaults 导入到根窗口,那么其它机器上没有经过配置的同样的程序,显示到你的机器上的时候也会遵守同样的外观规定。

Xwindow 的窗口具有 Property, 也就是一些可以自己定义的共享数据(原子)。正是因为这些 Property 的存在,使得 Xwindow 具有无比强大的生命力。X 的窗口管理器和其它客户程序之间并没有统一的协议,但是后来出现了 ICCCM(客户程序间通信规范),这个规范就是通过 property 定义的。现在又有人定义了一套"扩展的窗口协议(EWM Hints)",使得Xwindow 可以具有某些 Windows 的特征,比如一个工具条程序可以告诉窗口管理器:"这个屏幕下面被我占据了24个像素的空间,你最大化程序的时候不要越过这个界线。"

一个强大的窗口管理程序比如 FVWM,它收到这样的提示时,可以答应工具条程序的这个要求,也可以不答应。一切选择的权力在于谁?当然是用户了!

你想想,是不是有些 Windows 程序常常弹出一个窗口要你选择 "Yes or No"?你不点击它它就不下去。你觉不觉得你的程序在侵犯你的尊严?你是一个人,一个智慧的生物,怎能受到一个程序如此的待遇?

还有就是很多 Windows 程序把人当成傻瓜,而它是"智能程序"。比如,有一个程序就是喜欢把你的每句话第一个字母都变成大写,我不说它是谁了,你遇到的时候就知道了。

如果连"一句话开头一个字母要大写"这么明显的问题都需要程序帮你纠正的话,人脑还用来干什么?况且如果你故意想要不大写的话,那就更麻烦了,我楞是没有从它那一大堆菜单里找到怎么关闭这个愚蠢的选项。

只有符号才能完全操纵计算机。

我们来说说很多初学 Linux 的用户。虽然他们在用 Linux,但是他们打心眼儿里是觉得Windows 的工作方式好,他们希望 Linux 有一天能"像Windows那样"。你说:"我的鼠标一点,我菜单一拉,…… 就可以完成我的操作。" 但是我要告诉你:"Linux 从来没有摹仿 Windows,将来也不会。Linux 从诞生之日起,它的工作方式就比 Windows 的先进。

Linux 属于能勇敢面对符号的人。只有符号才能完全操纵计算机。"

看看优秀的 UNIX 程序,XFree86, FVWM, VIM, Emacs, proftpd, Mutt, wget, tin, ... 没有一个不是用配置文件来设置选项的。为什么这些程序没有方便的菜单可以用来配置?难道它们的设计者就那么低能,连个图形配置界面也写不出来?

当然不是。因为图形界面配置方式的能力是极其有限的,而配置文件和程序语言的表达能力却是无限的。用图形界面配置这些程序的话,如果你想达到配置文件的效果,你需要成百上千的菜单,checkbox, radio button, ... 到时候你根本没办法找到你需要修改的地方了!而各个程序的配置文件的语法都有很多相似之处,一般就是一些命令,设置一些变量,参数,…… 一旦用会了一个,其它的也就容易理解了。如果你用惯了 awk, sed, Perl,你会觉得那才是真正的自动化啊。

鼠标虽然是很好的工具,但是它的表达能力是有限的。你不可能光用鼠标就让电脑完全明白你的意思,它毕竟只有3个按钮。看看我的MetaPost页你就能体会到鼠标的这一弱点。所以我们虽然很喜欢鼠标,但是却不能完全依赖它。

各个小程序的完美配合

这就是UNIX最重要的特点了,它就是UNIX设计的思想。让每个程序只具有一项专门的能力,然后让它们合作。Xwindow也继承了这种好传统。这恐怕就是Windows和其它操作系统望尘末及的地方了。UNIX 程序设计之统一,配合之完美,真使我难以置信!shell, grep, find, awk, sed, make, Perl, Emacs, vi, tin, Mutt, ... 它们是那么的具有一致性!你一旦学会了 sed 的正则表达式,其它程序基本上都能用了。你一旦学会了vi 和 VIM, 你会发现它的操作是那么的有规律性,似乎vi的设计者在几十年前就已经设计好了 VIM 在今天的完美而统一的操作方式!而且vi的操作还体现在 Mutt, tin 等很多程序中。你甚至可以把 bash 设置为 vi 的输入方式来输入命令行,我就是这么做的。一个程序可以调用另外一个程序来得到数据,可以把数据交给它处理后返回来,可以在自己的窗口里"嵌入"另外一个程序。

在 Windows 和其它非 UNIX 操作系统中,这种合作是非常困难的。我曾经在Windows下使用 Perl来进行一些自动工作。但是 Windows 的文件操作,管道是如此的不稳定,程序之间基本不能合作。你别想在 Visual Studio 窗口里面嵌入 UltraEdit 编辑器,你别想用一个 expect 脚本来控制 telnet 到水木清华BBS。

Windows 的程序都是大而全,大而杂,所有的电子邮件程序都需要自己提供编辑器,自己发送和收取邮件,自己显示邮件的附件。每一个BBS程序都提供自己的Virtual Terminal, 自己的通讯代码。每一个 IDE 都自己提供编辑器,编译器,汇编器,调试器。人们为了使用一种新的程序,需要适应所有这些它提供的界面,而不能使用自己喜欢的编辑器的键绑定,菜单组织…… 不能 DIY!

你要知道,最高级的电脑是定做的,自己想要什么什么CPU,什么主板,多少内存,什么硬盘,键盘,鼠标,显示器都是自己选择的。最高级的滑板,自己想要什么牌子的版面,什么牌子的沙,什么桥,什么轮子,什么轴承,也都是自己选的。最高级的古球拍,木板,胶皮,海绵,胶水都是可以自己选择…… 而用 Windows 程序,你得到的是大杂烩,就像你去买"品牌机",只有那么几种配置,而且附带很多你不需要的软件和服务;就像你去买组装好的滑板,你想要大一点的轮子和窄一点的板子,但是你没有这种选择余地!Windows 程序就相当于最廉价,最次的滑板。但是它却会花你更多的钱,因为一旦一个部件坏了,或者你不喜欢了,你不能另外找一个好的换掉它,你必需重新买全套配件!

而 UNIX 和 Xwindow 就是高档的"组装货"。比如我用 Mutt 的时候,我可以用 VIM也可以用 pico 来编辑邮件,我可以用 ImageMagick 也可以用 xv 来显示附件里的图片,我可以用 lynx 把 HTML 附件转成文本嵌入窗口中,我也可以把 HTML 附件交给Mozilla 图形显示。我可以让 GnuPG 帮我把邮件进行数字签名和加密,我也可以用其它 PGP 程序。

我想让 Postfix 而不是 sendmail 帮我发出邮件,我想让 fetchmail 帮我收邮件,转发给 postfix,然后被我自己写的Perl过滤器处理…… 这一切我都可以办到!我可以选择我最喜欢的专门的程序来完成专门的工作,然后把它们结合在一起,我也可以分别得到它们的好处。

学 UNIX 绝对不是浪费时间
有人告诉我:"你看我用 Windows 什么都不用学。而用 Linux,光是安装就花了我一个星期!"

首先,我要告诉你的是,你装 Linux 花了一个星期,不是因为 Linux 不好装,而是因为你已经习惯了 Windows,对 Linux 最初难以理解而已。你想一想你最初安装Windows的时候呢?你花了多少时间搞明白什么是硬盘分区?什么是盘符?什么是目录?你认为Windows 就是那么容易可以学会的吗?虽然你觉得没花时间学,但是你以前在用别人的机器的时候已经耳濡目染,自然就了解了。而且由于你想要 Linux 和 Windows 并存于硬盘上,又增加了安装难度。而且你肯定没有得到有经验的 Linux 用户的帮助,否则他们会在20分种之内帮你搞定。一个星期也太夸张了.

如果一开始用的就是Linux就没有这个问题。你想想如果你没有用过 windows,你肯定会很习惯 /etc, /usr, /usr/local ,... 而不是 C:, D:, E:, ... 是不是?如果你只用过Linux,你第一次用 windows 时恐怕也会问:"/bin 目录哪里去了啊?"

最重要的是,你用惯了的UNIX工具,它们可以伴随你一生,而不会那么容易变化或消失。你可以永远不用再换另外的工具了。除非那个工具比你这个好的太多,而且可以完全模拟你现在的工具。

我们实验室一个60多岁的老师,用vi, cc, make, ...都几十年了,他以前的经验绝对没有白费,而且教会了我们一批又一批的学生。vi 伴随着 UNIX 的最初发行而诞生,直到今天还是世界上头两号编辑器之一!有些人的 FVWM 配置文件已经用了 10 多年,现在完全不经修改还可以用。

看看 Windows 的工具,你从 Borland C++ 换到 VC, 就必需适应新的环境:菜单不同了,颜色不同了,按钮不同了,帮助信息不同了,热键不同了,编译器参数,调试器功能也不同了,…… 那个时候恐怕花要花你很多时间去适应。当你刚刚适应了 VC, 你又要换成VJ, PowerBuilder, C++Builder, ...

很多windows程序员都是这样,开头在dos下用Turbo C, 然后是 Borland C, VC, C++ Builder, ......不断追赶微软的潮流。而且微软的SDK, MFC, .NET …… 什么都在不断变化,不断出问题,又不断的在修改…… Windows 程序员不得不买又厚又重的 Microsoft Press 的书籍,看了才一个月,又过时了。今天你才学会了写 VxD,明天你就必须用WDM 了。你不得不注册 MSDN 才能赶上 Microsoft 的步伐。很多人说:"计算机是贵族的专业。" 这就是微软一手造成的。

这些东西才是没完没了的浪费大家的时间和金钱的。这是是浪费生命!我们为什么不使用从诞生就那么一致和完美的 UNIX?你需要理解先进工具的设计理念。UNIX 的工具就像我们用的汽车,它的离合器,油门,刹车,方向盘,后视镜,永远都在同样的位置。用惯了的话,你对你的汽车的每一个部件都会了如指掌,甚至你自己都可以修车了。这难道不好吗?

有人说:"你说我们需要了解 UNIX,难道你要开车还必须了解汽车的结构吗?" 你去问问开车的司机,哪一个不了解汽车的结构的,那他的驾照就是混来的。你难道想要傻瓜型的"微软牌汽车"吗?我们来看看:

你买的微软牌汽车最开头只有一个座位,每加一个座位你得向汽车公司付钱。车上的防撞气囊不时会冒出来,说是为了你的安全。每开100英里要大修一次,每过一年要换一次引擎。附带的,你还必须换用由微软汽车公司指定的石油公司提供的新型号的机油。你的车出了问题,但是法律规定,你不准私自拆开你的汽车来修理,你必需到微软汽车公司指定的维修点去,需要付相当多的钱才能修好一个小毛病。

最可气的是,你每换一个型号的微软牌汽车,它的刹车和离合器都在不同的位置,你需要重新去考驾驶执照。如果这辆汽车在途中刹车失灵,你受了重伤,你也不能状告微软汽车公司,因为你买来汽车之后必须签一个合同,说"由于微软牌汽车对你和家人造成的一切死伤,微软概不负责。"

怎样完全用 GNU/Linux 工作

说了这么多 Windows 的不好。我还没有告诉你我怎么用 Linux 处理有些必要的事情。半年以前我由于中文老是配置不好,一直是双系统,不时需要重起到 Win2k 来处理汉字。后来我找到了 miniChinput, XSIM 和 SCIM 输入法。这下可以处理汉字了。而且 VIM 和Emacs 对汉字支持越来越好。我的大部分文本是用 VIM 编辑的,包括程序,信件,网页,LaTeX 论文,MetaPost 绘图语言。

我不用 Word 这样的程序写论文,而是用 LaTeX,因为这是世界上效果最好,最方便的论文工具,是大多数学术杂志要求的格式。幻灯都是用 ConTeXt 做的,用起来很简单,而且效果非常漂亮。你可以看看我的TeX介绍。

至于绘图,你可以用很多可视化的工具,比如 xfig,dia。但是对于我来说,任何可视化的工具都不能完成某些任务,我需要一种可以精确描述图形的语言。我找到了MetaPost。它简单又好用,而且效果是世界一流的。我的插图,如果不是图像,都是MetaPost 画出来的。

我曾经抱怨 mozilla-mail 经常突然消失,损坏我好几封快要完成的信件。后来我发现mozilla 的邮件处理程序确实是不稳定的,功能又弱,有经验的 UNIX 用户都不用这样的程序。Mutt 是一个非常稳定可靠的 UNIX 邮件处理程序,而且功能非常强大。我曾经为 Gnome 和 KDE 的不稳定而烦恼。现在我找到了非常强大的 FVWM。KDE,Gnome也能和 FVWM 一起工作。虽然 Gnome 和 KDE 总体不稳定,但是某些部件程序还不错,很多 gtk, Qt 的程序也很不错,它们很多都是可以独立于这些桌面环境运行的。

Linux 有很多强大方便的工作方式是 Windows 没有的,或者有类似的东西,但是很差劲或者用起来不方便。比如 ssh 服务,rsync,cvs,expect ……

结论

我写这么多的目的是什么?我希望喜欢 Linux 的朋友,完全清除微软和 Windows 灌输在你脑子里的谬论,别再相信它们所谓的"新技术",别再追赶 Windows,因为追赶Windows = 倒退。马克思有一个思想很重要,"新生事物并不一定是在最近出现的。"

UNIX,Xwindow, TeX 虽然都比 Windows 先出现,但是它们才是先进生产力的代表。我们要清楚的认识到什么才是真正的现代化,什么才是真正的自动化。

消除学计算机很难的幻觉,勇敢的拿起像 bash, FVWM, TeX, VIM, Emacs, Mutt ……这样强大的程序,勇敢的面对符号。不要再埋怨"Linux 为什么不能像 Windows 那样",不要再浪费时间试用这样那样的程序,不要再忙着升级。你需要理解 UNIX 的工作方式,因为那是大多数科学家的工作方式。Linux 可以成为你的好朋友,你需要认识它,了解它,信任它,才能完全的靠它来高效的工作。当然,在游戏机,手机,掌上电脑里,或者在用电脑来娱乐的时候,用一些"傻瓜软件"还是不错的.

我希望小学,中学的计算机老师能够提高自己的素质,在孩子们的启蒙教育中充分利用Linux 神秘的特点,引起孩子们对数学,对符号的好奇心。诱导他们用计算机来解决世界上的有趣问题,而不要把教学的范围局限于计算机的操作和它自身的问题。

附录: 我用来处理日常事务的 Linux 程序
好了好了。我知道你发现自己应该转向 Linux,你很后悔当初为什么中了微软的邪。但是不要着急。因为这些东西本来只是工具,它们是用来完成你的主要任务的辅助而已。你以前选错了工具,这不要紧。你还是拥有你自己原来的专业技能,那才是最重要的。工具的东西只有慢慢适应转换,不能一蹴而就,否则你会感到非常没意思,甚至放弃。

如果你只想做一个像我这样的普通用户,主要目的是用 Linux 来完成自己的任务,那就可以不用系统管理员或者网络管理员的标准来要求自己,因为当一个系统和网络管理员确实很辛苦。这里我对实验室的网管同学鞠一躬,谢谢你的指点和帮助. 不用把你的机器当成网络服务器,不用开放没有必要的服务,设置好 ssh, ftp 已经足够了。这样会省去了解很多没必要了解的东西的时间。不用过度考虑"安全",因为 Linux 缺省已经很安全了。不过你有兴趣了解更多那也无妨。

下面给出一些推荐使用的可以处理一般事情的程序。至于你的专业上要用到的科学和工程软件比如 Matlab, Mathematica, Maple, HSpice, Design Compiler, …… 还有其它物理上的,化学上的,生物上的 …… 都必然有 Linux 和 UNIX 的版本。当然他们很多不是免费的,不要总是觉得什么都应该免费,自由不等于免费。它们是经过很多人辛勤劳动的产物,是可靠的程序,它们物有所值。

下面列出我常用的一些 Linux 程序。一个列表里可能有很多,那是为了方便你来选择,我列出了比较信得过的。但其实很多只有第一个是我真正在用的,我不喜欢试用程序。我不是一个合格的网络管理员,我的服务器都只设置了我自己需要的功能,那样可以省去我很多麻烦。

Shell: bash。它结合了 csh 和 ksh 的优点,并且有 readline 功能,你可以随意绑定自己的键盘。
编辑器: VIM, Emacs。
程序开发: GCC, make, ld, Scheme48, j2sdk, Perl, Python, Tcl/Tk ...
论文,幻灯工具:LaTeX, ConTeXt
绘图工具:MetaPost。这个语言太强了,以至于我只用它了。你不熟悉的话可以用xfig, dia 来画一些流程图之类的图片。
图像处理:ImageMagick。其中的 import 程序可以屏幕抓图,convert 程序可以转换图像格式,display 可以显示图片和简单编辑(缩放,换质量,转格式,简单绘图,简单虑镜)。通常我就这么点需要。如果你要更强大的图像工具可以用 Gimp, 它几乎和Photoshop差不多。
自动管理工具:make。我可以用make来自动编译程序,自动编译文档,自动更新插图…… 全自动,而且不会重复劳动。
数值计算程序:SciLab。这个程序基本上可以代替 Matlab。
代数计算程序:MAXIMA。这个程序基于世界上最老的计算机代数系统之一: 由美国能源部(DOE)发行的 MIT Macsyma 系统。它是用 Common Lisp 实现的。很多现在的符号计算程序比如 Maple 都从 MAXIMA 身上学到很多东西。它现在经过 DOE 批准以GPL发行,永远是一个自由软件。
加密程序:GnuPG。我的 PGP 密钥就是它搞出来的。
打包,压缩程序。什么都有: tar, gzip, bzip2, zip, rar, ...
虚拟光驱程序。Linux 不需要虚拟光驱程序,直接 mount 就行了。
ftp 服务器:proftpd, vsftpd。proftpd 功能很强,但是我只用了最简单的一种设置。
WWW 服务器:apache。(我一般没有开)
ftp 客户程序:lftp,ncftp。它们都是文本方式操作的,但是比起图形界面的方便的多。比如 lftp 几乎具有 bash 的所有方便功能,Tab 补全,bookmark, queue, 后台下载,镜像…… Linux 也有图形界面的 ftp 客户程序,但是大多不稳定,有很多问题。这就是很多人抱怨 Linux 不如 Windows 的一个小原因。还有很多人用 Wine 模拟 Windows 的leapftp,其实 lftp 比 leapftp 好很多,你需要的只是适应一下。
自动下载工具:wget。它非常稳定,有一次我下载一个程序,用 IE 和 Mozilla 下载回来的文件都是坏的,最后还是 wget 可靠的传输了数据。用它甚至可以镜像整个网站,比起WebZip 这样的 Windows 程序强多了,而且不会因为你不付钱就在下载回来的网页里强制插入广告。
虚拟终端:rxvt, xterm, gnome-terminal, mlterm, ...
X server: XFree86
窗口管理器:FVWM。编译加入了 libstroke。
中文输入:XSIM。被我修改过以适应 FVWM 的需要。另外推荐你还可以用 SCIM。
email 处理:Mutt + Postfix + fetchmail
看 PDF, PS, DJVU 文件:Acrobat Reader, xpdf, GhostScript, gv, djvu工具包和netscape 插件。
看CAJ文档。我从来不看CAJ之类的文档,如果找不到PDF或PS,直接去图书馆借最好。
看网页:Mozilla, Phoenix, lynx。Mozilla-Xft 的显示效果比IE 好很多。
英汉字典:IBM智能词典,星际译王。
编辑网页:我用VIM 直接写 HTML。你如果想要图形方式的可以用其它的比如screem, BlueFish。
登录其它 UNIX, Linux 机器:openSSH, telnet。 我喜欢用 openSSH 把其它机器的X 程序通过 ssh 加密的隧道传到我机器上显示。
登录 Windows2000 server 的 display service: rdesktop,...我有一天试了一下,不错。后来就没有用过了。
同步程序:rsync。我用 rsync 通过 ssh 来跟某些机器同步数据,或者做自己机器上不同目录间的同步。
上BBS:rxvt(或任何一种终端) + telnet + chatbot(helloooo 机器人的程序)
QQ, ICQ: 我没有 QQ 或 ICQ。不过你可以用 Gaim, 它同时支持 QQ, ICQ 和很多其它的即时通信方式。ICQ 用户也可以用 Licq。
放录像:MPlayer, RealPlayer。MPlayer 太好了,直接就可以放 VCD, DVD, divx, wma, wmv ... 用 Windows 的同学都很羡慕我,说 Windows 要放这个需要大堆插件。rm 最好还是用 realplayer 放,它也是免费的。
放音乐: xmms(mp3,ogg都可以), mpg321(放mp3), ogg123(放ogg)。mpg321 不如xmms管理音乐文件那么方便,但是有时我还是用 mpg321 放 mp3 作为背景音乐,因为懒得开一个xmms窗口:-)
游戏:我觉得 KDE 的那个 ksokoban(推箱子),很好玩 :-)
看 Word 文档。请 Word 用户把文档全部转为 PDF 或 PS 再给我,文档里没有特殊的格式干脆就用文本吧,何必那么麻烦。以前很奇怪的是,通知里本来没有什么特殊的格式居然还要发doc附件的email。现在好了,我们系发通知都用文本,PDF,甚至图片了。
其它程序:还有很多我需要用而你不一定用得着的。比如,Doctor Scheme,
Scheme48, Scsh, kawa...这些程序只有 Doctor Scheme 有Windows版本。还有很多幕后工作但是你一般不察觉的:xinetd, telnetd, sshd, crond, atd, lpd, ... 他们都比 Windows 的对应者强的多,或者根本没有对应者。

附:

写给支持和反对《完全用Linux工作》的人们
作者:王垠

在一阵阵唾骂和欢呼声中,《完全用linux工作》被转载到了天涯海角。很多人支持我,也有很多人唾骂我。我不知道它是怎样流传到那么多地方,其实我不知道它都被转到哪里去了…… 我知道现在这篇文章又会罗里罗索写很长(因为我计划写这样一个东西已经很久了,坐在Emacs前面总是有一种巫师在炼丹的感觉……),所以先提出中心思想吧。中心思想就是:

我只是一个傻瓜。看《完全用Linux 工作》的时候请用你们自己的判断力。

几乎所有人都承认,那篇文章很偏激。当时的情况是这样,我用 Linux 的时候被一个同学鄙视了,说:"你怎么用像 DOS 一样落后的东西,真土!看我漂亮的 Win2000..." 这跟当面嘲笑别人老婆或者妈妈有什么区别?我义愤填膺啊,就几乎跟他吵起来。然后就写出了这篇文章放在主页上,叫了几个人来看。接着我珍爱的 TeX 又受到众人鄙视,于是我又写了一篇文章打击 Word,然后把 TeX 捧上了天。道理很简单,鄙视我喜欢的东西的人就是敌人 --邪教徒或者恐怖分子--他支持的我就反对,他反对的我就支持。为了使人信服,举例必用大科学家,世界一流大学,一流实验室的名号,虽然我不跟其中任何一种沾边。还好那时候我还不认识上帝,要不就打他的名字了。论据不管是实际经历还是自己推测的,先写上去再说。扬眉吐气啊!隔壁微软研究院的哥们居然都被我打动了,开始写 Linux 程序,学用 LaTeX 和 Emacs。不过几天之后我就把它删掉了,因为我自己都感觉到偏激。

于是就没管那篇文章了。可是没想到它竟然已经被转载到那么多地方,似乎引起不小的波澜。有段时间每天都收到十几封email,国内的,国外的,问技术问题的,夸我的,骂我的,讲道理的,鄙视我的,想交朋友的,语重心长的,号称要删掉机器上的 Windows 的…… 我的主页居然也占据了"王垠"在 Google 上的首选位置,把那个日本的什么王公贵族"李王垠殿下"都挤下去了。大家似乎都知道我天花乱坠的本事了,有人就想找我写文章向别人推荐商业软件,我很后悔没有趁机狠狠赚一笔。走到图书馆,亮出借书证,管理员张大了嘴说:"哇!你就是那个 Linux 牛人啊!",也不知道他是褒是贬。甚至有人把他的 BBS 昵称都改成了"坚决拥护精神领袖花生" (花生是我的外号)。为此还骗到了好几顿报告?quot;报告"是清华专用动词,意思是请客吃饭)。虽然我觉得自己身上没有什么值得自豪的东西,但是又有点为自己兴风作浪的本事感到惊讶。虽然我一再告诫自己要谦虚,但是不由的有一种毛泽东,甘地,甚至摩西的感觉。我更加体会到"网络上没有人知道你是一头猪"的真理性。其实,不但网络上没有人知道我是一头猪,实际生活中也没有人知道,其实我是一头笨猪。

这么长的时间之后,还有人写信给我说"深受鼓舞","提壶灌顶","对不起我还在用 Windows 给你写信","真想删掉Windows 啊" …… 我很好奇,我的文章真的有那么大的威力?我再看这篇文章,觉得有点惨不忍睹,看了开头就不忍心再看下去。我告诉同学我很后悔写了一篇这么偏激的文章,可是他?quot;徼枉必须过正,你没有错",所以我也搞不清楚自己这样写对不对,这样自责对不对。就像我从来不敢看自己照片,却有时被人称为帅哥,就让我无法判断自己是否帅一样。所以现在我就开始怀疑我自己是否真是一头笨猪。也许多年以后,我会正确的评价我的想法。就像我现在觉得我15岁的照片挺养眼一样,也许我会发现自己其实是一头聪明猪?

写这篇文章不是为了让自己免得被骂,也不是为了显示高深的猪的哲理。只是因为我深深的感到人应该有自己的判断力,不要简单的接受别人说的 DO‘s 和 DONT‘s。怀疑一切,同时又敞开心扉去了解一切。

看过《完全用Linux工作》的朋友,请仔细检查里面的 DO‘s 和 DONT‘s。

-------------------------------------------------

再转一篇王垠同学的文章,很强大,很早看过,今天偶然再次看到,转来。

Emacs 编辑器/学习资料汇集

Emacs 编辑器

Emacs 是什么的简称?

Emacs 能做什么一个简略的介绍,讲述一下我已经知道的 Emacs 的功能。

Emacs 资料

这里可以找到很多有关 Emacs 的资料。包括入门书籍,网址等。

Emacs Lisp 功能扩展集锦

我搜集到的一些很好的 emacs 扩展。它们使得 Emacs 成为一个多 才多艺的编辑器。

Emacs 笔记

这里简要记录一些 Emacs 的使用技巧。便于查询。

  1. Emacs 键绑定技巧
  2. Emacs 的一些简单舒服的 设置
  3. 移动光标命令总结
  4. Emacs Fill 详解
  5. Outline Mode 详解

from http://www.people.ku.edu/~syliu/shredderyin/emacs.html