2008年12月19日 星期五

景氣寒冬中的小聖誕樹

一年當中,我覺得最讓人喜歡的節日莫過於聖誕節了,對我來說,聖誕節一直以來都是有著多重意義的,這個節日不僅讓人覺得溫馨,也有一點數算過去一年的點點滴滴,然後把希望寄放在即將來的另一年的感覺,好不容易,緊繃了一年,一切的勞苦愁煩似乎轉眼成空,終於在一年中剩下的幾天當中可以放下忙碌,讓腳步緩一緩,從容地深深吸一口氣,讓自己準備好心情迎接另一年的開始...

很有趣的是,每一年這個時間,不管你在台北街頭的哪一個位子,商家們總是很有默契的,一起放出了聖誕歌曲,讓你想忘了這個節期都很難,大家一同把塵封了一年的聖誕樹重新擺出來,景氣好的時候,樹一顆比一顆大,有一年,我特別抽了一天空,當天什麼事情都不做,就在台北街頭找聖誕樹進行David私人票選,看看哪一棵樹最大或是最亮眼...

這張照片,是周末的傍晚,我在園區的一家西雅圖咖啡寫稿,老實說,店裡面冷清到不行,幾個和我差不多年紀的客人,盯著NB螢幕的專注地盯著螢幕,喝咖啡看書的也鮮少抬起頭,不過我最喜歡這種店,不會有人吵我,所以儘管西雅圖的美式咖啡老實說今天真的難喝到不行,但我依舊有機會就來消費算是支持它,免得店家撐不下去又倒掉(別怪我烏鴉嘴,天知道這邊已經倒了多少家Starbucks,有些你喜歡的店,現在要常去支持,否則消失得很快,才一陣子沒去,店門口就變成招租的廣告),回到店裡,戶外其實很冷,約莫15度上下,但是店裡頭瀰漫的溫暖和咖啡香,我面前有顆小小的聖誕樹,店裡面也播放著聖誕歌曲,從喜樂的普世歡騰到寧靜的平安夜,我久違了的聖誕歌曲,在我30好幾的歲月當中,有連續著好幾年,聖誕節我是在充滿著溫暖的聖誕聚會當中度過的,我很喜歡那種外面冷冷的,但是屋子裡滿是溫情的感覺,它會讓你忘掉一年的煩惱,放開一些困擾你的不如意,讓你暫時避開煩心的事情,可以有餘力回過頭來,看看自己的人生是否真如自己期待的那樣,一步一步地往前邁進...

景氣寒冬中的聖誕樹,其實和往年一樣閃爍,並沒什麼特別黯淡之處,店裡面的客人少,但是服務員卻相對的熱情多了,我和我的NB在一角,欣賞著聖誕樹、欣賞著落地窗外來往的人群,牽著手的情侶、趕著公車的婦人、假日在外遊玩到不捨得回家的學生...

最近新聞上,沸沸騰騰的幾乎都是景氣不好或是裁員的消息,300人、500人、上千人,有時候我想,企業是迫於無奈可以理解,但是想到居於弱勢的基層員工,因為對公司的價值低,難逃被拋棄的命運,外面已經夠冷了,每一個被迫離開公司的人,也都有家人、妻小、房子搞不好也有貸款、子女的學費還是得張羅,想到,不免令人有些感傷...

歲末,回頭看,2008年對台灣來說甚至對全球來說都是辛苦的一年,對我來說也是,今年發生好多事情,著實讓我經歷了人生挺艱苦的一個部分,明年呢? 明年又會如何呢? you never know...yep, 呵呵... 那句話怎麼說來著?

Life is like a box of chocolates, you never know what you gonna get.

也許因為景氣不好,聖誕樹變小了,但是我想無論多小的聖誕樹,總是依舊可以給人一種溫馨穩定平安的感覺,或許重點一直都不在樹的大小,而是究竟我為自己留了多少時間來欣賞它...也或許,該是把自己心裡也清出一點空間,擺上心裡的聖誕樹的時候了。













如果你不喜歡太小的樹,這邊也有稍微大一點的,這是經過客戶公司的大廳時,順手拍的樹...能擺這麼漂亮的聖誕樹的公司,今年應該不會裁員了吧 ^_^


2008年12月14日 星期日

Silverlight Toolkit中的圖表繪製功能 - 透過程式碼來繪製圖表 與 資料繫結

這一篇,我大致介紹了如何透過程式碼來繪製圖表,在這個影片當中,也同時介紹了圖組如何與特定的資料物件進行資料繫結,Silverlight這個功能相當有意思,過去我在研討會上有介紹過Silverlight資料繫結的觀念,和ASP.NET不同,Silverlight的資料繫結機制原則上是進行在用戶端的,主要是讓記憶體中某個物件的Property與前端Silverlight UI element的Property之間進行繫結,和ASP.NET透過宣告式語法讓前端介面與資料庫進行繫結的觀念不盡相同。這是因為對於Silverlight來說,資料庫在遠端,所以Silverlight無法直接和遠端的資料庫進行繫結(這樣做也沒意義),但是卻可以透過WCF將遠端的資料以物件的型式傳送到用戶端的記憶體中再與UI element進行繫結。

anyway, 我們先來看怎麼透過程式碼繪製圖表,接著我會再陸續把其他關於Silverlight toolkit的範例和教學影片放上來,希望對各位有幫助。

2008年12月7日 星期日

Silverlight Toolkit中的圖表繪製功能 - 透過XAML碼來繪製圖表

在12/4微軟的研討會當中,我Demo了如何透過Sivlerlight Toolkit來繪製圖表,你會發現透過
Sivlerlight Toolkit可以很輕易的建立出和使用者可以互動的圖表功能。相關Demo請參考上一篇BLOG

不過,萬丈高樓平地起,我們先來看怎麼透過XAML繪製圖表,底下是Silverlight Toolkit中的圖表繪製功能的第一篇 - 『透過XAML碼來繪製圖表』,時間允許的話,我會再陸續把一些範例和教學影片放上來,希望對各位有幫助。

[範例下載] [下載影片]

2008年12月5日 星期五

研討會:利用Silverlight Toolkit豐富你的Web應用程式 - 投影片 與 範例展示

先前提到過的 12/4 在台灣微軟舉辦的『利用Silverlight Toolkit豐富你的Web應用程式』研討會 的相關 投影片 與 其中那個DataGrid與Chart的資料繫結範例展示 請點選下載。

很感謝當天現場參與的每一位朋友, See you next time ^_^

BTW, 有學員問到先前幾場研討會的相關投影片,請參考台灣微軟網站:
http://msdn.microsoft.com/zh-tw/aa570302.aspx

2008年11月23日 星期日

利用Silverlight Toolkit豐富你的Web應用程式

12月4日,將在台北微軟 7樓舉行一場MSDN研討會,重點將放在Silverlight Toolkit,對Silverlight有興趣(或是對如何在網路上建立圖表、或是數位儀表版...等有興趣)的開發人員請千萬別錯過囉,除了會場中所分享的內容之外,如果時間允許的話,或許我還可以提供一些額外的Resource,總之,到時候見啦。

搶先報名吧:http://www.microsoft.com/taiwan/msdn/events/webexperience/event081204.htm


議程:
Silverlight 2.0 開發技術簡介
Silverlight 控件 與 User Control 的使用與開發
Silverlight Toolkit 介紹與使用技巧
內容:
  眾所期待,Silverlight 2.0 終於在 2008 年底正式與我們見面,在這個版本當中,除了原有的 Web 動畫影音技術外,還大幅增加了資料繫結、遠端資料存取、控件、樣板樣式、多執行緒…等開發人員所需的各種功能,一舉將 Web 應用程式開發帶向另一個嶄新的里程碑。
  隨著 Silverlight 2.0 的上市,微軟同時提供了 Silverlight toolkit 這一套內含原始程式碼的控件集,讓開發人員在架構 Silverlight 應用程式時免費使用,透過這組控件可輕易的產生各種互動式圖表、使用諸如 TreeView, AutoCompleteBox, DockPanel, UpDown, ViewBox…以及未來多達數十種控件與UI外觀樣式。 在這一個場次當中,我們將透過實際的範例,帶領學員進入 Silverlight 應用程式開發的領域、體驗 Silverlight Toolkit 當中豐富的控件,讓您將 Web 應用程式開發帶向另一個全新的未來。

2008年11月17日 星期一

技術的變與不變之間...Silverlight 3.0的驚鴻一撇

今天在公司開會的時候,一位作者好友透過MSN通知我Scott的BLOG上果然開始出現了Silverlight 3的消息,我一聽不得了,第一時間看了Scott的BLOG,大意是說,Silverlight 2在今年推出正式版之後,在一個月內,已經有超過100 million(哇哇,超過一億? 會不會太誇張??? 應該是很多機器overlap的重新計算了吧,像是我,至少裝了30次)機器安裝了Silverlight 2(不過,聽起來微軟好像對這個數字很爽的感覺^_^)。

而且,還有很多Sivlerlight 2使用在產品中的真實案例(嘿嘿,當然,內舉不避親,其中我覺得最重要的,就是K2的blackpoint,如果有人對這個產品有興趣,可以跟我聯絡),足以證明Silverlight 2是一個可以真實應用的開發工具。

接著Scott趁勝追擊的說,將在next year推出下一個版本的Silverlight 3,令人興奮的部分是,在大家開罵了很久之後,終於,終於,可以在Visual Studio和Visual Web Developer Express當中以所視即所得的方式設計Silverlight了,Data Binding的部分也有工具(Wizard)可以設定,而不需要手動去下Code(剛好這件事情就是那天去參加好友的seminar後,在路上和他討論的問題,嘿嘿,沒想到他還真有先見之明),另外加上對3D的支援,以及對H.264 video格式的support...總括一句話,就是功能越來越強就對了(老實說,就是Silverlight的WPF化),然後Scott暗示大家趕快投入開發的行列,因為早晚有一天,Silverlight會把Fl?x幹掉(後面這句話是我自己加的...^_^)

看了這一篇BLOG之後,我挺有感概,技術變化得太快了,對於寫書的作者來說,會不會是一個很大的打擊呢?Silverlight 1.0的書才剛出,Silverlight 2.0就馬上Beta 1,現在Sivlerlight 2的書還沒出,馬上就有Silverlight 3的消息,是怎樣?拼進度嗎?

回頭想想,到底是哪個環節出問題? 是外國人太快,還是我們太慢? 老實說,我相信大家都沒什麼內幕消息,而且現在到處都是BLOG,訊息非常透明,要有秘密也不容易,也就是說,這些Roadmap是大家早已知道的,而且三五不時釋出一些消息早已是常態,所以開發人員應該要習慣這樣的狀況。

ASP.NET不也是這樣? ASP.NET 2.0出沒多久,又多了一個ASP.NET AJAX 1.0(而且回想一下,AJAX 1.0出之前,Altas炒了多久?),又沒多久ASP.NET Futures出現了,然後接著是ASP.NET MVC Preview…、然後是ASP.NET 3.5,出了不到半年,馬上來個ASP.NET 3.5 SP1,然後PDC剛過,ASP.NET 4.0的Roadmap就丟了出來…搞什麼???

無言,改版更新已經是常態,從過去的一年、一個月、變成一季、每個月、加上BLOG推波助瀾,你會覺得幾乎每周都有新的東西,資訊是自由流通了,開發人員其實是很幸福的,隨手就能掌握最新資訊,有點蓋茲當年說『資訊隨手可得』的味道…

技術變更的那麼快,是不是真的會讓開發人員很辛苦呢? 仔細想想,其實不盡然,因為變與不變之間,是有那麼一條線存在的。

如果你追的是技術,我要說確實,你可能真的會追得很辛苦,開發技術是一直在變的,學會特定的技術不見得會幫助你成長,頂多只能幫助你『解決問題』。是的,這些技術都是在解決特定的問題,有問題、有解決方案、有新問題、有新的解決方案,如此而已。

技術會過時,毫無疑問,會的,但是累積的經驗不會,過去的COM過時了,過去的DAO、RDO、ADO過時了,甚至Web Services可能也要過時了,但是當面對新東西、面對ADO.NET、面對LINQ、面對WCF、REST…,我要說,如果過去你學的扎實,你會知道為什麼這些新技術會誕生,每一個技術的誕生都是為了解決過去的問題,彌補不理想的部分、如果過去的底子厚,新技術難不倒你,你會觸類旁通,久而久之,你會從技術的follower變成forerunner,最後成為技術的Leader。

但是如果一開始學習時,只是速成式的囫圇吞棗,如果你只知道怎麼用一們技術,卻不明白為何需要這個技術,例如:很多人知道『物件導向』,卻不知道為何需要『物件導向』或是『物件導向』技術的目標與優點,那問題就很大了,同樣的,你上面把這句話中的『物件導向』四個字,換成LINQ、WCF、WF、Silverlight…,換成哪一個term都行,因為放諸四海皆準)

知其然而不知其所以然,會有蠻大的問題,在學習的過程當中,這些技術沒有『內化』成你的一部分,這會是一個很大的問題,在ASP.NET技術中,很多部分也是這樣,有很多工具我們都會用,但是不盡然知道為什麼,當然我能理解,因為現在專案的特性,需求變動大、結案時間短,架構、規畫這些東西根本不在很多開發人員的考量當中,許多開發人員只是希望能夠盡快用自己熟悉的技術做完專案,然後結案領錢,說實在的,因為規模不夠大,所以也不見得有辦法用足夠的預算談規格,如果是價格標就更有可能是這樣。

所以我們手上有很多速成式的開發工具,很快速的幫助你完成一個系統,它的取向是速成,但是卻拋棄了架構和延展性,ASP.NET中的幾個XXXXview控件就是典型的例子(不過我要強調,它不見得是這些控件不支援,只是很多開發人員選擇走捷徑,把SqlDataSource和xxxxView拉一拉了事,完全不管這樣的結果會如何)。

這讓我想到『尼可拉斯凱吉』演的『氣象人』,其中有一段話,因為主角常被路人拿速食(例如熱狗、漢堡、可樂…)ㄎㄟ,他不明白為什麼,後來靜下心來,他發現自己就像速食,每天在電視台上報氣象,短短五分鐘,沒什麼營養,但是卻能夠馬上吃飽,看起來有模有樣,年薪很高,但是骨子裡卻很空洞。

我發現這個對速食的描述真是太好了:『很快能吃飽,但是卻沒什麼營養』。在我們這個時代,實在有太多東西是這樣的了,我們很快的兜出一個解決方案,迅速滿足客戶的需求,客戶在煞那間似乎覺得飽了,但是老實說這樣的解決方案沒啥營養,不能長久的徹底的解決問題,但是似乎大家也接受了。我們的學習也是這樣,速食導向,在學校裡學了很多的技術,把大家餵的飽飽的,但是是不是很有營養,真的很難說,有多少技術出了學校就在也沒用過了,或許我們要學的是觀念,而不只是技巧…

我自己也檢討了一下,是不是我們寫書時也會掉到這樣的陷阱中,塞了很多東西把讀者餵飽,頁數厚厚的,感覺很超值,但是營養卻不夠,很快的,大家就餓了。

過去這一年,我花在寫書的時間上很少,因為我對技術書有蠻強烈的消耗品的感覺,一張好聽的CD,我可能可以保留很多年,但是隨著資訊技術演變的速度,現在一本書放在架上可能不到一年半就要say goodbye了,讀者買了佔書架,搬家的時候也累,讓我覺得有點罪惡感,當然,我不是說寫書不好、或是大家不應該看書,反而我覺得大家應該多買書、多看書、不然很多全職的作者很辛苦的,而且如果好的書沒有被鼓勵,那有心的作者會越來越少…

而對我來說,我希望能慢慢調整,能夠寫一些可以長久的書,不會隨著技術的演變和改版而凋零的書,當然,新技術我們還是會介紹,但是BLOG不是比書來的迅速多了嗎?

以前我記得老師在指導我們如何蒐集資料時,提到一個觀念,如果大家希望找到最新的第一手資訊,那期刊或許可以滿足你的需求,但是如果你需要觀念,需要完整的引導、需要奠定基礎,那書本永遠是最好的選擇,一本書是作者『經年累月的經驗累積』。

一本書是作者經年累月的經驗累積』,我對這句話很有感覺,我希望自己寫作,能夠在書本當中呈現的是經驗的累積,而非只是技術的介紹,畢竟現在以BLOG介紹新技術是最好的選擇,想到隨手就寫,沒有時間空間的限制。

而出一本書,我真的不想再被版本趕著跑,對讀者來說,我可能要Say Sorry(對出版社我也得說聲Sorry),我很想寫的快,但是我更希望寫得好,畢竟一本可以對讀者長久有幫助的書,總比曇花一現的排行榜冠軍對我來說意義大的多。

面對新的技術,面對快速變動的技術,我真的覺得開發人員不需要擔心,因為經驗依舊是會累積的,開發人員的價值必須彰顯在你的經驗上,對於開發架構、對於規畫、對於專案運作的熟悉,比起對於特定技術的了解,更會是你與別人不同的競爭力和利基。

對於初學者,我想特別說句話:了解怎麼使用一種技術很重要,但是了解背後的原理、架構、和『為什麼』,一樣的重要…千萬別只是學會用一種技術,而不知道為何要用這種技術…

2008年11月15日 星期六

以WCF來開發RESTful風格的服務

  在上周『從Web Service到RESTful WCF的心情』一文中,我提到了對REST的感想,而這一篇,則是介紹.NET 3.5 中對REST的支援,說明如何透過WCF開發RESTful服務,不過,當.NET開發人員要透過WCF來開發RESTful的服務之前,有一些基本的觀念需要釐清。所謂的REST技術,其精神是透過Uri來描述存在於網際網路上的資源,例如:

    http://www.studyhost.com/Eshop/Products/Nokia5130

  上面這串網址可表示一個產品資料表中的產品,產品名稱為Nokia5130,若我們想取得資料,可透過HTTP GET方法,以上述網址來取得。

  若我們想刪除這個資料,則一樣是上面這串網址,但是對IIS伺服器送出的動作則是HTTP DELETE。如果我們想建立一筆新的資料,則可透過HTTP POST方法,至於要修改,則透過HTTP PUT方法。

  也就是說,描述資源是透過Uri,而對資源要進行的動作,則是透過HTTP verb來進行。有了這樣的觀念之後,我們就可以開始嘗試建議建立RESTful的 WCF服務。我們建立出的WCF服務,只需要遵循上述的 REST風格,即可讓所有的開發人員存取。  

  一直說REST風格而不說REST規格,主要的原因是REST並非是一種哪一個機構或是協會設計出來的規格,由於架構簡單,它僅僅是一種設計風格,就是兩個要點,用Uri來描述資源位置,用四種Http Verbs(包含GET, POST, DELETE, PUT)來決定對這個資源要進行的動作,甚至當我們用調用某一個RESTful的服務時,該服務回傳的資料也沒有一定要以XML型別回傳,也可以是單純的文字或是HTML。總而言之,它就是簡單導向。

  而HTTP Verbs到底是什麼呢?這對於絕大部分時間僅僅使用瀏覽器的開發人員來說,可能有點陌生,HTTP Verbs是HTTP協議定義出的規格,HTTP共有八種動作,包含:HEAD, GET, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT,過去我們常用且熟悉的應該是HTTP GET和HTTP POST,當你在瀏覽器上輸入一個網址,對於IIS伺服器下的指令其實就是HTTP GET,而當你在瀏覽器上按下某一個Submit按鈕(或是ASP.NET的postback),其實就是對瀏覽器下HTTP POST指令。

實際建立RESTful的WCF服務

  由於.NET 3.5的支援,我們可以透過相當簡單的方式來建立RESTful的WCF服務,若開發人員想透過WCF技術,來開發RESTful的Service,只需要在VS2008 SP1的專案範本中,選擇AJAX-enabled WCF Service即可:

接著,您會看到底下的程式碼:


  如果您將最上面註解的『WebGet()』槓掉,該服務就會是一個RESTful的服務,支援 HTTP GET方式。

  不過要讓這個服務能夠正式運行之前,我們必須針對Web.Config作一些調整,請把區段中的『enableWebScript』取消:


  另外,請開啟RESTfulWCF.svc檔案,在.svc頁面的網頁前置詞當中,加入『Factory="System.ServiceModel.Activation.WebServiceHostFactory"』,如此一來,這個RESTful服務才能夠正常運行:


  有了這些概念之後,我們立刻來嘗試建立一個簡單的例子,請建立一個GetData Method,該Method具有一個參數Name,接著在Method上,加入WebGet修飾字,給定UriTemplate即可,相當的簡單:


  UriTemplate是指這一個RESTful服務的呼叫方式(嚴格說起來是描述該資源的Uri位置),是要以何種Uri來表達,透過這種方式建立出來的WCF服務,就直接支援了REST型態的遠端呼叫方式。
  例如,上例中我們給定的『UriTemplate』是"User/{name}",則這個資源可以透過底下的網址來取得:

http://localhost:56712/RESTfulWCF.svc/user/david

  其中的『david』是UriTemplate中的{name}參數,而這個參數可透過我們定義在GetData()中的name參數取得,目前我們在GetData()中僅是將這個參數加上一些文字然後回傳,表示回應了用戶端對資料的呼叫,而呈現出的結果如下圖。我們可以在瀏覽器上直接以HTTP GET來測試:

  很簡單的,就建立了一個RESTful的服務。

2008年11月9日 星期日

John McCain Concession Speech(麥肯敗選演說)

看了新聞,提到麥肯的敗選演說,實在覺得應該要讓大家看看,我對麥肯的認識不深,但是不管怎麼說,這是一篇成功的演說,風度、格局展現無遺,希望台灣的政治人物(如果還有的話...因為大部分我覺得都是政客,距離政治人物還很遠...)可以學習.. (中文大意)

MCCAIN: Thank you. Thank you, my friends. Thank you for coming here on this beautiful Arizona evening.

My friends, we have — we have come to the end of a long journey. The American people have spoken, and they have spoken clearly.

A little while ago, I had the honor of calling Senator Barack Obama to congratulate him.

(BOOING)

Please.

To congratulate him on being elected the next president of the country that we both love.

In a contest as long and difficult as this campaign has been, his success alone commands my respect for his ability and perseverance. But that he managed to do so by inspiring the hopes of so many millions of Americans who had once wrongly believed that they had little at stake or little influence in the election of an American president is something I deeply admire and commend him for achieving.

This is an historic election, and I recognize the special significance it has for African-Americans and for the special pride that must be theirs tonight.

I've always believed that America offers opportunities to all who have the industry and will to seize it. Senator Obama believes that, too.

But we both recognize that, though we have come a long way from the old injustices that once stained our nation's reputation and denied some Americans the full blessings of American citizenship, the memory of them still had the power to wound.

A century ago, President Theodore Roosevelt's invitation of Booker T. Washington to dine at the White House was taken as an outrage in many quarters.

America today is a world away from the cruel and frightful bigotry of that time. There is no better evidence of this than the election of an African-American to the presidency of the United States.

Let there be no reason now ... Let there be no reason now for any American to fail to cherish their citizenship in this, the greatest nation on Earth.

Senator Obama has achieved a great thing for himself and for his country. I applaud him for it, and offer him my sincere sympathy that his beloved grandmother did not live to see this day. Though our faith assures us she is at rest in the presence of her creator and so very proud of the good man she helped raise.

Senator Obama and I have had and argued our differences, and he has prevailed. No doubt many of those differences remain.

These are difficult times for our country. And I pledge to him tonight to do all in my power to help him lead us through the many challenges we face.

I urge all Americans ... I urge all Americans who supported me to join me in not just congratulating him, but offering our next president our good will and earnest effort to find ways to come together to find the necessary compromises to bridge our differences and help restore our prosperity, defend our security in a dangerous world, and leave our children and grandchildren a stronger, better country than we inherited.

Whatever our differences, we are fellow Americans. And please believe me when I say no association has ever meant more to me than that.

It is natural. It's natural, tonight, to feel some disappointment. But tomorrow, we must move beyond it and work together to get our country moving again.

We fought — we fought as hard as we could. And though we feel short, the failure is mine, not yours.

AUDIENCE: No!

MCCAIN: I am so...

AUDIENCE: (CHANTING)

MCCAIN: I am so deeply grateful to all of you for the great honor of your support and for all you have done for me. I wish the outcome had been different, my friends.

AUDIENCE MEMBER: We do, too (OFF-MIKE)

MCCAIN: The road was a difficult one from the outset, but your support and friendship never wavered. I cannot adequately express how deeply indebted I am to you.

I'm especially grateful to my wife, Cindy, my children, my dear mother ... my dear mother and all my family, and to the many old and dear friends who have stood by my side through the many ups and downs of this long campaign.

I have always been a fortunate man, and never more so for the love and encouragement you have given me.

You know, campaigns are often harder on a candidate's family than on the candidate, and that's been true in this campaign.

All I can offer in compensation is my love and gratitude and the promise of more peaceful years ahead.

I am also — I am also, of course, very thankful to Governor Sarah Palin, one of the best campaigners I've ever seen ... one of the best campaigners I have ever seen, and an impressive new voice in our party for reform and the principles that have always been our greatest strength ... her husband Todd and their five beautiful children ... for their tireless dedication to our cause, and the courage and grace they showed in the rough and tumble of a presidential campaign.

We can all look forward with great interest to her future service to Alaska, the Republican Party and our country.

To all my campaign comrades, from Rick Davis and Steve Schmidt and Mark Salter, to every last volunteer who fought so hard and valiantly, month after month, in what at times seemed to be the most challenged campaign in modern times, thank you so much. A lost election will never mean more to me than the privilege of your faith and friendship.

I don't know — I don't know what more we could have done to try to win this election. I'll leave that to others to determine. Every candidate makes mistakes, and I'm sure I made my share of them. But I won't spend a moment of the future regretting what might have been.

This campaign was and will remain the great honor of my life, and my heart is filled with nothing but gratitude for the experience and to the American people for giving me a fair hearing before deciding that Senator Obama and my old friend Senator Joe Biden should have the honor of leading us for the next four years.

(BOOING)

Please. Please.

I would not — I would not be an American worthy of the name should I regret a fate that has allowed me the extraordinary privilege of serving this country for a half a century.

Today, I was a candidate for the highest office in the country I love so much. And tonight, I remain her servant. That is blessing enough for anyone, and I thank the people of Arizona for it.

AUDIENCE: USA. USA. USA. USA.

MCCAIN: Tonight — tonight, more than any night, I hold in my heart nothing but love for this country and for all its citizens, whether they supported me or Senator Obama — whether they supported me or Senator Obama.

I wish Godspeed to the man who was my former opponent and will be my president. And I call on all Americans, as I have often in this campaign, to not despair of our present difficulties, but to believe, always, in the promise and greatness of America, because nothing is inevitable here.

Americans never quit. We never surrender.

We never hide from history. We make history.

Thank you, and God bless you, and God bless America. Thank you all very much.

REST一下吧~ 從Web Service到RESTful WCF的心情

  前陣子我的技術前輩Ruddy在MSDN研討會中,介紹了WCF在.NET 3.5上的一些功能增強,其中一個相當重要的部分是WCF對REST的支持。

  你會發現,最近這一兩年,REST這個字眼常常看到,儘管他是Dr. Roy Fielding在2000年時候就提出的,但是我想真正開始紅起來,是因為Amazon和Yahoo都開始拋棄Web Service改提供REST形式的服務,且RoR和一些其他陣營的開發工具都大張旗鼓的支援...所以,就紅了...-_-'''

  而.NET似乎總是比其他陣營遲緩(或是嚴謹?)一點,不過仗著後台硬(現金多),對於各種技術的支援也總是後發先至,你會看到REST突然之間在.NET開發技術裡佔了一個不小的位置,WCF支持它、ADO.NET Data Service也支持它...

  由於未來我會花一點時間談談ADO.NET Data Service(因為我要在Silverlight當中叫用它),你會發現這個服務也是建立在REST的概念上,透過相當簡單的URL來存取遠端的資料庫。

  在過去,這不是Web Service的主要工作嗎? 是的,在2002年,我寫的第一本ASP.NET書籍當中,還努力的鼓催Web Service的使用,我還記得那時候提的範例,是一個郵遞區號的Web Service呼叫,我還說,如果郵局提供此Web Service,全台灣(或全世界)使用到台灣郵遞區號的程式或網站,就再也不用自己去下載郵局提供的3+2郵遞區號對照表(如果我沒記錯是Excel格式),還要手動轉成DB,還要常常自己上網更新,因為台灣的路名、郵遞區號等資訊常常變...透過Web Service,我們可以輕易的達成網站間或是應用程式間的資料交換,把資訊串起來,讓SOA的理想更有可能輕易實現。

  但是,過了那麼多年,Web Service雖然成功的在企業中被使用,但是多半還是在同質的多系統之間進行資料交換,例如在.NET寫的HR或ERP系統之間交換資料。很少看到我們真正期待的在異質系統之間進行資料交換。Web Service儘管是RPC(遠端程序呼叫:remote procedure call)一個相當不錯的解決方案,但是鼓催了多年,卻始終很難達成異質系統之間的資料交換。why?

  原因有很多,安全性、效能、使用上的便利性...等,先撇開這個不談,無法在多異質系統之間進行資料交換的這個問題,一部分的原因是Web Service採用的XOAP和XML-RPC作為骨架,相對而言還是太過複雜,為了調用遠端的服務你必須先知道服務的位置,以及Web Method,需要知道要傳入的參數和回傳參數的數量、種類、型別、意義...才能夠真正存取該資源。

例如: http://www.studyhost.com/ZipCodeSrv.asm?GetCode

  上面這個URL我們只知道有一個位於http://www.studyhost.com/的服務ZipCodeSrv,(似乎)可以用來取得郵遞區號,問題是要怎麼傳遞資料?從URL上都看不到...

  而REST正如字面上的意思這幾個字,可以讓開發人員好好休養生息一下,它用簡單到不能再簡單的URL,來表達存放在網路上的資源,並且讓開發人員可以進行存取。

  例如,如果你想要公開Northwind資料庫,讓遠端的開發人員可以透過REST方式存取,提供新增、修改、刪除、查詢等功能,那可能只需要底下的URL:

    (GET) http://Store.studyHost.com/products
  上面這串網址可以傳回所有的商品資料

  而
    (GET) http://Store.studyHost.com/products/A0213
  則可以傳回編號為A0213的產品的相關資料

  此外,開發人員對於資料庫中的記錄所會進行的查找、新增、修改、刪除...等動作,剛好可以對應到HTTP所提供的GET、PUT、POST和DELETE方法,看起來就是很簡單的感覺...

  最近正式推出的ADO.NET Data Service,在查找資訊的時候,也是採用REST-baseed技術,以同樣簡單的方式讓開發人員可以輕易的存取遠端的資源(資料庫)的內容。

  回頭看,整個REST技術的目的:
  1.提供相較於以SOAP為based的Web Service更簡單的遠端程序調用方式。
  2.不在現有的HTTP技術上疊床架屋,就是用相同於HTTP協定的各種方法(GET、PUT、POST和DELETE)處理完所有的資料存取。
  3.在異質系統之間的資料交換將變得更加容易,任何平台都可以叫用。


  基於這種種的原因,WCF也開始支援開發人員撰寫REST風格的遠程呼叫方法,.NET 3.5 SP1中的ADO.NET Data Service根本就基於REST技術架構出的服務,而ASP.NET MVC和Dynamic Data技術所採用的URL Routing機制,也有REST技術的影子...

  URL不再只是指向某一個頁面,而是指向某個資源的存在,並且我們可以透過URL來操作(新增、修改、存取)這個資源,而MVC架構中的URL更可以視為指向某一個服務(Service)或行為(action),整個結論就是,簡單、直接、有效...

  會寫這一篇,是因為Ruddy前輩在上個月講WCF和REST的時候,我還不是很能被說服,我覺得Web Service用的好好的,微軟沒事幹嘛多弄個REST來鬧場? 這不是屬於第三陣營的技術嗎? 我需要花時間下去跟大家介紹???

  結果經過了一段時間,有天早上起來,我覺悟了,我發現我錯了,我想通了,看起來,REST還真的會被微軟支援,在異質系統之間的資料交換,目前確實沒什麼比REST還方便的,連WCF和ADO.NET Data Service都支援了,我還在猶豫什麼... 我的Silverlight 2.0(其實也包含WinForm)已經全面的支援 以 REST 為基礎的ADO.NET Data Service呼叫,而現在拿WCF來開發RESTful的RPC輕鬆到不行,如果身為ASP.NET書籍作者的自己不寫個一兩篇REST豈不是遜掉了嗎?

  所以,這一篇,是心情轉折,下一篇,我要來介紹如何透過WCF開發RESTful的RPC...

2008年11月7日 星期五

Keep Walking - 王建民篇

哇, 我喜歡的Keep Walking廣告增加了王建民篇...看來我需要考慮要不要更新桌面了...^_^

2008年11月5日 星期三

兩岸會談對台灣資訊業的影響

  這篇文章的標題很嚴肅,但是我只是想談談自己的一些心情和看法...

  這幾天有很多人在抗議,也有很多人期待這歷史性的一刻,不論如何,不管你是歡迎還是抗議,改變還是即將發生。或許絕大部分政治人物關心的主題是明天(10/6)馬陳會的時候,陳雲林到底要不要稱呼馬英九為總統,聽說這個很重要,因為這涉及主權,但是我比較關心這幾天簽出來的協議,對我未來的影響...

  幾個磋商的重點,在這兩天都已經確認並簽暑完成了,其中是不是可能導致未來台灣IT產業相關的改變,是我比較關心的部分,至於主權這麼偉大的議題我想有太多人因為各種理由而比我關心的多,所以我這種小人物應該不需要特別擔心...(強調一下,我也覺得很重要,只是天塌下來還有別人擋著,感謝他們,所以我先關注一下其他我比較關心的問題...)

  過去一年我的主要開發人員不在台灣,我和對岸的資訊社群、出版社都有密切的合作,不可否認的,由於台商到了大陸(這表示客戶到了大陸),所以過去幾年,有不少的軟體業被迫需要在對岸設點,進而慢慢把一些工作機會從台灣移到了大陸... (難怪買書的人變少了 ^_^)

  這幾天碰到一家廠商,該廠商的主要開發人員(從SD以降)全部在對岸,在台灣只有SA以上的人力佈署,這種模式在這幾年我常常看到,最主要的考量是成本,而令人訝異的是,最近幾年同樣成本、同樣年紀、或是同樣工作經驗的開發人員相比較,對岸的成本明顯還是比較低、素質卻有明顯的提升,相較之下,台灣的junior開發人員和剛畢業的學生狀況頗令人擔心...

  這個趨勢已經從developer蔓延到SD, 而SA因為要面對客戶,所以只要客戶在台灣,在目前大陸人士來台不是很方便的狀況下,被取代的可能性比較低(但是如果你的主要客戶是在大陸的台商,那情況就不一樣了),但是昨天會談的結果,不出所料的,兩岸正式邁向三通,從台北到上海只需要80分鐘,比台北到高雄搭高鐵還快...

  未來,由於實體距離的縮短,是不是更有可能台灣的專案需求完全由大陸的開發團隊承接,我想不需要我們亂猜測,在未來一年內可以看到結果...

  在某些政治人物擔心對岸農產品會不會來台,對岸工作人員會不會搶了台灣人的工作,努力的想要怎樣禁止或是怎樣有條件開發...我要講的是,人家Thomas Friedman三年前就說了,世界是平的,那道牆早就瀕臨瓦解,與其滿腦袋想要怎麼阻擋,不如想想怎麼進行產業升級,怎麼提高競爭力,全球化的競爭早就展開了,你不可能一面講著與世界接軌,一面想盡辦法設限,這些趨勢不是政府、國界、距離可以阻擋的...internet把全世界串起來的那一刻,這些就注定發生了...

  我知道,從技術上來說,用擋的比促進產業升級還容易,讓我想破腦袋,我還想不太出來台灣兩黨哪一個民意代表有足夠的學養和能力來促進產業升級,台灣的民意代表主要的工作內容多屬於揭弊、抗議、做選民服務關切一些案情...至於要思考長遠的獲利來擬定對未來的策略和計畫,因為超過四年任期,所以這個工作沒有短期效益,大多是政治人物不太熱衷...

  全球景氣不佳,冬天快來臨(還是已經來臨?),與其期待政府或政治人物有所作為,幫你塑造出一個美好的經濟環境(我強調,我不是說這個不重要,只是我覺得短期內我看不到),不如自己努力一點,亂世都有人能賺錢,提升自己的競爭力,會是這個階段我們自己比較能夠控制的事情...

2008年11月2日 星期日

在沒有LAN的狀況下讓host與VPC以網路通訊

不知道從幾年前開始,VPC從消遣打發時間的玩具,升級成我每天工作必備的開發/測試工具,雖著VPC使用的時間越多,其中的應用也越來越多元化。

一般來說,我的工作地點都有無線網路可以使用,我的作法會是讓host(我的主機, 也就是NB),跟VPC各拿一個IP,儘管用的是同一張網卡(VPC設定為一張網卡, 對應到host上的真實網卡),但是由於各自有一個真實IP,因此資料傳輸上沒有任何問題。

這個需求不是用來複製檔案,複製檔案從host拖曳到VPC裡面即可,不用繞來繞去透過網路那麼辛苦,這個需求多半是開發Client-Server之間的應用程式以及測試,因此會需要實際有兩個IP進行互動。

但是,在很多情況下我抓取不到兩個IP:
1. 根本沒有無線網路,連一個IP都沒有
2.有無線網路,但是並不是DHCP,連線也有限制,典型像WiFly,你沒辦法讓VPC有一個獨立的IP, VPC還是可以透過NAT方式上網,但是沒辦法和host以IP對IP的方式溝通。

碰到這種情況,殺手鐧就要來了,前陣子跟Michael學到一招不錯,記下來和大家分享,首先,你可以在host上安裝一張虛擬的網卡,名稱為:Microsoft Loopback Adapter:


接著設定這張網卡為固定IP,例如192.168.20.10:


然後將VPC的虛擬網卡設定,增加成兩張網卡(你可以一張設為NAT,一張設為Microsoft Loopback Adapter):


接著把VPC裡面,對應到Microsoft Loopback Adapter的那張網卡IP設定為同一個網段的固定IP,例如192.168.20.20:

你也可以順手把VPC中的另一張網卡設為DHCP。

接著,回到host,試著ping 192.168.20.20,你會發現host已經可以透過網路方式連線到VPC裡面的IP位置:


這樣的做法,可以讓我們在沒有LAN的環境下,在VPC中架設Server,然後從host當中進行存取,或是相關的測試。

2008年10月29日 星期三

Yes, 就是今天, Silverlight Toolkit正式亮相...

  不知道你有沒有參加現在正在美國舉行的PDC,我沒有,但是隨著資訊科技的進步,現在我們已經進入到一個資訊沒有延遲的時代,在PDC中,Scott正式介紹了幾個 Silverlight Toolkit中的新控件,這是我對Silverlight耳聞並且期待已久的控件實作專案,在這個專案中,內含了預計數十個控件(及原始程式碼),提供給開發人員免費使用。

  先前在與微軟一起舉辦的hands-on Lab課程中,學員常常問到的Chart Control, 是的,也包含進去囉~



目前已經看到的內容包括:
AutoCompleteBox
Chart
DockPanel
Label
Expander
TreeView
UpDown
ViewBox
WrapPanel
ImplicitStyleManager
Themes (6): Expression Dark, Expression Light, Ranier Orange,Ranier Purple, ShinyBlue, ShinyRed

  我在上課的時候不只一次被學員問道Silverlight的Chart要怎麼做,今天之前,我的回答都是需要自行撰寫Code, 透過UI Element把圖形畫出來,不然就得等其他控件廠商開發的圖表控件。  
  終於,Silverlight有免費的圖表控件可以用了,配合我在TechED的Demo,未來開發人員想要在Web環境中加上動態圖表,提供數位儀表板的功能將會輕而易舉。
圓餅圖:

折線圖:
TreeView這個標準的控件也被加進去囉,你可以透過底下的代碼輕鬆的完成TreeView的設計:



還有幾套主題樣式可供應用:

  總括來說,它讓我們看到在Sivlerlight上開發Web應用程式或是RIA未來豐富的可能性,同時也可以大幅縮短開發時程,這些控件目前並非此專案的全部,還有為數不少的控件會陸續推出,並且這些控件也在持續的修正與優化當中。
  你對Silverlight 2.0還遲疑嗎? 或許這套控件組能夠大幅增加你對未來的信心... ^_^

喜歡嘗鮮的朋友可以到底下的網址下載:
Silverlight Control toolkit
http://www.codeplex.com/Silverlight

2008年10月27日 星期一

給生命留一點餘地...

  有一本書你一定聽過,叫做『有錢人跟你想的不一樣』~

  這本書裡面有一句話很經典,差不多是這麼說的:『你想賺多少錢? 如果你說你想賺一千萬,那很抱歉,你就『只能』賺一千萬...』

  關鍵字在那個『只能』上面。

  劉德華有一部電影,我忘了他的片名,但是其中有一句台詞我記的印象深刻:『有信心不一定會成功,但是沒有信心一定會失敗。』

  說真的,上面這些,我都同意,因為我經歷過,而且我也相信,你的夢想有多大,成就就可以有多大。我習慣在每一年的年底(生日過後)幫自己訂下一年度的目標,說來你可能不相信,多半都實現了,只要有具體訂出來時程、數量的具體目標,實現的比例很高(誇張到自己也不相信的目標除外),當然偶而也有一些意外,但是我要說,真的差不多是這樣,你的夢有多大,成就就可以有多大...(這些,我會找一天寫一篇文章..)

  但是,我今天想說的卻不是這些,而是...給生命留一些餘地...

  為什麼會突然這麼說? 因為最近打開電視上,消極負面的東西實在太多,我猜最近很多人一定碰到了挫折,景氣那麼差,財源恐怕無法自然而然的滾滾而來,像我上一篇說的,想要幫客戶賺錢恐怕沒那麼容易,這個時點恐怕活下去比較重要一些,況且不僅財源不來,恐怕來的是裁員...

  最近看周董的MV,『蹈香』真的很讓人感動,礙於著作權的關係,所以我不直接貼在下面,但是你進youtube隨便找,也可以找到這個MV,除了歌曲好聽之外,詞的意義頗令人反省和深思,MV拍的又讓人動容...衝著這一點買他個正版算是鼓勵一下...

  話說回來,在多頭行情下,我會鼓勵大家往前衝,豁出去,有夢最美、財富相隨,管它世界局勢如何,拼下去多半會有結果,但是現在不是,現在是空頭行情,不過如果你想的是怎樣保守活命,那我覺得太消極,我覺得依舊可以努力,可以盡力,但是不要給自己過多的壓力,不要沒事就自焚抗議,或是成為公司中的激進份子,保住好工作,度過難關,恐怕是這個階段最重要的。

  如果不幸,像MV劇情中的主角,被fire掉了,又找不到工作,我的建議是,不要急,政府有非自願性失業補助金,金額還蠻高的可以領六個月,不妨趁這個時間,乘著高鐵回老家看看、離開都市看看這世界其他美好的地方,作一些你一直很想做,但是卻沒機會做的事情,同時間,找朋友聊聊,去幫助別人,甚至去做義工,你會發現很多人其實都需要幫助,也不是每一個人都過得很幸運,我們有的,其實已經比其他人多很多了...

2008年10月26日 星期日

如果客戶不賺錢...

  在軟體業待了那麼多年,也做了不少的案子,當過甲方、也當過乙方,回顧過去,大小案子不少,但是有沒有哪一個案子直接跟客戶的獲利有關? 好像有,但是不多...

  我們說服客戶買單的幾個重要原因(或是客戶找你買軟體、作專案的幾個重要原因)不外乎如下:
1.希望用了你的軟體之後,能降低營運成本
2.希望用了你的軟體之後,能提高效能(或產能),或是加快工作速度
3.希望用了你的軟體之後,能解決特定問題
4.不得不買,因為舊版的軟體過時或太爛
5.對未來的願景有所期待,典型的狀況就是聽了很多電腦化的優點之後,老闆下定決心,將公司全面電腦化...
6.預算太多,消化一下

  先不管上面這些期待(或是原因)是否合理,還有在導入軟體正式上線之後有沒有真的發生,你會發現,就算真的都發生了,也很少能夠幫客戶賺錢,最高最高的效益大概是幫客戶省錢。

  沒錯啦,廣義的來看,幫客戶省錢也是某種程度的賺錢,特別是這麼不景氣的時候。

  但是這也表示,客戶並非非要你的軟體不可,它不是無可取代的,不是不可或缺的,在企業軟體當中,乍看之下似乎並不多能夠直接幫客戶賺錢的軟體或專案,幾個在軟體界常聽到的解決方案:ERP、EIP、CRM、PLM、BI、DSS、SCM...等,絕大部分的軟體都是以節省企業成本的角度來考量,而非幫企業提高獲利。

  但是回過頭來看,節省成本這件事情有點吊詭,因為公司在短期間內不太可能因為買了你的軟體或導入你的專案,就立刻降低成本(例如因為工作效率提高了,所以把公司的員工fire掉一半,所以財報上看不出效益,頂多生意可以越做越大...但是財報上短期間還是看不到效益),反而會因為要導入新軟體,可能會增加工作量、聘用很多臨時性的工作人員,這又是一筆開銷...

  等到軟體導入一兩年後,差不多可以幫助企業省錢(獲利)了,卻很少數據可以清楚的顯示,這一來一回之間,企業到底要花多久的時間才能換回當初的購置成本? 而軟體的變遷如此迅速,客戶的需求也如此多變,兩三年後這套軟體又要重新購置或是調整,企業是不是賺錢和到底是不是與導入了我們的系統之間有正相關,似乎很難得到一個正確的判斷...

  是不是因為這個原因,所以我們也很少看到軟體廠商提出數據來佐證,因為XXX客戶導入了我們的產品,所以今年的業績成長一倍...或是YYY公司買了我們的軟體,所以今年EPS多了一塊錢...或是ZZZ公司成功導入了本公司的軟體之後,當場fire掉了一半的多餘員工...(這套軟體聽起來很可怕)

  說真的,就算軟體公司敢這麼說,你大概也不見得會相信,你可能會覺得,軟體公司在唬爛,因為整體的成敗怎麼會由單一一套軟體來決定...

  我常在想,一台電腦、一台印表機、一部車,我們在會計上稱之為生財工具,可能會攤個幾年,我們期待有了這個物品之後,可以得到一個很明確的效益,但是在軟體產品上,這個效益似乎很難評斷...

  責任當然不盡然全是在軟體廠商身上,企業的成敗當然不可能全然建立在一套軟體產品上,但是話又說回來,還有誰比我們(這些程式設計師、這些軟體供應商)更清楚一套好軟體對於企業的意義和價值? 我們清楚知道,但是卻說不出來?

  如果我們真的相信,為何卻無法理直氣壯的跟客戶說,你非買我的產品不可,特別是這個攸關生死存亡的時刻、這個不景氣的年代,你想要超越對手、想要異軍突起、想要突飛猛進,買我們的軟體就對了...

  確實,似乎沒有看到哪一家軟體廠商敢說,用了自己公司的產品的客戶就一定賺錢,這種事情沒有掛保證的,因為很可能我幫企業提升了EPS一元,但是那家企業的老總因為其他錯誤的決策導致公司虧兩元EPS,要是沒有我,可能該公司死得更慘...

可是說真的,我希望我客戶賺錢...如果我的客戶不賺錢,我怎麼彰顯出我的產品的價值?又怎麼說服另一個新客戶,使用我的產品才是最好的選擇?

  尤其是軟體的使用部門或是客戶端的導入單位(多半是MIS或是End-User),從我的角度來看,怎麼說軟體供應商和MIS(或是企業的End-User)其實都是站在同一條船上,軟體導入成功,就是雙贏,軟體導入失敗,得一起面對接下來的責難和困境...

  但是,在這一條船上的人,往往卻在專案中並非總是在同一陣線,偶而不小心還會有那麼一點點敵我意識,越大型的專案、金額越高的Cast,似乎越容易有這種感覺...

  但是相信我,如果我的客戶不賺錢,其實對我來說並不是一件好事情,我比我的客戶自己還希望客戶能賺大錢...當然最好是因為我的關係^_^

  有了這一層體驗之後,再回頭看軟體開發,或許你將會有一種不同的感覺,PM、SA在規劃整個專案、或是面對客戶的需求、或是制定產品規格的時候,如果真能從客戶的角度設想,更積極的想方設法的透過我手上規劃的這個專案或軟體來幫客戶賺錢(而不只是省錢),相信從這個角度所規劃出的系統和軟體將會和只是面對客戶提出的需要而逐一回應和解決有所不同。

  一個積極主動、另一個消極被動,當SA在規畫的時候,心裡想著的是如何幫客戶賺錢、和想著的是怎麼快一點結案收款,我相信將會是完全不同的兩種規劃結果...其實,怎麼說這也是互利,畢竟,客戶賺得越多,付款就越阿莎力,未來也有更多的合作幾會...說真的,越不景氣的年代,越是得更積極的協助客戶賺錢...

  客之獲利、常在我心... 我希望,我的每一個客戶都賺錢...^_^

2008年10月25日 星期六

Destiny

半夜兩點, 剛好不想睡...

回頭看自己寫的BLOG, 說真的, 讓自己感動的文章不多(廢話,都是技術文章,哪來的感動...) 倒是看到一篇自己很久以前寫的, 我很愛的電影, 本來, 這個title我打算寫很多篇讓自己有感覺的影片, 沒想到上一回寫居然是幾個月前了...

看著這一篇文章, 我想到另一齣我很愛的電影, 航站情緣:



很輕鬆的休閒小品, 每年總是會有一些(多半都出現在聖誕節前後)的小品電影,像是尼可拉斯凱吉演的『扭轉奇蹟』、或是約翰屈伏塔演的『天使不設防』、或是前陣子休葛蘭的『K歌情人』,這些電影都有一些特性,劇情不複雜,輕鬆有趣(不會給人沉重的感覺),但是如果細細品味,總是讓人有所收穫,這是我喜歡的電影的典型...

話說回來,湯姆漢克的這一部『航站情緣』,也是一部讓我看了超過一次(已經很難得了)的電影,最近在HBO上也重複的播出,它描述一名從東歐小國搭機前往紐約的旅客--威特賴瓦斯基,因為祖國發生武裝政變,使得他的護照失效,只得滯留在美國的國際機場,無法進入美國國土,也無法回國,住在機場航站的過境大廳,等到祖國的戰爭結束。他所住的機場,每天有成千上萬的旅客來自世界各地,讓他在這裡看盡人生百態,甚至和一名美麗的女空服員艾蜜莉(凱薩琳麗塔瓊絲)展開一段沒有結果且極其短暫的戀情。

其中我覺得最發揮片中關鍵喜劇角色的是清潔工嘉塔(庫瑪帕蘭納),他讓整部片輕鬆不少,特別是他在湯姆漢克和凱薩琳晚餐的那一幕(表演特技和轉盤子,我每次重看都會笑一次):


而美麗的凱薩琳則是讓整部片子柔和的要素,凱薩琳是一個美麗的空姐,但是由於總是在各國之間奔波,使得她似乎沒有辦法維繫一段固定的感情,片尾,凱薩琳依舊選擇回到有婦之夫的情人身邊,留下一個字... Destiny~

這個字,總是給這部片子一個很特別的結尾,我覺得我不喜歡結局亂搞喜劇,凱薩琳不可能跟湯姆漢克在一起的,至少我們這個年紀的觀眾會這麼認為,凱薩琳和湯姆漢克在一起的結局是給18歲的年輕人看的電影...這部片,我覺得不是,這部片中有那麼一點點世故和現實的無奈,而大家也都接受了,就像我們所處的人生一樣...不見得事事順心、事事如意,但是這就是人生, 儘管如此,我們也總是在一些片段的歡笑當中,留下了難忘的回憶,不是嗎?

周末,如果你呆在家裡只能上網無事可做,推薦你,讓自己休息一下,靜下心來享受一部輕鬆的好電影...

2008年10月18日 星期六

Vista的休眠功能消失



對我來說,Vista的休眠和睡眠兩個功能相當的重要,我絕大部分的時候都沒有關機,都是採用睡眠功能讓系統把狀態保留在記憶體中,由於這時候系統僅對記憶體和主機板供電,所以省去了把RAM中的內容保留在HD上所要耗費的儲存時間,而且並不耗電,所以即使在電池低電位的狀況下,放個一晚上也算是OK。

而休眠這個功能則是把RAM中的狀態存放在HD中,所以少說也要寫個幾G的大小,資料是存放在C:\hiberfil.sys檔案中的,但是不使用時卻占用了很大的空間(我的NB上大概佔了3.5G)。有一次在安裝系統時,為了空出C:的空間,我只好把這個檔案刪了,但是刪了之後,卻發現我的休眠功能不見了(如上圖)。

這個功能不見了對我來說有個問題,因為我常在四處遊走,所以電池是一直會使用的,先前我從不用擔心沒電,因為除了還有一顆備用電池外,若我長時間離開座位而電池沒電,Vista會貼心的幫我進入休眠狀態,但是由於先前我把休眠檔案給殺了,所以現在我的 Vista 是直接斷電,這對我來說就是一個大問題了...

找了半天設定,好像沒地方可以設定...-_-'''

只好上Google Search一番,解決方案如下:


OK,我的休眠又出現了...^_^

2008年10月15日 星期三

除了正式發布Silverlight 2.0之外...

OK, 你一定已經知道Silverlight 2.0正式發布了(當然, 我是指英文版...), 如果你還不知道, 那表示大概有幾個該訂閱的BLOG而你沒訂閱...^_^

Anyway, 所以Silverlight 2.0的部分我就不多說了(很多BLOG上都提到了),新的控件、新的外觀樣式、還有一堆包含控件原始程式碼的Silverlight Toolkit專案(就是一堆免費使用的Silverlight控件啦)預計將在這個月的PDC後會有第一個preview版本。這個就蠻令人期待的, scott說,控件的部分目標是100+個...其實回頭看看這幾年類似的幾個Project,不難發現MS這一兩年真的蠻善用社群的力量, 不管在開發或是蒐集意見,社群都有蠻深度的參與...畢竟社群的力量是不可忽視的~

另外一個我蠻開心的部分是,如果你有看過我在techEd 2008中ASP.NET 3.5 SP1場次Demo的Silverlight調用ADO.NET Data Services,當時採用的版本是beta 2, 在使用ADO.NET Data Services的時候, 需要手動執行底下的指令:

DataSvcUtil.exe /language:VB /out:Proxy.vb /uri:http://localhost:50639/NorthwindDataService.svc

來產生一個class file, 其實骨子裡做的事情就是類似Add Web Reference動作所做的工作,那...怎麼不乾脆讓開發人員在VS2008當中用Add Web Reference就搞定呢? yep, 很多人問了這個問題,在正版中這部分也會改進囉...相當令人期待...^_^

Silverlight技術絕對會帶來Web Solutions開發上的改變,這部分的影響或許將會更甚於Flex, 老實說這部分很多人在討論,也有著不同的看法,但是這部分我卻有一個自己的看法,原因呢? 並非Silverlight比Flex技術來的優越, 而是.net開發人員對Sivlerlight 2.0的接受度,大概要比起Flash或是Java(PHP)開發人員接受Flex的機率來的高很多(我想會非常多), 而反過來,讓.net開發人員接受Flex的程度,恐怕要比讓Flex或Java(PHP)開發人員接受Silverlight的機會來的低太多了...

為什麼會這樣, 我想觀察一下兩邊開發陣營的特質後應該不難了解,而Rich UI恐怕很難不是未來Web Application的趨勢...Q4到明年的Q2,你將會看到很多Sivlerlight的產品和專案在市場中出現(包含我手上的幾個Idea和Project...^_^),因此,是否要立即踏入Silverlight 2.0的行列,我留給大家自行決定...畢竟就像TechED時我說的,將適當的技術用在適合的專案上,是我一直以來的感受和看法,每一個開發團隊可以依照自己的需求,或是產品的特性來選擇適當的技術和導入時間點,特別是這一兩年技術更跌迅速,加上碰上這麼不景氣的年代,有人會選擇保守一點,也有人會選擇奮力一搏,將危機視為轉機,趁勢凌駕於競爭對手之上...

what's next? depend on you~

2008年9月29日 星期一

Silverlight 2.0 RC release!

Sivlerlight 2.0 RC版本公布了,這也表示正式版距離不遠了。

果不其然,大家在意的幾個控件加了進來,包含ComboBox, PasswordBox, ProgressBar, 除此之外, 比起Beta2, 在控件的外觀上做了一些調整(不過反正也只是換一套Skin, 這部分即使RC沒加進來,開發人員也可以輕易的透過客製化機制來完成。

而開發工具的部分,則可以透過Blend 2 SP1配合 vS2008進行開發,相關的下載與工具可以在底下網址找到:
http://silverlight.net/GetStarted/sl2rc0.aspx

by the way, 有一個非常重要的改變是,在beta 2版本時,ADO.NET Data Services的調用需要額外下載一個.dll檔案(如同我在TechED當中的介紹),而這部分現在已經加到RC版本裡頭了,期望在正式版本時,能夠直接搭配VS開發工具引用ADO.NET Data Service,那一切就更加的完美了。 ^_^

2008年9月25日 星期四

TechED 2008 taiwan

TechED 2008 Taiwan 研討會

WUX203 2008/09/24 16:50 - 18:00 使用Microsoft Silverlight 2建置豐富的Web應用程式
WUX306 2008/09/25 16:50 - 18:00 ASP.NET 3.5 Extensions與Silverlight 2整合應用實務分享

一年一度的TechED在晴朗的天氣與熱鬧的氣氛中結束了,上面兩個場次是筆者負責的主題,相關的下載點可以參考底下的位置,如果有任何問題,也歡迎來信一同討論。關於這兩個主題的其他相關訊息,我會陸續在BLOG上和大家分享。

Microsoft Silverlight Tools Beta 2 for Visual Studio 2008
http://www.microsoft.com/downloads/details.aspx?FamilyID=50a9ec01-267b-4521-b7d7-c0dba8866434&displaylang=zh-tw

Microsoft Expression Blend 2.5 June 2008 Preview
http://www.microsoft.com/downloads/details.aspx?FamilyID=32a3e916-e681-4955-bc9f-cfba49273c7c&displaylang=en

Deep Zoom Composer - English
http://www.microsoft.com/downloads/details.aspx?familyid=457b17b7-52bf-4bda-87a3-fa8a4673f8bf&displaylang=en


ASP.NET MVC CodePlex Preview 5 Installer + Source (ASP.NET MVC 5 Source Code)
http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16775

ASP.NET AJAX Enhancement


ADO.NET Data Services Silverlight 2 B2 Client Refresh (Silverlight 2 beta 2 調用 ADO.NET Data Services時會用到的.dll) http://www.microsoft.com/downloads/details.aspx?FamilyId=CF8F88C3-D869-46DE-A7BF-FB7712C791B7&displaylang=en

底下是TechED Silverlight上課時設計的SimpleMediaPlayer,提供給需要Source Code的學員參考。其中包含了Timer的使用、全螢幕切換的技巧、MediaPlayer的設計、Grid的使用、InitParams的使用...等機制。

由於沒有附上影片檔, 因此我把程式稍微改了一下,建議您在測試時,採用底下這樣的URL測試...SilverlightApplication6TestPage.aspx?VideoUrl=wmv
影片url若使用預設的影片位置, 由於影片解析度較高,需要連上internet並稍等影片下載...
若有使用上的問題歡迎來信討論...[下載]

2008年9月16日 星期二

對我的人生有重大影響的幾本書

在台灣(其實在很多其他地方也一樣)資訊人員成功(或是獲利高低)的關鍵幾乎都不是技術能力,或許技術能力是一張門票、或是入場券,但是真正讓人成功的因素,往往不是人人都有且可以迅速學習而得到的技術能力,常常左右你成功的因素其實是一些觀念和習慣,特別是工作上的習慣。

很幸運的,在過去我念書的過程中,有兩年的時間我讀的是管理,而學校的圖書館充斥著相當精典的管理書籍,特別是這些書都不難看,很生動的讓人愛不釋手,你往往會有捨不得翻完的感覺。

我不常分享這些書,今天突然想到,列一下清單,算是留個紀錄,如果以後有時間我會逐本跟大家分享,讀書一直是一個很好的享受,如果你能夠給自己留一點時間,不妨泡杯好茶,或是煮杯咖啡,好好享受讀書的時間,至於哪些書,我都列在下面,每一本書都對我人生(特別是工作)有很大的影響,希望對你也有幫助...

【與成功有約 系列】《柯維七書(與時間有約、與成功有約、與幸福有約、與領導有約、與青春有約、與影響力有約、與生活有約)》天下文化著,天下文化出版。


【目標 系列】
《目標-簡單而有效的常識管理》高德拉特等著,天下文化出版。
《關鍵鏈-突破專案管理的瓶頸》高德拉特著,天下文化出版。
《絕不是靠運氣》高德拉特著,天下文化出版。
《仍然不足夠:ERP加TOC的企業電腦化新境界》高德拉特著,天下文化出版。

【乳酪系列】
誰搬走了我的乳酪?
禮物、峰與谷 [史賓賽.強森]
世界是平的

【狄馬克系列】最後期限:專案管理101個成功法則
Peopleware: 腦力密集產業的人才管理之道 (Peopleware: Productive Projects and Teams, 2nd ed. )

【棉花糖系列】別急著吃棉花糖
萬一吃了棉花糖

【派屈克 藍奇歐尼 系列 】總裁的迷惑 — 健康組織的四大準則(The four obsessions of an extraordinary executive)
開會開到死(Death by Meeting)
團隊領導的五大障礙(The Five Dysfunctions of A Team -–A Leadership Fable)

2008年9月6日 星期六

Silverlight的Password TextBox和ComboBox, Masked TextBox

在周四周五的場次中,都有學員問到一個問題,Sivlerlight 是否支援可以輸入Password的TextBox或是像是WinForm的Masked TextBox?

很遺憾,目前答案都是否定的,因此學員必須要繼承TextBox或採用UserControl自己開發類似的功能,不過我一直覺得這不會是個問題,因為WorldWide廣大的.NET開發人員會幫助你完成這個部分,我肯定在internet上一定早有這些控件,所以我回來找了一下,在CodeProject找到兩個符合需求的,提供給學員參考。

http://www.codeproject.com/KB/silverlight/slpassbox.aspx ←支援Password的TextBox
http://www.codeproject.com/KB/silverlight/STextBox.aspx ←ComboBox, Masked Textbox(不過這是Beta 1版本, 在Beta 2使用需要修改一下)

兩個都有Source Code,需要的學員可以參考...

另外,其實如果我沒記錯在Beta 1 WatermarkedTextBox是存在的,但是在Beta 2就拿掉了,原因聽說是MS打算在正式版的TextBox加上一個Watermark屬性在textBox上,但是如果你需要原本的WatermarkedTe控件參考的話,可以從此位置下載 http://kkam.members.winisp.net/projects/watermarkedtextbox.zip

2008年9月5日 星期五

Silverlight 2.0 Simple Media Player

底下是周四在台北場次上課時設計的SimpleMediaPlayer,提供給需要Source Code的學員參考。其中包含了Timer的使用、全螢幕切換的技巧、MediaPlayer的設計、Grid的使用、InitParams的使用...等機制。

建議您在測試時,採用底下這樣的方式測試...
SilverlightApplication6TestPage.aspx?VideoUrl=wmv影片url
若使用預設的影片位置, 由於影片解析度較高,需要連上internet並稍等影片下載...

若有使用上的問題歡迎來信討論...
[下載]

Keep Walking


我很喜歡的那個廣告的主題曲...

Come One Day

Composer: Eddie aka DorYuk
Lyricist: Eddie aka DorYuk
All instruments: Eddie aka DorYuk
Singer: Adrian DeSilva (Audio Traffic)


Where, where are your dreams.
You've miss placed them or so it seems.
You, you've been running away.
Been running from yourself,
Its up to you and no one else.

If you don't care, if you don't try,
Then life will pass you by,
But you won't know, and time will show,
The fire burnt out long ago.
Gotta to keep on pushing
Push it everyday.
Trying every way.

Keep moving on, keep going now.
Keep pushing on your way.
Keep going now, don't hesitate.
Your dreams will come one day.
They will come one day...

Maybe some day,
Maybe somehow,
You'll stand up and make us proud.
And if they say,
You're a fool to try.
Just smile and walk on by.

Need to keep on pushing,
Pushing it everyday,
Trying everyway.

Keep moving on, keep going now.
Keep pushing on your way.
Keep going now, don't hesitate.
Your dreams will come one day.

Keep moving on, keep going now.
Keep pushing on your way.
Keep going now, don't hesitate.
Your dreams will come one day.

2008年8月24日 星期日

九月Silverlight 2.0研討會行程

隨著Silverlight 2.0的正式推出在即,九月微軟安排了一些研討會,如果你對Silverlight 2.0有興趣,或者由於不同專案的需求、游移在各種開發Solutions之間,相信這個研討會應該會對你有所幫助。

在這個研討會中我會盡可能的在時間內完整介紹 Sivlerlight 2.0的新功能、說明Silverlight 2.0的開發架構、對於網站或Web應用程式開發甚至WinForm開發者的意義、說明如何應用在你的專案當中,並且稍微聊聊WinForm、WebForm、以及ASP.NET的未來...我們到時候見啦...

9/04 (四) 13:30 - 16:00 Silverlight 2 全新功能、展新體驗 台灣微軟 7A/B 會議室 [連結]
9/05 (五) 13:30 - 16:00 Silverlight 2 全新功能、展新體驗 台中金典酒店 13 樓 [連結]
9/12 (五) 13:30 - 16:00 Silverlight 2 全新功能、展新體驗 高雄漢來 [連結]

講題:Silverlight 2.0是微軟針對Web應用程式開發即將推出的重要技術,它讓Web應用程式的介面呈現邁入另一個里程碑,在Silverlight 2.0當中,許多眾所矚目的新功能陸續出現,在這個場次當中,我們將帶領學員由淺入深的探索Silverlight 2.0的各樣新功能,並且透過實務範例展示如何利用Silverlight 2.0建構絕佳的Web應用程式操作介面,並且輕易的與後端資料來源整合,讓學員得以迅速的掌握Silverlight 2.0的精華,快速的將此技術導入至您的專案當中,有效的提升您的Web應用程式質感與使用者體驗。

2008年8月17日 星期日

Silverlight 2.0當中的Deep Zoom效果

在上課的時候有學員問到Silverlight 2.0當中的Deep Zoom效果,我覺得底下這個範例可以大概表達出DeepZoom的功能和意義。

[Silverlight 2.0 developer reference]

上面這個網站中的圖檔大小將近10M,但是您會發現剛進入的時候很快就顯示出來了,因為在呈現時,我們並不需要整個圖檔下載,而是隨著時間同步下載。您可以拖曳圖檔或是透過滑鼠捲動放大縮小,請特別留意圖形中文字顯示的部分,比較看得出效果,您會發現放大的區域將會自動下載的更加的清晰,效果就跟Google Earth類似。

有學員問到說,DeepZoop是否可以呈現出所謂不失真的圖形效果? 當然不行,基本上DeepZoop只是把原始的圖檔原封不動的呈現在場景上,之所以放大後會有不失真的效果,是因為原始的圖檔很大、解析度很高,但是DeepZoop機制可以把一個很大的原始檔案(例如100M)加以切割,然後依照場景中需要呈現的部位逐步的動態載入場景之中,如此一來,就可以同時掌握速度和呈現品質,達到你看到的這個效果。

底下為原作者的網站位置:
http://joestegman.members.winisp.net/DeepZoom

2008年8月16日 星期六

安裝完VS2008 SP1之後Silverlight 2.0無法開啟?

安裝完VS2008 SP1中文版之後Silverlight 2.0無法開啟?


看到底下錯誤訊息:




是的,沒錯,請重新下載安裝中文版的Silverlight_chainer.exe:
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=50a9ec01-267b-4521-b7d7-c0dba8866434

Silverlight Tools Beta 2 for Visual Studio 2008 SP1 (Silverlight_chainer.exe)包括:
Visual Basic 和 C# 專案範本
Intellisense 和 XAML 程式碼產生器
Silverlight 應用程式偵錯
Web 參考支援
WCF 範本 的Silverlight 範本
Team Build 和命令列建置支援
Expression Blend 整合

2008年8月12日 星期二

.net framework 3.5 service pack 1 & V2008 service pack 1 正式推出

等待已久,眾多 SP1終於同步推出,SP1所帶來的改變不小,如果你覺得從ASP.NET 2.0到ASP.NET 3.5的新功能出奇詭異的少,那請別懷疑,SP1可以大幅滿足你的需求,因為很多新功能都出現在Service pack1了,目前你看到的SP1(VS2008 Sp1和.NET Framework 3.5SP1)包含了一些本來在ASP.NET 3.5 extendsions的功能,改變真的很多,除了MVC尚未納入之外,我所期待的針對 ASP.NET 3.5 的改變幾乎都上來了...

正如同先前說過的,ASP.NET 3.5已經從開發portal的小工具,變成可以登大雅之堂的Web Solutions開發工具,各種該支援的架構都支援了(喔...除了MVC ^_^),不過,光是底下這些,我相信就可以讓大夥玩很久了...

對於ASP.NET開發人員的改變如下:
ASP.NET Data Scaffolding Support (ASP.NET Dynamic Data)
是的,ASP.NET Dynamic Controls,我在MSDN研討會講過囉,還有影片介紹,我先幫各位玩一下,過幾天再錄個影片和大家分享。

ASP.NET Routing Engine (System.Web.Routing)
新的URL Rourting機制,在Dynamic Data Controls和MVC裡面都會被用到。

ASP.NET AJAX Back/Forward Button History Support
小東西,讓AJAX機制支援上一頁下一頁,有影片介紹。[瀏覽]

ASP.NET AJAX Script Combining Support
ScriptManager控件的一點點JavaScript檔案處理效能提升。

Visual Studio 2008 Performance Improvements HTML Designer and HTML Source Editor
顧名思義,這部分是VS2008在HTML編輯上的效能提升。

Visual Studio 2008 JavaScript Script Formatting and Code Preferences Better Visual Studio
支援了一些檔案編輯與JavaScript格式處理的能力。

Javascript Intellisense for Multiple Javascript/AJAX Frameworks
更優的Javascript Intellisense 支援,額外支援了一些Javascript Libraries,例如: JQuery, Prototype, Scriptaculous, ExtJS...因為JS實在太博大精深了...

Visual Studio Refactoring Support for WCF Services in ASP.NET Projects
如果你會在ASP.NET 3.5當中調用WCF Services,那我想這個功能對你會有相當大的幫助。

Visual Studio Support for Classic ASP Intellisense and Debugging
又重新支援ASP網頁的編輯和除錯了...本來MS一心想把ASP給幹掉,但沒想到還是很多人反映需要支援。

Visual Web Developer Express Edition support for Class Library and Web Application Projects
本來VWD不支援Web Application Projects的,現在在SP1中支援囉...

除此之外...

VS2008 Sp1還包含:
開發環境效能增強(WPF部分)
AJAX開發工具增強
ADO.NET Entity Framework開發工具增強
JavaScript開發環境增強

.NET Framework 3.5 SP1還包含:
ADO.NET Entity Framework [重要重要]
ADO.NET Data Services ,有影片介紹,雖然是beta版,不過內容大致一樣,大家將就一下。[瀏覽]


VS2008 service pack 1 (繁中版)
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=27673c47-b3b5-4c67-bd99-84e525b5ce61

.net framework 3.5 service pack 1 (繁中版)
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7

2008年8月1日 星期五

Mobile N95 的VOIP Solutions - fring + SkypeOUT

對我來說,手機最重要的功能就是通話,其他的附加價值其實意義不大,我對Mobile其實沒有太多研究,曾經買過一台PDA上面安裝了.net compact framework,這讓我可以用VS2005寫程式然後deploy到PDA上,為了這個我高興了很多天...不過無奈我沒有碰到太多跟Mobile有關的case,所以一直沒有機會好好研究一下相關的技術(不過最近我有一個在BPM+Mobile上的整合solutions,以後會有機會跟大家好好談談BPM順便介紹一下)。

OK,話說回來,前些時候我買了一支N95,唯一的原因是因為我以前都用Nokia,然後我常常摔手機,我印象中Nokia怎麼摔都很難壞,所以我始終支持Nokia,我的Nokia手機都是用到脫皮斑剝實在被身邊的人唸到爆,很煩之後才換下一支Nokia的,而那次買N95是因為內建了GPS又可以3G上網還可以拍照,我想說一支就搞定了,所以就給他開下去。

我幾年前在一家知名的網通設備公司,該公司一直有VOIP的計劃,我那時候就覺得很奇怪,VOIP這個東西也不是新鮮的概念,那時候Skype已經爆紅了很久,我就在想哪一天如果手機可以透過Wifi上網,然後Run一個Skype那我的電話費豈不是少到不行(有一陣子我的電話費超貴),OK,當時我跟負責VOIP的PM聊了一下,我忘了過程是怎樣,總之最後就不了了之了,不過我心裡想,這個技術應該是很簡單吧,就是在手機上Run Skype嘛,沒什麼大不了才是...

OK, 多年後的今天,我們終於看到這些應用慢慢的在生活中實現,今天下載了N95的Skype程式,不過官方版本總是比較爛一點,所以居然在台灣無法透過Skype OUT發話,只能用文字Chat,誰要用手機打字Chat啊,拜託...

又找了找,終於看到Fring這個軟體,我相信已經很多人用過了,這套軟體基本上是一個代理的概念,他可以透過手機連接MSN、Yahoo、Skype等IM軟體,也就是說呢,透過Fring我可以輕易的用在N95上透過Wifi執行Fring再用Skype的Skype OUT發話,對於我要時常打到大陸給同事來說,實在是太方便了,試用了一下,品質還不錯,值得和大家推薦,只有一個唯一的小缺點,就是Fring會有一點點Lag...有點小遺憾,不過在Skype官方版本尚未出現之前,我會考慮用這套軟體...畢竟最近不景氣,能省則省,一點點的lag是可以接受的通話品質,反正我用019, 或是電視廣告的 00x 打大陸有時候也會有Lag的現象,而且手機打大陸幾乎都沒降多少錢,對於常常在外移動的我來說太不切實際了,So,Mobile+Wifi(or 3G)+Skype是比較適合我的選擇...

如果有興趣,你也可以裝裝看,支援蠻多種手機的...
http://www.fring.com/

2008年7月25日 星期五

重要的事情先做

從事IT行業多年,我一直有一個深刻的感覺,資訊科技日新月異,要能夠掌握足夠的資訊技術,並且讓自己能夠在業界不至於被淹沒甚至能夠在眾多的強者中異軍突起,所需要花費的精神和時間有時候已經讓人喘不過氣。不管是哪一個領域,MIS、SI、Vender site、User Site、Consultant、Trainer我大多都有扮演過這些角色、或多或少也都能夠體會不同角色中的辛苦。

不過也可能是因為IT相關領域(特別是Developer)所需要涉獵的知識一直在變和增加,這些部分已經讓人耗費心力,使得IT人員在一些基礎的管理技能上,顯得有些缺乏。說真的,我認識的IT人員很少不是聰明人(意思就是大多數都是聰明人...我真怕現在很多人看不懂這樣的中文寫法...),我覺得大家都很Smart,但是往往由於缺少了一些基本的管理知識,在專案中常常變成無頭蒼蠅,忙碌,卻不一定能夠產生預期的效益。

關於這部分,我最近和一個同事提起,對於IT人員,不管是系統開發人員,或是MIS、你要妥善規劃你的時間,有一個很關鍵的技巧,就是把重要的事情放在前面,重要的事情先做,一直是時間管理當中很重要的一個部分。

不知道你有沒有讀過一本很不錯的管理書,作者把事情分為四種,急迫但不重要的(P2)、重要但不急迫的(P3)、不急迫也不重要的(P4),即重要又急迫的(P1)。


我記得我以前曾經提過這個觀念,這個觀念對我有非常大的幫助,我一直想找時間與大家分享,回頭想想這四種事情,你會先做哪一種? 你在哪一類的事情上你花了比較多的時間???

一般人P1一定會先做,這個毫無爭議,典型這類的工作是:家裡失火、急病住院…不過這些事情都不常發生,更具體一點的工作像是明天要交付驗收的專案、下午會議要用的報表…等,都屬於P1的範疇。

P1類型的工作往往不會佔用你絕大部分的時間,但是如果你發現自己手上每天的工作全都是P1,這表示你每天都在救火(我就看過這樣的MIS部門和專案公司,我可以肯定的告訴你,你絕對在這家公司待不久,搞不好這家公司或這個部門自己也撐不了多久,碰到這種公司,我會建議你趕快準備104…),如果手上的工作大部分都是P1,不用懷疑,你(或你們)的時間管理絕對有問題。

P1類型的工作,我認為在正常的公司當中一週不應該超過一、兩件,每件應該也都要能夠在三小時內解決。(否則他就不是P1,而是P3轉換成的P1,我待會解釋)

先談P4,你可能以為一般人應該不會把時間花在P4這類不重要又不急迫的事情上,但是你錯了,其實往往在工作上不是這樣,P4類型的時間花費多半都有一個特質,就是有趣、但沒意義

你一定會發現身邊很多人在工作時一直邊打MSN、跟同事作無建設性的閒聊,陪客戶聊天(好像很重要,但是其實並不是只陪客戶聊天就可以爭取到訂單)、或是作些可有可無沒有建設性的外交,打一些沒意義的電話(純粹是因為不想要把VS2005打開進行專案的Debug,所以先找一些其他事情做做,你問他說為什麼不快點Debug,他會跟你說要…醞釀Debug的心情和氣氛),和同事分享小道消息…這是P4的典型的例子。

我要說,如果你花了大量的時間在P4類的事情上,則肯定會慢慢邁向失敗。和客戶溝通有兩種,有建設性的我不會放在P4, 但是無效的溝通和閒聊就變成P4了。

這邊有一個迷思,休閒活動(例如打電動)算不算P4? 如果打完電動之後,讓你得到壓力的紓解、心情變得更輕鬆、腦袋開始更靈活,那就不是P4,因為它有意義,但是如果你熬夜打電動,或是打的廢寢忘食,結果導致該交付的工作無法交付,那就是P4了。

我建議大伙想想,你一天的時間當中,有多少時間花費在P4項目上。如果說過多的P1是讓你感到心力交瘁、逐漸疲乏的關鍵,那P4類型的時間花費絕對是讓人生邁向失敗的指標。

接著,我們來看一個重點,P3,重要,但不急迫的事情。
很多時候,所謂重要的事情,往往不會花你太多的時間(例如你的weekly report,還有應該要在準時交出來的管理計劃,甚至個人的生涯規劃、UAT時間的安排、test script的撰寫…),很多重要的工作一開始絕對都不急迫,這也是我說P1工作其實不應該多的原因,但是請注意,如果你不把重要的事情P3放在前面先做,這些事情自動就會慢慢的變成P1,然後你會發現自己每天的工作都在救火,都在趕進度,都被大家追債,常常會有人質疑你的工作能力和效率,這些都是P3沒有先做的後果。不要懷疑,在資訊界中,我看過其實很多人是這樣的(包括我自己偶而也都會這樣)。

請謹記,重要的信件先回,重要的工作先做,多留一點時間給重要的工作。重要的工作特別是包含了一些計劃、規畫、預防性的工作,很多主管也往往都略過這些工作,而等事情發生了(變成P1,例如專案Delay、客戶抱怨、老闆抓狂…)才跳進去動手處哩,你有沒有發現,這些工作一開始往往都不急迫,但是是很重要(這就是典型的P3),如果你不先做,它們自己就會慢慢自動升級成P1,會有人(上級單位、或是客戶、或是你自己)逼著你立刻要完成,但是往往到了P1的時候,會發現已經火燒眉頭,而且沒有時間提供一個好品質的成果,你會覺得能趕出來已經很不容易了,但是到這時也已經同時給了別人不好的感覺,由於時間有限,所以只好趕出來,但是你也知道,趕出來的品質大概只有60分上下,交付了,卻讓人不滿意,接著大家會開始對你(或你的公司)的工作品質打問號。

然而,其實這些工作一開始都是P3,也就是它們本來都不急,你也有時間可以慢慢作,卻因為放太久,使得它變成P1…導致這種結果。

順帶談一個觀念,個人的健康檢查和保險,是典型的P3,如果你放著不做,有一天發現生病了,非得去住院就變成P1,關於這點,我最近感觸很多,提醒大家注意自己的身體。

所以請記得,重要的事情先做

我們會放著P3不做,往往是因為我們不喜歡這些工作(很像學生的暑假作業,總是到最後一天才寫),還有一個可能的原因是我們不知道該怎麼作,當對工作有疑惑不知道該怎麼作的時候,請主動尋求解答(尋求解答這件事其實也是P3-雖然不急但是卻很重要),很多人都怕跟老闆溝通,可能是怕讓老闆知道自己原來不會這些,或是不能理解老闆的心意,或是怕節外生枝,所以都放在心裡不講,不與老闆溝通的結果是只能揣摩上意,導致工作失準或是只能擱著,放到不能再放的時候才和老闆溝通,往往這時候已經太晚了…

Anyway, 如果你真的開始注意自己每一天的工作習慣,然後把這個觀念用在每一件工作上,分析你的每一個工作到底是P1-P4中的哪一種,並且去改變他,突破這個循環,你一定會發現這個觀念可以有效的提高你的工作效率和成果…

希望對你有幫助。

2008年7月22日 星期二

Silverlight 廣告

不知道大家有沒有看過這個...在網路上找到這個廣告...
嗯...我猜這應該算是廣告吧...好像有點無厘頭...不過算是挺有趣的...
呵呵,它的精神是...有了Silverlight之後, 一切都變得更簡單了...

2008年7月19日 星期六

關於如何選擇VB和C#

有一位讀者在幾周前來信詢問到這個問題,我答應他要在BLOG上好好討論這個部分。

我相信很多初學者最近特別碰到這個問題,面對在.NET上要採用哪一種開發語言而困擾。在回答這個問題之前,有一個前提是要先確定的,關於效能的問題在這兩個語言之間的選擇是幾乎不存在的,特別是由於硬體設備的關係,因此效能問題很容易補強,若要說效能,到目前為止中高階語言當中C++依舊是效能最好的,Assembly依舊是效能冠軍,但是你會不會用這兩種語言來開發資料庫應用程式,答案是你絕對不會,因為這樣太辛苦了,好,我們的討論就從這一個point開始。

正如同你不會用C++來開發資料庫應用程式一般,除非沒得選擇(某些平台上只能選擇C++),否則有太多更適合用來開發資料庫的語言,C#, VB, Java, delphi...幹嘛選C++?

但是有沒有人會說C++語言不好?不會的...因為大家心裡都明白,不是好不好的問題,而是適不適合的問題!!!
那問題來了,如果答案這麼明確,為何還會有人討論C#和VB到底要選哪一個呢?不是就是適合不適合的問題嗎? 對,但是有一個小麻煩,是C#和VB都是.NET的官方語言,而兩種語言能做的事情幾乎一樣,花的工也差不多,那就讓人困擾了,到底要VB和是C#?

好,探索這個問題之前,我們要明白語言的背景和特色,C#是C Like語言,從C, C++之後,出現了很多C Like語言,C#和Java都是其中之一,他本質上是C的語法,但是沒有C++那麼難,C++當中有很多古時候C語言保留下來的特殊語法,這些語法相當簡約,例如A++,這代表A=A+1,除了A++之外,還有++A這種語法(難倒你了吧,很多人不知道兩者之間的差異...)。C語言又加上物件導向的觀念之後,難度瞬間提升幾十倍吧,很多專家腦袋裡想出來的許多天馬行空的可能,都在 C++上實現了,像是多重繼承這類的觀念,導致原本已經很簡約的C語法,變的進入障礙更高。

PS.你知道C語言為何要那麼簡約嗎? 因為在C發展的那個年代,很多時候無法用鍵盤直接輸入程式執行的,是透過讀卡機把程式輸入電腦裡,而字寫得越多,讀卡紙片就越厚,所以大家盡量把語法搞得越簡單越好...

而Java的出現,簡化了C/C++複雜的語法和架構,有那麼一點去蕪存菁的意味,更貼近商用(注意,是商用)領域,加上那一年internet盛行,所以謂為潮流,Java一直改變,MS卻只有VB和C/C++的開發環境,當年還沒有所謂的Visual Studio,就只有簡簡單單的VB 5,不過話說回來,那時候VB已經有一點點OO的觀念,加上還支援控件等reuse技術,支援事件驅動,支援視覺開發,已經是了不起的成就,那幾年的VB Programmer爆增,全美數幾百萬人跑不掉,幾乎有一半的商用程式是用VB開發的,但是VB卻有著過去的包袱...

說包袱可能不公平,因為VB本來就是設計給初學者用的,進入障礙低,簡單好用,可以快速的開發出一套應用程式,因為這樣,所以VB的語法很簡單,舉例來說,用VB開檔,可能就是簡簡單單的一行程式:
Open "filename" for Output as #1 <-- span="">
任誰都知道上面那行程式是用來開檔的,而且檔案還是用來輸出
如果是C,我記得是...
FILE *f;
f=fopen("xxxx","w+");
不是我在講,當年光那個*f的指標,就搞得我七暈八素,總是忘了加上*導致成是錯誤。你沒有辦法從人類的邏輯搞懂為何開檔的回傳值是一個指標,而運算式的回傳值卻是一個變數,這純粹是為了配合Compile而設計的語法,這不是為人類設計的。

那個年代後期微軟推出了 Visual Studio 97,其中上得了檯面的開發工具包含了Visual Basic 5.0、Visual C++ 5.0及Visual FoxPro,著時謂為風尚了好一陣子。當年同時間還有一個Delphi也很風光, 走的是Pascal路線,我還認真的學過一兩年,Delphi把Pascal發揚光大,但畢竟不是MS這種大公司的敵手,風光了一陣子之後,慢慢就開始有走下坡的趨勢。

而Java則慢慢開始一飛衝天,這時候讓MS陣營很多人發現了Java的好處,比C/C++簡單,能力強,可以跨平台,學習曲線有沒那麼高,豐富的類別函式庫...說不完的優點和前衛的設計,讓MS陣營的開發人員心動,java紅了好一陣子...

MS面對internet痛定思痛,決定來個絕地大反攻,在2002年推出內建.Net Framework 1.0的Visual Studio .NET,這是一個釜底抽薪的改變,一舉把MS開發工具帶向了整合interner、OO以及新的開發框架上,這個改變很重要,但是卻...帶來一場災難。

很多VB開發人員水土不服,改變太大了,ASP開發人員也不買單,ASP.NET被接受的程度不高,產品有一些待解決的問題,這些造成MS很大的壓力,那一年的改變是一個關鍵,他帶領MS的開發人員走向新的世界。那一年,也才是C#剛推出的時候...很多人還在觀望...

到2003年,微軟推出支援.Net Framework 1.1的Visual Studio .NET 2003,狀況才開始慢慢好轉,C#開始被大家接受,VB當中一些死硬派還停留在VB 6.0,也有一部份慢慢移轉到VB.NET上(主要的問題是VB 6.0的程式碼和觀念,幾乎和VB.NET不同)。

而2005年推出.NET Framework 2.0以及Visual Studio 2005(有沒有注意到MS把.NET兩個字拿掉了),則開始奠定如今的基礎,ASP.NET開始大紅(在台灣比較紅),ASP開發人員無可避免的選擇了升級到ASP.NET上,與Java分庭抗禮的時代開始出現,C#開始爭取到不少C/C++/Java/Delphi開發人員,而部分VB 6.0的developer也發現勢不可檔,所以跳入 VB.NET(後來就不叫VB.NET了)的懷抱中。

好,故事是這樣的,真的好長...打字都累了...
那,到底你要選C#還至VB?

這關乎你的目的,從上面的背景你可以發現,VB有悠久的歷史,但式設計VB的專家也一直盡力維護一個分寸,就是VB要符合底下幾個原則:
1.容易上手、學習曲線低。
2.與舊版VB語法大致相容。(現在越來越難了)
3.可以輕易的開發出一套程式。

所以你會發現,依照上面這樣的邏輯,VB具有C#沒有的My Class,這不奇怪,因為My Class很沒道理,不符合OO架構也濫用了靜態型別,有可能導致一些程式設計上的風險。VB的語法似乎比較鬆散,變數的型別轉換比較不嚴謹,但是這些聽起來是缺點,其實換另一個角度想也是優點。

如果我要很快的開發出一套程式,我不是程式設計師背景,不是所謂的科班出身,我也沒打算寫架構很大或很偉大的系統,我可能是數學系的、電機系的、念財務管理的、念工程的...我用VB寫一個小程式是非常非常理想的。沒道理要我用C#,變數的型別對我來說幾乎沒意義,只要程式能跑,算出我要算的東西,或是記錄我要記錄的資料,以後可以查詢,就好了,寫程式幹嘛那麼龜毛?

但,如果你是業界的程式開發人員,這是你吃飯的工具,你倚賴這個謀生,你寫的程式必須可長可久,比較有架構和嚴謹的C#會是比較好的選擇,(不過我要在這邊補一句,在台灣這種需求真的不多,因為沒什麼系統可以活過3年,reuse這個夢坦白說也很難實現,架構很漂亮,但是每次程式幾乎還是重寫,這樣架構再漂亮也沒用,這不是程式設計師的問題,也不是語言的問題,這些問題出在人身上...以後有機會再談),因為設計出的程式比較安全,發生exception的機會比較低,程式比較有架構未來交接維護也方便。(重點在交接,因為developer流動率真的很高)

如果你是MIS,沒有需要開發很大的系統,程式只是你的 "工具" (例如寫個程式進行佈署、建立AD Account,撈資料做報表,算出老闆要的資訊...等),我覺得用VB是比較好的選擇,因為老闆幾乎都要求快,希望很快看到結果,沒人管你架構,不需要為了簡單的一個小程式畫UML、一個下午或是一兩週就可以完成的小程式,靈活和快速是最重要的。

如果你是賣方(軟體廠商、SI、會把你寫的程式當作產品賣出去的),你可能就需要考慮以C#來開發,因為程式設計師的流動率很高、程式的效能要計較(因為客戶會計較)、未來的維護要持久...因為種種原因,讓程式設計師辛苦一點也沒啥不好,所以C#是一個比較好的選擇。

所以如何選? 我認為看需要...
要學哪個? 我覺得都要會一點...

我常跟學員說,在這個時代,我認為你必須要具備雙語(或多語)能力,一法通萬法通,所以VB和C#是開發人員的左右手,沒什麼道理只學其中一種,標準是,你不需要全部會,但是你至少需要看得懂別人寫的Code,如果你習慣用其中一種語言(例如我習慣VB),我覺得那沒什麼關係,每個人都會有自己的習慣,但是若你害怕用任何一種語言或是denial任何一種語言,那就不可以了,你必須對C#和VB都無所懼怕,依照你當時的需要選擇你要開發的語言。

VB當中的新語法(四) - Lambda

這個世界上很多東西是沒有道理的...不知道你是不是也會這樣覺得。

老實說,過去寫程式寫慣了的人,一開始看到Lambda運算式會覺得怪怪的,我先講它的意義,官方說法是,Lambda運算式可以簡化程式碼的寫法、增加可讀性(老實說我覺得簡化程式碼的寫法這件事情很少跟增加可讀性可以一起發生,通常程式碼越簡化,可讀性就越差...),對Lambda運算式來說,簡化程式碼寫法可能是做到了,增加可讀性我就很猶豫了,不過如果真要說起來,Lambda運算式的出現(或是為什麼在這個版本出現)其實說穿了還是跟LINQ有關...

先寫一個簡單的Lambda:
Function(para1 As Integer) para1 + 1

MSDN上說,Lambda運算式是沒有名稱的函式,所以上面名稱不見了,return也不見了,其實你可以想成:
Function 函式名稱(para1 As Integer) Return para1 + 1
上面這樣的簡寫,只是把函式名稱和teturn拿掉,這樣就比較容易懂了。

例如,原本應該寫成
  '計算身高體重的BMI值
  Function BMI(height As Single,weight As Single)
    Return weight / ((height / 100) ^ 2)
  End Function
就變成(拉成一行)
  Function(height As Single, weight As Single) weight / ((height / 100) ^ 2)

對照著寫就比較容易理解了,函式名稱不見了, 自然End Function也不見了,Return也不見了,差不多這樣,就是Lambda運算式了。
注意:另外一個很重要的是,函式寫在程式碼區塊外面,Lambda運算式則混雜在一般的程式碼裡面。(往下看,就會知道意思)

好,定義出來的Lambda運算式怎麼用呢?
最簡單的方式是在Lambda運算式的外面加上( ), 變成(Lambda運算式)然後再把參數給進去,所以就變成:
(Lambda運算式)(Lambda運算式需要的參數值)
例如:
  Dim ret As Single
  ret = (Function(height As Single, weight As Single) weight / ((height / 100) ^ 2))(170, 60)
  意義是→接收值=(Lambda運算式)(Lambda運算式需要的參數值)

差不多就是這樣,但是,這樣很難用對不對....對!!!

所以,大多數人就寫成這樣:
  Dim BMI = (Function(height As Single, weight As Single) weight / ((height / 100) ^ 2))
  Dim ret As Single
  ret = BMI(170, 60)


其中的BMI我們稱為委派變數,BMI是一個變數,但是在記憶體中是一個函式的位置,所以我們可以呼叫他(傳入170, 60)計算出一個BMI值,再用ret這個Single變數去接收,完成,就是這樣。

不過問題開始浮現,如果要這樣搞,那為何不乾脆一開始就直接建立一個BMI函示就算了?幹嘛用Lambda建立了一個沒有名稱的函示,又要用另一個變數去委派呢???

這還是有原因的,原因也還是跟LINQ有關,我們看一段點底下的程式碼:

  Function test()
    Dim a() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9}
    Dim b = From item In a Where item > 3
    Return False
  End Function

其中的變數b的來源值是一段LINQ語法,這段語法會被Compile成:
Public Shared Function test() As Object
  Dim a As Integer() = New Integer() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
  Dim b As IEnumerable(Of Integer) = Enumerable.Where(Of Integer)(a, New Func(Of Integer, Boolean)(Nothing, DirectCast(Module1._Lambda$__1, IntPtr)))
  Return False
End Function

你會注意到,其中就有呼叫到一段Compile幫你自動產生的Lambda運算式。你會發現,Lambda有大半在這個版本的.NET中會出現的原因跟LINQ有著密不可分的關係。所以你會慢慢了解,為何從很多文件和名家的BLOG當中都這麼說,從.NET 2.0之後,其實本質上.NET Framework已經沒有太大的改變,而其他的部分.NET 3.0中的WPF, WWF...等,是額外加上去的,疊在原本的架構之上,同樣的.NET 3.5當中所提供的LINQ機制,也就是NameSpace位於System.Linq底下的,則是在.NET 3.5當中疊在3.0之上的一塊,骨子裡都一樣,所以為了實現LINQ這樣而外加上去的特殊語法,所以增加了Lambda,讓你開發的時候可以很輕鬆的撰寫 From item In a Where item > 3 這樣的語法,再由IDE與Compile通力合作,把要完成的功能隱藏在這段所謂的LINQ語法後面,再透過Lambda和其他的技巧實現,完成現在你看到的偉大工作。

2008年7月12日 星期六

最後的演講(The Last Lecture)

最近買了一本書,最後的演講(The Last Lecture),老實說,最近發生的事情讓我對人生的不可測開始有著另一層看法,有時候營營汲汲,所換來的回頭看看實在也不知道到底值得不值得,不過說真的,事情發生了,才會有這個想法,有些事情不是臨到頭了,恐怕一輩子也沒那個感覺。

回頭說這本書,書附贈了一片DVD,其實已經很多人在網路提起這個故事,我想說的是,當你看這個影片的時候,主講者在台上侃侃而談自己的故事時,你不知道的是,其實他有數次感到身體相當不舒服,幾乎要倒下,但還是硬撐完了全程,所以你看到的,是一個看似正常人一般的演說者,而不是一個生病的人。

讓我想到我小時候的英文老師,外表看起來很像一個糟老頭(年紀很大、臉上有點像是沒剃乾淨的白色的鬍鬚),他第一次走進教室我還以為是工友走錯了,但是沒想到他就是我們的英文老師,進門第一句話就是道道地地的帶有英國腔的英文(如果我沒記錯他是留學英國的),說真的,事隔多年,我對他沒什麼印象了,只記得他不只一次的說如果他可以選擇,他希望要死在講台上(因為他覺得自己教書很多年了,老囉~),他說他當了一輩子的老師,再也沒什麼比死在講台上(例如突然間心臟病發作)更圓滿的了...

自己有幸當講師之後,開始覺得也許站在講台上真的是需要一點對演說、教育由衷的喜好和興趣的,特別是和學員之間的互動,往往是吸引講者能夠一直努力下去的動力,我喜歡帶稍微小班一點(就是我有機會可以跟每一位學員說話的那種編制)的學員,很慶幸絕大部分的資訊課程都是這個編制,在這個過程中,其實是很愉快的,如果同時又真的能夠給學員一些幫助,那我覺得就更加的完美了。

每一個工作都能夠對社會有一些幫助,不過很少像教育工作那麼立即和明顯,我相信有一天回頭看,應該會讓自己感到安慰。人生並不長,時間有限,在埋首程式堆裡面的生活當中,偶而能夠和其它的開發人員有一些互動,又能不時幫助人,其實是蠻令人欣慰的。

BTW,這本書和影片可以買來看看,挺讓人深省的。我們有太多的書籍告訴我們怎麼寫程式、怎麼賺大錢、不過關於怎麼過日子的書籍,恐怕相對的少了很多,有時候放在書店的架上也不是非常顯目,不過,留一點時間給自己,看看這類的書籍,對自己好一點,因為有時候人生,並不全然會照著我們自己所編寫的劇本上映。



VB當中的新語法(三) - 擴充方法

在VB的幾個新語法當中,擴充方法也是很有趣的功能之一,某種角度來說,它讓我在上課時幾乎已經要丟一在一邊的Module關鍵字又重新開啟了另一個重生的機會。

簡單的說,擴充方法就是以額外的程式碼替原有的Class(不管你有沒有這個Class的原始程式碼,不管是原本系統的Class或是你自己寫的)增加新的Method。

作法是開啟一個新的Module檔案,並在當中建立一個Method,例如:
Module IntergerExtensions
  <System.Runtime.CompilerServices.Extension()>Public Sub Show(ByVal para As Integer)
    MsgBox(para)
  End Sub
End Module


請注意,一定要宣告在Module當中,並且加上<System.Runtime.CompilerServices.Extension()>特徵關鍵字 。由於這個函式的參數是Integer,如此一來,就會自動幫原有的Integer類別增加了一個Show方法,因此你在撰寫主程式的時候,會發現只要用到integer的變數,打個點,就可以自動帶出Show方法:


當然,並不是Integer就真的有這個新的Method,更不是繼承的觀念,純粹只是Compiler和IDE進行某種程度的 "混淆視聽" 之後的結果。IDE負責讓你在開發的時候有intellisense可以用,Compiler則負責去解讀這種特殊的語法轉換成一般呼叫函式的程式碼。

使用的方法就是那麼簡單,即可讓原有的Class增加新的功能,別忘了,使用前要在主程式中Import這個Module。例如:
Imports WindowsApplication1.IntergerExtensions
(由於我的程式的root Namespace是WindowsApplication1,而Module Name是IntergerExtensions,因此我會這樣寫)

說真的,這個功能我覺得放在Module當中還蠻有點道理的,因為擴充方法其實是Public Shared 型別,且實務上我們可以把一些常用的Method(Sub或Fucntion)集中在一個或數個Module當中,賦予適當的Module Name做為區分,這樣在撰寫程式的時候不需要回頭找這些Method放在哪一個NameSpace底下,然後再去呼叫它,反而可以像上圖一樣,用到Integer的時候就直接呼叫我們幫Integer撰寫的擴充方法,因為它根本已經變成(長的像而已,不是真的是)特定型別物件(例如上面例子中的Integer)的方法,所以想用的時候 "隨手" 就可以用,撰寫程式碼時,只需要在該型別的物件旁打個點,就會自動帶出符合該型別的物件可用的Method,相當好用。

如果你熟悉泛型的觀念,可以繼續往下看,底下這段程式碼很有趣:
   Public Sub Show(Of T)(ByVal para As T)
    MsgBox(para)
  End Sub

我們把原本的Integer換成了泛型寫法,透過這樣的方式,我們在使用擴充方法的時候也更加的方便了:
  Dim a As Integer = 60
  a.Show()

  Dim b As String = "test"
  b.Show()


總的來說,擴充方法的出現,讓程式設計的自由度與靈活度又提高了。

2008年7月6日 星期日

從Silverlight 2.0的新功能,遙想Web的未來


  Silverlight 2.0比起1.0令人驚艷不少,在1.0當中幾個過去被談到缺少的機制,在2.0大幅度補齊,其中與開發資料庫應用程式有關的,莫過於Data Binding技術以及IsolatedStorage機制。

  透過Silverlight 2.0當中的Data binding技術以及IsolatedStorage機制,我們可以很輕鬆的建立出類似左邊這樣的用戶端資料處理介面(按這裡試用看看),不僅程式碼相當簡單(不到百行吧),而且在UI上更勝ASP.NET與傳統的WinForm程式一籌。

  除此之外,程式碼的撰寫以及維護和除錯,都比ASP.NET要容易不少,過去很多台灣和大陸地區的開發人員對於在Silverlight 1.0當中的中文字顯示和輸入問題的疑惑,相信在看到這個2.0的範例後這些疑慮你可以一掃而空。
  透過IsolatedStorage機制,讓開發人員可以大方的把需要保存的資料存放在用戶端,不需要在意它的存放位置。若您不喜歡這樣的方式,你也可以透過WCF從伺服器端將需要的數據下載,暫存在用戶端的記憶體或是HD當中,透過程式碼來操作。
  除了UI絢麗性與親和度大幅超過ASP.NET之外,我個人比較喜歡的原因是靈活性和自由度,有點讓我回想起從前開發WinForm的隨心所欲的日子.....
  說真的,HTML給ASP.NET Developer的限制,以及為了模擬WinForm或是提高Web開發環境中的UI的效能而硬生生所加入的AJAX技術,已經讓原本應該要 "簡單輕巧" 的Web應用程式變的龐大而複雜不已,面對這樣的問題,有兩派不同的路線正在彼此較勁。

  如果你觀察ASP.NET這幾年來的演變以及ASP.NET 3.5 extensions的出現,你會發現這一派儼然已經透過種種疊床架屋的技巧,把原本簡單的ASP.NET演變成可以開發大型應用程式的技術平台。本來ASP.NET在2.0前的訴求就真的比較適用於開發小巧的網頁或是輕量級的企業入口網站或是portal應用(OK,也因為這樣很多case被JSP搶去了),但是現在在3.5 extensions當中加上了LinqToSQL(以及ADO.NET Entity framework),加上了Data Services、加上了Dynamic Control、加上了MVC,一切就會不一樣了...

  這一派的人讓 ASP.NET搖身一變成為具有高延展性和彈性的開發架構,你可以設計出給兩萬個User使用的Web Application、你可以透過Dynamic Control或是MVC將敏捷開發以及多層式架構的開發觀念帶入微軟的Web開發領域、你可以透過這些機制、認真的、放心的建構大型(真的是大型的,不是那種同時使用的User只有幾十個人的)應用程式。到了這一步,ASP.NET才真的可以抬頭挺胸的登堂入室。

  另一派,則根本放棄了HTML這個煩人的架構,釜底抽薪了換成了WPF for Web或是Silverlight,這一派的人認為,Web上的RIA才是未來理想的Web應用程式解決方案,其他的只是緣木求魚。

  這派的人認為,因為我們已經跟ASP.NET奮戰了很久,從一開始HTML就不是讓人寫程式用的(那幹嘛用的?其實很多人忘了,HTML是文件的格式,本來就不是用來呈現UI的介面),從CGI、ASP、一路到ASP.NET,現在你開發一個WebForm應用程式,少不了要接觸幾種幾乎不同的技術,ASP.NET、AJAX、HTML(與CSS),這還只是展現層的部分,如果你需要開發出比較有 "層次感" 的應用程式,那VB或C#的OO觀念恐怕是必修的課程,除此之外,你可能會硬生生的把SQL崁入完全無關的ASP.NET Code behind程式碼中,然而這對於過去習慣開發n-tier架構甚至client-server架構的程式設計師來說,根本是近乎荒謬的程式寫法。

  但是...天知道有多少ASP.NET開發人員是這樣幹的,是,我承認,包含我在內的幾乎每一本坊間書籍都是這樣寫的,原因很簡單,這與過去ASP時代的背景有關,在過去我們希望透過簡單的script來解決問題,而到今天我依舊認為,ASP.NET非常適合用來開發輕量級的Web Application,讓開發人員相當容易的就上手,反而JSP則包袱太多,要寫一個像樣的應用程式,少不了要在架構上下足功夫,相對的初期產能就低(高產能要在過了一定程度陡峭的曲線之後才慢慢出現)。但是優點也是缺點,對於開發高延展性需求的web應用程式,可能ASP.NET在3.5 之前都是不及格的。

  當年發展ASP的團隊,恐怕打從心底沒想過ASP會搞得那麼的偉大吧,拜internet之賜,WebForm某種程度的變成主流。但是要當主流不容易,UI要夠精緻,AJAX技術非上手不可,偶而為了讓網頁有畫龍點睛的神來之筆,還得崁入一個Flash(現在我們就用Silverlight),大哉Web開發技術!#%@!$!#%*!*$&

  也因此,從這一派的角度來說,把HTML根本性的拋棄可能是釜底抽薪的好方法,在WPF for Web或是Silverlight上重新開始一個嶄新世界,恐怕會更令人期待。

  這兩條路線,我們現在看到是同時並行的,最主要的原因是,市場不會一夕之間改變,而微軟有的是能量同時經營這兩條路線,在某些專案當中,兩種技術並用也是一個很好的選擇,而未來呢? 很多人都有自己的想法,我也有,只是畢竟我是凡人,不是那種會一眼看到未來的能人異士,連明天會發生什麼事情我都不知道,也無法控制,未來,在我的腦袋裡恐怕有的也只有一些些無關緊要的推測了...

2008年7月5日 星期六

Silverlight 2.0 中的 UserControl 開發與使用方式

先前介紹過的Silverlight 2.0 中的 UserControl 開發與使用方式的教學影片已經上檔了,請參考底下網址,而詳細的內容說明在本期的RunPC當中介紹。http://www.microsoft.com/taiwan/msdn/elearning/Teaching/Silverlight/video10/


關於Microsoft .NET Framework 3.5 Service pack 1 Beta與ASP.NET 3.5 Extensions

Ok, bate 1 出現了,那距離正式推出又邁進了一大步。

Microsoft .NET Framework 3.5 Service pack 1 Beta當中有什麼呢?對於 ASP.NET開發人員來說,其中包含了一些相當重要的部分:
ASP.NET Dynamic Data
ASP.NET AJAX 增強功能
ASP.NET AJAX script combining
ADO.NET Data Services

The ADO.NET Data Services Framework
上面這些玩意兒根本就是從ASP.NET 3.5 Extensions搬過來的,正如同我們過去說的,目前MS的改版越來越快,ASP.NET 3.5這個版次其實有點吊詭,儘管跟著NET Framework把版本編號帶到了3.5,但是在新功能上卻沒有太大改變,而真正石破天驚的則是ASP.NET 3.5 Extensions, 如果依照目前我們所看到的態勢,ASP.NET 3.5 Extensions中的上述幾個功能,將會出現在.NET 3.5 Service pack 1 當中。

在三月的時候,我曾在微軟的研討會當中跟各位介紹ASP.NET 3.5 Extensions,接下來我會在 BLOG上花更多的篇幅討論關於ASP.NET 3.5 Extensions(也就是.NET Framework 3.5 Service pack 1 )的部分,ASP.NET更多的新功能看來正要開始出現。

2008年6月24日 星期二

VB當中的新語法(二) - 區域型別推斷 與 XML

當你看完筆者這幾篇關於VB的新語法介紹之後,你會發現其實都跟LINQ有很密切的關係,儘管有些功能看似語法上的新擴充,但是實務上會使用到這些語法的場合,大多跟LINQ多少脫不了干係呢~

接著我們要來看的第二個VB新語法稱為『區域型別推斷』,簡單的說,就是當你宣告變數時不指定型別的時後編譯器會自動幫你決定變數的型別,而不是一律的以object作為變數的型別,運算時再透過boxing來解決。

過去,當你鍵入底下的程式碼:

Dim v

這個變數v是Object型別,在舊版的VB 6.0當中,則是variant,如今,當你在編輯器當中輸入這樣的程式碼:

Dim v = 3

你的變數v型別會自動設為integer,倘若是:

dim v = 3.14

你的變數v型別會自動設為double。
總括來說,編譯器會依照初始值來決定變數型別。

甚至,變數的型別也可以由函式的回傳值來決定,例如:
Dim ret = getBMI()

嚴格說起來,這些動作都是編輯器自動幫你做的, 對程式碼來說沒有什麼太大的影響,有一些部分也是因為在過去VB本來就會進行相當多的隱含型別轉換,所以這些動作對開發人員來說沒啥特別的感覺,但是實務上它可以加快程式運行的速度(因為不需要再做這些型別轉換)

然而,你可能看到更多的使用場合是把這個機制和LINQ的查詢回傳值混在一起,再回頭看前幾天介紹的LINQ語法:

'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25

從這邊你會看到透過查詢語法所回傳的值,也是透過這樣的機制來建立的。總的來說VB在語法上的更新,蠻多都實現在LINQ相關的應用上,這也是先前說過VB新語法與LINQ幾乎脫不了干係。

另外,由於有型別推斷,你可以在VB當中直接這麼寫:

你可以直接把XML以Copy Paste的方式貼到程式碼編輯區,然後定義一個變數來承接,由於具有型別推斷的功能,因此xmlData變數會被定義成xElement型別,寫起程式來方便多了。

2008年6月23日 星期一

VB當中的新語法(一) - 匿名型別

上周跟大家介紹了LINQ在VB當中的應用之後,這次順帶介紹一下VB在這個版本中的改變,在VB 2008當中,配合LINQ新增了許多新的語法,底下這也是VB在建立物件時的新寫法:

  Dim stud1 As New students With {.name = "David", .score = 100}

上述指令會建立一個students 物件的實體,並且填入預設的值。
這樣的寫法簡便不少,該物件的類別宣告如下:

Public Class students
  '這邊應該寫成property, 只是我稍微偷懶一下寫成field,不影響demo
  Public name As String
  Public score As Single
End Class

上面黃色程式碼這樣的方式我們稱之為具名型別的物件宣告,既然,有具名型別,就一定會有匿名型別的宣告方式,語法如下:

Dim stud2 = New With {.name = "David", .score = 100}

這個就炫了吧,不用型別照樣可以宣告出一個物件實體,這個在VB 2008稱為匿名型別,其實和LINQ有相當大的關係,幹嘛搞出一個匿名型別呢? 它可以方便我們不需要事先建立一個類別,就可以具有物件實體,會有這樣的需求?

某些時候,我們只想要產生一個物件,並且隨手就拿來用了,我們可能懶的宣告一個物件的類別,然後再用New指令產生一個物件實體,也有時候我們只是希望建立一個臨時的物件來存放特定資料處理(查詢)之後的結果,最典型的例子就是LINQ(容後再述),因此匿名型別就應運而生了。

匿名型別並不特別也不神奇,實現的方式很簡單,Compiler 會自動依照你的需要,幫您建立一個類別Class,幫你自動決定類別中屬性的型態。這個自動建立的類別沒有名稱(因為是編譯階段自動建立的,所以沒名稱也不打緊,反正我們在程式碼當中也不會用到這個類別,只會用到這個類別產生的物件實體)、這個類別會直接繼承自 Object,並且包含您在宣告物件時指定的屬性。

這個特性是一個基礎,它讓LINQ查詢的結果可以自動建立成一個物件,例如我們在 2008年6月18日 星期三 介紹的LINQ功能中,有一段程式碼:

Structure BMI  
  Dim name As String  
  Dim height As Integer  
  Dim weight As Integer  
  Dim BmiValue As Single
End Structure

Dim matrix(5) As BMI

(...略...)

'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25

其中matrix是一個物件沒有錯,但是result是什麼型別? 怎麼出現的? LINQ查詢會建立出一個物件? 怎麼建立的呢? 關鍵就在匿名型別。

有了匿名型別這樣的技術作為基礎,LINQ的查詢結果(物件)就可以不需要事先建立一個特定類別作為存放查詢結果的資料型別。而可以透過編輯器自動產生這個類別,我們只需要直接把結果(物件)拿來用,因為我們在意的是這個查詢結果物件而非該類別本身。

不過這邊要注意,並非所有的LINQ查詢結果一定就需要建立一個匿名型別來存放,也有可能只需要系統內建的型別即可。

例如:
Dim result = From c In matrix Where c.BmiValue > 25 Select c.name

result 就只需要String型別即可。

anyway, 匿名型別確實讓開發人員在撰寫程式碼的時候有更多的可能性,也方便許多,同時間,你也會發現,編譯器暗地裡幫我們做了很多的事情...說到這個,下次有機會時來談談編譯器是怎麼看待LINQ指令的,你會發現VB2008的編譯器比過去忙碌了許多。

2008年6月21日 星期六

Sharepoint 開發工具:Visual Studio Extensions for SharePoint Released

我不知道目前台灣有多少開發人員(或是MIS team)有使用MOSS,如果你是developer,也有使用MOSS的習慣,那你可能會對底下這個消息有興趣:

Visual Studio Extensions for SharePoint Released (英文版, 簡中轉繁中之後的內文如下)

SharePoint正迅速成為企業利用微軟.NET技術構建內部網站(EIP)的CMS(content management system)平臺。SharePoint雖然內建很多功能,但還是需要使用ASP.NET進行大量的客製。為了加快這種客製工作,微軟最近為SharePoint開發人員發佈了幾個有用的資源。

為了讓SharePoint專案易於開發,微軟創建了Visual Studio Extensions for SharePoint。VS 2005版本的已經於二月發佈,而VS 2008版本就在前幾天也發佈了。針對VS 2005版本(1.1版)的 User Guide, Samples, and Walkthroughs 現在已可下載。而VS 2008版本(1.2版)有望在這個月末發佈。

微軟還建立了一個新的SharePoint網站,專注于提高開發人員學習相關技術的速度。這個網站目前還在建設之中,雖然已經列出了大量有趣的主題,但還沒有足夠多的內容。當這個網站的建設完成後,讀者就可以看到每個主題都會包含一個虛擬實驗室、網路廣播、快速入門嚮導、白皮書和可供下載的動手試驗等。(David註:應該是我先前看過的一個線上Lab,有點像認證考試的那種)

2008年6月20日 星期五

有人問起C#的LINQ寫法...

有人問起C#的LINQ寫法...也很簡單...
關鍵的地方稍微修改一下,差不多是底下這樣...

  //查詢BMI值大於25的人
  var result = from c in matrix where c.BmiValue > 25 select c;
  //顯示名稱
  foreach (string item in (from c in result select c.name)) {
    MessageBox.Show (item);
  }

簡單吧,說真的,截至目前為止,我始終覺得LINQ是一個方便好用的東西,如果你的程式碼沒有太多向後相容的考量,且開發團隊也打算用.NET繼續開發下去,截至目前為止我找不到理由不在程式碼當中使用LINQ,這也是我對於讀者詢問的想法和回答。

2008年6月18日 星期三

LINQ其實很簡單

會寫這一篇是有原因的,不只一次有人問我,要不要學LINQ呢?
LINQ看起來很難耶...為何要放棄以前的SQL來學LINQ呢?到底LINQ的意義是什麼?

反正就是有一缸子的問題,說真的,由於最近也沒時間寫本LINQ的書,但是工作累了順手寫寫BLOG還可以,所已針對LINQ這個主題,和大家有一些分享。

其實對於VB開發人員來說,掌握LINQ說真的比C#來的簡單很多,主要的原因就是VB當中有非常多"自動"的隱含型別轉換,是不需要寫程式碼的,也因此操作起來比起C#真的容易不少。

要掌握LINQ的精神,得要知道LINQ出現的目的,其實很簡單,只有一句話,就是希望 "能夠達成以單一的一種語法來查詢多種不同的對象" 的目的。這其來有自,過去我們要查詢資料庫要用SQL、要查詢XML要用XMLDOM物件、要查詢AD又要用另一種不同的查詢方式,總之,查詢這個動作一天到晚出現在電腦程式碼當中,但是開發人員卻要學習多種不同的方式,很困擾,所以LINQ就出現了。

所謂的LINQ,是 .NET Language Integrated Query,也就是在.NET的開發語言當中,直接把查詢的技術給 "整" 進去,目的就是要加快搜尋(速度)與降低開發成本。

所以從.NET 3.5開始, LINQ變成.NET標準語法的一部分,OK,就是這樣,所以我們來看看 LINQ怎麼查詢,首先,為了展示LINQ,我定義了底下這樣的結構:

Structure BMI
  Dim name As String
  Dim height As Integer
  Dim weight As Integer
  Dim BmiValue As Single
End Structure

你用類別也可以,總之上面的結構用來表達一個人的身高,體重,名稱和BMI值。

接著,我撰寫底下程式碼:

'定義陣列
Dim matrix(5) As BMI
'填入測試資料
matrix(0).name = "王小寶"
matrix(0).height = 170
matrix(0).weight = 65
matrix(1).name = "韋大寶"
matrix(1).height = 176
matrix(1).weight = 95
matrix(2).name = "章新寶"
matrix(2).height = 150
matrix(2).weight = 55
matrix(3).name = "沈中寶"
matrix(3).height = 192
matrix(3).weight = 75
matrix(4).name = "蕭敦寶"
matrix(4).height = 150
matrix(4).weight = 65
matrix(5).name = "林寶寶"
matrix(5).height = 177
matrix(5).weight = 75

上面這段程式碼就只是很簡單的把資料填入,請注意我們只填入身高體重和姓名,接著,再利用底下的程式碼算出BMI:

'計算BMI
For i = 0 To 5
  matrix(i).BmiValue = matrix(i).weight / (matrix(i).height / 100) ^ 2
Next

OK,到這邊先告一個段落,以上都沒有LINQ出現,動作也很簡單,接下來換LINQ出場,在出場前先問讀者一個問題,如果要找出BMI值>25的資料,你會怎麼寫程式?

...

沒錯,用for each指令,在沒有LINQ功能的時代,我們只能用陣列巡覽的方式查找每一個元素,找出符合的資料,但是有底下幾個問題:
1.為了找出特定的資料而跑整個陣列,看起來挺蠢的。(不過說真的,如果資料沒有排序,也就只能那麼蠢)
2.可能有一些初學的菜鳥程式設計師,寫出效率很差的查找程式。(例如不小心在for each當中做了一些不必要的動作)

OK,過去我們對於物件(或是物件陣列)的操作,也就只能使用迴圈的方式,但是LINQ提出了一種新的可能,就是透過類似SQL的查找語法,讓開發人員可以用簡單的程式碼,就可以針對物件進行複雜的查詢。(更重要的是,未來這種簡單的查找語法變成主流之後,可以用以查詢"各種不同的對象",而不只有查找"物件")

言歸正傳,若要查找出BMI值>25的資料,你可以透過底下的LINQ程式:

'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25

結束,就是這樣,而 result 就是找出的結果物件,你可以透過 result 來取得每一個符合條件的資料。簡單的說,上面這段程式碼的意思是,從matrix物件集合當中,找出一些資料,這些資料的BmiValue屬性大於25。其中的 c 只是撰寫程式碼方便,c代表該物件元素,你也可以用別的字眼..

而找出的資料result也是一個集合,你可以透過底下的程式碼來列出每一個BMI值符合條件者的名字:

'顯示名稱
For Each item In result
  MsgBox(item.name)
Next

很簡單不是嗎? result 當中的每一個 item ,其型別就是 BMI,因為Result物件是LINQ語法跑出的結果,所以只有包含符合 BmiValue > 25 這個條件的人...

上面這段程式碼,還可以這樣寫...

'顯示名稱
For Each item In (From c In result Select c.name)
  MsgBox(item)
Next

效果完全一樣唷,但是,(From c In result Select c.name) 會產生一個物件,該物件只有符合條件者的名稱(相當於一維陣列),而item的型別當然就是string。

透過上面這樣的指令,查找動作變得相當簡單,還不僅如此,關鍵在於底下這樣的語法:

'查詢BMI值大於25的人
Dim result = From c In matrix Where c.BmiValue > 25

具有相當多不同的變化方式,可以組合出各種不同的形式,發揮出強大的查找力量,再加上學一次,就可以用在各種不同的地方(這邊我們只用來查找物件,其實也可以查找XML和Database),使得LINQ的用途更加的廣泛,這就是LINQ的價值與意義。

以後,再跟大家分享一些關於LINQ的其他部分,希望對大家有幫助,VB developer其實是幸福的,LINQ其實是很簡單的...

2008年6月17日 星期二

Silverlight 2.0 beta 2 繁體中文版開發工具

很難得的,Silverlight 2.0在Beta 2的版本就看到了專屬的中文版開發套件(SDK),不禁令人感動不已,在這要先給台灣微軟、Moli、以及辛苦的RD同仁一個大大的掌聲。


帶著興奮的心情,趕快下載來試用一下,咦?安裝時間有點長唷,比英文版的長了不少...???不過沒關係,總是裝完了,來試試看。喔~連建立專案範本的對話視窗都是繁中的,真是太感動了。再把前幾天開發的那個紅綠燈控件拿來給它試試看,看起來不錯唷,配合VS2008繁體中文版,一切相當順暢,沒啥大問題。所以,很放心的跟大家分享囉。

連建立專案範本的對話視窗都是繁中的呢,真是令人動容啊...


安裝過程也是繁中的唷...



Microsoft Silverlight Tools Beta 2 for Visual Studio 2008繁體中文版下載位置:
http://www.microsoft.com/downloads/details.aspx?FamilyID=50a9ec01-267b-4521-b7d7-c0dba8866434&displaylang=zh-tw


後記:說真的,我還是習慣繁體中文版的操作環境,大概因為我不是那種喝過多年洋墨水的歸國學者,也還沒有去"內地"待過太久...不過,雖然由於工作的需要,活在英文、繁中、簡中的各種混雜文件和郵件之中已經是常態,但是英文和簡中文字給我的感動總是少之又少,頂多就是理解意思而已,而繁中文字給我的親切與情感,恐怕是其他文字很難取代的,不過寫到這裡,也有一點小小的擔心,隨著使用人口的變少,不知道未來十年二十年之後,繁體中文的命運會如何? (最近聽說有人還在台灣學京片子,會不會哪天也開始學簡體字???) 隨著大家(包含我自己偶而也不小心)把資料庫稱為數據庫、把呼叫稱為調用、把控制項稱為控件...我的憂心越來越多...

後記二:很多人問到安裝問題,請注意,要移除所有的Silverlight beta、SDK、1.0,總之移除所有跟Silverlight字眼有關的東西,才能安裝Silverlight_Chainer.exe

建立Silverlight 2.0 控件(User control)


Silverlight 2.0有一個非常重要的部分,就是控件技術的出現,透過可自行定義開發的控件建立機制,Silverlight 和 ASP.NET一樣,可以自行定義可重用的 UserControl,這對於開發人員有著相當重要的意義,這表示物件化的設計、ReUse與大量的開發開始變的可能。

有這些作為基礎,我們才有可能真正透過Sivlerlight 2.0建立中大型的應用程式或是RIA,也才有可能確保投資可以延續並且在團隊開發當中累積資源。

