December 28, 2012

The underlying type of CLR enumeration type does not match the underlying type of EDM enumeration type

Entity Framework has supported the enumeration type since its version 5. I followed tutorials at Enum Support - EF Designer and Entity Framework 5 + Enumerations => What’s not to love? to add the enum type in my model, however, I got 'The underlying type of CLR enumeration type does not match the underlying type of EDM enumeration type' in Test Explorer after I ran one of my unit tests against a SQL Server 2008 database.
The column in my database table is of type 'tinyint', which will map to 'byte' in .NET. And here's what my enum type looks like.
    public enum ForgotPasswordStatus
    {
        Pending = 0,
        Verified = 1
    }

Checking another article at USING EXISITING ENUM TYPES IN ENTITY FRAMEWORK 5, I found the reason I got the error was because I did not explicitly define the underlying type of my enum ForgotPasswordStatus. After adding the underlying type to my enum as follows, my test passes now.
    public enum ForgotPasswordStatus : byte
    {
        Pending = 0,
        Verified = 1
    }

December 25, 2012

Avoid creating your own SMTP settings

The <mailSettings> element has been around for years since the .NET Framework 2.0, but I still found people tend to create their own SMTP settings in the <appSettings> element like below.

<add key="SmtpServer" value="smtp.pete.tw"/>
<add key="SmtpUsername" value="pete"/>
<add key="SmtpPassword" value="F4g%j&k9"/>
<add key="SmtpPort" value="25"/>
<add key="SmtpEnableSSL" value="False"/>

Well, I know some are legacy projects you don't even want to touch, jsut like the famous phrase says - if it ain't broken, don't fix it. But for new projects, we should definitely use <mailSettings> for writing neat code and not messing up the <appSettings> element. Refer to http://msdn.microsoft.com/en-us/library/w355a94k.aspx and have your own configuration as below, the SmtpClient class in your code will read the <mailSettings> element automatically from your App.config/Web.config.

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="Pete&lt;admin@pete.tw&gt;">
      <network defaultCredentials="true" host="smtp.pete.tw" port="25" enableSsl="false" userName="pete" password="F4g%j&k9" />
    </smtp>
  </mailSettings>
</system.net>

December 24, 2012

A project which specifies SQL Server 2012 as the target platform cannot be published to SQL Server 2008

Executing the Schema Compare in Visual Studio 2012, I get the error message "A project which specifies SQL Server 2012 as the target platform cannot be published to SQL Server 2008."


This error occurs because in Visual Studio 2012 the target platform of the database project is by default set to SQL Server 2012 and your database to be compared does not match the setting. If your target database is SQL Server 2008 like me for example, you can follow the below steps to change the target platform.
  1. Right-click on the project name in Solution Explorer and click Properties.
  2. Click the Project Settings tab.
  3. Change the target platform from SQL Server 2012 to SQL Server 2008.
  4. Save the project and execute the Schema Compare function again.

December 23, 2012

Turn off auto-restart after windows update

