2009年2月10日

如何分析 MSDTC Trace Log (Windows SDK: tracefmt.exe Utility)

咳咳,今天要紀錄的是如何分析 MSDTC Trace Log,MSDTC 這東西真的是很難馴服,
雖然已經整理出一套設定方式(這篇是 Google「MSDTC」第一頁的最後一筆耶!),
但是 MSDTC 的可怕之處不在於「不會通」,而是「有時候通,有時候不會通」,
而且由於全世界受 MSDTC 之苦的前輩們長久下來累積了豐富的 troubleshooting 資料,因此當不同客戶的環境中 MSDTC 出現問題時,用該客戶環境當作關鍵字去搜尋解答,
往往每次都會得到不同的答案!(Darkthread 是個尋找 MSDTC 疑難排解的好地方)
例如,在「日文 XP SP1 + MS A 產品 + Oracle DB」或是「英文 Win2k3 SP2 + IE6」,
或者「中文 Win2k3 SP1 + IE7 + Office 2003 + MS Project 2007」等等的環境因素,
綜合起來可能就會導致 MSDTC 產生不同的異常狀況!導致真正的原因始終搞不清楚 Orz
所以,有時候還是得分析 MSDTC 的 Trace Log,以檢視一段時間內 MSDTC 服務運作的狀況(MSDTC.LOG / DTCAXTM.LOG 是 MSDTC 內部使用的,沒辦法用來分析)。

首先要啟用 MSDTC Trace,設定方法請參考 Microsoft KB ,還蠻簡單的,
要注意的地方是開啟 Trace 會造成系統效能下降(運氣不好的話還會嚴重下降),
所以 Debug 完畢後請務必把 Trace 關閉,以免影響 Production 環境的系統效能。
(預設應該是停用 Trace 的,但我發現我使用的好幾台 VM 都已經有開啟 Trace 了,應該沒有特別去設定,感覺預設應該是啟用@@”)


設定好 Enable Trace 之後,在 Windows 2003 上看起來應該會類似這樣:
MSDTC_Trace_Win2k3

在 Windows 2008 上看起來則是這樣(跟設定的時候一樣,元件服務的內容有變):
MSDTC_Trace_Win2k8

Update: 發布前一個手滑就抓了 Win7 (Build 7000) 的圖(正式版應該也差不多):
MSDTC_Trace_Win7(Build 7000)

看起來果然是預設會 Trace Aborted & Long-Lived Transactions.
之後就繼續執行系統正常的操作,過一段時間再去檢查位於「C:\WINDOWS\system32\MsDtc\Trace」下的 Log 即可,檔名應該叫做「dtctrace.log / tracetx.log」。

好不容易叫 MSDTC 老老實實的記錄下來它到底都幹了甚麼好事之後,由於 log 是 binary 的格式,因此肉眼是無法閱讀的,這時候就輪到「tracefmt.exe」工具上場了!
「tracefmt.exe」是 Windows SDK提供的一個 Utility,
顧名思義應該是要將 Windows 內部使用的一些 binary log 重新 format 為人可以閱讀的格式,以 MSDTC Trace Log 來講就會被轉換為 csv 格式。

很不幸的,網路上似乎很難直接找到 tracefmt.exe 的下載點(其實就算找到也感覺蠻恐怖的,執行檔不知道會不會有病毒之類的),因此必須先下載完整的 Windows SDK 安裝檔,
官方下載點在這裡,稍微看了一下說明文件後會發現,這個 Windows SDK 版本可支援 Win XP、Vista、2003、2008(事實上 Win2003 SDK 的下載頁面也會導向這裡),大小約 1.3G, 若不想要裝一大堆有的沒的,只要選擇安裝「Development Tool」即可。

