ASP.NET MVC 3概觀正體中文版

ASP.NET MVC 3正式版推出,因種種理由,所以在根本沒有看任何一眼ASP.NET MVC 3 Release Notes(發行記錄)之下,鬧出許多笑話,開的是ASP.NET MVC 3專案,腦袋裡確只知道ASP.NET MVC 2的知識,等到出錯時才在叫:「媽的,這個東西有Bug。」我真是要好好自我反省一下。

這也給了我一個經驗。一個.NET Framework版本的升級的「發行記錄」,我想,沒幾個人會去全部看完,因為更新的內容非常的龐大,所以我是挑著看,但也養成的壞習慣。.NET Framework有推出「多目標管理」,也就是說,還是以當前「目標」選擇一個「正確」的「版本」才是正解,這樣不管在未來維護、除錯…才能減少不必要的複雜度。另一個重點是,.NET Framework向下相容做的很不錯,這種非.NET Framework版本的升級跟.NET Framework不太一樣,一般而言,你可以在.NET Framework 4.0下寫.NET Framework 2.0 / 3.0 / 3.5都不會出錯,這又養成另一壞習慣。

反正為了減少「自我感覺良好」的笑話,還是鞭策自己一下,"等"也不會更好。以下以「ASP.NET MVC 3 Overview」為基礎半翻譯結果,文件中還有許多Blog等資料,就盡力而為,先把應該了解的內容搞清楚再說。再以「ASP.NET MVC 3 Release Notes」加強就差不多了。

ASP.NET MVC 3 概觀

它就是一份重點整理了,所以看它最快。MVC和一些重點英文單字,我就不使用中文,怪怪的。如有翻譯不當的情況,請指教。

Razor View Engine

ASP.NET MVC 3新增一個全新的檢視引擎(view engine),稱呼為「Razor(剃刀)」。

Razor的優勢
  • Razor 語法簡潔有力。
  • Razor 簡單學習。
  • 與 IntelliSense 整合。
  • Razor 的頁面(Views)可進行單元測試。
Razor的特色
  • @model 語法能傳遞詳細的型別給View。
  • @* *@ 註解語法。
  • 能定義預設值(像是 layoutpage )。
  • Html.Raw() 方法能顯示文字而不進行HTML編碼。
  • 支援分享程式碼在多個Views(_viewstart.cshtml or _viewstart.vbhtml檔案)之間。
Razor提供新的HTML helper(輔助成員)
  • Chart. 轉譯出圖表。
  • WebGrid. 轉譯出資料表,含排序與分頁。
  • Crypto. 使用雜湊演算法產生嚴謹的雜湊密碼。
  • WebImage. 轉譯出圖片。
  • WebMail. 傳送Email。
以行銷術語來說,Razor提供的簡潔語法與HTML Helper是二大亮點,我們可以打更少鍵盤實現更多的功能,以前我們要自己實作一堆程式碼才能有的功能,現在透過Razor view engine就直接提供給我們。但可惜的是,使用Webform view engine(*.aspx)就無法使用以上HTML helper。為什麼不一起實作呢???

支援多檢視引擎(Multiple View Engines)

在我們新增ASP.NET MVC 3專案時,就可以讓你選擇是否使用新的Razor view engine或預設的view engine(ASPX),另外,你也可以使用open source的view engine如SparkNHamlNDjango…等。

Controller 改善

全域動作過濾器(Global Action Filters)

在Action方法之前及之後執行邏輯規則程式碼,在ASP.NET MVC 2提供了動作過濾器(Action Filters)。在ASP.NET MVC 3更提供一個全域過濾器(Global Filters)來加入它們到一個 GlobalFilters 集合中。

在Global.ascx新增一個Sub來進行Global Filters註冊動作:

Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
    filters.Add(New HandleErrorAttribute())
End Sub

在ASP.NET MVC 2必須在Controller註冊<HandleError()>屬性,在ASP.NET MVC 3的Global Filters的註冊之後,就不必在Controller裡再註冊<HandleError()>屬性了。

更多全域動作過濾器資訊,請參考:


新ViewBag屬性

在ASP.NET MVC 2支援 ViewData 屬性能讓你傳遞資料到View頁面。在ASP.NET MVC 3另供了一個 ViewBag 屬性來進行相同目的,例如:原先是使用「ViewData("Message") =
"歡迎使用 ASP.NET MVC!"」,現在你能使用「ViewBag.Message = "歡迎使用 ASP.NET MVC!"」來替代。你在使用ViewBag屬性時,不需要去定義任何強型別類別,因為他是一個動態(dynamic)屬性,你在設定或取得屬性時,它能在執行時動態解析它們。在內部,ViewBag屬性將資料儲存在name/value的 ViewData 字典中。(在ASP.NET MVC 3的預覽版本中,這個屬性被稱為ViewModel)

Public ReadOnly Property ViewBag As Object
 Get

新ActionResult型別

在ASP.NET MVC 3新增及增強ActionResult。

  • HttpNotFoundResult
    (新增)傳回 404 HTTP狀態碼。
  • HttpStatusCodeResult
    (新增)傳回使用者指定HTTP狀態碼。
  • RedirectResult
    (增強) 依Boolean參數來決定傳回一個暫時重導向(302 HTTP狀態碼)或是永久重導向(301 HTTP狀態碼)。結合這個改變,Controller類別提供了三個方法來支持永久重導向:RedirectPermanent、RedirectToRoutePermanentRedirectToActionPermanent。這些方法會回傳一個 Permanent 屬性為 True 的 RedirectResult 的執行個體(instance)。

JavaScript和Ajax 改善

預設下,ASP.NET MVC 3 中的 Ajax 和驗證輔助方法使用無侵入式(unobtrusive)的JavaScript。無侵入式JavaScript會避免在HTML中插入行內(inline)的JavaScript,這使用HTML更精簡和更少干擾,也使得更加容易被替換和自訂JavaScript函式庫。在ASP.NET MVC 3的驗證輔助方法預設使用 jQueryValidate 外掛。如果你希望使用 ASP.NET MVC 2的行為,你可在 web.config 中調整設定來關閉無侵入式JavaScript。

<appSettings>
  <add key="ClientValidationEnabled" value="true"/> 
  <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings>

將UnobtrusiveJavaScriptEnabled改為False即可關閉。更多Javascript和Ajax改善的資訊,請參考:

客戶端驗證(Clinet-Side Validation),預設修改為「啟用」

在先前版本的MVC中,你需要明確地在View中去呼叫 Html.EnableClientValidation 方法來啟用客戶端驗證。在ASP.NET MVC 3中已經不再需要,因為預設就會啟用客戶端驗證。我們能在 web.config 裡關閉此設定。

<appSettings>
  <add key="ClientValidationEnabled" value="true"/> 
  <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings>

將 ClientValidationEnabled 改為 False 即可關閉。

別外,為了使客戶端驗證能正常作業,你仍然需要在網站中加入 jQuery 和 jQuery.Validation 函式庫的參考。你能從自己的網站中提供它們,或是使用 Microsoft 或 Google 的 CDN (content delivery network ) 服務。

遠端驗證者(Remote Validator)

ASP.NET MVC 3 新增一個 RemoteAttribute 類別來對 jQuery Validation 外掛的遠端驗證提供支援。此支援讓客戶端驗證函式庫能自動呼叫一個你定義在伺服器端的自訂方法,且只能在伺服器端上完成的驗證邏輯。

在下面範例中,Remote 屬性指定用戶端驗證透過一個定義在 UserController 類別中名為 UserNameAvailable 的方法來驗證用戶名稱欄位。

Public Class User
    ' <remote("actionname", "controllername")>  
    <remote("usernameavailable", "users")> 
    Public Property UserName() As String