It's sometimes annoying when I come to the office next morning and find my development environment (it's a virtual machine) restarted automatically without my permission.I install Windows 7 Ultimate as my operating system and by default it will restart the system automatically after the windows update has been done (although you may argue that I should've changed the default settings when I installed the OS at the beginning). But as a developer, you won't like being interrupted by this when you are in the flow. Here's how we can disable the auto-restart feature.
  1. Go to Run.., input gpedit.msc and click OK.
  2. Expand Computer Configuration-> Administrative Templates-> Windows Components-> Windows Update and you will see a setting called No auto-restart with logged on users for scheduled automatic updates installations in the right pane.
  3. Right-click on this setting and edit it.
  4. Select Enabled and click OK to take effect.
  5. (Optional) Repeat the above steps on the server hosting your virtual machine.

December 19, 2012

Saving changes is not permitted

When you use SQL Server 2008 and try to add a new column in the existing table, you get the following alert and cannot proceed with the modification on the table schema.


This happens when you install a brand-new SQL Server 2008 on your machine. The solution to the above is to disable "Prevent saving changes that require table re-creation" thru Tools-> Options-> Designers-> Table and Database Designers.


December 9, 2012

遠端重啟DrayTek Vigor2950G

公司的Router是用這一台,不知怎麼的它的網頁管理介面每隔一段時間就會掛掉,之前只能透過手動將Router重開機才會回復正常。不過因為一些因素Router是擺在別人的機房,每次就得麻煩別人幫忙重開,好在它提供了telnet及command line的功能,只要透過telnet [Router IP Address]後,驗証完密碼後再執行sys reboot指令即可將Router重開。



November 21, 2012

遠端桌面控制下桌面及工具列消失的解決方式

一位同事在利用遠端桌面佈署程式時,無意間出現了桌面及工具列消失的問題,而這問題之前我也曾發生過一次,當時我並沒有找到解決方式,而是直接發ticket請hosting provider幫我重新開機,當然在情況危急時這不算是好方法(雖然在收到ticket後30分鐘內就幫我重開了)。

出現這問題,大概十之八九是explore.exe這個程式被關閉了。如果是在本機,我們還可以使用CTRL+ALT+DEL組合鍵叫出Windows Security的畫面來重開機。但在遠端我要怎麼重開機呢?桌面和工具列都消失了,按下CTRL+ALT+DEL也沒用。還好在遠端桌面下,我們可以使用另一個組合鍵CTRL+ALT+END叫出Windows Security的畫面,再按下右下角的按鈕進行重新開機。


不過重新開機應該是last resort而不是best practice,如果可以把explore.exe給叫回來不是更好嗎?

在使用CTRL+ALT+END組合鍵後,點選Start Task Manager叫出Windows Task Manager。按下New Task加入explorer即可讓消失的桌面及工具列出現。

November 17, 2012

於SharePoint中一次下載多筆資料

最近公司要把舊的SharePoint網站下線,我負責把部門的文件備份下來。在SharePoint中,如果要下載某個檔案,可以勾項該檔案,接著點選工具列的Download a Copy,瀏覽器就會開始下載檔案。


但是因為文件數量不少,一個一個下載可是很耗費時間。原本以為只要勾項多筆檔案再點選Download a Copy就可以下載多筆檔案了,無奈勾項多筆時,Download a Copy按鈕就被disable了。也對,人家本來就是Download "a" Copy,何必硬是要拿來下載多檔案呢?

November 16, 2012

書評 - The Clean Coder

圖片來源:天瓏網路書店
這本書是去年出版的Uncle Bob系列書,書名全名為The Clean Coder: A Code of Conduct for Professional Programmers。Uncle Bob名氣之響亮相信很多人都知道,尤其是他提出的SOLID更是很多作者都會拿來引用的範例。

這本書頁數不多,但是看起來覺得有點累,一是因為它已經是本英文書籍了,再來是Uncle Bob的英文用字還真是不親民,很多單字對我來說根本沒看過,就如同英文文言文一般,也許是閱歷豐富所以用字較為講究。本書閱讀起來是可以了解作者的用意,但因為單字太多讀起來時總是會有那麼點卡卡的。

本書的內容主是以說故事的方式來呈現。Uncle Bob以自身的經驗來告訴讀者他是如何成為Craftsman,告訴讀者如果想成為Craftsman需要知道些什麼。其實說穿了這本書的重點就只有兩個,專業(Professionalism)和負責(Responsibility)。這兩個字不斷穿梭在各個章節中。

至於評價嘛,在anobii給了三顆星,保持中立看待。以看名人傳記的角度來看這本書的話,個人覺得故事有點平淡。有些論點個人並不認同,有些則是看起來相當基本。不過仍然是可以做為借鏡,尤其是像Uncle Bob那樣成功的人,我想有很多讀者應該對他的故事很有興趣。

October 22, 2012

Developer的價值在哪裡?

前陣子CIO來訪,約我出來見個面聊聊天,順便跟我說說在我休假期間公司發生了哪些事。CIO跟我提到了一件令他頭痛的事,想問問我的意見。他說團隊中有個dev不聽他的話,不受控制,想知道我的想法,畢竟我是team lead。

事情的原由大概是這樣。目前團隊正專注於某個專案M的開發,而且CEO相當重視這個專案($$$),希望團隊可以在九月結束時完成第一階段功能並且在十月初開始做UAT。這個專案當初是由我建議CIO由某個資深人員A來跟總公司進行需求分析、系統分析及開發,理由是A是最資深的,分析能力不錯,也有一些架構設計經驗。當時只有A一個人獨立作業,因為其它成員都在忙於另一個時程更緊的專案N,而專案M相對的不是那麼趕。後來專案N完成後,所有的資源也開始投入到專案M,而專案M也開始由A主導帶領三個開發人員一起做這案子。

October 18, 2012

書評 - 笑談軟體工程:敏捷開發法的逆襲

圖片來源:天瓏網路書店
當初買這本書主要是看到書名中幾個令我感興趣的關鍵字,「軟體工程」、「敏捷開發」以及「Scrum」,其中最主要的是Scrum。Scrum這名詞聽了幾年了,不過對於詳細的操作還不是那麼了解。原本以為整本書的主題都是在講Srum的運作,但實際上Scrum只是此書八個part中的其中一個,但這並不讓我對這本書失望,反而在anobii上我給了這本書五顆星的評價。

作者Teddy的部落格其實我也注意過一陣子。他的寫作方式蠻幽默的,而且也飽讀詩書,每每都能引經據典。本書的寫作風格也讓我想起之前所讀的「Peopleware: 腦力密集產業的人才管理之道」。一本書切成幾個part,每個part分成幾個chapter,只是Peopleware一書主要談的是管理,而這本書主要是圍繞在軟體工程,但這兩本書有個共同點,就是點出在軟體開發這領域上所會遇到的五花八門問題,尤其是與人有關的問題。

這本書讀起來其實蠻輕鬆的,就如其書名"笑談"軟體工程一樣。對一些敏捷開發方法如重構、單元測試、自動化功能測試及持續整合也都有簡單的介紹但又不會講的太深入,以師父引進門的方式來分享作者自身實踐軟體工程的一些方法。對資淺或資深的工程師來說,我認為都可以學到或看到不少東西,而對我來說最興奮的莫過於作者推薦的不少好書了。

October 10, 2012

書評 - Developer's Guide to Collections in Microsoft .NET

圖片來源:天瓏網路書店
原本對此書抱著不少的期待,不過在讀完後有些小失望,在anobii上我給它3顆星。本以為會大量介紹.NET內建集合物件及最佳實務,但只介紹了一點丁,也不夠深入。本書雖有六百多頁,但用了大量的範例程式碼,且提供C#及VB.NET兩種語言,所以實際上讀起來並不會花太多時間,因為只要選擇需要的語言來看就可以了。

前三章一開始介紹了一些資料結構如Array、Linked List、Associative Array、Queue、Stack及Circular Buffer。這部份作者用範例的方式來實作出這些資料結構,如果對這部份有底子的人很快就可以翻完這三章,而光這三章就佔了兩百多頁,也就是這本書的三分之一了。

四五章則開始介紹一些.NET內建的(泛型)集合物件,如List<T>、LinkedList<T>、Queue<T>、Stack<T>、Dictionary<TKey, TValue>、BitArray、HashSet<T>、SortedList<TKey, TValue>及SortedDictionary<TKey, TValue>,這部份比較有看頭一點,尤其是一些Comparer型別的用法是蠻值得注意的,在做集合物件排序和資料比對時相當有幫助。

October 7, 2012

網址查詢字串的驗證與排序

在某個專案中和third-party廠商所開發的API做介接。對方提供的API是以Key Value Pair (KVP)來實作,所以當我們呼叫對方的API時是直接呼叫某個網址如http://thirdparty/api?key1=value1&key2=value2&key3=value3&VerificationCode=4a66f0dfc4234cf6972353fd169fdb08。VerificationCode是所謂的驗證碼,用來確認查詢字串在傳送過程中是否被修改過。它的計算方式是將查詢字串key1=value1&key2=value2&key3=value3先做排序後,加上某個只有我們和third-party知道的安全碼,再以特定的演算法做hash(如MD5)來取得此驗證碼。所以當對方收到API呼叫請求時,只要以相同的方式來計算出驗證碼便可知道查詢字串是否有偽造。

October 1, 2012

Parameter validation的利器 - Code Contracts

Code Contracts是微軟針對Design by Contract所提出的解決方案。數個月前我在Code Leader一書中也看到類似的東西,作者在書中是以Programming by Contract一詞來代替Design by Contract,提出的解決方案是微軟針對Design by Contract所設計出的程式語言,Spec#。

在寫code時很常需要檢查方法傳入的參數是否有效,如檢查字串是否為空、數值是否大於零或某特定值,如果不符的話就要丟出exception。例如以下程式碼片段
        private static int Add(int x, int y)
        {
            if (x < 0)
            {
                throw new ArgumentException("x cannot be less than 0");
            }

            if (y < 0)
            {
                throw new ArgumentException("y cannot be less than 0");
            }

            return x + y;
        }

September 20, 2012

Code Repository - Custom Exception

//------------------------------------------------------------------------------
// Created by: Pete
// Created on: Sep 10, 2012
//------------------------------------------------------------------------------

using System;
using System.Runtime.Serialization;

namespace AdventureWorks.DataAccess
{
    /// <summary>
    /// An exception thrown when errors occur in the repository class
    /// </summary>
    [Serializable]
    public class RepositoryException : Exception
    {
        public RepositoryException()
        {
        }

        public RepositoryException(string message)
            : base(message)
        {
        }

        public RepositoryException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        protected RepositoryException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
    }
}

備註
  1. [Serializable]這個attribute必須加入,否則無法序列化
  2. Protected RepositoryException(SerializationInfo info, StreamingContext context) : base(info, context)必須加入,否則無法反序列化
  3. 如果有自訂property於例外類別中,則必須額外再實作ISerializable的public void GetObjectData(SerializationInfo info, StreamingContext context)方法

Code Repository - XML Serialization Helper

XmlSerializationHelper.cs

September 19, 2012

自訂Visual Studio樣版參數

接續修改Visual Studio內建樣版一文,檢視一下Class.cs檔案
using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;

namespace $rootnamespace$
{
 class $safeitemrootname$
 {
 }
}

VS的樣版提供了一些預設參數如上述範例的$rootnamespace$,如果需要的話也可自訂參數。

September 14, 2012

修改Visual Studio內建樣版

團隊開發時,我們常會需要遵循一些開發原則或coding standard/convention。例如在類別中,檔案最上方需要加入一些針對類別的描述文字如
//------------------------------------------------------------------------------
// Description: A generic repository that should be derived in domain repositories
// Created by: Pete
// Created on: Sep 10, 2012
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

通常很常見的作法就是加入一個新類別後,再去找一個已存在專案中的類別,複制它的描述後再貼到這個新建的類別中,每建一個新類別這樣的複制貼上動作就要再做一次。何不去修改內建的VS樣版,讓我們在新增新類別時幫我們自動加上一些基本的說明呢?

以下步驟說明如何透過修改類別的內建樣板加入上述的描述文字