編譯 Boost 1.35.0 (Visual Studio 2005 (VC 8.0) + Windows XP)

簡介

  1. Boost 的原始碼可以在官網 http://www.boost.org 找到,或是直接到 sourceforge 下載,網址是:http://tinyurl.com/m7jqo
  2. Boost 有著自己一套的建置系統,叫做 Boost.Build [1],可用在編譯、 安裝、測試等功能上。Boost.Build 則是架構於 Boost.Jam, Boost.Jam 又是 Perforce Jam[2] 的衍生,更詳細的介紹可以在 [3] 看到。
  3. 通常在 Windows 上安裝 Boost ,最快速、簡易的方法是去 Boost Consulting 下載 installer [4],不過到今天為止, Boost 1.35.0 的 installer 都還沒 release。所以大家來學學自己編譯吧 : )
  4. Boost Getting Started on Windows [5] 是一篇官方的教學文件,有簡易的 bjam 使用方法,但無註明完整安裝的步驟,另外它也簡介了Boost Project 的 layout, simple usage 等等。
  5. Boost 身為最先進、標準的 C++ library ,它大量使用了 generic programming, metaprogramming 等技巧,使得實際上需要編譯成函式庫(.lib, .dll)的部份反而少了,根據 Boost Getting Started on Windows [5] 的說明,只有以下幾個 library 使用時,一定需要先編譯成函式庫(.lib, .dll):
    1. Boost.Filesystem
    2. Boost.IOStreams
    3. Boost.ProgramOptions
    4. Boost.Python
    5. Boost.Regex
    6. Boost.Serialization
    7. Boost.Signals
    8. Boost.Thread
    9. Boost.Wave

    還有幾個則是 optional:

    1. Boost.DateTime
    2. Boost.Graph
    3. Boost.Test

安裝步驟

  1. 下載 source code 並解壓縮。
  2. 使用 Open Visual Studio 2005 Command Prompt 進入 cmd。利用 Open Visual Studio 2005 Command Prompt 的原因有兩點:
    1. 方便呼叫 namke, cl 等 vc toolchain。
    2. 若是電腦上安裝多個編譯器,使用 Open Visual Studio 2005 Command Prompt 通常可透過環境變數,讓 bjam 使用正確的 toolchain。
  3. 取得 bjam.exe。
    1. 可以選擇到 Boost 提供的預先編譯好的 binary,可在http://tinyurl.com/2q36f 下載。
    2. 或是自行編譯,以下是編譯步驟:
      1. $> cd your_dir\boost_1_35_0\tools\jam\src
      2. $> build.bat
      3. 執行完後,boost_1_35_0\tools\jam\src\bin.ntx86 下就放著編譯完後的 bjam.exe 了!
  4. 將上一個步驟的 bjam.exe 放入 PATH 環境變數或是使用絕對路徑呼叫 bjam,並搭配以下的 options 就可開始編譯並安裝 boost:
    • $> bjam.exe --build-dir="your_dir\boost_1_35_0" --build-type=complete --toolset=msvc install
    • --build-dir: boost 解壓縮的檔案,記得 = 前後不可有空白!
    • --build-type: complete 會產生 release, debug ,以及各種設定的對應:如 multithread, debug, 等等。
    • install: 編譯完後,將 header, lib 安裝到指定目錄,預設目錄是:C:\Boost,大小約 2 G。
  5. 更多的客製化安裝,可以使用 bjam --help 查看 options。
    • bjam 是個有趣的東西,當我在 your_idr\boost_1_35_0\tools\jam\src\bin.ntx86 下執行 bjam --help 時,它跑出的訊息並不多,而切換到 your_idr\boost_1_35_0 時卻又是另一回事,它跑出豐富的 Boost 的編譯資訊,後來發現它會去讀取 Jamroot 這個檔案,這是格外要注意的一點。

