星期一, 4月 23, 2007

星期三, 4月 18, 2007

在DOS Batch File中傳遞任意個數參數

星期二, 4月 17, 2007

以C#撰寫的Scott Hanselman Tiny OS

看來是個學習OS以及增強C#功力的好東西

星期日, 4月 15, 2007

在Visual C++使用內建功能偵測memory leak

對於非MFC的程式碼
  • 啟動偵測memory leak :
    在任何一個檔案中,如下定義_CRTDBG_MAP_ALLOC並同時引入兩個header

    #define _CRTDBG_MAP_ALLOC
    #include
    #include

    在程式最後呼叫 _CrtDumpMemoryLeaks();
    或在程式一開頭呼叫 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

  • 只要發現memory leak,就算發生leak的原始碼檔案中沒有引入前述header,還是會傾印出該leak訊息

  • 似乎只有使用malloc所造成的memory leak才會得到完整的錯誤訊息,如:

    c:\temp\testmemoryleakdetection\testmemoryleakdetection.cpp(16) : {106} normal block at 0x003A9FB0, 2 bytes long.
    Data: < > CD CD

  • 在無引入前述header的檔案中發生因new而導致的memory leak,其錯誤訊息如下:

    c:\program files\microsoft visual studio 8\vc\include\crtdbg.h(1147) : {107} normal block at 0x003A3450, 4 bytes long.
    Data: < > CD CD CD CD

  • 在無引入前述header的檔案中發生因malloc而導致的memory leak,其錯誤訊息如下:

    {107} normal block at 0x003A3450, 2 bytes long.
    Data: < > CD CD

  • 在有引入前述header的檔案中發生因new而導致的memory leak,其錯誤訊息如下:

    c:\program files\microsoft visual studio 8\vc\include\crtdbg.h(1147) : {106} normal block at 0x003A9FB0, 4 bytes long.
    Data: < > CD CD CD CD

    這樣的訊息似乎沒有什麼作用,因為並沒有明確指出究竟是哪一部份的程式碼造成這個leak。也許有其他方法可以讓用new的錯誤也能產生完整的訊息。

MFC程式碼
  • MFC程式碼似乎不需做任何設定,自動就有在debug模式下偵測memory leak的功能。可以產生如下的錯誤訊息:

    {126} normal block at 0x003AE548, 4 bytes long.
    Data: < > CD CD CD CD

  • 如果要產生完整的錯誤訊息,必須要在檔案前面加上

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    c:\temp\testmfcmemoryleak\testmfcmemoryleak.cpp(29) : {126} normal block at 0x003AE548, 4 bytes long.
    Data: < > CD CD CD CD

星期日, 4月 08, 2007

Douglas Crockford的Javascript教學

投影片: http://yuiblog.com/assets/crockford/javascript.zip

影片

與C,C++,Java,C#等語言相較,Javascript的特殊之處有

  • Javascript是一個Functional Language
  • 只有一種浮點數字類別,沒有如int之類等其他數字類別。這個唯一的數字類別是
    IEEE-754浮點數標準,其大小為64 bits。
  • 雖然只有一種數字類別,但有一種特殊的數字「值」: NaN (Not a Number)。NaN與自己做等於、大於、小於運算的結果都是false。
  • 在C中,整數0為false,非0整數則被當成true。在Javascript中,此概念被擴大成:
    false, null, undefined, "" (空字串), 0, NaN 都被視為是false,不屬於這些的則都被視為true。
  • + 的怪用法: +"42" 會將字串"42"轉換成數字42。這種用法方便是方便,但,會不會太怪了些。
  • &&的怪用法,用來避免null reference:
    return a &&amp;amp; a.member;

    等同於

    if (a) {
    return a.member;
    } else {
    return a;
    }
  • 的怪用法,用來設定預設值:

    var last = input nr_items;

    上式在input為falsy value時,會指定nr_items給last。
  • break到指定的階層(label)

    loop: for (;;) {
    ...
    if (...) {
    break loop;
    }
    ...
    }
  • 有類似C#中foreach的描述,但有點怪怪的

    for (var name in object) {
    if (object.hasOwnProperty(name)) {
    // within the loop,
    // name is the key of current member
    // object[name] is the current value
    }
    }



注意/建議事項

  • 使用parseInt將字串轉換成數字時,最好使用有兩個參數的版本,明確指定字串所表達數字是幾進位的。否則的話會出現 parseInt("08") ==> 0,只有parseInt("08", 10)能正確轉換成8。

星期二, 4月 03, 2007

軟工大師Grady Booch

  • Software Engineering Radio 專訪
  • BCS/IET Turing Lecture Sides
    • 關於軟體開發我們目前所知的原則有

      基本原則:
      * Craft crisp and resilient abstractions: 建立小而有彈性的抽象層
      * Maintain a good separation of concerns: 適當的耦合
      * Create a balance distribution of responsibilities: 平均分攤責任到各元件或模組

      開發流程原則:
      Grow a system’s architecture through the incremental and iterative release of testable executables

Database大師 Jim Gray

Peter Chen (陳品山) 與 ER Model

Peter Chen, ER Model創始者

星期一, 4月 02, 2007

vc++ strncpy_s

char buf[10];
const char* source = "0123456789abc";

//strncpy_s(buf, 10, source, 10); // 執行時會發生錯誤,因為Buffer 10太小,應該要有11才能夠放下之後的null

//strncpy_s(buf, 11, source, 10); // 會發生runtime check failure,因為已經11超過buf的大小10

strncpy_s(buf, 10, source, 9); // 012345678 會正確填入