這麼重要的機制,當然要給他試用一下,左圖是我嘗試建立的traffic light控件,模擬一個紅綠燈,一樣具有屬性、事件、方法...可以跟外部的程式互動,畫面中的Button和TextBox則是Silverlight 2.0當中本來就有的控件,透過.NET Code的開發方式,你可以用C#或是VB,確實比過去1.0時代用JavaScript和AJAX方便很多。

在該控件在被使用者點選之後,會觸發一個Click事件,這個事件是我們自己建立出來的,我們可以在這個事件當中改變TextBox內的值(你試用看看就知道)。當然,我們也可以在其他控件(例如按鈕)當中來改變燈號(透過traffic light控件的屬性),總而言之,這就是一個標準的控件啦。

您可以點選[這裡]測試一下這個控件,關於程式碼的說明我會在七月的Run!PC當中介紹,如果您需要Source Code,請私下偷偷Mail給我。

2008年6月12日 星期四

Silverlight 2.0 beta 2

你知道Silverlight 2.0 beta 2推出了嗎? 是的,又是一缸子的增強,但是安裝檔案卻沒有膨脹,有哪些改變呢?

第一個,控件變多了,目前已經內建多達30多個,而且根據S老大的說法,未來預計提供100多個控件,是.....怎樣,有沒有搞錯???比ASP.NET還多? 而且設計好的控件還可以自行調整外觀卻不會需要動到控件源碼。(這個特性未來有時間我在寫一個範例介紹)

另外Sockets也支持跨網域了,同時也支援與伺服器端的WCF建立一個雙向通道,透過這樣的機制,不僅Client端可以向伺服器端要資料,伺服器端也可以主動把訊息推送到Client端。

同時,Silverlight beta 2也直接支援了ADO.NET Data Services,不用像3月時我在微軟研討會上寫那麼複雜的程式才能夠調用到遠端ADO.NET Data Services,使用上更便利了。如此一來,使用遠端資料庫裡面的資料完全不是問題。

另外,DataBinding也增強了,很多學員在Silverlight 1.0時代所面對的資料庫Issue現在可輕鬆的解決,這些內容,我會另外寫些範例和短文介紹。

至於Silverlight 2.0 該如何使用、怎麼著手開發、我在這個月的Run!PC已經有說明,如果讀者有興趣可以參考。


2008年6月9日 星期一

很讓人警醒的一段程式碼...^_^

這幾天重新看過去的email,看到有一位讀者寫過一封信,信件最後的簽名檔當中,發現了一段程式碼,非常非常有創意,還可以做為座右銘,真的超級有趣..

if (me.today == me.yesterday) me.tomorrow = null;

我這輩子第一次看到這麼發人深省的程式碼,特別取得作者同意與大家分享...^_^

2008年6月8日 星期日

再看New Mondeo的CF與軟體開發人員

我是mitsubishi的支持者,主要的原因是全系列的手自排和競裝的運動款車系,截至目前為止,我還是覺Galant和Lancer IO是房車裡面外觀最吸引我的(Grounder就別提了...-_-'''),而且根據調查,駕駛者購買的第一台車,很可能會影響該駕駛人未來的開車喜好和選擇。

OK,也就是說,你選擇了mitsubishi很可能一輩子就不選Ford了...

也因此,你會看到坊間常常鼓勵你去試駕,還送東送西的,主要目的就是改變你的第一印象,因為這個很重要,重新回頭來談這件事情,車商在如此不景氣的高油價時代,已經很難生存,還得花時間花大錢拍廣告,可見Marketing在他們心中有多重要...

我一開始不覺得...我越看New Mondeo那支廣告就越覺得是這樣...這麼說好了,比起New Mondeo這支CF,mitsubishi賣無敵鐵金剛的哪支就整個遜掉了(以前女兒和爸爸系列的就很讚),它造成的問題是,我開始上Ford的網站,稍稍看了一下New Mondeo的介紹,這一看不得了,你會發現很多功能(特性)是你想要的,如果我們沒有上Ford的網站,我可能永遠只會乖乖的選mitsubishi,New Mondeo就和我無緣了...

而這一切的改變,就是從一支CF開始...

不過,New Mondeo還要等我幾年,我現在沒錢買,也不想買,等到哪一天我可以富有到不用在乎油價的時候...我才會考慮...不過那時候可能全球已經沒油了,更有可能的是我根本等不到那一天...

不過我要強調的是,原來廣告的力量就在這裡,學軟體開發的我們,可能不容易發現這類動作的影響力有如此之大,其實,在台灣身為工程師,你也需要投入到專案當中,可能你也需要面對客戶,甚至你根本就很可能是presale,需要在客戶面前present,也有可能你的開發產品是一個套裝軟體,在軟體界,做的起也唯一讓人看得出來有在做marketing的就是MS,其他 Local廠商可能吃都吃不飽了,還得花錢去Marketing咧,可能想都別想,不過,你無可避免的發現,這個力量是大的...

所以身為技術人員的我們,可能參與另一種形式的Marketing來Promote我們的產品,例如研討會啦、世貿展啦、我強烈的建議技術人員盡量參與這些場合和機會,別天天悶在座位面前寫程式,你乖乖的做在電腦面前寫程式可能很爽(我也超愛寫程式的時候,The Moment is perfect),也可以領一點微薄的薪水,但是這個世界的潮流不會因為你而改變,偶而爭取一點機會,從另一個角度看看這個世界,從另一個角度看看你熟悉的軟體業,看看那些講師、那些Sales、Presale在幹些什麼,對於已經相當熟悉開發整天跟技術為伍的Developer,會有相當大的幫助,而且,好的idea常常從市場面來,而非從實驗室。

說真的,寫程式很有趣,但是...也僅僅是有趣而已。

福特廣告CF:


三菱廣告:

2008年6月1日 星期日

City of angels

又看到了另一個版本的Angels,這首歌歷久不衰,好歌和好電影,似乎不會因為時光的消逝,而折損它的一絲光彩。好聽就是好聽,沒話說...

City of angels,是我很喜歡的電影,如果你跟我一樣看過,大概還記得片中的情節,塞斯最後問 上帝為什麼,在千辛萬苦讓自己可以接觸到瑪姬後,卻讓這一切發生,彷彿賽斯所有的努力都是徒然,彷彿上帝讓這一切接近以報應的方式臨到,彷彿在嘲笑著賽斯的自作聰明和荒唐...

為什麼會這樣?不知道...沒有人知道上帝的旨意和安排會是如何...你的汲汲營營,最後可能只是徒然...
但是這終究是你的選擇...不是嗎? Freewill ~

最後一幕如果我沒記錯在海邊,天使們聆聽天籟,賽斯躍入大海,體驗過去身為天使卻無法感受到的一切...

人生有時候似乎就是這樣,你真的不知道下一刻會發生什麼...

如果你也看過這部片,有些片段,可以讓你回憶一下:

2008年5月17日 星期六

從keep working到+壓力−身段×堅強÷任性

如果有去我的研討會的讀者,應該會發現我的桌面是Keep walking的廣告,很多人問我是不是很喜歡這個廣告,是的,我很喜歡(不然放它幹嘛?)。

然後,最近有一位同事看到我的桌面說:『從這邊可以看到一個人的個性!呵呵~不知道是Keep walking還是從keep working~』,我則感慨了一下:『要找到生活與工作的平衡點真的很不容易!!!』

真的,特別是台北,身處在這個世界上數一數二高工作時數的城市,你很難感受不到擁擠與競爭壓力,最近忠成兄聽說我的狀況,稍了訊息來慰問了一下,還在自己的BLOG上感慨的針對IT人提出警言...

不知道你能否體會,說真的,不是發生在自己身上,感覺可能始終不是非常強烈。對於我們這種有理想有抱負的青年,Keep working好像是理所當然的,你希望抓緊每一分鐘,衝出你的一片天,但是隨著年紀漸長,你開始發現,需要平衡才能夠走的長久...

所以,我又把桌面的廣告換了,換成底下這一個:

我要說,這個廣告打動我的心,特別是主角在台上跳舞的那一段,讓我想到我當年在園區當小小工程師的日子...

你 + 壓力 - 身段 × 堅強 ÷ 任性 換算之後 你是否還記得真實的自己
去吧 陪自己走一小段路你會發現 真實的你會跟你在一起 為真實的你前進


文案都寫的不錯,從網路上的點閱率你不難發現這個廣告很深的打動了許多上班族的心...顯然大家都走過那種日子...^_^

除了工作,多陪陪家人吧,甚至多留一點時間給自己,別讓人生有遺憾~

2008年5月2日 星期五

天行健 君子以自強不息

時間是3:35的凌晨,如果你跟我一樣在這種時間還沒睡,那我要提醒你,這絕對不是一個好現象,如果不是迫不得已,我很不喜歡熬夜,先前說過,最近遭遇人生重大考驗,有一個讀者很有趣,寫信來問問題,其實我每天都接收到很多問問題的信件,當然,我沒有辦法逐一回,因為一封信多半會花我一兩個小時的時間,所以...只能盡力。

話說回來,這位讀者為了一個問題之後,很客氣的期待我回信(其實我的大多數讀者,真的都很客氣),但是我令他失望了,我沒有回,過了幾天,這對讀者寫了一封信來,問我為什麼沒回信,我看了之後不禁莞爾,這麼多年來,這是我第一次碰到有人寫email來問我為何不回email,大多數的讀者來信若是我沒回,一般的人會重寄一次,或是以reply的方式重寄一次(我想這是暗示我他不是第一次寄),或是從此就不來信了...

我第一次收到這麼有恆心毅力的讀者來信問我為何不回信,這種信我一定回,所以,我照實回了:『因為我在醫院,而且住了一個多月了,很抱歉我實在沒有辦法回關於技術問題的來信...』

這回輪到我失望了,我原本以為,我寫的那麼可憐,這位讀者應該會回信來問問我說:『David你還好吧?是為什麼住院了呢?發生了什麼事情???』但是沒有...我等了再等,依舊沒有,我又不好意思再發一次跟這位讀者說:『ㄟ,我回信囉,輪到你了啦...』

就這樣...讀者回信事件過去了...

回到剛才說的,我住在醫院,不代表我住院了,生病的不是我,但是是我很親近很親近的人,我必須照顧著他,最近這幾天我幾乎都只有睡三個小時左右,而且不是去睡兩三個小時,是坐著坐著不小心睡著了兩三個小時...醒來的時候我還會很內疚...

我最近跟Run!PC的編輯說,我強烈建議貴刊開一個資訊人員健康專欄...

各位同志,我們為了台灣的經濟、為了個人的家庭美滿、為了自己的荷包、為了專業的展現,不用我說我想大家都知道,資訊人員加班(或是這年頭各行各業)的情況早就司空見慣,為了一個專案弄到兩三點隔天還不是繼續上班?

但是,我真的要說,別把自己生體弄壞了,很拼,是一回事,要健康的拼下去,才能拼的久,記得我說過,所謂的成功,並不是一時之間跑很快的那個人,而是可以一直跑下去,跑的又長又遠的那個人...

『天行健 君子以自強不息』這句話出自易經,一般人看到這段話,會把它理解成《君子應當自強 不息》,但是這邊提供你另一個觀點。你知道嗎?『以』在古文裡其實是『用』的意思。這句話應該是《君子用自強不息》,意思是:君子用了它以後就會自強不息。

用了什麼啊???當然就是『天行健』。『天行健』是一帖藥嗎?不是...

直接翻譯過來就是,『遵行天道的運行法則是最健康的,君子通過順應這種規律,使自己變得更強,生生不息』而不是『君子應當埋頭苦幹拼死拼活的意思』。

據說,這種處世之道,在古時幾乎人人都知道,同時老子也說『人法地,地法天,天法道,道法自然』。怎樣才能健康? 說真的,其實大家都知道,不要熬夜,早睡早起,多喝水,吃點健康的東西,多運動...就這樣。

這些我也知道,只是...沒時間,對,沒時間,因為工作太多,也太重要了,所以運動和健康檢查總是被我排到後面的Priority,但是我要說,不知道有沒有跟各位提過時間管理的四個象限(把事情分成『重要且急迫、重要但不急迫、急迫但不重要、不重要也不急迫),我在上這堂課的時候,總是要學生舉例,哪些事情是『重要但不急迫』的???

因為,『重要但不急迫』最讓我們疏忽,『重要且急迫』的事情已經火燒屁股,你不可能不去作、『急迫但不重要』以及『不重要也不急迫』的事情你不應該去做...

那到底哪些事情是『重要但不急迫』的??

對了,典型的例子就是...運動、與健康檢查...這些事情都很重要,但不急迫,所以常常被忽略,但是你會發現,當你忽略這些事情之後,它們會『自動慢慢升級』成『重要且急迫』的事情,然後迫使你必須處理,如果常常這樣,你就陷入了持續的火燒屁股當中,導致每件事情的品質都很差同時也讓你措手不及,因此時間管理的重點之一在,找出『重要但不急迫』的事情,然後趕快去做...OK,我疏忽了...所以我現在在醫院。

『天行健 君子以自強不息』...很多事情,都是很簡單的,只是我們要注意,5/1勞動節過後,我想給各位一些很誠心的提醒,注意身體,也多花點時間陪陪家人,珍惜跟家人在一起的時間。

祝大家更健康更快樂...

2008年4月26日 星期六

2008年學習 tip與方向

適逢VS2008和一堆新技術的launch,讀者和出版社都在問,新書呢?

這件事情很有趣,老實說,ASP.NET 3.5的新書多少令人覺得有點尷尬,奚同學的BLOG上提過這個問題,就是ASP.NET 3.5基本上沒有大改,如果改版2.0的舊書,那市場接受度會有多少?
如果全部重寫,耗工費時,現在台灣的資訊書籍市場胃納量有限,恐怕錢途堪慮,面對這個問題,其實本人解決方案很簡單,就是 -- 寫自己有興趣、覺得重要的東西。當然, 讀者覺得重要的東西當然也會從善如流的照做,所以趁現在,還有一點點機會改變,如果你有任何建議,請不吝通知,在此先謝了。

這一次,我會開始考慮C#的部分,不少讀者問了C#的問題,最近工作的內容也是以C#來進行,所以乾脆先寫C#吧,不過對VB的讀者,請放心,我肯定會更加的照顧各位的(因為我也是VB長期的擁護者,不過這年頭,我說過,開發人員的雙語能力還是很重要的)。^_^

最近遭逢人生重大轉變,開始回憶了一下過去自己的一些過程,我依稀記得,在我寫第一本書的時候的心情,那時候,很多東西想分享給大家,很單純的只是一個分享的心情,如果我沒記錯那是2002年左右,今天是2008,這六年的改變不可說是不小,過去我很喜歡讀書,不過最近讀書的時間相對的少了很多,MS最近新技術公佈的實在很快,回頭想想這幾年有非常多的時間在看線上文件,犧牲了不少和家人相處的時間,還是提醒一下大家,多珍惜一點跟家人相處的時間。

今年,對於開發人員來說,我個人會推薦 ASP.NET 3.5 ext, Silverlight 2.0, LINQ, WCP, WPF,這幾個學習目標, 這幾年資訊書籍的市場改變挺大的,也有一點M型化的趨勢,銷量大的書多半是很入門的,或是很艱澀的。

針對這幾個技術,我傾向的學習目標如下:
ASP.NET 3.5 ext:你會發現我寫ext, 而非 ASP.NET 3.5, 這不是說 ASP.NET 3.5 不重要,而是改變實在太少,3.5當中的AJAX和新控件,其實在過去我們就討論過了,如果和筆者一樣對技術不陌生的開發人員,我相信對3.5的內容早就相當熟悉,但是3.5 ext絕對會是未來架構企業級的解決方案的重要資源,這部分較為艱澀,需要花比較多時間,因此建議讀者可以開始觀察。

Silverlight 2.0:Silverlight 2.0和1.0實在差非常多,過去曾經有人提過,Silverlight 可能取代ASP.NET 作為Web開發工具的另一種選擇,如果在Silverlight 1.0我敢說絕對不可能,但是現在的ilverlight 2.0,我則敢大膽的預言開始,依照你開發Web Site目的的不同,慢慢的許多Web上的應用可能真的可以逐步利用Sivlerlight 2.0取代ASP.NET,我對讀者的建議是,你不需要花太多時間去了解XAML,但是你可能要開始熟悉Silverlight 2.0的架構與新功能,以及基礎的開發方式。(可以考慮參考筆者在Run PC上的Silverlight專欄)

LINQ:你需要知道LINQ的目的,開始熟悉他的語法,在坊間開始有 LINQ TO AD, LINQ TO LDAP...等出現,這表示LINQ的意義開始被重視,學習LINQ的同時, 請順便注意VB和C#在語言上的改變與配合。

WCF:這麼說好了,Silverlight 2.0, ASP.NET 3.5, 整個.net 3.0都支援這個新的遠端通訊技術,與過去的Web Services相比,整個提升了不少,同時對於建構SOA有著更佳的支援,簡的的說,如果你過去用過Web Services或是.NET Remoting, 那WCF可能是你必須開始熟悉的技術。

WPF:作為.net開發技術當中的展示層介面基礎,WPF的重要性比台灣的開發人員目前所感受到的要來的高,當然,其實我們期待和需要的是一個更好的開發工具,VS2008和Expression兩者之間的關係與整合,可能是開發人員比較期待的,但是對於技術的基礎架構有一些了解恐怕是必要的,更何況現在 Silverlight 2.0的Xaml和WPF越來越像了...
以上是2008年我會建議讀者深入了解的幾個部分,當然,我們也會提供適合的線上教程與書籍給讀者。
順便一提,WWF並不是不重要,而是和各位想的完全不同,如果你對WWF有興趣,Micahel和Ruddy所撰寫的『Windows Workflow Foundation 新一代工作流程開發實務』,是難得一見的好書,第一章、第二章就可以讓你看到WWF的精隨,很讚。