July 31, 2013

書評 - Head First Design Patterns

圖片來源:天瓏網路書店
對於這本書,我只有相見恨晚四個字可以形容。

初入Design Patterns是在工作的第一年,由於當時公司資深同事兼研究所學長推薦GoF寫的Design Patterns: Elements of Reusable Object-Oriented Software,所以買了它的中文版物件導向設計模式來研讀。然而當時功力尚淺,整本讀完了但大部份的Patterns有看沒有懂。

工作三年多,累積了一些實戰經驗後,興起了複習Design Patterns的念頭。由於GoF版本對我來說有點難吸收,便找了C# 3.0 Design Patterns來看,並搭配GoF版本做參考一同服用。這次好多了,範例程式是用C#撰寫,好懂一點,但對Design Patterns的認知程度仍只有些許提升。

現在工作六年了,再次興起複習的念頭,而這次找來的是Head First系列書的Design Patterns。本書在Amazon上有極高的評價,範例是以Java撰寫,但對C#開發人員閱讀起來應該沒什麼問題。每個Pattern以說故事的方式來呈現,前因後果互相串連,加上圖例說明。雖然有六百多頁,但讀起來很快也很好理解。

GoF版本中有23個Patterns,而在Head First Design Patterns主要描述GoF中的14個Patterns,再加上MVC Pattern、SOLID原則中Single Responsibility PrincipleOpen-Closed PrincipleDependency Inversion Principle,其餘9個Patterns則放在Appendix裡做簡單的說明而已。此次讀完Head First Design Patterns,對其描述的14個Patterns理解度加深不少,且對於原本在讀GoF版本時產生的一些誤解也有所釐清。如果有朋友想初入Design Pattern的話,我推薦先閱讀Head First版本,再輔以GoF版本做參考,效果會比較好。

July 30, 2013

書評 - 求職加分!進入 IT 產業必讀的 200 個 .NET 面試決勝題:從求職準備、面試流程、開發心得、重點回顧到經典試題的完整剖析

圖片來源:天瓏網路書店
最近在複習一些.NET的基本知識,順便做為之後面試工作時的準備,所以買了這本書來看看,這本書其實躺在我的anobii wish list裡有一陣子了。自學生時代到現在,使用.NET開發也有八九年的時間,但汗顏的是對於一些基本知識老實說並沒有很深入的了解,即便是一些很常聽到的問題如:GC運作機制、Stack與Heap的差別、Boxing與Unboxing、Timer種類有哪些、ASP.NET Page Lifecycle等,有些東西只知其表面,而不知其內部的實際運作方式。

例如你可能知道GC是.NET用來回收記憶體用的,有了它開發人員就不必煩惱如何管理記憶體,但你知道GC是如何透過3個generation的管理機制來回收記憶體?又或是你可能知道Boxing與Unboxing會影響應用程式的效能,而它是在數值型別和參考型別互轉時發生,但為什麼互轉時會影響效能,與Stack及Heap又有什麼關係?

書中提出了200個面試.NET職缺常見的問題,有些是.NET基礎類別使用上的比較,有些則是專用名詞的解釋及其運作機制,如委派、事件、反映。本書由對岸的高手所撰寫,台灣的微軟MVP做審校,品質上還不錯,可安心服用。

July 13, 2013

User Control自訂事件處理機制

現有需求如下

有一會員註冊頁面,使用者填寫完會員資料後按下註冊按鈕後顯示註冊結果在頁面上

我們將註冊表單設計成一個使用者控制項,而顯示訊息則設計成另一個使用者控制項,如此註冊表單和顯示訊息兩項功能都可以在其它地方reuse。

顯示訊息的功能很簡單,我們在ascx裡佈置一個Label控制項,在code-behind中則新增一個顯示訊息的方法
<asp:Label ID="Label_Message" runat="server"></asp:Label>

public void Show(string message)
{
    this.Label_Message.Text = message;
}

