網頁

jQuery - Selectors (8) Form - 表單選擇器

jQuery表單選擇器簡介

表單(form)為網頁與使用者互動最主要的元素,而表單選擇器可讓我們可以得知目前表單的狀態,進而進行相關處理。

jQuery表單選擇器速查表

jQuery表單選擇器
選擇器 說明 範例
:button 選擇button元素和type="button"的input元素 $(':button')
:checkbox 選擇type="checkbox"的input元素 $(':checkbox')
:checked 選擇已勾選(checkbox)或已選擇(radio)的input元素 $(':checked')
:disabled 選擇設定disabled屬性的input元素 $(':disabled')
:enabled 選擇未設定disabled屬性的input元素 $(':enabled')
:focus 選擇目前焦點所在的元素,注意,不限於input元素 $(':focus')
:file 選擇type="file"屬性的input元素 $(':file')
:image 選擇type="image"屬性的input元素 $(':image')
:input 選擇input、textarea、select、button元素 $(':input')
:password 選擇type="password"屬性的input元素 $(':password')
:radio 選擇type="radio"屬性的input元素 $(':radio')
:reset 選擇type="reset"屬性的input元素 $(':reset')
:selected 選擇所有option元素裡被選擇項目 $(':selected')
:submit 選擇button元素與type="submit"屬性的input元素 $(':submit')
:text 選擇type="text"屬性的input元素 $(':text')

jQuery - Selectors (6) Child Filter - 後代過濾器

jQuery後代過濾器簡介

由名稱來看,可以很容易了解此過濾器主要是處理一些後代元素選擇動作。我們在基礎過濾器(Basic Filters)中介紹過:even與:odd,這兩個過濾器常使用於表格的處理,但如果今天我們以三的倍數來計算呢?例如,第3,6,9…行進行處理呢?怎麼做?

jQuery後代過濾器速查表

jQuery後代過濾器
過濾器 說明 範例
:first-child 選擇所有父元素下的第一個子元素 $(':first-child')
:last-child 選擇所有父元素下的最後一個子元素 $(':last-child')
:nth-child(index/even/odd/equation) 選擇元素集合裡第幾個指定的子元素 $(':nth-child(1)')
:only-child 選擇所有父元素下只有一個子元素 $(':only-child')
基本動作有第一個後代元素,最後一個後代元素,只有一個後代元素,n倍數的後代元素,比較難懂的只:nth-child這一個後代過濾器。

jQuery - Selectors (5) Attribute - 屬性過濾器

jQuery屬性過濾器簡介

屬性過濾器針對HTML元素裡的屬性及屬性值來進行過濾與選擇的動作。例如,<a href="http://blog.kkbruce.net">KKBruce Blog</a>,我一天我想幫整個網站裡的連結加上target屬性,怎麼加?打開編輯器,一頁一頁慢慢看慢慢加?用搜尋目錄來取代?

jQuery屬性過濾器速查表

jQuery屬性過濾器
過濾器 說明 範例
[name|="value"] 選擇指定屬性等於字串值或以該字串為前綴的值(以字串後跟著一個連字符號"-")的元素。
這個過濾器是引入CSS規範來處理語言屬性。
$('[attribute|=value]')
[name*="value"] 選擇指定屬性包含特定字串值,不論在字串中的位置 $('[attribute*=value]')
[name~="value"] 選擇指定屬性包含特定字串值,字串用空格分隔 $('[attribute~=value]')
[name$="value"] 選擇指定屬性的字串是以字串值結尾
這個比較區分大小寫。
$('[attribute$=value]')
[name="value"] 選擇指定屬性的字串等於字串值 $('[attribute=value]')
[name!="value"] 選擇沒有指定屬性的元素,或指定屬性的字串不等於字串值 $('[attribute!=value]')
[name^="value"] 選擇指定屬性的字串是以字串值開頭 $('[attribute^=value]')
[name] 選擇所有具有指定屬性的元素,該屬性的字串可以是任何值。 $('[attribute]')
[name="value"][name2="value2"] 選擇符合所有指定屬性過濾器的元素 $('[attribute1=value1][attribute2=value2]')
attribute是一個屬性名稱,value是一個字串值,字串值的單雙引號(""或'')是選擇性,例如,$('[attribute|=value]')或$('[attribute|="value"]')都是正確的。

jQuery - Selectors (7) Visibility Filter - 能見度過濾器

jQuery能見度過濾器簡介

網頁中並不是所有元素都是可見的(或顯示出來的),例如,<script>、<style>,有一些是刻意隱藏起來的,當我們想要找出被隱藏的元素或目前UI上顯示的元素,就可以使用能見度過濾器來進行過濾選擇。

jQuery能見度過濾器速查表

jQuery能見度過濾器
過濾器 說明 範例
:hidden 選擇所有隱藏的元素 $(':hidden')
:visible 選擇所有可見的元素 $(':visible')

jQuery - Selectors (4) Content Filters - 內容過濾器

jQuery內容過濾器簡介

內容過濾器作用在找出元素內是否含有內容或關係,以產生所需要集合元素。

jQuery內容過濾器速查表

jQuery 內容過濾器
過濾器 說明 範例
:contains(text) 選擇包含指定文字(text)的元素。 $(':contains(text)')
:empty 選擇沒有子元素的元素(包含文字節點)。 $(':empty')
:has(selector) 選擇包含有selector的selector。 $(':has(selector)')
:parent 選擇包有父子元素的元素(包含文字節點)。 $(':parent')
:empty與:parent可以說是相反關係,:empty要沒有子元素,:parent要有父元素。而:has()的描述比較繞舌,看下面實例比較好理解。

讀書心得 - 三個傻瓜(3 Idiots)與瀟灑走一回(Zindagi Na Milegi Dobara)

這是最近一年的事,在親戚朋友的介紹下,接觸了印度的電影,之前在網路上看過不少寶萊塢(英語:Bollywood)的搞笑片段。雖然,之前有看過《貧民百萬富翁》(Slumdog Millionaire),好看,但是沒有感動,直到看了《三個傻瓜》與《瀟灑走一回》這兩部印度電影,才覺得,印度電影也可以很有程度,很有內容。

會把這兩部電影放在一起,是因為它們都有些相似之處,都是三位男主角,三位好友,三個故事。

關於《三個傻瓜》與《瀟灑走一回》走一回的內容,我不太想多談內容,反正,我推薦一看。看完的心得,就四個字:「不要後悔。」《三個傻瓜》裡有三個不要後悔故事,《瀟灑走一回》裡有三個不要後悔故事,兩部加起共有六個不要後悔故事。

人生很難沒有遺憾,遺憾留下的,是給了你正面或負面的成長,這很重要。遺憾-正面,讓你沉思,讓你能不斷成長,突破,在下次重大決定時,做更正確的決定,慢慢修正你人腳步。遺憾-負面,慢慢讓你成為一位從一支手指指別人,變成五支手指、十支手指指別人。做錯事,會痛。代表你正在成長了,你不一樣了。做錯事,無感。沒有神經,還是人嗎?當株植物應該不錯。

