2009年4月26日 星期日

我常用的 C#

ShortCut key

Goto Definition: F12
Find all references: Shift + F12
Definition Stack: Ctrl+Shift+F7, Ctrl+Shift+F8

Next-Windows: F8
Goto Opened File: Ctrl+Tab (Preview)
                          Ctrl+Alt+down

 

Ctrl + .

向前移動一個Word : Ctrl + <-
向後移動一個Word : Ctrl + –>
向前選取一個Word : Ctrl + Shift + <-
向後移動一個Word : Ctrl +Shift +  –>

 

Option 設定

字型 Fixedsys

Projects and Solutions/General => check the option “Track Active Item in Solution Explorer”

2009年4月24日 星期五

SharePoint WebPart life cycle

最近在寫 WebPart,有點麻煩。
使用拖拉元件的方式寫習慣了,對於類似元件的實作很不熟悉。

SharePoint 的 life cycle,與其他不大相同。

比較一下 Sharepoint WebPart Lifecycle EventsASP.Net Page Lifecycle in Text mode, 可以發現 SharePoint,Asp.Net  的 CreateChildControls 時間不同。

Asp.Net的 CreateChildControls 比 OnLoad 晚。

SharePoint WebPart 在 !Page.IsPostback 時, OnLoad 比 CreateChildControls 早。
SharePoint WebPart 在 Page.IsPostback 時, CreateChildControls 比 OnLoad 早。

為了這個不同,我又花了兩個小時在 debug.

2009年4月22日 星期三

點閱統計 8888 人次

部落格不好經營,過了快一年,只有 8888 人次。真的比不上水龍頭漏水啊!

剛好看到 8888 這個數目,還蠻值得記念的。

image

2009年4月19日 星期日

Team Foundation Server 2008 實戰

Shoot! 安裝過 Project Server 2003 後,我還以為沒有比這個更難的了。
沒想到 Team Foundation Server 更難!

目前還正克服中。想要在公司內推這套系統,看來還有的試了。

困難1:安裝 Single Server, Windows 2003 Standard, SQL Server 2008 Standard, TFS 2008 Standard

我是按照TFSInstall-SP1-RTM-v080918.chm 去安裝的。注意到光安裝手冊就寫得非常複雜。我之前想所一頁一頁跟著作就不會錯了。於是由最上方照著順序看,照著順序實作。但不管安裝 TFS WorkGroups 版,或 Standard 版,總會在安裝 TFS 時,被「執行系統健康檢查」這一個步驟檢查出「不相容的 SQL Server版本」。花了好多天,最後也請教了微軟的 Terry Lin,才知道必須整合 TFS 2008 SP1 才能這樣安裝。也就是在下圖的反白標示的「安裝 Team Foundation Server 與 Service Pack 1」。

因此,學到了一個教訓:一次看完所有的安裝手冊,再開始動手,是比較保險(但不 make sense)的方法。

image

終於安裝「成功」了。因為沒有出現錯誤訊息。

困難2:

使用 Visual Studio 2008 Team Suite,想要連到 TFS 2008。就必須將 Source Control 設定成 TFS。

image

我在某一個 Solution 上按右鑵,執行「Add Solution to Source Control」,馬上收到了另一個問題

imageimage

另外,在建立一個 Team Project 時,最後也出現了如下圖的錯誤

image

找了一篇文件 http://billwg.blogspot.com/2009/03/troubleshooting-team-project-creation.html,說明是TF30207: Initialization for plugin "Microsoft.ProjectCreationWizard.Reporting" failed的問題。也是無解。

另外找了一篇 http://www.thejoyofcode.com/TF03177_Team_Project_Creation_Failed.aspx , 這篇說明在安裝 Team Explorer 後,Visual Studio 2008 應該重裝 SP1。天啊!又花掉了我1小時的時間重新安裝 VS2008 SP1。不過,這的確解決了我的問題。

問題3:不允許不能 Compile 的程式碼 Chek-in

這應該是必備的吧!否則使用 TFS 作什麼呢?因此作了了如下的設定。

