Torng's profileChrisTorngBlogListsGuestbook Tools Help

ChrisTorng

電腦資訊信仰心情分享空間

公告

我另外開了一個預備推廣 Agile 軟體開發的網站,在 http://christorng.ning.com/,請大家往前支持。
可由右方類別模組中選擇主題類別開始瀏覽
封存中只有 2005 年 4 月及 12 月之後有網誌內容
已由 ChrisTorng 社群轉移到此分享空間中

搜尋 ChrisTorng 部落格內容

切換 MSN Spaces 語系至:
繁體中文 / 簡體中文 / 英文

Translate to English

在 Messenger 接收新文章通知

Torng Chris

Occupation
Location
Interests
我是 ChrisTorng。 基督至上,願意真誠以對,希望學習寬以待人,嚴以律己。
由我所建置管理的網站
我自行製作的工具

MOQ 撰寫 Mock 的測試框架 + 我自己寫的例外測試函式

MOQ The simplest mocking library for .NET 3.5 and Silverlight with deep C# 3.0 integration 看起來還蠻有趣的,想寫 Mock 的人可以參考一下。


我自己先前也有為了測 Exception 而使用了 lambda expression,覺得 lambda expression 是個全新的寫程式方法,一開始看起來會比較難理解,但有時可以減少很多程式碼...減少程式碼又會讓程式碼較易讀...

標準的測試寫法,在待測函式會丟出預期中的例外時,要使用 [ExpetationException],但只能一個 TestMethod 測一個例外。我寫的這個功能,是為了在同一個 TestMethod 中可以測試多個會丟出例外的目標函式。

程式碼很短,貼出來供參考:


正常的連續測試例外的寫法會是這樣:

[TestMethod]
public void TestThrowExceptions()
{
    Foo foo = new Foo();

    try
    {
        foo.ThrowArgumentException();
        Assert.Fail();
    }
    catch (Exception ex)
    {
        if (ex.GetType() != typeof(ArgumentException))
            Assert.Fail();
    }

    try
    {
        foo.ThrowArgumentNullException();
        Assert.Fail();
    }
    catch (ArgumentException ex)
    {
        if (ex.GetType() != typeof(ArgumentNullException))
            Assert.Fail();
    }
}

非常地長...而且重覆的地方很多...但 try/catch 樣式又沒辦法包在共用的子函式中重覆呼叫,因為裡面有 foo.xxx() 會每次都不一樣...這就令我想到: 匿名函式可以上場了...

以下是可以重覆使用的測試函式:


public static void Throws(Type exceptionType, Action action)
{
    if (exceptionType == null)
    {
        throw new ArgumentNullException("exceptionType");
    }

    if (exceptionType != typeof(Exception) && !exceptionType.IsSubclassOf(typeof(Exception)))
    {
        throw new ArgumentException("exceptionType 參數必須為一例外型別。", "exceptionType");
    }

    try
    {
        action();
    }
    catch (Exception actualException)
    {
        if (actualException.GetType() != exceptionType)
        {
            Assert.Fail("預期要丟出例外 {0},但卻丟出例外 {1}。此例外之內容為: {2}", exceptionType.ToString(), actualException.GetType(), actualException.ToString());
        }

        return;
    }

    Assert.Fail("預期要丟出例外 {0},但卻完成執行,沒有例外。", exceptionType.ToString());
}  

測試的寫法為:
AssertExtension.Throws(typeof(ArgumentNullException),() => foo.Bar());


後來看到這個 MOQ 後,發現使用 Generic Method 更簡單,於是改寫如下:

