2011年12月24日 星期六

走進廚房,才知道食材的好壞...

前幾天應邀到社群舉辦的講座,介紹雲端運算與行動裝置的整合,席間提到了Silverlight技術,不免又有一些開發人員問到這樣的問題:『聽說...微軟對Silvrlight的支持和更新將會如何如何...,這部分開發人員要如何因應』?

面對這類問題,我最近一年少說不只回答了10次,首先,『聽說』這個前提就很是問題,雖然報紙偶而會有猜對的時候,但捕風捉影總是佔了大多數。

另外就是開發人員要如何因應這種事情。

我始終覺得,沒什麼好因應的,開發技術本來就是這樣,特別是展示層開發技術,我在這篇文章中曾經說過,展示層技術的持續精進與改變是必然的趨勢。你回頭看,Wii和Kinect都是最近這幾年才發生的事情,但現在已經開始慢慢出現在我們LOB應用的UI裡面了。而觸控技術早就有了,最近五年才出現在手機上,如果回頭看過去20年,從黑底白字的文字模式,到Mac/Windows的圖形介面,到現在的RIA(Rich Internet Appication)開發技術,少說有沒有換過10種開發方式?

請開發人員接受一個事情,就是presentation(展示層)的UI開發技術,是每隔兩三年就會大改一次的,ASP.NET從2002年誕生到現在,共四個版本,也不過八九年,中間還有AJAX技術進來攪局和jQuery的崛起,還有現在的MVC設計模式,這些技術都是持續在精進與改變的,不多人在2005年之前,會預知後面AJAX應用成長的那麼快(中間也跟網際網路頻寬與行動裝置拖不了干係),而現在也不多人能100%論定是否HTML5將變成未來可能的一種趨勢。

如果你比較Flex/Silverlight/HTML5,然後開始聽到iOS對Flex有些疑惑,Silverlight沒法跑在iOS和android上,HTML5又不夠成熟,那怎麼辦? 要投資哪一個? 哪一種技術可以讓你長治久安?

長治久安? 答案當然是沒有! 沒有一種開發技術是可以讓你在這個變動迅速的時代,軟體生命週期爆低的世代,可以長治久安的。沒有!

但你確實可以選擇一個對自己來說投資成本比較低的方案,例如,著眼在跨平台,不同的device對你來說差不多,只是呈現出一個介面,你不會用到Device上的LBS或Camera,大部分的運算在伺服器端,那ASP.NET/JSP/PHP依舊是比較好的選擇。如果,你要建置的是企業內的LOB,你可以掌握幾乎所有用戶端的狀況,而過去你是.net的開發人員,那Silverlight絕對是不二選擇。其餘均可類推...

不同的技術就是用在不同的scenario,彼此之前從沒有衝突,(我們沒有說Silverlight是用來取代ASP.NET的,兩者甚至依舊常常合作),微軟的開發技術大多進入障礙低,這其實是一種設計過的優勢,我們希望開發人員不要花很多時間『一直在』學新技術,而是能夠很快地就去『用』新技術,去動手開發出點什麼可以改善這個世界的資訊產品。(寫這篇文章的人,顯然對.NET不是很熟)

在許多人還在爭論Silverlight的前途是否未明之前,我們公司的產品已經把Silverlight技術用的淋漓盡致(有點誇張我承認,但我一時之間找不到類似的詞,請包涵),那你說我們會不會不管HTML5? 當然不會,她依舊是我們下個世代產品的展示層技術考量之一。

因為我們熟悉Silverlight開發技術,在Windows Phone 7上我們的開發成本相當低,接下來的Windows 8,由於採用了XAML,對於熟悉Silverlight的我們來說,將Application(or Apps) Porting到Win8上當然也不是問題。

很多開發團隊或人員,針對Silverlight開發技術的評估,其實坦白說並不認真,因為從2007年Silverlight出現到現在,始終停留在『評估』的階段,而這三年,已經有數以萬計的產品(包含微軟自己的Windows Azure管理平台)是100%以Silverlight技術打造的。

我要說的是,如果你始終只停留在評估,那不如就乾脆放棄了吧,因為在你評估的同時,很可能競爭對手已經開始實作、已經開始推出產品。我總是覺得,與其花時間看遍報章雜誌去研究一個技術的未來,不如親自動手直接用這個技術開發點什麼。這是技術人員的本質,『評估』絕對不只是收集收集資料,綜合一下大家的意見就好。對技術人員還說,評估是親身的體驗,是自身的感受。

畢竟,走進廚房,你才能真正知道這些食材與調味料的好壞...

2011年11月30日 星期三

通往地獄的路,是由『善意』鋪成的~


        如果你家裡有電視,大概不難知道最近柿子的新聞很是熱鬧。其實我最近已經被搞得很煩了,所以前幾天在FB上po了一小段文。今天早上又不巧看了Jamie的一篇文章,其中談到了軟體工程師以及台灣的整體軟體產業和資訊市場,所以許多不吐不快的想法,需要整理表達一下。

        正打算提筆(其實是敲鍵盤)剛好又看到一篇商周的報導,讓我覺得今天或許是個不錯的時間,我們可以好好討論這個問題。

        我想把順序反過來講,商周今天有篇文章『善意的大政府卻鋪出荒誕之路』,是這期週刊的專題報導的總結與社論,文章很長,如果你有興趣可以自己買來看,但文內有三個標題我直接列出來,跟大家分享一下,來看看我們的政府最近幾年(又一次,兩黨都有份)搞出的投資建設如何:

一、花上百億,架288支大風車,1年發電量只夠台灣用1.5天
二、百億拼裝計畫改造彰化大城鄉,總統支票注定落空
三、4大慘業虧損,全民埋單,每人面臨2萬8千元呆帳風險

細節請大家自己看本期商周,這篇文章主要的意旨在提醒大家,對政府不應該有過度的期待,其實這符合經濟學中對自由經濟市場的理論,也就是政府管的越少越好,才能夠讓市場發揮(創造)最大的價值。關於這個論點我不再贅述,我也沒有那麼大本事關注整個台灣所有產業,我在意的還是台灣的軟體產業和軟體服務業的整個市場。

因此,我要講的是這一路以來,我的觀察和看法。

這麼多年以來,政府對很多產業做了很多補助,從過去的石化、裕隆的汽車、早期的電子業、最近的四大慘業(面板、DRAM、LED、太陽能),不管是出於善意或是各種利益考量,總之是花了非常多的錢下去,這些錢當然出自於你我的納稅。有些時候主政者用到了還算不錯的政(事)務官,有腦袋有良心,所以這些政府支持的產業交出了還可以看的成績;但不幸的是這幾十年來沒發生過幾次,反而是,在絕大多數的情況下,政府單位中對於產業其實一點也不熟的官員,本著上面交代的政策就多少做一點的上班族心態,把產業政策搞得一蹋糊塗,最後拍拍屁股政黨輪替或是退休去,領著公務人員的退休金,然而對於過去自己做的決策導致多少人沒有工作或生計困難,不知在午夜夢迴會不會覺得良心不安而輾轉難眠?

最近補貼柿子(還有以前補貼香蕉、還有以前補貼...反正一堆)的那些事情,以及兩黨賄絡選民的老農年金,讓我對台灣的政治人物的品格之低下以及選民的短視有了更進一步的認識。

當天我在FB寫了底下這段話:
-------------------------------------------------
我想,我今年要投給有老程(老程式設計員)補助的候選人,再怎麼說,我們這些人對台灣的App和軟體產業應該多少也有那麼點貢獻,而且台灣要是再不補助軟體產業,那繁體中文App以及本土在地軟體開發商都要消失了(這跟台灣沒有人種田其實一樣嚴重耶)...

但我們都沒有領過老程津貼(給老程式設計員的津貼),我們寫App也沒有政府的保障收購價格,App賣不好的時候,我也不能要求政府來買支持我們一下,這個產業才剛起步,還要面對全球化的競爭和挑戰,政府也沒簽什麼條款來保護我們這些愛台灣的App開發商(例如國外的App一律加上100%關稅),前陣子簽的ECFA也沒有給我們任何優惠和保障。一個柿子還可以賣二十幾塊,我們的App產地收購價格只有15塊上下,量還賣的沒有柿子多XD。這些候選人都不知道其實我們也很辛苦,也需要補助耶。

雖然微軟好心的贊助了我們一部分免費的生財工具,但人家農民買肥料和柴油也都有減免耶,連計程車司機加油都有補貼和減免,但我買NB和HD只能用PC home的免手續費分期。

每年都有政府出錢辦金馬金鐘金像獎來鼓勵台灣文化產業,其實我們也好希望有一個金柑(肝)獎來鼓勵我們這些辛苦寫Code的開發人員...弄個新光大道什麼的,支持一下在這個產業奮鬥了那麼多年的工作人員吧...
-------------------------------------------------

請不要誤會我的重點,我從來就不希望政府補助軟體業,一分錢都不要,除了App之外,其實台灣還有很多弱勢傳統軟體公司都需要補助,這需要通盤的產業政策(政府看似很在乎軟體業,但,真的有人在研究擬定台灣的軟體產業政策嗎?),政府只看潮流(App或雲端)或選票來補助是行不通的~因為,我想要說的是,沒有一個產業可以靠補貼政策而茁壯、沒有哪一個產業面對競爭而殞落時政府非拿全民的錢投入火坑而非救不可,最近Nokia在手機市場上節節敗退,Nokia佔了芬蘭近1/10的稅收,但芬蘭政府是怎麼說的?

「企業本來就有起落,他們必須自己reborn(重生), 這是很自然的情況。」芬蘭國家技術創新局(TeKes)執行董事何睿楷(Riikka Heikinheimo)說。「它失敗就失敗了,政府不該救,損失也是它們自己應該承擔的, 這就是市場經濟。」芬蘭經濟研究所(ETLA)研究主管亞爾柯(.Jyrki Ali-Yrkk?)說。

而台灣人呢? 銀行逾放比太高,呆帳太多要倒了,政府拿人民的錢補貼;小股民虧錢了,政府要國安基金進場;果農稻米欠收,政府要保障價格收購;高鐵要開天窗了,政府叫國營事業投資;四大慘業如今幾乎被證明是個白癡級的政策投資,但政府照樣拿錢繼續往坑裡面丟...

這些補貼的錢,隨便拿個一兩億,都可以幹出更多有價值有意義的事情。別再唬我台灣政府沒有錢了,我們繳的很多稅從我的觀點來看,根本是亂花

更重要的事情是:我們從來沒有要政府去做這些自以為聰明的蠢事。
請不要再拿我們的錢去東補貼、西補貼,然後以為自己有在做好事,錯,大錯特錯。很多補貼輕則厚此薄彼不說,更多的情況根本是造成官商勾結的弊案,或是轉化成政策買票以及圖利特定產業特定選民的黑箱暗盤。

政府要盡全力去做的『根本只有一件事情』,就是『把基礎的建設弄好』。你把基礎弄好了,再來錦上添花一下搞產業投資,我可能也不會那麼在意,但重點在你基礎沒搞好,這些產業投資根本是聊勝於無的短期作秀而已。

什麼是基礎?
把道路鋪平,把交通弄順暢。
把商業制度與經濟環境弄健全,把行政效率全面提升。
把法律與司法制度貫徹,實現一個公平正義的競爭與投資環境。

讓我們這些廠商在打拼的時候沒有後顧之憂,這樣就可以了。

是誰叫你拼命花錢辦白目的App比賽的? 是誰叫你到處撒錢弄出一堆養肥包商的軟體專案? 是不是可以不要再做這種事情了。

把網路弄通暢,讓價格合理化,讓我們有好的連線品質,讓台灣可以成為真正運籌帷幄的訊息流通中心;把交通弄好、讓我們出國洽商或招待國外客人的時候,不用擔心機場屋頂會漏水X光機自己燒起來;把台灣的學校辦好,讓軟體研發廠商可以在本地市場找到人才...而不是每年從學校培養出一堆只想繼續躲到研究所裡面好避免失業的蠢蛋

就這樣,是的,這樣就夠了。
其他的我們自己來,讓產業中的人自己接手,我不需要政府對App或軟體開發有什麼補助,我需要的是法令可以跟上時代,App的銷售和金流可以順暢不被政府過時的法令所牽絆,其他的政府不需要操心,台灣人很努力,我們在全球上是有競爭力的,那些跟國外廠商廝殺的事情,不勞政府官員們您的費心,我們自己就可以搞定。這個道理就跟政府應該專注於農業政策,避免產銷失衡的問題,而不是拚了命在選前搞出各種補貼一樣。

我不知道過去這麼多年來,政府到底是出於善意或是背後有什麼與特定產業廠商之間的利益交換,坦白說我也不在乎,但是如今通往地獄的路是現在是眼睜睜的擺在眼前的,iPhone和FaceBook改變這個世界只用了五年! 才五年,這世界就變了,而我們還有幾個五年可以等待政府腦袋開竅而想清楚到底該怎麼做呢?

2011年11月5日 星期六

[周末留點時間給自己]起初的心情...

『...然而有一件事我要責備你,就是你把起初的愛心離棄了。 所以,應當回想你是從哪裡墜落的,並要悔改,行起初所行的事...』啟示錄 2 : 4~5

最近在寫程式的時候,突然想到上面這段聖經經文。

前陣子有些疲倦,這個疲倦可能不只是身體上的,也是心情上的疲倦。幾天前和一個廠商聊天,他提到收到一些終端用戶的來信,對於公司開發的產品的建議,以及對軟體收費的埋怨...如同我過去說的,台灣很多使用者認為大多數的App應該免費,持有的論點很多,但歸納到最終只有一個,就是能不付的錢當然就要省下來(老實說我異地自處、捫心自問,有時候連我自己也會這樣想,連老張都說未來景氣似乎不會太好,所以能省則省),這是在市集中,衝動型消費或具有強烈需求的App比較容易讓用戶甘心掏錢的原因。也因此遊戲賣的比應用程式好、辣妹賣的比遊戲好的原因,而服務型或工具型的App則大多透過廣告或其他方式的獲利。而剛好最近我和在南部的App獨立開發商朋友們有一些討論,大夥兒對於台灣軟體業的生態和走向,依舊有點憂心。

然而抱怨大家都會,所以我們要練習不要太多抱怨,今天也不適合來談什麼大道理或遠大的抱負,至於過去很多跟政府單位與長官們提出的建議,也是從整體市場的角度來看,說真的沒什麼私心。關於政府如何花錢這件事情,我就不再多說了,最近還有一些讓人聽起來很不爽的案例,例如一齣劇花上兩億之類。(文中說,曾道雄感嘆「其實只要二億一千五百萬元的一半費用,就夠我做一輩子的歌劇,甚至演到死都用不完」。兩億? 我猜我們大概可以寫一輩子App了。因此我在此宣布,如果我包到兩億元的App政府專案,我立刻先捐出1/4,然後再開放100個周休三日的工作機會,程式設計師們都不用怕無薪假)

軟體產業會有這個狀況,歸納其因素,台灣市場小,是主因,最近從數據上來看, 即便是純中文化(沒有支援多國語言)的App,在台灣的銷量依舊遠小於台灣以外(這表示國外買中文App的消費者遠比台灣多? 這豈不奇怪?),所以我們現在的App需要全面國際化,每一隻App都做multi-language是必然的,但即便如此,要讓大家願意掏錢,我們還是得要費下一番功夫,例如美術設計的補強,建立競爭者的進入障礙與門檻...等。

不過這都不是這篇文章的重點,重點是,今天我想講一個故事。嚴格說起來,是有關於我個人有生以來的第一個軟體產品的。

事情是這樣開始的,大約二十多年前,有一天下午,我的堂弟很興奮的跟我說,大偉哥哥,我們在上課的時候看到你的名字耶,啥? 我的名字???

『對啊,你的名字在課堂上,而且老師還提到 .... ... ... 』堂弟滔滔不絕的說,他們連續幾次整堂電腦課都在教我寫的軟體。

我當時只是個學生,沒那麼厲害寫出什麼教學系統,細問之下,才知道原來是我在幾年前(如果從現在開始算,大概超過25年)寫的一支個人通訊錄管理程式(DOS版,很遜,找不到Source code了),用C語言(那時候還沒有C++、沒有Java、沒有.NET)寫的。和我差不多年紀的朋友們,還記得那個freeware和shareware的時代嗎? 很多軟體是用捐款的方式來銷售(其實嚴格說起來根本沒有銷售,是推廣)的,當時是沒有internet的世界,是BBS當道的時代,寫好的程式是由開發人員上傳到BBS站台上去,讓大家自由下載使用的...

就是這樣的一個年代,我們(當時還是學生)在家裡狂寫App,沒別的原因,只是寫了開心。因為資訊較為封閉的原因,當時寫好程式之後,甚至連跟別人炫耀的機會都沒有(那個年代不是每一個人都會奢侈地擁有一台個人電腦的,甚至絕大部分有電腦的家庭,是全家共用一台...)。因此,把自己寫好的App放上BBS,和大家一起分享...是當時很流行的方式。

和我年紀相仿的朋友們,各位還記得那個年代嗎? 還記得寫程式不為別的,只是為了開心,只是在程式設計師的身體裡面有一股創作的動力,讓你源源不絕的想把這些分享出去。為了不讓堆積在腦袋裡的代碼爆炸,所以我們持續的學習,持續的撰寫,持續的分享...我要說的是,那時候,很開心

曾幾何時,寫程式的人變多了,用程式的人也變多了,整個市場變大了,流通變迅速了,應用程式從電腦跑到手機上,應用軟體從全家人共用變成每個人的私人貼身助理...轉眼間十幾二十年過去了,現在的我每天與程式碼為伍,有時候連作夢都會夢到新的開發架構或Idea,但當年那種純粹寫程式的開心卻時常消失的無影無蹤...

所以我突然想到前面那節經文(我知道可能沒什麼直接關係,但是人的腦袋就是這樣,這是真實世界,我寫的是真實的紀錄,我沒法控制我突然要想到什麼)...我在想,起初的心情...而今晚,這個周末,我想開始找回起初寫Code的心情。

Developers,何妨周末夜,為自己寫個小App吧,不為什麼,純粹只是開心而已。
圖中的文字是...
I am a Programmer. I work for days with little or no sleep. I am always evolving my knowledge. I translate theories into reality. I code in many languages. I tirelessly test the complex so you see just simplicity.

2011年11月3日 星期四

在App中讀取Windows Phone 7手機內的照片資源(Picture Hub存取)

同樣的,和存取音樂檔案一樣,手機上的照片檔案存取,也採用一樣的方式,我們可以透過Microsoft.Xna.Framework.Media.MediaLibrary取得用戶儲存於手機上的照片,關鍵在Pictures屬性:

//透過MediaLibrary存取手機照片
Microsoft.Xna.Framework.Media.MediaLibrary lib = new Microsoft.Xna.Framework.Media.MediaLibrary();
foreach (var item in lib.Pictures)
{
    //動態建立Image物件
    Image img = new Image();
    //加入容器
    StackPanel1.Children.Add(img);
    img.Width = 400; img.Height = 400;
    //設定圖片來源
    BitmapImage bi = new BitmapImage();
    //關鍵在item.GetImage取得圖片
    bi.SetSource(item.GetImage());
    img.Source = bi;
}

開發人員需要比較留意的部分,是動態建立的Image物件,是透過source屬性來設定圖片,但圖片來源必須是BitmapImage,因此我們又動態建立了BitmapImage物件,並且透過SeetSource來設定該物件的binary圖形資料來源,而這個資料來源,當然是從item取得,使用的是GetImage()方法。

執行的結果如下:



請留意,Microsoft.Xna.Framework.Media.MediaLibrary.Pictures取得的每一個物件,其型別是Microsoft.Xna.Framework.Media.Picture,這個物件除了可以透過GetImage()取得圖片之外,還有幾個重要的屬性,諸如:Name, Width, Height, Date, Album…分別可用來表達圖片的相關資訊。

2011年10月31日 星期一

在App中讀取Windows Phone 7手機內的音樂資源(Music Hub整合)

前陣子WP7 Marketplace當中有一隻HTC推出的免費App挺有趣,可以在App當中抓取顯示並撥放手機上的多媒體資源,諸如音樂檔案或是影片,先前我們在討論Silverlight開發技術的時候,並沒有看到API裡面有可以抓取到手機音樂的指令,第一次看到的時候著時讓我有些好奇,找了一下MSDN資料發現難怪之前沒看到,原來是出現在XNA這個Namespace底下。

我們可以透過底下的指令找到手機上的所有多媒體檔案:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    //透過Xna抓取手機上的音樂
    Microsoft.Xna.Framework.Media.MediaLibrary lib = 
        new Microsoft.Xna.Framework.Media.MediaLibrary();
    //Binding到ListBox上
    this.ListBox1.ItemsSource = lib.Songs;
}

當然,由於屬於XNA Framework的部分,請在使用前先在專案中Add Reference:


加入Microsoft.Xna.framework,接著即可使用前述的指令碼抓取到資料,如果你要像上述程式碼一樣把樂曲BindingListBox物件上,必須先幫ListBox設計Template

 
  
   
   
   
   
  
 


然後將此Template使用在ListBox上:

如此一來就可以在自己開發的App中,呈現出手機上呈現出每一首歌的名稱,以及演唱者與專輯名稱:


由於Silverlight的DataBinding技術,在listBox當中每一首點選的曲子,可透過底下的方式抓取到,甚至可以透過底下的程式碼,撥放選取的Item:
private void button1_Click(object sender, RoutedEventArgs e)
{
    if (this.ListBox1.SelectedItem == null) return;
    //取得選取的樂曲
    Microsoft.Xna.Framework.Media.Song song =
        this.ListBox1.SelectedItem as Microsoft.Xna.Framework.Media.Song;
    //進行撥放
    Microsoft.Xna.Framework.Media.Song item = song;
    Microsoft.Xna.Framework.Media.MediaPlayer.Play(item);
}
在模擬器上也可以操作,你會發現我們的App與Music Hub可以整合在一起,在模擬器(RTW版本)上也有內建有三首曲子,可以方便我們進行測試。

當你在開發測試環境當中,使用模擬器時,也可以按下鍵盤上的F9, F10按鍵,這時可以模擬手機音量鈕,呈現出左方的畫面。


你不難發現,我們的App直接控制了WP7的Music Hub進行音樂的撥放。

如果不想使用DataBinding的方式,您也可以用底下的程式碼列出每首歌的名字:
 Microsoft.Xna.Framework.Media.MediaLibrary lib = 
    new Microsoft.Xna.Framework.Media.MediaLibrary();
foreach (var item in lib.Songs)
{
    //顯示樂曲名稱
    MessageBox.Show(item.Name);
}

透過這樣的方式,我們可以輕易地抓取到手機上的多媒體資源,並且和我們的App進行整合,也可以控制MusicHub的撥放,非常的方便。

如何存取照片資源呢??? 請參考這裡

2011年10月24日 星期一

關於雲端運算

[引言]這一篇,是幾個月之前應邀寫的一篇討論雲端運算的文章的原稿,因為篇幅的關係,這篇文章在刊出的時候做了相當大程度的刪減,幾個月過去了,重新看到,只貼在blog給有興趣的朋友...另外,這一篇並沒有試圖為雲端運算下定義,因為定義可以從NIST找到http://www.nist.gov/itl/cloud/ 這篇只是說明我們對雲端運算的一些規劃與想法...
  
從虛無飄渺到豁然開朗

        前陣子受邀到某教育訓練中心上課,剛好學員前一堂課的講題是雲端運算,看到學員臉色頗為疲倦,不禁好奇早上的講師是否塞給大夥太多內容而造成學員壓力。因為這個班下午我得要接續著上課,所以不免關切地問了學員一聲:『早上雲端課程上的如何啊?』

        沒想到不問還好,這一問之下,學員七嘴八舌地聊了開來,有個年長的學員用八個字做了總結:『虛無飄渺,無邊無際』。由於學員先前都沒有接觸過相關的概念,聽起來雲端運算好像很厲害,無所不能,但從講師的介紹中,又分不太出現在所謂的雲端運算和傳統的虛擬主機、主機代管、或網路服務有何不同,看起來像是過去我們說的SOA(Service-Oriented Architecture)的一種延伸,又像是ASP(Application Services Provider)的一種變形,那到底雲端是什麼? 早上一整個課程上下來,學員似乎還是摸不著頭緒…

        其實這個話題,得要從20年前開始說起…

二十年前的夢想

        約莫在15年前,Bill Gates出版了一本頗為引人關注的書籍『THE ROAD AHEAD』,清楚地闡述了他早在1990年11月於Comdex中所發表 - 主題為『Information At Your Fingertips』的演講,20年後的今天,你可以看到Bill Gates對未來描述的精準先見。
        當時所提及的概念,已經把網際網路和資訊科技將帶給我們的願景清晰地勾畫出來,可能在20年前你很難想像,任何人,在全球的任何地點,都可以從口袋中拿出一個可以隨身攜帶,只有手掌大小的設備,而這個設備可以提供你所需要的任何資訊,不管是當天全球重大的即時新聞(例如最近的股市崩跌)、或是你家裡大門口的監視器即時畫面。不論你在這個地球上的哪一個角落,只要能夠連上網路,不管是工作還是娛樂,所需要的各種資訊,都在你的掌握之中。
        20年前所說的『Information At Your Fingertips』(資訊彈指可得),在智慧型手機和平板電腦的迅速普及下,早已從所謂的願景變成今天日常生活中的一部分,拿起你的智慧型手機,你所在位置方圓百里內的吃喝玩樂,也都一手掌握,這(如今我們習以為常的一切),可是過去人們前所未有的體驗。
        而這一切的資料,都存放在哪裡? 提供這些搜尋或運算的伺服器主機又在何處? 串起這一切可能性的關鍵技術又是什麼? 沒錯,這些都是雲端運算的一部分。

從Application Service Provider到Cloud Computing

        早在十多年前,在網際網路開始普遍之後,就有不少研究單位提出過ASP(Application Service Provider)的概念。打從軟體開始與硬體分開銷售,獨立收取費用以來,軟體的通用性與可複製性,就成為影響這個產業盛衰的關鍵因素。
        簡單的說,從商業的角度來看,開發完成後,只能賣一次的軟體我們叫做專案,能夠重複賣很多次的軟體我們叫做套裝軟件,而套裝軟件的獲利基礎則是建立在客戶群的規模上。軟體公司開發出一套辦公室軟件,銷售給全球的企業,由於使用量大(具有規模),所以締造出了一個龐大的產業生態鏈。但沒過多久,大家發現這似乎有些問題…
        首先,軟體並沒有辦法如同汽車一樣,一旦買了就一直用下去,而是每隔幾年就需要改版,升級,這不僅僅對於客戶來說是個困擾,對於軟體供應商也是個頭疼的事情,隨著升級改版所帶來的問題,常常需要更多的客服人員才能解決,使得隱含的軟體開發成本更高。由於軟體是安裝在客戶端,每一個客戶端的硬體狀況又有所不同,更造成了維護與服務上的困擾。
        不僅如此,對於廠商來說,軟體的獲利模式是基於複製,也就是我研發一次,可以賣出很多套,但這在某些地方顯然不可行,在某些對於智慧財產權並不嚴謹的區域,軟體的盜版和私自複製侵蝕了軟體公司的獲利。雪上加霜的是,隨著全球化的普及,企業營運的需求瞬息萬變,軟體的生命週期開始逐漸變短,改版的頻率漸高,慢慢地大家發現,軟體的獲利基礎已經不在,漸漸地開始被升級改版以及客服的成本所吞蝕。
        這時候,ASP(Application Service Provider)的概念為軟體界帶來一盞明燈,不少軟體廠商嘗試以服務的概念來替代軟體銷售,也就是說,我不再販賣一套一套的辦公室軟體,而是把軟體免費提供給客戶,由客戶自行安裝或是從網際網路上下載,或甚至直接透過瀏覽器執行,不再依照軟體的銷售來計費,而是依照軟體(或乾脆把軟體視為一種服務)的使用量來計費。企圖製造軟體廠商與客戶兩端雙贏的局面。
        怎麼說呢?因為客戶早就發現,一整套辦公室軟體,可能我只用到20%常用的功能,但每賣一套我還是得付100%的費用,套裝軟體也不像專案,可以分開計費,而即便開發商提供不同版本的功能,如何切割卻也並非由消費者自己決定,而是掌握在軟體廠商的手裡。如果,釜底抽薪的將計費方式改成用多少付多少,對於消費者來說似乎是更有利的。
        而從軟體廠商的角度來看,以租賃替代賣斷,看似降低了銷售金額,但其實後續獲利的可能性似乎更高,怎麼說呢? 過去我一套一套的賣,現在我則是你用一次我收一次錢,首先我隨時可以掌握使用者的狀況,我知道你用了哪些功能,開檔開過幾次,報表印過幾張,軟體廠商可以得知那些功能用戶最喜歡,那些功能客戶根本沒在使用,從而進行改版與更新,提供更好的服務。
        而更重要的是,不像過去一套一套賣的軟體,以租賃方式銷售只要客戶一但使用,要轉換成其它品牌同質產品的難度更高,無形之間增加了品牌向心力,只要你用了我的進銷存系統,大概總帳和會計系統也跑不掉,不久之後訂單就到我手裡了。
        而且這個機制一併解決了軟體被私自複製的盜版問題,所有的使用都需要連線到軟體廠商的伺服器端,經過驗證才能使用,以Web方式提供的軟體服務,更省去了客戶安裝的動作,改版時也不需要擔心客戶端的設備環境問題…過去困擾開發商的問題一一解決。
        這確實是個好的想法,但如同許多新穎的概念一般,由於當時的時空環境並不成熟,硬體與網際網路的效率與普及率稍嫌不足,再加上安全性的考量與收費機制(例如線上刷卡)的法令依據尚不完備,導致這個概念始終只停留於最初時期的測試營運階段,這一等,又過了將近10年。

雲端運算(Cloud Computing)的條件與要素

        10年後的今天,隨著網際網路的普及與頻寬大幅改善,以及虛擬化技術的成熟應用,雲端運算開始以不一樣的風貌重新出現在世人面前。但如果你以為現在我們說的雲端運算技術只是當年換湯不換藥的ASP(Application Service Provider)或是其實大同小異,那顯然這又是一個被媒體胡扯隨便報導下所導致的認知錯誤。

        很多人以為,『能夠用Web方式提供軟體服務,或是以AJAX技術提供軟體服務的產品,就叫做雲端運算』….對於身為ISV的軟體開發商來說,這個解釋不僅錯,而且錯很大。
        請容我這麼說,這或許是沒有技術背景的行銷人員,從無限廣義的泛商業角度下,隨便勾畫出的雲端運算概念。一般人茶餘飯後聊天時可以這麼認知,身為有技術背景的專業人員的你千萬別這麼單純。

        首先,以Web方式提供軟體服務,根本不是必要條件,不然現在的智慧型手機或是平板電腦上的App, 全都要被摒棄在雲端之外,豈不冤枉。況且,著名的DropBox或Skydrive,就是典型的雲端服務,這些雲端服務的用戶端呈現方式,除了Web瀏覽器之外,早就多的是以智慧型手機或PC的原生開發技術所建立出來的應用程式(App或Application),是不是完全都要走80 port也不一定,所以這個定義顯然是有問題的。

        而AJAX技術則是Web上Presentation(展示層)的開發技術,為了與後端數據庫進行連結,提供用戶更順暢的操作體驗,這更與雲端運算毫無瓜葛。
        唯一說對的大概只有雲端運算是以軟體服務的面貌出現,而非以軟體銷售的概念計費。因此,租用(用多少,付多少)與採購彈性肯定是當前雲端運算的主要定義之一。不過話又說回來,雲端運算的定義之所以如此的模糊,除了媒體所造成的誤解之外,部分軟體廠商刻意模糊焦點也是事實,畢竟定義越模糊,就越容易擠進申請政府補助的門檻,而消費者也更容易在不知所以的狀況下買單。

        然而,對於身為ISV的廠商來說,我們認為雲端運算至少要具備底下特性,缺一不可:
  1. 以租用方式提供軟體服務,用多少付多少,而非銷售軟體。
    在雲端運算的時代,軟體開發商需要認知自己所銷售的是服務,而非軟體產品。軟體僅僅是開發商提供客戶服務的媒介(或是載體)。真正銷售的乃是服務,因此軟體的使用也開始有所改變,再也不像過去,是一套一套的賣,更可以想成是免費提供軟體,而客戶租用的是軟體公司所提供的服務品質、以及服務內容。
     
  2. 具有延展性,能夠隨時依照當下需求增減服務規模。
    既然軟體是以服務的面貌呈現,當然就需要考慮延展性的問題。所謂『軟體的延展性』是指:『當用戶端需求量瞬間增加或減少時,軟體服務能夠隨之動態調整的能力。』例如,我們建立的ERP服務,目前主機的營運規模,在客戶是500人同時使用的狀況下運行良好,但一夕之間客戶從500人同時使用突然變成5000人同時使用,多出了10倍,原本的軟體服務是否能夠在不改變程式碼,只透過設定的狀況下,就滿足客戶端流量和計算能力突然激增的需求? 這我們稱之為延展性。以網站來說,最典型的例子就是旅遊業的淡旺季,或是熱門表演的售票機制,這些應用都是隨時有可能出現爆量連線的狀況。現今的雲端運算軟體服務,在以『用多少、付多少』的概念為前提之下,要滿足客戶最理想經濟的購置成本,客戶理當可以在需求量較低時,以一兩台伺服器面對最基本的軟體應用需求,一旦發現流量激增,隨時可動態增加數台乃至於十數台伺服器,同時服務以達成延展性的需求。(在過去這樣的軟硬體架構有其實作上的難度,而今天拜虛擬化技術之賜,現在已經可以輕易地達成)
     
  3. 具有Load Balance(負載平衡)、與FailOver(錯誤後轉移)的能力。
    Cloud Computing必須提供永不斷線、穩定、且持續性服務,因此除了前述的延展性需求之外,隨之而來的還有穩定性與持續服務的能力。在理想的雲端運算技術架構下,不管是Web, AP, 乃至於DB Server, 都必須要提供Load Balance、與FailOver的能力。也就是說,使用者端(客戶),連上來使用的每一個瞬間,位於雲端的軟體服務需要提供穩定的連線品質與資料的正確性。
     
  4. 以Multi-Tenant(多租戶)作為服務的基礎骨架與必備要素
    對於提供SaaS(Software as a Service)的廠商來說,由於一般性軟體開發的獲利必須建構在複製與一定的市場規模上,因此Multi-Tenant的架構則是這一切的基礎,若提供SaaS服務的ISV,無法以多租戶的技術滿足客戶的需求,還得新增一個客戶就手動開設一台服務器,顯然在競爭力上已經落於人後。
        您大概不難發現,上述這些軟體服務的技術基礎,都建構在虛擬化技術上,現今以虛擬化技術所建構的雲端運算服務平台(PaaS),能夠在架構上滿足上述延展性與負載平衡等技術需求,並且同時能夠讓ISV搭建出以Multi-Tenant為主體的軟體服務(SaaS)。

        十多年前,ASP(Application Service Provider)之所以無法成功,除了安全性是一大考量之外,當時的網際網路和硬體架構,實難承載上述軟體服務所需要的相關的基礎設施,而十多年後的今天,不僅在台灣隨處可以上網,上網設備更是琳瑯滿目,連線品質早就可以滿足絕大部份的資訊交換與遠端運算需求。同時,由於虛擬化技術的成熟,我們才有可能建構出極具延展性的軟體服務,隨著客戶實際需要的流量,動態調整記憶體、伺服器、儲存體的大小與數量。這些都是過去十多年前ASP(Application Service Provider)廠商可望而不可及的夢想。

        再加上位於應用程式展示層的用戶端操作介面技術突飛猛進,透過現在的Silverlight開發技術可以輕易的設計出相當優質的UI,甚至可以運行在PC、平板、智慧型手機等各種不同的介面,在安全性上也跟著增強,如今ISV比起過去15年更有機會建構出優質的軟體服務應用。

雲端運算是軟體產業必然的方向
        透過上面的說明您大概不難明白,隨著技術的演進與成熟,這段路走了十多年,雖然看是緩慢、波折,但卻堅持而持續著。從歷史演進的角度來看,雲端運算可說是必然會走的方向。
        過去許多人在意的安全性顧慮與隱私的問題,這幾年也慢慢開始改變,從Google, Microsoft, Youtube所提供的免費服務, 一直到SalesForce, DropBox提供的商業應用,市場逐步開始接受資料放置於雲端(遠端伺服器)的可能性,而服務供應商,也透過前述的種種技術,建構出優質、穩定、且安全的軟體服務。
        這形成了另一波的軟體革命,過去的軟體賣錢,未來軟體則是免費,君不見Google App免費的提供了類似Word、Excel的線上服務給個人用戶,而微軟也從今年開始,提供Office 365,讓消費者以租賃的方式使用,如今只需要連上網路,不管是用PC或SmartPhone,你都可以在線上使用Word、Excel編輯檔案,並且和遠端的上下游廠商或合作夥伴共同編輯同一份文件,達成前所未有的協同運作效果。
        而這一切居然都是免費的(微軟與Google都有提供免費的App服務給個人用戶),靠著銷售軟體獲利的時代已經過去,破壞性創新讓軟體的開發與銷售走上了另一條路。現在你要做的是,讓你的消費者,打開電腦、拿起手機、連上的是你所提供的服務,藉由你的軟體服務,來協助客戶達成日常所需的一切資訊需求,利用你提供的軟體服務,來滿足客戶的資訊化需要。
        數年後的商業環境,使用以雲端服務提供的軟體應用,將會如同日常呼吸一樣的自然,而今天,軟體服務供應商的挑戰與競爭和重新洗牌則已然開始。

以微軟Windows Azure為基礎的具體應用
        從ISV的角度來看,我們很高興微軟在這一塊並沒有缺席,不僅如此,微軟的Windows Azure以及SQL Azure技術有效地提供了良好的開發平台,讓身為ISV的我們,可以在這個平台上以更合理的開發成本,建構出優質的SaaS服務。
        過去半年,我們(光岩資訊)利用了微軟所提供的Azure技術,建構出了大中華區第一套以Silverlight(未來將擴展為HTML5)配合Windows Azure技術所研發的『EasyCloud雲端運算開發平台』,以及相關的辦公室e化應用套件,讓企業得以租用的方式,來使用我們所提供的一切軟體服務。
        不僅如此,為了讓中大型企業客戶也能夠享有安全的雲端運算開發技術,省去購置與維護伺服器的成本與人力,租用EasyCloud雲端開發平台時,可直接搭配微軟的Windows Azure與SQL Azure雲端服務。企業內的IT人員若擁有基本的.NET開發技術,甚至可在平台上自由建置與開發屬於自己的 App,將企業內部所需要的應用,透過我們所提供的EasyCloud開發平台,搭建於微軟所提供的雲端運算中心,享有前述諸如延展性、負載平衡、以及前所未有的穩定性。讓企業內的使用者不管身在何處,透過NB或SmartPhone(特別是Windows Phone 7)連上雲端,隨時可取得自己所需要的任何資料,甚至與地球另一端的夥伴一起合作。
        透過導入雲端運算技術所降低的營運成本,以及節省的管銷費用,更讓資訊化投資在財務規劃上更加透明且容易預測,不至於變成營運上的財務黑洞,這讓客戶對於雲端運算的投入更有信心。
        對於身為微軟ISV的友商來說,我們所開發的平台也有助於ISV在最少的投資下,將產品由現有的Web/Windows應用移轉成以微軟Azure為基礎的雲端運算服務,EasyCloud平台本身所內建的Multi-Tenant機制,可讓開發出的應用立即具有Multi-Tenant與Billing的功能。而這一切都是建構在Windows Azure以及SQL Azure良好的基礎上。

令人引頸期盼的未來
        面對已經成為趨勢的雲端運算,我們隨著微軟邁出了第一步,我們看到的是一個嶄新的可能性,不管是市場狀況、SaaS的概念與Business Model,都將讓軟體產業重新洗牌。不僅如此,由於雲端運算的態性,我們面對的已經不只是台灣的市場,而是全球化競爭與機會。
        回顧軟體業,每一次的改變,都是梟雄崛起的全新機會,每一次的改變,也伴隨著不少巨人的殞落,面對這個趨勢,恐怕你立刻就必須決定下一步該怎麼走…

2011年10月13日 星期四

台灣的軟體人才在哪裡?

        最近,政府舉辦了不少的App設計比賽,大概是看到了芬蘭在沒了Nokia作手機界的霸主之後,居然還可以有一個能撐住半邊天的紅色小鳥,回頭想想台灣雙A品牌在小筆電上碰到的挫折,又環顧了一下過去幫台灣掙錢的代工產業前景茫茫,想說反正比起花在兩兆雙星上的銀兩,辦些個App比賽只是九牛一毛,搞個不好給他異軍突起,成為未來的一條生路...不知道是不是因為這樣,所以最近常常聽到各式各樣的App新聞,甚至也有跟前陣子雲端綁在一起炒的,不管如何,至少這個產業似乎被推廣開了,只要有動作,我都認為是好事...

        但是前陣子跑了不少學校,並且和業界一些前輩們聊天,大家都有一個一樣的感慨,台灣的軟體人才真的越來越少了。雖然學校的科系開的琳琅滿目,從遊戲開發到機器人設計都有,各樣五花八門的學科讓人目不暇給,但是同學畢業之後,真的在職場上撐在那裡寫程式的,能有多少?

        我不用算也知道,因為部落格會說話,全台灣軟體相關部落格一個月的點擊率加起來,能不能打敗教人化妝的部落格,或是隨便一個所謂的人氣美少女外拍部落格,不用我說大家也知道。前陣子流行金釵文化,一些大學的資工系學生寧願當Model走演藝路線,也不願意坐在辦公室寫程式,雖然我不知道人家在學校的成績怎麼樣,但我想就算人家小姐C++寫得很好,java駕輕就熟,畢業之後當Model或藝人大概還是比較划算,隨便一個主持通告比我們這些所謂講師的鐘點還要高,人家不願意自甘墮落寫程式,我也就不那麼在意了...

        但是這凸顯出一個很有趣的落差,台灣很多軟體公司的開發人員其實不在台灣(這大家都知道),而台灣土生土長的程式設計師,薪資結構上也並沒有比其他行業要來得高(這邊先不論畢業生的技術能力如何),程式設計師薪資低,工時長,只有乍看之下很高檔的社會地位(因為以前大家都以為程式設計師是科技新貴,後來才慢慢發現搞錯了,那是指製造業寫韌體的),結果不僅台北市的房子買不起,連台北郊區的也很拚...這時候,能留住所謂的人才才真的見鬼。

        這薪資結構其來有自,如果市場上對一個軟體專案,對一個手機App,對一個套裝軟體...的價格始終是低估的,而內需市場又硬是比其他產業小,而外銷能力又還沒成熟到足夠與國外廠商車拚,那這個產業該怎麼扶植起來? 如果政府對某個產業的投資是矇著眼睛撒錢(其實總比沒撒錢來的好,我們現在的標準已經自動降低了),那能夠培養出紅色小鳥才怪。

        程式設計師學習了很多(而且每天都在持續更新與變多)的專業知識,每天昏天暗地不打緊,到頭來你依舊買不起工作地點附近的房子、對外常常被客戶抱怨、對內當專案或公司資源有限時,PM, Sales沒法壓縮(其實是已經壓縮過了,很多公司常常一個PM, 一個Sales跑遍全台灣),老闆只好先砍Developer人力,使得增加工作量與加班變成常態。Developer常常一個人兼顧維護案加上新軟體的開發,在這種情況下軟體品質只是老闆與客戶第一次見面時高談的口號和夢想,資源不足時最先槓掉的就是品質這個空泛(不會立刻賺到錢)的指標...這樣的環境得適應並持續支撐下去... 因此你看到Developer頂著自己的專業背景(和花了錢考來的證照),改行去開咖啡店賣咖啡或是做網拍也就不足為奇了。

        昨天有個寫手機App的朋友跟我說,他吃炸醬麵的時候覺得很感慨,一個手機App賣0.99美元,折合台幣約莫30元,他寫了數個月,還附了錢請美術人員,但是每次吃麵的時候,他都覺得應該改行賣炸醬麵...很多人吃一碗麵付錢的時候眼睛都不會眨一下,但付費買App的時候,不僅要先試用,而且要弄了半天沒法下載到破解版的時候,才願意付那區區的0.99美元。而炸醬麵大概配方就是這樣,如果好吃可以一直賣,但他的App就算好用好玩,如果沒有持續改版,大概一兩個月後就無人問津了...這邊都還沒有算進去軟體技術的改變和改版所帶來的額外成本...

        有些廠商跟我抱怨,現在賣軟體跟賣水果一樣,客戶總是愛挑挑價格,看看賣相好的,選好之後不忘要個折扣,順手再拿包梅子粉之類的。內需市場價格被壓得太低,卻依舊有廠商硬是可以把品質擱在一邊,硬生生吞下去低到不行的價格,而客戶也不太管一個軟體到底背後要花多少時間和人力進行優化,反正短期績效達成,三年的軟體專案結案時雙方PM早就換了好幾輪,是非對錯已經無從釐清。政府單位的發包也不管其實案子被大包廠商綁標之後,切割丟給小軟體公司時,這些小企業如何被壓榨,政府以為自己花了錢培植軟體產業,其實只是被上游那些大資本額的系統整合廠商給剝削了。

        說來無奈,這個情況跟果菜市場的大盤收購香蕉的狀況很像,最基層的蕉農慘兮兮,但政府大官員們則是渾然不知,只看到果菜市場的批發價格之後沾沾自喜,覺得自己努力地照顧農民了所以感到很欣慰...

        台灣怎麼會沒有軟體人才呢? 怎麼會沒有人喜歡寫程式呢? 為什麼資工系的學生寧願去網拍、寧願去當通告藝人呢? 是誰趕跑程式設計師的呢??? 我想不用多說了...很多持守在這個領域的朋友或前輩們,倚靠的純粹只有自己的興趣,沒別的,就只是興趣。但我相信,會持續待在這一行,絕對都是有夢想的~

        所以,當產業界在問,當政府或研究單位在問,台灣的軟體人才,軟體產業在哪裡,其實很簡單,不用作研究報告,不用去找104調查,你自己下來當一兩個月程式設計師就知道了。

後記:這篇文章得到很多朋友們的迴響和意見,路不好走是我們都知道的,但我們從來沒有想過要放棄,現在的情況,套一句說得很貼切的俗話『前途是光明的 ,但道路是崎嶇...』。然而有夢想,總是可以支撐下去;有方法,總是可以開創出一片天地...

ref1 : 韓國軟件競爭力孱弱的五大原因
ref2 : http://forum.gamer.com.tw/C.php?bsn=60076&snA=928472&locked=F&page=1&gothis=13407958#13407958

2011年10月10日 星期一

[VS2010]在Build時自動update專案版本

最近比較多開發WP7的Apps, 每一個App都不大,但是版本編號(Build Number)的建立卻很重要,因為我時常在submit同一支卻不同版本的Apps。而公司最近的雲端運算開發平台上的Apps也有這個問題,每一個App其實都是一個小功能,更新的頻率非常高,因此常常需要讓User再回報問題的時候,提供Build Number給我們,才比較容易區分是哪一個版本的App。

開發團隊的新成員問到,如何在每一個build自動update版本編號?
我記得有一個工具,叫做Build Version Increment Add-In Visual Studio, 可以從底下這個位置下載:http://autobuildversion.codeplex.com/releases/view/60932#DownloadId=208247

用起來很簡單方便,安裝後只需要在VS2010的主選單上按下Tools->Build Version Increment->Settings:

即可進入設定畫面:

主要是上述幾個項目,設定完成之後,每一次Build時的版本編號就可以自動依照規則遞增了。你也可以透過 Assembly.GetExecutingAssembly().FullName.Split(',')[1] 抓取到當前App的XAP版本, 提供給Developer參考...
更詳細的使用說明可以參考這裡:
http://autobuildversion.codeplex.com/documentation



分享

2011年9月28日 星期三

千里之行,始於足下...

今天早上,因為一時興起,到住家附近那個有湖的公園,一早步行上山,沿路蟲鳴鳥叫,難得清晨的乾淨空氣,精神很是清爽。

到了山頂,發現原來這座山也不是挺高,以前從公園湖邊往上看去,總是不知道山裡面是什麼,這次親自走一遭,終於算是體驗了一下這個步道。

沒想到住在這邊這麼多年,居然一直到今天,才有機會登山看看,從山上往下看的視野果然不同,沿途一邊思想最近手上的專案、公司的產品、以及未來在資訊技術上的改變與相關的因應之道,還有接下來準備整理學習的新技術...等,一邊步行、一邊思索;清晨登山,也算是頗有所得。

回頭想想,資訊技術的學習,似乎也是如此,有很多新(或其實不是很新)的技術,總是在我們身邊晃來晃去,有時候聽到朋友說(Ruddy老師最常幹這種事情,到處跟人說,最近有哪些新技術很有趣),但自己礙於時間,總是沒有辦法親自去試看看,從新穎的程式設計方法論、絢麗的展示層技術、或是某個哪個專案控管機制概念...等,我們常常都是聽的多,自己實際動手做卻來得少。

偶然一天,有機會下手,才發現其實並不如自己想像的那麼困難(相信我,很多書籍或課程把一門新技術描述的很難,絕大部分狀況都是作者和講師的問題,技術本身可能一點都不難),自己資質沒那麼差,只是過去並沒有真的把心思放在這裡,以至於似懂非懂。

很多路,得自己走過,才會有感覺。一旦你走進去,不管是一條路,還是一門技術,你才能夠去體驗、感受,進而才能評斷出優劣與利弊,在對前面的路感到迷惘的時候,很可能暫時放下思索,直接走出去,沿途所見常常能夠刺激你找到更寬廣的路。

對未來,或新的技術,想要挑戰看看嗎? 不妨,就從今天,從身邊的小山開始...

2011年9月27日 星期二

[推薦] Donma寫的...如何在WP7的Map Control當中,顯示中文化地圖...

最近大夥玩WP7 Mango玩的不亦樂乎,開始體驗Windows Phone在生活當中的強大功能與應用,但是在開發層面,目前最大的困擾就是內建的WP7 Map control,實在是好用到不行,包含支援所有的手勢和相關功能,但殘忍的是,居然不支援中文,扼殺了廣大台灣開發人員的創意,而我在研討會介紹的時候,也因為沒有中文顯示,顯得有些美中不足。

但是最近看到一篇Donma寫的文章,透過相當漂亮的作法,解決了這個問題,如果你對WP7或Silverlight應用程式地圖或導航開發有興趣,但苦於Map Control不支援中文,這篇文章可以說是救星了:
http://www.dotblogs.com.tw/junegoat/archive/2011/07/11/windows-phone7-bing-map-chinese-popo.aspx

我順手把測試的專案放在底下這個位置:[下載] 有興趣的朋友們可以參考。


後記:
回想和Donma的認識,應該是七年前了,當時他是大三的學生,而我則開始在資訊教育訓練和著作上有一些耕耘。那時候透過一個朋友的介紹,第一次看到Donma對於程式設計的狂熱興趣與強大的企圖心,我今天回想起來當時的情境,還是覺得這個形容詞算是貼切,一點都不誇大...

幾年後,他畢業了,過了一兩年,突然在很多微軟的研討會場合看到他,沒多久他也是微軟MVP的一員了,而現在他任職的公司則是微軟重要的合作夥伴,在公司中他也擔任重要且關鍵的開發任務...

我得說,這正是一個軟體開發人員精彩的成長歷程,從Donma身上我看到過去我曾寫過的文章『關於 如何快速增進程式功力』中所說,開發人員應該培養自己解決問題的能力的最佳例證。才幾年的時間,從學校的學生蛻變成專門解決他人問題的MVP,並且在軟體公司當中獨當一面,在如今景氣與趨勢變化迅速的年代,很多大學畢業生面對就業的困擾與憂心,希望政府提供幫助或是振興就業市場,但是別忘記,與其期待別人施予援手,其實自己才是開創未來前途最重要的關鍵因素。

Keep Walking~

2011年9月24日 星期六

困擾我的線...和藍芽斷線

線路,一直是很困擾我的問題。
桌上從USB、滑鼠、手機、充電器、螢幕...全都是線...你知道,這很煩的。
有的線不夠長,你還得弄延長線,有的線太長,你還得拿個橡皮筋什麼的把它捆起來,這也很煩。

所以如果可以,我盡量讓設備不要有線。
最近滑鼠左鍵被我按壞了(彈不起來),所以我只好再買一顆,這次我買了藍芽滑鼠,不用接接收器的那種(因為USB很寶貴,況且已經插滿了),買來,接好,可以用。

不過似乎移動沒有有線的滑鼠那麼順,沒關係,其實差異很微小,幾乎感覺不出來。
但發現一個嚴重的問題,就是擱著幾分鐘之後,XX,他不會動了>_<

try了幾次,發現是NB上的問題,每次我似乎都得重開藍芽,滑鼠才會醒過來,因此我找了一下,到底是哪邊的問題,最後....
電腦-->滑鼠右鍵-->管理-->裝置管理員-->Bluetooth無線電-->Generic Bluetooth Adapter-->滑鼠右鍵-->內容-->電源管理:


把那該死的『允許電腦關閉xxx以節省電源』取消掉,搞定。^_^

2011年9月23日 星期五

Windows Phone 7(WP7) - Mango(7.1) 中文 Apps 上架經驗

最近配合台灣成為全球第一個Mango Release的市場,開始將過去在微軟Marketplace上的一些Apps改成中文版,首先要提醒同學們注意的是,在現在的Mango版本App上架流程中,Assembly Infomation的Neutral Language不得保留空白(7.0時可以),你必須選擇你的Target Marketplace 的Language,因此我要上台灣市場,所以底下選的是:Chinese (Traditional, Taiwan)




請注意先前有學員測試,選擇Chinese (Traditional),怎麼上傳也傳不上去,App Hub始終跟你說Connect fail(詭異的訊息),改成 Chinese (Traditional, Taiwan) 就OK了,這個問題目前只有一位同學回報,如果未來有碰到類似狀況,請update讓我知道...

當你在Neutral Language 選擇了 Chinese (Traditional, Taiwan), 則你的App的 Description就可以先(只)寫中文,如果有勾選上架全球市場,則可考慮後面補上一段英文Description,例如:
-------------------------------------------------------------

這支App的功能是xxxx, 是一隻非常讚的App.....
改版歷程:
 v1.0 : xxx
 v2.0 : zzz

English Description:
This is a awesome App, for...
Version History:
v1.0 : xxx
v2.0: zzz
-------------------------------------------------------------
目前我差不多都是照上面這樣填寫Description...

總的來說,Mango機在台灣上市了,台灣的Marketplace也開放了,中文的App也可以上架了...萬事俱備,只剩你的加入了~ ^_^

2011年9月21日 星期三

[範例程式] Windows Phone 7.1 Mango 自訂動態磚範例

底下的這個範例是TechDays 2011研討會時,我Demo的WP7.1當中,自訂動態磚的操作,可以配合先前的教學影片一同觀賞。
[範例] 下載

[教學影片]
109 Tiles動態磚的使用介紹
這支影片當中介紹的是WP7當中相當重要的動態磚機制,我們介紹了7.0中的Application Tile以及7.1 Mango版本當中的Secondary Tiles。在WP7.1 Mango的版本當中,開發人員可以自由的透過程式碼建立Secondary Tiles,可以新增、修改或刪除,也可以自由地指定Tiles上的圖示、文字標題與數字等資訊。用戶從Start畫面點選Tiles也可以直接連入App,並且帶入參數,是一個相當好用的機制。

[範例執行展示]

2011年9月16日 星期五

Windows 8 Metro Style Apps開發...

Keynote新聞介紹  <---Windows 8 的中文介紹

要如何開發Windows 8 Metro Style 的 Apps呢...想嘗鮮的朋友可以看這裡...
(好像好像Silverlight啊~)

忙完Techdays 2011之後...

今年TechDays和過去一樣,會場依舊好多人,走道間依舊是嘶聲吶喊、拼命想刷你卡片的廠商,穿梭在人群中的,當然還是不乏讓人眼睛一亮的展場ShowGirls...

今年兩堂Windows Phone 7的課蠻開心的,可以看到平常在FB社團裡面才看得到的朋友們,這樣的大會也讓平時忙碌的講師們有難得的機會這樣聚在一起,說真的,參加了幾年下來,雖然每年都在備課時搞得天昏地暗,但講完之後的輕鬆和愉悅,以及和學員講師們互動的心情,也是少有其他經驗能比擬的。

和will保哥聊起,彼此好幾年前在台下當聽眾時的心情,Ruddy前輩則一直說...好多好年輕的講師啊, 一大堆講師他都快不認識了...其實從某個角度看,或許這也是一種傳承,講師中有在台上始終屹立不搖的大師,也有今年第一年登場的猛將,就是這樣的組合,才讓整個大會有著不同的激盪。

每次從台上往下看,學員中總是有每年都參加我的場次的朋友(特別是來自台中的幾位),每年這時候的聚集,似乎已經是一種不需言語的默契,有這樣的學員在總是能讓講師在忙亂中立刻像吃了定心丸一般的穩定。當然學員中也有第一次見面的新朋友,甚至遠從澎湖來的學員(很感謝您的熱情參與和配合^_^),一個年度盛會的成功,其實學員的投入才是最重要的關鍵。也很感謝學員很認真地讀完了PDF書稿,給我不少的Feedback。

在TechDays的前幾天,剛好跟網友們在FB中聊到,其實這個訊息爆炸的時代,到處都是學習的資源和管道,我們也錄製了非常多的教學影片,撰寫了不少的文稿或blog中的文章,其實學員即便在地球的另一端,也能夠迅速地掌握最新的技術。

因此,願意放下手邊的工作,參與三天的課程,顯然已經不只是對技術的熱情,更多是對未來的期待以及投入社群和大家一起互動的渴望,所以我很希望在課程的分享當中,更多一些和學員之間的互動,我也很建議學員,可以多認識身邊的其他技術夥伴,畢竟這是一個相當難得的場合,讓全台所有IT/開發人員能夠共聚一堂,不僅僅是垂直的技術學習,橫向的技術分享將是更無價的。

希望在今年的大會中,每一場次的課程都讓您有所收穫,我會在blog和fb.studyhost.com陸續把相關的內容持續post上來,希望對大家有幫助,期待下一次再見面。

2011年9月13日 星期二

Techdays Taiwan 2011

感謝大夥兒熱情參與今天的TechDays Taiwan 2011研討會,
說好的相關資源請參考底下連結:

[Slides]TechDays Taiwan 2011 WP7 Mango關鍵報告
[Slides]Microsoft WP7應用程式開發-AppHub帳號申請與送件
[電子書]WP7.1 Mango程式設計關鍵報告(CH1,2-試讀版)

[Resources]
.NET Walker專頁
WP7 Asia Developers Group

[Training Videos]
101 從基礎開始
從最基本的WP7應用程式設計開始,撰寫你的第一支WP7 App,內容包含如何透過Visual Studio 2010建立Windows Phone 7 App專案,建置與佈署到模擬器運行,WP7中基本的動畫設計概念,以及事件驅動程式設計...etc。

102 ApplicationBar選單與顯示模式
了解WP7當中的頁面架構,XAML的基本概念,控制項佈置位置,App顯示模式的改變,以及WP7當中相當重要的ApplicationBars介紹暨選單(MenuItem)與按鈕(IconButton)的設計。

103 場景切換、面參數傳遞、與Back鈕
如何設計多個畫面,並且在多個頁面當中進行切換呢? 多頁面時該如何傳遞或共用參數? 如何在切換頁面時加上自訂的特效動畫? 以及如何攔截Back鈕顯示提示訊息?

104 Launcher的使用
這支影片當中介紹的是Launcher與 Choosers的概念,以及如何透過叫用Launcher API在我們自己撰寫的App當中啟動手機內建的應用程式來達成特定的功能,例如傳送簡訊或撥打電話。比較特別的是,在Mango的版本當中,加入了ShareLinkTask,讓你的App可以輕易地送出訊息到FaceBook塗鴉牆或MSN的狀態上喔...

105 Choosers的使用
在這支影片當中,我們繼續討論了Chooser的使用,介紹系統中的Chooser種類,以及示範如何透過Save Ringtone Task將特定的音效檔案儲存到手機當作鈴聲,和如何透過PhoneNumberChooserTask的使用來取得手機通訊錄中特定人員的電話號碼...

106 WP7設定(Setting)頁面的設計
這支影片當中介紹的是WP7設定(Setting)頁面的設計,其中使用到了IsolatedStorageSettings技術,來保留使用者的設定狀態, 同時間介紹了 UserIdleDetectionMode 的功能,如何透過UserIdleDetectionMode 設定來防止應用程式在執行過程中被Screen Lock干擾(例如防止閱讀電子書時,突然出現的螢幕Lock),以及設定頁面的設計原則和技巧。

107 WP7 IsolatedStorageFile的使用技巧
這支影片當中介紹的是WP7當中的IsolatedStorageFile機制,同時也介紹如何利用WebClient下載特定的檔案,儲存到IsolatedStorage當中,以供後續的使用。除了IsolatedStorageFile機制的操作與使用方式之外,其中如何將圖檔儲存到IsolatedStorage當中,以及從IsolatedStorage當中把圖檔取回顯示到App中,也是相當重要的一部分。

108 Push Notification概念與Toast Notification使用介紹
這支影片當中介紹的是WP7當中相當重要的 Push Notification機制,我們扼要地說明了 Push Notification的概念、有哪些種類、以及如何使用、建立 Push Notification時需要注意哪些事項、以及Mango版本當中Push Notification機制的增強...。我們展示了Toast Notification的建立與發送方法,並且如何透過Mango當中針對Toast Notification新增的參數,喚起App並連結到特定手機頁面。

109 Tiles動態磚的使用介紹
這支影片當中介紹的是WP7當中相當重要的動態磚機制,我們介紹了7.0中的Application Tile以及7.1 Mango版本當中的Secondary Tiles。在WP7.1 Mango的版本當中,開發人員可以自由的透過程式碼建立Secondary Tiles,可以新增、修改或刪除,也可以自由地指定Tiles上的圖示、文字標題與數字等資訊。用戶從Start畫面點選Tiles也可以直接連入App,並且帶入參數,是一個相當好用的機制。

110 Tiles動態磚 vs PushTileNotification
這支影片接著繼續介紹WP7當中相當重要的PushTileNotification機制,我們先前介紹了7.0中的Application Tile以及7.1 Mango版本當中的Secondary Tiles。您會發現Tiles動態磚技術是WP7當中相當特殊好用的設計,而Tile最吸引人的其中一個原因,就是App的開發單位,可以透過PushTileNotification技術,主動把訊息推送到動態磚上,即便用戶端的App沒有正在執行,我們也可以藉由PushTileNotification把文字、數字與背景圖示等訊息,即時的推送到用戶端,直接呈現在手機的動態磚上,用戶不僅能收到即時的訊息,也不需要花費任何簡訊費用,是非常務實好用的功能。

111 WebServices基本呼叫
在這支影片當中,我們主要介紹了如何從WP7當中透過Web Services抓取位於Internet遠端的資料,這個技術讓WP7這也不只是一座孤島,能夠動態的透過存取遠端資料來掌握即時的訊息。在商業應用程式上也相當好用,我們可以透過這樣的方式來存取企業內部的資訊或後端資料庫中的內容。當然,這樣的存取需要撰寫Web Services(或WCF Services)因此我們在這支影片當中,完整的介紹了如何透過ASP.NET開發技術撰寫WP7(Silverlight)需要的Web Services,以及如何透過LinqToSql抓取到後端資料庫中的Record,直接傳遞給WP7來使用。

112 WebServices遠端資料存取 與 資料繫結(DataBinding)
前面我們介紹過了如何在WP7當中,透過Web Services抓取遠端的資料,而在這個影片當中,我們更進一步的,要來介紹如何把抓取到的資料直接以WP7(Silverlight開發技術)當中,傲視群雄的DataBinding機制,填入控制項當中,呈現出相當優質的畫面效果。這是WP7(Silverlight開發技術)中非常厲害的招式,請密切注意,立即收看 :) 。http://www.facebook.com/#!/pages/David%E7%9A%84NET-Walker%E5%B0%88%E9%A0%81/115848851788030

2011年9月12日 星期一

[教學影片] Windows Phone 7 - 程式設計關鍵報告(112 WebServices遠端資料存取與資料繫結)

今天Windows Phone 7程式設計教育訓練短片當中介紹的是,WP7(Silverlight開發技術)當中,傲視群雄的DataBinding機制 與 Web Services的整合...很精彩

112 WebServices遠端資料存取 與 資料繫結(DataBinding)
前面我們介紹過了如何在WP7當中,透過Web Services抓取遠端的資料,而在這個影片當中,我們更進一步的,要來介紹如何把抓取到的資料直接以WP7(Silverlight開發技術)當中,傲視群雄的DataBinding機制,填入控制項當中,呈現出相當優質的畫面效果。這是WP7(Silverlight開發技術)中非常厲害的招式,請密切注意,立即收看 :) 。

2011年9月9日 星期五

[教學影片] Windows Phone 7 - 程式設計關鍵報告(111 WebServices基本呼叫)

我們在今天的Windows Phone 7程式設計教育訓練短片當中介紹的是,如何從WP7存取遠端的資料,以及遠端資料庫中的內容。(今天這個主題超級重要喔~)

111 WebServices基本呼叫
在這支影片當中,我們主要介紹了如何從WP7當中透過Web Services抓取位於Internet遠端的資料,這個技術讓WP7這也不只是一座孤島,能夠動態的透過存取遠端資料來掌握即時的訊息。在商業應用程式上也相當好用,我們可以透過這樣的方式來存取企業內部的資訊或後端資料庫中的內容。

當然,這樣的存取需要撰寫Web Services(或WCF Services)因此我們在這支影片當中,完整的介紹了如何透過ASP.NET開發技術撰寫WP7(Silverlight)需要的Web Services,以及如何透過LinqToSql抓取到後端資料庫中的Record,直接傳遞給WP7來使用。

2011年9月8日 星期四

Windows Phone 7 - Mango 剪貼簿(Clipboard)

在Mango的版本當中,開發人員開始可以自由地控制手機中的文字複製貼上功能,程式碼的撰寫如同過去我們在WindowsForm當中的做法一樣,相當的簡單:
//設定剪貼簿中的文字
System.Windows.Clipboard.SetText("簡單貼...");
//取得剪貼簿中的文字
string buf = System.Windows.Clipboard.GetText(); <--目前不開放
就這樣,相當簡單但很好用。
範例下載

2011年9月7日 星期三

Data.Taipei台北市政府公開資料平台

台北市政府最近跟微軟合作,採用了微軟的Windows Azure雲端運算平台,打造了 『Data.Taipei台北市政府公開資料平台』,同時為了推廣應用在手機App上,配合工業局舉辦的App Star高手爭霸戰,加碼獎金30萬

不過我看了一下,目前對這個平台的技術架構沒太大疑問,但主要的問題是其中提供的內容稍嫌空泛了些,大家期待的公車即時位置尚未在這個平台上提供,而是需要另外向臺北市政府交通局申請,但是我對目前平台上提供的資訊(諸如台北市公廁位置或是警察局的位置)也沒太大興趣,況且這些資料也並非即時資訊,下載個Excel檔案就可以寫App了,大費周章的連上雲端平台似乎意義不大。

當然,我也知道不太可能要求台北市政府提供路口攝影機的即時影像資訊(雖然對我來說最希望看到的乃是這個,這樣宅男駭客就可以實現在家裡監控每個街口的電影情節),所以截至目前為止,我們只能先看看即時公廁位置(還每日更新呢)過過乾癮...

不過,就資料連結技術來說,台北市政府算是已經相當給力了,資料連結的介面提供了豐富的Atom或Json形式,採用OGDI以OData的形式提供資料(很趕得上潮流,拍拍手),甚至C#範例都有了(還很先進的用了Linq查詢咧...),一切都很不錯,就是Content差了些...>_<

不過話又說回來,台北是繼紐約、倫敦之後,成功導入該服務的市政單位,也算是很趕時髦了,希望台北市政府繼續努力,讓我能夠有機會在短時間內可以update這篇po文。

[教學影片] Windows Phone 7 - 程式設計關鍵報告(110 Tiles動態磚與PushTileNotification)

今天Windows Phone 7程式設計教育訓練短片當中介紹的是,許多開發人員有興趣的PushTileNotification機制。(今天這個主題很重要喔~)

110 Tiles動態磚 vs PushTileNotification
這支影片接著繼續介紹WP7當中相當重要的PushTileNotification機制,我們先前介紹了7.0中的Application Tile以及7.1 Mango版本當中的Secondary Tiles。您會發現Tiles動態磚技術是WP7當中相當特殊好用的設計,而Tile最吸引人的其中一個原因,就是App的開發單位,可以透過PushTileNotification技術,主動把訊息推送到動態磚上,即便用戶端的App沒有正在執行,我們也可以藉由PushTileNotification把文字、數字與背景圖示等訊息,即時的推送到用戶端,直接呈現在手機的動態磚上,用戶不僅能收到即時的訊息,也不需要花費任何簡訊費用,是非常務實好用的功能。

2011年9月5日 星期一

[教學影片] Windows Phone 7 - 程式設計關鍵報告(109 Tiles動態磚)

今天繼續推出一隻介紹Windows Phone 7程式設計教育訓練短片。(今天這個主題也很重要喔)


109 Tiles動態磚的使用介紹
這支影片當中介紹的是WP7當中相當重要的動態磚機制,我們介紹了7.0中的Application Tile以及7.1 Mango版本當中的Secondary Tiles。在WP7.1 Mango的版本當中,開發人員可以自由的透過程式碼建立Secondary Tiles,可以新增、修改或刪除,也可以自由地指定Tiles上的圖示、文字標題與數字等資訊。用戶從Start畫面點選Tiles也可以直接連入App,並且帶入參數,是一個相當好用的機制。

2011年9月2日 星期五

[教學影片] Windows Phone 7 - 程式設計關鍵報告(108 Push Notification)

今天繼續推出一隻介紹Windows Phone 7程式設計教育訓練短片。(雖然今天只有一支,但是今天這個主題很重要)


108 Push Notification概念與Toast Notification使用介紹
這支影片當中介紹的是WP7當中相當重要的 Push Notification機制,我們扼要地說明了 Push Notification的概念、有哪些種類、以及如何使用、建立 Push Notification時需要注意哪些事項、以及Mango版本當中Push Notification機制的增強...。我們展示了Toast Notification的建立與發送方法,並且如何透過Mango當中針對Toast Notification新增的參數,喚起App並連結到特定手機頁面。

2011年8月31日 星期三

[教學影片] Windows Phone 7 - 程式設計關鍵報告(106-107)

繼續推出兩隻介紹Windows Phone 7程式設計教育訓練短片。

106 WP7設定(Setting)頁面的設計
這支影片當中介紹的是WP7設定(Setting)頁面的設計,其中使用到了IsolatedStorageSettings技術,來保留使用者的設定狀態, 同時間介紹了 UserIdleDetectionMode 的功能,如何透過UserIdleDetectionMode 設定來防止應用程式在執行過程中被Screen Lock干擾(例如防止閱讀電子書時,突然出現的螢幕Lock),以及設定頁面的設計原則和技巧。

107 WP7 IsolatedStorageFile的使用技巧
這支影片當中介紹的是WP7當中的IsolatedStorageFile機制,同時也介紹如何利用WebClient下載特定的檔案,儲存到IsolatedStorage當中,以供後續的使用。除了IsolatedStorageFile機制的操作與使用方式之外,其中如何將圖檔儲存到IsolatedStorage當中,以及從IsolatedStorage當中把圖檔取回顯示到App中,也是相當重要的一部分。

2011年8月30日 星期二

風雨無阻

日前颱風天那天,聽到朋友中有位講師不辭辛勞,不畏風雨的依舊在預定的時間遠赴台灣的另一端,只為了說好的幫同學們上課,聽到了之後相當感動,所以我哼著熟悉的歌曲,寫了底下這首歌...描述許多講師、作者們共同的心情...

請配上 周華健‧風雨無阻...

給你我的全部 .NET是我今生唯一的賭注
只留下這段代碼 讓我無怨無悔 全心的付出

怕你疲倦 怕你哭 怕你迷惘 怕你糊塗
編程千山萬里路 我可以朝朝暮暮

給你一本我的書 它是我一生不停的腳步
讓我寫滿數十萬字 堆滿整座倉庫 你慢慢閱讀

Silverlight是漫長的旅途 一會快樂 一會痛苦
千瘡百孔編程路 我可以縫縫補補
⋯⋯
提著昨日種種千辛萬苦 向明天換一些 夢想和錢途
範例夠不夠多 講解夠不夠好 可以要求 不要不在乎

不願讓你看見我的辛苦 是曾經無悔的風雨無阻
贈品夠不夠多 點心夠不夠好 可以追求 不認輸

配樂 請用 http://www.youtube.com/watch?v=D9b4Pnpbx4Q
http://www.youtube.com/watch?v=LwM8AIYC5S8

2011年8月29日 星期一

[教學影片] Windows Phone 7 - 程式設計關鍵報告(104-105)

繼續放兩隻Windows Phone 7程式設計教育訓練短片。

104 Launcher的使用
這支影片當中介紹的是Launcher與 Choosers的概念,以及如何透過叫用Launcher API在我們自己撰寫的App當中啟動手機內建的應用程式來達成特定的功能,例如傳送簡訊或撥打電話。比較特別的是,在Mango的版本當中,加入了ShareLinkTask,讓你的App可以輕易地送出訊息到FaceBook塗鴉牆或MSN的狀態上喔...

105 Choosers的使用
在這支影片當中,我們繼續討論了Chooser的使用,介紹系統中的Chooser種類,以及示範如何透過Save Ringtone Task將特定的音效檔案儲存到手機當作鈴聲,和如何透過PhoneNumberChooserTask的使用來取得手機通訊錄中特定人員的電話號碼...

2011年8月26日 星期五

[教學影片] Windows Phone 7 - 程式設計關鍵報告(101-103)

三隻適合Windows Phone 7程式設計初學者由淺入深的教育訓練短片。

101 從基礎開始
從最基本的WP7應用程式設計開始,撰寫你的第一支WP7 App,內容包含如何透過Visual Studio 2010建立Windows Phone 7 App專案,建置與佈署到模擬器運行,WP7中基本的動畫設計概念,以及事件驅動程式設計...etc。

102 ApplicationBar選單與顯示模式
了解WP7當中的頁面架構,XAML的基本概念,控制項佈置位置,App顯示模式的改變,以及WP7當中相當重要的ApplicationBars介紹暨選單(MenuItem)與按鈕(IconButton)的設計。

103 場景切換、面參數傳遞、與Back鈕
如何設計多個畫面,並且在多個頁面當中進行切換呢? 多頁面時該如何傳遞或共用參數? 如何在切換頁面時加上自訂的特效動畫? 以及如何攔截Back鈕顯示提示訊息?

2011年8月25日 星期四

在努力背後...

(後記:一個多月後, 10/6這天賈伯斯過世了...這篇文章中第一行的辭職,得改成辭世了。全球幾乎都一同哀悼賈伯斯的離開,並且深表不捨,Apple和Google的首頁也特別掛上或連結了賈伯斯的肖像以表追悼,肯定他一生的成就)

聽到Steven Jobs辭職的消息,讓我有些感觸。

在他經歷了那麼多的事情之後,阻止他繼續向前邁進的,不是外界競爭對手的攻擊、不是潮流趨勢的更替、不是資源或能力上的限制,而是他自己的身體!

坦白說,一個在世代中如此具有影響力與領導特質的人,要能夠甘心停下腳步,其實相當不容易。我相信,在我們心裡,總是有一些夢想,對自己或未來的期待,隨時推動著我們往前邁進。年輕的時候,我參加TechED,坐在台下前幾排,認真地看著台上講師賣力的演出,我曾經想像過,如果有一天換我在台上,那會是怎樣的場景? 如今回想起來,感覺很遙遠,但記憶卻相當鮮明。

在我中學的時代,那時候的資訊雜誌只有第三波,印象中我常常投稿,把磁片寄到雜誌社,參加雜誌上的程式設計比賽,想像著有朝一日,我是期刊專欄作者的心情。如果不是現在在寫這篇文章,我根本早已忘記曾經做過這些事情。現在想起來,我對這段回憶的感覺居然是一陣溫馨。

好多年之後,小時候的夢想慢慢實現,但是我也逐漸發現,人生中最難的事情,不是拼命努力,不是隨波逐流,是如何在天平的兩頭當中拿捏出最適合自己的距離。

回頭看賈伯斯,我不知道,他是否也覺得自己的一生意義非凡,我更加不確定,如果讓我選擇,他這樣的人生對我來說是否有吸引力。

在這世界上許多努力奮鬥的國家當中,台灣人的工作時數和其他地區比起來算是很有得拚,我從退伍開始工作之後,就我印象所及,工作幾乎沒有間斷,35歲之前,一個工作接著一個,即便在新舊工作交替之際,也幾乎是立即銜接,沒有一刻喘息。

在我的身邊,約莫和我同一期的朋友同學們,大多都是這樣拼命,冬天的時候天沒亮就出門,踏進園區的辦公大樓之後,像是跌入陷阱,沒到星月高掛不會看到回家的身影。直到結婚,小孩出生,才開始慢慢把時間留給家人,逐漸找回一些時間給自己。

35歲像是一個分水嶺,35歲之前,最大的休閒,是喝著濃郁的咖啡寫程式,夜深了伴隨著廣播繼續努力;35歲之後,熬夜是留給年輕人的權利,節制是新發現的功課,還需要努力操練和學習。

如果看這篇文章的你,還沒結婚,不到30,或許你還可以多加把勁,在你前面的前輩,當年付出的努力,和你比起來可能有過之而無不及;如果你和我一樣,慢慢的有了年紀,發現身體似乎也得好好顧惜,而且還得留一些生命給自己,不妨開始再多花點時間和家人朋友聚聚,新的技術如此生生不息,資訊界沒有我們還是會繼續...

在努力背後,我盡可能凡事盡心盡力,最終的結果交給上帝。畢竟,人生價值的定義,肯定不止工作成就而已...



10/6 追悼賈伯斯

2011年8月24日 星期三

持續地改變是必然的趨勢...

大多是不想寫程式,不願意寫規格書,沒精神寫企劃案的時候,我才會寫文章。

不過最近,在FB上看到一篇文章,主要是提到Silverlight技術的目前狀況,以及與未來HTML5之間的一些問題,還有未來開發技術云云。最近半年看到很多這樣的文字或報導,也有不少學員詢問,所以有感而發。

說真的,大夥,別再問這個問題了,原因很簡單,就是展示層技術的改變根本就是必然的趨勢。(相信我,這還不是軟體開發趨勢裡面最讓人感到痛苦、悲憤、無奈、沮喪的一塊...那David言下之意,還有其他讓人更嘔的地方嗎? 當然有,還多著呢,以後有空再說)

前陣子上課,和學員聊到分散式應用程式開發,說到一個結論:『在商業應用程式開發當中,越沒有UI的程式越值錢!』

學員臉上泛起疑惑和不太相信的目光,我隨即解釋,你看過SQL Server吧,看過Skype,看過MSN,難寫的是MSN Server, 還是MSN UI? 有技術難度的是Skype Server, 還是Skype Client, 真正賣錢的是SQL Server的Services,還是SQL Server的Management Studio?

這就是啦,你寫的不是Game,那就讓我告訴你,在商業應用程式的世界裡面,UI是不值錢的,UI可以是賣點,但常常不是成交的關鍵,UI可以是客戶嫌棄你的理由,但UI不是會讓客戶付你多一點錢的原因。

過去這20年, UI層開發技術是一變再變的,從DOS的文字畫面,到Windows的GUI,到後來的Web UI,乃至於現在的WPF/Silverlight/Multi-Touch,這一路上的改變沒在少的,而且趨勢是改變的速度越來愈快,改變的幅度越來越大。

也因此,每當我聽到學員感嘆某些展示層的開發技術改變太快,我就很擔心,大夥把焦點放錯位置了,UI從來不是一套軟體(或專案)成功的關鍵,UI只是你跟客戶表演時候吸引人目光的火花,有時候不同的客戶你還得放不同種類的煙火(平板? 行動? PC? Web? Windows? RIA?),才會得到你想要的效果。

過去這十多年的展示層開發技術,有哪一些可以沿用或重用的? 其實少之又少,先不管是否component可以reuse, 連source code要拿來reuse都很困難。所以,最理想的展示層技術是什麼? 是不要寫。或是我講一講就出來(例如,我說,要有選單,選單就出現;給我來個master-details維護畫面,畫面就誕生),當然這種技術目前還沒出來(但星艦迷航記裡面有,所以我相信不久以後一定會有)。

展示層技術是你的操作介面,操作介面不負責核心的運算,大部分分散式應用程式的核心運算都在伺服器端,這也是真正賣客戶比較值錢的地方,至於過去選擇Windows/Web,現在使用Silverlgiht,以後要變成什麼技術,相信我,都無所謂的,因為未來3-5年一定會變...

1995年之前,我們用文字畫面做出來一堆App
1995年到2002年,我們用Windows模式做出來一堆App
2002年到2007年,我們開始走Web模式
2007年到現在,我們上了 RIA(Rich Internet Applicatiion)
現在到未來,我們還要掙扎在多種不同的展示層開發技術與應用平台之間...

但是, 請記得,上面這些都不是一套真正有價值的軟體賣錢的關鍵,因此,也別太執著了。如果可以,多花點時間在值錢的地方,至於UI,當然也很重要,但當你時間有限時,取捨就是一門藝術了。
(BTW, 請注意,UI跟使用者體驗有關,但不絕對有關~)

2011年7月23日 星期六

跑了很多年的PC, 也有停下休息的時候...

最近,一本伴隨著許多技術人員從小看到大的資訊期刊決定併刊了,未來技術相關的主要內容將會調整為在線上以電子方式呈現。雖然這個改變不是很令人意外,但多少也讓我覺得有些感慨。

知道這個消息,是在我上個月旅遊的途中。本來打算回來寫篇文紀念一番,但是礙於許多原因,最後沒有提筆,現在寫在這裡,多少也是因為木已成舟,所以留個紀錄而已。

在旅途當中,我不只收到這個消息,另一件事情也讓我頗為感慨的,是一位出版界奮鬥已久、過去的合作夥伴,也在最近準備轉換戰場,我想多多少少,也都跟目前資訊出版市場的狀況有關。

這幾年的出版當然跟過去不可同日而語,就像這幾天看FaceBook中朋友們的留言,提到:『跑電腦現在需要換個場地跑,大家也知道現在​電腦不夯了,可能要跑平板之類的...』資訊技術是應用科學,內容隨著時間更迭並不新鮮稀奇,最近幾年的媒體和出版生態丕變,連報社都能一夕之間改弦易轍,或有換老闆經營者,更何況我們這個更加小眾市場的媒體呢?

過去一本資訊圖書的出版,可以帶領許多讀者踏入這個充滿願景的工作領域;或是幫助技術人員建構養成觀念;或是激發開發人員的創意。隨著這幾年網路的盛行、大陸同胞們在資訊技術上的崛起、資訊產品的生命週期縮短、全球化市場競爭的衝擊、技術從業人員的獲利能力也跟著降低。

一層層連鎖反應的影響,出版市場雖是衝擊的末端,但改變卻也來的快速而堅定。

當然,伴隨著資訊環境與電子產品的進步,開發技術的傳遞方式理所當然地也應該走向現今各樣的主流趨勢,以最短的時間將重點透過各樣的手持行動裝置與平台推送給大家,結合社群傳播的力量,以另一種面貌出現在讀者的面前。這個,似乎才是出版從業人員在感嘆之餘得要繼續深思而努力的方向...

2011年7月20日 星期三

WP7同步時Zune發生錯誤 - c00d11e4 (800c000e)

用了WP7很長一段時間,隨著手機連續幾次的更新,整個WP7的表現越來越貼近甚至超越我的期待,也因此使用的時間越來越高。

WP7的手機在拍照或錄影之後,都可以隨時自動update到SkyDrive,這是一個相當方便的設計,對於慣於使用網路的用戶來說,相當的便利。

不過,總是有一些時候,我們希望把照片資料同步到PC上,這時候PC的Zune軟體就發揮了功能。但不知道從何時開始,我的 WP7接上Zune的時候,一直有一些問題無法同步,收到底下的錯誤訊息...

c00d11e4 (800c000e)

一直不以為意,反正可以從網路上(SkyDrive)再抓下來,但今天心血來潮試著解決這個問題,後來上網搜尋,發現原因似乎是安裝了Ulead的軟體之後,會把底下機碼:
HKEY_CLASSES_ROOT\.jpg
的default直改為 PV85.Image
導致無法Sync同步,重新改回jpegfile之後,我的Zune和WP7終於又可以順利地同步照片囉。




jpegfile

2011年7月11日 星期一

在Windows Phone 7當中撰寫導航程式WP7 SDK 7.1 (Mango)

這次微軟算是卯上了全力。

最近在測試Mango新的SDK,說真的,有了中文輸入的手機,整個使用起來果真是脫胎換骨,感覺完全不同。再加上7.1增加的API, 讓整台手機如虎添翼。

例如,在API當中增加了BingMapsDirectionsTask,讓開發人員可以不費吹灰之力寫出導航的功能,底下這段影片展示了實際操作的過程,你會發現,導航功能很清楚的引導了使用者每一個轉折點的動向,除了對台灣人來說目前地圖是英文的有點遺憾之外,整個導航功能實在是相當完整了:


而這樣的導航程式要如何寫呢? 就底下這樣:
//建立BingMapsDirectionsTask 
Microsoft.Phone.Tasks.BingMapsDirectionsTask dt = new Microsoft.Phone.Tasks.BingMapsDirectionsTask();
//設定起點(使用當前手機所在位置CurrentCO當作起始座標)
dt.Start = new Microsoft.Phone.Tasks.LabeledMapLocation( "Start", CurrentCO);
//取得使用者在ListBox中選擇的終點座標
aRock.Google.Location.GeoResult po = this.listBox1.SelectedItem as aRock.Google.Location.GeoResult;
//設定終點
dt.End = new Microsoft.Phone.Tasks.LabeledMapLocation("Target", new GeoCoordinate(double.Parse(po.lat), double.Parse(po.lng)));
//顯示導航畫面...
dt.Show();

開發人員只需要使用 BingMapsDirectionsTask , 傳入開始和結束的兩個座標點, 調用show()方法,一切搞定,任何人都可以寫出導航功能的手機電子地圖程式了。

而且,這只是WP7.1(Mango)當中的一個小功能,還有其他近千個新的API, 看了這些之後,是不是一掃過去您對Windows Phoen銷量的擔憂? 再加上中文輸入功能,接下來恐怕手機要奇貨可居了。
BTW, 地圖是英文的? Nokia都要把OVI Map貢獻出來了,你還擔心沒有在地的圖資嗎?


分享

2011年7月2日 星期六

Windows Phone 7.1 SDK beta 2

本來最近實在很忙,沒啥時間測試新東西,況且 Windows Phone 7.1 SDK beta 根本才出來沒多久,beta2會有那些新功能? 不過今天剛好整理機器,想說順手安裝一下,不測還好,測了之後發現不寫一篇Blog紀念一下不行...

首先...Beta2的SDK中,模擬器整個變快了,比起beta時候的速度要快了不少,如果你在MS Developer Day 2011 中,曾經聽過我介紹 WP 7.1 SDK 的模擬器,當時的模擬器坦白說稍微慢了一點, 可能beta2當中做了一些優化,主觀上感覺快很多...

不過...更重要的來了...beta2模擬器中居然開始支援中文手寫輸入, 這讓您有機會一窺Mango中的中文手寫輸入風采...影片在底下...喜歡就按個讚吧~


WP7.1 SDK Beta2 下載位置


分享

2011年6月22日 星期三

如何安裝與使用Code Snippet

在昨天的研討會中,Live Demo的部分,為了節省Key程式碼的時間,我把常用的WP7.1 API部分的功能整理成了Code Snippet(程式碼片段),這是Visual Studio中非常貼心的設計,讓開發人員的創作速度大增,且相對提高了Coding的正確性。

研討會中Demo的WP7.1的CodeSnippet整理如下:[下載]

使用方法教學影片:

2011年6月21日 星期二

微軟 Microsoft Developer Day 2011 ...


很感謝大家今天熱情參與微軟 Microsoft Developer Day 2011 ...
今天提到的Mango SDK可從此處下載。

今天的投影片可從此處下載。
相關的範例展示影片可參考此頁面

2011年6月13日 星期一

Visual Studio 中,VB開發人員熟悉的Shift-F2與Ctrl-Shift-F2

如果你和我一樣,過去是寫了很多年的VB開發人員(雖然現在多半寫C#, 但我還是很熱愛VB),你應該很熟悉兩個hot key, Shift-F2(跳入特定的Method), 以及Ctrl-Shift-F2(返回原位置),這兩個Hot key對於程式開發的效率有著莫大的幫助。

到了C#開發環境,這兩個Hot-Key不見了,找了一陣子,終於發現這兩個HotKey分別是 Edit.GoToDefinition:
與View.NavigateBackward,
透過VS2010的Option->Environment->Keyboard就可以設定了。

2011年6月11日 星期六

Silverlight 4 ListBox Gesture 手勢捲動功能

由於最近我們公司,配合下半年度平板電腦的火熱上市,整個將透過Silverlight開發的產品或功能都一律加上Gesture的支援。這讓Silverlight所開發出來的App,跑在目前坊間的Win7平板上所呈現出的效果比起iPad或Android上的App一點都不遜色且有過之而無不及。

然而Silverlight 4不像WP7那麼好命,每一個ListBox或具有卷軸的控制項(例如ScrollViewer)都內建支援Gesture的功能,因此即便跑在平板電腦上,ListBox都需要用卷軸拖曳的方式來捲動,但明明Silverlight就支援Gesture,不能用手勢捲動ListItem似乎有些遜色。

因此我在網路上找到了這組好用的Behavoir...
http://lighttouch.codeplex.com/

下載之後,在你的專案中引用底下幾個.dll即可。
Wintellect.Touch.dll
System.Windows.Interactivity.dll
System.Windows.Input.Manipulations.dll

如果你想要將ListBox加上Gesture功能,只需要把ListBoxTouchScrollBehavior拖曳到ListBox上:

接著,幫ListBox設計一個ItemPanel,例如(關鍵在GestureListener),完成後大致如下:
最後,幫ListBox的設計一個包含GestureListener Behavior的ItemTemplate即可:


你可以從底下這邊看到預覽的效果:
blog.studyhost.com/BlogData/20110611/SilverlightApplication9TestPage.html
 
你會發現,如果你有支援Multi-Touch的顯示器或是Win7平板電腦,整個手勢拖曳的動作非常順暢,即便你沒有多點觸控設備,這個.dll也支援用滑鼠模擬Gesture,算是挺不錯的設計。

完整的範例程式碼可參考這裡


分享

2011年6月9日 星期四

Windows Phone 7 - Mango (sdk 7.1 beta) First Look - secondary Tile 自訂動態方塊磚

新的Mango,有許多好用的新功能,當然,承襲著Windows Phone 7獨樹一格的UI設計,動態磚早已深受好評,而Mango SDK中動態磚的控制功能當然就是開發人員期待已久的。

過去動態磚之所以這麼命名,就是因為他能動,但過去要能動,似乎要耍點特權,我們第三方應用程式,不僅動態磚非得配合Notification,而且還沒有那種很炫的動態效果,似乎有點差強人意。

在這個版本, 終於,我們可以寫出會動的方塊磚了,而且,還可以一次產生多個,我們甚至可以讓每一個動態磚,在被點選的時候帶入不同的參數到我們所撰寫的程式中:



怎麼做的呢?
主要的API在Microsoft.Phone.Shell命名空間,開發人員可以透過底下的程式碼來建立自己的方塊磚:
//方塊磚資料
            StandardTileData NewTileData = new StandardTileData
            {
                BackgroundImage = new Uri("/Images/People.png", UriKind.Relative),
                Title = "方塊磚",
                Count = int.Parse(textBox2.Text),
                BackTitle = "參數是" + this.textBox1.Text,
                BackContent = "方塊磚的背面",
                BackBackgroundImage = new Uri("/Images/PeopleSay.png", UriKind.Relative)
            };

            // 建立方塊磚
            ShellTile.Create(new Uri("/MainPage.xaml?TileID="+this.textBox1.Text, UriKind.Relative), NewTileData);

方塊磚依照Create()方法所傳入的NavigationURL來做區隔,動態磚資訊的描述則是透過上面程式碼當中StandardTileData這個物件來決定。


每個方塊磚在點選的時候,可以帶入不同的參數,你會看到我們的範例中,可以在主頁面依序產生多個不同的方塊磚,每個方塊磚都可以有各自的背景圖,和動態背面背景圖與提示文字。

這種用程式碼產生的動態方塊磚我們稱之為 Secondary Tile, 而傳統的方塊磚(使用者自己按著App然後Pin到Start主畫面中的,我們稱之為Application Tile,後面再為大家介紹更多的內容。


廣告一下...更多相關的內容與範例,可以參加Microsoft 2011 Developer Day...
http://www.bnext.com.tw/edm/2011Developer/index.html


分享

2011年6月8日 星期三

還真的有Bug...

故事是這樣的...

我們公司寫的Silverlight應用程式在正式上線後,客戶用得很開心,對於這個技術和開發人員的努力頗有好評,正當我們被客戶讚的輕飄飄,準備明天跟客戶端的老大demo的時候,前線傳來一個令人錯愕的消息...

用我們寫應用程式的電腦會當...在客戶端3台不同的電腦測試,就像機器得了機瘟一樣,早上還OK,突然間下午全當了,只要進入某一個畫面之後, IE就當給你看,Chrome也死給你看,FireFox就懶得測了。

Demo在即,碰到這種事情,非出面不可了...詭異的是,在家裡連到客戶端的網站,一切OK,我們公司沒有一台機器有問題,都算是很順,只好去客戶那邊看看。到了客戶端,正如客戶所說,沒有一台電腦能夠正常執行,而且客戶強調,早上還OK,就到下午,全不能動了...>_<

這...也太誇張了吧。

測試結果正如客戶所說,很清楚明顯的Run Silverlight的瀏覽器就是卡在那邊不動。
那...到底在run什麼呢? 看不太出來,因為我們知道程式碼只是call一個WCF Services,並且把一堆字串傳到用戶端。當然,我們懷疑過字串的大小,但經過測試,其實才幾十k,比圖片小多了。況且早上都還OK,怎麼下午就不能動了,碰到網路傳輸瓶頸也不會這樣才對。

更詭異的是,如果有資料傳輸的瓶頸,那為何在我們公司OK呢?
CPU / RAM / GPU / intranet performance 都測過之後,突然間想到,似乎客戶端所有的PC都是XP,而我們公司所有的PC都是Win7...

果然,在客戶端換了Win7之後,一切正常,回公司換了XP之後,IE當掉。同樣的一段code,怎麼會這樣呢?到底是什麼code有這麼大的魔力...答案如下:
if(arg.Result.IndexOf("Info")==0) return; 
arg.Result是一個string, 如果有經驗的Silverlight developer應該猜的到,這是WCF Services的回傳值,很單純,內容就是字串。

那為何會讓XP當掉呢?又為何Win7沒事呢...答案是...我也不知道...不過好在我不是第一個碰到這個問題的人...請參考底下...
http://connect.microsoft.com/VisualStudio/feedback/details/615069/silverlight-4-code-using-indexof-startswith-endswith-default-overloads-very-slow-for-xp-browsers

https://connect.microsoft.com/VisualStudio/feedback/details/629358/performance-problem-string-indexof-and-string-startswith

今天碰到這個問題,我們還沒有時間去找微軟是否已經提出了解決方案(或是SL5才會修正),但先列出來提供開發人員參考,也作為紀念,而我們的AP當然先workaround了,畢竟本來的寫法也不是個很有效率的做法,倒是Silverlight會有這個問題頗讓人訝異的。
分享

2011年6月4日 星期六

LinqToSql 範例

前幾天在上課的時候,提到了微軟的ORM技術,當然談到了LinqToSql和ADO.NET EF。

過去習慣在.NET 2.0開發應用程式的學員們,自然對Linq語法不是很熟悉,但坦白說,一開始我也很不習慣,但改用Linq一段時間之後,開發速度確實提高了很多,很自然的,現在幾乎不管寫哪一種Code(SL, ASP.NET, class...etc)我依舊都會用到Linq...

連去學校上課也都捨棄ADO.NET直接教Linq,原因是,大一大二的學生,在具備了基本的OO概念之後,要存取資料庫,以Linq搭配ORM,可以省去了學習SQL語法的動作。

前幾天學員問到了Linq的語法實在不是很熟,例如Join怎麼下呢? 如何取得Max或avg呢?,有沒有可以參考的網頁,當然有,就在這裡了...

http://msdn.microsoft.com/en-us/vcsharp/aa336746 (C#)
http://msdn.microsoft.com/en-us/vbasic/bb688085 (VB)


分享

2011年5月26日 星期四

Windows Phone 7 - Mango (sdk 7.1 beta) First Look

你大概已經知道微軟準備釋出Mango了,前天微軟開了記者會,昨天連台灣的新聞播報了不短的時間(不過不少新聞是做成芒果挑戰蘋果之類的詭異比較...)。

微軟說芒果這個新版的Windows Phone 7作業系統有超過500項新的功能,上千個API可以讓開發人員使用,那到底有那些東西呢? 我們在發表會後立刻下載了新版(7.1 beta)的 SDK+模擬器(對,正式的芒果恐怕要秋天才能吃到)進行了 firs look test...

初步的嘗試,測試了模擬器的重要更新,錄成了底下的影片,沒有聲音,大家慢慢安靜欣賞...
http://MediaServer1.studyhost.com/Video/WP7/Mango7.1/MangoFirstLook.wmv

我寫了三個測試App, 主要是,你會看到底下功能:
1.原生的中文輸入(手寫尚未出現)
2.模擬器支援accelerometer,可以模擬手機的傾斜度狀況
3.模擬器支援GPS,可以模擬手機的移動(這個有趣)
4.支援多工可以在手機上切換多個App(多工的部分模擬器還沒有100%支援,UI有點小醜)
模擬器的新功能讓開發人員可以更方便的測試你的App, 整個方便不少, 晚一些再介紹一些重要的API...

7.1 beta版的SDK在這裡...
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=77586864-ab15-40e1-bc38-713a95a56a05&displaylang=en
enjoy it...

分享

2011年5月12日 星期四

在IIS上設定WCF Services VS 不讓小問題搞死你

前陣子,委外的廠商開發了一個.svc的WCF Services,佈署到我們的新機器上之後,怎麼也跑不起來,直接瀏覽時會出現錯誤訊息,廠商先前都沒有用過WCF Services技術開發過.svc服務,在開發環境VS2010當中確實都可以運行沒有問題,因此這個Issue又觸礁無法解決...

我們接洽的這位同事很可愛的在網路上找了這篇:
http://technet.microsoft.com/en-us/library/dd632554.aspx

然後也設定了MIME,結果服務終於在瀏覽器上不會出錯,但卻根本沒法呼叫,只會出現blank text page, 因此我重新看了一下IIS的環境,最後執行底下指令:
"%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" /i

就這樣,搞定!
原因當然是Windows Communication Foundation並沒有在IIS當中正確的建立 Metabase, 使得服務無法透過IIS給叫起來。

過去我們的合作廠商和同事(都是developer background),都在Hosting(或是Windows Azure)上架設網站,那些環境都是別人已經準備好的,所以當然不會有問題。然而卻從來沒有自己從頭到尾架設一個Windows Server,因此在最基本的問題上觸礁,且花了不少時間,直到客戶直接問我,為什麼環境架設那麼久,一直架設不好,回頭找員工討論,才知道卡在這個問題上。

員工知道這一定是一個可以解決的問題(不然其他Server怎麼可以run?),因此想自己解決,也不問身邊其他同事(怕被笑?),但又因為身上還有其他工作,所以這個問題就懸了快一周,一周的時間就這樣過去不打緊,對客戶來說他反映出來的是服務品質和效率,當我知道了之後覺得很遺憾,因為短短一行指令就可以解決的問題,卻讓客戶等了好幾天...

檢討這個狀況,發現基礎常識的不足,和資訊的不透通是最主要的原因,IT產業常常碰到很多的問題,每一個開發人員和IT技術人員每天都在處裡各式各樣的問題,一個問題處理完畢之後,能夠有log是最理想的狀況,但往往這些經驗是很難留在公司裏面(問題解決了很爽,寫Log卻很煩,先喝杯咖啡去,Log...再說吧),而一個問題呈現出來的現象和狀況可能有多種面向,有時候也不那麼好歸類。

但最最最糟的狀況是,某一個關鍵問題卡在一個人身上,在開會、Review進度時都沒有提出(或提的很模糊,沒人聽得懂,提的人也希望趕快跳過,不想被challenge),然後卡在某個人身上一直無法解決(他也不是懶惰,而是一直找不到方法),結果變成整個專案的瓶頸,這很冤枉,也很划不來...,明明是一個可以被處裡甚至被防範的簡單小問題,卻造成進度的落後。

後來,針對這個現象,我們訂出了工作準則,並且透過資訊系統,要求員工在手上的待處理問題,如果超過一定時間沒解決(或是根本不知道該怎麼解決),必須登入在員工每日工作的系統(EIP Portal)上, 讓這個問題公開,讓其他有經驗的同仁或他的主管,可以出手介入或施予援助。(管理單位也可以從這些Issue List上,推敲出目前專案的狀況)

每一個人都不是全能的,資訊領域那麼大,大家各自有擅長的技術,彼此幫忙解決問題,才是我們想看到的結果,因為特定領域不熟悉,甚至羞於尋求幫助,並不是我們想鼓勵的文化,我們沒有讓每一位員工很忙,也是因為希望能夠多一些時間彼此幫忙。另一個有趣的現象,你會慢慢地發現,團隊中最有人緣或最有領導力的,常常是那個對其他人施予幫助的,而非技術能力最強的人。
分享

2011年4月30日 星期六

Silverlight ComboBox的Hotkey功能

最近在做專案時,客戶問到操作界面的問題,希望ComboBox能夠有hotkey,這種需求是很難拒絕的,特別是很久以前的WinForm早就有這種功能了。

但不幸的是,Silverlight...沒有。沒有的原因是Silverlight的ComboBox比較強(嗯...好怪的邏輯唷),不過,是真的,因為Silverlight的ListBox和ComboBox裡面的item並不像是以前WinForm or WebForm只能是ListBoxItem, 現在Silverlight中的ComboBox的Item,可以是任何物件,例如簡單一點的String, 複雜一點的Calendar, 甚至可以讓每一個Item是多個物件的集合。

不過,這是ComboBox比較複雜且加上DataBinding的用法,那...假設ComboBox中的Items,根本就是很單純的ComboBoxItem或是String呢? 難道還是不能用HotKey嗎?

然而這時候,可能就需要寫段小程式了,去Hook ComboBox的KeyUp事件,在按下特定的字母時,將ComboBox的SelectIndex做動態的調整,要寫Code,不麻煩,但要能reuse就需要花點腦筋了。

不過令人興奮的是,Silverlight的Behavior技術,可以把這個功能封裝成可重複使用的原件,那,就設計成Behavoir好了...

不過正準備動手時,轉念一想,這麼常用的功能不可能沒有吧,Search了一下,果不其然,國外已經有寫好的套件囉,而且還含有Source Code呢...網址如下...
http://gallery.expression.microsoft.com/RapidAccessKey

Enjoy it...


分享

2011年4月28日 星期四

C# 101 - Cancel Event的設計

最近上課時,學員問到C#當中Event的設計,主要是希望能夠設計出類似WinForm視窗關閉時,那個帶有Cancel屬性的e參數,為此,該學員傷腦筋了很久。

為了避免學員內心受創,因此我緩緩地先述說了一段事件設計的歷史故事,成功轉移焦點後,再委婉告訴他其實不用設計,因為.NET從2.0開始就有了,直接繼承CancelEventArgs 類別即可。

程式碼如下:
public class MyEventArgs : System.ComponentModel.CancelEventArgs
{
//你可以加上其他你需要的屬性
public string AnotherProperty { get; set; }
}

而使用該參數時,只需要撰寫類似底下這樣的事件程式碼:

public delegate void MyActionEventHandler(object sender, MyEventArgs e);
public event MyActionEventHandler MyAction; 

這樣設計出來的事件,在使用參數時就會具有e.Cancel屬性,而在我們觸發該事件的程式碼中,就可以透過底下這樣的Code, 來依照Cancel的值判斷是否要繼續後面的程式碼(這就是我們在WinForm的Closing事件中將屬性e.Cancel設為true之後,就不會關閉視窗的原因)...

if (MyAction != null)
 {
     MyEventArgs arg = new MyEventArgs();
     MyAction.Invoke(this, arg);
     if (arg.Cancel) { return; }
     ...其他程式碼...
  }

其實整個很簡單,但令人訝異的是,許多.NET Developer由於並不常寫Class,導致對.NET內建的許多類別異常的不熟悉。

已經很久沒有機會和學員討論到基礎的東西了,頗令我感慨的是,學員對MVC有興趣,對MVVM有好奇,但由於網路資訊的普及,已經不多Developer,還願意花時間把Programing 101的書籍翻開來好好閱讀了...網路上資訊確實很多,但由於都較為片段,不容易有系統的學習,容易使得開發人員的觀念2266。

可是,我很想跟學員說,其實你知道嗎? 扎實的基礎,才是能夠在職場中站穩腳步的關鍵要素。

分享

2011年4月22日 星期五

技術並非唯一的解決方案

投入資訊業到現在,已經數不清多少個年頭了,在這十幾二十年的歲月中,有幸在不同的時間擔任不同的角色,因此格外能夠體會技術人員的心情。

最近有機會到一些場合進行教育訓練,講授的是微軟新的雲端運算技術以及Silverlight開發技術,其中涉及n-tier概念以及物件導向程式設計,學員來自四面八方,很特別的背景,唯一的共同點就是都並非科班出身(詭異了,那資工資管畢業的人哪去了?),而技術歷史更是迥異,有ASP開發人員、有ASP.NET開發人員、Java開發人員、VB開發人員....etc...

原諒我這麼說,談到ORM、Class Design、Pattern等概念時,java背景的開發人員頻頻微笑點頭,顯然頗有認同之意,而大部分只寫過ASP.NET的WebForm開發人員似懂非懂,能夠抓到一個大概,但不太明白中間的道理和背後的原因,為何程式碼的需要延展性,如何提高重用性,為何要把這個機制設計成類別...似乎有些問號在腦袋裡...

其中有位ASP開發人員則在第一天中午就離開,跟我說,老師您講得很好,但是這些新技術我應該用不到,下回需要時再來請教您...

其實,這些路我都走過,我完全可以理解。(請相信我,這完全沒有對錯,上面這樣寫,跟開發人員的背景無關,其中也完全沒有任何的價值判斷)

我們這一票從Apple II/DOS時代開始寫程式的老人(不然,我要寫壯年嗎? XD) 我深深知道當年從ASP轉換到ASP.NET乃至於把程式改寫成n-tier架構的痛苦,但這麼多年下來,我也大約領略到了背後的甘甜,不過不同的是,我不再辯解,也不強調採用新架構開發系統的優點,每個人(每家公司)都有自己的路,即便不學新東西,也能找到自己的一條生路。

學習成本對每一個人來說是不同的,隨著年紀越長,我越來越少強調競爭力,畢竟電腦科技是應用科技,能產出結果、派上用場最重要,至於開發成本就見仁見智了。

在前一陣子受朋友之託,到一家非常大的企業,幫朋友看一個資訊系統。

主要是這樣,因為這個單位的資訊人員非常忙,這位朋友在部門中委託資訊單位建置了一個簡單的小系統,就是資料輸入和查詢,頂多加上一點分析,但系統建置完成之後,一開始可以用,不過久了之後想要做些調整,資訊單位卻遲遲無法配合,朋友明白這也並非IT人員的錯,因為工作量實在太大,救火都來不及了還改系統???

我最近看到太多這樣的例子,最後企業中的部門獨立把系統外包,但這又造成了資訊單位頭疼的困擾,莫名其妙生出來的系統,該怎麼整合,要如何管理,資訊安全又是另一個衍生出的問題...

我在IT/MIS部門待過很多年,我是教育訓練講師,我也是軟體廠商,我實在看過太多這樣的狀況,這也是目前台灣資訊產業的生態,甚至也是軟體公司在夾縫中生存的空隙之一,這類的資訊系統,在越大的企業中越容易發現,不僅IT單位不知道這個委外系統的存在,變成管理的漏洞,甚至某些由IT自行開發的系統隨著人事變遷也成為了孤兒...

到底,針對這些系統要如何管理,在資訊化已經那麼成熟的今天,要如何去維護和確保系統能正常運作,資訊單位到底該集權管理還是成為企業委外資訊系統的窗口?

最近看了六七家廠商這樣的問題之後,不由得感慨橫生,我沒有辦法在這一篇文章中給大家一個高明的解決方案,我卻有點遺憾,這麼多年過去,技術翻了豈止兩三翻,但企業所面對的問題依舊是這樣,解決方案是喊的震天價響的雲端運算? 時髦的平板或行動通訊裝置能否幫得上忙,還是20年後,這些問題依舊存在???

當年的我的讀者,如果還沒退役,還是IT產業線上的一員,現在也慢慢成為企業中的中階主管,開始掌握資訊化決策權,在我們下的每一個決策裡面,除了技術考量,還有很多管理上的因素需要注意,慢慢地您會發現,IT技術可能不是唯一的解決方案。

分享

2011年3月18日 星期五

感謝大家今天熱情參與...

感謝大家今天熱情參與由資策會所舉辦的『雲端嬉遊研討會』
http://www.iiiedu.org.tw/taipei/freetalking/cloud_201103.htm

在今天的場次中和大家分享了Windows Phone 7如何與微軟Windows Azure雲端運算技術整合,以及相關的三螢一雲應用程式建置經驗。

相關的投影片可在底下位置下載。
http://docs.com/B2Y9

在WP7/Silverlight當中接收JSON資料...

事情是這樣的,可能很多開發人員已經清楚,在Silverlight技術當中是不直接支援以ADO.NET方式來存取遠端DB的,關於這個部分,我在許多課堂中都有說明,隨著技術的改變與更新,現在有更好的方式在SL當中抓取資料,我們主要使用的是LINQ技術,在伺服器端可以配合LinqToSql和ADO.NET Entity Framework,所以我們會建議開發人員,在撰寫SL要呼叫的Web/WCF Services時,就直接透過LinqToSql or ADO.NET EF抓取資料,並且把抓到的資料直接以物件的方式回傳,這樣有一個超級棒的好處,就是在Silverlight去reference這個Web/WCF Services時,VS2010會自動在Silvelright端幫你generate這個物件的Type,然後你可以輕鬆的在SL當中使用這個物件,如同這個物件從伺服器端被傳到用戶端一樣。

例如:
[WebMethod]
        public AddrssBook[] getAllData()
        {
            AddrBookDataContext db = new AddrBookDataContext();
            var ret = from c in db.AddrssBooks select c;

            return ret.ToArray();
        }
這邊的AddressBook類別是資料表名稱,是LinqToSql自動幫我們產生的類別定義。

當SL去呼叫這個Web Services時,在Silvelright端就會自動產生該類別(從Win/Web Form時代就是這樣),一切都相當容易。

但在這個多元化的時候,很可能有時候沒那麼單純,總是有很多奇怪的場合,你的客戶會要求你達成跨平台這個遠大的目標。這時候,你要考慮Services是不是有可能要讓其他開發技術(PHP? Java? @#$%^&*@#$%?)來呼叫...因此,把資料轉成大家看得懂並且容易解析的方式會比較理想,例如JSON...

2011年3月5日 星期六

SQL Azure Migration Wizard

最近,應客戶的要求要上雲端,雖然有部分客戶對於雲端的意義和價值還搞不太清楚,但為了提升企業的競爭力和知名度,上雲端這件事情是肯定一定要的。(雖然兩者之間似乎沒太大關係)

Anyway, 總之呢,下半年會有更多的雲端概念出現。

但上雲端可不是隨便就上的,話說,先前我曾經說過,現階段對我來說,SQL Azure的CP值比較高,所以我在SQL Azure可以用了之後沒多久,就把很多在Web上的服務所用到的DB移上了SQL Azure。但是,這過程可是一波多折,截至目前為止,依舊沒有好的tool可以很方便的編修在雲端的資料庫(似乎,微軟覺得上了雲端的東西謹慎點好,沒事別改來改去)。對於眾多喜歡用tool不喜歡下SQL指令的Developer來說,實在是辛苦了點...

不過,在CodePlex上一直都有一套勉強可用的Tool, SQL Azure Migration Wizard 這套工具可以幫助你將某個SQL Database進行分析後,移轉(Migrate)到雲端的SQL Azure上。

最近剛好要操作,順便截錄畫面如下... 

2011年3月3日 星期四

突破舊有思維制約的創意

看這段影片,讓我回憶起了一些歷史,40年前,電腦是一棟建築物才能容納的高檔研究設備,有一家懷抱夢想的公司,把它帶入了家家戶戶的客廳...

30年前,那時候作業系統和套裝軟體是綁(配合)著電腦硬體銷售的,硬體的規格和OS密切整合,所以軟體發揮了很好的效能,但卻限制的設計的創新,也無法降低銷售成本,20多年前的某一天,有另一家帶著願景的公司決定只做軟體,把軟體從硬體切割出來,分開來銷售,這個動作,造就了某個在車庫裡創立的軟體公司這幾十年的基業,也成就了過去台灣十多年PC硬體產業的繁榮...

2000年代初有家公司在市場占有率大幅滑落,面臨存亡關鍵之際,因緣際會轉型成為mp3撥放器的終端消費產品的製造廠商,在2007年又跨足智慧型手機的領域,這一跨足,把原先在該領域佔有率最高的軟體與手機廠商殺的片甲不留...

這一切,都在過去這幾十年發生,起起落落、風風雨雨,回顧這一切,只能說,能夠突破舊有思維制約的創意,才是讓企業能立於不敗的關鍵...改變,往往從某一件事,或某一個人開始...

不過歷史也告訴我們,持續的領先和成功,是需要不斷的創意和挑戰自己才能夠實現,如果一放鬆,隨時都有競爭對手等著超越過去。

BTW,什麼時候微軟也拍一個讓大夥感動的影片,最近怎麼都是Apple的產品介紹影片比較感動人心咧???

分享

2011年3月2日 星期三

在WP7中使用Silverlight開發DropBox應用

這篇文章的標題很有趣,WP7是手機、Silverlight是開發技術、DropBox是雲端服務應用...如果你對資訊技術(特別是開發技術)有興趣且持續關注,會發現這三個(類)名詞最近常常似有若無的連結在一起。(以後有機會再分享感觸...)

使用WP7手機好一陣子了,比較特別的地方是,WP7手機沒有檔案系統的概念,而是比較偏向雲端資料儲存機制,也因此,如果你需要Sync PC上的檔案,比較理想的方式是將檔案從PC Sync到雲端(例如Dropbox或是Skydrive),然後再透過手機去讀取...

2011年2月14日 星期一

從Resource、Content、stream、Bytes取得Image

最近在寫Silverlight,處裡一些與圖片有關的東西,會需要時常從Resource, Content等位置取得Image,然後填入Silverlight的Image物件,有時候則是透過WebClient取得stream,有時候則是取得一堆的bytes...總之呢,有各種不同的情境。

所幸整理了一下,

2011年2月7日 星期一

軟體戰國時代...開始

時序進入了2011年,剛過完農曆新年,感覺上今年會是一個挺紛亂的戰國年。

因為底下幾件事情,同時都發生在2010年底...

去年,微軟算是一覺醒來,終於認真的面對行動裝置領域的挫敗,WP7的出現,讓微軟原本快要被逐出手機市場的頹勢,總算有了一現轉機...然而另一邊,iPad幾乎取代小筆電的銷售,讓市場上一方面充滿著期待,另一方面又充斥著失落感。似乎平板電腦上各種作業系統將會像過去前PC時代那樣的開戰(放心,我們過去經歷過的,充其量再來一次而已...)而kinect的熱銷,則讓先前獨占鰲頭的Wii開始有了危機意識...

2011年1月25日 星期二

智慧雲端平台及應用開發研討會

感謝大家踴躍參加昨天(1/24)的智慧雲端平台及應用開發研討會,
其中相關的投影片和video影片檔,可以參考底下連結:
http://docs.com/A9NH

當天EasyCloud產品demo影片
WP7上透過手勢放大縮小圖片和文字Demo (mp4)
WP7簡單程式開發Demo影片
WP7 個人財務管理程式Demo(用到了SL toolkit中的圖表控制項在手機上顯示圖表)
如何在VS2010當中透過ORM建立可提供給WP7使用的Web Services Demo

在這個研討會當中,我們首次Demo了應用程式上Windows Azure雲端以及SQL Azure雲端的步驟,以及開發WP7手機應用程式並且以微軟的雲端技術作為資料儲存位置的開發架構。

希望對各位有所幫助。

2011年1月22日 星期六

the future ahead

我們寫的每一行程式,對這個世界會有幫助嗎?
我們的努力,會不會為這個世界帶來一些改變?
讓人變得更快樂? 讓世界變得更美好?

讓每一個人更喜歡生活中的每一天?
讓世界少一些苦難...多一些愉悅?
我不知道,但我真的很期待...

2011年1月4日 星期二

2011 出發吧...

2011的第一個上班日前,連續地接到了幾個電話,讓我覺得,應該要寫篇文章紀念一些事情。

第一通電話,朋友告訴我他今年決定要離職了,不是因為覺得今年景氣比較好所以準備另謀高就,而是打算豁出去,自己開公司。他說:『活了30多年,等了那麼久,總得下來玩這一把吧~』在網路公司任職那麼多年,看著的都是別人成功的故事,如果自己不下場,錯過了這一次,一定會後悔...

第二通電話, 一位在教育訓練中心任職多年的講師朋友,決定回到IT職場上,對於授課、寫書的工作覺得不像當年那麼起勁了,他告訴我:『當年坐在台下聽講,總覺得講師在台上意氣風發,整個場次的聽眾隨著講師授課的聲音脈動,眼中閃爍著對技術的衝動與未來的期待』這麼多年過去了,技術起起伏伏,紅牌起起落落,每一季都有新的技術和理論,『還是交給年輕人吧,你自己也別撐太久啊~』他跟我說。

第三通電話,一位在電腦書籍出版耕耘很久的作者,告訴我今年不打算出實體書了,『現在已經沒有銷量,不過或許會賭一把,嘗試電子書的出版吧。』『還能怎樣呢? 台灣開發人員太少了,天知道人都跑哪去了,連學校的學生都不買書了...花一年寫一本書,賺不到幾萬塊,況且網路上資源那麼多,現在年輕人不興讀書的啦...』『電子書複製和閱讀習慣的問題呢?』我問。『看著辦囉,如果銷量還是起不來,我真的去夜市賣雞排~』他笑著說。

三通電話幾乎連續著接到,適逢2011年年初第一個上班日,心裡不免有些感慨,過去我們覺得所謂的夕陽產業,是傳統工業的代名詞,但是隨著網際網路的普及,不消說很多習慣的改變讓某些產業措手不及,變化的迅速讓人目不暇給。這幾種心情我都經歷過,所以頗有心有戚戚之感。

電話中除了互勉之外,對接下來這一年還是抱有不少盼望,雲端技術和行動裝置在接下來這一年依舊會是重點,還有很多好玩的東西不是嗎? 畢竟無限的可能性,是這個行業最吸引人之所在了。

最後跟朋友說,加油,不管接下來打算怎麼走,2011才開始,出發吧,別遲疑,我們正大步往這一年邁進...



簡體版