接下來依序執行以下步驟:
  1. 將 tracefmt.exe 從 {Windows SDK Folder}\bin 下複製到 Trace Log 所在的目錄中。
    並確認除目錄中除了 dtctrace.log 外,必須要有「msdtctr.mof」和「msdtcvtr.bat」兩個檔案。
    (.mof 要幹嘛我不太清楚,msdtcvtr.bat 內含呼叫 tracefmt.exe 執行 format 的 vb script)
  2. 在 Command Line 模式中,執行「msdtcvtr.bat -tracelog tracetx.log」,最後一個參數請換成 log 檔的檔名。
    (執行過程中產生的錯誤會紀錄在「errortrace.txt」中 <-- 所以我才知道沒有 msdtcctr.mof 就跑不下去)
  3. 執行完畢後 Windows 會自動用 notepad 打開 tracefmt.exe 產生的 trace.csv,此檔案中的內容就是 Trace 過程中紀錄到的各種 event,接下來就可以根據 event 的內容開始分析了。若檔案內容一片空白表示沒有紀錄到任何 event。
    (既然是 csv 格式,有需要的話也可以用 excel 開起來作進一步處理)
  4. 除了 trace.csv 檔案外,還會另外產生一個 errortrace.txt 說明檔,內有一些統計資料。不管你把「dtctrace.log」、「msdtctr.mof」、「msdtcvtr.bat」、「tracefmt.exe」複製到哪個資料夾執行,「trace.csv」和「errortrace.txt」的預設位置都會在:C:\WINDOWS\system32\MsDtc\Trace。
    (應該可以透過 tracefmt.exe 指定輸出位置,不過這也不太重要…)
以上就是完整的步驟啦,最後補上一張完整的抓圖:
MSDTC_LogParse

前端用 Eval 綁定數據的小技巧

今天來講個前端綁定數據的小技巧吧 (話說 台灣話應該要叫資料繫結?)

一般來講,要在前端綁定資料就要用 <%# Eval("Data") %> 的語法
坎尼前幾天在設計 Gridview 的 Template 裡的控制項時
突然想到很久很久以前,路上有許許多多的老公公和老婆婆....
坎尼曾經把控制項裡的資訊綁定為兩個 (比如:職稱+姓名)

於是坎尼在Gridview裡新增了個 TemplateField
裡面放了個 LinkButton ,文字的部分則是把 FirstName 和 LastName相加
畫面如下圖 (範例資料是用北風)

坎尼很開心的按下 F5,Build通過,跳出了IE
竟然出現了樓下這個訊息..... (若是用vs 2005,在編譯時期即會出現錯誤)

坎尼想了很久,難不成以前綁定兩個數據只是做夢....
Google了好幾下,也看到有人說可以和字串相加...
「等一下,字串相加?!!」
坎尼靈光一閃的做了下圖的改變

將將將,果然沒錯,加上字串.NET就把兩個物件當成是文字了 (自己加上 .ToString())
詳細說明可以參照保哥寫的這篇 讓人精神錯亂的+運算子
下圖為執行情形和資料庫的對照

前端一次綁定多個數據真的是不錯的設計 (但只限文字)
很多動作就不需要再到 DataBound事件去寫

再來個小應用
在剛剛的範例中,在LinkButton加上 OnClientClick 事件
加入下圖的 source code

實際運作情形....可憐的 Andrew 被老板裁掉了....


由於已經轉為文字 所以可以盡情的加上 Javascript 的敘述

其他的應用還有...
導到其他網址 NavigetUrl='<%# "Page2.aspx?id="+Eval("id") %>' (HyperLink的屬性)
設定由後端儲存的樣式 Style='<%# "color: "+Eval("myColor") %>'

更多的應用端憑大家去想像了 :p
最後附上本次的 範例

2009年2月8日

What’s ThreadLocalStorage (aka TLS)?

最近開始試圖解決公司底層元件的宿疾陳痾 -- 惡名昭彰的 MSDTC,
以使用 TransactionScope 來說,為了確保系統中全程採用 Local Transaction,
重點在於在交易過程中必須使用單一的 connection,且不可以有開開關關的動作。
 
