2012年5月30日水曜日

EclipseでのGWT(DevMode)+Tomcatアプリケーション開発

EclipseでGWTのDevModeを使いつつ、サーバをTomcatにする方法がわかりました。特にマニアックな設定というわけではない感じですが、意外とネットで見つからず手間がかかりました。手順をおって説明します。


(1)Google Webアプリケーションとしてプロジェクトを作成する
これは普通に作成してください。ただし、GAEは無効にしてください。サンプルコード自動生成もONにしておくといいでしょう。後の動作確認がラクですから。

(2)動的ウェブアプリケーション(Dynamic Web Application)を追加にする
プロジェクトのプロパティで、Facetsの設定を開き、Dynamic Web Applicationを追加してください。この設定をすることでTomcatが有効になります(Tomcatのプラグインが入ってない場合は入れておきましょう。)。この時、動的ウェブアプリケーションのバージョンは2.4にしておきましょう。
また、 コンテンツディレクトリ設定 をwarにしておいてください(デフォルトはWebContent)。この点については、GWTのウェブルートと統一しておくことが大切ですので、どちらを変えても結構です。

(3)サーバでデバッグ
デバッグをします。デバッグからサーバでデバッグを選びます。そこでTomcatを指定しましょう。また下にある「常にこのサーバーを使用」にチェックを入れておきます。実行するとTomcatが起動するはずです。

(4)ウェブアプリケーション(外部サーバで実行)でデバッグ
もう一度デバッグをします。今度は、デバッグからウェブアプリケーション(外部サーバで実行)を選びます。すると、ダイアログが出てきますので、server rootとして
http://localhost:8080/<プロジェクト名>
とします。ウィンドウの真ん中でHTMLファイルを選びます。下部に最終的なURLが出ますので確認してOKを押します。すると、いつものようにDevelopment Modeのペインが開きますので、そこのURLをクリックします。するといつもの様にサンプルプログラムが動きます。え?これってTomcatがサーバなの?と心配な方は、サンプルのボタンを押してみてください。下記のようにメッセージがでてきますが、、、、よく見ましょう。「I' m running Apache Tomcat」となってますね。つまり、このプロジェクトは、サーバはTomcatだけれど、クライアントのGWTはDevModeで動いているということになります。


まとめと注意事項 
結局、これってどうなってるのか?ちょっとわかりにくいので簡単にまとめますね。
  • プロジェクトの基本はGoogleのWebアプリケーションです。DevModeを利用するためには、このプロジェクトとして作成する必要があります。 
  • GoogleのWebアプリケーション でTomcatを利用するためには、Facetsの設定でDynamic Web Applicationを追加する必要があります。この設定により、このプロジェクトではJettyとTomcatの両方を使えるようになったということになります。 
  • デバッグ時に外部サーバーを利用することで、Jettyを使わず、Tomcatを利用することになります。 
  • ただし、Tomcatサーバの起動は Webアプリケーションデバッグと連動してないので、別に起動する必要があります。さらに、サーバープログラムについては、Tomcatを再起動しないと反映されないようです(オートデプロイされない?)。
以上、参考になれば幸いです。


EclipseによるGAEを利用しないGWT開発

初歩的な事だけど、ラボでよく勘違いする話なのでメモ書きです。

EclipseでGoogleのWebアプリケーションプロジェクトをつくると、GWTとGAEが有効になります。一般的にGoogleのWebアプリケーションを利用する=GAEを利用するという認識になってるようですが、GoogleのWebアプリケーションプロジェクトではGWTとGAEを利用するかどうか、それぞれ有効/無効の設定ができます。つまり、 GAEを利用しないのであればGAEだけを無効にすればOK。

GoogleのWebアプリケーションでGAEを利用しないってどういうシチュエーションなのか?疑問に思うかもしれませんが、一般的なWebサーバーで動くGWTアプリケーションを開発したい場合です。GWTというのは別にGAE限定ではありませんからね。

GAEを無効にするとどうなるのかというと、今までどおりJettyサーバーが稼働します。GAEを有効にしている時もJettyが立ち上がりますが、Jettyというのは汎用のWebアプリケーションサーバーです。別にGAE用というわけではありません。つまり無効にする事でGAEの制約を受けずにJettyを利用できるということです。

そもそもなぜこの事を記事にしたとかというと、
  • Eclipse上でTomcatを動かしてGWTアプリを作る
というのを本当はやりたかったのです。いちおうこの方法はわかっているのですが、GWTのDevModeとの連携ができずに断念しています。GWTはさすがにDevModeが使えないと使う気になれませんし。

おそらくコンパイルオプションを変えればできそうな気がしてますが、まだ未解決です。現在検討中ですので、方法がわかれば紹介します。

2012年5月29日火曜日

Java:for-each文を使ってコレクションクラスの探索をラクにする

JavaにおいてListのようなコレクションクラスを探索するときには、下記のようにIteratorを利用するのが一般的でした。
List list= new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()){
 String result = (String)it.next();
 System.out.println(result);
}
しかし、この方法だとnextで得られる戻り値をキャストしたりするなど面倒です。そこで、Java5.0からは(2008年版からは)foreach構文が定義されました。次のようになります。
List list= new ArrayList();
for(String result:list){
 System.out.println(result);
}
どうでしょうか?このネタはJavaの前々バージョンから採用されたもので今更感があるほど古いです。ただ、C言語に慣れ親しんだ世代では、従来のfor文の構文が親しみやすいということで、本ラボでは特にforeachについては言及してませんでした。が、そろそろforeachも完全に一般化したので、今回改めて取り上げました。

