Feeding Frenzy
Posted on January 25th, 2006 at 0:41 by fr3@K

上週, 不來爾 (剛取了老婆, 很幸福喔~) msn jserv 的 blog 給我, 問我有沒有沒有在 blog. 過去, 有時因為工作需要寫教材有時是自己興趣, 斷斷續續的寫了不少東西. 有 threading, networking 等等, 但最多還是 C++. 以我這不時會掉東掉西的個性, 不令人意外地, 現在還找得到的 - 基本上是零. 一聽到不來爾的提議, 馬上就覺得這是個好主意. 雖沒 blog 過, 以看過的 blog 而言 (沒吃過豬肉的人還是看過豬走路滴), 似乎挺適合我隨性寫東寫西, 更省得寫過又找不到.

找個免費 blog hosting 自然是再也簡單不過的事了 (just google). 不想特別花時間比較, 直接上了google 本家的 Blogger 註冊就開始動筆了. 沒寫過 html 更別說 blog 的敝人在下我, 本以為用 blogger 網頁內嵌的 What You See is What You Get 排版編輯器打打字就了事了, 沒想到麻煩就此開始…

也許因為 blog 的是技術性主題, 需要標題, 分段, 條列, 內縮, 顯示源碼等功能. 也或許是 blogger 的排版編輯器與 firefox 相容性不是特別好, 反正怎麼用就是無法排成我想要的效果, 只好動手 hard code 寫 html. 學習需要的排版功能 (說穿了不過是少數的幾個 tag), 並不困難. 麻煩的是既然是 syndicated content (其實我那時候還不太懂這是什麼東東), 當然不能只用 web browser 看看就沒事了, 不訂閱試試看那怎行!?

馬上向我心中的新玩意達人, 大衛劉 (反正想到 iPod, 新手機, Web 2.0 之類的新東西馬上就想到他) 請教. 他條理分明地對我開示 (阿彌陀佛~~), 說明什麼是 syndicated content, feed, Atom, RSS, feed aggregator. 一開始我用 thunderbird 當aggregator 訂閱 COdE fr3@K, 結果是不行. 因為 Blogger 捨 RSS 採用 Atom (Blogger當然用自家力推的規格), 但雷鳥似乎不喜歡 Atom (至少 1.0.7 不支援). 在 Blogger 的 Support (還是 FAQ?) 提到如果使用者就是要用 RSS feed, 建議使用 FeedBuner. 用 FeedBuner 把 COdE fr3@K 轉成 RSS 格式以被訂閱似乎不是問題, 可是有幾篇用雷鳥閱讀會有不同問題. 在經過以 Feed Validator 數小時 debug 後, 剩下一篇依然有嚴重的問題, 但我已經沒氣力繼續與 thunderbird 奮戰了. 接下來在 Mozilla 找到個 Firefox 的 extension, Wizz RSS News Reader. 不確定是否為設定問題 (沒力再 tune 了), Wizz 顯示的 Blog entry 不是我認知的 news feed 樣式, 而是 blog entry URL 所指向網頁的內容, 也就是跟直接看網站沒兩樣 (包括有 iframe, side bar, 背景等等).

正打算棄訂閱者看 feed 的權利於不顧時 (事實上也只有兩隻小貓訂閱, 根本就是自己愛玩), 我沒報太大希望地試著用了兩個給 news (nntp, Atom, RSS) 專用的 aggregator (Liferea 以及 aKregator). 意外地, 不論是訂閱 COdE fr3@K 的 Atom feed 或是 RSS feed, 兩個 reader 都能完全正常顯示每一篇 blog! 現在雖無法以我對 news feeding 的粗淺認識來論斷到底問題出在那個環節, 但至少有兩個 news aggregator 能正常訂閱以及顯示 COdE fr3@K. 呼~ 讓我能先鬆一口氣, 暫時逃避這令人頭疼的 feeding frenzy.

del.icio.us:Feeding Frenzy digg:Feeding Frenzy spurl:Feeding Frenzy newsvine:Feeding Frenzy furl:Feeding Frenzy Y!:Feeding Frenzy 黑米共享書籤:Feeding Frenzy 推推王:Feeding Frenzy
C++ Terminology – 2. Instance and Instantiation
Posted on January 23rd, 2006 at 15:10 by fr3@K

第一次聽到 instance, 是在某段講 template 的文字, 用來表示 class/function template 的具體實現. Template prgramming, 是具有上位性 (相對於傳統 programming) 的寫程式方式, 也就是所謂的 meta programming. 而 instance 指的就是該上位性的實現. 假設有一個 function template:

    template <class T>
    T max (T lhs, T rhs);
    

