2007年11月30日 星期五

[研討會] 首屆SD2.0大會(北京九華山)

recap:

『phphot』【SD2.0大会】董大伟:用Silverlight记下我和老婆的精彩瞬间


分类: 2007年SD2C 大会课程 1052人阅读 评论(0) 收藏 举报
原文链接:http://blog.csdn.net/phphot/archive/2007/11/30/1909073.aspx作者:phphot(phphot) http://blog.csdn.net/phphot

中国最大的IT技术社区CSDN联合美国权威IT技术媒体CMP集团,共同为中国百万开发者带来国内最权威的顶级软件技术大会——“2007 软件开发2.0技术大会”(SD2C)正在九华山庄火热进行当中。在106分会场,微软最有价值专家、台湾知名信息作者与讲师董大伟正在为与会者做《ASP.NET AJAX与Silverlight 的完美结合》的精彩演讲。
董大伟首先以自己亲手用Silverlight制作的与老婆亲密瞬间影音动画做开场,立即引起全场人气沸腾。他表示,用微软的Silverlight可以非常简便的制作出炫目的多媒体动画。
接下来他示范了如何轻松整合AJAX和Silverlight,抓取后端数据库内容,利用JavaScript程序代码当中透过AJAX技术来完成。
需要特别强调的是,Silverlight并不一定绝对需要和ASP.NET技术加以整合,即使单纯的.html页面也可以将Silverlight应用程序执行的非常好。由于Silverlight是透过纯前端(浏览器端)的JavaScript程序代码来运作,因此在技术上当然也可以和ASP、PHP、JSP、或其它服务器开发技术加以整合。

                                      (图为董大伟在现场做精彩演讲)
讲师介绍:董大伟
微软最有价值专家(MVP)、台湾知名ASP.NET的信息书籍作者与技术讲师、台湾微软TechED 2007讲师、微软AJAX与Silverlight开发者大会讲师,致力于Web Application开发与研究多年,着有『ASP.NET与AJAX深度剖析范例集』与『ASP.NET AJAX应用剖析立即上手』等书在台湾与大陆均有出版。

http://blog.csdn.net/sd2china/article/details/6009332

2007年11月22日 星期四

ASP.NET 2.0當中的Call back技術與ASP.NET AJAX

前面介紹過了幾個ASP.NET當中的AJAX機制之後,不知道讀者是否偶而也有一些confuse,原因是有太多種方法可以在.aspx網頁上進行AJAX動作了,目前最常見的幾種方式是:
1) 傳統的HTTP request(要自己寫一些JavaScript code)
2) asp.net 2.0當中的Call Back技術(ASP.NET 2.0當中原生支援,不需要安裝任何套件)
3)安裝ASP.NET AJAX套件之後的 異步 Web Services Call
4)安裝ASP.NET AJAX套件之後的 異步 Page Method Call
5)安裝ASP.NET AJAX套件之後的 UpdatePanel

由於有很多讀者問到,同時也不少人有這方面的爭論或是疑惑,因此筆者分別針對這幾種方式稍做說明。

目前,只要您是ASP.NET的開發人員,我相信你會在2,3,4,5這幾種方法當中選一個,而最常用的可能是方法5。因為方法1這種傳統的Http Request不僅要撰寫相當多的JavaScript,並且很可能您要自己處理瀏覽器兼容與支援的相關問題,因此一般來說我們不太做這樣的用法。

而其中最簡單的則是方法5, 採用UpdatePanel,但是, 讀者要知道,上述各種AJAX技術當中,最耗費頻寬且效能最差的就是UpdatePanel,筆者在研討會常常碰到讀者詢問ASP.NET AJAX的效能不好(但是其實只有UpdatePanel的效能不是非常好,而且這還跟使用的方式有關...),因此在這邊筆者要再三強調,僅管你看到UpdatePanel 所謂的『partial postback 』 "似乎只是" 將一小塊區域回傳給伺服器端,但是實際測試後你會發現,在進行partial postback時,其實是 "整個頁面" 回傳給伺服器端(只是沒有換頁),而雖然reload回來的時候確實是局部的頁面,但是如果你加上了Timer一起用,肯定會造成可怕的網路流量...

而方法3的異步Web Services呼叫其實是筆者比較喜歡的方式,不管在執行效能或是原理架構上,都是蠻漂亮的AJAX用法,而方法4的PageMethod則是類似於方法3的一種簡易用法,不需要額外建立一個Web Services(.asmx),就可以在頁面當直接使用,是比較輕量級的方式,如果您的頁面上想要畫龍點睛的來一小段AJAX功能,方法4是不錯的選擇,而方法3則可以讓開發人員以正規的方式建立較為龐大的AJAX架構,例如撰寫一個AJAX版的開發平台,類別庫...等

而方法2呢?怎麼越來越少聽到筆者談起?可能有讀者以為ASP.NET AJAX出現之後我們就把它拋在一邊了,其實這個觀念不是非常的正確,您會發現Call Back技術依舊是目前 "撰寫支援AJAX功能的Web控制項" 最好的方式...

可能筆者提的很少,但是其實是因為台灣現在寫控件的人越來越少了,其實,您若深入研究就會發現,ASP.NET 2.0當中的Call Back機制不僅可以用在網頁上,也可以用在User Control和Web control,可以讓頁面(或控件)直接支援AJAX功能,是非常好用且筆者非常喜歡的一種做法,如果你的開發團隊當中,需要自行開發控件,而這些控件想要支援AJAX,Call Back技術是最理想的選擇...

而Extender Control呢?它不是也能來撰寫控見嗎?呵呵,沒錯,不過這又是另一個層面的問題了,也許下次有機會時後再跟大家報告一下這中間的差異...

2007年11月20日 星期二

轉貼:VS2008下載點

· 如果你是MSDN訂閱者,你可以在MSDN訂閱網站下載。
· 如果你沒有訂閱MSDN,你可以在這裡下載Visual Studio 2008 Team Suite的90天免費試用版本。Visual Studio 2008 專業版的90天試用版本(下載大小稍微小點)將於下個星期推出。Team Foundation Server的90天免費試用版本可以在這裡下載。
· 如果你想使用免費的 Visual Studio 2008 Express 版本(下載大小更小一些,而且是完全免費的),你可以在這裡下載。

2007年11月15日 星期四

產品試用報告:CG-NSC1000(NAS), XPAL VICTOR(外接蓄電池)

敗家,很可能是人類的天性...

CG-NSC1000 試用報告 (NAS) 連結
1.新增或移除帳號的時候硬碟猛跑且系統停止回應, 我實在不知道他在跑什麼, 且需要大約15分鐘才可work, 不過值得慶幸的是,沒有就此當掉...資料還在
2.檔案的存取速度稍慢(估計瓶頸是在網路速度而非硬碟速度,硬碟是SATA II)
3.在NAS上的某些檔案的日期會消失, 導致我下xcopy指令加上 /d 參數時無效...無法依照日期備份,這點讓我很困擾
4.其餘跟DM上的廣告一樣...

XPAL VICTOR電力救星萬用移動電源 試用報告 連結
簡單一句話, 就是產品蓄電量與期待嚴重不符合(遭本人退貨處理)
但客服很不錯, ok, 非常阿莎力的退貨並且很客氣的詢問原因,
我坦白告知期蓄電量跟我預期的差很多...
客服提到他們沒有測過我那台NB, 說以後會列入測試...

ps.產品外型挺OK,其餘均與產品DM相同...

that's all.

希望我敗家過的產品經驗,可以提供大家參考...

特別注明:以上意見僅是我使用一次(因為我只買了一台)的經驗,請不要排除一種可能,就是我剛好拿到最好或是最爛的那一台,因此不能夠直接視為此產品的平均表現。僅供讀者參考,若有其他不同的看法或是使用經驗,請踴躍跟大家一起分享。

2007年11月13日 星期二

關於NB執行速度的瓶頸

今天,不談軟體。

這一篇,提供初學者一些產品選購上的建議。

最近有一篇Scott Guthrie的Hard Drive Speed and Visual Studio Performance談到了開發工具和硬碟之間的關係。這部分我也感觸深刻,所以稍微提一下自己的看法。

很久以前我在買NB的時候就深刻的體驗到,RAM的大小與HD的速度其實是效能的一大關鍵,至於CPU速度實在沒有太大影響,主要的原因很簡單:『你的瓶頸不在CPU!!!』

感謝『目標』一書的作者『高德拉特』很久以前幫我建立的一個觀念,至今在各種場合屢試不爽:『問題的解決從瓶頸下手。』不管問題多複雜,所有的問題都可以歸納到一兩個焦點,這就是你的瓶頸(在專案上也多半是如此),當事情一片混沌的時候,找出瓶頸可以說比什麼都還重要。


而NB和一般PC的速度瓶頸根本不在CPU速度,甚至很多時候CPU是閒置的,如果你發現你的硬碟燈猛閃,大概就可以知道其實你的硬碟最好換成7200轉的(或是選購Buffer大一點的),我的NB在購買的時候,就搭配7200轉的轉速。另外就是RAM的大小,由於作業系統的運作邏輯,當記憶體不足的時候會以HD作為虛擬記憶體,你就會開始看到硬碟又猛閃,這時候,將會嚴重拖慢整個系統運算速度。

最後一個小小的關鍵在顯卡速度(包含顯卡RAM的大小),以前我以為這個不重要,但是換成獨立顯卡的NB之後,發現現在的Windows實在有太多地方用到了顯卡的效能(Vista就更不用說了),不消說,如果你的顯卡不是獨立的,會搶到主CPU的時間或是主記憶體,則整體的速度自然就差了。

最後最後,才是CPU的運算能力,一般的伺服器其實也是,絕大部分的問題都不是卡在CPU的運算能力上,這點很弔詭,原因是電腦最重要的能力就是運算,但是顯然現在我們一般人用到的運算需求並不高,資料的存取和搜尋反而是更大的需求,所以速度的瓶頸開始轉變成HD甚至網際網路的存取能力...

總之,有時候你看到電腦當在那邊,十之八九不是CPU在運算,而是CPU在等週邊...無奈週邊的速度太慢而已...

2007年11月11日 星期日

ASP.NET 2.0當中的Call Back機制

連續幾篇介紹ASP.NET當中的AJAX實作方式,主要的目的也是讓讀者可以有所比較,理解這幾種作法之間的差異。

最後一個要介紹的,當然就是ASP.NET當中的Call Back機制。Call Back是ASP.NET 2.0當中內建的功能,不需要安裝ASP.NET AJAX依舊可以相當有效率的呈現出AJAX效果。

我們看下面的頁面,我們在頁面上放置另一個TextBox2和HtmlButton(ID為CallBackButton,並設為在伺服器端執行:


接著我們鍵入底下的程式碼:


我們先看執行的結果,您會發現,按下下方的HtmlButton,則網頁不需要postback,TextBox2裡面的Server端時間已經更新了:

怎麼完成的呢?
這段程式碼必須好好解釋一下,首先程式碼第三行有一個很不一樣的地方:

0001:Partial Class _Default
0002: Inherits System.Web.UI.Page
0003: Implements System.Web.UI.ICallbackEventHandler
這表示這張.aspx網頁支援Call Back機制(我們待會再來解釋Call Back機制)。而因為網頁支援Call Back機制,因此必須實作底下兩個項目:


我們看先前的Form_Load程式碼:
請特別注意21-25行程式碼,23行的『GetCallbackEventReference』指令,建立了CallBack機制(ASP.NET 2.0會自動產生一段JavaScipt的CallBack程式碼),在第25行我們將此機制(JavaScript)掛到HtmlButon上。

Call Back的整個原理是:
1.在ASP.NET程式碼中,利用『GetCallbackEventReference』產生一段JavaScript的Call Back指令。
2.將這段Call Back指令掛到某個Html控制項上,利用這段JavaScript指令在不postback的情況下,將資料(參數)回傳到Server(參數包含下表中定義的argument, clientCallbackProc…) 。
3.Server端(.aspx.vb程式)接收到資料(參數)後進行處理,處理完後回呼(Call Back)Client端的JavaScript。
4.Client端的JavaScript函式,收到回呼的結果,動態更新網頁內容。
就這樣,不換頁的情況下,我們就可以完成網頁更新的效果。

我們回顧整個Call Back機制的流程,從開發人員的角度,看整個Call Back機制的運作方式:


您會發現分為底下幾個步驟:
※步驟A:Client端啟動Call Back機制。啟動的方式是利用GetCallbackEventReference所建立的WebForm_DoCallback函式(JavaScript)。
※ 步驟B:Server端的RaiseCallbackEvent接收到Client端傳入的參數,開始運作,這時多半處理一些資料庫IO,更新Server端的狀態。
※步驟C:GetCallbackResult被呼叫,這時候多半用來建立要回傳給Client端的HTML碼,例如一張表格,或是一段文字。
※步驟D:Client端接收到從GetCallbackResult傳來的值(多半是剛才Build出來的HTML碼),Client端的ReceivedData函式是我們自己在Page_Load裡面以RegisterStartupScript建立的,可以透過這個函式將接到的HTML以JavaScript塞入頁面中。

整個行程就完成了一個Call Back動作,可以達到不用換頁(Postback)就更新頁面的效果。

2007年11月8日 星期四

all beta 2 version of VS2008 Express

Are You Ready???
http://msdn2.microsoft.com/en-us/express/future/bb421473.aspx

真是光陰似箭,日月如梭,一切盡在不言中啦 ~

ASP.NET AJAX中的非同步PageMethod呼叫

上回我們介紹過了ASP.NET AJAX當中的非同步Web Services呼叫,但是用過ASP.NET 2.0當中的新功能Call Back的朋友們可能會覺得麻煩,還要多建立一個Web Sevices(.asmx)頁面,如果您嫌額外建立一個.asmx的Web Services頁面太過麻煩,還有一種更簡易的方式可以進行非同步的呼叫,我們稱之為Page Method。

您可以建立一個.aspx頁面,並一樣佈置ScriptManager、TextBox與Html Button:


接著我們鍵入底下的程式碼:




接著,請測試執行的結果,您會發現一樣可以透過非同步的方式呼叫(按下Button之後不換頁就可以利用伺服器端的資訊更新TextBox內容),但是不需要額外建立了一個.asmx檔案,在程式的結構上稍為清爽一點了。這就是PageMethod的使用方式,請注意其中務必將.aspx中的PageMethod宣告為靜態方法(加上shared關鍵字),並且加上底下的Attribute(第1-2行):



同時間在.aspx頁面上的ScriptManager控制項,一定要將其EnablePageMethods屬性設為true,才可正確使用PageMethod。
資料來源:節錄自筆者『ASP.NET AJAX應用剖析立即上手』一書

2007年11月7日 星期三

ASP.NET AJAX中的非同步Web Services呼叫

在ASP.NET AJAX當中,除了透過UpdatePanel機制來建立具有AJAX功能的Web應用程式外,其實傳統(較為典型)的做法是利用Web Services的概念,來達成網頁上非同步呼叫的工作。

這也是整個ASP.NET AJAX架構的基礎,以及UpdatePanel控制項的根本原理。

當然,因為透過這樣的方式,您必須自行建立一些JavaScript程式碼,所以這種模式比較適合過去曾經自行建置過AJAX機制,或是利用ASP.NET 2.0中的Call Back技術來實作過AJAX功能的Web程式開發人員。雖然透過這樣的方式您要手動建立一些額外的JavaScript,看起來也比較難,但是對於整個AJAX的技術掌握度相對的也會更加深入。

請看AJAX技術架構,整個原理其實如下圖:


以一個最常見的功能(抓取Server端的時間放入TextBox)為例,我們想在按下網頁上的按鈕之後,在不postback的狀況底下,取得伺服器端的時間,並填入TextBox中。

上圖中的網頁有一個TextBox與一個HTML Button,當我們按下頁面上這個HTML Button時,開始觸發一連串的非同步Web Services呼叫動作:
1. 首先,使用者按下按鈕,瀏覽器上的Html Button發生了一個JavaScript的onclick事件(注意,由於是Cient端的onclick事件,因此不會觸發Postback動作)。
2. 我們在這個JavaScript的onclick事件當中,要呼叫遠端伺服器上的Web Services(假設這個伺服器端的Web Services會以字串格式回傳伺服器端的時間。
3. 接著在瀏覽器上(的網頁)利用一段已經撰寫好的JavaScript副程式接收此字串。
4. 再透過JavaScript副程式將接收到的字串填入TextBox。

完成。

透過上面這個步驟,我們就可以在不Postback的狀況底下,將TextBox的內容更新為目前伺服器端的時間。

我們接著看底下的範例,您會發現即使不使用UpdatePanel,依舊可以在ASP.NET網頁中完成AJAX功能。

要完成這樣的工作,我們需要先建立一個Web Services,稱為WS.asmx,負責回傳伺服器端的時間,在這個.asmx檔案中,鍵入底下的Web Services程式碼:


這和過去我們撰寫的Web Services幾乎完全一樣,比較不同的地方是在.asmx檔案類別宣告的Attribute,和WebMethod的Attribute(增加了System.Web.Script.Services.ScriptMethod)。
另外請注意這個Web Servces,具有一個format參數傳入(透過Client端的JavaScript傳入的),而這個Web Services的程式碼很簡單,依照傳入的format格式回傳目前伺服器端的時間。

撰寫好程式碼之後,接著我們建立一個.aspx檔案,並且拖曳ScriptManager、TextBox和一個Html Button:


接著,我們在頁面上Double-Click以撰寫Page_Load事件:



請注意在上方程式的最後一行(16行),我們透過Services屬性,將剛才建立的ws.asmx加入,加上之後,ScriptManager會幫我們在頁面上自動產生JavaScript程式碼,可幫助我們得以利用底下這樣的JavaScript寫法,來呼叫後端Web Services:

WS.GetServerTime(參數,
          成功呼叫WebServices後要執行的javaScript函式,
          呼叫WebServices若失敗後要執行的javaScript函式 );

因為有這樣的設定,所以你會看到,我們在上面程式碼的第5行很大方的透過這樣的方式來呼叫Web Services:

WS.GetServerTime('yyyy/MM/dd HH:mm:ss',onOK);

如果沒有經過上面第16行的設定,則上面這段呼叫Web Services的JavaScript程式碼會完全無效,因為JavaScript根本沒有所謂的WS物件,也沒有GetServerTime方法可供呼叫,但是一但透過上面程式碼第16行的設定,則前端網頁即可透過JavaScript『WS.GetServerTime(…)』這樣的方式呼叫Web Services。

而呼叫『WS.GetServerTime('yyyy/MM/dd HH:mm:ss',onOK);』時傳入的『onOK』,則是指定成功呼叫Web Services後,前端瀏覽器上的JavaScript程式碼要用來接收伺服器端WS.asmx執行後的回傳值的函式。

我們在上面第7-9行定義了這段JavaScript的程式碼,接著來看這個函式的內容:

function onOK(returnData){
$get('TextBox1').value=returnData;
}

程式碼很簡單,具有一個ReturnData參數,這個參數就是呼叫WS. GetServerTime這個Web Services後,該Web Services會傳回來的伺服器端時間。接著取得時間之後,第二行的$get(‘TextBox’)又是什麼呢?

其實,『$get(‘TextBox’)』完全等同於『document.getElementById("TextBox");』,拜ScriptManager之賜,我們得以用簡化後的程式寫法來撰寫JavaScript,這部分當然也是ASP.NET AJAX Client-Script所提供的功能。

最後,我們試著執行這個網頁,果然,我們按下Html Button時,前端瀏覽器上的JavaScript透過呼叫後端的Web Services(WS.asmx),取得了以『yyyy/MM/dd HH:mm:ss』為格式的伺服器端時間,並且更新到頁面的TextBox控制項中,不需要UpdatePanel,我們依舊可以完成整個非同步呼叫Web Services的動作。

資料來源:節錄自筆者『ASP.NET AJAX應用剖析立即上手』一書

2007年11月5日 星期一

將Silverlight佈署到正式機(Windows 2003 Server)上之後無法瀏覽?

讀者反應將撰寫好的Silverlight應用程式佈署到Windows 2003正式機上之後無法瀏覽(看到的是一片空白),但是在開發階段(VS2005)卻都可以。

關於這個問題,筆者在將Silverlight佈署到租用的Hosting時也發生過,其中一個主要的原因是在預設的狀況底下,Win2003 Server並不支援 .xaml 檔案MIME格式。

因此,其實伺服器端無法提供用戶端IE瀏覽器當中所需要的.xaml檔案,使用者看到的自然就是一片空白了。您可嘗試直接載網址列輸入 xxxxxxx.xaml的檔名,就可測試出這種現象 ,若無法讀取(檢視到.xaml檔案內容),就表示您的IIS伺服器需要設定。


若是Win2003 Server,您可以進入 IIS 管理員,開啟網站內容,增加一組 .xaml 的 MIME識別即可:


資料如下:
副檔名  類型
.xaml   application/xaml+xml

此問題與解決方案由 Johnny 提供。

參考網址為: http://www.cjcraft.com/blog/2007/05/08/HowToConfigureIIS50AndIIS60ToDeploySilverlightApplications.aspx

2007年11月4日 星期日

如何在非同步Postback過程中修改位於UpdatePanel外的控件內容?

ASP.NET AJAX當中有一個非常神奇好用的控制項 UpdatePanel,這個控制項可以幫助我們輕易的達成非同步Postback的功能,讓我們的.aspx頁面上可以直接加入AJAX技術。

時常有讀者詢問筆者一個問題,在UpdatePabel內所觸發的事件當中,是否可以動態的更新佈置在UpdatePanel "外的" 控制項?

一般來說,我們使用UpdatePanel時可會這樣佈置:


平常時候我們會把 "需要以非同步方式動態更新" 的控制項放在UpdatePanel裡,這時後要更新畫面中的TextBox1很簡單,只需要撰寫程式碼:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
 me.TextBox1.Text= " ... "
End Sub


在UpdatePanel當中的Button1所觸發的Click事件,會以非同步Postback的方式被執行,因此當後端事件Click被執行到,即可更新TextBox1中的值,且頁面不需要換頁(Submit)。

但是,您用UpdatePanel久了就會發現,我們不可能把所有的控制項都放在UpdatePanel當中,如果需要在非同步Postback當中,動態更新UpdatePanel外的控制項內容,該如何作呢? 例如:

當我們想按下UpdatePanel當中的Button之後,更新位於UpdatePanel外的控制項的內容,則需要透過動態Render JavaScript的小技巧:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
 Dim js As
String
 js =
"$get('TextBox1').value='...';"
 ScriptManager.RegisterStartupScript(Me, GetType(String), "", js, True)
End
Sub

這樣就可以透過動態產生的JavaScript,來更新前端頁面上佈置於UpdatePanel外的控制項。
其實這個小技巧相當好用,我們也可以用於在非同步Postback過當中,動態的產生alert視窗,例如:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
 Dim js As String
 js = "alert('非同步postback過程當中產生的alert視窗...');"
 ScriptManager.RegisterStartupScript(Me, GetType(String), "", js, True)
End Sub


希望這個小技巧對各位使用AJAX技術時有所幫助...

2007年11月1日 星期四

所謂的好音樂

所謂的好音樂就是,即使你隔了很多年,很久很久,久到實在忘記了第一次聽到那首歌的時候究竟是哪一年(或是當時和誰在一起、或是當時究竟是先看到電影還是先聽到音樂...),但是,每次重新聽到時,總是會帶給你感動,這種音樂,必須珍藏...

當然,很多時候可能不只是音樂本身的魅力,而是當下的那個情境,在某一年、在某一個時刻,因為特定的情境,有一首歌打動你的心,所以在你生命當中,留下了一個印記,過了許多年之後,或許時空變遷、或許真的滄海桑田,但是當你聽到那首歌,看到那個片段,赫然發現原來的記憶還在,塵封許久,但似乎不曾遺忘,然後你明白,很多事情會一直跟著你...還真的是給他:『凡走過的,必留下痕跡』...

一首好聽的歌很神奇,會讓你有感動...

這件事情常讓我嫉妒,因為寫程式似乎很難讓人有感動,有時候你想想寫程式跟作一首歌曲其實行為模式很接近,我都覺得那需要一點創意、需要思考、需要安靜、或是一點靈感...

有時候,寫一本書也是,我猜想我寫一本書的時間和周杰倫作一張專輯大概差不了多少,我大概在書籍銷售的單價上比周董的唱片銷售單價稍為略勝一籌,但是其它可就輸的一敗塗地了,例如,周董的唱片可能隨隨便便都可以在台灣發行首月銷售15萬張,我的書呢,如果在台灣能夠一個月內賣1萬五千本則出版社肯定會為我辦一個大型的慶功宴(因為這絕對破了近年來台灣的程式書籍銷售記錄,雖不敢說前無古人,但是肯定可以說後無來者了...),如果出版社心情好一點可能還會大手筆請David Tao來現場演唱一下,搞一個尾牙型的晚會...

另外一個我最遺憾的是,常碰到有人說聽了周董或David Tao的某首歌之後很感動(我自己也是),但是從來沒有讀者跟我說看到我這本書第三章寫了AJAX的主題之後感動到不行(有人感謝啦,但是感動的倒是從來沒聽過),我認為這可能是程序員的宿命吧,我想,要寫出一個 "令人感動" 的程式可能很難吧...

不過最近由於Silverlight的出現,我倒是有了一點點讓別人感動的機會,如果你是曾經參加過10/24(高雄) 10/25(台北) 研討會的同志們大概就知道了,我當天有demo了一個我說我這半年來寫過最有意義的、最有價值、最令人(包括我自己)感動的程式、寫了這麼多年程式,終於有一點點讓人感動的可能...我看我以後改行作Silverlight Show好了...(相信我,最近我在準備年底的大事,發現這個產業比當資訊講師好賺多了...)

至於這個程式是什麼,還是做為當天參與研討會的同志們和筆者之間的小祕密吧...

底下是幾首我非常喜歡、始終熱愛、歷久彌新、久聽不膩的好音樂...感謝youtube讓好音樂可以珍藏

Angel


Forrest Gump:

如何在ASP.NET中上傳檔案到資料庫

上回談到了如何下載檔案,包含資料庫中的檔案,動態產生的檔案...等。
這次我們來看看怎麼把檔案上傳到資料庫中,這邊需要注意一個小地方,在上傳檔案到資料庫的部分,資料欄位的性態若是Access請選擇Ole物件,若是SQL Server請選擇Image格式。

接著您可以透過底下的程式碼進行檔案的上傳:

If Me.FileUpload1.PostedFile.ContentLength > 0 Then
  Dim cn As New Data.OleDb.OleDbConnection
  Dim dc As Data.OleDb.OleDbCommand
  Dim para As Data.OleDb.OleDbParameter
  Dim SQL, FileName As String
 
 '連線字串
  cn.ConnectionString = Me.AccessDataSource1.ConnectionString
  cn.Open()
  
'執行 TextBox 中的 SQL 指令
  FileName = Me.FileUpload1.PostedFile.FileName
  SQL = "insert into FileStorage (FileName,FileBody) values ('" & FileName & "',?)"
  
'建立 SqlCommand 物件
  dc = New Data.OleDb.OleDbCommand(sql, cn)
  para = New Data.OleDb.OleDbParameter("file", Data.OleDb.OleDbType.Binary)
  para.Value = Me.FileUpload1.FileBytes
  dc.Parameters.Add(para)
  
'執行(透過 Parameters 將檔案儲存到資料庫)
  dc.ExecuteNonQuery()
  ShowAlertMsg("上傳檔案儲存完畢!")
Else
  ShowAlertMsg("上傳檔案不存在!")
End If


  上傳至資料庫中的檔案,可以透過底下的方式重新下載回來,請特別這注意這張網頁在叫用的時候必須提供檔案編號做為URL中的命令列參數:

  Me.AccessDataSource1.SelectCommand = "select * from FileStorage where uid=" & Request.QueryString("FileID")
  Dim dv As Data.DataView = Me.AccessDataSource1.Select(New DataSourceSelectArguments)
  
'準備下載檔案
  Response.ClearHeaders()
  Response.Clear()
  Response.Expires = 0
  Response.Buffer = True
  Dim fileName As String = dv.Item(0).Item("FileName")
  
'透過 Header 設定檔名
  Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(IO.Path.GetFileName(fileName), System.Text.Encoding.UTF8) & Chr(34))
  Response.ContentType = "Application/octet-stream"
  
'傳出要讓使用者下載的內容
  Response.BinaryWrite(dv.Item(0).Item("FileBody"))
 
 '釋放資源
  Response.End()


整個範例請參考:
http://video.studyhost.com/Download/Example/ASP.NET/FileUploadAndDownloadWithDB.rar

2007年10月29日 星期一

如何在ASP.NET中下載檔案

  這是筆者常被問到的一個問題,如何透過ASP.NET來下載檔案,這個問題可大可小,我們先從小的開始。當我們要讓使用者下載一個檔案,最簡單的方式是透過Response.Redirect指令:

  Response.Redirect("test.doc")

  您可以把上面這行指令放在Button的Click事件當中,當使用者按下按鈕之後,網頁就會被轉址到該word檔,造成下載的效果。

  但是這樣的下載有幾個問題:

  1. 無法下載不存在的檔案:例如,我們若是想把程式動態(臨時)產生的文字,當作一個檔案下載的時候(也就是該檔案其實原先並不是真的存在,而是動態產生的),就無法下載。
  2. 無法下載儲存於資料庫中的檔案:這是類似的問題,該檔案並沒有真的存在,只是被存放在資料庫中的某個位置(某筆記錄中的某個欄位)的時候,就無法下載。
  3. 無法下載不存在於Web資料夾中的檔案:檔案確實存在,但該資料夾並不是可以分享出來的Web資料夾,例如,該檔案的位置在C:\winnt,您總不會想要把該資料夾當作Web資料夾吧?這時候,由於您無法使用Redirect指向該位置,所以無法下載。
  4. 下載檔案後,原本的頁面將會消失。

  典型的狀況是,我們要讓使用者下載一個.txt文字檔,或是.csv格式的Excel檔案,但是...

  1. 這個檔案可能是透過ASP.NET程式動態產生的,而不是確實存在於Server端的檔案;
  2. 或是它雖然存在於伺服器端的某個實體位置,但我們並不想暴露這個位置(如果這個位置公開,很可能沒有權限的使用者也可以在網址列上輸入URL直接取得!!!)
  3. 或是這個位置並不在網站虛擬路徑所在的資料夾中。(例如C:\Windows\System32...)

  這時候,我們就得採用不同的方式:

Shared Function DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FileBody As String)
  WebForm.Response.ClearHeaders()
  WebForm.Response.Clear()
  WebForm.Response.Expires = 0
  WebForm.Response.Buffer = True
  WebForm.Response.AddHeader("Accept-Language", "zh-tw")
  '檔案名稱
  WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34))
  WebForm.Response.ContentType = "Application/octet-stream"
  '檔案內容
  WebForm.Response.Write(FileBody)
  WebForm.Response.End()
End Function


  上面這段程式碼是下載一個動態產生的文字檔,若這個檔案已經存在於伺服器端的實體路徑,則可以透過底下的函式:


Shared Sub DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FilePath As String)
  WebForm.Response.ClearHeaders()
  WebForm.Response.Clear()
  WebForm.Response.Expires = 0
  WebForm.Response.Buffer = True
  WebForm.Response.AddHeader("Accept-Language", "zh-tw")
  '檔案名稱
  WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34))
  WebForm.Response.ContentType = "Application/octet-stream"
  '檔案內容
  WebForm.Response.Write(System.IO.File.ReadAllBytes(FilePath))
  WebForm.Response.End()
End Sub

上面這兩個下載檔案的的函式,應可解決大多數開發人員在ASP.NET當中的檔案下載問題。

2007年10月28日 星期日

教學影片:如何建立Silveright圖示選單(Silverlight的滑鼠事件功能介紹)

[線上瀏覽]

內容:
1.Blend2的使用方式(場景設計)
2.如何透過Blend 2建立Xaml Code與圖片(半透明設定)
3.如何使用Xaml控制項將Blend 2建立出的Xaml Code與ASP.NET頁面配合
4.撰寫簡單的JavaScript以建立圖示選單

[線上瀏覽]

資料來源: Silverlight權威講座--ASP.NET整合秘技與獨家案例剖析(董大偉 - 旗標)
(書上的影片更完整唷...^_^)

2007年10月25日 星期四

Silverlight研討會範例

感謝大家來參加10/24,25的微軟TechNET研討會
底下為研討會範例Silverlight家庭劇院組的原始程式碼下載連結。
您可以隨意的將這個範例應用在您自己的網站或是專案當中...
[下載] [線上檢視] [線上檢視大頻寬版]
enjoy~



再加一個25號當天現場作的簡單的圖示選單功能
[下載] [教學影片:如何設計]



2007年10月23日 星期二

微軟研討會:點亮黯淡無光網頁的新技術 - Silverlight

來參加微軟研討會吧...
10/24 高雄 漢來飯店 金鳳廳 9 樓
10/25 台北 台灣微軟 7A/7B

1.Silverlight精彩範例程式碼完全剖析
→ 廣告Banner, 動態圖表, RIA應用程式, 音樂故事,
 家庭劇院 (線上瀏覽電影預告片版本 建議先打開右下角電源開關,另外,因影片檔較大,若影片中斷請待載入完畢後再瀏覽 ,若您的網路速度不是非常快,也只是想看一下UI,請點選小影片檔案版本)
2.首度公開DynamicXaml控制項
3.新書內容發表

(微軟研討會相關連結)

Silverlight新書上市 - Silverlight權威講座 - 現正熱賣中


[博客來網路書店] [天瓏書店]
  這本書,著實花了筆者不少時間。
  從今年七月開始,筆者在台北、台中、高雄分別主講了十多數場微軟Silverlight相關的研討會與Hands On Lab,連TechED 2007也是以Silverlight為主題。
  微軟更是花大錢擺大陣仗來推廣這個新技術。當然囉,您可以慢慢嗅出接下來的Web技術主流在哪裡了...
  躬逢其盛,當然也不能缺席,沒有搶先在第一時間出版Silverlight的書籍(再一次向讀者說聲抱歉),實在是因為要整理太多的內容,一個新的技術,怎麼和過去我們所熟悉的ASP.NET來整合,是筆者比較關心的主題。也因此,您會看到在這本書當中,把最主要的內容鎖定在這個部份,在ASP.NET和Silverlight的整合議題當中,實在有太多太重要的內容需要向讀者介紹。(當然,我們也沒有忘記為讀者介紹Xaml與SOM)
  如果沒有ASP.NET的配合,Silverlight充其量也只會是Flash的另一個競爭對手(不過說實在的,這部份幾乎都是交由Designer來做,而非Developer來做,和開發人員相關性較低),但是加上了JavaScript、ASP.NET、ASP.NET AJAX技術之後,Silverlight搖身一變成為ASP.NET開發人員提升你的Web應用程式功能面和操作介面的一大利器。(對,其實還有功能面的提升,別以為Silverlight只能做UI...)
  同時,為了降低開發人員的進入門檻,我們特別為讀者打造了 DynamicXaml 控制項,免除 ASP.NET 程式員耗費時間學習 XAML 與 JavaScript,更進一步與 ASP.NET Ajax 技術整合,處理前端事件,讓 Silverlight 不只是絢麗的外表,還能真正應用到實務的程式中。透過 DynamicXaml 控制項,ASP.NET的開發人員即使不熟JavaScript、不會ASP.NET AJAX,都可以輕鬆的完成高階的Silverlight RIA應用程式(Rich Internet/Interactive Application)。
  說真的,就算ASP.NET開發人員只是為了一個動態圖表產生的機制,都值得您透過本書當中所介紹的 DynamicXaml 控制項來完成,Silverlight技術其實相當好用。對於ASP.NET開發人員來說,您會發現其實Silverlight有著更深一層的意義... (相關資訊請參考節錄自書中的試讀章節。)

Silverlight權威講座 - 新書序

  技術的更迭總是快得令人目不暇給,在資訊產業當中,知識的生命週期比其他行業要來得短很多,我想這已經是大半跟筆者一樣的資訊技術人員早已知道的事情;每隔幾年,您手上熟悉的開發工具或是技術就要全面翻新一次,速度之快,幾乎可以用匪夷所思來形容。
  今年(2007)三月,我們才剛從AJAX的風暴中走來,隨著一堆像是『Web 2.0』之類的新名詞的推波助瀾,這些新技術所帶給開發人員的,早已經從對新技術的期待與興奮,慢慢地轉變成對新技術的恐慌。
  不知道您有沒有這種感覺(我是一直感受深刻),Thomas Friedman在The World is Flat一書當中,對全球化競爭與替代的描述,在軟體業似乎比其他產業來得更早發生,我們生在這個時代,目睹很多產業的外移,特別是電子製造業 – 這個過去台灣軟體產業的最大客戶。
軟體產業很特別,因為你的產品是虛擬的,沒有形體,可以在網際網路之間傳遞,這也表示,開發人員可以在世界的各個角落,只要經過適當的規劃、組織、遠端的兩三個團隊彼此要分工合作並非不可能。
  距離當下消失!!!
  從管理面來看,當距離成本極小化時,工作會自然地流向成本最低、效益與產值最高的地方。果然,這就是現在台灣軟體產業正在發生的現象。
兩岸是否三通早已不是重點,軟體開發的工作可以在遠端完成(所花費的管理成本相較其他產業是來得低的),這表示競爭立刻面對全球化的挑戰,由於資訊透明度極高,價格與品質必須攤在陽光下;現在我幾乎買任何的電子產品,都會先上拍賣或是購物網站找到最低價,並且比較規格,往往最後的採購結果價格與品質都相當令我滿意。
  資訊透明,對買方來說相對有利…
  從職場的角度來看,提供服務的賣方(每一個工作者),慢慢也被透明的攤開在全球化的競爭之下,你的個人專業能力、學習能力…再也不只是跟Local同一塊區域的對手競爭,而是逐漸被拉到全球市場上競爭,就算外籍工作者目前無法直接來台灣長時間工作,但真有必要時,專案依舊可以從台灣發包到大陸或是印度,有效的降低成本。
  我要說的是,當距離不是問題,直接的競爭力就更是關鍵…。所有事情都有一體兩面,這表示如果你夠強、產品品質夠好、成本夠低,你比過去時代的人更有機會可以一口氣吃下全球的市場;但是反過來看,你也被迫要讓自己(或自己的產品)在全球上競爭,國界和距離慢慢無法保護你不遭受遠方競爭者的攻擊。
  就工作者的角度來看,面對全球化的挑戰,唯一的解決方案依舊是『專業』與『持續的成長』。迅速且有效的學習,用最短的時間掌握到重點,慢慢是這個年代當中相當重要的工作能力。
  也因此,我們希望能夠幫助讀者,以最短的時間,掌握到新技術的核心和重點,協助讀者將新技術以最有效的方式運用在自己的產品、專案、工作當中,為您的個人能力加值,成為全球化競爭下的勝利者。
  因此,我們特別希望,這本書能夠在您學習的路程當中,為您省去摸索、嘗試錯誤、甚至遭受挫折的時間,希望在這本書當中,筆者自己所走錯的路,您可以直接跳過;筆者所學習到的經驗,您可以直接吸收。
  除此之外,持續的學習是必要的,因此,歡迎您隨時造訪筆者的BLOG與網站,我們將提供給讀者更多的專屬資訊,包含技術教學影片、最新的文章分享、以及可下載的軟體元件或是工具。
  相關的網址是:
  BLOG: http://studyhost.blogspot.com/
  網站:http://www.studyhost.com/
  最後,我曾經在自己BLOG上寫過一段話,我說,有一個廣告詞我很喜歡 - 就是『Keep Walking』。
  我想,每個人都有自己的速度,不見得要跟著別人的腳步,依照自己的速度,走自己的路,才能夠走的久、走的遠;我常常提醒自己,人生裡最終的成就往往都是留給持續走下去的人,而非短時間走的最快的人。
  與讀者共勉之~
  於 台北‧台灣
David Dong

2007年10月17日 星期三

教學影片:如何利用Blend2設計Silverlight並配合ASP.NET

[線上瀏覽]
內容:
1.Blend2的使用方式
2.如何透過Blend 2建立Xaml Code與動畫
3.如何使用Xaml控制項將Blend 2建立出的Xaml Code與ASP.NET頁面配合
4.如何撰寫簡單的JavaScript達成使用者互動
[線上瀏覽]
資料來源: Silverlight權威講座--ASP.NET整合秘技與獨家案例剖析(董大偉 - 旗標)
(書上的影片更完整唷...^_^)

2007年10月15日 星期一

教學影片:如何在Silveright當中建立按鈕

如何在Silveright當中建立按鈕 - 1 [線上瀏覽]
如何在Silveright當中建立按鈕 - 2 [線上瀏覽]

資料來源: Silverlight權威講座--ASP.NET整合秘技與獨家案例剖析(董大偉 - 旗標)
(書上的影片更完整唷...^_^)

2007年10月12日 星期五

Way back into love

這首歌是 休葛蘭 在K歌情人(Music And Lyrics)中的一首歌,放上來,只是因為覺得好聽...
然後很有趣,我在找這首歌的MV時,找到了一個網站叫做 CSI:GSR - CSI我知道,那...GSR是什麼呢???
後來我終於懂了^_^...請拖曳到下面...看另一支video...(很有趣)

I`ve been living with a shadow overhead 我終日生活在陰影中
I`ve been sleeping with a cloud above my bed 就連睡在床上;烏雲也是緊跟不放
I`ve been lonely for so long 我已經孤單寂寞了好久
Trapped in the past, I just can`t seem to move on 不斷漫遊在過去,卻一直沒有機會向前行
I`ve been hiding all my hopes and dreams away 我把所有的希望及夢想藏匿
Just in case I ever need em again someday 只是為了今後我還有機會需要它們
I`ve been setting aside time 我努力爭取時間
To clear a little space in the corners of my mind 為了能保持我心中一塊小小的角落能夠潔淨無瑕
All I want to do is find a way back into love 我只想盡一切可能,把愛找回來
I can`t make it through without a way back into love Oh oh oh 如果沒有了那份愛;我一定撐不過來
I`ve been watching but the stars refuse to shine 我一直在等待那不願閃亮的繁星
I`ve been searching but I just don`t see the signs 我一直在找尋,但卻毫無頭緒
I know that it`s out there 我知道它就在某處
There`s got to be something for my soul somewhere 在某處一定有著什麼力量能解放我的靈魂
I`ve been looking for someone to shed some light 我一直在尋找一個能為我閃耀光芒的人
Not just somebody just to get me throught the night 並不是一個僅僅陪我一夜的人
I could use some direction 我會試著給你一個方向
And I`m open to your suggestions 並接納一切你給我的建議
All I want to do is find a way back into love 我只想盡一切可能,把愛找回來
I can`t make it through without a way back into love 如果沒有了那份愛;我一定撐不過來
And if I open my heart again 如果我再一次敞開心房
I guess I`m hoping you`ll be there for me in the end 我想我會期盼你就這麼陪我到最後
There are moments when I don`t know if it`s real 此時此刻;如幻似真
Or if anybody feels the way I feel 或許會有某人跟我有著相同的感覺
I need inspiration 我需要一點靈感
Not just another negotiation 而非一次又一次的妥協
All I want to do is find a way back into love 我只想盡一切可能,把愛找回來
I can`t make it through without a way back into love 如果沒有了那份愛;我一定撐不過來
And if I open my heart to you 如果我對你敞開心房
I`m hoping you`ll show me what to do 我會希望你告訴我該怎麼做
And if you help me to start again 如果你希望一切從新來過
You know that I`ll be there for you in the end 你知道我會就這麼陪著你走到最後

請看http://www.GrissomSaraRomance.com/
很有趣的網站...

2007年10月11日 星期四

Silverlight的文字輸入功能

  眾所周知,在目前這個階段,Silverlight並沒有所謂的TextBox控制項可以輸入文字,因此,想要在Silverlight當中輸入文字必須使用ASP.NET的TextBox控制項來充當文字的輸入功能。
  這部份該如何作呢?這就要討論到Xaml控制項的WindowsLess屬性了,其實該屬性是Xaml控制項當中相當重要的屬性之一,它讓ASP.NET的控制項與Silverlight之間可以彼此合作,例如下圖這樣的狀況:
  上圖中的文字輸入功能,其實並非是Silverlight所提供的,如您所知,Silverlight目前並沒有所謂的控制項,因此也沒有辦法直接輸入文字,但是我們可以和ASP.NET的TextBox控制項加以配合,讓Silverlight模擬出輸入的功能。
  其實設計的方式很簡單,我們只需要透過Blend2把外框先繪製好:

  接著把xaml code引用至Xaml控制項中,然後關鍵的部份來了,請務必把Xaml控制項的WindowsLess屬性設為True,同時在Xaml控制項上『疊上』TextBox物件(注意要把TextBox的Style設為position: absolute且將ZIndex設為大於Xaml控制項,並透過『樣式』功能,把TextBox的邊框消除:



  完成後,其HTML指令碼如下:


  請注意,這個技巧在設計RIA時相當常見,讀者可參考書附光碟中的範例『SilverlightStudyHostCom\Demo\AniBackground\Default.aspx』來瞭解設計的方式。
  我們未來會介紹如何透過這樣的方式,讓使用者在Silverlight介面上輸入文字,並透過AJAX技術傳遞給後端的ASP.NET程式。

資料來源: Silverlight權威講座--ASP.NET整合秘技與獨家案例剖析(董大偉 - 旗標)

2007年10月9日 星期二

以OpacityMask設計半透明遮罩

  OpcityMask是一個相當好用的屬性,透過OpcityMask與Brush的配合,您可以將任意圖性加上一個透明度遮罩,我們先看一個簡單的例子:

  上圖左方是一個標準的圖形,而右方則是加上OpacityMask遮罩之後的結果,其Xaml碼如下:
  

  您會發現,我們可以透過OpacityMask用筆刷來刷某一個元素,刷的方式是採反透明遮罩的方式。請參考下圖,假設原始圖案是最左方的圖形,而遮罩(Opacity Mask)若是下圖中間這樣,則刷出來的圖形則是下圖右方:



  請參考範例(下載),我們利用繪圖軟體建立了一個底下這樣的圖檔(名稱為OpacityMask.png):


然後撰寫底下的xaml碼:


  呈現出的結果如下圖:


  透過這樣的技術,我們可以輕易的在畫面上呈現出相當有美感的圖形,例如以特定的手繪的愛心外框,作為照片的遮罩,作出坊間影像處理特效。

  不僅是圖形的部份,就算是影片,Silverlight也可以利用遮罩來呈現出特殊效果:
  程式碼如下:
  請讀者務必注意,用以作為遮罩的圖檔必須是支援透明背景的圖形格式(請特別注意是透明的圖片背景,而不是白色的圖片背景),讀者可參考書附光碟範例中的圖檔OpacityMask.png,以瞭解此格式。
本文範例(下載)
資料來源: Silverlight權威講座--ASP.NET整合秘技與獨家案例剖析(董大偉 - 旗標)

2007年10月6日 星期六

Silverlight的開發工具

實在是太多人問到Sivlerlight的開發工具了,如果您現在要開發 Silverlight應用程式也好、RIA也好、想要在ASP.NET當中整合Silverlight也好,請安裝底下這些開發工具,注意,請依序安裝。底下說明每一個工具的用途以及為何需要安裝...

筆者建議您『務必依序』安裝底下套件:
◎ Visual Studio 2005 → 這個做什麼的不用說吧,請最好不要用Express版本
Silverlight 1.0 Run-time(Windows版本) → 用來將你的瀏覽器外掛Silverlight顯示功能
Visual Studio 2005 Services Pack 1 → 要先裝這個之後,後面Silvrlight 1.0 SDK才裝得起來)
Silvrlight 1.0 SDK → 裝這個之後,VS2005中就會有 Silverlight 樣板專案(位於C#)
ASP.NET AJAX 1.0 → 要先裝這個之後,後面的 Futures Release才裝得起來,而且,安裝之後,Silverlight 才能夠透過AJAX技術讀取後端資料庫
ASP.NET Futures Release → 讓ASP.NET可以輕鬆整合Silverlight
.NET Framework 3.0(中文版) → 要先裝這個之後,後面的 Blend 2 才裝得起來
Expression Blend 2(英文版) → 該死的VS2005沒有所視即所得,所以需要用Blend 2幫開發人員用拖拉的方式設計Silverlight的UI(請參考此篇此篇文章),除非你的Xaml指令碼像奚同學一樣滾瓜爛熟。此軟體也三五不時有新版,請自己找一下...

完成之後即可開發各式各樣的Silverlight應用程式。
20080706更新Blend 2已經有正式版下載

Keep Walking(轉貼去年寫的BLOG)

這篇文章,其實是去年12月寫的, 換了BLOG,但是捨不得丟掉,所以移過來...
從去年,到今年又改變很多了,VS2008又級將推出,時間過得真快...

  
  昨天和一位同樣在資訊出版界的朋友小聊了一下,不知不覺的居然天色突然變暗,果然冬天來了,儘管今年是暖冬,不過天黑得還真快。三、四個小時中談到不少近十年資訊領域的變化,趁著記憶猶新,跟大家分享一下。

  在我們那個年代,程式設計是從MS-DOS開始學起的,施威銘的『Assembly程式設計』大概是對我幫助最大的書。回想這10年,變化還真是大,十年的時間物件導向主宰了程式設計的走向,Design Pattern引領了程式設計師的大腦,Web應用程式經過了一段網路泡沫化的淬練之後,開始走上主流的康莊大道,兒時(真的是兒時)和我一起寫程式的聶哥現在不知道到什麼地方去了(我始終佩服可以在一片360k的磁片和有限的記憶體內寫程式的高手,聶哥如果看到這篇文章,跟我聯絡一下吧!)。

  在我寫『Visual Basic2005程式設計與案例剖析』一書時,曾經很掙扎資料庫那一章的寫法,我究竟要不要把那一坨ADO.NET的類別詳細的介紹呢?還是用拖拉法把資料和控制項binding一下就搞定?最後我選擇前者而放棄後者,終究還是在書籍中稍微討論了一下ADO.NET的架構,儘管我猜想很多讀者可能會選擇直接跳過那一節,而直接使用我們幫讀者準備好的DbAccess類別,甚至可能某些讀者因為沒看到很炫的『拖拉完成式』程式設計法,以致於不選擇我的書…不過,好歹對得起自己的良心和讀者的支持。(當然,『Visual Basic2005程式設計與案例剖析』一書的資料庫章節僅是入門的入門,後續筆者會有更完整的資料庫程式設計書籍之計畫,相信不會讓讀者失望)

  現在在.NET的架構底下,透過VS2005要完成一套系統已經相當簡單了,但是我們開始發現另一個問題,初學者慢慢的迷失在眾多炫麗的控制項和包裝好的機制底下,無法明白究竟電腦中的程式究竟是怎麼跑的,我們也發現不管是中英文書籍,介紹技巧(Skill)總是遠多過於技術的方法(know-how),可能讀者也會說,我管它這些東西是怎麼完成的,我能寫出一套系統(或完成作業)就好了啦,是沒錯,和過去15-20年前,我們還設法將程式盡量縮小,塞在1M的主記憶體當中,現在動輒以G計算的主記憶體和File Swap技術,我管它也出來的程式效能和大小如何咧,反正強大的Widows和Intel CPU會幫我搞定,我常說事情沒有對錯,只有是否適合而已,當七年級生這麼說的時候,除了把五年級的主管氣死之外,有沒人能夠說你怎樣,某種角度來看這也真的是一項事實。

  但是就像當年學習『Assembly程式設計』一樣,我至今始終沒有用過『Assembly』寫過什麼偉大的系統(除了測試一下那時很熱門的Friday病毒程式寫法),但是我依舊要說,那段時間的學習是奠定日後程式設計基礎功力的重要關鍵。

  很有趣,完全無關的一種程式設計語言,卻給我最大的幫助;同樣的,學習C語言的時候,則是讓我對結構化程式設計、記憶體運作、乃至於日後為何要轉換成OOP奠定下了深厚的基礎,D-Base是我第一套學習的資料庫系統,Clipper則是我第一個撰寫資料庫產品所使用的程式設計語言,COBOL、Pascal、Fortran乃至於日後的Delphi(我還強烈的支持了一陣子)、C++、Java、VB、C#…每一種語言多少都陪我走過了一段或長或短的時間…

  我不知道當年為何要學那些語言(我真的忘了),我只記得,我想要了解,更深入的知道電腦究竟怎麼運作的,各種程式設計語言之間究竟有何差異,最後有大半的語言我沒有真的拿來在工作上使用,但是,無庸置疑的,幫助確是很大。

  現在的初學者,可能很清楚知道怎麼透過控制項來設計程式,但是往往不知道為什麼要使用控制項,控制項的原理為何?很可能知道(也熟悉)如何透過DataBinding的機制把資料庫欄位連結到畫面上的控制項,卻不知道為何要這麼作?如果沒有這些DataBinding的機制時,要怎麼連結資料庫?絕大部分開發人員一定知道『物件導向程式設計』這個字,也每天在程式當中使用了物件的屬性、方法,但是卻不曾嘗試設計過一個物件,或是繼承一個類別…

  更重要的是,初學者似乎對這些也不是很有興趣!!!

  我在想,這應該不全然是初學者本身的問題,我們這些在進行教育訓練和技術分享的講師、作者,可能或多或少也得負上一點責任。這是一個講究速食的時代,我昨天晚上開車到得來速,從買一個三號餐到吃完,大概只花了7分鐘,快速,但是卻沒什麼營養的一餐。

  我們發現,『學習』慢慢也染上這樣的趨勢,畢竟這是一個高度競爭的時代,時間就是金錢?不,時間已經不只是金錢,時間根本是一切的關鍵。很多讀者提到,在.NET 2.0還沒模熟的時候,微軟.NET 3.0(特別是WPF)已經鋪天蓋地排山倒海而來(筆者會針對WPF、Ajax、Web Solutions這個主題再寫一篇文章,也是當天和朋友談了一下午的結果和感想,希望對讀者們安排自己學習WPF的時程有些幫助),這些每天更新的技術,你現在打算是學?還是不學?

  Vista和Office2007已經推出,出版社第一時間推出了書籍,Office2007終於把自己調整像樣了一點,人性化了很多(沒用過?這篇文章就是用Word2007寫的,挺順手~),但是相信我,不少Office還在使用Office2000呢。(對了,如果你要安裝Office2007,也得先換成WindowsXP或Windows2003。如果我是用Windows 2000呢?喔,你被放棄了…)

  時間不夠,同時需要完成很多事情,又得學習最新的知識,這都是IT人員的無奈(相信我,我們也很清楚,並且深受其害),同時關鍵技術始終掌握在別人的手上,引領趨勢的也是別人,orz。

  但是,總是得生活嘛,我又不會炸雞排或是蚵仔煎,只好在這條路上持續努力。不過哪天,如果我真的去開一家Java咖啡廳(放心,我練過espresso),屆時再請讀者朋友們蒞臨指導,我一定在網路上放個讀者專享值價券,當然,咖啡廳裡面絕對也有寬頻上網,每周再來個技術分享,邀請各大作者、各領域技術導師、或是讀者和大家一起聊聊。

  不過在此之前,還有一段不短的辛苦路要走,我很喜歡的一個廣告字是『Keep Walking』。
  
  其實,每個人都有自己的速度,不見得要跟著別人的腳步,依照自己的速度,走自己的路,才能夠走的久、走的遠;我常常提醒自己,人生裡最終的成就往往都是留給持續走下去的人,而非短時間走的最快的人。

  很多話短短的這篇文章寫不完,下回再找時間和各位分享了。

Keep Walking ~

Silverlight的 InLine Xaml 功能 - 讓您可輕易的動態產生Xaml碼

  過去我們一直都是透過.xaml檔案中的內容來設計Silverlight中的每一個元素的外觀長相,有沒有想過,如果需要動態的產生xaml碼,而不想透過.xaml檔案來完成的時候該怎麼辦?
  有這種需要嗎?有的,而且對於ASP.NET開發人員來說,這類的需求俯拾皆是。
  能夠先把.xaml檔案設計好,是我們假設早已經知道整個Silverlight功能要顯示的內容、圖形、或是動畫等資源的個數與位置,如果這些資訊事先都不知道,得要在執行階段以ASP.NET的程式碼來動態決定的時候,顯然就無法透過預先寫好的.xaml檔案來完成。
  最典型的例子是『電子相簿』功能的Silverlight程式,當我們要寫一套程式來處理『網站上所有使用者』的電子相簿功能,每一個使用者的每一本相簿當然都會有不同的圖檔(相片),不可能都是固定的那幾張,所以圖檔的位置、個數,我們事先都不知道,在執行階段才有可能知道這些資訊,因此我們幾乎不可能事先寫好.xaml檔案,而是要在執行階段動態的產生.xaml碼的內容。
  又或者,我們要用Silverlight建立一個動態選單,但是如果.xaml碼是固定的,那選單內的選項、層級、點選後的HyperLink位置顯然都無法任意調整,每次調整都要修改.xaml檔案,如此一來相當不方便。
  如果我們可以動態產生.xaml檔案,就有著無限的可能性,像剛才提到的選單、電子相簿…等功能,我們都可以在ASP.NET程式的執行階段,動態決定其內容,甚至可以把Silverlight功能包裝在UserControl或是WebControl裡,如此一來,使用Silverlight就跟使用控制項一樣簡單。
由於上述種種原因,Silverlight的.xaml檔案必須動態產生的需求相當明顯。
  在Silverlight 1.0正式版當中,動態產生xaml碼的功能有著相當不錯的簡單做法,我們稱之為『InLine Xaml』。
  過去我們都是利用Blend 2或是Visual Studio 2005先寫好.xaml檔案,若是透過InLineXaml的方式,我們就不需要受這個限制了,請看底下的.aspx頁面:
  透過這樣的方式,我們可以把Xaml碼寫在.aspx當中,就不需要再額外建立.xaml檔案了。

  您可能會說,那這樣只是少寫一個.xaml檔案而已,跟『動態產生』Xaml碼有什麼關係?
別忘了,我們還有ASP.NET的『RegisterClientScriptBlock()』指令可用。

  我們可透過ASP.NET程式碼,配上InLine Xaml的功能,即可動態的產生.xaml碼餵給xaml控制項,以動態顯示需要的.xaml內容。例如,請看底下的.aspx頁面:
  我們只有在頁面當中佈置一個Xaml控制項(和一個Button,我們希望按下Button之後,可以動態產生出Xaml檔案,這個.aspx頁面的HTML碼如下:

  接著,我們在按鈕上Double-Click,撰寫底下程式碼:

  如此一來,我們連.xaml檔案都不需要撰寫,就可以在網頁上建立出Silverlight的內容:


  這樣的好處是,不只少寫了一個Xaml檔案,更重要的是,我們可以透過ASP.NET的程式碼,隨意的動態建立出程式當中所需要的Xaml內容。

  例如,我們將ASP.NET程式碼修改如下:


  很輕鬆的,我們就可以透過ASP.NET程式碼在Silverlight當中建立出多個Rectangle,甚至用程式碼調整其位置:


  再修改一下,我們連顏色也可以動態產生:



  執行結果如下:
  資料來源: Silverlight權威講座--ASP.NET整合秘技與獨家案例剖析(董大偉 - 旗標)

2007年10月5日 星期五

Silverlight的中文顯示問題

  在Silverlight 1.0當中,中文字無法以內建的字型直接顯示,但您可以透過Blend 2在設計階段將文字轉換成Path,即可解決此問題。
  操作步驟如下,請先透過TextBlock繪製好文字,接著點選主選單的『Object-->Path-->Convert to Path』:
  Xaml碼會轉變成:
  採用這個做法也有一個好處,您可以隨意的顯示任何字型,至於動態產生的字型,我們在後面談到ASP.NET與Sivlerlight整合時會繼續為讀者介紹。

2007年10月3日 星期三

Sivlerlight的開發工具 - VS2005還是Blend2

  Sivlerlight最近開始很紅囉, 可是您一定會覺得,在這個階段撰寫Xaml碼似乎有點辛苦,主要的原因是Visual Studio 2005雖然提供IntelliSense,但卻不支援所視即所得,而支援所視即所得的Blend2卻又不支援IntelliSense,動畫的設計在VS2005當中也不容易完成。
  我自己在開發Silverlight網站或是應用程式時,都是透過Blend 2的拖曳功能來建立xaml碼和動畫Storyboard,但是同時間會一併開啟Visual Studio 2005,透過IntelliSense功能來編輯Xaml指令碼。
  典型的做法如下,讀者可以在設計時Silverlight時,先開啟Blend2,在畫面上把Xaml元素或是相關的動畫佈置處理好,然後在Project視窗當中,按下滑鼠右鍵,點選『Edit in Visual Studio』:

  接著系統就會自動開啟VS2005,讓您編輯『同一個專案』當中的檔案,在VS2005當中,就有IntelliSense可以使用了:


  這樣的好處是,若您在VS2005環境當中改過了Xaml碼(因為VS2005支援IntelliSense所以改起來還蠻方便的),存檔之後切換回Blend2,會看到:


  Blend2會主動發現該檔案已經被另一個(VS2005)程式修改過,並且問您是否要重新載入。這樣的功能相當方便好用,我們可以用兩個軟體同時編輯同一個.xaml檔案,又能夠保持一致性。
  反之,當您在Blend2改過xaml code之後,切換到VS2005時,VS2005也會問一樣的問題:


  這樣的功能讓VS2005和Blend2之間可以互相彌補彼此的不足,在這個階段不失為相當好的操作方式。

2007年9月22日 星期六

是不是真的?我們都那麼喜歡Silverlight?

  擔任TechED2007 Silverlight場次研討會的講師,會後有一些學員留下來,大夥兒有一些分享,其中有位學員很直接的問到了一個問題『到底,Silverlight真的那麼有價值嗎?很多作者和講師跟我們說這是未來的重要技術,身為講師的你們,真有那麼喜歡?你們現在就會把它使用在自己的產品當中嗎?』
  的確,微軟也不是沒有做過錯的策略,打過不賣錢(沒市場)的產品或技術,Silverlight這次轟轟烈烈而來,到底會變成一個空包彈,還是真的可以扎實的打中對手的要害?
  這次會場上很特別,TechED和天瓏有一個合作,很可惜我的Silverlight新書確定趕不及在TechED這幾天上次,但是我不擔心,我想,很久沒有好好的寫一些自己很喜歡的主題。寫作的過程是一種享受,我寧願慢慢來,多在Starbucks享受逐字推敲的樂趣,把自己心裡對產品的感想(或是感動)完整的整理出來。
  對於開發人員來說(特別是ASP.NET開發人員),我持續要強調的是,Sivlerlight絕對可以擴展你的疆界,讓你有一扇窗,可以看到不同的視野。
  為了準備TechED 2007的內容,David真的很認真的寫了很多Silverlight範例,如果當天你有在會場,那幾個範例雖不敢說有代表性,但是相信不管你用Sivlerlight的目的是要與ASP.NET整合,或是取代Flash,甚至是真的想開發出一套RIA,我要說,當天的展示應該讓你對Silveright更有信心。
  我想要作的, Silverlight似乎都能為我做到,過去我們在ASP.ENT所遭遇到的問題,看起來慢慢可以在Silverlight當中找到解決的答案。
  過去ASP.NET和Flahs之間的難以整合,改用Silverlight後將一掃而空。
  當然,Silverlight這個階段不是沒有缺點,例如中文字的顯示、文字的輸入、控制項的功能,不過,這些在當天的研討會當中,學員可以看到我們逐一將其解決,並且整合成一組方便使用的控制項。
  我要說的是,Sivlerlight確實相當討喜,為了準備TechED範例,寫了不少Silverlight程式,寫著寫著,我開始慢慢動腦筋想把自己的所有網站(書籍專屬網站)全面支援Silverlight,並且實作一些東西讓各位可以親身體驗。
  我的網站架設在台灣的某個Hosting站台,所以也剛好可以測試一下在真實環境上執行的能力。老實說,不需要測試,這段時間的相處,讓我對Sivlerlight算是相當有信心。未來你會慢慢看到David的網站整個加上Silverlight的功能和顯示效果。
  研討會的時間不是很夠,但是有一句話是我一直想強調的,讓每一種資訊技術發揮其擅長之處,而非一直繞路完成一些很炫,但是意義不大的功能。當天我提到了我對RIA看法:
  • 只是搞炫還不夠,既然是RIA, AP該有的功能還是要有
  • 客戶要很炫的東西沒錯,但是很炫的東西該動的時候還是要能動…
  • 一個好的系統,要能發揮電腦的長處…別讓『 Rich 』這個字變成你最大的Cost
  • 即使『 Rich 』這個字是RIA的重點,但『Application』畢竟還是RIA的本質
  • 對於ASP.NET開發人員來說,Sivlerlight無疑開啟了另一個嶄新的視界
  • 透過Silverlight可以輕鬆建立出前後端各自充分發揮、同時又密切整合的Web應用程式
  • 對ASP.NET開發人員來說,是增加了更多更好的技術供您選擇,而非取代

  在David的Sivlerlight專書當中,我們會仔細的介紹整個Silverlight的關鍵技術,並且讓您的ASP.NET和Sivleright完美的整合,輕鬆的開發出超乎您過去想像的應用程式。