以下是我 Email 裡的一封信,我想轉貼當結束:

一位醫生緊急地被醫院召喚回去進行一項手術,
醫生發現男孩的父親已經在大廳等候醫生了。

男孩的父親一看到他就喊道:「你為什麼要那麼遲才來呢?
難道你不知道我兒子的生命處於危險之中嗎?你到底有沒有醫德的喔!」

醫生笑著說: 「對不起...我不在醫院...我一接到電話的當下就已經第一时间趕過來了,
而現在...我希望你冷靜下來...這樣我才可以完成我的工作。」

男孩的父親氣憤喊道: 「平靜下來?如果你的兒子現在在這個房間!
你會冷靜下來嗎?如果你自己的兒子在這個房間去世的話...你會怎樣呢?」

醫生再次笑著回答說:「 塵歸塵...土歸土...醫生不能延長生命...
可是您可以幫忙您兒子向上帝祈求...求上帝的恩賜讓醫生成功完成這項手術。」

男孩的父親喃喃自語的說:「不是自己的兒子當然說的那麼簡單囖!」

手術花了幾個小時後,醫生走出了手術房後說道:「 感謝上帝!你的兒子得救了!」
醫生還沒等待父親的答復,就快步的離去。
離去的同時也對男孩的父親喊道:「 你有任何問題...就請問護士吧!」

當男孩的父親遇到護士時問道: 「他為什麼如此囂張!他不能等待一段時間...讓我問我兒子的狀況嗎??? 」
護士回答時眼淚滑下了她的臉:「他的兒子昨天在交通事故中去世了...他在處理他兒子身後事時,
被我們要求緊急召喚回來幫忙你的兒子動手術...而現在他救了你兒子的生命,.
他趕著離開是因為要去完成他兒子的葬禮。不知你還夫復何求?

Exchange出現'MAPI 工作階段 ... 超過 "Session" 之 32 物件最大值"治標之法

有使用者反應,突然無法連上 Exchange,連上 Exchange 查看,發現到

超過 Session 之 32 物件的最大值
圖一:超過 Session 之 32 物件的最大值
Log 訊息也有:

事件類型: 錯誤
事件來源: MSExchangeIS
事件類別目錄: 一般
事件識別碼: 9646
日期: 2012/3/23
時間: 下午 12:48:44
使用者: N/A
電腦: ???
描述:
Mapi 工作階段 "/o=???/ou=Exchange???/cn=Recipients/cn=???" 超過了類型 "session" 之 32 物件的最大值。
上網查了些資料,都是以調整機碼來解決。我不太想動機碼,而且這只是個案。不過,到是有看到相似之處,這些人是都會快速的切換"網路",一下外網、一下內網、一下有線、一下無線。

我使用了個治標之法,利用中午大家外出用餐時間,【解下儲存區】等【登入】內的 Session 被清空,再【掛上儲存區】。

OK,暫時結案。

jQuery - Selectors (3) Basic Filters - 基礎過濾器

jQuery基礎過濾器簡介

基礎過濾器,是用來進行一些元素過濾之用,雖然名稱上是Basic(基礎、基本),也就是實用性非常的高,才會放在此一分類中,記得,越基礎的東西越重要。

jQuery基礎過濾器速查表

jQuery基礎過濾器
過濾器 說明 範例
:animated 選擇所有正在執行動畫效果的元素 $(':animated')或.filter(":animated")
:eq(index) 等於索引值的對應的元素,索引從0開始 $(':eq(index)')或$('Selector').eq(index)
:even 選擇奇數索引值對應的元素,元素1,3,5,...,:even會選擇元素1與元素3,即索引值的0,2,... $(':even')或.filter(':even')
:first 選擇第一個符合的元素 $(':first')或.filter(':first')
:gt(index) 大於索引值的對應元素,索引從0開始 $(':gt(index)')或$('Selector').slice(index)
:header 選擇所有h1,h2,h3,h4,h5,h6元素 $(':header')或.filter(':header')
:last 選擇最後一個符合的元素 $(':last')或.filter(':last')
:lt(index) 小於索引值的對應元素,索引從0開始 $(':lt(index)')或$('Selector').slice(0,index)
:not(Selector) 排除selector內元素 $(':not(selector)')
:odd 選擇偶數索引值對應的元素,元素2,4,6,...,:odd會選擇元素2與元素3,即索引值的1,3,... $(':odd')

基礎過濾器提供了特定規則的過濾條件,讓我們很方便快速找到我們想要的元素,以進行處理。例如,第一個元素、最後一個元素、反向選擇元素、奇數元素、偶數元素、索引值index元素等。

ASP.NET Web API 心得筆記 (1)

ASP.NET Web API 是一個框架(framework),能讓你在 .NET Framwork 之上架設 HTTP 服務 (HTTP Services)。ASP.NET Web API 是 .NET Framework 上建置 RESTful 應用程式的理想平台。

在 Julie Lerman's 的 How I see Web API 一文中,用了一張圖來簡明說明 Web API:

比較 WCF 與 Web API
圖一:比較 WCF 與 Web API from thedatafarm.com
註:以下內容,會使用 Visual Studio 11 Beta 來實作,因 VS 11 還未有正體中文版,與 VS 11 相關步驟會使用英文。另外,可順便先熟悉 VS 11 開發環境。除簡化的圖示不談,整體開發功能是更上一層樓。

建立 Web API 專案


開啟 VS 11 → Start → New Project → Installed → Templates → Visual Basic → Web → ASP.NET MVC 4 Web Application → 在 Name 輸入 "HelloWebAPI" → OK

選擇 ASP.NET MVC 4 專案
圖二:選擇 ASP.NET MVC 4 專案
在 New ASP.NET MVC 4 Project 裡選擇 Web API 然後點擊 OK。

選擇 Web API 樣版
圖三:選擇 Web API 樣版
這裡有個有趣的地方。
之前,我在接觸 ASP.NET MVC 3 時,有點想去學 Razor 語法,因為大家一直強調 Razor 的好處,也讓我小小心動,不過,每一次接觸這種 v1 東西總是讓我碰壁,在 Visual Studio 2010 + Visual Basic 2010 + MVC 3 + Razor 環境裡,Visual Studio 2010 當的不像話,隨便打個 @html. 就可以當好幾次,後來還是把心思放在 MVC 上就好。但在 Visual Studio 11 裡中,VB中 Web API 只的支援 Razor,資料沒看錯的話,Visual Studio 11中 是 Razor v2。目前還沒有去 View 裡認真玩,簡單打一些 keyword 是沒有之前當掉情況,未來有 VB for Razor 的心得,再寫上來。

加入 Model