image

寫了一個不能 compile 的程式。天啊!竟然可以check-in.

原來,這個功能必須依靠 Code Analysis,即使 Code Analysis 沒有勾選任何的 rules.

image

然後,在 Solution Explorer 上選到 solution, 按右鍵執行 「Code Analysis Settings for Solution/Merge with Check-in Policy」

image

終於出現了我要的結果:不能 compile ,就不能 check-in

image

(20090420 後註:原來我想錯了,真正的 builds check-in policy 使用方了, 可見 How Do I: Use the Builds Check-in Policy, 設定上還是有些麻煩)

2009年4月17日 星期五

Design Pattern: Singleton 的型式

Singleton 是非常經典的 Design Pattern。最簡單,也是最具實用性的 pattern。
我也最常拿來考面試者。一個有經驗的 programmer,怎麼可能沒碰過 Singleton?

目的

全域只有一個實例(instance)

舉例

一家銀行的分行,通常會有多個櫃台(窗口),以加快處理速度。但只能有一個取號機,避免號碼牌重覆。

因此,該取號機只能有一台。如果有兩台,天下就大亂了。

程式在實作時,也常常有類似的需求。如何才能確保一個 instance呢?大家經驗累積的結果,都有類似的樣式(pattern)。這樣的 pattern 後來被取名為 singleton,以方便大家的溝通。

策略

  1. 將預設建構子封閉起來,不讓外界直接建立 instance.
  2. 使用靜態屬性(static property),讓外界取的唯一的 instance

最常見的實作如下。

實作1
class MySingleton
{
private static MySingleton _singleton = null;
private int currentNumber = 0;
private MySingleton()
{
}

public static MySingleton Current
{
get
{
if (_singleton == null)//注意這一行
_singleton = new MySingleton();
return _singleton;
}
}

public void WriteNumber()
{
currentNumber++;
Console.WriteLine(currentNumber);
}
}


Client


而Client code 的使用方式如下
MySingleton.Current.WriteNumber();
MySingleton.Current.WriteNumber();
MySingleton.Current.WriteNumber();

呼叫的結果,就是 1, 2, 3了。

實作1的方法並不完美,因為不是 thread-safe。換句話說,使用在 multi-thread 的環境下,是有可能還是建立了多個 instance。可能發生問題的程式碼,就是實作1內註解的「注意這一行」。

因此,有人改寫如下


實作2: thread-safe


class MySingleton
{
private static MySingleton _singleton = null;
private int currentNumber = 0;
private MySingleton()
{
}

public static MySingleton Current
{
get
{
if (_singleton == null)
{
lock(typeof(MySingleton))
_singleton = new MySingleton();
}
return _singleton;
}
}

public void WriteNumber()
{
currentNumber++;
Console.WriteLine(currentNumber);
}
}

實作2的方法,是使用了 lock 的 c# 語法,讓進入 lock區段的執行緒只能有一個。

實作2其實已經相當完美了。唯一美中不足的是,簡單的singleton,竟然要這麼複雜?因此,又有人改寫如下

實作3: thread-safe, eager singleton


class MySingleton
{
private static MySingleton _singleton = new MySingleton();
private int currentNumber = 0;
private MySingleton()
{
}

public static MySingleton Current
{
get
{
return _singleton;
}
}

public void WriteNumber()
{
currentNumber++;
Console.WriteLine(currentNumber);
}
}

實作3是使用了 static 的 instance,並在一開始就建立了 instance。即使用了private static MySingleton _singleton = new MySingleton();這一行。


這樣的好處,是大幅減少了程式碼的複雜度,相當容易維護。我相當推薦這一型。

實作3有一個壞處,當 Client 尚未需要 singleton的 instance時,程式就先建立了 instance。而實作2時會先判斷是否尚未建立實例。

if (_singleton == null)

因此,實作2是lazy singleton「要用時才建立instance」, 但not thread-safe。而實作3是eager singleton,「未用時已建立 instance」, thread-safe。

有沒有既是 thread-safe, 又是 lazy singleton 的寫法呢?因此產生 實作4

實作4: thread-safe, lazy singleton



class MySingleton
{
private int currentNumber = 0;
private MySingleton() { }

public static MySingleton Current
{
get {
return Inner.Current;
}
}

public void WriteNumber() {
currentNumber++;
Console.WriteLine(currentNumber);
}

class Inner {
static Inner() { }
internal static readonly MySingleton Current = new MySingleton();
}
}

實作4非常巧妙地使用 inner class 並結合 static instance 的用法,完美地完成了任務,是我目前看過最棒的 singleton 解法。

2009年4月13日 星期一

Visual Studio Team Test Quick Reference Guide 1.0

A quick reference for users of the Team Testing features of Visual Studio Team System 2008

http://vstt2008qrg.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25504

這裡主要說明了 How to do xxxxx 的事情。
可惜並沒有一些開發 tests 的規則說明。例如 TDD Pattern: Do not cross boundaries , Unit Test Boundaries 的解說。

SQL Server 2008 SP1 發佈

下載位置

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=66ab3dbb-bf3e-4f46-9559-ccc6a4f9dc19 

這一次算是小改版。主要是更新一些問題。

2009年4月9日 星期四

Burn an ISO image to DVD

以往, 需要燒光碟時總是要使用 Nero , 現在 Windows 7 就內建了

使用檔案總管, 雙擊後就會打開 Windows Disc Image Burner.

image

接著只要按 Burn 就OK 了

(Do I need nero any more?)

2009年4月8日 星期三

SQL Server Isolation Level

有好心的人整理出 Isolation 的表格。如下

 

Isolation level

Dirty Reads

Non-repeatable reads

Phantom reads

Concurrency control

READ UNCOMMITTED

Yes

Yes

Yes

Pessimistic

READ COMMITTED (with locking)

No

Yes

Yes

Pessimistic

READ COMMITTED (with snapshot)

No

Yes

Yes

Optimistic

REPEATABLE READ

No

No

Yes

Pessimistic

SNAPSHOT

No

No

No

Optimistic

SERIALIZABLE

No

No

No

Pessimistic

 

資料來源 http://www.sqlteam.com/article/transaction-isolation-and-the-new-snapshot-isolation-level

Web 2.0 的最佳典範: GMail

早上看到 MIS2000 Lab   提供下面的訊息.  (為了資料易讀性  我就將資料複製一份到這裡,不是故意侵權)

我的天 My God. It’s always being the beta version.  當真符合 Web 2.0 的精神,永遠的 Beta 版。

但是,Beta 不代表品質不好,是指會一直持續地改進。

 

你有沒有看過開站提供服務五年了....卻還是Beta版的網站...

請注意圖片的左上角, gmail蛋糕底下,還是掛上 Beta字眼

雖然如此,上次 Google大當機,他們還是出面道歉了

因為........即使是Beta版,但他提供的服務與穩定度,仍然很值得信賴

2009年4月7日 星期二

還原msdb資料庫後,發生 because the SSIS subsystem failed to load. The job has been suspended 錯誤

什麼時候需要還原 msdb 資料庫呢?
是當SQL Server 上在伺服器層級的一些作業、排程的設定壞掉了,才需要還原。

一般來說,msdb的備份/還原是需要在同一個台伺服器上的。

今日就發生因為還原了另一台伺服器上的 msdb,發生的趣事。
此後,原本的維護計劃就一直無法運作。發生下面的錯誤(由網路上找到類似的 English error log)。

