[Java] auオープンアプリを触ってみた
2009.09.22 |Category …Java
激しく今更感があるのですが、auの携帯についているJava仮想マシン、auオープンアプリに触ってみました。
コンパイラはSun Java SDK, コンパイルに必要なライブラリやメタファイル生成用のツールとしてJ2ME Wireless Toolkit 2.2とやらを使うという事でJ2ME Wireless Toolkitをダウンロード&インストール。
このToolkitがリリースされた当時はJDK1.4.2だったらしく、「JDK1.4.2ではテストしましたよ~」みたいな事が書いてあったが無視して6.0環境にインストール。
でもって、WirelessToolkitのプロジェクト管理ツール「KToolbar」を起動してプロジェクトを作成し、Javaソースを書いて属性をいじって、ビルド=>実行=>「HelloWorld」・・・※1
よしよし。できたできた。
でわ、他所で借りているサーバにFTPでアップして*.jadファイルをダウンロード!
携帯:「対応して無いっす。無理っす」
うーん。どうやら、ダウンロード時にHTML側で属性を定義しないとダメっぽいです。
HTMLを作成して、こんな感じに
<html><body>
オープンアプリゲーム</br>
以下のリンクをクリックしてください。
<a href="device:jam?http://鯖/HelloWorld.jad">ダウンロード</a>
</body></html>
これでリンクを叩けば・・・
今度はダウンロード中にエラーになった。
FireFoxで接続してヘッダを見てもなんとなくアプリっぽいヘッダを返しているように見えるけど、.htaccessでContent-Typeを指定してみる。
AddType text/vnd.sun.j2me.app-descriptor jad
AddType application/Java-archive jar
さて、今度はダウンロードまではうまくいった。
しかし、起動時に
携帯:「変なのが来たからうごかねーぜ(F7)」
とか言われた。
ここまではさくさく解決できたのですが、ここからがはまりましたわ。
はまった理由がまずエラーコードらしき「F7」。
これがなんだかわからない。auに行ってもリファレンスが無いしぐぐっても出てこないし。
エラーをコード表記するのであれば開発者用のリファレンスが欲しいところです。実際はあったりする?
で、小一時間さまよってみたのですが拉致があかないのでエミュレータで起動してみる。
※1の通り、普通に表示できている。
では、ソースの中身をコメントアウトして文字列をいろいろ変えてみても表示は変わらず。
このときに初めて「実行」ボタンで表示されるのがエミュレータ上のランチャー(アプリ一覧)である事に気づきました。
「実行」ボタンを押して、ランチャーの中にある文字列を選んで「SELECT」って押すとようやく該当アプリのJarがキックされる仕様っぽいです。
SELECTボタンを押したときにToolbar内部にスタックトレースが表示されていて、結局の原因はメタファイル(*.jad)作成時に実行クラス名を間違ってたことでしたー。しょーもな。ClassNotFoundException。
で、jadを編集してFTPして読み込んだら普通に動作した、かと思いきや今度は起動はするが画面に何も表示されない。
こっちは属性設定でCLDC1.0からCLDC1.1に変えたら表示できたので色の指定の仕方とかバージョンによって仕様がちょっと値がうのかもしれないですね。
つーか、結構めんどくさいのね。これ。
まだEclipseプロジェクトにもしてないし、もう少し弄ってあげる必要がありそうです。
コンパイラはSun Java SDK, コンパイルに必要なライブラリやメタファイル生成用のツールとしてJ2ME Wireless Toolkit 2.2とやらを使うという事でJ2ME Wireless Toolkitをダウンロード&インストール。
このToolkitがリリースされた当時はJDK1.4.2だったらしく、「JDK1.4.2ではテストしましたよ~」みたいな事が書いてあったが無視して6.0環境にインストール。
でもって、WirelessToolkitのプロジェクト管理ツール「KToolbar」を起動してプロジェクトを作成し、Javaソースを書いて属性をいじって、ビルド=>実行=>「HelloWorld」・・・※1
よしよし。できたできた。
でわ、他所で借りているサーバにFTPでアップして*.jadファイルをダウンロード!
携帯:「対応して無いっす。無理っす」
うーん。どうやら、ダウンロード時にHTML側で属性を定義しないとダメっぽいです。
HTMLを作成して、こんな感じに
<html><body>
オープンアプリゲーム</br>
以下のリンクをクリックしてください。
<a href="device:jam?http://鯖/HelloWorld.jad">ダウンロード</a>
</body></html>
これでリンクを叩けば・・・
今度はダウンロード中にエラーになった。
FireFoxで接続してヘッダを見てもなんとなくアプリっぽいヘッダを返しているように見えるけど、.htaccessでContent-Typeを指定してみる。
AddType text/vnd.sun.j2me.app-descriptor jad
AddType application/Java-archive jar
さて、今度はダウンロードまではうまくいった。
しかし、起動時に
携帯:「変なのが来たからうごかねーぜ(F7)」
とか言われた。
ここまではさくさく解決できたのですが、ここからがはまりましたわ。
はまった理由がまずエラーコードらしき「F7」。
これがなんだかわからない。auに行ってもリファレンスが無いしぐぐっても出てこないし。
エラーをコード表記するのであれば開発者用のリファレンスが欲しいところです。実際はあったりする?
で、小一時間さまよってみたのですが拉致があかないのでエミュレータで起動してみる。
※1の通り、普通に表示できている。
では、ソースの中身をコメントアウトして文字列をいろいろ変えてみても表示は変わらず。
このときに初めて「実行」ボタンで表示されるのがエミュレータ上のランチャー(アプリ一覧)である事に気づきました。
「実行」ボタンを押して、ランチャーの中にある文字列を選んで「SELECT」って押すとようやく該当アプリのJarがキックされる仕様っぽいです。
SELECTボタンを押したときにToolbar内部にスタックトレースが表示されていて、結局の原因はメタファイル(*.jad)作成時に実行クラス名を間違ってたことでしたー。しょーもな。ClassNotFoundException。
で、jadを編集してFTPして読み込んだら普通に動作した、かと思いきや今度は起動はするが画面に何も表示されない。
こっちは属性設定でCLDC1.0からCLDC1.1に変えたら表示できたので色の指定の仕方とかバージョンによって仕様がちょっと値がうのかもしれないですね。
つーか、結構めんどくさいのね。これ。
まだEclipseプロジェクトにもしてないし、もう少し弄ってあげる必要がありそうです。
PR
[PostgreSQL] SQLエラー発生後の挙動
2009.05.31 |Category …PostgreSQL
以前、
http://heppokopg.blog.shinobi.jp/Entry/20/
にて、「SQLエラーがあった際にCommit or Rollbackしないと処理が続行できないのはJDBCドライバのせい」
と書いてしまいましたが大きな過ちでした。
JDBCに限らず普通にコマンドラインツール(psql)からのSQL実行でも同じことが起こるわけで、ドライバ依存
の問題ではないですねぇ。(というか、psqlがオートコミットモードがデフォルトなのに気づいたのが最近(汗))
Oracleではそのまま処理は継続して行えるけど、他のDB(UDB,SQLServer,mysqlとか)はどう判断するのだろうか?
とりあえず手元にある環境のSQLServer2005は中間のSQLでエラーが発生しても後続のSQLは正常に
実行されるみたいですねぇ・・・
動きとしてはどっちが正しいのだろうか?
http://heppokopg.blog.shinobi.jp/Entry/20/
にて、「SQLエラーがあった際にCommit or Rollbackしないと処理が続行できないのはJDBCドライバのせい」
と書いてしまいましたが大きな過ちでした。
JDBCに限らず普通にコマンドラインツール(psql)からのSQL実行でも同じことが起こるわけで、ドライバ依存
の問題ではないですねぇ。(というか、psqlがオートコミットモードがデフォルトなのに気づいたのが最近(汗))
Oracleではそのまま処理は継続して行えるけど、他のDB(UDB,SQLServer,mysqlとか)はどう判断するのだろうか?
とりあえず手元にある環境のSQLServer2005は中間のSQLでエラーが発生しても後続のSQLは正常に
実行されるみたいですねぇ・・・
動きとしてはどっちが正しいのだろうか?
[PostgreSQL] SQLエラーコードが設定されない
2009.03.16 |Category …PostgreSQL
PostgreSQLのJDBCドライバはSQLExceptionがthrowされた際にSQLエラーコードを設定してくれないらしい。
そもそもSQLの実行結果に結果コードを返すようになったのが7系からで今はDBとしてはエラーコードを返す
もののSQLException発生時にそのエラーコードを設定してくれれば良いのにね。
一応Messageにエラーメッセージそのものは設定されるのでエラーメッセージの内容を拾って処理を切り分けて
あげるしか方法が無いかも。
つーかドライバやDBのバージョンによってメッセージは変わるものなんじゃないか?OSとか言語でも。
とりあえずSQLException(正確にはPSQLException)が発生した場合にPSQLExceptionを継承した例外クラス
のインスタンスを作って再throwさせてそのサブクラスの中でエラー判定をしようかと思うが、Exceptionの中で
リソースを読んで、エラーを切り分けて、とかする事になりそう・・・
あんま実装したくないなぁ・・・
そもそもSQLの実行結果に結果コードを返すようになったのが7系からで今はDBとしてはエラーコードを返す
もののSQLException発生時にそのエラーコードを設定してくれれば良いのにね。
一応Messageにエラーメッセージそのものは設定されるのでエラーメッセージの内容を拾って処理を切り分けて
あげるしか方法が無いかも。
つーかドライバやDBのバージョンによってメッセージは変わるものなんじゃないか?OSとか言語でも。
とりあえずSQLException(正確にはPSQLException)が発生した場合にPSQLExceptionを継承した例外クラス
のインスタンスを作って再throwさせてそのサブクラスの中でエラー判定をしようかと思うが、Exceptionの中で
リソースを読んで、エラーを切り分けて、とかする事になりそう・・・
あんま実装したくないなぁ・・・
[PostgreSQL] ERROR: current transaction is aborted, commands ignored until end of transaction blockって言われた
2009.03.12 |Category …PostgreSQL
今回も挙動の違いなのですが、PostgreSQLのJDBCドライバって一度SQLExceptionがthrowされるとcommit/rollbackしないと後続処理ができないのね。
ちなみに上記Javaコードは適当に雰囲気で書いただけなので間違ってても気にしないでください。
try{ Connection connection = getConnection(); Statement statement = connection.createStatement(); // キー重複エラー statement.executeQuery("INSERT INTO HAGE (KEY) VALUES (1)"); }catch(SQLException e){ // リカバリ実行 statement.executeQuery("DELETE FROM HAGE WHERE KEY = 1"); // ↑この行でエラー }リカバリ実行をする前にrollback、commitをしてあげれば更にSQLExceptionがthrowされる事はなくなるようですが…今まで例外が発生したらcatch節の中で更に処理を…っての結構やってきてたけど本来それは推奨されない処理なんじゃないかと思えてきた。
ちなみに上記Javaコードは適当に雰囲気で書いただけなので間違ってても気にしないでください。