End Class

以下是對應的Controller及Action:

Public Class UsersController
    Inherits System.Web.Mvc.Controller

    Public Function UserNameAvailable(username As String) As Boolean
        If MyRepository.UserNameExists(username) Then
            Return False
        End If 
        Return True)
    End Function
End Class

其他 Remote 屬性資訊請參考MSDN:How to: Implement Remote Validation in ASP.NET MVC

JSON繫結(Binding)支援

ASP.NET MVC 3內建了對JSON繫結的支援,允許 Action 方法接收 JSON 編碼的資料,而且模型繫結(Model-bind)到Acion的參數。這個特色常被用於客戶端的樣板和資料繫結中。客戶端樣板能讓你格式化和顯示一個或多個的資料項目,ASP.NET MVC 3讓你簡單的連接客戶端樣版和伺器端的Action方法,透過JSON來發送和接收資料。更多JSON繫結資訊請參考「JavaScript和Ajax 改善」一節在Scott Guthrie's MVC 3 Preview blog post

Model驗證改善

"DataAnnotation" Metadata屬性

ASP.NET MVC 3支援 DataAnnotations 的中繼資料(metadata)屬性,像是 DisplayAttribute

"ValidationAttribute"類別

在 .NET Framework 4 改善了 ValidationAttribute 類別,支援了新的 IsValid 多載,提供關於當下驗證的整體背景資訊,像是什麼物件被驗證了。這讓你能基於 Model 的其他屬性來驗證當前的值。例如,新的 CompareAttribute 屬性讓你能比較 Model 中兩個屬性的值。在下面範例, ComparePassword屬性必須與 Password 欄位相配來同時通過驗證。

Public Class UsersController
    Inherits System.Web.Mvc.Controller

    <Required>
    Public Property Password() As String
    <Required, Compare("Password")>
    Public Property ComparePassword As String

End Class

Validation介面

IValidatableObject 介面讓你能使用Model層級的驗證,且讓你能提供整個Model狀態的驗證錯誤息訊,或在Model的兩個屬性之間。當Model繫結時,ASP.NET MVC 3現在從 IValidatableObject 介面接收錯誤息訊,在View使用內建 HTML helper時,將會自動標識或高亮度強調受影響的範圍。

IClientValidatable 介面讓你在ASP.NET MVC在運作時發現支援的客戶端驗證器,這個介面被設計用來支援整合不同的驗證框架。

更多驗證介面的資訊,請參考在Scott Guthrie's MVC 3 Preview blog post的Model驗證改善段落。

相依注入(Dependency Injection,DI)改善

ASP.NET MVC 3提供更好的相依注入(Dependency Injection, DI)和控器反轉(Inversion of Cntrol, IoC)容器支援。在下面區域(Areas)支援DI:

控制器:registering and injecting controller factories, injecting controllers。
檢視:registering and injecting view engines, injecting dependencies into view pages。
動作過濾器:locating and injecting filters。
模型繫結:registering and injecting。
模型驗證提供器:registering and injecting。
模型metadata提供器:registering and injecting。
Value 提供器:registering and injecting。

ASP.NET MVC 3 支援 Common Service Locator 函式庫和任何支援這個函式庫的 IServiceLocator 介面的DI容器。它也支援新的容易整合到 DI 框架的 IDependencyResolver介面。

更多關於ASP.NET MVC 3的 DI 資訊,請參考:Brad Wilson's series of blog posts on Service Location

ASP.NET MVC 3其他新功能

NuGet整合

ASP.NET MVC 3會自動安裝和啟用NuGet,NuGet是一個免費開源碼組件管理器,它讓你簡單去尋找和安裝組件,和使用.NET 類別庫和工具在你的專案中。它可以和所有Visual Studio 專案類型一起作業,包含ASP.NET Web Forms(*.aspx)及ASP.NET MVC。

NuGet允許開發者維護開源碼專案,(例如,像Moq、NHibernate、Ninject、StructureMap、NUnit、Windsor、RhinoMocks、Elmah…等)可以去注冊它們到一個上線的網站中。讓它是那麼容易讓.NET開發者去使用其中一個函式庫來尋找組件並安裝它們到專案中去研究。

更多關於NuGet的資訊,請參考:NuGet documentation on the CodePlex site。另有一篇暗黑執行緒所寫:還在揮汗徒手安裝程式庫? 試試NuGet吧

部分頁面的輸出快取

ASP.NET MVC 從版本1 開始支援整個頁面的輸出快取。ASP.NET MVC 3更提供了部分頁面的輸出快取。這讓你容易地輸出快取一個區域或片斷。更多關於快取資訊,Scott Guthrie's blog post on the MVC 3 release candidate 中 Partial Page Output Caching 段落。還有 MVC 3 Release Notes 的 Child Action Output Caching 段落。

可參考:MVC 3 Partial Output Cache - Simple Demo(正體中文)

在請求驗證上的粒狀控制(Granular Control)

ASP.NET MVC 內建了請求驗證機制來自動幫助預防跨站攻擊(XSS)和HTML注入攻擊。不管如何,有時你還是希望能明確關閉請求驗證,像是,你想讓使用者能提交含HTML標籤的內容(例如,在一個部落格或內容管理系統(CMS)之中),現在你可透過增加 AllowHtml 屬性到模型(Models)或檢視模型(View Models)來支援在模型繫結時一個屬性關閉請求驗證。

更多請求驗證資訊,請參考:Scott Guthrie's blog post on the MVC 3 release candidate 中 Unobtrusive JavaScript and Validation 段落。

延伸"新專案"對話視窗

在ASP.NET MVC 3,你能增加專案樣版,檢視引擎,單元測試專案框架到新專案對話視窗。

Scaffolding改善

相較於之前版本的MVC,ASP.NET MVC 3中scaffolding樣板在Model和操作上更為合適,對於識別主鍵屬性提供了更好的支援,例如,scaffolding樣板不的將主鍵加入編輯表單欄位中。

預設下,Create和Edit的scaffolding樣板現在使用 Html.EditorFor 輔助方法來替代 Html.TextBoxFor 輔助方法。這個改善在「新增檢視」產生一個View頁面時,支援Model中繼資料(metadata)在表單的data annotation屬性。

新可覆寫方法"Html.LabelFor"和"Html.LabelForModel"

對於 LabelForLabelForModel 輔助方法增加了新的多載方法,新的多載讓你能指定或覆寫 Label 文字。

支援Sessionless Controller

ASP.NET MVC 3中,在Controller類別中,你可以指定是否使用session狀態,更進一步,Session是否能讀寫或者只唯讀

新"AdditionalMetadataAttribute"類別

你能使用 AdditionalMetadata 屬性對 Model 的一個屬性訪問 ModelMetadata.AdditionalValues 字典,例如,如果Model有一個屬性僅支援管理者顯示,你可以設定如下:

Public Class ProductViewModel  
    Inherits System.Web.Mvc.Controller

    <AdditionalMetadata("AdminOnly", true)>
    Public Property RefundCode() As String

End Class}

當ProductViewModel轉譯時,這個中繼資料(metadata)將被任何顯示或編輯樣板使用,這可讓你來解譯中繼資料(metadata)資訊。

uTorrent BT軟體的免費教育課程

雖然BT這類軟體被人視為盜版天堂,但就「分享」此事而言,BT有著重要的意義。

以下消息是從PChome雜誌看到,我覺的很埲,所以也分享一下。

全世界有一家教育學院,被前微軟老闆Bill Gates所推薦,能讓Bill Gates都說讚,除了讚之外,Bill Gates還免費(應該是免費啦,它也沒有這個財力請得起Bill吧)幫他站台。是什麼學院那怎厲害?這個學院名稱是Khan Academy,它不過是一位老師,就他能力所及,不斷錄教學影片,然後放到Youtube上讓人免費看、免費學。