Model 是在應用程式中使用物件(object)方式來表現資料。ASP.NET Web API 能自己序列化(serialize) 你的 Model 成為 JSON、XML 或其他資料格式,然後寫入這些已序列化資料到 HTTP 回應訊息 (response message) 的主體 (body) 中。只要用戶端 (client) 能讀取序列化格式,它就能反解析序列化成為物件。許多用戶端都能同時解析 XML 與 JSON。而且,用戶端可以在 HTTP 請求訊息 (request message)的 Accept header 裡直接設定那種格式 (JSON, XML, Other) 是要接受的。

有沒有很心動?我們先加入一個 Products Model。

jQuery - Selectors (2) Hierarchy - 階層選擇器

jQuery階層選擇器簡介

當我們所要選擇的元素,含有一定的階層關係時,就非常合適使用階層選擇器,例如,<ol>與<li>元素,<ol>一定是<li>父層,<li>一定是<ol>的子層,<li>與<li>之間是平輩關係。又例如,假設我們發表文章,文章是包含在一個<div>元素裡,此<div>元素的id名稱為Post,我想要針對此<div>元素的每一段落(p元素)進行CSS調整,因為我不知道文章本文會有多少段落,如果要使用基礎選擇器,將難以撰寫!DOM本身就是非常結構化、階層化,利用階層選擇器,我們可以很簡單使用如$('div.Post p')或$('div.Post > p')來選擇特定區域裡或符合我特定階層條件的元素來進行相關處理。

jQuery階層選擇器速查表

jQuery階層選擇器
選擇器 說明 範例
parent > child 重點在">"符號。父子階層,上下兩層關係,一個父能有多個子。回傳多個子元素,只包含第一層。 $('ul.topnav > li')
ancestor descendant 重點在兩選擇器之間的"空格"。祖孫階層,上下多層關係,一個祖能有多個孫(孫、曾孫、太孫…),且孫不限多少層。回傳多個孫元素(descendant)。 $("form input")
prev + next 重點在"+"符號。前後階層,前後兩層關係,似類排隊,一前一後的關係,記得"+"是"緊接著"下一個。回傳符合next元素。 $("label + input")
prev ~ siblings 重點在"~"符號。兄弟階層,平輩、同輩階層關係,左右關係,記得"~"像"水平"、"平行線"。回傳多個兄弟元素(siblings)。 $("#prev ~ div")

這裡介紹的四個階層選擇器">"、"空格"、"+"、"~",都是重要的基礎選擇器延伸應用,必須了解清楚。在使用階層選擇器時,要小心考慮進入點,我們通常要想要進入點之後的元素,一個清楚的進入點,可以讓程式運作上更有效率。

jQuery - Selectors (1) Basics - 基礎選擇器

jQuery基礎選擇器簡介

以下是最基本,也是jQuery裡最簡單也最重要的一節,沒有了它,jQuery 可以說無法作運。所有的jQuery都是以它為開頭。

jQuery基礎選擇器速查表

jQuery 基礎選擇器
選擇器 說明 範例
* 選擇所有元素。 $('*')
.class 選擇所有符合class的元素。 $('.PostFont')
element 選擇所有符合標籤名稱(Tag name)的元素。 $('div')
#id 選擇一個符合id屬性的元性。 $('#NavBar')
selector1, selectorN, ... 選擇指定的元素。 $('div,p.PostFont,#NavBar')

除了*選擇器外,其他都是非常常用的選擇器,一定要好好了解。

jQuery - 入門語法基礎教學筆記

jQuery非學不可

jQuery 在很短的時間內,不只有爆紅,更成為顯學。重更要的是,微軟更直接宣布 jQuery 與 .NET Framework 的緊密結合,不但讓 jQuery 直接內建於Visual Studio 2010,下一代的Visual Studio 11 更是完完全全採用 jQuery 來發展,像 ASP.NET MVC 4 除 jQuery 外,也直接採用 jQuery Mobile 來發展相關 Mobile UI。

由以上來看,以前jQuery你可以要學不學。但現在是非學不可。

我剛觸 jQuery 時,版本是 jQuery 1.2.6,但接下來的 jQuery 1.3.x、jQuery 1.4.x、jQuery 1.6.x,到目前最新的jQuery 1.7.x,改變很多。

我想整理一份 jQuery 簡易入門語法資料表,以便隨時自我查詢,這份資料表定義在入門語法及範例查詢,基本架構如下。

jQuery 入門語法基礎教學架構

每一篇會以一個小主題為主,分為:
  • 前言:簡單說明此小主題的內容
  • 表格:將此小主題的 jQuery語法整理成一分小表格
  • 範例:為簡省時間,我想要直接複製 jQuery.com 範例,複製範例不同處,我會加說明及註解,讓大家快速了解。最好是有什麼靈感,可以自行創作!
  • 歷程:因為jQuery改版速度不慢,這裡算是半強迫"Me"要去"Update, Upgrade"腦中相關資訊,不要引用的是 jQuery 1.7.x,但寫的是jQuery 1.2.6的程式碼
各位想要測試 jQuery 範例,我推薦使用 Darkthread Mini jQuery Lab,我有想過使用另一套 jsFiddle 來儲存範例,讓大家直接線上看執行結果,但jsFiddle對於"複製、貼上"很 XD,還是黑大的 Mini jQuery Lab 方便許多。

最後,希望各位針對撰寫的內容上不吝指教。

Tool - 在IE, Firefox, Chrome 如何快速切換搜尋引擎(Search Engine)

前面「更換IE, Firefox, Chrome的預設瀏覽器為DuckDuckGo」為大家介紹了 duckduckgo 這一個 Search Engine,也為大家介紹如何在 IE, Firefox, Chrome 加入且設定為預設的搜尋引擎。發現有個問題,雖然把 Region 設定為 Taiwan,但你能發現,它的資料庫裡的非華語(泛指中文)資料比較好,所以有時我們想切換回使用 Google 或 Bing 等 Search Engine,怎麼做?

FireFox 切換搜尋引擎最方便

Firefox 雖然不像 IE 或 Chrome 已經把【網址列】與【搜尋列】整合在一起,但未整合的好處理就是選取切換方便。

Firefox Change Search Engine
圖一:Firefox Change Search Engine

IE 切換搜尋引擎還算方便

目前新版本 IE 都已經整理【網址列】與【搜尋列】,如果你想直接切換搜尋引擎,有二種方法。

.NET Framework 垃圾收集(garbage collection)初了解

感謝 91哥提供的兩篇文章,讓我更加了解垃圾收集 (garbage collection,GC),看完感覺,越自動化感覺不到它的存在越是重要


稱之為入門篇,因為他寫的真的很好懂,以下實 C# 轉 VB,再加上自己的一些註解。

