2013年11月20日水曜日
WEBサービスを作ってみよう 第4回 Slim3の最新版へのアップグレード
この辺りからは、WEBサービス構築の概要というよりは、具体的な開発にかかわる話になってきます。
今回は、必要に迫られてSlim3のアップグレードを行ったので、その辺について残しておきます。
まず、WEBサービスを作るにあたって、JSONが大活躍します。
検証はしていませんが、Ajax的な作りでサーバ側はJSONを吐くだけにして、なるべくクライアント側で作業するようにしたほうがコストが安そうです。
やはり、特に無料枠に抑えたいという期待を持って開発するのであれば、いちいちServletやJSPがページをゴリゴリ生成して吐き出すような作りは、コスト的にマズイような気がします。
そこで、JSONの取り扱いですが、Slim3にはModelをJSONに簡単に変換してくれるメソッドがあります。
そのModelMeta.modelsToJson()で以下のエラーが出ました。
java.lang.NoClassDefFoundError: com/google/appengine/repackaged/org/json/JSONObject
Google先生に色々聞いてみたところ、ModelMeta.modelsToJsonでrepackagedなクラスを使ってるために起きているそうです。
repackagedなクラスというのは、SDKの変更で頻繁に変更されるので、あまり使うべきではないみたいですね。
で、解消方法がSlim3のバージョンを「1.0.15」から「1.0.16」にアップグレードすることでした。
Slim3はEclipseからインストールしているんですが、なんで初めっから最新にしてくれないんですかね?
理由は謎のままですが、最新版は以下からダウンロードします。
https://code.google.com/p/slim3/downloads/list
slim3-blank-1.0.16.zip
開発中プロジェクトでライブラリのアップグレードをするなんて、もろもろ動かなくなったりしそうで怖いのですが、やるしかありません。
公式などを見つつビクビクしながら以下の通り実行しました。
1.新しいバージョンのファイルをフォルダに投入
「slim3-1.0.16.jar」を<Project>/war/WEB-INF/libに投入。
「slim3-1.0.16-sources.jar」を<Project>/libsrcに投入。
2.プロジェクトのプロパティ >Javaのビルド・パス > ライブラリー からCLASSPATHの設定を変更
「slim3-1.0.16.jar」と「slim3-1.0.16-sources.jar」を追加。
「slim3-1.0.15.jar」を削除。
3.古いファイルをそれぞれのフォルダからも削除
4.注釈処理に関連した新しいバージョンのファイルをフォルダに投入
「slim3-gen-1.0.16.jar」を<Project>/libに投入。
5.プロジェクトのプロパティ > Javaコンパイラー > 注釈処理 >ファクトリーパス からファクトリパスの設定を変更
「slim3-gen-1.0.16.jar」を追加。
「slim3-gen-1.0.15.jar」を削除。
6.古いファイルをフォルダから削除。
これで今のところは、ちゃんと動いています。
2013年11月10日日曜日
WEBサービスを作ってみよう 第1回 利用言語とインフラ
なんかWEBサービスを作ってみようと思います。
たいした知識も無いのですが、作りながら必要な知識は身につけていけば良いということで、とりあえずやってみます。
あえてタイトルに第1回と付けたのは、いつもこの手のことは継続出来ないので、自分を追い込むための儀式のようなものです。
データベースがRDBではないなど一癖ありそうな感じではありますが。
2013年11月4日月曜日
WEBサービスを作ってみよう 第3回 Slim3の概要
Slim3をいくらか触ってみたので、その概念について。
Slim3におけるControllerは、URLに関連付けられたServletで、基本的な流れはまずControllerを呼び出して処理し、そこからjspを出力するという感じです。
ビジネスロジックが書かれたServiceから、DatastoreのModel読み出しや、保存を実行します。
開発にはEclipseを使うのが一般的で、Slim3 Plugin for Eclipseをインストールして利用します。
Antが使えるので、Antタスクを使ってControllerを作成すると、ControllerとJSPとTestCaseを同時に生成出来、ControllerはURLに関連付くので、servlet-mappingの設定など面倒な作業は不要です。
当然、ServiceやModelを作成する際も、TestCaseを生成してくれます。
Slim3はTDD(Test DrivenDevelopment)という開発手法を推奨していて、コード本体が完成していない状態でまずテストを書いてテストが失敗することを確認し(テストファースト)、次にそれが動くコード本体を書くという流れを繰り返します。
コード本体の書き方も、まずは定数を返すなどの仮実装を行い、徐々に変数を用いた本来のコードに仕上げていって洗練していくという流れです。
この設計手法にはとても共感出来ます。
いっきにコードを書き倒して、もはやどこでしくじったのか訳が分からなくなり、数時間ハマるなんてことを良く経験するので、それを回避出来ます。
TestCaseの生成の重要性が良く分かっていませんでしたが、なるほどこれは重要ですね。
ちなみに、はじめにAntを動かしてみたところ、gen-controllerのところで思いっきりハマりました。
Antを実行すると
java.lang.SecurityException: SHA1 digest error for org/eclipse/swt/graphics/GC.class
と言われてControllerが生成出来ません。
色々調べてみたところ、
どうやらJREのバージョンが異なることで起きていたようで、これで無事Controllerが生成されました。
さて、フレームワークを使うと開発が効率化されるというのがなんとなく分かってきましたが、さらにSlim3はHOT reloadingをサポートしています。
何それ?という感じですが、所謂HOT deployの別称で、アプリケーションサーバを立ち上げたままでも変更したクラスがリロードされるので、いちいち再起動が不要という代物です。
いくつかハマるケースもあるみたいですが、Servletを書き換える度に再起動するのに比べると恐ろしく効率的です。
世の中の人が便利と言ってるモノは、やっぱり便利ですね。
今後は素直に先人の知恵には従おうと思います。
WEBサービスを作ってみよう 第2回 フレームワーク
前回、インフラはGoogle App Engineを使って、言語はJavaと決めました。
今回は次のステップとして、利用するフレームワークについて考えます。
効率的な開発にはフレームワークは欠かせないらしいので、なるべく楽に開発していくためにもここは重要なポイントになります。
どんなものがあるかとGoogle先生に伺うと、Google App Engineで動きそうなものだけでも大量にhitします。
この辺にもGoogle App Engineで使えるフレームワークのリストが載ってますが、まぁ色々な用途の色々なフレームワークがあるようです。
Spring
Tapestry
Wicket
DWR
Tiles
SiteMesh
Grails
Struts 2
...
正直、それぞれどんな用途でどれが最適なのか調べているだけで日が暮れそうです。
また、効率的な開発はとても重要ですが、そもそもフレームワーク無しで作ったことが無い人間が、フレームワークありで作ったところでそのありがたみは分からないでしょう。
ここでめんどくさくなって開発が止まってしまうぐらいなら、フレームワークなんて考えずにゴリゴリ書き始めたほうが良いのではないか?
なんて事を考えていたのですが、検索結果の中に気になるフレームワークがありました。
Slim3は、「Google App Engine/Java 用に最適化されたフルスタックのMVC フレームワーク」であり、また「単にDatastoreのフレームワークとしても使用出来る」とのことで、この手のものでは珍しく日本発のフレームワークだそうです。
Slim3 Datastoreに関しては、Bigtableに特化したLow level APIの薄いラッパーで、Google App EngineのデータストアをJavaから利用する場合の一般的な選択肢であるJDO(Java Data Objects)よりも高速に動作するそうです。
開発の効率化に加えて、そもそもの動作も高速化するということであれば、これは使ってみるしかないでしょう。
ということで、フレームワークはSlim3を使ってみます。