到現在為止,Khan Academy已經提供超過二千個以上線上課程,抱括高中、大學的視訊課程內容。現在更進一步與uTorrent BT軟體合作,直接提供Khan Academy所以視訊教學內容。你可以下載uTorrent 2.2以上的版本來下載、觀看。

這是正面的意義,對的工具加對的事


過程中可能會有幾次無法安裝的訊息,多按幾次retry即可。


從物理、化學、歷史、數學、電子、財務、人生…應有盡有。不拿來好好利用,實在對不起自己(或孩子)。嗯,聽不懂…從Khan Academy找一些入門課來當英文聽力練習,好像也不錯。語言的問題就留給你自己加油。

Reference:

ASP.NET MVC 2與MVC 3使用AjaxHelper引用Javascript檔不同

就一直很奇怪,自從我安裝ASP.NET MVC 3之後,發現程式裡的AjaxHelper的相關程式都不會有動作,但網頁上又不會有任何錯誤(Firebug也沒有)。

一直找不到原因,後來終於透過Forum詢問,找到原因。基本上不是ASP.NET MVC 3的問題。一來是自己不用功,沒時間去看ASP.NET MVC 3 Release Notes,二來是自己想法太單純,想說ASP.NET MVC 3應該會相容ASP.NET MVC 2吧,所以只是單純安裝MVC 3然後使用。

問題重現

在ASP.NET MVC 3專案中,做如「AjaxHelper Class」最下面的Lab,你會發現Ajax不會運作。但一樣的程式碼在ASP.NET MVC 2很正常。

ASP.NET MVC 2需引用MicrosoftAjax.js及MicsoftMvcAjax.js兩支Javascript。但ASP.NET MVC 3預設使用「Unobtrusive JavaScript」,我們可以參考根目錄下web.config

<appSettings>
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
  </appSettings>

所以在ASP.NET MVC 3我們必須引用另一支Javascript「jquery.unobtrusive-ajax.js」,這一支Javascript必須配合jQuery使用,所以也是引用兩支Javascript。

<script src="<%: Url.Content("~/Scripts/jquery-1.4.4.min.js") %>" type="text/javascript">
</script>
<script src="<%: Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js") %>" type="text/javascript">
</script>

引用之後,ASP.NET MVC 3的AjaxHelper就能正常運作了。看來我是要花點時間把ASP.NET MVC 3 Release Notes好好的K一K。@_@

Reference:

Tools -- Windows 7內建多執行緒複製備份檔案的超強指令robocopy

robocopy是一個Windows 7內建DOS指令,它提供了一個可使用多執行緒來複製檔案,當你有很多檔案需要複製時,它可是比xcopy或Windows UI的複製、貼上還好且更快。

C:\>robocopy /?
-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------
  已啟動 : Tue Mar 22 10:40:03 2011
              使用方式 :: ROBOCOPY source destination [file [file]...] [options]
             source :: 來源目錄 (drive:\path 或 \\server\share\path)。
        destination :: 目的地目錄  (drive:\path 或 \\server\share\path)。
               file :: 要複製的檔案  (名稱/萬用字元: 預設值是 "*.*")。
::
:: 複製選項 :
::
                 /S :: 複製子目錄,但是空的子目錄例外。
                 /E :: 複製子目錄,包括空的子目錄。
             /LEV:n :: 只複製來源目錄的前 n 層。
                 /Z :: 在可重新啟動模式複製檔案。
                 /B :: 在備份模式複製檔案。
                /ZB :: 使用可重新啟動模式; 如果拒絕存取,則使用備份模式。
            /EFSRAW :: 在 EFS RAW 模式複製所有加密檔案。
  /COPY:copyflag[s] :: 要為檔案複製什麼內容 (預設值是 /COPY:DAT)。
                       (複製旗標: D=資料、A=屬性、T=時間戳記)。
                       (S=安全性=NTFS ACL、O=擁有者資訊、U=稽核資訊)。
           /DCOPY:T :: 複製目錄時間戳記。
               /SEC :: 複製包含安全性的檔案 (相當於 /COPY:DATS)。
           /COPYALL :: 複製所有檔案資訊 (相當於 /COPY:DATSOU)。
            /NOCOPY :: 不複製檔案資訊 (可用於 /PURGE)。
            /SECFIX :: 修正所有檔案的安全性,即使略過的檔案也包含在內。
            /TIMFIX :: 修正所有檔案的檔案時間,即使略過的檔案也包含在內。
             /PURGE :: 刪除來源已經不存在的目的地檔案/目錄。
               /MIR :: 鏡像樹狀目錄 (相當於 /E 加 /PURGE)。
               /MOV :: 移動檔案 (複製後從來源刪除)。
              /MOVE :: 移動檔案和目錄 (複製後從來源刪除)。
     /A+:[RASHCNET] :: 將指定的屬性新增至複製的檔案。
     /A-:[RASHCNET] :: 從複製的檔案移除指定的屬性。
            /CREATE :: 只建立樹狀目錄和長度為零的檔案。
               /FAT :: 只使用 8.3 FAT 檔案名稱,建立目的地檔案。
               /256 :: 關閉特長路徑 (> 256 個字元) 支援。
             /MON:n :: 監視來源; 看到 n 個字元以上時再次執行。
             /MOT:m :: 監視來源; m 分鐘後如果變更,則再次執行。
      /RH:hhmm-hhmm :: 執行時數 - 新複本可以開始的時間。
                /PF :: 根據每一個檔案為基礎,檢查執行時數 (不是根據每一次通過)。
             /IPG:n :: 慢速線路可用頻寬,封包之間的差距 (毫秒)。
                /SL :: 複製符號連結與目標。
            /MT[:n] :: 以 n 個執行緒執行多執行緒複製 (預設值為 8)。
                       n 必須至少為 1,但不可以大於 128。
                       此選項與 /IPG 和 /EFSRAW 選項不相容。
                       使用 /LOG 選項重新導向輸出,以獲得更好的效能。
::
:: 檔案選取選項 :
::
                 /A :: 只複製已設定保存屬性的檔案。
                 /M :: 只複製包含保存屬性的檔案並重設。
    /IA:[RASHCNETO] :: 只包含附帶任何指定屬性的檔案。
    /XA:[RASHCNETO] :: 排除附帶任何指定屬性的檔案。
 /XF file [file]... :: 排除符合指定名稱/路徑/萬用字元的檔案。
 /XD dirs [dirs]... :: 排除符合指定名稱/路徑的目錄。
                /XC :: 排除變更的檔案。
                /XN :: 排除較新的檔案。
                /XO :: 排除較舊的檔案。
                /XX :: 排除其他檔案和目錄。
                /XL :: 排除孤立的檔案和目錄。
                /IS :: 包含相同的檔案。
                /IT :: 包含調整的檔案。
             /MAX:n ::檔案大小上限 - 排除大於 n 個位元組的檔案。
             /MIN:n :: 檔案大小下限 - 排除小於 n 個位元組的檔案。
          /MAXAGE:n :: 檔案期限上限 - 排除 n 日/日期之前的檔案。
          /MINAGE:n :: 檔案期限下限 - 排除 n 日/日期之後的檔案。
          /MAXLAD:n :: 上次存取日期上限 -排除自 n 日後未使用的檔案。
          /MINLAD:n :: 上次存取日期下限 - 排除自 n 日後使用的檔案。
                       (如果 n < 1900 則 n = n 日,否則 n = YYYYMMDD 日期)。
                /XJ :: 排除交叉點。(一般會預設包含)。
               /FFT :: 使用 FAT 檔案時間 (2 秒精細度)。
               /DST :: 補償 1 小時 DST 時差。
               /XJD :: 排除目錄的交叉點。
               /XJF :: 排除檔案的交叉點。
