ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

#

我们要理解X的字体引擎. X中支持Truetype字体(一种可放缩字体) 的主要有四种引擎. freetype, xtt, xfs和Xft.

首先, 我们要理解X的字体引擎. X中支持Truetype字体(一种可放缩字体) 的主要有四种引擎. freetype, xtt, xfs和Xft.

其中freetype 和 xtt 是 X 的内部模块. 使用的都是freetype1渲染引擎.

Xfs 和xft 是外部服务程序. xfs 是系统级的字体服务程序, 也可以作为X的内部模块, 使用的是X 内部的freetype2. Xft 和其他类库一样, 只有被调用的时候才被加载. 其中只有xft才有antialias 支持.

这 里有必要讲讲freetype. Freetype 是开源字体渲染引擎, 并不只为X设计. 它的功能就是读取Truetype字体信息, 如大小, 分辨率, 编码等, 然后渲染成所需的位图数据输出. Freetype 现在的版本是 2.x, 与1.0 相比, 最大的差别就是加入了抗锯齿功能.

有这么多引擎,到底要用哪个好? 其实我们目前为止, 支持中文最好的还是xtt. 因为小字体的时候, 用函数描述法算出来的中文字体效果不能让人满意, 所以很多中文字体公司就在Truetype字体里嵌入了位图字体. 这些位图字体需要用特殊的方式读出来, 所有的引擎中就只有xtt能做到这一点.

我们下一步就是将字体添加到X中, 使xtt可以正确读取, 这样就可以了.

首先, 由于要配置Linux系统文件, 我们需要用root帐号进入, 相当于windows下的administrator.

X的配置文件是/etc/XF86Config-4 (比较新的显卡) 或者是 XF86Config (比较老的显卡). 用你喜欢的文本编辑器打开, 如 kedit或gedit.

打开后我们发现配置文件分成很多个Section, 我们首先要配置的就是 Section "Files" , 这个部分描述了X所要调用的文件信息.

要加入一个字体目录, 只需在里面插入一行 FontPath "目录名" 就可以了, 如:

Section "Files"
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Mandrake 6.0 and later now use a font server independent of
# the X server to render fonts.
FontPath "unix/:-1"
FontPath "/truetype" # 插入一个字体目录
EndSection

然后, 我们让X加载xtt字体引擎:

找到Section "Module", 像这样修改:

Section "Module"
# Load "dbe" # Double-Buffering Extension
# Load "v4l" # Video for Linux
Load "extmod"
Load "glx
# Load "type1" # type1 模组是渲染type1字体的, 和xtt冲突, 必需屏蔽
# Load "freetype" # freetype 模组是渲染Truetype字体的, 和xtt冲突, 必需屏蔽
Load "xtt" # 加入xtt模组引擎
EndSection

好了, 现在xtt会自动去 /truetype 里找字体.

现在开始拷贝字体到 /truetype里去, 先要在根目录建一个truetype目录, 打

mkdir /truetype

就可以了.

从windows分区拷贝要先mount, 就是作一个联接, 将Linux目录连到windows分区. 在根目录下建一个"c"目录.

mkdir /c

然后

mount /dev/hda1 /c

这样就将windows下的C盘 联接到我们Linux下的/c目录了, 进入/c, 应该可以看到你C盘的文件.

然后, 进入/c 中的字体文件目录, 一般在window下面的Fonts里, 注意目录名大小写在Linux下面是有区别的.

拷贝字体文件到 /truetype里, 打

cp simsun.ttc /truetype/simsun.ttf
cp tahoma* /truetype/

这样就将我们所需要的字体文件拷贝到truetype 里了.

下一步我们要设置字体文件, Linux中X的字体设置很烦锁, 不像windows一拷贝就完事, 初级阶段嘛, 大家还是忍忍吧, 呵呵.

1. 建立字体信息文件fonts.dir

如下

24
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-c-0-gb2312.1980-0
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-c-0-gb2312.1980-0
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-c-0-gb2312.1980-0
tahoma.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-1
ai=0.3:tahoma.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-iso8859-1
tahomabd.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-iso8859-1
ai=0.3:tahomabd.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-iso8859-1
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-gbk-0
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-gbk-0
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-gbk-0
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-gbk-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-fcd8859-15
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-fcd8859-15
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-fcd8859-15
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-fcd8859-15
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-15
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-p-0-iso8859-15
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-p-0-iso8859-15
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-iso8859-15
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-iso10646-1
ai=0.3:simsun.ttf -misc-SimSun-medium-i-normal--0-0-0-0-c-0-iso10646-1
ds=y:simsun.ttf -misc-SimSun-bold-r-normal--0-0-0-0-c-0-iso10646-1
ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-c-0-iso10646-1

第一行的24表示下面一共有24行设置 (好像有点傻) , 其他的格式都差不多:

ds=y:ai=0.3:simsun.ttf -misc-SimSun-bold-i-normal--0-0-0-0-p-0-gbk-0

说明:

simsun.ttf: 字体文件名

ds=[yn]: ds是xtt的功能, 设成"y" 表示粗体, "n" 表示正常.

ai=Real_number: 表示倾斜度. 不设表示自动.

misc : 表示字体的类别

SimSun : 是字体的名称

bold : bold 表示粗体, 其他如medium表示正常,

i : 表示斜体, r 是正常

p: 可变长度, c 是正方形, m是固定宽度

gbk: 字体编码

这里大家发现我们还使用了tahoma英文字体, 这样替换, 系统读取Simsun英文字体的时候, 就会用pp的tahoma替代.

好了, 现在存盘. 然后拷贝一个到fonts.scale

cp fonts.dir fonts.scale

然后拷贝编码文件 encodings.dir 到目录里来.

cp /usr/X11R6/lib/X11/fonts/encodings/encodings.dir /truetype

好, 重起, 把KDE, mozilla, galeon 等等所有默认字体都改成simsun, 哈哈, 是不是比从前漂亮了很多?

大家还是把这几个配置文件备份起来, 以后安装的时候就不用再设置了.

这里顺带说一下其他几个字体引擎的配置:

xfs : 配置文件是 /etc/X11/fs/config
xft : 配置文件是 /etc/X11/Xftconfig

xft 的配置相对来说比较容易, 只要将字体拷到配置文件中dir 指定的任何一个目录就可以了. 如果要小字体不显示AA, 可以在末尾加入:

match
any size > 8
any size < 17
edit
antialias = false;
match
any pixelsize > 8
any pixelsize < 17
edit
antialias = false;

这样 8~17号的字体就不会用抗锯齿功能了.
posted @ 2005-10-24 14:07 ivaneeo 阅读(485) | 评论 (0)编辑 收藏

(八)结识斯托曼博士

(1)焦点时刻

1999年10月,吴教授受香港大学的邀请去讲学,需要将护照和入港通行证让我从北京捎回武汉。

在此之前,我组织人力和物力翻译了奥莱理出版的《开源软件文集》一书,正如书名中提到的,它收录了许多软件领域的精英的文章,在当年国际 IT 界造成了很大影响,在此之前我发行 Slackware 和 SuSE 时,我早就听说过其中的作者之一 —— 理查德·斯托曼博士(RMS)和他开发的自由软件,以及自由软件基金会(FSF)。碰巧当时南京的一次国际性学术会议邀请他到南京做演讲,因为我翻译过他的文章,因此我想先去南京会他,然后从南京回武汉。

从那篇翻译的文章中我得知,斯托曼博士早年也有辞职下海的经历,也有过艰难痛苦人生抉择的遭遇,他的经历极具传奇色彩,从他的那篇文章里可见一斑。那篇文章写得非常好,不过其深刻思想远远非一般的人一下子就能理解的。尽管我和另外一位朋友的翻译时非常卖力,译稿数次修改,后来在出版之前还交他指定的五位海外华人审读并通过,但是坦白地讲,我也还有一些问题不清楚,想当面请教他。

自由软件的特点在于它提供了软件的所有源代码,而且允许用户自由地拷贝、复制发行和修改。在这一游戏规则下,争论最为激烈的一点就是,软件公司如何靠自由软件生存?这也是我最想问他的一个问题。

为了见到 RMS, 头天我就到了南京等他,住进了他将下榻的同一宾馆。晚上他很晚才从上海飞到南京,我在电话里首次听到了他的声音,典型的纽约口音,声音非常宏亮清晰。电话中他约我第二天上午先去听另一位会议主讲人的演讲,然后会他回房间谈话。

1999年10月30日上午9:30点左右,我进入了会议的大堂,当时正好是中科院的钟锡昌院士在讲解他的 HOPEN 操作系统。 RMS 就坐在观众席的第一排,他一头长发,身着蓝黄黑条纹相间的 T-恤衫。我一进去就发现了他。几乎是在同时,他也回过头来,注意到了我,在钟院士的报告过程中他不时回头看我,似乎是暗示我,他已经注意到我了。在钟院士报告中间暂停时,RMS 快步地朝我走过来,一手拉着我就走。

进入他的房间后,我刚坐下来,想跟他寒喧几句,不料他却将一条板凳挪动到房间的空调下,光着脚上去想调节温度,这时我才看到他一直没有穿鞋。他示意让我过去帮助他,那家宾馆是一个中日合资企业修建的,空调是进口的,但是我们费了很长时间,就是无法将室内温度调整到他希望的温度。 我想找宾馆的服务员来调节,RMS 却拒绝了。 最后我们放弃了努力。

他的房间很零乱,他自己带来了一个 2 米长的大气垫放在床上,他说晚上就睡在气垫上面。我感到很新奇,也上去躺了一下,果然很舒服。

在此之前,我曾经同他讨论过为他写一本传记,因此我们谈话也就从这里开始。我开始提问,问他的过去,他的生活,自由软件的历史,渐渐地,我发现斯托曼具有无穷的人格魅力,特别是当我了解到他当时辞掉 MIT 人工智能实验室的职务时,他的话语更是详细,将自己的经历
娓娓道出,也唤醒了我自己当年辞职而得自由的回忆,“同是天涯自由人,相逢何必曾相识?”我们一下子成了好朋友。

(2)处于争论旋涡中心的自由软件哲学

free software 这一术语经常被人误解,因为英文中的"free"有两个含意,一个是“自由”,另一个是“免费”。RMS 告诉我,他学习过一年的汉语,所以他知道这个词的中译文应该是“自由”,而且很高兴我的译文中是这么译的。

另外一个经常被误解的地方就是 "free software" 不是属于像 TeX 那样属于公用领域内的软件,而是有版权的,它的许可证称为 copyleft,也是根据现代的著作权法建立,但是版权保护侧重点不同于专有软件。专有软件公司拿软件的 Copyright (版权所有,或者说版权属右)来保护出版商的权益, 而自由软件拿 Copyleft (版权属左)来保护用户的权益。

正因为自由软件也拥有版权,任何人可以以任何价格按照 Copyleft的规则销售自由软件。Copyleft 有多种形式,例如 GPL 就是其中之一。“版权属左”规则下的自由软件有两个特点特别引人注目:一是必须提供软件的全部源代码,二是自由软件不附带任何质量保证。前面一点可以为其他人从源代码中得到程序的开发思路从而修改完善软件提供前提,后面一点为软件的开发人员从自由软件的开发业务中得到回报创造了条件,因为并非人人皆有本事或者能力从软件的源代码中反推出软件原作者的心思,所以,除了销售软件的拷贝之外,软件的作者还可以在用户要求提供技术服务时向用户收费 --- 我恍然大悟,头脑中的疙瘩一下子就解开了!

(3)理想与信念

但是,自由软件商业模式的问题在 RMS 看来只是一个小问题,根本不值得投入太多的关心,因为世界上的功力深厚的程序员永远是一种市场上的稀缺资源,这类人才永远不会失业。

RMS 关注的问题在于用户的自由,也就是人的一种权利。因此当我让他在《开源软件文集》
上签名时,他拒绝了,因为推广开源软件的人将软件的实用性置于自由之上,是与他的理想格格不入的。正是为了实现自己的理想,他从 1984 年离开 MIT 人工智能实验室以来的十多年里,没有任何薪水、自己没有房子、没有自己的汽车,单身一人过着苦行僧般的生活。唯一支撑他的就是对自由追求的信念 --- 我面对的不是一个普通的名人,而是一位来自理想国度的圣者。这位先知启蒙了我对自由的认识,我开始真正觉悟了。

告别时,RMS 说他明年还可能来中国,希望能再次见到我。

下午我离开了南京市,准备飞回武汉,但是到了南京机场后,飞机还没有来。也许是我的运气不好,在我的记忆当中,我几次乘坐武汉航空公司的航班,总是不顺利,不是飞机调配未到,就是飞机要加油或者检修,不能按时起飞。

我之所以选择武汉航空公司的航班就是因为它的航班飞机将降落在王家屯机场,在汉口的市中心,离我家更近,这样可以省掉从天河机场到市内的时间和交通费用,早点回家将护照和证件交给吴教授,没想到弄巧成拙。等到晚上8点,天已经黑了,飞机才来,是双螺旋浆的运-7支线飞机,噪音很大(后来我听说武汉航空公司的一驾飞机失事了,可能失事的飞机就是那架运- 7 型飞机)。从那以后我再也不想乘坐武汉航空公司的班机了。

到武汉家中时,吴教授和我父母正在焦急地一起等着我回来,时钟已经指向晚上 12 点,真是漫长的一天。但是我丝毫不觉得疲惫,因为我当天的经历的东西太多,根本无法一下子安静下来。


(九)奥莱理变奏曲

(0)序曲:两类美国人。

与RMS 告别之后,他的形象和说的话一直萦绕在我脑海中。他的传奇半生和思想你很难用一句话说清楚,因为他的工作介于几个领域之上,他不仅是天才的程序设计大师,而且利用他的才能去构建他的自由软件工程,并且能够长期不懈地努力实现他的理想。他怪异的性格掩盖不住他对真理追求的执着流露。尽管他的哲学思想还没有得到全社会的公认,但是我敢肯定他是一个可以入史争鸣数百年的人物。

在美国本土,商业圈一度对 RMS 是相当敌视的,因为RMS 制定的游戏规则判处了很多专有软件公司的死刑或者死缓。当我回到北京后,奥莱理的 D又一次到了北京,当他见到 RMS 的照片时面如灰色,良久之后才说RMS 是一个“野人”。这也难怪,这些商人眼中只有利润,他们才不管什么自由、社会、原则呢。

这段时间工作非常繁忙,经常通宵达旦地赶奥莱理制定的出版进度。为了保持头脑清醒,我在业余时间开始做一些与计算机无关的事情。我一直爱好读历史书,这段时间便开始研究《史记》。司马迁的这部巨著是“史家之绝唱,无韵之离骚”。上中学语文课时我学过一些节选自《史记》的古文,这些经典范文当时都是可以背诵的,但是我从来没有机会系统地读过全书。

