Java DWARF Readerの続き。
チューニングを施したところ、実行時間は約25秒から5秒弱にまで減少。ヤター
分かったこと1: やはり配列とArrayListは速い。Map(HashMap)は遅い。
分かったこと2: byte[]からStringへ高速に変換するには、deprecatedなコンストラクタ(String(byte[] d, int hibyte))を使うしかない。もちろん7ビット文字集合である必要がある。符号化系に対応すると、非実用的なほど遅くなる。
あとメモリ消費量も相当になってしまったけれど、これはどうしょうもないのかなあ。
2006-09-12
2006-09-10
Java DWARF Reader
ELF情報を読むクラスは作ったので、DWARFリーダに挑戦。
とりあえず.debug_abbrevと.debug_infoを読むところはできた(階層構造を復元したり、型の名前を復元したりするところはまだ)。
ただ、実行速度が遅いのでちょっとがっかり。14.5MB(デバッグ情報は10MBくらい。でかいなあw)ほどの実行ファイルを解析するのに25秒くらいかかってしまう。
そこでJavaのプロファイラを探してみたのだけど、NetBeansと組み合わせて使えるものが出ていたのね。ついでにバージョンも4.1から5.0に上げておいて、さっそく計測〜
測定手順は思っていたよりは遥かに簡単。ていうか、Javaはデバッグ機能もろくに使ってない(printlnデバッグがメイン)から、妙に感動してしまった。
で、20-80の法則とまではいかないけど顕著なボトルネックがあったのでさっそく改造予定。
とりあえず.debug_abbrevと.debug_infoを読むところはできた(階層構造を復元したり、型の名前を復元したりするところはまだ)。
ただ、実行速度が遅いのでちょっとがっかり。14.5MB(デバッグ情報は10MBくらい。でかいなあw)ほどの実行ファイルを解析するのに25秒くらいかかってしまう。
そこでJavaのプロファイラを探してみたのだけど、NetBeansと組み合わせて使えるものが出ていたのね。ついでにバージョンも4.1から5.0に上げておいて、さっそく計測〜
測定手順は思っていたよりは遥かに簡単。ていうか、Javaはデバッグ機能もろくに使ってない(printlnデバッグがメイン)から、妙に感動してしまった。
で、20-80の法則とまではいかないけど顕著なボトルネックがあったのでさっそく改造予定。
2006-08-22
Java ELF Reader
JavaからELF32フォーマットのファイルを読むクラスを作成中。
仕事でルネサスのSH-Cコンパイラを使っていて、これが実行ファイルをELF+DWARFで出力する。もしこの情報が読めれば、ログビューアから変数の読み書きが可能になる。
で、ELFは意外と簡単な感触。ELFヘッダ・プログラムヘッダ・セクションヘッダの3種類のヘッダと、シンボルテーブルの構造を理解すればいいだけ。
それに対し、DWARFはいろいろ難しそう。タグづけされたデータを階層状に復元する必要があるらしいのだけど、どういうデータで表現すれば良いのやら…
仕事でルネサスのSH-Cコンパイラを使っていて、これが実行ファイルをELF+DWARFで出力する。もしこの情報が読めれば、ログビューアから変数の読み書きが可能になる。
で、ELFは意外と簡単な感触。ELFヘッダ・プログラムヘッダ・セクションヘッダの3種類のヘッダと、シンボルテーブルの構造を理解すればいいだけ。
それに対し、DWARFはいろいろ難しそう。タグづけされたデータを階層状に復元する必要があるらしいのだけど、どういうデータで表現すれば良いのやら…
2006-07-25
TableCellRenderer
JTableに対するTableCellRendererオブジェクトは、各列に対して1つ作成すれば良い。
その1つのオブジェクトを各行の描画に利用し、それを繰り返すことでJTable全体を描画するとのこと。
なんてこった、2000行近いJTableを使っていたので2000個の余分なJTextAreaを生成していたよ。そりゃ遅いわけだ… orz
で、書き直してみたら目が覚めるほど速くなった。うひょー
IBMのサイトSwingのJTableコンポーネントでセルを描くが詳しい。
その1つのオブジェクトを各行の描画に利用し、それを繰り返すことでJTable全体を描画するとのこと。
なんてこった、2000行近いJTableを使っていたので2000個の余分なJTextAreaを生成していたよ。そりゃ遅いわけだ… orz
で、書き直してみたら目が覚めるほど速くなった。うひょー
IBMのサイトSwingのJTableコンポーネントでセルを描くが詳しい。
2006-07-16
先読みの正規表現
Bayesian推定のプログラムを作っている途中で気が付いたこと。
ファイルをトラバースする際に、探索を打ち切るパス名を正規表現で表現したい。具体的には「パス要素がちょうど3で、第3要素が"image"ではない」パス名だけマッチさせたい。
で、最初は[^/]+/[^/]+/[^i][^m][^a][^g][^e].*かな?と思って試したんだけど、良く考えるとa/b/xxxがマッチしない(探索を打ち切れない)ので、これは間違い。
次に「幅ゼロの否定先読み」という難しい機能が使えるかなと思って[^/]+/[^/]+/(?!image)を指定したけど、何もマッチしない。
おかしいなあと思ってPerlの正規表現(Javaの正規表現はPerlの影響が大きいようだ)を調べてみると… うわ、よくある間違いだった… orz
上記の例だと、「imageが後続しない、第3要素が空の、3つのパス要素を持つパス」の意味になって、"aaa/bbb/"などにしかマッチしない。
正解は[^/]+/[^/]+/(?!image).+だった。しかし、Perl/Javaの正規表現は難しいなあ…
ファイルをトラバースする際に、探索を打ち切るパス名を正規表現で表現したい。具体的には「パス要素がちょうど3で、第3要素が"image"ではない」パス名だけマッチさせたい。
で、最初は[^/]+/[^/]+/[^i][^m][^a][^g][^e].*かな?と思って試したんだけど、良く考えるとa/b/xxxがマッチしない(探索を打ち切れない)ので、これは間違い。
次に「幅ゼロの否定先読み」という難しい機能が使えるかなと思って[^/]+/[^/]+/(?!image)を指定したけど、何もマッチしない。
おかしいなあと思ってPerlの正規表現(Javaの正規表現はPerlの影響が大きいようだ)を調べてみると… うわ、よくある間違いだった… orz
上記の例だと、「imageが後続しない、第3要素が空の、3つのパス要素を持つパス」の意味になって、"aaa/bbb/"などにしかマッチしない。
正解は[^/]+/[^/]+/(?!image).+だった。しかし、Perl/Javaの正規表現は難しいなあ…
Bayesian推定を使ったファイル分類プログラム
CG定点観測などのサイトを巡る身としては、落してきた画像ファイルの分類は結構めんどうな作業だ。そこで、URL文字列に基づくBayesian推定を利用するファイル分類プログラムwを作り始めたり。
幸い、いままで「/a/flower/カテゴリ/image/取得元URL」というルールで画像ファイルを格納してきた。例えばダウソ元がhttp://www.haruhi.tv/img/sos_logo.gifならば、/a/flower/s/suzumiya_haruhi_no_yuuutu/image/www.haruhi.tv/img/sos_logo.gifに格納するといった具合。
だから、分類プログラムは/a/flower以下を走査し、カテゴリと分類キーワードを抜き出して出現確率を学習してやればよい。分類キーワードはURLから抜き出すものとし、上記の例ならば「www.haruhi.tv」「www.haruhi.tv/img」「sos_logo」が分類キーワードになる。
…で、試作品ができた。実行はこんな感じ
sakuraというキーワードから木之本桜だけではなく、芳乃さくら・任意さくらも自動的に候補としてくれるあたりが面白い。サクラ大戦の画像はほとんどないので、当然これはひっかからない。
んが、
100%越えてるよ!?www
幸い、いままで「/a/flower/カテゴリ/image/取得元URL」というルールで画像ファイルを格納してきた。例えばダウソ元がhttp://www.haruhi.tv/img/sos_logo.gifならば、/a/flower/s/suzumiya_haruhi_no_yuuutu/image/www.haruhi.tv/img/sos_logo.gifに格納するといった具合。
だから、分類プログラムは/a/flower以下を走査し、カテゴリと分類キーワードを抜き出して出現確率を学習してやればよい。分類キーワードはURLから抜き出すものとし、上記の例ならば「www.haruhi.tv」「www.haruhi.tv/img」「sos_logo」が分類キーワードになる。
…で、試作品ができた。実行はこんな感じ
% java Bic learn
% java Bic prob nagato
P(An[s/suzumiya_haruhi_no_yuuutu])=577/23472 P(Bm[nagato])=43/92485 P(Bm|An)=41/2210 P(An|Bm)=0.9808896341240785
% java Bic prob sakura
P(An[c/card_captor_sakura])=465/23472 P(Bm[sakura])=42/92485 P(Bm|An)=35/2338 P(An|Bm)=0.6530529632379997
P(An[d/dc_da_capo])=177/23472 P(Bm[sakura])=42/92485 P(Bm|An)=1/684 P(An|Bm)=0.024276667975038708
P(An[n/nanika])=54/23472 P(Bm[sakura])=42/92485 P(Bm|An)=3/187 P(An|Bm)=0.08127281866455452
P(An[@Circle/neko_ni_terumin])=361/23472 P(Bm[sakura])=42/92485 P(Bm|An)=1/1467 P(An|Bm)=0.02308601651808125
P(An[m/mahojin_guruguru])=1304/23472 P(Bm[sakura])=42/92485 P(Bm|An)=2/5330 P(An|Bm)=0.04590418614808859
sakuraというキーワードから木之本桜だけではなく、芳乃さくら・任意さくらも自動的に候補としてくれるあたりが面白い。サクラ大戦の画像はほとんどないので、当然これはひっかからない。
んが、
% java Bic prob nanoha.com
P(An[l/lyrical_nanoha])=3229/23472 P(Bm[nanoha.com])=19/92485 P(Bm|An)=19/12567 P(An|Bm)=1.0124128163161337
100%越えてるよ!?www
2006-07-02
W-ZERO3: QRコードのデコード
さて、MIDPアプリががしがし書ける状況にはなったけど、本題のQRコードはどうしようか。
QRコードを解読するための画像をMIDPアプリに食わせるには、
多分2通りの方法があると思う。
1つめは直接Javaからカメラの画像を取得してしまう方法。
もう1つがJavaからファイルシステムに格納された画像ファイルを入力する方法。
第1の方法は、Mobile Media APIを使えば良いらしい。
だがMIDP的にはオプションなので、本当に使えるかはわからない。
そこで公式ページに乗っているサンプルコードをコンパイルして試してみたが… ダメっぽい… orz
カメラからの入力を受け付けるデバイスはvideo.snapshot.encodingsというプロパティを持つらしいのだけど、そんなものはない。(関係ないが、J2MEではPropertiesを列挙できないのでちょっと困った)
そこで第2の画像ファイルを読む方法を試してみた。
こちらはPDA Optional Packages for the J2METM Platformというもので、ネイティブ実行環境のファイルやPIMデータへのアクセスを提供する。
んが… これどう使ったらいいんだろう?
ん・ぱか工房さんのサンプルを試してみたけど、JBlendは黙ってすぐに終了してしまう。
らるるのメモ帳さんを参考にしてfile://localhost/に置き換えてもダメ…
というわけでお手上げ〜
画像ファイルのURLを入力して読ませることはできると思うんだけど、
画像ファイルをどううpするのとか、そのURLは手打ちかよ!とかいろいろ難がある。
QRコードを解読するための画像をMIDPアプリに食わせるには、
多分2通りの方法があると思う。
1つめは直接Javaからカメラの画像を取得してしまう方法。
もう1つがJavaからファイルシステムに格納された画像ファイルを入力する方法。
第1の方法は、Mobile Media APIを使えば良いらしい。
だがMIDP的にはオプションなので、本当に使えるかはわからない。
そこで公式ページに乗っているサンプルコードをコンパイルして試してみたが… ダメっぽい… orz
カメラからの入力を受け付けるデバイスはvideo.snapshot.encodingsというプロパティを持つらしいのだけど、そんなものはない。(関係ないが、J2MEではPropertiesを列挙できないのでちょっと困った)
そこで第2の画像ファイルを読む方法を試してみた。
こちらはPDA Optional Packages for the J2METM Platformというもので、ネイティブ実行環境のファイルやPIMデータへのアクセスを提供する。
んが… これどう使ったらいいんだろう?
ん・ぱか工房さんのサンプルを試してみたけど、JBlendは黙ってすぐに終了してしまう。
らるるのメモ帳さんを参考にしてfile://localhost/に置き換えてもダメ…
というわけでお手上げ〜
画像ファイルのURLを入力して読ませることはできると思うんだけど、
画像ファイルをどううpするのとか、そのURLは手打ちかよ!とかいろいろ難がある。
Solaris/x86におけるMIDPアプリの開発環境 その3
Solaris/x86におけるMIDPアプリの開発環境の続き。
さて、どうにかJ2ME+CLDC+MIDPのコンパイル/エミュレーション環境がそろったので、
いよいよアプリケーションを作ってみる。
SunのMIDPのドキュメントについているHelloMIDlet.javaをsrc/に置き、
カレントディレクトリに以下のMakefileを置いてやる。
これでmake all jarしてやれば、jarファイルとjadファイルができる。
エミュレータを起動するにはmake run。
MIDP_DIRとWTK_DIRはそれぞれMIDPのリファレンス実装を展開したところと
Wireless Toolkitをインストールしたところを指定する。
WTK_DIRとOTP_CLASSESはMMAPIなどのオプションAPIを使うときだけ指定する。
さて、どうにかJ2ME+CLDC+MIDPのコンパイル/エミュレーション環境がそろったので、
いよいよアプリケーションを作ってみる。
SunのMIDPのドキュメントについているHelloMIDlet.javaをsrc/に置き、
カレントディレクトリに以下のMakefileを置いてやる。
JAR = HelloMIDlet
MIDP_DIR = ../../j2me/midp2.0fcs/build/solaris
WTK_DIR = ../../j2me/WTK2.2
MIDP_CLASSES = $(MIDP_DIR)/classes
OPT_CLASSES = $(WTK_DIR)/lib/jsr75.jar
PREVERIFY = $(MIDP_DIR)/bin/preverify
EMULATOR = $(MIDP_DIR)/bin/midp
BOOT_CP = $(MIDP_CLASSES)
REF_CP = $(MIDP_CLASSES):$(OPT_CLASSES)
RUN_CP = classes:$(MIDP_CLASSES):$(OPT_CLASSES)
JAVAC = javac -bootclasspath $(BOOT_CP) -classpath $(REF_CP) -source 1.4
all: tmpclasses
$(JAVAC) -d tmpclasses `find src -name \*.java`
rm -rf classes; mkdir classes
$(PREVERIFY) -cldc -classpath $(RUN_CP) -d classes tmpclasses
jar:
@echo 'Manifest-Version: 1.0' > $(JAR).mf
@echo 'MIDlet-Name: $(JAR)' >> $(JAR).mf
@echo 'MIDlet-Version: 0.0.1' >> $(JAR).mf
@echo 'MIDlet-Vendor: unknown vendor' >> $(JAR).mf
@echo 'MicroEdition-Profile: MIDP-2.0' >> $(JAR).mf
@echo 'MicroEdition-Configuration: CLDC-1.0' >> $(JAR).mf
jar -cmf $(JAR).mf $(JAR).jar -C classes .
cp $(JAR).mf $(JAR).jad
@echo 'MIDlet-Jar-URL: http://localhost/$(JAR).jar' >> $(JAR).jad
@echo 'MIDlet-Jar-Size: '`ls -l $(JAR).jar | awk '{print $$5}'` >> $(JAR).jad
@echo 'MIDlet-1: $(JAR),, $(JAR)' >> $(JAR).jad
run:
$(EMULATOR) -classpath $(RUN_CP) -descriptor $(JAR).jad
tmpclasses:
mkdir tmpclasses
clean:
rm -rf classes tmpclasses $(JAR).mf $(JAR).jar $(JAR).jad
これでmake all jarしてやれば、jarファイルとjadファイルができる。
エミュレータを起動するにはmake run。
MIDP_DIRとWTK_DIRはそれぞれMIDPのリファレンス実装を展開したところと
Wireless Toolkitをインストールしたところを指定する。
WTK_DIRとOTP_CLASSESはMMAPIなどのオプションAPIを使うときだけ指定する。
2006-07-01
Java ME - Micro App Development Made Easy
Java ME - Micro App Development Made Easy
Solaris/x86におけるMIDPアプリの開発環境の続き。
J2ME Wireless Toolkitに含まれるエミュレータとpreverifyがプラットフォーム依存なため、
結局Solarisでは動かない(SPARCもx86)と判断した。
ある意味Sun純正の開発環境なんだけど… orz
そこでさらに調べると、素のMIDP開発キットがあって
Solaris(SPARC), Linux(x86), Windowsで動作するらしい。
前述のJ2ME Wireless Toolkitはこの開発キットが前身で、
これを簡易IDE風にまとめたものらしい。
ならばこれをSolaris/x86用にビルドしてやろうか… というのが以下のメモ。
まあ、下のパッチを見ると分かるようにSSL関連の関数をダミーで置き換えていて、
相当あやしいシロモノである。
j2me_cldc-1.0.4ri.patch
midp2.0fcs.patch
Solaris/x86におけるMIDPアプリの開発環境の続き。
J2ME Wireless Toolkitに含まれるエミュレータとpreverifyがプラットフォーム依存なため、
結局Solarisでは動かない(SPARCもx86)と判断した。
ある意味Sun純正の開発環境なんだけど… orz
そこでさらに調べると、素のMIDP開発キットがあって
Solaris(SPARC), Linux(x86), Windowsで動作するらしい。
前述のJ2ME Wireless Toolkitはこの開発キットが前身で、
これを簡易IDE風にまとめたものらしい。
ならばこれをSolaris/x86用にビルドしてやろうか… というのが以下のメモ。
- J2ME CLDC 1.0.4 RIとJ2ME MIDP 2.0FCSを入手。
どちらもSolaris/SPARC版を選ぶ。 - 伸長
% unzip archive/j2me_cldc-1_0_4-src-winunix.zip
% unzip archive/midp-2_0-src-solaris-sparc.zip - パッチあて
% ln -s j2me_cldc kvm
% (cd j2me_cldc; gpatch -p0 -b -z .ORG < ../patch/j2me_cldc-1.0.4ri.patch)
% touch midp2.0fcs/build/solaris/dummy_ssl.c
% (cd midp2.0fcs; gpatch -p0 -b -z .ORG < ../patch/midp2.0fcs.patch) - ビルド
% cd midp2.0fcs/build/solaris
% gmake - サンプルを実行
% bin/midp -classpath classes -descriptor games.jad
まあ、下のパッチを見ると分かるようにSSL関連の関数をダミーで置き換えていて、
相当あやしいシロモノである。
j2me_cldc-1.0.4ri.patch
--- ./api/Makefile.ORG Thu Nov 14 08:07:07 2002
+++ ./api/Makefile Sat Jul 1 17:46:51 2006
@@ -20,7 +20,7 @@
DEBUGFLAG=":none"
endif
-JAVAC = javac
+JAVAC = javac -source 1.4 -encoding ISO-8859-1
PREVERIFY = ../tools/preverifier/build/$(PLATFORM)/preverify
JAR = jar
--- ./tools/jcc/Makefile.ORG Thu Nov 14 08:07:09 2002
+++ ./tools/jcc/Makefile Sat Jul 1 17:43:27 2006
@@ -15,7 +15,7 @@
include $(TOP)/build/Makefile.inc
JAVA = java
-JAVAC = javac
+JAVAC = javac -source 1.4 -encoding ISO-8859-1
JAR = jar
JAVAFILES = $(shell find src -name "*.java"|grep -v SCCS)
--- ./tools/kdp/Makefile.ORG Thu Nov 14 08:07:10 2002
+++ ./tools/kdp/Makefile Sat Jul 1 17:43:27 2006
@@ -14,7 +14,7 @@
all: tools
JAVA = java
-JAVAC = javac
+JAVAC = javac -source 1.4 -encoding ISO-8859-1
JAR = jar
JAVAFILES = $(shell find src -name "*.java"|grep -v SCCS)
midp2.0fcs.patch
--- ./build/share/makefiles/Defs.gmk.ORG Fri Nov 8 06:02:05 2002
+++ ./build/share/makefiles/Defs.gmk Sat Jul 1 17:36:03 2006
@@ -156,7 +156,7 @@
#
JAR = $(BOOTDIR)/bin/jar$(EXE)
JAVA = $(BOOTDIR)/bin/java$(EXE)
-JAVAC = $(BOOTDIR)/bin/javac$(EXE)
+JAVAC = $(BOOTDIR)/bin/javac$(EXE) -source 1.3 -encoding ISO-8859-1
JAVADOC = $(BOOTDIR)/bin/javadoc$(EXE)
# MIDP tools
@@ -304,7 +304,9 @@
PLATFORM_OBJ_FILES += $(patsubst %.rc,$(OBJ_DIR)/%.res,$(filter %.rc, $(PLATFORM_SRC_FILES)))
SSL_OBJ_DIR = ssl_obj$(g)$(ARCH_DIR)
-SSL_SRC_FILES = nativecrypto.c MD5.c SHA.c bnlib.c MD2.c messagedigest.c
+#SSL_SRC_FILES = nativecrypto.c MD5.c SHA.c bnlib.c MD2.c messagedigest.c
+#SSL_OBJ_FILES = $(patsubst %.c,$(SSL_OBJ_DIR)/%.o,$(SSL_SRC_FILES))
+SSL_SRC_FILES = dummy_ssl.c
SSL_OBJ_FILES = $(patsubst %.c,$(SSL_OBJ_DIR)/%.o,$(SSL_SRC_FILES))
# generate OBJ_FILES list; we need to sort the files due to a linker
--- ./build/solaris/makefiles/Defs-pre.gmk.ORG Fri Nov 8 06:02:07 2002
+++ ./build/solaris/makefiles/Defs-pre.gmk Sat Jul 1 14:34:19 2006
@@ -76,6 +76,7 @@
endif
ifeq ($(ARCH), i386)
_BOOTDIR = /usr/local/java/jdk1.3/x86
+_BOOTDIR = /usr/java
endif
# Uncomment the following definition if you want to build both Solaris/x86
--- ./build/solaris/dummy_ssl.c.ORG Sat Jul 1 17:36:48 2006
+++ ./build/solaris/dummy_ssl.c Sat Jul 1 17:36:48 2006
@@ -1,0 +1,8 @@
+void Java_com_sun_midp_ssl_Alg2_modExp(void) {}
+void Java_com_sun_midp_ssl_Alg3_nativetx(void) {}
+void Java_com_sun_midp_ssl_MD5_nativeUpdate(void) {}
+void Java_com_sun_midp_ssl_MD5_nativeFinal(void) {}
+void Java_com_sun_midp_ssl_MD2_nativeUpdate(void) {}
+void Java_com_sun_midp_ssl_MD2_nativeFinal(void) {}
+void Java_com_sun_midp_ssl_SHA_nativeUpdate(void) {}
+void Java_com_sun_midp_ssl_SHA_nativeFinal(void) {}
ソフト開発について - W-ZERO3 Wiki
ソフト開発について - W-ZERO3 Wiki
MIDPアプリのSolaris/x86用開発環境を探してみるが… 微妙に敷居が高いなあ。
W-ZERO3 Wikiを見るとまず、
* J2SE Development Kit 5.0 Update 6 with NetBeans 4.1 Bundle
* NetBeans Mobility Pack 4.1
が挙げられているのだけど、すでにNetBeans 5に移行しているため
4.1のファイルはダウンロードできなくなってる。
5は5で問題があって、英語版しかMobility Packが用意されていないようだ。
* Java 2 SDK, Standard Edition, v 1.4.2_10 (J2SE)
* J2ME Wireless Toolkit 2.2
マシンにはJ2SE SDK 5.0が入っているのだけど、
これにLinux(x86)用のJ2ME Wireless Toolkit 2.2を入れてktoolbarという
ツールが動くところまでは確認した。
ただし、WTK2.2/wtklib/SunOSというシンボリックリンクがWTK2.2/wtklib/Linuxを
指すようにしないといけない。
また、WTK2.2/bin/*.soやWTK2.2/bin/{preverity*,zayit}はLinuxのバイナリ/ライブラリなので、
これを使うところでこけることになりそう。
MIDPアプリのSolaris/x86用開発環境を探してみるが… 微妙に敷居が高いなあ。
W-ZERO3 Wikiを見るとまず、
* J2SE Development Kit 5.0 Update 6 with NetBeans 4.1 Bundle
* NetBeans Mobility Pack 4.1
が挙げられているのだけど、すでにNetBeans 5に移行しているため
4.1のファイルはダウンロードできなくなってる。
5は5で問題があって、英語版しかMobility Packが用意されていないようだ。
* Java 2 SDK, Standard Edition, v 1.4.2_10 (J2SE)
* J2ME Wireless Toolkit 2.2
マシンにはJ2SE SDK 5.0が入っているのだけど、
これにLinux(x86)用のJ2ME Wireless Toolkit 2.2を入れてktoolbarという
ツールが動くところまでは確認した。
ただし、WTK2.2/wtklib/SunOSというシンボリックリンクがWTK2.2/wtklib/Linuxを
指すようにしないといけない。
また、WTK2.2/bin/*.soやWTK2.2/bin/{preverity*,zayit}はLinuxのバイナリ/ライブラリなので、
これを使うところでこけることになりそう。
SourceForge.jp: Project Info - QR Code
SourceForge.jp: Project Info - QR Code
W-ZERO3でQRコードを解読させてみたくて、デコードライブラリを検索してたらこんなプロジェクトが。
さっそくダウンロードしてみたが… おいおい、ドキュメントの類がひとつもないじゃないか。不親切だなあ。
まあいいやコンパイルしてみるか、と気を取り直してantコマンドを… build.xmlもないのね。
Eclipseで作った形跡があるんだけど、Sun儲としては今さら入れるのも微妙だよなあ…
で、しょうがないのでMakefile作りますた(←オールドタイプ)。
これでjarファイルはおk。
お次はサンプルプログラムのqrcodeExample.zipを伸長して…
って、できあいのjarファイル入ってたね… orz
まあ気を取り直してこんな感じのMakefileを書いてみる。
実行するのはこんな感じ。
% java -jar QRCodeDecoderSampleGUI.jar
おお、とりあえずなんとか動かせた。
W-ZERO3でQRコードを解読させてみたくて、デコードライブラリを検索してたらこんなプロジェクトが。
さっそくダウンロードしてみたが… おいおい、ドキュメントの類がひとつもないじゃないか。不親切だなあ。
まあいいやコンパイルしてみるか、と気を取り直してantコマンドを… build.xmlもないのね。
Eclipseで作った形跡があるんだけど、Sun儲としては今さら入れるのも微妙だよなあ…
で、しょうがないのでMakefile作りますた(←オールドタイプ)。
JAVAC = javac -encoding shift-jis
compile: classes
$(JAVAC) -d classes -sourcepath src `find src -name \*.java`
jar:
jar cvf qrcode.jar -C classes .
classes:
mkdir classes
clean:
rm -rf classes
これでjarファイルはおk。
お次はサンプルプログラムのqrcodeExample.zipを伸長して…
って、できあいのjarファイル入ってたね… orz
まあ気を取り直してこんな感じのMakefileを書いてみる。
all:
$(MAKE) jar JAR=QRCodeDecoderSampleCUI
$(MAKE) jar JAR=QRCodeDecoderSampleGUI
jar:
echo 'Manifest-Version: 1.0' > $(JAR).mf
echo 'Main-Class: jp.sourceforge.qrcode.example.$(JAR)' >> $(JAR).mf
mkdir $(JAR)
(cd $(JAR); jar xf ../qrcode.jar; cp -rp ../classes/* .)
jar cfm $(JAR).jar $(JAR).mf -C $(JAR) .
rm -r $(JAR).mf $(JAR)
clean:
rm -rf *.mf
rm -rf QRCodeDecoderSample*
実行するのはこんな感じ。
% java -jar QRCodeDecoderSampleGUI.jar
おお、とりあえずなんとか動かせた。
登録:
投稿 (Atom)