posted in Linux相关 

2005 年 9 月 22 日,清华在读博士生王垠在水木社区 BLOG 上发表了《清华梦的粉碎--写给
清华大学的退学申请》明确要求退学,  引起社会各界广泛争论.  他创作的长篇文章《完全用
Linux 工作》,  洋洋两万多字,  从不同角度居高临下的阐述了他眼中 Linux 完全优越于
Windows 的各种理由,  这篇文章并不简单的是一篇论述"Windows 能做的事 Linux 都能做"
这样的文章,  通篇洋溢着一个彻底批判  Windows  平台基础的计算机哲学,  计算机应用和计
算机教育体系的人的万丈豪情,  尽管可能偏激,  也不乏详细的推理论述.  今天我们重温本文,
一方面也是因为 CB 上喜爱和推广 Linux 的人士很多,  有时也会爆发小规模论战,  我们希望
能通过对本文的研究与讨论,  来窥测国内部分 Linux 推广者的心态,  同时为大家提供更宽广
的讨论空间.

我已经半年没有使用  Windows  的方式工作了。Linux  高效的完成了我所有的工作。
GNU/Linux  不是每个人都想用的。如果你只需要处理一般的事务,打游戏,那么你不需要
了解下面这些了。

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

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

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

UNIX     UNIX     UNIX     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 Windows Windows Windows 笼罩下的中国计算机教育
说句丢脸的话,比尔盖茨很久以前是我的偶像……
在中国,比尔盖茨被很多人奉为神圣,"少年电脑天才",甚至有的人提到他的名字就做出"
抱拳对天"的姿势。很多人谈到微软的"新技术","高科技"  都是眉飞色舞。各种"VC 编程圣
经","深入了解  Visual C++"之类的书,在开头几页都会出现非常肉麻的字眼,"在那团团的
混沌中,一个开天辟地的精灵,Windows 1.0,诞生了……"

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

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

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

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

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

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

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

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

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

花了如此多钱买来的操作系统就能用了吗?它竟然连压缩程序都没有提供!你装上 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 Windows Windows 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 Windows Windows Windows 能干而  Linux      Linux      Linux      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 Windows Windows Windows 能做的那些没用的事情
Linux      Linux      Linux      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  一点一点的把我的硬盘排序,调整,用图形的方式
显示出来,然后报告 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   IDE   IDE   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      Linux      Linux      Linux 能干的高精尖的事情  Windows Windows Windows 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      Linux      Linux      Linux 干不了的有用的事情  Windows Windows Windows Windows  照样干不了
当然  Linux  不是万能的。它也有不能干的事情,电脑也有干不了的事情。但是  Linux 干不
了的事情,Windows  肯定也干不了。这些事情就是我们需要探索,需要努力的事情了。在
你探索的过程中,Linux  必定是你的好伙伴。

不要把 Linux 和 Xwindow 掩盖起来!不要把我们的用户当成傻瓜。
什么?你早就知道 Windows  是垃圾?噢!你怎么不早说呢!害我废话这么多。嘿嘿。
""""好了。你知道  Windows Windows Windows Windows 是垃圾,你现在用什么""""
"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  书籍市场。
现在很多人已经把能够利用别人的库写出一个好看的程序作为自己编程水平的象征。在这 "
图形化","可视化"  的年代,你如果还在用  troff, LaTeX  写文档,你还在用 VIM  自己编辑
HTML,用  Mutt  处理邮件,你还在用文本模式的  gdb  调试程序,你还在用 Xlib  写程序,  你
还在用  tin  上  USENET,你还在自己写  Makefile,写机器代码,你还在玩  Clossal Cave  这
样的字符模式冒险游戏,那你就是老古董。

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

GUI   GUI   GUI   GUI vs.  vs.  vs.  vs. CLI  CLI  CLI  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 的程序居然不用"安装"就可以运行,
程序拷贝到随便那个目录都可以用,而不是一定要占用你第一个分区的空间。程序的
设置只是一些简简单单的文本文件。你根本不需要什么"注册表修改器" 就可以改变
系统的设置。这就叫做简单,但是简单就是美。虽然这只是 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 程序。一个列表里可能有很多,那是为了方便你来选择,
我列出了比较信得过的。但其实很多只有第一个是我真正在用的,我不喜欢试用程序。
我不是一个合格的网络管理员,我的服务器都只设置了我自己需要的功能,那样可以省
去我很多麻烦 tongue

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,甚至图片
了 :P其它程序:还有很多我需要用而你不一定用得着的。比如,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。 

2004.8.26

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8547244

posted in Linux相关 