Module Module1

    Private Sub GenerationDemo()
        ' 了解 GC 最大為 0, 1, 2 三層
        Console.WriteLine("最大 GC 代: {0} ", GC.MaxGeneration)

        ' Heap 新增一物件
        Dim obj As New GenObj("Generation")

        ' 顯示目前物件在 GC 第幾層
        obj.DisplayGeneration()

        For i As Integer = 1 To GC.MaxGeneration
            ' 進行 GC 收集動作
            GC.Collect()
            ' 因為 obj 沒被回收
            ' 每次會被拉高一層代
            obj.DisplayGeneration()
        Next

        obj = Nothing

        For i As Integer = 0 To GC.MaxGeneration
            ' 強制立即執行層代零至指定層代的記憶體回收。
            GC.Collect(i)
            ' 暫止目前的執行緒,直到處理完成項佇列的執行緒已經清空該佇列為止。
            GC.WaitForPendingFinalizers()
        Next

        Console.WriteLine("Demo Stop.")
    End Sub

    Sub Main()
        GenerationDemo()
        Console.ReadLine()
    End Sub

End Module

Class GenObj
    Private _name As String

    Sub New(name As String)
        name = _name
    End Sub

    ' 回傳目前物件所在 GC 第幾層
    Sub DisplayGeneration()
        Console.WriteLine("我在第 {0} 層", GC.GetGeneration(Me))
    End Sub
End Class

整個過程如同程式流程一樣:
  1. 取得目前 GC 層數
  2. 新增一物件,並顯示此物件目前所在 GC 層數
  3. 進行 GC 回收,因為每次 GC回收 obj物件沒有消失,代表重要性需要提升,加高一層級
  4. 設定 obj 為 Nothing
  5. 執行 GC 回收,GC 發現 obj 為 Nothing,回收此資源

此篇說明比較學術,但可以更細部了解整個 GC 運作,真的是大內高手專欄。

個人心得

我覺的看完第一篇就很有滿足感,就我在 Web Developer 的工作內容上,我們一般只用用 Close 或 Dispose ,很少會去手動碰 GC 的內容。不過,能更深一層的了解 .NET Framework 是有其必要性。

Tool - 更換IE, Firefox, Chrome的預設搜尋引擎為DuckDuckGo

話說,在搜尋世界裡,有一位新起之秀 duckduckgo,你可以直接去測試一下,我個人是對於結果滿意。

那我們怎麼把它當成預設的 Search Engine 呢,在 Firefox 與 Chrome 裡很簡單:
Firefox 與 Chrome 都有現成的外掛可以使用,Chrome 外掛直接當成直接預設 Search Engine,我們進行以下設定:

設定 DuckDuckGo 為 Chrome 預設搜尋引擎

按【功能表 → 選項】找【搜尋 → 管理搜尋引擎】:

Chrome 管理搜尋引擎
圖一:Chrome 管理搜尋引擎
會有長長一串,可以拉至最下方「新增搜尋引擎」,依順序輸入:
  1. DuckDuckGo
  2. duckduckgo.com
  3. http://duckduckgo.com/?q=%s
最後一項輸入之後按【Enter】,即可選擇 DuckDuckGo 為預設搜尋引擎,

新增 DuckDuckGo 為預設搜尋引擎
圖二:新增 DuckDuckGo 為預設搜尋引擎
預設 DuckDuckGo 為搜尋引擎
圖三:預設 DuckDuckGo 為搜尋引擎
另外,我們在 DuckDuckGo 可進行一些小調整,在【搜尋欄】旁有一紅色【More】Button,點擊後選擇【Settings】,

Tool - Network Pinger 網管好幫手

在前面「Taiwan Taiwan, I Love You」提過,我幫一個波蘭葡萄牙的程式設計師翻譯一個軟體,看來語系的問題也搞到他很頭大,不太想再搞下去了,未來他可能只使用線上翻譯,來翻翻 UI 上的文字 (如果你在軟體內看到怪怪的翻譯,那不是我翻的 @_@)。不過這也給我了一個很好的經驗,現行「中文」大概分兩類,正體中文及簡體中文,而正體中文又分兩小類,港澳使用與台灣使用,所以大概就是以下這樣:
  • 正體中文 - 台灣
  • 正體中文 - 香港
  • 簡體中文 - 大陸
此軟體含「正體中文-台灣語系」已經放上去他的官網「Network Pinger」。
軟體名稱:Network Pinger
軟體大小:1.50 MB
軟體版本:1.0.1.0
發佈日期:2012/3/13
官方網站:http://www.networkpinger.com

Network Pinger 簡介

Network Pinger為免安裝解壓縮即可使用的工具。從名稱上,我們可以很簡單看出此套軟體在做二件事,一是 Network,二是 Ping。

Network Pinger 主畫面
圖一:Network Pinger 主畫面
Network Pinger幫我們整合許多 Network + Ping 類的工具,在主畫面上【工具】裡提供了【Ping】【Trace Route】【Port Scan】【Whois】【WMI Query】【Resolve】等功能,例如我們輸入【blog.kkbruce.net】然後按 Ping,

Network Pinger - Ping 程式畫面
圖二:Ping 程式畫面
不是只像 cmd.exe 裡的 Ping,我們還可以【暫停】【重新開始】…,另外最突出的就是統計圖表,不只能看,也能將結果【儲存】下來。這對我們網管或 MIS 是很有幫助的,你拿長長一串的 cmd.exe 的 ping 結束給人家看,誰理你?

再來,你可以從結果處理畫面(即黑白畫面)裡,去選擇一個 IP 或 Domain,然後你就能發現上方小工具圖有很多可以使用。

選擇 Domain 或 IP
圖三:選擇 Domain 或 IP
工具圖
圖四:工具圖
功能表
圖五:功能表
在主畫面【工具】區的功能,都是差不多的操作模式。

邊做邊學IIS 7.5系列影片學習心得筆記

我是當選 Microsoft Most Valuable Professional (MVP, 微軟最有價值專家) 之後才知道有區分為 IT Pro 與 Developer,我競選的是 ASP.NET/IIS 分類( Developer ),事後才知道,此ASP.NET/IIS 分類競爭激烈,但這裡我有個問題,IIS 本身應該算 IT Pro 還是 Developer 管理呢?

Developer 寫完 Code,然後佈署至 IIS。ASP.NET Code / ASP.NET MVC Code 必須運作在 IIS 之下,這沒有問題。但 Developer 是否需要去了解 IIS 的運作及設定?還是另有 IT Pro 的人去進行管理?(見Plurk討論)

以上問題,見人見知,或是見公司見知。像我就是校長兼打鐘,我個人的見解是,Developer 雖然不用去非常了解整個 IIS 運作設定,但對於 IIS 還是要有基礎,有時問題不在 Code 上面,但 Developer 只會往 Code 上去找問題,到是常見的情況。

以下為看完「邊做邊學IIS 7.5系列」 心得筆記。

講師:王寧疆 老師
投影片下載:IIS 7.5 系列教學

IIS 7.5 系列教學影片(1) 筆記

了解為什麼要改使用 IIS 7.5,IIS 7.5 與 IIS 6 的差異。反正改用 IIS 7.5 就對了,就算在不支援 IIS 7.5 的環境,也可以改使用 IIS 7.5 Express 來測試,例如,在 Visual Studio 2008 / Visual Studio 2010 原本的【ASP.NET 程式開發伺服器】是 IIS 6.0 架構,就應該改使用 IIS 7.5 Express 來執行及測試。

IIS 7.5 系列教學影片(2) 筆記

此篇,你可以學習到以下主題:
  • appcmd
    讓我們可以透過下指令方式來管理 IIS。
    在【命令提示字元】(需系統管理員帳戶)請進入 cd %windir%\system32\inetsrv ,輸入 【appcmd.exe】及相關參數即可。
  • URL Rewrite
    讓我們可以改寫網址規則,例如,原始為 Order.aspx?CusId=ADSF,改寫為 Order/CusId/ADSF。
  • IIS 7.5 Express 介紹
  • 預設文件
    了解如何設定預設文件。
  • 功能委派
    讓我們的伺服器管理員,可以開放或關閉特定功能給網站或其他人。
    設定有三種:
    【未委派】:等於不能讀取/寫入。
    【讀取】:只能讀取。
    【讀取/寫入】:可讀取與寫入。除此項之外,未委派與讀取如有寫入動作,都會產生錯誤。
  • Web Deploy
    可使用【IIS 匯出/匯入】與【MsDeploy.exe】,
    【MsDeploy.exe】 目前我電腦中已經有V3:
    V2 Path:C:\Program Files\IIS\Microsoft Web Deploy
    V3 Path: C:\Program Files\IIS\Microsoft Web Deploy V3

IIS 7.5 系列教學影片(3) 筆記

這一篇我們習學到如何利用 IIS 來做活動分析。這部分的內容,我覺得 Developer 應該要去好好了解,例如,使用者反應網站變慢,怎麼查?查程式?開 Visual Studio 查嗎?查資料庫?開 SSMS 查詢嗎?我們應該學習更有效的方法來處理,而且是可以提出數據的處理。這篇給了我們一個很好的方向。
IIS Log 可以透過 Log Parse 或 Log parser Lizard 來幫忙分析。

IIS 7.5 系列教學影片(4) 筆記

第四部談 IIS 與安全設定。我們在撰寫程式時,都會進行許多安全方面的工作,從最前的表單驗證、SQL Injection、XSS…各式各樣的防護工作,但怎麼不會去想如何在【第一關】去進行防護,即一個 Request 一進來第一關一定先碰到 IIS,有了 IIS 確認 Request 之後確認之後,才有後續的動作。

這有點像 Firewall (防火牆) 的工作內容,可以把 IIS 當成進行我們程式前的 Firewall,讓我們的程式可以在更安全的環境下運作。
  • 要求篩選
    【副檔名】:以副檔名進行篩選,什麼可執行,什麼不可執行。
    【規則】:進行Scan URL及Query String來進行規則設定。
    【隱藏區段】:什麼檔案或目錄是不可見的,例如,web.config。
    【URL】:進行URL的 Allow / Deny 的設定。
    【HTTP 指令動詞】:進行 HTTP 指令動詞的 Allow / Deny 設定。
    【標頭】:可新增標頭及大小設定。
    查詢字串】:設定 Allow / Deny 的 Query String 裡的字串,例如,影片中提到的「..」或SQL Injection常用「'」。

    最後一個【查詢字串】我認為是很棒的內容,我們可以整理出透過Query String來攻擊的字串資料,然後加入此【查詢字串】裡的 Deny 清單內,這樣可以預防或減低程式上的不完美,例如,一些 Novice Programmer 就是喜歡用「接字串」來組SQL,所帶來的攻擊風險。
  • IP 位址及網域限制
    只有要【資料庫】的網站,應該都有一個管理後台,此管理後台就非常合適在此處進行設定,只限定特定 IP 位址或網域來存取。當然,私有不對外公開的網站,也適合在此處進行設定。
  • Dynamic IP  Restriction
    此擴充可防止被 DoS 或暴力攻擊。透過限制單一 IP 【最大同時連線數】與【一段時間內的最大連線次數】來預防被攻擊。

IIS 7.5 系列教學影片(5) 筆記

這部分討效能,我們要如何增加網站的執行效能。

另外,此篇也討論如何找出瓶頸,以下面兩個方向來找:
  1. 找出前 N 筆速度最慢的網頁
  2. 找出前 N 筆最常被讀取的網頁
找出後,列為最優先處理的項目,應該就可以提升不少效能。

IIS 7.5 學習心得

看完此教學後,自己有點汗顏,原來 IIS 7.5 有那麼多功能,重點是【實用】。有空的人可以再往下去深入研究,文章中我都有幫各位找好相關連結。我自己看完後,我非常建議當成所有 Developer 基礎教材,PowerPoint 可以免費下載,教學上只需要花些時間看看及開打 IIS 及 Web PI (安裝必須組件或設定) 玩玩即可。

Visual Basic 11 的 Iterator 與 Yield 心得筆記(5)

最後我們來了解整個 Iterator 與 Yield 執行流程。我們以心得(2)裡的範例來進行解釋。

    Private Iterator Function EvenSequence(firstNumber As Integer,
                                           lastNumber As Integer) As IEnumerable(Of Integer)
        ' 回傳偶數
        For number As Integer = firstNumber To lastNumber
            If number Mod 2 = 0 Then
                Yield number
            End If
        Next
    End Function

Iterator 我們前面提過,主要是要跟 compiler 說這是個要能列舉的函式,幫我實作 MoveNext、Current…等方法。那 Yield 呢?其實你在 Yeild 下【中斷點】去執行看看,就差不多知道結果了。

當程式執行到 Yield 陳述式時,便會儲存目前的位置,下一次呼叫 Iterator 時,便會從這個位置重新開始執行。

回想一下前面跑過的所有範例,我們每次跑 For ~ Each 迴圈,Yield 陳述式在做什麼事,記位置、回傳值,直到反覆運算(Iterator)動作結束(即 For ~ Each 每次取一個值,取完為止。)。記住這一次的位置,回傳這一位置的值,等下次再執行至 Yield 時,就跳至下一個位置,然後又是記住這一次的位置,回傳這一位置的值…重覆到結束。其實沒有那麼難懂。

雖然 C# 的使用者可能已經用到不想用了,但能在 Visual Basic 11 裡看到 Iterator 與 Yield 實在太高興了,也希望未來 C# / VB 之間能同步化。

Visual Basic 11 的 Iterator 與 Yield 心得筆記(4)

Try ~ Catch與 Iterator ~ Yield

程式裡不可能沒有 Try ~ Catch,我們看看 Iterator 與 Yield 在 Try ~ Catch 裡的使用。

