<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(487) | 評論 (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 文檔的解析。


    科學精神
    ---------

    縱觀人類科學發展的歷史,科學精神的作用是貫穿始終的。懷疑是科學創新和發展的源動力之一??茖W精神提倡懷疑,不懷疑已有的陳規和定論,科學家們難以提出新的觀點,也就不會有新的實踐活動,科學也就得不到發展和進步。

    自由軟件鼓勵創新,自由軟件的創新機制來自對所提供的源代碼的懷疑 --- 如果你對程序的功能不滿意,就可以察看程序的源代碼,修改之中的代碼,從而得到更好的功能。 從這個意義上說,開展自由軟件運動可以說是向世人普及科學精神的最好方式之一。任何人都可以自由地自行檢查程序的源代碼,動手來改進程序。


    信息的不對稱性
    --------------

    公開了程序的源代碼,程序對用戶就是透明的了(相比之下,專有軟件的源代碼是密而不宣的),但是,源代碼透明并不等于任何人馬上就能理解代碼的含義,要理解源代碼的含義還需要大量的思維勞動。

    編寫程序這個行當可以說是一門工程技術,就像其他類型工程師的工作一樣,但是,對于具有創造性的軟件,編寫程序的過程卻更像是搞藝術創作。毫無疑問,作者首先必須要懂大量的知識,這一點與藝人表演一樣,“臺上一分鐘,臺下十年功”。成為一位合格的程序員,需要具有很多方面的基礎知識,這些知識的積累都不是一蹴而就的,需要多年的積累,具體多長時間因人而異。

    作者在創作軟件時,精力必須高度集中,很難在一個不安靜的環境下寫出高質量的軟件來。這一點與藝術家們的工作也很相似。劉勰在《文心雕龍》中就說過:“文之思也,其神遠矣。故寂然凝慮,思接千載,悄焉動容,視通萬里...... 故思理為妙,神與物游......” 程序員的創作結果就體現在源代碼之中,但是在源代碼從程序員的頭腦寫到文件的過程中,大量的信息是無法表達的,經驗豐富的程序員會寫很好的代碼注釋,但是即使加上了這些注釋,還是遠遠趕不上程序員頭腦中思想過的全部信息量,因此代碼中含有的信息只是全部信息量的極少部分。當然如果連源代碼這個媒介都不存在(像專有軟件那樣),那就什么都談不上了,信息量為零。

    這正好是泛系理論可以大有作為的地方,因為只要具有足夠的“智能基磚”和正確方法論的導引,人的智能可以放大,從源代碼保存的少量信息量中反演出作者原來創作時的思路來。即使反演的結果含有的信息量還是比不上原作者的信息量,但是由于信息的冗余性存在,只要能夠達到理解的目的,這種反演就算成功,反演就有巨大的價值。如果反演可以推出比原作者頭腦中更多的有價值的信息量來,那就是高級的人工智能技術了。

    我們離開了九寨溝,這一行使我得到了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 矩,專以待人及物而言。而西人之自由,則于及物之中,而實寓所以存我者也。自由既異,于是群異叢然以生。粗舉一二言之: 則如中國最重三綱,而西人首明平等;中國親親,而西人尚賢;中國以孝治天下,而西人以公治天下;中國尊主,而西人隆民;中國貴一道而同風,而西人喜黨居而州處;中國多忌諱,而西人眾譏評。其于財用也,中國重節流,而西人重開源,中國追淳樸,而西人求歡虞。其接物也,中國美謙屈,而西人務發舒;中國尚節文,而西人樂簡易。其于為學也,中國夸多識,而西人重新知。其于災禍也,中國委天數,而西人恃人力。若斯之倫,舉有與中國之理相抗,以并存于兩間,而吾實未感區分其優絀也?!?BR>
    嚴復的西學,“茍扼要而談,不外學術則去偽存真,于刑政則屈私以為公”,他是中國歷史上第一位明確提倡科學與民主的學者,他晚年面對社會上強大的封建勢力而生的退縮立場與復古無損于他的一生學術思想的光輝。

    在歐洲文藝復興特別是法國大革命之后,人類理性思維能力逐漸成熟,終于發展了可以駕馭自身發展規律的完整科學體系。我們不能苛求嚴復,因為他的時代集合論還沒有取得公認的基礎性地位,而今天我們可以利用理性思維工具清楚地認識到,平等的概念可以使用數學中的等價關系概念來精確刻畫,對于社會系統,以自反性、對稱性和傳遞性定義的等價關系是指在集合(社會)中的每一個元素(個體)都處在一個同等的地位上,特權的清除依賴于每一個個體對社會中其他個體一視同仁的尊重,在這種理想的社會中,個體享受自由的權利與與個體尊重他人義務是同時存在的,它們兩者使得自由具有天生的兩重性。在具有等價關系的社會系統中,無論如何進行聚類,得到的群體或者個體都具有相同的自由度 --- 等價關系是正確理解人權的理性思維工具。

    要想使整個社會系統中的每個個體相等地具有相同的權利和義務,遞歸的實施是最有效的手段,因為在這種社會動力學系統中,遞歸能保證系統中普遍的等價關系的建立和存在。以“版權屬左”(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,需要程序員自己來管理內存的分配和回收,因此編程效率低下,而且容易出錯?,F代的許多語言都在模仿 Lisp 的內存垃圾回收機制,例如 Java 語言中就有從 Lisp 借鑒過來的類似內存垃圾回收機制。

    今天的計算機內存部件成本已經大大下降了,因此通過采用動態的垃圾回收技術,即一邊運行程序(而不是讓程序運行暫?;蛘哌M程掛起),一邊回收垃圾,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 閱讀(937) | 評論 (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 閱讀(2791) | 評論 (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 閱讀(791) | 評論 (1)編輯 收藏

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

    這個瘋子不錯!
    posted @ 2005-10-05 13:53 ivaneeo 閱讀(1627) | 評論 (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 的幫助?,F在我體會到了 UNIX 的思想和好處,我可以用比 Windows 高效幾倍的效率工作。因為我相信這樣的信念:"Windows 能辦到的事 Linux 一定能辦到,而且辦的更好。"

     

    這小節開頭的話應該改成:"Unix 是簡單的,你不需要成為一個天才或是計算機專家。但是在這個沖斥著 Windows 錯誤觀念的世界,你需要信念和勇氣才能理解它的簡單。" 我下面就告訴你一些我理解到的東西。首先,你要知道的是微軟在國際科學領域是根本沒有地位的。

     

    微軟的地位

     

    微軟的名 聲在歐洲和美國的大學里,特別是在計算機系里之壞,大家可能有所耳聞。我認識的 MIT,Stanford 的教授,貝爾實驗室的專家,甚至一個歐洲小國的高中計算機老師都絕口不提微軟的名字。在他們眼里,微軟只是一個沒有真技術,??吭诼浜髧疑虡I宣傳和壟斷 經營的小公司。這個"小"并不是說它人少,錢少,而是說它先進技術少。

     

    我上次和王益合作寫了一個算法演示程序,那個算法是貝爾實驗室 一位科學家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元,考過為止"之類的字樣??荚噮⒖假Y料更是昂貴,有些電腦書店整整兩書架都是"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。

     

    那 些程序不會用?。∧切┎藛卧趺丛O置,到底有什么功能???看"幫助"也學不會。買本書看看吧,我推薦"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 行業。" 但是,如果沒有微軟,我們今天早就用上非常穩定,非常可靠,非常方便,非常"傻瓜"的軟件了!微軟是阻擋信息技術發展的罪魁禍首。

     

    微 軟的程序的工作方式(注意,我只是說操作方式,病毒的事情另外算)確實適合于一般家庭,上上網,發發郵件,打打游戲都不錯??墒俏④泤s要把自己包裝成什么 "高科技"企業,要在世界各地設置"研究院",在大學計算機系贈送不適合用于科研的 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 的那個程序都要差很多,那么原因有兩種可能性:

     

    有 一個完全類似的程序,但是由于它乍一看不漂亮,被你忽略了。而其它程序雖然看起來很漂亮,但是它們是一些初學編程的人寫的?,F在由于 Gtk, Qt 的誕生,Linux 下開發圖形界面程序極其簡單,很多初中生甚至小學生都可以隨手編出一些漂亮不中用的程序。如果你整天尋找這樣的程序挑來挑去,永遠也找不到你滿意的。當然 也有一流的程序用 Gtk 和 Qt,比如 GVIM 就可以用 Gtk 作為圖形界面,我還知道 Synopsys 一些程序用了 Qt。

     

    我 曾經也犯過這樣的錯誤,從外表區分一切。結果優秀的 FVWM, lftp, Mutt, wget 都被我忽略過。當我找回它們的時候,我是那么的羞愧不已,它們現在都是我的朋友我第一次看到 FVWM 覺得它只不過是一個有很厚很難看邊框的東西??墒乾F在,我的同學看到 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 定義的?,F在又有人定義了一套"擴展的窗口協議(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 閱讀(505) | 評論 (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。

    通??梢钥闯鋈缦翫ebian默認的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

    我們只需按自己的需要修改相關項目就行了。文件中每個項目都描述得很清楚,我們不必在此逐行解釋它們?,F在開始修改吧:

    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 閱讀(996) | 評論 (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 閱讀(838) | 評論 (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 閱讀(544) | 評論 (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 閱讀(728) | 評論 (0)編輯 收藏

    僅列出標題
    共67頁: First 上一頁 35 36 37 38 39 40 41 42 43 下一頁 Last 
    主站蜘蛛池模板: 亚洲色大18成人网站WWW在线播放| 亚洲最大的成网4438| 久久久久亚洲AV成人网| 亚洲精品乱码久久久久久蜜桃不卡 | 美女被免费网站在线视频免费| 羞羞视频免费观看| 91在线免费观看| 国产精品怡红院永久免费| 日韩免费高清视频网站| 国产亚洲精品成人a v小说| 亚洲色图在线播放| 亚洲日韩一中文字暮| av成人免费电影| 最近2018中文字幕免费视频| 无码高潮少妇毛多水多水免费| 亚洲精品黄色视频在线观看免费资源| 亚洲国产另类久久久精品小说 | 亚洲国产精品综合福利专区| 久久亚洲精品无码av| 精品国产福利尤物免费| 2022久久国产精品免费热麻豆| 卡1卡2卡3卡4卡5免费视频| 久久精品夜色噜噜亚洲A∨| 亚洲精品中文字幕麻豆| 无码天堂va亚洲va在线va| 国产麻豆成人传媒免费观看| 妻子5免费完整高清电视| 亚洲成年看片在线观看| 亚洲人成网站影音先锋播放| 亚洲精品9999久久久久无码| 免费一区二区无码东京热| 免费可以看黄的视频s色| 亚洲午夜福利精品久久| 亚洲最大中文字幕| 一级做a爰性色毛片免费| 亚洲美女视频免费| 久久久久久A亚洲欧洲AV冫| 亚洲AV无码一区二区三区人| 成年女人A毛片免费视频| 成人毛片免费视频| 久久亚洲国产精品|