Reference

  1. Boost.Build: http://www.boost.org/doc/libs/1_35_0/tools/build/v2/index.html
  2. Perforce Jam: http://www.perforce.com/jam/jam.html
  3. Install Boost: http://www.boost.org/doc/libs/1_35_0/doc/html/bbv2/installation.html
  4. Free Download on Boost Consulting: http://www.boost-consulting.com/products/free
  5. Boost Getting Started on Windows: http://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html
  6. Boost 提供的 bjam binary 下載點(包含許多種平台): http://tinyurl.com/2q36f
  7. Boost Source on Sourceforge: http://tinyurl.com/m7jqo

Pipl: People Search

簡介

http://pipl.com/

      蠻有趣的一個網站,它專門用來找人的資料!可以使用:First/Last Name, City, State, Country 當關鍵字。並產生以下的結果(以 Bjarne Stroustrup 為例):

  • Quick Facts:  被查詢者快速資料。如 B.S. 是 C++ 的設計者。
  • Contact Details: 一些詳細的個人資料,如地址、電話等…
  • Profiles & Directories: 對方的個人資料,例如 B.S. 是學術中人,所以會有一些 indexing 或資料庫的個人自傳,演員的話還會幫你連結到 imdb 。
  • Publications: 著作嘛!查 paper 時,也可以來用一下?!可以對應到 cholar.google.com 不知道 IEEE, ACM 等專業期刊之後會不會列入?!
  • Web Pages: 相關的個人網頁,如果對方有上 wiki 之類的百科,也會列出來。
  • More: 上述的每一個項目都可以透過 more 連結到 google ,將結果以 google search
    呈現。

技術

     這個網站跟一般搜尋引擎有什麼不同呢?根據它網頁的說法是,一般抓網頁機器 人都只能抓到 surface web (主要是靠超連結串起的網頁)[3]。而另外有些網頁是以 online database 等非超連結方式儲存內容,稱作 deep web ,想抓這類的資料,你的機器人要能跟 online database 互動,也就是這些 online database 可能會有 search engine,你的機器人要能跟它們 talk talk ,不過望頁倒是沒有提到:它們所謂的互動是暴力互動(如:使用人名搜尋後,在進行資料萃取、整理)呢?還是有使用到一 些人名特徵的問法(如:Bjarne Stroustrup, telepone)。而這網頁的搜尋有點慢, 猜測是因為它只是個 mashup 的服務,背後都是 yahoo people、google scholar、 ZabaSearch。

用途?

     有時候看 mailing list 時,都會看到一些不錯的回答,若想知道對方更詳細的資料就可以透過這個網站,或許以後大家當老闆了,面試別人前,也可以來 pipl 一下唷!

學術?

     The Deep Web: Surfacing Hidden Value [1] 這篇文章提到 deep web 的資料量是 surface web 的 500 倍多(而且可能更具價值?!還沒看完文章,所以不知道), wiki [2] 列出了一些有趣的研究,有興趣的人,可以朝這發展?!

Reference

  1. The Deep Web: Surfacing Hidden Value: http://www.press.umich.edu/jep/07-01/bergman.html
  2. Deep Web - Widipedia: http://en.wikipedia.org/wiki/Deep_web
  3. Surface Web -Wikipedia: http://en.wikipedia.org/wiki/Surface_Web

Single/Double/Multiple Dispatch - Part 1

Design PatternGenerative ProgrammingModern C   Design Cover

     GoF 的 Design Patterns [1] 一書在 Visitor pattern 的實做描述中提到了 single/double dispatch,並針對 single dispatch 給了這樣的說明:

In single-dispatch languages, two criteria determine which operation will fulfill a request: the name of the request and the type of receiver

     若要快速地瞭解這句話,我們不妨白話點:函式的喚起是倚賴 function overriding (dynamic polymorphism) 與 overloading (static polymorphism) 的合作而完成的。以 C++ 為例,假設我們有以下的繼承架構:

hierarchy

當我們寫下這段程式碼時:

