My friends, my life, my style - James S.F. Hsieh

10/28/2009

The Shadow of the .NET Framework

大家都知道現階段的軟體發展已經開始著重平行運算, 主要有兩個因素增加 throughput 跟 user experience, 所以 Asynchronous Call 或是相關的 Multi-threading patterns 也就越來越紅了, 不過這不是這篇文章的重點 :P, 今天呢我在 Survey 關於 ATL and COM Asynchronous Call 的時候, 意外發現到兩個有趣的 Libraries:


這兩個 Libraries 都有個相同的特質, 它們都嘗試著移植 .NET 一些不錯的 pattern 到 C++ 上 (不是 C++ CLI 喔), ACF 的作者意識到 C# 或 .NET 相關的語言將會是未來 Windows 平台上最佳的程式語言, 但是 GC 或是 JIT 的速度總是比 native code 來的慢 (其實現在已經不一定了) , 所以, C++ 在速度上有著較佳的優勢, 但不可否認的 .NET Framework Library 有著巨大的誘惑, 因為 .NET Framework 幾乎包裝了 OS Win32 SDK 大部分的功能使其成為好用的物件導向函式庫, 到了現在 WPF, WCF, WF 更是在 Application layer 錦上添花, 所以 .NET 最大的優勢就是龐大好用的函式庫, 而 ACF 的作者 Yingle Jia 就嘗試的去移植這一點, 移植了幾個重要的物件到 C++ 中: Collections, IO, Text and Threading, 尤其在 basic type 上 root Object, RefPtr 與 Delegate 更是下了不少工夫, 儘管這些移植已經沒有繼續進行, 不過這也凸顯了 C++ 需要一個好用的 Library 來做為基石 (Boost :D), 其實 ACF 跟我所做的 DOL 函式庫都有著相似的想法, 就是嘗試著做出個平台無關可移植的子系統 (函式庫), 在這個子系統上發展的軟體則可以輕鬆的使用這個抽象層來達到少部分平台無關與易用的好處, 其實 .NET Mono 也是有相似的企圖與想法.

.NET Asynchronous Design Pattern for Native C++ 則是移植了 Delegate, BeginInvoke, IAsyncResult 與 Threading Pool  (作者使用 ATL 的 CThreadPool) 相關的 Asynchronous Design Pattern 到 C++ 當中, 不過該實作的 Delegate 只能支援傳遞單一引數 ulParam 到對應的 function, 如果能夠整合 functor 就更棒了是吧 :)

方便好用的 OS 燒錄軟體 InfraRecorder

InfraRecorder 是個 OpenSource 的燒錄軟體, 主要的特質就是免錢啦 (Nero 一套可需要 2650 大洋呢), 其次就是整個軟體設計的風格都很簡潔好用, 軟體的大小也非常的小, 以 InfraRecorder 0.5 x64 Installer 為例大小只有 3.42 MB, 相較於 Nero, Roxio, 或是 DMF 相比都明顯小上許多, 當然訴求上也差異很大啦, 不過大多數的人對於燒錄的需求都還是燒錄資料為主, 這個小軟體倒是符合大眾的需求呢 :) InfraRecorder 一直以來都是一個在 Windows 上的燒錄軟體, 從他們官網上的資訊來看 InfraRecorder 跟自有 back-end 的燒錄模組應該有一定強度的耦合性, 所以在 0.6 這個版本就希望打破這個限制將其模組化並且可以抽換燒錄模組, 主要計畫是可以支援其他的 back-end 模組 ex: Windows build-in 等... 而在 0.7 版則希望可以做到 platform independent 的目標. 有趣的是 InfraRecorder 在燒錄的時候會冒煙喔. :O



10/27/2009

How to integrate ETW

要建立一個 Manifest-based ETW Provider 需要數個動作:
  1. 定義 Instrumentation Manifest 來描述 ETW Provider
  2. 根據 Manifest 的定義實作對應的 ETW Provider 於 AP 中
使用 ETW Provider 需要數個動作:
  1. 註冊 ETW Provider 對應的 Instrumentation Manifest 
  2. 利用 ETW Controller 啟動  ETW Provider
以下是定義一個 ETW Provider 的模型, 該結構會被定義在 Instrumentation Manifest 的 XML 中, 簡單來說一個 Instrumentation Manifest 可以記錄多個 ETW Provider, 每個 ETW Provider 都會有獨自的 GUID 做為識別, 每個 Provider 可以有多種 Event 並且利用 Event ID 識別, 每個 Event 可以參考一種 Template 來描述該 Event 想要收集的資料格式, 所以 Template 是用來說明這些資料是怎麼被 "解釋", 這就是 data-driven 的一種架構. 要如何撰寫 Instrumentation Manifest 詳細可以參考 "Writing an Instrumentation Manifest", 一個比較簡單的方法是使用 Manifest Generator (ecmangen.exe: A GUI that guides you through creating a manifest from scratch without ever having to use XML tags.) 這個 tool 來產生對應的 XML 與 GUID, 你可以在 Platform SDK 的 Bin 目錄中找到這個好用的 tool. 