2008-04-30 15:04:11 - + [125] Subsystem 'SSIS' could not be loaded (reason: This function is not supported on this system)
2008-04-30 15:08:19 - + [125] Subsystem 'SSIS' could not be loaded (reason: This function is not supported on this system)
2008-04-30 15:09:28 - + [125] Subsystem 'SSIS' could not be loaded (reason: This function is not supported on this system)
2008-04-30 15:27:36 - ! [LOG] Step 1 of job 'SystemDatabases.Back Up Database (Full) (Multi-Server)' (0x97394B08F6599040A18D93367FBDB5F7) cannot be run because the SSIS subsystem failed to load.  The job has been suspended
2008-04-30 15:35:13 - + [125] Subsystem 'SSIS' could not be loaded (reason: This function is not supported on this system)
2008-04-30 15:50:27 - ! [LOG] Step 1 of job 'SystemDatabases.Back Up Database (Full) (Multi-Server)' (0x97394B08F6599040A18D93367FBDB5F7) cannot be run because the SSIS subsystem failed to load.  The job has been suspended

找到了兩篇文章。

http://support.microsoft.com/kb/903205/en-us

http://support.microsoft.com/kb/914171/en-us

此說明了 msdb 內記載的資訊,是與該 sql server 伺服器相關的資訊。因此,千萬不要再還原別人的 msdb 了。

那何時需要還原 msdb 呢? 見 還原 model 和 msdb 資料庫的考量,裡頭也沒有提到要還原別台的 msdb。