(關於 MSDTC 的說明請參考附註中 Darkthread 大大的.NET分散式交易程式開發FAQ)

但是很不幸的,舊的底層元件(Entity)為了簡化外部程式的寫法, 主動把 connection 物件給包了起來,並且在每個 public 的 CRUD Method 中去 open & close connection,因此只要在 TransactionScope 中使用多個 Entity, 或者先呼叫某個 Entity 的 Select 再呼叫 Save(造成 connection 開關多次), 就會導致該交易從 Local Transaction 被 automatic escalate 為 MSDTC, 進而造成 MA 時莫大的痛苦。

(幾乎每次 MSDTC 出錯時,根據當時的 System Configuration 都可以在網路上找到相對應的案例。也就是說,各種可能導致 MSDTC 出錯的環境組合幾乎是無窮盡的 =.=”)


為了在「避免舊系統大幅改寫」的前提下,修改底層元件的寫法以設法避免 MSDTC,
我們需要一個 Global 的地方以存放共用的 connection (以及相關的交易控制資料),
在一番討論 & survey 之後,決定採用 ThreadLocalStorage (簡稱 TLS) 這個技術。

以下是 TLS 的基本介紹:
  • TLS 的技術可以回溯到 Win32 multi-threaded programming,在 .NET 的世界中也有一套相對應的作法。
  • TLS 的基本原理是,在每個 thread 中分配一塊可以用來儲存資料的地方,只要在該 thread 中執行的 method 均可存取這些資料。
  • TLS 的一個好用之處,在於可在不修改現有程式碼(不管是改不動還是根本就沒有 source code)的情況下,在系統中增加(效能分析)用的 tracking information(有一點 AOP 的感覺)。對我目前面臨的問題來說,剛好可以當作 Global Data Storage 來儲存 connection 物件。
  • 在 TLS 中,一份資料對於某一組「thread + AppDomain」來說是 unique 的。TLS 不能像 .NET Remoting 技術那樣的 cross AppDomain boundary。
    (.NET Remoting 還蠻複雜的,看來沒時間仔細研究。不過以後會被 WCF 取代)
    image
  • 儲存於 TLS 的資料一律是 Object 的資料型態,因此必須自己 handle 轉型。
TLS 的基本程式寫法很簡單,可以參考這裡。雖然目前這個方法還沒有實際驗證過,
但根據手上的資料來看應該是可以解決 MSDTC 的問題。

我的小小 TLS 範例程式可以在這裡下載。

PS. 關於 MSDTC 的說明,可參考 Darkthread 大大在 Run!PC 上發表的文章,如果忘記這個連結位置的話,可以 google「darkthread TransactionScope」,在第二個 result「Browse by Tags - Darkthread」中就可以找到「.NET分散式交易程式開發FAQ」。

[Office 2007] The Story of the Ribbon – Office 2007 的設計理念探討

See Jensen Harris’s Blog post.

這個 talk 是 Jensen 在去年三月的 MIX 講的,這篇 blog 只有大略說明了演講的內容,
建議下載完整的錄影檔,才能深入瞭解 Office 2007 背後的設計理念。

這次演講探討的是 Microsoft Office 這套賣出超過四億合法授權的軟體的設計過程,
(也就是說加上非法授權的話,Office 的 User Base 應該超過十億吧 XD)
就像由 Google 來說明網路上熱門關鍵字的發展趨勢一樣有公信力。

Jensen 的演講內容非常有趣,例如大約在一小時整的時候的一段 Eye-tracking study 影片(主題是如何在 Office 2003 中找到「Find」功能),配合恰到好處的配樂,看起來真的是很好笑XD 另外他也常常自我幽默的吐槽 MS,讓整個演講得感覺很輕鬆。

