2007年3月22日 星期四

Virtual Machine的最新選擇 VirtualBox

現有的virtual mahcine領域中己經有許多很不錯的產品,除了商業的VMWare以外,MS的Virtual PC也轉為免費使用。open source也有聲勢浩大的XEN(不過需要修改kernel)和qemu。qemu還能模擬x86以外的cpu。

現在最新的生力軍是原來由德國的軟體公司InnoTek 所開發的VirtualBox。在前一陣子也開放轉為GPL的open source軟體。再加上不錯的效能,值得試一試。另外一個吸引我的是他也支援Linux能在Linux下使用,挺不錯的。

其實我比較在意的是模擬的效能,一般的模擬功能對我而己都己經足夠,模擬的效能才會影響我的使用。VritualBox看起來不像VMware那麼的吃資源(VMWare越做越大越好,也越來越吃資源),網路一般的風評也說效能很不錯。當然還是有人覺得差距不大的。要找個機會來試試看。

VirtualBox Home http://www.virtualbox.org

PS. 連網址都變成.org了呢。

2007年3月19日 星期一

serialVersionUID的警告

開始使用更新的Eclipse後,發現老是會出現serialVersionUID的warring,由warring的內容來看他跟seriable有關,只是以前怎麼好像沒遇過,查了一下才發現。

原來是不同的JVM的serialize實作不必然相同,所以這個serialVersionUID真的就是serail Version 的UID,可以用來表明serialize的版本,如果你將一個instance serialize後,在deserialize時就會檢查serialVersionUID是不是一樣,不一樣的話就不會deserialize ,就能控制相容性的問題。
如果你沒有自己定義serialVersionUID的話,JVM(?)會依據class計算出不一樣的serialVersionUID,下次你在class裡新增member的話,serialVersionUID 不一樣就不能做
deserialize 。
如果你自訂serialVersionUID,就能控制serialVersionUID,class能相容從舊的serialize storage再deserialize,而新增的member就會變初始預設值。在runtime時可由java.io.ObjectStreamClass取得serialVersionUID值。
如果不知道取什麼值 JDK有個tool
serialver.exe可以幫你產生值。

2007年3月12日 星期一

runtime compile JasperRport jxml report template

最近接手別人的JasperReport tool,在客戶那一直發現有compiling的問題
runtime exception出現 net.sf.jasperreports.engine.JRException: Error compiling report java source files : m_1173545492049_398184.java 但在自己的電腦上就是沒這個問題,一直查不出來。後來才發現,JasperReport的template如果使用xml格式的話,他需重新compile,會有個暫存檔,也會用到javac程式。而之前的同事教導客戶安裝JRE就可,沒有JDK。難怪在我的開發環境上一直沒問題。真是啞巴吃黃蓮啊。

2007年3月5日 星期一

Object-RMDB Data Mapper- iBATIS

What is iBATIS?


The iBATIS Data Mapper framework makes it easier to use a database with Java and .NET applications. iBATIS couples objects with stored procedures or SQL statements using a XML descriptor. Simplicity is the biggest advantage of the iBATIS Data Mapper over object relational mapping tools.

本來是在看spring的jpetstore時,發現他使用這個ORM,感覺很不錯。其實嚴格來說iBATIS不算是ORM。不過有些狀況之下,直接使用SQL還是有其需要性,這時候iBATIS就很好用。

目前iBATIS己經加入apache project有java版 .NET版及ruby/rails版。

Embedded zero-configuration SQL database - SQLite

SQLite是個用c所寫成的SQL database engine。本身的size很小,也不太吃資源,還能支援Transactions呢。這真是embedded system的好朋友。database本身的資料是放在一個單一檔案裡。這樣我在team work時就可以很簡單的發給大家同樣的defaulot enviroment。而且SQLite本身可看你的程式結合在一起,無需另外的task。在有些時候這樣還滿好用的。在小型系統,研發時期和prototype使用都非常方便。基本上他是c寫成的,C/C++使用的API當然沒問題,網路上也有很多JDBC的driver,使用java開發的朋友也能夠開心使用。SQLite database最大可到2TB,但我想我有2TB的資料時我應該就不會使用他了吧。目前用起來唯一覺得還能再更好的就是data type支援的有限,雖然現有基本的都還夠用,不過有時就是會需要基本以外的data type。sqlite2和sqlite3的api不相容,所以使用上要注意一下版本的問題。除非有需要,否則就直接使用SQLite3,各種功能也比較完整。

SQLite office site

Lightweight 100% Java SQL Database Engine - HSQLDB

最近才發現有一個由純Java所寫成的輕量級資料庫。可單機使用,也有server模式。真是太棒了。
HSQLDB本身輕巧快速(當然是指資料庫內容不大時),對SQL的支援也很不會,配合JDBC/hibernate都能使用。HSQLDB很適合拿來當設計初期,或是研發時期所使用,做prototype階段的demo 版本也很合適。HSQLDB發展了好一段時間,目前感覺穩定性沒太大的問題,當然也可能是我使用的還不夠多還沒遇到問題。

要再加強一下信心的話,OpenOffice 2.0裡也使用了 HSQLDB 1.8.0,這樣應該能大大提升信心指數了吧。

HSQLDB office site

2007年1月11日 星期四

Ruby裡的Symbol

剛理解了ruby裡的symbol object。先記下來。

Ruby裡的Symbol是一種object,這種object包含了一個字串和一個數字(ruby內部使用的)。用字串前加一個":"來表示ex :foo。有三種方法產生symbol- :foo或:"foo"或 foo.to_sym,用foo.to_sym時foo必需是個string。

如 :foo 是一個Symbol的boject,裡面包含了"foo"的字串,及一個ruby內部使用的數字。
>:foo.to_s
=> "foo"
>symbol1 = :foo
=> :foo
>symbol1.to_s
=> "foo"
>:foo.class
=> Symbol
:foo是一種 Symbol的object,這個symbol的字串內容是"foo",而 symbol1也是。

symbol的兩大特色是不可改變的及唯一的。也就是說:foo一定是包含"foo"這個字串,不能也不會改變。整個ruby裡也只會有一個:foo的object。
>symbol2 = :foo
=> :foo
>:foo.object_id
=> 231138
>symbol1.object_id
=> 231138
>symbol2.object_id
=> 231138
symbol1和symbol2的也都是symbol的object,但是由object id可知symbol1和symbol2和:foo都是同一個object。不管你怎麼使用就是只會有一個:foo。如果是string就不一樣了。
>str1="foo"
=> "foo"
>str2="foo"
=> "foo"
>str1.object_id
=> 23518020
>str2.object_id
=> 23518030
str1和str2是兩個不同的object。

symbol的主要用途有兩個,一個是節省記憶體的使用,另一個增進效率。
由於symbol在系統裡只會有一個,所以只用掉一次的
記憶體空間,又因為他不會改變,所以你在那裡使用都不用擔心symbol的內容是否還一樣。這樣可以節省很多記憶體的使用,同樣的字串使用的越多次,改用symbol所節省記憶體的效益就越明顯。

另一個是symbol裡有一個ruby內部使用的數字,當你使用foo.action時,ruby需要比對字串去找到action這個method,如果用symbol就可以比對symbol的數字,這可以有效的提升效率。所以ruby會將你的foo.acion轉換成為foo.send(:action)以提升效率。

而symbol的比較也會比字串的比較有效率,symbol只需比較是不是同一個object即可(還記得嗎?symbol的字串是不會改變的)。

而將symbol用來做enumerations也是很常見的用法,如:RED, :BLUE, :GREEN。