经过这段时间的阅读,给我触动最大的就是太史公自述,以前我大概地知道他的生平事迹,但是这次阅读原文后却有全新的感受,一种对理想与信念力量的新认识。司马迁之所以能够在逆境中完成这部宏篇巨著,除了他自身的家庭环境、知识积累等因素之外,关键还是靠伟大信念的支撑,他探究过生命的价值:“凡人所生者神也,所托者形也。神大用则竭,形大劳则敝,形神离则死。死者不可复生,离者不可复反,故圣人重之。由是观之,神者生之本也,形者生之局也。不先定其神,而曰'我有以治天下',何由哉?”

我开始认识到,对于人而言,时空中的感性世界只是一个幻觉,一个人只有通过精神与道德的经常训练,才能学着活在唯一真实的永恒世界里。读完这本书之后,我觉得司马迁仍然还活着,因为他的精神还在。我还认识到,正是因为我们民族有这些珍贵的历史遗产,才使得我们在世界民族之林中占有重要地位,这也是我们与当今世界上的列强周旋与竞争的信心来源。


(1)变奏一:风起萧墙乎?

D 是一个伪君子,我曾经在开始时让他下不了台,虽然后来他被 T 说服而暂时妥协过。我想既然我们双方已经达成协议,这件事就已经过去了,不值得再去想它。可是 D 不这样想,他心中仍然是看不惯我,这一点后来我逐渐觉察到了,而且我觉察到了一个更大的圈套。

D 这个人的斑斑劣迹,我是有所耳闻的,在公司扩张的过程中,D 可以说为了自己的利益是不择手段。尽管奥莱理在法国,日本,台湾等地都有子公司或者办公室,后来却都由 D 和 B 收归自己的势力范围内。尽管这些国家和地区之间的差异很大,但他所使用过的管理伎俩却如出一辙: 先是让T 出面扫清障碍,物色一个合适人选,然后利用这个人拼命工作,一旦公司规模
上来,便将这个人一脚踢开,换上自己的心腹,达到自己彻底控制公司的目的。

中国的情况也是这样,D 在前期从不对我发表任何意见,一切通过T来发号施令。在来北京几次后,他发现公司的 C 很听话,于是把 C 邀请到美国本部去,名曰岗位培训,我不明白翻译的工作需要什么样的岗位培训,如何说需要培训,也应该是我在中国找机会为 C 培训。C 后来负责市场开拓方面的工作,但是美国的那一套做法不能照搬到中国来,因为中美两国之间市场情况差异实在太大。

C 从美国受训回来之后变化很大,一下子像变成了另一个人似的,以前 C 说话非常谦虚,在公司内部颇得人缘。但从美国回来之后说话的口吻一如自己就是奥莱理的总老板了。我感到 D 与 C 之间一定有名堂。

由于找到了C,D 逐渐开始与我直接交锋了,这时 T 最窝囊,因为中国市场是由他直接负责的,现在却什么也不能说,什么也不能做,而且 D与我之间的问题都变成了 T 的错。

(2)变奏二:无处不用间

本来公司是一个公共场合,大家有相同的目的才走到一起来,为了实现共同的目标,面对市场的竞争,公司创造力、产品的生产销售和工作效率是最根本的东西,一切管理的措施都应该为优化这些要素服务, IT 行业的公司尤其应该注重效率,因为这个市场变化得实在太快了。遗憾的是,不是每一个公司都清楚地认识到这一点。有些管理者将对人的控制摆在了一个特殊的位置,他们认为只要控制了人,就可以控制一切。但是人是公司里最活性的要素,管理人主要应该靠制度,而不是依靠个人之间的远近关系。

D 就是持这种态度的人。为了控制公司,他利用 C 向他事无巨细地汇报,北京这边白天发生的任何事情乃至细节,都源源不断地在晚上通过 C 到达了美国总部,于是我除了要应付市场方面的工作外,不得不开始应付来自公司内部的麻烦事,而这正好是我最不擅长处理的事情。

我从头安装 Slackware 的经历使我成了经验丰富的系统管理员。为了利用网络推广奥莱理的产品和服务,我亲手管理着公司的 Internet 主机和上面的 Web 网站。系统管理员经常要备份数据,一天晚上,我工作到深夜,作为最后一项任务,我开始备份网络系统主机上的数据,我发现邮件服务器上还有人登录上来收发信件,我感到奇怪,这么晚了,还有谁工作?是不是有其他骇客在利用邮件服务攻击我们的网站? 骇客们的一些惯用技巧我是了如指掌的,sendmail 工作在 25 号端口上,以往就有骇客利用 sendmail 中的安全漏洞攻击系统。经过阅读系统日志文件,我发现是 C 在工作,而且邮件服务器的日志文件显示邮件发向 D!

我一下子明白了 C 为什么变化这么大!C 是黑夜角落里的耳目。为了搞清楚公司内部还有哪些耳目,我将此事告诉了公司中的 CH,看看美国方面会有何反应。果然,CH 也是耳目之一。 几天后,T 发给了我一份措词强硬的电子邮件,说系统管理员查看用户的邮件在美国是侵犯人权法律云云,因此以后不许这样做。去你的美国人权法律吧,你们白天派人暗中监视我的行动时,把我的人权放到哪里去了?从那时起,除了为同胞们感到悲哀之外,我觉得与这群美国人的合作失去了任何价值和意义。


(3)变奏三:克隆与决裂

由于我的出色工作,奥莱理在中国市场上已经取得很大成功,许多原来不知道它的读者,通过我组织完成的一系列图书了解了它的价值,市场上的反应很好。D 是知道这些的,他开始露出了狐狸的尾巴,跳出来急于要控制公司的一切,与我的矛盾也加剧了。天底下没有不散的宴席,我开始寻思出路。

软件含有程序和文档两部分,没有文档的软件显然不完整,因为用户无法知道怎样操作使用程序。奥莱理公司出名很大程度上是出版了很多自由软件的书,这些著作写得深入浅出,很得读者喜爱。但是在与 RMS 谈过之后,我发现一个问题,尽管自由软件资源已经非常丰富,但是自由软件的自由文档数量相比之下还是太少,而且高质量的著作不多见。 糟糕的是,奥莱理的书几乎全部是专有的,其版权状态与专有软件的许可证没有本质差别。从相当大的程度上讲,奥莱理的成功与其说是它填补了软件文档方面的空缺,不如说是它实际上钻了自由软件社团的空子。

为了推广应用自由软件,这种局面必须改变。中国人可以在这方面发挥自己的聪明才智,摆脱美国专有出版商的控制。

最终,我与奥莱理决裂了,离开了这家专有出版商。

(4)尾声:形式语言与网络出版的结合

从 1997 年 7 月到 2000 年 1 月,我在奥莱理工作了两年半的时间,在付出巨大努力的同时,我也学会了不少东西。客观地讲,奥莱理在早期 Web 的技术发展史上是有较大贡献的,特别是它与其他公司一道提出的 DocBook 规范,已经成为网络出版的事实上的标准之一。DocBook 是一套 SGML 标记集合,用于给文档的结构和表示打标记,从而分离了文档的内容和表达方式。SGML 是几个IBM 的研究员在二十世纪八十年代中期制定的一套规范,后来发展成了ISO 标准。
SGML的实质就是将形式语言引入到信息处理和出版领域,有了形式语言提供的数据结构,
信息的检索,查询、分类、重新加工与表现可很容易由计算机来完成。

早期的 Web 将重点放到发展 HTML 上,这是 SGML 的一个子集,但是后来在技术实现过程中,逐渐偏离了SGML 的分离信息的内容与格式的技术方向。等到 IT 界意识到问题的严重性时,又开始重新改造 Web,这次是使用 XML 规范来进行改造,XML 规范内容非常丰富,但是本质上还是 SGML 的一个子集。

在引入形式语言的概念后,出版的概念发生了质的变化,网络成了一种极好的信息发布和传播的媒体,现在人们把它列为继报刊、广播、电视之后的第四媒体。它对社会的发展已经产生了深远的影响,尽管目前的法律体系还没有准备好进行相应的调整以适应这种技术革命带来的变化。


(十)峰回路转九寨沟

离开了奥莱理之后,重新回到自己的公司经营业务。我知道 IT 市场变幻莫测,反复无常,我想停一下,冷静思考以后的发展方向,随着我的年龄和经历的增长,我少了往日年青人常有的盲目热情,多了成年人应具的理性思考。这是一个自然的过程。


(1)同斯托曼在一起的三个星期

RMS 自从回国之后,一直与我保持着联系,而且正如当时他所说的,他决定 2000 年 5 月再访中国,我当时正构思写作他的传记,因此我要求他安排一下日程,错开一些不太要紧的事情,以便有更多的时间留在中国,我可以挖掘掌握更多的写作素材。

最终RMS决定给我三个星期的时间。我想天天呆在房间里进行问答式的采访太单调了,因此除了安排一些演讲之外,我们想到一些风景区逛逛,在一个轻松的环境里或许可以得到更多的素材。

我们决定去四川的九寨沟。我们早就听说那里风光迷人,山水奇佳。我们专门物色到了一位经验丰富的司机和一辆丰田越野车,从成都出发,沿着岷江公路逆水而上。进入松潘境界后,山势雄伟,山峦连延起伏跌宕,RMS 大呼过瘾,说如果他以前住在这里开发软件的话,GNU 系统早就完成了。


(2)长海论道

九寨沟风景区的旅游线路可以简单地看成是一个“丫”字形状。我们一共进入九寨沟风景区两次。第一天游了一条分叉线路,第二天到另一条分叉线路,终点是长海。长海并不是海,而是在某个冰川时期由于强烈的地震造成的大面积地质沉降,后来周围高山的雪水融化流入而成的一个大的湖泊。水面的颜色随着天上的阳光和云彩飘动而变幻,一步一景,我们亦步亦趋。这样的景色变幻实在迷人,纵使以画海边风景闻名于世的俄罗斯名画家爱瓦佐夫斯基再世,将他所有的画笔、颜料和画布搬来,也未必能穷尽大自然造化的鬼斧神工。最终我们停下来歇脚,开始了一次长谈。


GNU Emacs
---------

RMS 是 GNU Emacs 的作者,如果从 1975 年PDP-10 上的 TECO 算起,到1986 年 GNU Emacs 第一版正式推出,他断断续续花了 11 年的时间才完成,因此在他的传记中我将安排相当大的篇幅介绍这一软件包。

GNU Emacs 是目前公认的最出色的文字编辑器,更准确地说,是程序员的完整工作环境,因为它几乎无所不能,从写程序,日记,调试,排版,电子邮件,无所不包。 良好的扩展性来自内置的 Lisp 语言,大多数GNU Emacs 模块是采用 Lisp 编写的。

Lisp 语言的历史已经很久了,几乎与 Fortran 一样长。二十世纪五十年代,计算机科学家先是发明了针对数字计算的 Fortran 语言,后来针对符号计算又发明了 Lisp,Lisp 的发明历史可以说也是充满传奇色彩。

Lisp 程序中充满了一对对嵌套的小括号,这些嵌套的符号表达式体现着递归。递归是数学上的基本概念之一,从递归理论出发,一切可以计算的函数最终都可以划归为几种基本的递归函数的种种组合,还可以从数学上严格证明,一种叫着 mu 的递归函数与图灵机上的可计算函数是等价的。

从数学理论到计算技术之间还有一段距离,因为计算机只能对数字或者符号进行操作,在冯·诺伊曼体系下的计算机,需要先将程序读入计算机存储起来,然后才能进行计算。在这一过程中,函数的名称与函数过程都是用符号表达的,我们人可以区分,但是计算机却不能。Lisp 语言中的 Lambda 函数完成了这一跳,通过引入 Lambda 演算,在一对对嵌套的括号外表之下的程序是对计算中数据结构与算法的定义和抽象,对抽象的复合,以及将复合的计算对象重新按照简单的对象来计算。这再一次印合了并加深了我对泛积原理的认识,一个是从计算得到的认识,另一个是从系统科学得到的认识。

后来我得知,两者可以找到相同的渊源。Lisp 的发明人约翰·麦卡锡是数学家阿龙佐·丘奇的学生,而丘奇是 Lambda 函数演算理论的创立者。Lambda 函数论解决了函数名称与函数过程之间语义含糊和歧义的问题。 其实,关于“名”与“实”之间的关系,我国古代的哲学家有大量 精辟见解,公孙龙的“白马非马”之说已经涉及到,庄周对于有与无的哲学见解更是精辟,只是由于时代的局限,他们的睿智不易被现代人所容易地了解罢了。泛系理论在 1976 年提出时也已经研究过这一问题,但是时隔二十几年后我才真正明白它们之间的内在联系。

Lisp 在漫长岁月里衍生出来很多版本。其中一个版本 MacLisp 对RMS 的影响很大,
在设计GNU Emacs 时,RMS 将Lisp 融入了其中,道理很自然,因为 GNU Emacs 是
一个文本编辑器,文本就是一种符号,而 Lisp 正好就是针对符号计算发明的。GNU Emacs 中的 Lisp 称为 Emacs Lisp。它比大多数其他的 Lisp 版本都简单。

1994年时众多 Lisp 版本又得到了相当的统一,统一之后的版本称为Common LISP。
Common Lisp 含有非常丰富的库,仅仅语言的规范就长达千页以上,包括面向对象
的 CLOS。

Scheme 语言是 Lisp 的一个现代变种,诞生于1975年,诞生地点也是在MIT。
Scheme语言的规范很短,总共只有50页,甚至连Common Lisp 规范的索引的长度都不到,但是却被称为是现代编程语言王国的皇后。它与以前和以后的 Lisp 实现版本都存在一些差异。但是却易学易用,自由软件基金会有一个叫 Guile 的语言,实际上就是 Scheme 的一个实现版本。RMS 对编程语言的精辟见解,后来我都收录进入了《Learning GNU/Linux OS》一书中。

Lisp 语言程序员经常说,SGML 技术只是符号表达式的另一种“更丑陋”的实现方式,此话不假,因为早在二十世纪五十年代,Lisp 就已经将形式语言符号计算引入进了计算科学界。Lisp 或者 Scheme 语言可以非常容易地处理 XML 文档的解析。


科学精神
---------

纵观人类科学发展的历史,科学精神的作用是贯穿始终的。怀疑是科学创新和发展的源动力之一。科学精神提倡怀疑,不怀疑已有的陈规和定论,科学家们难以提出新的观点,也就不会有新的实践活动,科学也就得不到发展和进步。

自由软件鼓励创新,自由软件的创新机制来自对所提供的源代码的怀疑 --- 如果你对程序的功能不满意,就可以察看程序的源代码,修改之中的代码,从而得到更好的功能。 从这个意义上说,开展自由软件运动可以说是向世人普及科学精神的最好方式之一。任何人都可以自由地自行检查程序的源代码,动手来改进程序。


信息的不对称性
--------------

公开了程序的源代码,程序对用户就是透明的了(相比之下,专有软件的源代码是密而不宣的),但是,源代码透明并不等于任何人马上就能理解代码的含义,要理解源代码的含义还需要大量的思维劳动。

