免費電子書:Ubuntu Pocket Guide and Reference

不管你是 Ubuntu 的初學者、或完全沒用過 Linux 的使用者、或是半路出師的 Linux 專家,都可以參考這本 Ubuntu Pocket Guide and Reference 電子書,這本書提供所有許多 Ubuntu 的基礎知識、操作技巧,並且適用於 Ubuntu 8.04 與 8.10 版,我自己看了一遍,覺得這本書簡直就可以直接拿來當作 Ubuntu Linux 的訓練教材。

本書也有在 amazon 販售列印版(USD $9.94),但 PDF 下載版是完全免費的,內容完全一樣。

作者 Keir Thomas 算是個 Linux 界的知名作家,出過許多本熱銷的書籍,在去年也有寫過一本名叫 Ubuntu Kung Fu: Tips, Tricks, Hints, and Hacks 的書,包括許多使用密技,雖然我沒看過,但想必也是本不錯的書籍,在他的 "Ubuntu 功夫" 網站也有分享許多 "功夫秘笈",各位也可以上去看看。

相關連結

  

此文章由 will 發表於 2009/1/31 上午 12:37:41

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Linux

標籤: ,

收藏:

如何設定 VS2008 讓 HTML 在格式化排版時不要破壞版面

有許多網頁設計師還是習慣用 Table 進行網頁版面配置,但各位應該知道在 IE 下, 只要 HTML 的 <img> 標籤與表格儲存格 </td> 之間只要有一個空白字元出現,就會導致網頁版面跑掉「一點點」,有時後就是這「一點點」讓套版人員抓狂。

我們在 Visual Studio 中若使用「格式化文件(Format Document)」功能進行 HTML 排版,預設的情況下,就會導致網站破版,以致於我們很少在 HTML 格式下進行排版作業。

如下圖例是尚未格式化的表格 HTML 原始碼:

 尚未格式化的表格 HTML 原始碼

經過 Visual Studio 排版(Ctrl + E + D)後變成如下圖這樣,雖然比較漂亮,但在 IE 下看卻會破版:

經過 Visual Studio 排版後的HTML

我今天就教各位修改 Visual Studio 中的設定,讓你以後再自動格式化文件時不會再破壞版面了。

以下是設定的步驟:

1. 工具 –> 選項 –> Text Editor –> HTML –> Format –> Tag Specific Options

工具 –> 選項 –> Text Editor –> HTML –> Format –> Tag Specific Options

2. Client HTML Tags –> New Tag... 並新增 img 標籤(Tag)

Client HTML Tags –> New Tag...

New Tag -> img

3. 把 Line breaks 切換到 None 即可,你也可以看到 Preview 欄位的預覽效果。

Client HTML Tags –> img  –> Line breaks –> None

4. 接著修改 td 標籤的設定,並切換到 Before, after opening, and after closing 即可。

Client HTML Tags –> td  –> Line breaks –> Before, after opening, and after closing

---

設定完成後,就可以直接試著格式化文件看看。如下圖就是修改選項後進行格式化的結果:

修改選項後進行格式化的結果

以後就可以放心格式化文件了。

特別提醒

  • 對於已經進入 Production 階段的專案,切勿再使用「格式化文件」功能,以免造成 Code Reviewer 的困擾!
  

此文章由 will 發表於 2009/1/30 上午 12:46:20

永久連結 | 評論 (1) | 此文章的RSSRSS comment feed |

分類: Visual Studio | Tips

標籤: , , , ,

收藏:

ASP.NET MVC 開發心得分享 (1):開發流程篇

終於在這次春節長假開始有時間研究 ASP.NET MVC,雖然我在之前已經將所有 ASP.NET MVC Tutorials 文件看完了,也看懂了,但說實在的,自己開始「動手」寫的時候,還是一樣「很卡」,非常的不順手,文件、範例程式一樣到處翻,好在我平時有整理學習資料的習慣,資料找起來有比較順手一些,建議各位在研發時一定要有做筆記的習慣。

我整理了一下最近的思緒,對於一個全新的 ASP.NET MVC 專案,應該會有以下流程:

  1. 準備好網站雛形頁面(Prototype)或所有網站之靜態版型頁面
    • 透過頁面元素進行資料來源分析
      • 設計資料庫結構、表格、欄位、關連
    • 分析出所有需要的 Controller, Model, View, MasterPage, UserControl, Html Helpers
      • 可於 Prototype 加註相關說明
  2. 資料庫必須先準備好
    • 需將表格、關連、檢視表、預儲程序都先建立好
    • 資料庫中最好包括測試資料,以方便套版測試之用
  3. 新增 ASP.NET MVC 專案
  4. 建立 Model ( LINQ to SQL )
    • 先透過 LINQ to SQL Designer 介面完成 ORM 物件對應
    • 再補充所有表格的 partial class 的撰寫,並將資料驗證與商業邏輯都加上
  5. 建立 Controller
    • 將共用的 Code 寫到 BaseController 去
      • 建立共用的 DataContext 物件
      • 各 ViewPage / ViewMasterPage / ViewUserControl 共用的 ViewData 物件
    • 再將原先規劃的 Controller 全部建立
    • 再將所有 Controller 應該出現的 Action 全部建立好
    • 適當的套用自訂 Action Filters,包括 HandleError, OutputCache, Authorize
    • 接著開始分工,將不同的 Controller 指派給不同的人進行開發
  6. 建立 View
    • 依照 Controller 的分工,各自將各自的 View 進行套版
    • 在套用 ASP.NET 內建的 SiteMap 時,要注意 securityTrimmingEnabled 屬性是不支援的,若選單會依據權限不同而顯示不同的選單項目,需自行修正。
      參考文章:Providing Website Navigation with SiteMaps
    • 盡可能的用 Strong-Typed 的方式開發,降低 Runtime Error 的風險
    • 適當的設定 web.config 預設匯入一些在 View 中常用的命名空間,例如:ProjectX.Models
      參考文章:ASP.NET 如何預設匯入指定的命名空間(Namespace)
    • 適當的將在不同頁面中重複出現的元素做成 User Control
    • 若輸出的資料包括特殊的表單元素時,建議做成 Html Helper 擴充方法,以簡化頁面邏輯!

這些流程日後應該會再補充,我會更新在同一篇文章內。

  

此文章由 will 發表於 2009/1/29 上午 12:33:24

永久連結 | 評論 (9) | 此文章的RSSRSS comment feed |

分類: ASP.NET MVC

標籤:

收藏:

ASP.NET 網站部署可考慮使用 Web Deployment Project

Web Deployment Project (WDP) 是一個在 Visual Studio 外掛上去的專案類型,主要目的是提供你將現有 ASP.NET Website Project (網站專案) 或 ASP.NET Web Application Project (網站應用程式專案) 另一種部署網站的方式,讓你開發的網站在建置、封裝、部署時擁有更多的選項,也讓網站部署更加方便與自動化。

對於有些人來說也許不瞭解 ASP.NET 網站專案ASP.NET 網站應用程式專案 的差別,建議可參考黑大Web Site Project vs Web Application Project 文章。

若我們有一個 ASP.NET Website 專案,並且希望將網站預先編譯後部署到正式主機的話,若不靠 WDP 我們會用 VS2008 內建的 Publish Web Site ( 發佈網站 ) 功能 (如下左圖),但缺點就是會輸出一大堆組件,事實上對部署網站來說是一大負擔,你總不希望每次部署網站都要砍掉所有資料再重新上傳吧。

Publish Web Site ( 發佈網站 ) Add Web Deployment Project

這時你就可以改用 Web Deployment Projects,但與 Publish Web Site 的操作方式不太一樣,Publish Web Site 是直接將網站發佈到一個目錄下,但 Web Deployment Projects 必須先新增一個獨立的 WDP 專案到方案中 (加入方式如上右圖),然後先預先設定組件名稱(Assembly Name)與網站建置時的輸出目錄

Add Web Deployment Project

接著就可以直接編譯網站或開啟 WDP 專案的屬性設定頁面進行設定。

Build Web Deployment ProjectWeb Deployment Project Property Pages 

對於屬性設定頁面每個欄位的說明,大多都很容易看懂,至於詳細的說明各位可到 Using Web Deployment Projects with Visual Studio 2005 查詢,這頁的說明一樣適用於 VS2008 的開發環境。

但對於一些 Property Pages 的選項,有些挺實用的設定我想特別說明如下:

Configuration Properties –> Output Assemblies

Web Deployment Project Property Pages :: Configuration Properties –> Output Assemblies

在 Output Assemblies 分類中有四個選項,預設是第一個選項,他可以將整個網站編譯成單一組件,其中包括所有頁面、使用者控制項、App_Code、App_WebReferences、...等目錄編譯的結果。但我比較中意第三個設定,他可以將所有跟使用者介面(UI)有關的頁面程式碼編譯到一個組件中,其他像是 App_Code、App_WebReferences、...等目錄都會個別建立不同的組件,這也意味著未來若有頁面程式更新時,你只需部署相關的組件即可,減少部署時網路傳輸的時間。

Configuration Properties –> Deployment

Web Deployment Project Property Pages :: Configuration Properties –> Deployment

在 Deployment 分類中的設定是我最愛的部分了,他可以讓你的自訂許多「部署」時的狀況,我先說明各參數的用途:

  • Enable Web.config file section replacement
    • 你可以在開發時用自己的 web.config 設定,但是在部署的時候動態替換成另一個 web.config 的內容,例如你可以替換 appSettings 或 connectionStrings 的內容。
    • 這裡可以設定 WDP 在進行編譯/部署時(按下 Build 等同於部署動作),在網站專案輸出根目錄下的 Web.config 是否有哪個區段(section)要被取代,如上圖設定,你的 ASP.NET 專案中也必須要有 appSettings_Staging.config 與 SQL2005_Staging.config 檔案才行。
    • appSettings_Staging.config 的內容範例如下,一個檔案只能包括一個區段的資料:
      <?xml version="1.0"?>
      <appSettings>
        <add key="test" value="TEST123"/>
        <add key="test1" value="TEST123"/>
        <add key="test2" value="TEST123"/>
        <add key="test3" value="TEST123"/>
      </appSettings>
  • Enforce matching section replacements
    • 由於你可以在開發環境自行定義 appSettings 的參數數量,有時後你自己加了一個參數後很有可能會忘了將「要部署的 web.config」也加上這個參數,勾選這個選項就可以避免這種人為疏失的發生。
  • Use external configuration source file
    • 若這個選項不勾選,原本的 web.config 內容就會依據 Enable Web.config file section replacement 的設定直接替換掉內容。
    • 若勾選了此選項,原本 web.config 內的區段就會被改成用外部載入的方式宣告,例如:
      <appSettings configSource="appSettings_Staging.config" />
  • Remove the App_Data folder from output location
    • 通常 App_Data 目錄用來儲存一些網站相關的資料,例如 SQLExpress 資料庫或其他檔案。而這些資料通常會在不同的執行環境有不同的資料,例如在測試機會有測試用的資料,在正式機會有正式版的資料,通常在部署的時候不會希望蓋掉這些資料。
    • 若勾選此選項,在進行編譯/部署時就會直接將 App_Data 目錄整個移除,讓你複製這些檔案過去時不用再手動刪除一遍。
  • Configuration
    • 可以讓你切換組態的模式,預設有 Debug 與 Release,你還可以額外自訂,例如:Staging ( 測試環境 )。
    • 意思也就是說,以上的設定可以設定好幾組,你只要切換不同的模式 (如下圖),就可以輸出不同執行環境的部署檔案,方便你將檔案複製到目的主機。
      切換不同的 Configuration 模式
    • 你也可以透過 Configuration Manager 定義不同的 Configuration 模式是否要編譯 Web Deployment Project 專案,例如說你在 Debug mode 應該就不需要建置 WDP 專案 (如下圖示),你可以設定 Release 或 Staging 時才需要編譯此專案,並自動產生部署檔案:
      透過 Configuration Manager 定義不同的 Configuration 模式是否要編譯 Web Deployment Project 專案

---

除了透過 Visual Studio 介面的設定外,事實上你還可以自行修改 Web Deployment Project 的專案檔( *.wdproj ),此專案檔其實就是透過 MSBuild 編譯執行的,因此這個設定檔可以讓你自訂所有要在編譯時需進行的任何自訂動作。

你可以自行修改 Web Deployment Project 的專案檔( *.wdproj ),此專案檔其實就是透過 MSBuild 編譯執行的

舉幾個例子來說:

  • 在 Staging 模式時,你可以修改 *.wdproj 自訂動作將建置完的檔案直接複製到 Staging 主機
  • 在建置之前(BeforeBuild)刪除一些部署時不必要的檔案或目錄 (例如 .svn 或 _svn 目錄)
  • 在建置完成(AfterBuild)後將所有 *.js 檔案壓縮,或將 jQuery 改由 Google AJAX Libraries API 載入

MSBuild 也是另一套超級強大的工具,對於每日建置(Daily Build)或需要開發流程自動化的人,一定要熟悉這套工具如何操作,以下是一些相關連結:

若要下載 Web Deployment Projects 可以參考以下網址:

相關連結

  

此文章由 will 發表於 2009/1/28 上午 12:09:36

永久連結 | 評論 (8) | 此文章的RSSRSS comment feed |

分類: Visual Studio | 介紹好用工具 | ASP.NET

標籤: , , ,

收藏:

介紹好用元件:ConsoleFx ( 處理命令列程式的函示庫 )

我之前寫 Console Program 時都是自己分析執行時輸入的參數,程式碼寫的也很醜,也很難 reuse,導致每次開發 Console Program 的程式碼都不太一致,有時後為了方便起見就亂寫一通,等累積多了之後就變的不好維護了。

最近在 CodePlex 發現了一個 ConsoleFx 專案,提供一套很方便的開發架構,他把一些在 Console 模式下開發 .NET 程式會處理的程式碼都寫好了,尤其是對參數、例外狀況、輸入資料格式驗證等常見的程式尤其方便,不但省去了許多開發時間,也提供了一致的開發架構,程式碼也會比較容易維護。

一般來說,若有用過指令列工具時,通常只要在指令後面加上 /? 就會出現使用說明,例如:

CLEAN [-dir:<directory mask>] [-file:<file mask>] [-norecurse] <base directory> 

當使用 ConsoleFx 時會用到一些專有名詞需先解說一下,這也是一般在寫 Console Program 時都應該到的東西:

  1. Switch
    • 如以上範例的 -dir-norecurse 就是所謂的 Switch。
    • 通常以減號(–)或以斜線(/)開頭。
    • 通常使用 Switch 的目的在於設定 Console Program 執行時的選項。
  2. Switch Parameters
    • 如以上範例的 <directory mask> 或 <file mask> 就是該 Switch 的參數。
  3. Parameters
    • 如以上範例的 <base directory> 就是該程式的主要參數。
    • 主要參數前面沒有接著 Switch,而是獨立存在的參數。

ConsoleFx 1.0 提供的功能與特色有

  • 輸入的參數可透過 Attribute 宣告與 Property 搭配使用
    • 將輸入的參數轉成屬性(Property)好處是可以在程式中可直接存取輸入參數,無須在讀取 params[] 字串陣列。
  • 可限制 switch 與 parameter 參數輸入的順序、格式、與參數出現的次數
    • 所有的設定都是透過 Attributes 宣告完成。
  • 輸入參數驗證(Switch validation)
    • 可透過設定屬性(Attribute)的方式設定 switch 的參數是否符合定義。
    • 目前可驗證的資料類型有:
      • Boolean
        • 驗證輸入參數是否為 Boolean 格式 ( True/False )
      • Integer
        • 可驗證輸入是否為數字
      • Lookup
        • 可提供一組字串清單,用逗號( , )分隔,用以驗證輸入的參數是否符合格式
          [LookupValidator(ParameterIndex.FirstParameter, "SHA1,MD5")]
      • Enum
        • 功能雷同於 Lookup 驗證類別,差別在於改以 Enum 型別定義可輸入的字串
        • 可指定一個 Enum 型別,讓輸入的參數必須符合 Enum 中定義的名稱
      • Path
        • 檢查輸入的參數是否回有效路徑
        • 也可檢查檔案、目錄是否存在
      • Regex
        • 可自訂 Regex 樣式比對輸入的字串
      • String
        • 可限定輸入字串的長度
    • 驗證的類型你還可以透過繼承 BaseValidatorAttribute 來擴充。
  • 錯誤處理(Error handling)
    • 當程式執行發生例外狀況(Exceptions),預設的錯誤訊息都集中在 ConsoleFx.CommandLineException.Message 類別中,你可以直接修改這個類別中的常數自訂顯示的錯誤訊息。
    • 另外你也可以在 Validator 類別中自訂當驗證失敗後的錯誤訊息。
  • 簡化常見的使用情境(Simplify common usage scenarios)
    • 只要繼承 ConsoleFx.ConsoleProgram 基底類別,就僅需覆寫(override)以下 2 個方法程式就會自動接受 /h 或 -h 參數(switch),若有加上 -h 就會自動執行 DisplayUsage() 方法,否則就會自動進入 ExecuteNormal() 方法執行:
      • public override void DisplayUsage()
      • public override int ExecuteNormal(string[] parameters)