Base* ptr = new Derived1;
ptr->foo( 1 );
會被喚起的函式是 Derived1::foo( int ),而非 Base::foo( int ) ,當然更不可能是 Derived2::foo( int ),這是 function overriding (dynamic polymorphism),以 C++ 說,因為當下物件 ptr 的 vtbl 指向的型別是 Derived1 而非 Base ,這也就是 GoF 書中提到的 type of receiver 的部份。至於為何是 Derived1::foo( int ) 而不是 Derived1::foo( string ),就是倚賴 function overloading ,相當於GoF 書中提到的 name of the request

     那什麼是 double dispatch 呢?耶,有 double ,那有沒有 triple 呢?quadruple 呢?…?答案是有,而且我們還習慣把它們合在一稱為 multiple dispatch ,在另一本 OO 聖經書籍 Generative Programming [2] 中提到:多型機制可分為兩大類:single dispatch 和 multiple dispatch (又稱 multimethods):

Single dispatch corresponds to the Smalltalk idea of sending a message to an object, where the appropriate method (i.e., message implementation) is selected based on the type of the reciever.

Single dispatch introduces asymmetry with respect to the arguments because the first argument is treated specially.

A dispatch mechanism that uniformly uses all argument types for selecting the method is referred to as multiple dispatch, or mutlimethods.

     從上面的解釋中我們不難體會:常見語言(如:C++, Java, C# )的動態多型呼叫是可轉換成對等的 C 語言,轉換的虛擬碼如:

// C++
Base* ptr = new Derived1;
ptr->foo( 1 );

// C
foo_in_c( ptr, 1 );
foo_in_c( Base* ptr, int i )
{
	if ( "Base" == ptr->type_info() )
		Base::foo_in_c( i );
	else if ( "Derived1" == ptr->type_info() )
		Derived1::foo_in_c( i );
	else
		Derived2::foo_in_c( i );
}

我們可以透過 this 得到 ptr 的記憶體位置,並傳給轉換後的 foo_in_c 去決定該喚起的是哪個 method ,這種將第一個參數特別挑出來檢驗的機制就稱作 single dispatch ,反之,若是今天 foo 有 N 個參數,函式的喚起得考慮 run-time 時,每個參數的實際型別,那就是 multiple dispatch 。

     Multiple dispatch 比起 single dispatch 更具有表達與描述威力,因為同一個時間點,它同時考慮了多個 物件的 run-time 型別。而目前只有少數語言有支援這個特色:如 CLOS 。其他語言則需要透過 extension 。[7] 羅列了一些這類的整理資料,

     針對 C++ ,除了找 extension 外,還可以在經典書籍 Modern C++ Design 的第十一章,看到 Andrei 的一些討論。另外,[9] 這篇 C++ Report 的文章也提出了一個解法,[10] 則針對上面兩個方法有所簡單討論, [9] 也是從這找到的。

Reference

  1. Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard Helm, Ralph Johnson, 1998
  2. Generative Programming: Methods, Tools, and Applications by Krzysztof Czarnecki and Ulrich W. Eisenecker, Addison Wesley, 2000
  3. Generative Programming: http://www.generative-programming.org/
  4. Modern C++ Design: Generic Programming and Design Patterns Applied by Andrei Alexandrescu, Addison Wesley, 2001
  5. Dynamic Dispatch - wikipedia: http://en.wikipedia.org/wiki/Single_dispatch
  6. Double Dispatch - wikipedia: http://en.wikipedia.org/wiki/Double_dispatch
  7. Multiple Dispatch - wikipedia: http://en.wikipedia.org/wiki/Multiple_dispatch
  8. Single, Double and Multiple Dispatch: http://ifacethoughts.net/2006/07/29/single-double-and-multiple-dispatch/
  9. Multiple Dispatch A New Approach using templates and RTTI: http://www.eptacom.net/pubblicazioni/pub_eng/mdisp.html
  10. Re: 備份 : Multiple Dispatch: http://phpbb.godfat.org/viewtopic.php?t=204&highlight=&sid=0ffb75220260fea3aa497c8a17fe710b

MiniFilter InstanceSetupCallback is not called?

一般來說,MiniFilter 的 InstanceSetupCallback 會在 filter manager 把 minifilter attache 到 volume 後呼叫。如果沒有的話,可以檢查一下 minifilter 的 INF 是否把 instance fla...