Module Module1
    ''' <summary>
    ''' 測試 Iterator 與 Yield 與 Try ~ Catch
    ''' </summary>
    Private Iterator Function TestTryCatch() As IEnumerable(Of Integer)
        Try
            Yield 3
            Yield 4
            Throw New Exception("出事了!")
            Yield 5
            Yield 6
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        Finally
            Console.WriteLine("Finally 已被執行!")
        End Try
    End Function

    Sub Main()
        For Each number As Integer In TestTryCatch()
            Console.WriteLine(number)
        Next
        Console.ReadLine()

        ' 輸出:
        ' 3
        ' 4
        ' 出事了!
        ' Finally 已被執行!
    End Sub
End Module

你可以發現,執行至 Throw New Exception() 之後,因為進入的 Catch 然後執行至 Finally,程式就結束。也就是說,當程式執行至一半擲出例外(Catch),整個 Iterator Function 就會停止不在進行。而 Finally 是不管有沒有發生例外,都還是會被執行。這很符合我們的常理。

匿名方法(Anonymous Methods)與 Iterator ~ Yield

Module Module1
    Sub Main()
        Dim iterateSequence = Iterator Function() As IEnumerable(Of Integer)
                                  Yield 1
                                  Yield 2
                                  Yield 3
                              End Function

        ' 呼叫匿名方法
        For Each number As Integer In iterateSequence()
            Console.Write(number & " ")
        Next
        Console.ReadLine()

        ' 輸出: 1 2 3
    End Sub
End Module

與之前差異不大,透過 Iterator 與 Yield 的幫忙,讓匿名方法可以擁有舉列的能力。我們再舉一個範例:

Module Module1
    ''' <summary>
    ''' 取得數字的順序
    ''' </summary>
    ''' <param name="low">最小不得小於1</param>
    ''' <param name="high">最大不得大於100</param>
    ''' <returns>有順序數字</returns>
    Function GetSequence(low As Integer,
                         high As Integer) As IEnumerable

        ' 驗證參數
        If low <= 1 Then
            Throw New ArgumentException("low is too low")
        End If

        If high >= 100 Then
            Throw New ArgumentException("high is too high")
        End If

        ' 透過可舉列的匿名方法建立順序
        Dim iterateSequence = Iterator Function() As IEnumerable
                                  For index = low To high
                                      Yield index
                                  Next
                              End Function

        Return iterateSequence()
    End Function

    Sub Main()
        For Each number As Integer In GetSequence(38, 43)
            Console.Write(number & " ")
        Next
        Console.ReadLine()

        ' 輸出: 38 39 40 41 42 43
    End Sub
End Module

這裡注意驗證參數的部份,如果你把驗證參數寫在匿名方法裡,那必須等到 For Each 第一次去呼叫 Iterator 時,才會開始發生作用。在 Iterator 的說明文件中有一段話:「Iterators 是LINQ查詢中延後執行行為的基礎。」又學到一招。【註】在 MSDN 說明中「在 C# 裡 yield 陳述式不能出現於匿名方法中。」

泛型集合(Generic List)與 Iterator ~ Yield

下面這個範例,是 Stack(Of T)泛型類別實作 IEnumerable(Of T)泛型介面。

Visual Basic 11 的 Iterator 與 Yield 心得筆記(3)

以下範例會實作一個 Zoo 類別,此類別裡可儲存 Animal 私有類別資料,資料很簡單,就名稱與分類,分類只有簡單兩種,鳥類與哺乳類。讓我們看看在類別裡如何使用 Iterator 與 Yield。

''' <summary>
''' Zoo 類別,可存放哺乳類與鳥類資料
''' </summary>
Class Zoo
    Implements IEnumerable

    ''' <summary>
    ''' 私有 Animal類別,有名稱和分類兩個屬性
    ''' </summary>
    Private Class Animal
        Public Property Name As String
        Public Property Type As TypeEnum

        ' 簡單分類
        Public Enum TypeEnum
            Bird ' 鳥類
            Mammal ' 哺乳類
        End Enum
    End Class

    Private animals As New List(Of Animal)

    ''' <summary>
    ''' 新增哺乳類
    ''' </summary>
    ''' <param name="name">名稱</param>
    Sub AddMammal(ByVal name As String)
        Dim thisAnimal As New Animal() With {.Name = name,
                                            .Type = Animal.TypeEnum.Mammal}
        animals.Add(thisAnimal)
    End Sub

    ''' <summary>
    ''' 新增鳥類
    ''' </summary>
    ''' <param name="name">名稱</param>
    Sub AddBird(ByVal name As String)
        Dim thisAnimal As New Animal() With {.Name = name,
                                            .Type = Animal.TypeEnum.Bird}
        animals.Add(thisAnimal)
    End Sub

    ' 實作 GetEnumerator 方法
    Iterator Function GetEnumerator() As IEnumerator Implements _
                                         IEnumerable.GetEnumerator

        ' 回傳列舉值
        For Each theAnimal As Animal In animals
            Yield theAnimal.Name
        Next
    End Function

    ' 唯讀,回傳哺乳類
    Public ReadOnly Property Mammals As IEnumerable
        Get
            Return AnimalsForType(Animal.TypeEnum.Mammal)
        End Get
    End Property

    ' 唯讀,回傳鳥類
    Public ReadOnly Property Birds As IEnumerable
        Get
            Return AnimalsForType(Animal.TypeEnum.Bird)
        End Get
    End Property

    ' 舉列動物分類
    Private Iterator Function AnimalsForType(type As Animal.TypeEnum) As IEnumerable
        For Each theAnimal As Animal In animals
            ' 找出我們要的分類
            If (theAnimal.Type = type) Then
                Yield theAnimal.Name
            End If
        Next
    End Function
End Class

第一個重點,前面心得已經提過幾次,我們必須實作 IEnumerable.GetEnumerator ,也就是它讓我們有的型別有列舉的能力。第二個重點,AnimalsForType()方法,等一下希望能直接透過動物分類去找出目前此分類中有那些動物,因此我們實作了一個 Iterator Function 來幫忙。

我們看主程式如何呼叫:

Visual Basic 11 的 Iterator 與 Yield 心得筆記(2)

前一篇「Iterator 與 Yield 心得(1)」我們了解了 IEnumerable介面與 IEnumerator介面的關係,實作 IEnumerable介面的 GetEnumrator 方法可使型別變成可列舉的型別,還必須實作 IEnumerator介面裡的 MoveNext、Current、Reset等。

現在透過 VB 11 終於也可以有 C# 的方便性。使用 Iterator 與 Yield 我們也可以很方便實作出可舉列的型別或方法。我們先了解如何撰寫 Iterator 與 Yield 程式碼,然後在解釋整個 Iterator 與 Yield 的運作流程。

Module Module1
    Sub Main()
        Dim number As Integer = 0
        For Each number In SomeNumbers()
            Console.Write(number & " ")
        Next
        Console.ReadLine()

        ' 輸出:3 5 8
    End Sub

    ''' <summary>
    ''' Iterator 函式
    ''' </summary>
    Private Iterator Function SomeNumbers() As IEnumerable
        ' 使用多個 yield 關鍵字
        Yield 3
        Yield 5
        Yield 8
    End Function
End Module