註冊表單的功能則簡單的佈置如下
<p>
    Email:
    <asp:TextBox ID="TextBox_Email" runat="server"></asp:TextBox>
</p>
<p>
    Name:
    <asp:TextBox ID="TextBox_Name" runat="server"></asp:TextBox>
</p>
<asp:Button ID="Button_Register" runat="server" OnClick="Button_Register_Click" Text="Register" />


protected void Button_Register_Click(object sender, EventArgs e)
{
    Alert alert = ((Alert)Page.FindControl("Alert1"));
    alert.Show(string.Format("User account {0} registered successfully",
        this.TextBox_Email.Text));
}

在按下Register按鈕後就會觸發Button_Register_Click事件,在上面我們先假設註冊成功,要顯示註冊成功的訊息。由於顯示訊息的控制項和註冊表單的控制項放在同一個Web Form中,所以先透過Page.FindControl找到顯示訊息的User Control接著呼叫其Show方法來顯示訊息


到這裡需求所描述的功能已大致完成。先不論資料驗證和顯示上安全性的疑慮,這樣的設計會有個問題,就是註冊表單控制項相依於顯示訊息控制項,以致無法獨立重複使用,而必須同時出現在頁面上,例如之後因應新需求要設計另一種顯示訊息的控制項時,就可能需要修改註冊表單的程式碼。

要解決上述使用者控制項相依的問題,可以在註冊表單控制項改以加入事件處理機制,並讓Web Form頁面訂閱註冊表單控制項的註冊完成事件,接著委派顯示訊息控制項來顯示註冊結果。
public partial class Registration : System.Web.UI.UserControl
{
    public event EventHandler<RegistrationEventArgs> OnRegistered;

    protected void Button_Register_Click(object sender, EventArgs e)
    {
        if (OnRegistered != null)
        {
            string message = string.Format("User account {0} registered successfully",
    this.TextBox_Email.Text);
            RegistrationEventArgs registrationEventArgs = new RegistrationEventArgs(message);
            OnRegistered(this, registrationEventArgs);
        }
    }
}

public class RegistrationEventArgs : EventArgs
{
    private string _message;

    public RegistrationEventArgs(string message)
    {
        this._message = message;
    }

    public string Message
    {
        get
        {
            return this._message;
        }
    }
}

在註冊表單控制項宣告了一個事件處理常式OnRegistered,並透過RegistrationEventArgs將註冊結果訊息傳遞出去,讓事件的訂閱者可以取得註冊結果訊息。
public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.Registration1.OnRegistered += (ucSender, ucEventArgs) =>
        {
            this.Alert1.Show(ucEventArgs.Message);
        };
    }
}

在Web Form頁面則是訂閱OnRegistered事件並於事件觸發時委派顯示訊息控制項顯示註冊結果。經由這種事件驅動的設計方式,使得註冊表單控制項可以獨立被重複使用而不相依顯示訊息控制項,往後若有不同類型的顯示訊息控制項,也僅須訂閱OnRegistered事件委派新的顯示訊息控制項即可。

July 9, 2013

SQL Server Management Studio編輯資料表格異常緩慢

在開發機中的SQL Server Management Studio (SSMS)編輯資料表(Edit Top 200 Rows)的資料時,資料表格會卡個幾秒後才出現,由於資料只有4筆,理論上回應不應該那麼慢。使用唯讀方式讀取資料(Select Top 1000 Rows)時卻又沒有這個問題。我的開發機使用的是Windows 7 Ultimate加SSMS 2008,Database Server則為Windows Server 2008 R2 SP1 x64 Standard Edition加SQL Server 2008 R2 Developer Edition。


研究了一下在slow Edit Top 200 Rows in SSMS的Answer 5找到了一個solution,就是在hosts(C:\Windows\System32\drivers\etc\hosts)裡加入Database Server的host,如192.168.1.24 Dev-DB,接著在SSMS中連線時使用host name來連線。


