這個訪問前幾天開始訂閱 Channel 9 的時候看到的:Anatomy of a Silverlight Game,Nikola Mihaylov 是微軟的員工,他負責測試 Visual Studio 中與 Silverlight 開發有關的部份,因此想利用每天工作接觸到的 Silverlight 底層知識作一個 Silverlight 遊戲,最後的成果就是 Shock.
我覺得他厲害的地方在於熱忱,能夠努力的在下班時間為了興趣製作出一款遊戲,而且不斷思考如何讓遊戲更好玩、如何經營一個遊戲的網站、如何避免駭客利用 Visual Studio 來造假分數(這段要特別推薦一下,他把 function name 命名為「CheatingIsEasyAndLame」、「CheatingIsEasyAndStupid」之類的,結果很有效 XD),甚至還寫了一份 whitepaper 分享他在遊戲製作過程中學到的寶貴經驗(e.g., 如何設計遊戲、遊戲的趣味性、coding 上要注意的事情、sample code ...),真的是令人佩服。
這段訪問大約 13 分鐘左右,推薦一下 :D
2009年2月27日
與 UserControl 動態產生的控制項互動
就在前幾天在瀏覽各大部落格的文章時,
看到 Johnny 大大寫的這篇 [UserControl] 網頁生命週期與取不到 UserControl 資料的問題
原本坎尼已經快睡著了,看到結論的地方突然醒了!!!!!
還記得坎尼之前寫了一篇 如何設定UserControl中動態產生的控制項初始值
坎尼當時的著眼點在 Page_Load
一直都忘了 Page_Init... Page_Init... Page_Init...
於是坎尼又做了下面的測試
新增一個 UserControl ,裡面加入一個 DropDownList
並在 Page_Init 事件動態增加項目
新增一個 WebForm,並將剛剛的 UserControl 引用到頁面上
在剛剛的WebForm 的 Page_Load 事件
加入指定的 SelectedIndex
執行畫面,並未出現 "未設為執行個體" 的 Exception
登登~~成功~~
所以坎尼之前那次的研究還真的是繞了不少路啊 (汗)
坎尼記得坎尼的朋友小馬王有寫過 ASP.NET生命週期的文章
有興趣的人可以看看
最近加入了圖片放大的Script
使用上有什麼意見可以回覆這篇文章或寄信
(Tim你就別來亂了...說什麼很噁心)
看到 Johnny 大大寫的這篇 [UserControl] 網頁生命週期與取不到 UserControl 資料的問題
原本坎尼已經快睡著了,看到結論的地方突然醒了!!!!!
還記得坎尼之前寫了一篇 如何設定UserControl中動態產生的控制項初始值
坎尼當時的著眼點在 Page_Load
一直都忘了 Page_Init... Page_Init... Page_Init...
於是坎尼又做了下面的測試
新增一個 UserControl ,裡面加入一個 DropDownList
並在 Page_Init 事件動態增加項目
新增一個 WebForm,並將剛剛的 UserControl 引用到頁面上
在剛剛的WebForm 的 Page_Load 事件
加入指定的 SelectedIndex
執行畫面,並未出現 "未設為執行個體" 的 Exception
登登~~成功~~
所以坎尼之前那次的研究還真的是繞了不少路啊 (汗)
坎尼記得坎尼的朋友小馬王有寫過 ASP.NET生命週期的文章
有興趣的人可以看看
最近加入了圖片放大的Script
使用上有什麼意見可以回覆這篇文章或寄信
(Tim你就別來亂了...說什麼很噁心)
2009年2月23日
解決 vs 2005 在 IE8 上不能開啟 debug 模式
其實這個問題坎尼在 IE8 beta 剛出來的時候就發現了
不過由於很快就找到解決方式,所以坎尼認為應該只是個案吧....
先講一下坎尼的開發環境
win xp sp3
vs 2005 sp1
vs 2008 sp1
ie8 beta2
發生的情境...
用 vs2005 開發的網站專案按下 F5 時
IE顯示頁面之後, Debug 模式就自己關掉了
此時 IE及頁面仍會留著,但無法用小紅點 Debug
(等同在專案的頁面上按 View with Browser)
坎尼剛剛上網找了一下...發現了這位 苦主
底下也有人提供了解決方案
不過不想改登錄碼的人,可以試試下列坎尼發現的方法
坎尼後來發現,其實和用 vs 2008 做 debug 的動作沒啥關係
只要把目前所有開啟的 IE8 視窗關掉
再執行 vs 2005 的 debug 模式即可
不過為什麼會這樣,坎尼目前還不曉得 XDDD
vs2008只要執行一次debug即可
坎尼在猜,vs2008應該只是要讓debugger導到正確的process
不過這個方法只要電腦重開就要重新做一次
對了 本篇沒圖 XDDD
不過由於很快就找到解決方式,所以坎尼認為應該只是個案吧....
先講一下坎尼的開發環境
win xp sp3
vs 2005 sp1
vs 2008 sp1
ie8 beta2
發生的情境...
用 vs2005 開發的網站專案按下 F5 時
IE顯示頁面之後, Debug 模式就自己關掉了
此時 IE及頁面仍會留著,但無法用小紅點 Debug
(等同在專案的頁面上按 View with Browser)
坎尼剛剛上網找了一下...發現了這位 苦主
底下也有人提供了解決方案
不過不想改登錄碼的人,可以試試下列坎尼發現的方法
- 關閉所有IE視窗
打開vs2008,並開啟一個Web專案用vs2008進入debug模式 (按下F5)- 接著就能用 vs2005 來 debug 囉!!!
坎尼後來發現,其實和用 vs 2008 做 debug 的動作沒啥關係
只要把目前所有開啟的 IE8 視窗關掉
再執行 vs 2005 的 debug 模式即可
不過為什麼會這樣,坎尼目前還不曉得 XDDD
vs2008只要執行一次debug即可
坎尼在猜,vs2008應該只是要讓debugger導到正確的process
不過這個方法只要電腦重開就要重新做一次
對了 本篇沒圖 XDDD
2009年2月22日
無法預測、無法控制的 ASP.NET multi-thread 機制
所謂的 thread 是甚麼相信大家都知道,多少也在學生時代寫過一兩個多執行緒的作業。
在 .NET 的世界裡面,無論是Web Apps or Windows Apps,在 runtime 時期都是在 CLR 上運作,而 CLR 所看到的都是在 AppDomain 中執行的 thread,
Web/Windows Apps 的分別只是在於 CLR 載入的 aassembly 不同罷了。
從上上週末開始,我們 Team 就開始設法利用 TLS 來解決舊元件造成的 MSDTC 問題,
在想像中這個 solution 可以同時滿足 Web Apps & Windows Apps ,
沒想到就此一頭栽進了深不見底的 ASP.NET multi-thread 地獄。
(到現在還是處於一頭霧水的狀態 Orz)
經過5個系統的實測(4個是各部門的系統,另一個是自己寫的超小型 demo 網站),
我們發現「ASP.NET 在某些不明條件下,會以 multi-thread 的方式來處理 Request」,
也就是「custom httpModule 與 page 的 code-behind 是以不同的 Thread 在運作」,
這與我們想像中的「ASP.NET 對一個 Request 從頭到尾都是以單一 Thread 來處理」的假設完全不同,而這種現象使得 TLS Solution 呈現完全報廢的狀態,為甚麼呢?
在 What’s ThreadLocalStorage 這篇文章中所附的範例程式中,我是在一個自己撰寫的 custom httpModule 中去處理 TLS 中的資料,若 ASP.NET 的行為一如預期的是以單一 Thread 來處理 Request,那麼在page 的 code-behind 程式 中便可順利取得在 custom httpModule 中存入 TLS 的資料(connection & transaction 物件),也就可以執行 local transactions 而不需勞師動眾的啟動 distributed transaction (MSDTC) 了。
但是當 ASP.NET 以新的 Thread (#2) 來處理 page 的 code-behind 程式時,Thread #2 是無法取得 custom httpModule (Thread #1) 的 TLS 中的 connection & trnasaction 物件的(不然怎麼叫 ThreadLocalStorage 呢?),因此在 code-behind 的程式中要 access DB 時便會出現 NullReferenceException!
奇怪的是,在拿來實測的系統中完全沒有撰寫 multi-thread 的程式(e.g., Thread.Start()),因此目前推測 multi-thread 現象是 ASP.NET 內部所做的 (Performance) Optimization 所產生的結果,是我們的程式無法(起碼很難)控制的。
在5個實測過的系統中,出現以下的 multi-thread 現象:
(System E 是自己寫的超小型 demo 網站)
那麼要如何觀測系統是否有啟動 multi-thread 呢?以下是觀測的步驟,有興趣的人可以拿自己的系統試試看:
在 .NET 的世界裡面,無論是Web Apps or Windows Apps,在 runtime 時期都是在 CLR 上運作,而 CLR 所看到的都是在 AppDomain 中執行的 thread,
Web/Windows Apps 的分別只是在於 CLR 載入的 aassembly 不同罷了。
從上上週末開始,我們 Team 就開始設法利用 TLS 來解決舊元件造成的 MSDTC 問題,
在想像中這個 solution 可以同時滿足 Web Apps & Windows Apps ,
沒想到就此一頭栽進了深不見底的 ASP.NET multi-thread 地獄。
(到現在還是處於一頭霧水的狀態 Orz)
經過5個系統的實測(4個是各部門的系統,另一個是自己寫的超小型 demo 網站),
我們發現「ASP.NET 在某些不明條件下,會以 multi-thread 的方式來處理 Request」,
也就是「custom httpModule 與 page 的 code-behind 是以不同的 Thread 在運作」,
這與我們想像中的「ASP.NET 對一個 Request 從頭到尾都是以單一 Thread 來處理」的假設完全不同,而這種現象使得 TLS Solution 呈現完全報廢的狀態,為甚麼呢?
在 What’s ThreadLocalStorage 這篇文章中所附的範例程式中,我是在一個自己撰寫的 custom httpModule 中去處理 TLS 中的資料,若 ASP.NET 的行為一如預期的是以單一 Thread 來處理 Request,那麼在page 的 code-behind 程式 中便可順利取得在 custom httpModule 中存入 TLS 的資料(connection & transaction 物件),也就可以執行 local transactions 而不需勞師動眾的啟動 distributed transaction (MSDTC) 了。
但是當 ASP.NET 以新的 Thread (#2) 來處理 page 的 code-behind 程式時,Thread #2 是無法取得 custom httpModule (Thread #1) 的 TLS 中的 connection & trnasaction 物件的(不然怎麼叫 ThreadLocalStorage 呢?),因此在 code-behind 的程式中要 access DB 時便會出現 NullReferenceException!
奇怪的是,在拿來實測的系統中完全沒有撰寫 multi-thread 的程式(e.g., Thread.Start()),因此目前推測 multi-thread 現象是 ASP.NET 內部所做的 (Performance) Optimization 所產生的結果,是我們的程式無法(起碼很難)控制的。
在5個實測過的系統中,出現以下的 multi-thread 現象:
(System E 是自己寫的超小型 demo 網站)
- 有插入 custom httpModule:
- System A: httpModule 屬於 Thread #1,page 屬於 Thread #2
- System B: httpModule 屬於 Thread #1 & #2,page 屬於 Thread #3 ~ #n
- System C: httpModule 與 page 屬於 Thread #1 (使用單一 Thread!)
- System D: httpModule 屬於 Thread #1,page 屬於 Thread #2
- System E: httpModule 與 page 屬於 Thread #1 (使用單一 Thread!)
- 不插入 custom httpModule (也就是一般寫網站的狀況):
- System A: page 屬於 Thread #1 ~ #n
- System B: page 屬於 Thread #1 (使用單一 Thread!)
- System C: 沒有測到
- System D: page 屬於 Thread #1 (使用單一 Thread!)
- System E: httpModule 與 page 屬於 Thread #1 (使用單一 Thread!)
- .NET Framework 版本 (1.1/2.0/3.5)
- IIS 版本 (6.0/7.0)
- 是否(混合)使用 MasterPage、UserControl、CustomControl
- Page 是否繼承自己包的 BasePage
- 頁面是否有用 frame 切割
- 某種程式寫法會造成 ASP.NET 內部自動改以 multi-thread 來執行
- 在 page 中以 js 另開視窗(做一些事情)之後再關閉的程式寫法
- 在自己寫的超小型 demo 網站中,MasterPage、BasePage、UserControl 中的 Init / OnLoad 事件中的程式碼都是空的,不會啟動 multi-thread
- 註冊 custom httpModule (不註冊的話,使用單一 Thread 的機率高很多)
- 第一次 Request 與 (Ctrl+) F5 Refresh 會造成不同的效果 (不同數量的 Thread)
那麼要如何觀測系統是否有啟動 multi-thread 呢?以下是觀測的步驟,有興趣的人可以拿自己的系統試試看:
- 進入 Visual Studio 的 Debug Mode。或者先以 IIS/ASP.NET Development Server (lightweight 的那個)瀏覽到目標頁面後,將 Visual Studio 附加至該網頁的處理序上進行 debug。
- 在該 aspx 以及 BasePage、MasterPage、UserControl 等檔案的 code-behind 程式中的 Init / OnLoad 事件上設定中斷點。
- 觀察執行過程中「System.Threading.Thread.CurrentThread.ManagedThreadId」的值。
2009年2月21日
快速製作大量資料的資料表
碎碎念改了新版面囉
大家感覺這樣的配色如何呢?
這次要來講一個謎樣的 SQL 語法:Insert Into Table1 Select * From Table2
意思是:從 Table2取出資料後,通通塞進Table1
不過有個限制就是:兩邊欄位數量、順位、類型必須相符
好了,坎尼利用了這個特性來講如何快速的製作測試大量資料表
首先,先新增一個資料表
範例裡只有兩個欄位,且 oid 的類型是 identity
在 Table 裡加入一筆資料
接著打開指令輸入視窗
不過要注意的是,坎尼將 oid 設 identity
若是強制 Insert 到 identity 欄位,Sql Server 只會說:No, you can't.
所以指令會改成下圖中第二句
可以看到坎尼用的偷吃步就是:目的及來源的資料表為同一個
由於一開始只有1筆,所以畫面上只會 Insert 一筆
「一筆有什麼好了不起的?」也許Tim會這麼講
不過當坎尼按了十數次的執行語法後
可以發現,資料已經成長到十數萬筆
原因就是:由於是同一資料表,所以每做一次就成長一倍
換言之,也就是2的N次方
以這種速度按下去,再按個幾次就會有千萬筆的資料了!!!!
可是當資料成長的愈快,每次執行的速度也就愈久
所以坎尼又改了一下語法 (如下圖)
一次只取 5000 速度只有快!!!天下武功,唯快不破
「如果要三千萬的資料,啊你是要我按到手斷掉啊」Tim又開口了
『孩子,請照顧好自己的身體健康,寫個for迴圈來跑就好』
最後來看一下前面做了那些動作的成果
See? 坎尼只是邊看電視邊按執行鍵,資料輕輕鬆鬆的成長到十萬筆 XDD
要是需要大量的資料來測試自己系統執行效率
就可以試試坎尼這個方法 :p
坎尼當年就被要求要一千萬筆資料來做壓力測試 orz
備註:
這個語法坎尼只在 MS Sql Server 裡用過
不過 Google 大神好像講說其他資料庫也能這麼做
這點坎尼目前的機器上沒法驗證,有需求的人就試試看吧 :D
大家感覺這樣的配色如何呢?
這次要來講一個謎樣的 SQL 語法:Insert Into Table1 Select * From Table2
意思是:從 Table2取出資料後,通通塞進Table1
不過有個限制就是:兩邊欄位數量、順位、類型必須相符
好了,坎尼利用了這個特性來講如何快速的製作測試大量資料表
首先,先新增一個資料表
範例裡只有兩個欄位,且 oid 的類型是 identity
在 Table 裡加入一筆資料
接著打開指令輸入視窗
不過要注意的是,坎尼將 oid 設 identity
若是強制 Insert 到 identity 欄位,Sql Server 只會說:No, you can't.
所以指令會改成下圖中第二句
可以看到坎尼用的偷吃步就是:目的及來源的資料表為同一個
由於一開始只有1筆,所以畫面上只會 Insert 一筆
「一筆有什麼好了不起的?」也許Tim會這麼講
不過當坎尼按了十數次的執行語法後
可以發現,資料已經成長到十數萬筆
原因就是:由於是同一資料表,所以每做一次就成長一倍
換言之,也就是2的N次方
以這種速度按下去,再按個幾次就會有千萬筆的資料了!!!!
可是當資料成長的愈快,每次執行的速度也就愈久
所以坎尼又改了一下語法 (如下圖)
一次只取 5000 速度只有快!!!
「如果要三千萬的資料,啊你是要我按到手斷掉啊」Tim又開口了
『孩子,請照顧好自己的身體健康,寫個for迴圈來跑就好』
最後來看一下前面做了那些動作的成果
See? 坎尼只是邊看電視邊按執行鍵,資料輕輕鬆鬆的成長到十萬筆 XDD
要是需要大量的資料來測試自己系統執行效率
就可以試試坎尼這個方法 :p
坎尼當年就被要求要一千萬筆資料來做壓力測試 orz
備註:
這個語法坎尼只在 MS Sql Server 裡用過
不過 Google 大神好像講說其他資料庫也能這麼做
這點坎尼目前的機器上沒法驗證,有需求的人就試試看吧 :D
2009年2月16日
2009年2月15日
趁年輕的時候多啃一些硬梆梆的書
這是今年新老闆特別強調要我們做的事情,認真的讀一本經典的大頭書,
搞不好晚上看一看不小心就會因為過 high 看到凌晨 =.=
Hardcore 的新老闆列出以下幾本經典好書:
(因為都沒讀過,所以不寫甚麼評論了 … 網路上評論超多)
一下子挑太難的書也不太好,雖然 SICP 和 HtDP 表面上看起來還蠻好玩的…
其他還有幾本據說也是很厲害的書:
搞不好晚上看一看不小心就會因為過 high 看到凌晨 =.=
Hardcore 的新老闆列出以下幾本經典好書:
(因為都沒讀過,所以不寫甚麼評論了 … 網路上評論超多)
- Structure an Interpretation of Computer Programs(SICP)
(據說超難,看起來會覺得很痛苦) - How to Design Programs(HtDP)
(跟 SICP 差不多,但稍微簡單一點。有辦法看完 SICP 的話這本可以用翻的) - Patterns of Enterprise Application Architecture(P of EAA)
(聽說比較接近 Business,彙整了很多經過實務考驗的經典案例)
一下子挑太難的書也不太好,雖然 SICP 和 HtDP 表面上看起來還蠻好玩的…
其他還有幾本據說也是很厲害的書:
- Code Complete Second Edition(cc2e,曾獲 Jolt Award)
- Official site(要註冊,免費)
- Wikipedia
- Amazon
- The Data Model Resource Book A Library of Universal Data Models for All Enterprises, Revised Edition Vol. 1(for SA, 這套書有一整個系列)
(話說我一開始挑這本,結果很迅速就被打槍了 …=.=)
- Analysis Patterns(據說比 P of EAA 還要抽象很多,非常難的樣子)
2009年2月11日
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 上看起來應該會類似這樣:
在 Windows 2008 上看起來則是這樣(跟設定的時候一樣,元件服務的內容有變):
Update: 發布前一個手滑就抓了 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」即可。
接下來依序執行以下步驟:
雖然已經整理出一套設定方式(這篇是 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 上看起來應該會類似這樣:
在 Windows 2008 上看起來則是這樣(跟設定的時候一樣,元件服務的內容有變):
Update: 發布前一個手滑就抓了 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」即可。
接下來依序執行以下步驟:
- 將 tracefmt.exe 從 {Windows SDK Folder}\bin 下複製到 Trace Log 所在的目錄中。
並確認除目錄中除了 dtctrace.log 外,必須要有「msdtctr.mof」和「msdtcvtr.bat」兩個檔案。
(.mof 要幹嘛我不太清楚,msdtcvtr.bat 內含呼叫 tracefmt.exe 執行 format 的 vb script)
- 在 Command Line 模式中,執行「msdtcvtr.bat -tracelog tracetx.log」,最後一個參數請換成 log 檔的檔名。
(執行過程中產生的錯誤會紀錄在「errortrace.txt」中 <-- 所以我才知道沒有 msdtcctr.mof 就跑不下去)
- 執行完畢後 Windows 會自動用 notepad 打開 tracefmt.exe 產生的 trace.csv,此檔案中的內容就是 Trace 過程中紀錄到的各種 event,接下來就可以根據 event 的內容開始分析了。若檔案內容一片空白表示沒有紀錄到任何 event。
(既然是 csv 格式,有需要的話也可以用 excel 開起來作進一步處理)
- 除了 trace.csv 檔案外,還會另外產生一個 errortrace.txt 說明檔,內有一些統計資料。不管你把「dtctrace.log」、「msdtctr.mof」、「msdtcvtr.bat」、「tracefmt.exe」複製到哪個資料夾執行,「trace.csv」和「errortrace.txt」的預設位置都會在:C:\WINDOWS\system32\MsDtc\Trace。
(應該可以透過 tracefmt.exe 指定輸出位置,不過這也不太重要…)
前端用 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
最後附上本次的 範例
一般來講,要在前端綁定資料就要用 <%# 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 的基本介紹:
但根據手上的資料來看應該是可以解決 MSDTC 的問題。
我的小小 TLS 範例程式可以在這裡下載。
PS. 關於 MSDTC 的說明,可參考 Darkthread 大大在 Run!PC 上發表的文章,如果忘記這個連結位置的話,可以 google「darkthread TransactionScope」,在第二個 result「Browse by Tags - Darkthread」中就可以找到「.NET分散式交易程式開發FAQ」。
以使用 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 取代)
- 儲存於 TLS 的資料一律是 Object 的資料型態,因此必須自己 handle 轉型。
但根據手上的資料來看應該是可以解決 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 比較:
這個 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 比較:
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
可能需要找個心靈導師開導一下
過年在家沒法上線 只好乖乖的玩 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,以下是一些心得:
利用過年這段時間我把工作機(去年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」,按了就可以直接關閉視窗,真的是很方便喔!
- HomeGroup 功能:參考這篇解說,簡單的說在 Windows 環境中要分享檔案現在更簡單了,之前想要設定 Vista & XP 分享檔案,弄到最後就放棄了=.= 但是要注意只要把「LAN」的「Network Location」設定成「Home Network」即可,連外的網路還是保持「Public Network」就好,如下圖:
- 如何設定中文輸入法
- 在 Enterprise 以上的版本中,可以安裝各語言的完整 language pack(含微軟新注音等),以 Vista 來說,繁中語言包約 1GB,這是最正統且萬無一失的作法。
- 安裝中文版 Office,會附送微軟新注音、新倉頡等等
- 用 google 搜尋「new chewing」,可以找到新酷音下載網頁
- 連到台灣奇摩首頁(http://tw.yagoo.com),在搜尋框輸入「yahoo」及可在 search suggestion 中找到「yahoo 奇摩輸入法」,目前是正式版,應該也不錯用。
- 開發用的相關工具
- 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 ….
在過年前剛好看到這個消息,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 ….
訂閱:
文章 (Atom)
Google Spreadsheet 裡用規則運算式
最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D
-
今天坎尼去上課老師講了一題很有趣的題目 所以回到家坎尼就順手試驗了一下 I. XOR (exclusive OR) XOR 是邏輯運算子之一,定義為: 當兩數的值不同才為 true,相同則為 false 其他相關說明可以參考 維基百科:XOR II. 程式 以往的做法會宣...
-
好久沒開 Chart Control 議題了 剛好前陣子 Codeplex 出現可以輕鬆建立 Excel 檔案的 Library- NPOI 於是坎尼想說研究一下,看能不能把 Chart Control 匯出圖片到 Excel 中 沒想到只花了不到1小時就研究...
-
上個週末打開一個影片檔,發現字幕檔是中英文混合的,造成字幕吃掉畫面很大的空間, 打開字幕檔一看,果然每一段時間都有先英文後中文的字幕: 因此我想要自己作成「只有中文」&「只有英文」兩個字幕檔,但這個檔案有6418 行,如果要手動一行一行的刪除...