::
:: 重試選項:
::
               /R:n :: 失敗複本的重試次數: 預設值是 1 百萬次。
               /W:n :: 重試之間等候時間: 預設值是 30 秒。
               /REG :: 將 /R:n 和 /W:n 儲存至登錄中,變成預設值。
               /TBD :: 等候共用名稱。即將定義 (重試錯誤 67)。
::
:: 記錄選項:
::
                 /L :: 限清單 - 不複製、刪除任何檔案或加上戳記。
                 /X :: 報告所有其他檔案,不僅是這些選取的檔案而已。
                 /V :: 產生詳細資訊輸出,顯示略過的檔案。
                /TS :: 在輸出中包含來源檔案時間戳記。
                /FP :: 在輸出中包含檔案的完整路徑名稱。
             /BYTES :: 將大小列印成位元組。
                /NS :: 沒有大小 - 不記錄檔案大小。
                /NC :: 沒有類別 - 不記錄檔案類型。
               /NFL :: 沒有檔案清單 - 不記錄檔案名稱。
               /NDL :: 沒有目錄清單 - 不記錄目錄名稱。
                /NP :: 無進度 - 不顯示複製百分比。
               /ETA :: 顯示複製的檔案預估到達時間。
          /LOG:file :: 輸出狀態至記錄檔 (覆寫現有的記錄檔)。
         /LOG+:file :: 輸出狀態至記錄檔 (附加至現有的記錄檔)。
       /UNILOG:file :: 輸出狀態至記錄檔,變成 UNICODE (覆寫現有的記錄檔)。
      /UNILOG+:file :: 輸出狀態至記錄檔,變成 UNICODE (附加至現有的記錄檔)。
               /TEE :: 輸出至主控台視窗,以及記錄檔。
               /NJH :: 沒有工作標頭。
               /NJS :: 沒有工作摘要。
           /UNICODE :: 輸出狀態為 UNICODE。
::
:: 工作選項:
::
       /JOB:jobname :: 從命名的工作檔案取得參數。
      /SAVE:jobname :: 將參數儲存至命名的工作檔案
              /QUIT :: 處理命令列後結束 (檢視參數)。
              /NOSD :: 未指定來源目錄。
              /NODD :: 未指定目的地目錄。
                /IF :: 包含以下檔案。

參數有點多,但使用方式很簡單:


robocopy 來源目錄 目的地目錄 [檔案] 參數

檔案:預設是 *.*,即全部複製,所以可以省略。
參數:這是此指令的重點所在,robocopy提供了非常細部的設定,可以讓我們控制整個複製的過程中,什麼是我們想的,什麼是我們不想的。而且除了複製,robocopy還提供了比對功能,而比對功能讓我們可以實現「備份」。

備分範例

robocopy 來源 目的 /e /xo /purge



/e :代表複製子資料夾,含空的資料夾
/xo :排除較舊的檔案,意思是來源端沒有比目的地新時,就不複製(差異化備份,很重要的參數)
/purge :刪除來源中,不再存在的資料夾或檔案(差異化備份,很重要的參數)

也就是說,robocopy非常合適拿來寫批次檔,然後放到工作排程器中定期執行。另外,如果指令對你而言太難了,那網路上有人寫了一個Robocopy GUI版本,基本上是和robocopy相同,只是透過GUI勾選。

robocopy的參數是一大障礙,但當你常用,你會發現常用的就是那幾個,而且查詢也很方便。我一直在想,為什麼在Windows系統不提供一個man(Linux下的指令查詢指令)。

ASP.NET MVC 修改預設瀏覽器

我們之前在「Visual Studio 2008 Default Browser(預設瀏覽器)」可以修改瀏覽方式,來改變Visual Studio預設啟動的瀏覽器,一樣的方式在Visual Studio 2010並無改變,不過,如果你是在開發ASP.NET MVC,你會找不到地方可以改變,它隱藏在一個…很怪的地方。

請依下列步驟修改ASP.NET MVC預設瀏覽器:
  1. 在MVC專案下新增一個ASP.NET Web Form(*.aspx)
  2. ASP.NET Web Form按左鍵 → 瀏覽方式
  3. 選擇你想要的預設啟動瀏覽器

完成後,將新增的ASP.NET Web Form(*.aspx)檔刪除。不過,下次如果還要修改瀏覽方式,就必須重複上述步驟,不然就是Copy & Paste URL比較快。

更改後,以後就會以你所設定的預設瀏覽器來啟動瀏覽。

當個幫助者而非受助者

幫助他:日本」,與婆婆討論了一個數目字,然後Action。



如果你還未行動,分享一篇文章:「[親身體驗] 捐獻的力量、行善的力量」,讓行善成為習慣,不一定是要有災難的地方,從平常做起,我習慣將每年信用卡點數捐給「點燃希望之火」,每年報稅時,憑證第一張都是捐款收據,然後就會很開心的將資料寄送出去。

我們能給的不多,但心都開了,最少我們是幫助者,而不是受助者。

Tools -- Bruce的電腦軟體清單(Software List) 2011/3版

其實這是學Will保哥的,我覺得很好,每個人的工作環境不同,所以有差異,整理一份我個人軟體清單。

瀏覽器類
[雖然Internet Explorer 9已經推出,但不照顧XP使用者,還是建議Chrome / Firefox 二選一來用]
  • Google Chrome [家用首選、Debug次首] [Chrome快取設定]
  • Firefox [Debug、家用雙首選] [2011/3/23 Firefox 4繁體中文正式版已推出] 
  • Internet Explorer 8 / 9 [搞死網頁工程師首選,8 for XP、9 for Vista / 7,從前要測IE 6/7/8,現在還加上IE9,希望IE 9之前都能一夜消失,會不會有一天看到「請測試IE 6~IE15的網站相容性」,怕怕!]
Chrome = Firefox > Internet Explorer 8 / 9

瀏覽器擴充類
  • Firebug [Firefox / Chrome擴充,網頁Debug首選,其他Firebug再擴充看個人]
  • Fiddler2 [HTTP Debug利器,本身還有其他擴充程式]
  • iWeb2 [Firefox / Chrome擴充,可將網頁轉換為PDF檔案,這對我們整天在網路上看資料的人太實用了]
  • WOT [Chrome擴充,可進行網站過濾,Avast 6.x支援Firefox / Internet Explorer網站過濾擴充,但還不支援Chrome]
  • SecureBrowsing [Internet Explorer / Firefox擴充,可進行網站過濾,如果你不是安裝Avast最新版或其他家免費無網站過濾功能的防毒,可使用此擴充程式]
  • Firefox Sync [Firefox擴充,bookmarks同步工具,自從xmark說要關又沒關後,我就使用Sync至今]
  • IE Tab [Firefox / Chrome擴充,一些必須使用Internet Explorer功能的網站也能在Firefox / Chrome中直接瀏覽]
  • GMail Checker Plus [Firefox / Chrome擴充,Gmail新信通知,不要一直去信箱是否有新信]
  • 下载助手 [Chrome擴充,為了在Chrome裡使用Free Download Manager。使用快车、迷你快车、迅雷、迷你迅雷、QQ旋风、电驴、Orbit、Internet Download Manager或Free Download Manager下载网页链接。]

輸入法

影音類

