Wednesday, 27. February 2008

New blog site
01:27
New blog site is
http://jini.softleader.com.tw/please change your RSS feed to
http://jini.softleader.com.tw/rss.xmlTuesday, 26. February 2008

Error reading tld listeners
09:35
tomcat 5.5.20 + JDK1.5 + commons-logging1.1 + log4j1.2.5
並且在 web.xml 有設定 listener
在啟動 tomcat 會導致這問題.
解法.
- 升級到 tomcat 5.5.26, 確實修改版本我不知道
2. 移除 commons-logging1.1, 放入 commons-logging1.0.x
3. 不要用 log4j (我想這大概不可能 )
that's all
Sunday, 24. February 2008

about HappyWeb 9
04:45
其實我早已經認識 XDite (
http://blog.xdite.net/) 與 ingram (
http://www.javaworld.com.tw/roller/ingramchen/ ), 他們也頗富盛名的, 似乎也不用我多在這裡著墨太多, 反正要不是最近除了工作之外, 我都在看 九把刀 vs 陳生 外加湊熱鬧的 朱學恆 (
http://blogs.myoops.org/lucifer.php/ ) 相關新聞. 不然早就把這篇文章寫出來了. 我不擅長分析中文是否為抄襲, 所以不敢對這類事件妄下評論… 只能說 "公道自在人心, 人心反應在網友的投票上".. 朱大, 希望你開票的結果不會和我期望相反 :D
HappyWeb 9 的確是一場很精彩的會議, 尤其讓大家看到 RoR vs Java @Microsoft on HappyWebb 這種奇妙的組合, 我想, 無論是什麼技術 XDite 選擇 RoR 開發 veryXD , ingramchen 使用 Java 打造 Din.Ben.Don 都是因為自己喜歡或是熟悉這個技術. 上次去大陸, 透明和 robin 一直對我說 RoR 非常非常簡單, 但是我用了一陣子, 還是覺得很不習慣, 反正我就是喜歡用 java .. 你能拿我這麼樣, 我又不會開發得比你慢, 所以, 至少要熟悉一套程式語言是最基本的, 而那套程式語言最好有很多 opensource 或是 free 的 libs, 這樣才可以馬上運用, 就好像是如果 XDite 沒有找到 RMagick (Ruby), 恐怕影像處理那一段就得花上很多時間去寫程式, 不過 ImageMagick 也有提供 java (JMagick) 和其他語言的支援, 我覺得最核心應該就是這段, 其他的還是連連資料庫的留言板功能呀.... 我開玩笑的啦!!
我覺得在台灣搞 Web2.0 的人大概都有個通病, 就是宅, 但是我覺得 ingram 變了.. 天啦, 變到我女朋友都稱讚帥.. 看來我最後可以混飯吃的稱號也要被剝奪了. 如果把 "是男子漢就要用 PostgreSQL" 作為當日最佳口號, 我想應該沒什麼人會反對吧, 特別由 ingram 口中說出, 我不由得拍手叫好. 反倒是現場似乎有很多 XDite 或是 RoR 的群眾.. 哈.. 我感覺真的很好玩, 特別是會議結束兩邊的冷熱程度, 讓我感受到,… XDite 你真的很紅 !!
最後, 總要有一些真正的感想, 我的感想是, veryXD 其實很搞笑, 但是我上次連過之後, 一直到現在還是沒有上去, 大概對我沒有什麼吸引力吧, Din.Ben.Don 在 ingram 的定義是一個工具網站, 我覺得這工具對於很多公司的秘書應該是很重要的, 自然會吸引人持續用下去. 就因為網路有太多娛樂可以作, veryXD 應該是其中的一個, 只能看他未來的發展為何, 如果單純練功, XDite 你做到了~ 如果要經營.. 那就再想想吧, 反正頻寬是力可科技 ( 在參觀之前, 我一直以為我辦公桌是很亂的 ) 支持你的 !
最後其他記事..
- 無敵小恩恩是哪位呀.. 竟然可以抓到我回頭一瞬間的鏡頭.
- cjin 很不會抱小孩, tempo 會怕小孩
- moli 很辛苦, jiji 你真大膽
- 不得不再提 "是男子漢就要用 PostgreSQL", 不過我只有玩過.. 原來我不是男子漢..
Sunday, 17. February 2008

研究 Scriptella 相關心得
23:05
如果要查詢 Open Source ETL Written in Java, 可以查閱以下這個連結
http://www.manageability.org/blog/stuff/open-source-etl
我目前研究了幾個 ETL :
- CloverETL
- Talend(JasperETL)
- Scriptella
不過 CloverETL 與 Talend 都有一個問題, 就是採用 Eclipse 作為 GUI 開發的模式(而且不是要 license 就是要註冊, 感覺很麻煩), 如果沒有內建的 Components 就需要額外的開發, 因為這次我要解決的是大量的 cobol rowdata(用字串長度切割) 的文字檔案到 Database, 而不是一般的 csv 或是資料庫之間轉換, 加上 GUI 對我來說只是增加 definition 的複雜度, 不太適合我們移交給客戶簡單學習與我們操作介面的開發.
Scriptella 算是蠻新的 ETL 小工具, 我測試了相關的效能還覺得不錯, 以 10 萬筆 csv 的轉到資料庫中, 大約只需要 15 ~ 20 秒左右的時間, 不過當我研究裡面的 sources codes, 讀取 csv 檔案的方式可以透過 csv (by opencsv) 或是 text (by scriptella), text 擁有較快的速度. 因為是採用 java.util.regex 的查詢, 類似 (.*) 這樣的 pattern 進行切割, 而 opencsv Driver 則是設定 quote=", separator=; 類似的參數, 就會進行資料查詢切割.
不過吸引我的地方, 就是 xml 檔案格式非常的單純, 幾乎只要看了就知道要怎麼去設定, 另外, 他們的 SPI 更單純,
http://scriptella.javaforge.com/docs/api/scriptella/spi/package-summary.html
主要實做相關的 Interface 就可以了, 首先就是 Driver extends AbstractScriptellaDriver, 在 connect method 呼叫 extends AbstractConnection 的 Connection, 主要設定相關 Transaction 的模式. 其餘的就是看你要怎麼去實做 Callbacks 以及如何取用相關的 Parameters,
另一個困擾我的問題, 就是原本我期望在 xml 檔之中設定 <formats> 等 xml 來定義我的參數, 但是會和 etl.dtd 衝突, 有三個解決方法,
- 重新 compile scriptella 不去驗證 dtd,
- 重新定義 etl.dtd,
- 不要用 xml
我選擇 "不要用 xml" 來定義我的參數 ( column startpos, length, type and etc.. ) 我改用 JSON 的設定方式,
總結, 如果不需要圖形話介面的輕巧 ETL 工具, Scriptella 是個不錯的工具.
Monday, 11. February 2008

JSR 223, javax.script
08:47
在 JavaSE 6 裡面加入了 Java Scripting 的 API, 我記得很久以前在 BBS 有討論, 學 Java 和 JavaScript 的差別, 往往得到的答案是 Java != Javasript. 把 Javascript 的應用侷限在網頁設計之上, 但是隨著 AJAX 應用與 script 輕便性的考量, 在 JavaSE6 加入了 Script 的應用, 主要是為了簡單快速的開發應用, 對我來說, Scripting 的語言可以更容易進行文字處理而不用去考慮型別.
首先, JavaSE 6 要怎麼應用 Script 語言呢
主要是採用 javax.script 之下的 API
- 建立 ScriptEngineManager 物件
- 向該 Manager 物件取得 ScriptEngine
- 執行 ScriptEngine 的 eval() method
例如,
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval("print('Hello world')"); // 直接跳出 Hello World 對話框
engine.eval(new java.io.FileReader("c:\\test.js")); // 取得 test.js 的 script 執行
因為 JavaSE 6 具有 Scripting Engine 的執行環境, 所以 script 的語法可以和 java 相互交錯, 也顯得更為複雜. 例如
File f = new File("test.txt");
engine.put("file",f);
engine.eval("print(file.getAbsolutePath())");
Engine 在執行 print 的時候, 發現 file 物件是由 java 傳送(put) 過來的, 所以他先利用 java 的執行環境取得 getAbsolutePath() 的字串, 才回到 ScriptEngine 中繼續執行 script 語法.
除了在 ScriptEngine 中呼叫 Java method 之外, 在 Java 之中也可以呼叫 Script function,
String script = 'function hello(name){ print('hello js to '+name);}";
engine.eval(script); // 建議都採用 js 檔案比較好寫
Invocable inv = (Invocable) engine; // 將 engine 轉型可以被 java 呼叫, 視你的 script engine 來決定是否有實做
inv.invokeFuction("hello","jini");
如果採用某個 js 物件的 Object, 可以用 get 取得該物件, 更可呼叫(invokeMehtod) 他的屬性
Object obj = engine.get("obj");
以上是比較基礎的應用, 其他的可以參考
http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html
http://jcp.org/en/jsr/detail?id=223
http://www.mozilla.org/rhino/
- Scripting dev.java.net 可以查看其他的 scripting engine 是否有你熟悉的 script engine
https://scripting.dev.java.net/
Saturday, 29. December 2007

開始 Grails
15:50
下載 grails zip file (
http://grails.codehaus.org/Download ) 解壓縮到 c:grails , 並且將系統參數 GRAILS_HOME 設定到 c:grails , 以及 PATH 新增設定 %GRAILS_HOME%bin.
我們建立一個 d:grailsprojects 的目錄, 開始來開發 Grails 相關的專案.
先記住幾個指令
(1) 建立專案 create-app
(2) 設定 DataSource
(3) 建立Domain物件 create-domain-class
(4) 建立 Scaffold Controller create-controller
(5) 產生相關檔案 generate-all
(6) 開啟jetty執行環境 run-app.
(7) 使用瀏覽器觀看 Grails index 與使用 Controller
仔細說明可參考
http://grails.codehaus.org/Quick+Start影片說明可參考 Scaffolding 的範例
http://grails.codehaus.org/Grails+Screencasts我的 Eclipse 有加入 Grooy-plugin (
http://groovy.codehaus.org/Eclipse+Plugin ),
所以在 (3) 步驟時, 會用 Eclipse 進行編寫.
建立 DataSource 是編寫 $projectname/grails-app/conf/DataSource.groovy , 相關的 JDBC jars 檔案要放在 $projectname/lib 之中! 在 (scaffold) generate-all 的時候, 要選擇產生那個 Domain object. Domain Object 預設都有 id 與 version 的欄位. 當新增時, version 就會 0, 修改時就會 update version=version+1
Friday, 28. December 2007

在非 IBM 機器上使用 IBM JRE 5 (Windows)
12:10
不知道有沒有人和我有同樣的困擾, 使用 SUN JDK 連結 DB2 會有 "encoding not supported!!" 的這種錯誤, 一定要使用 IBM JDK, IBM JDK 1.4 還蠻容易取得的, 在安裝 Websphere 之中就有 jdk 的目錄, 直接複製就可以用了, 但是我習慣使用 SQuirrelSQL 作為DB viewer (
http://squirrel-sql.sourceforge.net/ ) 但是最新的版本都一定要用 JavaSE 5 以上的版本,
所以下載了 IBM JRE 5 (
http://www-307.ibm.com/pc/support/site.wss/document.do?sitestyle=lenovo&lndocid=MIGR-56888 )… 但是, 出現了
"This is non IBM system,cannot continue Installation", 所以利用 Universal Extractor
(
http://legroom.net/software/uniextract )
將 exe 打開成為 msi, 再用 msi 解開成為 IBM 32-bit Runtime Environment for Java 2, v5.0 目錄結構.


最後, 只需要拉出 Java50 作為 JAVA_HOME 或 JRE_HOME 即可
Reference From :
http://www.newsmth.net/pc/pccon.php?id=1850&nid=254555&s=allThursday, 20. December 2007

commons-beanutils RowSetDynaClass 的問題
19:02
我想, 大概世界上敢定自己規格的資料庫廠商大概就是 Microsoft 和 Oracle 了吧.
改寫一套舊的系統, 要將檔案存放在資料庫之中,
MS-SQL Server 2000 是設定為 image 的 Datatype,
在 Metadata 取得的型態是 byte,
但是將 ResultSet 放到 RowSetDynaClass 的時候就會報錯,
因為他用了 ClassLoader 取 loadClass("byte"),
自然找不到 byte 這樣的 class.
另外, 在 Oracle10g 也有類似的問題, Date Datatype 由 Metadata 取得是 java.sql.Timestamp, ResultSet 取得的 class 卻是 java.sql.Date ?
這篇 jira 就是討論 oracle 的解決方案
https://issues.apache.org/jira/browse/BEANUTILS-142BTW, 似乎很少使用 MSSQL 2000 的案例,
我剛好遇到, 我則是在 createDynaProperty 確認是回傳 byte 直接設定為 byte 的 DynaProperty.
if (className != null) {
if( className.indexOf("byte[]") >=0 ) {
return new DynaProperty(name, byte[].class);
} else {
clazz = loadClass(className);
}
}
總之, 自己要連結資料庫的狀況真的需要考慮更多 …
Thursday, 13. December 2007

該怎麼查看 Windows 目錄中的某目錄容量大小呢
10:20
沒有 *Nix quota 的指令, 當我的硬碟容量越來越少, 就會想查看到底哪裡偷偷吃掉我硬碟的空間..
如果利用 java.io 勢必要走過所有的目錄與檔案, 並且把他們加總在一起.. ( a little stupid )
看來.. 還是要用 JNI 解決方案… 查了一下.. 應該可以利用 FileSystemObject (
http://msdn2.microsoft.com/en-us/library/6kxy1a51.aspx )
Friday, 02. November 2007

2007 COSCUP 開源人年會 (A.D.)
18:12
http://coscup.org/2007/
- 時間:2007 年 11 月 3 日(六)- 11 月 4 日(日)
- 地點:台北市和平東路 2 段 106 號 科技大樓 二樓
Main Theme / 大會宗旨
傳統商業軟體的開發者(coders)和使用者(users)很少交流,是大家都接受的事實。你的軟體用起來有問題?請打技術支援電話,由客服人員為你服務,他或許已經儘其所能,但未必能解決你的問題。如果問題是軟體的臭蟲,你只好痴痴地等待不知幾年後才開賣的下一版。而你當初之所以選用A軟體而不是B軟體,常常是聽信銷售員(sales)的一面之詞或同儕的推薦。在這個行為模式下,users 面對的是銷售員和客服,coders 面對的還是銷售員和客服,users 遇到的問題要間接地才能反應到 coders 手上,中間還可能會被過濾掉。
Open source 這個在 1998 年出現的名詞,大家早已耳熟能詳。這種在網路上已經進行二三十年的軟體開發模式之所以能成功,有許多原因,其中一個極為關鍵的因素,就是 coder-user 的直接接觸。無屏障的交流形成了問題的快速回報和修補機制,而當這個機制被網路效應放大到極限時,Linus 定律就出現了:《臭蟲難逃眾人法眼》(With enough eyeballs, all bugs are shallow),軟體品質因此顯著提昇。在 open source 的模式中,coders 和 users 中間的人不再是銷售員或客服,而是讓軟體更容易被 users 接受的推廣者(promoters),他們打包套件讓軟體更好裝、寫說明文件讓軟體更易學、辦推廣活動讓軟體被更多人接觸到、在網路上回答問題解決使用者的疑惑,而且不會把 coders 藏在背後產生資訊的不對稱。
Coders、users 和 promoters 是讓 open source 軟體發光發熱的支柱,所以我們的 open source 研討會是專為這三種人舉辦的。你可以是 A 軟體的 coder、B 軟體的 promoter、C 軟體的 user。不論你是已經踏入 open source 領域,還是一直站在門口不知如何入門,歡迎你來參加 COSCUP - Conference for Open Source Coders, Users and Promoters!
今年的 COSCUP 最大的改變,是由各台灣本地社群共同舉辦,也希望能透過這樣的合作,增加社群同好的參與度,正如 COSCUP 的精神,在這個研討會當中,你同時是與會者,推廣者,也參與了大會的運作。
誰應該參加:
寫 open source 軟體的開發者、熱衷 open source 軟體的推廣者、熟悉 open source 軟體的使用者、想了解 open source 軟體的新手。