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

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

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

    海闊天空

    I'm on my way!
    隨筆 - 17, 文章 - 69, 評(píng)論 - 21, 引用 - 0
    數(shù)據(jù)加載中……

    2009年7月10日

    經(jīng)典的Linux Socket 編程 示例代碼 (下)


    摘自:http://fanqiang.chinaunix.net/a4/b7/20010810/1200001101.html


    在例程main()函數(shù)快要結(jié)束時(shí),我們看到,在服務(wù)器接受了客戶(hù)機(jī)的連接請(qǐng)求后,將為其創(chuàng)建子進(jìn)程,并在子進(jìn)程中執(zhí)行代理服務(wù)程序do_proxy()。
    -----------------------------------------------------------------/****************************************************************
    function:    do_proxy
    description:  does the actual work of virtually connecting a client to the telnet service on the          isolated host.
    arguments:   usersockfd socket to which the client is connected. return value: none.
    calls:     none.
    globals:     reads hostaddr.
    ****************************************************************/
    void do_proxy (usersockfd)
    int usersockfd;
    {
    int isosockfd;
    fd_set rdfdset;
    int connstat;
    int iolen;
    char buf[2048];
    /* open a socket to connect to the isolated host */
    if ((isosockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    errorout("failed to create socket to host");
    /* attempt a connection */
    connstat = connect(isosockfd,(struct sockaddr *) &hostaddr, sizeof(hostaddr));
    switch (connstat) {
    case 0:
    break;
    case ETIMEDOUT:
    case ECONNREFUSED:
    case ENETUNREACH:
    strcpy(buf,sys_myerrlist[errno]);
    strcat(buf,"\r\n");
    write(usersockfd,buf,strlen(buf));
    close(usersockfd);
    exit(1);
    /* die peacefully if we can't establish a connection */
    break;
    default:
    errorout("failed to connect to host");
    }
    /* now we're connected, serve fall into the data echo loop */
    while (1) {
    /* Select for readability on either of our two sockets */
    FD_ZERO(&rdfdset);
    FD_SET(usersockfd,&rdfdset);
    FD_SET(isosockfd,&rdfdset);
    if (select(FD_SETSIZE,&rdfdset,NULL,NULL,NULL) < 0)
    errorout("select failed");
    /* is the client sending data? */
    if (FD_ISSET(usersockfd,&rdfdset)) {
    if ((iolen = read(usersockfd,buf,sizeof(buf))) <= 0)
    break; /* zero length means the client disconnected */
    rite(isosockfd,buf,iolen);
    /* copy to host -- blocking semantics */
    }
    /* is the host sending data? */
    if (FD_ISSET(isosockfd,&rdfdset)) {
    f ((iolen = read(isosockfd,buf,sizeof(buf))) <= 0)
    break; /* zero length means the host disconnected */
    rite(usersockfd,buf,iolen);
    /* copy to client -- blocking semantics */
    }
    }
    /* we're done with the sockets */
    close(isosockfd);
    lose(usersockfd);
    }
    -----------------------------------------------------------------
    在 我們這段代理服務(wù)器例程中,真正連接用戶(hù)主機(jī)和遠(yuǎn)端主機(jī)的一段操作,就是由這個(gè)do_proxy()函數(shù)來(lái)完成的。回想一下我們一開(kāi)始對(duì)這段 proxy程序用法的介紹。先將我們的proxy與遠(yuǎn)端主機(jī)綁定,然后用戶(hù)通過(guò)proxy的綁定端口與遠(yuǎn)端主機(jī)建立連接。而在main()函數(shù)中,我們的 proxy由一段服務(wù)器程序與用戶(hù)主機(jī)建立了連接,而在這個(gè)do_proxy()函數(shù)中,proxy將與遠(yuǎn)端主機(jī)的相應(yīng)服務(wù)端口(由用戶(hù)在命令行參數(shù)中指 定)建立連接,并負(fù)責(zé)傳遞用戶(hù)主機(jī)和遠(yuǎn)端主機(jī)之間交換的數(shù)據(jù)。
    由于要和遠(yuǎn)端主機(jī)建立連接,所以我們看到do_proxy()函數(shù)的前半部分實(shí)際上相當(dāng)于一段標(biāo)準(zhǔn)的客戶(hù)機(jī)程序。首先創(chuàng)建一個(gè)新的套接字描述符 isosockfd,然后調(diào)用函數(shù)connect()與遠(yuǎn)端主機(jī)之間建立連接。函數(shù)connect()的定義為:
    -----------------------------------------------------------------
    #include <sys/types.h>
    #include <sys/socket.h>
    int connect(int sockfd, struct sockaddr *servaddr, int addrlen);
    -----------------------------------------------------------------
    參數(shù)sockfd是調(diào)用函數(shù)socket()返回的套接字描述符,參數(shù)servaddr指向遠(yuǎn)程服務(wù)器的套接字地址結(jié)構(gòu),參數(shù)addrlen指定這個(gè) 套接字地址結(jié)構(gòu)的長(zhǎng)度。函數(shù)connect()執(zhí)行成功時(shí)返回"0",如果執(zhí)行失敗則返回"-1",并將全局變量errno設(shè)置為相應(yīng)的錯(cuò)誤類(lèi)型。在例程 中的switch()函數(shù)調(diào)用中對(duì)以下三種出錯(cuò)類(lèi)型進(jìn)行了處理: ETIMEDOUT、ECONNREFUSED和ENETUNREACH。這三個(gè)出錯(cuò)類(lèi)型的意思分別為:ETIMEDOUT代表超時(shí),產(chǎn)生這種情況的原因 有很多,最常見(jiàn)的是服務(wù)器忙,無(wú)法應(yīng)答客戶(hù)機(jī)的連接請(qǐng)求;ECONNREFUSED代表連接拒絕,即服務(wù)器端沒(méi)有準(zhǔn)備好的傾聽(tīng)套接字,或是沒(méi)有對(duì)傾聽(tīng)套接 字的狀態(tài)進(jìn)行監(jiān)聽(tīng);ENETUNREACH表示網(wǎng)絡(luò)不可達(dá)。
    在本例中,connect()函數(shù)的第二個(gè)參數(shù)servaddr是全局變量hostaddr,其中存儲(chǔ)著函數(shù)parse_args()轉(zhuǎn)換好的命令行 參數(shù)。如果連接建立失敗,在例程中就調(diào)用我們自定義的函數(shù)errorout()輸出信息"failed to connect to host"。errorout()函數(shù)的定義為:
    -----------------------------------------------------------------
    /****************************************************************
    function:  errorout
    description: displays an error message on the console and kills the current process.
    arguments:  msg -- message to be displayed.
    return value: none -- does not return.
    calls:    none.
    globals:   none.
    ****************************************************************/
    void errorout (msg)
    char *msg;
    {
    FILE *console;
    console = fopen("/dev/console","a");
    fprintf(console,"proxyd: %s\r\n",msg);
    fclose(console);
    exit(1);
    }
    -----------------------------------------------------------------
    do_proxy()函數(shù)的后半部分是通過(guò)proxy建立用戶(hù)主機(jī)與遠(yuǎn)端主機(jī)之間的連接。我們既有proxy與用戶(hù)主機(jī)連接的套接字 (do_proxy()函數(shù)的參數(shù)usersockfd),又有proxy與遠(yuǎn)端主機(jī)連接的套接字isosockfd,那么最簡(jiǎn)單直接的通信建立方式就是 從一個(gè)套接字讀,然后直接寫(xiě)到另一個(gè)套接字去。如:
    -----------------------------------------------------------------
    int n;
    char buf[2048];
    while((n=read(usersockfd, buf, sizeof(buf))>0)
    if(write(isosockfd, buf, n)!=n)
    err_sys("write wrror\n");
    -----------------------------------------------------------------
    這種形式的阻塞I/O在單向數(shù)據(jù)傳遞的時(shí)候是非常有效的,但是在我們的proxy操作中是要求用戶(hù)主機(jī)和遠(yuǎn)端主機(jī)雙向通信的,這樣就要求我們對(duì)兩個(gè)套 接字描述符既能夠讀由能夠?qū)?。如果還是采用這種方式的阻塞I/O的話(huà),很有可能長(zhǎng)時(shí)間阻塞在一個(gè)描述符上。因此例程在處理這個(gè)問(wèn)題的時(shí)候調(diào)用了 select()函數(shù),這個(gè)函數(shù)允許我們執(zhí)行I/O多路轉(zhuǎn)接。其具體含義就是select()函數(shù)可以構(gòu)造一個(gè)表,在這個(gè)表中包含了我們所有要用到的文件 描述符。然后我們可以調(diào)用一個(gè)函數(shù),這個(gè)函數(shù)可以檢測(cè)這些文件描述符的狀態(tài),當(dāng)某個(gè)(我們指定的)文件描述符準(zhǔn)備好進(jìn)行I/O操作時(shí),此函數(shù)就返回,告知 進(jìn)程哪個(gè)文件描述符已經(jīng)可以執(zhí)行I/O操作了。這樣就避免了長(zhǎng)時(shí)間的阻塞。
    還有一個(gè)函數(shù)poll()可以實(shí)現(xiàn)I/O多路轉(zhuǎn)接,由于在例程中調(diào)用的是select(),我們就只對(duì)select()進(jìn)行一下比較詳細(xì)的介紹。select()系列函數(shù)的詳細(xì)描述為:
    -----------------------------------------------------------------
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
    int select(int n, fd_set *readfds, fd_set *writefds, fd_est *exceptfds, struct timeval *timeout);
    FD_CLR(int fd, fd_set *set);
    FD_ISSET(int fd, fd_set *set);
    FD_SET(int fd, fd_set *set);
    FD_ZERO(fd_set *set);
    -----------------------------------------------------------------
    select()函數(shù)將創(chuàng)建一個(gè)我們所關(guān)心的文件描述符表,它的參數(shù)將在內(nèi)核中為這些文件描述符設(shè)置我們所關(guān)心的條件,例如是否是可讀、是否可寫(xiě)以及 是否異常,而且在參數(shù)中還可以設(shè)置我們希望等待的最大時(shí)間。在select()成功執(zhí)行時(shí),它將返回目前已經(jīng)準(zhǔn)備好的描述符數(shù)量,同時(shí)內(nèi)核可以告訴我們各 個(gè)描述符的狀態(tài)信息。如果超時(shí),則返回"0",如果出錯(cuò),則函數(shù)返回"-1",并同時(shí)設(shè)置errno為相應(yīng)的值。
    select()的最后一個(gè)參數(shù)timeout將設(shè)置等待時(shí)間。其中結(jié)構(gòu)timeval是在文件<bits/time.h>中定義的。
    -----------------------------------------------------------------
    struct timeval
    {
    __time_t tv_sec; /* Seconds */
    __time_t tv_usec; /* Microseconds */
    };
    -----------------------------------------------------------------
    參數(shù)timeout的設(shè)置有三種情況。象例程中這樣timeout==NULL時(shí),這表示用戶(hù)希望永遠(yuǎn)等待,直到我們指定的文件描述符中的一個(gè)已準(zhǔn)備 好,或者是捕捉到一個(gè)信號(hào)。如果是由于捕捉到信號(hào)而中斷了這個(gè)無(wú)限期的等待過(guò)程的話(huà),select()將返回"-1",同時(shí)設(shè)置errno的值為 EINTR。
    如果timeout->tv_sec==0&&timeout->tv_usec==0,那么這表示完全不等待。 Select()測(cè)試了所有指定文件描述符后立即返回。這是得到多個(gè)描述符狀態(tài)而不阻塞select()函數(shù)的輪詢(xún)方法。
    如果timeout->tv_sec!=0||timeout->tv_usec!=0,那么這兩個(gè)參數(shù)的值即為我們希望函數(shù)等待的時(shí) 間。其中tv_sec設(shè)置時(shí)間單位為秒,tv_usec設(shè)置時(shí)間單位為微秒。如果在超時(shí)的時(shí)候,在我們指定的所有文件描述符里面仍然沒(méi)有任何一個(gè)準(zhǔn)備好的 話(huà),則select()將返回"0"。
    中間三個(gè)參數(shù)的數(shù)據(jù)類(lèi)型是fd_set,它的意思是文件描述符集,而readfds, writefds和exceptfds則分別是指向文件描述符集的指針,他們分別描述了我們所關(guān)心的可讀、可寫(xiě)以及狀態(tài)異常的各個(gè)文件描述符。之所以我們 稱(chēng)select()可以創(chuàng)建一個(gè)文件描述符"表",那個(gè)所謂的表就是由這三個(gè)參數(shù)指向的數(shù)據(jù)結(jié)構(gòu)組成的。其具體結(jié)構(gòu)如圖1所示。其中在每個(gè)set_fd數(shù) 據(jù)類(lèi)型中都為我們關(guān)心的所有文件描述符保留了一位。所以在監(jiān)測(cè)文件描述符狀態(tài)的時(shí)候,就在這些set_fd數(shù)據(jù)結(jié)構(gòu)中查詢(xún)相關(guān)的位。
    第一個(gè)參數(shù)n用來(lái)說(shuō)明到底需要遍歷多少個(gè)描述符位。n的值一般是這樣設(shè)置的,從我們關(guān)心的所有文件描述符中選出最大值再加1。例如我們?cè)O(shè)置的所有文件 描述符中最大的為6,那么將n設(shè)置為7,則系統(tǒng)在檢測(cè)描述符狀態(tài)的時(shí)候,就只用遍歷前7位(fd0~fd6)的狀態(tài)。不過(guò)如果不想這樣麻煩的話(huà),我們可以 象例程中那樣將n的值直接設(shè)置為FD_SETSIZE。這是系統(tǒng)中設(shè)定的最大文件描述符個(gè)數(shù),不同的系統(tǒng)這個(gè)值也不相同,一般是256或是1024。這樣 在檢測(cè)描述符狀態(tài)的時(shí)候,函數(shù)將遍歷所有的描述符位。
    在調(diào)用select()函數(shù)實(shí)現(xiàn)多路I/O轉(zhuǎn)接時(shí),首先我們要聲明一個(gè)新的文件描述符集,就象例程中這樣:
    fd_set rdfdset;
    然后調(diào)用FD_ZERO()清空此文件描述符集的所有位,以免下面檢測(cè)描述符位的時(shí)候返回錯(cuò)誤結(jié)果:
    FD_ZERO(&rdfdset);
    然后調(diào)用FD_SET()在文件描述符集中設(shè)置我們關(guān)心的位。在本例中,我們關(guān)心的就是分別與用戶(hù)主機(jī)和遠(yuǎn)端主機(jī)連接的兩個(gè)套接字描述符,所以執(zhí)行這樣的語(yǔ)句:
    FD_SET(usersockfd,&rdfdset);
    FD_SET(isosockfd,&rdfdset);
    然后調(diào)用select()返回描述符狀態(tài),此時(shí)描述符狀態(tài)被存儲(chǔ)進(jìn)描述符集,也就是set_fd數(shù)據(jù)結(jié)構(gòu)中。在圖1中我們看到所有的描述符位狀態(tài)都是 "0",在select()返回后,例如fd0可讀,則在readfds描述符集中fd0對(duì)應(yīng)的位上將狀態(tài)標(biāo)志設(shè)置為"1",如果fd1可寫(xiě),則 writefds描述符集中fd1對(duì)應(yīng)的位上將狀態(tài)標(biāo)志設(shè)置為"1",狀態(tài)異常的情況也也與此相同。在本例中,我們只關(guān)心兩個(gè)套接字描述符是否可寫(xiě),因此 執(zhí)行這樣的select()函數(shù):
    select(FD_SETSIZE,&rdfdset,NULL,NULL,NULL)
    那么在select()返回后怎樣檢測(cè)set_fd數(shù)據(jù)結(jié)構(gòu)中描述符位的狀態(tài)呢?這就要調(diào)用函數(shù)FD_ISSET(),如果對(duì)應(yīng)文件描述符的狀態(tài)為"已準(zhǔn)備好"(即描述符位為"1"),則FD_ISSET()返回"1",否則返回"0"。
    -----------------------------------------------------------------
    if (FD_ISSET(usersockfd,&rdfdset)) {
    if ((iolen = read(usersockfd,buf,sizeof(buf))) <= 0)
    break; /* zero length means the host disconnected */
    write(isosockfd,buf,iolen);
    -----------------------------------------------------------------
    這一段代碼就實(shí)現(xiàn)從套接字usersockfd(用戶(hù)主機(jī))到套接字isosockfd(遠(yuǎn)端主機(jī))的無(wú)阻塞傳輸。而下一段代碼實(shí)現(xiàn)反方向的無(wú)阻塞傳輸:
    -----------------------------------------------------------------
    if (FD_ISSET(isosockfd,&rdfdset)) {
    if ((iolen = read(isosockfd,buf,sizeof(buf))) <= 0)
    break; /* zero length means the host disconnected */
    write(usersockfd,buf,iolen);
    -----------------------------------------------------------------
    這樣就通過(guò)proxy實(shí)現(xiàn)了用戶(hù)主機(jī)與遠(yuǎn)端主機(jī)之間的通信。
    對(duì)這段proxy代碼我只是寫(xiě)了一些自己的理解,大多數(shù)是一些函數(shù)的用法,這些都是linux網(wǎng)絡(luò)編程中一些最基礎(chǔ)的知識(shí),如果有不對(duì)的地方,還請(qǐng)各位大蝦批評(píng)指正。





    posted @ 2009-11-17 21:14 石頭@ 閱讀(754) | 評(píng)論 (0)編輯 收藏

    經(jīng)典的Linux Socket 編程 示例代碼 (上)

    http://fanqiang.chinaunix.net/a4/b7/20010810/1200001101.html


    Linux是一個(gè)可靠性非常高的操作系統(tǒng),但是所有用過(guò)Linux的朋友都會(huì)感 覺(jué)到, Linux和Windows這樣的"傻瓜"操作系統(tǒng)(這里絲毫沒(méi)有貶低Windows的意思,相反這應(yīng)該是Windows的優(yōu)點(diǎn))相比,后者無(wú)疑在易操作 性上更勝一籌。但是為什么又有那么多的愛(ài)好者鐘情于Linux呢,當(dāng)然自由是最吸引人的一點(diǎn),另外Linux強(qiáng)大的功能也是一個(gè)非常重要的原因,尤其是 Linux強(qiáng)大的網(wǎng)絡(luò)功能更是引人注目。放眼今天的WAP業(yè)務(wù)、銀行網(wǎng)絡(luò)業(yè)務(wù)和曾經(jīng)紅透半邊天的電子商務(wù),都越來(lái)越倚重基于Linux的解決方案。因此 Linux網(wǎng)絡(luò)編程是非常重要的,而且當(dāng)我們一接觸到Linux網(wǎng)絡(luò)編程,我們就會(huì)發(fā)現(xiàn)這是一件非常有意思的事情,因?yàn)橐郧耙恍╆P(guān)于網(wǎng)絡(luò)通信概念似是而非 的地方,在這一段段代碼面前馬上就豁然開(kāi)朗了。在剛開(kāi)始學(xué)習(xí)編程的時(shí)候總是讓人感覺(jué)有點(diǎn)理不清頭緒,不過(guò)只要多讀幾段代碼,很快我們就能體會(huì)到其中的樂(lè)趣 了。下面我就從一段Proxy源代碼開(kāi)始,談?wù)勅绾芜M(jìn)行Linux網(wǎng)絡(luò)編程。

       首先聲明,這段源代碼不是我編寫(xiě)的,讓我們感謝這位名叫Carl Harris的大蝦,是他編寫(xiě)了這段代碼并將其散播到網(wǎng)上供大家學(xué)習(xí)討論。這段代碼雖然只是描述了最簡(jiǎn)單的proxy操作,但它的確是經(jīng)典,它不僅清晰地 描述了客戶(hù)機(jī)/服務(wù)器系統(tǒng)的概念,而且?guī)缀醢薒inux網(wǎng)絡(luò)編程的方方面面,非常適合Linux網(wǎng)絡(luò)編程的初學(xué)者學(xué)習(xí)。
    這段Proxy程序的用法是這樣的,我們可以使用這個(gè)proxy登錄其它主機(jī)的服務(wù)端口。假如編譯后生成了名為Proxy的可執(zhí)行文件,那么命令及其參數(shù)的描述為:
    ./Proxy <proxy_port> <remote_host> <service_port>
    其中參數(shù)proxy_port是指由我們指定的代理服務(wù)器端口。參數(shù)remote_host是指我們希望連接的遠(yuǎn)程主機(jī)的主機(jī)名,IP地址也同樣有 效。這個(gè)主機(jī)名在網(wǎng)絡(luò)上應(yīng)該是唯一的,如果您不確定的話(huà),可以在遠(yuǎn)程主機(jī)上使用uname -n命令查看一下。參數(shù)service_port是遠(yuǎn)程主機(jī)可提供的服務(wù)名,也可直接鍵入服務(wù)對(duì)應(yīng)的端口號(hào)。這個(gè)命令的相應(yīng)操作是將代理服務(wù)器的 proxy_port端口綁定到remote_host的service_port端口。然后我們就可以通過(guò)代理服務(wù)器的proxy_port端口訪(fǎng)問(wèn) remote_host了。例如一臺(tái)計(jì)算機(jī),網(wǎng)絡(luò)主機(jī)名是legends,IP地址為10.10.8.221,如果在我的計(jì)算機(jī)上執(zhí)行:
    [root@lee /root]#./proxy 8000 legends telnet
    那么我們就可以通過(guò)下面這條命令訪(fǎng)問(wèn)legends的telnet端口。
    -----------------------------------------------------------------
    [root@lee /root]#telnet legends 8000
    Trying 10.10.8.221...
    Connected to legends(10.10.8.221).
    Escape character is '^]'

    Red Hat Linux release 6.2(Zoot)
    Kernel 2.2.14-5.0 on an i686
    Login:
    -----------------------------------------------------------------
    上面的綁定操作也可以使用下面的命令:
    [root@lee /root]#./proxy 8000 10.10.8.221 23
    23是telnet服務(wù)的標(biāo)準(zhǔn)端口號(hào),其它服務(wù)的對(duì)應(yīng)端口號(hào)我們可以在/etc/services中查看。

    下面我就從這段代碼出發(fā)談?wù)勎覍?duì)Linux網(wǎng)絡(luò)編程的一些粗淺的認(rèn)識(shí),不對(duì)的地方還請(qǐng)各位大蝦多多批評(píng)指正。

    ◆main()函數(shù)
    -----------------------------------------------------------------
    #include <stdio.h>
    #include <ctype.h>
    #include <errno.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/file.h>
    #include <sys/ioctl.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <netdb.h>
    #define TCP_PROTO   "tcp"
    int proxy_port;    /* port to listen for proxy connections on */
    struct sockaddr_in hostaddr;   /* host addr assembled from gethostbyname() */
    extern int errno;   /* defined by libc.a */
    extern char *sys_myerrlist[];
    void parse_args (int argc, char **argv);
    void daemonize (int servfd);
    void do_proxy (int usersockfd);
    void reap_status (void);
    void errorout (char *msg);
    /*This is my modification.
    I'll tell you why we must do this later*/
    typedef void Signal(int);
    /****************************************************************
    function:    main
    description:   Main level driver. After daemonizing the process, a socket is opened to listen for         connections on the proxy port, connections are accepted and children are spawned to         handle each new connection.
    arguments:    argc,argv you know what those are.
    return value:  none.
    calls:      parse_args, do_proxy.
    globals:     reads proxy_port.
    ****************************************************************/
    main (argc,argv)
    int argc;
    char **argv;
    {
    int clilen;
    int childpid;
    int sockfd, newsockfd;
    struct sockaddr_in servaddr, cliaddr;
    parse_args(argc,argv);
    /* prepare an address struct to listen for connections */
    bzero((char *) &servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = proxy_port;
    /* get a socket... */
    if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
    fputs("failed to create server socket\r\n",stderr);
    exit(1);
    }
    /* ...and bind our address and port to it */
    if   (bind(sockfd,(struct sockaddr_in *) &servaddr,sizeof(servaddr)) < 0) {
    fputs("faild to bind server socket to specified port\r\n",stderr);
    exit(1);
    }
    /* get ready to accept with at most 5 clients waiting to connect */
    listen(sockfd,5);
    /* turn ourselves into a daemon */
    daemonize(sockfd);
    /* fall into a loop to accept new connections and spawn children */
    while (1) {
    /* accept the next connection */
    clilen = sizeof(cliaddr);
    newsockfd = accept(sockfd, (struct sockaddr_in *) &cliaddr, &clilen);
    if (newsockfd < 0 && errno == EINTR)
    continue;
    /* a signal might interrupt our accept() call */
    else if (newsockfd < 0)
    /* something quite amiss -- kill the server */
    errorout("failed to accept connection");
    /* fork a child to handle this connection */
    if ((childpid = fork()) == 0) {
    close(sockfd);
    do_proxy(newsockfd);
    exit(0);
    }
    /* if fork() failed, the connection is silently dropped -- oops! */
    lose(newsockfd);
    }
    }
    -----------------------------------------------------------------
    上面就是Proxy源代碼的主程序部分,也許您在網(wǎng)上也曾經(jīng)看到過(guò)這段代碼,不過(guò)細(xì)心的您會(huì)發(fā)現(xiàn)在上面這段代碼中我修改了兩個(gè)地方,都是在預(yù)編譯部分。一個(gè)地方是在定義外部字符型指針數(shù)組時(shí),我將原代碼中的
    extern char *sys_errlist[];
    修改為
    extern char *sys_myerrlist[];原因是在我的Linux環(huán)境下頭文件"stdio.h"已經(jīng)對(duì)sys_errlist[]進(jìn)行了如下定義:
    extern __const char *__const sys_errlist[];
    也許Carl Harris在94年編寫(xiě)這段代碼時(shí)系統(tǒng)還沒(méi)有定義sys_errlist[],不過(guò)現(xiàn)在我們不修改一下的話(huà),編譯時(shí)系統(tǒng)就會(huì)告訴我們sys_errlist發(fā)生了定義沖突。
    另外我添加了一個(gè)函數(shù)類(lèi)型定義:
    typedef void Sigfunc(int);
    具體原因我將在后面向大家解釋。

    套接字和套接字地址結(jié)構(gòu)定義

    這段主程序是一段典型的服務(wù)器程序。網(wǎng)絡(luò)通訊最重要的就是套接字的使用,在程序的一開(kāi)始就對(duì)套接字描述符sockfd和newsockfd進(jìn)行了定義。 接下來(lái)定義客戶(hù)機(jī)/服務(wù)器的套接字地址結(jié)構(gòu)cliaddr和servaddr,存儲(chǔ)客戶(hù)機(jī)/服務(wù)器的有關(guān)通信信息。然后調(diào)用parse_args (argc,argv)函數(shù)處理命令參數(shù)。關(guān)于這個(gè)parse_args()函數(shù)我們待會(huì)兒再做介紹。

    創(chuàng)建通信套接字

      下面就是建立一個(gè)服務(wù)器的詳細(xì)過(guò)程。服務(wù)器程序的第一個(gè)操作是創(chuàng)建一個(gè)套接字。這是通過(guò)調(diào)用函數(shù)socket()來(lái)實(shí)現(xiàn)的。socket()函數(shù)的具體描述為:
    -----------------------------------------------------------------
    #include <sys/types.h>
    #include <sys/socket.h>
    int socket(int domain, int type, int protocol);
    -----------------------------------------------------------------
    參數(shù)domain指定套接字使用的協(xié)議族,AF_INET表示使用TCP/IP協(xié)議族,AF_UNIX表示使用Unix協(xié)議族,AF_ISO表示套接 字使用ISO協(xié)議族。type指定套接字類(lèi)型,一般的面向連接通信類(lèi)型(如TCP)設(shè)置為SOCK_STREAM,當(dāng)套接字為數(shù)據(jù)報(bào)類(lèi)型時(shí),type應(yīng)設(shè) 置為SOCK_DGRAM,如果是可以直接訪(fǎng)問(wèn)IP協(xié)議的原始套接字則type應(yīng)設(shè)置為SOCK_RAW。參數(shù)protocol一般設(shè)置為"0",表示使 用默認(rèn)協(xié)議。當(dāng)socket()函數(shù)成功執(zhí)行時(shí),返回一個(gè)標(biāo)志這個(gè)套接字的描述符,如果出錯(cuò)則返回"-1",并設(shè)置errno為相應(yīng)的錯(cuò)誤類(lèi)型。

    設(shè)置服務(wù)器套接字地址結(jié)構(gòu)

    在通常情況下,首先要將描述服務(wù)器信息的套接字地址結(jié)構(gòu)清零,然后在地址結(jié)構(gòu)中填入相應(yīng)的內(nèi)容,準(zhǔn)備接受客戶(hù)機(jī)送來(lái)的連接建立請(qǐng)求。這個(gè)清零操作可以用 多種字節(jié)處理函數(shù)來(lái)實(shí)現(xiàn),例如bzero()、bcopy()、memset()、memcpy()等,以字母"b"開(kāi)始的兩個(gè)函數(shù)是和BSD系統(tǒng)兼容 的,而后面兩個(gè)是ANSI C提供的函數(shù)。這段代碼中使用的bzero()其描述為:
    void bzero(void *s, int n);
    函數(shù)的具體操作是將參數(shù)s指定的內(nèi)存的前n個(gè)字節(jié)清零。memset()同樣也很常用,其描述為:
    void *memset(void *s, int c, size_t n);
    具體操作是將參數(shù)s指定的內(nèi)存區(qū)域的前n個(gè)字節(jié)設(shè)置為參數(shù)c的內(nèi)容。
    下一步就是在已經(jīng)清零的服務(wù)器套接字地址結(jié)構(gòu)中填入相應(yīng)的內(nèi)容。Linux系統(tǒng)的套接字是一個(gè)通用的網(wǎng)絡(luò)編程接口,它應(yīng)該支持多種網(wǎng)絡(luò)通信協(xié)議,每一 種協(xié)議都使用專(zhuān)門(mén)為自己定義的套接字地址結(jié)構(gòu)(例如TCP/IP網(wǎng)絡(luò)的套接字地址結(jié)構(gòu)就是struct sockaddr_in)。不過(guò)為了保持套接字函數(shù)調(diào)用參數(shù)的一致性,Linux系統(tǒng)還定義了一種通用的套接字地址結(jié)構(gòu):
    -----------------------------------------------------------------
    <linux/socket.h>
    struct sockaddr
    {
    unsigned short sa_family; /* address type */
    char sa_data[14]; /* protocol address */
    }
    -----------------------------------------------------------------
    其中sa_family意指套接字使用的協(xié)議族地址類(lèi)型,對(duì)于我們的TCP/IP網(wǎng)絡(luò),其值應(yīng)該是AF_INET,sa_data中存儲(chǔ)具體的協(xié)議地 址,不同的協(xié)議族有不同的地址格式。這個(gè)通用的套接字地址結(jié)構(gòu)一般不用做定義具體的實(shí)例,但是常用做套接字地址結(jié)構(gòu)的強(qiáng)制類(lèi)型轉(zhuǎn)換,如我們經(jīng)??梢钥吹竭@ 樣的用法:
    bind(sockfd,(struct sockaddr *) &servaddr,sizeof(servaddr))
    用于TCP/IP協(xié)議族的套接字地址結(jié)構(gòu)是sockaddr_in,其定義為:
    -----------------------------------------------------------------
    <linux/in.h>
    struct in_addr
    {
    __u32 s_addr;
    };
    struct sochaddr_in
    {
    short int sin_family;
    unsigned short int sin_port;
    struct in_addr sin_addr;
    /*This part has not been taken into use yet*/
    nsigned char_ _ pad[_ _ SOCK_SIZE__- sizeof(short int) -sizeof(unsigned short int) -       sizeof(struct in_addr)];
    };
    #define sin_zero_ - pad
    -----------------------------------------------------------------
    其中sin_zero成員并未使用,它是為了和通用套接字地址struct sockaddr兼容而特意引入的。在編程時(shí),一般都通過(guò)bzero()或是memset()將其置零。其他成員的設(shè)置一般是這樣的:
    servaddr.sin_family = AF_INET;
    表示套接字使用TCP/IP協(xié)議族。
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    設(shè)置服務(wù)器套接字的IP地址為特殊值INADDR_ANY,這表示服務(wù)器愿意接收來(lái)自任何網(wǎng)絡(luò)設(shè)備接口的客戶(hù)機(jī)連接。htonl()函數(shù)的意思是將主機(jī)順序的字節(jié)轉(zhuǎn)換成網(wǎng)絡(luò)順序的字節(jié)。
    servaddr.sin_port = htons(PORT);
    設(shè)置通信端口號(hào),PORT應(yīng)該是我們已經(jīng)定義好的。在本例中servaddr.sin_port = proxy_port;這是表示端口號(hào)是函數(shù)的返回值proxy_port。
    另外需要說(shuō)明的一點(diǎn)是,在本例中,我們并沒(méi)有看到在預(yù)編譯部分中包含有<linux/socket.h>和< linux/in.h>這兩個(gè)頭文件,那是因?yàn)檫@兩個(gè)頭文件已經(jīng)分別被包含在<sys/types.h>和< sys/types.h>中了,而且后面這兩個(gè)頭文件是與平臺(tái)無(wú)關(guān)的,所以在網(wǎng)絡(luò)通信中一般都使用這兩個(gè)頭文件。

    服務(wù)器公開(kāi)地址

      如果服務(wù)器要接受客戶(hù)機(jī)的連接請(qǐng)求,那么它必須先要在整個(gè)網(wǎng)絡(luò)上公開(kāi)自己的地址。在設(shè)置了服務(wù)器的套接字地址結(jié)構(gòu)之后,可以通過(guò)調(diào)用函數(shù)bind()綁定服務(wù)器的地址和套接字來(lái)完成公開(kāi)地址的操作。函數(shù)bind()的詳細(xì)描述為:
    -----------------------------------------------------------------
    #include <sys/types.h>
    #include <sys/socket.h>
    int bind(int sockfd, struct sockaddr *addr, int addrlen);
    -----------------------------------------------------------------
    參數(shù)sockfd是我們通過(guò)調(diào)用socket()創(chuàng)建的套接字描述符。參數(shù)addr是本機(jī)地址,參數(shù)addrlen是套接字地址結(jié)構(gòu)的長(zhǎng)度。函數(shù)執(zhí)行成功時(shí)返回"0",否則返回"-1",并設(shè)置errno變量為EADDRINUAER。
    如果是服務(wù)器調(diào)用bind()函數(shù),如果設(shè)置了套接字的IP地址為某個(gè)本地IP地址,那么這表示服務(wù)器只接受來(lái)自于這個(gè)IP地址的特定主機(jī)發(fā)出的連接 請(qǐng)求。不過(guò)一般情況下都是將IP地址設(shè)置為INADDR_ANY,以便接受所有網(wǎng)絡(luò)設(shè)備接口送來(lái)的連接請(qǐng)求。
    客戶(hù)機(jī)一般是不會(huì)調(diào)用bind()函數(shù)的,因?yàn)榭蛻?hù)機(jī)在連接時(shí)不用指定自己的套接字地址端口號(hào),系統(tǒng)會(huì)自動(dòng)為客戶(hù)機(jī)選擇一個(gè)未用端口號(hào),并且用本地 IP地址自動(dòng)填充客戶(hù)機(jī)套接字地址結(jié)構(gòu)中的相應(yīng)項(xiàng)。但是在某些特定的情況下客戶(hù)機(jī)需要使用特定的端口號(hào),例如Linux中的rlogin命令就要求使用保 留端口號(hào),而系統(tǒng)是不能為客戶(hù)機(jī)自動(dòng)分配保留端口號(hào)的,這就需要調(diào)用bind()來(lái)綁定一個(gè)保留端口號(hào)了。不過(guò)在一些特殊的環(huán)境下,這樣綁定特定端口號(hào)也 會(huì)帶來(lái)一些負(fù)面影響,如在HTTP服務(wù)器進(jìn)入TIME_WAIT狀態(tài)后,客戶(hù)機(jī)如果要求再次與服務(wù)器建立連接,則服務(wù)器會(huì)拒絕這一連接請(qǐng)求。如果客戶(hù)機(jī)最 后進(jìn)入TIME_WAIT狀態(tài),則馬上再次執(zhí)行bind()函數(shù)時(shí)會(huì)返回出錯(cuò)信息"-1",原因是系統(tǒng)會(huì)認(rèn)為同時(shí)有兩次連接綁定同一個(gè)端口。

    轉(zhuǎn)換Listening套接字

    接下來(lái),服務(wù)器需要將我們剛才與IP地址和端口號(hào)完成綁定的套接字轉(zhuǎn)換成傾聽(tīng)listening套接字。只有服務(wù)器程序才需要執(zhí)行這一步操作。我們通過(guò)調(diào)用函數(shù)listen()實(shí)現(xiàn)這一操作。listen()的詳細(xì)描述為:
    -----------------------------------------------------------------
    #include <sys/socket.h>
    int listen(int sockfd, int backlog);
    -----------------------------------------------------------------
    參數(shù)sockfd指定我們要求轉(zhuǎn)換的套接字描述符,參數(shù)backlog設(shè)置請(qǐng)求隊(duì)列的最大長(zhǎng)度。函數(shù)listen()主要完成以下操作。
    首先是將套接字轉(zhuǎn)換成傾聽(tīng)套接字。因?yàn)楹瘮?shù)socket()創(chuàng)建的套接字都是主動(dòng)套接字,所以客戶(hù)機(jī)可以通過(guò)調(diào)用函數(shù)connect()來(lái)使用這樣的 套接字主動(dòng)和服務(wù)器建立連接。而服務(wù)器的情況恰恰相反,服務(wù)器需要通過(guò)套接字接收客戶(hù)機(jī)的連接請(qǐng)求,這就需要一個(gè)"被動(dòng)"套接字。listen()就可將 一個(gè)尚未連接的主動(dòng)套接字轉(zhuǎn)換成為這樣的"被動(dòng)"套接字,也就是傾聽(tīng)套接字。在執(zhí)行了listen()函數(shù)之后,服務(wù)器的TCP就由CLOSED變成 LISTEN狀態(tài)了。
    另外listen()可以設(shè)置連接請(qǐng)求隊(duì)列的最大長(zhǎng)度。雖然參數(shù)backlog的用法非常簡(jiǎn)單,只是一個(gè)簡(jiǎn)單的整數(shù)。但搞清楚請(qǐng)求隊(duì)列的含義對(duì)理解TCP 協(xié)議的通信過(guò)程建立非常重要。TCP協(xié)議為每個(gè)傾聽(tīng)套接字實(shí)際上維護(hù)兩個(gè)隊(duì)列,一個(gè)是未完成連接隊(duì)列,這個(gè)隊(duì)列中的成員都是未完成3次握手的連接;另一個(gè) 是完成連接隊(duì)列,這個(gè)隊(duì)列中的成員都是雖然已經(jīng)完成了3次握手,但是還未被服務(wù)器調(diào)用accept()接收的連接。參數(shù)backlog實(shí)際上指定的是這個(gè) 傾聽(tīng)套接字完成連接隊(duì)列的最大長(zhǎng)度。在本例中我們是這樣用的:listen(sockfd,5);表示完成連接隊(duì)列的最大長(zhǎng)度為5。

    接收連接

    接下來(lái)我們?cè)谥鞒绦蛑锌吹酵ㄟ^(guò)名為daemonize()的自定義函數(shù)創(chuàng)建一個(gè)守護(hù)進(jìn)程,關(guān)于這個(gè)daemonize()以及守護(hù)進(jìn)程的相關(guān)概念,我 們等一會(huì)兒再做詳細(xì)介紹。然后服務(wù)器程序進(jìn)入一個(gè)無(wú)條件循環(huán),用于監(jiān)聽(tīng)接收客戶(hù)機(jī)的連接請(qǐng)求。在此過(guò)程中如果有客戶(hù)機(jī)調(diào)用connect()請(qǐng)求連接,那 么函數(shù)accept()可以從傾聽(tīng)套接字的完成連接隊(duì)列中接受一個(gè)連接請(qǐng)求。如果完成連接隊(duì)列為空,這個(gè)進(jìn)程就睡眠。accept()的詳細(xì)描述為:
    -----------------------------------------------------------------
    #include <sys/socket.h>
    int accept(int sockfd, struct sockaddr *addr, int *addrlen);
    -----------------------------------------------------------------
    參數(shù)sockfd是我們轉(zhuǎn)換成功的傾聽(tīng)套接字描述符;參數(shù)addr是一個(gè)指向套接字地址結(jié)構(gòu)的指針,參數(shù)addrlen為一個(gè)整型指針。當(dāng)函數(shù)成功執(zhí) 行時(shí),返回3個(gè)結(jié)果,函數(shù)返回一個(gè)新的套接字描述符,服務(wù)器可以通過(guò)這個(gè)新的套接字描述符和客戶(hù)機(jī)進(jìn)行通信。參數(shù)addr所指向的套接字地址結(jié)構(gòu)中將存放 客戶(hù)機(jī)的相關(guān)信息,addrlen指針將描述前述套接字地址結(jié)構(gòu)的長(zhǎng)度。在通常情況下服務(wù)器對(duì)這些信息不是很感興趣,因此我們經(jīng)??梢钥吹揭恍┰创a中將 accept()函數(shù)的后兩個(gè)參數(shù)都設(shè)置為NULL。不過(guò)在這段proxy源代碼中需要用到有關(guān)的客戶(hù)機(jī)信息,因此我們看到通過(guò)執(zhí)行
    newsockfd = accept(sockfd, (struct sockaddr_in *) &cliaddr, &clilen);
    將客戶(hù)機(jī)的詳細(xì)信息存放在地址結(jié)構(gòu)cliaddr中。而proxy就通過(guò)套接字newsockfd與客戶(hù)機(jī)進(jìn)行通信。值得注意的是這個(gè)返回的套接字描 述符與我們轉(zhuǎn)換的傾聽(tīng)套接字是不同的。在一段服務(wù)器程序中,可以始終只用一個(gè)傾聽(tīng)套接字來(lái)接收多個(gè)客戶(hù)機(jī)的連接請(qǐng)求;而如果我們要和客戶(hù)機(jī)建立一個(gè)實(shí)際的 連接的話(huà),對(duì)每一個(gè)請(qǐng)求我們都需要調(diào)用accept()返回一個(gè)新的套接字。當(dāng)服務(wù)器處理完畢客戶(hù)機(jī)的請(qǐng)求后,一定要將相應(yīng)的套接字關(guān)閉;如果整個(gè)服務(wù)器 程序?qū)⒁Y(jié)束,那么一定要將傾聽(tīng)套接字關(guān)閉。
    如果accept()函數(shù)執(zhí)行失敗,則返回"-1",如果accept()函數(shù)阻塞等待客戶(hù)機(jī)調(diào)用connect()建立連接,進(jìn)程在此時(shí)恰好捕捉到 信號(hào),那么函數(shù)在返回"-1"的同時(shí)將變量errno的值設(shè)置為EINTR。這和accept()函數(shù)執(zhí)行失敗是有區(qū)別的。因此我們?cè)诖a中可以看到這樣 的語(yǔ)句:
    -----------------------------------------------------------------
    if (newsockfd < 0 && errno == EINTR)
    continue;
    /* a signal might interrupt our accept() call */
    else if (newsockfd < 0)
    /* something quite amiss -- kill the server */
    errorout("failed to accept connection");
    -----------------------------------------------------------------
    可以看出程序在處理這兩種情況時(shí)操作是完全不同的,同樣是accept()返回"-1",如果有errno == EINTR,那么系統(tǒng)將再次調(diào)用accept()接受連接請(qǐng)求,否則服務(wù)器進(jìn)程將直接結(jié)束。

    posted @ 2009-11-17 21:13 石頭@ 閱讀(2379) | 評(píng)論 (0)編輯 收藏

    Unix發(fā)展史

    先前的一個(gè)理想
    UNIX系統(tǒng)自 1969 年 Ken ThompsonKen Thompson 與 Dennis RitchieDennis Ritchie 在美國(guó)貝爾電話(huà)實(shí)驗(yàn)室(Bell Telephone Laboratories )發(fā)展出雛形至今,已歷經(jīng)近 30 來(lái)年。而 "UNIX" 這個(gè)字典上查不到其原意的怪字,其實(shí)是戲謔 MULTICS(MULTiplexed Information and Computing System)操作系統(tǒng)的大而無(wú)當(dāng)所產(chǎn)生的諧音字。
    在 1957 年 10 月,前蘇聯(lián)發(fā)射了第一枚人造衛(wèi)星,此舉讓當(dāng)時(shí)的美國(guó)總統(tǒng)艾森豪威爾決定投下巨額的經(jīng)費(fèi)用以支持及發(fā)展科學(xué),美國(guó)高等研究計(jì)劃署 (ARPA,Advanced Research Projects Agency )便是在這個(gè)時(shí)空下設(shè)立了,該單位負(fù)責(zé)推動(dòng)系統(tǒng)發(fā)展等相關(guān)計(jì)劃,成為當(dāng)時(shí)美國(guó)電子計(jì)算器發(fā)展的重要推手。
    1960年代是大型計(jì)算機(jī)的發(fā)展年代,當(dāng)時(shí)的麻省理工學(xué)院因最先實(shí)現(xiàn)了兼容分時(shí)系統(tǒng)(CTSS, Compatible Time-Sharing System),在電子計(jì)算器領(lǐng)域享有相當(dāng)崇高的地位。
    1963年,麻省理工的里克萊德(J. C. R. Licklider,1915~1990 )
    推動(dòng)了 MAC計(jì)劃,MAC 以 IBM的大型計(jì)算機(jī)做為主體,連接了將近 160臺(tái)終端機(jī),這些終端機(jī)就四散在學(xué)區(qū)以及教職員的家中,可以讓 30 位使用者同時(shí)共享計(jì)算機(jī)資源。這項(xiàng)計(jì)劃到了 1965 年便不堪負(fù)荷,于是麻省理工便決定開(kāi)發(fā)更大型的分時(shí)計(jì)算機(jī)系統(tǒng)。新的計(jì)劃便是—— MULTICS. 一個(gè)計(jì)算機(jī)
    史上最為龐大的分時(shí)計(jì)算機(jī)系統(tǒng),企圖連接 1000 部終端機(jī),支持 300位使用者同時(shí)上線(xiàn)的分時(shí)計(jì)算機(jī)系統(tǒng)。她面臨的是,操作系統(tǒng)的分時(shí)觀(guān)念還在各學(xué)術(shù)與研究機(jī)構(gòu)探索成形中,計(jì)算機(jī)硬件亦需重新設(shè)計(jì)的雙重挑戰(zhàn)。
    當(dāng)時(shí),麻省理工原本找 IBM來(lái)配合這項(xiàng)計(jì)劃,但 IBM正忙著應(yīng)付自己的問(wèn)題而無(wú)意配合MULTICS 計(jì)劃。此時(shí),通用電子公司(General Electric Company)
    也就是奇異公司正好在發(fā)展自己的大型主機(jī),見(jiàn)機(jī)不可失,便極力邀請(qǐng)麻省理工參予她們的 GE 645 大型主機(jī)的規(guī)格制定。有了奇異熱心主動(dòng)的計(jì)算機(jī)硬件配合,麻省理工找上的不能販?zhǔn)塾?jì)算機(jī)卻人才濟(jì)濟(jì)的貝爾電話(huà)實(shí)驗(yàn)室來(lái)負(fù)責(zé)承包軟件工程。于是 乎,MULTICS 的計(jì)劃便在 1965 年由麻省理工學(xué)院、奇異公司及貝爾電話(huà)實(shí)驗(yàn)室這三個(gè)成員開(kāi)始共同發(fā)展。
    1969年,MULTICS 計(jì)劃在歷經(jīng)四年的奮戰(zhàn)后,仍舊未達(dá)到原先規(guī)劃設(shè)計(jì)的理想,貝爾電話(huà)實(shí)驗(yàn)室決定退出計(jì)劃。功能未達(dá)原始設(shè)計(jì)理想的 MULTICS還是安裝在奇異公司的 GE 645 大型計(jì)算機(jī)上供麻省理工使用。奇異公司在該計(jì)劃草草結(jié)束后不到一年便完全淡出大型計(jì)算機(jī)市場(chǎng)。日后,MULTICS 計(jì)劃被嘲解為Many Unnecessarily Large Table In Core Simultaneously.
    農(nóng)夫我個(gè)人認(rèn)為, MULTICS計(jì)劃誕生在大型計(jì)算機(jī)將開(kāi)始鼎沸的 1965 年,夭折于大型計(jì)算機(jī)最為輝煌的 1969 年。她如果適時(shí)在 1960 年代末期成功的話(huà),絕對(duì)可以助長(zhǎng)當(dāng)時(shí)已經(jīng)普遍被計(jì)算機(jī)權(quán)威人士視為理想的「計(jì)算機(jī)公用事業(yè)」,至少可以讓大型計(jì)算機(jī)的發(fā)展與資源集中的應(yīng)用模式就不至于會(huì) 在 1970 年代初期就迅速萎縮。因?yàn)?MULTICS計(jì)劃如果成功,至少能讓當(dāng)時(shí)的大型計(jì)算機(jī)的應(yīng)用規(guī)模大上 10 倍左右。然而,MULTICS 計(jì)劃失敗了。她嚴(yán)重地打擊了當(dāng)時(shí)依賴(lài)大型計(jì)算機(jī)主機(jī)的計(jì)算機(jī)公用事業(yè)業(yè)者在發(fā)展上的信心。更由于沒(méi)有相似的計(jì)劃后繼進(jìn)行,使得集中式的大型計(jì)算機(jī)主機(jī)沒(méi)有 明顯的使用效能提升,而加速催化計(jì)算器工業(yè)的轉(zhuǎn)變,以尋找新的道路。另一方面,MULTICS 計(jì)劃失敗的經(jīng)驗(yàn)亦讓當(dāng)時(shí)參與該計(jì)劃的軟件工程師們得到相當(dāng)寶貴的經(jīng)驗(yàn)與正面的影響。
    幾年后,就在 AT&T ,MULTICS 計(jì)劃這個(gè)不同凡響的失敗換來(lái)的一個(gè)不同凡響的成功。
    一個(gè)戲謔她的名字誕生了…… UNIX.
    Ken_Thompso


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351425013001.jpg');" border="0">
    Dennis_Ritchie


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M103514N021A4.jpg');" border="0">

    一個(gè)游戲的開(kāi)始
    1969年貝爾實(shí)驗(yàn)室的計(jì)算器科學(xué)研究中心(Computing Science Research Center )
    成員退出 MULTICS計(jì)劃的同時(shí),貝爾實(shí)驗(yàn)室本身其實(shí)也沒(méi)有一套完善便利的交談式計(jì)算器服務(wù)環(huán)境。在其中不少工程師們也正為了改善程序設(shè)計(jì)環(huán)境努力著, Ken Thompson 、Dennis Ritchie和其同事們?cè)诋?dāng)時(shí)草擬一個(gè)新的檔案系統(tǒng)架構(gòu),這個(gè)檔案系統(tǒng)也就是早期的 UNIX 操作系統(tǒng)的檔案系統(tǒng)的前身。當(dāng)時(shí)的 Ken Thompson 忙著使用 Fortran語(yǔ)言將原本在 Multics系統(tǒng)中開(kāi)發(fā)的game叫 "Space Travel" (太空旅游)轉(zhuǎn)移到 GECOS System 上開(kāi)發(fā)。 當(dāng)時(shí) GECOS System大型計(jì)算機(jī)的CPU Time相當(dāng)昂貴(一秒要 75 塊美金),同時(shí)控制 "spaceship"(宇宙飛船) 的效果不甚理想,于是 Ken Thompson 不得不尋找替代的開(kāi)發(fā)環(huán)境。Thompson看上了一臺(tái)很少被人使用的 Digital Equipment Corporation PDP-7 迷你計(jì)算機(jī),當(dāng)時(shí) PDP-7使用的是 Graphic-II 顯示器,具有不錯(cuò)的圖形處理能力。 Brian kernighan 于是 Ken Thompson 便與 Dennis Ritchie 連手將程序設(shè)計(jì)轉(zhuǎn)移到 PDP-7型計(jì)算機(jī)上。
    Ken Thompson在移轉(zhuǎn)工作環(huán)境的同時(shí)為了得到較好的發(fā)展環(huán)境,便與Dennis Ritchie共同動(dòng)手設(shè)計(jì)一套包含 File System、Process Subsystem 及一小組 Utility的操作系統(tǒng),當(dāng)時(shí)這套系統(tǒng)僅能支持 2個(gè)使用者使用。由于貝爾實(shí)驗(yàn)室對(duì)于 MULTICS計(jì)劃失敗的陰霾還未消散, Brian Kernighan這位仁兄開(kāi)玩笑地戲稱(chēng)這套新的操作系統(tǒng)為 UNiplexed Information and Computing System,縮寫(xiě)為 UNICS,之后大家取諧音便叫她為 "UNIX" ,沒(méi)想到這個(gè)開(kāi)玩笑的名字會(huì)被人叫到今天。
    初期的自由發(fā)展
    事實(shí)上該套 "UNIX" 系統(tǒng)在當(dāng)時(shí)僅是私下的被使用,也并沒(méi)有得到多大的重視,一直到1971年的一個(gè)正式的計(jì)劃,UNIX才正式被搬上臺(tái)面。
    PDP-11/201970 年,當(dāng)時(shí)貝爾實(shí)驗(yàn)室的專(zhuān)利部門(mén)(Patent department )缺乏一套文書(shū)處理系統(tǒng),為了設(shè)計(jì)開(kāi)發(fā)的需要,于是買(mǎi)了一臺(tái) PDP-11 計(jì)算機(jī)。當(dāng)時(shí) PDP-11 計(jì)算機(jī)的交機(jī)過(guò)程并不順利,處理器先到,硬盤(pán)則多等了好幾個(gè)月。
    當(dāng) PDP-11 一切準(zhǔn)備妥當(dāng)后,他們便將 UNIX 移植到擁有 512K bytes 硬盤(pán)的PDP-11/20 型計(jì)算機(jī)上,并在此系統(tǒng)之下開(kāi)發(fā)了一套文書(shū)處理工具。而這套工具便是后來(lái) nroff / troff的前身。那時(shí)的 UNIX 提供 16K bytes給系統(tǒng)、8K bytes給使用程序,檔案最大的極限是 64K bytes. 而此套含有文書(shū)處理工具的系統(tǒng),也正式獲得貝爾實(shí)驗(yàn)室的專(zhuān)利部門(mén)采用,系統(tǒng)名稱(chēng)并被編為 "First Edition". 在 UNIX 移植成功后 Thompson 用 B語(yǔ)言為它添加了 Fortran Compiler,但因?yàn)?B語(yǔ)言屬于一種解譯語(yǔ)言(interpretive language ),執(zhí)行成效并不是很好,于是 Ritchie又將它—— Compiler 發(fā)展成可產(chǎn)生機(jī)器碼、允許定義數(shù)據(jù)形態(tài)及結(jié)構(gòu),Ritchie 稱(chēng)它為 C語(yǔ)言。1973年并以 C語(yǔ)言改寫(xiě)全部UNIX原始程序,UNIX于是首度出現(xiàn)正式版本——V5(第五版)。
    此時(shí)的 UNIX 慢慢地在貝爾實(shí)驗(yàn)室內(nèi)部蔓延開(kāi)來(lái),裝機(jī)數(shù)也變成了 25 部之多。
    由于當(dāng)時(shí)的貝爾實(shí)驗(yàn)室實(shí)際上是掌控在美國(guó)電信電話(huà)公司(AT&T)及其子公司西方電器公司的手上,實(shí)驗(yàn)室主要是負(fù)責(zé)研究改進(jìn)西方電器公司制造的和 美國(guó)電信電話(huà)公司在貝爾系統(tǒng)中使用的電信設(shè)備。同時(shí)根據(jù)軍方合同,從事與國(guó)防有關(guān)的研究與改進(jìn)的工作。而 AT&T 本身由于有反托拉斯法的限制并不能從事于任何有關(guān)計(jì)算機(jī)方面的銷(xiāo)售,所以 AT&T 的主管階層們對(duì)于當(dāng)時(shí) UNIX 的發(fā)展并沒(méi)有太多的支持,因而當(dāng)時(shí)貝爾實(shí)驗(yàn)室內(nèi)部對(duì)于 UNIX 的發(fā)展并不是相當(dāng)在意也無(wú)意于將之推廣。不過(guò)為了應(yīng)付實(shí)驗(yàn)室內(nèi)各部門(mén)日益增加的 UNIX 使用者與相關(guān)技術(shù)支持需求,還是成立了 UNIX ystem Group (簡(jiǎn)稱(chēng) USG)。但該組織也僅只是提供技術(shù)上的支持,并未賦予繼續(xù)發(fā)展的任務(wù)。所以當(dāng)時(shí)的 UNIX 發(fā)展,全靠AT&T的工程師們的努力。這段期間 UNIX 的發(fā)展完全沒(méi)有組織及系統(tǒng)性可言,而玩家盡是一些工程師們,于是乎種下了 UNIX 日后較難以被一般人所接受的命運(yùn)。


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351522035M3.jpg');" border="0">



    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351522035M3.jpg');" border="0">

    走出貝爾實(shí)驗(yàn)室
    1974年 Thompson 與 Ritchie共同在 Communications of the ACM發(fā)表了一篇 UNIX 論文 "UNIX Time-Sharing System" 得到相當(dāng)大的回響。 1975 年 UNIX 發(fā)表第六版(V6)﹐其提供的強(qiáng)大功能更勝過(guò)當(dāng)時(shí)昂貴大計(jì)算機(jī)的操作系統(tǒng),其最大特點(diǎn)是以高級(jí)語(yǔ)言寫(xiě)成,僅需要做少部份程序的修改便可移植到不同的計(jì)算機(jī) 平臺(tái)上。 UNIX V6版本并附有完整的程序原始碼在 1976 年正式從貝爾實(shí)驗(yàn)室內(nèi)部傳播到各大學(xué)及研究機(jī)構(gòu),UC Berkeley 也就是依據(jù)這個(gè)版本開(kāi)始研究并加以發(fā)展,并在 1977 年發(fā)表 1 BSD(1st Berkeley Software Distribution)版本的 UNIX OS,其后續(xù)的發(fā)展更為 UNIX OS貢獻(xiàn)良多且影響深遠(yuǎn),此點(diǎn)稍后再為你說(shuō)明。
    同年 UNIX 因它提供良好程序發(fā)展環(huán)境、網(wǎng)絡(luò)傳輸服務(wù)與及時(shí)服務(wù)(Real-Time Services),而廣得各電話(huà)公司采用。Interactive System Corporation更因 Value Added Reseller (VAR )運(yùn)用 UNIX 來(lái)強(qiáng)化辦公室自動(dòng)化環(huán)境,成為第一家應(yīng)用UNIX操作系統(tǒng)的公司。此年UNIX亦被修改并第一次裝到 Interdata 8/32 型計(jì)算機(jī)上。這也是 UNIX 操作系統(tǒng)首次安裝在非 PDP型的計(jì)算機(jī)上。自此 UNIX 系統(tǒng)開(kāi)始被移植改裝到各型微處理機(jī)及新計(jì)算機(jī)上
    一個(gè)穩(wěn)定的基石
    1978年 UNIX 發(fā)表對(duì)今日影響最重大的 UNIX 第七版(UNIX Time-Sharing System,Seventh Edition )也就是 V7.此版本包含 Fortran 77 compiler、Shell (只有Bourne Shell)、文件處理工具(nroff/troff 、roff、 MS mocro等)、UNIX-to-UNIX-file-Copy(用來(lái)支持兩臺(tái) UNIX 機(jī)器間的檔案?jìng)鬏敚?、?shù)據(jù)處理工具(AWK 、SED 等強(qiáng)悍的工具)、除錯(cuò)工具(ADB )、程序發(fā)展工具(MAKE)、Lexical analyzer generator(LEX 、YACC等)、簡(jiǎn)單的繪圖工具、并支持 C語(yǔ)言及 LINT verifier,主要執(zhí)行于 PDP-11 及Interdata 8/32型計(jì)算機(jī)上。在當(dāng)時(shí)那個(gè)年代來(lái)說(shuō)其系統(tǒng)的架構(gòu)與功能已經(jīng)是相當(dāng)?shù)耐陚涞牧?。Bourne Shell的原作者稱(chēng)她為 "improvement over all preceding and following Unices" ,在今日也有人稱(chēng)這個(gè)版本是 "last true Unix".由此可見(jiàn) V7 在 UNIX 發(fā)展里程上的扮演了相當(dāng)重要的盤(pán)石角色。
    在當(dāng)時(shí) DEC公司推出了一款 32-bit supermini 主機(jī)—— VAX,搭配的 VAX的操作系統(tǒng)叫做 VMS. 這款迷你級(jí)計(jì)算機(jī)的硬件無(wú)可挑剔〈直到今日她的穩(wěn)定度仍是被諸多老一輩的系統(tǒng)管理者所贊許的〉,但 DEC對(duì) VMS操作系統(tǒng)的支持性卻讓貝爾實(shí)驗(yàn)室的工程師們寧愿使用UNIX OS . 而這項(xiàng)工作則是由 John Reiser和Tom London所共同完成。他們以 V7 為基礎(chǔ)轉(zhuǎn)移 UNIX OS到 VAX計(jì)算機(jī)上使用。
    這個(gè)版本被稱(chēng)為 UNIX V32.同時(shí)為了轉(zhuǎn)移的方便性,他們把 32-bit 的 VAX當(dāng)成是大一點(diǎn)的 PDP-11 (因?yàn)?DEC 的 PDF-11 型計(jì)算機(jī)是 16-bit ),同時(shí)為了執(zhí)行的效率,V32 放棄使用 VAX硬件提供的一項(xiàng) paging 功能(DEC 的 VMS OS 有支持 paging 功能,也由于 V32舍棄這項(xiàng)功能,所以 V32沒(méi)有虛擬內(nèi)存的功能)。
    即使是如此,V32 支持的地址已高達(dá) 4Gb. 就這樣沒(méi)有支持paging功能的 V32開(kāi)始被廣泛的安裝在 VAX的機(jī)器上運(yùn)作。
    DEC 則是在 1984 年左右推出來(lái)自己的 UNIX OS,叫做 ULTRIX.


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M1035156104cD.jpg');" border="0">
    一個(gè)重要的延續(xù)及發(fā)展—— BSD UNIX
    時(shí)間回到 1973 年 11 月, Ken Thompson 和 Dennis Ritchie 在印第安納Purdue大學(xué)的一場(chǎng)操作系統(tǒng)原理的座談會(huì)。會(huì)場(chǎng)上、坐著一位柏克萊大學(xué)(U.C. Berkeley )教授,名字叫 Bob Fabry. 當(dāng)天的 K&R所發(fā)表的 UNIX 立刻引發(fā) Bob Fabry的極度興趣。當(dāng)時(shí)的柏克萊還是處在使用大型計(jì)算機(jī)主機(jī)、批次執(zhí)行程序的階段,并沒(méi)有像 UNIX 這樣的交談式作業(yè)環(huán)境。會(huì)后,他便決定將UNIX帶回柏克萊。
    于是柏克萊的計(jì)算器科學(xué)、數(shù)學(xué)與統(tǒng)計(jì)三個(gè)系所合買(mǎi)的一臺(tái) PDP-11/45,準(zhǔn)備用來(lái)迎接UNIX.1974 年 1月,Bell Labs寄來(lái)了一卷 V4 的磁帶,學(xué)生 Keith Standiford 便開(kāi)始進(jìn)行安裝 V4 的工作。安裝時(shí) Standiford 碰到了問(wèn)題,便轉(zhuǎn)向 Bell Labs求援。人在新澤西州的 Thompson 便透過(guò)柏克萊這端速度只有300-baud的調(diào)制解調(diào)器在在線(xiàn)進(jìn)行偵錯(cuò)。
    在 UNIX 的發(fā)展史上,這是 Bell Labs與柏克萊的第一次接觸。
    完成除錯(cuò)后,V4便順利地在柏克萊這臺(tái)新買(mǎi)的 PDP-11/45計(jì)算機(jī)上工作了。
    當(dāng)時(shí)這臺(tái)是三個(gè)系所合買(mǎi)的,計(jì)算器科學(xué)好不容易裝上了 UNIX ,卻碰到數(shù)學(xué)與統(tǒng)計(jì)系所要使用 DEC's RSTS system,所以在一陣協(xié)調(diào)后,UNIX與 DEC's RSTS system以 8:16小時(shí)的比例分配,供三個(gè)系所輪流使用。一段時(shí)日后,具交談式功能的 UNIX 在效能上的表現(xiàn)得到絕多數(shù)學(xué)生們喜愛(ài),紛紛將自己的計(jì)劃轉(zhuǎn)向UNIX的時(shí)段。而一天占了 16 個(gè)小時(shí)的批處理時(shí)段卻乏人問(wèn)津。
    當(dāng)時(shí) Eugene Wong與 Michael Stonebraker教授,看上了 UNIX 提供的便利性,便打算將他們的 INGRES 數(shù)據(jù)庫(kù)計(jì)劃重原先批處理的計(jì)算機(jī)環(huán)境轉(zhuǎn)移到UNIX系統(tǒng)上面。在 1974 年,他們?yōu)檫@執(zhí)行計(jì)劃添購(gòu)了一臺(tái)新的 PDP-11/40 計(jì)算機(jī),上面安裝了 V5.這個(gè)計(jì)劃也就是柏克萊的第一個(gè)將作業(yè)環(huán)境轉(zhuǎn)移到UNIX的案子。
    UNIX作業(yè)環(huán)境的需求,在柏克萊迅速地成長(zhǎng)。為了應(yīng)付需求,Michael Stonebraker 與Bob Fabry 教授決定再申請(qǐng)購(gòu)買(mǎi)兩臺(tái) PDP-11/45. 1975年初,DEC 推出 PDP-11/70,價(jià)格差不多等于兩臺(tái) PDP-11/45,但功能強(qiáng)過(guò) PDP-11/45 所以他們便決定改購(gòu)買(mǎi)一臺(tái) PDP-11/70.
    這臺(tái)機(jī)器引來(lái)了 Ken Thompson 、碰上 Bill Joy 以及日后產(chǎn)生了 1BSD.她就宛如是一塊 UNIX 史上的地標(biāo),沿襲自 Bell Labs,豎立在柏克萊,承先啟后并開(kāi)創(chuàng)新局。農(nóng)夫個(gè)人認(rèn)為,她應(yīng)該被供在博物館。
    當(dāng)這臺(tái)機(jī)器在 1975 年終運(yùn)達(dá)柏克萊時(shí);同一時(shí)間,Thompson受邀回母校(柏克萊)當(dāng)客座教授,科目就是 NIX.Thompson 在校期間與 Jeff Schriebman和 Bob Kridle 一起動(dòng)手將新版的 V6 安裝在 PDP-11/70.
    Bill Joy1975年,一位密執(zhí)安州大學(xué)的畢業(yè)生來(lái)到了柏克萊,他的名字就是Bill Joy. 當(dāng)時(shí) Joy和同學(xué) Chuck Haley (tar 就是他寫(xiě)的)喜歡一起泡在計(jì)算機(jī)房里面,Thompson也時(shí)常插上一腳。他們成功地改善了 Pascal 的解譯與偵錯(cuò)的能力,同時(shí)還提升了解譯與執(zhí)行的速度。另外換裝上 ADM-3的屏幕后,他們覺(jué)得ed文字編輯指令并不合用;于是根據(jù)另外一個(gè)相似的 em 指令,發(fā)展了自己的覺(jué)得滿(mǎn)意的文字編輯工具,也就是指令 ex.
    1976年夏天,Thompson結(jié)束了他的休假回到 Bell Labs. 此時(shí)的 Joy和Haley 已經(jīng)開(kāi)始著手探索 UNIX kernal,甚至還做了一些修改。1977年初,Joy 制作了一卷磁帶,上頭寫(xiě)著"Berkeley Software Distribution." ,這就是 1BSD. 其中包含新的 Pascal compiler與 ex 編輯器。
    次年,來(lái)了幾臺(tái)新屏幕—— ADM-3a ,這種屏幕支持光標(biāo)地址顯示,Joy 在這種屏幕上完成了有人愛(ài)不釋手;有人恨之入骨的文字編輯器—— vi.接著不久,Joy 便發(fā)現(xiàn)一個(gè)問(wèn)題,老舊的屏幕裝備,還是會(huì)被用在其它的計(jì)算機(jī)上。為了支持上的方便,Joy 針對(duì)此現(xiàn)象設(shè)計(jì)了一個(gè)接口,用來(lái)管理、支持不同的屏幕裝備。
    這個(gè)接口就是現(xiàn)在的 termcap.1978 年中,包含了功能加強(qiáng)的 Pascal 與 vi 及termcap 的 "Second Berkeley Software Distribution ," 也就是 2BSD ,迅速的取代了原先版本。
    1979年,至少有 75 部 PDP-11 的機(jī)器上安裝 2BSD 在運(yùn)作著。自此在 DEC PDP-11 系列上執(zhí)行的 BSD版本便一直以 2.xBSD 作為識(shí)別。
    由于 PDP-11 計(jì)算機(jī)實(shí)在相當(dāng)長(zhǎng)壽,持續(xù)到今日農(nóng)夫我仍然在網(wǎng)絡(luò)上發(fā)現(xiàn)過(guò)關(guān)于PDP 計(jì)算機(jī)的網(wǎng)站。似乎到今日它們?nèi)耘f在某些地方默默地工作著。
    2.xBSD最近的一次改版是在 1987 年,使用 4.3 BSD為主架構(gòu)改寫(xiě),版本定為 2.10 BSD.
    在 BSD UNIX 中登場(chǎng)的重要功能當(dāng)中,有一個(gè)直到今日仍然叫人又愛(ài)又恨的指令– vi.我接觸過(guò)不少學(xué)習(xí) UNIX OS的人,大部分的人對(duì) vi 的使用與掌握都不算順手,其中恨死這個(gè)指令的也大有人在,前些日子農(nóng)夫我還看到某個(gè)網(wǎng)站公開(kāi)討論起 vi 是否阻礙了 UNIX 的發(fā)展?實(shí)在夸張了一點(diǎn)!
    Bill Joy多次公開(kāi)地說(shuō),他要是知道 vi 會(huì)如此受" 歡迎" 的話(huà),他寧愿當(dāng)初沒(méi)有寫(xiě) vi 這只程序。不過(guò) Bill Joy 也說(shuō)過(guò),當(dāng)時(shí)他原本還想加入一項(xiàng) Multiple Windows in vi 的功能,不過(guò)當(dāng)他在寫(xiě)這部分程序的時(shí)候,磁帶機(jī)壞了,所以Bill只好在沒(méi)有備份的情況下繼續(xù)工作,想不到" 屋漏偏逢連夜雨" ,程序?qū)懙揭话?,他使用的硬盤(pán)也跟著掛了。在無(wú)可挽救又沒(méi)有備份磁帶的情況下,Bill宣告放棄為 vi 增加 Multiple Windows 這項(xiàng)功能。事后 Bill 為前一版的 vi 寫(xiě)好使用說(shuō)明后就繼續(xù)作其它的事。所以 vi 就長(zhǎng)成今天那付德性。農(nóng)夫我認(rèn)為這或許是福不是禍!搞不好當(dāng)初要是連 Multiple Windows 這項(xiàng)功能一起發(fā)表的話(huà),上頭的圖可能就是遺照了。
    當(dāng)時(shí)有位 Richard Fateman教授,原先使用一臺(tái) PDP-10 上進(jìn)行著他的Macsyma 研究計(jì)劃。但他需要更大的內(nèi)存地址來(lái)執(zhí)行程序,所以在 1978 年初,他看上了當(dāng)時(shí)迪吉多新發(fā)表的 VAX-11/780.好不容易,他聯(lián)合了其它的部門(mén)才湊足購(gòu)買(mǎi) VAX的經(jīng)費(fèi)。剛開(kāi)始時(shí),機(jī)器原本安裝的是 VMS操作系統(tǒng)。不過(guò)別的成員要執(zhí)行 UNIX 操作系統(tǒng),于是 Fateman安裝上了 V32. 但問(wèn)題來(lái)了,V32 并不支持虛擬內(nèi)存,F(xiàn)ateman 便找上了 Domenico Ferrari 教授,希望他與他的研究小組能為 UNIX 加上這項(xiàng)功能。當(dāng)時(shí)一位學(xué)生叫 Ozalp Babaoglu ,他想到了一些解決的方法似乎可行,但因?yàn)闋可娴?VAX硬件與 UNIX kernal的問(wèn)題,于是他找上了 Joy幫忙。
    就在只有一臺(tái) VAX的狀況下,他們努力奮戰(zhàn)著。1979年 1月,在 VAX上支持虛擬內(nèi)存的UNIX版本終于誕生,V32 從此走入歷史。緊接著 Peter Kessler與 Marshall Kirk McKusick 為他加上了Pascal;Joy 則動(dòng)手將 2BSD 上的 ex、vi、C shell 等工具轉(zhuǎn)移了過(guò)來(lái)。這個(gè)版本就是 3BSD.一個(gè)首次支持虛擬內(nèi)存、demand paging 和 page eplacement 的 UNIX OS.


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M1035161F53004.jpg');" border="0">


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M1035164Z63303.jpg');" border="0">
    UNIX與 DARPA交會(huì)
    1970年代末,美國(guó)國(guó)防部先進(jìn)研究計(jì)劃?rùn)C(jī)構(gòu)(Defense Advanced Research Projects Agency ——簡(jiǎn)稱(chēng) DARPA)正在為 AI (Artificial Intelligence ),VLSI及計(jì)算器視覺(jué)等研究(vision research )找尋一個(gè)可共通作業(yè)的計(jì)算機(jī)環(huán)境。硬件方面的首選是迪吉多的 VAX主機(jī)。配合的操作系統(tǒng)是 VMS. 這樣的組合因擁有相當(dāng)接近 DARPA 需求的功能被列入優(yōu)先的考量,但在 DARPA與 DEC商談對(duì)于 VMS的支持事宜之后,DARPA 并沒(méi)有得到滿(mǎn)意的答案。這迫使他們考慮朝向UNIX發(fā)展。但當(dāng)時(shí) UNIX OS(指的就是32V )搭配 VAX,最大的缺憾就是沒(méi)有支持虛擬內(nèi)存;但此時(shí)已經(jīng)有人克服了。
    當(dāng)時(shí),Bob Fabry 教授寫(xiě)了一份建議書(shū)給 DARPA,建議他們以柏克萊支持虛擬內(nèi)存的 3BSD 為基礎(chǔ),發(fā)展成為計(jì)劃所需。這份企劃書(shū)引起了 DARPA的高度興趣。隨后 3BSD 也實(shí)際獲得了 DARPA相關(guān)計(jì)劃成員們的良好風(fēng)評(píng),也因此最后柏克萊大學(xué)打敗了卡奈基梅隆大學(xué)與 BBN(Bolt Baranek & Newman , Inc. ),讓 Bob Fabry成功地獲得了 DARPA的資助合約。這份合約開(kāi)始于 1980 年 4月,為期 18 月。此后的 DARPA便以 UNIX OS為標(biāo)準(zhǔn)操作系統(tǒng)。 Bob Fabry 教授在取得 DARPA合約后,依約成立了一個(gè)支持機(jī)構(gòu),也就是 Computer Systems Research Group簡(jiǎn)稱(chēng) CSRG.Bob Fabry找上了 Bill Joy 來(lái)負(fù)責(zé)軟件開(kāi)發(fā)。Joy 迅速地以先前的 3BSD 為基礎(chǔ),整合新的功能。如 Job Contro l (作者是 Jim Kulp )、auto reboot 、1K block file system. 同時(shí)也整合入Pascal compiler 、Franz Lisp system、enhanced mail handling system.這就是在 1980 年所發(fā)表的 4BSD.沒(méi)多久她便被安裝在將近 500臺(tái)VAX 上。
    DARPA 采用了這個(gè)版本作為當(dāng)時(shí) DARPA的標(biāo)準(zhǔn) UNIX 操作系統(tǒng)。
    樹(shù)大招風(fēng),當(dāng)時(shí),有位在 Stanford Research Institute的仁兄叫 David Kashtan,寫(xiě)了一份關(guān)于 VMS與 BSD UNIX在 VAX上的執(zhí)行效率評(píng)估。該份報(bào)告指出 BSD UNIX 在效率上不如 VMS來(lái)的好。Joy 知道這件事之后,花了不到一個(gè)星期的時(shí)間,重新調(diào)整 UNIX kernal. 然后也寫(xiě)了一份報(bào)告,證明他們的BSD 在 VAX上要比 VMS優(yōu)越多多。 1981年 6月,這個(gè) Joy調(diào)整過(guò)的系統(tǒng),加上了 Robert Elz 寫(xiě)的 auto configuration ,以 4.1BSD 的版本發(fā)表了。
    當(dāng)時(shí)的 DARPA對(duì)柏克萊 4.1BSD 的表現(xiàn)相當(dāng)滿(mǎn)意,于是續(xù)簽了兩年的新約,金額更是先前合約的 5倍。其中有一半的金額用在資助柏克萊繼續(xù)發(fā)展 BSD UNIX . 錢(qián)多的相對(duì)代價(jià)就是要求高。當(dāng)時(shí),DARPA 對(duì) UNIX 的期望開(kāi)出了明確的目標(biāo);更迅速、更有效率的檔案系統(tǒng)、支持程序可執(zhí)行地址達(dá) multi-gigabyte 、提供彈性的解譯溝通能力、具整合支持網(wǎng)絡(luò)能力。
    在此同時(shí),為了達(dá)到計(jì)劃的目標(biāo),DARPA 成立的一個(gè)指導(dǎo)委員會(huì);主要的成員有柏克萊的 Bob Fabry, Bill Joy ,Sam Leffler 、BBN 公司的 Alan Nemeth and Rob Gurwitz、貝爾實(shí)驗(yàn)室的 Dennis Ritchie 、史丹佛大學(xué)的 Keith Lantz、卡內(nèi)基。梅倫大學(xué) Rick Rashid、麻省理工學(xué)院 Bert Halstead、信息科學(xué)協(xié)會(huì) Dan Lynch、DARPA 的 Duane Adams and Bob Baker以及加州。洛杉磯大學(xué)的 Jerry Popek.
    不久,Joy 便開(kāi)始整合早先 BBN的 Rob Gurwitz所發(fā)表的 TCP/IP protocols ,不過(guò)他對(duì) BBN這些程序的執(zhí)行效率并不滿(mǎn)意,于是 Joy與 Sam Leffler重新寫(xiě)的一版自己的程序。
    另外,并加入了一些支持網(wǎng)絡(luò)的工具 rcp,rsh , rlogin ,rwho. 他們稱(chēng)她為 4.1aBSD,這個(gè)版本并沒(méi)有正式發(fā)表,在1982年 4月開(kāi)始供內(nèi)部使用。雖是如此,在 4.2BSD 未正式發(fā)表之前,她還是繁殖的到處都是。6 月, 4.1aBSD kernal加上了新完成的檔案系統(tǒng),版本更新為 4.1bBSD.
    rcp , rsh, rlogin , rwho 這群指令。因安全機(jī)制上的理由,逐漸被另一群新的指令群所取代,新的指令群叫 SSH(Secure Shell)。SHH 相關(guān)網(wǎng)址(http://www.ssh.org)。
    1982年的春季末,已厭倦了在柏克萊環(huán)境的 Bill Joy ,答應(yīng)受邀加入當(dāng)年剛創(chuàng)辦的 Sun Microsystems , Inc. ,成為 SUN的第四號(hào)創(chuàng)辦人。那年的整個(gè)夏季他就在兩地奔走。之后他對(duì)修改中的彈性解譯溝通機(jī)制及改寫(xiě) UNIX kernal到一個(gè)段落之后,由 Leffler接手了他的工作。由于合約期限的因素,Leffler 在1983年 4月發(fā)表了 4.1cBSD,提供給參予 DARPA各項(xiàng)相關(guān)計(jì)劃的成員試用。6 月,DARPA 的指導(dǎo)委員會(huì)第二次會(huì)議招開(kāi),驗(yàn)收與檢討最新版的 BSD 成果。繼續(xù)整合 UNIX 系統(tǒng)的 Leffler,在 1983 年 8月,發(fā)表了 4.2BSD.她達(dá)到了DARPA 的預(yù)定的需求;足以應(yīng)付 CAD/CAM影像處理與 AI 研究的高速的檔案系統(tǒng)及擴(kuò)展強(qiáng)化的虛擬內(nèi)存功能;提供能分散處理的解譯溝通機(jī)制;支持56-Kbit 的 ARPA Internet網(wǎng)絡(luò)連結(jié),以及 10-Mbit/s Ethernet 的局域網(wǎng)絡(luò);還有經(jīng)過(guò)重組架構(gòu)已模塊化的 kernal code ,提供更有效率的計(jì)算機(jī)平臺(tái)移植。
    SUN 以生產(chǎn) RISC 架構(gòu)的工作站計(jì)算機(jī)為主,使用的正是以 BSD為基礎(chǔ)所的UNIX OS.在當(dāng)時(shí)以不遜色于大型計(jì)算機(jī)的多人多任務(wù)、具網(wǎng)絡(luò)溝通功能的UNIX OS 、加上價(jià)格低廉的硬件(相對(duì)于 mini 級(jí)計(jì)算機(jī)而言),廣獲得工程界的青睞,而mini級(jí)大計(jì)算機(jī)的命運(yùn)自此注定開(kāi)始逐漸式微。計(jì)算機(jī)軟件的應(yīng)用因?yàn)橛辛司W(wǎng)絡(luò)于是也開(kāi)始朝向 Client-Server的架構(gòu)發(fā)展。
    1982年,SUN 有了自己的操作系統(tǒng)—— SunOS 1.0——承襲自 4.1BSD.一直到 1990 年11月,發(fā)表 SunOS 4.1.1 版同時(shí)冠上 Solaris 1.0時(shí),SUN 才算開(kāi)始向 System V 版本靠攏。
    SunOS 4.1.1 可算是以 BSD為主體再附加上 System V 工具的 UNIX 混血兒。但這其實(shí)是個(gè)商業(yè)考量的過(guò)渡性做法(后文會(huì)加以說(shuō)明)。
    而 SunOS 4.1.x版的字眼也僅延續(xù)到 1994 年的 SunOS 4.1.4為止,她后繼的版本是 Solaris 1.3. 真正延續(xù)到今日的 Solaris版本,則是始于 1992 年 7月的Solaris 2.0 (SUN OS 5.0)。
    在商業(yè)有所成就的 SUN Microsystems 對(duì) UNIX OS的發(fā)展倒也做了些重大貢獻(xiàn);如 1984 年發(fā)表的 NFS(Network File System )與其后在 1986 年發(fā)表的PC- NFS.
    商業(yè)化的不平坦歷程—— UNIX 版本的戰(zhàn)爭(zhēng)
    UNIX商業(yè)化實(shí)質(zhì)上即意味著將產(chǎn)生各種獨(dú)立化的 UNIX 版本,這點(diǎn)大概是最顯而易見(jiàn)的事實(shí)。如果以商品要具備獨(dú)特性與獨(dú)占性的利益來(lái)做考量的話(huà),其實(shí)一點(diǎn)也不意外。因此 UNIX 開(kāi)始衍生的相當(dāng)多的版本。這種現(xiàn)象,對(duì)使用者以開(kāi)發(fā)應(yīng)用程序的廠(chǎng)商而言,已經(jīng)造成了某成程度上困惑。然而,一種無(wú)所適從的無(wú)力感其實(shí)才剛開(kāi)始。
    1984年 1月 1日, AT&T 這個(gè)擁有 1495 億美元資產(chǎn)、1 ,009 ,000 位員工的龐大巨獸,終于被格林法官(Harold H. Greene)以反扥拉斯法(antitrust ) 強(qiáng)制拆解成七家 RBOCs(Regional Bell Operating Companies ) . AT&T 也因而在一夕間解體成為區(qū)域性網(wǎng)絡(luò)公司,從此失去了長(zhǎng)途電話(huà)的壟斷性地位。這種時(shí)空的轉(zhuǎn)變讓 AT&T 對(duì) UNIX 的態(tài)度有了 180度的轉(zhuǎn)變(其實(shí),農(nóng)夫我指的是收費(fèi)的態(tài)度)。
    先前已經(jīng)提過(guò) 70 年代初期的 AT&T ,已經(jīng)在長(zhǎng)途電話(huà)市場(chǎng)上占有絕對(duì)壟斷的優(yōu)勢(shì),因而被美國(guó)政府的限制不得涉足與從事計(jì)算機(jī)與其它行業(yè),也正因而造就了UNIX發(fā)展初期的自由開(kāi)放。直到 1979 年,AT&T才宣布要將 UNIX 商業(yè)化的計(jì)劃。1981年 11 月,AT&T屬下的USG 發(fā)表了 System III.次年又更新為System IV.稍后于 1983 年,AT&T 將 CRG, USG合并成立了 UNIX System Development Lab. 一般簡(jiǎn)稱(chēng)為 USL,從其名稱(chēng)就不難清楚她將要扮演的角色。該年 System V 上市了。此時(shí) AT&T 發(fā)覺(jué)每次版本更新都得花不少宣傳費(fèi),實(shí)在不劃算,所以決定在 System V 以后,名字就不再做變動(dòng)了。1984年,System V Release 2發(fā)表,簡(jiǎn)稱(chēng)為 SVR2.在這個(gè)版本中,才終于看到來(lái)自 BSD 版本的 Virtual memory 功能,農(nóng)夫我不得不驚嘆 AT&T 的穩(wěn)健作風(fēng)。SVR3則是到了 1986 年才發(fā)表,隨后 1987 年又發(fā)表了 SVR3.2.
    1987年,在工作站市場(chǎng)上已占有一席之地的 SUN,找上了 AT&T ,打算將System V與 BSD這兩大版本歸為一統(tǒng)。 1988年初,雙方更簽訂了合作合約,AT&T取得 SUN的一席董事,同時(shí)亦有權(quán)買(mǎi)下 SUN百分之二十的股份。這項(xiàng)合作計(jì)劃,原本有機(jī)會(huì)整合當(dāng)時(shí)版本紛亂的 UNIX OS. 但那是理想。實(shí)際上這個(gè)計(jì)劃反而讓 UNIX 族群里的其它成員恐慌萬(wàn)分,特別是 IBM、DEC 、HP這幾個(gè)產(chǎn)業(yè)龍頭。為了抵制這項(xiàng)行動(dòng),他們組織了一個(gè)反對(duì)聯(lián)盟。因此「開(kāi)放軟件基金會(huì)」也就是 Open Software Foundation 簡(jiǎn)稱(chēng) OSF在 1988 年正式誕生;成員除了前面的三巨頭外,尚有多達(dá)三十幾家計(jì)算機(jī)硬件制造廠(chǎng)商與系統(tǒng)咨詢(xún)顧問(wèn)公司,也相繼以行動(dòng)投入到此反對(duì)的行列中。然而 AT&T 與 SUN也不示弱地組織了 UNIX International ,也就是UNIX國(guó)際公司,成員數(shù)量雖然不比 OSF陣營(yíng)來(lái)的多,但如果她是 Intel、 Toshiba 、Unisys、Motorola、Fujitsu ,這幾個(gè)大塊頭,那也是很夠看頭的。
    企業(yè)自身的利益在現(xiàn)實(shí)世界里始終是以個(gè)體的考量為優(yōu)先,所以這兩大陣營(yíng)始終沒(méi)能再達(dá)成任何共識(shí),就連當(dāng)時(shí)所制定的 UNIX 統(tǒng)一標(biāo)準(zhǔn)規(guī)格,嚴(yán)格來(lái)說(shuō)也從不曾被實(shí)現(xiàn)過(guò)。這種企業(yè)利益上的沖突與矛盾其實(shí)也存在于同一個(gè)陣營(yíng)中不同的成員之間。兩大陣營(yíng)對(duì)峙,可以說(shuō)是 UNIX 有史以來(lái)最重大的產(chǎn)業(yè)沖突事件。
    由于商業(yè)利益的政治考量大過(guò)技術(shù)問(wèn)題的考量,也因此奠定了 UNIX 將繼續(xù)分裂下去的命運(yùn)。 AT&T 在 1989 年發(fā)表了 SVR4 ,SUN 在日后也將她的 SunOS 4.1. 1 開(kāi)始冠上 Solaris的字眼,以行動(dòng)靠攏 SVR4.OSF 則是在 1990 年發(fā)表了OSF/1.UNIX版本的問(wèn)題因而更加混亂了。但有趣且可笑的是,開(kāi)放系統(tǒng)——Open System ,這個(gè)雙方都標(biāo)榜的理念與觀(guān)念卻因此在計(jì)算機(jī)產(chǎn)業(yè)界引起了回響,這點(diǎn)倒是原先所始料未及的。
    不久 AT&T 撤銷(xiāo)了對(duì) SUN的投資,同一個(gè)陣營(yíng)的成員彼此也因而勞燕分飛。
    USL 在 1991 年正式轉(zhuǎn)變了一家獨(dú)立的商業(yè)公司。但 UNIX 在商業(yè)市場(chǎng)上的價(jià)值卻出現(xiàn)了變化……
    讓 UNIX 自由—— Networking Release 2
    自從 UNIX 走出貝爾實(shí)驗(yàn)室后,研究機(jī)構(gòu)與學(xué)術(shù)界就扮演了繼承與發(fā)展的雙重角色。在1979到 1984 年這段期間,UNIX的擁有者 AT&T ,對(duì)于學(xué)術(shù)界的授權(quán)政策尚可用「大方」來(lái)形容;同時(shí)也對(duì)學(xué)術(shù)界做某種程度的資助與合作。當(dāng)時(shí)的學(xué)術(shù)界,得助于 AT&T 的大方授權(quán)與分享程序原始碼,研習(xí) UNIX 這個(gè)分時(shí)操作系統(tǒng)開(kāi)始在學(xué)術(shù)界蔚為一股風(fēng)氣,甚至可以說(shuō)是一種潮流或一種流行。其中,像柏克萊 BSD對(duì) UNIX 的貢獻(xiàn),就是一個(gè)公開(kāi)的事實(shí)。但早期的 BSD使用者,是必需向 AT&T 支付授權(quán)金的。這點(diǎn),從產(chǎn)業(yè)界資助學(xué)術(shù)界的角度來(lái)看是一點(diǎn)也不值得驚訝的。因?yàn)橘Y金的援助為了就是取得其成果。所以當(dāng)時(shí)基于 AT&T 原始碼所發(fā)展的成果,均歸屬 AT&T 所有。也因而 AT&T 掌控了 UNIX 的所有權(quán)。到了1984年以后,AT&T開(kāi)始更積極地保護(hù) UNIX 的原始碼;AT&T甚至還要求各大學(xué)的使用人員簽訂保密條約,想藉此防堵 UNIX 的原始碼從學(xué)術(shù)單位流出,以影響到商業(yè)利益。
    在 DARPA資助柏克萊從事 BSD OS 發(fā)展的過(guò)程中,誕生了 TCP/IP 這項(xiàng)廣泛影響現(xiàn)今計(jì)算機(jī)與因特網(wǎng)的通訊協(xié)議。由于 DARPA對(duì)于資助開(kāi)發(fā)的軟件項(xiàng)目有明文規(guī)定接受資助者必須無(wú)條件地釋出程序的原始碼,所以 TCP/IP 的原始碼與程序的版權(quán)并不屬于 AT&T 所有。這點(diǎn)在現(xiàn)今看來(lái)其意義是不凡的。也正因?yàn)橛写艘粭l件,柏克萊的 CSRG (Computer System Research Group)因應(yīng) BSD Vendors需求,在 1989 年 6月發(fā)表了 Networking Release 1 ,她包含了TCP/IP source code以及一些工具,提供給當(dāng)時(shí)正開(kāi)始起步發(fā)展的個(gè)人計(jì)算機(jī)制造業(yè)者使用。Networking Release 1 授權(quán)收費(fèi)僅 1000 美元,而且不需要 T&T的商業(yè)授權(quán),取而代之的是柏克萊大學(xué)的開(kāi)放式授權(quán)。
    農(nóng)夫我看柏克萊授權(quán)方式,幾乎可以說(shuō)是一種良心式授權(quán)方式,在實(shí)質(zhì)的運(yùn)用上她完全沒(méi)有限制。她允許原始碼或執(zhí)行檔在任何情況下修改并且允許將修改后的程序 從事商業(yè)行為而無(wú)須任何回饋,當(dāng)然也沒(méi)有絕對(duì)要求開(kāi)發(fā)者必須要釋出原始碼。如果你改都不改地加以販?zhǔn)?,她也沒(méi)有意見(jiàn)。但有一點(diǎn)不可違反的限制,就是必須在 衍生物的版權(quán)聲明上提到柏克萊的貢獻(xiàn)。這種做法在日后,也沒(méi)有多少改變,而這樣的授權(quán)方式也成為了柏克萊的授權(quán)精神。
    Keith Bostic由于 Networking Release 1 所得到的響應(yīng)實(shí)在遠(yuǎn)超過(guò) CSRG 成員的預(yù)估。
    這個(gè)不算差的成果,讓柏克萊的 CSRG 覺(jué)得有必要釋出更多屬于 BSD的程序原始碼。于是激發(fā) CSRG 的成員 Keith Bostic開(kāi)始組織志愿工作者從事一項(xiàng)就算不能夠驚天也足以動(dòng)地的程序?qū)懽饔?jì)劃。計(jì)劃的主要目的在當(dāng)時(shí)還真讓人感到有點(diǎn)" 烏扥邦".農(nóng)夫我個(gè)人喜歡戲稱(chēng)她為「解放 UNIX 計(jì)劃」。
    Marshall Kirk McKusick這項(xiàng)計(jì)劃大體上分成兩個(gè)部分,操作系統(tǒng)工具(Utility )
    與核心(kernal)。而且參與人員必須在完全沒(méi)有參考 AT&T UNIX source code的情況下進(jìn)行撰寫(xiě)程序的工作。因?yàn)橹挥性谶@種條件下,寫(xiě)出來(lái)的程序代碼,才能擺脫 AT&T 的著作權(quán)束縛。當(dāng)然這也絕對(duì)不是一件容易的事。Keith Bostic四處奔走,組織了超過(guò)四百名熱心的軟件工程師,經(jīng)過(guò)了長(zhǎng)達(dá)十八個(gè)月的奮戰(zhàn)之后,操作系統(tǒng)主要的工具與鏈接庫(kù)才算改寫(xiě)完成。Marshall Kirk McKusick負(fù)責(zé)改寫(xiě)當(dāng)時(shí)的核心程序。但系統(tǒng)核心的部分,由于長(zhǎng)期以來(lái)柏克萊與 AT&T 一直就彼此分享 UNIX 原始碼,所以各自所加上去的程序代碼早已混雜難分了。為了徹底的厘清雙方各自撰寫(xiě)的部分,他們下決心進(jìn)行逐行比對(duì)。首先花了好幾個(gè)月的時(shí)間,將核心程序每 一行每一個(gè)檔案都建立轉(zhuǎn)換比對(duì)的數(shù)據(jù)庫(kù)。然后接著進(jìn)行移除來(lái)自 AT&T 32V 的程序代碼并改寫(xiě)她們。即使是如此,仍舊有 6只程序讓他們束手無(wú)策,因而無(wú)法將核心程序徹底完整地改寫(xiě)。最后,他們還是決定將他們所做的所有成果發(fā)表。授權(quán)的方式沿用 Networking Release 1 的授權(quán)方式,授權(quán)的磁帶依舊是 1000 美金。這個(gè)版本就是 Networking Release 2 ,也有人稱(chēng)她為 4.3BSD NET/2.發(fā)表的時(shí)間在 1991 年 6月。雖然這是個(gè)不完整的操作系統(tǒng)。
    但,在今日看來(lái),卻有著劃時(shí)代的意義—— UNIX OS自由了。
    誰(shuí)是" 老大哥" ——侵權(quán)訴訟
    AT&T的 USL在 1991 年正式轉(zhuǎn)變了一家公司。當(dāng)然,這意味著她將更重視UNIX在商業(yè)上的利益。當(dāng)時(shí)的 UNIX OS早以稱(chēng)霸高階的計(jì)算機(jī)市場(chǎng);從 Cray 超級(jí)計(jì)算機(jī)、IBM 的大型計(jì)算機(jī)主機(jī)、迷你級(jí)計(jì)算機(jī)到工作站,均是 UNIX 的天下(這一點(diǎn),直到現(xiàn)在21世紀(jì),仍舊沒(méi)有多大的改變)。即使在 80 年代中期后開(kāi)始迅速發(fā)展的個(gè)人計(jì)算機(jī),雖然當(dāng)時(shí)被戲稱(chēng)為是玩具計(jì)算機(jī),但也仍舊有像XENIX[注1], Interactive UNIX[注2]等幾種向 AT&T 繳過(guò)稅的商業(yè)化版本。
    UNIX簡(jiǎn)直就是 AT&T 的一棵搖錢(qián)樹(shù)。
    但這一切在 Networking Release 2 (以后簡(jiǎn)寫(xiě)為 Net/2)出現(xiàn)之后,起了變化!
    首先,一位 i386 處理器的玩家名叫 Bill Jolitz,在拿到 Net/2之后,很快地就將 Net/2 kernal 缺少的程序補(bǔ)齊了。BSD kernal這時(shí)可算是大功告成了。
    當(dāng)時(shí) Bill Jolitz將他們放在因特網(wǎng)與其它人共享他的原始碼,并且得到了不少正面的響應(yīng)。由于這個(gè)版本是使用在 i386 微處理器的個(gè)人計(jì)算機(jī)上,所以就命名為386BSD,在 1992 年 2月正式發(fā)表。這該算是 BSD首度功能完整且版權(quán)獨(dú)立的版本。Bill Jolitz 是當(dāng)時(shí)唯一的 kernal 維護(hù)者。在他離開(kāi)這個(gè)計(jì)劃之后,繼起的 BSD玩家們延續(xù)了這個(gè)版本,日后衍生了 FreeBSD,然后又從其中分支出裂NetBSD版本。
    另一個(gè)將 Net/2完整化的是一家叫 Berkeley Software Design ,Incorporated的公司,簡(jiǎn)稱(chēng) BSDI[注3]. 由于 Net/2的版權(quán)聲明中,宣稱(chēng)其源文件的合法性,并且允許使用者,從事衍生物的商業(yè)行為,所以 BSDI 將他們修改后的系統(tǒng)命名為 BSD/386. 他們并將成果打包,刊登廣告以 995美金的售價(jià)販?zhǔn)? BSD/386,而且含原始碼,而且還提供免費(fèi)服務(wù)電話(huà)的咨詢(xún),電號(hào)號(hào)碼是"1-800-ITS-Unix". 時(shí)間大約是在 1992 年 1月。當(dāng)時(shí),USL 的 System V 含 source code的價(jià)格大約是 BSD/386價(jià)格的一百倍左右。這可驚動(dòng)了老大哥 AT&T.并且正式地書(shū)面嚴(yán)重警告 BSDI 違反的注冊(cè)商標(biāo)法(電話(huà)號(hào)碼里有Unix的字眼),并公開(kāi)宣稱(chēng) AT&T 擁有 UNIX 的注冊(cè)商標(biāo)。BSDI再次刊登廣告公開(kāi)反擊 AT&T ,聲明她的商業(yè)行為完全合法。果不期然,BSDI的博命演出讓雙方手牽手走上法庭。
    AT&T的 USL控告 BSDI 剽竊他的 UNIX 原始碼,要求法官還他公道。在聽(tīng)證會(huì)上,BSDI祭出早已準(zhǔn)備好的法寶;自己在無(wú)任何 AT&T source code 的條件下寫(xiě)出的合法檔案,以及來(lái)自于 BSD授權(quán)的 Net/2 source code. 前面的證據(jù)足以讓 BSDI 立于不敗之地,后者讓 BSDI 置身在暴風(fēng)圈外。BSDI的辨證獲得了法官的采信。但 At&T 豈會(huì)就此罷手,他們將焦點(diǎn)轉(zhuǎn)移到 Net/2的 BSD授權(quán)上面,并且重新提出控訴,被告的對(duì)象變成了 BSDI 與柏克萊大學(xué);同時(shí) AT&T 還申請(qǐng)法庭禁止 BSDI 一切的 BSD/386銷(xiāo)售行為。就這樣,柏克萊大學(xué)也對(duì)號(hào)入座了。
    農(nóng)夫我認(rèn)為,畢竟 AT&T 是營(yíng)利企業(yè),她得維護(hù)她的商業(yè)利益,這點(diǎn)是天經(jīng)地義的事。
    雖然柏克萊大學(xué)與 AT&T 在 UNIX 發(fā)展上有著非比尋常的關(guān)系,但商業(yè)利益是現(xiàn)實(shí)的。企業(yè)資助學(xué)術(shù)界的研究計(jì)劃,多半是基于商業(yè)上的考量;我相信,學(xué)術(shù)界的少數(shù)高層在尋求奧援時(shí)不會(huì)不明白這 一點(diǎn),即使這有可能讓大部分的學(xué)術(shù)人士無(wú)法接受或不愿接受。不管如何,這一記醒棍倒再次挑起了這一點(diǎn)事實(shí)。
    成為被告的柏克萊大學(xué),只好無(wú)奈地面對(duì)這場(chǎng)無(wú)情的商業(yè)訴訟。但他們也同樣不甘示弱地對(duì) AT&T 的 Systerm V 著作權(quán)提出質(zhì)疑,因?yàn)樵?AT&T 的 UNIX 授權(quán)聲明中完全沒(méi)有提及柏克萊的貢獻(xiàn)。所以柏克萊反控 AT&T 違反 BSD 的授權(quán)條款。柏克萊的反擊讓?xiě)?zhàn)況越演越烈,訴訟案一路從 AT&T 的老家新澤西州的聯(lián)邦法庭打到柏克萊大學(xué)的所在地加州法院,但依舊沒(méi)有結(jié)果。
    到了 1993 年,官司還在進(jìn)行中,但 AT&T 卻已經(jīng)打包 USL準(zhǔn)備以一億美元的價(jià)格找尋買(mǎi)主了。最后 AT&T 將 USL 以八千萬(wàn)美元代價(jià)的賣(mài)給了 Novell.而新買(mǎi)主也當(dāng)仁不讓地加入了這場(chǎng)混戰(zhàn)。但卻也因此,戰(zhàn)況露出了一線(xiàn)平息的曙光。
    訴訟案在 1994 年 1月宣告終結(jié),以庭外和解收?qǐng)?。?shí)際的協(xié)議內(nèi)容僅有當(dāng)事人知情。
    如果從勝負(fù)的角度來(lái)看這場(chǎng)訴訟,或許柏克萊與 BSDI 是勝利的一方。但如果從UNIX發(fā)展的腳步來(lái)看這場(chǎng)訴訟,就可能根本沒(méi)有任何一方是勝利者了。
    事件平息后的 1994 年 6月,柏克萊的 CSRG 風(fēng)光地發(fā)表了 BSD 4.4 Lite.在這個(gè)版本中,有 70 個(gè)檔案引用的一份新修改的版權(quán)聲明,闡述的 AT&T 與 BSD雙方的貢獻(xiàn),并明確地給予檔案自由散播的權(quán)利。但不知為何,應(yīng)該有能力完整發(fā)表的 BSD 4.4 Lite 還是缺少了三的檔案。當(dāng)時(shí),農(nóng)夫我也很高興地買(mǎi)了一本BSD4.4-Lite CD-ROM Companion ,含一張光盤(pán),現(xiàn)在拿在手上,看來(lái)總覺(jué)得有點(diǎn)呆。
    掌握 UNIX source code 以及 UNIX 商標(biāo)的 Novell ,將 UNIX 商標(biāo)交給X/open管理,自己則發(fā)展了一套命名為 UNIXWave 的操作系統(tǒng)。推出后市場(chǎng)的反應(yīng)并不熱絡(luò)。不久,Novell與 SCO接頭,在 SCO保證繼續(xù)支持UNIXWare 的條件下,UNIX在 1995 年二次易主,新主人是SCO[注4].
    備注:*1 Intel在 1978 年發(fā)表 4.77 MHz 的 8086 微處理器。1980年,Microsfot 便以 V7 為基礎(chǔ),發(fā)表了在微處理器(microprocessor-based computers)上執(zhí)行的版本也就是 XENIX. 到了 1982 年,一家成立于 1979 年的軟件公司 Santa Cruz Operation ,成為微軟的合作開(kāi)發(fā)廠(chǎng)商。之后她這家公司便一直致力于這個(gè)領(lǐng)域里延續(xù)到今日,縮寫(xiě)就是今日的 SCO.
    *2 Interactive IS/1 (以 V6 為主體)。這個(gè)版本后來(lái)演化為比較讓人熟知的名字—— Interactive UNIX. 后來(lái)因?yàn)?Sun Microsystems 致力發(fā)展 Solaris for X86,被財(cái)力雄厚的 Sun Microsystems 合并了,如今已經(jīng)不見(jiàn)蹤跡了。
    *3就在我反復(fù)修改這段文稿的時(shí)候,BSDI這家公司已經(jīng)被 Wind River 合并了,改名為iXsystems.2001/05/03
    *4 2001 年 5月 4日,Caldera International , Inc. 正式并購(gòu)了 SCO的服務(wù)器軟件部及SCO 專(zhuān)業(yè)服務(wù)部這兩個(gè)部門(mén),新的控股公司名為 Caldera, Inc


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351DZN248.jpg');" border="0">


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351HPY959.jpg');" border="0">
    GNU 計(jì)劃——開(kāi)啟了新大道
    在 1983 年 9月 27 日,麻省理工學(xué)院人工智能實(shí)驗(yàn)室(MIT Artificial Intelligence Lab )的 Richard M. Stallman(以下簡(jiǎn)稱(chēng)為 RMS),在net.unix-wizards以及net.usoft 的 newsgroups 貼上了一份標(biāo)題為 "new UNIX implementation" 的訊息。這就是如今廣為人知的 GNU計(jì)劃的開(kāi)始。在那則被視為「GNU 宣言」草稿的訊息中,RMS 闡述個(gè)人的理念與計(jì)劃的目的——完成一個(gè)命名為 GNU的 "Free UNIX"操作系統(tǒng),希望藉此尋喚理念想同者共襄盛舉。
    「如果我喜歡一個(gè)程序的話(huà),那我就應(yīng)該分享給其它喜歡這個(gè)程序的人」,這是RMS 的座右銘。此點(diǎn)也似乎正是促使其決心運(yùn)作 GNU計(jì)劃的原動(dòng)力。當(dāng)時(shí)的RMS 是想寫(xiě)出一套免費(fèi)的操作系統(tǒng)。能夠讓每個(gè)人如空氣般地自由的取得與使用。
    選擇“UNIX兼容”為設(shè)計(jì)的主要原因是;RMS 表明,UNIX并非他個(gè)人理想中的操作系統(tǒng);他僅閱讀一些相關(guān)數(shù)據(jù),但未曾使用過(guò)(MIT 使用操作系統(tǒng)是"ITS——Incompatible Timesharing System");但他認(rèn)為 UNIX 操作系統(tǒng)具有優(yōu)良的本質(zhì)特性。他相信如果 GUN與 UNIX 兼容將更容易令人接受。所以 RMS承襲 MIT用遞歸縮寫(xiě)字命名的傳統(tǒng)為 GNU釋譯界定 Gnu is Not Unix.
    1984年 1月,RMS 為了展開(kāi)他的理想而決心離開(kāi)已經(jīng)待了十幾年的 MIT AI Lab.。當(dāng)他向他老板 Patrick Winston 辭職時(shí),Winston 試圖挽留地說(shuō):「你還是要辭職?」。RMS 不為所動(dòng)的回答:「是」。Winston 顯然得到預(yù)料中的答案,于是接著說(shuō)出了思緒里關(guān)懷:「你想要保留你的鑰匙嗎?」。于是 RMS就從此開(kāi)始專(zhuān)心地" 失業(yè)" 在他的老東家。一個(gè)人窩在他原來(lái)的舊辦公室中,規(guī)劃著如何開(kāi)始他的 GNU計(jì)劃。但想開(kāi)發(fā)一套新的 UNIX 兼容的操作系統(tǒng),即使是財(cái)力、人力資源雄厚的頂級(jí)計(jì)算機(jī)公司,也絕對(duì)不是一件說(shuō)想做就能夠做到的事。
    當(dāng)擬妥他的「GNU 宣言」之后,他正式向全世界呼喚、表明其將所為。種子落地了。
    GNU 計(jì)劃的第一只程序要算是孤軍奮戰(zhàn)的 RMS在 1984 年 9月開(kāi)始撰寫(xiě)的Emacs 編輯器。
    1985年初,Emacs 已進(jìn)入可用的階段。于是 RMS將她放在pre.ai.mit.edu這臺(tái)機(jī)器的 FTP server 上,免費(fèi)地讓 amonymous的到訪(fǎng)者自由下載使用。不久后,Emacs 強(qiáng)捍的功能引發(fā)了一些玩家們的注意,由于附上了 source code,玩家們能自己動(dòng)手為它添加新的功能或除錯(cuò),很快地,Emacs 獲得了相當(dāng)熱烈的回響。隨著名聲漸播,開(kāi)始有人相繼地加入 GNU計(jì)劃的程序?qū)懽麝嚑I(yíng)。" 此道不孤" 讓 RMS倍感振奮與喜悅。
    當(dāng)時(shí)的因特網(wǎng)并未十分普及。所以有不少人雖然對(duì) Emacs程序有興趣,卻沒(méi)辦法經(jīng)由 FTP的管道取得,因而有人透過(guò)其它管道向 RMS詢(xún)問(wèn)能如何取得時(shí),這可讓當(dāng)時(shí)處在失業(yè)狀態(tài)的RMS 看到能夠支持他繼續(xù)奮戰(zhàn)下去的資金來(lái)源——販?zhǔn)? 自由軟件".
    一個(gè)人、一個(gè)獨(dú)立的個(gè)人,要想在現(xiàn)實(shí)中實(shí)行自己的理念,最先得接受" 現(xiàn)實(shí)".唯有接收它是事實(shí),實(shí)行理念的道路,才獲得比較穩(wěn)固的起點(diǎn)與開(kāi)始?! W(wǎng)絡(luò)農(nóng)夫如是說(shuō)。
    想著、寫(xiě)著,腦中突然掠過(guò)一絲感受(所以順便記錄在這個(gè)地方)。不管如何,RMS 真的開(kāi)始以一卷磁帶 150 塊美金的代價(jià),服務(wù)有需要的人。也因?yàn)榛谶@個(gè)開(kāi)始與基礎(chǔ),RMS 當(dāng)年便創(chuàng)立了自由軟件基金會(huì)—— Free Software Foundation(以后簡(jiǎn)稱(chēng)為FSF )。這對(duì)GNU 計(jì)劃而言,意味著它已跨越個(gè)人化理念的構(gòu)思階段,并進(jìn)入了有群體組織化的運(yùn)作階段。
    同時(shí),RMS 也制定出了屬于GNU 計(jì)劃的軟件版權(quán)。RMS 使用 "copyleft" 用來(lái)形容她,其實(shí)就是與著作版權(quán)(copyright ) " 對(duì)立" 之意。這也就是 GPL—— General Purpose License(通用公共授權(quán))。
    GNU 計(jì)劃的種子,就這樣生根發(fā)芽了。
    從販賣(mài) GNU自由軟件擴(kuò)展到其它的相關(guān)軟件與參考手冊(cè),提供軟件技術(shù)支持,并接受計(jì)算機(jī)器材與資金的捐助(捐助者依法享有一定額度的減稅),為企業(yè)代訓(xùn)軟件人 才。FSF 努力地開(kāi)辟財(cái)源卻仍舊是運(yùn)作資金捉襟見(jiàn)肘。RMS 本人并不支薪。而FSF 聘請(qǐng)軟件工程師的待遇,也僅是軟件業(yè)界薪資水平的一半。但這絕不表示GNU 計(jì)劃的軟件水準(zhǔn)是半桶水。GCC 編譯器是 GNU計(jì)劃在 1987 年 3月開(kāi)始發(fā)表的免費(fèi)編譯器,當(dāng)時(shí)的版本是 0.9測(cè)試版。如今最新的版本則是 3.0. 這個(gè)編譯器可以說(shuō)是今日自由軟件寫(xiě)作的基石。GCC 所解譯的機(jī)器碼,其可靠度絕對(duì)不遜于商業(yè)化的編譯器產(chǎn)品,甚至可以說(shuō)是優(yōu)越過(guò)商業(yè)編譯器。
    90年代初,GNU 計(jì)劃暨已完成了質(zhì)量與數(shù)量均十分可觀(guān)的系統(tǒng)工具。這些工具被廣泛的使用在當(dāng)時(shí)各種工作站的 UNIX 系統(tǒng)上。雖然已有如此的成果,但仍稱(chēng)不上是完整的操作系統(tǒng)。他們?nèi)鄙僖恢儆谧约旱? 核心程序(kernal)".
    UNIX在 4.2BSD 之后,越寫(xiě)越大 kernal 開(kāi)始帶來(lái)一些不便與問(wèn)題。因而當(dāng)時(shí)便開(kāi)始有另一個(gè)寫(xiě)作理念逐漸在發(fā)展——微核心(microkernal )理念。
    1985年,卡內(nèi)基大學(xué)(Carnegie Mellon University簡(jiǎn)稱(chēng) CMU)暨以 4.3BSD 為發(fā)展基礎(chǔ),將之一拆為二,分成 micro kernal 與 single server兩個(gè)部分。
    該計(jì)劃的名稱(chēng)為"Mach". 這個(gè)計(jì)劃成了微核心發(fā)展的技術(shù)先河。GNU 原本有意直接采用"Mach"計(jì)劃的成果。但無(wú)奈,這一等,從80年代中等到了90年代初,在幾經(jīng)商量之后,他們打算采用微核心的寫(xiě)法,成立自己的計(jì)劃, 名稱(chēng)叫"Hurd". 這項(xiàng)計(jì)劃,如今仍在奮戰(zhàn)中,雖然 microkernal的做法讓他們吃了不少苦頭;但可喜的是,0.2 , 0.3 測(cè)試版本已經(jīng)發(fā)表。
    直到 21 世紀(jì)的今日,RMS 依舊努力不懈地耕耘著他的夢(mèng)土。盡管他本人認(rèn)為還尚未完全地實(shí)現(xiàn)他的「GNU 宣言」;但他執(zhí)著于理念的行動(dòng),已凝聚了相當(dāng)數(shù)量的自由軟件寫(xiě)作族群們,在這些人與群體的努力下,一條新的大道其實(shí)已經(jīng)被開(kāi)拓出來(lái)了,她通往一個(gè)新的世 界。大道旁,枝葉已然繁茂的樹(shù)蔭下,可口果實(shí)一如禮物般地為所有的人成熟。人們稱(chēng)她—— Linux.
    新世代的焦點(diǎn)—— Linux
    1990年代中期,因特網(wǎng)因出現(xiàn) World Wide Web , HTML 這種新型態(tài)的應(yīng)用,而開(kāi)始迅速的延燒全世界。一夕間,架設(shè)因特網(wǎng)主機(jī)的需求激增。這時(shí)有一套可以免費(fèi)取得,并且能讓 x86計(jì)算機(jī)升格成 UNIX 級(jí)主機(jī)的免費(fèi)操作系統(tǒng),開(kāi)始了吸引全世界目光。在傳媒與計(jì)算機(jī)工程師們的競(jìng)相走告下成為了這個(gè)新世代的焦點(diǎn),這個(gè)新的名字就是 Linux.
    Linus Benedict Torvalds 當(dāng)然,這套媒體吹捧的當(dāng)紅炸子雞,可非一人之功,一夕即成的。Linux 是一套版權(quán)徹徹底底與 AT&T 無(wú)關(guān)的 UNIX-like OS.原始核心程序的創(chuàng)作者是芬蘭籍的 Linus Benedict Torvalds(現(xiàn)今他仍舊是核心程序的維護(hù)者)。操作系統(tǒng)里大部分的系統(tǒng)工具,來(lái)自于 RMS行之多年的 GNU計(jì)劃成果,以及其它的自由軟件寫(xiě)作計(jì)劃產(chǎn)生的軟件,如 X Windows、KDE 、Gnome 等窗口接口。由于構(gòu)成操作系統(tǒng)的主要部分均奉行 GPL 版權(quán),所以市面上有相當(dāng)多樣的安裝套件,目前較廣為人知的有 RedHat 、Slackware 、SuSE、Debian GNU/Linux ……。也因此,這套操作系統(tǒng),可說(shuō)是包含了無(wú)數(shù)字自由軟件寫(xiě)作者的共同心血。
    如此的一套操作系統(tǒng)其實(shí)也就是 RMS多年來(lái)想要達(dá)成的宿愿—— "Free UNIX". 所以,RMS 本人總認(rèn)為該將名稱(chēng)改做"GNU/Linux".因此,也有人用 GNU/Linux來(lái)稱(chēng)呼這個(gè)操作系統(tǒng)。
    Torvalds打從十歲出頭當(dāng)他外公的" 鍵盤(pán)手" 開(kāi)始,到了中學(xué)就已成了不折不扣的計(jì)算機(jī)迷。1990年,當(dāng)他就讀赫爾辛基大學(xué)(University of Helsinki) 信息系二年級(jí),選修一門(mén)「C 語(yǔ)言與 UNIX 操作系統(tǒng)」的課程,因而瘋狂地迷戀上了UNIX操作系統(tǒng)。那年正好赫爾辛基大學(xué)正好添購(gòu)的一臺(tái) VAX,安裝 Ultrix 操作系統(tǒng)。連接了 16 臺(tái)終端機(jī)供授課師生使用。有所限制的計(jì)算機(jī)資源,對(duì)一位計(jì)算機(jī)迷來(lái)說(shuō)是極痛苦忍受的。
    Torvalds開(kāi)始作夢(mèng)想" 搞" 一套可以在自己計(jì)算機(jī)上跑的 UNIX.
    1991年 1月,Torvalds利用 "學(xué)生貸款" 加上去年的 "耶誕紅包" ,以分期付款方式買(mǎi)了一臺(tái) 386 DX33 個(gè)人計(jì)算機(jī)(他的第三臺(tái)計(jì)算機(jī))。他選擇安裝的操作系統(tǒng)則是在學(xué)術(shù)界頗負(fù)盛名的 Minix[ 注5]. 在幾番奮戰(zhàn)下,就緒運(yùn)作的 Minix OS 功能性卻多方面無(wú)法滿(mǎn)足Torvalds的需求,因而激發(fā)了他重頭來(lái)的欲念。于是 Torvalds 在他的 386 DX33 上逐步探索并撰寫(xiě)出他自己的核心程序。他網(wǎng)絡(luò)上釋放的第一個(gè)版本是 1991 年 9月 17 日的 0.01 版。雖然她是個(gè)簡(jiǎn)陋的開(kāi)始,但由于 Torvalds 本人持續(xù)維護(hù)與網(wǎng)友回饋貢獻(xiàn),原本一個(gè)人所撰寫(xiě)的核心程序竟在不知不覺(jué)中逐漸轉(zhuǎn)化成 "虛擬團(tuán)隊(duì)" 的運(yùn)作模式。
    然而,一般計(jì)算機(jī)使用者,需要的是可安裝運(yùn)作的操作系統(tǒng)(農(nóng)夫我習(xí)慣以" 安裝套件" 稱(chēng)之),而非單一的操作系統(tǒng)核心。當(dāng)時(shí)英國(guó)的曼徹斯特電算中心(Manchester Computer Center,簡(jiǎn)稱(chēng) MCC)便根據(jù) 0.12 版核心程序制作了一套名為 MCC Imterin的安裝套件。隨后各地的安裝套件有如雨后春筍般地出現(xiàn);如美國(guó)德州 Dave Safford 的 TAMU (Texas A&M University)版、Martin Junius 的 MJ 版、Peter McDonald的 SLS(Softlanding Linux Sustem)版等非商業(yè)安裝套件的出現(xiàn)。在安裝需求日增的情況下,Linux 安裝套件創(chuàng)造出了一塊新的需求市場(chǎng)。這一線(xiàn)商機(jī),讓非商業(yè)安裝套件的也開(kāi)始出現(xiàn)在商業(yè)市場(chǎng)上。Slackware 大概可算是最早出現(xiàn)的商業(yè)安裝套件了。到如今,商業(yè)與非商業(yè)的安裝套件則已多得數(shù)不清了。
    隨著使用人數(shù)激增,核心程序的版本與功能也開(kāi)始加速演化,但仍不失于穩(wěn)健。
    1994年 3月 13 日,核心程序 1.0正式發(fā)表。其安裝套件在功能上的整合已急起直追當(dāng)時(shí)商業(yè)版的 UNIX OS. 此時(shí)的 Linux OS 已擁有數(shù)十萬(wàn)名使用者。當(dāng)時(shí)赫爾辛基大學(xué)還以此為由舉辦了一場(chǎng)名為"Linux首度正式發(fā)表會(huì)". 就在芬蘭電視臺(tái)與眾多傳媒的鄭重其事的報(bào)導(dǎo)下,Torvalds成了芬蘭人的自豪,Linux OS宛如剛誕生的" 超新星" ,閃閃發(fā)亮地展現(xiàn)在眾人眼前。
    早期的 Linux核心程序曾被 Andrew Tanenbaum 指出,過(guò)度緊密地與 x86處理器結(jié)合,所以他認(rèn)為 Linux核心程序?qū)o(wú)法移植到別的處理器上。這點(diǎn)顯然與UNIX OS 的可移植性大不相同。當(dāng)時(shí)的情況的確是如此,這或多或少與Torvalds本人受限于擁有的硬件資源有關(guān)。
    但當(dāng) Linux的使用族群拓展開(kāi)來(lái)之后,便開(kāi)始有人主動(dòng)地將她移植到不同的平臺(tái)上。像 Dave Miller即以不下于Torvalds狂熱與學(xué)習(xí)精神將 Linux成功地移植到 SUN的 SPARC工作站上。
    此外如 Amiga、Atari 、PowerPc 、MIPS R4000也陸續(xù)見(jiàn)到 Linux的身影。
    這些移植嚴(yán)格地從技術(shù)的角度來(lái)看,僅能說(shuō)是" 個(gè)案".但這已激發(fā) Torvalds 的興趣。
    真正撼動(dòng) Linux核心的移植是對(duì) Alpha處理器。
    1994年 5月,在 DEC使用者協(xié)會(huì)上,Digital 的工程師 John Hall(外號(hào)Maddog) 碰上了 Torvalds ,雙方一見(jiàn)如故。Maddog力勸 Torvalds 將Linux 移植到 Alpha芯片上,并主動(dòng)提供了一臺(tái) Alpha 計(jì)算機(jī)供 Torvalds 研究使用。當(dāng)年可說(shuō)是全世界最快的 64-bits Alpha芯片是 DEC引以為豪的一項(xiàng)成就,其架構(gòu)與功能均優(yōu)越過(guò)同一時(shí)期的 Intel 32-bits處理器。這種技術(shù)性的挑戰(zhàn)吸引了 Torvalds 的投入。這項(xiàng)移植,但這對(duì)原先以 x86微處理器為寫(xiě)作基礎(chǔ)的 Linux核心程序而言,實(shí)在不是一件小工程。在 Torvalds 與 DEC相關(guān)人員的將近一年奮戰(zhàn)后,Linux 核心程序脫胎換骨,成功地移植到 Alpha處理器上(與 x86處理器使用同一套程序代碼)。1995年 3月,被戲謔是 Linux'95 的1.2 版核心程序正式發(fā)表,支持Intel x86 、DEC Alpha 、SUN SPARC 、MIPS等處理器。
    1996年 6月,核心程序版本由 1.3直接躍升為 2.0版。Torvalds本人正式欽定了一只" 企鵝" 作為 Linux的標(biāo)志。同時(shí)也開(kāi)始支持對(duì)稱(chēng)式多重處理器(Symmetric Multi-Processing,簡(jiǎn)稱(chēng) SMP)架構(gòu)的計(jì)算機(jī);而支持的處理器則又多了 Motorola 68k 和 PowerPc. 在自由軟件團(tuán)體們的努力與計(jì)算機(jī)產(chǎn)業(yè)業(yè)界的支持投入之下,Linux 具備的功能逼近商業(yè)版 UNIX OS. 當(dāng)然,Linux 要達(dá)到" 成熟" 與" 穩(wěn)定" ,實(shí)際上還有好長(zhǎng)的一段路要走。
    時(shí)至今日,散播在全球各地的 Linux虛擬發(fā)展團(tuán)體,仍舊持續(xù)地發(fā)展中。能維持到什么時(shí)候?這在將來(lái)的歷史自有答案。但至少在現(xiàn)今,一個(gè) RMS奮斗的目標(biāo)——可自由分享程序代碼的操作系統(tǒng),已可貴地呈現(xiàn)在我們的眼前。
    備注:*5 Minix是 Andrew Tanenbaum 教授為教學(xué)目的而撰寫(xiě)的操作系統(tǒng)。
    在教育界可算是一套學(xué)習(xí) UNIX 基礎(chǔ)的好范本。


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351K6092622.jpg');" border="0">


    400) {this.resized=true; this.width=400; this.alt='Click here to open new window';}" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="window.open('/upimg/20070420/11M10351N20109221.jpg');" border="0">

    新文明世紀(jì)自由共享
    到此,這一段關(guān)于 UNIX 發(fā)展的文字,已從過(guò)去的歷史當(dāng)中走回到了今日…
    … 21 世紀(jì)的今日。本文也接近尾聲了。請(qǐng)諸位原諒農(nóng)夫?qū)⒁詷O為自身的歷史感受,來(lái)作為本文的結(jié)語(yǔ)。
    閱讀與探究歷史,是農(nóng)夫個(gè)人在年輕時(shí)即有的一點(diǎn)小癖好。通常我無(wú)法忍受對(duì)自己喜好事物的緣由一無(wú)所知。所以我會(huì)想辦法去探究她由誰(shuí)所創(chuàng)、因何而生與發(fā)展的沿革。也正因?yàn)槿绱耍也艜?huì)為 UNIX 這個(gè)當(dāng)初我沒(méi)能在英文字典上找的怪字,寫(xiě)了這么一篇文字。
    然而在 UNIX 的發(fā)展過(guò)程當(dāng)中,我驚訝地發(fā)現(xiàn)了一項(xiàng)有別于我探索 20 世紀(jì)歷史的東西。
    我相信諸君應(yīng)該清楚,20世紀(jì)是人類(lèi)文明史上最為血腥殘暴的一段歲月。在其間,多數(shù)民族的上個(gè)世代所遭逢的苦難,都是空前的。哲學(xué)家柏林(Isaiah Berlin )回顧 20 世紀(jì)的感受,說(shuō)了以下這樣的一段話(huà)。
    「我的一生——我一定得這么說(shuō)一句——經(jīng)歷了二十世紀(jì),卻不曾遭逢個(gè)人苦難。
    然而在我的記憶之中,它卻是西方史上最可怕的一個(gè)世紀(jì)。」
    的確,每當(dāng)我閱讀 20 世紀(jì)的相關(guān)史料,我就更能加倍地感受到這份莫名的幸運(yùn)。我生長(zhǎng)在臺(tái)灣,這塊回顧其歷史僅能以" 悲土" 稱(chēng)之的島上,她的苦難直至今日亦尚未完全結(jié)束。
    盡管多數(shù)年輕的一代已然淡忘,來(lái)自何方,歸往何處。
    身為一個(gè)中國(guó)人,站立在這塊似乎仍將被同胞武力相向的孤島上……我已不清楚歷史傷口會(huì)因得到同胞的愛(ài)而痊愈,還是再次因人類(lèi)殘暴掠奪的天性而迸裂……
    抱歉,離題了。
    我想說(shuō)的是,在 20 世紀(jì)未的因特網(wǎng)時(shí)代中,我感受到了令人喜悅地,根源于心、跨越既有疆界藩籬的自由共享文明。這相較于 20 世紀(jì)初將" 戰(zhàn)爭(zhēng)" 視作為文明象征的人類(lèi)而言,實(shí)屬無(wú)價(jià)可貴的進(jìn)展。即使這文明仍?xún)H是剛播下的種子。
    但我相信,她將如貝聿銘所言:
    「你永無(wú)法明確知道你已播種的東西何時(shí)可以收割;或許只有一次收成,或許可重復(fù)收成。你也許遺忘曾播種了些什么,一種經(jīng)驗(yàn),一種感受,與某人的關(guān)系,抑或一種哲學(xué)及一項(xiàng)傳統(tǒng)。然后,忽然間就開(kāi)花了,被全然不同的環(huán)境所喚醒。這種盛開(kāi)可以沖破藩籬及整個(gè)時(shí)代?!?br /> 多希望親眼看到,幾個(gè)世代后的某日,人類(lèi)彼此掠奪的行為如天花一般地在人類(lèi)社會(huì)中絕跡;而,共享已成為人類(lèi)整體奉行的道德公理。如果這樣的一個(gè)社會(huì)是我們今日所企求的;那么,這個(gè)方向與希望,就值得你我花一生的精力去努力。
    當(dāng)然,這僅只是一個(gè)個(gè)人的希望,我也清楚這世間并非如此美好。但,如果因假設(shè)一件事物不可能做到,而決定不去做;那是假設(shè)得到勝利,而非真實(shí)的事實(shí)。
    或許過(guò)去的歷史,曾經(jīng)證實(shí)正義、公理、平等與理想的勝利,不過(guò)是短暫的曇花一現(xiàn);那又如何。只要我們不放棄希望,希望就有機(jī)會(huì)成為真實(shí)。今日,所有的美好均因此得來(lái),明日也是。
    這幾年來(lái),我已看到不少因特網(wǎng)上諸君們的努力。我也相信這嶄新文明的種子,有朝一日將展現(xiàn)出令人贊嘆、愉悅的美景。未來(lái)存在我們尚未發(fā)現(xiàn)的國(guó)度。
    我相信,我們能發(fā)現(xiàn)未曾走過(guò)的通道,打開(kāi)不曾打開(kāi)的門(mén),進(jìn)入玫瑰園中……那會(huì)是一個(gè)嶄新的文明。


    摘自:http://www.oklinux.cn/html/other/unix/20070421/21330.html

    posted @ 2009-11-15 15:56 石頭@ 閱讀(2141) | 評(píng)論 (0)編輯 收藏

    測(cè)試你的C語(yǔ)言掌握程度

    字符串 
    學(xué)習(xí)時(shí)間:1.5W(“W”周,下同)
    知識(shí)點(diǎn)checklist
    strlen()函數(shù)的返回值是什么類(lèi)型的?
    字符串strlen()的值,是否和他占據(jù)的內(nèi)存空間相同?
    你是否知道strcpy函數(shù)存在的潛在風(fēng)險(xiǎn)?如何避免?
    如果一個(gè)字符串沒(méi)有字符串結(jié)束符,而調(diào)用str開(kāi)頭的庫(kù)函數(shù),會(huì)發(fā)生什么?
    Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()內(nèi)部到底是如何運(yùn)行的?這些函數(shù)到底對(duì)源字符串和目標(biāo)字符串做了些什么?你是否觀(guān)察過(guò)它們運(yùn)行時(shí)兩個(gè)字符串內(nèi)存的變化?
    上面這些函數(shù)使用時(shí),各有哪些需要注意的地方?
    你會(huì)幾種字符串查找操作?
    c語(yǔ)言中有字符串這個(gè)數(shù)據(jù)類(lèi)型嗎?
    對(duì)字符串進(jìn)行操作的時(shí)候,是否為字符串結(jié)尾符預(yù)留存儲(chǔ)位置?不然的話(huà)容易造成非常訪(fǎng)問(wèn)內(nèi)存。

    數(shù)組
    學(xué)習(xí)時(shí)間:2W
    知識(shí)點(diǎn)checklist
    你肯定知道,定義“int a[10];”,a[10]這個(gè)元素是無(wú)效的。
    你知道幾種數(shù)組初始化的方法?
    數(shù)組和指針有千絲萬(wàn)縷的聯(lián)系而又不同,你是否對(duì)他們?cè)诓煌闆r下的使用進(jìn)行過(guò)詳細(xì)的總結(jié)?
    “int calendar[10][20];”,這是一個(gè)什么樣的數(shù)組?它擁有10數(shù)組類(lèi)型的元素,還是20個(gè)?
    “int a[10];”,數(shù)組名a在本質(zhì)上是一個(gè)什么?你是否打印過(guò)a的值?
    你知道幾種獲取數(shù)組某元素的方法?
    指針和數(shù)組相同嗎?什么時(shí)候相同?什么時(shí)候不同?
    用指針和下標(biāo)訪(fǎng)問(wèn)數(shù)組元素,那種方式更快?

    結(jié)構(gòu)體
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    你知道什么是位域結(jié)構(gòu)體嗎?如何定義它?如何使用它?
    你知道字節(jié)對(duì)齊對(duì)結(jié)構(gòu)體占用內(nèi)存空間大小的影響嗎?如何計(jì)算結(jié)構(gòu)體占用內(nèi)存的大小?


    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    你知道宏的本質(zhì)是什么嗎?函數(shù)?語(yǔ)句?類(lèi)型定義?或者其他?
    你知道語(yǔ)言設(shè)計(jì)者為什么設(shè)計(jì)宏嗎?這些原因目前是否仍然成立?
    你會(huì)設(shè)計(jì)帶有參數(shù)的宏嗎?
    你知道使用宏的參數(shù)的的時(shí)候的注意事項(xiàng)嗎?
    你會(huì)設(shè)計(jì)帶有可變參數(shù)的宏嗎?
    你知道使用宏有什么劣勢(shì)嗎?
    你有沒(méi)有更好的替代方案?


    枚舉
    學(xué)習(xí)時(shí)間:0.5W
    知識(shí)點(diǎn)checklist
    是否可以指定枚舉中各項(xiàng)的值?
    如果不指定值,枚舉的第一個(gè)值是多少?
    枚舉的值是否可以是負(fù)數(shù)?
    定義枚舉的時(shí)候,你是否專(zhuān)門(mén)定義了枚舉的最小值和最大值?


    Switch
    學(xué)習(xí)時(shí)間:0.5W
    知識(shí)點(diǎn)checklist
    switch(c)中的c的數(shù)據(jù)類(lèi)型有哪些?
    你是否在所有的switch中都加了default語(yǔ)句?
    是否在所有的case中都加了break語(yǔ)句(一般情況的做法)?如果你不加break,將會(huì)發(fā)生什么?


    Static
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    static的三個(gè)主要作用是什么?
    static的修飾的局部變量是保存在什么地方的?全局變量哪?
    static修飾的全局變量和函數(shù),在其他的文件中是否可以訪(fǎng)問(wèn)?如何訪(fǎng)問(wèn)?
    你知道static是c語(yǔ)言中實(shí)現(xiàn)封裝和隱藏的利器嗎?你是否經(jīng)常使用?
    定義在不同源文件中的static全局變量,編譯器是否允許他們的變量名稱(chēng)相同?他們?cè)趦?nèi)存中的地址是否相同?函數(shù)那?


    const
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    你是否經(jīng)常使用const來(lái)表明不能夠被更改的變量?
    你是否經(jīng)常使用const常量來(lái)代替宏?
    下面四種情況,你知道是各表示什么意思嗎?
    int  i_value= 10;
    const  int* pvalue = &i_value
    int  const *pvalue = &i_valueint*  const  pvalue= &i_value
    const  int* const  pvalue = &i_value
    你知道const常量如何初始化嗎?


    Sizeof
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    對(duì)于字符數(shù)組,strlen和sizeof的值是否相同?
    Sizeof本質(zhì)上是函數(shù)還是宏?
    Sizeof的返回值是什么類(lèi)型?


    指針
    學(xué)習(xí)時(shí)間:3W
    知識(shí)點(diǎn)checklist
    “int *p;”&p,p,*p他們的值分別表示什么含義?
    你定義的指針初始化了沒(méi)?
    你理解指針的指針的概念嗎?你會(huì)使用嗎?
    “int *pi_value; pi_value = 0x100000;” pi_value + 1的值是是多少?
    你會(huì)定義函數(shù)指針嗎?
    你會(huì)使用函數(shù)指針調(diào)用函數(shù)嗎?
    關(guān)于指針和數(shù)組,請(qǐng)參見(jiàn)知識(shí)點(diǎn)數(shù)組。


    動(dòng)態(tài)分配內(nèi)存
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    動(dòng)態(tài)分配的內(nèi)存是保存在什么地方的?
    什么情況下使用動(dòng)態(tài)分配內(nèi)存?
    動(dòng)態(tài)申請(qǐng)內(nèi)存一定要釋放,否則會(huì)內(nèi)存泄露。你是否使用過(guò)內(nèi)存檢測(cè)工具?


    函數(shù)
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    如何查看函數(shù)在內(nèi)存中的地址?
    如何給一個(gè)函數(shù)指針賦值?
    你是否會(huì)定義可變?nèi)雲(yún)⒑瘮?shù)
    你是否可以區(qū)分函數(shù)的形參與實(shí)參?
    如何定義函數(shù)名,以準(zhǔn)確的表達(dá)函數(shù)的用途?
    你是否使用const來(lái)修飾函數(shù)入?yún)⒑头祷刂担员淼奶囟ǖ暮x?
    遞歸如何使用?

    變量
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    全局變量,局部變量,常量分別保存在內(nèi)存中的什么地方?
    不同類(lèi)型的變量,你是否知道其作用域?
    全局變量和局部變量是否可以重名?你是否在這樣做?
    局部變量在函數(shù)退出后是否有效,為什么?
    全局變量為什么不允許定義在頭文件中?有何危害?

    鏈接(linux)
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    鏈接位于編譯過(guò)程的那個(gè)階段?
    動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)使用時(shí)有何區(qū)別?
    如何對(duì)動(dòng)態(tài)鏈接庫(kù)進(jìn)行動(dòng)態(tài)加載(不用重啟程序而加載鏈接庫(kù))?
    動(dòng)態(tài)鏈接有何優(yōu)點(diǎn)?
    動(dòng)態(tài)鏈接庫(kù)中是否定義了非static的全局變量?你是否知道這是一個(gè)非常危險(xiǎn)的動(dòng)作?
    動(dòng)態(tài)庫(kù)中的全局變量(非static)和函數(shù)(非static)是否可以和上層全局變量和函數(shù)重名?重名后會(huì)發(fā)生什么事情?


    運(yùn)行時(shí)的數(shù)據(jù)結(jié)構(gòu)(linux)
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    你知道什么是段的概念嗎?
    可執(zhí)行程序可以分為幾個(gè)段?每個(gè)段保存的是什么內(nèi)容?
    如何查看可執(zhí)行程序各個(gè)段的大???
    當(dāng)函數(shù)被調(diào)用時(shí)發(fā)生了什么?
    你有沒(méi)有試過(guò)程序的??臻g最大有多大?程序超過(guò)此大小會(huì)發(fā)生什么?
    你使用的系統(tǒng)的棧是向下生長(zhǎng)的,還是向上生長(zhǎng)的?

    Include
    學(xué)習(xí)時(shí)間:0.5W
    知識(shí)點(diǎn)checklist
    1、如何避免對(duì)同一頭文件的多次include?


    聲明
    學(xué)習(xí)時(shí)間:1W
    知識(shí)點(diǎn)checklist
    什么是聲明,什么是定義?
    你是否會(huì)運(yùn)用c語(yǔ)言聲明的優(yōu)先級(jí)規(guī)則?


    關(guān)于復(fù)雜度:
    軟件的首要技術(shù)使命是管理復(fù)雜度。
    優(yōu)秀程序員的一個(gè)特質(zhì)是將復(fù)雜的事情簡(jiǎn)單化,而非將簡(jiǎn)單的問(wèn)題復(fù)雜化。所以,他們一般會(huì)選擇簡(jiǎn)單的解決方案。
    極盡機(jī)巧,復(fù)雜的解決方案,除了將新手搞得暈頭轉(zhuǎn)向之外,別無(wú)他用。
    閱讀優(yōu)秀程序員的代碼,是一種享受,你很少遇到思維的阻力,你可以盡情的享受簡(jiǎn)單之美。
    所以,對(duì)難以理解的語(yǔ)言特性,要慎用、少用,最好不用,而以簡(jiǎn)單的解決方案替代之。但是,在做這些之前,你必須對(duì)這些知識(shí)點(diǎn)理解深刻。

    如果你發(fā)現(xiàn)有什么錯(cuò)誤,請(qǐng)和我聯(lián)系。
    如果這些知識(shí)點(diǎn)你90%以上都不知道,或者理解不深刻——我希望你可以加入DS計(jì)劃,共同學(xué)習(xí)。
    如果這些知識(shí)點(diǎn)你90%以上都知道,并且理解深刻——我希望你也可以加入DS計(jì)劃,成為知識(shí)點(diǎn)專(zhuān)家,對(duì)新手進(jìn)行指導(dǎo)。
    如果你知道的比上面列出的還要多,或者還有你認(rèn)為非常重要的,建議你也分享出來(lái),對(duì)上面列舉的內(nèi)容進(jìn)行優(yōu)化。

    原文地址:http://blog.csdn.net/chgaowei/archive/2009/10/27/4731498.aspx
    DS計(jì)劃加入方式:
    1、 方式1 :加入 QQ 群: 93684322 。
    2、 方式2 :加入 CSDN 群組: DS計(jì)劃 。 

    一位網(wǎng)友的建議

    對(duì)《C方向項(xiàng)目詳細(xì)計(jì)劃》的一點(diǎn)建議
    作者:陳新
    原文: http://hi.csdn.net/space-1568678-do-thread-id-990.html
    首先自己介紹一下,我已經(jīng)工作多年,目前半管理半開(kāi)發(fā),主要使用PHP和C語(yǔ)言,對(duì)于C語(yǔ)言有過(guò)一定研究,有一些經(jīng)驗(yàn)。
    我很少上CSDN,雖然已經(jīng)注冊(cè)了很長(zhǎng)時(shí)間,今天心血來(lái)潮進(jìn)來(lái)看看,就發(fā)現(xiàn)了常高偉的的帖子《深入學(xué)習(xí)C語(yǔ)言知識(shí)點(diǎn)checklist——測(cè)試你掌握C的程度》,仔細(xì)看了一遍,覺(jué)得還不錯(cuò),這年頭還執(zhí)著于技術(shù)細(xì)節(jié)的人很少了,可見(jiàn)作者還是下了不少功夫的。
    接著就看到了“讀S計(jì)劃”,覺(jué)得有點(diǎn)意思,看完之后就有了寫(xiě)這個(gè)建議的沖動(dòng),希望對(duì)大家有所幫助。

    關(guān)于c語(yǔ)言知識(shí)點(diǎn)本身,還是挺全面的,如果一個(gè)人大部分問(wèn)題都能詳細(xì)解答,說(shuō)明這個(gè)人對(duì)C語(yǔ)言的了解還是很不錯(cuò)的。
    不過(guò)我還是有幾點(diǎn)建議:
    1、知識(shí)點(diǎn)組織得不是很好,顯得有些凌亂,有些相關(guān)知識(shí)點(diǎn)被分割到了多個(gè)地方,有些不夠全面,從學(xué)習(xí)的角度來(lái)將,不是非常好。
    例如開(kāi)始就從字符串操作講起,我覺(jué)得不是很好。原因是字符串操作只是庫(kù)函數(shù),對(duì)于c語(yǔ)言的字符串,我們開(kāi)始只要知道是0結(jié)束就夠了,函數(shù)后面在慢慢學(xué)習(xí)。了解字符串函數(shù)最好的辦法,就是自己實(shí)現(xiàn)這些函數(shù),然后跟源代碼進(jìn)行比較,找出差距。
    例如宏和Include,不應(yīng)該分開(kāi),而應(yīng)該作為預(yù)處理統(tǒng)一學(xué)習(xí)。預(yù)處理主要包括宏替換、文件包含和條件編譯三部分,另外的一些慢慢再了解就可以了。
    此外,我覺(jué)得應(yīng)該把static、const這些限定詞和變量結(jié)合在一起學(xué)習(xí),順便把其它限定詞auto、extern、register、 volatile、restrict、inline等整合在一起,從變量的類(lèi)型(存儲(chǔ)格式)、生命周期、作用域、可視性、存儲(chǔ)分配等各種角度出發(fā)進(jìn)行說(shuō)明。
    2、有些提問(wèn)不是很恰當(dāng)。
    例如sizeof本質(zhì)上是函數(shù)還是宏?因?yàn)閟izeof既不是函數(shù),也不是宏,這么提問(wèn)容易讓人產(chǎn)生誤解。要想弄明白sizeof具體是什么,至少要明白編譯的整個(gè)過(guò)程,弄明白編譯時(shí)和運(yùn)行時(shí)的概念。
    例如數(shù)組提到的定義int a[10]; a[10] 這個(gè)元素是無(wú)效的。這種說(shuō)法并不完全正確,a[10]并非無(wú)效,如果真弄明白了具體含義,完全是可以這么使用的(當(dāng)然一般不推薦)。
    3、學(xué)習(xí)時(shí)間的安排
    像Switch、枚舉之類(lèi)的,如果有人講解,一天就足夠了。而數(shù)組應(yīng)該和指針?lè)旁谝黄?,由于指針是c語(yǔ)言的難點(diǎn)之一,恐怕3周的時(shí)間都不一定足夠。
    4、應(yīng)該把c語(yǔ)言的學(xué)習(xí)當(dāng)作當(dāng)作一個(gè)系統(tǒng),分成多個(gè)階段。
    個(gè)人覺(jué)得分為三個(gè)階段比較合適:
    第一階段是c語(yǔ)言本身,主要是類(lèi)型、操作符、表達(dá)式、語(yǔ)法結(jié)構(gòu)、函數(shù)、指針、數(shù)組、結(jié)構(gòu)等,想完全弄清楚這些其實(shí)很不容易。入門(mén)可以參照譚浩強(qiáng)的那本教科書(shū),不過(guò)這本書(shū)只適合了解一下,不深入,而且里面有些地方和例子都不是很好。還是推薦K&R的《The C Programming Language》,最好是英文原版的。這階段可以同時(shí)學(xué)習(xí)《數(shù)據(jù)結(jié)構(gòu)》,嘗試實(shí)現(xiàn)一些鏈表、樹(shù)的操作。
    第二階段是結(jié)合著實(shí)際情況,加深對(duì)函數(shù)以及相關(guān)知識(shí)的認(rèn)識(shí),試著編寫(xiě)一些小軟件,實(shí)現(xiàn)一些小功能。可以和《APUE》一起學(xué)習(xí),里面講到的例子都可以自己寫(xiě)一下。
    第三階段是深入學(xué)習(xí)編譯原理、操作系統(tǒng)等知識(shí),了解代碼是如何從文本文件一步一步變成可執(zhí)行文件的,知道棧、堆分別是什么,清楚程序的存儲(chǔ)空間布局,庫(kù)函數(shù)和系統(tǒng)調(diào)用的區(qū)別等。這階段可以在某個(gè)方面深入下去,編寫(xiě)一個(gè)比較大的軟件,例如一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)程序、數(shù)據(jù)庫(kù)系統(tǒng)或者編譯器等。
    因此知識(shí)點(diǎn)中的鏈接、運(yùn)行時(shí)的數(shù)據(jù)結(jié)構(gòu)、結(jié)構(gòu)體中的內(nèi)存對(duì)齊等和其它知識(shí)點(diǎn)放在一起并不是很好,畢竟大部分其它大部分題目都是c語(yǔ)言本身的知識(shí),而這些知識(shí)點(diǎn)不少都是要看具體實(shí)現(xiàn)的,甚至有些并沒(méi)有標(biāo)準(zhǔn)答案。

    另外,還有一些題外話(huà):
    1、現(xiàn)在已經(jīng)比較少使用c語(yǔ)言開(kāi)發(fā)軟件了,c語(yǔ)言對(duì)開(kāi)發(fā)者的要求比較高,c語(yǔ)言不是一天兩天就能掌握的,因此首先要弄清楚自己是否真的對(duì)技術(shù)感興趣,對(duì)技術(shù)有種刨根問(wèn)底的沖動(dòng),而且愿意為此花功夫。如果僅僅是想搞搞應(yīng)用,要快速實(shí)現(xiàn)某個(gè)功能,而不追求效率,不在乎具體實(shí)現(xiàn)方式,最好還是去學(xué)習(xí)更高級(jí)的語(yǔ)言。
    2、 c和c++不是一個(gè)語(yǔ)言,所謂c++是c語(yǔ)言的超集也是不正確的,如果當(dāng)初c++的名稱(chēng)是d語(yǔ)言之類(lèi)的,可能就不會(huì)有這么多麻煩了。最主要兩者的指導(dǎo)思想是不一樣的,c語(yǔ)言默認(rèn)其使用者什么都懂,所以將一切的控制都交給開(kāi)發(fā)者自己去完成,語(yǔ)言本身不作太多限制,給開(kāi)發(fā)者最大的自由度。這么做的好處和壞處都是非常明顯的,沒(méi)有誰(shuí)比誰(shuí)好的問(wèn)題,只有是否適用的問(wèn)題。
    3、語(yǔ)言本身只是一個(gè)工具,將我們了解的計(jì)算機(jī)知識(shí)發(fā)揮、展示出來(lái)的工具,但基礎(chǔ)知識(shí)遠(yuǎn)遠(yuǎn)比語(yǔ)言本身更重要。如果認(rèn)為學(xué)好了一門(mén)語(yǔ)言,就是所謂的高手了,那是不切合實(shí)際的。當(dāng)然語(yǔ)言本身也需要我們花費(fèi)很大精力,畢竟掌握好一個(gè)工具,更能讓我們的工作事半功倍。


    摘自:http://topic.csdn.net/u/20091027/22/0573CFB5-F1BF-4CF2-8E60-13D907301A8E.html

    posted @ 2009-10-31 13:10 石頭@ 閱讀(569) | 評(píng)論 (0)編輯 收藏

    看看吧! 朋友。


    成功經(jīng)驗(yàn)寶典100則
    1、王宗立說(shuō):每天早上游泳(輸入正面潛意識(shí))是他成為億萬(wàn)富豪的關(guān)鍵。在游泳過(guò)程中,輸入正面潛意識(shí),使其每天都保持巔峰狀態(tài)。
    2、最重要的是要養(yǎng)成習(xí)慣,立即行動(dòng)。感動(dòng)之后是行動(dòng)。一點(diǎn)總比沒(méi)有好,晚做總比不做好。
    3、 要養(yǎng)成運(yùn)動(dòng)的習(xí)慣,要養(yǎng)成早起的習(xí)慣。運(yùn)動(dòng)能激發(fā)無(wú)限的魅力,會(huì)使一個(gè)人感覺(jué)起來(lái)非常自信。所以我要自己保持持續(xù)的運(yùn)動(dòng)狀態(tài)。讓自己一早起來(lái)就很巔峰的狀 態(tài)。很多情況是越文明,生活越糜爛。而你看王永慶,臺(tái)灣的經(jīng)營(yíng)之神,雖然年齡高達(dá)86歲,但還是每天5點(diǎn)半起床,跑5000公尺,多年來(lái)一直堅(jiān)持。朝氣 ——POWER.能量就是魅力,氣宇非凡。早起,不要為自己找理由,什么我沒(méi)休息夠,我昨天好累啊,等等。
    4、僅僅知道還不夠,關(guān)鍵是要不斷地訓(xùn)練。訓(xùn)既是教育,練既是練習(xí)。
    5、學(xué)校不教兩件事情,一是不教談戀愛(ài),怎樣找個(gè)好老婆怎樣嫁個(gè)好老公。二是學(xué)校不教怎樣**,學(xué)校給人的教育是追求金錢(qián)意味著罪惡,人為財(cái)死,鳥(niǎo)為食亡,財(cái)富是萬(wàn)惡之源。
    6、成功者與失敗者的差別在于時(shí)間管理,運(yùn)用時(shí)間的方法。
    7、你可以主宰你自己的命運(yùn)?。?!下定決心爭(zhēng)取過(guò)自己想要的生活。清楚自己的生活目的。你需要擁有自己的夢(mèng)想。
    一 部電影,《楚門(mén)秀》,楚門(mén)伯班(金凱瑞飾)老是覺(jué)得他一直受到監(jiān)視。他沒(méi)想到這竟然是真的。從他呱呱落地開(kāi)始的三十年來(lái),楚門(mén)伯班就是史上播映最久、最受 歡迎的記錄片肥皂劇的主角,他居住的理想小鎮(zhèn)海景鎮(zhèn)居然是一個(gè)龐大的攝影棚,而他的親朋好友和他每天碰到的人全都是職業(yè)演員。他生命中的一舉一動(dòng)分秒都曝 露在隱藏在各處的攝影鏡頭面前。這就是「楚門(mén)的世界」,全球上億觀(guān)眾都注意著他的一舉一動(dòng),而他自己卻不自知。
    然后經(jīng)過(guò)三十年的渾噩生活后,楚門(mén) 終于感到他的生活有點(diǎn)不對(duì)勁,當(dāng)他發(fā)現(xiàn)他就像是活在玻璃罐里的蝴蝶時(shí),他決定要不計(jì)代價(jià)地逃離海景鎮(zhèn)。但是他必須面對(duì)「楚門(mén)的世界」的創(chuàng)始人、制作人和導(dǎo) 演克里斯托,并且克服他內(nèi)心最大的恐懼,才能突破藩籬,獲得自由他在內(nèi)心對(duì)自己說(shuō),NO! I DONT WANT!(不!我不要過(guò)這種生活,我不要過(guò)這種受別人操縱的生活!)王宗立借這個(gè)例子是想說(shuō)明,一個(gè)人的命運(yùn)是沒(méi)有人能夠操縱的,只要他下定決心,而且 用生命去爭(zhēng)取,他就可以去爭(zhēng)取他想要的東西,過(guò)他想要的生活。你也有一合錄影帶,1天24小時(shí),記錄你一生,你的導(dǎo)演是誰(shuí)呢,你是也在過(guò)一種別人操縱的生 活呢?你的生活是否是在于達(dá)成別人的目的的一種工具而已呢,而不是在過(guò)你想要的生活的做對(duì)的事情,起而行動(dòng),下定決心,用生命去爭(zhēng)??!
    你滿(mǎn)不滿(mǎn)意你自己的劇本,你敢不敢夢(mèng)想5年后的你?
    亞洲首富孫正義有句名言——最初所擁有的只是夢(mèng)想和毫無(wú)根據(jù)的自信而已,但是所有的一切都從這里開(kāi)始。
    8、銷(xiāo)售是世界上最賺錢(qián)的工作。
    王宗立,21歲,財(cái)富達(dá)300億,選擇業(yè)務(wù)工作。
    這個(gè)世界上收入最高的工作就是業(yè)務(wù)。他說(shuō):說(shuō)服任何人,幫我做任何事。
    銷(xiāo)售,什么是銷(xiāo)售,就是說(shuō)明、教育、幫助別人作決定。需要三大能力:開(kāi)發(fā)客戶(hù),網(wǎng)羅干部,締結(jié)業(yè)務(wù)。
    21歲,16個(gè)月的時(shí)間賺了300萬(wàn),然后4個(gè)月賠光22歲賺了700萬(wàn),半年賠光,銷(xiāo)售房子,幫助別人做決定。人喜歡別人幫他做決定。不管是選衣服,交異性朋友還是選吃什么東西,你都希望別人替你做決定。
    一個(gè)女人如果有兩個(gè)男朋友,她該選擇哪一個(gè)?如果你是其中之一,你要幫她下決定,你該如何說(shuō)服她要她選擇你?
    二次創(chuàng)業(yè)失敗,失敗了沒(méi)關(guān)系,重要的是學(xué)到了東西沒(méi)有。成功就是交學(xué)費(fèi),早交晚交而已。越早交就交得越少。
    在人生中必須得有一個(gè)自己又愛(ài)又敬又怕的人。他的這個(gè)又愛(ài)又敬又怕的人是他父親。
    我賠過(guò)近千萬(wàn)的錢(qián),最重要的教訓(xùn)——千萬(wàn)別隨便轉(zhuǎn)換跑道。我見(jiàn)過(guò)太多的轉(zhuǎn)型(轉(zhuǎn)行)失敗的人。擴(kuò)張是另一種形態(tài)的轉(zhuǎn)型(轉(zhuǎn)行)。
    9、人要成功需有三本——本人,本錢(qián),本事。本人是指要親自去了解你所做的業(yè)務(wù)(產(chǎn)品和服務(wù),甚至具體到每一個(gè)細(xì)節(jié)),本錢(qián)就是要有資本,本事是指你要有你的核心專(zhuān)長(zhǎng),核心的競(jìng)爭(zhēng)力。
    一個(gè)人要成功,要有很多的貴人。 8位數(shù)字與9位數(shù)字相差一萬(wàn)倍。
    億萬(wàn)富翁靠經(jīng)營(yíng)管理,靠大智慧,靠忍。
    老板的大忌:全天下的男人都會(huì)犯下的錯(cuò)誤是色,英雄難過(guò)美人關(guān)。很多人有錢(qián)到一半,就會(huì)享受,開(kāi)始酒池肉林,百花叢中有花就堪折,這樣很快就會(huì)財(cái)富消散,因?yàn)橘嶅X(qián)不是加減法而是乘除法,來(lái)得快去得也會(huì)更快。所以做領(lǐng)導(dǎo)還要有憂(yōu)患意識(shí)。
    10、人生不在于機(jī)會(huì)而在于選擇。人生的命運(yùn)就取決于你一剎那所做的決定。
    我做了哪些選擇,以致于有我輝煌的成就——23歲月入百萬(wàn),26歲成為億萬(wàn)富翁,28歲收購(gòu)成功雜志,兩岸三地不同形態(tài)的業(yè)務(wù)?首先要選個(gè)好的工作和職業(yè)。
    (1)、 寧為牛后,不為雞首。1993年24歲時(shí),日子非常不錯(cuò),在忠孝東路有900平米的辦公樓,銷(xiāo)售房地產(chǎn),遇到事業(yè)瓶頸,因?yàn)闊o(wú)法copy銷(xiāo)售模式,好象個(gè) 人打拼一樣,沒(méi)有未來(lái)愿景。而會(huì)**的人都有一套模式。象麥當(dāng)勞,只要按照他的這套模式,copy一下,就能賺很多很多的錢(qián),或者有一套模式讓下屬 ALONG依循就可以賺錢(qián)了。必須要有一個(gè)KNOW HOW歷史學(xué)家分析說(shuō),日本之所以會(huì)成功是因?yàn)槊髦尉S新和大化革新。所以學(xué)會(huì)**比現(xiàn)在**更重要。
    (2)、 底子比面子更重要,收入比頭銜更重要,實(shí)務(wù)經(jīng)驗(yàn)比虛名更重要,識(shí)時(shí)務(wù)者為俊杰??吹玫降慕Y(jié)果比幻想的未來(lái)更重要。幻想的未來(lái)是假的。怎樣銷(xiāo)售?說(shuō)服?怎樣 賣(mài)東西?賣(mài)咖啡是在賣(mài)感覺(jué),賣(mài)那種走在咖啡廳外面就問(wèn)到濃濃的香味,進(jìn)去之后看到那些擺設(shè)和文化氣息,賣(mài)咖啡是在賣(mài)文化。說(shuō)的是星巴克咖啡廳。
    其 次要找個(gè)好的伴侶。他說(shuō)他娶了一個(gè)好老婆。你要做應(yīng)該做的事而不是你喜歡做的事情。我老婆很會(huì)欣賞我的優(yōu)點(diǎn),很會(huì)崇拜我看你的眼神就讓你找到自信。 演講后會(huì)很正面的評(píng)價(jià)我沒(méi)有人不喜歡贊美,人的肯定來(lái)自于很多人的肯定,你想要?jiǎng)e人贊美你你也要去贊美別人。我老婆的優(yōu)點(diǎn)就是會(huì)鼓勵(lì)、贊美、肯定和欣賞我 同時(shí)她是節(jié)省的女人。失敗的婚姻會(huì)讓人處于低潮,所以選老婆要選能助夫蔭子的人。不要找一個(gè)勉強(qiáng)的老婆(老公),這種婚姻是不會(huì)幸福的,他(或者她)絕對(duì) 會(huì)帶給你人生的負(fù)面的東西。你所愛(ài)的人,你要感覺(jué)到他(她)也很愛(ài)你。她愛(ài)你的程度甚于你或至少與你相當(dāng)。你也許只是so so喜歡她,她卻要very much喜歡你,不要找自己一相情愿喜歡的女人,否則你不會(huì)高枕無(wú)憂(yōu)。
    再次,關(guān)鍵是要激發(fā)潛能,忠于原主。他自己的例子。95年,他的原來(lái)的老 板,議員落選,新聞傳媒的消息,造成很多負(fù)面的影響,屬下的61家中60家都眾叛親離,只有王宗立他沒(méi)有,因?yàn)樗f(shuō)他實(shí)在找不出更好的理由離開(kāi),經(jīng)營(yíng)狀況 很不錯(cuò), 使那個(gè)老板很感動(dòng),要他立即承諾如果能馬上開(kāi)出12張支票共計(jì) 7.2億的單子,將給非常優(yōu)厚的利潤(rùn),……
    這樣呢,他說(shuō)人生就是算和賭,他覺(jué)得自己算準(zhǔn)了,雖然心理也不是非常有把握,但覺(jué)得非常值得賭一把,這樣他的財(cái)富一下由千萬(wàn)富翁變成億萬(wàn)富翁。那段時(shí)間的壓力非常大,但是,要?jiǎng)?chuàng)造壓力,享受壓力。這樣才能成功!
    11、均衡式的發(fā)展。訓(xùn)練很貴,不訓(xùn)練更貴。
    12、 改變命運(yùn)很重要的三個(gè)關(guān)鍵。其中之一是選擇好的老師非常重要。眾人生死全看你,力挽狂瀾只一人。要想人前顯貴,必先人后受罪。霸王別姬,甘之如飴。少年得 志大不幸。樂(lè)極生悲。5000年來(lái)的魔咒。驕傲就會(huì)停止學(xué)習(xí),要高而不危。每個(gè)人都有4張A,只是有些人幸運(yùn)早翻到而已,而道路很漫長(zhǎng),要時(shí)常停下來(lái)思 考,不要跨太大的步驟,地雷。他作過(guò)3個(gè)重要的決策。良師有很多包括負(fù)面的,要從負(fù)面的東西看到學(xué)習(xí)到,從失敗的人的經(jīng)歷里也能學(xué)習(xí)到很多東西,意見(jiàn)值多 少錢(qián)?不可限量。衷心的勸告。人不會(huì)永遠(yuǎn)都有好運(yùn)氣。
    齊恒公,管仲,好酒會(huì)使寡人亡國(guó)嗎,好色會(huì)使寡人亡國(guó)嗎,好郊游會(huì)使寡人亡國(guó)嗎,管仲說(shuō)都不會(huì),只有遠(yuǎn)賢臣近小人才會(huì)使你亡國(guó)。
    13、要心懷一顆感恩的心。
    14、怎么系統(tǒng)運(yùn)用潛意識(shí)?馬修史維的方法。
    15、 歐那西斯的方法??吹饺魏稳?,經(jīng)歷任何事,每天晚上用本子記下。以決定下一次怎樣花時(shí)間在他身上。這個(gè)不象學(xué)校教的有教無(wú)類(lèi),不能以貌取人,而真理是 say no,懂得拒絕。待人處世一定要因人而異,要學(xué)會(huì)拒絕否則會(huì)浪費(fèi)時(shí)間,要交你應(yīng)該交的朋友而不是你喜歡交的朋友。
    歐那西斯說(shuō),要成功需要盟友,要非常大的成功就需要敵人,戰(zhàn)友??滴蹙慈刖疲谌窍蛩臄橙司吹?。他說(shuō)如果沒(méi)有這些人,就不會(huì)成就的大事業(yè)。所以說(shuō)益友可能是競(jìng)爭(zhēng)對(duì)手,要學(xué)會(huì)向競(jìng)爭(zhēng)對(duì)手學(xué)習(xí)很多的東西。
    16、功課不重要,一定要靈活。因?yàn)榻浑H手腕高的人會(huì)更成功。
    17、 如何分辨朋友,選擇朋友?選擇戰(zhàn)友,選擇敵人?如何選擇環(huán)境,創(chuàng)造環(huán)境?他講了他的三個(gè)女朋友。第一個(gè)非常愛(ài)玩,第二個(gè)非常情緒化,多愁善感,負(fù)面的情緒 非常多的人。第三個(gè)女朋友是說(shuō)相信他會(huì)大富大貴,有非凡前途的人。崇拜,鼓勵(lì),相信他的人。我相信我就能看見(jiàn)18、會(huì)學(xué)習(xí)比肯學(xué)習(xí)愿意學(xué)習(xí)來(lái)得更重要。前 車(chē)之鑒,后車(chē)之履。要試著去教別人你想要學(xué)的東西。
    19、每一個(gè)決定不是離成功越來(lái)越遠(yuǎn)就是離成功越來(lái)越近。思想決定態(tài)度,態(tài)度決定語(yǔ)言,語(yǔ)言決定行為,行為養(yǎng)成習(xí)慣,習(xí)慣形成性格,性格決定命運(yùn)。
    20、苦并不可怕,怕就怕苦得沒(méi)有代價(jià)。
    21、如何做領(lǐng)導(dǎo)統(tǒng)御?科學(xué)家是把簡(jiǎn)單的東西復(fù)雜化,企業(yè)家是把復(fù)雜的東西簡(jiǎn)單化。管理團(tuán)隊(duì)就是連鎖人,大量copy,東方不敗的葵花寶典,木蘭詩(shī)背下來(lái),銷(xiāo)售房地產(chǎn)的腳本交戰(zhàn)手冊(cè),實(shí)戰(zhàn)手冊(cè)。
    領(lǐng)導(dǎo)統(tǒng)御的秘訣——四句話(huà),開(kāi)發(fā),復(fù)制,管理,交換。
    開(kāi)發(fā)客戶(hù),公司來(lái)做,教業(yè)務(wù)員去做。復(fù)制:讓每一個(gè)人都會(huì)做。管理:統(tǒng)一的去管理,團(tuán)隊(duì)成功。一個(gè)企業(yè)里有三種人,攻城者,開(kāi)疆辟域。守城者,守天下。教練者,教育部長(zhǎng),復(fù)制的工作。管理就是整合不同類(lèi)型的人。交換就是資源共享,集體學(xué)習(xí),絕不否認(rèn)每一個(gè)個(gè)體的價(jià)值。
    22、如何選項(xiàng)目?要看適合不適合你。你的核心專(zhuān)長(zhǎng),核心競(jìng)爭(zhēng)力是什么?
    怎樣融資?借錢(qián)?銀行的錢(qián)是借給有錢(qián)的人而不是需要錢(qián)的人。天上下雨地上滑,自己跌倒自己爬。所以你要塑造自己被利用的價(jià)值,你的可被利用的價(jià)值是什么?保——呆人。
    23、 如何管理好人才?識(shí)才,留才,養(yǎng)才,用才。識(shí)才——不要找一個(gè)完美無(wú)缺的人,沒(méi)有這種人。留才——心靜而后定,心定而后安,心安而后求知求財(cái)。養(yǎng)才——舍 得對(duì)你的員工投資,投資!把員工當(dāng)作你的資產(chǎn)。員工是最寶貴的資產(chǎn),人是無(wú)價(jià)之寶。外國(guó)企業(yè)平均花3-5%去培訓(xùn)他的員工,而中國(guó)的企業(yè)平均只花 0.03 -0.05%用來(lái)培訓(xùn)員工。用才——就是要把人才擺在適當(dāng)?shù)奈恢谩?br /> 24、不管做什么都要有銷(xiāo)售通路。
    25、任何企業(yè)都有窮人,成功的企業(yè)家不應(yīng)該停止不前。
    26、行善與行孝——這是人生的兩件不能等待的事情。
    27、為什么要成功比怎樣成功更重要!!!
    28、世界上沒(méi)有笨人,笨人都是罵出來(lái)的。所以一個(gè)贊美鼓勵(lì)的家庭很重要。
    如何選擇環(huán)境?一等人創(chuàng)造環(huán)境,二等人跟隨環(huán)境,三等人抱怨環(huán)境。要輸入正面積極的關(guān)于環(huán)境的潛意識(shí)信息。所有與我有關(guān)的一切都必將欣欣向榮,不論白天與夜晚,所有與我有關(guān)的一切都必將欣欣向榮。用潛意識(shí)營(yíng)造一個(gè)積極的環(huán)境,一個(gè)特別的know how.
    每一天都有86400秒,如果你把每天的86400秒換算成86400塊錢(qián),如果沒(méi)有用掉的話(huà),會(huì)蒸發(fā)掉的,你會(huì)不會(huì)珍惜這些時(shí)間?王永慶一分鐘賺6萬(wàn)塊。年齡不能代表一切。激發(fā)潛能既是有效運(yùn)用時(shí)間的最佳方法。安東尼羅賓說(shuō)你每分每秒都要做最有生產(chǎn)力的事情。
    29、我使用人才的方法是,他有10分才能,不會(huì)給他7分的活,而要相反,這樣才能激發(fā)他的潛能。
    30、一日之計(jì)在于昨晚。做最重要的事情。所謂的最重要的事情是指非自己親自出馬不可的事情,要思考3次,不要去做那些僅僅是因?yàn)樽约合矚g做的事情。每天晚上安排6件重要的事情。締造高度的壓力。辛苦不可怕,關(guān)鍵是辛苦要值得。要?jiǎng)?chuàng)造壓力并享受壓力。
    31、每周一星。稀有性,不可替代性。
    32、學(xué)習(xí)催眠最重要的方法是as if(假裝)。
    33、 一個(gè)人與自己人性對(duì)抗的力量越強(qiáng)就越能取得成功。晚起床,熬夜,吃宵夜,吸煙等都是壞習(xí)慣。一定要養(yǎng)成運(yùn)動(dòng)的好習(xí)慣。慢跑或游泳都很好。會(huì)讓你兩眼炯炯有 神。使你每天都是熱情效益有力量的一天。每天起床之后對(duì)自己說(shuō):生命多美好暗示性的語(yǔ)言:我喜歡健康,我喜歡保持優(yōu)美的身材,我知道我追求成功……34、 當(dāng)你有足夠的理由,你就會(huì)作出不可思議的事情。每個(gè)人都要自問(wèn):我現(xiàn)在為了自己成功的人生,可以作出什么樣的決定?
    35、人才最難找!
    36、四到——知道、悟到、做到、得到。
    37、要做那些危險(xiǎn)而享受的事情。紅色代表賺錢(qián)、競(jìng)爭(zhēng)、占有欲和掌控性。蘭色代表人群、party、放松等等。綠色代表證據(jù)、數(shù)據(jù)、精確性。黃色代表使命感、義工、幫助人。
    38、學(xué)習(xí)——為自己,為身邊的人,為千千萬(wàn)萬(wàn)。
    39、你為什么能賺10萬(wàn)美金?原因有三個(gè)。第一是你的習(xí)慣讓你的收入沒(méi)辦法提升。包括決策的習(xí)慣、時(shí)間管理的習(xí)慣等等。第二是你所交的朋友,要交比你強(qiáng)的人。第三提升你核心圈的人的品質(zhì)如你管理的團(tuán)隊(duì)的品質(zhì)。
    40、知道不夠多,復(fù)習(xí)很重要。學(xué)習(xí)的秘訣在于所謂的六圈哲學(xué):100%——50%——25%——12%——6%——3%,任何人不能成功是因?yàn)闆](méi)人跟100%的人學(xué)習(xí)。所以我們要盡量的跟100%的人學(xué)習(xí),跟最優(yōu)秀的學(xué)習(xí)。接近那個(gè)100%的人。
    41、臺(tái)基集團(tuán)的企業(yè)文化——孝順,感恩,存錢(qián),競(jìng)爭(zhēng)。早會(huì),演講競(jìng)賽,每日一星。歐那西斯說(shuō)一個(gè)人要獲得巨大的成功必須有敵人,需要競(jìng)爭(zhēng)才行。
    42、成功的法則是拿來(lái)記住的。
    43、教育訓(xùn)練者是使命傳播者。
    44、 人不可能永遠(yuǎn)處在顛峰狀態(tài),那么怎樣克服低潮沮喪和消極的心態(tài)呢?當(dāng)你遇到挑戰(zhàn)時(shí),你要想你是在高速飛行,從而才會(huì)遇到不可或缺的空氣的阻力,從南京到北 京,你盡可以走路慢悠悠的走去,那樣不會(huì)遇到象飛機(jī)高速飛行一樣遇到的阻力,但是你的速度很慢很慢??峙乱ò肽陼r(shí)間才能到達(dá)目的地。
    45、不遭人忌是庸才。
    46、 好的環(huán)境是鼓風(fēng)爐。POWER能量。當(dāng)你走出去,你會(huì)遇到挑戰(zhàn),你會(huì)遇到拒絕,會(huì)有潑冷水的,雖然你開(kāi)始還象720度的燒得通紅的木炭,但一遇到冷水又會(huì) 逐漸降溫。只有你內(nèi)心的力量使你自己變成一個(gè)鼓風(fēng)爐,你才又會(huì)慢慢升溫到100度,200度,300度,500度,最后又達(dá)到甚至750度的火紅的木炭。 你應(yīng)該如何作到這一點(diǎn)呢???你要一遇到這些挑戰(zhàn),一遇到沮喪的時(shí)候,你要馬上在心中說(shuō),I AM& nbspFIRE ,你犧牲了自己,照亮了別人。你想別人贊美,就要贊美別人,你想別人鼓勵(lì),就要鼓勵(lì)別人,你想別人幫助,就幫助別人。
    47、心理學(xué)家的實(shí)驗(yàn)。一只 狗,被窮追,不斷的被追,直到倒在地上,嘴冒白沫,然后抽取其血液,有疲勞毒素在里面,用這些毒素注射在一只剛吃飽的活蹦亂跳的狼狗身上,立即要昏昏欲 睡,為什么?因?yàn)檠嚎偸菚?huì)疲勞的。人有兩個(gè)器官是永遠(yuǎn)不會(huì)痛的,一個(gè)是頭發(fā)和指甲另一個(gè)是肝臟,如果肝臟會(huì)痛這人肯定完了。
    48、惟有堅(jiān)持百忍,才能無(wú)所不能。
    49、 天下有兩難,登天難求人更難;世間有兩苦,黃連苦,貧窮更苦;世上有兩險(xiǎn),江湖險(xiǎn)人心更險(xiǎn)。所以要做最壞的打算。水能載舟亦能覆舟。一切都要能看得開(kāi),只 有你自己不會(huì)背叛你自己,所以要投資你自己。你要愛(ài)你自己,要愛(ài)跟你有血緣關(guān)系的親人。世上還有兩薄:春冰薄,人情更保所以要塑造自己永不被替代的價(jià)值, 永遠(yuǎn)被利用的價(jià)值。不要怪別人背叛你,你要怪自己沒(méi)有創(chuàng)造自己被利用的環(huán)境。但你真的要堅(jiān)持百忍才能立于不敗之地,才能無(wú)所不能……處于低潮時(shí),我會(huì)想, 如果是王永慶他會(huì)怎么做?知其難,忍其苦,測(cè)其險(xiǎn),耐其薄,可處世也。
    50、感恩,精進(jìn),嚴(yán)謹(jǐn)。
    51、記住別人任何的壓力都不會(huì)壓跨你,只有自己的壓力會(huì)毀滅你自己。你要自己去調(diào)試自己的心靈。方法中,音樂(lè)電影的方法對(duì)于調(diào)試的幫助很大。用音樂(lè)治療自己的痛苦。
    52、人一定要克服自己的沮喪。
    53、沒(méi)有不景氣,只有不爭(zhēng)氣。巧克力精神——巧妙地克服阻力。
    54、OPT與OPM——運(yùn)用別人的時(shí)間與金錢(qián)。
    55、 王宗立的座右銘有三條。1、在生命的歷程中要告訴自己,軟弱的是時(shí)候要堅(jiān)強(qiáng),恐懼的是時(shí)候要勇敢,迷惑的時(shí)候要明智,抓不住的時(shí)候就要放手,真正的勝利是 活在自己的心中。2、冷靜地面對(duì)一切問(wèn)題,積極不斷地超越自我,惜福永不消極怠惰,活在當(dāng)下就是最美。3、上帝賜給我鎮(zhèn)定和沉著,讓我接受不可改變的事 情;上帝賜給我勇氣和力量,讓我改變我有能力改變的事情;上帝賜給我智慧,讓我去分辨哪些事情是我有能力改變的,哪些事情是我無(wú)法改變的。
    56、為什么要冷靜?做業(yè)務(wù)很辛苦的,要很善于處理危機(jī)的。
    57、做業(yè)務(wù)的三大法寶——走出去,說(shuō)出來(lái),把錢(qián)收回來(lái)。
    58、可憐之人必有可恨之處。
    59、什么是大智慧,就是怎樣運(yùn)用心靈的智慧,心靈的力量。哀莫大于心死。大部分人都會(huì)很沮喪。
    60、寒冰不能斷流水,枯木也能再逢春。
    61、要善于運(yùn)用心靈的力量。有了它,跌倒了再爬起來(lái),失敗了再成功。
    62、羅伯特清崎的投資理財(cái),四象限理論。E,S,B,I.窮爸爸——公家機(jī)關(guān),最講排場(chǎng),請(qǐng)最多人,花最多的錢(qián),講氣派。富爸爸——企業(yè),私人企業(yè)。企業(yè)是花最少的錢(qián)要?jiǎng)?chuàng)造最大的效益,沒(méi)有獲利的企業(yè)是最大的罪惡。因?yàn)闆](méi)有獲利的企業(yè)會(huì)造成很多問(wèn)題家庭。
    63、并不是讀書(shū)讀得很多就會(huì)很有錢(qián)。
    64、 過(guò)安定的生活有兩種辦法一種是在30歲之前賺了足夠的錢(qián),比如說(shuō)30個(gè)億,然后把這些錢(qián)放在銀行,投資基金等。第二種是永遠(yuǎn)不要冒險(xiǎn),安心做一個(gè)雇員, 有職業(yè)保障但是真的有職業(yè)保障嗎?沒(méi)有?。?!那些所謂的有職業(yè)保障的人只不過(guò)是在做錢(qián)的黑奴。你是否一輩子在為錢(qián)做奴隸。為錢(qián)而工作?
    65、你是為生活而工作還是為工作而生活?如果你認(rèn)為你的工作是享受,那么你就是在為工作而生活,否則的話(huà),你是在為生活而工作。你要為了生活而工作?NO!
    66、你所擁有的就是最好的。只要是你的就是最好的。
    67、S象限里是自由職業(yè)者。是做業(yè)務(wù),賺獎(jiǎng)金收入的人。剛開(kāi)始時(shí)建立通路。
    王想建立的事業(yè)。把消費(fèi)者變成銷(xiāo)售者,把銷(xiāo)售者變成領(lǐng)導(dǎo)者,管理者。如果不會(huì)銷(xiāo)售就不會(huì)賺錢(qián)。
    68、怎樣學(xué)會(huì)銷(xiāo)售?走出去,說(shuō)出來(lái),把錢(qián)收回來(lái)。
    69、銷(xiāo)售的重點(diǎn)是開(kāi)發(fā)客戶(hù),締結(jié)業(yè)務(wù)。這就需要1、專(zhuān)業(yè)知識(shí),關(guān)于產(chǎn)品和服務(wù)的知識(shí)。2、要知道顧客購(gòu)買(mǎi)我的產(chǎn)品的至少5大理由?把這些理由背得很熟很熟。3、要提供證據(jù),提供見(jiàn)證者。4、要知道CLOSE的技巧。敢于幫助別人下決定。
    70、客戶(hù)說(shuō)NO是很正常的,業(yè)務(wù)最大的困難在于膽量,接下來(lái)的開(kāi)場(chǎng)白,產(chǎn)品介紹等等等。萬(wàn)般草木皆兵器,資源,看到人在走路就如同錢(qián)在向你招手。
    71、B,利用別人的時(shí)間來(lái)幫你賺錢(qián)。人有四種,消費(fèi)者——銷(xiāo)售者——管理者——領(lǐng)導(dǎo)者。銷(xiāo)售者是說(shuō)明教育幫助顧客下決定的人。領(lǐng)導(dǎo)者是解說(shuō)者。
    72、怎樣說(shuō)服顧客,當(dāng)你把產(chǎn)品形容得并使客戶(hù)相信使得客戶(hù)認(rèn)為價(jià)值超過(guò)價(jià)格時(shí),就成交了。價(jià)值超過(guò)價(jià)格就不貴。
    73、要立大志才能做大事。領(lǐng)導(dǎo)者就是說(shuō)服,說(shuō)明,教育,幫助別人下決定的人。
    74、 I象限的人,是投資者資本家。利用錢(qián)來(lái)賺錢(qián)的人。投資致富法則,沃倫巴菲特的秘訣——第一個(gè)法則,絕對(duì)不能賠錢(qián)。就是說(shuō)不能在股票價(jià)格低于你當(dāng)初的買(mǎi)入價(jià) 時(shí)拋出。一定要等最好的時(shí)機(jī)。逆向思考法則。沒(méi)有投資智慧,只有理財(cái)EQ.那么怎么作到處變不驚?少賠就好。第二條,絕對(duì)不要忘記第一個(gè)法則。切記切記切 記!
    75、世界上最恐怖的力量是復(fù)利。世界上沒(méi)有聰明不聰明之分,只有懂與不懂。
    76、如何增加人生效率?
    77、一定不能滿(mǎn)足于現(xiàn)狀,要巨觀(guān)而不是微觀(guān)。
    78、老板發(fā)現(xiàn)員工剽竊了他的智慧,資產(chǎn)等時(shí)怎么辦?他不要想不開(kāi),你也可以挖別的企業(yè)的人才。網(wǎng)羅別人的員工,學(xué)習(xí)別人的智慧。創(chuàng)造你公司的不可被替代性。對(duì)于夫妻來(lái)說(shuō)也是如此,要?jiǎng)?chuàng)造你在你老婆(老公)心目中不可被替代性。而不是一雙玉臂錢(qián)人枕,半點(diǎn)朱唇萬(wàn)人嘗。
    79、人生最痛苦的事情莫過(guò)于開(kāi)創(chuàng)和從低潮走向高潮。調(diào)整的方法是不要鉆牛角尖,而是用另外一個(gè)來(lái)代替。用催眠錄音帶,馬修史維的方法。
    80、放松,放松,毫不批判的接受成功者的指令。
    81、 時(shí)間管理,成功者成功的原因之一就是很會(huì)管理時(shí)間。把事情分為四類(lèi),A——很重要又很急的,B——很重要但不很急,如運(yùn)動(dòng),健康檢查,看書(shū)學(xué)習(xí),上課等, C——很急但不重要,因人而異,如女朋友要我下班接她等等。這些也許可以要?jiǎng)e人去替你做。D——既不著急也不重要。關(guān)鍵點(diǎn)是如何區(qū)分B和C類(lèi)的事情。急或 重要是針對(duì)目標(biāo)和價(jià)值觀(guān)而言的。把第二天自己要做的事情6大項(xiàng),在每晚做好計(jì)劃。王宗立做中層管理者一般有以下6大件事情:1、召集員工激勵(lì)員工。2、邀 約一組客戶(hù),去拜訪(fǎng)說(shuō)服,如果沒(méi)有至少要去做問(wèn)卷調(diào)查一組CASE.3、幫助我的干部CLOSE一個(gè)客戶(hù)。4、幫助我的干部救一個(gè)客戶(hù)。救要退貨的。5、 有些情緒不好的員工要鼓勵(lì)激發(fā)他。6、在公司親自演示一個(gè)產(chǎn)品說(shuō)明會(huì)。培訓(xùn)示范作用。身系公司生死一線(xiàn)之間。
    82、如果一天做6件重要的事,那么一個(gè)月就能做180件重要的事情,一年能做2190件事情,你能不成功嗎?
    83、養(yǎng)成兩個(gè)習(xí)慣。準(zhǔn)備好兩個(gè)小本子,一個(gè)專(zhuān)門(mén)用于記那些你當(dāng)天你遇到的人,和事情。另一個(gè)用于記你明天要做的6件事情。
    84、一點(diǎn)總比沒(méi)有好,晚做總比不做好。要做最重要的事情。
    85、 關(guān)于時(shí)間管理的,是安東尼羅賓的老師亞伯拉罕的課程。人有三種時(shí)間:Focus day焦點(diǎn)日,專(zhuān)門(mén)用于處理與實(shí)現(xiàn)最重要的目標(biāo)有關(guān)的事情。在焦點(diǎn)日不做任何事除了最重要的事情之外。Buffer day:準(zhǔn)備日:不怕沒(méi)有機(jī)會(huì),就怕沒(méi)有準(zhǔn)備。準(zhǔn)備日是比如說(shuō)去上課,去培訓(xùn),去交一些朋友。等等。不是去締結(jié)業(yè)務(wù)去收錢(qián),但是去做之前的準(zhǔn)備工作。 Free& nbspday:自由日,休息,與家人在一起。獎(jiǎng)勵(lì),平衡等。
    86、人有四種,人物,人才,人手,人渣。
    87、全天下最長(zhǎng)的距離是別人的錢(qián)包到你的錢(qián)包的距離。
    88、馬修史維:只要是正面的,有力量的對(duì)你有幫助的,那么DO IT NOW!
    89、行善行孝感恩這三件事情都不能等,不然就沒(méi)有機(jī)會(huì)了。
    90、當(dāng)別人潑你冷水時(shí),輕視你,嘲笑你,侮辱你,打擊你,為難你時(shí),你不但不要罵他,責(zé)怪他,相反你要感謝他,因?yàn)樗粌H在你沮喪時(shí),在你的油箱里加滿(mǎn)了油,讓你一路勇往直前沖到底。
    91、凡事沒(méi)有任何意義,除非你賦予它定義。
    92、人人都不是在推銷(xiāo)產(chǎn)品,而是在推銷(xiāo)自己。
    93、投資大腦,回報(bào)率最高。
    94、完美主義會(huì)殺人。不要等準(zhǔn)備好了再說(shuō),差不多就要去做。完美主義會(huì)打斷習(xí)慣。凡事最怕開(kāi)頭,有了開(kāi)頭就會(huì)繼續(xù),有繼續(xù)就會(huì)養(yǎng)成習(xí)慣,習(xí)慣就會(huì)成自然,自然就是美。
    95、相信就會(huì)看見(jiàn)。一般人是看見(jiàn)了才相信。所以信念很重要。
    96、人無(wú)法成功的原因只有兩個(gè):懶惰和懼怕。人有三大最怕:火,高處往下跳,在公眾面前演講。
    97、不要自己掙不到錢(qián),就希望別人也破產(chǎn)。要?jiǎng)?chuàng)造好的環(huán)境,要做正面的暗示:無(wú)論白天與夜晚,所有與我有關(guān)的一切都必將欣欣向榮。
    98、一等人創(chuàng)造環(huán)境,二等人跟隨環(huán)境,三等人抱怨環(huán)境。
    99、如果你有足夠的理由,當(dāng)你遇到令你興奮得發(fā)抖的機(jī)會(huì),你體內(nèi)的火山就會(huì)自動(dòng)爆發(fā),你心靈的巨人就會(huì)被喚醒。
    100、凡事皆正面,能量永不減。

    posted @ 2009-08-24 21:45 石頭@ 閱讀(255) | 評(píng)論 (0)編輯 收藏

    經(jīng)典開(kāi)源項(xiàng)目集

    操作系統(tǒng)

    Linux

    項(xiàng)目主頁(yè):http://www.linux.org/

    數(shù)據(jù)庫(kù)

    MySQL

    項(xiàng)目主頁(yè):http://www.mysql.org/

    HSQLDB(Hypersonic SQL)

    項(xiàng)目主頁(yè):http://hsqldb.sourceforge.net/

    Apache Derby

    項(xiàng)目主頁(yè):http://db.apache.org/derby/

    Excel JDBC Driver

    項(xiàng)目主頁(yè):http://nilostep.com

    Web開(kāi)發(fā)框架

    WebWork

    WebWork是由OpenSymphony組織開(kāi)發(fā)的,致力于組件化和代碼重用的拉出式MVC模式J2EE Web框架。

    項(xiàng)目主頁(yè):http://opensymphony.com/webwork/

    Struts

    Struts是一個(gè)基于Sun J2EE平臺(tái)的MVC框架,主要是采用Servlet和JSP技術(shù)來(lái)實(shí)現(xiàn)的。

    項(xiàng)目主頁(yè):http://struts.apache.org/

    Spring MVC

    Spring MVC是結(jié)構(gòu)最清晰的MVC Model 2實(shí)現(xiàn)

    項(xiàng)目主頁(yè):http://www.springframework.org/

    EasyJWeb

    EasyJWeb是基于java技術(shù),應(yīng)用于WEB應(yīng)用程序快速開(kāi)發(fā)的MVC框架,框架設(shè)計(jì)構(gòu)思來(lái)源于國(guó)內(nèi)眾多項(xiàng)目實(shí)踐,框架充分借簽了當(dāng)前主要流 行的開(kāi)源Web框架(Struts、JSF、Tapestry 、Webwork),吸取了其優(yōu)點(diǎn)及精華,利用Velocity作為模板頁(yè)面引擎,是一個(gè)實(shí)現(xiàn)了頁(yè)面及代碼完全分離的MVC開(kāi)發(fā)框架。是一個(gè)能實(shí)現(xiàn)中小型 Web應(yīng)用系統(tǒng)快速開(kāi)發(fā)的簡(jiǎn)易Web框架。

    項(xiàng)目主頁(yè):http://www.easyjf.com/easyjweb/

    JavaServer(TM) Faces(JSF)

    JavaServer(TM) Faces技術(shù)簡(jiǎn)化了JavaServer應(yīng)用程序用戶(hù)界面的開(kāi)發(fā).各種技術(shù)水平的開(kāi)發(fā)者都能夠快速創(chuàng)建web應(yīng)用程序通過(guò)在一個(gè)頁(yè)面中裝配一些可重復(fù)使 用UI組件;并可把這些組件與應(yīng)用程序的數(shù)據(jù)源連接起來(lái);也可把客戶(hù)端產(chǎn)生的事件與服務(wù)端事件處理者連接起來(lái).這個(gè)項(xiàng)目是Sun對(duì)JSF技術(shù)規(guī)范的最完整 實(shí)現(xiàn)。

    項(xiàng)目主頁(yè):https://javaserverfaces.dev.java.net/

    OpenBlueLab

    OpenBlueLab是一個(gè)用于構(gòu)建Web2.0 Portal系統(tǒng)的快速開(kāi)發(fā)框架。其主頁(yè)就是采用該框架開(kāi)發(fā)的一個(gè)Demo。Portal布局可以通過(guò)UI進(jìn)行配置。Widget將自動(dòng)組裝,在運(yùn)行期不 需要編寫(xiě)任何數(shù)據(jù)庫(kù)交互代碼就能夠使它們自動(dòng)實(shí)現(xiàn)數(shù)據(jù)感知?;贏(yíng)jax與HTML的form也將從XML widget定義自動(dòng)構(gòu)建。XML widget定義可以從描述信息系統(tǒng)設(shè)計(jì)的UML模型快速生成。這個(gè)框架讓你只需關(guān)注信息系統(tǒng)的設(shè)計(jì),而form和portal的系統(tǒng)架構(gòu)將自動(dòng)生成。

    項(xiàng)目主頁(yè):http://www.openbluelab.org/

    JSP標(biāo)簽

    Displytag

    項(xiàng)目主頁(yè):http://displaytag.sourceforge.net/11/

    AJAX框架

    DWR

    項(xiàng)目主頁(yè):http://www.getahead.ltd.uk/dwr/

    應(yīng)用服務(wù)器

    Jakarta Tomcat

    項(xiàng)目主頁(yè):http://jakarta.apache.org/tomcat/index.html

    JBoss

    項(xiàng)目主頁(yè):http://www.jboss.org

    GlassFish

    項(xiàng)目主頁(yè):https://glassfish.dev.java.net/

    Caucho Resin

    項(xiàng)目主頁(yè):http://www.caucho.com/

    Java開(kāi)發(fā)工具

    Eclipse

    項(xiàng)目主頁(yè):http://www.eclipse.org

    NetBeans

    項(xiàng)目主頁(yè):http://www.netbeans.org

    EasyEclipse

    項(xiàng)目主頁(yè):http://www.easyeclipse.org/

    Jedit

    項(xiàng)目主頁(yè):http://www.jedit.org/

    UML建模工具

    ArgoUML

    項(xiàng)目主頁(yè):http://argouml.tigris.org/

    Alma

    項(xiàng)目主頁(yè):http://www.memoire.com/guillaume-desnoix/alma/

    源碼管理工具

    SVNKit

    項(xiàng)目主頁(yè):http://svnkit.com/

    JCVS

    項(xiàng)目主頁(yè):http://www.jcvs.org/

    JSVN

    項(xiàng)目主頁(yè):http://www.alternatecomputing.com/jsvn/index.php3

    團(tuán)隊(duì)協(xié)作工具

    Mindquarry

    項(xiàng)目主頁(yè):http://www.mindquarry.com/

    Java Enterprise TeamWork

    項(xiàng)目主頁(yè):http://jeteam.sourceforge.net/

    Coefficient

    項(xiàng)目主頁(yè):http://coefficient.sourceforge.net/

    Open-Xchange

    項(xiàng)目主頁(yè):http://mirror.open-xchange.org/ox/EN/community/

    項(xiàng)目管理工具

    Memoranda

    項(xiàng)目主頁(yè):http://memoranda.sourceforge.net/

    Open Workbench

    項(xiàng)目主頁(yè):http://www.openworkbench.org/

    Onepoint Project

    項(xiàng)目主頁(yè):http://www.onepoint.at/?action=setLanguage&language=en

    OpenProj

    項(xiàng)目主頁(yè):http://sourceforge.net/projects/openproj

    Project

    項(xiàng)目主頁(yè):http://www.project.net/

    發(fā)布打包工具

    JSmooth

    項(xiàng)目主頁(yè):http://jsmooth.sourceforge.net/

    Launch4j

    項(xiàng)目主頁(yè):http://launch4j.sourceforge.net

    VAInstall

    項(xiàng)目主頁(yè):http://vainstall.sourceforge.net/


    摘自:http://hi.baidu.com/computertao/blog/item/b06285335a45f8fc1a4cff6d.html

    posted @ 2009-08-21 19:21 石頭@ 閱讀(1118) | 評(píng)論 (0)編輯 收藏

    做java最起碼掌握的十項(xiàng)技術(shù)

    一個(gè)Java程序員應(yīng)該掌握的10項(xiàng)技能

    1、語(yǔ)法:必須比較熟悉,在寫(xiě)代碼的時(shí)候IDE的編輯器對(duì)某一行報(bào)錯(cuò)應(yīng)該能夠根據(jù)報(bào)錯(cuò)信息知道是什么樣的語(yǔ)法錯(cuò)誤并且知道任何修正。
    2、命令:必須熟悉JDK帶的一些常用命令及其常用選項(xiàng),命令至少需要熟悉:appletviewer、 HtmlConverter、jar、 java、javac、javadoc、javap、javaw、native2ascii、serialver,如果這些命令你沒(méi)有全部使用過(guò),那么你 對(duì)java實(shí)際上還很不了解。
    3、工具:必須至少熟練使用一種IDE的開(kāi)發(fā)工具,例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括進(jìn)行工程管理、常用選項(xiàng)的設(shè)置、插件的安裝配置以及進(jìn)行調(diào)試。
    4、API:Java的核心API是非常龐大的,但是有一些內(nèi)容筆者認(rèn)為是必須熟悉的,否則不可能熟練的運(yùn)用Java,包括:
    ◆java.lang包下的80%以上的類(lèi)的功能的靈活運(yùn)用。
    ◆java.util包下的80%以上的類(lèi)的靈活運(yùn)用,特別是集合類(lèi)體系、規(guī)則表達(dá)式、zip、以及時(shí)間、隨機(jī)數(shù)、屬性、資源和Timer.
    ◆java.io包下的60%以上的類(lèi)的使用,理解IO體系的基于管道模型的設(shè)計(jì)思路以及常用IO類(lèi)的特性和使用場(chǎng)合。
    ◆java.math包下的100%的內(nèi)容。
    ◆java.net包下的60%以上的內(nèi)容,對(duì)各個(gè)類(lèi)的功能比較熟悉。
    ◆java.text包下的60%以上的內(nèi)容,特別是各種格式化類(lèi)。
    ◆熟練運(yùn)用JDBC. 8)、java.security包下40%以上的內(nèi)容,如果對(duì)于安全沒(méi)有接觸的話(huà)根本就不可能掌握java.
    ◆AWT的基本內(nèi)容,包括各種組件事件、監(jiān)聽(tīng)器、布局管理器、常用組件、打印。
    ◆Swing的基本內(nèi)容,和AWT的要求類(lèi)似。
    ◆XML處理,熟悉SAX、DOM以及JDOM的優(yōu)缺點(diǎn)并且能夠使用其中的一種完成XML的解析及內(nèi)容處理。
    5、測(cè)試:必須熟悉使用junit編寫(xiě)測(cè)試用例完成代碼的自動(dòng)測(cè)試。
    6、管理:必須熟悉使用ant完成工程管理的常用任務(wù),例如工程編譯、生成javadoc、生成jar、版本控制、自動(dòng)測(cè)試。
    7、排錯(cuò):應(yīng)該可以根據(jù)異常信息比較快速的定位問(wèn)題的原因和大致位置。
    8、思想:必須掌握OOP的主要要求,這樣使用Java開(kāi)發(fā)的系統(tǒng)才能是真正的Java系統(tǒng)。
    9、規(guī)范:編寫(xiě)的代碼必須符合流行的編碼規(guī)范,例如類(lèi)名首字母大寫(xiě),成員和方法名首字母小寫(xiě),方法名的第一個(gè)單詞一般是動(dòng)詞,包名全部小寫(xiě)等,這樣程序的可讀性才比較好。
    10、博學(xué):掌握J(rèn)2EE 、Oracle 、WebLogic、Jboss、Spring、Struts、Hibernate 等流行技術(shù),掌握軟件架構(gòu)設(shè)計(jì)思想、搜索引擎優(yōu)化、緩存系統(tǒng)設(shè)計(jì)、網(wǎng)站負(fù)載均衡、系統(tǒng)性能調(diào)優(yōu)等實(shí)用技術(shù)。
    本文摘自:http://hi.baidu.com/st_sen/blog/item/85333209ae157e2d6b60fbc9.html

    posted @ 2009-08-09 18:16 石頭@ 閱讀(1182) | 評(píng)論 (4)編輯 收藏

    很有哲理的一些話(huà)!

    淚的存在,是為了證明悲傷不是一場(chǎng)幻覺(jué)。

      兩人相愛(ài)時(shí),渴求無(wú)限甜蜜的吻,但為何在爭(zhēng)吵時(shí),卻要用接吻的嘴互相傷害呢?    

      愛(ài)其實(shí)就像打計(jì)程車(chē)。第一,不像公共汽車(chē),只需等待就會(huì)自動(dòng)來(lái)到你的面前,而需要你先向 它招手才停;第二,如果你碰到的是空車(chē),那就是你的幸運(yùn),但往往車(chē)上已經(jīng)有人了。這時(shí)你只能搭便車(chē),只有先到的乘客下了車(chē)后,才能去你想去的地方;第三, 走了多少距離就要付出多少代價(jià)?!   ?

      當(dāng)你認(rèn)為被拋棄的時(shí)候,受損失的其實(shí)是對(duì)方;因?yàn)樗チ艘粋€(gè)真正喜歡的人,而你只不過(guò)少了一個(gè)不愛(ài)你的人?!?

      要做的事情總找得出時(shí)間和機(jī)會(huì),不要做的事情總找得出借口?!   ?

      令人不能自拔的,除了牙齒還有愛(ài)情.    

      你以為最酸的感覺(jué)是吃醋嗎?不是的,最酸溜溜的感覺(jué)是沒(méi)權(quán)吃醋,根本就輪不到你吃醋,那就是最酸最酸的。    

      青春有限,可以驕傲的時(shí)候,盡管驕傲吧。有一天,當(dāng)你死心塌地地愛(ài)上一個(gè)人的時(shí)候,你也許無(wú)法在驕傲?!   ?

      寵和愛(ài)是不同的兩件事,寵可以沒(méi)有交流,而愛(ài)則不能?!   ?

      一個(gè)人有生就有死,但只要你活著,就要以最好的方式活下去。    

      思戀一個(gè)人的滋味就像喝了一大杯冰水,然后用很長(zhǎng)很長(zhǎng)的時(shí)間流成熱淚?!   ?

      幸福像掉到沙發(fā)下面的一粒紐扣-----你專(zhuān)心找,怎么也找不到,等你淡忘了,它自己就滾出來(lái)了。    

      快樂(lè)就像香水,灑在別人身上的同時(shí),自己也會(huì)沾上一點(diǎn)。    

      一只腳踩在紫羅蘭上它卻將香味留在了你的腳上------這就叫寬容?!   ?

      離開(kāi)我就別安慰我,要知道每一次縫補(bǔ),那顆心都會(huì)遭遇穿刺的痛。    

      人生好比一只杯子,杯中的水滿(mǎn)了就得施一半給人,待杯里又滿(mǎn)了,再施一半。只有不斷地進(jìn),不斷地出,這只杯子里才會(huì)是活水,才會(huì)有價(jià)值。    

      人生試題一共有四道題目:學(xué)業(yè).事業(yè).婚姻.家庭.平均分高才能及格,切莫花太多的時(shí)間和精力在任一題目上?!   ?

      因?yàn)槎?,所?a >慈悲?!   ?

      愛(ài)情就像一雙襪子,越是瞧起來(lái)不順眼的襪子,越有可能永遠(yuǎn)陪在你身邊,越是喜歡的漂亮襪子經(jīng)常會(huì)少一只.    

      微小的幸福就在身邊,容易滿(mǎn)足就是天堂?!   ?

      只有向后才能理解生活;但要生活好,則必須向前看。    

      對(duì)于你來(lái)說(shuō),我的出現(xiàn)只是你生命中的100+1=101;但對(duì)于我來(lái)說(shuō),你的出現(xiàn)在我的生命中卻是0+1=1的算式?!   ?

      世界上沒(méi)有不傷人心的感情,或多或少,或大或小,它都會(huì)在你的靈魂上留下傷痕。以傷痕為代價(jià)換得感情的喜悅,以感情的喜悅作為傷痕的回報(bào)?!   ?

      沒(méi)有人因水的平淡而厭倦飲水,也沒(méi)有人因生活的平淡而摒棄生活?!   ?

      一片空白中兩條細(xì)細(xì)的直線(xiàn),它們從遙遠(yuǎn)的兩頭隱隱現(xiàn)出,急急忙忙地在彼此的身體上留下一個(gè)點(diǎn),然后再次展向無(wú)限制的遠(yuǎn)方,一去不復(fù)返?!   ?

      愛(ài)情的開(kāi)始可能是友誼,可能是利用,可能是欺騙,也可能是需要或寂寞,甚至可能是報(bào)復(fù),可那又有什么關(guān)系呢?只要最后的結(jié)果是演變成了愛(ài)情?!   ?

      傷害你的人不是比你強(qiáng)大就是比你弱小。如果他比你弱小,寬恕他;如果他比你強(qiáng)大,寬恕自己。     

      我能從一千個(gè)從我身邊經(jīng)過(guò)的人中聽(tīng)出你的腳步,因?yàn)槟?99個(gè)人的腳是踏在地上,只有你的腳步聲是踏在我的心上。    

      我喜歡你,可是我不敢說(shuō);我怕說(shuō)了,我會(huì)死去;我不怕死,但是我怕死了以后,再也沒(méi)有人會(huì)像我一樣喜歡你?!   ?

      得不到你所愛(ài)的,就愛(ài)你所得的?!   ?

      眼淚的溫度有530℃,只是因?yàn)橥饷娴氖澜缣洌鞒鰜?lái)的時(shí)候才會(huì)降到53℃?!   ?

    愛(ài)一個(gè)人就是在撥通電話(huà)時(shí)忽然不知道說(shuō)什么好,原來(lái)只是想聽(tīng)聽(tīng)那熟悉的聲音,真正想撥通的只是自己心底的一根弦

    posted @ 2009-08-05 17:34 石頭@ 閱讀(417) | 評(píng)論 (0)編輯 收藏

    java推薦讀物

    http://blog.csdn.net/sqw131/archive/2009/06/22/4287749.aspx

    posted @ 2009-07-30 19:25 石頭@ 閱讀(444) | 評(píng)論 (0)編輯 收藏

    初級(jí)程序員與高級(jí)程序員的做事

    一般對(duì)于一個(gè)問(wèn)題,初級(jí)程序員和高級(jí)程序員考慮問(wèn)題的方法絕對(duì)是不同的。比如,在初級(jí)程序員階段時(shí),他會(huì)覺(jué)得VB也能做出應(yīng)用來(lái),且看起來(lái)也不錯(cuò)。

    但到了中級(jí)程序員時(shí),他可能就不會(huì)選擇VB了,可能會(huì)用MFC,這時(shí),也能做出效果不錯(cuò)的程序。

    到高級(jí)程序員時(shí),他絕對(duì)不是首先選擇以上工具,VB也好,VC也好,這些都不是他考慮的問(wèn)題。這時(shí)考慮的絕對(duì)是什么才是具有最快效率、最穩(wěn)定性能的解決問(wèn)題的方法。

    軟件和別的產(chǎn)品不同。比如,在軟件中要達(dá)到某個(gè)目標(biāo),有n種方法,但是在n種方法中,只有一種方法或兩種方法是最好的,其他的都很次。所以,要做一個(gè)好的系統(tǒng),是很需要耐心的。如果沒(méi)有耐心,就不會(huì)有細(xì)活,有細(xì)活的東西才是好東西。我覺(jué)得做軟件是這樣,做任何事情也是這樣的,一定要投入。

     

    程序員到達(dá)最高境界的時(shí)候,想的就是“我就是程序,程序就是我”。這時(shí)候我要做一個(gè)軟件,不會(huì)有自己主觀(guān)的思路,而是以機(jī)器的思路來(lái)考慮問(wèn)題,也就是說(shuō),就是以程序的思考方式來(lái)思考程序,而不是以我去設(shè)計(jì)程序的方式去思考程序。這一點(diǎn)如果不到比較高的層次是不能明白的。

    你設(shè)計(jì)程序不就是你思考問(wèn)題,然后按自己的思路去做程序嗎?

    其實(shí)不是的。在我設(shè)計(jì)這個(gè)程序的時(shí)候,相當(dāng)于我“鉆”入這個(gè)程序里面去了。這時(shí)候沒(méi)有我自己的任何思維,我的所有思維都是這個(gè)程序,這步該怎么走,下步該怎么走,它可能會(huì)出現(xiàn)什么情況。我動(dòng)這個(gè)部分的時(shí)候,別的部分是否要干擾,也許會(huì)動(dòng)一發(fā)而牽全身,它們之間是怎么相互影響的?

    也只有到達(dá)這個(gè)境界,你的程序才能真正地寫(xiě)好,絕對(duì)不是做個(gè)什么可視化??梢暬旧砭褪?#8220;我去設(shè)計(jì)這個(gè)程序”,而真正的程序高手是“我就是程序”,這兩種方法絕對(duì)是不同的。比如,我要用VB去設(shè)計(jì)一個(gè)程序,和我本身就是一個(gè)程序的思維方式,是不一樣的。別人也許覺(jué)得操作系統(tǒng)很深?yuàn)W,很復(fù)雜,其實(shí),如果你到達(dá)高手狀態(tài),你就是操作系統(tǒng),你就能做任何程序。

    對(duì)待軟件要有一個(gè)全面的分析方法,光說(shuō)理論是沒(méi)有用的。如果你沒(méi)有經(jīng)過(guò)第一、第二、第三、第四這四個(gè)階段,則永遠(yuǎn)到達(dá)不了高境界。因?yàn)榭罩袠情w的理論沒(méi)有用,而這些必須是一步一步地去做出來(lái)。

    一 個(gè)高級(jí)程序員應(yīng)該具備開(kāi)放性思維,從里到外的所有的知識(shí)都能了解。然后,看到世界最新技術(shù)就能馬上掌握,馬上了解。實(shí)際上,技術(shù)到達(dá)最高的境界后,是沒(méi)有 分別的。任何東西都是相通的,只要你到達(dá)這個(gè)境界以后,什么問(wèn)題一看就能明白,一看就能抓住最核心的問(wèn)題,最根本的根本,而不會(huì)被其他的枝葉或表象所迷 惑,做到這一步后才算比較成功。

    從 程序員本身來(lái)說(shuō),如果它到達(dá)這一步以后,他就已經(jīng)形成了開(kāi)闊的思維。他有這種開(kāi)放性思維的話(huà),他就能做戰(zhàn)略決策,這對(duì)他將來(lái)做任何事情都有好處。事實(shí)上, 會(huì)做程序后,就會(huì)有一種分析問(wèn)題的方法,學(xué)會(huì)怎么樣把問(wèn)題的表象剖開(kāi),看到它的本質(zhì)。這時(shí)你碰到任何具體的問(wèn)題,只要給點(diǎn)時(shí)間,都能輕而易舉地解決。實(shí)際 上,對(duì)開(kāi)發(fā)計(jì)算機(jī)軟件來(lái)說(shuō),沒(méi)有什么做不了的軟件,所有的軟件都能做,只是看你有沒(méi)有時(shí)間,有沒(méi)有耐心,有沒(méi)有資金做支撐。

    這幾年,尤其是這兩三年,估計(jì)到2005年前,中國(guó)軟件這個(gè)行業(yè)里面大的軟件公司就能形成?,F(xiàn)在就已經(jīng)在形成,例如用友,它上市后,地位就更加穩(wěn)固了。其他大的軟件企業(yè)會(huì)在這幾年內(nèi)迅速長(zhǎng)大。這時(shí)候,包括流通渠道、經(jīng)銷(xiāo)商的渠道也會(huì)迅速長(zhǎng)大。也就是說(shuō),到2005年以后,中國(guó)軟件這個(gè)行業(yè)的門(mén)檻比現(xiàn)在還要高很多,與美國(guó)不會(huì)有太大的差別。此時(shí),中國(guó)軟件才真正體現(xiàn)出它的威力來(lái)。如果你是這些威力中的一員,就已經(jīng)很厲害了。

    別 人可能知道比爾·蓋茨是個(gè)談判的高手,是賣(mài)東西的高手,其實(shí),比爾·蓋茨從根本上來(lái)說(shuō)是個(gè)程序高手,這是他根本中的根本。他對(duì)所有的技術(shù)都非常敏感,一眼 就看到本質(zhì),而且他本身也能做程序,時(shí)常在看程序?,F(xiàn)在他不做董事長(zhǎng),而做首席設(shè)計(jì)師,這時(shí)他就更加接近程序的本質(zhì)。因?yàn)樗旧砭陀泻荛_(kāi)闊的思維,又深入 到技術(shù)的本身,所以他就知道技術(shù)的方向。這對(duì)于一個(gè)公司,對(duì)他這樣的人來(lái)說(shuō),是非常重要的。

    如果他判斷錯(cuò)誤一步,那公司以后再回頭就很難了。計(jì)算機(jī)的競(jìng)爭(zhēng)是非常激烈的,不能走錯(cuò)半步。很多公司以前看上去很火,后來(lái)就

    銷(xiāo)聲匿跡了,就是因?yàn)樗咤e(cuò)一步,然后就不行了。為什么它會(huì)走錯(cuò)?因?yàn)樗涣私饧夹g(shù)的本質(zhì)在哪里,技術(shù)的發(fā)展方向在哪里。

    比爾·蓋茨因?yàn)楦改甘菍W(xué)法律的,所以他本身就很能“侃”,很有說(shuō)服力,而他又是做技術(shù)的,就非常清楚技術(shù)的方向在哪里,所以他才能把方向把握得很準(zhǔn)確,公司越來(lái)越大。而別的公司只一陣子,他卻火了還會(huì)再火。就算微軟再龐大,你如果不把握好軟件技術(shù)的最前沿,一樣也會(huì)玩完。就像Intel時(shí)刻把握著CPU的最新技術(shù),才能保證自己是行業(yè)老大。技術(shù)決定它的將來(lái)。

     

    所以,程序員要能達(dá)到這樣的目標(biāo),就要有非常強(qiáng)的耐心和非常好的機(jī)遇才有可能。事實(shí)上,現(xiàn)在的機(jī)會(huì)挺好的,2005年 以前機(jī)會(huì)都非常大,以后機(jī)會(huì)會(huì)比較小。但是,如果有耐心的話(huà),你還是會(huì)有機(jī)會(huì)的,機(jī)會(huì)都是出在耐心里。我記得有句話(huà)說(shuō)“雄心的一半是耐心”,我認(rèn)為雄心的 三分之二都是耐心。如果你越有野心,你就越要有耐心,你的野心才有可能實(shí)現(xiàn)。如果你有野心而沒(méi)有耐心,那都是胡思亂想,別人一眼就能看穿。最后在競(jìng)爭(zhēng)中, 對(duì)手一眼就看到你的意圖,那你還有什么可競(jìng)爭(zhēng)的?



    轉(zhuǎn)自:http://blog.pfan.cn/vagrant/31151.html

    posted @ 2009-07-27 21:04 石頭@ 閱讀(802) | 評(píng)論 (0)編輯 收藏

    有點(diǎn)指導(dǎo)意義的文章

    計(jì)算機(jī)方向的研究生
    2009-05-16 09:29

           考計(jì)算機(jī)的人未必個(gè)個(gè)都是高手,嚴(yán)格來(lái)說(shuō),大部分都不會(huì)編程序。也就是說(shuō),庸庸碌碌之輩仍然占絕大多數(shù)。研究生畢業(yè)的師兄只拿2500 元左右的比比皆是,所以不要寄希望于拿一張研究生文憑出去賺高薪。但是,對(duì)于有實(shí)際開(kāi)發(fā)工作經(jīng)驗(yàn)的人,要想自己在3年之中有一個(gè)真正的提高的話(huà),就我所知,每一個(gè)月拿2萬(wàn)以上的也有(上海育碧,圖形特效算法設(shè)計(jì))。所以,同為研究生畢業(yè),能力的差距是極大的。所以,不要去問(wèn) “研究生畢業(yè)能拿多少?”,要問(wèn)“像我這種水平的人,研究生畢業(yè)能拿多少錢(qián)?”這樣人家才能夠準(zhǔn)確地回答你。
    所謂“有實(shí)際開(kāi)發(fā)工作經(jīng)驗(yàn)”是指 你目前已經(jīng)具備下列能力:1)你已經(jīng)認(rèn)為C++和匯編語(yǔ)言都是很簡(jiǎn)單的語(yǔ)言,并能夠自如地運(yùn)用;2)你能夠在30分鐘之內(nèi)想到正確的五子棋AI算法設(shè)計(jì)思 路和方向;3)你完全理解STL為什么這么重要;4)你能夠獨(dú)立地解決所有的編譯與鏈接問(wèn)題,哪怕你從來(lái)沒(méi)有遇到的問(wèn)題,你也不需要詢(xún)問(wèn)任何人;5)英文 網(wǎng)站是你的首要信息來(lái)源;6)能夠讀懂英語(yǔ)寫(xiě)成的國(guó)際標(biāo)準(zhǔn),比如NTFS磁盤(pán)格式標(biāo)準(zhǔn)。7)你經(jīng)常站在集合論的角度思考算法問(wèn)題;8)能夠理解一個(gè)簡(jiǎn)單的 驅(qū)動(dòng)程序,能夠理解一個(gè)簡(jiǎn)單3D交互程序;9)你能夠認(rèn)識(shí)到線(xiàn)性代數(shù)和概率論在實(shí)際編程工作中的極端重要性;10)你完全理解COM的設(shè)計(jì)思想,尤其能夠 理解COM為什么要設(shè)計(jì)成這樣;11)當(dāng)我說(shuō)到虛函數(shù)的重要作用時(shí),你不會(huì)急著去找書(shū)來(lái)翻;12)你能夠說(shuō)出C++為什么比其他語(yǔ)言?xún)?yōu)秀的理由,記住這種 理由應(yīng)該來(lái)自于你的開(kāi)發(fā)體會(huì),而不是因?yàn)槠渌硕歼@么說(shuō)。此外還有很多判斷標(biāo)準(zhǔn),但如果你同時(shí)具備5條以上,可以認(rèn)為你已經(jīng)具備相應(yīng)的開(kāi)發(fā)經(jīng)驗(yàn)了。在這種狀態(tài)下讀研,你將取得讀研效益的最大值。
    讀研最重要的是要明白你自己要干什么,不能等導(dǎo)師來(lái)告訴你你應(yīng)該干什么。研究生的優(yōu)勢(shì)在于理論功底深 厚,思維具有穿透力,當(dāng)然編程能力首先要過(guò)關(guān),不要讀完研究生還不知道MFC程序的WinMain函數(shù)在哪里。所以,研究生期間,你一定要做有理論深度的算法設(shè)計(jì),比如大規(guī)模數(shù)據(jù)的搜索算法,性能是首要考慮因素,不要奢望SQL函數(shù)能夠幫你解決問(wèn)題,所有的問(wèn)題你都必須自己解決,你必須解決內(nèi)外存交換的性 能瓶頸。再比如極品飛車(chē)的3D場(chǎng)景生成,圖形變換,碰撞檢測(cè),物性模擬,紋理映射,燈光模型等等,這些都是可以保證你能拿到2萬(wàn)以上月薪的技術(shù)。如果你認(rèn) 為這些東西太難,不可能做得出來(lái)的話(huà),那么你就不適合讀研。真的,要是你認(rèn)為讀研之后還是要去搞一般的程序設(shè)計(jì),如信息管理系統(tǒng)之類(lèi)的軟件,那么你讀研的 價(jià)值就完全不會(huì)得到體現(xiàn),因?yàn)檫@些工作根本就不需要讀研。
    軟件學(xué)院宣稱(chēng)培養(yǎng)軟件開(kāi)發(fā)人才,恕我直言,我從來(lái)沒(méi)有看見(jiàn)那個(gè)高手是培訓(xùn)成功的。成 為軟件開(kāi)發(fā)高手的路只有一條:自學(xué)!軟件開(kāi)發(fā)中需要大量的編程實(shí)踐和獨(dú)立思考,只有在此過(guò)程中,你才能夠逐步成長(zhǎng)起來(lái)。軟件學(xué)院宣稱(chēng)培養(yǎng)軟件項(xiàng)目經(jīng)理,這 更是搞笑,在某種意義上這是欺騙行為。學(xué)院里面能夠培養(yǎng)出軟件開(kāi)發(fā)經(jīng)理更是十足的謊言,軟件項(xiàng)目經(jīng)理必須,或者說(shuō)更強(qiáng)調(diào)從戰(zhàn)爭(zhēng)中學(xué)會(huì)戰(zhàn)爭(zhēng)。沒(méi)有實(shí)踐經(jīng)驗(yàn)的 項(xiàng)目經(jīng)理就是繡花枕頭一個(gè)。
    實(shí)話(huà)實(shí)說(shuō),軟件學(xué)院就是一個(gè)蒙錢(qián)的機(jī)構(gòu),公關(guān)工作做得很好,善于打廣告,而且都是打著高薪的幌子,就如同外面的什么北大青鳥(niǎo)培訓(xùn)班一樣。兩個(gè)字:蒙錢(qián)!四個(gè)字:還是蒙錢(qián)!
    總之一句話(huà),如果你只想成為軟件開(kāi)發(fā)高手(比如認(rèn)為會(huì)編驅(qū)動(dòng)程序或殺毒軟件就是高手的那種),建議工作,不要考研;完全沒(méi)有工作經(jīng)驗(yàn)的,也不建議考研, 你進(jìn)來(lái)了只有瞎混一通。如果你有上述工作經(jīng)驗(yàn)且想成為高級(jí)軟件工程師(能夠獨(dú)立理解并設(shè)計(jì)出快速傅立葉變換算法的那種軟件工程師)的話(huà),那么強(qiáng)烈建議考 研??佳凶屇阌?年放松思考的機(jī)會(huì),也有3年讓你思想和技術(shù)積累沉淀的機(jī)會(huì)。非常難得的機(jī)會(huì)。不考研的話(huà),這種機(jī)會(huì)就是一種奢侈,可望而不可即的那么一種 奢侈。
    所以,不管你是哪一種情況,都不建議考軟件學(xué)院。除非你是女生,把能夠成為一個(gè)研究生當(dāng)著一生最大滿(mǎn)足的那種女生。
    1)關(guān)于讀書(shū)的機(jī)會(huì)成本問(wèn)題。讀研的機(jī)會(huì)成本的確是很高。任何人都可以簡(jiǎn)單地計(jì)算出來(lái)。所以,我也不贊成所有的人都去讀研。讀研只適合那些痛感數(shù)學(xué)在編程中的極 端重要性的人。如果對(duì)理論工具和理論思維的極端重要性沒(méi)有切膚的認(rèn)識(shí),那么讀研的價(jià)值幾乎為0;讀研的好處在于:A,把你自己放在一個(gè)學(xué)術(shù)和工程的交叉點(diǎn) 上;B,讓你具備了進(jìn)入微軟等世界頂級(jí)軟件研發(fā)機(jī)構(gòu)的可能性;記住只是可能性。但是不讀研這種可能性為0;C,如前所述,如果沒(méi)有讀研的機(jī)會(huì),你也就沒(méi)有 靜下心來(lái)好好鉆研幾年理論的機(jī)會(huì);一邊工作拿高薪,一邊深入地學(xué)習(xí)各種理論,諸位認(rèn)為這可能嗎?我反正認(rèn)為不可能,我覺(jué)得學(xué)習(xí)鉆研理論最需要的就是一個(gè)長(zhǎng) 期安靜獨(dú)處的環(huán)境,一邊工作一邊讀書(shū)是不可能有這樣的環(huán)境的,你會(huì)覺(jué)得每天都在疲于奔命。而讀研正好可以提供這樣一個(gè)環(huán)境。我同時(shí)還反對(duì)整天跟著導(dǎo)師的屁 股后面跑,這樣會(huì)浪費(fèi)很多時(shí)間。讀計(jì)算機(jī)的研究生,主要依靠自己去查閱最新文獻(xiàn),自己去研讀文獻(xiàn),和導(dǎo)師的口頭交流一個(gè)月一次就足夠了,前提還需要導(dǎo)師的 水平足夠牛。如果導(dǎo)師的水平不牛,這也沒(méi)關(guān)系,不理他就是了,自己做好自己的事情即可。
    2)關(guān)于研究生教學(xué)質(zhì)量問(wèn)題。坦白地說(shuō),全國(guó)都是“洪 桐縣中無(wú)好人”,尤其在計(jì)算科學(xué)領(lǐng)域,大牛極少。那為什么還要去讀研?大哉問(wèn)!把讀研的收獲寄托在名?;蛎麕煹拿艺J(rèn)為氣上,是注定要失敗的。讀研全靠自 學(xué),研究生之間的差距全部體現(xiàn)在自學(xué)能力上面。又有人問(wèn),既然是自學(xué),為什么非要讀研?回答是:因?yàn)樽x研就是為你買(mǎi)一份保險(xiǎn),就是買(mǎi)一份你自學(xué)三年之后不 會(huì)失業(yè)的保險(xiǎn)。這份保險(xiǎn)主要是一種心理上的后盾,讓你在自學(xué)過(guò)程中經(jīng)得起誘惑,能夠從容鎮(zhèn)定地去追尋計(jì)算機(jī)理論發(fā)展的堅(jiān)實(shí)足跡,從歐拉,費(fèi)馬,高斯,康 托,圖靈等巨匠那里尋找方法論的珠寶。倘若沒(méi)有這份保證,你在家里面自學(xué)3個(gè)月,保證你會(huì)被失業(yè)的壓力壓得喘不過(guò)氣來(lái),何談安心學(xué)習(xí)?
    3)關(guān)于實(shí)戰(zhàn)經(jīng)驗(yàn)與理論學(xué)習(xí)的優(yōu)劣問(wèn)題。這沒(méi)有定論,如前所述,管理信息系統(tǒng),設(shè)備驅(qū)動(dòng)開(kāi)發(fā),工具軟件開(kāi)發(fā),軟件病毒剖析等等這些工作不太需要?jiǎng)?chuàng)造性,需要的是 耐心和經(jīng)驗(yàn),需要的是對(duì)既有規(guī)范的準(zhǔn)確理解,這類(lèi)開(kāi)發(fā)工作最適合在實(shí)戰(zhàn)中提高,理論學(xué)習(xí)沒(méi)什么作用。但是在人工智能,模式識(shí)別,圖像壓縮,虛擬現(xiàn)實(shí),巨量 數(shù)據(jù)檢索,自然語(yǔ)言理解,計(jì)算機(jī)圖形學(xué)等等領(lǐng)域,理論學(xué)習(xí)就占據(jù)著絕對(duì)的統(tǒng)治地位!這些領(lǐng)域的突破對(duì)人類(lèi)的生活的影響是極其巨大而深刻的。某些領(lǐng)域處于一 個(gè)極其快速發(fā)展的態(tài)勢(shì)之中,比如計(jì)算機(jī)圖形學(xué),相信諸君能夠從眾多3D游戲的燦爛輝煌中體認(rèn)到我的這種說(shuō)法。在這些領(lǐng)域,如果沒(méi)有扎實(shí)的理論功底,一切都 是那么遙遠(yuǎn),不管你花了多少時(shí)間在編程上面。
    4)關(guān)于高級(jí)研發(fā)人員的知識(shí)結(jié)構(gòu)問(wèn)題。首先聲明,我不是一個(gè)純粹理論激進(jìn)分子,即認(rèn)為除了理論之 外,一切都不重要。我認(rèn)為,純熟的編程技能是最基本但也是最必不可少的技能。沒(méi)有這個(gè)基礎(chǔ),一切計(jì)算機(jī)理論就是空談(研究圖靈可計(jì)算性理論的研究者除外)。有了這個(gè)基礎(chǔ)之后,下列理論學(xué)習(xí)方向必須重點(diǎn)突破:
    1,科學(xué)哲學(xué)。這是核心中的核心!可惜國(guó)內(nèi)不開(kāi)這門(mén)課。不但不開(kāi)課,而且還作為批判 對(duì)象來(lái)引用,實(shí)在是遺憾至極!這是一門(mén)教你如何“釣魚(yú)”的學(xué)科,在一切科學(xué)研究中居于最核心的地位。它是古今科研方法和思維方法的集大成者,很難想象一個(gè) 成熟的研究者沒(méi)有一套自己的方法論體系??茖W(xué)哲學(xué)最需要的是領(lǐng)會(huì)與總結(jié),它的思想與啟示會(huì)伴隨我們的一生。
    2,康托集合論,矩陣方法,離散結(jié) 構(gòu),圖論方法,群論方法之間的緊密關(guān)系。最重要的認(rèn)識(shí)這些理論對(duì)實(shí)踐的重要啟示和方法引導(dǎo)。我始終認(rèn)為,如果你學(xué)了一門(mén)理論之后,卻不知道這門(mén)理論有什么 作用,那么你的理論就白學(xué)了,你什么東西都沒(méi)有撈著。所以,學(xué)習(xí)任何理論之前,先問(wèn)自己:它有什么用?在哪里用?如何用?帶著這些問(wèn)題去學(xué)習(xí)理論,你才會(huì) 真正地學(xué)到東西。用這三個(gè)問(wèn)題去問(wèn)你的理論課老師,他的回答就是判斷其實(shí)際水平的最佳標(biāo)準(zhǔn)。
    3,思維要有極強(qiáng)的穿透力,學(xué)會(huì)看透文獻(xiàn)作者沒(méi)有 寫(xiě)出來(lái)的動(dòng)機(jī)。絕大部分大師都有隱瞞自己最具有方法論啟示意義的思考環(huán)節(jié)的習(xí)慣。牛頓和華羅庚先生都有這個(gè)壞習(xí)慣。這讓大家認(rèn)為他們是天才,因?yàn)楹芏鄦?wèn)題 他想到了,我們想不到。但是為什么他們能想到,我們想不到?他們是怎樣想到的?沒(méi)有人告訴我們牛頓發(fā)現(xiàn)萬(wàn)有引力定律時(shí)的思考過(guò)程,當(dāng)然,牛頓可以慷慨地把 他的思考結(jié)果告訴我們,但是,他那可以點(diǎn)石成金的“金手指”卻沒(méi)有教給我們。我們的任務(wù)就是要培養(yǎng)透過(guò)文章看穿作者背后意圖和動(dòng)機(jī)的能力,在這方面,臺(tái)灣 的侯捷和美國(guó)的Donbox是絕佳典范。這兩只老狐貍(呵呵,是愛(ài)稱(chēng))憑著其獵犬一般的嗅覺(jué),抽絲剝繭,一個(gè)把COM背后的幕后設(shè)計(jì)動(dòng)機(jī)揭開(kāi)并暴露到了光 天化日之下,另一個(gè)把MFC的宏觀(guān)架構(gòu)做了一次完美的外科手術(shù)。其非凡的思維穿透力令人驚嘆。
    4,英語(yǔ)。英語(yǔ)本身不重要,但是用英語(yǔ)寫(xiě)成的文獻(xiàn)就極其重要了。所以,專(zhuān)門(mén)把英語(yǔ)作為一個(gè)重頭戲列出來(lái)。大家不要相信英語(yǔ)無(wú)用論的鬼話(huà)。對(duì)于搞計(jì)算機(jī)的而言,英語(yǔ)就是你的母語(yǔ)!
    5,其它的具體理論還有很多,但是都不如這三個(gè)方面重要,因?yàn)槲矣X(jué)得這三個(gè)方面是最具有根本性,全局性的能力培養(yǎng)環(huán)節(jié)。需要指出的是,很多高深理論對(duì)你的工作是無(wú)意義的,當(dāng)心時(shí)間陷進(jìn)去。一定要把效率最高的時(shí)間段用在最具有決定性意義的理論學(xué)習(xí)上。
    6)關(guān)于讀研之后的出路是否光明的問(wèn)題。我們應(yīng)該承認(rèn),讀研之后,你的工作機(jī)會(huì)不是變多了,而是變少了。而且越是高手,他的工作機(jī)會(huì)和工作范圍就越少。 這是因?yàn)椋绞歉闱把匮邪l(fā)的公司,其數(shù)量越少,在這個(gè)圈子的人也就越少。你找工作的范圍就越小,試問(wèn):如果微軟的OS設(shè)計(jì)專(zhuān)家出來(lái)找工作,能夠讓他選擇的 公司能有幾家?但是,這種公司數(shù)量的減少是以工資待遇的急劇上升為補(bǔ)償?shù)模瑫r(shí),你在工作中所受到的充分尊重也是在一般公司中體會(huì)不到的。所以不要擔(dān)心學(xué) 了高科技用不上,呵呵,你只會(huì)越來(lái)越感覺(jué)自己學(xué)的不夠用。相信接到過(guò)獵頭公司電話(huà)的人會(huì)體會(huì)得到。真正的高手從來(lái)就不會(huì)擔(dān)心工作的問(wèn)題,也從來(lái)不會(huì)到人才 市場(chǎng)上去找工作。既然選擇了理論深入,那么就應(yīng)該把眼光放得更遠(yuǎn)。

    轉(zhuǎn)自:http://koudai.360.cn/u/17782962/article_98157326.html?categoryID=98143796&cp=1

    posted @ 2009-07-13 18:01 石頭@ 閱讀(358) | 評(píng)論 (0)編輯 收藏

    讓學(xué)習(xí)成為一種習(xí)慣

    讓努力成為一種習(xí)慣;
    讓學(xué)習(xí)成為一種習(xí)慣;
    讓思考成為一種習(xí)慣;

    這些話(huà)當(dāng)做是給我自己的一個(gè)學(xué)習(xí)的動(dòng)力,鞭策一下自己。同時(shí)自己也做一下檢討,向來(lái)我都是在別人論壇里面灌水,也承認(rèn)自己很懶散,很少用文字的東西來(lái)記錄自己的所見(jiàn),所思。 一來(lái)自己的文字功底很差(),二來(lái)就是歸功于本人的散漫,懶惰了。就在自己的qq空間里也很少寫(xiě)東西,有時(shí)也是寫(xiě)了就刪了。
    有時(shí)候其實(shí)很想用文字來(lái)寫(xiě)寫(xiě)自己,不管是關(guān)于學(xué)習(xí)上的,還是生活上的。 但是沒(méi)有這種習(xí)慣,沒(méi)有這種毅力。 這段時(shí)間老是逛別人的論壇,看到人家的論壇里面都記載著自己在學(xué)習(xí)上的所見(jiàn)所思,所以下定決心也要做個(gè)自己的博客來(lái)記錄我在學(xué)習(xí)的腳步。



    posted @ 2009-07-10 20:57 石頭@ 閱讀(184) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 久久爰www免费人成| 午夜亚洲国产理论秋霞| 国产91成人精品亚洲精品| 免费福利在线观看| 四虎影视精品永久免费网站| 亚洲精品无码av片| 69视频免费在线观看| 亚洲国产精品无码久久久久久曰| 久久亚洲AV成人出白浆无码国产| 羞羞视频免费观看| 免费人成在线观看播放国产| 国产亚洲福利一区二区免费看| 又粗又硬又黄又爽的免费视频 | 日韩免费高清一级毛片| 日韩电影免费在线观看中文字幕| 亚洲精品少妇30p| 欧洲人成在线免费| 久久久久亚洲av无码专区| 久久国产精品成人片免费| 亚洲精品在线播放视频| 99视频全部免费精品全部四虎| 亚洲精品自产拍在线观看| 国产免费无码AV片在线观看不卡 | 91亚洲精品视频| 亚洲视频在线观看免费视频| 亚洲中文字幕无码av在线| 成年大片免费视频| 最新亚洲人成网站在线观看| 我们的2018在线观看免费高清| 激情五月亚洲色图| 毛片免费全部播放无码| 亚洲午夜国产精品| 在线观看免费毛片| 免费无码看av的网站| 国产精品亚洲专一区二区三区| www.亚洲色图.com| 亚洲av无码成人精品国产| 亚洲AV无码乱码精品国产| 成人免费777777被爆出| 亚洲男人的天堂在线播放| 免费的全黄一级录像带|