2011年9月23日 星期五

db4o 物件的唯一性:disconnected objects 的概念與 web apps

db4o 在單一 object container 的環境下,在物件管理上會確保儲存在資料庫內的物件的唯一性。但是,若是啟用了 client-server 或是 session-container 的架構,則會變成多 object-container 的情況,因此同一個物件可能會在不同的 container 中有不同的 memory identity。這種情況在 web 環境下一定會發生。這時候就要借助額外的 ID,如 db4o 內建的內部 ID:UUID,或是自行產生 ID。

簡而言之,最重要的概念就是加入 EventRegistry,在建立時去檢查是否有 ID 已經存在:

// register 
IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(icontainer);
eventRegistry.Creating += delegate(object sender, CancellableObjectEventArgs args)
{
    if (args.Object is Article)
    {
        Article a = (Article)args.Object;
        if (a.HasDb4oID()) {                       
           // don't insert because Article is already
           // in the container
           args.Cancel();
           Article existing = LookupArticle(icontainer, a.Db4oID) as Article;
           // merge change
           existing.MergeChanges(a);
       } else {
           a.SetDb4oID(a.ArticleID);
       }
    }    
};

相關參考資料如下:

2011年9月15日 星期四

Publish REST services on IIS 6.0

利用 WCF REST Service Template 完成 REST service 後,最後的問題是怎麼把它放到既有的 IIS 6 server 上。

Prerequisite

Steps

  1. 首先在 server 端,先替 IIS6 安裝好 Web Deploy 2.0。
  2. 在 client 端利用 VS2010 的 publish 介面將網站發布到 server 端。請參考如下設定:
    image
    其中,Service URL 就是 msdepsvc 的網址。而 Site/application 則填入欲發布的 server 端網站名稱(Site)與  WebApp 名稱(application)。
    • 舉例來說,若是遠端網站名為 Default,欲發布的 app 名為 test,則在 Site/application 填入:Default/test
  3. 另外當然,在 server 端也必須安裝好 .NET 4.0 framework。
    • 若是再安裝完 IIS 後才安裝 framework,須在 .NET 4.0 目錄下(如 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319)執行 aspnet_regiis –i
  4. 執行 aspnet_regiis.exe –lk 確認目前各 WebApp 的 .NET 版本狀態。並且確認剛 publish 過來的 app 是否使用正確的 .NET framework 版本:
    image
    • 以剛剛的例子來說,假設你的網站 ID 為 45,則執行後應該要顯示:
      W3SVC/45/Root/test    4.0.30319.0
    • 若發現不是使用 4.0 或更高的版本,則需要在對應的 .NET framwork 中執行
      aspnet_regiis –s W3SVC/45/Root/test
      將其更新為正確的版本。
    • 若是不知道網站 ID,可以透過 IIS 管理員的介面查看:image
    • 同理,若是同一個網站底下的其他 App 想使用不同的 .NET Framwork 版本,也可以使用對應的 aspnet_regiis 來設定之。
  5. 最後依造 Deploying ASP.NET MVC to IIS 6 的步驟,使用 wildcard mapping,讓 IIS 6 可以處理 routing。需注意,一定要把 uncheck Verify that file exists. 的選項取消!

2011年9月14日 星期三

iKVM

iKVM: Using Java API’s in .NET Applications

編譯時需加入 bin 目錄底下的 dll 檔。舉例來說,需要用到 java.util.Set,則需加入 IKVM.OpenJDK.Core.dll

Runtime 時需把 bin 內的 DLL 檔複製到與執行檔相同的目錄內。

2011年5月19日 星期四

Adobe Acrobat Javascript Example Codes

用 JavaScript 的方式語法較簡單。

修改 UI

利用 app。如 app.addMenuItem