编写程序这个行当可以说是一门工程技术,就像其他类型工程师的工作一样,但是,对于具有创造性的软件,编写程序的过程却更像是搞艺术创作。毫无疑问,作者首先必须要懂大量的知识,这一点与艺人表演一样,“台上一分钟,台下十年功”。成为一位合格的程序员,需要具有很多方面的基础知识,这些知识的积累都不是一蹴而就的,需要多年的积累,具体多长时间因人而异。

作者在创作软件时,精力必须高度集中,很难在一个不安静的环境下写出高质量的软件来。这一点与艺术家们的工作也很相似。刘勰在《文心雕龙》中就说过:“文之思也,其神远矣。故寂然凝虑,思接千载,悄焉动容,视通万里...... 故思理为妙,神与物游......” 程序员的创作结果就体现在源代码之中,但是在源代码从程序员的头脑写到文件的过程中,大量的信息是无法表达的,经验丰富的程序员会写很好的代码注释,但是即使加上了这些注释,还是远远赶不上程序员头脑中思想过的全部信息量,因此代码中含有的信息只是全部信息量的极少部分。当然如果连源代码这个媒介都不存在(像专有软件那样),那就什么都谈不上了,信息量为零。

这正好是泛系理论可以大有作为的地方,因为只要具有足够的“智能基砖”和正确方法论的导引,人的智能可以放大,从源代码保存的少量信息量中反演出作者原来创作时的思路来。即使反演的结果含有的信息量还是比不上原作者的信息量,但是由于信息的冗余性存在,只要能够达到理解的目的,这种反演就算成功,反演就有巨大的价值。如果反演可以推出比原作者头脑中更多的有价值的信息量来,那就是高级的人工智能技术了。

我们离开了九寨沟,这一行使我得到了RMS 心中的很多想法,尽管他本人并不认为他当年设计那些伟大的程序时使用了什么特别的方法论。但我想如果他的想法在传记中能作为规律揭示出来,那就有可能催生一批而不只是一个像他这样的天才程序大师来。



(十一)从泛系观看自由软件

(1)心理认知距离的度量

一旦明确了信息在软件作者与软件用户之间的不对称性,那么如何打破作者与用户之间的这种不平衡,以达到信息量或者知识的对称(对知识的共享)呢?或者说,如何让用户以及其他开发人员理解原作者的软件,从而更好地使用以及完善软件呢?

泛系泛系,泛化之系。
连网之络,开发之器。
参证之轴,律化之机。
观控之法,联想之翼。
一篑之助,点睛之笔。

泛系是研究泛关系、泛转化与泛对称的理论,它已为求得系统之间的泛对称性指出了方向:首先必须研究清楚构成智能基砖是哪些东西,这些智能基砖之间可以形成哪些泛关系,以及泛关系之间的转化规律是什么。在搞明白这些问题的基础上,就可以开始度量心理认知距离的大小或者长短。通过对心理认知距离的度量,就可以确定学习和理解的工作量,从而为用户指明填平不对称性需要实施哪些可以实际操作的步骤。

(2)软件工具

GNU 工程的一个伟大之处在于,它构建了一个完整的操作系统,而正是在这个完整的
操作系统中,从文本编辑器(Emacs)、编译器(GCC)、调试器(GDB)、库函数(GNU C Lib)、词法分析器(Flex)、句法分析器(Bison)、版本管理系统(CVS)、联机文档系统
(Texinfo)等等,它提供了应有尽有的自由的软件开发工具。有了这些工具类的自由软件
和开发环境,创作新的自由软件就有了真正实用的基砖。

(3)泛对称的艺术

我通过探索 GNU 系统得出了结论:编程是泛对称的艺术。

在软件开发过程中,泛对称的例子是随处可见的。 GNU Emacs 中的少量 C 模块与大量 Lisp 模块就是一种泛对称关系。C 是编译型的语言,运行效率高,但是开发的速度慢;Lisp 是解释型的语言,扩展性好,但是效率上与 C 相比则显得不高。斯托曼的一个天才构想就是利用 C 编写直接与硬件作用的模块,例如屏幕显示模块,而涉及文本编辑的模块则统统用 Lisp 语言编写,而且将 C 模块代码的函数名写得像 Lisp 的函数名,所以你不仔细研究模块内部的细节,单从函数名上是很难区分它们两者的,而这正是作者的目的,它巧妙地处理了子模块之间的异同关系,在满足效率的同时,也充分保证了系统应该具备的扩展性。

GNU 的编译器 GCC 和操作系统内核中也大量存在类似的泛对称技术。推而广之,由于计算机最终是为人服务的,各种程序实际上都是直接或间接地在硬件系统与人之间构建泛对称。(硬件系统设计技术内部也存在大量的泛对称性,但是这里就不去涉及了。)


(4)从泛系观看自由

除了技术的自由,自由软件运动明确提出它的目的在于改革社会。在自由软件的游戏规则中,数学上的递归得到了彻底的使用,递归的威力让专有软件出版商们胆战心惊,他们将自由软件的游戏规则斥之为具有“传染性的病毒”。

软件的许可证是一种实施权利的形式。自由软件许可证背后的哲学思想来自于对自由与平等人权所作的深入思考。

古往今来,人类社会总是处在不断的动荡不安之中,太平盛世的日子总是屈指可数的。偏见与歧视、傲慢与强权,一切动乱的根源最终都可以看作是人与人之间,或者社会里的一个群体与另一群体之间的不平等造成的。

中华文明有五千年可考的历史,在世界史上,中国以两千年跨度的封建社会为显著特点,尽管朝代更迭多次,但是封建社会的结构却出奇地稳定,专制的封建社会压抑民主和自由,结果是尽管在文明发源后的一个相当长的时期内中国的科学技术领先于西方,但是近代科学却不是诞生在东方,而是出现在西方。

追求平等与自由的理念在中国自古就有之,自近代以来,一直有大量的学者探索和比较中西方对平等和自由理解的差异和相通之处,并提出了各种见解。这一探索最早以严复的论述最为精彩:

“夫自由一言,真中国历古圣贤之所深畏,而从未尝立以为教者也。彼西人之言曰:唯天生民,各具赋 bi,得自由者乃为全受。故人人各得自由,国国各得自由,第务令毋相侵损而已。侵人自由者,斯为逆天理,贼人道。其杀人伤人及盗蚀人财物,皆侵人自由之极致也。故侵人自由,虽国君不能,而其刑禁章条,要皆为此设耳。 中国理道与西法自由最相似者,曰恕,曰 jie矩。然谓之相似则可,谓之真同则大不可也。何则?中国恕与 jie 矩,专以待人及物而言。而西人之自由,则于及物之中,而实寓所以存我者也。自由既异,于是群异丛然以生。粗举一二言之: 则如中国最重三纲,而西人首明平等;中国亲亲,而西人尚贤;中国以孝治天下,而西人以公治天下;中国尊主,而西人隆民;中国贵一道而同风,而西人喜党居而州处;中国多忌讳,而西人众讥评。其于财用也,中国重节流,而西人重开源,中国追淳朴,而西人求欢虞。其接物也,中国美谦屈,而西人务发舒;中国尚节文,而西人乐简易。其于为学也,中国夸多识,而西人重新知。其于灾祸也,中国委天数,而西人恃人力。若斯之伦,举有与中国之理相抗,以并存于两间,而吾实未感区分其优绌也。”

严复的西学,“苟扼要而谈,不外学术则去伪存真,于刑政则屈私以为公”,他是中国历史上第一位明确提倡科学与民主的学者,他晚年面对社会上强大的封建势力而生的退缩立场与复古无损于他的一生学术思想的光辉。

在欧洲文艺复兴特别是法国大革命之后,人类理性思维能力逐渐成熟,终于发展了可以驾驭自身发展规律的完整科学体系。我们不能苛求严复,因为他的时代集合论还没有取得公认的基础性地位,而今天我们可以利用理性思维工具清楚地认识到,平等的概念可以使用数学中的等价关系概念来精确刻画,对于社会系统,以自反性、对称性和传递性定义的等价关系是指在集合(社会)中的每一个元素(个体)都处在一个同等的地位上,特权的清除依赖于每一个个体对社会中其他个体一视同仁的尊重,在这种理想的社会中,个体享受自由的权利与与个体尊重他人义务是同时存在的,它们两者使得自由具有天生的两重性。在具有等价关系的社会系统中,无论如何进行聚类,得到的群体或者个体都具有相同的自由度 --- 等价关系是正确理解人权的理性思维工具。

要想使整个社会系统中的每个个体相等地具有相同的权利和义务,递归的实施是最有效的手段,因为在这种社会动力学系统中,递归能保证系统中普遍的等价关系的建立和存在。以“版权属左”(copyleft)为基础建立的自由软件的游戏规则,巧妙地使用了递归的力量,以期达到社会中普及自由之目的。


(十二) 东山再起 --- “一、百、万”工程

(1)“一、百、万”工程(MNM Project)

2001 年 3 月 5 日,我发起了“一、百、万”工程。尽管发起这一工程的导火索有某种偶然的成份,但是工程的提出只是迟早的事情,因为我对自由的涵义和自由的价值已经理解得相当清楚。以前的曲折经历告诉我,没有自由,特别是缺乏对自由进行保证的制度,想取得成功只是一种幻想。自由关系着所有人的福址。一个人的商业成功可能满足他或她一时的欲望,但是却无法保证实现社会的普遍繁荣。社会系统里的大量“人为与门”的存在,极大地束缚了生产力的发展和社会的进步,浪费了巨大的资源,是造成社会系统的显克和灾变的根源。要想清除这些不合理的人为与门,只有一个办法,通过向社会灌输自由的理念,让全体社会成员都能理解自由的重要性。当社会里自由的观念深入人心得到普及时,一切制约生产力发展的“人为与门”都会在它面前土崩瓦解。

尽管我不是职业政治家,无法通过官僚体系了实施我的理想,但是我们现在正进入信息社会,在信息社会里,借助技术和网络的力量,传播自由的理念要比以往任何时候都来得容易。网络,特别是人与人之间的网络,是铲除各种“人为与门”的有力武器。

这里,“一、百、万”不是指数字的一百万,所以有“一、百、万不是一百万”的诙谐说法(MNM's Not Millions), 正好印合了黑客界对 GNU 工程的递归命名法则 (GNU's Not Unix)。实际上,“一、百、万”工程是下面三个方面工作的简称:

“一”字工程是指创建一个研究院,也就是自由软件基金会中国研究院。
-----------------------------------------------------------------

几个泛系学友曾经建立过武汉泛系工程研究所,我曾经试图将这一研究所改造成自由软件基金会中国研究院,但是不是所有的泛系学友都理解我提倡的自由观念,他们不想改变原来的章程,因此我只好另起炉灶,自己动手与 RMS 一起来组建自由软件基金会中国研究院。

尽管目前组建自由软件基金会中国研究院还面临许多问题,例如,作为一个在民间成立的科学研究组织,它在法律上它无法得到《捐赠法》的有效保护;作为一个社会公益事业性质的组织(--- 它开发的自由软件人人都可以自由使用),它无法享受到像 FSF 在美国得到的税收政策(在美国,FSF是免税的,而且捐赠人向 FSF 的捐赠可以从个人或者企业的所得税中扣除),
但是这些困难都不是我们停止向社会传播自由的理由。

工程启动后,它即着手建设一系列的工程,这里是项目的一个简要清单:


开发高质量的矢量汉字字库。
-------------------------

汉字字库是中国人使用计算机时必须拥有的东西。遗憾的是,中国现在没有一种真正自由意义上的汉字字库,无论是终端上的点阵字库,还是高质量的用于印刷的矢量字库。

这一项目将开发 PostScript 矢量字库。PostScript 技术是一项非常成熟的技术。工业界对它的支持很广泛,自由软件基金会也有工具软件支持它,这一工程项目的难度除了要熟悉PostSript 语言规范之外,关键在于工作量的庞大,因为汉字的数量很多,仅仅 GB2312-80 就有 6,763 个汉字。而且仅有一种字体是不够的,需要至少四种才能基本满足印刷的实际需要。


新的操作系统
------------

我们目前面临的软件危机主要表现在缺乏自己可以把握的平台上,包括硬件平台和软件平台。冰冻三尺,非一日之寒。 中国人在开发操作系统的道路上,因为犹豫不决和决策失误浪费了很多时间,走了大量的弯路(在我看来根本原因是缺乏对自由的理解)。由于长时间没有硬件平台的直接支持,自己又不重视技术开发力量的储备,人才的流失严重。因此短期内开发出一个成熟的操作系统是不现实的。

由于信息时代操作系统作为平台的重要性日见突出,因此,“一、百、万”工程知难而上,决定自己开发自由的操作系统, 其技术路线是复活 Lisp Machine,也就是将编程语言扩展成为一个完整的操作系统。

新的操作系统称为“MNM”,它是从芯片开始设计的全新操作系统,硬件平台以基于堆栈的芯片为默认平台,还有采用微内核的体系(GNU 系统将来也可以采用),出色的实时反应速度,完善的内核多线程机制,健壮的网络功能,已经图形用户界面等一大堆技术性能。


Scheme 实现版本
---------------

Lisp Machine 在二十世纪八十年代曾经颇为风光过一阵,它曾经是黑客们的掌上明珠,后来因为市场和技术等原因,从操作系统家族中消失了。

影响 Lisp Machine 普及的技术原因在于 Lisp 语言环境的运行速度不彰,Lisp 语言有一种内存垃圾自动回收机制,早期计算机上的内存是非常昂贵的,计算机系统上内存是很少的,属于最稀缺的资源。Lisp 在实现时考虑到了这一点,它将程序运行过程中产生的所有不再使用的内存清理干净后重新投入计算,在内存垃圾回收时,Lisp语言解释器不得不停下来等待新的可重用的内存,因此速度上受到很大影响。

但是内存垃圾回收(GC)本身是一项非常出色的技巧,它本身并没有什么错。编译型的语言,例如 C,需要程序员自己来管理内存的分配和回收,因此编程效率低下,而且容易出错。现代的许多语言都在模仿 Lisp 的内存垃圾回收机制,例如 Java 语言中就有从 Lisp 借鉴过来的类似内存垃圾回收机制。

今天的计算机内存部件成本已经大大下降了,因此通过采用动态的垃圾回收技术,即一边运行程序(而不是让程序运行暂停或者进程挂起),一边回收垃圾,Lisp 的运行速度可以大幅度提高。因此,现在很少听到对 Lisp 运行速度的抱怨声了。

当然,还有一些技术可以提高计算速度,例如,将基本的直接与硬件交互的模块,采用汇编语言编写,成为可以直接执行的原子函数进入 Lisp 的 REP 循环,由于内存部件的低成本,因此基于堆栈的芯片上已经集成了大量的存储器,算法可以使用硬件而不是单纯靠软件来实施,因此计算机运算速度可以大幅度提高,而且程序小巧而紧凑。

但是,正如前面提到的,标准的 Common Lisp 太庞大,“一、百、万”工程将采用自由的Scheme 实现版本来开发操作系统,复活 Lisp Machine。我们将针对最高的 Scheme 规范版本(R5RS),加上一些自己的扩展特性,来开发自己的 Scheme 实现版本。


