Java

2009年3月13日 (金)

SQLite3 JNI Library for Mac OS X (intel) バージョン 1.1.4 リリース!

SQLite3 JNI Library for Mac OS X (intel) バージョン 1.1.4 をリリースしました。

それと先日の SpatiaLite が動かない件ですが、JNI ライブラリに RTREE を組み込んでいないのが原因でしたcoldsweats01

(上記の Mac OS X 用には RTREE は組み込まれています)

Windows (x86) 用も別に用意したのでダウンロードできます

次のリリースからは RTREE と FTS3 も組み込みたいと思います。

| | コメント (0) | トラックバック (0)

2009年3月12日 (木)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.4 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.4 をリリースしました。

変更点は以下の通り。

Mac OS X 用の JNI ライブラリは後日リリース予定です…予定は未定coldsweats01

それとスペイン?のユーザから「SpatiaLite という拡張ライブラリが動かないよ!」というメールを頂いたのでちょっと調べてみた。

動作確認用に作成したサンプル「SpatiaLiteTest.java」をダウンロード

自分の環境では動いたのでとりあえずサンプルコードを付けて動いたよ!ってメールを出してみたcatface

| | コメント (0) | トラックバック (0)

2008年10月13日 (月)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.3 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.3 をリリースしました。

変更点は以下の通り。

今回のバージョンアップでは API の追加・変更はありません。

| | コメント (0) | トラックバック (0)

2008年9月27日 (土)

SQLite ver 3.6.3 for Windows Mobile

SQLite バージョン 3.6.3 がリリースされています。

「sqlite-3.6.3-wince-utf8.zip」をダウンロード

今回のリリースは「SELECT DISTINCT」のバグ修正のみで追加機能は無いようです。

| | コメント (0) | トラックバック (0)

2008年9月18日 (木)

SQLite3 JNI Library for Macintosh (i386) バージョン 1.1.2 リリース!

SQLite3 JNI Library for Macintosh (i386) バージョン 1.1.2 をリリースしました。

Mac OS X 10.5.5 の JDK 1.5 で動作確認済みです。

今後は iPhone 用アプリの開発にシフトする予定ですcatface

| | コメント (0) | トラックバック (0)

2008年9月 4日 (木)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.2 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.2 をリリースしました。

変更点は以下の通り。

今回のバージョンアップでは API の追加・変更はありませんでした。

| | コメント (0) | トラックバック (0)

2008年8月24日 (日)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.1 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.1 をリリースしました。

変更点は以下の通り。

JNI ライブラリの作成には SWIG を使用しているので SQLite のバージョンアップに追従するのは楽なんですが、まとまった時間が取れないとなかなかリリース出来ないですbearing

それと Mysaifu JVMJMF(Java Media Framework)は完全に開発が止まってしまってますorz

FMJ をベースにすればフルスクラッチで開発する必要はなさそうなんですが、LTI-CIVILJNA などを Windows Mobile 用に移植する必要があるため挫折…wobbly

| | コメント (0) | トラックバック (0)

2008年7月31日 (木)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.0 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.0 をリリースしました。

変更点は以下の通り。

今回のバージョンアップで 3.5.9 と非互換な変更が入っていますが、データベースファイルに関しては互換性が保たれていますのでご安心を。

| | コメント (0) | トラックバック (0)

2008年6月18日 (水)

プレビュー画面が出た!

カメラのプレビュー画面が出ました!happy01

プレビュー画面がすぐに消えてしまっていた原因はメインスレッドで JNI ライブラリをロードして JNI_OnLoad 関数内で CoInitializeEx を呼び出していたことでした。

CoInitializeEx はスレッド毎に呼び出す必要があるため、メインスレッドではなく AWT イベントディスパッチスレッドで呼び出すように改修したところプレビュー画面が消えずに表示されたままになりましたhappy02

しかし、また別の問題が…sweat02

今度はプレビュー画面上でタップしても MouseEvent が発生しない…orz

| | コメント (0) | トラックバック (0)

2008年6月17日 (火)

静止画の撮影に成功!しかし…

ひたすら DirectShow の JNI ラッパを実装して「Advanced/W-ZERO3 [es]でカメラアプリを作ろう Part2」のコードをほとんどそのまま Java でコーディングしたサンプルプログラムが動くようになりましたhappy02

ウィンドウ上でクリックすると静止画の撮影も出来るようになりましたが、プレビュー画面が一瞬しか表示されません…orz

具体的には画面左上に QVGA サイズでプレビュー画面が表示されたかと思うと一瞬でサイズが拡大して行きホワイトアウトしてしまいますsweat02

どこがマズイのかさっぱりわからん…bearing

| | コメント (0) | トラックバック (0)

2008年6月16日 (月)

JMF のソースコードは入手不可能!?

Mysaifu JVM 用 JMF(Java Media Framework)の実装を進めているんですが、JMF のソースを見たほうが早いと思い調べてみたところ以下のページを発見!happy01

Sun Community Source Licensing (SCSL) - Java Media Framework API (JMF)

早速アカウントを登録してログインしてみましたがダウンロードのリンクが出現しませんangry

ぐぐってみてもダウンロードできそうな情報は入手できず…orz

どうしたもんか…shock

| | コメント (0) | トラックバック (0)

2008年6月11日 (水)

Mysaifu JVM 用 JMF を作成する - 其ノ壱

Java SE としては既に廃れてしまっている感のある JMF(Java Media Framework)ですが、Mysaifu JVM で使えるようになれば W-ZERO3 を無線 Web カメラに出来るんじゃまいか?

というわけで今度は DirectShow を使って Mysaifu JVM 用の JMF を作成します。

とりあえず DirectShow  関係のページ。

今のところ Windows Mobile 向けの DirectShow は Windows 版と比べて以下の制限があるのがわかっています。

  1. ISampleGrabber が存在しない。
  2. IBasicVideo::GetCurrentImage() ではカメラの映像をキャプチャできない。

簡潔に言うと、カメラの映像をキャプチャするには自前でフィルタを別途作成する必要があるってことです orz

JMF の実装に関しては、DirectShow は COM なので、JNI でひたすら COM を叩くコードを書いてます。

そういえば Java で COM を叩くライブラリがあったな~、と思ってググってみたらありました。

JCom (Java-COM Bridge)

コードを見てみるとほとんど同じことをやってる…orz

なら JCom を Windows Mobile に移植したほうが早いかな~と思いきや、よくよくコードを見てみると IDispatch クラスを継承したクラスしか CoCreateInstance 出来ないというおかしな仕様になっていたので使うのを止めました。

こつこつ実装するしかないですなcatface

| | コメント (0) | トラックバック (0)

2008年6月 8日 (日)

Mysaifu JVM を高速化する!

今回は Mysaifu JVM鬼車 for Java を組み込んで高速化します。

まずは以下の手順で鬼車 for Java を組み込んだランタイムライブラリを作成します。

  1. onig4j-v003.zip をダウンロードして任意のフォルダに展開する。
    以降は「C:\mysaifu」を使用します。
  2. onig4j-java.util.regex-impl.zip をダウンロードして「C:\mysaifu」に展開する。
  3. onig-5.9.1.1-extended-wince.zip をダウンロードして「C:\mysaifu」に展開する。
  4. Windows Mobile にインストールされている Mysaifu JVM のランタイムライブラリ(rt.jar)を PC 上の「C:\mysaifu」にコピーする。
  5. コマンドプロンプトを起動して「C:\mysaifu」に移動する。
  6. バッチファイル「rt-onig4j.jar.bat」に引数「rt.jar」、「onig4j.jar」、「onig4j-java.util.regex-impl.jar」を指定して実行する。
    C:\mysaifu>rt-onig4j.jar.bat rt.jar onig4j-java.util.regex-impl.jar onig4j.jar
    ※バッチファイルの実行には JDK のインストールと JAVA_HOME 環境変数の設定が必要です。