產生這些 XML 其實並不一定是必要的, 因為 ETW  Controller 只需要 GUID 就可以開啟對應的 ETW  Provider, 而  ETW Provider 在寫入資料時會傳入對應的 data length, 所以 logging data 的 serialization 就不是什麼問題, 但是如果 ETW Consumer 如果希望能夠 "解釋" logging data 的內容, 那這個 XML 就是必要的, 因為, "解釋" 這些內容必須要反查 Template 並且利用 Trace Data Helper (TDH) API 來 Unserialization 記錄的資料.


在來, 我們可以利用剛剛撰寫的 XML 與 Message Compiler (mc.exe: A command line utility used to compile instrumentation manifests and message text files.) 產生相對應的 Metadata,  該 tool 可以在 Platform SDK 的 Bin 目錄中找到, 並且可以輕易的整合進 Pre-build 的 script 中, MC會產生三個檔案:
  1. H File:  C/C++ 對應的 GUID 與 EVENT_DESCRIPTOR 宣告
  2. RC File: 用於指定內嵌 ETW template metadata 的 resource 宣告
  3. BIN File: ETW template metadata 做為 TDH API 反查之用
BIN File 必須在 link 的時候跟著內嵌進 binary file 當中.





如何產生 Event 呢? 這個部分我就不在這裡描述, 詳細可以參考 "Writing Manifest-based Events", 我在 DOL 函式庫中, 輕巧了使用 functor template 包裝了 ETW Provider, 讓產生 event 可簡單的像呼叫一個函數一樣容易, 宣告的時候只需要描述對應的函數型態就會自動推倒出對應的 template function, 有機會在跟大家分享.
DETWEventPublisher<DOL_TYPELIST_2(INT, const WCHAR*)> event(guid); // define
event(1, L"event message"); // Fire event

值得注意的是, 在 XML 當中 Decoding file locations 這個欄位是用來描述一個 binary file 的路徑, 該 binary file 內嵌的 resource 包含了 ETW template metadata, 目的是做為 TDH 反查之用, 由於 TDH API 在網路上的資訊相當的少, 所以詳細的運作方式就不清楚了. 麻煩的是這個路徑跟 AP 佈署的路徑有關, 為了彈性, 該路徑必須在佈署之後才能確定, 所以我們必須在佈署之後才產生出修正路徑的 XML, 在利用 wevtutil.exe (A command line utility used primarily to register your provider on the computer. You can also use it to get metadata information about the provider, its events, and the channels to which it logs events, and to query events from a channel or log file.) 來註冊 Instrumentation Manifest XML.


最後, 由於已經註冊了該 XML, 所以 ETW Controller:  logman.exe 或是 xperf.exe 都可以查詢到這些 ETW Provider 並且可以直接啟動.

10/25/2009

2009 10 25 磺山溫泉




沒隔多久, 我又再次的來到磺溪溫泉, 這次並不是從天籟那頭進來, 而是從金山的某條小路近來, 所以不需要走山路就可以直接來到溫泉噴發的地方. 上次來的時候是今年的 4/5, 雖然上次起大霧並不是看得十分清楚, 但相隔了半年左右這裡的地貌有了不少的改變甚至連旁邊的欄杆都倒了, 難道是因為颱風肆虐造成的結果? 更令我感到驚訝的是進來的碎石山路有怪手正在開挖, 不知道是在整路呢還是在偷挖砂石呢? ~_~... 磺溪溫泉是個很美水量豐沛的野溪溫泉, 希望大家可以全力維護這裡的整潔自然環境與水土, 這樣才能永續呢.





10/24/2009

機器人冒險

9


一向喜歡看科幻片的我, 今天被一部機器人的科幻片所吸引, 對於機器人的片子我也一直非常喜歡, 印象最深刻的幾部片子就是 "鬼使神差" (外星機器生物), "人工智慧", "變人", "星艦迷航探險家號的柏格人" "瓦力" 等等...,  這部片名叫 "9" 的 3D 動畫, 雖然是部動畫片, 但是它承襲了提姆波頓的風格, 如同 "聖誕夜驚魂" "地獄新娘" 一樣, 對動畫的細節有著深刻的呈現, 場景仍然是以灰色做為世界的背景, 人物的主角們恰巧是外面包覆著布偶 (毛襪) 的機器人, 整個人看起來就像 "小小大星球 LittleBigPlanet" 的 Voodoo 玩偶般, 讓人印象深刻, 尤其對於拉鍊縫線跟周遭小事物的刻劃風格讓我很喜歡. 故事的內容一樣利用這些可愛的機器人探討的人性的本質, 我當然就不能在這裡透露了, 有興趣的人一定要去看喔, 美國的上映時間是 2009/09/09 而台灣則必須等到 2010/03/19 才能看到了, 預告片大家就先一睹為快吧: 9 - Official Trailer Apple - Movie Trailers.