在演講的過程中,Jensen 很有條理的從 Word 1.0 一路講到 Office 2007,
在這個過程中,隨著功能不斷地擴充,Office UI 已經複雜到大大地降低 Usability,
User 必須要投入非常大量的時間,才能得到 Office 的「Sense of Mastery」,
也就是一種能夠充分駕馭 Office 的感覺(某種程度上也可解釋為 Usability)。

當軟體功能簡單時(e.g. notepad),User 很自然的就可以建立「Sense of Mastery」,
但所有軟體公司都不斷持續努力為自家產品增加功能,提供給客戶更高的附加價值,
當軟體功能日趨複雜,要如何維持操作/學習上的簡易,才不至於讓 User 失去(或很難建立)「Sense of Mastery」,就變成一個高難度的問題了。

這個 design problem 不只在 desktop apps 存在,顯然也是 Web apps 不可忽略的。
PS. Word 1.0 & Word 2003 的 screen shot 比較:
Word_1.0

Word 2003

2009年2月7日

[Javascript] 建立全選 checkbox

坎尼來向大家拜個晚年 (說真的有點晚了)
過年在家沒法上線 只好乖乖的玩 Wii 的太鼓達人.....

今天要講的是客戶常會要求的懶人功能--全選所有的checkbox
尤其是checkbox會隨著資料庫增長的那種

於是坎尼翻出了一年半前所記的javascript筆記
(不會有人想用AutoPostBack做吧? 不被殺了才怪)

首先,在畫面上放個 CheckBoxList,項目當然是後端產生
接著放兩個 checkbox:一個用來跑傳統寫法的javascript 另一個則是用 jQuery寫
可以看到兩個checkbox都加上了 onclick方法 並且將自己當參數傳入
這地方待會兒再解釋

下圖為後端產生項目的code
由於才過中國年,所以坎尼用十二生肖來應景一下

接著是此次的主角--js function

先來看到 CheckOld 這支傳統作法的 function
做法為先抓取畫面上所有 input,再用for迴圈判斷類別
只要是 checkbox 的勾選狀態就會和傳進來的物件勾選狀態相同
前面看到的把自己用this傳給function,就是為了取得目前要同步的勾選狀態

再來看一下CheckNew這支jQuery型的函式...嗯、一行解決...
是不是很神奇啊 XDDD (坎尼最近也很努力的研究jQuery)

接著看執行畫面


由於全都是js構成 本來要做個靜態網頁
但坎尼太懶惰了 所以這邊只提供 source code 下載 (jQuery請自行上官網領取)

最近坎尼發現 想要寫的東西其實Google一下就都有了
愈來愈找不到題材及靈感 實在有點灰心 囧rz
可能需要找個心靈導師開導一下

2009年2月2日

64-bit Windows7 Beta (Build 7000) 試用心得