桌面工作环境
------------

当今任何主流的操作系统上都有图形用户界面(GUI),GUI 以一种直观的方式为计算机用户提供了观控框架,绝大多数计算机用户喜欢在这样的环境下工作。

自由软件社团广泛地采用了原创自 MIT 的 X Window System,目前几乎清一色地在X 上加入自己的图形界面元素构成一个完整的桌面环境,GNU 系统上是GNOME。GNOME 的设计思想卓越,它采用了CORBA 技术,将面向对象的编程技术和分布式计算结合在了桌面环境中。

X 最初提供了两种等价的库,一种是现在通用的以 C 编写的 Xlib, 还有一种是现在几乎废弃的 CLX,即利用 Common Lisp 编写的 X 库,这两种库都实现了对 X 协议的支持。“一、百、万”工程将在 CLX 的基础上,利用 Scheme 来改造 X。

这一改造的目的不仅仅是得到一个可以使用的 X 窗口系统,而且有更高的技术目标 --- 它要将基于 X 的桌面设计得像 Web 是一个浏览器, 将分布式的 Web 带入 X 桌面,从而得到一种新的泛对称。在这一桌面环境下,任何对象无论它在本机上,还是在网络远程的什么地方,均可利用桌面对计算进行观控。大量的泛系概念将采用进入这一桌面环境的设计中。

“百”字工程就是要创作几百本自由的计算机文档,并把它们当作图书出版。
--------------------------------------------------------------------

一旦有了高质量的自由汉字字库,我们就可以开始出版自己的文档。这些文档既可以从网上自由传播,又可以作为纸媒体印刷出来销售,为工程积累开发资金。“百龄影徂,千载心在”。只要有一批高质量的计算机文档,那么我们的工程就会后继有人,他们可以在我们的肩膀上继续向上攀登,而不用从头做起。


“万”字工程就是要在中国培养几万名具有创新精神的、可以动手开发自由软件的工程师。
---------------------------------------------------------------------------------

一、百、万工程非常庞大,需要大量的人力物力的投入,因此我们希望有大量的软件工程师参加进来。目前这方面的人力资源还远远不够,因此我们要利用我们在心理认知距离的度量中获得的研究成果大力开展培训工作,利用多种手段培养几万名可以动手开发自由软件的人才。只有具备了大量理解了自由涵义的人才,我们的工程才有蓬勃发展的保证。自由软件运动在中国才有成功的希望。

至道在微,变化无穷,孰知其原!......恍惚之数,生于毫厘,毫厘之数,起于度量,千之万之,可以益大,推之大之,其形乃制。

“一、百、万”工程发起的意义绝对不仅仅是像一些人期望的那样创造一些高质量的具有民族品牌的软件,解决我们民族面临的软件危机,而且在于,自由软件运动从此在中国的发展不再是属于一些黑客个人自发的业余爱好,或者几家公司手中的赢利工具,而是变成了一种自觉的行动。这个工程有它完整的宗旨、既定的技术目标,计划纲领和具体行动。它通过技术手段来传播自由的思想和理念,达到创造更加美好社会的目的,它或多或少像是一种柏拉图式的政治,尽管参加工程建设的人将不是来自政府的公务员。


(2) 重朔事业的第二春


市场上有大量的 IT 公司幻想着急剧膨胀公司规模,然后上市圈钱,以达到迅速发财致富的成功目的。 我们不打算这样做,我们的手段是利用泛系是推广自由。泛系理论已经提供了足够多的商业模式供我们采用。目前工程的资金来源主要依靠我们提供的服务:


出版《自由软件》杂志
--------------------

经过一年的努力,我们开始出版《自由软件》杂志(FSM),这是目前全球第一本关于自由软件的英文杂志,这一杂志得到了FSF的直接支持。它有电子媒体和纸媒体两个版本,两个版本的杂志都可以自由的拷贝和再发行,电子媒体发表在我们的网站上:http://www.rons.net.cn/english/FSM/online,纸媒体杂志的销售收入用于支持“一、百、万”工程的建设。


排版服务
---------

TeX 经过多年的发展,已经非常稳定了,我也摸索了多年,对其内部结构已经了如指掌,我在 2000 年组建了 CTUG (China TeX User Group)。目前,CTUG 还在成长壮大,我们在 CTUG 的基础上组建了一个排版工作室,FSM 排版的任务就是这一工作室承担的。除此之外,它面向世界市场提供高质量的商业性排版服务。


讲授自由软件课程
----------------

实际上,信息不对称的原理已经得到经济学家们的广泛认同,2001年度的诺贝尔经济学奖金就颁发给三位在这方面研究取得了突出贡献的学者。

应用前面提到的信息不对称的原理,通过对心理认知距离的度量研究,我们开发了一套冠以“黑客道”(Hackerdom)的自由软件培训课程,通过学习这一套课程,学生可以迅速掌握自由软件的工作原理,具备动手开发自由软件的能力。我们收取的学费除了支付教员的劳动之外将用
于工程的建设。

“春三月,此谓发陈,天地俱生,万物以荣......生而勿杀,予而勿夺,赏而勿罚,此春气之应,养生之道也。” 我们希望所有珍爱自己的自由和权利的人都来关心和支持“一、百、万”工程的建设,共同营建我们
自由的春天。



结语

从一个初出茅庐的热血青年,到成长为一个为自由而奋斗的战士,我已走过了12 年的曲折历程,我有幸在这12 年的时间中,得到了两位来自不同领域里的世界级大师的指导和关怀。我不愿将这段难忘的经历封闭起来视为自己私有的财富,而是写出来,希望引起社团里的每一个同志对自由的进行思考,或者得到某些启示。

我们生活的时代处在一个信息社会刚刚开始的门槛上,这一时代不同与以往的农业社会、工业社会,信息社会中的社会成员将因技术的飞速发展拥有前所未有巨大的自由,也正是因为如此,这一社会存在的基础 --- 自由 ---才显示出比以往任何时候与人都更加密切的关系,值得我们去珍视和维护。古往今来,对美好自由的向往是人类永不停歇的追求的源动力,让我在此
套用《泛系百经》中的“路人律”来与大家共勉并结束全文:

识志尺势人各有,
同志结识又分手。
天涯咫尺常对转,
自由事业伴千秋。

版权所有 copyright 洪峰 2002
本文可原封不动的拷贝和自由地再发行,但在拷贝和再发行的拷贝中必须
原封不动地含有这段版权声明。
posted @ 2005-10-09 10:24 ivaneeo 阅读(936) | 评论 (0)编辑 收藏

用FreeBSD吧。它是一种运行在Intel平台上、可以自由使用的Unix系统,它可以从Intern
et上免费获得。而它又具备极其优异的性能,使它得到了计算机研究人员和网络专业人士
的认可。因此,不但专业科研人员把它用作个人使用的Unix工作站,很多企业,特别是IS
P(Internet服务提供商)都使用运行FreeBSD的高档P C服务器来为他们的众多用户提供网
络服务。
   FreeBSD并不是唯一的免费 “Unix” 操作系统,也不是最流行的Unix系统,这个荣誉
属于Linux。这主要由于Linux出现得早两年,那时BSD的源代码还受AT&amp;T许可权的限制,不
能自由获得,而I ntel的32位处理器386的普及已经使Internet上诸多Unix爱好者对PC平台
上的免费Unix系统提出了需求,Linux应时而生。近来在Netscape等商业公司的倡导下,L
inux得到众多商业公司的支持,无形中成为了反Microsfot联盟的一杆旗帜,声势更为浩大

  Linux是由芬兰人Linus Torvalds编写的Unix兼容系统。由Linus Torvalds 负责核心
开发和维护,其他组织和商业公司负责将Linux的核心和应用程序组织在一起发布,由于大
部分程序为GNU软件,因此更严格的说Linux应该被称为GNU/Linux。当前流行的Linux版本
有slackware 3.6 ,Debian 2.0,RedHat 5.1等。

  Linux和FreeBSD同为英特尔平台上的Unix操作系统,因此有很多相似之处。几乎所有
的自由软件都同时支持Linux和FreeBSD,因此在应用方面他们也很相似。但Linux和FreeB
SD也有相当大的不同之处,可以说各具特色。

  从历史渊源上讲,FreeBSD继承了BSD Unix的代码,因此代码相当成熟和稳定。而Lin
ux是一个全新的系统,是遵循POSIX规范开发的一个独立操作系统,但又提供了与BSD Uni
x或Unix System V的兼容性。因此Linux完全没有受到1992年的AT&amp;T诉讼的影响,结果成为
了最流行的自由操作系统。虽然今天那次法律纠纷已经解决,4.4BSD Lite的代码可以自由
获得,但FreeBSD的使用者仍要少于Lin ux的使用者,FreeBSD的使用者多数为网络和计算
机专业人士,普及程度较低。

  出于这个历史渊源的原因,FreeBSD是一个完整的系统,从系统核心到系统提供的程序
均来自BSD Uni x,部分GNU软件是用于代替BSD Unix中的一些老版本软件。而Linux仅仅只
是一个操作系统的内核,其应用程序大部分为GNU软件,然后由不同的组织或个人将这些G
NU软件与Linux内核整合在一起的。因此就存在多个不同的Linux版本,而且不同的Linux
本使用不同的组合方式,因此各种Linux版本之间有很大的差异,并且可以预计这些版本会
随着发展进一步增大彼此的差异。而FreeBSD的版本比较整齐清晰,只有一个FreeBSD版本

  通常FreeBSD更关心稳定性,而Linux具备的各种新特性更多。由于Linux得到了更多的
商业公司支持,因而Linux下的商业软件也更多。但是这些商业软件均可以通过FreeBSD对
Linux执行文件的支持,也能够运行在FreeBSD上。这个不同主要是由于Linux和FreeBSD的
开发过程的差异造成。

  虽然FreeBSD和Linux的开发过程都是非常开放的方式,每个开发者独立进行自己的工
作,通过Inte rnet来互相交流。任何对系统开发有兴趣的人都能贡献新的想法,并组建一
个开发队伍或加入现有开发队伍将自己的想法实现。但是FreeBSD与Linux开发方式的不同
是,FreeBSD有一个开发者组成的核心小组(FreeBSD core team)对整个FreeBSD负责。任
何人都可以利用FreeBSD提出自己的开发计划,但只有Free BSD核心小组认为这个计划对整
个FreeBSD发展有益,这个计划才能列入FreeBSD计划本身。所有的Free BSD开发者共享同
一个源代码树,使用并发版本维护工具CVS进行维护。有了FreeBSD核心小组从整体上规划
Fr eeBSD,并邀请其他开发者加入核心小组,因此FreeBSD显的更简洁和干净,版本发展也
比较稳定。而Linux 仅由Linus对内核进行维护,任何人都可以组织自己的计划,贡献自己
的代码,没有一个统一的源代码树,只是在最后由 Linus进行整合和发布正式内核。由于
没有严格的控制,并且Linux的开发者很多,因此Linux中虽然有更多的新特性,却显得略
为杂乱,并且有些新特性的代码没有经过时间验证,可能存在有问题。

  一个新功能没有进入FreeBSD正式版本的原因很多,有的是由于这个功能不够成熟,有
的是由于核心小组认为这个特性意义不大,还有的是因为正式内核已经有类似功能,或者
由于专利或版权问题(例如,该软件的作者不打算让该软件成为自由软件),使得十分成
熟的功能也不能被列入正式发行的版本。

  由于Linux和FreeBSD互为竞争对手,在Internet上关于Linux和FreeBSD的争论很多,
然而这种争论一般不会得到什么明显的结果。事实上他们都能完成各种应用需求,但各有
自己的侧重点,至于那种系统最适合自己,需要根据具体情况而定,使用者的个人喜好也
是影响选择的一个重要因素。一般FreeBSD的使用者也曾经(或同时)是Linux的使用者,
然而有Linux的使用经验对学习和使用FreeBSD也有不少帮助。只有竞争才能促进发展,Li
nux和FreeBSD不但是竞争的关系,也是相互学习的关系,只有如此各自才能不断发展。

  在个人的使用经验中,FreeBSD仅有过一次崩溃,并且这种崩溃不是随机出现的,其原
因是使用了所有优化选项来编译内核,编译器某项优化造成了内核的BUG,结果就在执行某
项操作时就被触发。在降低了优化级别之后,问题就消失了。因此这个问题应归结为编译
器的问题而非内核的问题。在Linux中,问题更为严重一些,过于求新求功能的多样性,使
得系统崩溃更频繁,并且很多系统崩溃无法找到原因。

  注意:系统崩溃和系统死锁不同,一些情况下一些应用软件死锁会造成键盘或显示没
有响应,然而仍然可以通过网络或其他终端设备登录进系统杀死死锁进程。例如在FreeBS
D下执行Linux的X Server时,进行切换虚拟控制台的操作就会导致键盘死锁。

  当前Linux的一个发展热点是各个商业公司的参与,这的确丰富了Linux下的软件。然
而另一方面,商业公司也试图把专有设计引入Linux,将原有开放的环境变为商品化的环境
,以便从中牟利。当前不同版本的Linux之间的差异已经相当大了,很多人已经意识到了L
inux面临的分裂危险,可以想象以后某个版本的Linux会与其他版本存在兼容性问题。而F
reeBSD有统一的源代码树,不存在分裂的问题。

posted @ 2005-10-09 08:57 ivaneeo 阅读(2789) | 评论 (0)编辑 收藏

     摘要: 十大事件 1990-1994:Java缘起 文/孟岩 Larry Wall说,优秀程序员应有的三个特点:懒惰、急躁和傲慢。Java就是诞生在一 群懒惰、急躁而傲慢的程序天才之中。 1990年12月,Sun的工程师Patrick Naughton被当时糟糕的Sun C++工具折磨的快疯了 。他大声抱怨,并威胁要离开Sun转投当时在Steve Jobs领导之下的NeXT公司。领...  阅读全文
posted @ 2005-10-07 09:50 ivaneeo 阅读(784) | 评论 (1)编辑 收藏

http://learn.tsinghua.edu.cn/homepage/2001315450/

这个疯子不错!
posted @ 2005-10-05 13:53 ivaneeo 阅读(1618) | 评论 (0)编辑 收藏

完全用Linux工作,摈弃Windows

我已经半年没有使用 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。

ew
责任编辑: otto
posted @ 2005-10-05 10:23 ivaneeo 阅读(504) | 评论 (1)编辑 收藏

概要
本文档的写作目的是帮助用户了解Debian包管理工具——APT的工作原理,我们的目标是简化Debian新用户的生活以及为那些希望深入了解系统管理的人提供帮助。它也是为Debian项目组而作的,以帮助改善其为发行版提供技术支持的工作质量。

版权声明
Copyright ? 2001, 2002 Gustavo Noronha Silva

This manual is licensed under the terms of the GNU FDL (Free Documentation License). It has been written in the hope that it will be useful to the community but it comes with no warranty; use it at your own risk.


目录

1.导言
2.基础设置
2.1 /etc/apt/sources.list文件
2.2 怎样在本地使用APT
2.3 选择最佳镜像发布站点加入source.list文件:netselect,netselect-apt
2.4 将CD-ROM加入source.list文件
3.软件包管理
3.1 更新可用软件包列表
3.2 安装软件包
3.3 移除软件包
3.4 更新软件包
3.5 升级到新版本
3.6 移除无用软件包文件:apt-get clean and autoclean
3.7 在dselect中操作APT
3.8 如何keep a mixed system
3.9 如何从Debian的专用版本下升级软件包
3.10 如何维护已安装软件包的多个版本(复杂)
4.非常有用的助手
4.1 如何安装本地编译的软件包:equivs
4.2 移除无用的locale files文件:localepurge
4.3 如何知晓哪些软件包可以升级
5.获取软件包信息
5.1 获得软件包名称
5.2 使用dpkg查找软件包名称
5.3 如何“按需”安装软件包
5.4 如何知道文件属于哪个软件包
5.5 如何掌握软件包的变化情况
6.操作源码包
6.1 下载源码包
6.2 编译源码包所需的软件包
7.如何处理错误
7.1 一般错误
7.2 在哪儿获得帮助?
8.哪些版本支持APT?
9.感谢
10.本使用指南的新版本

Debian APT HOWTO 第一章 导言
APT HOWTO
第一章 导言

最初只有.tar.gz的打包文件,用户必须编译每个他想在GNU/Linux上运行的软件。用户们普遍认为系统很有必要提供一种方法来管理这些安 装在机器上的软件包,当Debian诞生时,这样一个管理工具也就应运而生,它被命名为dpkg。从而著名的“package”概念第一次出现在 GNU/Linux系统中,稍后RedHat才决定开发自己的“rpm”包管理系统。

很快一个新的问题难倒了GNU/Linux制作者,他们需要一个快速、实用、高效的方法来安装软件包,当软件包更新时,这个工具应该能自动管理关联文件和维护已有配置文件,再次,Debian率先解决了这个难题,APT(Advanced Packaging Tool)诞生了。APT后来还被Conectiva改造用来管理rpm,并被其它Linux发行版本采用为它们的软件包管理工具。

本文档不打算讲解apt-rpm相关知识,因为Conectiva port of APT已很有名了,不过提供有关这部分的补充文档还是欢迎的。

本文档是基于Debian下一个发行版的,长官。


Debian APT HOWTO 第二章 基础设置
APT HOWTO
第二章 基础设置

2.1 /etc/apt/sources.list文件
=============================
作为操作的一部分,APT使用一个文件列出可获得软件包的镜像站点地址,这个文件就是/etc/apt/sources.list。

文件中的各项信息通常按如下格式列出:

deb http://site.http.org/debian distribution section1 section2 section3
deb-src http://site.http.org/debian distribution section1 section2 section3

当然,上面所列的地址项都是假设的不可用的。每行的第一个单词deb或deb-src,描述了文件类型,目录中包含的是二进制软件包(deb),即 我们通常使用的已编译好的软件包;或包含的是源码包(deb-src),源码包包含源程序编码、Debian管理文件(.dsc)和“Debian化”该 程序所做更改的记录文件diff.gz。

通常可以看出如下Debian默认的sources.list:

# See sources.list(5) for more information, especialy
# Remember that you can only use http, ftp or file URIs
# CDROMs are managed through the apt-cdrom tool.
deb http://http.us.debian.org/debian stable main contrib non-free
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free

# Uncomment if you want the apt-get source function to work
#deb-src http://http.us.debian.org/debian stable main contrib non-free
#deb-src http://non-us.debian.org/debian-non-US stable non-US

这些是Debian基本安装所需的软件包来源地址,第一个deb行指向官方正式软件包来源,第二个deb行指向non-US软件包来源,第三deb行指向Debian安全补丁更新包来源。

最后两行被注释掉了(在句首加#),所以apt-get将忽略它们。这些是deb-src行指向Debian源码包来源,如果你常下载程序源码来测试或重编译,可取消对它们的注释。

/etc/apt/sources.list文件可包含多种类型的地址,APT知道如何处理这些不同的地址类型:http,ftp,file(本地文件,例如:一个加载了ISO9600文件系统的目录)和ssh。

别忘了在修改完/etc/apt/sources.list文件后运行apt-get使更改生效。你必须完成这个步骤,以便让APT从你指定的地方获得新的软件包列表。

2.2 如何在本地使用APT
=====================
有时你硬盘上有许多软件包,你会希望通过APT来安装它们,以便让它去处理软件包间复杂的依赖关系。

想这么做,就建一个目录,将所有你想要安装的.deb文件放入其中。例如:

mkdir /root/debs

你可以使用一个重载文件(override file)直接去修改软件包中管理文件中的定义(definitions),使之符合你的软件储藏库管理规则,在这个重载文件中,你可能希望定义一些选项来重载那些软件包的定义,如下所示:

package priority section

package是软件包的名称,priority有三个级别low,medium或high,section是软件包所属的section,重载文 件可任意命名,文件名将在接下来的步骤中做为参数传递给dpkg-scanpackages。如果你不想写重载文件,只需在调用dpkg- scanpackages时使用/dev/null就行了。

仍是在/root目录下执行:

dpkg-scanpackages debs file | gzip > debs/Packages.gz

在上述的命令行中,file为重载文件,命令生成一个Packages.gz文件,它包含了APT所需的各种软件包信息,要使用这些软件包,在sources.list中加上:

deb file:/root debs/

完成了上面的工作,就可以通常那样使用APT命令操作这些软件包了。你可以使用同样的方法生成一个源码库,但请记住你需要将. orig.tar.gz文件、.dsc文件和.diff.gz文件包含在目录中,要生成Source.gz文件而不是Packages.gz文件。所使用 的命令也不相同,要使用dpkg-scansources,命令如下所示:

dpkg-scansources debs | gzip > debs/Sources.gz

注意dpkg-scansource不需要重载文件,在sources.list中的引用法是:

deb-src file:/root debs/

2.3 选择最佳镜像发布站点加入source.list文件:netselect,netselect-apt
=====================================================================
一个新用户经常问到的问题:“该将哪个Debian镜像发布站点加入source.list文件?”。有很多方法来选择镜像发布站点,专家们可能会写一个脚本去测试不同站点的ping time,不过有一个现成的程序可以帮你:netselect。

安装netselect

apt-get install netselect

不带参数运行它时会显示它的帮助信息。运行它时加上以空格分隔的镜像主机列表,它会返回一个分值和列表中的一个主机名。这个分值通过评估ping time和hops number(一个网络请求报文到达目标主机所经过的转发主机的个数)得出,它与镜像站点预计下载速度成反比(数值越小越好)。返回的主机名是主机列表中得分最低的那个(查看列表中所以主机的得分情况可使用-vv选项)。看出下的例子:

bash$ netselect ftp.debian.org http.us.debian.org ftp.at.debian.org download.unesp.br ftp.debian.org.br
365 ftp.debian.org.br
bash$

它表示,在netselect后列出的所有主机中,ftp.debian.org.br是下载速度最快的主机,其得分为365。(注意!!这是在我电脑上的测试结果,不同的网络节点网速会大不相同,所以这个分值不一定适用于其它电脑)

现在将netselect找到的连接速度最快的镜像站点加入/etc/apt/sources.list文件(see The /etc/apt/sources.list file, Section 2.1)and follow the tips in Managing packages, Chapter 3.

注意:镜像站点列表通常包含在文件http://www.debian.org/mirror/mirrors_full。

从0.3版开始,netselect软件包包含了netselect-apt脚本,它使上述操作自动完成。只需将发布目录树做为参数(默认为 stable)输入,sources.list文件就会生成速度最快的main和non-US镜像站点列表,并保存在当前目录下。下面的例子生成一个包含 stable发布镜像站点列表的sources.list

bash$ ls sources.list
ls: sources.list: File or directory not found
bash$ netselect-apt stable
(...)
bash$ ls -l sources.list
sources.list
bash$

记住:sources.list生成在当前目录下,必须将其移至/etc/apt目录。

Then, follow the tips in Managing packages, Chapter 3.

2.4 将CD-ROM加入source.list文件
===============================
如果你用APT从CD-ROM上安装及升级软件包,你可以将它加入到sources.list文件中。完成该操作,可使用apt-cdrom程序:

apt-cdrom add

将Debian光盘放入光驱,它将加载光盘目录,并在光盘上查找软件包信息。如果你的光驱需要额外设置,可使用以下选项:

-h - program help
-d directory - CD-ROM mount point
-r - Rename a recognized CD-ROM
-m - No mounting
-f - Fast mode, don't check package files
-a - Thorough scan mode

例如:

apt-cdrom -d /home/kov/mycdrom add

你还可以扫描一张光盘,但不将其加入列表:

apt-cdrom ident

注意,只有当你在系统的/etc/fstab中正确设置了光驱后,该程序才会工作。


Debian APT HOWTO 第三章 软件包管理
APT HOWTO
第三章 软件包管理

3.1 更新可用软件包列表
======================
软件包管理系统使用一个私有数据库跟踪列表中软件包的当前状态:已安装、未安装或可安装。apt-get通过该数据库来确定如何安装用户想用的软件包以及正常运行软件包所必须的其它关联包。

你可以使用apt-get update来更新数据库列表。这个命令将扫描/etc/apt/sources.list文件中所指路径中的软件包列表文件。有关该列表文件的更多信息请查阅 第二章 /etc/apt/source.list文件。

定时运行这个程序是个好主意,它将使你和你的系统获得最新的软件包更新和安全更新等信息。

3.2 安装软件包
==============
现在,终于到了你一直期待的阶段!准备好了sources.list和最新版的的可用软件包,你所需做的就是运行apt-get来安装你渴望已久的软件了。例如,你可以这样:

apt-get install xchat

APT会扫描它的数据库找到最新的版本的软件包,并将它从sources.list中所指的地方下载到本地。如果该软件包需要其它软件包才能正常运行——如本例一样——APT会做关联性检查并自动安装所关联软件包。如下所示:

[root]@[/] # apt-get install nautilus
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 0 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 17.2MB will be used.
Do you want to continue? [Y/n]

nautilus软件包需要引用共享函数库,因此APT会从镜像源处下载相关共享函数库,如果你在apt-get命令行中手动指定了这些共享函数库的名称,APT会默认为你要安装所有这些软件包。

也就是说APT只会在安装那些没有在命令行中指定的软件包时提示你进行确认。

下列apt-get选项也许对你有用

-h This help text.
-d Download only - do NOT install or unpack archives
-f Attempt to continue if the integrity check fails
-s No-act. Perform ordering simulation
-y Assume Yes to all queries and do not prompt
-u Show a list of upgraded packages as well

可以用一条命令安装多个软件包。包文件从网络上下载到本地/var/cache/apt/archives目录,稍后再安装。

你可以用同样的命令行删除指定软件包,只需在软件包名称后紧跟一个“-”,如下所示:

[root]@[/] # apt-get install nautilus gnome-panel-
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0
The following packages will be REMOVED:
gnome-applets gnome-panel gnome-panel-data gnome-session
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 4 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 2594kB will be used.
Do you want to continue? [Y/n]

有关删除软件包的更多详细信息,参阅 3.3 移除软件包。

假如你不小心损坏了已安装的软件包而想修复它,或者仅仅想安装软件包中某些文件的最新版本,这是可以做到的,你可以用--reinstall选项:

[root]@[/] # apt-get --reinstall install gdm
Reading Package Lists... Done
Building Dependency Tree... Done
0 packages upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 1 not upgraded.
Need to get 0B/182kB of archives. After unpacking 0B will be used.
Do you want to continue? [Y/n]

本文档写作时所参考的APT版本为0.5.3,这个版本还属于“unstable”(sid)阶段。如是你安装了这个版本,你可以在系统配置中使用新增的功能:你可以用apt-get install package/distribution来安装指定发布版中的软件包,或者用apt-get install package=version,如下所示:

apt-get install nautilus/unstable

它将为你安装“unstable”发布版中的nautilus软件包,即使你当前运行的是“stable”版本。命令中“distribution”选项的可用参数值为:stable,testing,unstable。

在处理关联问题时,你可能更乐意使用-t开关来选择目标发布版,让apt-get帮你考虑使用哪个发布版。

重要信息:最新版的Debian软件包首先会上传到“unstable”发布版中,这个发布版包含了软件包所有更改阶段,无论是小修小补还是影响到众多软件包乃至整个系统的重大修改。所以,新手和那些强调系统稳定性的用户不会使用这个发布版。

“testing”发布版比起“unstable”发布版,多注重了些系统稳定性,但正式运行的系统应当使用“stable”发布版。

3.3 移除软件包
==============
如果你不再使用某些软件包,你可以用APT将其从系统中删除。要删除软件包只需输入:apt-get remove package。如下所示:

[root]@[/] # apt-get remove gnome-panel
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
gnome-applets gnome-panel gnome-panel-data gnome-session
0 packages upgraded, 0 newly installed, 4 to remove and 1 not upgraded.
Need to get 0B of archives. After unpacking 14.6MB will be freed.
Do you want to continue? [Y/n]

由上例可知,APT会关注那些与被删除的软件包有依赖关系的软件包。使用APT删除一个软件包将会连带删除那些与该软件包有依赖关系的软件包。

上例中运行apt-get会删除指定软件包以及与之有依赖关系的软件包,但它们的配置文件,如果有的话,会完好无损地保留在系统里。如果想彻底删除这些包及其配置文件,运行:

[root]@[/] # apt-get --purge remove gnome-panel
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
gnome-applets* gnome-panel* gnome-panel-data* gnome-session*
0 packages upgraded, 0 newly installed, 4 to remove and 1 not upgraded.
Need to get 0B of archives. After unpacking 14.6MB will be freed.
Do you want to continue? [Y/n]

注意:软件包名字后面的*表示该软件包所有的配置文件也将被删除。

就象安装软件时一样,你可以在删除命令中用一个符号来指定安装某个软件包。在删除软件包时,如果你在软件包名字后面紧跟一个“+”,那么该软件包就会被安装而不是删除。

[root]@[/] # apt-get --purge remove gnome-panel nautilus+
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
The following packages will be REMOVED:
gnome-applets* gnome-panel* gnome-panel-data* gnome-session*
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 4 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 2594kB will be used.
Do you want to continue? [Y/n]

注意,apt-get列出了那些将要被安装的关联软件包(即保证该软件包正常运行的其它软件包)和将要被删除关联软件包,然后,再次列出了将要被安装的软件包。

3.4 更新软件包
==============
软件包更新是APT最成功的特点。只需一条命令即可完成更新:apt-get upgrade。你可以使用这条命令从相同版本号的发布版中更新软件包,也可以从新版本号的发布版中更新软件包,尽管实现后一种更新的首选命令为apt-get dist-upgrade;实情参阅 3.5升级到新版本。

在运行该命令时加上-u选项很有用。这个选项让APT显示完整的可更新软件包列表。不加这个选项,你就只能盲目地更新。APT会下载每个软件包的最新更新版本,然后以合理的次序安装它们。注意在运行该命令前应先运行apt-get update更新数据库。有关详情参阅 3.1更新可用软件包列表。看看这个例子:

[root]@[/] # apt-get -u upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages have been kept back
cpp gcc lilo
The following packages will be upgraded
adduser ae apt autoconf debhelper dpkg-dev esound esound-common ftp indent
ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0 libesd0-dev
libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev liborbit0
libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit procps psmisc
29 packages upgraded, 0 newly installed, 0 to remove and 3 not upgraded.
Need to get 5055B/5055kB of archives. After unpacking 1161kB will be used.
Do you want to continue? [Y/n]

整个更新过程非常简单。注意在本例中头几行,apt-get报告有些软件包的更新被阻止(kept back),这表明这些软件包的更新版本因故无法安装,可能的原因有关联不同步(当前没有供下载的新版本关联包)或关联扩展(需要安装新的关联包以配合新版软件包)。

对于第一种原因没有很好的解决方法,对于第二次原因,运行apt-get intall安装所需的新关联包就可以。另一个更好的解决方法就是使用dist-upgrade。详情参阅 3.5升级到新版本。

3.5 升级到新版本
================
APT的绝活就是让你一次就完成整个系统的更新,不论是通过Internet还是通过光盘文件(购买的碟片或下载的ISO镜像文件)。

它也可以用来更新寻些改变了关联关系的软件包。即如前所述的那些使用apt-get upgrade时被阻止更新(kept back)的软件包。

例如,假设你目前使用的Debian为stable revision 0(如woody 3.0 r0,译者注),而你购买了revision 3的新版Debian(如woody 3.0 r3,译者注),你可以使用APT从新光盘上升级你的系统。使用apt-cdrom(参阅 2.4将CD-ROM加入source.list文件)将光盘加载到/etc/apt/sources.list中,然后运行apt-get dist-upgrade。

请注意,APT总是搜索最新版本的软件包,因此,如果一个软件包在你的/etc/apt/sources.list中所列的版本比光盘上所列的版本要新,那么APT会按照sources.list文件所指的地址下载这个软件包而不是使用光盘上的软件包。

在 3.4更新软件包 中我们举了个例子,我们看到有些包被阻止更新(kept back),现在我们就用dist-upgrade方法来解决这个问题:

[root]@[/] # apt-get -u dist-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Done
The following NEW packages will be installed:
cpp-2.95 cron exim gcc-2.95 libident libopenldap-runtime libopenldap1
libpcre2 logrotate mailx
The following packages have been kept back
lilo
The following packages will be upgraded
adduser ae apt autoconf cpp debhelper dpkg-dev esound esound-common ftp gcc
indent ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0
libesd0-dev libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev
liborbit0 libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit
procps psmisc
31 packages upgraded, 10 newly installed, 0 to remove and 1 not upgraded.
Need to get 0B/7098kB of archives. After unpacking 3118kB will be used.
Do you want to continue? [Y/n]

注意现在那些软件包将会被更新,那些新的关联软件包也会被安装。但是lilo仍被阻止更新,可能还存在一些比建立新关联更棘手的问题,我们通过如下方法确定问题所在:

[root]@[/] # apt-get -u install lilo
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2
logrotate mailx
The following packages will be REMOVED:
debconf-tiny
The following NEW packages will be installed:
cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2
logrotate mailx
The following packages will be upgraded
lilo
1 packages upgraded, 9 newly installed, 1 to remove and 31 not upgraded.
Need to get 225kB/1179kB of archives. After unpacking 2659kB will be used.
Do you want to continue? [Y/n]

查看上述提示信息可知,lilo与debconf-tiny包产生了一个新冲突,这表明除非删除debconf-tiny,否则将无法更新lilo。

想知道该保留或删除哪些软件包,你可以使用:

# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Starting
Starting 2
Investigating python1.5
Package python1.5 has broken dep on python1.5-base
Considering python1.5-base 0 as a solution to python1.5 0
Holding Back python1.5 rather than change python1.5-base
Investigating python1.5-dev
Package python1.5-dev has broken dep on python1.5
Considering python1.5 0 as a solution to python1.5-dev 0
Holding Back python1.5-dev rather than change python1.5
Try to Re-Instate python1.5-dev
Done
Done
The following packages have been kept back
gs python1.5-dev
0 packages upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

现在,你很容易就知道不能安装python1.5-dev软件包是因为无法满足另一个软件包python1.5的关联要求。

3.6 移除无用软件包文件:apt-get clean and autoclean
===================================================
当你需要安装某个软件包时,APT从/etc/apt/sources.list中所列的主机下载所需的文件,将它们保存到本机软件库(/var/cache/apt/archives/),然后开始安装,参阅 3.2 安装软件包。

本地软件库会不断膨胀占用大量硬盘空间,幸运的是,APT提供了工具来管理本地软件库:apt-get的clean方法和autoclean方法。

apt-get clean将删除/var/cache/apt/archives目录和/var/cache/apt/archives/partial目录下的所有文件,除了被锁定的文件。这样以来,当你需要再次安装某个软件包时,APT将重新下载它。

apt-get autoclean仅删除那些不需要再次下载的文件。

下面这个例子显示了apt-get autoclean如何工作:

# ls /var/cache/apt/archives/logrotate* /var/cache/apt/archives/gpm*
logrotate_3.5.9-7_i386.deb
logrotate_3.5.9-8_i386.deb
gpm_1.19.6-11_i386.deb

在/var/cache/apt/archives目录下有两个不同版本的logrotate软件包文件以及一个gpm软件包文件。

# apt-show-versions -p logrotate
logrotate/stable uptodate 3.5.9-8
# apt-show-versions -p gpm
gpm/stable upgradeable from 1.19.6-11 to 1.19.6-12

apt-show-versions显示logrotate_3.5.9-8_i386.deb提供了logrotate的升级版本,所以 logrotate_3.5.9-7_i386.deb没用了。同样gpm_1.19.6-11_i386.deb也没有用了,因为可以下载该软件包的更 新版本。

# apt-get autoclean
Reading Package Lists... Done
Building Dependency Tree... Done
Del gpm 1.19.6-11 [145kB]
Del logrotate 3.5.9-7 [26.5kB]

总之,apt-get autoclean仅删除那些过时的文件。参阅 3.9如何从Debian的专用版本下升级软件包 获得更多apt-show-versions相关信息。

3.7 在dselect中操作APT
======================
dselect工具帮助用户选取想要安装的Debian软件包。它有点复杂甚至令人望而生厌,但经过实践你就能掌握它恐怖的终端界面。

dselect高级功能之一就是它知道利用Debian软件包的“推荐”和“建议”能力。(Debian软件包有一种能力:推荐或建议系统在安装自 己的同时,安装别的软件包以配合自身的工作,当然这些推荐的软件包不一定是必须的;而dselect工具可以识别和利用这个能力,使用dselect时你 就能体会到。译者注)以root身份运行dselect,进入程序后选择apt作为连接方式(access)。该步骤不是必须的,但如果你没有光驱而且想 通过Internet下载安装软件包,这是使用dselect的最好方法。

想深入学习dselect的用法,请到Debian网站查阅dselect文档页面
http://www.debian.org/doc/ddp

在dselect中选好了软件包后,运行:

apt-get -u dselect-upgrade

如下例所示:

[root]@[/] # apt-get -u dselect-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
lbxproxy
The following NEW packages will be installed:
bonobo console-tools-libs cpp-3.0 enscript expat fingerd gcc-3.0
gcc-3.0-base icepref klogd libdigest-md5-perl libfnlib0 libft-perl
libgc5-dev libgcc300 libhtml-clean-perl libltdl0-dev libsasl-modules
libstdc++3.0 metamail nethack proftpd-doc psfontmgr python-newt talk tidy
util-linux-locales vacation xbill xplanet-images
The following packages will be upgraded
debian-policy
1 packages upgraded, 30 newly installed, 1 to remove and 0 not upgraded.
Need to get 7140kB of archives. After unpacking 16.3MB will be used.
Do you want to continue? [Y/n]

比较一下我们在相同系统上运行apt-get dist-upgrade时的情形:

[root]@[/] # apt-get -u dist-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Done
The following packages will be upgraded
debian-policy
1 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 421kB of archives. After unpacking 25.6kB will be freed.
Do you want to continue? [Y/n]

我们看到在前例中许多软件包被安装是其它软件包“推荐”或“建议”的结果。另外一些软件包被安装或删除(例如lbxproxy软件包)是我们通过dselect工具作出的决定。由此可见dselect与APT结合起来将是一个功能强大的工具。

3.8 如何构建一个混合系统
========================
人们常使用testing发布版,因为它比unstable要稳定同时又比stable时髦。然而对于那些想运行某些软件包的最新版本,又不希望 将整个系统迁移到unstable发布版的还有一种选择:运行一个testing/unstable混合系统。对另一部分保守的用户而言,他们可能希望运 行stable/testing混合系统。

要实现混合系统,请在/etc/apt/apt.conf中加入下面的语句:

APT::Default-Release "testing";

以后,在从unstable发布版安装软件包时,使用-t开关:

# apt-get -t unstable install packagename

别忘了,使用Debian的某个发布版的软件包时,要将镜像源加入到/etc/apt/sources.list文件中。在这个例子中,除了加入testing发布版镜像源处,我们还需要加入unstable发布版镜像源。

3.9 如何从Debian的专用版本下升级软件包
======================================
apt-show-versions提供了一个安全的途径,让那些使用混合系统的用户放心升级他们的系统,不必担心升级会将原来属于stable的包升级成了unstable包。例如,这条命令将只升级你的unstable软件包:

# apt-get install `apt-show-versions -u -b | grep unstable`

3.10 如何维护已安装软件包的多个版本(复杂)
==========================================
你可能会遇到这种情况,更改了某个软件包中的一些文件,但你没有时间或根本就不想将这些更改引入到新版本中。或者,你将系统升级到3.0,但仍想继续使用Debian 2.2下的某个软件包。你可以“钉住”(pin)这个版本,这样它就不会被更新了。

操作起来十分简单,你只需编辑/etc/apt/preferences文件。

文件格式很简单:

Package: <package>
Pin: <pin definition>
Priority: <pin's priority>

例如,我对sylpheed软件包做了某些修改,其版本为0.4.99,我想保留这些修改不被更新,可加上:

Package: sylpheed
Pin: version 0.4.99*

注意我用了一个 *(星号)。这是一个“通配符”;它表明我希望“钉住”所有以0.4.99打头的版本(以防它们被下载并安装到我机器上。pin控制的是服务器端的更新软 件包而非本地的已安装软件包。译者注)。因为Debian使用“Debian版本号”为其软件包定版本,我不想进行所有这些版本的升级,如果不用通配符, 那么0.4.99-1版或0.4.99-10版只要一出炉系统就会安装它们。如果你修改了软件包,你一定不希望这么做。

Priority是可选域;如果没有特别指定,它的默认值为989。

让我们来看看pin如何体现优先级(priorty)区别。一个低于0的优先级表示:该软件包被禁止安装;优先级在0到100之间表示:软件包没有 安装并且当前也没有可用版本,这些软件包不会出现在供选择版本列表中;优先级为100表示软件包已被安装——对于这个已安装的软件包,如果有一个不同的版 本要替换它,那么替换者的优先级必须大于100。

优先级在100以上表示软件包应该被安装。典型的例子如,某个软件包的升级补丁包,任何处于100和1000(包括1000)之间的优先级都表示上 述情形。但是,一个软件包如果被定为这样的优先级,它并不会降级已安装的版本。例如,如果我安装了sylpheed 0.5.3并为sylpheed 0.4.99指定了一个优先级为999的pin,那么由于要满足pin的优先级,所以0.4.99软件包不会被安装。如果要实现软件包“降级”,则需要将 pin的优先级定为大于1000。(100<优先级<=1000时,如果存在升级包就对本机相关包升级,如果本机软件包比更新包还新就保持不 变;优先级>1000时,服务器端软件包不论比本机的软件包新还是旧,均对本机相关软件包进行更新。译者注)

pin可以被用来控制软件包的修订版本(version)、发布版本(release)或版本来源(origin)。

在前面我们已经看到,钉住修订版本时使用通配符来代替版本号数字,这样可一次指定多个版本。

release选项是基于发布版文件(Release file)的,这个文件在本地APT软件库中或安装光盘上。如果你从本地软件库安装软件包而软件库中又没有该文件,那么这个选项将失效。来看看 /var/lib/apt/lists/目录中发布版文件的内容,发布版包括这些参数:a(archive),c(components),v (version),o(origin),l(lable)。

来看一个例子:

Package: *
Pin: release v=2.2*,a=stable,c=main,o=Debian,l=Debian
Priority: 1001

在本例中,我们选择了version为2.2*的Debian(它可以是2.2r2,2.2r3——这些版本包含了“point releases”即安全更新和其它非常生要的更新),stable软件库,main类软件包(非contrib或non-free),版本来源和标签均 为Debian。版本来源(o=)说明谁制作了这个发布版文件,标签(l=)说明该发布版的名称:Debian即是指Debian自己,Progeny即 是指后裔制作者,下面是一个发布版文件的样例:

$ cat /var/lib/apt/lists/ftp.debian.org.br_debian_dists_potato_main_binary-i386_Release
Archive: stable
Version: 2.2r3
Component: main
Origin: Debian
Label: Debian
Architecture: i386


Debian APT HOWTO 第四章 几个非常有用的工具
APT HOWTO
第四章 几个非常有用的工具

4.1 如何安装本地编译的软件包:equivs
====================================
有时,用户想使用某些软件的特殊版本,它们只以源代码的形式存在,没有现成的Debian软件包。软件包管理系统在处理这类事务时可能会出问题。 假设你想编译新版本的邮件服务器,编译、安装一切正常,然而,软件包管理系统并不知道你在系统中安装了自己编译的东西,在Debian中许多基于MTA (Mail Transport Agent 邮件传输代理)的软件包也不知道这些。

现在是equivs登台的时候了。用它来安装软件包,它所做的工作就是创建一个新的空软件包来实现关联,让软件包管理系统相信关联实现了。

在我们开始以前,我必须提醒你,编译某个软件最安全的方法是对该软件现有的Debian软件包进行修改后重新编译,如果你并不知道你正在干什么,劝你不要使用equivs替换关联包。更多信息请参阅 第六章 源码包操作。

继续上面的例子,你安装好了新编译的postfix,接下来打算安装mutt,突然你发现mutt想与另一个MTA建立关联,而你想让它使用你刚安装的新MTA。

转到某个目录(例如/tmp)执行:

# equivs-control name

将name替换为你创建的管理文件(control file),管理文件按如下格式创建:

Section: misc
Priority: optional
Standards-Version: 3.0.1

Package: <enter package name; defaults to equivs-dummy>
Version: <enter version here; defaults to 1.0>
Maintainer: <your name and email address; defaults to username>
Pre-Depends: <packages>
Depends: <packages>
Recommends: <packages>
Suggests: <package>
Provides: <(virtual)package>
Architecture: all
Copyright: <copyright file; defaults to GPL2>
Changelog: <changelog file; defaults to a generic changelog>
Readme: <README.Debian file; defaults to a generic one>
Extra-Files: <additional files for the doc directory, commaseperated>
Description: <short description; defaults to some wise words>
long description and info
.
second paragraph

我们只需按自己的需要修改相关项目就行了。文件中每个项目都描述得很清楚,我们不必在此逐行解释它们。现在开始修改吧:

Section: misc
Priority: optional
Standards-Version: 3.0.1

Package: mta-local
Provides: mail-transport-agent

行了,就是这样。mutt要与mail-transport-agent关联,这是所有MTA共用的一个虚拟包(virtual package),我可以简单地将这个软件包命名为mail-transport-agent,不过我更愿意使用系统的虚拟包方案,使用Provides选项。

现在你可以开始创建软件包了:

# equivs-build name
dh_testdir
touch build-stamp
dh_testdir
dh_testroot
dh_clean -k
# Add here commands to install the package into debian/tmp.
touch install-stamp
dh_testdir
dh_testroot
dh_installdocs
dh_installchangelogs
dh_compress
dh_fixperms
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
dpkg-deb: building package `name' in `../name_1.0_all.deb'.

The package has been created.
Attention, the package has been created in the current directory,

然后安装这个新创建的.deb。

众所周知,equivs的用法很多,它甚至可以帮你为那些常用软件的底层关联包创建个性化版本。尽情发挥你的想像力吧,不过要小心。

重要提示:管理文件(control files)的样例文件在/usr/share/doc/equivs/examples目录下。

4.2 移除无用的locale files文件:localepurge
===========================================
许多Debian用户仅在固定地区使用Debian。例如,在巴西的Debian用户,通常使用pt_BR地区配置文件(locale file)而不会关心es地区配置文件。

对于这类用户而言localepurge是一个非常有用的工具,你可以仅保留你当前所用的地区配置文件,删除其它无用的文件,从而释放大量硬盘空间。运行apt-get install localepurge就行了。

它配置起来非常容易,debconf的提问将引导用户一步一步完成设置。在回答第一个问题时请务必谨慎,如果回答错了,系统可能删掉所有的地区配置文件,包括你正在使用的这个。复原它们的唯一方法就是重装那些软件包。

4.3 如何知晓哪些软件包可以升级
==============================
apt-show-versions工具可以告诉你系统中哪些包可以更新以及其它一些有用的信息。-u选项可以显示可更新软件包列表:

$ apt-show-versions -u
libeel0/unstable upgradeable from 1.0.2-5 to 1.0.2-7
libeel-data/unstable upgradeable from 1.0.2-5 to 1.0.2-7

Debian APT HOWTO 第五章 获取软件包信息
APT HOWTO
第五章 获取软件包信息

有些基于APT系统的前端程序,能十分方便地获得系统软件包列表,列表包括可安装或已安装的软件包,还可以显示某软件包属于哪个域(section),它的优先级(priority)是多少,它的说明文档,等等。

但是...在此我们想的学习如何使用APT本身来完成。你如何找出你想要安装的软件包的名称?

我们完成这个任务的方法有很多。我们从apt-cache开始,APT系统使用这个程序来维护它的数据库。下面我们通过一些实际操作来对它做个概览。

5.1 获得软件包名称
==================
假设你十分怀念玩Atari 2600的好日子,你决定用APT安装一个Atari emulator,随后再下载几个游戏,你可以这样:

[root]@[/] # apt-cache search atari
atari-fdisk-cross - Partition editor for Atari (running on non-Atari)
circuslinux - The clowns are trying to pop balloons to score points!
madbomber - A Kaboom! clone
tcs - Character set translator.
atari800 - Atari emulator for svgalib/X/curses
stella - Atari 2600 Emulator for X windows
xmess-x - X binaries for Multi-Emulator Super System

我们找到了几个相关的软件包,以及有关的简单描述。想进一步获得某个软件包的详细信息,你可以运行:

[root]@[/] # apt-cache show stella
Package: stella
Priority: extra
Section: non-free/otherosfs
Installed-Size: 830
Maintainer: Tom Lear <tom@trap.mtview.ca.us>
Architecture: i386
Version: 1.1-2
Depends: libc6 (>= 2.1), libstdc++2.10, xlib6g (>= 3.3.5-1)
Filename: dists/potato/non-free/binary-i386/otherosfs/stella_1.1-2.deb
Size: 483430
MD5sum: 11b3e86a41a60fa1c4b334dd96c1d4b5
Description: Atari 2600 Emulator for X windows
Stella is a portable emulator of the old Atari 2600 video-game console
written in C++. You can play most Atari 2600 games with it. The latest
news, code and binaries for Stella can be found at:
http://www4.ncsu.edu/~bwmott/2600

屏幕上显示出这个软件包的详细信息及其用途的完整描述。如果你的系统中已安装了某个软件包而系统又搜索到它的新版本,系统会将它们的详细信息一并列出。如下例:

[root]@[/] # apt-cache show lilo
Package: lilo
Priority: important
Section: base
Installed-Size: 271
Maintainer: Russell Coker <russell@coker.com.au>
Architecture: i386
Version: 1:21.7-3
Depends: libc6 (>= 2.2.1-2), debconf (>=0.2.26), logrotate
Suggests: lilo-doc
Conflicts: manpages (<<1.29-3)
Filename: pool/main/l/lilo/lilo_21.7-3_i386.deb
Size: 143052
MD5sum: 63fe29b5317fe34ed8ec3ae955f8270e
Description: LInux LOader - The Classic OS loader can load Linux and others
This Package contains lilo (the installer) and boot-record-images to
install Linux, OS/2, DOS and generic Boot Sectors of other OSes.
.
You can use Lilo to manage your Master Boot Record (with a simple text screen)
or call Lilo from other Boot-Loaders to jump-start the Linux kernel.

Package: lilo
Status: install ok installed
Priority: important
Section: base
Installed-Size: 190
Maintainer: Vincent Renardias <vincent@debian.org>
Version: 1:21.4.3-2
Depends: libc6 (>= 2.1.2)
Recommends: mbr
Suggests: lilo-doc
Description: LInux LOader - The Classic OS loader can load Linux and others
This Package contains lilo (the installer) and boot-record-images to
install Linux, OS/2, DOS and generic Boot Sectors of other OSes.
.
You can use Lilo to manage your Master Boot Record (with a simple text screen)
or call Lilo from other Boot-Loaders to jump-start the Linux kernel.

注意,首先列出的是可用软件包,接着列出的是已安装软件包。获取某个软件包的常规信息可运行:

[root]@[/] # apt-cache showpkg penguin-command
Package: penguin-command
Versions:
1.4.5-1(/var/lib/apt/lists/download.sourceforge.net_debian_dists_unstable_main_binary-i386_Packages)(/var/lib/dpkg/status)

Reverse Depends:
Dependencies:
1.4.5-1 - libc6 (2 2.2.1-2) libpng2 (0 (null)) libsdl-mixer1.1 (2 1.1.0) libsdl1.1 (0 (null)) zlib1g (2 1:1.1.3)
Provides:
1.4.5-1 -
Reverse Provides:

如果仅想了解某软件包的与哪些软件包关联,可运行:

[root]@[/] # apt-cache depends penguin-command
penguin-command
Depends: libc6
Depends: libpng2
Depends: libsdl-mixer1.1
Depends: libsdl1.1
Depends: zlib1g

总之,有一系列工具可帮助我们找到我们想要的软件包。

5.2 使用dpkg查找软件包名称
==========================
另一个定位软件包的方法是知道软件包中某个关键文件的名称。例如,你编译时需要某个头文件,查找提供该文件的软件包,你可以运行:

[root]@[/] # dpkg -S stdio.h
libc6-dev: /usr/include/stdio.h
libc6-dev: /usr/include/bits/stdio.h
perl: /usr/lib/perl/5.6.0/CORE/nostdio.h

或者:

[root]@[/] # dpkg -S /usr/include/stdio.h
libc6-dev: /usr/include/stdio.h

在清理硬盘空间时,了解系统中已安装软件的软件包名称十分有用,你可以运行:

[root]@[/] # dpkg -l | grep mozilla
ii mozilla-browse 0.9.6-7 Mozilla Web Browser

这个命令的缺点是它会“截断”软件包的名字。在上例中,软件包的全称是mozilla-browser,解决这个问题可以使用COLUMNS环境变量:

[kov]@[couve] $ COLUMNS=132 dpkg -l | grep mozilla
ii mozilla-browser 0.9.6-7 Mozilla Web Browser - core and browser

或显示成这样:

[root]@[/] # apt-cache search "Mozilla Web Browser"
mozilla-browser - Mozilla Web Browser

5.3 如何“按需”安装软件包
==========================
你正在编译某段程序,突然,停住了!一条错误信息报告说你没有它需要的头文件。让auto-apt来救你吧,它问你是否要安装需要的软件包,然后挂起编译进程,安装好软件包后再恢复编译进程。

你所要做的仅仅是:

auto-apt run command

这里“command”指在运行过程中可能出现“需求文件不存在”问题的命令。例如:

auto-apt run ./configure

一会儿,它就会告诉你要安装所需的软件包并自动转到apt-get处理。如果你正在运行X,就会一个图形界面提示窗口。

为了提高效率auto-apt所用的数据库需要实时更新。可调用auto-apt update,auto-apt updatedb和auto-apt update-local来完成更新。

5.4 如何知道文件属于哪个软件包
==============================
如果你想安装某个软件包,但用apt-cache查不出它的名称,不过你知道这个程序的文件名,或这个软件包中某些文件的文件名,那么你可以用apt-file来查找软件包名称。

$ apt-file search filename

它用起来很象dpkg -S,不过它还会列出包含该文件的已删除软件包。它也可以用来查找哪个软件包包含编译时所缺的文件,当然,解决这类问题auto-apt可能是更好的方案,请参阅 5.3如何“按需”安装软件包。

用这个命令,你可以列出软件包的内容:

$ apt-file list packagename

apt-file用一个数据库来存放所有软件包的内容信息,和auto-apt一样,这个数据库也需要实时更新,完成更新可以运行:

# apt-file update

默认情况下,apt-file和auto-apt使用同一个数据库,参阅 5.3如何“按需”安装软件包。

5.5 如何掌握软件包的变化情况
============================
在每个软件包被安装以后,都会在文档目录(/usr/share/doc/packagename)生成一个 changelog.Debian.gz的文件,这个文件记录了该软件包最后一次更新对系统做了哪些修改,你可以用zless阅读这些信息。不过当你对整 个系统进行升级以后,逐个查看软件包的更新信息可不是件容易事。

有一个工具能帮你完成这项任务,它就是apt-listchanges。首先你要装上apt-listchanges软件包。在安装的过程中,Debconf会问你一些问题,按你的要求回答它们就行了。

“Should apt-listchanges be automatically run by apt”(想让apt自动运行apt-listchanges吗?)这个选项非常有用,因为在你使用apt更新软件包时,它会告诉你此次软件包更新将会对原有系统做出了哪些修改,你分析了这些信息以后再决定是否执行此次更新。“Should apt-listchanges prompt for confirmation after displaying changes?”(显示更新信息后,需要apt-listchanges等待你的确认信息吗?)选项也非常有用,因为在你阅读完更新信息后,它会询问你是否继续安装进程,如果你不想继续,apt-listchanges会返回一条错误信息,告诉apt停止安装进程。

安装了apt-listchanges后,每当apt下载软件包时(不论来源是Internet、光盘或是硬盘)都会显示这些软件包的系统更新信息。

Debian APT HOWTO 第六章 源码包操作
APT HOWTO
第六章 源码包操作

6.1 下载源码包
==============
在自由软件的世界里,经常需要学习源码或为程序除错,所以你需要下载它们。APT提供了一套简便的方法帮你获得发布版中众多程序的源代码以及创建一个.debs所需的所有文件。

Debian源码的另一个普遍用途是将unstable发布版的新版程序进行改写以供别的发布版使用,例如,从stable发布版外引入新的软件包,需要重新生成.debs将它在原发布版中的关联关系迁移到新的发布版。

完成这些工作,/etc/apt/sources.list文件中deb-src所指引用镜像源应该是unstable,别忘了将行首的注释符去掉。详情参阅 2.1/etc/apt/sources.list文件。

用下面的命令下载源码包:

apt-get source packagename

通常会下载三个文件:a .orig.tar.gz, a .dsc and a .diff.gz。对于Debian专用的软件包,最后一个文件不会下载,第一个文件的文件名中没有“orig”项。

dpkg-source读取.dsc文件信息,将源码包解包到packagename-version目录,下载下来的源码包中有一个debian/目录,里面是创建.deb包所需的文件。

想要下载的源码包自动编译成软件包,只需在命令行中加上-b,如下:

apt-get -b source packagename

如果你不打算立即创建.deb包,你可以运行如下命令,以后再创建它。

dpkg-buildpackage -rfakeroot -uc -b

请在下载包所在的目录中运行上面的命令。

apt-get的source命令与它的其它命令有所不同,普通用户权限就可以运行source命令,指定文件被下载到用户调用apt-source package命令时所处的目录中。

6.2 编译源码包所需的软件包
==========================
通常,编译源码包时要用到某些头文件和共享库,所有的源码包的管理文件(control file)中都有一个域“Build-Depends:”,域中指出了编译该源码包需要哪些附加包。

APT提供了一个简单的方法下载这些附加包,你只需运行apt-get build-dep package,其中package就是你打算编译的源码包名称。见下例:

[root]@[/] # apt-get build-dep gmc
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
comerr-dev e2fslibs-dev gdk-imlib-dev imlib-progs libgnome-dev libgnorba-dev
libgpmg1-dev
0 packages upgraded, 7 newly installed, 0 to remove and 1 not upgraded.
Need to get 1069kB of archives. After unpacking 3514kB will be used.
Do you want to continue? [Y/n]

这些用于gmc正确编译指定源码包的附加包将会被安装。注意这个命令不能用来搜索某个软件的源码包,你得另外运行apt-get source下载源码包。


Debian APT HOWTO 第七章 如何处理错误
APT HOWTO
第七章 如何处理错误

7.1 一般错误
============
错误总是发生,大部分是因为用户的粗心,下面列举一些常见错误及处理方法。

如果在运行apt-get install package...时,你的系统报告如下信息:

Reading Package Lists... Done
Building Dependency Tree... Done
W: Couldn't stat source package list 'http://people.debian.org unstable/ Packages' (/var/state/apt/lists/people.debian.org_%7ekov_debian_unstable_Packages) - stat (2 No such file or directory)
W: You may want to run apt-get update to correct these missing files
E: Couldn't find package penguineyes

上次你修改/etc/apt/sources.list后,忘了运行apt-get update更新。

如果出现这样的信息:

E: Could not open lock file /var/lib/dpkg/lock - open (13 Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

如果你没有root权限,当运行除source处的其它apt-get命令,如会出现上面的错误信息。

当你同时运行两个apt-get进程,或者当你试图运行apt-get时已有一个的dpkg进程处于激活状态,系统也会报告与上面相似的错误信息。唯一能与其它命令同时运行的只有source命令。

如果在安装过程中出现中断,然后你发现该软件包既不能重装又不能删除,试试下面两个命令:

# apt-get -f install
# dpkg --configure -a

再试着安装那个软件包,如果不行再次运行上述命令后再试。这两个命令对于那些使用unstable的玩家非常有用。

7.2 在哪儿获得帮助?
===================
如果你发现自己有太多疑问,没关系,有大量的Debian软件包管理系统文档供你参考。--help和帮助文档能为你提供巨大的帮助,这些文档位于/usr/share/doc目录中,如/usr/share/doc/apt。

如果本文档没法帮你排忧解难,可以去Debian邮件列表找找答案,相关栏目内你会获得更多信息。Debian的网址是:http://www.debian.org。

记住只有Debian用户才能这些邮件列表和资源,其它操作系统的用户请到相关系统发布者建立的社区中获取更多资源。


Debian APT HOWTO 第八章 哪些发布版支持APT?
APT HOWTO
第八章 哪些发布版支持APT?

下面是部分使用APT系统的发布团体名称:

Debian GNU/Linux (http://www.debian.org) - APT的开发者

Conectiva (http://www.conectiva.com.br) - 第一个将APT移植用于rpm的发布团体

Mandrake (http://www.mandrake.com)

PLD (http://www.pld.org.pl)

Vine (http://www.vinelinux.org)

APT4RPM (http://apt4rpm.sf.net)

Alt Linux (http://www.altlinux.ru/)

Red Hat (http://www.redhat.com/)

Sun Solaris (http://www.sun.com/)

SuSE (http://www.suse.de/)

Yellow Dog Linux (http://www.yellowdoglinux.com/)


Debian APT HOWTO 第九章 致谢
APT HOWTO
第九章 致谢

非常感谢你们,我Debian-BR项目组的好朋友们!还有你Debian,始终在我身边帮助我,给我动力不停工作为全人类做出贡献,帮助我树立拯救世界的理想。:)

我还要感谢CIPSGA,他们给予我们项目组乃至整个自由软件项目巨大的帮助,是我们灵感的源泉。

特别感谢:

Yooseong Yang <yooseong@debian.org>

Michael Bramer <grisu@debian.org>

Bryan Stillwell <bryan@bokeoa.com>

Pawel Tecza <pawel.tecza@poczta.fm>

Hugo Mora <h.mora@melix.com.mx>

Luca Monducci <luca.mo@tiscali.it>

Tomohiro KUBOTA <kubota@debian.org>

Pablo Lorenzzoni <spectra@debian.org>

Steve Langasek <vorlon@netexpress.net>

Arnaldo Carvalho de Melo <acme@conectiva.com.br>

Erik Rossen <rossen@freesurf.ch>

Ross Boylan <RossBoylan@stanfordalumni.org>

Matt Kraai <kraai@debian.org>

Aaron M. Ucko <ucko@debian.org>

Jon ?slund <d98-jas@nada.kth.se>


Debian APT HOWTO 第十章 本使用指南的新版本
APT HOWTO
第十章 本使用指南的新版本

本操作手册由Debian-BR项目组撰写,我们希望它能为Debian用户提供有效的帮助。

你可以从Debian文档项目页面获得本文档的新版本:http://www.debian.org/doc/ddp

对本文档有任何意见或建议可直接发email给我:kov@debian.org


Debian APT HOWTO 译后记
非常感谢版主能将本文收录到精华区,谢谢!

学Debian走了不少弯路,得出的经验是Debian入门三板斧:dselect、APT、内核编译,掌握了这三者,就算入门了,再深入学习就容易多了。无怪乎有一种说法:Debian就是Packages。

想当初看着dselect头都大了,找了半天也没找到完整一些的中文文档,没办法只好硬着头皮读e文,花了不少时间,读后果然功力增加不少,现在居然觉得dselect是最顺手的包管理软件。

最近有一段闲暇时间,于是斗胆翻几篇文档,希望我一个人费点时间能为大家省点时间。本时受过不少汉化文档之苦,每每大骂译者不负责,轮到自己翻译时 才知道其中的艰苦,本着首先要自己搞懂然后再动笔的原则,只希望日后少被读者骂。不过由于专业技术水平、遣词造句能力都很有限,如果各位Debian高手 读完译文后,发现有错误或不通不懂之处,请发邮件给我,以免误人子弟,我也会升级该文档。

在翻译过程中,我尽最大努力保持原文的风格,不过中文与英文表达方式有不小的差别,所以有一些地方译出来读起来怪怪的,不好懂,这些地方我均以(译 者注)方式进行了意译。整个文档中《导言》、《哪些发布版支持APT?》、《致谢》、《本使用指南的新版本》几个章节没有什么技术信息,不过考虑到文档的 完整性,还是都翻译了,希望版主一并收录进精华区。

接下来嘛,打算译一下dselect的官文文档,希望它是你们所期待的。:)

posted @ 2005-10-04 16:39 ivaneeo 阅读(992) | 评论 (0)编辑 收藏

Debian软件包管理系统会自动管理软件的依赖关系,使我们在安装软件时方便了 很多,不用理会复杂的软件依赖关系,这也是Debian发行版的一大特色。但了解软件包的依赖关系对你熟悉Linux和进行系统开发是很有好处的,所以 Debian也提供了工具帮我们生成软件包的依赖关系图。操作步骤如下,首先,安装相关的工具:
apt-get install apt-rdepends springgraph


用以下命令生成软件包的依赖关系图:
apt-rdepends -d anjuta | springgraph > anjuta.png

这样就生成了anjuta软件包的依赖关系图anjuta.png。
posted @ 2005-10-04 16:30 ivaneeo 阅读(836) | 评论 (0)编辑 收藏

awk 是一种方便的面向行的文本处理语言。
cat 将指定为参数的文件内容打印到终端。作为管道的第一个命令,这是很方便的,例如,cat foo.txt | blah。
cut 从输入文件或流的每个行上抽取出由字符限定的字段。
expand 将输入制表符转换为空格。使用 -t 选项来指定制表符停止位。
fmt 对段落重新格式化以便在其边缘处进行换行。这个能力被构建到大多数文本编辑器中,但是应知道它仍是一个好工具。
head 打印出文件或流的前十行。使用 -n 选项来指定应显示的行数。
join 与 paste 类似,但它在每个输入行中使用一个字段(缺省情况下是第一个字段)来匹配一在单行上合并的字段。
nl 将行号添加到输入的每个行上。这对于打印输出很有用。
od 将输入流转换为八进制或十六进制的“转储”格式。
paste 获取两个或更多文件作为输入,连接输入文件上的每个后续行,并输出结果行。它对于创建文本的表或列是很有用的。
pr 将文件分解为多个页面的输出;通常用于打印。
sed 是一个功能强大的面向流的文本编辑器。
sort 按字母次序打印在命令行上指定的文件内容。当然,sort 也接受用管道传送的输入。输入 man sort 来熟悉控制排序行为的各种选项。
split 将较大的文件拆分成许多较小、更易处理的块。
tac 与 cat 类似,但它以逆向顺序打印所有行,换句话说,先打印最后一行。
tail 打印出文件或流的最后十行。使用 -n 选项来指定应显示的行数。
tee 将它的输入打印到文件和屏幕。当您想创建某些日志记录,但还想在屏幕上看时,这很有用。
tr 是字符转换工具;它用来将输入流中的某些字符映射成输出流中的某些其它字符。
unexpand 将输入空格转换为制表符。使用 -t 选项来指定制表符停止位。
uniq 获取已排序的文件或数据流(通过管道)并除去重复行。
wc 打印出指定文件或输入流(来自管道)中的行、字和字节的数量。输入 man wc 来学习如何精调显示的内容。
posted @ 2005-10-04 16:03 ivaneeo 阅读(543) | 评论 (0)编辑 收藏

  作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Ma­kefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了。

  在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GN­U程序一样,只要使用“./configure”,“make”,“make instal”就可以把程序安装到Linux系统中去了。这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的Toy程序,那么这个文章­对你也会有很大的帮助。

  一、Makefile介绍

  Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefi­le中纪录有文件的信息,在make时会决定在链接的时候需要重新编译哪些文件。

  Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新­编译相应的模块。

  Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的Makefile经常和­自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。这样就造成了手工书写Makefile的诸多问题,automa­ke恰好能很好地帮助我们解决这些问题。

  使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据­另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile。下面我们将详细介绍Ma­kefile的automake生成方法。

  二、使用的环境

  本文所提到的程序是基于Linux发行版本:Fedora Core release 1,它包含了我们要用到的autoconf,automake。

  三、从helloworld入手

  我们从大家最常使用的例子程序helloworld开始。

  下面的过程如果简单地说来就是:

  新建三个文件:

   helloworld.c
   configure.in
   Makefile.am

  然后执行:

aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld

  就可以看到Makefile被产生出来,而且可以将helloworld.c编译通过。

  很简单吧,几条命令就可以做出一个符合惯例的Makefile,感觉如何呀。

  现在开始介绍详细的过程:

  1、建目录

  在你的工作目录下建一个helloworld目录,我们用它来存放helloworld程序及相关文件,如在/home/my/build下:

$ mkdir helloword
$ cd helloworld

  2、 helloworld.c

  然后用你自己最喜欢的编辑器写一个hellowrold.c文件,如命令:vi helloworld.c。使用下面的代码作为helloworld.c的内容。

int main(int argc, char** argv)
{
printf("Hello, Linux World!\n");
return 0;

}

  完成后保存退出。

  现在在helloworld目录下就应该有一个你自己写的helloworld.c了。

  3、生成configure

  我们使用autoscan命令来帮助我们根据目录下的源代码生成一个configure.in的模板文件。

  命令:

$ autoscan
$ ls
configure.scan helloworld.c

  执行后在hellowrold目录下会生成一个文件:configure.scan,我们可以拿它作为configure.in的蓝本。

  现在将configure.scan改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句:

============================configure.in内容开始===============================­==========
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld, 1.0)

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_OUTPUT(Makefile)
============================configure.in内容结束===============================­==========

  然后执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件:

$ aclocal
$ls
aclocal.m4 configure.in helloworld.c
$ autoconf
$ ls
aclocal.m4 autom4te.cache configure configure.in helloworld.c

  大家可以看到configure.in内容是一些宏定义,这些宏经autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。

  autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。

  要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4。

  aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。

  autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。

  autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。

  m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令­,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器。

4、新建Makefile.am

  新建Makefile.am文件,命令:

$ vi Makefile.am

  内容如下:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c

  automake会根据你写的Makefile.am来自动生成Makefile.in。

  Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。

  5、运行automake

  命令:

$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'

  automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。

  6、执行configure生成Makefile

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
$ ls -l Makefile
-rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile

你可以看到,此时Makefile已经产生出来了。

7、使用Makefile编译代码

$ make
if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -

DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0"

-I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" \
-c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; \
then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; \
else rm -f ".deps/helloworld.Tpo"; exit 1; \
fi
gcc -g -O2 -o helloworld helloworld.o  

  运行helloworld

$ ./helloworld
Hello, Linux World!

  这样helloworld就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出正确的helloworld文件。你还可以试着使用一些其他的ma­ke命令,如make clean,make install,make dist,看看它们会给你什么样的效果。感觉如何?自己也能写出这么专业的Makefile,老板一定会对你刮目相看。

  四、深入浅出

  针对上面提到的各个命令,我们再做些详细的介绍。

  1、 autoscan

  autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么auto­scan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。

  2、 configure.scan

  configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in

  3、 aclocal

  aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。

  4、 autoconf

  autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生­合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。

  configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最­后面分别加上AC_INIT宏和AC_OUTPUT宏。

  在configure.ini中:

  #号表示注释,这个宏后面的内容将被忽略。

  AC_INIT(FILE)

  这个宏用来检查源代码所在的路径。

AM_INIT_AUTOMAKE(PACKAGE, VERSION)  

   这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本号:PACKAGE是软件包的名字,VERSION是版本号。当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对应的软件包的名字和版本号。

AC_PROG_CC

  这个宏将检查系统所用的C编译器。

AC_OUTPUT(FILE)

  这个宏是我们要输出的Makefile的名字。

  我们在使用automake时,实际上还需要用到其他的一些宏,但我们可以用aclocal 来帮我们自动产生。执行aclocal后我们会得到aclocal.m4文件。

  产生了configure.in和aclocal.m4 两个宏文件后,我们就可以使用autoconf来产生configure文件了。

  5、 Makefile.am

  Makefile.am是用来生成Makefile.in的,需要你手工书写。Makefile.am中定义了一些内容:

AUTOMAKE_OPTIONS

  这个是automake的选项。在执行automake时,它会检查目录下是否存在标准GNU软件包中应具备的各种文件,例如AUTHORS、ChangeLo­g、NEWS等文件。我们将其设置成foreign时,automake会改用一般软件包的标准来检查。

bin_PROGRAMS

  这个是指定我们所要产生的可执行文件的文件名。如果你要产生多个可执行文件,那么在各个名字间用空格隔开。

helloworld_SOURCES

  这个是指定产生“helloworld”时所需要的源代码。如果它用到了多个源文件,那么请使用空格符号将它们隔开。比如需要helloworld.h,hel­loworld.c那么请写成helloworld_SOURCES= helloworld.h helloworld.c。

  如果你在bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES。

  6、 automake

  我们使用automake --add-missing来产生Makefile.in。

  选项--add-missing的定义是“add missing standard files to package”,它会让automake加入一个标准的软件包所必须的一些文件。

  我们用automake产生出来的Makefile.in文件是符合GNU Makefile惯例的,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文件了。

  7、 Makefile

  在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作:

make

  根据Makefile编译源代码,连接,生成目标文件,可执行文件。

make clean

  清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

make install

  将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。

make dist

  产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。

  它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.i­n中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

make distcheck

  生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不­出现错误,最后提示你软件包已经准备好,可以发布了。

===============================================
helloworld-1.0.tar.gz is ready for distribution
===============================================
make distclean

  类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。

  五、结束语

  通过上面的介绍,你应该可以很容易地生成一个你自己的符合GNU惯例的Makefile文件及对应的项目文件。

  如果你想写出更复杂的且符合惯例的Makefile,你可以参考一些开放代码的项目中的configure.in和Makefile.am文件,比如:嵌入式数­据库sqlite,单元测试cppunit。

posted @ 2005-10-04 13:33 ivaneeo 阅读(727) | 评论 (0)编辑 收藏

仅列出标题
共67页: First 上一页 35 36 37 38 39 40 41 42 43 下一页 Last