public static void Throws<T>(Action action) where T : Exception
{
    try
    {
        action();
    }
    catch (Exception actualException)
    {
        if (actualException.GetType() != typeof(T))
        {
            Assert.Fail("預期要丟出例外 {0},但卻丟出例外 {1}。此例外之內容為: {2}", typeof(T).ToString(), actualException.GetType(), actualException.ToString());
        }

        return;
    }

    Assert.Fail("預期要丟出例外 {0},但卻成功完成執行,沒有例外。", typeof(T).ToString());

測試的寫法為:
AssertExtension.Throws<ArgumentNullException>(() => foo.Bar());


因為在原來的寫法,丟入 exceptionType 有可能不是 Exception 類別,因此要在執行時期做檢查。新的寫法,若是不正確的類別,會無法通過編譯...因此就不必做執行期檢查。而且測試的寫法也更精簡一點。

所以連續測試丟出例外的 TestMethod 可能是這樣:
[TestMethod]
public void TestFooToInt()
{
    Foo foo = new Foo();

    AssertExtension.Throws<ArgumentNullException>(() => foo.ToInt(null));
    AssertExtension.Throws<ArgumentOutOfRangeException>(() => foo.ToInt("a"));
    Assert.AreEqual(1, foo.ToInt("1"));
    Assert.AreEqual(-1, foo.ToInt("-1"));
}

這樣就可以在同一個 TestMethod 用很簡單的寫法測會丟出例外的函式了。

一開始寫 MOQ,到後面全部是寫我自己的東西,跟 MOQ 沒什麼關係...

預備推廣 Agile 軟體開發方法

此分享空間已經不再維護,我另外開了一個預備推廣 Agile 軟體開發方法的網站,在 http://christorng.ning.com/,請大家往前支持。

關於 Google 瀏覽器 Chrome

ZDNet[網路部落格]瀏覽器只要快就好?我所寫的回應,轉來此處與大家分享。


Chrome 可以搶得到的佔有率,主要應該是 IE 以外的 FF/Opera/Safari 等,因為用 IE 的人還是繼續會用 IE,會想用 FF/Opera/Safari 等其他瀏覽器的人,也才會想試用 Chrome,而可能被它吸引。最該緊張的應該是 FF 吧。

FF 之前才拿到三年的 Google 合約,可見 Google 並沒有想要吃掉 FF,而是希望 FF 繼續侵蝕 IE 市場。

如果真想要搶 IE 的佔有率,最簡單的做法不是遵循標準,而是完全支援 IE 的所有語法...Chrome 沒有這麼做...

Google 自己都講了,它並不在乎 Chrome 的市佔率。它的推出,更重要的任務是逼迫其他瀏覽器的速度也要加快,最好也加上防當、應用程式捷徑等讓一般網站變得像本機應用軟體的特性。所有的瀏覽器速度加快了,執行速度變得跟本機應用程式相當,使用者就會更喜歡使用網路應用程式,而不喜歡自行安裝本機軟體了。

因此,免費開放原始碼的 Chrome 市佔率即使是 0%,只要大家都喜歡使用網站服務,Google 的目的就達到了。Google 想賺的錢是來自線上流量/廣告,而 Google 網站使用 JavaScript 的量又特別大。加速 JavaScript 這個環節,讓網站服務執行速度與本機一樣快,這就是 Google 所要的。

使用者習慣上網處理工作,而不是在本機安裝軟體後,裝置/OS 的重要性就日漸降低,不在乎你用什麼裝置、OS、瀏覽器,反正只要一上網,什麼工作都可以做。不必再搞防毒、備份、一堆 Windows 更新又得重開等麻煩的事情。

IE 為了保住佔有率,也得加把勁加速 JavaScript 及其他部份的執行速度,這也讓自己的 OS 版本變得不重要 (大家就不必再吵需不需要升級 OS 了),自己打敗自己。這就是 Google 對抗微軟的絕招,Chrome 成功失敗都無所謂,反正 Google 只要專心做第一名的線上服務提供者即可。

Google 更想藉由 Chrome 表達的,是「你們的瀏覽器都太複雜了」,在一堆華而不實的功能上做文章,卻沒有把核心執行速度放在第一位。他想要證明:「你們瀏覽器裡的那一堆功能,我可以全部搬到網路上來做。」

因此, Google 瀏覽器真的只是一個很簡單的窗口,窗口不必做什麼花樣,只要窗外的世界更美好就夠了。

我只好奇一點,Google 瀏覽器為何沒有全螢幕顯示的功能。就是完全蓋住工作列,只用瀏覽器執行日常工作,瀏覽器的 Tab 就可以切換各個「應用程式」,完全取代工作列了...

更甚者, Google OS 也可以推出來,只需要比 Linux 更更簡單的硬體,只有瀏覽器一個功能,一切只要上網都可以解決。(當然我知道這個可能講得太誇張了,但,是否可能是將來的趨勢?)

上線費用太貴? 沒問題,只要你願意看廣告,一切都是免費的。電腦可以送給你,GPhone 也可以送給你。免月租費,免連線費,一切全部免費。所有的活動都由廣告商支付,換個方式講是所有想賣商品給消費者的廠商,將支付一切的線上活動費用,只求你上它的網站進行消費。

微軟已經被逼得要走上相容於標準之路,將來所有網站撰寫者的工作將會更容易,可以寫一套全部都能跑。

還想要撰寫本機軟體嗎? 還想下載、安裝、破解,與莫名奇妙的問題奮鬥、防毒、備份嗎?

還想學各種程式語言與技術嗎? 何不把 HTML/CSS/JavaScript 這一套徹底搞通就好?

越加越多功能的 Windows 還賣得出去嗎? 偏偏那些功能上網就有免費的...
.
.
.
.
.
.
你所要付出的代價,就是隱私。

Google 在隱私這方面是一直受爭議的。是的,廣告要賺錢,第一就是掌握客戶資訊,才能精準行銷。

Google 的策略,資料與軟體都在它的伺服器上,一切上網都能解決,你就是相信它,把你的一切都交給它。它如果關了,你的一切也就沒了。

再來還可以扯到 Live Mesh。Live Mesh 是微軟仍然要讓裝置很重要,讓你所屬的所有裝置,任何現有既成的軟體,都能很輕易地互相同步 (這樣你就不需要依賴線上服務來達成到處皆可取得的特性),沒有自己所屬裝置時還有 Live Desktop,其上的使用經驗與本機 Vista 完全相同。但這也限制了它的使用族群,基本上只在 Windows 使用者裡。Google 的策略則針對所有使用者,而且管道是大家早都有也用得很習慣的各式瀏覽器 (Google 並沒有期待你要用 Chrome 上網!),而不是目前還在 Tech Preview 的全新軟體 Live Mesh。依我個人目前看起來,Google 的策略贏面較大。

由 Live Mesh 來看微軟的策略,軟體可以安裝在你的電腦上,資料也可以本機處理,每一個裝置之間自動同步資料也可以完全點對點完成 (目前還不行,將來的版本才行),根本不會到微軟手上。微軟伺服器只用作當你不在自己的電腦上網時,還有最後一個備用方案。你想放全部資料進去也可以,完全沒有也沒關係,只是有時會不太方便。

企業會比較不願意把資料交給外人管理。但它也不想沒事被逼著簽軟體合約,兩三年就換一版 Windows、Office 或 IE,把本來用得好好的資訊系統給搞砸,又得花額外的人力去處理多餘的問題。

我也在推測,微軟在 Windows 7 之後,何去何從? 我公司內的網站/軟體,到現在連 IE7/Vista 都還沒辦法完全相容,還有可能去買 Windows 8/Office 201x ??????

Windows 8/Office 201x 可能沒人要買了...微軟怎麼辦? 要針對全網路時代,重新發明新的網路 OS??? 那過去一切的優勢都歸 0 了? 但現有優勢也一直在流失中...不做是不是等死?

Google 瀏覽器不會對瀏覽器市場的佔有率分配有多少影響。但它的釋出,將影響所有的瀏覽器,把核心功能做得更快,提高一切線上服務的可用性,降低作業系統與裝置的重要性。

Google 將會大大得利,微軟則會陷入「要不要以自己的線上服務 打自己的本機軟體」的矛盾苦戰。


你要選擇將自己的一切交給一家公司,完全相信它會好好保管你寶貴 (也許其中許多根本就不寶貴,只不過因為免錢,沒必要留的垃圾也全放進去) 的資料,將來有格式轉換時,一定會幫你轉換到最新的平台? 至於資料放在它那兒,它要怎麼運用,就相信它的隱私權說明了,雖然你從來也沒看過裡面寫些什麼...

還是選擇把隱私、資料放在自己的裝置上,自己想辦法維持電腦正常運作,克服一切的麻煩問題,任何的格式轉換、備份也自己包辦?

ChrisTorng 樣式訊息記錄在 Vista 下的問題

感謝 Tony 提醒,告知 ChrisTorng 樣式訊息記錄在 Vista 下無法儲存設定的問題,另我也發現刪除對話階段功能亦有問題。慚愧的是,雖然我自己也使用 Vista,但卻從未用過自己的訊息記錄工具。目前我仍不確定問題是 Vista 造成還是 IE7 造成,若有朋友有 XP 已安裝 IE7 可回報一下是否正常。

刪除對話階段之問題目前仍不知如何解決。而儲存設定的問題,追查了一下,遇到兩個問題,一個是檔案路徑分隔字元原本是 "\",現在變成 "/"。這個問題倒容易解決。另一個問題,不支援中文檔案路徑。目前會遇到的中文檔案路徑,包括「我已接收的檔案」及「記錄」兩者。我試了一下,找不到方法可以正確讀寫中文檔案路徑,只試出來純英文路徑是正常的。因此必須要將訊息記錄移至純英文路徑上才能正確讀寫設定檔。

也就是說,就目前來說,要修正儲存設定的問題,我想到兩個方法:「改程式+改路徑」與「直接改設定檔」。


方法一:改程式+改路徑

這個方法可以解決無法儲存設定的問題,適合於常常修改設定的人。
以記事本開啟 ".\ChrisTorngStyle\SettingProcess.xsl",找到:
function GetCurrentPath()
{
    var Path = decodeURI(location.pathname.substr(1));
    return Path.substring(0, Path.lastIndexOf("\\") + 1);
}
將這段代換成:
function GetCurrentPath()
{
    var Path = decodeURI(location.pathname.substr(1));
    var LastSlashPos = Path.lastIndexOf("\\");
    if (LastSlashPos &lt; 0)
    { LastShashPos = Path.lastIndexOf("/"); }
    return Path.substring(0, LastShashPos + 1);
}
即可修復路徑分隔字元問題。
再來要把訊息記錄路徑上所有非英文字換成英文,在繁體中文版中包括「我已接收的檔案」及「記錄」兩者。可換成英文版的 "My Received Files" 及 "History"。然後在 Windows Live Messenger 中亦需設定新的訊息路徑:「工具 - 選項 - 訊息 - 將我的對話內容儲存在此資料夾」。


方法二:直接改設定檔

如果只需要設為繁體中文,不需要常常改設定值的話,建議用這個比較簡單的方法。
設定檔位於訊息記錄資料夾內 ".\ChrisTorngStyle\CurrentSetting.xsl",以記事本開啟,將其中的 "Language_en-us.xsl" 代換成 "Language_zh-cht.xsl" 存檔後即可。
所有可用的語言檔名列在 ".\ChrisTorngStyle\AllSetting.xml" 中之 "AllSettings\Languages\Language\File" 段落,可以任選其一。其他 "CurrentSetting.xsl" 中的設定值,只要看得懂一些英文,相信不會太難看懂,如果有需要的話可自行修改,只要小心別動到 9/30/true/false 這些設定值以外的字元即可。


而這個工具當初有繼續製作下一版本,但功能尚未完成,又因自己忙,就停了下來。因此目前沒有更新版本的計劃。

ASP.NET Futures

今天看到 ASP.NET Futures 中的影片,真的被嚇到了,那個 Dynamic Data Controls for ASP.NET,真的不用寫程式就可以做資料庫網站,甚至,只要會「建立新專案」,再加上資料庫連結,完整的資料庫程式就自動產生出來了…不但不必寫程式,甚至連拖拉放都免了…所以一定要上來推薦大家看一下。
 
已關閉留言功能。這裡僅供檢視舊留言。
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
No namewrote:
廣告留言, 現在比較普遍的防賭方式就是圖形驗證碼, 隨機產生一組字串, 建立一個Session在記憶體中, 跟user輸入的字串做比對是否吻合,
大多垃圾留言都是用機器人自動到處貼網站中含有 Input type=TEXT 或是 含有 textarea 標籤 , 然後自動 Submit 送出資料,
比較強的機器人還內建OCR會去辨識圖形驗證碼, 所以圖形驗證馬都要搞些不易被OCR辨識的花樣,
之前也是一直有留言板被廣告塞爆的困擾, 但又不想大費周章搞個會員註冊制, 所以嚐試著用圖形驗證碼解決這個困擾,
果然, 以往每天都有200~300機器人自動貼的廣告, 加上圖形驗證後, 測試半年都還沒被攻破
範例 http://lukwama.com/  我怕文字的辨識度太低, 所以還刻意把 9,g,q 之類易混淆的字元當作同一字元處理, 效果還不錯
Dec. 5
Torng Chriswrote:
很抱歉已經很久沒有在自己的空間內留言了...因此恐怕沒有什麼可看性... 疑惑
Sept. 15
ETBluewrote:
也是看了ZDnet來拜碼頭,沒別的,就是精闢!也很帶種 XD
Sept. 13
酒鬼 呆wrote:
看了您在
寫的回應,寫得真是太好了,的確比原文寫得還更有看頭!
因此過來拜拜碼頭。
 
我使用無蝦米輸入法,剛看到您這邊似乎也有不少無蝦米的資料,呵呵,晚點來參考參考。
 
使用Chrome,無法在這邊留言耶,換了IE才行......
Sept. 12
Torng Chriswrote:
我放檔案的網站已經無法連結了...真抱歉...
July 15
先前以 Windows Live 名稱推出測試,現在改回使用 MSN 名稱之服務,或掛在 Windows Live 之下但沒有 Windows Live 名稱之服務
曾經有消息,或猜測到網址,但至今仍未公開的 Windows Live 服務