以上面的方式連線,編輯資料即不再出現卡住的問題。看來似乎是網路設定上的問題,我對這部份不是很在行,不過之前在設定公司的開發環境時倒是沒遇到如此問題。於是再檢查了一下Database Server上的Windows防火牆,發現它是開啟的,將它暫時關閉也可以解決SSMS編輯資料卡住的問題,如果Database Server沒在DMZ上,這似乎也是個可行方案。

再進一步研究,比對了開發機和Database Server在Network and Sharing Center裡的設定,發現兩者不相同,開發機為Home network,而Database Server為Public network

開發機


Database Server


試著把Database Server變更為Home network,也可解決SSMS編輯資料卡住的問題


關閉IE的Enhanced Security Configuration功能

Windows Server 2008 R2剛安裝好,開啟IE嘗試瀏覽Google出現以下畫面


IE的Enhanced Security Configuration功能很幫忙,為了避免使用者瀏覽到惡意網站,先把連線擋下來,讓使用者自行選擇是否要將該網站加入白名單。將網站加入白名單的話,之後瀏覽該網站就不會出現警告視窗,反之則會一直出現。但這功能有時候很擾人,因為一個網站可能會有不少的外部連結,此時警告視窗就會一直跳出。如果要將它關閉,可透過以下方式

Start-> Administrative Tools-> Server Manager,可以看到Server Summary中有個Security Information區塊


點選Configure ESC,將Administrators(Users可視情況)變更為Off,按下OK


關閉IE,重新瀏覽網站,警告視窗不再出現


July 8, 2013

The virtual machine could not be started because the hypervisor is not running

在Hyper-V中建立完VM後嘗試啟動出現The virtual machine could not be started because the hypervisor is not running錯誤訊息。


我的作業系統環境為Windows Server 2008 Enterprise R2 SP1 x64,主機為ASUS BM6675。根據錯誤訊息似乎需要確認CPU是否支援虛擬化技術,老實說在入手BM6675時倒是沒考慮到這點。好在它是有支援的,可以在BIOS透過以下步驟開啟虛擬化支援。

重開機後按下F2DEL鍵進入BIOS,預設畫面是EZ Mode


F7進入Advanced Mode,點選OK




點選Advanced頁籤


點選CPU Configuration


Intel Virtualization Technology設成Enabled


儲存設定離開進入Windows系統,VM已可順利啟動

ASUS BM6675於BIOS模式下擷取螢幕畫面

通常在BIOS模式下想擷圖不是那麼的方便,近日入手的ASUS BM6675在BIOS模式下提供了一個擷取畫面的快速鍵F12。在擷取圖片之前,先插上USB隨身碟,接著按下F12,系統會詢問要將圖片儲存至哪個路徑下,只要用滑鼠選擇USB隨身碟的位置,系統就會將擷圖儲存至該路徑下,相當方便。儲存的圖片預設格式則為BMP



使用WinToFlash製作Windows系統安裝隨身碟

近日入手一台無作業系統的ASUS商用電腦BM6675,因身邊僅有Windows系統的映像檔,沒有實體光碟,於是研究如何利用映像檔製作可開機安裝Windows系統的USB隨身碟。以下是我的實作過程,作業系統映像檔為Windows Server 2008 R2 SP1 x64,USB隨身碟為SONY 4 GB。

使用DAEMON Tools Lite掛載映像檔


下載、解壓縮後執行WinToFlash


點選Advanced mode,選擇Transfer Windows Vista/2008/7/8 setup to USB drive後按下Create


Windows setup files path選擇掛載映像檔後的光碟機路徑,USB Drive選擇USB隨身碟路徑,按下Run


選擇I do accept...並按下Continue


按下Continue


按下OK,WinToFlash就會開始將Windows系統安裝檔寫入USB隨身碟




製作完成後將USB隨身碟插上BM6675後至BIOS設定系統以該USB隨身碟開機,Done。