Plurk FaceBook Twitter 收進你的MyShare個人書籤 MyShare
  顯示內嵌語法

OpenFoundry自由軟體充電報

OpenFoundry自由軟體充電報
2006.6.13/報主.Tumi

本期內容:
[技術專欄] 我該如何存取一個設定檔?
[技術專欄] 跨越 IDE 的 Apache Ant
[開放原力] 數位時代的創作足跡

[技術專欄] 我該如何存取一個設定檔?

李日貴(松凌科技技術總監)/文 2006/05/12

Java Opensources for Web Development Part I:
嘗試使用來自 Opensource 的小工具(1)
Lession 1 : 我該如何存取一個設定檔?

在我們撰寫一些系統的時候,往往需要設定一些基本的屬性,在使用 Java 進行 Web 開發之中,可以將相關設定放在 JNDI Server 再透 過 context lookup 重量級的方式來取得相關的屬性。不過,有時候 簡單的環境,不必耗時耗力去搞清楚如何去使用 Java naming 的技 術,往往不過是要讀取一些設定檔罷了,所以我們這時候可以利用 Jakarta commons-configuration 的小工具, 來讓我們簡化這方面 的工作。

什麼叫做一個設定檔?簡單來說,一個設定檔最重要的就是有屬性名 稱與屬性值,通常都是利用 String 的方式來存取,必要時候再進行 轉換物件型態為實質的屬性型態。話說回來,現在設定檔的撰寫方式 琳瑯滿目,Jakarta commons-configuration 是否可以滿足我們的需 求?我本身大多採用 Properties 或 XML 的方式在撰寫設定檔,也 許會有人將設定在資料庫之中,很令人高興的是 commons-configuration 的確可以涵蓋大多數人的需求。

由 http://jakarta.apache.org/commons/configuration/ 下載最新 的版本,將它解壓縮到一個目錄之後,我們可以看到該目錄之中,有 一個 commons-configuration-##.##.jar 並且將該 jar 檔案放到你 的 /WEB-INF/lib/ 之下,當 Application Server 重新載入該 webapp 之後, 就代表可以使用了。

因為 Servlet 可以設定在 webapp 啟動的同時,馬上呼叫。只需要 在 web.xml 設定 load-on-startup 即可,所以我們利用該技巧,將 相關的設定屬性值在剛開始的時候取出放到某個 instance 之中,這 樣就可以提供給其他程式直接使用。

◎ 範例 1-1:透過 SystemInitServlet 載入 system-config.xml

system-config.xml 放在 /WEB-INF/conf 之下

<config>
    <ip>10.10.1.1</ip>
    <account>jini</account>
    <password>jakarta99</password>
    <roles>
        <role>admin</role>
        <role>manager</role>
        <role>user</role>
    </roles>
</config>

接著再利用 SystemInitServlet 中利用 XMLConfiguratin 取得 system-config.xml Configuration config = new XMLConfiguration (configPath);

String ip = config.getString("ip");
String account = config.getString("account");
String password = config.getString("password");
List roles = config.getList("roles.role");

這樣,我就可以自由利用這幾個設定在 system-config.xml 的屬性, 進行系統中的設定。

◎ 範例 1-2:透過 SystemInitServlet 載入 system-config.properties

其實我們僅僅需要修改 Configuration 讀取的檔案位置,並且修改 為 properties 檔案名稱。最後利用 PropertiesConfiguration 就 可以讀取相關的資訊,也可以讀取 Collection 型態的集合屬性。

Configuration config = new PropertiesConfiguration(configPath);

另外,我們可以 config.setProperties(“addproperty”, “this is added by configuration” ); 接著 config.save() 將相關設定值存放到該 properties 的檔案之中。

總之,透過 commons-configuration 可以簡化您在存取設定檔案的 工作,就不用花時間去了解 FILE IO 的程式運作方式,更可以簡化 Java 存取 XML 的工作。 當然,隨著版本的演進,功能越來越多, 例如兩個設定檔的合併、plist 的支援等等,所以可預期的是,我們 將可以用到更多支援的設定檔方式。(下期待續)

關於作者:
李日貴目前擔任松凌科技 (Softleader) 技術總監,同時是 Java 公 開原始碼報作者。專長包括:大型 J2EE 系統整合開發、金融交易平 台的研發、企業入口網站的規劃與分析、Java Open Source 的研究。



[技術專欄] 跨越 IDE 的 Apache Ant

李日貴(松凌科技技術總監)/文 2006/06/09

Java Opensources for Web Development Part I:
嘗試使用來自 Opensource 的小工具(1)
Lession 2 : 跨越 IDE 的 Apache Ant

Java 最基礎的編譯工具就是 JDK 之中的 javac 這個編譯器,但是往往在開發一個大型的專案之時,我們通常會利用 IDE 來完成相關的程式開發、除錯、編譯及包裝的動作,進而與一些應用伺服器或是資料庫做相關的整合。但是,往往開發習慣的不同,Java 之中有許多不錯的 IDE 工具讓大家使用,但是,該如何將一個專案讓大家都可以順利的匯入,我們可以利用 apache ant 這個小工具,另外,更可以利用 ant 這隻小螞蟻配合其他小工具進行連續性的軟體工程整合開發 (Continuous Integration : MartinFlower)[] 。

其實講述 ant 操作的書籍已經很多了,我個人建議僅需要從 http://ant.apache.org 下載 ant 的 Binary 檔案,解壓縮到一個目錄後( 例如 c:\apache-ant-1.6.5\ ) 並且設定環境變數 ANT_HOME = c:\apache-ant-1.6.5\ 以及 PATH 加上 %ANT_HOME%\bin,加上參考著範例直接練習就足夠應付大多數的狀況了。

不同於如 make其他編譯工具,ant 採用了 XML 作為執行的環境設定參考。當你執行 ant 的同時,他會先去尋找該執行目錄之下是否存放著 build.xml ,或是你可以強制 ant –f setup.xml 來執行 setup.xml 這個 ant 參考檔案。另外,通常我們除了使用 build.xml 來設定工作的項目之外,我們還會設定一個 build.properties,這個檔案通常會因為環境的不同進行一些資料庫或某些伺服器的名稱與位置設定等。

我們下載上次講到 jakarta commons-configuration 的 source code,解壓縮之後,你就應該可以在根目錄之中,察看到 build.xml 這個檔案,我們就來這個來做範例吧。

一個 xml 檔案最上方,通常會有對這份文件的宣告,如果有中文建議以 UTF-8 並且存成 UTF-8 的檔案。

<?xml version="1.0" encoding="UTF-8"?>

所有的 build.xml 之中,都匯定義 <project>,我們通常還會設定預設 (default)的工作目標 (target) 以及工作的目錄 (basedir)。

<project default="jar" name="commons-configuration" basedir=".">
</project>

很明顯的,我們可以看到預設工作目標是 “jar” 這個 target,所以我們可以檢查到

<target name="jar" description="o Create the jar" depends="compile,test">
</target>

這時候,便可以發現 jar 和 compile 與 test 是具有相依性 (depends) ,換句話說,當我們在執行 jar 之前,會先去執行 compile 與 test 這個 target,這種繼承關係,就是 ant 能夠大受歡迎的地方。

至於到了 target 之中,我們到底要執行什麼任務 (task),這就必須了解,ant 能夠協助我們完成什麼。

* 檔案壓縮的任務 : <jar> <zip> <war> 等等
* 稽核檢驗的任務 : <jdepend> <jprobe> 等等
* 檔案編譯的任務 : <javac> <jspc> 等等
* 系統部署的任務 : <serverdeploy> // 目前大多應用伺服器都支援熱部署
* 文件產生的任務 : <javadoc> <stylebook> 等等
* EJB 專屬的任務 : <ddcreator> <ejbc> 等等
* 程式執行的任務 : <ant> <exec> <java> 等等
* 檔案目錄的任務 : <mkdir> <copy> <delete> 等等
* 日誌記錄的任務 : <record>
* 郵件寄發的任務 : <mail>
* 其他工具的任務 : <echo> <script> <sql> 等等
* Properties 的任務 : <property> <propertyfile>等等
* 遠端作業的任務 : <ftp> <telnet> <setproxy> 等等
* 共同作業的任務 : <cvs> <clearcase> 等等
* 單元測試的任務 : <junit> <test> 等等

當我們擁有了這些任務,就可以很快地製作出我們的專案。最重要的,我們更可以利用 ant 來協助我們連續式開發的方式。另外,大多的 java opensource 隨著原始碼都會附加 build.xml 讓使用者去 compile 出相關的系統, 所以學習 java opensource 的人不能不認識 ant 的操作。

1.http://www.martinfowler.com/articles/continuousIntegration.html
2.相關網址:Lession 1 : 我該如何存取一個設定檔?



[開放原力] 數位時代的創作足跡

Jedi/文 2006/06/02

千禧年以來,網路文化的蓬勃發展恐怕要歸功於各式各樣的軟體系統──不是因為這些程式採用了甚麼嶄新的演算法,而是因為它們持續地降低各種使用的門檻,讓先進的技術也能為販夫走卒所用。這種變化中,最為人所知的莫過於部落格:由於工具使用的簡化,而真正改變人們思考方式的最佳例證。

以部落格作為開端,值得我們繼續發想的還有許多不同的創作形式。首先不妨讓我們來看看程式碼:所有建構今日網路世界的創作中,最特別的一種創作。程式碼的創作很特別,尤其是對於多人參與開發的系統來說,總是會有一個程式碼的「倉儲」,陳列著歷次演變修改的經過;試想一幅畫作,從構圖開始,每一筆被添加上去的樣子,以及每一道被拭去的擦痕,都被完整地保留了下來,創作者可以從過往任何一刻的作品形體為基礎,嘗試全然不同方向的變化。

但是除了程式碼之外的所有創作,都沒辦法這麼做。你或許知道金庸的小說每一版都略有出入,但是除非你是專門研究「金學」的人,否則你很難確切知道到底是哪裏不同;你可能知道一般漫畫中「被擦掉的線條」恐怕比留下來的還多,但是就算你是原作者,被擦掉的線條就是被擦掉了,你很難再「從中途重來一次」。造成此差異的原因,部分來自創作習慣的不同,但是更大的原因其實是來自於創作工具的不同。

對於程式設計師來說,開發環境就有版本控制系統、修訂版倉儲可以說是天經地義的,當他們每次遞交程式碼時,開發系統就會自動處理完其他事;但是對於作家來說,顯然沒有人幫他們整理廢紙婁內被揉成一團的草稿,這些曾存在過的靈光一閃就這樣淹埋於浩瀚宇宙中,從此沒有再見光明的一日。

當然我們都知道微軟的 Word 內建了一個叫「追蹤修訂」的功能,但是那其實是個悲劇──即便是最新版的 Word ,也無法承受數百次變更後的檔案,這個檔案甚至可能錯亂而無法被正確讀取。包括微軟的多家廠商在開發新的作業系統時,也都試著想採用內建修訂版管理的日誌式檔案系統,但是這樣子對所有檔案均以修訂版的方式管理,會讓使用者付出過高的成本,最後也紛紛作罷。

對照軟體開發環境的作法,到底非程式的創作者們需要的是個怎樣的環境呢?首先,我想最重要的一點,就是原本的工作應當受到最小的干擾──視覺顯示上不應該因此變得凌亂,檔案尺寸不應當因此變得肥大,操作不應當因此變得窒礙,設定不應當因此變得繁瑣,介面不應當因此變得費解。接下來,在標定版本變更及檢視版本差異時,又是另一個挑戰:文字著作也許需要逐字比對,但是也許需要的是逐句或逐段的比對,甚至是逐章節的比對;但是遇到音訊或視訊這類多維度(音軌、節奏、頻率、音強、解析度、亮度、彩度、效果……)的資訊時,又該怎麼辦?更遑論這些不同版本間要如何合併混用了。

在過去幾十年來,所有紀錄、分析、使用這些變更的資訊,要嘛變成大部頭的學術論文,要嘛變成紀錄片。在接下來的這個世紀中,如果這方面的技術能有卓越的進展,人類的文化纔真的是又往數位化時代邁出宏遠的一步吧。



報主的話:
自本期開始,電子報再接再厲推出新的技術專欄,邀請松凌科技技術總監李日貴先生擔任專欄作者,暱稱為 "jini (99% jakarta)" 的他專長為 Java Opensource 的研究,自本期開始接下來每期都將和讀者分享程式開發的技巧,敬請期待 :)

本電子報為摘要版,若欲訂閱全文版請按此