學習類
  • Yahoo!奇摩迷你筆 [單字查詢,Dr.eye還會有人買嗎?]
  • XMind [心智圖工具,整理想法、筆記不錯用,個人覺得比FreeMind好用]
  • Adobe Reader X [PDF格式閱讀軟體]
  • FoxitReader [Adobe Reader替代軟體,小又快,二選一即可]
  • Bizagi Process Modeler [拿來畫流程相關超好用,本身偏商業流程管理(BPMN)的軟體] 
  • yEd [好用的畫流程圖工具]
  • StarUML [一套UML軟體數十到數百萬都有,但StarUML免費,以它免費所能提供的功能相比,太值得了。如果你有在學習或使用UML應該試試它]
  • uTorrent [本身是BT軟體,但在2.2版之後,內建Khan Academy線上教材,所我定義為學習類!] [uTorrent + Khan Academy介紹]

糊口飯類 (一般電腦不適用)

Visual Studio 2010擴充類 (一般電腦不適用) [擴充組件庫介紹]
每人使用環境不同,請自行開Visual Studio去找所需要的擴充程式(Express不支援)。
  • ADO.NET VB POCO Entity Framework
  • devColor
  • Javascript parser
  • JSEnhancements
  • NuGet Pacage Manager
  • PowerCommands
  • Productivity Power Tools
  • Regex Editor
  • Snippet Designer
  • Visual Studio Color Theme Editor
  • VS10x Code Map v2


系統類

光碟機類

休閒類
  • 稞麦综合视频站下载器(xmlbar) [支持多個影音網站的下載]
  • FOXY 1.9.9 [P2P分享]
  • Shareaza [P2P分享,網路上有另一個www.shareaza.com是有問題的網站,請不要下載使用]
  • TimeRadio [線上Radio,100% MIT,那種有數百數千台Radio的軟體你會去聽嗎?好聽的幾台就夠了!]

桌面類
不會有IM類
[現在社交網站太熱了,除了上班必要外,實在很少用開IM(MSN, QQ, Skype)。 把Facebook、Plurk…列出又怪怪的,它們又不是軟體。]


怎麼沒有Office?
  1. 因為不是工作機
  2. 線上Office很方便
  3. 線上Office約可完成我家中99.9%需求
