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一文中提及的主要是取出物件時的情況,這裡是儲存物件的情況

db4o 的 Activation

我們在之前的文章提過關於物件更新深度的問題。db4o 的 Activation 則是設計用來簡化處理更新深度問題,達到 transpartent activation 的效果!

如同在物件更新深度一文中提到的,我們先將資料庫內塞滿 Article 物件。若是我們不再開啟資料庫前設定好更新深度的相關參數,則可能會造成取出的物件有部分內容是 null 值。

要讓 db4o 運行於 Transparent Activation 模式的方法很簡單:

Db4oFactory.Configure().Add(new TransparentActivationSupport());
就這樣,我們不需要再擔心會遇到 null 值的問題了!實際上,當啟用 Transparent Activation 模式時,任何未實做 Db4objects.Db4o.TA.IActivatable 介面的物件被使用時將會自動的 activate。很明顯的是,這種方式會造成記憶體的大量消耗,也造成載入時間變慢。要避免這種情況,我們可以替我們的類別實做 Activatable 介面。下面是我們將 Article 物件加上 Activatable 的實做:
public class Article: IActivatable
{  
   // ...

   [Transient]
   private IActivator _activator;

   private Sentence title;  
   public Sentence SentenceOfTitle  
   {  
       get { Activate(ActivationPurpose.Read);
             return title; }  
       set { Activate(ActivationPurpose.Write);
             title = value; }  
   }  
   
   // 這裡假設 IsStructure 不需要 activation
   private bool _IsStructure;  
   public bool IsStructure  
   {  
       get { // Activate(ActivationPurpose.Read);
             return _IsStructure; }  
       set { // Activate(ActivationPurpose.Write);
             _IsStructure = value; }  
   }  
   
    private List _SentencesOfAbs;  
    public List SentencesOfAbstract  
    {  
       get { Activate(ActivationPurpose.Read);
             return _SentencesOfAbs; }  
       set { Activate(ActivationPurpose.Write);
             _SentencesOfAbs = value; }  
    }  

    public override String ToString()
    {
       Activate(ActivationPurpose.Read);
       return string.Format("T:{0}", title);
    }

    // implement IActivatable
    public void Activate(ActivationPurpose purpose)
    {
        if(_activator != null)
        {
            _activator.Activate(purpose);
        }
    }
    public void Bind(IActivator activator)
    {
        if (_activator == activator)
        {
            return;
        }
        if (activator != null && null != _activator)
        {
            throw new System.InvalidOperationException();
        }
        _activator = activator;
    }
} 
一個 IActivatable 類別必須儲存 db4o 提供給 bind 方法的Activator 物件於一個 transient 變數中(上例中的 _activator 變數),並且在預被 active 的欄位被呼叫前,呼叫 Activate() 方法。假若該物件已經被 activate,這個方法會立即回傳,否則 activation 會自動發生。

db4o 的 Transaction

在 db4o 中,基本上我們對資料庫做任何動作,都處於一個 transaction 中;也就是說,當我們開啟一個 db4o 的 container,就會自動啟始一個 transaction,當我們關閉 container 時,也會自動的進行 commit。 若是我們要 rollback 回前一次的 commit 點,則可以直接呼叫 Rollback() 方法: 但是,事實上,這邊存在一個問題,那就是:當我們對於一個存資料庫取出的物件做修改後(稱為 live object),那麼我們就無法 rollback 該物件於資料庫中。 我們必須要明確的刷新我們的 live object,方法如下:

2009年6月27日 星期六

在 Javascript Array 中插入元素

方法是利用 splice;這個方法除了一般用法外,可以接受如下三個參數: Array.splice(index, howMany, [element1][, ..., elementN])
  • 第一個參數是開始移除元素的 index(從 0 開始)
  • 第二個參數是要移除多少個元素
  • 之後的參數就是要插入的元素
所以若是我們要在陣列的開頭位置插入一個元素“23",我們可以用如下的方式達成:
// info 為一個 Array
var new_array=info.splice(0,0,"23");

2009年5月25日 星期一

讓 IIS 6.0 運行於 32 bit 模式

參考 如何在 64 位元版的 Windows 上切換 32 位元版的 ASP.NET 1.1 與 64 位元版的 ASP.NET 2.0 一文 主要方法節錄如下: cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1

2009年4月4日 星期六

用 index 改善 db4o query 的效能

在 code 中記得要對會需要進行 query 的 field 進行 index,可以大幅改善效能。下面是一個例子:
Db4oFactory.Configure().ObjectClass(typeof(GeneOntologyInfo)).ObjectField("id").Indexed(true);  // 重點是這段;因為我們會常常搜尋 id==X 的物件,故對該 field 進行 index
gene2GO = Db4oFactory.OpenFile(GENE2GO_DB);
using (StreamReader r = new StreamReader(GENE2GO_SOURCE))
{
 while ((line = r.ReadLine()) != null)
 {                            
   string[] info = Regex.Split(line, @"\t");
   GeneOntologyInfo ginfo = new GeneOntologyInfo(info[2], info[3], info[4], info[0]);
   gene2GO.Store(ginfo);
 }
}


// query 的程式碼
IQuery query = gene2GO.Query();
query.Constrain(typeof(GeneOntologyInfo));
query.Descend("id").Constrain(id);
IObjectSet result = query.Execute();
// 略

2009年3月19日 星期四

VS2005+VSS 經由 Internet

  1. 安裝 VSS
  2. 安裝完畢後,開啟 VS2005
  3. 工具->選項->原始檔控制->外掛程式選擇:選取 Microsoft Visual SourceSafe (Internet)
  4. 開啟->方案->SourceSafe (Internet)->Add SourceSafe Database
    • Address: 輸入 VSS server 網址(如 localhost)
    • Folder: 輸入 VSS folder(如 \\localhost\VSS)
  5. 在跳出的視窗中輸入 VSS 的帳號和密碼
  6. 成功加入 SourceSafe Database 後,在列表中選取加入的資料庫,接著選取要開啟的專案即可

2009年2月16日 星期一

POS Tagger 工具

TreeTagger
The TreeTagger is a tool for annotating text with part-of-speech and lemma information. It was developed by Helmut Schmid in the TC project at the Institute for Computational Linguistics of the University of Stuttgart. The TreeTagger has been successfully used to tag German, English, French, Italian, Dutch, Spanish, Bulgarian, Russian, Greek, Portuguese, Chinese and old French texts and is adaptable to other languages if a lexicon and a manually tagged training corpus are available.

2009年2月11日 星期三

iPhone/iPod Touch 破解後軟體安裝列表 (Firmware 2.2.1)

iPhone/iPod Touch 破解後安裝的軟體列表
  1. 更新 Cydia
  2. 加入如下 source 到 Cydia 的 Source lists
  3. 利用 Cydia 安裝
    • OpenSSH:遠端登入(root/alpine)
    • SBSettings:系統細部設定,與快捷鍵
      • Fast Notes
      • Autolock SBSettings
      • Process
    • WinterBoard:布景主題
    • QuickGold:快速啟動應用程式或搜尋
    • Five Icon Dock:讓 Dock 可容納五個 icons
    • Stack:在 Dock 上多出數個快速啟動 apps
    • xGPS:離線地圖(地圖檔位於 /private/var/mobile/Library)
    • mxTube:離線觀看(下載)YouTube
    • miPatch Firmware 2.2.1:安裝破解的應用程式
    • BossTool:移動系統檔案,增加 OS 磁區容量(移動完畢可以移除
    • Lock Calendar:在鎖定畫面顯示行事曆
    • Appbackup
    • Aptbackup
    • Stumbler Plus
    • Safari Download Plug-In
    • hClipboard
    • Clippy
  4. 自 Cydia 中直接加入 SOSiPhone source(安裝 Installer 4 用)
  5. 自 Cydia 中安裝 Installer
  6. 在 Installer 中加入 http://app.weiphone.com/installer/ Source

2009年1月11日 星期日

EndNote 的 references 無法被自動抓取出

上傳 Word 時,某些 citations 無法被正確解析的可能解決法:EndNote 技術支援

另外,也可以檢查是否 EndNote 裡面的 citation 中,欄位包含了摘要等大量的資訊,都可能造成無法正確解析的問題(如上述連結中只出現 ,可能是因為包含了該 citation 的摘要)。

2009年1月6日 星期二

啟用 IIS 的 SSL 連線

會搞這個是因為新版的 Firefox add-ons 若要啟用更新,更新的描述檔連結用 SSL 加密,因此必須要對 IIS 伺服器加上額外的設定。

若是 add-ons 的更新連結沒有用 SSL 加密的話,建立的 add-ons 上面會出現紅色的驚嘆號,並且出現「未提供經由加密連線的更新」的訊息。

以下內容部分參考How To:在網頁伺服器上設定 SSL

產生憑證要求

  1. 啟動 IIS Microsoft Management Console (MMC) 嵌入式管理單元。
  2. 展開網頁伺服器名稱,並選取要安裝憑證的網站。
  3. 在網站上按一下滑鼠右鍵,再按 [內容]。
  4. 按一下 [目錄安全設定] 索引標籤。
  5. 在 [安全通訊] 中按一下 [伺服器憑證] 按鈕,以啟動 [Web 伺服器憑證精靈]。
  6. 按一下 [建立新憑證],再按 [下一步]。
  7. 按一下 [準備要求,但於稍後傳送],再按 [下一步]。
  8. 在 [名稱] 欄位中鍵入憑證的描述性名稱,並在 [位元長度] 欄位中鍵入金鑰的位元長度,再按 [下一步]。精靈會使用目前網站的名稱作為預設名稱。它並非用於憑證,而是充當協助系統管理員的易記名稱。
  9. 在 [組織] 欄位中鍵入組織名稱 (如 Contoso),並在 [組織單位] 欄位中鍵入組織單位 (如「銷售部門」),再按 [下一步]。此資訊將置於憑證要求中,所以請確定它是正確無誤的。CA 會驗證此資訊並將其置於憑證中。瀏覽網站的使用者會想要查看此資訊,以決定他們是否應該接受憑證。
  10. 在 [公用名稱] 欄位中輸入網站的公用名稱,再按 [下一步]。公用名稱是憑證所有資訊中最重要的資訊之一。它是網站的 DNS 名稱 (即使用者瀏覽網站時鍵入的名稱)。如果憑證名稱與網站名稱不符,則會在使用者瀏覽至該網站時報告憑證問題。如果您的網站位於網路上,且命名為 www.contoso.com,則這就是您應該指定的公用名稱。如果網站位於內部網路,且使用者是以電腦名稱進行瀏覽,請輸入該電腦的 NetBIOS 或 DNS 名稱。
  11. 輸入憑證要求的檔案名稱。

提交憑證要求

  1. 若是並未安裝 Certificate Services,則請先安裝該 service。
  2. 使用 [記事本] 開啟上一個程序所產生的憑證檔案,並將其全部內容複製到剪貼簿上。
  3. 啟動 Internet Explorer,並巡覽至 http://hostname/CertSrv,其中 hostname 是執行「Microsoft 憑證服務」的電腦名稱。
    • 若是在 IIS 中並未存在 CertSrv 目錄,則新增一虛擬目錄,並且將虛擬目錄的來源設定為 C:\WINDOWS\system32\certsrv
    • 若是存取 http://hostname/CertSrv 發生權限問題,請在 IIS MMC 中的 Directory Security 中啟用 Windows authentication 的選項,並且用管理者的帳號及密碼登入。
  4. 按一下 [要求憑證],再按 [下一步]。
  5. 在 [選擇要求類型] 頁面上按一下 [進階要求],再按 [下一步]。
  6. 在 [進階憑證要求] 頁面上按一下 [使用 base64 編碼 PKCS#10 檔案,提交憑證要求],再按 [下一步]。
  7. 在 [提交已儲存的要求] 頁面上按一下 [Base64 編碼憑證要求 (PKCS #10 或 #7)] 文字方塊,再按 CTRL+V,以貼上您先前複製到剪貼簿中的憑證要求。
  8. 在 [憑證範本] 下拉式方塊中按一下 [Web 伺服器]。
  9. 按一下 [提交]。

發行憑證

  1. 從 [系統管理工具] 程式群組中啟動 [憑證授權單位] 工具。
  2. 展開您的憑證授權單位,再選取 [擱置要求] 資料夾。
  3. 選取您剛剛提交的憑證要求。
  4. 在 [執行] 功能表上,指向 [所有工作],再按一下 [發行]。
  5. 確認憑證已顯示在 [發出的憑證] 資料夾中,然後在其上按兩下以檢視之。
  6. 在 [詳細資料] 索引標籤上按一下 [複製到檔案],並將憑證儲存為 Base-64 Encoded X.509 憑證。
  7. 關閉憑證的 [內容] 視窗。
  8. 關閉 [憑證授權單位] 工具。

在網頁伺服器上安裝憑證

  1. 啟動 Internet Information Services (如果它尚未執行的話)。
  2. 展開伺服器名稱,並選取要安裝憑證的網站。
  3. 在網站上按一下滑鼠右鍵,再按 [內容]。
  4. 按一下 [目錄安全設定] 索引標籤。
  5. 按一下 [伺服器憑證],以啟動 [Web 伺服器憑證精靈]。
  6. 按一下 [處理擱置要求及安裝憑證],再按 [下一步]。
  7. 輸入包含 CA 回應的檔案路徑與檔案名稱,再按 [下一步]。
  8. 檢查憑證的概觀,按 [下一步],再按 [完成]。
  9. 憑證現已安裝在網頁伺服器上。

圖檔轉換成 ICO 或 PNG 的服務網站

Convertion:需安裝 Flash player