繼 12 月中在三年前的桌機上安裝 32-bit Windows7 Beta (Build 7000) 後,
利用過年這段時間我把工作機(去年8月買的 Thinkpad X61)也灌成 Win7 Beta,
不同的是,這次我灌的是 64-bit 的版本(為了實際上也用不太到的 4GB RAM..||),
用起來基本上還蠻順暢的,利用這次機會多測試了一些開發用的工具的運作情形,
也找到一些好用的 freeware,以下是一些心得:
  • Windows 7 好用的地方
    • Device Stage 很漂亮!不過重點是對無線網卡的支援更完善,在我之前把小黑灌成乾淨的 Vista Ultimate X64 之後,不管怎樣嘗試灌 Lenovo Driver,就是無法辨識無線網路。灌好 Win7 之後,啥也不用作就可以自動搜尋到家裡附近的一大堆無線網路了。
    • Taskbar & JumpList:這功能實在太好用了,舊版的 taskbar 相較之下實在太弱了 … 參考這些影片:基本的介紹、For Mac User…不知道為甚麼都沒有提到滑鼠移過去產生的那個視窗,右上角有一個紅色的「x」,按了就可以直接關閉視窗,真的是很方便喔!
      Win7_CloseWindow
    • HomeGroup 功能:參考這篇解說,簡單的說在 Windows 環境中要分享檔案現在更簡單了,之前想要設定 Vista & XP 分享檔案,弄到最後就放棄了=.= 但是要注意只要把「LAN」的「Network Location」設定成「Home Network」即可,連外的網路還是保持「Public Network」就好,如下圖:
       Win7_NetworkLocationSetting
  • 如何設定中文輸入法
    • 在 Enterprise 以上的版本中,可以安裝各語言的完整 language pack(含微軟新注音等),以 Vista 來說,繁中語言包約 1GB,這是最正統且萬無一失的作法。
    • 安裝中文版 Office,會附送微軟新注音、新倉頡等等
    • 用 google 搜尋「new chewing」,可以找到新酷音下載網頁
    • 連到台灣奇摩首頁(http://tw.yagoo.com),在搜尋框輸入「yahoo」及可在 search suggestion 中找到「yahoo 奇摩輸入法」,目前是正式版,應該也不錯用。
      Yahoo_KeyKey
  • 開發用的相關工具
    • Visual Studio 2008 SP1
    • Tortoise SVN Client (1.5.7.15182) 64 bit
    • UltraEdit v14.20
    • Sun VirtualBox 2.1.0(我還順手灌了 Ubuntu 8.10)
  • 其他 freeware 公用程式
    • 7-zip 4.64 64 bit –> 順利取代囉哩八嗦的 WinRAR! 不能製作 .rar 也沒啥關係,.7z 壓縮率更高,或者用 .zip 這個超級 universal 的格式就好。
    • KKMAN 3.0 Beta:雖然安裝過程和安裝完之後,介面上全部都是亂碼一團,但是可以順利的上 BBS 喔!對於沒有要使用到進階功能的人(例如我)來講已經很足夠了。在沒有繁中語言包的情況下,這是我目前唯一知道的一個解決辦法。
    • PicPick:參考重灌狂人,以後不需要 HyperSnap 這個要錢的東西了!
    • Google Desktop:安裝方式參考這裡
    • Google Earth 4.3.7284.3916 … 總之是最新板
    • WorldCommunityGrid:參考官網,還有這篇和這篇的說明。
  • 目前仍然不 work 的軟體
    • 虛擬光碟軟體:這應該是最麻煩的問題,網路上很多人討論,比較常用且有名的好像都會落入「無限 reboot 地獄」中,或者是安裝完成但是就是看不到虛擬光碟機。用最新版也沒用。目前我只好直接把 ISO 檔解壓縮出來使用。以下是我試過的軟體:
      • Daemon Tools (Lite)
      • Alcohol
      • Phatom CD(這是我另外嘗試的)
    • Sun VirtualBox 的 Guest Additions(讓 VM 可以 Full Screen Display 的 Utility),這真是太殘念了,目前還不想灌成多重開機的狀態阿…>_<”
    • KKBOX:用 4.0 也沒用,看來它有限定 OS 版本,目前無法辨識 Win7。

2009年2月1日

Visual Studio “Tip of the Day” Series in Video!

See Sara Ford’s post.

在過年前剛好看到這個消息,Sara 的朋友 Scott Cate 先生自願將 Sara 整理的 382 個 VS Tip 從頭開始一個一個的錄成 demo 影片(RSS),這真是個好消息, 畢竟影片的形式比純文字的敘述更容易理解,這也給我一個機會從頭 review 一遍這些有用的小技巧,今年接下來理論上要多寫點程式,應該會很有幫助吧 XD

PS.
1. 影片是以 Silverlight Streaming 的方式播放的,品質不錯唷!
2. 一開始看到 Scott 我還以為是 Scott Guthrie,嚇了一跳,想說 .NET Division 的 VP 有沒有這麼悠閒 XD 原來是 Scott Cate ….

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D