Pages

2009-12-05

高速SMG下載方式

常見的BT下載雖然符合多人共載的分配原理,但常常受限普羅大眾作種及限速的關係,並不算快。
如果你家是hinet光纖網速(10M/2M),那麼若能直接下載來自Hinet主機的檔案,速度是很快的
(ISP通常不對自己的線路作設限)。

有善心人士就利用hinet空間,把檔案切細檔再壓縮,放至hinet私人空間讓人下載,
為了保護來源位置,就把該URL編碼,再透過特定軟體下載它,獲得驚人的下載速度。

這樣的特定軟體就是SmartGet,一般就簡稱SMG的分享方式,速度通常都是1MB/sec左右:
SNAGHTML6563582
教學文章: http://blog.yam.com/kuei0116/article/16521674

由於來源位置都在個人hinet或一些高速空間上,這類的資源分享也著重在VIP階層裏
因此通常有下載時限(如5天),因此必須從一些私密的SMG論壇裏獲取較新的加密SMG網址
下載時必須輸入該論壇的會員驗證id/pw,才能進行下載,如著名的無限論壇

是的,SMG下載方式時效短,下載URL加密又得輸入論壇的ID/PW(軟體會幫你記憶),
但它保障了論壇VIP會員驚人的下載速度,讓有貢獻的人(出錢出力)不用浪費下載時間。

假如你厭倦了窮人式的下載等待,或許你可試試SMG下載,真的很棒!

2009-11-24

切換網域AD帳號及權限

假如你在AD網域下存取某些具有權限保護的目錄,你可能需要在程式中切換目前的AD帳號
那麼可以像下圖這樣示意:
SNAGHTMLd94396e

實作方式請參考黑暗大的文章: CODE-C#變身術懶人包
MSDN: http://support.microsoft.com/kb/319615

2009-11-16

刪除Win7的檔案關聯

某天在實驗PowerShell的雙擊直接執行的功能時,把".ps"加入了檔案關聯
結果執行時引起開視窗無窮迴圈,重開機後需要這.ps關鍵刪除,卻發現苦無辦法:
SNAGHTML1a5734

查了google,通常是介紹用命令介面下的ftyle, assoc兩道指令,但它們只能改變關聯設定,
卻無法刪除這不要的副檔名,後來找到這工具:
http://www.winhelponline.com/articles/231/1/An-Utility-to-Unassociate-File-Types-in-Windows-7-and-Vista.html
SNAGHTML1cc725

XP下的檔案關聯倒是可以管理,比較先進的Vista及Windows7卻無法刪除,幸好有這救命工具。

2009-11-13

ListView雙選擇項目

在Windows Form介面程式設計裏,常會發現以下的畫面:
SNAGHTMLe3289e1

除非靠商業元件,否則這些移項的功夫要自己處理
例如項目雙擊就移入對面的ListView,不能重複且能Drag Item排序等等。

這些雜工要避免,就是把相關的操作及滑鼠事件控制都寫入一個統籌的Class類別,
由它綁定相關事件。
SNAGHTMLe36c922

簡易的UI Reuse,也能使用User Control方式來包更加模組化,但這種是最簡單型的。

2009-11-06

專案資料備份方式

軟體專案開發階段通常以SVN來備份修改版本,但一個專案不僅包含源碼文件
也包括User功能需求、規格、報價單、歷次Debug修改記錄等等資料
通常我們會以目錄方式,分類存放。

在專案保固期內,每當User提出調整或Debug時,我有習慣順手備份線上DB資料庫
每經過一段時間,就把所有目錄作一次完整備份。
可想而知,備份的目錄內檔案數量極多,假如單純COPY到另一磁碟上,
未來要搬移或刪除會很麻煩 (碎檔太多)。

壓縮存放會在備份時花不少時間,因此經過思量,決定備份為ISO檔
它把所有檔案綁成單一檔,方便管理。
SNAGHTML2d9dc1a

當然,這些專案備份ISO,是存放在磁碟陣列裏。
書到用時方恨少,危難發生時平時的備份也是同樣道理。

2009-10-31

AJAX Toolkit的TabContainer顯示問題

發現微軟所出的AJAX Control Toolkit之TabContainer控件有顯示上的問題 (實驗版本: 30930, 2009/10/06)

該頁宣告為XHTML 1.0版本,則Tag顯示上並無問題:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
SNAGHTML1ba2ea6

若該頁宣告為HTML 4.01版本,則Tag顯示上會被遮去一半:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
SNAGHTML1b8f84b

實驗其他AJAX Toolkit舊版本也如此,調了CSS或把Tab Header顯示強制BR或DIV顯示也仍會被遮一半
使用XHTML 1.0格式雖能正常顯示,但往往Web Page的視覺設計可能是以HTML 4.01傳統方式
要為了這個tab而全頁調整,就非常痛苦了。

否則只能換其他tab頁籤顯示效果或3-Party元件才行(如Telerik TabStrip)。

2009-10-20

預設建構子呼叫其他建構子

在C++類別建構時,無法在建構子之間要互相呼叫彼此
總是得把共用的部分寫在一個Private Method()來呼叫。

C#的類別裏,即可使用下面的語法作預設值呼叫:
SNAGHTML3d1e958

2009-10-18

Email寄送的整合類別 - MailClient

.NET下要寄送Email,肯定最常用的是System.Net.Mail命名空間下的MailMessage + SmtpClient類別。
MailMessage是處理郵件內容,需要處理一大堆User輸入的To/CC/Bcc郵址格式判讀、唯一性、防錯例外,
MailBody內容宜讀取獨立範本html檔,使用Macro巨集變數替代,方便日後郵件內容維護。

SmtpClient的重點在於了解Reply Credential (轉寄授權)的方式,可參考以下文章:
http://www.cnblogs.com/hwade/archive/2007/11/28/976026.html
筆者對Mail伺服器管理稍有經驗,知道SMTP的相關限制(Session數量)及存取方式
因此建立了數個UseXX?Credential(),使用時很清楚SMTP認證的方式。

在附件(Attachment)的處理上,除了寄檔外,也該具有Embedded Images圖片內嵌功能。
在電子報的應用裏,相關的信件Links也要由相對網址變成絕對網址。

很多Email寄送的議題需要考量+經驗,為此我製作了一個MailClient整合性類別,
儘量直通底層的物件屬性而不另建立變數複本(以免同步上有問題),
以下的語法範例可勾勒出一種簡易卻延伸性廣的Design Pattern。

SNAGHTML118d110c

2009-10-16

容易引起例外的MailAddressCollection.Add()參數

在ASP.NET 3.5中,要寄發Email,就是用System.Net.Mail.MailMessage物件來構成Email主體
在處理收件人中,MailMessage.To.Add()的參數可以是一個MailAddress物件,
也可以是一個以逗號隔開的Email List String.