Machinarium




在查詢這部片的時候, 我意外的發現了一個非常有趣的遊戲, 這是個機器人冒險的解謎遊戲 Machinarium, 一開始主角是一堆殘破的機器人殘骸, 被拖運垃圾的機器人從機器人城堡托運出來準備倒掉, 機器人醒來後就把自己組裝起來開始冒險, 並且嘗試的回到城堡裡頭, 遊戲的方式跟我以前懷念已久的一個經典遊戲 "凱蘭迪亞傳奇 Kyrandia" 非常相似, 整個遊戲是以第三人稱的方式來呈現, 主人翁必須利用周遭的事物解謎, 並且利用發現的東西組合出洽當的道具來解決難題, 一定要去玩玩他喔 Demo.

凱蘭迪亞傳奇 Kyrandia

10/22/2009

Corel Digital Studio 2010 出現在 CNN 上ㄟ~~

雖然搭的是 Windows 7 的順風車, 但是至少有曝光了^__^




10/21/2009

謝謝大家幫我慶生


Event Tracing for Windows

ETW 全名為 "Event Tracing for Windows", 一種 Windows 作業系統提供的基礎建設, 用於高速追蹤系統的效能所設計的機制, ETW 基本上把角色分成 event providers, controllers, consumers, 和 event trace sessions 幾個部分, providers 代表著 event 的提供者, 而 sessions 代表著 ETW 的紀錄單位, ETW 所記錄的資訊會被紀錄在 Windows 的核心的 buffer 中, 在已非同步的方式傳給 consumers 或是非同步的寫到檔案中. controllers 則用於建立 sessions 與 enable/disable 相關的 providers. 相關的文章可以參考 Improve Debugging And Performance Tuning With ETW

ETW 可以記錄各種類型的資料型態並且用一致的方式進行資料的 publish, record, 與 present, 它使用了 data-driven 的方式來描述 event 的資料來達成上述的目標. 所以, 當我們要實作一個 event provider 時, 我們必須準備對應的 XML manifest 做為資料的描述, 並且註冊這個 manifest 來公開我們的 event, manifest 描述了一個 GUID 做為 event 的 ID, 這樣可以讓所有的 event consumer 都查詢與解釋這些資料, controller 也可以用這個 GUID 來通知對應的 provider, 而 provider 必須根據這個 manifest 描述的資料型態與語意來發出 event.

所以我們有幾個動作要完成才能完整的使用 ETW, 一下包含了動作與一些相關的 tools :

Provider 
  1. 定義 event 並且以 manifest 做為描述的方式  ecmangen.exe
  2. 註冊 event  wevtutil.exe
  3. 產生 event 對應的 C/C++ header 給 provider 使用  mc.exe
Controller 
  1. 用於啟動一個 provider  logman.exe   xperf.exe
Consumer 
  1. 用於即時顯示 provider 產生的 event  traceview.exe
  2. 用於儲存 provider 產生的 event  logman.exe   xperf.exe
  3. 用於顯示 provider 產生的 event  eventvwr.exe  xperfview.exe etviewer.exe
  4. 用於轉換 provider 產生的 event   tracerpt.exe
下次來介紹怎麼實作一個 Event provider :)


10/07/2009

露營裝備檢查表

個人用品
  1. 背包 50L~70L 背包套
  2. 充氣睡墊
  3. 睡袋 (春秋冬季)
  4. 水壺 裝水容器 寶特瓶
  5. 帽子 雨帽 (非必備)
  6. 排汗衣物多件
  7. 個人盥洗內衣物
  8. 耐磨長褲一件 快乾長褲一件 睡褲
  9. 保暖外套 (春秋冬季)
  10. 泳衣 泳鏡 (非必備)
  11. 綁腿 (非必備)
  12. 雨衣 雨褲 防水袋 (小飛俠盡量不要)
  13. 防滑 登山鞋 登山襪
  14. 工作手套
  15. 拖鞋 (非必備)
  16. 登山杖 (非必備)
  17. 個人燈具 頭燈 電池
  18. 手機 通訊器材
  19. 個人餐具 碗筷
  20. 個人乾糧 衛生紙
  21. 個人藥物 隱形眼鏡 
  22. 行程資料 紙筆
  23. 個人證件 現金 身分證 健保卡 提款卡 
團體用品
  1. 爐具: 爐頭 瓦斯 打火機
  2. 團體餐具: 鍋子 刀具 盤子 大湯匙 環保清潔劑
  3. 公糧 鹽巴 薑糖 罐頭
  4. 帳篷 營燈 蠟燭
  5. 地圖 GPS 指北針 哨子
  6. 電池
  7. 相機 攝影機 (非必備)
  8. 無線電 通訊器材 (非必備)
  9. 淨水器 (非必備)

10/04/2009

2009 10 03 薇勳峻陞訂婚

你說新娘美不美 新郎帥不帥 :) 下一個就是雅芳跟派大星了 朋友們結婚真的很開心