2012年5月18日金曜日

DynamoDBとは


今年に入って、AmazonがDynamoDBを発表しました。NoSQLでSSD使ってて、スループットを自在に変更できて、、等なにか凄いようなよくわからないようなサービスなわけですが、いろいろ使ってみたりネットを参照してみたりしてようやくその姿が見えてきました。

データの型
扱えるデータの型はString, int, Set(String, int)の4種類です。SetについてはJavaではHashSetしか使えないようです。LinkedHashSetを利用したら、書き込みはできましたが読み込みでエラーが出ました。 何か勘違いしてるかもしれませんが、、、

検索キー
テーブルの検索キーは最大2つ設定できます。具体的には
  • HashKey・・・検索の Hash値として完全一致で特定するKey。
  • RangeKey ・・・ 大小関係や前方一致などで範囲を指定して検索できるKey

の2種類が存在します。そして、その組み合わせは2種類のみです。
【HashKeyのみ】
1つのAttributeをKeyにします。その値は必ず1意にならなければなりません。
【HashKey+RangeKey】
2つのKeyを組み合わせることで一意になるようにキーを設定されます。この方法の場合
HashKey単体では1意にならなくて良いが、2つのKeyの組み合わせは必ず一意にならなければならない。

検索の方法と注意点
次の2種類です。
  • Query ・・・  Keyを対象にした検索
  • Scan ・・・  Key以外に対する検索

 DynamoDBは幾らでもデータを増やすことができ、しかも検索スループットが保証されるという特徴としてあります。しかしこれは、キーを検索キーとした場合です。Scanを利用すると、このメリットは受けられません。Dynamodbの特徴を活かすのであれば、Scanの利用はオススメできないようです。
 なお、一度の検索で最大1MBしか呼び出せないとマニュアルには書いてあります。ということは、1つのアイテムを1KBとした場合、最大でも1000件しか呼べないということになりますよね?じゃあ、1000件を超えることが予想されるデータの場合、どうすればよいのか?それはRangeKeyを利用して範囲検索を繰り返すことができるような設計が必要になるでしょう。

S3との連携は不可欠か?
アイテムの最大サイズは64KBらしく、数値と文字列しか入らないのでこの値が大きいのか小さいのか、、、まあ、画像とかバイナリーデータとか、ファイルなどの管理はここではやらず、S3を使えってことでしょう。これはまあ、SimpleDBのころからそういう流れですからAWSのユーザーであればなんてことはないですね。あと、多くの項目を格納しておきたいのであれば、S3にXMLで保存しておくのもアリだと思いますね。

課金対象と注意事項
課金が実は一番気になるところですが、一言でいうと、
  • 「データベースのサイズ」と「設定した検索のスループット」が課金対象

となります。後者がわかりにくいですが、データベースを使おうが使うまいが、テーブルを作成すると設定したスループットに基づいて時間単位で課金されていきます。そして注意すべき点は、課金対象はテーブル毎に設定されたスループットの総和です。無料枠がReadで10, Writeで5となってますが、テーブルごとではなくその総和に対してです。しかもテーブルに設定するスループットの最低値が5となっているということ。テーブルを増やすほどスループット値は増えていきます。RDBの感覚でホイホイテーブル作ってると即課金対象になります。コストを抑えたいならテーブルをむやみに増やさないデータベース設計がポイントでしょう。ちなみに、read/writeをそれぞれ最低の5にしたテーブルを4~5つほど作っておくと、1ヶ月で10ドル超えます。
また、DynamoDBはスループットを柔軟に上げ下げできるという利点がありますが、ちょっと盲点があります。スループットを高くする場合は短時間で反映されますが、スループットを下げる時は1日ほど時間がかかるということ。つまり、細かく上げ下げしてコストを抑えるという方法が難しいということです。


というわけで、意外ととっつきにくい雰囲気のあるDynamoDBですが、おちラボでは今後、DynamoDBを研究用の基盤DBとして運用することに決めました。RDB的な使い方から脱却すればこんなに魅力のあるDBは他にないなというのが、現在の印象です。今後、DynamoDB周りでプログラミングノウハウが見つかれば、このBLOGでも紹介したいと思います。


2012年5月16日水曜日

Java:UUID を入手する方法

一意なIDを設定するときには、UUIDを利用するのがお手頃です。UUIDとは汎用一意識別子と呼ばれるもので、仕様として

  • 時間利用 (ヴァージョン1)
  • ユニーク名利用
  • 乱数利用 (ヴァージョン4)
などのバージョンがあります。JavaのutilのUUIDは乱数利用です。この乱数を呼び出す処理が1つの特定のマシンからなら乱数でもかまいませんが、複数の異なる場所で呼び出される場合、同一のIDができてしまうおそれがあります。

そこで、ヴァージョン1のUUIDをどうやって生成するかですが、

というライブラリが、使えそうです。Macアドレスと時間を利用しているようで、良い感じに吐き出してくれます。