2009年7月21日 星期二

moFuse: 快速建立 mobile device 專用的 mobile site

mofuse 只要簡單的幾個步驟就可以將部落格轉換成 mobile site。 這個網址是我的 blogger 經由 mofuse 轉換後的結果。

2009年7月6日 星期一

Wbox

HTTP 客戶端模式

最簡單的使用方式就是把要測試的 URL 當作參數:
% <b>wbox www.google.it</b>
WBOX www.google.it (64.233.183.99) port 80
0. 200 OK    3774 bytes    407 ms
1. 200 OK    (3767) bytes    273 ms
2. 200 OK    3767 bytes    304 ms
3. 200 OK    3767 bytes    260 ms
user terminated
這個模式很類似 ping

限制請求的數量

預設 Wbox 會持續的進行遠端請求,直到使用者輸入 Ctrl+C。我們可以在傳入的 URL 後面加上一個數字指定要發出多少次請求:
% <b>wbox www.google.it/notexistingpage.html 1</b><br />WBOX www.google.it (64.233.183.103) port 80<br />0. 404 Not Found    1495 bytes    310 ms<br />
更多資訊請參考 http://hping.org/wbox/

2009年6月28日 星期日

db4o client/server 模式

從 db4o 的 API 來看,要存取遠端資料庫伺服器跟本地端直接開啟資料庫伺服器以支援同時存取(concurrent transaction)的方法幾乎沒有甚麼不同。要使用同時存取,只要把原本開啟資料庫檔案的方式改換成開啟 db4o 伺服器的模式,並將其啟動於 port 0 即可(因而不需要任何的網路連線):
IObjectServer server = Db4oFactory.OpenServer("db.filename", 0);
try
{
    IObjectContainer client = server.OpenClient();
    // 讓 client 端做某些事情
    // ...
    client.Close();
}
finally
{
    server.Close();
}
在 db4o 中,client 端的 transaction 只處於 read commit(不過每個 client container 都維護一個 weak 參考快取,參考到它所有已知、參考到的物件)。要讓所有 client 端中未決的更新 comment 立即執行,我們可以明確的自伺服器中的更新已知的物件:
IObjectContainer client1 =server.OpenClient();
IObjectContainer client2 =server.OpenClient();
IList
result1 = client1.Query
(delegate(Article art) { return art.PMID == "7533967" && art.GM_Version == GeneMentionTagger.VERSION; }); IList
result2 = client2.Query
(delegate(Article art) { return art.PMID == "7533967" && art.GM_Version == GeneMentionTagger.VERSION; }); Article a = result1.Next(); // 修改 a 的內容 client1.Store(a); client2.Ext().Refresh(a,Int16.MaxValue); // 取得更新後的內容 client1.Commit();

遠端資料庫伺服器

要讓 db4o 能夠使用 TCP/IP 網路存取遠端的資料庫方法很簡單,只要指定連接埠大於零,並且設定一至多個 client 即可!
IObjectServer server = Db4oFactory.OpenServer("db_filename",
655);
server.GrantAccess("user", "passwd");
try
{
    IObjectContainer client = Db4oFactory.OpenClient("localhost",
    655, "user", "passwd");
    // Do something with this client, or open more clients
    client.Close();
}
finally
{
    server.Close();
}

如上例所示,client 連接提供了主機、埠號、使用者名稱和密碼的設定。

就這樣...其它的使用方式就跟在本地端一模一樣。

db4o 中的 Transparent Persistence

之前的文章提及,更新深度讓我們可以細緻化的控制物件的更新長度,以便在效能和便利上取得平衡,然而也造成下面的問題:
  • 設定特定更新深度:程式碼必須知道哪些物件對應的更新深度
  • 當更新深度為最大值時,會造成效能低落,沒用到的物件會被無意義的更新
一個解決方法也許是讓 db4o 引擎去幫你作決定。這個功能在 db4o 7.1 版時引入,稱之為「Transparent Persistence」(後文簡稱 TP)。db4o 藉由下面方式來支援 TP:
  1. 資料庫必須組態成 TransparentPersistenceSupport
  2. Persistent 類別必須實做 IActivatable 介面,該介面在 db4o 的 Activation一文中有介紹。該介面提供了 bind 方法取得 container 的 activator 物件。
  3. 當物件的欄位被修改時, db4o 的 Activation一文中提及的 Activate() 方法會被呼叫來儲存物件內容。而 db4o 的 Activation的程式碼中出現的 ActivationPurpose.Write 會在 TP 中被使用。
假設使用在 db4o 的 Activation一文中定義的 Article 物件,我們在開啟資料庫前,先設定好 TP 支援:
Db4oFactory.Configure().Add(new TransparentPersistenceSupport());
只要加上這行,再更新物件內容時,只要該物件欲更新的欄位有加上 ActivationPurpose.Write,則會被自動儲存。

db4o 的 Activation一文中提及的主要是取出物件時的情況,這裡是儲存物件的情況