在我們家中,已經很習慣飛上「雲端」。
    線上Office類
    • office.live.com [以使用者體驗來說,它比Google文件好]
    • docs.google.com [以實用性來看,它限制少、相容性好,它比Office線上好]

    如果非加不可,
    工作機:
    • Office 2010 [從Office XP ~ Office 2010使用的功能一模一樣(對不起,我不長進),但公司一直不斷付錢給這家公司,厲害!!!]

    最後魔王,
    作業系統類
    • Windows 7 x64 [從Windows 3.1到現在,覺的最棒的一套作業系統。一定要x64的哦!時間的經過,讓x64的成熟度已經夠了。另因工作需要,會加掛IIS,Windows 7版本最少要有支援備份功能的專業版] [Windows 7備份介紹]
    • CentOS x64 [Linux還是必須碰一碰,Server建議玩CentOS]
    • VirtualBox [可安裝虛擬多個作業系統,例如在Windows 7裡再安裝CentOS、Windows XP...]
    呼, 紅色的是我覺得一般家用「必裝」,其實不多,工作上的重點其實就是Visual Studio及SQL Server,其他還有一堆軟體就不列了,列重要的就好,因為,吃什麼飯你就會去用什麼軟體

    Reference:

      幫助他:日本

      大家都是地球村的一員,互相幫助是應該的,有錢的出錢,有力出力,如果都沒有,就用用念力也好。
      以下Google製作關於幫助日本的網站,請大家多多流傳。

      http://www.google.com/intl/en/crisisresponse/japanquake2011.html

      天佑日本、台灣、世界。

      ASP.NET MVC 3使用Visual Basic在新增Area的Bug

      今天要在ASP.NET MVC 3之中要新增一個Area,然後就出現一個錯誤訊息:


      這是什麼?順著它給的路徑找下去發現:


      結果很明顯,ASP.NET MVC 3在Visual Basic環境下,會有這個錯誤。然後我試著新建一個ASP.NET MVC 2的專案然後建Area,一樣的錯誤,那個ItemTemplates多了一個Cache,在未升級ASP.NET MVC 3之前,沒有發生過這個錯誤。

      應該ASP.NET MVC 3 for Visual Basicu的Bug。我已反應到asp.net forums,看有沒有什麼好解決辦法。

      笨辦法:依提示錯誤路徑,在IDE下建一個新「ItemTemplatesCache」目鍵,然後把原始ItemTemplates下的VisualBasic目鍵全部Copy過去。

      [註]後來發現ItemTemplates下所有目錄總大小約4.92 MB,整個Copy比較快。@_@

      未測試就把方法Po上來,真不是好習慣,以上方法行不通。



      在其他台電腦,無此問題,不過平台有些差異:
      問題電腦:Windows 7 x32 + Visual Studio 2010(Visual Basic) + ASP.NET MVC 3
      出問題的目錄:C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplatesCache\...
      其他電腦:Windows 7 x64 + Visual Studio 2010(Visual Basic) + ASP.NET MVC 3
      x64之下的目錄:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplatesCache\...

      為什麼我那台Windows 7 x32的電腦ItemTemplatesCache這個目錄會不見,我也不知道,目前還在求助中。
      http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/0590a478-06bb-4b40-b543-27c989868ef9


      Reference:

      Visual Studio 2010 Service Pack 1+ IIS 7.5 Express+IE 9加速你的開發測試環境

      Microsoft Visual Studio 2010 Service Pack 1 已經於2011/3/3推出,此Service Pack修改內容裡我認為有幾點:

      • IIS Express支援

        我們知道ASP.NET的網頁都有一個毛病,就是第一次執行都會比較慢,但我們在開發環境本來就是「開開關關」,所以常常是「第一次」,也造成常常是我們在等畫面出來,看結果再來修正,久而久之,每次三秒、五秒,加一加也浪費了不少時間在等畫面。

        Visual Studio 2010+Web Development Server升級Visual Studio 2010 Service Pack 1+IIS 7.5 Express的組合後,第一個非常明顯的是,第一次開啟網頁速度快很多,第二是就算是第一次執行的網頁,速度也快很多。(有飛快的錯覺)

        而IIS Expresss剛推出時,只支援Command的方式使用,實在非常不人性,我想也沒什麼人想用,但當你更新至Visual Studio 2010 Service Pack 1,就能讓Visual Studio 2010支援直接使用IIS Express。

        另外參考「介紹 IIS Express」及「使用 IIS Express」兩篇,裡面有提到為何要使用IIS Express,你可以在IIS 7.5 Express完整測試而不用怕東怕西,或是那種「我在本機測都OK,怎麼上傳到伺服器就一堆Error?」的問題。

        So,如果你已經安裝好Visual Studio 2010 Service Pack 1,那就不要錯過IIS 7.5 Express這個很棒的…精簡版IIS。

      • Razor支援

        如果你有安裝ASP.NET MVC 3,其實就會安裝相關ASP.NET MVC 3 for Razor的範本,讓你可以在ASP.NET MVC 3寫使用Razor的方法來寫程式,但安裝Visual Studio 2010 Service Pack 1後,可以說是比較全面支援,連Web Form(*.aspx)都能使用Razor來撰寫。

      • Web PI整合

        你安裝完Visual Studio 2010 Service Pack 1後,會發現多出後來Microsoft Web Platform Installer 3.0 (Web PI)工具列,像IIS 7.5 Express你就能使用Web PI來安裝。
      以上的Visual Studio 2010 Service Pack 1+IIS Express是我覺得最棒的,另外,今天也是Internet Explorer 9正式版推出的日子,安裝後使用的感覺,如果是拿來跟IE 8比是真的快很多,但如果拿來跟Firefox 4.x或Google Chrome比的話,感覺IE 9是追上了,但沒有超越。

      但Firefox或Chrome有許多擴充套件,這點就如同iPhone / iPad + App Store一樣,WP 7也有Marketplace,但IE的擴充套件好弱,不知道什麼時候會補強?

      Visual Studio 2010 Service Pack 1+ IIS 7.5 Express+IE 9和以前相比,更新吧,什麼都快一些,用起來就是"爽"。

      Download Links:

      Reference:
      1. 介紹 IIS Express
        這篇一定要看,就了解為什麼要使用IIS Express。
      2. 使用 IIS Express
      3. http://learn.iis.net/page.aspx/860/iis-express/
        官方說明文件(英文)
      4. http://www.microsoft.com/taiwan/technet/iis/learn/
        官方說明文件(繁體,IIS express還未更新上,但IIS部分還是很棒的資料)
      5. Program

      Visual Basic之擴充方法(Extension Mothed)

      Visual Basic 9 / Visual Basic 2008版本時加入一個擴充方法(Extension Mothed),這個方法可以讓我們很方便就擴充型別的方法,僅僅只有方法哦。在ASP.NET很少用,或是根本沒用到,但想不到,到了ASP.NET MVC,擴充方法的比重大大提升。

      在ASP.NET MVC不像ASP.NET裡有很多很多很好用的控制項,所以在ASP.NET MVC中「手工」部份比重增加,所以「重覆」、「客制化」的東西就多,這時有幾種方式來解決
      1. 寫個Function()來處理重覆步驟。
      2. 寫個Class,使用Shared關鍵字來公開方法。
      3. 使用擴充方法,直接擴充相關型別的方法。

      寫個Function()來處理重覆步驟

      如果Function()程式只會在同一個頁面,或同一個Class中使用,這是很不錯的方法。但如果需要給多個頁面,或多個Class使用,那還不是「重覆中的重覆」,只是一個是複製整段程式碼,一個是複製Function(),有何差別?

      寫個Class,使用Shared關鍵字來公開方法

      自己寫個Class,使用Shared關鍵字來共用方法,這真好。因為使用了Shared關鍵字,在任何頁面Class中都可以直接引用。

      但,你知道整個.NET Framework有多少Class了嗎?記得在一篇文篇裡看過,.NET Framework 2.0就有三萬多個Class,你背得了幾個?再加.NET Framework 4新增的,媽媽咪呀。你覺得不夠用,想要再往上加,你記的起來,別人呢?

      使用擴充方法,直接擴充相關型別的方法

      使用擴充方法(Extension Method)來擴充相對應型別的方法。一般常用的Class你一定記得起來,例如,String、Integer,當這些Class所提供的方法無法滿足你時,你應該使用擴充方法來擴充即可。

      例如,我們想要把使用者輸入的「數字字串」轉換為「中文數字字串」,「1234」轉為「一二三四」,String型別有這個方法嗎?Integer型別有這個方法嗎?沒,所以我們來擴充。

      使用擴充方法

      1. 必須寫在「模組」裡,模組必須定義為「Public」
      2. 必須 Imports System.Runtime.CompilerServices
      3. 擴充方法只能是 Function 或 Sub
      4. 擴充方法 Function 或 Sub 前,必須以「擴充屬性 <extension()> 標記
      5. 擴充方法 Function 或 Sub 第一個參考型別表示要擴充的型別

      實作擴充方法 for ASP.NET MVC

      在ASP.NET與ASP.NET MVC實作擴充方法都一樣,讓我們寫點ASP.NET MVC的東西,所以我們選擇使用ASP.NET MVC來實作。

      新增ASP.NET MVC 3專案
      如果你使用Visual Basic來撰寫ASP.NET MVC我建議升級至ASP.NET MVC 3版本,最少在「產生程式碼片段」會不出現$end$的錯誤。

      ' ASP.NET MVC 2 產生程式碼片段
      Public Function Action() As ActionResult
      Return View()$end$
      End Function
      
      ' ASP.NET MVC 3 產生程式碼片段
      Public Function Action() As ActionResult
          Return View()
      End Function
      

      在Controllers資料夾中新增二個「模組」,命名為StringExtension,還有一個LabelExtension(Label這個有個故事)。

      StringExtension.vb 模組
      Imports System.Runtime.CompilerServices
      
      ' 一定Public,不然會出錯
      Public Module StringExtension
      
          ' 第一個參數為String,所以會擴充為String的方法
          ' Visual Basic 2010,有「隱含行接續」,可不行在最後加「底線」
           
          Public Function ToChineseFromNumber(ByVal number As String) As String
              Dim letter As String = Nothing
              Dim Chinese As String = ""
              Dim value As Integer = Nothing
      
              If (Integer.TryParse(number, value)) Then
                  For i As Integer = 0 To number.Length - 1
                      letter = number.Substring(i, 1)
                      Select Case letter
                          Case "0"
                              Chinese += "零"
                          Case "1"
                              Chinese += "一"
                          Case "2"
                              Chinese += "二"
                          Case "3"
                              Chinese += "三"
                          Case "4"
                              Chinese += "四"
                          Case "5"
                              Chinese += "五"
                          Case "6"
                              Chinese += "六"
                          Case "7"
                              Chinese += "七"
                          Case "8"
                              Chinese += "八"
                          Case "9"
                              Chinese += "九"
                      End Select
                  Next
              Else
                  Chinese = "Must Numbers."
              End If
              Return Chinese
          End Function
      End Module
      

      LabelExtension.vb 模組
      Imports System.Runtime.CompilerServices
      
      Public Module LabelExtension
      
          ' 擴充HtmlHelper,即在View中使用Html,擴充後成為Html.LabelFormat()方法
          <extension()>
          Public Function LabelFormat(ByVal helper As HtmlHelper, ByVal target As String, ByVal text As String) As String
              Return String.Format("<label for="{0}">{1}</label>", target, text)
          End Function
      End Module
      

      先「建置」專案,然後開啟HomeController.vb,加入擴充方法所在的命名空間「Imports ProjectName.ModuleName」:

      HomeController.vb
      ' 要記得Imports ProjectName.ModuleName
      Imports MvcVBExtension.StringExtension
      
      Public Class HomeController
          Inherits System.Web.Mvc.Controller
      
          Function Index() As ActionResult
              ViewData("Message") = "歡迎使用 ASP.NET MVC!"
      
              Dim Chinese As String = "1234"
              ' 使用String的擴充方法
              ViewData("Chinese") = Chinese.ToChineseFromNumber()
      
              Return View()
          End Function
      
          Function About() As ActionResult
              Return View()
          End Function
      
      End Class
      

      接著我們來看Index.aspx

      <%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
      <%@ Import Namespace="MvcVBExtension.LabelExtension" %>
      <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
          首頁
      </asp:Content>
      
      <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
          <h2><%: ViewData("Message") %></h2>
          <p>
              若要進一步了解 ASP.NET MVC,請造訪 <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>。
          </p>
          <p>
          String擴充方法:<%: ViewData("Chinese")%>
          </p>
          <p>
          Label擴充方法:<%= Html.LabelFormat("KKBruce", "Bruce Blog")%>
          </p>
      </asp:Content>
      

      重點在第二行「<%@ Import Namespace="MvcVBExtension.LabelExtension" %>」,先Imports 命名空間,才有辦法使用Html.LabelFormat擴充方法。

      .NET Framework進化到現在4.0,除非需求特別,不然需要再寫新Class的機會實在不大,反而是需要擴充的機會大些,而在ASP.NET MVC中擴充Helper輔助類別又是大宗。

      LabelExtension的故事呢?

      話說,有些人就是學不乖,犯過了寫,而且還寫了「悔過書--JavaScript之無法form.submit()的錯誤」,2010/12月到現在2011/3月,算算應該才滿三個月的時間,又犯一樣的錯,抓去關算了。

      什麼錯,就之前寫擴充方法寫的很高興,但奇怪,怎麼有一個擴充方法怎麼樣就是不能用?在<%= Html. 時,就是不會跑出我寫的那個擴充方法,但你直接下<%= LabelFormat就可以使用,不管我如何清除、重建,就是無法成為HtmlHelper的擴充方法。想說是不是見鬼了,也查了我一整個下午,結果是:


      看不懂,沒關係,答案是:


      還看不懂我也沒辦法了。命名重覆,哈,我的腦袋跟這些人一樣嗎?怎麼老是想出一樣的名稱。

      關於「IE6 Countdown乎已死」科幻說書系列

      最近有個很好玩的網站「IE6 Countdown」,這個IE6 Countdown製作者是100%的Microsoft,但IE6不是Microsoft的產品嗎?

      IE6對於Web Developer(網頁開發人員)來說,就好像萬惡之首藏鏡人一樣,我今天才知道原來史豔文與藏鏡人竟是雙胞胎!但談到IE6就不能不談到Microsoft另一非常成功的產品Windows XP,Windows XP與IE6原本就是雙胞胎+連體嬰,所以Windows XP的成功也讓IE6這個萬惡之首相對的強大。

      但Microsoft從來不會說:「對不起,我錯了。」而是想辦法製造人造人7號、8號、9號(RC)??,對這個6號人造人展開追殺,以前是暗暗的來,但他們發現這個6號依著Windows XP的成功,實在變的太強大,這個強大不是說6號本人有多強,而是:

      中國國務院總理溫家寶曾說:「任何小數字,乘以十三億,就會變得很大。」
      中國國家主席胡錦濤的曾說:「任何事情乘以13億,都變成一件大事。」
      差不多就是這種感覺了。另外一個重點,IE6時代,有太多人為了混口飯吃,所有只好屈服於6號人造人的淫威,另人家的Firefox不能跑,沒關係,但你的App一定要能100%的能在我6號人造人的淫規之下運作,人家交100元規費,你就是要交200元,不然不是打10個就能解決。

      當然,還是有很多有良心的人,會去寫相容性App,讓你的App可以在非6號人造人之下,還是能運作發展。但沒良心邪惡天才還是很多,這些沒良心邪惡人才的寫出來的為量不少6號人造人「專用App」,雖然有些專用App後來成功被7號或8號成功以美人計吸收,但連生產人造腦問名的Intel也擺脫不了邪惡天才的專用App及6號人造人的控制。一篇「Why Intel's still using IE 6」可知一二心酸。

      終於,在IE6號後第三位兄弟IE9號出世前, Microsoft終於下定決心,來暗的不行,那就全面開戰吧,於是公告世人,我要來終結IE6人造人,於是有了IE6 Countdown這個網站,一句「Friends don't let friends use Internet Explorer 6, 是朋友就不用讓你的朋友用IE 6」,多美又不傷人的台詞。應該找找當年Microsoft讚美Internet Explorer 6所使用台詞來比對一下!

      重點,誰是Microsoft的朋友
      你嗎?我嗎?要是Windows和Office免費了,我會選擇當他最好的朋友。

      不過,我對於IE6 Countdown上的數據是問號一堆,除非是世面上(Google Analytics、Yahoo站長工具、百度统计)分析技術有問題,不然以我手上幾個網站的分析數據而言,異質Browser變多了,但IE6人造人的勢力範圍都還是破50%,民間與官方永遠是差距那麼大。

      個人認為,這個追殺比爾之「IE6 Countdown乎已死」計畫,想實現至0%消滅6號人造人的時間還很久,它認錯的意味還比較重些,不然我實在很少「明」的聽到「自己人殺自己人」。只要Windows XP還活在世上的一天,我信相IE6人造人就有一定勢力範圍,而且那些專用App更是讓如Intel一樣的公司,不願意受美人計的影響,跟隨升級腳步。而更強大的9號人造人,看來是與Windows XP無緣,所以我們應該是看不到Windows XP + IE 9這個組合。

      可能最後還是採「自然法則」,不更新、不銷售、推新Windows 7/8/9/10…讓Windows XP+IE6這個組合自然消失。

      Windows 7對Windows XP影響很大,如果不考慮硬體及x64軟體相容性問題,我真的會選擇Windows 7,Windows 7正一步步收復失土,把以前種種的不應該修補起來,單純就工作而言,我還真的希望這個「IE6 Countdown乎已死」能成功,那麼我就可以當個有良心又不用寫相容性App的人,希望接下來能有更強力的作為,而不只是一張統計圖。

      今天的科幻說書系列,希望你會喜歡。

      ps... 媽呀,原來我還真會蓋。@_@

      赤子之心

      小孩到了一個年紀就開始多話,開始喜歡問為什麼?而我們家的大寶貝喜歡問「然後呢?」「還有呢?」「做什麼?」一般而言,我和婆婆都盡量的回答她。其實我覺得大寶貝有「希臘哲學家蘇格拉底」的一點味道,而我只是個平凡的爸爸,常常幾句對話就讓我「詞窮」了。

      爸爸:走,我們去散步。
      寶貝:散步要做什麼?
      爸爸:散步能讓心情好。
      寶貝:心情好要故什麼?
      爸爸:心情好就會笑笑。
      寶貝:笑笑要做什麼?
      爸爸:笑笑能讓我們開心。
      寶貝:開心要做什麼?
      爸爸:開心能讓我們快樂。
      寶貝:快樂要做什麼?
      爸爸:快樂就是…閉嘴…快點走。
      寶貝:閉嘴要做什麼?
      爸爸:閉嘴就是…集氣…集氣…集氣…龜派氣功。

      當然,我們也有反擊之道,當她問「要做什麼」時,我們就反問她一樣的問題,常常都會給出意外的答案。我喜歡她的提問,能常常讓我的腦袋空白,問題越簡單,回答起來越不簡單,常常覺得我們大人是不是「丟臉轉生氣(台)」所以常會因為小孩問問題,所以平白失去一個教育的機會,或給了一個錯誤的教育(叫她閉嘴)。

      2011年,228連續假期,利用假期我們安排了一些行程,看花、看草、看燈會。228這一天,我們去了青草湖,雖然我住在新竹十多年,十八尖山去了很多次,但青草湖真的沒去過。想說前一天那種人山人海有點怕怕,所以我們選擇一大早出發。

      陽光、空氣、湖,三者結合的剛剛好。

      不過就在散步過程中,我們回程由于飛島往立體停車場前進時,在約三分之二處,發現了一頭溺水死亡的大狗在湖邊,婆婆看到是轉頭快跑,大寶貝什麼都不懂,還一直要看,我們帶她離開,然後寶貝又開始蘇格拉底式的問題。

      寶貝:大狗狗怎麼了?
      爸爸:牠不小心掉到水裡了。
      寶貝:牠掉到水裡要做什麼?
      爸爸:牠掉到水裡,所以死翹翹了。
      寶貝:牠死翹翹要做什麼?
      爸爸:死翹翹就不的動了,就沒有生命了。
      寶貝:沒有生命要做什麼?
      爸爸:沒有生命它的爸爸、媽媽就會哭哭。所以你到水邊也要很小心,知道嗎。
      寶貝:…

      寶貝沒有接下去問,停了約三秒,然後說,

      寶貝:爸比,我們去救牠,好不好?
      爸爸:…(我腦袋又一片空白,不知道怎麼回答)

      直到車上,大寶貝還在自言自語,我聽不太清楚,但能知道她還在想狗狗的事。我無法救牠,228是國定假日,我想打電話給新竹市政府應該也沒人接,我只能由民意信箱反應,希望牠不要在冷冷的水裡。

      善良,我的孩子很善良。她提醒了我,要保有赤子之心。「我們去救牠,好不好?」一直在我耳邊。

        免費優使性2.0全書籍內容下載

        此書作者真的是「佛佛佛佛心級」,給他100個讚!

        這本書我也有,內容讀起來不無聊,提出了許多我們只會寫Code平常跟本不會去想的問題,原來使用者跟我們想的不一樣。這本書在我設定網頁UI上幫助不少,但這算是「冷門書」,書局只有少少幾本,而且位置都不會在太紅地區。

        這一次作者是開放「免費全書電子檔」下載,如果你還不用心看,實在太不起他了。這幾年,Smart Phone/ iPad…等風行,大家可以發現在UI的設計上有了很大的突破,應該在一開始就把「優使性」考慮進系統。

        一本好書,推薦給大家。希望透過作者的這個動作,還有大家的努力,可以讓我們的網站世界更美好。

        優使性2.0 書籍內容全文下載

        1. 前言 紅白機的年代 (577)
        2. 關於優使性的譯名 (289)
        3. 1 優使性簡介 (286)
        4. 2 網站設計與優使性 (271)
        5. 3 設計問題從何而來 (255)
        6. 4 如何改善設計 (253)
        7. 5 網站成功的條件 (101)
        8. 6 網站目標 (227)
        9. 7 收集使用者需求 (221)
        10. 8 定訂網站架構 (204)
        11. 9 使用者行為模式 (213)
        12. 10 介面設計原則 (217)
        13. 11 常見的設計問題 (212)
        14. 12 評估網站的優使性 (204)
        15. 13 啟發式評量(Heuristic Evaluation) (200)
        16. 14 優使性測試概觀 (191)
        17. 15 測試環境及參與人員 (185)
        18. 16 測試執行與文件準備 (211)

        來源:http://www.usabilitymax.com/%E5%84%AA%E4%BD%BF%E6%80%A72-0

        227苗栗燈會之竹南火車站暴動實記

        苗栗燈會,留點記錄。我和婆婆選了一天227,想說帶小孩去看燈會,開車,那是一定必塞,看了看,好像坐火車是很不錯的選擇,因為會場就在火車站旁邊,再者,寶貝們還沒坐過火車,我們一直說要找時間帶她們去坐火車,所以就選定日期、時間(3:00 PM)出發。

        到 了火車站,Oh~滿滿的人,本來有點想打道回府,但都已經到火車站了,還是乖乖排隊買票,現場應該有99%的人都是到「竹南站」,花了近半個小時打到票, 然後進站、上火車和婆婆、寶貝們快快樂樂的出遊。出竹南站,又是一個Oh~滿滿滿滿的人,我們推著小孩跟著人潮往燈會會場前進。

        燈 會,很美、很漂亮,雖然滿滿滿滿滿滿的人,但不影響我們的好心情。我和婆婆說,看人那麼多,我們早點去坐車。在一個半小時後(約7:30 PM),我們離開燈會會場,慢慢走向火車站,其實這時走向火車站的人已經是一條長長的人龍。到火車站後,Oh~My God!竹南火車站廣場前已經Full了,我們推著兒童車,一樣不得其門而入,警察伯伯要我去要「排隊」,但竹南火車站前是階梯,我們推著車要如何排隊?最後,警察伯伯放婆婆和小孩先進去,我還是乖乖去排隊。

        排隊人龍越來越長,越來越長。

        因 為火車班次固定,所以進站速度很慢很慢,30分鐘~40分鐘~1小時,民眾開始「鼓噪」,慢慢開始出現亂像,不排隊插隊的人開始多了,插隊的人一出現, 現場大亂,推擠開始出現,還有人因此受場,當然最為難的是警方,被罵、被幹都是他們,不得以,台鐵放下唯一一個鐵門。現場民眾分三派,開嗓大罵派、乖乖等待派、毛頭小鬼派。

        • 開嗓大罵派
          已經等到情緒化的一些人,罵人、推人、大叫、鬼話連篇…總統、交通部長、苗栗組長、警察總長…我通通聽到。
        • 乖乖等待派
          其實大部人還是很乖在等待。尤其看到那些抱著小孩一個多小時的爸媽,真是太偉大了。
        • 毛頭小鬼派
          來亂的,看起來未成年小鬼,一直大叫「開門」「幹X娘」…好像越亂他們越高興。
        竹南車站外,濃濃的霧,時間一分一秒的過,我對不守規矩又沒公德心的人,只能搖頭再搖頭,這難道就是台灣人的真面目?真懷疑,只是個排隊、等火車就搞得竹南火車站外跟「暴動」沒什麼差,我真的沒騙人。 如果真是有難,我們會互助嗎?最少當天我看到的都是「自私又自利」的人在做亂。


        就在一個多小時的推擠後,我被擠進去火車站裡,看到等了許久婆婆還小孩,我好高興,第一句話是:「我是被擠進來的,不是自己走進來的。」婆婆馬上說,她才剛跟人吵完架。


        她說有很多人竹南車站的一樓Labby等外面的家人,她們看到一位媽媽,因為想讓她的家人快點進來,所以這位媽媽就看到警察沒空,就偷偷跑去按「鐵門」的開關,第一次沒按成,還跑去要按第二次。這時婆婆抓狂了,就請旁邊一位老太太幫助看著二個累到睡著的小孩,她就跑去抓著這個媽媽,大罵一 頓,這位媽媽還很無臉的說:「我沒有,我只是好奇按按看」,最後婆婆請警察把這位媽媽請走。

        各位,車站外面擠滿了人,這時如果鐵門一開,相信傷亡在所難免,婆婆就是想到嚴重性,所以當機立斷。結果看到這位媽媽的小孩,都已經是高中生了,為了讓自己的小孩可以早點進來,就不管別人的生死。再搖頭一次。


        這是很難得的一天,燈會很美。

        也希望人民們,可以跟下面這張圖一樣:


        C# to VB之BindAttribute

        http://msdn.microsoft.com/zh-tw/library/system.web.mvc.bindattribute_members.aspx,我們需要在ASP.NET MVC中使用Bind屬性來限制欄位。

        ASP.NET MVC C# Bind屬性
        public ActionResult ComplexModelBinding([Bind(Exclude="ID")]GuestbookForm form1)
        {
          // Your Code
        }
        
        C#來源:ASP.NET MVC 2 開發實戰

        ASP.NET MVC Visual Basic Bind屬性
        Public Function ComplexModelBinding(<Bind(exclude :="ID")> ByVal form1 As GuestbookForm) As ActionResult
          ' Your Code
        End Function
        

        在Visual Basic的System.Web.Mvc.BindAttribute在Action之中必須寫在ByVal之前。

        Reference:

        SSMS--加強SSMS Intellisense的利器

        我們在「SQL Server Management Studio加強工具之SSMS Tools Pack」介紹一套加強SSMS的工具,讓我們在撰寫T-SQL或使用SSMS更加方便。

        今天我們在介紹一套SQL Server Management Studio的Intellisense加強工具「SQL Complete Express」,它的功能很簡單,就是加強SSMS的Intellisense,讓SSMS的Intellisense能像Visual Studio一樣好用。

        這是官方的Demo gif,一目了解,我就不在多介紹了:

        SQL Complete - Advanced Intellisense in SQL Server Management Studio

        安裝後的差異,你可以從「Editions of dbForge SQL Complete」比較,SQL Complete Express + SSMS Tools Pack讓SSMS可用性大大提升,有那怎麼點武俠小說裡「雙刀合併」的感覺。

        更重要的是,SQL Complete Express及SSMS Tools Pack都是免費軟體,不拿來用實在是對不起自己的「手」。