<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-21195575</id><updated>2011-11-16T03:26:05.608+08:00</updated><title type='text'>COdE fr3@K</title><subtitle type='html'>用passion，&lt;br&gt;
讓生命這趟單向旅程，&lt;br&gt;
沿途都是美景...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-21195575.post-114538889366765859</id><published>2006-04-19T03:32:00.000+08:00</published><updated>2006-04-19T03:34:53.676+08:00</updated><title type='text'>New Blog Hosting</title><content type='html'>&lt;p&gt;
COdE fr3@K已移到新的&lt;a href="http://fsfoundry.org/codefreak"&gt;service provider&lt;/a&gt;上，所有post以及comment都成功轉移.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-114538889366765859?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/114538889366765859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=114538889366765859' title='353 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/114538889366765859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/114538889366765859'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/04/new-blog-hosting.html' title='New Blog Hosting'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>353</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21195575.post-114500378133223269</id><published>2006-04-13T21:33:00.000+08:00</published><updated>2006-04-15T00:38:09.670+08:00</updated><title type='text'>CUJ merged with DDJ</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5739/2141/1600/cuj.0.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/5739/2141/320/cuj.0.jpg" border="0" alt="" width="180" height="120" title="帶到北京來的幾本CUJ"/&gt;&lt;/a&gt;
&lt;p&gt;
這是感傷的一天，因為今晚剛知道，今年三月&lt;a href="http://www.cmp.com/products/pr_det_cplususerjrnl.jhtml" title="C/C++ Users Journal"&gt;CUJ&lt;/a&gt;已被併入&lt;a href="http://www.cmp.com/products/pr_det_drdobbs.jhtml" title="Dr. Dobb's Journal"&gt;DDJ&lt;/a&gt;。&lt;a href="http://www.cuj.com"&gt;原本CUJ的首頁&lt;/a&gt;已被redirect到&lt;a href="http://www.ddj.com/pubs/cuj/"&gt;DDJ的頁面&lt;/a&gt;，顯示這樣的announcement:
&lt;ul&gt;
&lt;h4&gt;C/C++ Users Journal&lt;/h4&gt;
Effective with the March 2006 issue, the C/C++ Users Journal has merged with Dr. Dobb's Journal, which will now feature expanded C and C++ coverage. Past issues of CUJ—including source code—are available.
&lt;/ul&gt;
CUJ停刊了，而DDJ會增加C/C++的篇幅。雖然我也看DDJ，但與CUJ相比，喜愛的程度是無法相提並論的。即使改版，也不會變成另一本CUJ。
&lt;/p&gt;
&lt;p&gt;
這種感覺就像是某天猛然發現最喜歡的coffee shop關門大吉，再也不能在週末把三五好友約在那裡談天說地。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-114500378133223269?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/114500378133223269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=114500378133223269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/114500378133223269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/114500378133223269'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/04/cuj-merged-with-ddj.html' title='CUJ merged with DDJ'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21195575.post-114485588139065078</id><published>2006-04-12T19:18:00.000+08:00</published><updated>2006-04-18T17:54:05.116+08:00</updated><title type='text'>Free Software vs Open Source</title><content type='html'>&lt;p&gt;
&lt;a href="http://www.fsf.org/licensing/essays/free-sw.html"&gt;Free Software&lt;/a&gt;（&lt;a href="http://www.stallman.org/"&gt;Richard Stallman&lt;/a&gt;於二十多年前離開MIT開始推廣的運動）常被許多人與&lt;a href="http://www.opensource.org/docs/definition.php"&gt;Open Source&lt;/a&gt;（於1998年由Free Software分支出來的運動）混為一談。
&lt;/p&gt;

&lt;p&gt;
Free Software強調的是&lt;b&gt;自由&lt;/b&gt;。指的是言論自由（free speech）的自由，而非免費喝到飽（free beer）的自由。這運動主張所有Free Software的使用者有&lt;a href="http://www.gnu.org/philosophy/free-sw.html"&gt;四種自由/權力&lt;/a&gt;：
&lt;ul&gt;
  &lt;li&gt;不論目的使用Free Software。&lt;/li&gt;
  &lt;li&gt;研究Free Software如何運作，並可因應使用者需求修改。使用者必須能取得源碼，為達成這自由的一個前提。&lt;/li&gt;
  &lt;li&gt;重新發布Free Software。讓使用者也能幫助他人。&lt;/li&gt;
  &lt;li&gt;改進Free Software，對公眾發布修改過的版本，讓整個社群都能受益。使用者必須能取得源碼，為達成這自由的一個前提。&lt;/li&gt;
&lt;/ul&gt;
Free Software運動主張的是使用者的自由/權力，而不是使用者行使該自由/權力所需付出代價（或是$$$）。Free Software的作者大可對一個使用者收取高額的源碼發布費用，但不能阻止這使用者免費對大眾發布原始或修改後的源碼。或許跟許多人對Free Software的刻板印象有不小的出入，但這就是Free Software的哲學。至於是否強制使用者將修改過的源碼對外發布，則因&lt;a href="http://www.fsf.org/licensing/licenses/index_html"&gt;不同Free Software license&lt;/a&gt;而異。部份Free Software license允許使用者無條件或滿足特定條件下，不對外發布修改後的源碼。
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://www.gnu.org/copyleft/gpl.html" title="GNU General Public License"&gt;GPL&lt;/a&gt;是最為人知的Free Software license之一。概略的說，除了Free Software主張的使用者自由/權利之外，GPL還加上了保護社群及回饋公眾的機制：
&lt;ul&gt;
  &lt;li&gt;一個軟體必須是GPL才能使用GPL的源碼或link GPL的library。這主要是為了限制non-free software不能站在GPL軟體的肩膀上與GPL軟體競爭，並鼓勵其他與&lt;a href="http://www.gnu.org/licenses/gpl-faq.html#WhatDoesCompatMean"&gt;GPL相容&lt;/a&gt;的Free Software加入GPL社群。&lt;/li&gt;
  &lt;li&gt;任何人以任何形式發布GPL軟體（包含源碼），就必須將該軟體以GPL授權給所有的人。被授權並不代表可以向發布者要求一份免費的複本，發布者依然可以向你收費。若沒對外發布過，則不需要滿足任何發布源碼的要求。&lt;/li&gt;
&lt;/ul&gt;
&lt;a href="http://www.gnu.org/copyleft/lesser.html" title="GNU Lesser General Public License"&gt;LGPL&lt;/a&gt;可說是GPL的子集。把上列GPL機制的第一項拿掉，再把第二項的GPL替換成LGPL。
&lt;/p&gt;

&lt;p&gt;
不論對Free Software的哲學認同與否，Free Software代表的是一種價值觀，一種信仰。相對的，Open Source運動的訴求則簡單許多 - 就是開放源碼，與使用者的自由/權力無關，有時源碼開放的程度也相對的比Free Software少許多，少到近乎好笑的地步。有個&lt;a href="http://www.gnu.org/philosophy/free-software-for-freedom.html#newinnovember"&gt;真實故事&lt;/a&gt;大概是這樣子的。1998年，有個以&lt;a href="http://www.gnu.org/gnu/linux-and-gnu.html" title="正確說法為GNU/Linux"&gt;所謂Linux&lt;/a&gt;為主題的商展，一位知名公司的高級主管被邀請為主講者，會中他說:
&lt;blockquote&gt;&lt;p&gt;
  我們不可能把我們的產品開放源碼，但我們有可能會對"公司內部"開放源碼，例如對客服部開放.....
&lt;/p&gt;&lt;/blockquote&gt;
聽起來幾近不可思議，對公司內部能算開放源碼！？但其實上述情況卻是符合Open Source運動精神的。也就是要讓除了（原始）開發人員外，能有更多人能看到軟體的源碼，進而找出更多源碼中的問題，提高軟體品質。
&lt;/p&gt;

&lt;p&gt;
Open Source只是一種方法，一種軟體開發的方法。而Free Software是自由的追求，是個社會運動。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-114485588139065078?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/114485588139065078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=114485588139065078' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/114485588139065078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/114485588139065078'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/04/free-software-vs-open-source.html' title='Free Software vs Open Source'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21195575.post-114460268879290855</id><published>2006-04-02T22:41:00.000+08:00</published><updated>2006-04-13T02:50:31.100+08:00</updated><title type='text'>C/C++ Tips - The Marco Assert</title><content type='html'>&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;
  &lt;a href=http://www.die.net/doc/linux/man/man3/assert.3.html&gt;assert()&lt;/a&gt;是個用來debug的macro, 接受一個expression. 如果expression被evalute的結果為整數零, 或能被convert成零(如null pointer), 則會引發&lt;b&gt;assertion failure&lt;/b&gt;. Assertion failure會ouput被evluate為零的expression以及其位置, 包括file name, line number(有些compiler也會output function name)至&lt;b&gt;standard error&lt;/b&gt;. 緊接著, 發生assertion failure的process會呼叫&lt;a href=http://www.die.net/doc/linux/man/man3/abort.3.html&gt;abort()&lt;/a&gt;, 導致process結束(有些compiler會產生core dump). 用以驗證下列precondition:&lt;ul&gt;
    &lt;li&gt;Client code對function的操作, 例如給予的參數合不合規範, 或呼叫相關functions的順序是否正確&lt;/li&gt;
    &lt;li&gt;Function作者的假設&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;

&lt;h3&gt;Assertion Failure Output&lt;/h3&gt;
&lt;p&gt;
  假設有個在str_util.c的library function:
  &lt;ul&gt;&lt;pre&gt;
size_t string_length (const char* str)
{
  // Precondition assertion, client input buffer
  // must be a valid string and must not be null!
  assert(str != NULL);
  // ...
}
  &lt;/pre&gt;&lt;/ul&gt;
  當assertion failure發生時, user會於standard error(通常就是terminal)看到類似這樣的訊息:
  &lt;ul&gt;&lt;pre&gt;
AppName: str_util.c:245: size_t string_length():
  Assertion `str != NULL' failed.
  &lt;/pre&gt;&lt;/ul&gt;
  這訊息對user(一個programmer)來說通常沒有多大助益, 除非user剛好熟悉這段發生assertion failure的code, 或是能取得發生assertion failure的source code.&lt;br&gt;
  假設user能取得這段source code, 有時就算沒有作者的comment, 也應該能合理堆測作者對這function設下了precondition, 此例的precondition為client code所給用以讀取的buffer(str)不能為NULL(當然, 所有precondition最好是寫在說明文件, 若沒文件最起碼也要有comment).&lt;br&gt;
  如果你是這library function的作者, 除了做好說明文件以及在source code裡寫足comment, 還有什麼是你能為使用者做的? 讓這使用者在發生assertion failure時更容易修正client code.
&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;More Verbose Output&lt;/h3&gt;
&lt;p&gt;
  &lt;a href= "http://synesis.com.au/publishing/imperfect/cpp/"&gt;Imperfect C++&lt;/a&gt;(希望沒記錯)提出了一個小技巧, 用在這個地方特別適用. 把上例做點小小修改:
  &lt;ul&gt;&lt;pre&gt;
size_t string_length (const char* str)
{
  assert("Precondition failed, client supplied "
    "input buffer must be a valid string and must "
    "not be null" &amp;&amp; str != NULL);
  // ...
}
  &lt;/pre&gt;&lt;/ul&gt;
  幾乎只是把原來的comment搬到assert的expression中, 就能在assertion failure發生時產生更有用的output:
  &lt;ul&gt;&lt;pre&gt;
AppName: str_util.c:245: size_t string_length():
  Assertion `"Precondition failed, client
  supplied input buffer must be a valid string
  and must not be null" &amp;&amp; str != NULL' failed.
  &lt;/pre&gt;&lt;/ul&gt;
  這樣的訊息對user來說明顯的有用多了, user可以清楚知道client code給了string_length()一個null pointer, 而這違反了該function的precondition. User不需要取得該function的source code(甚至不用參考說明文件)也能知道如何修正這個錯誤.
&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;Macro Side-Effect&lt;/h3&gt;
&lt;p&gt;
  Assert是個macro, 即使是經驗老到的人, 有時也會忽略掉若是以&lt;b&gt;-DNDEBUG&lt;/b&gt;或是M$VC所謂的&lt;b&gt;Relase Mode&lt;/b&gt;編譯, assert不但不會產生任何效果, 給assert的expression更是不會被evaluate. 例:
  &lt;ul&gt;&lt;pre&gt;
