• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 42  文章 - 3  trackbacks - 0
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            網頁收藏

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            系統會用到下面幾種寄存器: 1.EIP 2.ESP 3.EBP。三者的作用。
            1.EIP寄存器里存儲的是CPU下次要執行的指令的地址。
            2.EBP寄存器里存儲的是是棧的棧底指針,通常叫棧基址,而這個地址是由ESP在函數調用前傳遞給EBP的。等到調用結束,EBP會把其地址再次傳回給ESP。所以ESP又一次指向了函數調用結束后,棧頂的地址。
            3.ESP寄存器里存儲的是棧的棧頂。并且始終指向棧頂。


            Eax
            – arithmetic, default location where division occurs (accumulator)是很多加法乘法指令的缺省寄存器。

            Ebx – base index for arrays

            Ecxcouner (used with the loop instruction)重復(REP)前綴指令和LOOP指令的內定計數器。

            Edx – data/general 總是被用來放整數除法產生的余數。

            Edi, esi – used as indices in string operations

            Ebp – positive offsets are the arguments, negative offsets are the local variables

             

            posted @ 2011-11-27 23:15 鷹擊長空 閱讀(155) | 評論 (0)編輯 收藏

            最近碰到一個特別奇怪的bug,程序不能正常退出,GDB追蹤到最后發現是動態鏈接庫卸載時不能正確調用detach函數,懷疑是引用計數的問題。弄了半天還是添加手工調用析構函數解決了問題。 這不由讓我想起兩年前一個同樣的bug讓我頭疼了很長時間,也是程序退出時不能卸載動態鏈接庫,看來這個問題真是個普遍的問題, 以后寫代碼要多注意,不要再依賴析構函數的實現了,要適時完成清理工作。

            posted @ 2011-11-14 21:33 鷹擊長空 閱讀(364) | 評論 (0)編輯 收藏

            問題實例:給你A,B兩個文件,各存放50億條URL,每條URL占用64字節,內存限制是4G,讓你找出A,B文件共同的URL。如果是三個乃至n個文件呢?

            根據這個問題我們來計算下內存的占用,4G=2^32大概是40億*8大概是340億,n=50億,如果按出錯率0.01算需要的大概是650億個bit。現在可用的是340億,相差并不多,這樣可能會使出錯率上升些。另外如果這些urlip是一一對應的,就可以轉換成ip,則大大簡單了。

            問題實例:
            1).海量日志數據,提取出某日訪問百度次數最多的那個IP。

            IP的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入內存,然后進行統計。

            問題實例:

            1)已知某個文件內包含一些電話號碼,每個號碼為8位數字,統計不同號碼的個數。

            8位最多99 999 999,大概需要99m個bit,大概10幾m字節的內存即可。

            2)2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。

            將bit-map擴展一下,用2bit表示一個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上。或者我們不用2bit來進行表示,我們用兩個bit-map即可模擬實現這個2bit-map。

            問題實例:
            1)100w個數中找最大的前100個數。

            用一個100個元素大小的最小堆即可。

            問題實例:
            1).2.5億個整數中找出不重復的整數的個數,內存空間不足以容納這2.5億個整數。

            有點像鴿巢原理,整數個數為2^32,也就是,我們可以將這2^32個數,劃分為2^8個區域(比如用單個文件代表一個區域),然后將數據分離到不同的區域,然后不同的區域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁盤空間,就可以很方便的解決。

            2).5億個int找它們的中位數。

            這個例子比上面那個更明顯。首先我們將int劃分為2^16個區域,然后讀取數據統計落到各個區域里的數的個數,之后我們根據統計結果就可以判斷中位數落到那個區域,同時知道這個區域中的第幾大數剛好是中位數。然后第二次掃描我們只統計落在這個區域中的那些數就可以了。

            實際上,如果不是int是int64,我們可以經過3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成2^24個區域,然后確定區域的第幾大數,在將該區域分成2^20個子區域,然后確定是子區域的第幾大數,然后子區域里的數的個數只有2^20,就可以直接利用direct addr table進行統計了。

            問題實例:
            1).有一個1G大小的一個文件,里面每一行是一個詞,詞的大小不超過16個字節,內存限制大小是1M。返回頻數最高的100個詞。

            這個數據具有很明顯的特點,詞的大小為16個字節,但是內存只有1m做hash有些不夠,所以可以用來排序。內存可以當輸入緩沖區使用。

            問題實例:
            1).有10個文件,每個文件1G, 每個文件的每一行都存放的是用戶的query,每個文件的query都可能重復。要你按照query的頻度排序 。

            2).1000萬字符串,其中有些是相同的(重復),需要把重復的全部去掉,保留沒有重復的字符串。請問怎么設計和實現?

            3).尋找熱門查詢:查詢串的重復度比較高,雖然總數是1千萬,但如果除去重復后,不超過3百萬個,每個不超過255字節。

            1. 給你A,B兩個文件,各存放50億條URL,每條URL占用64字節,內存限制是4G,讓你找出:A,B文件共同的URL。 
            解法一:Hash成內存大小的小塊文件,然后分塊內存內查交集。
            解法二:Bloom Filter(廣泛應用于URL過濾、查重。參考http://en.wikipedia.org/wiki/Bloom_filterhttp://blog.csdn.net/jiaomeng/archive/2007/01/28/1496329.aspx

            2. 有10個文件,每個文件1G, 每個文件的每一行都存放的是用戶的query,每個文件的query都可能重復。要你按照query的頻度排序。
            解法一:根據數據稀疏程度算法會有不同,通用方法是用Hash把文件重排,讓相同query一定會在同一個文件,同時進行計數,然后歸并,用最小堆來統計頻度最大的。
            解法二:類似1,但是用的是與簡單Bloom Filter稍有不同的CBF(Counting Bloom Filter)或者更進一步的SBF(Spectral Bloom Filter,參考http://blog.csdn.net/jiaomeng/archive/2007/03/19/1534238.aspx
            解法三:MapReduce,幾分鐘可以在hadoop集群上搞定。參考http://en.wikipedia.org/wiki/MapReduce

            3. 有一個1G大小的一個文件,里面每一行是一個詞,詞的大小不超過16個字節,內存限制大小是1M。返回頻數最高的100個詞。
            解法一:跟2類似,只是不需要排序,各個文件分別統計前100,然后一起找前100。

            posted @ 2011-03-14 14:25 鷹擊長空 閱讀(1229) | 評論 (0)編輯 收藏
                 不知不覺,離我去年入職差五天就是一周年了,冥冥之中,注定如此吧!想當初,年輕氣盛,桀驁不馴;嘆如今,心灰意冷,銳氣全無。話說回來,一年中,不論是技術還是心態都有所提升,技術上能做些小事,心態變得更加成熟了。
                  暫時的離開是為了更好的未來,努力吧!與諸君共勉!
                  感謝我的頭,感謝我的同事,祝你們工作順利!
            posted @ 2010-04-15 11:18 鷹擊長空 閱讀(483) | 評論 (0)編輯 收藏

            聲明
            #include <bitset>
            using std::bitset;

            bitset的定義和初始化
            bitset<32> bitvec; //32位,全為0

            給出的長度值必須是常量表達式。正如這里給出的,長度值必須定義為整型字面值常量或是已用常量值初始化的整數類型的const對象。

            這條語句把bitvec定義為含有32個位的bitset對象。和vector的元素一樣,bitset中的位是沒有命名的,程序員只能按位置來訪問它們。位集合的位置編號從0開始,因此,bitvec的位序是從031。以0位開始的位串是低階位(low-order bit),以31位結束的位串是高階位(high-order bit)

            3-6  初始化bitset對象的方法

            bitset<n> b;

            bn位,每位都為0

            bitset<n> b(u);

            bunsigned longu的一個副本

            bitset<n> b(s);

            bstring對象s中含有的位串的副本

            bitset<n> b(s, pos, n);

            bs中從位置pos開始的n個位的副本

            1. unsigned值初始化bitset對象

            當用unsigned long值作為bitset對象的初始值時,該值將轉化為二進制的位模式。而bitset對象中的位集作為這種位模式的副本。如果bitset類型長度大于unsigned long的二進制位數,則其余的高階位置為0;如果bitet類型長度小于unsigned long的二進制位數,則只使用unsigned值中的低階位,超過bitet類型長度的高階位將被丟棄。

            bitset<16> bitvec1(0xffff);          // bits 0 ... 15 are set to 1

            // bitvec2 same size as initializer

            bitset<32> bitvec2(0xffff);          // bits 0 ... 15 are set to 1; 16 ... 31 are 0

            // on a 32-bit machine, bits 0 to 31 initialized from 0xffff

            bitset<128> bitvec3(0xffff);         // bits 32 through 127 initialized to zero

            上面的三個例子中,015位都置為1。由于bitvec1位數少于unsigned long的位數,因此bitvec1的初始值的高階位被丟棄。bitvec2unsigned long長度相同,因此所有位正好放置了初始值。bitvec3長度大于3231位以上的高階位就被置為0

            2. string對象初始化bitset對象

            當用string對象初始化bitset對象時,string對象直接表示為位模式。從string對象讀入位集的順序是從右向左

            string strval("1100");

            bitset<32> bitvec4(strval);
            bitvec4的位模式中23的位置為1,其余位置都為0。如果string對象的字符個數小于bitset類型的長度,則高階位將置為0string象和bitset對象之間是反向轉化的:string對象的最右邊字符(即下標最大的那個字符)用來初始化bitset對象的低階位(即下標為0的位)。當用string對象初始化bitset對象時,記住這一差別很重要。

            不一定要把整個string對象都作為bitset對象的初始值。相反,可以只用某個子串作為初始值:

            string str("1111111000000011001101");

            bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100

            bitset<32> bitvec6(str, str.size() - 4);     // use last 4 characters

            這里用str中從str[5]開始包含四個字符的子串來初始化bitvec5。照常,初始化bitset對象時總是從子串最右邊結尾字符開始的,bitvec5的從03的二進制位置為1100,其他二進制位都置為0。如果省略第三個參數則意味著取從開始位置一直到string末尾的所有字符。本例中,取出str末尾的四位來對bitvec6的低四位進行初始化。bitvec6其余的位初始化為0。這些初始化過程的圖示如下:

            3.5.2  bitset對象上的操作

            多種bitset操作(表3-7)用來測試或設置bitset對象中的單個或多個二進制位:

            3-7  bitset操作

            b.any()

            b中是否存在置為1的二進制位?

            b.none()

            b中不存在置為1的二進制位嗎?

            b.count()

            b中置為1的二進制位的個數

            b.size()

            b中二進制位的個數

            b[pos]

            訪問b中在pos處的二進制位

            b.test(pos)

            b中在pos處的二進制位是否為1

            b.set()

            b中所有二進制位都置為1

            b.set(pos)

            b中在pos處的二進制位置為1

            b.reset()

            b中所有二進制位都置為0

            b.reset(pos)

            b中在pos處的二進制位置為0

            b.flip()

            b中所有二進制位逐位取反

            b.flip(pos)

            b中在pos處的二進制位取反

            b.to_ulong()

            b中同樣的二進制位返回一個unsigned long

            os << b

            b中的位集輸出到os

            1. 測試整個bitset對象

            如果bitset對象中有一個或多個二進制位置為1any操作返回true,也就是說,其返回值等于1;相反,如果bitset對象中的二進制位全為0,none操作返回true

            bitset<32> bitvec; // 32 bits, all zero

            bool is_set = bitvec.any();            // false, all bits are zero

            bool is_not_set = bitvec.none();      // true, all bits are zero

            如果需要知道置為1的二進制位的個數,可以使用count操作,該操作返回置為1的二進制位的個數:

            size_t bits_set = bitvec.count(); // returns number of bits that are on

            count操作的返回類型是標準庫中命名為size_t的類型。size_t類型定義在cstddef頭文件中,該文件是C標準庫的頭文件stddef.hC++版本。它是一個與機器相關的unsigned類型,大小可以保證存儲內存中對象。

            vectorstring中的size操作一樣,bitsetsize操作返回bitset對象中二進制位的個數,返回值的類型是size_t:

            size_t sz = bitvec.size(); // returns 32

            2. 訪問bitset對象中的位

            可以用下標操作符來讀或寫某個索引位置的二進制位,同樣地,也可以用下標操作符測試給定二進制位的值或設置某個二進制位的值:

            // assign 1 to even numbered bits

            for (int index = 0; index != 32; index += 2)

                       bitvec[index] = 1;

            上面的循環把bitvec中的偶數下標的位都置為1

            除了用下標操作符,還可以用settestreset操作來測試或設置給定二進制位的值:

            // equivalent loop using set operation

            for (int index = 0; index != 32; index += 2)

                       bitvec.set(index);

            為了測試某個二進制位是否為1,可以用test操作或者測試下標操作符的返回值:

            if (bitvec.test(i))

                // bitvec[i] is on

            // equivalent test using subscript

            if (bitvec[i])

                // bitvec[i] is on

            如果下標操作符測試的二進制位為1,則返回的測試值的結果為true,否則返回false

            3. 對整個bitset對象進行設置

            setreset操作分別用來對整個bitset對象的所有二進制位全置1和全置0

            bitvec.reset();    // set all the bits to 0.

            bitvec.set();      // set all the bits to 1

            flip操作可以對bitset對象的所有位或個別位按位取反:

            bitvec.flip(0);   // reverses value of first bit

            bitvec[0].flip(); // also reverses the first bit

            bitvec.flip();    // reverses value of all bits

            4. 獲取bitset對象的值

            to_ulong操作返回一個unsigned long值,該值與bitset對象的位模式存儲值相同。僅當bitset類型的長度小于或等于unsigned long的長度時,才可以使用to_ulong操作:

            unsigned long ulong = bitvec3.to_ulong();

            cout << "ulong = " << ulong << endl;

            to_ulong操作主要用于把bitset對象轉到C風格或標準C++之前風格的程序上。如果bitset對象包含的二進制位數超過unsigned long的長度,將會產生運行時異常。本書將在6.13節介紹異常(exception),并在17.1節中詳細地討論它。

            5. 輸出二進制位

            可以用輸出操作符輸出bitset對象中的位模式:

            bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0

            cout << "bitvec2: " << bitvec2 << endl;

            輸出結果為:

            bitvec2: 00000000000000001111111111111111

            6. 使用位操作符

            bitset類也支持內置的位操作符C++義的這些操作符都只適用于整型操作數,它們所提供的操作類似于本節所介紹的bitset作。5.3將介紹這些操作符。

            posted @ 2010-03-26 16:40 鷹擊長空 閱讀(19733) | 評論 (0)編輯 收藏
            最近 和另外兩個同事A,B做一個項目,其實只是一件很簡單的事情,但由于原來的軟件架構設計的很復雜,我調用A的接口,A再調用B的接口。但由于A的原因,功能遲遲不能使用。我后來發現可以直接調用B的接口的,事情很快解決了。

            從這件小事,我深刻明白了功能內聚的必要性,一個功能模塊最好是一個人處理完,不要牽涉到多人,最多不要到兩人以上。而且一個功能牽扯到多人以后,多半會彼此推卸責任,導致效率無比低下。
            posted @ 2010-03-02 10:50 鷹擊長空 閱讀(626) | 評論 (0)編輯 收藏

            今天遇到了一件讓我難忘的事情:可能是升級程序的問題,導致升級不成功,結果實施人員找到我,說我程序有問題,我一查發現版本不對,就告訴了那個部門的負責人,結果那個工程人員被教訓了一頓,我當時沒覺得什么。事后, 那個實施人員向我訴苦,我才發現各人都有自己的苦衷。這也是一種管理之道吧!

            深入下去,就是要在了解真相的前提下做判斷,耐心分析問題,以理服人,也不要得理不饒人,人心都肉長的。
            posted @ 2010-02-03 15:39 鷹擊長空 閱讀(506) | 評論 (0)編輯 收藏
            為了下面一行SQL語句,我弄了整整一下午
            select  *  into  dDB.dbo.wqq  from  openrowset('SQLOLEDB', '192.168.0.10'; 'sa'; 'pwd', sDB.dbo.er)

            感慨下自己的SQL還有待加強,下面是一些資料的整理
            1、openrawset
            openrawset函數從任何支持注冊OLE DB的遠程或者本地數據源獲取數據,比如從SQL Server或Access的遠程實例中提取數據
            --查詢示例
            select * from openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)

            --生成本地表
            select * intofrom openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)

            --把本地表導入遠程表
            insert openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名) select *from 本地表

            --遠程表導入本地
            select  *  into  本地表  from  openrowset('SQLOLEDB', 'sql服務器名'; 'sa'; 'pwd', 數據庫名.dbo.表名)

            --更新本地表
            update b
            set b.列A=a.列A
            from openrowset( 'SQLOLEDB ', 'sql服務器名 '; '用戶名 '; '密碼 ',數據庫名.dbo.表名)as a inner join 本地表 b
            on a.column1=b.column1

            2、openquery
            openquery在給定的鏈接服務器(一個 OLE DB 數據源)上執行指定的直接傳遞查詢。可以在查詢的 FROM 子句中像引用表名那樣引用 OPENQUERY 函數。
            用法需要創建一個連接


            --首先創建一個連接創建鏈接服務器
            exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '遠程服務器名或ip地址 '
            exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, 'user', 'pwd'

            --查詢
            select * FROM openquery(ITSV,  'SELECT *  FROM 數據庫.dbo.表名 ')

            --把本地表導入遠程表
            insert openquery(ITSV,  'SELECT *  FROM 數據庫.dbo.表名 ')
            select * from 本地表

            --更新本地表
            update b
            set b.列B=a.列B
            FROM openquery(ITSV,  'SELECT * FROM 數據庫.dbo.表名 ') as
            inner join 本地表 b on a.列A=b.列A

            posted @ 2010-02-01 23:07 鷹擊長空 閱讀(2013) | 評論 (0)編輯 收藏
                  一份優美的代碼,猶如一棵平衡二叉樹,錯落有致,不蔓不枝。而在現實工作中,常常由于為了趕時間,代碼寫得像懶婆娘的裹腳布-又臭又長,看起來特別不爽。那么這個代碼就需要重構了。
                 當清閑下來時,看到以前的代碼如此凌亂,趕緊想著怎么重構下,該寫成函數的就寫成函數,該封裝的就封裝。
                  清理完畢,看著重構后的代碼,真是神清氣爽啊!
            posted @ 2009-12-11 14:49 鷹擊長空 閱讀(285) | 評論 (0)編輯 收藏
             這篇文章可能不太合適發在這里,它只是我對學習過程的一點感悟,并沒有針對具體的某一方面,比如C++,而且整個思路也比較混亂,不怎么連貫。我想可能跟程序人生有點關系。

            到了一定年紀,每個人不太一樣,一般是1830歲以后,有很多人是不可改變的,他的本我已經太強,根本就不可能穿上對方的鞋子走路,站在對方的角度去思考,如果你覺得自己還能改變的話,請保持并繼續往下看,否則就不用在這里浪費寶貴的享受生命的時間。在走進我們大陸這個光怪陸離的社會漩渦之后,如果還能有百分之一的人保持清醒,這也必然意味著痛苦,那他們就是未來的希望。做純粹的《麥田的守望者》總是痛苦的,如果你也能適應并理解塵世的虛幻和不平,你就會活的輕松許多,畢竟我們的社會還是在進步的。

            可能這里沒有多少人有我的一些經歷,我曾經做過半天的醫生,更有幸目睹了一個新生命的誕生喜劇。伴隨嬰兒哭聲的是母親剖腹而來的滿身鮮血,和她的微笑。看到那一笑的時候,當時我驚呆了,她肯定很痛很痛,但她的微笑是真正的幸福!

            當幸福需要人付出痛的代價的時候,還有多少人愿意去完成?

            尼采說:

            誰終將聲震人間,必長久深自緘默;

            誰終將點燃閃電,必長久如云飄泊。

            我把這句話送給繼續往下看的朋友。

            同時我也不幸看到了一個鮮活生命的悲劇。一個十四歲的女孩輟學做童工,由于那種私營企業主開的廠是沒有什么安全保障的,她的右手被燒紅的鐵壓住了,整個手被壓的變形了,家里也比較困難,她的父親也是一個很軟弱的人,所以找老板也沒有要到多少錢(這是主治醫生跟我們講的)。受傷的右手的治療時間不及時,所以基本上整個右手都殘廢了,我去的那天整好是她第二次來,主要是為手臂植皮。我必須承認,她是一個很好看,很可愛的女孩,只可惜臉上不應該有她這個年紀所有的悲傷,她右手指上的白骨很清晰的可以看見,只有一層皮還掛在上面。當植皮的時候,首先從她大腿的內側割下皮膚,然后在將其移植到手臂上去,盡管打了麻藥,但我知道,仍然是非常非常疼的,但那個女孩自始至終沒有說一句話,我一直托著她的手臂,可能是割皮的時候太疼了,她的呻吟聲我們都聽見了,我們問她疼不疼,她就不呻吟了,但還是不說話,但我分明看見她眼睛晶瑩的淚水順著臉淌下。十指連心,那種痛苦都經歷過了,這點痛苦她已經可以用沉默來承受了!我不是一個會講故事的人,原諒我仍然忘記了很多細節。

            我不是一個容易難過的人,總試圖從反面看到正面,但那一刻,我突然好難過,自己是不是對世界太苛責,其實上天真的給我很多,我的不快樂是不是沒有多少理由,我有時候的沉淪是不是太不負責任。

            前兩天我在小百合的Reading版寫了幾百字的《浮萍的我》,表現了有時候我對世界的無奈,人在江湖,有時候身不由己的人生態度。我選擇媚俗,獲得關注。不過我還是愿意相信世界是美好的!上個星期周末晚上我們學校17個一起到北電去的碩士畢業生聚餐,大家聊的很開心,生活也還是快樂,并將繼續快樂!

            朽木不可雕,糞土之墻不可圬。我們都不會承認自己是朽木,糞土,至少在內心深處不愿意被打倒。其實每個人的潛力都是巨大的,一定要給自己信心,這是成功的第一步。為避免重蹈覆轍,我說一些自己的體驗。

            萬事開頭難,是的,開始總是不知道該學什么,該做什么,不過這個過程也不會太難,只要你不是完全一個人從頭開始的,在群體的慣性下,很快你就會入門。

            它山之石,可以為錯。這個入門的過程在如今的互聯網下面,可以極大的減少原本所需要的精力和時間,在網上,你可以知道你首先應該做什么,學什么,教材的選擇都已經有前面的人為你鋪好了路。你所要做的就是四個字:心如止水。但互聯網也是一個花花世界,它是天使也是魔鬼,里面有太多讓你流連忘返的地方,里面有漂亮的MM,里面有讓人無力自拔的《傳奇》……。但是隨欲浮沉的人生開銷是很高昂的。放縱欲望的代價會在以后的人生中成指數性的增長,你所預支的所有快樂,放高利貸的魔鬼會連本帶息一分不剩的從你身上拿回來——那就是帶給你的巨大痛苦。

            我的建議是:都可以接觸一下,但什么事都要有輕重的掂量,而且應該一直知道,世界是多姿多彩的,網絡永遠不是全部,它甚至只是生活的一個極少的部分。《七宗罪》最后的臺詞——Ernest Hemingway(海明威)說過:“The world is a fine place, I will fight for it!”(這世界是個好地方,值得我為它奮斗!)。前半部分有時候我不同意,但我會努力的實踐后半部分。

            每一樣東西都需要耐性,都需要努力的汗水,才能領略它的別有洞天,它的引人如勝。對許多東西,關鍵不在于它很難,而在于對付它的方法和必要的耐性,準備工作最好做足,必要的基礎要先了解掌握,碰到難題的時候,可以找個人,或者一個布娃娃傾訴,說不定你在訴說的時候,也許會有很多收獲,也許你很快就可以獲得靈感,明白問題的本質,進而將問題解決。

            對初學計算機的讀者,我覺得應該盡快的能夠閱讀英文原版教材。現在的條件真是太好了,計算機科學與技術的幾乎所有好教材都有英文影印版,我很后悔在大學的時候浪費了太多的時間,應該在大三以前就能夠流暢的閱讀英文。有些事是知難行易,告訴你一個秘密,我是在研究生二年級開始買英文書看的,開始的確是苦如煉獄,心浮氣燥,雜念如潮。但是不管學什么,都應該先堅持,然后才能考慮放棄。其實不需要太長的時間,大約一個月的時間就夠了,我就發現技術書籍中的句子,語法,單詞都差不多,讀起來其實有時候比漢語還明白,從中我也學會了許多西方人的思維習慣,英文句子的邏輯性一般都很清晰。其實國內的計算機教材是相當差的,翻譯的也是錯誤百出,而且一般是沒有勘誤表和索引的,對于我這種靠自學的學生來說,有時候碰到原書本身的錯誤這種問題,真是頭痛至極。也許有人會覺得我的英語很好,再告訴你一個秘密,其實我是在2003.1月那次考試才過英語六級的,你真的可以做到!

            在入門之后,就會有一個比較快速的發展期,會覺得什么都不是很難,都能夠一步一步的來。但是過了這個階段,又會發現何時是盡頭,有那么多的東西等著去學,我真的能堅持嗎?前面還要那么多的高峰,我能逾越它們嗎?其實有時候平淡的心是很重要的,根據自己的情況選擇一個方向,每天都有進步,過一段時間,信心就會回來,人生的路不在于開始跑的多快,而在于跑完。蘇東坡說:“古之成大事者,不唯有超世之才,亦必有堅韌不拔之志。”其實小事情不一樣也需要有耐心嗎?

            旦種暮成,朝花夕拾。事以密成,做什么事情有計劃成功的機會會大一些。

            首先需要用文火培元固本。一點一點的慢慢去理解。張無忌學九陽神功花了五年多,令狐沖沒有內力的獨孤九劍只能在成人的童話中出現,在現實的殘酷面前好比風中之燭,轉瞬就逝。基礎的東西再怎么強調都不過分,比如操作系統,如果你愿意花半年的時間好好看看Andrew S. TanenbaumAlbert S. Woodhull的《Operating Systems:Design and Implementation》第二版。我相信你在大陸BBS上問的關于操作系統內核的問題基本上沒有很多人能夠回答你了。

            文火過后,也必須要用武火密集錘煉,集中大量的精力和時間去看很多書,我就很喜歡許多書一起看,互相對比理解的很快,做比較多的題,編較多的程序,那樣也會達到一個質的提高。如果你還有興趣去讀讀西方經濟學和近代西方政治學。我想你會發現很多東西殊途同歸,學問上的境界有時候是和思想上的境界一起提高的。我們也許會發現,眾里尋她千百度,驀然回首,那人卻在燈火闌珊處。《邊荒傳奇》中的燕飛武功上的每一次突破不都是因為精神境界的進步嗎?

            每一個領域都有泰山北斗,我很喜歡了解他們的歷史,了解他們成長的路標,從中學會很多我所要的經驗,對他們,我很尊重,但從來不會謙卑下跪。真正的美德如河流,愈深愈無聲。他們是平靜而平易的。

            不欲速,不欲小利。欲速則不達,欲小利則大事不成。

            做什么事情都應該考慮成本與回報,純粹情感的東西除外:)。無所事事的時候會花費時間成本,可能也會得到偕意的心情。做一件事情的時候,就不能做別的事情,這就是機會成本。我想每個人都應該至少了解一下西方經濟學,馬克思經濟學除外:)

            一龍一蛇與時游。

            《莊子山木篇》云:一龍一蛇,與時俱化,一上一下,以和為量。當得意順心的時候,就如天上矯龍,當失意煩悶的時候,也要學會像蛇一樣,隱匿潛藏。或龍或蛇,屈伸自如,順著時勢變化而行動,不偏滯專為。

            當你寂寞煩躁,無聊郁悶的時候,這種心情本來就是上天給人特別的禮物。你該歇歇了,聽聽鋼琴曲《致愛麗斯》,Saxophone《回家》、《茉莉花》。或者和好朋友去爬山、游泳。和女朋友去看一場浪漫的電影。早上起來晚一點,看看喜歡的胖胖的加菲貓又在說:“如果早上能來的更晚一些的話,我就會更喜歡它。”世界其實很可愛。你又會覺得人生也有別的更多的美好。還是應該拿出時間與女孩子約會的!:)不要讓身在荊棘中跋涉的太久,不要讓心在苦澀中浸沒的太長,以至于失去了品味幸福的能力。

            白云蒼狗,人生如白駒過隙,《流金歲月》中有一句臺詞:“做男人也好,做女人也好,不男不女也好,關鍵是做人要開心。”我很喜歡這句話,但人生在世,不如意者十之八九,對讓你不開心的東西,最好學會去面對,并解決它,不能面對的東西,我會選擇逃避并忘記。至緊是不要讓它影響你的心情太久。最好長夜漫漫,無心睡眠的日子越少越好。

            日暮途窮,山窮水竭的時候,是危機也是生機。做一個有影響力的人,做一個負責任的人,做一個靈活的人,柳暗花明的日子并不會太遙遠。

            一門學問和藝術,想要達到純青之境,需要的有時候不僅僅是努力和汗水,也需要機遇和天分。只要為此付出了努力,付出了汗水,那也就是你的快樂,難道快樂還不夠嗎?

            侯捷在《但教心似金鈿堅》中說:基礎學問如萬古長空,開發工具如一朝風月。不可萬古長空不明一朝風月,不可一朝風月昧卻萬古長空。

            我加兩句注釋:萬古長空畢竟是萬古的,它應該是學問中的主菜,學習的過程中每天都應該吃的;一朝風月畢竟是一朝,即使風月無邊,它也還是學問中的點心,但是整日浸沒在基礎的長空之中,可能會喪失前進的動力和激情,偶爾吃一點點心也是很開心的。:)

            我非常羨慕南大計算機系的學生,那里對我非常喜歡的數學有非常的重視,我曾經有好長時間迷戀小百合的數學精華區。數學是屬于上帝的,高德納(Donald Ervin Knuth)這樣說。我曾經以為,現在仍然這樣希望,如果我本科時候讀數學專業就好了。因為我認為數學是最接近真理的!

            Karl Popper 說過一句我一直非常喜歡的話:“You may be right ,I may be wrong ,but by a effort we are all get nearer to the truth!”(你也許對,我也許錯,但是經過溝通努力我們都能更接近真理!)。每次與別人爭執的時候,我都喜歡想起這句話,如果我們多一份寬容,我們真的會開心很多!

            對他人的尊重,和自己責任的重視。其實在程序設計理念中有一個很有名的Design by Contract(按契約進行設計),其實這是一個很容易理解的概念,一點也不高深,特別是對擁有西方思想的民主國家的人民。可惜我們中國的東方文化缺少了這些,我們幾千年的文明告訴我們:人一生下來就是有高低貴賤之分的。普天之下,莫非王臣,率土之濱,莫非王土。俠之大者,為國為民,國是在民之前的。可惜的是這些東西已經深深的扎根于我們的文化土壤并被用做統治國家的工具。

            人人生而平等。享受權利的同時也要承擔義務,承擔義務的同時也應該享受權利。這就是契約(或者合同)的最基本概念。我來將其簡單的映射于一個排序函數,這個排序函數必須對其要接受的參數進行檢查,這就是它的權利,如果參數不合格,也即不能滿足排序函數的要求,那這個排序函數也就不必要執行它的義務——為傳進來的參數進行排序。Boost庫中有個concept_check,就是為了保證契約(contract)的正確履行。當然,天下大事,必作于細。將其在程序語言中完整實現還是有許多工作要做,目前的各種語言中,Eiffel是做的最好的,Eiffel會強迫你考慮ContractPreconditionPostconditionInvariance。別的語言一般需要靠程序員的自覺。這里面就有民主憲政國家和獨裁國家的影子,在民主國家,每個公民有與生俱來的社會契約約束,獨裁國家則相反,有人不用承擔任何義務,但卻有絕對無上的權利。有時候我不得不感嘆:“我們的國家進步得太慢!”

            寫到這里,我的耳邊正好傳來齊秦在《自己的心情我自己感受》的聲音:

            曾有太多不懂 襲擊著我

            總有些許冷漠 凝聚眼眸

            曾有太多哀愁 不避開我

            總有些許孤獨 涌上心頭

            ……

            就這樣結束吧!

            posted @ 2009-11-08 22:39 鷹擊長空 閱讀(368) | 評論 (0)編輯 收藏
            僅列出標題
            共5頁: 1 2 3 4 5 
            久久久久亚洲国产| 99久久精品免费看国产免费| 99久久精品国产综合一区| 久久国产亚洲精品麻豆| 久久精品国产99久久丝袜| 久久亚洲高清综合| 亚洲国产一成人久久精品| 国产精品美女久久久久网| 久久久久无码专区亚洲av| 久久久久波多野结衣高潮| 好属妞这里只有精品久久| 狠狠综合久久综合中文88| 久久er热视频在这里精品| 国产精品丝袜久久久久久不卡| 99久久精品免费看国产一区二区三区 | 日韩一区二区久久久久久| 伊人久久五月天| 国内精品久久人妻互换| 天天躁日日躁狠狠久久| 青青青国产成人久久111网站| 最新久久免费视频| 综合久久久久久中文字幕亚洲国产国产综合一区首| 性做久久久久久久久浪潮| 青青青青久久精品国产 | 久久精品国产免费观看三人同眠| 久久久久亚洲AV无码专区体验| 精品伊人久久大线蕉色首页| 久久香蕉国产线看观看99| 日韩精品无码久久久久久| 久久久久亚洲av无码专区导航 | 大香网伊人久久综合网2020| 亚洲国产精品无码久久| 亚洲国产成人久久综合碰| 国产精品九九久久免费视频 | 波多野结衣AV无码久久一区| 久久久精品波多野结衣| 青草影院天堂男人久久| 久久99国产精品久久久| 女人香蕉久久**毛片精品| 秋霞久久国产精品电影院| 99久久国产免费福利|