重要的參數包括:

  1. cName: The language-independent name of the menu item. This name can be used by other methods (for example, hideMenuItem) to access the menu item.
  2. cUser: (optional) The user string (language-dependent name) to display as the menu item name. If cUser is not specified, cName is used.
  3. cParent: The name of the parent menu item. Its submenu will have the new menu item added to it. If cParent has no submenu, an exception is thrown.
  4. nPos: (optional) The position within the submenu to locate the new menu item. The default behavior is to append to the end of the submenu. Specifying nPos as 0 adds the menu to the top of the submenu.
  5. cExec: An expression string to evaluate when the menu item is selected by the user.

quads 應用

quads 回傳的內容為 4 組 (x, y) 的座標內容。舉例來說,
quads: [[43],[756],[78],[756],[43],[745],[78],[745]],
代表的是如下圖的座標:

image

的座標。

下面是動態建立一個 quads 與 Annotation 的範例:

var quads1=this.getPageNthWordQuads(p, startIndex);
var quads2=this.getPageNthWordQuads(p, endIndex);
var quads=[[quads1[0][0], quads1[0][1], quads2[0][2], quads2[0][3], quads1[0][4], quads1[0][5], quads2[0][6], quads2[0][7]]];
var annot = this.addAnnot({page: p, type: "Highlight",
                                      quads: quads, author: annotator
                                     });

上面的程式碼要注意換行的情況。

Resources

2011年4月29日 星期五

iOS4.3.1 更新後安裝的軟體列表

  • Bolt:只有在充電時才顯示 lighting 符號
  • CallBar
  • CleanStatus
  • DataDeposit
  • Double At
    • 在 iAcces 的鍵盤上無法使用
  • Gesture Control
  • iAcces
  • iFile
  • FreeSync
  • IntelliScreen
  • KuaiDial
  • LastApp
  • Personal Hotspot SBSetting
  • PictureMe
  • Pull to Refresh Mail
  • Pull to Refresh Safari
  • QuickDo
  • QuickOpen
  • RunningList
  • Samba*
  • SBSettings
  • ScreenDimmer
  • SpringFlash
  • StatusTweak
  • SwitcherPages*
  • UnlimTones
  • WeatherIcon
  • YourTube2
  • 3G Unrestrictor

2011年4月26日 星期二

如何 Debug PDF Plug-in

Project property page->Configuration Properties->Debugging->Command

中設定 Acrobat/Reader 的執行檔案路徑,再加上中斷點即可。

PS: 前提是編譯好的檔案要複製到 plug_ins 目錄內。

Server sent unexpected return value (413 Request Entity Too Large) 錯誤

上傳大型檔案到 apache server 時有可能發生的錯誤訊息。

解決方法是:開啟 httpd.conf 檔案,並且加入 LimitRequestBody 參數。

比如:

LimitRequestBody 102400

可以限制上傳檔案的到小最大為 100K。

Note:Apache server 的上傳上限為 2G。

參考:http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody

2011年4月22日 星期五

PDF prefix registration

Adobe 利用 4 個字元長度的 prefix 來區隔不同的 developer。

Adobe 預設使用 ADBE 或 Acro,一般開發者可以在 PDF prefix registration 中註冊自己的 prefix。藉由註冊自己的 prefix 可以確保跟其它開發者的元件區隔。

2011年4月20日 星期三

PDF library

Haru Free PDF Library

Hary free PDF Library 可用來建立 PDF 的免費 library。現階段不支援從既存的 PDF 檔案中載入的功能。

Acrobat SDKs

SDK 現在為免費提供。使用該 SDK 可建立軟體與增效模組,與 Adobe Acrobat 和 Adobe Reader 軟體互動並進行各項自訂。

References

2011年3月16日 星期三

SVN Server

使用的是COLLABNET: http://www.open.collab.net/

安裝完成後,加入一些細部的修改:

  1. 首先,COLLABNET 的管理介面是利用 Jetty 架設,所有的 request 都會被 redirect rule 修改,故,先修改 csvn\appserver\contexts 裡的 redirect.xml,將 csvn 的 contextPath 修改成需要的值,如 <Set name="contextPath">/</Set> => <Set name="contextPath">/test</Set> newContextURL 也可以視需求修改,如 <Set name="newContextURL">/new_csvn</Set>
    • 若是修改了 newContextURL,則還需另外修改 csvn\appserver\contexts 裡的 csvn.xml 檔,以對應修改完的 URL,假設 URL 修改成 test,則必須將 csvn.xml 內的 contextPath 作如下修改:
    • <Set name="contextPath">/csvn</Set> => <Set name="contextPath">/new_csvn/csvn</Set>
  2. 若是需要修改管理介面的服務埠號(預設是 3343),請開啟 csvn\svcwrapper\conf 裡的 wrapper.conf,然後將 wrapper.java.additional.3=-Djetty.port=3343 的值修改成需要的埠號
  3. 修改完畢後,須利用系統工具內的「服務」,將 CollabNet Subversion Edge 服務重新啟動

再來是跟 PHP 整合的部分,使用的是 Quercus,一個可以讓 PHP 和 JAVA 緊密整合的 PHP Java 實作。

  1. 將 Quercus 是一個 WAR 檔,直接下載完成後,將該檔解壓到 csvn\appserver\webapps 目錄裡。並將解開的所有 lib 檔複製到 Jetty 本身的 lib 資料夾中: copy quercus\WEB-INF\lib\*.jar csvn\appserver\lib
  2. 下載 MySQL JDBC Connector,並將解開的 mysql-connector-java-x-bin.jar 檔放到 csvn\appserver\lib 目錄內。
  3. 重新啟動 CollabNet Subversion Edge 服務後,開啟 quercus 的服務網址,若是出現 Congratulations 字樣即設定成功。若是要再進一步測試,可以在 csvn\appserver\webapps\quercus 目錄內 test.php 然後在內容填上:<?php phpinfo(); ?> 來檢視 PHP 的各項參數。

安裝 phpMyAdmin

  1. 複製 Quercus 的 WEB-INF 目錄,並且修改 web.xml,將 <init-param> <param-name>ini-file</param-name> <param-value>WEB-INF/php.ini</param-value> </init-param> 的註解取消。
  2. 複製 PHP 安裝目錄內的 php.ini 檔到 phpMyAdmin/WEB-INF 中。
  3. 目前 Quercus 跟 phpMyAdmin 整合上還有 bug,還待處理。我修改過的這個版本可以順利地出現登入畫面,不過還未完整。

java.security.InvalidKeyException: Illegal key size

  1. 將 local_policy.jar 和 US_export_policy.jar 檔複製到 JAVA_HOME/jre/lib/security (系統應該會提示你是否要覆蓋原本的檔案,選"是")
  2. 重新啟動 CollabNet Subversion Edge。

參考

2011年2月23日 星期三

Google Calendar 規劃時間功能

  1. 把主要的 Google Calendar 設定為與指定人士共用。該指定人士將依據參與人員的狀態負責協調那些人要參與該活動。
  2. 在欲協調的活動中,新增邀請對象後,選取要參與的人員。
  3. 參與的人員的 Calendar 中,會自動出現該活動。如下圖(這邊我建立了多個活動): 如上圖,需要確認是否參與的活動項目前方會有 [?] 圖示
  4. 參與的人員視情況決定是否能參加該活動。選項有三:是、也許、否。如下圖:
    • 若是週期性的活動,Google Calendar 會詢問你是要套用到所有的活動或是單次活動。請依情況選擇(大部分情況應該是選擇[僅限此次]。
    • 若是選擇是的話,在指定人士的 Calendar 上會看到 v 符號:
    • 選擇否的參與人員,在指定人士的 Calendar 上,該人員的前方會出現 (/) 符號,如下圖: 另外在日曆顯示上也會直接將該人員的名子已刪除線顯示,代表該人員不參與該活動,如下圖: