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.古いファイルをフォルダから削除。


これで今のところは、ちゃんと動いています。


Read More...

2013年11月10日日曜日

WEBサービスを作ってみよう 第1回 利用言語とインフラ


なんかWEBサービスを作ってみようと思います。
たいした知識も無いのですが、作りながら必要な知識は身につけていけば良いということで、とりあえずやってみます。

あえてタイトルに第1回と付けたのは、いつもこの手のことは継続出来ないので、自分を追い込むための儀式のようなものです。


まずは、どこのインフラを使うかということで、世の中のWEBサービスのインフラに何が使われているのかから見ていきます。

この辺を見てみると、どうやらAmazonさん一人勝ちな雰囲気です。

AWS(Amazon Web Services)はいわゆるIaaSというやつで、仮想化されたインフラをクラウドで提供するサービスです。
正確にはAWSサービス群の中のAmazon EC2がIaaSなんですかね?

AWSには無料枠もあって必要に応じてスケールアップすることが出来ます。

サイトを作ったところで人っ子一人訪れないであろう事を考えると、あまりお金をかけたくないですし、うっかり盛り上がってしまった時に手軽にスケールアップ出来るのは魅力です。

しかし、仮想マシンが無料で使えるなんてすごい時代になったものです。

サイトを見ても無料枠がどこまでなのか非常に分かりにくいのですが、月750時間分のマイクロインスタンスと書いてあります。
良く分かりませんが、色んな用途のインスタンスが用意されている中で、恐らく一番しょぼいやつ750時間分の稼動というところでしょうか。


次にPaaSも見てみます。
PaaSはIaaSにOSとミドルウェアを乗っけたものと考えればいいでしょう。

代表格はGoogle App Engineです。

こいつもなかなか優れたやつで、Python、Java、Goまで使えてしかも無料枠があります。

一昔前は無料でJavaを使おうと思ったら、自宅サーバしかなかった気がするのですが、PaaSでJavaいけちゃうんですね。
データベースがRDBではないなど一癖ありそうな感じではありますが。

1日28時間の無料インスタンス時間とありますので、月840時間ってとこですね。
こちらは日単位なので、日が変わるとリセットされるということでしょうか。


しかし、最大手がこれだけのサービスを無料枠ありで提供していて、各社が出しているVPSのサービスとかどうやって顧客を獲得しているんでしょうか。

無料枠のインスタンス単位というのが直感的に分かりづらいので、それが敬遠されて月額固定のサービスに流れているだけなのか、それともすぐ無料枠上限に到達してしまうということなんでしょうか。

まぁ良く分かりませんが、無料枠突破してくれるほどアクセスがあるならむしろ嬉しい悲鳴なので、とりあえずGoogle App Engineを使ってみようと思います。

言語はGo(笑)と言いたいところですが、Javaにしておきます。


Read More...

2013年11月4日月曜日

WEBサービスを作ってみよう 第3回 Slim3の概要


Slim3をいくらか触ってみたので、その概念について。


まず、Slim3の基本的な構成はController、Model、Serviceとあり、それぞれControllerは画面遷移、Modelはデータオブジェクト、Serviceはロジックの役割を持ちます。

Slim3におけるControllerは、URLに関連付けられたServletで、基本的な流れはまずControllerを呼び出して処理し、そこからjspを出力するという感じです。
ModelはDatastoreに永続化するクラスで、データベースオブジェクトの設計部分になります。
ビジネスロジックが書かれた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」タブ > ランライム JRE > 「ワークスペースと同じ JRE で実行」にチェック

で解決しました。

どうやらJREのバージョンが異なることで起きていたようで、これで無事Controllerが生成されました。


さて、フレームワークを使うと開発が効率化されるというのがなんとなく分かってきましたが、さらにSlim3はHOT reloadingをサポートしています。
何それ?という感じですが、所謂HOT deployの別称で、アプリケーションサーバを立ち上げたままでも変更したクラスがリロードされるので、いちいち再起動が不要という代物です。

いくつかハマるケースもあるみたいですが、Servletを書き換える度に再起動するのに比べると恐ろしく効率的です。


世の中の人が便利と言ってるモノは、やっぱり便利ですね。
今後は素直に先人の知恵には従おうと思います。


Read More...

WEBサービスを作ってみよう 第2回 フレームワーク


前回、インフラはGoogle App Engineを使って、言語はJavaと決めました。

今回は次のステップとして、利用するフレームワークについて考えます。

効率的な開発にはフレームワークは欠かせないらしいので、なるべく楽に開発していくためにもここは重要なポイントになります。

どんなものがあるかとGoogle先生に伺うと、Google App Engineで動きそうなものだけでも大量にhitします。
この辺にもGoogle App Engineで使えるフレームワークのリストが載ってますが、まぁ色々な用途の色々なフレームワークがあるようです。

Spring
Tapestry
Wicket
DWR
Tiles
SiteMesh
Grails
Struts 2
...

正直、それぞれどんな用途でどれが最適なのか調べているだけで日が暮れそうです。

また、効率的な開発はとても重要ですが、そもそもフレームワーク無しで作ったことが無い人間が、フレームワークありで作ったところでそのありがたみは分からないでしょう。

ここでめんどくさくなって開発が止まってしまうぐらいなら、フレームワークなんて考えずにゴリゴリ書き始めたほうが良いのではないか?

なんて事を考えていたのですが、検索結果の中に気になるフレームワークがありました。

Slim3

Slim3は、「Google App Engine/Java 用に最適化されたフルスタックのMVC フレームワーク」であり、また「単にDatastoreのフレームワークとしても使用出来る」とのことで、この手のものでは珍しく日本発のフレームワークだそうです。

Slim3 Datastoreに関しては、Bigtableに特化したLow level APIの薄いラッパーで、Google App EngineのデータストアをJavaから利用する場合の一般的な選択肢であるJDO(Java Data Objects)よりも高速に動作するそうです。

開発の効率化に加えて、そもそもの動作も高速化するということであれば、これは使ってみるしかないでしょう。

ということで、フレームワークはSlim3を使ってみます。

Read More...