我們來看 SomeNumbers():
  1. 在 Function 之前,必須加上 Iterator 關鍵字
  2. 回傳值使用 Yield 關鍵字,而非 Return
  3. C# 使用 yield break 陳述式來結束 Iterator,VB 11 使用 Exit Function 或 Return 來結束
  4. C# 使用 yield return,VB 11 直接使用 Yield
  5. Iterator 的回傳型別只能是 IEnumerable、IEnumerable(Of T)、IEnumerator、IEnumrator(Of T) 四種。
是否發現在使用 SomeNumbers() 時,你並不需要去實作整個 IEnumerable介面內容了。那是當 compiler 偵測到 Iterator 時,它會自動產生 IEnumerable 或 IEnumerable(Of T) 介面的 MoveNext、Current 注意的是,它不會產生 Reset 方法

我們來看在泛型裡的使用。

Visual Basic 11 的 Iterator 與 Yield 心得筆記(1)

在前一篇「Visual Basic 11 Beta 新功能介紹」我有提到一個 Iterator 與 Yield,這個 Iterator 與 Yield 是 C# 2.0 (Visual Studio 2005)提供的功能,它提供了簡易實作出【反覆運算】函式的功能,換成白話一點的說法,您想想,如果您想讓您的類別或函式能讓 For Each 使用,您應該怎麼做?

說來簡單,您只需實作整個 IEnumerable 介面IEnumerable(Of T) 介面。我們以MSDN中 IEnumerable 介面 範例來說明 IEnumerable 介面實作。

Imports System
Imports System.Collections

''' <summary>
''' Person 類例
''' </summary>
Public Class Person

    Public firstName As String
    Public lastName As String

    ''' <summary>
    ''' 建構式
    ''' </summary>
    ''' <param name="fName">姓</param>
    ''' <param name="lName">名子</param>
    Sub New(ByVal fName As String, ByVal lName As String)
        Me.firstName = fName
        Me.lastName = lName
    End Sub
End Class

首先,宣告一個Class Person(個人),裡面只有兩個屬性,firstName 和 lastName,並且了一個簡單的初始化建構式。

''' <summary>
''' People 類別
''' </summary>
''' <remarks>實作 IEnumerable</remarks>
Public Class People
    Implements IEnumerable

    ' 私有 _person()陣列變數,存放 Person類別資料
    Private _people() As Person

    ''' <summary>
    ''' 建構式
    ''' </summary>
    ''' <param name="pArray">Person 陣列</param>
    Sub New(pArray() As Person)
        ' 初始化陣列物件
        _people = New Person(pArray.Length - 1) {}
        
        ' 儲存至私有 _person()陣列變數
        Dim i As Integer
        For i = 0 To pArray.Length - 1
            ' 將傳入物件陣列儲存在 _people陣列
            _people(i) = pArray(i)
        Next i
    End Sub

    ''' <summary>
    ''' 實作 IEnumerable.GetEnumerator 方法
    ''' </summary>
    ''' <returns>列舉 _people()陣列的結果</returns>
    Function GetEnumerator() As IEnumerator _
                     Implements IEnumerable.GetEnumerator

        ' 回傳列舉 _people陣列結果
        Return New PeopleEnum(_people)
    End Function
End Class

宣告一個Class People(人),重點在第二行,它實作了 IEnumerable介面,當您輸入完 Implements IEnumerable 按下 Enter 後,會自動跳出需實作的函式,即 GetEnumerator() 函式。People類別主要是要存放 Person(個人)類別資料,存放於陣列之中,然實透過實作 GetEnumerator() 函式,讓 People類別擁有可反覆運作的能力。在 GetEnumerator() 函式中,我們還需要透過一個 PeopleEnum類別來幫忙完成最後一件事。

''' <summary>
''' 列舉 People 類別
''' </summary>
''' <remarks>實作 IEnumerable</remarks>
Class PeopleEnum
    Implements IEnumerator

    Public _people() As Person

    ' 在第一個列舉之前的位置
    ' 直到第一次呼叫 MoveNext()
    Dim position As Integer = -1

    ''' <summary>
    ''' 建構式,初始化 _people() 陣列
    ''' </summary>
    ''' <param name="list">Person陣列</param>
    Sub New(list() As Person)
        _people = list
    End Sub

    ''' <summary>
    ''' 實作 MoveNext() 函式
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Function MoveNext() As Boolean _
                    Implements IEnumerator.MoveNext

        position = position + 1
        Return (position < _people.Length)
    End Function

    ''' <summary>
    ''' 實作 Reset() 副程式
    ''' </summary>
    Sub Reset() Implements IEnumerator.Reset
        position = -1
    End Sub

    ''' <summary>
    ''' 實作唯讀 Current() 屬性
    ''' </summary>
    ''' <value></value>
    ''' <returns>_people陣列值</returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Current() As Object _
                    Implements IEnumerator.Current
        Get
            Try
                ' 回傳現在位置的 _people陣列值
                Return _people(position)
            Catch ex As IndexOutOfRangeException
                Throw New InvalidOperationException()
            End Try
        End Get
    End Property
End Class

PeopleEnum類別,很明顯是在進行列舉用的類別。

Visual Basic 11 Beta 新功能介紹

隨著 Visual Studio 11 Beta 的推出,Visual Basic 11 Beta 也正式推出,讓我們來看看有什麼Visual Basic 11 Beta裡有什麼新內容吧!

非同步程式, Asynchronous Programming


現在要在VB11裡開發非同步程式(Asynchronous Programming)變的很簡單了。在VB11中新增 Async / Await 關鍵字。

範例程式來源:101 Samples in C# and Visual Basic

VB 10: await - Serial Network Requests

Public Sub AsyncIntroSerialBefore()
    Dim client As New WebClient()

    AddHandler client.DownloadStringCompleted, AddressOf AsyncIntroSerialBefore_DownloadStringCompleted_1
    client.DownloadStringAsync(New Uri("http://www.weather.gov"))
End Sub