功能最强在的编辑器—— vi

  vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件。当然,对UNIX系统略有所知的人,

  或多或少都觉得vi超级难用,但vi是最基本的编辑器,所以希望读者能好好把它学起来,以后在UNIX世界里必将畅行无阻、

  游刃有余,因为其他几种文本处理器并非UNIX标准配备。说不定别人的Linux机器没安装joe或pico,如果您不会vi,那您可能就没辄了。

  vi的基本概念

  基本上vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),

  各模式的功能区分如下:

  1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。

  2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。

  3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。

  不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,把vi分成Command 和Insert mode。

  vi的基本操作

  ?进入vi

  在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面:

  $ vi testfile

  有一点要特别注意,就是您进入vi之后是处于“Command mode”下,您要切换到Insert mode才能输入文字。

  初次用vi的用户都会想先用上下左右键移动光标,结果电脑一直叫,把自己气个半死,所以进入vi后,先不要乱动,

  转换入Insert后再说。?切换至Insert mode编辑文件在Command mode下按‘i’、‘a’或‘o’三键就可进入Insert mode。

  这时候您就可以开始输入文字了。

  i: 插入,从目前光标所在之处插入所输入的文字。

  a: 增加,目前光标所在的下一个字开始输入文字。

  o: 插入新的一行,从行首开始输入文字。

  ?Insert的切换→Command mode,按Esc键

  您目前处于Insert mode,您就只能一直打字。假如您发现打错字了,想用光标键往回移动,将该字删除,

  就要按ESC键转换回Command mode,再删除文字。

  ?离开vi及存文件

  在Command mode下,可按冒号“:”键入入Last line mode,例如:

  :w filename (输入“w filename”,将文章存入指定的文件名filename)

  :wq (输入“wq”,因为进入之时已经指定文件名testfile,所以会写入testfile并离开vi)

  :q! (输入“q!”,强制离开并放弃编辑的文件)

  Command mode功能键列表

  在介绍command mode指令的时后,指令后面加上“常用”字眼的功能键,表示比较常用的vi指令,

  请读者您一定要学会、记住。

  (1)I、a、o切换进入Insert mode。[超级常用]

  (2)移动光标

  vi可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母

  h、j、k、l,分别控制光标左、下、上、右移一格。

  按Ctrl+B:屏幕往后移动一页。[常用]

  按Ctrl+F:屏幕往前移动一页。[常用]

  按Ctrl+U:屏幕往后移动半页。

  按Ctrl+D:屏幕往前移动半页。

  按 0 (数字零):移动文章的开头。[常用]

  按 G:移动到文章的最后。[常用]

  按 w:光标跳到下个word的开头。[常用]

  按 e:光标跳到下个word的字尾。

  按 b:光标回到上个word的开头。

  按 $:移到光标所在行的行尾。[常用]

  按 ^:移到该行第一个非空白的字符。

  按 0:移到该行的开头位置。[常用]

  按 #:移到该行的第#个位置,例:51、121。[常用]

  (3)删除文字

  x:每按一次删除光标所在位置的后面一个字符。[超常用]

  #x:例如,6x 表删除光标所在位置的后面6个字符。[常用]

  X:大字的X,每按一次删除光标所在位置的前面一个字符。

  #X:例如,20X 表删除光标所在位置的前面20个字符。

  dd:删除光标所在行。[超常用]

  #dd:例如,6dd表删除从光标所在的该行往下数6行之文字。[常用]

  (4)复制

  yw:将光标所在处到字尾的字符复制到缓冲区中。

  (想在和#x、#X的功能相反)

  p:将缓冲区内的字符粘贴到光标所在位置(指令‘yw’与‘p必须搭配使用)。

  yy:复制光标所在行。[超常用]

  p:复制单行到您想粘贴之处。(指令‘yy’与‘p’必须搭配使用)

  #yy:如:6yy表示拷贝从光标所在的该行往下数6行之文字。[常用]

  p:复制多行到您想粘贴之处。(指令‘#yy’与‘p’必须搭配使用)

  “ayy:将复制行放入buffer a, vi提供buffer功能,可将常用的数据存在buffer

  “ap:将放在buffer a的数据粘贴。

  “b3yy:将三行数据存入buffer b。

  “b3p:将存在buffer b的资料粘贴

  (5)取代

  r: 取代光标所在处的字符:[常用]

  R:取代字符直到按Esc为止。

  (6)复原(undo)上一个指令

  u:假如您误操作一个指令,可以马上按u,回复到上一个操作。[超常用]

  .: .可以重复执行上一次的指令。

  (7)更改

  cw:更改光标所在处的字到字尾$处。

  c#w:例如,c3w代表更改3个字。

  (8)跳至指定行

  Ctrl+G:列出光标所在行的行号。

  #G:例如,15G,表示移动光标至文章的第15行行首。[常用]

  Last line mode下指令简介

  读者您要使用Last line mode之前,请记得先按Esc键确定您已经处于Command mode下后,再按冒号“:”或“/”或“?”

  三键的其中一键进入Last line mode。

  1.列出行号

  set nu: 输入“set nu”后,会在文章的每一行前面列出行号。

  2.跳到文章的某一行

  #:井号代表一个数字,在Last line mode提示符号“:”前输入数字,再按Enter就会跳到该行了,

  如:15[Enter]就会跳到文章的第15行。[常用]

  3.寻找字符串

  /关键字:先按/,再输入您想寻找的字,如果第一次找的关键字不是您相尽可能的,可以一直按n会往下寻找到您要的关键字为止。

  ?关键字:先按?,再输入您想寻找的字,如果第一次找的关键字不是您想要的,可以按n会往前寻找到您要的关键字为止。

  4.取代字符串

  1,\(s/string/replae/g:在last line mode输入“1,\)s/string/replace/g”会将全文的string字符串取代为replace字符串,

  其中1,$s就是指搜寻区间为文章从头至尾的意思,g则是表示全部取代不必确认。

  %s/string/replace/c:同样会将全文的string字符串取代为replace字符串,和上面指令不同的地方是,%s和1,$s是相同的功能,

  c则是表示要替代之前必须再次确认是否取代。

  1,20s/string/replace/g:将1至20行间的string替代为relpace字符串。

  5.存文件

  w:在last line mode提示符号“:”前按w即可将文件存起来。[超常用]

  #,# w filename:如果您想摘取文章的某一段,存成另一个文件,可用这个指令#代表行号,例如30,50 w nice,

  将您正在编辑文章的第30~50行存成nice这个文件。

  6.离开

  q:按q就离开,有时如果无法离开vi,可搭配“!:强置离开vi,如“q!”

  qw:一般建议离开时,搭配w一起使用,如此离开时还可存文件

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8510793

posted in C/C++ 

/*
	2012年11月26日20:42:45
	在堆中开辟 5*5 二维数组
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

int main()
{
	int ** p;
	int i, j;
	/*动态申请二维数组空间*/
	p = (int **)malloc(5 * sizeof(int *));
	if (NULL == p)
	{
		printf("动态内存分配失败!\n");
		exit(-1);
	}
	for (i = 0; i < 5; i++)
	{
		p[i] = (int *)malloc(5 * sizeof(int));
		if (NULL == p[i])
		{
			printf("动态内存分配失败!\n");
			exit(-1);
		}
	}

	/*二维数组赋值并输出*/
	for (i = 0; i < 5; i++)
	{
		for (j = 0; j < 5; j++)
		{
			p[i][j] = 5 * i + j;
			printf(" %2d", p[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	/*释放二维数组所占空间*/
	for (i = 0; i < 5; i ++)
		free(p[i]);
	free (p);

	return 0;
}

 

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8227535

posted in OJ题解 

转自梦醒潇湘       http://blog.chinaunix.net/uid-26548237-id-3364131.html

先收藏起来,往后慢慢研究。。

*****************************************以下为正文******************************************************

  今天,关于素数问题纠结了好久好久,倍感知识缺乏啊。因此,通过自己的了解和网上查阅资料,加上自己的啰嗦,在这里整理一下,日后可以翻阅。

   首先,感谢网上的前辈,如果没有您们,我不会获得关于素数的比较全面的知识。非常感谢。

  

1、素数及相关

   素数,又称质数,在一个大于1的自然数中,除了1和此整数自身之外,不能被其他自然数整除的数。

   比1大但不是素数的数称为合数。

   1和0既不是素数,也不是合数。

   算术基本定理证明每个大于1的正整数都可以写成素数的乘积,并且这种乘积的形式是唯一的。

2、试除法求素数

   算法描述:根据素数的定义可知,不能被1和自身外的整数整除的数为素数。所以,我们可以得知,判断一个素数是否为素数只要看它是否能被2~sqrt(i)间的数整数即可。而求N内所有素数则是循环重复上述过程。

 

   C语言实现如下所示。

  1. #include <stdio.h>

  2. #include <time.h>

  3. #include <math.h>

  4. #include <malloc.h>

  5. //试除法

  6. #define NUM 10000

  7. int Test_prime(int n)

  8. {

  9.     int count = 0;

  10.     int i, j;

  11.     int *num= (int*)malloc(sizeof(int)* n);

  12.     num[count++]= 2;

  13.     

  14.     for(i = 3; i <= n; i++)

  15.     {

  16.         for(j= 2; j <= sqrt(i); j++)

  17.         {

  18.             if(i% j == 0)

  19.             {

  20.                 break;

  21.             }

  22.         }

  23.         if(j> sqrt(i))

  24.         {

  25.             num[count++]= i;

  26.         }

  27.     }

  28.     free(num);

  29.     return count;

  30. }

  31. int main()

  32. {

  33.     int count;

  34.     clock_t start,end;

  35.     start = clock();

  36.     count = Test_prime(NUM);

  37.     end = clock();

  38.     printf("%d 内的素数个数为:%d, 总共耗时为:%d 毫秒\n", NUM, count,end - start);

  39.     return 0;

  40. }

   测试结果如下所示(测试在VC6.0下进行)。

26548237_1349254349Rjz7.jpg

  从上面可以看出,当数据很大时,时间消耗增长的比较快。

3、试除法的优化方案

  

   仔细研究试除法,可以发现以下几个问题:

   1> 在循环条件中重复调用了sqrt(i),这显然是比较浪费时间的;

   2> 判断素数,真的需要拿2-sqrt(i)间的所有整数去除吗?我们知道,合数都可以分解成若干质数,所以,只要2-sqrt(i)间的质数不能整除i即可;

   C语言实现如下所示。

点击(此处)折叠或打开

  1. //求N内的所有素数

  2. #include <stdio.h>

  3. #include <time.h>

  4. #include <math.h>

  5. #include <malloc.h>

  6. //试除法

  7. #define NUM 1000000

  8. int Test_prime(int n)

  9. {

  10.     int count = 0;

  11.     int i, j, k, stop;

  12.     //分配空间

  13.     int *num= (int*)malloc(sizeof(int)* n);

  14.     //2肯定是素数

  15.     num[count++]= 2;

  16.     stop = 0;

  17.     for(i = 3; i <= n; i++)

  18.     {

  19.         //在循环中重复调用sqrt是低效做法,故引入k

  20.         k = (int)sqrt(i);

  21.         //stop的作用是:统计小于当前k值的质数的数目

  22.         while(num[stop]<= k && stop < count)

  23.         {

  24.             stop++;

  25.         }

  26.         for(j= 0; j < stop; j++)

  27.         {

  28.             if( i% num[j]== 0)

  29.             {

  30.                 //i不能被2-sqrt(i)间的素数整除,自然不能被其他整数整除,所以为素数

  31.                 break;

  32.             }

  33.         }

  34.         if(j== stop)

  35.         {

  36.             num[count++]= i;

  37.         }

  38.        

  39.     }

  40.     free(num);

  41.     return count;

  42. }

  43. int main()

  44. {

  45.     int count;

  46.     clock_t start,end;

  47.     start = clock();

  48.     count = Test_prime(NUM);

  49.     end = clock();

  50.     printf("%d 内的素数个数为:%d, 总共耗时为:%d 毫秒\n", NUM, count,end - start);

  51.    

  52.     return 0;

  53. }

  测试结果如下所示。

26548237_1349259935jEnd.jpg

   相对于优化前的算法,时间提供了很多。特别是在时间增长曲线的幅度变小了,N值越大,优化后的算法比优化后的算法效率更高。

4、合数过滤筛选法

   算法描述:由质数的定义可以知道,质数N不能被2-(N-1)间的任何整数整除;反过来看,只要能被2-(N-1)间的任何整数整除的N,都不是素数。所以,我们采用排除法:就是对N以内的所有数,只要逐个 去除 值为2-(N-1)的倍数的数,剩下的就是素数。

   C语言实现如下所示。

  1. //合并筛选法

  2. #include <stdio.h>

  3. #include <time.h>

  4. #include <math.h>

  5. #include <malloc.h>

  6. //试除法

  7. #define NUM 10000

  8. int Test_prime(int n)

  9. {

  10.     int count = 0;

  11.     int i, j;

  12.     //分配空间,之所以是n+1,是因为浪费了一个num[0]

  13.     char *num =(char *)malloc(sizeof(char)* (n + 1));

  14.     //初始化素数标记

  15.     for(i = 2; i<= n; i++)

  16.     {

  17.         num[i]= 1;

  18.     }

  19.     //以2-(N-1)为因子过滤合数

  20.     for(i = 2; i <= n-1; i++)

  21.     {

  22.         for(j= 2; j * i <= n; j++)

  23.         {

  24.             //i*j是由两整数相乘而得,显然不是素数

  25.             num[i*j]= 0;

  26.         }

  27.     }

  28.     //统计素数个数

  29.     for( i = 2; i<= n; i++)

  30.     {

  31.         if( 1== num[i])

  32.         {

  33.             count++;

  34.         }

  35.     }

  36.     free(num);

  37.     return count;

  38. }

  39. int main()

  40. {

  41.     int count;

  42.     clock_t start,end;

  43.     start = clock();

  44.     count = Test_prime(NUM);

  45.     end = clock();

  46.     printf("%d 内的素数个数为:%d, 总共耗时为:%d 毫秒\n", NUM, count,end - start);

  47.    

  48.     return 0;

  49. }

   测试结果如下所示。

26548237_1349259935jEnd.jpg

   上述程序好多地方采用了比较低效的做法,为了与后文的优化作比较,这也是像我一样的初学者通常采用的版本,因此,要学会优化。

5、合并筛选法优化方案

   上述算法存在的问题是:

   1> 在外层循环,需要一直执行到n-1嘛?不要,因为n/2-(n-1)之间的数显然不能整除出n;

   2> 在内层循环中重复使用i*j显然是低效的,考虑到计算机中加减运算速度比乘除快,可以考虑变乘法为加法;

   3> 在循环修改flag的过程中,其实有很多数被重复计算若干次,比如6 = 2*3 = 3*2,被重复置零,所以,可以进行避免;

  

   C语言实现如下所示。

点击(此处)折叠或打开

  1. //合并筛选法的优化方案

  2. #include <stdio.h>

  3. #include <time.h>

  4. #include <math.h>

  5. #include <malloc.h>

  6. #define NUM 300000

  7. int Test_prime(int n)

  8. {

  9.     int count = 0;

  10.     int i, j;

  11.     //分配空间

  12.     char *num =(char *)malloc(sizeof(char)* (n + 1));

  13.    

  14.     //初始化素数标记

  15.     num[2] = 1;

  16.     //注意此处是i<n,上例中的i<=n

  17.     for(i = 3; i< n; i++)

  18.     {

  19.         num[i++]= 1;

  20.         num[i]= 0;//偶数自然不是素数

  21.     }

  22.     //如果n为奇数

  23.     if(n % 2 != 0)

  24.     {

  25.         num[n]= 1;

  26.     }

  27.     //从3开始过滤,因为,2的倍数在初始化中去掉了

  28.    for(i = 3; i <= n/2; i++)

  29. **    {**

  30. **        if(0 == num[i] )**

  31. **        {**

  32. **            continue;**

  33. **        }**

  34. **        //从i的2倍开始过滤**

  35. **        for(j = i + i; j <= n;j+=i)**

  36. **        {**

  37. **            num[j] = 0;**

  38. **        }**

  39. **    }**

  40.     //统计素数个数

  41.     for( i = 2; i<= n; i++)

  42.     {

  43.         if( 1== num[i])

  44.         {

  45.             count++;

  46.         }

  47.     }

  48.     free(num);

  49.     return count;

  50. }

  51. int main()

  52. {

  53.     int count;

  54.     clock_t start,end;

  55.     start = clock();

  56.     count = Test_prime(NUM);

  57.     end = clock();

  58.     printf("%d 内的素数个数为:%d, 总共耗时为:%d 毫秒\n", NUM, count,end - start);

  59.    

  60.     return 0;

  61. }

   测试如下所示。

26548237_1349262322scAj.jpg

  确实比先前快了很多,优化真的可以带来时间的提高,这样我很是欣喜。

  

   后来想到进行添加补充:

 

   如果我对上述红色部分代码进行优化,如下所示。

点击(此处)折叠或打开

  1. //从3开始过滤,因为,2的倍数在初始化中去掉了

  2.     for(i = 3; i <= n/2;i = i + 2)

  3.     {

  4.         //在这里进行判断,就已经具有剔除了偶数的功能

  5.         if(0== num[i])

  6.         {

  7.             continue;

  8.         }

  9.         //从i的2倍开始过滤

  10.         for(j= i + i; j<= n;j+=i)

  11.         {

  12.             //是直接进行赋值快呢?还是在此处加上判断快呢??不晓得啊?求解。。

  13.            if( j % 2 == 0)

  14.             {

  15.                 continue;

  16.             }

  17.             else

  18.             {

  19.                 num[j]= 0;

  20.             }

  21.         }

  22.     }

   第一部分红色,我将原来的奇数和偶数进行判断,变为了只对奇数进行判断;

   第二部分红色,我将奇数的倍数为偶数的直接剔除,变成只对倍数为奇数的进行赋值;

   以上两者改变,都基于开始时,已经将偶数剔除。

   对NUM = 300000测试如下所示。

26548237_1349275278v22o.jpg

  

   时间仅为7毫秒,比 优化前NUM = 300000时,时间更快。

6、继续优化

  

   C语言实现代码如下所示。

点击(此处)折叠或打开

  1. //合并筛选法的优化方案

  2. #include <stdio.h>

  3. #include <time.h>

  4. #include <math.h>

  5. #include <malloc.h>

  6. #include <string.h>

  7. #define NUM 10000

  8. int Test_prime(int n)

  9. {

  10.     int i, j;

  11.     // 素数数量统计

  12.     int count = 0;

  13.     // 分配素数标记空间,明白+1原因了吧,因为浪费了一个num[0]

  14.     char *num =(char*)malloc( n+1);

  15.     // 干嘛用的,请仔细研究下文

  16.     int mpLen = 2*3*5*7*11*13;

  17.     char magicPattern[2*3*5*7*11*13];

  18.     // 奇怪的代码,想!

  19.     for (i=0; i<mpLen; i++)

  20.     {

  21.         magicPattern[i++]= 1;

  22.         magicPattern[i++]= 0;

  23.         magicPattern[i++]= 0;

  24.         magicPattern[i++]= 0;

  25.         magicPattern[i++]= 1;

  26.         magicPattern[i]= 0;

  27.     }

  28.     for (i=4; i<=mpLen; i+=5)

  29.     {

  30.         magicPattern[i]= 0;

  31.     }

  32.     for (i=6; i<=mpLen; i+=7)

  33.     {

  34.         magicPattern[i]= 0;

  35.     }

  36.     for (i=10; i<=mpLen; i+=11)

  37.     {

  38.         magicPattern[i]= 0;

  39.     }

  40.     for (i=12; i<=mpLen; i+=13)

  41.     {

  42.         magicPattern[i]= 0;

  43.     }

  44.    

  45.     // 新的初始化方法,将2,3,5,7,11,13的倍数全干掉

  46.     // 而且采用memcpy以mpLen长的magicPattern来批量处理

  47.     int remainder = n%mpLen;

  48.     char* p = num+1;

  49.     char* pstop = p+n-remainder;

  50.     while (p< pstop)

  51.     {

  52.         memcpy(p, magicPattern, mpLen);

  53.         p += mpLen;

  54.     }

  55.     if (remainder> 0)

  56.     {

  57.         memcpy(p, magicPattern, remainder);

  58.     }

  59.     num[2] = 1;

  60.     num[3] = 1;

  61.     num[5] = 1;

  62.     num[7] = 1;

  63.     num[11]= 1;

  64.     num[13]= 1;

  65.    

  66.     // 从17开始过滤,因为2,3,5,7,11,13的倍数早被去掉了

  67.     // 到n/13止的

  68.     int stop = n/13;

  69.     for (i=17; i<= stop; i++)

  70.     {

  71.         // i是合数

  72.         if (0== num[i])

  73.         {

  74.             continue;

  75.         }

  76.        

  77.         // 从i的17倍开始过滤

  78.         int step= i*2;

  79.         for (j=i*17; j<= n; j+=step)

  80.         {

  81.             num[j]= 0;

  82.         }

  83.     }

  84.    

  85.     // 统计素数个数

  86.     for (i=2; i<=n; i++)

  87.     {

  88.         if (num[i])

  89.         {

  90.             count++;

  91.         }

  92.     }

  93.    

  94.     // 释放内存

  95.     free(num);

  96.    

  97.     return count;

  98. }

  99. int main()

  100. {

  101.     int count;

  102.     clock_t start,end;

  103.     start = clock();

  104.     count = Test_prime(NUM);

  105.     end = clock();

  106.     printf("%d 内的素数个数为:%d, 总共耗时为:%d 毫秒\n", NUM, count,end - start);

  107.    

  108.     return 0;

  109. }

   测试结果如下所示。

26548237_13492661023IWp.jpg

**  ** 说实话,这种思想真的很赞,现在的我是无法想到的,感谢作者,让我有了更广泛的见识。

7、其他

   除了以上几种算法外,如拉宾米勒素数测试算法,感觉这个算法比较难,先好好看看,等弄懂了,然后补上。

  

   通过今天的纠结,对于求素数有了更加深刻的了解和认识,感觉自己还差很多,需要更加的努力。

   另外,感谢来自百度空间的作者 doforfun_net,给我了很大的启发,学到了很多。

                                                      梦醒潇湘

                                                  2012-10-3 20:15

 

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8066111

/*
 2012年9月30日22:13:49
 链式二叉树遍历,树的结构图在同一文件夹中。
*/
#include <stdio.h>
#include <malloc.h>

typedef struct BTNode
{
 char data;
 struct BTNode * pLchild;
 struct BTNode * pRchild;
}* pBTNode;
 
pBTNode CreateBTree();    //创建二叉树
void PreTraverseTree(pBTNode);  //先序遍历二叉树,printf在两个递归的前面
//void InTraverseTree(pBTNode);     //中序遍历二叉树,把printf换到两个递归中间
//void PostTraverseTree(pBTNode);   //后序遍历二叉树,把printf换到两个递归后面

int main()
{
 pBTNode pT = CreateBTree();
 
 PreTraverseTree(pT);
 
 return 0;
}

pBTNode CreateBTree()
{
 pBTNode pA = (pBTNode)malloc(sizeof(BTNode));
 pBTNode pB = (pBTNode)malloc(sizeof(BTNode));
 pBTNode pC = (pBTNode)malloc(sizeof(BTNode));
 pBTNode pD = (pBTNode)malloc(sizeof(BTNode));
 pBTNode pE = (pBTNode)malloc(sizeof(BTNode));
 
 pA->pLchild = pB;
 pA->pRchild = pC;
 pA->data = 'A';
 pB->pLchild = pB->pRchild = NULL;
 pB->data = 'B';
 pC->pLchild = pD;
 pC->pRchild = NULL;
 pC->data = 'C';
 pD->pLchild = NULL;
 pD->pRchild = pE;
 pD->data = 'D';
 pE->pLchild = pE->pRchild = NULL;
 pE->data = 'E';
 
 return pA;
}

void PreTraverseTree(pBTNode pT)
{
 if (NULL != pT)
 {
  printf("%c\n", pT->data);
  PreTraverseTree(pT->pLchild);
  PreTraverseTree(pT->pRchild);
 }
}

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8034618

posted in 读书笔记 

       在中国,只要有过留学梦并为之努力过的人,都知道“北京有个新东方”。2007年12月22日,有着“最富有老师”称号的新东方学校创始人俞敏洪接受了央视《人物新周刊》的采访。在回顾自己的创业经历时,他风趣的加上了一句“女人的温柔和男人的能力是完全成正比的。男人能力好了以后,女人一定温柔;男人能力差了以后,她就一定会变得强悍。所以,我跟我老婆是先有生涩的恋爱,再有强悍的婚姻,最后才有温柔的家庭。”人们满堂大小之余,也对俞敏洪的婚姻生活产生了好奇——

                                                              生涩的恋爱——为了你我一定要好好奋斗

      五年的北大校园生活对俞敏洪只有一个字“背”!1980年,他从江苏老家挑着两麻袋行李到北京大学西语系报道。由于不会说普通话,英语听力又差,俞敏洪便开始了一天十几个小时的狂背,还落下了嗜背英语单词如命的“毛病”。虽然这让他能背下惊人的8万个单词,也让他顺利的留在了北京大学任英语老师。但校园的五年,同学们是爱情之花处处开,而他却是无人问津,以至于他自嘲:“看到女孩子就恨不得扑上去!”

      初秋的一天,俞敏洪又郁闷地一个人在校园林荫小道上散步。走着走着,突然,他那嗜背英文单词的老毛病又犯了,嘴洋洋地恨不得立刻找人当“检察官”来考考自己。在顾盼四周后,在路的拐弯处,俞敏洪终于看见一个老外的身影冒了出来。他一个箭步冲过去,像见到多年未曾谋面的老朋友一般一把抓住老外的手:“你好”,请考考我的英语单词好吗?”

      金发碧眼的老外被这突如其来的状况吓了一跳。身后突然传来了“噗哧”一笑,俞敏洪转过身去,一张清丽的面容出现在他的面前。女孩打趣道:“不用找他了,我来考考你吧!……”就这样,24年来,“书呆子”俞敏洪第一次和一个女性“亲密接触”了。

可是刚刚开窍的俞敏洪根本不懂的怎么追求异性。一番思来想去后,俞敏洪选择了最老土的方法——每晚装扮成学生跟在女孩后面去图书馆上晚自习。没想到,这一跟就是五个月。阳春三月的一个夜晚,俞敏洪像往常一样陪着女孩上自习。突然,图书馆停电了,四周顿时一片漆黑。一片慌乱中,沉着的俞敏洪点着打火机:“别慌,跟着我,门在左边……”这“嗒”的一声,不仅照亮了小小的教室,也照亮了俞敏洪与这个德语系系花的姻缘之路。

       果不其然,虽然女孩的母亲很和善地接纳了俞敏洪,可是未来的岳父大人却觉得俞敏洪过于文弱,不太满意。为了让岳父大人早日接受自己,俞敏洪又展开了水磨工夫,拿出了拼命的劲。

      有一天,俞敏洪又去女友家做客。大家准备吃饭时,却不见了他的身影。这让未来的岳父很不快:“饭菜都摆上桌了还不来吃?老四,去吧他给我找来。”正当老人家一脸阴云的时候,俞敏洪出现了。只见他头上、脸上、手上、身上全是煤灰,活脱脱一刚从煤窑里跑出来的“黑人”。看他那狼狈样,大家忍不住哄堂大笑。朴实的俞敏洪也摸着头,红着脸笑:“我刚才看见后院煤池的蜂窝煤放得挺乱的,冬天马上就到了,用起来会很不方便的,我想把它们弄得整齐点,哪知道工作量还挺大……”“你呀,就是太老实!不会找一个人帮帮忙啊,快去洗洗来吃饭吧!”一项不苟言笑的老人第一次对俞敏洪露出了慈爱的笑容。

      酒至半酣,老人家放下酒杯,通红着脸抓住俞敏洪的手:“小俞啊,我们做父母的,都希望女儿能过得舒心一些。你——能理解么?老四是我五个女儿中唯一一个上了大学的,是我的宝中宝呀……”俞敏洪看着前面这位平日不善言辞的老军人泛红的眼圈,重重地点了点头。

新婚之夜,俞敏洪搂住妻子的肩,重复了当日对老岳父的承诺:“为了你,我一定要好好奋斗!”

强悍的婚姻——新东方有我的一半也有你的一半

       可惜,恋爱时的幸福感并没能维持多久。八十年代末,看着自己身边的同学和好友纷纷出国,俞夫人也开始蠢蠢欲动:“敏洪,你也去考考托福吧!将来我们也当海归,开公司!”“瞎折腾什么呀!我们现在的日子不是挺好的吗?”俞敏洪盯着手里的试卷,眼皮也没抬。他不以为然的态度激怒了妻子,她“腾”地站了起来:“人活着就是要折腾,你看看你,成天就知道窝在三尺讲台上的过且过!”妻子的责骂也激怒了同样倔强的俞敏洪,发吼了一句“;老子就这样了,你爱跟不跟!”

      因为小小的托福,两个人第一次发生了激烈的争吵。晚上,躺在床上看着妻子不时暗暗抽动的后背,俞敏洪开始反省自己:“身为一个男人,自己确实应该更加努力一些,妻子也是为自己好啊!”思绪打开后,俞敏洪诚恳的向妻子道歉。王者俞敏洪一脸的内疚,俞夫人展开了笑容:“谁跟你生气了!只要你决心考,就是砸锅卖铁我也支持你!”

      这个较弱而坚强的小女子说到做到,为了支持俞敏洪考托福,从前两手不沾阳春水的她包下了所有的家务,已有时间就四处帮俞敏洪找资料查信息。可在努力了三年半后,俞敏洪赴美留学的孟晓还是付之东流,一起丢失的还有夫妻俩所有的积蓄。

为了多挣点钱,也为了弥补这几年对妻子的亏欠,俞敏洪瞒着妻子悄悄地在外面的英语培训班做起了兼职。可让他没有想到的是,培训班不仅在广告商打出了“北大教师俞敏洪”的字样,还堂而皇之地把广告宣传单贴到了北京城的各个角落。很快,严谨老师在外兼职的北京大学不仅严重警告了俞敏洪,而且还不公告示众一个月,以儆效尤。

      俞敏洪有些撑不住了,开始天天缩在屋里借酒浇愁。得知前因后果的俞夫人心疼地摔掉他手中的酒杯,果断做出了决定;“算了,我们自己创业!你一肚子的学识和经验,还怕成不了大事?!”也是,两人推着一辆小平板车穷家当离开了俞敏洪奋斗了10年的北大校园。

1993年,新东方英语培训学校在中关村一间10平米的违章建筑里开办了。可那时北京的英语培训班已遍地开花,不起眼的新东方根本无人问津。俞敏洪急得嘴角起泡,开始没日没夜的在大街小巷里贴招生广告。看着一天天憔悴的丈夫,俞夫人偷偷地回一辆二手自行车,跟在了俞敏洪的后面,“我和你一起去贴!”俞敏洪一看急了:“零下十几度的大冬天,你出去干啥?你就在家等着人来报名,我一人去就行了!‘可俞夫人倔强劲又来了,她顽皮地冲丈夫笑笑:“等贴到一天有一百人报名了,我就回前台。”

      渐渐地,新东方的生源开始有了转机。正当俞敏洪沉浸在创业成功的喜悦时,一件意想不到的事发生了——一个专门负责贴广告的员工被竞争对手“捅”进了医院!俞敏洪不得不一边用为数不多的钱来给员工付医院非,一边四处找人,寻求一个“说法”。

可是没有任何社会背景,怎么办?一番苦苦思所后,俞敏洪有时用了一个笨方法:天天到公安局“报道”。最终,在一个好心警察的引荐下,俞敏洪见到了派出所所长。在酒桌上,不善应酬的俞敏洪一个劲的劝酒,一个劲的喝酒。在喝下一斤多五粮液后,俞敏洪将自己“喝”进了医院。

      看着病床上脸色蜡黄的丈夫,俞夫人心疼得眼泪不停地往下流。俞敏洪轻轻地拭去妻子脸上的泪花,轻松地笑笑:“别哭啦,不就是喝多了吗。哪位所长专门来看了我,说将来无论我们做什么,他都支持我们。“一席话,让俞夫人更是泣不成声。

在夫妻俩的携手努力下,新东方在北京渐渐站稳了脚,并迅速发展。可一场灾难又忽然降临,1998年,俞敏洪在家门口被人抢劫,罪犯不仅抢走了俞家200多万元,还给他注入了超大剂量的麻醉剂。这一次,一向不服输的俞敏洪坐不住了,他给加拿大的朋友打电话,联系妻女出国事宜。

      可是,当他将机票放在了妻子面前时,俞夫人只扫了一眼就将机票仍到了地上:“不行。要走一起走,要留一起留!‘俞敏洪默默地将机票一张一张的捡起来,轻轻地放进妻子的手里:“走吧!你们娘俩走了,我也好安心,你们要是有什么事,叫我怎么办呢?”俞夫人一把抱住丈夫,泣不成声。就这样,俞敏洪忍着骨肉分离的痛苦,将母女俩送到了大洋彼岸。自此,一家人便两地相望。

      刚安顿好家,2002年的新东方又是“风雨欲来”,学校内部矛盾与利益冲突越来越严重。情急之中俞敏洪决定清除新东方中的所有的裙带关系,其中也包括他自己的小姨子。这下可捅了“马蜂窝”,得知消息,俞夫人第一时间飞回国,一见面就对俞敏洪挥起了“粉 ”:“你最困难的时候,是谁在帮你?1995年你让我退出新东方,看在孩子需要我照顾的份上,我让步了。现在你又不分功劳苦劳这样一竿子打翻一船人,算什么?”面对妻子的指责,俞敏洪沉着脸说了一句话:“为了咱们的新东方,我只能这样。”

      夫妻间就这样僵持住了。俞夫人气愤难平地回来加拿大,对俞敏洪实施了“冷战”——不闻,不问,不理,不睬。可俞敏洪也不恼,只管一个劲地拿热脸去贴冷屁股,该做的事,一样也不落下。短暂的阵痛之后,新东方获得了长足的发展,很快便扬名海外——在国外,每两个华人留学生里准有一个出自新东方,另一个则知道俞敏洪的名字。

                                                     温柔的家庭——风雨过后,我只希望恢复你美丽的容颜

      看着新东方不断上升的业绩,俞夫人终于慢慢地“原谅”了丈夫。到暑假回国时,站在新东方的门外,俞夫人挽着丈夫的手臂,第一次做出了自我批评:“幸好当年你坚持,没有你当初那几下的话,新东方做不到今天。”俞敏洪刮着妻子的鼻子也笑了:“有你这句话,我死也甘心了。”

      随着新东方的急剧扩张,从2003年开始,俞敏洪发现曾经的“战友”开始为金钱争吵的面红耳赤,这让重情义的他感到非常痛心,整夜地睡不着,整把整把的掉头发。俞敏洪的心结很快被妻子看出了端倪。趁丈夫来加拿大团聚的机会,她温言软语地献计:“要不成立董事会?家族式企业,多半是兔子的尾巴长不了。”瞬间的沉静后,俞敏洪一阵大笑:“老婆,咱们真是英雄所见略同呀!我也是这么想的呢。”这夜,10年前创业的那一幕再次上演,夫妻俩挑灯夜战,连夜商讨具体细节。

      2004年,新东方成立董事会,开始以国际标准锻造企业。阵痛之后的新东方,也开始了第二次蓬勃发展。而随着新东方的不断壮大,许多跨国风险投资商盯上了这块“肥肉”,希望以各种形式“入股”。俞敏洪在同事们的支持下紧锣密鼓地开始了准备工作。俞夫人知道后,坚决反对:“敏洪,我现在只希望能守着你和一双儿女平平安安地过日子。”俞敏洪从妻子的倔强中看出了她的担忧。是呀,谁能体会到最亲密的爱人遭受两次危及性命的抢劫的滋味?

      “难道我俞敏洪就这么‘俏’,还能三番五次地被人给看上?”可任由俞敏洪说得口干舌燥,妻子仍不为所动。最后,俞敏洪叹口气,说出了心里话:”我说过要让你过得更好的,这是我人生的一愿望,也算是实现我的人生价值吧!”他情深意切的一番话,终于打破了僵局。

美国东部时间2006年9月7日早上8点,在纽约证券交易所大厅里,新东方的股票代码第一次出现在电子屏上。时至2006年12月1日,根据当日新东方股票收盘价31.91美元估算,俞敏洪的身价已经高达3.5亿美元,相当于27亿元人民币。俞敏洪成了全中国“最富有的老师”。

为了享受美好的家庭生活,俞敏洪每月按时到加拿大与妻子团聚,他还跟朋友打趣自己:“我啊,没出息给老婆做饭,有出息时给孩子做饭。”2007年圣诞节,俞敏洪决定带全家人到夏威夷度假。他在妻儿飞抵夏威夷之前,早上8点就先行到了夏威夷为妻儿忙碌。到了酒店之后,俞敏洪才发现他早早就到预订的海景房居然看不到海!一放下行李,俞敏洪就“蹬蹬蹬”地跑下了楼要求酒店经理换房。

      这时正式夏威夷度假的黄金时期,房间非常紧张。俞敏洪可怜巴巴的央求经理:“你看,我好不容易才来夏威夷一趟,花了那么多钱,就是为了让老婆痛痛快快地玩一次。如果房间不好,她的心情就会不好;她的心情不好,我的心情就会不好。你也是个男人,应该能体会我的这种心情……”一番话说得经理又好笑又感动,他拿起电话就帮这个“可怜”的男人解决了问题。俞夫人来后,这位陌生的酒店经理还对着她一个劲的夸俞敏洪。俞敏洪阻拦不及,站在一旁直搓手。看着丈夫的窘迫样,俞夫人幸福地笑出了声。

      在2007年12月22日央视《人物新周刊》的现场,俞敏洪直言未来的目标是用10年的时间建一所中国一流的人文精英大学,让所有优秀的学生都来他的大学读书,他的豪言壮志赢得了满堂的喝彩。可是,节目录制完之后,当朋友们拍着他的肩膀夸他事业有成时,他却满心愧疚的说:“我现在希望的是,我老婆年轻时的美丽容颜能重现!她跟着我,受苦了……”

红颜已逝,无法追回。所以,俞敏洪正竭尽全力,努力让妻子幸福,哪怕用尽一生的力气,俞敏洪也将在所不惜,因为,他这一生最爱的人,是她;他一生最郑重的承诺,是为她好好奋斗!

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/8006935

/** * RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS. * LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/ /* var disqus_config = function () { this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable }; */ (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://chenzz.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })();