Pages

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後就沒再深入調試,等待日後有所應用再作細部開發囉!