目前來說 ConsoleFx Command Line Processing Library 線上所提供的文件並不多,但有點經驗的 .NET 開發人員應該很容易就可以從 Sample Code 中看懂他的使用方法。

最後分享一些使用心得

  • 初始 ConsoleFX 專案的基本流程如下:
    1. 新增 Console Application 專案
    2. 加入 ConsoleFX 參考
    3. 修改 Program.cs 的內容,範本如下:
      using ConsoleFx;
      using ConsoleFx.Validators;
      
      namespace ConsoleApplication1
      {
          [CommandLine(Grouping=CommandLineGrouping.DoesNotMatter)]
          class Program : ConsoleProgram
          {
              public static int Main(string[] args)
              {
                  return CommandLine.Run<Program>(args);
              }
      
              public override void DisplayUsage()
              {
                  ConsoleEx.WriteLine("ConsoleApplication1.exe [/SwitchA:<switch_parameter>] [<param1>] [...]");
              }
      
              string _switch_a;
      
              [Switch("SwitchA", ShortName = "a", MaxOccurences = 1, CaseSensitive = false, Order = 1)]
              [SwitchUsage(ProgramMode.Help, SwitchUsage.NotAllowed)]
              [SwitchUsage(ProgramMode.Normal, SwitchUsage.Optional)]
              [StringValidator(ParameterIndex.FirstParameter, MinLength = 1, MaxLength = 10)]
              public void SwitchA(string[] parameters)
              {
                  if (parameters.Length > 0)
                  {
                      _switch_a = parameters[0];
                  }
              }
      
              public override int ExecuteNormal(string[] parameters)
              {
                  return 0;
              }
          }
      }
      注意:ConsoleFX 中的 Main 回傳值是 int 喔。
  • 所有的 switch 選項參數要套用必須用公開方法(public method)實做。
    [Switch("algorithm", ShortName = "a", MinParameters = 0, MaxParameters = 1)]
    [SwitchUsage(ProgramMode.Help, SwitchUsage.NotAllowed)]
    [SwitchUsage(ProgramMode.Normal, SwitchUsage.Optional)]
    [LookupValidator(ParameterIndex.FirstParameter, "SHA1,MD5,SHA256,SHA384,SHA512")]
    public void AlgorithmSwitch(string[] parameters)
    {
        if (parameters.Length > 0)
            _algorithm = parameters[0];
    }
  • Parameters 一般參數可套用在公開屬性(public property)上,以強型別的方式運作。
    [ParameterProperty(ProgramMode.Normal, 1)]
    [PathValidator(ProgramMode.Normal, PathType=PathType.Folder, CheckIfExists=true)]
    [StringValidator(ParameterIndex.FirstParameter, MinLength = 1, MaxLength = 100)]
    public string Path
    {
        get {
            return _path;
        }
        set {
            _path = value;
        }
    }
  • ExecuteNormal() 若正常執行回傳值應為 0,若有錯誤發生應回應非 0 的值。
  • ExecuteNormal(string[] parameters) 傳入的 Parameters 不會有 switch 的任何參數。
  • 如果你有部分參數 Binding 到 Property 中,這些參數還是會以 string 的型態傳到 ExecuteNormal() 中。
  • ConsoleFX 專案有兩種執行模式(ProgramMode):
    • ProgramMode.Normal
      • 正常執行 Console Application 的情況。
    • ProgramMode.Help
      • 進入/顯示 Help 選單時的模式。
  • ConsoleFX 專案的執行模式(ProgramMode)可自訂擴充,例如你若要從 Console Application 啟動 Windows Form 的程式時,可以自訂一個 Mode 叫做 ProgramMode.Windows 。

相關連結

  

此文章由 will 發表於 2009/1/27 上午 09:37:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net

標籤: , ,

收藏: