2006年9月10日星期日

預覽Windows Vista中的IIS 7.0

上星期Windows Vista RC1 推出,有很多功能都接近成定局.

我自己而言,IIS 是我最關心的. 始終我是寫ASP.NET的.唯一支援的Server就是Windows IIS.不過我沒有實際試用IIS 7.0,但在官方ASP.NET Blog上,看到幾張Screen Shot,大概都能理解IIS 7.0一些新功能.看到三張圖片,我即時想起Plesk 的Control Panel.

明顯地IIS更User-Friendly,把Machine.config和Web.config部份搬出來.另外[.NET Globalization] 和[.NET Profile]兩項則令我注目.其實Microsoft只差一步就可以令提倡LAMP (Linux , Apache , MySQL ,PHP) 的人沒有藉口.

Visual Studio Express, MSSQL Express都已經是免費. 如果把IIS 7.0獨立成一個項目,可安裝在WinXP上.一直以來LAMP的成本優勢,根本就不存在.一套WinXP都只是千多元.

而且往後幾年,當企業都升級上Vista後,多出來的WinXP的可充當Server平台,都不錯. 其實Microsoft已經"豪爽"了很多...
Visual Studio Express, MSSQL Express, Virtual PC 都已經完全免費,不彷豪爽多一次.

2006年9月5日星期二

解讀郵件中的UUEncode附件 (續)

前天說了遇上一個大問題,就是不知解讀UUEncode.今天有了突破性發展.

參考了幾個C#的UUDecode程序後,雖然只有二百行的Source
Code.但是憑我對C#語法皮毛的認識.轉至VB.NET都搞了我一整天.

做測試時,在System.IO下的Stream / MemoryStream / FileStream / Bytes / BytesArray等等統統搬了出來,但最後亦是自己複雜化問題.C#的UUDecode Source Code可看這裡.
Implementation of UUEncoding in C#
我的做法是,用StringBuilder,寫入由BEGIN至END的UU碼,再轉至Bytes.
經UUDecoding後,用FileStream把Bytes再寫成binary File即可.

2006年9月4日星期一

.NET Framework下,如何解碼UUencode?

現在100%根性製作中的ASP.NET版本NNTP Reader已經有樣子看....
解決了效能問題,現在Download 400個Title都只需要最多兩秒,當中最困難是要寫很多Error Exception,例如很多人貼文沒有email或者名字都會出現問題.寫這些Error Handler反而用上我很多時間. 不過當中考量的問題很多.

說真的,ASP.NET的Newsgroup Reader,網上實在少之有少,可參考的,實在不多.但好彩在Microsoft的技術討論區上,多次得到台灣微軟MVP相助.有一些已經解開迷團



1.DataTable 還是DataSet? GridView還是TreeList?
這問題較簡單,一般網上看到的示範都會把DataTable轉至DataSet集合中.
給GridView做DataSource. 但是次製作我只需要一個DataTable,故沒需要使用DataSet.只需使用DataTable,收取所有資料後,轉至DataView便可.不需動輒都用DataSet.
至於Layout方面,考慮到Newsgroup會有[回應]文章,要做到類似Outlook Express般,回覆跟隨主文,必要要用上TreeList,但可惜.NET中沒有TreeList控件,就算有.要把Reference對照文章ID再加入TreeNodes都是十分複雜的事.雖然我嘗試在GridView中加入TemplateField,並放上Treeview,但實際出來的效果並不好.這問題日後再解決.

2. ArrayList還是Array?
這是一個較多面化的問題,兩者很相似,因為應用在不同地方有不同的好處.
以下是MSDN上Array和ArrayList的要點:

- ArrayList 並不保證已經經過排序。進行需要 ArrayList 的作業 (例如BinarySearch()) 之前,一定要先排序 ArrayList
- ArrayList 的容量是可以保存的項目數。ArrayList 的預設初始容量為 0。隨著元素逐漸加入 ArrayList 內,也會視需要透過重新配置的方式自動增加容量。若要降低容量,可以呼叫TrimToSize()或明確地設定Capacity屬性。
- ArrayList 接受 Null 參照 (即 Visual Basic 中的 Nothing) 做為有效值,並允許重複的元素。
- Array 的容量是固定的,ArrayListList 的容量卻是按照需要自動擴充的。如果 Capacity 屬性的值變更,記憶體重新配置和元素的複製會自動完成。
- ArrayListList 提供加入、插入或移除元素範圍的方法。在 Array 中,您一次只可以取得或設定一個元素的值。
- ArrayListList 提供了方法,可以將唯讀和固定大小的包裝函式傳回給集合;但 Array 則否。
另一方面,Array 提供了某些 ArrayListList 所沒有的彈性。例如:
- 您可以設定 Array 的下限,但 ArrayListList 的下限永遠為零。
- Array 可以擁有多個維度 (Dimension),而 ArrayListList 則永遠只有一個維度。
- 特定型別 (Object 以外) 的 Array 具有比 ArrayList 更佳的效能,因為 ArrayList 的元素型別為 Object,而且儲存或擷取實值型別 (Value Type) 時,通常會產生 Boxing 和 Unboxing 的狀況。然而,List 如果不需要重新配置,亦即如果初始容量是清單大小上限的概數,它便具備了與相同型別的陣列相近的效能。

大部分情況下,可以使用 ArrayListList 來取代陣列呼叫;它們比較容易使用,並且一般而言,具有與相同型別的陣列相似的效能。

3.如何做UUDecode?
先前的Base64 Encode已解決,現在的,是我的終極問題,因為這是牽涉到郵件中的附件解碼.
一般NNTP附件都是以UUEncode去篇碼,雖然我已經準確地得到由Begin至End中的編碼,但是怎樣Decode,再送給FileStream已是一個大問題.參考過C語言,PHP語言的Library,憑我的能力去寫一個Class是沒可能的.在Google上找,給DotNET的,同樣是少得可憐...最後在Google上找到一個C#的...我嘗試過Decode相片會出錯誤,不知為什麼.大家可以看看.

uuEncode and uuDecode in VB.NET and C#