2009-12-28

GAE/J、8080 から 8888 に

App Engine SDK を 1.2.6 から 1.3.0 に更新したら、ローカルテスト環境のポートが 8080 から 8888 に変わった。更新を飛ばしてわからなかったけれど、SDK 1.2.8 からかも。

なので、ローカルでのアプリケーションの確認は

http://localhost:8888/

から、開発コンソール(DataStore や TaskQueue の状態確認)は

http://localhost:8888/_ah/admin

からのアクセスになる。
ということでブラウザのブックマークを書き換え。

GAE/J、ルートにサーブレット

アプリケーションのトップに index.html じゃなくて、メインのサーブレットを置きたいなと思って web.xml をいじり中。
<servlet>
    <servlet-name>main</servlet-name>
    <servlet-class>info.kuribo.example.MainServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>main</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
と書いてみたけれど、実際にアクセスしてみると index.html が表示される…。あ、そうそうこれだと思ってさらに
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>
を消してみたものの、変わらず。

結局、その後に war ディレクトリの index.html 自体を削除したらちゃんと思ったとおりに動いた。ルートディレクトリは、サーブレットのマッピングやウェルカムファイルのリストがどうあれ、index.html があったら優先して表示する仕組みみたい。マッピングの書き方が間違っているのかもしれないけれど…。

とりあえず、関係なかったウェルカムファイルのリストだけ、元に戻す(サブディレクトリで影響が出るかも、と)。

2009-12-27

GAE/J、TaskQueue 使ってみた

Google App Engine for Java で今日は TaskQueue いじり。なんか 405 とか HTTP エラーが出るので見てみると、Task は基本 POST でアクセスしているよう。

GET でアクセスさせるには、
Queue queue = QueueFactory.getDefaultQueue();
queue.add(url("/path?a=b&c=d").method("GET"));
ってするようにドキュメントには書いてあるんだけれど、そのとおりにやってみると「com.google.appengine.api.labs.taskqueue.TaskOptions に method(String) なんてないぞ」と eclipse に怒られる…。ここは
Queue queue = QueueFactory.getDefaultQueue();
queue.add(TaskOptions.Builder.url("/path?a=b&c=d").method(TaskOptions.Method.GET));
としとけばいいみたい。

2009-12-23

情報セキュリティスペシャリスト試験(SC)

午前Ⅰ:免除
午前Ⅱ:92.00
午後Ⅰ:84
午後Ⅱ:65

で何とか合格。午後Ⅰは運よく Java の問題が出て点を稼げたけれど、午後Ⅱはやっぱりギリギリ。あぶなかったー。

ともあれ、初めての高度試験合格なのでうれしい。今回の試験対策で読んだ本はこちら。


春はデータベーススペシャリスト試験(DB)を受ける予定。あまり得意でない分野なので、今から心配…。

2009-12-16

GAE/J、JDO から Low-Level API へ

こちらのプレゼンテーションを参考に、データストアの利用方法を JDO から Low-Level API へ変更。思っていたよりも感覚的にデータの保存ができて、JDO でスタックトレースとにらめっこしていたのが嘘みたい。おまけに JDO より格段に速いとなると…、最初からこちらにしておけばよかった。

分かりやすい資料を公開してくれている shin1ogawa さんに感謝。

2009-12-11

GAE/J、URL じゃなくて Link だった

java.lang.IllegalArgumentException: java.net.URL is not a supported property type.

とか例外が出るから何かと思ったら、URL はデータの永続化に対応してないんだ。代わりに com.google.appengine.api.datastore.Link を使って即解決。GData の com.google.gdata.data.Link とはまた違うので注意。

データストアでサポートされているデータ型は、こちらで確認。

2009-12-09

GAE/J、Blogger API で右往左往

Google App Engine for Java で、現在 Blogger API をいじっているところ。GData クライアントライブラリについては、以下のサイトから gdata-src.java-*.**.*.zip をゲット。 解凍した gdata-src.java-*.**.*/gdata/java/lib ディレクトリの
  • gdata-blogger-*.*.jar
  • gdata-blogger-meta-*.*.jar
  • gdata-client-*.*.jar
  • gdata-client-meta-*.*.jar
  • gdata-core-*.*.jar
を GAE/J アプリケーションの war/WEB-INF/lib につっこんだ後、ビルドパスに通してみる。これでいいかなと動かしてみると、

java.lang.NoClassDefFoundError: com/google/common/collect/Maps

というエラー…。同じく解凍フォルダ gdata-src.java-*.**.*/gdata/java/deps の方の
  • google-collect-***.jar
  • jsr***.jar
というのも要ったみたい。

その後、実際に Google アカウントに関連する Blogger ブログ一覧を取得して表示してみる。ローカルでは OK。コードはほぼこれのとおり。 これをデプロイして動かしてみたところ、今度は

java.security.AccessControlException: access denied (java.net.NetPermission getCookieHandler)

という例外。これは appengine-web.xml への記載忘れが原因だったよう。 この記載で、ひとまずちゃんと動いた。間違って web.xml の方に記載して、ウンウンうなっていたというのは、内緒の話。

2009-12-06

正誤表

Google App Engine for Java [実践]クラウドシステム構築」の正誤表を発見。コードのセミコロンつけ忘れから、シーケンス図の貼り間違いまで。本を持っている人は必見。 ってこれ、Blogger ブログだ。それだけでなんか親近感。(Navbar を隠しているのはアレだけれども…。)早速、フィードリーダーに登録。