バッチファイルの実行が完了すると鬼車 for Java が組み込まれたランタイムライブラリ「rt-onig4j.jar」が「C:\mysaifu」以下に作成されているはずです。

次に作成したランタイムライブラリ「rt-onig4j.jar」を Mysaifu JVM にインストールします。

  1. 作成したランタイムライブラリ「rt-onig4j.jar」 を Windows Mobile に転送する。
    Mysaifu JVM をデバイスにインストールしている場合は「\Program Files\Mysaifu JVM\jre\lib」以下にコピーします。
  2. 鬼車(OnigSyntaxJava 改良版) for Windows CE (ARMV4)「onig.dll」と鬼車 JNI ライブラリ「onig4j.dll」を Windows Mobile に転送する。
    Mysaifu JVM をデバイスにインストールしている場合は「\Program Files\Mysaifu JVM\jre\bin」以下にコピーします。

以上で鬼車 for Java の組み込みが完了しました。


では、実際に鬼車 for Java 組み込み版ランタイムライブラリを使用してベンチマークを実行してみます。

鬼車 for Java 組み込み版ランタイムライブラリを使用する際は以下のように「Bootclasspath」を変更する必要があります。

Scrn0025

ベンチマークの実行結果は以下の通りです。

Scrn0026

鬼車 for Java を直接使用するよりも多少遅くなりますが、標準のランタイムライブラリ版よりも15倍程度高速化されましたhappy01

しかし、ここで「正規表現を使ってないなら標準のランタイムライブラリで良くね?」と思うかもしれません。

が、以下のクラスが java.util.regex.Pattern を内部的に使用しています。

  • java.lang.String
    • replaceFirst()
    • replaceAll()
    • split()
  • java.net.URI
    • <cinit>
  • java.text.SimpleDateFormat
    • parse()
  • java.util.jar.JarFile
    • getEntry()
    • nextElement()
  • gnu.xml.validation.datatype.LanguageType
    • <cinit>
  • gnu.xml.validation.datatype.TypeBuilder
    • addParameter()

更に以下のクラスが String#split() を内部的に使用しています。

  • java.lang.System
    • getenv()
  • java.text.DateFormatSymbols
    • getStringArray()
    • getZoneStrings()
  • javax.management.MBeanPermission
    • updateActionSet()
  • javax.management.MBeanServerPermission
    • implies()
    • add()
    • checkName()
  • javax.management.ObjectName
    • parse()
  • gnu.classpath.jdwp.Jdwp
    • _processConfigury()
  • gnu.classpath.jdwp.processor.VirtualMachineCommandSet
    • executeClassPaths()
  • gnu.classpath.jdwp.transport.SocketTransport
    • configure()
  • gnu.javax.security.auth.login.ConfigFileParser
    • validateClassName()
  • gnu.classpath.tools.getopt.OptionGroup
    • formatText()
  • gnu.classpath.tools.getopt.Parser
    • formatText()
  • gnu.classpath.tools.jarsigner.JarVerifier
    • start()
  • gnu.classpath.tools.javah.CniPrintStream
    • writeClass()

Mysaifu JVM は遅い」と感じているなら鬼車 for Java 組み込み版ランタイムライブラリを使用すると劇的に効果があるかもしれませんよcatface

| | コメント (0) | トラックバック (0)

2008年6月 7日 (土)

鬼車 for Java バージョン 003 リリース!

鬼車 for Java バージョン 003 をリリースしました。

主な変更点は以下の通り。

  • バグ修正(#12632)。
  • ライセンスを BSDGPLv2 のデュアルライセンスに変更。

今回正式にリリースした「鬼車 for Java による java.util.regex 実装」Mysaifu JVM に組み込むと正規表現を使用したコードが10倍以上高速化されます。

次回は(今度こそ)Mysaifu JVM鬼車 for Java を組み込む手順を公開しますcoldsweats01

| | コメント (0) | トラックバック (0)

九州 JavaOne 報告会に行ってきた。

Java コミュニティ@九州JavaOne 報告会に行ってきました。

講師はきしださん九工大の小出先生です。

きしださんは受付?でスイス人に間違えられたそうです。確かに言われてみれば外人っぽい顔かもcatface

小出先生は Sun SPOT を持参されていたのですが、Sun SPOT は OS レスで動いてるらしく、CPU やメモリは W-ZERO3 以下の性能ですがキビキビと動いている印象でした。

ちなみに一番気になる費用ですが、福岡から JavaOne に参加するためには40万円ほど必要だそうです…orz

  • 交通費12万円
  • 宿泊代12万円(ケチると会場から遠く、治安の悪い地区になる)
  • 参加費16~20万円(開催日が近づくと費用が上がる)

お土産の NetBeans バッグ欲しかったbearing

| | コメント (0) | トラックバック (0)

2008年5月26日 (月)

鬼車 for Java バージョン 002 リリース!

鬼車 for Java バージョン 002 と鬼車(OnigSyntaxJava 改良版)バージョン 5.9.1.1 をリリースしました。

主な変更点は以下の通り。

  • バグ修正(#12497, #12551, #12552)。
  • 独自オプションの ONIG_OPTION_JAVA_LINES と ONIG_OPTION_NEGATE_JAVA_LINES を追加。
    行末記号を Java と同じ文字(\n, \r\n, \r, U+0085, U+2028, 2029)にマッチさせます。
  • 独自オプションの ONIG_OPTION_CASE_FOLD_ASCII_ONLY と NIG_OPTION_NEGATE_CASE_FOLD_ASCII_ONLYを追加。
    Unicode 使用時の曖昧マッチを US-ASCII のみに限定します。
  • 独自オプションの ONIG_SYN_OP2_OPTION_JAVA を追加。
    埋め込みフラグ表現の (?d)(?u) が使用可能になります。

今回のバージョンで追加された独自オプションを使用するには鬼車(OnigSyntaxJava 改良版)が必要です。

今回、頑張って鬼車本体を改造したおかげで Mysaifu JVMjava.util.regex鬼車 for Java で置き換えることが出来きるようになり、ベンチマークの結果、12 倍程度高速化しました。

次回は Mysaifu JVMjava.util.regex鬼車 for Java で置き換える為の手順を公開しますcatface

| | コメント (0) | トラックバック (0)

2008年5月20日 (火)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.0.3 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.0.3 をリリースしました。

変更点は以下の通り。

リリースノートによると 3.5.x 系の最終安定バージョンになるようなので次回は API の追加・変更があるかもしれません。

| | コメント (0) | トラックバック (0)

2008年5月19日 (月)

鬼車を改造する

鬼車には Java の正規表現ライブラリの構文をサポートする ONIG_SYNTAX_JAVA が標準で搭載されているのですが、UNICODE_CASE モード の off と埋め込みフラグ表現 (?idmsux-idmsux) のうちの「
(?u) :UNICODE_CASEモードの on/off」 と「(?d) :UNIX_LINESモードの on/off」に対応していません。

最初は Java 側で未対応の埋め込みフラグ表現を抽出してゴリゴリ処理していたのですが、良く考えると同じことを鬼車の内部でもやっているよなー、と思い鬼車本体に手を入れることにしました。

まず UNICODE_CASE モード の off については独自オプション「ONIGENC_CASE_FOLD_ASCII_ONLY」を追加して、UTF-8/UTF-16LE/UTF-16BE/UTF-32LE/UTF-32BE の各 mbc_case_fold 関数を修正することで簡単に対応出来ました。

次に未対応の埋め込みフラグ表現については独自オプション「ONIG_SYN_OP2_OPTION_JAVA」を追加して、parse_enclose 関数内にある埋め込みフラグ表現の処理部分に手を入れて (?u) に関しては上記の独自オプション「ONIGENC_CASE_FOLD_ASCII_ONLY」を on/off させることで対応できました。

埋め込みフラグ表現 (?d) に関しては鬼車が動的に行末記号を切り替えることを想定した作りになっていないため簡単ではなさそうですbearing

(ちなみに USE_UNICODE_ALL_LINE_TERMINATORS と USE_CRNL_AS_LINE_TERMINATOR を有効にしてビルドすれば Java の行末記号にマッチするようになるようです)

修正したソースコードは SourceForge.JP の SVN リポジトリで参照できます。

| | コメント (0) | トラックバック (0)

2008年5月15日 (木)

Java の行末記号にマッチする正規表現

前回の記事の続きです。

鬼車の行末記号 ($) は改行文字 ('\n') にしかマッチしないため「鬼車 for Java」で Pattern クラスを実装するには以下の Java の行末記号にもマッチさせないといけませんでした。

  • 直後に改行文字が付いたキャリッジリターン文字 ("\r\n")
  • 単独のキャリッジリターン文字 ('\r')
  • 次行文字 ('\u0085')
  • 行区切り文字 ('\u2028')
  • 段落区切り文字 ('\u2029)

前回は「\r\n」の部分で詰まってしまっていたのですが、以下の正規表現で置き換えることができました。

(?:(?=[\r\u0085\u2028\u2029]|(?<!\r)\n)|\Z)

(?<!\r)\n」の部分が「キャリッジリターン文字 ('\r') が直前にない改行文字 ('\n') にマッチする」という正規表現になります。

行末以外 [^$] 等の変態的な正規表現を指定されなければ Java の正規表現ライブラリと同じ結果になることが確認できたので Pattern クラスの実装が一歩前進しましたcatface

| | コメント (0) | トラックバック (0)

2008年5月12日 (月)

正規表現による split の実装

Mysaifu JVM に搭載されている正規表現ライブラリ(java.util.regex)を 鬼車 for Java で置き換えるべく Pattern クラスMatcher クラス実装中なのですが Pattern#split() の実装が難航しています…orz

最初は以下の手順で実装できるはず、と簡単に考えていました。

  1. Matcher#find() でデリミタを検索。
  2. CharSequence#subSequence(検索開始位置, Matcher#start()) で文字列を取得。
  3. 次の検索開始位置Matcher#end() をセット。

通常は上記の手順で問題ないのですが、正規表現には行末記号「$」や単語境界「\b」、幅ゼロの肯定先読み「(?=X)」などの境界にマッチさせる構文が存在します。

例えば以下の文字列を行末記号+MULTILINE モードsplit(-1) するとします。

"い\r\n\r\n\u0085\u2028\u2029と"

戻り値の String 配列は以下のようにならないといけません。

  1. "い"
  2. "\rろ"
  3. "\nは"
  4. "\r\nに"
  5. "\u0085ほ"
  6. "\u2028へ"
  7. "\u2029と"
  8. ""

ここで問題になるのは「\r\n」です。
境界にマッチした場合、Matcher#start()Matcher#end() は同じ位置を指しているためそのままでは検索開始位置がいつまでも変わりません。
そこで検索開始位置をシフトする必要があるのですが、単純に +1 すると 「\r」の次の位置にある「\n」にマッチしてしまい、戻り値が以下のようになってしまいます。

  1. "い"
  2. "\rろ"
  3. "\nは"
  4. "\r"
  5. "\nに"
  6. "\u0085ほ"
  7. "\u2028へ"
  8. "\u2029と"
  9. ""

行末記号だけを考慮するならヒットした位置の文字が「\r」で次の位置の文字が「\n」なら +2 シフトすれば良いですが、行末記号にヒットしたのかどうかを知る術がない…orz

行末記号がヒットしたかどうかを調べるために正規表現を使用するといった本末転倒なことをしないといけなさそうで途方に暮れています…sad

| | コメント (0) | トラックバック (0)

2008年5月11日 (日)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.0.2 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.0.2 をリリースしました。

主な変更点は以下の通り。

  • データベースに read/write する文字列のエンコーディングを Modified UTF-8 から UTF-8 に変更。

SWIG の定義を上書きして「NewStringUTF」、「GetStringUTFChars」、「ReleaseStringUTFChars」を使わないコードを自動生成させることができたので傷口が広がらないうちに Modified UTF-8 の使用を中止しました。

尚、以前のバージョンで作成したデータベースファイルについてはサロゲートペア(Wikipedia の解説1、及び解説2)を使用した文字列が含まれていなければそのまま使用可能です。

例えば、Shift-JIS(MS932)や EUC-JP で表現可能な文字列しか使用していない場合は問題ありません。

もし文字化けする場合はバージョン 1.0.1 以前の JDBC ドライバと JNI ライブラリを使用して以下の手順で UTF-8 形式に変換してください。

  1. ResultSet#getString(int) で対象の文字列を取得。
  2. String#getBytes("UTF-8") で UTF-8 形式のバイト配列に変換。
  3. PreparedStatement#setBytes(int, byte[]) でバイト配列として保存。

今回の UTF-8 対応にあたり「NewStringUTF」、「GetStringUTFChars」の各 JNI 関数が使用できなくなったため文字コード変換処理に掛かる時間が増えてしまいました。

今後のバージョンでは「NewString」、「GetStringChars」の各 JNI 関数を使用するように変更して文字コード変換処理に掛かる時間を削減する予定です…何時になるかわかりませんがcatface

| | コメント (0) | トラックバック (0)

2008年5月 5日 (月)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.0.1 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.0.1 をリリースしました。

主な変更点は以下の通り。

現在の JDBC ドライバは Modified UTF-8 形式でデータベースに read/write しているため、他のアプリケーションで作成されたデータベースファイルを使用した場合に文字化けを起こす可能性があります。

考えられる対策としては「Modified UTF-8 の代わりに UTF-8 か UTF-16 を使用する」という単純なものなのですが、SWIG を使ったコードの自動生成ができなくなってしまうため SQLite のバージョンが 3.x の間はこのまま Modified UTF-8 を使用していく予定です。

| | コメント (0) | トラックバック (0)

2008年4月28日 (月)

鬼車 for Java バージョン 001 リリース!

Mysaifu JVMJamVM などの JIT コンパイラ未搭載の JVM の為の正規表現ライブラリ「鬼車 for Java」を SourceForge.jp でリリースしました。
(JIT コンパイラが搭載されている JVM 向けには「Joni」をお勧めします)

鬼車」は RubyJRuby にも採用されている正規表現エンジンです。

鬼車 for Java」のベンチマークを Sun JDK 1.6.0_06 Windows (x86) 版と IBM Java SE Version 6 Linux (PowerPC) 版と Mysaifu JVM ver 0.3.7 で測定してみました(ベンチマークプログラムのソースはこちら)。

まずは Sun JDK 1.6.0_06 Windows (x86) 版の測定結果です。
( (Java) は java.util.regex での測定結果、(Onig) は「鬼車 for Java」の測定結果)

JVM: java version "1.6.0_06"
     Java(TM) SE Runtime Environment (build 1.6.0_06-b02)
     Java HotSpot(TM) Client VM (build 10.0-b22, mixed mode, sharing)
OS : Windows XP Professional SP2
CPU: Intel Pentium 4 3.00GHz
RAM: 1GB
処理対象: benchmark.html(114,501行/9,288,061 バイト)
抽出件数(Java): 4,240
処理時間(Java): 2,154 ミリ秒(1回目)
処理時間(Java):   910 ミリ秒(2回目)
処理時間(Java):   889 ミリ秒(3回目)
処理時間(Java):   952 ミリ秒(4回目)
抽出件数(Onig): 4,240
処理時間(Onig):   635 ミリ秒(1回目)
処理時間(Onig):   539 ミリ秒(2回目)
処理時間(Onig):   459 ミリ秒(3回目)
処理時間(Onig):   457 ミリ秒(4回目)

Java 版の1回目は JIT が効いてないようで明らかに遅いですが、2回目以降 JIT が効いている状態でも鬼車版の方が2倍程度高速です。
(ちなみに鬼車版はクラスロード時に JNI ライブラリのロードに 80 ~ 250 ミリ秒程度掛かっています)

次は玄箱HG上の IBM Java SE Version 6 Linux (PowerPC) 版の測定結果です。

JVM: java version "1.6.0"
     Java(TM) SE Runtime Environment (build pxp3260-20071123_01)
     IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 Linux ppc-32 jvmxp3260-20071121_15015 (JIT enabled)
     J9VM - 20071121_015015_bHdSMR
     JIT  - r9_20071121_1330
     GC   - 20071031_AA)
     JCL  - 20071118_01
OS : Linux 2.6.20-kuroboxHG
CPU: PowerPC 266MHz
RAM: 128MB
処理対象: benchmark.html(114,501行/9,288,061 バイト)
抽出件数(Java):  4,240
処理時間(Java): 24,894 ミリ秒
抽出件数(Onig):  4,240
処理時間(Onig): 20,522 ミリ秒

何回か測定しましたが予想外に Java 版が高速でした。鬼車版は測定結果にブレがあり Java 版と同じ 24 秒程度掛かることもあり、速度的なアドバンテージはなさそうです。

次は Advanced/W-ZERO3 [es] 上の Mysaifu JVM ver 0.3.7 での測定結果です。
(9MB のファイルで計測すると途中で例外が発生してしまったため 1/10 程度に削っています)

JVM: java version "1.6"
     Mysaifu JVM 0.3.7.0 (Mysaifu)
OS : Windows Mobile 6 Classic (Advanced/W-ZERO3 [es])
CPU: Marvell PXA270 プロセッサ 520MHz
RAM: SDRAM 128MB
処理対象: benchmark.html(10,288行/926,614 バイト)
抽出件数(Java):     424
処理時間(Java): 112,427 ミリ秒
抽出件数(Onig):     424
処理時間(Onig):   6,681 ミリ秒

鬼車版は Java 版に比べて 20 倍程度高速です。作った甲斐がありましたcatface

ついでに W-ZERO3 [es] 上の Mysaifu JVM ver 0.3.7 での測定結果です。

JVM: java version "1.6"
     Mysaifu JVM 0.3.7.0 (Mysaifu)
OS : Windows Mobile 5.0 software for Pocket PC (W-ZERO3 [es])
CPU: Intel PXA270 プロセッサ 416MHz
RAM: SDRAM 64MB
処理対象: benchmark.html(10,288行/926,614 バイト)
抽出件数(Java):     424
処理時間(Java): 124,721 ミリ秒
抽出件数(Onig):     424
処理時間(Onig):   7,409 ミリ秒

最終的には Mysaifu JVM の java.util.regex を「鬼車 for Java」で置き換えられればな~と思っていますが、行末記号の違いやコメント記号の違いがあるので結構大変ですbearing

(実装中の鬼車版 java.util.regex.Patternjava.util.regex.Matcher は「鬼車 for Java」の examples フォルダ内にあります)

| | コメント (0) | トラックバック (0)

2008年4月13日 (日)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.0.0 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.0.0 をリリースしました。

主な変更点は以下の通り。

  • 使用する SQLite のバージョンを現時点で最新の 3.5.7 に UP。
  • sqlite3_open_v2 に対応。
    1. データベースを読み取り専用でオープンする機能を追加(JDBC URLのパラメータに";READ_ONLY"を追加する)。
    2. 存在するデータベースのみをオープン機能を追加(JDBC URLのパラメータに";OPEN_EXIST"を追加する)。
    3. データベースで使用するVFSを指定してオープンする機能を追加(JDBC URLのパラメータに";VFS=<VFSモジュール名>"を追加する)。
  • sqlite3_create_collation_v2 に対応。
  • sqlite3_blob に対応。
  • sqlite3_mutex に対応。
  • sqlite3_file_control に対応。
  • Virtual File System Objects に対応。

今後は SQLite がバージョンアップするか、バグ修正が必要な場合のみのメンテナンスリリースになります。

今まで応援ありがとうございました。猫足ブログ先生の次回作にご期待下さい!

| | コメント (0) | トラックバック (0)

2008年4月 1日 (火)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.1.0 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.1.0 をリリースしました。

主な変更点は以下の通り。

次のバージョンから最新の 3.5.x 系がベースになる予定です。

| | コメント (0) | トラックバック (0)

2008年3月25日 (火)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.7 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.7 をリリースしました。

主な変更点は以下の通り。

  • Function Auxiliary Data に対応。
  • Collation Needed Callbacks に対応。
  • Tracing And Profiling Functions に対応。
  • データベースオープン時に一時ディレクトリを変更するためのオプション「TEMP_DIR」を追加。
    例えば、一時ディレクトリに「C:\tmp」を指定する場合は「jdbc:sqlite:file:database.db;TEMP_DIR=C:/tmp」とする。
  • Linux (i386/PowerPC) 用 JNI ライブラリの提供を開始。
  • JVM がクラッシュするバグ(#11898, #12068)を修正。
  • JavaDoc のロケールを en_US に変更。

「SQLite v3.3.5 の機能の実装は完了しました」とか書いておきながら、ヘッダファイルを確認したら実装漏れの API がありました…orz

次のバージョンから SQLite ver 3.3.17 をベースにする予定です。

| | コメント (0) | トラックバック (0)

2008年3月13日 (木)

NetBeansでSQLite3 JDBC Driverを使ってみる

SQLite3 JDBC Driver を使ったアプリケーションを作る前準備として NetBeans IDE 6.1 Beta 上で SQLite3 を使えるようにしてみます。

  1. NetBeans IDE 6.1 Beta の Java SE パックをダウンロードしてインストールします。
    JDK 6 は事前にインストールしておく必要があります。
  2. sqlite3jdbc-0.0.6.zip をダウンロードして任意のフォルダに展開します。
    ここでは C:\Java\sqlite3jdbc に展開します。
  3. sqlite3jni-0.0.6-win32.zip をダウンロードして任意のフォルダに展開します。
    ここでは C:\Java\sqlite3jdbc\win32 に展開します。
  4. 「C:\Java\sqlite3jdbc\win32」を環境変数「PATH」に追加します。
    Env001
  5. NetBeans を起動します。
  6. 「CTRL+5」で「Services」ウィンドウに切り替えます。
    Netbeans001
  7. 「Drivers」→右クリック→「New Driver...」をクリック。
    Netbeans002
  8. Driver File(s)」に「C:\Java\sqlite3jdbc\sqlite3.jar」を追加して「Find」ボタンをクリック。「Name」に「SQLite3」と入力して「OK」ボタンをクリックし、SQLite3 JDBC Driver を登録します。
    Netbeans003
  9. 「SQLite3」→右クリック→「Connect Using...」をクリック。
    Netbeans004
  10. 「Database URL」に「jdbc:sqlite:mem:」と入力して「OK」ボタンをクリック。
    Netbeans005
  11. ツリーに追加された「jdbc:sqlite:mem: [on main]」にテーブルを作成します。
    「Tables」→右クリック→「Create Table...」をクリック。
    Netbeans006
    「SAMPLE」テーブルを作ってみます。
    Netbeans007
  12. ツリーに「SAMPLE」テーブルが追加されました。
    Netbeans008
  13. テーブルの中身を確認してみます。
    「SAMPLE」→右クリック→「View Data...」をクリック。Netbeans009
    「Output」パネルにエラーが出力され、テーブルの中身は確認できません…orz
    Netbeans010
    原因は SQLite v3.3.5 では sqlite3_step() を呼び出さないと sqlite3_column_type() でカラム型を取得できないためです。次のバージョン(0.0.7)では例外を投げないように変更する予定です。
  14. 気を取り直して、SQLite3 JDBC Driver ver 0.0.7(開発版)をダウンロードして C:\Java\sqlite3jdbc に展開します。
    「sqlite3jdbc-0.0.7-dev.zip」をダウンロード
  15. NetBeans を再起動して、再度テーブルの中身を確認してみます。
    Netbeans011
    無事、テーブルの中身が表示されました(空っぽですが)。
  16. 次はレコードを登録してみます。
    「Tables」→右クリック→「Execute Command...」をクリック。
    「INSERT INTO main.SAMPLE VALUES(1, 'ねこび~ん', 123.456789)」と入力して「CTRL+Shift+E」で SQL を実行します。
    Netbeans012
  17. 再度テーブルの中身を確認してみます。
    Netbeans013
    無事、登録されているレコードが確認できました。
  18. 使い終わったら DB 接続を閉じましょう。
    「jdbc:sqlite:mem: [on main]」→右クリック→「Disconnect」をクリック…すると NetBeans がクラッシュします…orz
    Netbeans014
    原因は SQLite v3.3.5 では sqlite3_open() したスレッドとは異なるスレッドで  sqlite3_close() を呼び出すことができないためです。
    (リリースノートには v3.3.1 で異なるスレッドでの sqlite3_close() 呼び出しに対応したとあるんですが…)


    ※ビルドオプションに「SQLITE_ENABLE_MEMORY_MANAGEMENT」を追加しているのが原因でした…orz
    ※「SQLITE_ENABLE_MEMORY_MANAGEMENT」は組み込みデバイスなどのメモリが厳しい環境のみ指定するのが正しいようです。

    試しに v3.5.6 で JNI ライブラリをビルドしたところ NetBeans がクラッシュしなくなったので SQLite のバージョンをあげれば解決するはずです。
    「sqlite3jni-0.0.6-win32-sqlite-3.5.6.zip」をダウンロード

NetBeans で SQLite3 を使ったみた感想は「ちゃんと DatabaseMetaData を実装した甲斐があったなぁ…」でしたcatface

| | コメント (2) | トラックバック (0)

2008年3月11日 (火)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.6 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.6 をリリースしました。

「SQLite3 JDBC Driver for Mysaifu JVM」のダウンロード

「SQLite3 JNI Library for Windows (x86)」のダウンロード

「SQLite3 JDBC Driver API Documentation」のダウンロード


主な変更点は以下の通り。

これで SQLite v3.3.5 の機能の実装は完了しました。

次は CONCUR_UPDATABLE な ResultSet をサポートしようかと考え中。

| | コメント (0) | トラックバック (0)

2008年3月 7日 (金)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.5 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.5 をリリースしました。

「SQLite3 JDBC Driver for Mysaifu JVM」のダウンロード

「SQLite3 JNI Library for Windows (x86)」のダウンロード

「SQLite3 JDBC Driver API Documentation」のダウンロード


主な変更点は以下の通り。

これで機能的には SQLiteJDBC を追い抜きました。

あとは Hook 系の関数に対応すればベースとなっている SQLite v3.3.5 の機能を(ほぼ)すべて Java から使用することができるようになります。

それが終わればベースとなる SQLite のバージョンを 3.3.5 → 3.3.17 → 3.4.2 → 3.5.x と上げていく作業に入ります。

UnitTest も書かないといけないんですが正直メンドクサイ…。

| | コメント (0) | トラックバック (0)

2008年3月 4日 (火)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.4 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.4 をリリースしました。

「SQLite3 JDBC Driver for Mysaifu JVM」のダウンロード

「SQLite3 JNI Library for Windows (x86)」のダウンロード

「SQLite3 JDBC Driver API Documentation」のダウンロード


主な変更点は以下の通り。

ちなみに、照合順序に対応してはみたもののあんまり良い使い道が思い浮かばないという罠。

SQL Server の Japanese_CI_AS みたいなのがあればちょっとだけ便利かも。


次は Authorization 対応か~。照合シーケンス以上に使い道なさそう…。

| | コメント (0) | トラックバック (0)

2008年3月 1日 (土)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.3 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.3 をリリースしました。

「SQLite3 JDBC Driver for Mysaifu JVM」のダウンロード

「SQLite3 JNI Library for Windows (x86)」のダウンロード

「SQLite3 JDBC Driver API Documentation」のダウンロード


今回の肝はユーザ定義関数への対応です(日本語訳はこちら)。

これでやっと SQLiteJDBC と肩を並べるところまで来ました。

但し、現時点で最新の Mysaifu JVM バージョン 0.3.6 では JVM がクラッシュしてしまうバグがあるためユーザ定義関数を作成しても使用できません…orz

もちろん、Windows (x86) 上では問題なく動きます。


次は照合順序に対応しようかと考えていたんですが、今のところ Mysaifu JVM 上では使用できそうにないのでモチベーションがdownしてます。

気分転換に SQLite3 JDBC Driver を使用したアプリケーションでも作成しようかな~。

| | コメント (0) | トラックバック (0)

2008年2月22日 (金)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.2 リリース!

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.2 をリリースしました。

「SQLite3 JDBC Driver for Mysaifu JVM」のダウンロード

「SQLite3 JNI Library for Windows (x86)」のダウンロード

主な変更は以下の通り。

  • JVM がクラッシュする致命的バグの修正。
  • UTF-16 系のメソッドを削除。
  • 未実装メソッドを実装。
  • JavaDoc コメントの充実。

なんか目的と手段がすり替わってる気がするけど気にしない。


ところで、実装にあたり SQLite Java Wrapper/JDBC Driver のソースを見てみたんですが…

あえて言おう!カスであると!

SELECT したレコードを全部 Vector に突っ込んで ResultSet に持たせるて…orz

大量のレコードを SELECT するとメモリ不足エラーで死ねます。

ちなみに SQLiteJDBC の方は ResultSet#next() メソッドが sqlite3_step() 関数を呼び出すようになっているためメモリ不足の心配もなく動作も高速です。

もちろん SQLite3 JDBC Driver for Mysaifu JVM も SQLiteJDBC と同じ仕組みになっています。

| | コメント (0) | トラックバック (0)

2008年2月15日 (金)

SQLite3 JDBC Driver for Mysaifu JVM バージョン 0.0.1 リリース!

Mysaifu JVM 上で動作する SQLite for Windows CE JDBC Type 2 ドライバを SourceForge.jp でリリースしました。

「SQLite3 JDBC Driver for Mysaifu JVM」のダウンロード

もちろん Windows (x86) 用の JNI ライブラリも用意してあるので Windows 上でも同じドライバを使用できます。

「SQLite3 JNI Library for Windows (x86)」のダウンロード

尚、開発版のため以下の制限があります。

  • java.sql.Blob は読み込みのみサポート。
  • 各 MetaData 系クラスの一部のメソッドが未実装。
  • Statement#setQueryTimeout() メソッドで設定したタイムアウト値は同一コネクションで作成されたすべての Statement で共有される。
  • UnitTest 不足のためバグが非常に多い(と思われる)。

では以下の HelloSQLite.javajikes でコンパイルして Mysaifu JVM で実行してみます。

import java.io.*;
import java.sql.*;
import org.sqlite.jdbc.JdbcPreparedStatement;

public class HelloSQLite {
    public static void main(String[] args) throws Exception {
        if (args.length == 0) {
            System.out.println(
                    "USAGE: jvm.exe HelloSQLite <database file path>"
                );
            System.exit(1);
        }
       
        // register 'org.sqlite.Driver' class
        Class.forName("org.sqlite.Driver");
       
        // open connection
        System.out.println("open database from '" + args[0] + "'.");
        final String url = "jdbc:sqlite:file:" + args[0];
        final Connection conn = DriverManager.getConnection(url);
        try {
            // create table if not exists
            Statement stmt = conn.createStatement();
            stmt.executeUpdate(
                    "CREATE TABLE IF NOT EXISTS sample("
                        + "  id INTEGER PRIMARY KEY"
                        + ", tVal TEXT"
                        + ", bVal BLOB"
                        + ", rVal REAL"
                    + ")"
                );
            stmt.close();

            // insert new record by using a named parameter
            conn.setAutoCommit(false);
            JdbcPreparedStatement pstmt
                = (JdbcPreparedStatement) conn.prepareStatement(
                        "INSERT INTO sample(tVal, bVal, rVal) "
                        + "VALUES(@text, @blob, @real)"
                    );
            for (int i = 0; i < 5; ++i) {
                String text = Character.toString((char) ('①' + i));
                byte[] blob = ("こんにちは、SQLite!" + text).getBytes();
                pstmt.setString("@text", text);
                pstmt.setBytes("@blob", blob);
                pstmt.setDouble("@real", Math.sqrt(i));
                pstmt.executeUpdate();
            }
            pstmt.close();
            conn.commit();

            // select all
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM sample");
            ResultSetMetaData rsMeta = rs.getMetaData();
            final int cntCol = rsMeta.getColumnCount();
            while (rs.next()) {
                for (int i = 1; i <= cntCol; ++i) {
                    String val = null;
                    if (rsMeta.getColumnType(i) != Types.BLOB) {
                        val = rs.getString(i);
                    } else {
                        // convert UNICODE to java.lang.String
                        val = new String(rs.getBytes(i));
                    }
                    System.out.print(val + "|");
                }
                System.out.println();
            }
            rs.close();
            stmt.close();

        } finally {
            // close connection
            conn.close();
        }
    }
}

(当然ですが)コンパイル、実行共に問題ありません。

Scrn0023

プログラム実行用メモリの少ない W-ZERO3 [es] でも動きます。

Scrn0024

注意点として、データベースファイルパスに日本語が含まれているとオープンに失敗します。

これは Mysaifu JVM のバグが原因で UNICODE から UTF-8 への変換に失敗している為です。

加えて、同じバグが原因で日本語を含む文字列が化けてしまう可能性があります(Mysaifu JVM 以外で作成されたデータベースファイルを開いて SELECT するなど)。

※スクリーンショットが文字化けしていないのは独自にバグを修正した jvm.exe を使用しているため。

JNI ライブラリの作成者としては深刻なバグなので早く対応してもらえると助かるんですが…。

| | コメント (0) | トラックバック (0)

2008年2月 6日 (水)

Mysaifu JVM を標準入出力に対応させる

早速、先日リリースされた Mysaifu JVM バージョン 0.3.5 を標準入出力に対応させました。

「mysaifujvm-0.3.5-support_stdio.zip」をダウンロード

展開された「jvm_stdio.exe」を「jvm.exe」がインストールされているフォルダにコピーしてください。

「mysaifujvm-0.3.5-support_stdio-patch.diff」は差分ファイルなので必要ない方は削除して頂いて結構です。

標準入出力を有効にする場合はオプションに「-Xhidevmwindow」を指定し、「-Xconsole」を指定しないでください。

「-Xhidevmwindow」を指定しなかったり、「-Xconsole」を指定した場合は標準入出力は有効になりません。

今回から標準入出力が有効な場合は Mysaifu JVM の終了時に出力されるメッセージ「JVM exit.」を出力しないようにしてみました。

| | コメント (0) | トラックバック (0)

2008年2月 4日 (月)

Advanced W-ZERO3 [es] で Servlet を実行する

Servlet コンテナといえば Apache Tomcat がメジャーですが、Advanced W-ZERO3 [es](以下、アドエス)はメモリが少ないため実行できそうにありません(試してみる気にもならない)。

替わりに Winstone という超軽量の Servlet コンテナを試してみます。

使い方は簡単でダウンロードした Jar ファイルを任意のフォルダにコピーして Mysaifu JVM の -jar オプションでコピーした Jar ファイルへのフルパスを指定します。

Scrn0016

あとはコマンドライン引数に「--webroot」で Servlet アプリケーションのパスを指定してヒープメモリのサイズを 12MB などにします。


Scrn0017

設定画面を閉じてメイン画面に戻り Execute ボタンをクリックして実行してみると…


Scrn0018

残念ながら JVM が異常終了してしまいました。

調べてみたところ web.xml の web-app タグ内を空っぽにすると異常終了しなくなったので xml のパース処理にバグがあるのかもしれません。


今回は Servlet を実行することは出来ませんでしたが、Mysaifu JVM のバグが原因のようなので今後のバージョンアップに期待しましょう。

Mysaifu JVM のバージョン 0.3.5 で上記のバグは修正されました。

Scrn0021

Pocket Internet Explorer でアクセスしてみたところ Servlet が正常に動きいているのを確認できました。

Scrn0022

「HelloServlet.zip」をダウンロード

| | コメント (0) | トラックバック (0)

2008年1月27日 (日)

Java コンパイラ「Jikes」を Windows Mobile に移植する

今回はネイティブな Java コンパイラである Jikes を Windows Mobile に移植して、Advanced W-ZERO3 [es](以下、アドエス)以外の W-ZERO3 でも Java ファイルをコンパイル出来る環境を構築します。

Jikes の移植には Windows Mobile 用クロスコンパイラ「CeGCC」を使用しました。

jikes-1.22-wince.zip」をダウンロード

展開された「jikes.exe」、「cegcc.dll」、「cegccthrd.dll」を任意のフォルダにコピーしてください(microSD カード上でも OK)。

既に「cegcc.dll」と「cegccthrd.dll」が Windows フォルダなどに存在する場合はコピー不要です。

「jikes-1.22-mswince」フォルダ以下には Windows Mobile 用に修正したソース一式が入っていますので必要ない方は削除して下さい。

ソース一式はこちら。

移植した Jikes の注意点ですが、

  • 「-encoding」オプションに指定できるのは「MS932」と「UTF-8」の 2 種類のみ。
    これは文字コード変換に libiconv ではなく MultiByteToWideChar を使用しているため。
    こちらのページで公開されている iconv.lzh を使用させて頂きました。
    オプションを指定しない場合は「MS932」として処理されます。
  • 引数などで指定するパスには日本語などのマルチバイト文字は使用できない。
    CeGCC では opendir 関数や FindFirstFile 関数がマルチバイト文字が含まれるパスに対応していないため。
    (もし対応する方法があればコメントください)

それと、Jikes を移植する際に Windows Mobile 用の native2ascii と ascii2native も作成しました。

「native2ascii-mswince.lzh」をダウンロード

展開された「ascii2native.exe」、「native2ascii.exe」を任意のフォルダにコピーしてください。

こちらの注意点は、

  • Sun の native2ascii と異なりオプションの指定はできません。
    文字コードは「MS932」固定です(手抜き)。
  • 引数も指定できず、リダイレクトのみ。
    「native2ascii 入力ファイル > 出力ファイル」のようにして実行します。

では、早速 Jikes でコンパイルしてみます。以下ようなバッチファイルを用意しておくと簡単に Jikes を実行できます。

@ECHO OFF
SET JIKES_BIN=\microSDカード\Java\jikes.exe
SET BOOT_CLASSPATH=\Java\sun-jre1.6.0_04-rt.jar
SET JIKES_OPTION=-bootclasspath "%BOOT_CLASSPATH%" -source 1.5
"%JIKES_BIN%" %JIKES_OPTION% %1 %2 %3 %4 %5 %6 %7 %8 %9
@ECHO ON

テキストエディタを起動して以下の HelloJikes.java を作成します。

public class HelloJikes {
    public static void main(String[] args) throws Exception {
        System.out.println("こんにちは、Jikes!");
        String circledDigit
            = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳";
        for (char digit : circledDigit.toCharArray()) {
            System.out.print(digit);
        }
    }
}

DOS窓Openを起動して Jikes でコンパイルしてみます。

Scrn0015

コンパイルは数秒で完了します。ecj とは雲泥の差です。

これで ecj とはオサラバです。


…といきたいところですが、Jikes は JDK 5 の新機能にほとんど対応していません。

対応しているのは拡張 for 文のみで、EnumBoxing/UnboxingStatic Import可変長引数Generics は使えません... orz

どこかに ecj のコードを Jikes に移植してくれるツワモノはいないですかね…。 

| | コメント (4) | トラックバック (1)

2008年1月25日 (金)

Advanced W-ZERO3 [es] で Java SE 開発 - 其ノ参

今回は ecj を使って EnumGenerics を使用した Java ファイルをコンパイルする環境を構築します。

前回作成した以下のバッチコマンドは Mysaifu JVM ver 0.3.4 に含まれている Generics に非対応の rt.jar を使用するようになっています。

@ECHO OFF
SET JAVA_HOME=\Program Files\Mysaifu JVM
SET JAVA_BIN=%JAVA_HOME%\jre\bin\jvm_stdio.exe
SET JAVA_OPTION=-Xhidevmwindow -da -Xmx20M -Xss1M -Xoss1M
SET ECJ_CLASSPATH=\Java\ecj.jar
SET ECJ_MAIN=org.eclipse.jdt.internal.compiler.batch.Main
SET BOOT_CLASSPATH=%JAVA_HOME%\jre\lib\rt.jar
"%JAVA_BIN%" %JAVA_OPTION% -classpath "%ECJ_CLASSPATH%" %ECJ_MAIN% -bootclasspath "%BOOT_CLASSPATH%" -1.5 %1 %2 %3 %4 %5 %6 %7 %8 %9
@ECHO ON

これを Generics に対応している rt.jar に置き換えればコンパイル出来るようになります。

今回は Sun の JRE に含まれる rt.jar を抜き出して使用することにします。

  1. Sun の Java SE Downloads ページから「JDK 6 Update 4」をダウンロードしてインストールします。
  2. JRE のインストールディレクトリ以下にある rt.jar はファイルサイズが大きすぎてアドエスの本体メモリに置く事ができないため、以下のバッチファイルを実行してコンパイルに必要なクラスのみを含んだ rt.jar を作成します。
    SETLOCAL
    SET JAVA_VERSION=1.6.0_04
    SET JAVA_HOME=C:\Program Files\Java\jdk%JAVA_VERSION%
    SET JRE_HOME=C:\Program Files\Java\jre%JAVA_VERSION%
    SET RT_JAR=%JRE_HOME%\lib\rt.jar
    SET DIET_RT_JAR=sun-jre%JAVA_VERSION%-rt.jar
    SET WORK_DIR=%TMP%\rt.jar

    MKDIR "%WORK_DIR%"
    PUSHD "%WORK_DIR%"

    "%JAVA_HOME%\bin\jar.exe" -xf "%RT_JAR%"

    RMDIR /S /Q com
    RMDIR /S /Q sun
    RMDIR /S /Q sunw

    "%JAVA_HOME%\bin\jar.exe" -cfm %DIET_RT_JAR% META-INF\MANIFEST.MF .

    MOVE /-Y %DIET_RT_JAR% "%HOMEPATH%\デスクトップ"

    POPD
    RMDIR /S /Q "%WORK_DIR%"

    ENDLOCAL
    「diet_rt.jar.bat」をダウンロード
  3. デスクトップ上に作成された sun-jre1.6.0_04-rt.jar をアドエスの*本体メモリ*にコピーします。
  4. ecj 実行バッチファイルの内容を以下のように sun-jre1.6.0_04-rt.jar を使用するように変更します。
    @ECHO OFF
    SET JAVA_HOME=\Program Files\Mysaifu JVM
    SET JAVA_BIN=%JAVA_HOME%\jre\bin\jvm_stdio.exe
    SET JAVA_OPTION=-Xhidevmwindow -da -Xmx20M -Xss1M -Xoss1M
    SET ECJ_CLASSPATH=\Java\ecj.jar
    SET ECJ_MAIN=org.eclipse.jdt.internal.compiler.batch.Main
    REM SET BOOT_CLASSPATH=%JAVA_HOME%\jre\lib\rt.jar
    SET BOOT_CLASSPATH=\Java\sun-jre1.6.0_04-rt.jar
    "%JAVA_BIN%" %JAVA_OPTION% -classpath "%ECJ_CLASSPATH%" %ECJ_MAIN% -bootclasspath "%BOOT_CLASSPATH%" -1.5 %1 %2 %3 %4 %5 %6 %7 %8 %9
    @ECHO ON

では前回コンパイルに失敗した HelloEnum.java をコンパイルしてみます。

Scrn0012

今度はコンパイル、実行共に成功しました。

次は  HelloGenerics.java をコンパイルしてみます。

Scrn0013

Generics もコンパイル、実行共に成功しました。

しかし、なぜ Generics 非対応のライブラリを使用しているのに Generics を使用したコードが実行できるのでしょうか?

答えは生成された class ファイルを逆コンパイルするとわかります。

実際に、作成された HelloGenerics.class を Jad で逆コンパイルしてみます。

Scrn0014

逆コンパイルされたソースコードを見てみると Generics を使用しない昔ながらのコードに書き換えられています。

import java.io.PrintStream;
import java.util.*;

public class HelloGenerics
{

    public HelloGenerics()
    {
    }

    public static void main(String args[])
    {
        ArrayList arraylist = new ArrayList();
        arraylist.add("WS003SH");
        arraylist.add("WS004SH");
        arraylist.add("WS007SH");
        arraylist.add("WS011SH");
        System.out.println("W-ZERO3 models by Generics ...");
        String s;
        for(Iterator iterator = arraylist.iterator(); iterator.hasNext(); System.out.println(s))
            s = (String)iterator.next();

    }
}

実は Generics を使用したコードは Java コンパイラによってコンパイル時に型チェックが行われ、最終的に Generics を使用しないコードに書き換えられているため、Generics 非対応のライブラリを使用していても実行できるのです。


以上で、Java SE 開発環境の完成です!




…といきたいところですが、正直なところ ecj でのコンパイルは時間が掛かりすぎて
気軽にコンパイルできません。

それにアドエス以外の W-ZERO3 ではメモリ不足のため ecj は起動すらできません... orz

ではどうするか?

Windows Mobile 上で動作するネイティブな Java コンパイラがあれば…

とうことで、次回は ネイティブ Java コンパイラである Jikes を Windows Mobile に移植します。

| | コメント (0) | トラックバック (0)

2008年1月23日 (水)

Advanced W-ZERO3 [es] で Java SE 開発 - 其ノ弐

今回は Advanced W-ZERO3 [es](以下、アドエス)上で Java ファイルをコンパイルする環境を構築します。

PC上で動作する Java コンパイラといえば javac ですが、Windwos Mobile 上で動作する javac はありません。しかし、Java SE 実行環境上で動作する「ecj」という Java コンパイラがあります。

ecj とは Eclipse プロジェクトで開発されている JDT Core Batch Compiler のことで、Pure Java で作成されているため Java SE 実行環境さえあれば Windows Mobile 上でも動作します。

早速、ecj を使用して Java SE コンパイル環境を構築します。

  1. まずは Java ファイルを作成するためにテキストエディタをインストールします。
    ○号テキストエディタ」や「PocketHpte」がお勧めです。
  2. 次に Eclipse Project Downloads のページから Latest Releases のページを開き、ecj.jar をダウンロードしてアドエスの*本体メモリに*コピーします(理由は後述)。
  3. 最後に以下のようなバッチファイルを用意しておくと簡単に ecj を実行できます。
  4. @ECHO OFF
    SET JAVA_HOME=\Program Files\Mysaifu JVM
    SET JAVA_BIN=%JAVA_HOME%\jre\bin\jvm_stdio.exe
    SET JAVA_OPTION=-Xhidevmwindow -da -Xmx20M -Xss1M -Xoss1M
    SET ECJ_CLASSPATH=\Java\ecj.jar
    SET ECJ_MAIN=org.eclipse.jdt.internal.compiler.batch.Main
    SET BOOT_CLASSPATH=%JAVA_HOME%\jre\lib\rt.jar
    "%JAVA_BIN%" %JAVA_OPTION% -classpath "%ECJ_CLASSPATH%" %ECJ_MAIN% -bootclasspath "%BOOT_CLASSPATH%" -1.5 %1 %2 %3 %4 %5 %6 %7 %8 %9
    @ECHO ON

ではテキストエディタを起動して以下の HelloEcj.java を作成します。

public class HelloEcj {
    public static void main(String[] args) {
        System.out.println("こんにちは、ecj!");
    }
}

DOS窓Openを起動して作成した HelloEcj.java を ecj でコンパイルしてみます。

Scrn0004

コンパイルが完了するまで数分かかるのでじっと待ちましょう。

注意点として、コンパイル中は CPU リソースを占有してしまうため、microSDカードを認識しなくなってしまうことがあります(ecj.jar ファイルを本体メモリに置くのはこの為です)。

Pocket の手等で内蔵デバイスの優先度を上げると緩和できるようです。

生成された HelloEcj クラスを実行してみます。

Scrn0005

単純なクラスはコンパイルできましたが JDK 5 の新機能はどうでしょうか?

まずは拡張 for 文を試してみます。

以下の HelloEnhancedFor.java を作成してコンパイルしてみます。

public class HelloEnhancedFor {
    public static void main(String[] args) {
        for (String arg : args) {
            System.out.println(arg);
        }
    }
}

Scrn0006

コンパイル、実行共に問題なさそうです。

次は Enum を試してみます。

以下の HelloEnum.java を作成してコンパイルしてみます。

public class HelloEnum {
    private enum W_ZERO3 { WS003SH, WS004SH, WS007SH, WS011SH }

    public static void main(String[] args) {
        System.out.println(W_ZERO3.WS003SH);
        System.out.println(W_ZERO3.WS004SH);
        System.out.println(W_ZERO3.WS007SH);
        System.out.println(W_ZERO3.WS011SH);
    }
}

Scrn0007

残念ながらコンパイルエラーになってしまいました。Enum は使えないようです。

次は Boxing/Unboxing を試してみます。

以下の HelloBoxing.java を作成してコンパイルしてみます。

public class HelloBoxing {
    public static void main(String[] args) {
        int one = new Integer(1);
        System.out.println("one = " + one);
        Integer eleven = one + 10;
        System.out.println("eleven = " + eleven);
    }
}

Scrn0008

コンパイル、実行共に問題なさそうです。

次は Static Import を試してみます。

以下の HelloStaticImport.java を作成してコンパイルしてみます。

import static java.lang.Math.random;

public class HelloStaticImport {
    public static void main(String[] args) {
        System.out.println("random = " + random());
    }
}

Scrn0009

コンパイル、実行共に問題なさそうです。

次は可変長引数を試してみます。

以下の HelloVariableArity.java を作成してコンパイルしてみます。

public class HelloVariableArity {
    public static void main(String[] args) {
        String[] models
            = new String[] {
                    "WS003SH", "WS004SH", "WS007SH", "WS011SH",
                };
        printWZERO3Models(models);
    }

    private static void printWZERO3Models(String... models) {
        System.out.println("W-ZERO3 models...");
        for (String model : models) {
            System.out.println(model);
        }
    }
}

Scrn0010

コンパイル、実行共に問題なさそうです。

最後に Generics を試してみます。

以下の HelloGenerics.java を作成してコンパイルしてみます。

import java.util.List;
import java.util.ArrayList;

public class HelloGenerics {
    public static void main(String[] args) {
        List<String> models = new ArrayList<String>();
        models.add("WS003SH");
        models.add("WS004SH");
        models.add("WS007SH");
        models.add("WS011SH");

        System.out.println("W-ZERO3 models by Generics ...");
        for (String model : models) {
            System.out.println(model);
        }
    }
}

Scrn0011

残念ながらコンパイルエラーとなってしまいました。Generics も使用できないようです。


結果から考察すると、コンパイラの拡張に関するものは OK で、ライブラリの拡張に関するものは NG のようです。

理由は単純で Mysaifu JVM ver 0.3.4 は GNU Classpath 0.92 がベースになっているため、ライブラリに Enum クラスや Generics 対応のクラスが含まれていないのです。

※Enum クラスは含まれています。Generics に対応していないだけでした... orz

では、Mysaifu JVM ver 0.3.4 では Enum や Generics は使えないのか?というと使えます。

次回は、ecj を使って Enum や Generics を使用した Java ファイルをコンパイルする環境を構築します。

| | コメント (0) | トラックバック (0)

2008年1月16日 (水)

Advanced W-ZERO3 [es] で Java SE 開発 - 其ノ壱

Advanced W-ZERO3 [es](以下、アドエス)には標準で Java ME 実行環境である JBlend がインストールされていますが、Windows Mobile 上で動作するフリーの Java SE 実行環境である Mysaifu JVM を使用してアドエス上で Java SE セルフコンパイル環境を構築していきます。

まず初めに Java SE 実行環境を構築します。

  1. まず Windows Mobile 上で動作するCUIシェル DOS窓Open をインストールします。
  2. 次に Mysaifu JVM のページから現時点での最新版であるバージョン 0.3.4 の jvm.Release.zip をダウンロードしてアドエスにインストールします。
  3. 最後に以下のようなバッチファイルを用意しておくと簡単に Mysaifu JVM を実行できます。
  4. @ECHO OFF
    SET JAVA_BIN=\Program Files\Mysaifu JVM\jre\bin\jvm.exe
    SET JAVA_OPTION=-Xhidevmwindow -da
    SET CLASSPATH=%CUR DIR%;\;\My Documents
    "%JAVA_BIN%" %JAVA_OPTION% -classpath "%CLASPATH%" %1 %2 %3 %4 %5 %6 %7 %8 %9
    @ECHO ON

これで昔ながらのコマンドプロンプト上で Java を実行する環境が整いました。

では実際に以下の Hello クラス をアドエス上で実行してみます。

public class Hello {
    public static void main(String[] args) {
        System.out.println("こんにちは、世界!");
    }
}

実行してみると以下のようにコマンドプロンプト上には何も表示されません。

実行結果画面1

これは Mysaifu JVM が標準出力に対応していない為で、オプションに「-Xconsole」追加すれば以下のように Mysaifu JVM の画面上にメッセージが表示されるようになります。

実行結果画面2

ただ、これだとコマンドプロンプトに戻るために閉じるボタンをタップする必要があり不便なので Mysaifu JVM の標準入出力対応版を作成しました。

「mysaifujvm-0.3.4-support_stdio.zip」をダウンロード

展開された「jvm_stdio.exe」を「jvm.exe」がインストールされているフォルダにコピーしてください。

「mysaifujvm-0.3.4-support_stdio-patch.diff」は差分ファイルなので必要ない方は削除して頂いて結構です。

標準入出力を有効にするためにはオプションに「-Xhidevmwindow」を指定し、「-Xconsole」を指定しないでください。

「-Xhidevmwindow」を指定しなかったり、「-Xconsole」を指定した場合は標準入出力は有効になりません。

「jvm.exe」の替わりに「jvm_stdio.exe」を使用すると以下のようにコマンドプロンプト上にメッセージが表示されるようになります。

実行結果画面3

次回は Java ファイルをコンパイルする環境を構築します。

| | コメント (0) | トラックバック (0)

その他のカテゴリー

CeGCC | Delphi | DirectShow | iPhone | Java | JMF | Mac | Mysaifu JVM | NetBeans | onig4j | Ruby | SQLite | W-ZERO3 | Windows Mobile | ワンセグ | 開発