Tech Days 2009 三天匆匆忙忙的終於結束了。這次果然也跟以往一樣有著非常精彩的內容,非常豐富的獎品。只不過我也跟往常一樣,什麽都沒抽中~~唉沒橫財命。不過我想最重要的還是能取得許多無價的知識。
Me vs 微軟攤位小妹:
小妹:這個新的藍光滑鼠可以在任何材質的表面上使用喔!
Me:買個滑鼠墊不就好了?
小妹:…
小妹:可以幫你省買滑鼠墊的錢~
轉的有點彆扭…
Tech Days 2009 三天匆匆忙忙的終於結束了。這次果然也跟以往一樣有著非常精彩的內容,非常豐富的獎品。只不過我也跟往常一樣,什麽都沒抽中~~唉沒橫財命。不過我想最重要的還是能取得許多無價的知識。
Me vs 微軟攤位小妹:
小妹:這個新的藍光滑鼠可以在任何材質的表面上使用喔!
Me:買個滑鼠墊不就好了?
小妹:…
小妹:可以幫你省買滑鼠墊的錢~
轉的有點彆扭…
最近漸漸開始練習使用漢語拼音輸入法來輸入中文,理由很簡單:
只不過剛開始的時候實在超不習慣,打這篇文章花了 15 分鐘吧,還需要反反復復的一直查詢漢語拼音與注音符號基本規則對照表,超級沒效率的。不過畢竟本來就對漢語拼音完全不熟,有時打到一半還會想去按注音,實在粉機車 Orz。不過用一陣子之後覺得注音果然特別沒效率...
下面推薦倆個拼音輸入法,雖然都只有簡體版的,但都支援繁體輸入,也都有繁體詞彙:
之前用 Visual Studio 開發內含多個專案一的方案的時候,有碰到一個有點困擾的問題,就是時常需要切換啟始專案來做偵錯。現在發現一個好用的選項可以快速切換啟始專案 (原本要專案上按右鍵換),在方案的屬性頁裡面,將 [啟始專案] 的選項改成 [目前的選取範圍],這樣一來往後只要在專案中任何一個項目按一下就可以馬上切換成啟始專案:
也可以到 [工具] - [選項] - [專案與方案] - [建置並執行] 將 [讓新方案使用目前選取的專案做為啟始專案] 打勾讓它成為新方案的預設值:
蠻方便的一個功能。
從今天起到禮拜四要去參加一連三天的微軟 Tech Ed 活動,先解釋給沒有聽過這個活動的朋友們聽,其實簡單來講這個活動就是一個很大的研討會而已,微軟針對開發人員以及 IT 人員規劃了各式各樣的課程,讓參與者自由參加。這個活動是要付費進入的,不過會有很多贈品,包括一個多功能背包 (我的一拿到拉鍊就掉了... Orz)。可惜相機被人家借走無法 PO 一些照片給大家看。也有到了一些攤位參觀,藍色小舖,點部落之類的,不過其實只是為了 A 贈品...
早上那個開場致詞以及一些 Demo,其實我大部分時間都是在睡的哈,還好會堂很大可以容納一兩千人,混在人群中可以睡的比較安心。睡到中午之後跟也有註冊參加的同事一起到 101 吃飯,順便參觀一下台灣 Google (他女朋友在那工作) 的辦公室。果然名不虛傳,是個很奢侈(不,是注重員工福利!) 的地方。茶水間一整架的零食當然不用說, 冰箱裡隨意取用的飲料跟哈根大,員工娛樂室,按摩室等等不在話下,台北 101 73樓的視野當然也不用特別說了。果然股價美金 400 元的公司就是不一樣,名不虛傳。
下午參加了幾場關於開發人員的課程,其中有兩堂也是聽到一半就撐不住了 (還好都是在大會堂哈),也不是講師講得的不好,實際上講得內容豐富而且實用性很大,偶爾也穿插幾個冷笑話讓人會心一笑。只不過除了關於 Security 那堂我有完整聽完以外,剩下的兩堂都講一些我比較熟或比較沒興趣的內容。曹祖聖老師真的是很強 (雖然也不是第一次聽他上課啦),稍微懂一點的人一聽就知道他真的是有練過的,其實每個講師都有自己厲害的地方啦不過他比較讓我佩服。
老師上課時有提到一個物件導向設計的概念,我覺得挺有趣的可以讓大家思考一下:
假設我們在寫一個類似世紀帝國的即時戰略遊戲,現在有一個士兵,射了一箭射到一匹馬,那匹馬就減血,這樣的邏輯要怎麼對應到物件的關係上? 好,士兵是一個類別,那隻箭也是,那匹馬也是,應該不難,現在問題來了,攻擊的邏輯 (就是要減多少血那個部份) 是要放在士兵,箭,還是馬?乍看之下好像沒什麼差別,但其實這個決定會影響程式的維護性。如果放在箭上的話,那箭的攻擊邏輯就必須要知道他要攻擊的對象,比方說如果攻擊對象的話換成是坦克車的話,弓箭造成的損傷就要改變。所以無形中弓箭的類別就會跟其他所有單位的類別形成了相依性,這是不好的因為類別間的相依性越高,一般來講程式碼就越難維護或擴充。曹老師後來是說應該是要放在馬上面,讓馬的類別處理,我想這樣的話馬自己負責自己被攻擊的邏輯,感覺上類別之間的關係比較鬆散 (通常是件好事)。不過我後來想想其實這樣還是沒有解決相依性的問題啊,這樣的話馬本身還不是需要知道它是被什麼攻擊....雖然說我沒有寫過即時戰略遊戲的經驗,但我想我會這麼作吧,會有一個固定的公式 (會將 "可被攻擊的物件" 幾個屬性,比如說防禦力之類的算在裡面) 來算出損傷,這樣的話所有 "會攻擊的物件" 的攻擊方法其實都是一致的,只會因 "可被攻擊的物件" 不同而改變。
還有老師最後還有出一題給大家回家思考,請問以下這兩組東西,如果要你畫出類別關係圖,要怎麼畫?
樹、紙、海報
烏龜,石頭,筆
感覺上有點像腦經急轉彎...海報繼承至紙,紙繼承至樹? 那烏龜,石頭,筆勒?我是還沒深入去想,不過我的認知中物件導向程式設計中,物件其實代表的是行為 (Behaviour) ,所以真正的問題可能是『樹、紙跟海報之間有相同的行為嗎?』。今天太晚就先睡了,明後天再來好好想想看這個問題。
颱風好像越來越猛了,要不要賞月烤肉已經不是問題了,不過怎麼這麼喜歡禮拜六日來啊,禮拜一二再來有多好了。看新聞說電影院跟卡啦OK 颱風天反而生意更好。其實這種現象很奇怪,颱風天去電影院跟卡啦OK 可以,可是上班上課太危險,其實大家根本不大怕颱風吧,只是想休假而已。
常看到很多人 (甚至是開發者) 在討論 Framework 版本的時候,對於幾個版本之間的關係還是不大了解。這也不能怪他們因為 MS 在 3.0 的時候把原來的架構破壞了。本來的架構是,一個版本就一個新的 CLR,CLR 可以向下相容 (大致上),也可以共存,開發出來的程式就是針對某個 Framework/CLR 版本,非常明瞭。但到了 Framework 3.0/3.5 之後卻演變成還是使用跟 2.0 同個 CLR 版本,只是在上面新增功能。所以其實這就是為什麼有人說就算你用 2.0,還是可以使用 3.0/3.5 的功能,只要能參考 3.0/3.5 的 DLL 就好了。下圖是 Framework 版本跟 CLR 版本的對照表:
| .NET Framework 版本 | CLR 版本 |
| 1.0 | 1.0 |
| 1.1 | 1.1 |
| 2.0 | 2.0 |
| 3.0 | 2.0 |
| 3.5 | 2.0 |
我想 4.0 應該真的會是連 CLR 都一起升級的大改版了吧。
Windows Vista 內建的 3.0,跟原來釋出的 3.0,以及 2.0 跟 3.0/3.5 的 關係在下面這張圖就顯示的很清楚,其中 Green Bits 跟 Red Bits 分別為微軟在開發 3.5 的時候稱 3.5 那塊跟 3.0/2.0 那塊的代號:
出處:http://www.danielmoth.com/Blog/2007/06/net-framework-35.html
原來早在去年年底,Microsft 已經將 .NET Framework 一部分的原始碼釋放出來,讓大家在 Debug 的時候更加方便(讓你可以進入 Framework 的程式碼),而且也可以更加了解 Framework 裡面的內部結構。不過目前好像只有這幾個 DLL 有 (已更新到 SP1):
使用方式非常簡單,到 [工具] - [選項] - [偵錯] 設定這兩個選項:
這樣就可以了。接下來在程式碼隨便一個地方設中斷點,然後執行程式讓它中斷。在呼叫堆疊的地方選一個想要看原始碼的呼叫,滑鼠按右鍵然後選 [載入符號來源] - [Microsoft 符號伺服器]。等他下載完之後堆疊裡的呼叫就不會是反白,這時在呼叫上按兩下可以就可以看原始碼了,下圖是 System.Windows.Forms.Control 的原始碼:
生活中常常會遇到很多選擇,有些會在深思熟慮的情況下作決定,有些會在衝動下決定,但應該大多數是本能反應。這些選擇很多是不痛不癢,但有一些可能以後會回來咬你,對你造成很大的傷害。常常在想如果人生能像 RPG 一樣就好了,可以儲存,失敗了從紀錄點重來,這樣人生一定每次都是大滿貫。或許說上帝正在玩我的人生這個 RPG (希望祂有攻略本...Orz),其實我已經失敗一千次了,現在是第一千零一次嘗試,只是沒有上一次的記憶所以不知道。也常會有這種想法,就是其實人生跟科幻小說一樣,你每作一個選擇,就會有作另一個選擇的平行世界產生,就算你做的這個選擇是錯的讓你痛苦,可能在另一個平行世界做了另一個選擇的你因為做了對的選擇而幸福快樂。有了這些無厘頭的想法,至少可以讓你在做了錯誤的選擇之後稍微好過一些些吧。不過不管是 RPG 還是平行世界,有一點不會改變的就是你還是你,對的錯的都是你,你是角色,不是玩家,你消失了世界還是會運轉。所以呢,要好好把握現在,把握人生,做對的選擇,就算是錯的也要無怨無悔,活一個完壁的人生。
SQL Server 2008 & Visual Studio 2008 SP1 昨天出了! 又是個快 1G 的 Service Pack,連帶一堆元件也一起更新... SQL Server 2005 都沒開始學什麼 2008 就出了,MS 是把 SQL Server 當成一般桌面應用程式看待嗎?
Visual Studio 2008 Express with SP1 下載 (下面可以選中英文版)
Team Foundation Server 2008 SP1 英文版下載
昨天晚上跟同事去看了神鬼傳奇3,雖然這個系列也算是所謂的商業片,但我看電影只有分好看不好看,有沒有深度什麼的到不是那麼在乎。開始看的時候第一個感覺就是女主角換人了,從原本很有氣質 Rachel Weisz (瑞秋懷茲) 換成從來沒看過的 Maria Bello (瑪麗亞貝洛)。後來查了一下資料其實是瑞秋懷茲自己拒絕拍第三集的,布蘭登費雪不知道在想什麼,不過如果連主角瑞克歐康納也換人演的話,那這片就不能叫神鬼傳奇了。還有好笑得是,片中的華裔演員 (楊紫瓊, 黃秋生等等) 都拼命講英文,那些好萊塢演員就拼命的講很破的中文。跟 1,2 集比起來劇情弱了很多,雖然都是杜撰的故事但第三集的是荒謬又滑稽,至少在前兩集可以比較容易融入劇情,不會讓人有很滑稽的感覺。但也可能是這次的主題是中國的關係吧,或許埃及人看第 1,2 集也會跟我們看第三集差不多。
整體而言如果你不在乎劇情的邏輯性,只看特效也 OK 的話那可以去電影院看。如果你期待是跟第 1,2 集差不多或更好的話,那大概就會失望了。
前幾天網路上看到一個很有趣的東西叫 Sony Rolly,忍不住就到拍賣網站敗家買了一個回家玩,簡單來講就是一個蛋型,支援藍芽,會跳舞的 MP3 播放器 。雖然只有在日本發售...不過可以稱的上是個夢幻的逸品 :-)
它的軟體也只有日文版而且只限定在日文系統上裝,還好網上有找到方式硬是裝了上去。它的跳舞動作有兩種方式來設定,一個是自己用它附的軟體編,要不然就是可以叫它自動去偵測(大部分時候都怪怪的不過偶爾有佳作)。也可以到 Sony 網站下載其他人編好的,不過大部分都是日本歌。
當蛋蛋遇上多啦A夢...
到底要學 VB.NET 還是 C#? 這個問題常常被拿出來討論,而討論的結果也常常沒有結論。因為大部分人要不直接推薦他們自己擅用的語言,就是叫你選自己覺得喜歡的。其實大家心理都知道,所有 .NET 語言 compile 出來都是變成 IL,硬要說 C# 比 VB.NET 強大其實有點牽強,兩個語言的相容性絕對是 95% 以上。所以所有的 .NET 語言其實都是平等的,.NET 平台強大的地方在於它的 CLR 跟 Class Library。最近看到了一篇很有意思的文章,裡面形容 VB.NET 為「醜小鴨」,其實一點也不為過。該文章提到說「C# 使用者總有一種模糊的感覺覺得自己在寫的程式碼是既優雅又帶有性格,一定是大括弧產生的錯覺。」,非常有意思。實際上 Visual Basic Expression 版的下載次數遠大於其他版本。還是覺得 VB.NET 是個「玩具語言」嗎?微軟的 Silverlight 裡面的 Javascript Parser 就是用 VB.NET 寫的,這證明了 VB.NET 的能耐絕對足以寫出非常專業的產品。總歸一句話,軟體寫的好不好主要還是看寫的人,使用個工具或語言其次。
好了廢話不多說,今天想來介紹一個 VB 9.0 有,但 C# 3.0 (就是 Visual Studio 2008 的 VB 跟 C# 版本) 沒有的功能 - XML Literals。簡單來講就是可以直接把 XML 打在程式碼裡面處理。表面上聽起來沒什麼了不起,但若你常需要處理 XML 檔案的話,用一次你就知道它的方便性,還有它的優雅。C# 看來不太可能會有這個功能,因為或多或少 C# 都是遵循 ANSI C 的規格,像在程式碼裡面添加 XML 這種怪招,C# 我想不大好去 Implement。廢話不多說先來看一個簡易範例,用 XML Literals 建立一個 XML 文件:
Dim xml = <books>
<book>
<title>Head First Java</title>
<price>800</price>
</book>
<book>
<title>Head First HTML</title>
<price>1000</price>
</book>
</books>
同樣的 XML 用 XmlDocument:
Dim xml As New XmlDocument
Dim booksNode As XmlNode = xml.AppendChild(xml.CreateElement("books"))
Dim bookNode As XmlNode = booksNode.AppendChild(xml.CreateElement("book"))
Dim titleNode As XmlNode = bookNode.AppendChild(xml.CreateElement("title"))
Dim priceNode As XmlNode = bookNode.AppendChild(xml.CreateElement("price"))
titleNode.InnerText = "Head First Java"
priceNode.InnerText = "800"
titleNode = bookNode.AppendChild(xml.CreateElement("title"))
priceNode = bookNode.AppendChild(xml.CreateElement("price"))
titleNode.InnerText = "Head First HTML"
priceNode.InnerText = "1000"
如何,用 XML Literals 的確優雅很多吧?它讓你在處理 XML 的時候,用一種非常視覺化的方式來處理,你的 XML 文件就在你眼前,不用去想像,甚至可以透過匯入 Schema 的動作來讓你的 XML Literal 支援 Intellisense。
好建立一個 XML 文件其實只是牛刀小試,XML Literals 還支援 Embedded Expressions,用 <%= %> 來表示非常類似 ASP.NET 的,讓你可以非常快速的,而且視覺化的來動態產生/轉換 XML。下面是一個非常簡易的將上面的 XML Tranform 成 HTML 的範例:
Dim output = <html>
<head><title>Books</title></head>
<body>
<p>
<table>
<tr><td>書名</td><td>價錢</td></tr>
<%= From book In xml...<book> Select <tr><td><%= book.<title>.Value %></td><td><%= book.<price>.Value %></td></tr> %>
</table>
</p>
</body>
</html>
出來的結果就是:
非常神奇,不需要去玩 XSLT,也不用甚麼程式碼,直接在 XML Literal 裡面定義就好了。
XML Literal 的功能也還有一種另類的玩法 - 就是拿來當字串,尤其是多行的字串如 SQL 指令,還有用來取代 String.Format(),請看下面的範例:
舊寫法,用 & _Dim str As String = "這是一段" & vbCrLf & _
"超過三行" & vbCrLf & _
"以上的" & vbCrLf & _
"文字"
MsgBox(str)
Dim xmlLitString = <string>
這是一段
超過三行
以上的
文字
</string>.Value
透過 Embedded Expression 的支援,就可以達到 String.Format() 的效果,但是直接寫在 XML Literal 碼裡面,不用一直加參數跟 placeholder:
舊方式,用 String.Format(),當你的參數越來越多的時候就會變的複雜,不好更新Dim msg = String.Format("{0}! 現在是{1}" & vbCrLf & _
"你的登入帳號為 {2}" & vbCrLf & _
"電腦叫做 {3}" & vbCrLf & _
"作業系統為 {4}", If(Now.Hour > 9 Or Now.Hour < 4, "晚安", "你好"), Now.ToString(), My.User.Name, My.Computer.Name, My.Computer.Info.OSFullName)
MsgBox(msg)
Dim xmlLitMsg = <string>
<%= If(Now.Hour > 9 Or Now.Hour < 4, "晚安", "你好") %>! 現在是<%= Now.ToString() %>
你的登入帳號為 <%= My.User.Name %>
電腦叫做 <%= My.Computer.Name %>
作業系統為 <%= My.Computer.Info.OSFullName %>
</string>.Value
MsgBox(xmlLitMsg)
講了這麼多主要還是想讓大家知道,VB.NET 是個成熟的 .NET 語言,功能上絕對不比 C# 遜色。感覺上使用 C# 的人好像比較多其實主要還是因為是很多人有 C/C++/Java 背景,這些人看熟 C 的語法了,自然對 C# 容易上手,沒有必要花時間去鑽研 VB.NET (雖然我知道很多高手兩個都很厲害),並不是因為 VB.NET 是個比較拙劣的語言。
其實現在 C# 跟 VB.NET 兩者都有很多很好資源,範例可以學習,在這裡還是奉勸大家兩個都學,才不會碰到找到一個解決你問題的範例但是看不懂的窘境。你可以比較熟一個,但至少另一個的基本語法也要看的懂。如果真的沒辦法,沒時間的話,至少有轉換器可以用 :-)。
非常有趣的部落格,是一個仇恨 Linux 的人寫的(英文):
裡面充滿的對 Linux 的不滿以及仇恨。不過他的論點幾乎都很正確,比如說為什麼連改變個解析度都這麼難?為甚麼設定個音效卡會這麼複雜,一層又一層的相依性:OSS, ALSA, Arts, ESD, dmix, jack, pulseaudio 等等。還有這麼多開放原始碼的軟體,表面上看來很美好,實際上大部分開發人員根本不管使用者的需求,只管做自己喜歡做的事。還有社群對一般有問題的使用者的態度:「我的沒問題啊」、「Google 上面有啊你不會找嗎」、丟給你一些 Xorg 設定叫你試試看啊,還有社群多喜歡 Fork (把現有的程式分支出來成為另一個程式) 等等。甚至 Linux 的創造者 Linus 都對開放原始碼社群有很多抱怨啊之類的,非常有趣,Linux 使用者必看。
原來在 Vista 裡面在資料夾上按 Shift + 滑鼠右鍵會出現 "Open Command Window Here" (在此開啟命令提示字元) 跟 "Copy as Path" (複製路徑) 的功能。真是不錯啊! 不用再裝甚麼 PathCopy 之類的軟體就可以做到了。
Vista 剛出時還挺嫌棄它的,不過到了 SP1 以後真的是越來越好了,不過還是需要高階電腦(雙核心 CPU, 2G RAM 以上)才跑的順,用舊電腦的朋友還是乖乖繼續用 XP 吧。