如果程式中呼叫了兩次 max(), 一次給的 arguemnt 型別為 char, 另一次為 int. 則兩次呼叫的 function 為同一個 function template 所具現出來的兩個 template function, 一個為 max<char>, 另一個為 max<int>.

一個常被 template programming 初學者誤解的是, function template 本身並不是實體, 當然也不能被呼叫, 被呼叫的是它的 instance (實體, 具現化的結果), 也就是 template function. 同樣地, class template 並不能用以生成物件, 用來生成物件的是 class template 的 instance - template class. 只是這些 instance, 不存在 code 裡, 而是在 compile-time 被產生.

不論是 template class, template function 或物件被具現化的動作, 都被稱為 instantiation (動詞為 instantiate), 而具現化的結果都稱為 instance. 若要確切說明其為 template 的具現, 則用 template instantiation. 相對於 instance, object 則較為狹義, 只代傳統物件.

del.icio.us:C++ Terminology - 2. Instance and Instantiation digg:C++ Terminology - 2. Instance and Instantiation spurl:C++ Terminology - 2. Instance and Instantiation newsvine:C++ Terminology - 2. Instance and Instantiation furl:C++ Terminology - 2. Instance and Instantiation Y!:C++ Terminology - 2. Instance and Instantiation 黑米共享書籤:C++ Terminology - 2. Instance and Instantiation 推推王:C++ Terminology - 2. Instance and Instantiation
C++ Terminology – 1. Variety of Types
Posted on January 23rd, 2006 at 11:05 by fr3@K

Fundamental Type

Aka. built-in type, primitive type, native type and etc. C++ core language 原生支援型別. 包含pointer, reference 以及用 const 或 volatile 修飾過的型別 (不包含 C++ Standard Library 定義的型別!), e.g.:

  • float
  • volatile unsigned int
  • const char*
  • double&

Integral Type

為 fundamental type 的 subset. 代表整數的 fundamental type, e.g.:

  • char
  • unsigned short
  • long

User-defined Type

Aka. class type. 使用者自訂型別, 也稱為類或類別. 泛指所有的 struct 與 class, 包含 C++ Standard Library 定義的型別, e.g.:

    class SomeClass;
    struct SomeStruct;
    template  class basic_string;

對 C++ 來說, 在定義 user-defined type 時, classstruct 幾乎是沒有差別且能互相替換 (interchangable). 唯一的差別是預設 (默認) 的存取權限:

    class DerivedClass : /*private*/ BaseClass
    {
    /*private:*/
      int data;
    };
    struct DerivedStruct : /*public*/ BaseStruct
    {
    /*public:*/
      int data;
    };

POD

Acronym for Plain Old Data. User-defined C-style structure. 為 user-defined type 的 subset, 需符合下列條件:

  1. 沒有 user-defined constructor, destructor 以及 assignment operator
  2. 沒有 base class type, 換句話說非 derive 自 user-defined type
  3. 如果有 data member, 其所有 data member 必須為 fundamental type 或 POD

下兩例皆為 POD:

    class SomePodType
    {
    public:
      unsigned int data0;
    };
    struct AnotherPodTypeWithDataMember
    {
      SomePodType data1;
      char data2;
    };

Template Class

也是 user-defined type 的 subset. 為 class template 的 instance (具現), e.g.:

    typedef list<char> IntList;

上例中 list; 為 class template, IntList 為 template class.

Type

泛指任何 fundamental type 或 user-defined type.

del.icio.us:C++ Terminology - 1. Variety of Types digg:C++ Terminology - 1. Variety of Types spurl:C++ Terminology - 1. Variety of Types newsvine:C++ Terminology - 1. Variety of Types furl:C++ Terminology - 1. Variety of Types Y!:C++ Terminology - 1. Variety of Types 黑米共享書籤:C++ Terminology - 1. Variety of Types 推推王:C++ Terminology - 1. Variety of Types
The Hungarian Notation
Posted on January 22nd, 2006 at 3:46 by fr3@K

在 open source 的世界也好, 在公司內部也好, 任何像樣的 project, 大都免不了採用或自訂一套 coding convention. 不同 coding convention 所要達成的目標並不盡相同, 但都有個共同點 – 讓你寫的 code 看起來像是別人寫的. 主要原因是 – 這樣做應該可以讓他人容易閱讀/理解/修改你寫的 code.

Coding convention 主要分為兩個部份:

  • Naming notation (命名法)
  • Formatting (程式格式/排版)

以我個人經驗以及從朋友處得到的消息來看, 公司內部最常採用的 naming notation 是 Hungarian Notation (匈牙利命名法). 把 Hungarian notation 傳播到世界各地, 甚至錯誤地使用在例如 C++ 之類的 strong-typed (或是接近 strong-typed) 語言上, M$ 功不可沒, Win32 SDK 與 MFC 是其中經典之作. 時至今日, 就連 M$ 內部也已展開了反撲, 最好的例子就是 .NET 丟開 M$ 過去採用 hungarian notation 的包袱.

痛恨 hungarian notation, 但這通常不會造成我在工作上的困擾. 我總是能幸運地說服同事與上司放棄它, 或至少不強迫我採用它. 不過還是常會有朋友跟我抱怨公司強迫他們採用 hungarian notation, 他們多是無奈接受. 這帖 blog, 就是為了這些朋友寫的, 如果你剛好在這些公司工作, 不妨把這帖 blog 的 link 轉給你的同事或上司.

Annoyances of the Hungarian Notation:

  • 視你為弱智. 認為你替變數取的名字大都不好, 很難從名字辨認大約的型別
  • 視你為白痴. 認為你有可能會 – 把一個叫做 size 的變數 (不是 integral type 還能是什麼?) 誤判為一個 ifstream 的 instance
  • 視 strong-typed compiler (如 C++ 編譯器) 為低能. 認為 compiler 有可能會 – 在你把一個叫 name 的變數 (不是某種字串還能是什麼?) 當作 ComboBox 來操作時, 不產生 compile error

我常用的命名法則是盡量口語化, 並試著恰如其分地命名. 舉例說明較快:

  • Instance of integral type
    • unsigned long user_count;
      int offset;
      size_t index, received_bytes;
  • User-defined type
    • class Contact;
      class FastString;
      typedef list<Contact> Contacts; // or ContactList
  • Instance of user-defined type
    • string english_name;
      Contacts kens_contacts; // or contacts_of_ken
      Window main_window;

誤判以上所舉例子型別的人, 或許該考慮換個工作 :( .

當然, 上例都是淺顯的例子, 從我個人經驗來說, 應用這原則倒也沒遇過特別困難的狀況. 我想說的並不是我用的方法多好, 而是希望別再有更多人強迫他人或被他人強迫用什麼彆腳的 dwData, wndMain, ctrlBrowser, nCount, szName 來寫 C++.

del.icio.us:The Hungarian Notation digg:The Hungarian Notation spurl:The Hungarian Notation newsvine:The Hungarian Notation furl:The Hungarian Notation Y!:The Hungarian Notation 黑米共享書籤:The Hungarian Notation 推推王:The Hungarian Notation
C++ Terminology – 0. 前序
Posted on January 20th, 2006 at 3:16 by fr3@K

下列 terminology (或是 term, 專有名詞, 專用名詞) 不是用來寫 code, coding 時用的是 keyword. Terminology 是被用在描述, 譬如口述, 討論或 design document 中.

這些 term (當然還有沒在此列舉到的) 看似類似, 或有些模擬兩可, 實際上卻 (在某個程度上) 各自有明確的定義. 有些term有時也讓我抓了抓頭皮, 想了想才搞清楚到底那個是那個. 當然, 肯定也會有人比我猛, 不管任何人再行, 自有一山比他高, 下面這些一個都能不倒他(她):

  • POD vs. Class vs. User-defined Type vs. Type,
  • Instance vs. Object,
  • Class Template vs. Template Class,
  • Member Template vs. Template Member vs. Class Template Member vs. Template Class Member,
  • Specialization vs. Partial Sepcialization.

在進入其他更深入的題材 (或許也只是牢騷或是閒扯蛋) 之前, 建議有興趣的人先把它們大致上搞清楚. 如果你沒好書或好導師的話, 就先將就我所知的定義. 已經準備好部份草稿, 整理一下會陸續 blog 起來. 暫時還沒計畫要將專有名詞這主題分幾次 blog, 也沒有預計 blog 與 blog 之間的順序與間隔. 就隨性吧.

至於被我主觀地認為屬於入門的題材, 如 virtual function, copy-constructable, value type, function overload/override 等等, 應該是不會有什麼著墨. 如果你搞不清楚這些, 建議你別看我的 blog, 先看看書練練功, 以後再來玩吧.

如有同好對我的 blog 有建議或指正, 也請別對我客氣.

del.icio.us:C++ Terminology - 0. 前序 digg:C++ Terminology - 0. 前序 spurl:C++ Terminology - 0. 前序 newsvine:C++ Terminology - 0. 前序 furl:C++ Terminology - 0. 前序 Y!:C++ Terminology - 0. 前序 黑米共享書籤:C++ Terminology - 0. 前序 推推王:C++ Terminology - 0. 前序