除非下面的狀況,否則我相當不建議還原別台的 master, msdb, model 資料庫

  1. A, B 兩台伺服器系統環境完全相同。如相同的 windows 版本,SQL Server 的版本。(http://support.microsoft.com/kb/264474)
  2. A, B 兩台伺服器SQL Server 安裝路徑完全相同。例如都是安裝預設路徑( c:\programs file\….)
  3. A, B 兩台伺服器所安裝的服務也完全相同,安裝過程的序順也相同。例如 A 安裝時有安裝 Database engin, SSIS, Analysis 且按照這樣的順序。那 B 伺服器也必須這樣的順序安裝服務。
  4. A, B 的 Sql server instance 需一致。這與路徑相關。
  5. etc (還有很多我不知道的)

條件很苛刻呢!因此,還不如建新建這些 login, job, maintain plan。反正大部份都可以 export 出來。
http://social.technet.microsoft.com/Forums/en-US/sqldisasterrecovery/thread/466caa44-65fe-4118-a36c-972d2a8d4d16 中有人有這方面的經驗.

2009年4月6日 星期一

安裝 Windows 7 x64

昨天狠下心來,在家裡安裝 Win7 x64。(畢竟公司的環境不太容許我亂搞)

安裝過程出奇的快,穩。約莫半小時就安裝完成了。因為習慣地認為需要40分鐘以上,輸入完安裝的必要資訊後,就去看電視了。雖然不時地回頭檢視安裝進度,一個不小必就安裝完成了,說實話不到半小時。

與 Vista 介面上大致相同,但總有些改進。

家裡是使用 hinet 來撥接網路,因此在 Vista 上的 Connect To 是上網的第一步。

image

而在 win7 上,Connect To 就不見了。

image

找了一下,原來預設是隱藏起來了。在 Start Memu 上按右鍵選 Properties, 選 [Start Menu] 頁,將 Connect To 勾選起來後,Connect To 就重出江湖。

image

 

image

重灌電腦時,難免需要虛擬光碟機。之前喜愛的 Daemon Tools 目前的版本無法在 Windows 7 上使用,會有相容性的問題。找到 Virtual CloneDrive,是可以使用於Windows 7 Beta(build 7068)。

.NET 4.0 是個半新的 .net framework

半新?是什麼意思呢?見下圖便知。
image

V3.0 是架構在 V2.0 的基礎之上。而 V3.0 又是架構在 V2.0 + V3.0 之上。

但 V4.0的執行環境, 是全新的一包。因此執行V4.0時,不需要回頭再找 V2.0, V3.0, V3.5。

既有的程式,已經使用了 V2.0 + V3.0 + V3.5 時,仍然可以 side by side 的執行。

以上圖為例, Outlook 可以執行 V2.0 + V3.0 + V3.5 的這一套,也可以同時執行V4.0 的這一套。

2009年4月3日 星期五

福勝亭,練耐心的好地方

我吃福勝亭,只有兩次的經驗。

第一次是到西門町那一家,記得店面有兩層樓,大概有兩三年了吧。

那一次印象就不好。人多,很吵,東西少。

廁所要排隊!男生耶,也要。女生更不在話下,排的長長一條。還好我是男的。

食物上的慢,真的很慢。那時高麗菜絲是自行取用。結果呢,是一直都沒有。一旦上了,不到兩三分鐘就被拿光了。

今天,更是難忘,我和我老婆到民生東路這一家,好像沒開多久。

一進去,點餐後,就需要先繳錢了。此時先瞄了一下,有好幾桌都「噭噭待哺」,心知需要等一些時間。

可是,肚子真的有些餓了。

坐下後,先洗個手,和老婆 talk 了好一會兒。

此時左前方一長條桌年輕學生的嬉鬧聲引起了我的回憶。看了一下書包,XX高中,男生坐一排。另外一邊是女生,看不到是哪一家女校的。應該是聯誼吧。

這一桌人沒有吃東西,我猜想,應該是吃完了吧。

過了有20分鐘了吧,年輕人那一桌開始上餐了。
我老婆跟我說:「我還以為他們已經吃完了」。我早就想到了。

再來,我選的位置不好,選到了飯鍋位置。一個一個人都來加白飯,一個個都留下了「沒飯了」的抱怨。有的會向服務人員說,但看來也沒有什麼作用。

數了一下,女服務生2個。

又發現唯一的男生服務員,服裝不太一樣。

此時我的飯來了。真的餓了。此時從不挑食的我,應該什麼都好吃吧。

不,我錯了,真的不好吃。

點完餐後,會給一張紙,上面會寫了是「19:45」進來的,點了什麼餐。

我看一下我們點的餐,我老婆幫我點的是「開運豬排弄飯」,是切好的豬排放到湯裡的那一種。

豬排泡爛了。真難吃。

吃了好一會兒後,我老婆等得沒耐心了,跟我說「真的好慢哦」。
我看了一下時間,已經過了25分鐘。我向一個女服務生招手,她不知怎麼的,似乎視力不好,沒看到。
沒關系,我向另一個女服務生又招了一次手,她走了過來。
我告知等了很久,是不是忘記了。
她看了一下,似乎也覺的很奇怪,再確認我放在桌上的那一張紙,確定了餐還沒到。於是說要幫我們催一下。

然後,又等了十分鐘

此時,男服務人員,年紀應該不到25歲呢,注意到了這個狀況,走過來瞄了一下缺的是「開運卡滋豬排」後,走向廚房前說了幾句話。

我在想,這個人是不是店長啊?但是年紀很輕,應該沒有能力吧。可是又沒看到其他人,只有他一個男生,服裝又不太一樣,到底是不是店長呢?

我在想,到底要不要來發一次脾氣呢?

這裡來的大部份是年輕人,做這樣的不良示範,不太好。
我畢竟老了,不再血氣方剛,大鬧一場真的不適合我。
我老婆早就知道我相當不高興,一直勸我「不要為一頓飯壞了一晚上的心情」。

我快吃完了,只剩兩條爛豬排。

此時,我老婆的卡滋豬排終於到了。我特地等其中一位女服務生送來時,看了手錶,已經晚上8點25分了。

這一餐,我老婆等了40分鐘

我忍不住,唸了一下。女服務生,好像很老練的說「那我送你一盤小菜好了」。

更是一肚子火,好像是我要拗東西一樣。


接下來,兩個人的心情都不好。這些年輕人的服務態度真的很差,環境吵雜,東西又難吃。以後再也不會到福勝亭。

離開時,男服務生在大門前的櫃台,向一位老太太收錢。此時,我忍不住向他詢問:「你是店長嗎?」


他點點頭。


我:你們出餐的速度真的很慢耶,我等了40分鐘。真的很需要加強。

店長默不出聲。

原本那位老太太已經拿出200元,似乎原本就擔心,此時再加強一次問:「會不會要等很久?」

店長也是慢條斯理的解釋:「不會」。似乎不太想做生意了。

我實在不想多待了,只向老太太提醒了一下:「不會等太久,我只等了40分鐘而已」。

我終於離開了,心裡當然不高興。看到老太太還是等了下去。

我又看了一看,當真高朋滿座,還是人滿為患。心想,兩個人點了340元,真的比較便宜嗎?

我公司附近有另外一家豬排飯,每餐平均約250元,是比較貴了一些。但服務好,東西好吃。雖然不能任意加飯,但也吃的飽。因為單價較高,人不會太多,環境氣氛好上許多。

年紀大了,看來真的比較適合單價高一些的店了。

我真的年紀大了,福勝亭這樣的店,還是留給大食量的學生們去好了。

CAT.NET 初用

一直被問到,SQL Injection 及 XSS attact 如何防範?
雖然知道,但要一個個解釋,總是一個大工程,最好有一個工具,能幫忙檢查同事的程式。檢查出來後再來解釋為何「這段程式容易被攻擊」。

CAT.NET 正好是我所需要的。畢竟我都是使用 Visual Studio 來開發啊!

安裝後,打開 Visual Studio, 在功能表 tools 下會多出一個 CAT.NET Code Analysis.

image

執行後,按下方圈選的圖示,以進行設定

image

為何要進行設定呢?以我的solution為例,共23個專案。CAT.NET 是分析專案輸出的 Assembly 來進行檢查的。它甚至會把測試專案也拿來分析。
因此,設定太多專案的話,目前很容易 Out of memory 的。
 image

按Targets頁,可以看到多個Assembly輸出 。使用 Add/Remove  來移除不甚重要的 assembly。如果不信邪,就會發生如下的訊息。

Code analysis output report: C:\MySolutionFolder\MicrosoftACECodeAnalysisReport.xml
Executing code analysis...
Error: Exception of type 'System.OutOfMemoryException' was thrown.

進行分析後,就會出現一堆的 Issue。天啊,怎麼會這麼多?

image

雙擊 Issue 後,Source Code Editor 就會出現有問題的那一行原始碼。由於我們的程式,都會進行重構/模組化,因此,以人工的方式進行分析是相當辛苦的。
CAT.NET 會將這個 Issue 的呼叫過程,由Data Flow Start 直到 Data Flow End ,整個歷程輸出到右方區塊。(如下圖)

image

因此,如上例,該段程式經過了9個 function call,才完成了可能被攻擊的漏洞。

天啊!再資深的天才,也沒有辦法以人工的方式將所有的漏洞一個個找出來的。

目前只是 CTP 版,因此效能上比較差,記憶體也用的很兇。

未來應該會整合到 Visual Studio 的 Code Analysis 中

2009年4月2日 星期四

Mix09 KeyNote 筆記

微軟在 Mix09 又 release 了一堆新東西,我又要忙好一陣子了。

Expression Web 3

    SuperPreview, 可在同一介面上看到多個瀏覽器的html 預覽結果與side by side 比較

ASP.NET MVC 1.0

  1. Full Control over HTML markup
  2. SEO friendly with URL routing
  3. Test driven development workflow
  4. Easily extensible

ASP.NET 4 improvements

  1. Web Forms : 可控制 ViewState, Client ID
  2. MVC
  3. AJAX: Client Template, Client side data binding
  4. Distributed Caching

Visual Studio 2010 for web development

  1. Code focused improvments
  2. JavaScript /AJAX /jQuery tooling
  3. SharePoint: 開發與 debug
  4. Publishing and deployment : 除了複製程式外,也可IIS 設定、 create database, update schema

IIS 7 Web Server Extensions

  1. Secure FTP
  2. WebDAV support
  3. proxy

Microsoft Web Platform Installer

  1. Install the latest versions of Microsfot Web Platform tools, server, database and framework
  2. Stay up-to-date and explore what's new
  3. Runs on Windows XP, windows Vista, Windows Server 2003 and Windows Server 2008

Commerce Server 2009

Azure Services Platform

這個在去年的 PDF 已有展示了,而且,我不熟,也不太有興趣。

Share with Facebook