這一個多人地址的分隔字串,在.NET舊版本有以分號(;)隔開,也有以逗號(,)
也可以使用: MailMessage.To.Add(“DisplayName <user@test.com>");

當郵址分割字元不合規定時,寄信時會出現Error: Recipient unknown例外
Mail Address字串格式不對或有空白,也會引起例外,
有很大理由要用一個處理函數來一致化user輸入的多人郵址字串。

我寫了一個這樣萬用的函式,且相同位址不會重複加入(注意\r\n\t等字元):
int count = AddMailAddresses(msg.To, "User1 <user1@test.com>, xxx; user2@test.com, ”);  // count=2
int count = AddMailAddresses(msg.To, "User1 <user1@test.com>, xxx; user2@test.com, ", ",;|".ToArray());  // count=2

2009-10-15

自訂Directory目錄處理類別

.NET 提供System.IO.Directory類別來處理與目錄相關的函式,只是在實務裏缺了一些便利的處理函數
其實這些特殊函數實作並不難,但如何設計精鍊且高效能,端視程序員的經驗能力。
SNAGHTML6cd1a66

以下列出筆者自訂Directory類別的功能:
1. Copy: 複製目錄,當然具有Recursive功能。
2. Delete: 刪除整個目錄,避開其下ReadOnly屬性的檔案及任何例外,Recursive。
3. DeleteByWmi: 刪除整個目錄,使用System.Management的WMI方式刪目錄,可迴避唯讀錯誤。
4. GetDiskSize: 計算整個目錄的Size (in Bytes)
5. IsEmpty: 檢查該目錄下是否為空目錄?
6. IsValidPath: 檢查該目錄的full path是否字元與格式都合法?
7. SetAttributes: 設定目錄屬性,支援多種屬性項目修改及Recursive.
8. SuffixSlash: 目錄路徑最後加上斜線,一致化dir路徑格式。

2009-10-12

替代無效的檔名字元

當自動從資料庫項目名稱生成檔名時,我們須判斷是否符合os所規定的檔名字元
以下的函式即可替代掉無效的字元(不包含路徑)。
SNAGHTMLa787d8f

呼叫方式:
string s1, s2;
s1 = "test*.txt?";
s2 = ReplaceInvalidFileNameChars(s1, '_');  // s2 = test_.txt_

2009-10-05

透過Encoding BOM作不同檔案編碼的轉換

檔案文字編碼區分為ASCII及Unicode,而Unicode又區分UTF7,8,16,32等系列,
我們透過BOM (Byte Order Mark)資訊作判讀依據,但BOM不一定存在。
相關的FAQ基本知識可參考: http://www.unicode.org/unicode/faq/utf_bom.html

程式實作中,若遇到一個二進位檔,就是透過BOM資訊來偵測其編碼格式。
SNAGHTML115ef4f3

得知其最有可能(因為BOM不一定存在)編碼格式後,
即可用System.Text.Encoding.Convert(srcEncoding, dstEncoding, byte[])來作轉換。
須注意的是,轉換前要先摘除BOM資訊,轉換回來寫檔前,再先插入BOM資訊
即可完成不同Encoding的轉換。

微軟.NET Framework命名風格裏,似乎把Unicode當作是UTF-16LE,
很容易跟最新的Unicode規格混洧,可能原因是微軟的Unicode是從規格1.0開始發展,
大家使用上能理解對行了。

至於UTF32BE(Big-Endian),.NET Framework中並沒有對應的編碼屬性對應(沒寫的就是LE)
請使用Encoding.GetEncoding(12001)來替代之。

2009-10-04

MD5 Creator

MD5編碼加密在密碼應用裏常常被使用,除了其不可逆的特性,即使再長的原文內容,
也會被編碼成固定長度為32的字串。

由於這種MD5產生程式太簡單了,我一直再造車實作,而使用網路上的MD5服務:
http://www.md5-creator.com/

為了怕網路不通,身邊還是有個離線版為宜。網路卻找不到這樣簡易陽春的軟體
只好實作一個免安裝的MD5 Creator。
SNAGHTMLca846b2

下載: MD5 Creator for .NET 2.0 (11KB)

2009-09-30

Microsoft Web Platform Installer 2.0

為了便利ASP.NET的Hosting環境,微軟推出一個簡易型的Web Platform
透過一個線上安裝檔(官方沒有離線版),就可以把IIS, MVC, PHP等整合建構。

一直以來,嵌入式的ASP.NET Web Server應用,
我一直使用Cassini Web Server,既然微軟有新的玩意,或許管理介面上會更強也說不定。

安裝Web Platform 2.0 RTW時,發現Core Web Server竟只有IIS 5.1(還以為是IIS 7),
不知是否是因為OS是XP才導致只能裝IIS 5.1?
想說舊歸舊能跑就好,又看到以下連線限制就放棄了:
SNAGHTMLcb36569

其實XP或Vista的光碟都有內含IIS Server,原以為新的Web Platform能提供更簡精好用的平台
倘若限制一大堆,倒不如就裝Cassini Web Server。

2009-09-29

網路授權啟用機制 - License管理平台

資料庫設計可以規劃為代理商(Agent)架構機制,因為有些軟體授權機制是先跟代理商談好合作條件
讓代理商自行向客戶發行軟件並啟用License,開發商再跟代理商用月結方式依啟用數量取款。

基於此需求,開發商要提供代理商一個可管理License檔的Web平台,
依顧客所購買的軟體版本或功能,創造出不同的License檔案。
SNAGHTML7a7a847
其中啟用Quota並不侷限1套,讓一個License可以支援多數量的啟用。

代理商能查看購買顧客的啟用狀況,對於異常使用可隨時中止(Cancel)或刪除未啟用的LicenseKey:
SNAGHTML7a6d6e5

顧客歷史啟用記錄內容,可以記錄Client平台的相關資訊、版本及IP Address,避免統計結帳時的糾紛。
在此架構中,代理商可以依合約規定自由發行License,為了防止該代理商帳號被非法使用,
代理商帳號也有一個Credit限制設計,其所發行的任何License之啟動總數量,不能超過此值。

此系列文章,主要在闡述軟件網路授權啟用的機制設計,
身為軟件開發商的你,不要再花時間建立序號或郵寄USB硬體鎖了(除非單價高)。

專案源碼交付的程度範圍

很多公司會購買專案原始碼(Source Code),對於專案上所使用的一些DLL也要求一併交付源碼
這點常常令開發公司對於源碼交付程度的定義產生困擾,
其實交付源碼為非無上綱地交付,正確的定義應該是指牽扯到專案邏輯部分的源碼範圍。

買源碼就是為了日後要修改或增加新功能,因此只要跟專案邏輯有關的源碼,
開發公司都該交付,但若開發公司使用3-Party元件(涉及授權)或WinAPI, OpenSource元件,
因為這些Component本身並不牽扯到專案邏輯部分,就可以不用交付。
在專案簽約時雙方最好能對源碼交付的範圍有共識,即可避免無謂的困擾。

倘若覺得這些*.dll存在是很礙眼的,可以在編譯完成後使用ILMerge.exe程式,
把*.exe, *.dll全部打包成單一執行檔就行了。

2009-09-28

Windows Server 2003 R2安裝升級步驟

Windows Server 2003 R2 是 Windows Server 2003 作業系統的更新發行
相關的更新說明,請詳見官方中文版FAQ:
http://www.microsoft.com/taiwan/windowsserver2003/R2/R2FAQ.mspx

從MSDN下載會有兩個CD ISO檔,安裝步驟為:
1. 安裝CD1的Windows 2003 with SP2版本,查看「我的電腦」右鍵「屬性」。
SNAGHTMLfc99667
2. 執行Win2003 Service Pack2安裝檔(WindowsServer2003-KB914961-SP2-x86-CHT.exe, 內建的版號不一致),再執行CD2的Upgrade R2 (127MB),否則會出現以下問題:
SNAGHTMLfca8c1b
3. 放入R2光碟選擇「升級」,它只會裝更新部分,一下子就好了。
SNAGHTMLfcd426f
4. 進行Windows Update更新,約有68個更新。

2009-09-26

網路授權啟用機制 - 驗證啟用服務

當Client端軟件進行License啟用時,它會負責先檢驗其License檔格式正確與否,
並讀取到一個License Key,再進行與遠方主機的TCP/IP訪問,
因此官方主機必須實作一個驗證啟用服務,它是一個TcpListener機制。

TCP訪問流程(所有Socket資訊都經過對稱式加密):
1. 當Client連線時,先進行AUTH密碼確認。
2. Client傳來硬體平台資訊(XML格式)及安裝版本資訊、IP Address。
2. 讀取License Key,比對資料庫是否已存在,並調出客戶資訊 (如購買套數/版本/啟動次數限制)。
3. 比對啟用Quota是否超過限制,相同硬體上的重複啟用不計次。
4. 回應Client端是否啟用驗證通過,並寄發Email通知管理員。

SNAGHTML83f4ad0

假如通過驗證,Client端軟件就會把安裝平台硬體資訊及擷自伺服主機的資訊,
產生一個License.lic檔(經過加密Binary檔),放置在軟體安裝目錄內,軟件主程式執行時會讀取該檔。

官方資料庫會記錄每次Client的連線啟用資訊,包含時間, IP, 安裝軟件版本、安裝目錄、硬體/OS版本資訊,
幾乎什麼Client系統內的資訊都可以收集,用來當作日後的違規使用證明。

2009-09-25

網路授權啟用機制 - License檔案

為了有效保護商業軟件,使用序號方式已無法有效防制盜版擴散,
現在普通的軟體保護機制就是使用網路啟動,當用戶購買軟件時,先發予一個加密的License檔案,
軟體啟用時指定該檔,即可連線至官方啟用主機進行驗證,官方能控制啟用次數及資訊。
SNAGHTML81ebf72

官方所給予用戶的License檔,除了記錄user資訊及所購買的版本限制外
主要是其內含有一個Unique License Key,它也會先登記在官方伺服資料庫內,
待上傳時進行資料存在比對。

實作該License檔的方式,.NET實作方式可以將物件序列化成二進位檔
再將檔案予以加密(使用XOR Array或對稱式加密),
然而.NET的序列化在解開時必須符合Assembly Namespace完整名稱,
一些知名的Assembly加殻混淆保護工具常會破壞此Namespace的資訊,造成還原上的問題。
更況何非.NET的程式語言,亦無法有效支援此License的讀取,故不推薦此方式。

針對License檔實作方式,筆者使用一個固定Size的Byte[]陣列,再使用Struct Mapping對應方式
讓Byte[]與結構變數(Struct)能互相轉換,並方便寫入檔案。
檔案會做XOR Checksum機制,再予以不等長對稱加密方式保護。
SNAGHTML81fe6cf

當軟件進行網路啟用成功時,會產生出一個License.lic檔案,其實它的結構跟原來的License檔一樣
只差別在內容上的差異,寫入了安裝平台的硬體資訊及限制資訊(如版本控制、使用期限)

每當軟件程式啟動時,就先判斷該驗證過的*.lic檔是否存在,
再進行合法格式讀取(比對解密還原後的size及checksum),假如成功就轉成Struct變數
再針對內容資訊作邏輯流程控制。

這個讀取License的程序通常寫在一個method,為了避免.NET Assmebly被反組譯註解內容(雖然會混淆)
最好在method裏把讀取到的License Struct變數指定為global變數,於重要的功能使用前再比對該global變數值,
類似網站的login畫面雖被駭客繞過去,但後面的操作是需要其登入程序裏獲取的Session值。

2009-09-18

Vista空資料夾無法刪除

在Vista下有時候發現某些空資料夾無法刪除
使用了Process Explorer去查看系統佔住的handle也無所獲
進安全模式或找一些強制刪檔的軟件,都仍會出現:「找不到此項目」

今天終於找到解決之道:
1. 進入命令提示模式 cmd
2. RD “D:\abc /”  (重點在最後引號加上斜線)

就這樣,該死的空資料夾就消失了。
解決來源: http://support.microsoft.com/default.aspx/kb/811176/zh-tw

2009-09-17

封包資料驗證

無論是網路UDP封包或RS232的串列資料,它們的傳輸不保證內容順序及資料是正確的,
因此若要實作資料驗證機制的話,最基本的封包(Package或Frame)結構定義如下表:

起始字

資料長度

資料

檢查碼

1 byte

2 bytes

N bytes

1 bytes

1. 起始字: 如固定以0xAB開頭
2. 資料長度: 代表後面資料的陣列長度,通常low byte在前,high byte在後地組成2個bytes。
3. 資料: 一個符合前面長度的byte[]陣列,有可能是0長度。
4. 檢查碼: 通常是從資料長度byte至資料陣列的最後一個byte作xor sum。

由於接收資料的socket或rs232 reader,每次事件觸發可能只收到破碎的片段資料
因此必須準備一個自訂Queue來累績存放讀取buffer進來的raw data,
當Queue的長度大於一個封包定義的最小長度時,即進行Queue的Parsing工作。

從Queue映射出一個Shadow Array(固定長度),然後使用一個loop來比對起始字
接著取得其資料長度(Data Length)。這兩個代表資料長度的bytes可能是錯誤的值,
因此要檢查其宣稱的長度值,是否在封包定義最小長度與整個映射array長度之間。

若是,則依Data Length值跳至該封包最後一個byte作checksum驗證,若正確則是有效封包區段,
直接作長度跳躍去驗證下一個封包片段起始字。
反之,若Data Length及checksum檢查失敗,則array position加1繼續比對起始字。

當中值得注意的是,當checksum失敗的話代表其區域內的bytes值都不可靠,
因此即使Data Length所宣稱值符合在Array範圍內,亦不可直接作整個長度的跳躍
只能postition + 1,繼續比對下一個起始字byte。

另外,需要設定一個queue已讀取位置的read position變數,記錄checksum失敗時的讀取位置,
避免重複再對這些不可靠的區段作parsing。等到遇到一個有效封包結構進來時,
再一次回收這些空間,該read position變數再設為0。

SNAGHTMLb1a0d4

以上是業界作資料驗證的邏輯原則,筆者經過千錘百鍊的資料傳輸驗證及效能除錯
基於智慧財產保障,僅提供流程邏輯,並不提供源碼分享,尚請見諒。

2009-09-11

轉Hex字串成為byte[]陣列

若您從事低層程序設計,估計常常會需要讀取Hex字串,轉成byte陣列。
例如「5A 02 03 EF…」,以下的函式提供一種通用且靈活的實作方式。
SNAGHTML16f9e39

設計時我有考慮到效能及靈活性,函式呼叫方式為:
string hexList = “5A 02 03 EF”;
byte[] bb = ToArray(hexList, “ “, “,”);

2009-09-09

WinCE SerialPort測試程式

SerialPort (RS232)的收發測試免費程式很多,但若平台是WinCE或PDA上,
這類的資料收發測試就不多。

一般人以為RS232收發很容易,只要元件拉一拉配合硬體狀況就能跑,
然而其中遇到的細節(例如HandShake, RTS, Recv資料驗證、多執行緒、Send Overrun Ack),
絕非只用Time Delay這種治標的方式來遷就硬體。

為了寫好這隻通用的程式,我把RS232的規格/名詞挖出看了一遍
寫出下面通用的RS232測試程式,支援NetCF 2.0,XP上也能跑。
畫面小小的,是為了兼容Mobile Device的畫面,連CF版本不升3.5,都是為了方便。

接收資料畫面: (儲存檔案可用於佈署傳檔)
SNAGHTML5bcfe68

傳送資料畫面: (可送檔)
SNAGHTML5c6245f

由於它只是測試程式用途,因此並沒有實作封包檢驗及傳送Ack等細部地方
但意思到就好。

下載: CeSerialPort.exe (18KB)

破壞If規則的例子

程式目的是接收RS232傳來的資料寫入一個檔案,
因此畫面上就是按Listen時開檔,按Stop時關檔,並設為null。
SNAGHTML3ce3fb2
當我關檔成功時,其FileStream也確定是null,5秒後,再RS232又有資料來
理論上應該會被下圖的if {}給略過,但卻仍發生錯誤。
SNAGHTML3c7fd55
VS2008畫面說fileStream.Write()因為是null,不能執行,檢查了fileStream值的確是null值
但它卻闖入了!!

雖然這整個method是非同步執行的,但我的確等了足足5秒後再傳資料來
就算是不同的thread,也足夠時間同步這global變數fileStream的狀態吧?!

這真的是很奇怪的現象… 有人能解釋嗎?

2009-08-12

[心得]資料庫繁轉簡批次轉換

如果要將一個資料庫(sql2005)內的所有文字欄位,由繁體轉成簡體字
所涉及的字碼轉碼及符合db設計的欄位長度,就可能是一大工程。
幸好很久以前就設為文字欄位皆統一使用nvarchar(n)在存放字串
而且各table欄位也有設計一致性的identity同名欄位。

有個良好的db設計背景,總是一個好的開始,基本的繁轉簡函式,網路上找一大堆。
但,要如何把db內的各tables裏的字串欄位取出轉換再存回呢?

首先,能擅用工具就不要寫code,
我利用sqlsrv的export工具精靈幫我將table匯出成excel或text檔
再用convertz工具轉碼後再import回去,這想法單純且直接(雖然匯出入操作很煩)。

當然事情不可能那麼順利,
匯入時遇到identity欄位及讀取unicode字串長度判讀的欄位長度逸出。
搜尋了網路上db簡繁方案,有人設計sqlsrv與CLR的延伸模組來實作table資料的繁簡互換,
這是比較好的解決方向,但我沒時間研究這些東西。
繼續再找尋相關的tool工具,但都得面對匯出入的欄位規格調整問題。

最後,詢問了朋友們意見,我還是乖乖地寫export/import程式
使用一筆接一筆的update指令更新。

2009-07-14

BMI身體質量指數

下載了Microsoft Expression Blend3,初試了一下Silverlight 3.0正式版
Blend3已結合程式撰寫部分的功能,不必在vs2008之間切來切去
因此就寫了BMI計算小程式。

http://silverlight.dabutek.com/Bmi/Default.html
SNAGHTML23e64a7
SNAGHTML24e0671


SL的重點在於利用client的資源,因此若是大量與db或跟伺服器相關的程式
應該要用asp.net web app, 而不該用SL.
最好的方案是兩者結合,在局部功能裏嵌入SL,
讓SL專門來處理client端的事務。

2009-07-07

從源碼方式安裝Mono 2.4.2.1

基本的Mono v2.4編譯方式可參照這篇:
http://tomex.dabutek.com/2009/06/mono-24.html

Mono 2.4.2.1 是 v2.4版的bugfix release
只要下載libgdiplus-xxx.tar.bz2, mono.xxx.tar.bz2,再依序進入各目錄:

// libgdiplus dir
# ./configure --prefix=/opt/mono; make; make install
# sh -c "echo /usr/local/lib >> /etc/ld.so.conf"; /sbin/ldconfig

// mono dir
# ./configure --prefix=/opt/mono; make; make install

2009-06-29

從源碼方式安裝Mono 2.4

每次mono出新版,官方網站只會釋出相對的以suse為os的虛擬機zip檔
卻不提供以前方便的linux generic installer (類似安裝視窗一鍵全好)。
Ubuntu apt-get通常無法跟得上最新版的釋出,當然我們不會考慮舊版。

唯一方式就是下載源碼source自行compile,然而官方上好多分類:
http://ftp.novell.com/pub/mono/sources-stable/
SNAGHTML434875

假如隨便胡亂下載亂安裝,保證會因相依性而無法安裝,這就是linux輸給微軟的一個大缺點。
我使用Ubuntu Server 9.04最乾淨的安裝方式來作實驗,
找了網路上許久,也實驗了一些人的作法,老實說會失敗(可能我沒全裝ubuntu的關係)。
http://www.cnblogs.com/beginor/archive/2009/05/09/1453287.html

最後,皇天不負苦心人,這篇文章可以確定compile安裝成功,連xsp環境也能work。
http://blog.ruski.co.za/page/Install-Mono-on-Ubuntu.aspx

分析了異同,這段方式可能是關鍵處:
SNAGHTML495966

2009-06-18

在if/else範圍內break跳離

在一般C-Like程式語言裏,在if..else的區域裏,並沒辦法使用break立即跳離整個邏輯scope
尤其上層APP往往需要多重邏輯判斷+運算
若if()裏也能有break跳離的功能就好了。

雖然語法上沒辦法立即跳離if/else區域,但可以用下列的方式實作:
SNAGHTMLa4c763e

雖然有人主張if/else內不要放太多的程式碼,但高階程式邏輯判斷實在太多
也只要這樣變通囉!

2009-06-14

佈署WCF服務在WCF-Provided Host程式中

舉凡要佈署WCF服務,有下列幾種方式:
1. 佈署成Website方式。
2. 佈署在WAS (Windows Activation Service)裏。
3. 使用ServerHost.Open() 方式Standalone執行。
4. 佈署成Windows Service.

以上方式總是要因應環境作些設定或嵌在別的專案裏,
若只是想測試WCF Service,可以利用VS2008提供的WCF –Provided Host程式。

1. 新增一個WCF Service Library (*.DLL)專案。
2. 編譯後產生Service.dll, Service.dll.config
3. 在VS2008 Command Prompt裏,執行:

WcfSvcHost.exe /service:Service1.dll  /config:C:\MyProject\Service1.dll.Config

4. 它會觸發WcfSvcHost程式,且啟用這服務。若要關閉,在Exit此程式即可。


SNAGHTML1658d09

結論,此方式為各種佈署WCF最簡單的方式,通常用在測試階段。

2009-06-13

佈署WCF服務在Windows Service程式中

上文有教大家佈署WCF服務在Console執行
然而,還是作成Windows Service中背景執行更佳,
佈署的方式也很簡單:

1. 新增一個Windows Service專案。
2. 在專案右鍵加入一個WCF Service類別。
3. 在Service1.cs (預設Windows Service類別)中加入以下程式碼:

public ServiceHost serviceHost = null;

protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}

serviceHost = new ServiceHost(typeof(WcfService1));
serviceHost.Open();
}

protected override void OnStop()
{
if (serviceHost != null)
{
serviceHost.Close();
serviceHost = null;
}
}

4. 安裝成服務,並啟動它,即可用IE開啟WCF URL,即可完成。

2009-06-12

佈署WCF服務在Console程式中

雖然WCF服務常常佈署在IIS或WAS中,但還是把WCF Service嵌在客製化的程式容易些
下面用一個Console程式加上WCF作為示範:

1. 新增一個Solution, 加入一個Console程式。
2. 在專案節點上按右鍵,加入New Item,選擇「WCF Service」。
3. VS2008會加入一個名為Service1的服務,增加3個檔案:
SNAGHTML3eb2ac
4. 在Console的Program.cs中寫入:
using System.ServiceModel;
SNAGHTML406a09
5. 執行程式,另開一個IE視窗,鍵入App.config中Service1的服務URL:
SNAGHTML441120
開啟IE:
SNAGHTML427a5e

陸續再為大家介紹不同的佈署方式。

2009-06-10

WCF Overview

若找一本WCF的專書來看,保證在Contract屬性中昏昏欲睡
正巧在Code Project裏發現一篇教學文章,裏頭含有實作及簡單說明
比正統書寫得不知好幾倍。
http://www.codeproject.com/KB/WCF/WCFOverview.aspx

照著它的方式實作,通常能得到一些概念
Client也能連接WCF Service呼叫一些Method,
但細節中如何在不同連線中共享資料
這也是尚待研究的主題。

總之,推薦這篇文章。

2009-06-07

List的Range操作效能超低

在某專案中,主要目標是對許多文件作「搜尋/插入/移除」
為了繞開文字編碼的判斷錯誤,我使用List<byte>來讀取檔案,
必須實作一個這樣的Method:
void Replace(byte[] oldArray, byte[] newArray, int startIndex, int count);

由於.NET中的List<>類別並沒有Replace函式,因此急將就使用:
List.Items.RemoveRange(startIndex, count);
List.Items.InsertRange(startIndex, count);

爾後發現這兩method做成的Replace()效能實在太差
在文件很大時作重複操作,甚至會造成DeadLock()的Exception問題。

使用使用Encoding.GetString()轉成字串,
再用字串的Replace()取替代,大大減少了效能損耗。
至於List的RemoveRange/InsertRange為何那麼損耗能,
可能得查看它的內部實作code才知道。

2009-06-01

MSN機器人

MSN的Protocol傳訊,對於系統偵測的回報蠻實用的,曾有個DotMSN專案,但至2006.08後就沒再維護,
後來發現有MSNSharp專案繼承了它,至2009.04.03來有推出新的release
因此趕緊把該.NET元件抓下來測試一番,寫成下面的測試程式(登登登):
SNAGHTML30ebd74

基本上它都是透過Event方式觸發事件,例如連線、登入、傳訊、收訊等等
官方是沒sample文件,但其source源碼內有個測試程式源碼,倒是可以追蹤。
基本溝通訊息ok後就沒再深入調試,等待日後有所應用再作細部開發囉!

2009-05-23

Silverlight3 – SMTP Mail

上星期VS.NET 2010 Beta1出來,對於Silverlight提供所見即所得的編輯環境,就在其上加裝了SL 3.0 Beta1 SDK及Runtime,進行第一次的實務開發。一開始我選錯專案類型WpfBrowserApplication,發現裏頭支援System.Net.Mail類別,以為SL3有此支援,其實不然(捶胸頓足狀)。

因此得透過Web Service或WCF服務來進行非同步轉寄,當然我是選擇後者的新架構。
WCF服務加入的過程很簡單(有書的話),完成了以下的程式畫面:
SNAGHTML2dbc955

看來為了彌補SL Runtime的不足,開發WCF Service是未來SL3的重點服務需求。

2009-05-15

[自創]SMTP郵寄測試程式

很多程式專案都需要Email寄送服務,尤其這資訊萬千的時代,任何系統事件的發生,主動通知user是一種人性趨勢。然而,現在為了防堵垃圾郵件的發送,各郵件主機都設了層層防護,在沒有完整存取資訊下,想要快速設好smtp寄送有些困難。為了在遠端桌面上快速驗證email發送設定,我寫了這工具,當mail發生傳不出去時,它偵測問題原因挺有效的,當然,你也可以用它來傳送簡易email。

本軟體為免費、免安裝軟件,下載後解壓縮,直接執行。
軟件下載: Download, 10.2KB, Build 2009.05.15

系統需要有.NET Framework 2.0以上版本,執行畫面如下:
圖片

軟體備註:
1. SMTP的主機位址、埠號、帳號/密碼的設定,須視SMTP主機的規定。
2. 填寫欄位時在每次寄送時會暫存起來,方便user作下拉選擇測試。
3. 當Subject不勾選「Custom」時,系統會以IP+時間方式作標題,否則就依客戶填寫內容為主。

這程式也可以當作簡易發送email使用,不但是陽春了些(也沒附檔),因為它的創作動機只是偵測Email問題的一項工具。

2009-05-12

Rootkit木馬

Rootkit自身也是木馬後門或惡意程序的一類,只是它很特殊,會破壞系統自我檢測的值,讓殺毒程式無法發現它的蹤跡。
症狀都或有不同,以我的筆電為例,會莫名網路中斷,再也喚不醒。

下圖是我強制驅動網路時出現的錯誤訊息,查了google才知可能是rootkit木馬作怪。
http://www.sucop.com/2009/0505/531.html

image

著了症狀該怎麼救呢? 只有重灌一途。
面對不明的網路程式(如註冊機),我都會用VMware虛擬系統作分身測試
然後不經意間,還是會中招。

人家都說,儘量不測不明的軟件,然而,好奇心驅策使然,很難避免的。
正如只有年輕人玩電腦才需要花時間搞定電腦千奇百怪問題,
而大部分老年人根本就沒這問題,然而有付出就有回饋,
我會中木馬,是在好奇過程裏,追蹤一些奇怪線索導致的。

如今的我,只能勤靠備份,C:\ 系統也要定期作備份
直到有天我的好奇心都沒了,自然也能回歸平淡。

2009-05-05

Windows內建備份程式+排程工作

在客戶提供的獨立主機上開發專案時,好的開發人員會貼心在把專案相關目錄作日常備份到某一特定目錄內,再請客戶自行備份該目錄。(否則客戶怎會知道哪些檔案是必要的呢?)

備份的目標通常是專案目錄+資料庫檔案,後者更是使用中的檔案,因此得使用一個免費又能支援陰影備份軟件,這種重責大任只能讓Windows內建的備份程式(NtBackup.exe) + 排程工作的搭配。SNAGHTML335ed6a

上圖中的資料夾勾選動作,常令我們懷疑若有新的dir或file,它也會一起備份嗎? 簡單測試一下是可以的,然後很多人不知道此次的備份選取設定到底是存在哪裏? 畢竟排程設定必須指到這個設定檔。

打開選單中的「工作/載入選取項目」,就會指示NtBakcup預備設定的存放目錄(*.bks):
SNAGHTML339a65d

我們必須趕緊把這些*.bks從18層地獄目錄中移到我們想到要目錄,再修改排程工作中的bks路徑:
SNAGHTML33d0d1b

你可以隨時透過備份程式,開啟這些*.bks來修改勾選的項目。 沒錯,NtBackup的設定就是這麼饒舌,其他的備份程式才有存活空間。

將UltraEdit-32加入x64平台的右鍵選單

若您在Vista x64平台安裝UltraEdit-32軟件,它的便捷右鍵選單可能會不見,解決方式是將以下內容存成*.reg檔,並雙擊執行即可。
REGEDIT4

[HKEY_CLASSES_ROOT\*\shell\UltraEdit]
@="UltraEdit"

[HKEY_CLASSES_ROOT\*\shell\UltraEdit\command]
@="\"C:\\Program Files (x86)\\IDM Computer Solutions\\UltraEdit\\uedit32.exe\" %1"

SNAGHTML327c2e1

要刪除或對Registry操作更清楚的話,可看will的教學文章