int foo ();
void bar ()
{
  assert(foo());
}
  &lt;/pre&gt;&lt;/ul&gt;
  以-DNDEBUG編譯, foo()不會被呼叫.

&lt;h3&gt;Macro Side-Effect, C++ Specific&lt;/h3&gt;
  &lt;b&gt;C++ Standard Library&lt;/b&gt;繼承了絕大部份(也許是全部, 但我不確定)&lt;b&gt;C Standard Library&lt;/b&gt;. 只是在include standard header時, 由原來的:
  &lt;ul&gt;&lt;pre&gt;
#include &amp;lt;assert.h&amp;gt;
  &lt;/pre&gt;&lt;/ul&gt;
  變成:
  &lt;ul&gt;&lt;pre&gt;
#include &amp;lt;cassert&amp;gt;
  &lt;/pre&gt;&lt;/ul&gt;
  而且會把在該header中屬於global namespace的declartion, 移到&lt;b&gt;std&lt;/b&gt;這個namespace當中. 但由於macro(&lt;a href=http://www.die.net/doc/linux/man/man3/errno.3.html&gt;errno&lt;/a&gt;也是macro)是preprocessor直接替換的, 與namespace無關(compiler才懂namespace). 因此使用起來像是存在於所有namespace當中(這也是盡量別用macro的原因之一).
&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;Scenarios Not to Use Assert&lt;/h3&gt;
&lt;p&gt;
  有些情況, 寫library的人會錯誤地使用assert, 如:
  &lt;ul&gt;&lt;pre&gt;
class SomeClass;
void faux (SomeClass* ptr)
{
  assert(ptr != NULL);
  // ...
}
void foobar (int n)
{
  assert(n &gt;= 0);
  // ...
}
  &lt;/pre&gt;&lt;/ul&gt;
  如果你的code看起來像上例的話, 請像下面這樣, 把interface改一改吧:
  &lt;ul&gt;&lt;pre&gt;
void faux (SomeClass&amp; instance)
{
  // ...
}
void foobar (unsigned int n)
{
  // ...
}
  &lt;/pre&gt;&lt;/ul&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-114460268879290855?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/114460268879290855/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=114460268879290855' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/114460268879290855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/114460268879290855'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/04/cc-tips-marco-assert.html' title='C/C++ Tips - The Marco Assert'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21195575.post-113812743063107225</id><published>2006-01-25T00:41:00.000+08:00</published><updated>2006-04-12T09:43:25.700+08:00</updated><title type='text'>Feeding Frenzy</title><content type='html'>&lt;p&gt;
上週, 不來爾 (剛取了老婆, 很幸福喔~) msn &lt;a href="http://blog.linux.org.tw/%7Ejserv/"&gt;jserv的blog&lt;/a&gt;給我, 問我有沒有沒有在blog. 過去, 有時因為工作需要寫教材有時是自己興趣, 斷斷續續的寫了不少東西. 有threading, networking等等, 但最多還是C++. 而以我這有時會掉東掉西的個性, 不令人意外地, 現在還找得到的 - 幾乎是零. 一聽到不來爾的提議, 馬上就覺得這是個好主意. 雖沒blog過, 以看過的blog形式而言 (沒吃過豬肉的人還是看過豬走路D), 應該會適合我這主題寫一點那主題寫一點, 更省得寫過又找不到.
&lt;/p&gt;
&lt;p&gt;
找個免費blog hosting自然是再也簡單不過的事了 (just google). 不想特別花時間比較 (花時間寫東西實在些), 直接上了google本家的&lt;a href="http://www.blogger.com"&gt;blogger&lt;/a&gt;註冊. 沒寫過html更別說blog的敝人在下我, 本以為用blogger網頁內嵌的What You See is What You Get排版編輯器打打字就了事了, 沒想到麻煩就此開始...
&lt;/p&gt;
&lt;p&gt;
也許因為blog的是技術性主題, 需要標題, 分段, 條列, 內縮, 顯示源碼等功能. 也許是blogger的排版編輯器與firefox相容性不是特別好, 反正怎麼用就是無法排成我想要的效果, 只好動手hard code寫html. 學習需要的排版功能 (說穿了不過是少數的幾個tag), 並不困難. 麻煩的是既然是syndicated content (其實我那時候還不知道這個詞), 當然不能只用web browser看看就沒事了, 不訂閱試試看那怎行!?
&lt;/p&gt;
&lt;p&gt;
馬上向我心中的新玩意達人, 大衛劉 (反正想到nano, 新手機, 新科技之類的新東西馬上就想到他) 請教. 他條理分明地對我開示 (阿彌陀佛~~), 說明什麼是syndicated content, feed, Atom, RSS, feed aggregator. 一開始我用thunderbird當aggregator訂閱&lt;a href=http://codefreak.blogspot.com/&gt;COdE fr3@K&lt;/a&gt;, 結果是不行. 因為blogger捨RSS採用Atom (blogger當然用自家力推的規格), 但雷鳥似乎不喜歡Atom (至少1.0.7不支援). 在blogger的support (還是FAQ?) 提到如果使用者就是要用RSS feed, 建議使用&lt;a href=http://www.feedburner.com&gt;FeedBuner&lt;/a&gt;. 用FeedBuner把COdE fr3@K轉成RSS格式以被訂閱似乎不是問題, 可是有幾篇blog用雷鳥會有不同問題狀況. 在經過以&lt;a href=http://feedvalidator.org/&gt;Feed Validator&lt;/a&gt;數小時debug/修正後, 剩下一個blog依然有嚴重的問題, 但我已經沒氣力繼續與thunderbird奮戰了. 接下來在&lt;a href=http://www.mozilla.org&gt;mozilla&lt;/a&gt;找到個firefox的extension, &lt;a href=http://www.wizzcomputers.com/WizzRss.php&gt;Wizz RSS News Reader&lt;/a&gt;. 不確定是否為設定問題 (沒力fine tune), Wizz顯示的blog entry不是news feed的樣式, 而是blog entry URL指向網頁的內容, 也就是跟直接看網站的內容沒兩樣 (包括有iframe, side bar, 背景等等).
&lt;/p&gt;
&lt;p&gt;
正打算棄訂閱者看feed的權利於不顧時 (事實上也只有幾隻小貓訂閱, 根本就是自己愛玩), 我沒報太大希望地試著用了兩個給news (nntp, Atom, RSS) 專用的aggregator (&lt;a href=http://liferea.sourceforge.net/&gt;Liferea&lt;/a&gt;以及&lt;a href=http://akregator.sourceforge.net/&gt;aKregator&lt;/a&gt;). 意外地, 不論是訂閱&lt;a href=http://codefreak.blogspot.com&gt;Atom feed&lt;/a&gt;或是&lt;a href=http://feeds.feedburner.com/codefreak&gt;RSS feed&lt;/a&gt;, 兩者都能完全正常顯示每一篇blog! 現在雖無法以我對news feeding的粗淺認識來論斷到底問題出在那個環節, 但至少有兩個news aggregator能正常訂閱以及顯示COdE fr3@K. 呼~ 讓我能先鬆一口氣, 暫時逃避這令人頭疼的feeding frenzy.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-113812743063107225?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/113812743063107225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=113812743063107225' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113812743063107225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113812743063107225'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/01/feeding-frenzy.html' title='Feeding Frenzy'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21195575.post-113800574295950735</id><published>2006-01-23T15:10:00.000+08:00</published><updated>2006-01-24T18:35:20.926+08:00</updated><title type='text'>C++ Terminology - 2. Instance and Instanciation</title><content type='html'>&lt;p&gt;
第一次聽到instance, 是在某個template的論述上, 用來表示template的具現. Template prgramming, 是具有&lt;b&gt;上位性&lt;/b&gt; (相對於傳統programming) 的programming, 也就是所謂的meta programming. 而instance指的就是該上位性的實現. 假設有一個function template:
&lt;/p&gt;
&lt;ul&gt;&lt;pre&gt;
template &amp;lt;class T&amp;gt;
T max (T lhs, T rhs);
&lt;/pre&gt;&lt;/ul&gt;
&lt;p&gt;
如果程式中呼叫了兩次max&amp;lt;&amp;gt;, 一次給的arguemnt型別為char, 另一次為int. 則兩次呼叫的function為同一個function template (i.e. max&amp;lt;&amp;gt;) 所具現出來的兩個template function, 一個為max&amp;lt;char&amp;gt;, 另一個為max&amp;lt;int&amp;gt;.
&lt;/p&gt;
&lt;p&gt;
一個常被template programming初學者誤解的是, function template本身並不是實體, 當然也不能被呼叫, 被呼叫的是它的instance (實體, 具現化的結果), 也就是 template function. 同樣地, class template並不能用以生成物件, 用來生成物件的是class template的instance, 也就是template class. 只是這些instance, 不存在code裡, 而是在compile-time自動被產生.
&lt;/p&gt;
&lt;p&gt;
不論是template class, template function或物件被具現化的動作, 都被稱為instanciation (動詞為instanciate), 而具現化的結果都稱為instance. 若要確切說明其為template的具現, 則用template instanciation. 相對於instance, object則較為狹義, 只代&lt;b&gt;傳統物件&lt;/b&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-113800574295950735?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/113800574295950735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=113800574295950735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113800574295950735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113800574295950735'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/01/c-terminology-2-instance-and.html' title='C++ Terminology - 2. Instance and Instanciation'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21195575.post-113798660569815178</id><published>2006-01-23T11:05:00.000+08:00</published><updated>2006-01-24T17:05:50.326+08:00</updated><title type='text'>C++ Terminology - 1. Variety of Types</title><content type='html'>&lt;h4&gt;Fundamental Type&lt;/h4&gt;
&lt;ul&gt;&lt;p&gt;
    Aka. built-in type, primitive type, native type and etc. &lt;br&gt;
    C++ core language原生支援型別. 包含pointer, reference以及用const或volatile修飾過的型別 (不包含C++ Standard Library定義的型別!), e.g.: &lt;ul&gt;
        &lt;li&gt;float&lt;/li&gt;
        &lt;li&gt;volatile unsigned int&lt;/li&gt;
        &lt;li&gt;const char*&lt;/li&gt;
        &lt;li&gt;double&amp;&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;&lt;/ul&gt;
&lt;h4&gt;Integral Type&lt;/h4&gt;
&lt;ul&gt;&lt;p&gt;
    為fundamental type的subset. 代表整數的fundamental type, e.g.: &lt;ul&gt;
        &lt;li&gt;char&lt;/li&gt;
        &lt;li&gt;unsigned short&lt;/li&gt;
        &lt;li&gt;long&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;&lt;/ul&gt;
&lt;h4&gt;User-defined Type&lt;/h4&gt;
&lt;ul&gt;&lt;p&gt;
    Aka. class type. &lt;br&gt;
    使用者自訂型別, 也稱為類或類別. 泛指所有的struct與class, 包含C++ Standard Library定義的型別, e.g.:
    &lt;ul&gt;&lt;pre&gt;
class SomeClass;
struct SomeStruct;
template &amp;lt;class, class&amp;gt; class basic_string;&lt;/pre&gt;&lt;/ul&gt;
    對C++來說, 在定義user-defined type時, class與struct幾乎是沒有差別且能互相替換 (interchangable). 唯一的差別是預設(默認)的存取權限：
    &lt;ul&gt;&lt;pre&gt;
class DerivedClass : /*private*/ BaseClass
{
/*private:*/
    int data;
};
struct DerivedStruct : /*public*/ BaseStruct
{
/*public:*/
    int data;
};&lt;/pre&gt;&lt;/ul&gt;
&lt;/p&gt;&lt;/ul&gt;
&lt;h4&gt;POD&lt;/h4&gt;
&lt;ul&gt;&lt;p&gt;
    Acronym for Plain Old Data. &lt;br&gt;
    User-defined C-style structure. 為user-defined type的subset, 需符合下列條件: &lt;ol&gt;
        &lt;li&gt;沒有user-defined constructor, destructor以及assignment operator &lt;/li&gt;
        &lt;li&gt;沒有base class type, 換句話說非derive自user-defined type &lt;/li&gt;
        &lt;li&gt;如果有data member, 其所有data member必須為fundamental type或POD &lt;/li&gt;&lt;/ol&gt;
    下兩例皆為POD:
    &lt;ul&gt;&lt;pre&gt;
class SomePodType
{
public:
    unsigned int data0;
};
struct AnotherPodTypeWithDataMember
{
    SomePodType data1;
    char data2;
}; &lt;/pre&gt;&lt;/ul&gt;
&lt;/p&gt;&lt;/ul&gt;

&lt;h4&gt;Template Class&lt;/h4&gt;
&lt;ul&gt;&lt;p&gt;
    也是user-defined type的subset. 為Class template的instance (具現), e.g.:
    &lt;ul&gt;&lt;pre&gt;
typedef list&amp;lt;char&amp;gt; IntList;&lt;/pre&gt;&lt;/ul&gt;
    上例中list&amp;lt;&amp;gt;為class template, IntList為template class.
&lt;/p&gt;&lt;/ul&gt;
&lt;h4&gt;Type&lt;/h4&gt;
&lt;p&gt;&lt;ul&gt;
    泛指任何fundamental type或user-defined type.
&lt;/p&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-113798660569815178?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/113798660569815178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=113798660569815178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113798660569815178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113798660569815178'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/01/c-terminology-1-variety-of-types.html' title='C++ Terminology - 1. Variety of Types'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21195575.post-113787281306251977</id><published>2006-01-22T03:46:00.000+08:00</published><updated>2006-01-25T14:23:11.306+08:00</updated><title type='text'>Naming Notation - 1. the Hungarian Notation</title><content type='html'>&lt;p&gt;
在open source的世界也好, 在公司內部也好, 任何像樣的project, 大都免不了採用或自訂一套coding convention. 不同coding convention所要達成的目標並不盡相同, 但都有個共同點 - 讓你寫的code看起來像是別人寫的. 主要原因是 - 這樣做&lt;b&gt;應該&lt;/b&gt;可以讓他人容易閱讀/理解/修改你寫的code.
&lt;/p&gt;
&lt;p&gt;
Coding convention主要分為兩個部份:&lt;ul&gt;
&lt;li&gt;Naming notation (命名法)&lt;/li&gt;
&lt;li&gt;Formatting (程式格式/排版)&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
以我個人經驗以及從朋友處得到的消息來看, 公司內部最常採用的naming notation是Hungarian Notation (匈牙利命名法). Hungarian notation的歷史我不清楚, 但把它傳播到世界各地, 甚至錯誤地使用在例如C++之類的strong-typed (或是接近strong-typed) 語言上, M$ (危軟) 功不可沒, Win32 SDK與MFC是其中&lt;b&gt;經典&lt;/b&gt;之作. 時至今日, 就連M$內部也已展開了反撲, 最好的例子就是.NET丟開M$過去採用hungarian notation的包袱.
&lt;/p&gt;
&lt;p&gt;
我&lt;b&gt;痛恨&lt;/b&gt;hungarian notation, 但這通常不會造成我在工作上的困擾. 我總是能幸運地說服同事與上司放棄它, 或至少不強迫我採用它. 不過還是常會有朋友跟我抱怨公司強迫他們採用hungarian notation, 他們多是無奈接受. 這帖blog, 就是為了這些朋友寫的, 如果你剛好在這些公司工作, 不妨把這帖blog的&lt;a href="http://codefreak.blogspot.com/2006/01/naming-notation_22.html"&gt;link&lt;/a&gt;轉給你的同事或上司.
&lt;/p&gt;
&lt;p&gt;
Annoyances of the Hungarian Notation:
&lt;ul&gt;&lt;li&gt; 視你為弱智. 認為你替變數取的名字大都不好, 很難從名字辨認大約的型別 &lt;/li&gt;
    &lt;li&gt; 視你為白痴. 認為你有可能會 - 把一個叫做size的變數 (不是integral type還能是什麼?) 誤判為一個ifstream的instance &lt;/li&gt;
    &lt;li&gt; 視strong-typed compiler (如C++編譯器) 為無能. 認為compiler有可能會 - 在你把一個叫name的變數 (不是某種字串還能是什麼?) 當作ComboBox來操作時, 不產生compile error &lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
我常用的命名法則是盡量口語化, 並試著恰如其分地命名. 舉例說明較快:
&lt;ul&gt;&lt;li&gt; Instance of integral type &lt;/li&gt;
    &lt;ul&gt;&lt;pre&gt;
unsigned long user_count;
int offset;
size_t index, received_bytes;&lt;/pre&gt;&lt;/ul&gt;
    &lt;li&gt; User-defined type &lt;/li&gt;
    &lt;ul&gt;&lt;pre&gt;
class Contact;
class FastString;
typedef list&amp;lt;Contact&amp;gt; Contacts; // or ContactList&lt;/pre&gt;&lt;/ul&gt;
    &lt;li&gt; Instance of user-defined type &lt;/li&gt;
    &lt;ul&gt;&lt;pre&gt;
string english_name;
Contacts kens_contacts; // or contacts_of_ken
Window main_window;&lt;/pre&gt;&lt;/ul&gt;&lt;/ul&gt;
誤判以上所舉例子型別的人, 或許該考慮換個工作:(.
&lt;/p&gt;
&lt;p&gt;
當然, 上例都是淺顯的例子, 從我個人經驗來說, 應用這原則倒也沒遇過特別困難的狀況. 我想blog的並不是我用的方法多好, 而是希望別再有更多人強迫他人或被他人強迫用什麼彆腳的 dwData, wndMain, ctrlBrowser, nCount, szName來寫C++.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-113787281306251977?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/113787281306251977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=113787281306251977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113787281306251977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113787281306251977'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/01/naming-notation-1-hungarian-notation.html' title='Naming Notation - 1. the Hungarian Notation'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-21195575.post-113769961365886482</id><published>2006-01-20T03:16:00.000+08:00</published><updated>2006-02-07T14:46:48.440+08:00</updated><title type='text'>C++ Terminology - 0. 前序</title><content type='html'>&lt;p&gt;
下列terminology (或是term, 專有名詞, 專用名詞) 不是用來寫code, coding時用的是keyword. Terminology是被用在描述, 譬如口述, 討論或design document中.
&lt;/p&gt;
&lt;p&gt;
這些term (當然還有沒在此列舉到的) 看似類似, 或有些模擬兩可, 實際上卻 (在某個程度上) 各自有明確的定義. 有些term有時也讓我抓了抓頭皮, 想了想才搞清楚到底那個是那個. 當然, 肯定也會有人比我猛, 不管任何人再行, 自有一山比他高, 下面這些一個都能不倒他(她):
&lt;ul&gt;&lt;li&gt;POD vs. Class vs. User-defined Type vs. Type,&lt;/li&gt;
    &lt;li&gt;Instance vs. Object,&lt;/li&gt;
    &lt;li&gt;Class Template vs. Template Class,&lt;/li&gt;
    &lt;li&gt;Member Template vs. Template Member vs. Class Template Member vs. Template Class Member,&lt;/li&gt;
    &lt;li&gt;Specialization vs. Partial Sepcialization.&lt;/li&gt;&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
在進入其他更深入的題材 (或許也只是牢騷或是閒扯蛋) 之前, 建議有興趣的人先把它們大致上搞清楚. 如果你沒好書或好導師的話, 就先將就我所知的定義. 已經準備好部份草稿, 整理一下會陸續blog起來. 暫時還沒計畫要將&lt;b&gt;專有名詞&lt;/b&gt;這主題分幾次blog, 也沒有預計blog與blog之間的順序與間隔. 就隨性吧.
&lt;/p&gt;
&lt;p&gt;
至於被我&lt;b&gt;主觀&lt;/b&gt;地認為屬於入門的題材, 如virtual function, copy-constructable, value type, function overload/override等等, 應該是不會有什麼著墨. 如果你搞不清楚這些, 建議你別看我的blog, 先看看書練練功, 以後再來玩吧.
&lt;/p&gt;
&lt;p&gt;
如有同好對我的blog有建議或指正, 也請別對我客氣.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21195575-113769961365886482?l=codefreak.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codefreak.blogspot.com/feeds/113769961365886482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=21195575&amp;postID=113769961365886482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113769961365886482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/21195575/posts/default/113769961365886482'/><link rel='alternate' type='text/html' href='http://codefreak.blogspot.com/2006/01/c-terminology-0.html' title='C++ Terminology - 0. 前序'/><author><name>fr3@K</name><uri>http://www.blogger.com/profile/17775908892482719082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://photos1.blogger.com/blogger/5739/2141/1600/ken-and-jimmy.jpg'/></author><thr:total>0</thr:total></entry></feed>