Sub AsyncIntroSerialBefore_DownloadStringCompleted_1(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
    WriteLinePageTitle(e.Result)

    Dim client As New WebClient()

    AddHandler client.DownloadStringCompleted, AddressOf AsyncIntroSerialBefore_DownloadStringCompleted_2
    client.DownloadStringAsync(New Uri("http://www.weather.gov/climate/"))
End Sub

Sub AsyncIntroSerialBefore_DownloadStringCompleted_2(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
    WriteLinePageTitle(e.Result)

    Dim client As New WebClient()

    AddHandler client.DownloadStringCompleted, AddressOf AsyncIntroSerialBefore_DownloadStringCompleted_3
    client.DownloadStringAsync(New Uri("http://www.weather.gov/rss/"))
End Sub

Sub AsyncIntroSerialBefore_DownloadStringCompleted_3(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
    WriteLinePageTitle(e.Result)
End Sub

VB 11: await - Serial Network Requests

Public Async Sub AsyncIntroSerial()
    Dim client As New WebClient()

    WriteLinePageTitle(Await client.DownloadStringTaskAsync(New Uri("http://www.weather.gov")))
    WriteLinePageTitle(Await client.DownloadStringTaskAsync(New Uri("http://www.weather.gov/climate/")))
    WriteLinePageTitle(Await client.DownloadStringTaskAsync(New Uri("http://www.weather.gov/rss/")))
End Sub

如果要在要 Visual Studio 2010 for Visual Basic 10 環境下去使用 Async / Await 關鍵字,必須去安裝 Visual Studio Async CTP (Version 3) 套件。當然,也支援非同步的除錯及單元測試(MSTest與xUnit支援良好)。

請參考:

Iterators

Iterator 首先出現在 C#,在 VB 10 之前未與 C# 同步使用此方法,但在 VB 11 裡終於可以 C# 同步使用。想了解 Iterator 方法,我想最好先從 Iterator (C# 程式設計手冊) 下手,因為 VB10 之前沒有 Iterator 方法,所以去看 C# 的資料在所難免。其實之前我根本沒有注意過 Inerator 方法,直到在 MVC 3 for C# 的程式碼中,看到有人使用 Iterator 方法,結果我怎麼轉就是無法在 VB 實作、執行,後來才發現原來 VB 10 根本就無此方法,這讓我非常頭痛。

在 Visual Studio 11 開一個 Console Application ,輸入以下測試程式:

Windows 8 CP Beta / Visual Studio 11 Beta 安裝經驗

隨著 Windows 8 Consumer Preview BetaVisual Studio 11 Beta 的推出,相信離正式版已經不遠了,Beta 與 Preview 不同,Preview 只是讓你先看看,這一次的 Beta 可說是 UI 大改版,與之前的 Preview 差異非常大。

Windows 8 Consumer Preview Beta and Visual Studio 11 Beta
圖一:Windows 8 Consumer Preview Beta and Visual Studio 11 Beta

在這裡要先分享一個個人悲慘的經驗,在去年 Windows 8 Preview / Visual Studio 11 Preview / ... Preview 推出時,第一時間就去下載,記得由於當時主機上的 RAM 不足,而且看了看文件,說可以把 Visual Studio 11 Preview 和 Visual Studio 2010 安裝在一起而不會有問題,就相信的給它裝下去。整體而言,除了整合更多好用延伸工具進 VS 11 Preview,VS 11 Preview 與 VS 2010 差異不大。當然,期間重要的是要玩 ASP.NET MVC 4 Preivew。

這一次可以說是大大【Beta 週】(從 2012/2/29 ~),上從作業系統的 Beta,下至開發工具 Beta,連 IIS 7.5 Express 此類工具也都開始更新,當然還有 ASP.NET MVC 4 Beta。ASP.NET MVC 4 Beta 在 asp.net 上只有兩個選擇,一是使用 Web PI 安裝,二是下載安裝檔安裝,但我就是裝不起來,而且從錯誤訊息看來,是因為我有安裝 VS 11 Preview / .NET 4.5 Preview 的關係。

找到問題點,那就比較好處理,進行了一下午的 uninstall VS 11 Preview / .NET 4.5 Preview / ... Preview 的作業,移除完畢問題還是沒有解決,更慘的是,我連 Visual Studio 2010 都打不開了,使用【修復】還是處理不了,最後下了一個決定:【重灌電腦】。

最後得到一個結論,這些 Preview / Beta 的內容還是在測試機(VM Host)裡玩玩就好,除非你有空主機,或主機有進行 Ghost 之類的備份,不然還是不要太相信…它的話。

Windows 8 Consumer Preview Beta 安裝經驗


安裝只有兩個步驟,一,問安裝至那個 Disk,二,問產品金鑰。安裝完成後會問你是要整合【Windows Live Account】或【建本機帳號】,選擇後,就可以開始測試 Windows 8 Consumer Preview Beta。

由 Windows 8 CP Beta 的安裝經驗來說,是非常不錯,過程沒有太多干擾,就安裝而言,每一代的 Windows 都提升不少方便性,而且安裝速度也算不錯。8 > 7 > Vista > XP > ME > 98 > 95 > 3.1。

Visual Studio 11 Beta 安裝經驗


Visual Studio 11 Beta 預設為完全安裝,所以從頭到尾只有按兩次Click,一次 Install,一次 Launch,因為安裝的內容不少,可以看到 CPU 與 Disk I/O 有些小忙,也因為沒有什麼可以介入的地方,會等的有些無聊(或是說順)。

Visual Studio 11 Beta 整個 UI 大改版,不過這不是重點。原來像 ASP.NET MVC 4 Beta 等測試環境都已經內建於 Visual Studio 11 Beta 之中,難怪 asp.net 網站只放了 Visual Studio 2010 版本的 ASP.NET MVC 4 Beta 的安裝檔。

Visual Studio 2010升級ADO.NET VB.NET DbContext Generator出現憑證錯誤

在新安裝的Visual Studio 2010 SP1中要升級【擴充管理員】裡的項目,目前發現有兩個項目無法直接升級,一個是【NuGet Package Manager】,這可以參考【透過擴充管理員升級 NuGet Package Manager 失敗的可能解決方案 (一點通系列 - MVP 撰寫)】來解決,例如,剛安裝好Visual Studio 2010 SP1中,NuGet Package Manager 版本號為 1.2.20325.9034,大致可以斷定 1.5.x 之前直接升級 1.6.x 會有問題。解決辦法很簡單,先移除舊版本 NuGet Packagte Manager 重新安裝 1.6.x 即可。

另一個項目為【ADO.NET VB.NET DbContext Generator】,這個 DbContext Generator 是在撰寫 Entity Framework 時不可或缺功能之一,主要是幫我們由 EDMX 裡來產生 DbContext 物件。

VB.NET DbContext Generator 升級通知
圖一:VB.NET DbContext Generator 升級通知
元件庫的網頁裡得知,這個擴充元件是 2012/3/1 才更新,版本號由 1.0.1.0 進到 1.0.2.0,正常動作就是按下【更新】按鍵,

更新VB.NET DbContext Generator 錯誤訊息
圖二:更新VB.NET DbContext Generator 憑證錯誤訊息
從原廠來的東西有問題?

舊 Microsoft 憑證
圖三:舊 Microsoft 憑證
新 Microsoft 憑證
圖四:新 Microsoft 憑證
兩張憑證的序號不一樣,解決辦法也很簡單,圖二就已經說明了:【如果您信任更新,請將安裝版本解除安裝後,重試一次安裝。】就憑證內容而言,兩張都是正確的。

先至【已安裝擴充功能】將原【ADO.NET VB.NET DbContext Generator】進行【解除安裝】,移至【線上圖庫】搜尋【DbContext】,

EF 4.x DbContext Generator for VB.NET
圖五:EF 4.x DbContext Generator for VB.NET
你有沒有發現,DbContext Generator 的名稱改了,全部改為 EF 4.x 開頭,所以下次搜尋可以用【EF】或【EF 4】為關鍵字來搜尋。下個版本或許會命名為【EF 5.x DbContext Generator for VB.NET】,因為Entity Framework 5 Beta已經出來了。