Java 開発 2.0: Google App Engine よ、こんにちは

Groovy、Eclipse、そして JDO を利用した迅速な Web アプリケーション開発

オープンソースのソリューションと、サービスとして提供されているインフラストラクチャーを利用する (借りる) ことによって、より優れたソフトウェアを迅速に、しかも低コストで実現できる方向へと Java™ 開発は変貌しつつあります。Andrew Glover は、Java 開発をこうした方向へと導くさまざまな力 (要素) をまとめて Java 開発 2.0 という造語で表し、この Java 開発 2.0 に関連するツールと技術を話題にした新しい連載を始めます。連載第 1 回目となるこの記事では、Java 開発 2.0 の到来を告げ、そのコンセプトを Google の App Engine for Java を利用して素早く実現する方法を説明します。

Andrew Glover, Author and developer

Andrew GloverAndrew Glover は、ビヘイビア駆動開発、継続的インテグレーション、アジャイル・ソフトウェア開発に情熱を持つ開発者であるとともに、著者、講演者、起業家でもあります。詳細は彼のブログにアクセスしてください。



2009年 8月 18日

Java の世界は、幅広い開発者、ビジネス、そして最も重要なもの、すなわち十分長い年月をかけて成熟してきた多くのアプリケーションからなる充実したエコシステムです。世界的な規模で広がる Java コミュニティーは、これまで莫大な資金、時間、知力をプラットフォームに投入してきました。その貢献は、数々のオープンソースのツールおよび商用のツール、フレームワーク、そしてまさにソリューションの成功という形になって表れています。

Java プラットフォームにつぎ込まれた多大な投資は、Java 開発を行う方法にも微妙な変化を与えています。主に以下の 2 つの傾向が、Java 開発の様相を急激に変化させています。

この連載について

Java 技術が初めて登場してから現在に至るまでに、Java 開発の様相は劇的に変化しました。成熟したオープンソースのフレームワーク、そしてサービスとして提供される信頼性の高いデプロイメント・インフラストラクチャーを利用できる (借りられる) おかげで、今では Java アプリケーションを短時間かつ低コストでアセンブルし、テスト、実行、保守することが可能になっています。この連載では Andrew Glover が、この新たな Java 開発パラダイムを可能にする多種多様な技術とツールを詳しく探ります。

  • オープンソースのツールとフレームワークをフルに活用してアプリケーションをまるごと構築するという傾向
  • アプリケーションそのものの実行を含め、あらゆるレベルでソフトウェアのライフサイクルを管理するために必要なアプリケーション・インフラストラクチャーを貸し出す (または借りる) という傾向

私が Java 開発 2.0 と呼ぶものには、目新しい側面もなければ、革新的な側面もありません。しかし実現技術に関しては、Java 技術の歴史でこれまでになく成熟しており、より優れたアプリケーションを迅速かつ低コストでアセンブルできるほどまでになっています。これはまさに、世界中の企業が抱く最大の望みの 1 つです。

新しい連載の第 1 回目となるこの記事では、Java 開発 2.0 の詳細を探っていきます。その中で Web アプリケーションの構築とデプロイに、Amazon の EC2 や Google の App Engine、CouchDB (Web 用データベースと呼ばれています)、そして今まで以上に短時間かつ低コストでアプリケーションをアセンブル、テスト、デプロイするためのビルディング・ブロックを提供してくれるツールおよび技術を利用する方法を学んでいきましょう。

最初に取り上げるのは、Google App Engine for Java です (「参考文献」を参照)。このプラットフォームを由緒ある「Hello World」手法で紹介した後、Groovy、JDO (Java Data Objects)、そして Google App Engine 対応 Eclipse プラグインを使って実用的な Web アプリケーションを作成する方法を説明します。まずは話の順序として、Java 開発 2.0 のビジネス価値について簡単に説明しておきます。

まさに速くて安い開発

これまで速い、安いという言葉が Java 開発に結び付けられることは、あまりありませんでした。事実、これらの言葉が、リソースが限られた小企業での、それほど真剣ではないソフトウェア開発という印象を与えることは珍しくありません。しかし実際のところ、IT は多くの企業 (大企業も小企業も含め) にとってコスト・センターであるということが、企業に IT のコストを低く抑えながらも可能な限り価値を引き出す動機を与えます。

そこで活躍するのが、Java 開発 2.0 です。オープンソースのツール、フレームワーク、さらにはソリューションを利用することで、企業はそれほど多くのコードを自ら作成する必要がなくなるため、迅速にソフトウェア・アプリケーションをアセンブルできるようになります。10 年以上前に私が Java 技術での開発を始めた当時、開発者が利用できるツールとフレームワークの範囲は今よりも大幅に限られていました。しかも、その数少ないツールは無料ではありませんでした。その頃は、IDE、データベース、オブジェクト・リレーショナル・マッピング (ORM) フレームワークを購入しなければなりませんでした (データベースとの通信に必要なドライバーまで買わなければならない場合もありました)。そして当然アプリケーションをデプロイするマシンも購入しなければなりませんでしたが、今ではどうでしょう?このすべては (そして、その他のものも) 無料で手に入れられるばかりか、品質も優れています。

さらにインフラストラクチャー (Amazon の EC2 や Google App Engine が提供しているインフラストラクチャーなど) まで借りれば、必要なインフラストラクチャーを完全に購入する場合に比べ、アプリケーションをかなり安価にデプロイすることができます。

構築するべきか、買うべきか、あるいは借りるべきか: それが新たな問題です

多くの企業には、データベース、アプリケーション・サーバー、変更管理システム、そして欠陥追跡ツールといったアプリケーションを実行するための一連のハードウェアがあります。しかし今の時代、他人のインフラストラクチャーでサービスとして実行されるソフトウェア・パッケージを代わりに使用することで、これらのハードウェアは簡単に放棄することができます。

チームが開発プロセスの管理に使用する可能性のあるアプリケーション・スタック全体を借りれば (つまり、わずかな料金でレンタルすれば)、企業はアプリケーションを実行するハードウェアに投資する必要がなくなります。例えば、変更管理システム (Subversion または Git など。どちらもオープンソースで、無料で入手することができます。) を実行するマシンを購入する代わりに、チームは GitHub などの共有変更管理サービスを使用することができます。ハードウェア資産のコストは、GitHub をホストする企業が負担します。この企業が Git を使用する他の組織に対して請求する料金 (通常はユーザー 1 人あたりの月額) は、ほんのわずかな額です。他のプロバイダーからサービスとしてのソフトウェアをレンタルするというこの原則は、欠陥追跡、テスト・ケース管理、要件管理にも適用することができます (ホストされた JIRA や Pivotal Tracker など)。

他のソフトウェア・プラットフォーム (一般的には本来カスタマイズされたプラットフォーム) を実行する下層ハードウェア・資産についても、同じことが言えます。企業は特定の Web アプリケーションを実行するためのハードウェアを自ら用意する代わりに、Amazon や Google、そしてこの分野で活躍する他のプロバイダーが提供するハードウェア上でアプリケーションを実行することができます。これらのプロバイダーでは、文字通りアプリケーションをホストできる各種レベルのハードウェアをレンタルできるようにしています。しかも、スケーラビリティー、バックアップ、さらにはセキュリティーにまで対処してくれます。考えてもみてください。Amazon と Google はかなり以前からスケーラビリティー、バックアップ、セキュリティーなどの問題に対処してきたため、ソフトウェア・プラットフォームを効率的に実行するという点で優れており、今でも革新を続けています (これは本当です。現実を見てください)。

Google の App Engine を使用することで、例えば IT 企業は必要なアプリケーションを実行するためのインフラストラクチャー購入費用をまるごと削減することができます。さらに、App Engine ではアプリケーションのデプロイメントと管理に関連して複数の分野にまたがる数々の問題がすでに考慮され、解決されているため (そしてそれは、優れた方法で解決されているはずです)、アプリケーションをより短時間でデプロイすることができます。

速くて安いことは、もはや品質の低さを意味しません。逆に、Java 開発 2.0 は品質重視の確固たるプロセスを前提とする巧妙な手法です。


Google の App Engine で平和な 1 日を

Google App Engine は、Google のさまざまなサービスが提供されるインフラストラクチャー上で Java (および Python) を使用して Web アプリケーションを構築およびデプロイするための正真正銘のプラットフォームです。ライセンス料金は必要ありません (もちろん、インフラストラクチャー上で使用するソフトウェア・ライブラリーにライセンスが必要な場合は別です)。また、帯域幅やスペースを使用するに当たって事前に支払う費用もありません。App Engine インフラストラクチャーは、使用量のしきい値に達するまでは完全に無料です。このしきい値とは 500MB のストレージ使用量で、Google 曰く、「毎月約 500 万件のページ・ビューに対応するのに十分な CPU および帯域幅」です。あえて言うなら、Google が料金を請求するまでになったら、その Web アプリケーションには明らかに、かなりのアクセス件数 (したがって、かなりの利益) があるということです。

App Engine を使い始める方法は、これ以上ないほど簡単で、Google ではすべてを自動的に処理してくれる Eclipse プラグインまで用意しています。このプラグインには、プラットフォームを初めて使用する上で役に立つ「Hello World」サーブレット・アプリケーションに必要なコンポーネントが含まれています。Hello World アプリケーションをデプロイする手順 (およびスクリーン・ショット) は、developerWorks に掲載されている Rick Hightower が最近書いた Google App Engine for Java の紹介記事 (「Google App Engine for Java: 第 1 回 開発をスピードアップ!」) に記載されています。彼の記事をまだ読んでいない方は、以下のステップに従ってください。

バージョン管理

App Engine のデプロイメントでは、バージョン管理をすることができます。つまり、デプロイメントに (バージョンを表す) ストリング・パターンを割り当てられるということです。バージョン管理は、リリースが複数になってきたときに効果を発揮します。URL と Google のダッシュボードを使用して、「有効」なバージョンと、有効でないバージョンを明確に記述することができます (ただし URL を削除するまでは、バージョン管理されたデプロイメントにはいずれも URL でアクセスすることができます)。したがって、プロジェクトの新しいバージョンを Google のインフラストラクチャーにデプロイするときには常に、そのデプロイメントに有効なバージョンを指定する必要があります。ストリング・パターンにはピリオドを含めることはできません (1.1 は無効ですが、1-1 は有効です)。バージョンを割り当てる場所は、新規プロジェクトの作成時に war/WEB-INF ディレクトリー内に生成される appengine-web.xml ファイルです。最初のプロジェクトをデプロイするときには、Google がそのデプロイメントを最初のバージョンとして appengine-web.xml ファイルに バージョン 1 を指定するため、バージョンを扱う必要は (まだ) ありません。

  1. http://code.google.com/intl/ja/appengine/ にアクセスし、「スタート ガイド」の下に示された「ログイン」リンクをクリックして、Google App Engine アカウント (無料) を作成します。
  2. http://code.google.com/intl/ja/appengine/downloads.html からGoogle App Engine 対応 Eclipse プラグインをダウンロードしてインストールします。
  3. 新しいプロジェクトを作成するために、Eclipse で「New Web Application Project (新規 Web アプリケーション・プロジェクト)」ボタンをクリックします。表示されるダイアログで、「Use Google Web Toolkit (Google Web ツールキットを使用)」オプションの選択を解除し、プロジェクトの名前とそのプロジェクトに対応する任意のパッケージを指定します。
  4. パッケージ・エクスプローラーの階層からプロジェクトを選択し、「Deploy App Engine Project (App エンジン・プロジェクトのデプロイ)」ボタンをクリックします。
  5. クレデンシャル (ステップ 1 で App Engine アカウントを作成したときに使用したクレデンシャル) を入力します。
  6. ローカル・プロジェクトを、App Engine アカウントの作成時に作成したアプリケーション ID に関連付けます (最大 10 の ID を作成することができます)。
  7. Deploy (配置)」ボタンをクリックします。すると、Eclipse コンソールに大量のテキストが次々と表示されます (プラグインが裏で大量の作業を行っているということです。この作業には、Google の優れたデータ・ストレージ・サービスを利用するために必要なクラスの拡張も含まれます)。一連のテキスト表示が一段落すると (そしてすべてが正しく機能すると)、「Deployment completed successfully (配置が正常に完了しました)」という文で終わるメッセージが表示されます。
  8. Google の App Engine アカウント・ページにアクセスして、Google ダッシュボード上の「Versions (バージョン)」 リンクの表示位置を確認します。ここに、デプロイ済みのバージョンとそのバージョンに対応する URL が表示されることになります。URL をクリックした後、生成されたサーブレットへのリンクをクリックして、プレーン・テキストで出力された「Hello, world」を確認してください。平凡ながらも満足感を与えてくれるはずです。

Groovlet によってコードの行数は少なくなります

ここまでで、最初の Google App Engine アプリケーションを正常にデプロイしましたが、コードはまだ 1 行も作成していません。実のところ、App Engine を利用しようと思うなら、最終的には何らかのコードを作成することになります。ただし、ジョブを楽にするために、再利用可能なコードが大量に用意されています。再利用可能なコードは、Google が提供するサービスである場合も (Google のデータ・ストアや Google アカウント・サービスなど)、Google のインフラストラクチャーで動作するように移植されたオープンソースのライブラリーである場合もあります。他人が作成したコードを再利用すれば、大抵は作成するコードが減ります。そしてコードが減るということは、十中八九、欠陥が少なくなるということです。

私が気に入っているオープンソース・ライブラリーの 1 つ (実際にはプラットフォーム) で、実用的なアプリケーションを作成するためのコードの行数が必ずと言っていいほど少なくなるのは、Groovy です (「参考文献」を参照)。Groovy チームが最近リリースした、App Engine 上で動作するプラットフォームのバージョンでは、サーブレットの代わりに Groovlet を使用して、あっという間に実用的なアプリケーションを作成することができます。Groovlet とは、サーブレットのように機能する単純な Groovy スクリプトのことです。「Hello, world」を出力するサーブレットはすでにあるので、Groovlet を使うと同じことをいかに簡単に行えるか (そして、Groovy によって大幅にコードの行数が少なくなること) をこれから示します。

Eclipse プラグインでは、簡単なほんのわずかなステップで Groovlet を App Engine にデプロイすることができます。

  1. http://groovy.codehaus.org/Download から、最新バージョンの Groovy (この記事を書いている時点では、1.6.3) をダウンロードします。
  2. groovy-all-1.6.3.jar を見つけて、このファイルを App Engine プロジェクトの war/WEB-INF/lib ディレクトリーに配置します。ちなみに、このディレクトリーにはアプリケーションに必要なすべてのライブラリーを配置することができます (ただし、この後すぐに説明しますが、いくつかの注意点があります)。
  3. war/WEB-INF ディレクトリーにある web.xml ファイルに、リスト 1 のフレーズを追加します (Groovlet を特殊なリクエストにマッピングするためです)。
    リスト 1. Groovlet をサポートするための web.xml ファイルの更新
    <servlet>
     <servlet-name>GroovyServlet</servlet-name>
     <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
     <servlet-name>GroovyServlet</servlet-name>
     <url-pattern>*.groovy</url-pattern>
    </servlet-mapping>
  4. WEB-INF ディレクトリーに、groovy ディレクトリーを追加します。ここが、Groovlet を保管する場所です。groovy ディレクトリーのなかに、helloworld.groov という名前のファイルを新規に作成します。この新規ファイルに、println "Hello, Groovy baby!" と入力します。
  5. アプリケーションのバージョンを例えば 1-1 に更新し、再デプロイします。Google ダッシュボードから対応する URL を見つけ、次にブラウザーで /helloworld.groovy までナビゲートして、Google のインフラストラクチャー上の Groovy によって出力される見事で粋なメッセージを楽しんでください。

以上のように Groovlet をデプロイする手順は至って簡単で、Groovy JARを追加し、web.xml ファイルを更新し、新しい groovy ディレクトリーを作成し、Groovlet を作成してデプロイすればよいだけのことです。また、Groovlet は、プラグインが作成したデフォルトのサーブレットと同じことを、たった 1 行のコードで実現したことにお気付きでしょうか?クラスを作成して維持しなければならないとしたら、大掛かりなクラスか、それとも同じことを行う小さなクラスか、あなたならどちらを選びますか?


Groovy と Java との組み合わせで、あっという間に実用的なアプリケーションが誕生

ここからは、Google の App Engine で Groovy を使用すると、実用的なアプリケーションを短時間で作成できる仕組みを説明します。この例で使用するのは、単純な HTML ページ、Groovlet、そしてイベント (この例ではトライアスロン) を永続化するための JDO 拡張 Java クラスです。今のところ、単純なアプリケーションにしておきますが、このアプリケーションを拡張して他の機能を組み込むこともできます。追加機能は、連載の今後の記事で (もちろん別のインフラストラクチャーと技術を使用して) 実装します。

手早く使える JDO

Google App Engine では、永続化のための Java 標準であるJDO を使ってデータを永続化することができます (「参考文献」を参照)。ほとんどの Java 開発者にとって、データを永続化させるというと、通常は情報をリレーショナル・データベースに保管することを意味しますが、Google の場合、ベースとなっているストレージ・メカニズムは独自仕様の Big Table であり、これはリレーショナルではありません。しかし、このことはそれほど重要ではありません。Google が特定の属性を永続化する方法の詳細は、開発者には公開されてないからです。開発者としては、他のあらゆるアプリケーションと同じく、通常の Java オブジェクト (または Groovy オブジェクト) を使用して、情報を保管可能なアプリケーションを作成できることを知っていれば十分でしょう。ただ、Google の場合には JDO を使用しなければならないというだけです (Java の ORM フレームワークとして最もよく使われているのは、ほぼ間違いなく Hibernate ですが、これは App Engine では機能しません)。

JDO は至ってシンプルで、POJO (Plain Old Java Object) を作成し (他の Java オブジェクトとの関係を持つこともできます)、クラス・レベルの @PersistenceCapable アノテーションを使用することで、永続化に対応した POJO として宣言するだけです。このオブジェクトのどのプロパティーを永続化するかは、@Persistent アノテーションで指定することができます。例えば、トライアスロンのイベントを保管したいとします (ここでは、トライアスロンに関連するさまざまな結果についてではなく、イベントに重点を置きます)。その場合、イベントには名前 (トライアスロンの名前) と、おそらく説明 (トライアスロンのタイプ)、そして日付があるということなので、JDO はリスト 2 のようになります。

リスト 2. 単純なトライアスロン・イベントの JDO
import java.util.Date;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.IdentityType;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Triathlon {

 @Persistent
 private Date date;

 @Persistent
 private String name;

 @Persistent
 private String description;

}

データの永続化には、ベースとなるメカニズム (つまり、リレーショナルであるか、Google の Big Table であるか) に関わらず、キーの概念が必要です。キーは、データ間の衝突を避けるため、さまざまな側面を持つデータが一意であることを保証する方法となります。例えば、トライアスロンの場合で言うと、トライアスロンの名前をキーにすることができます。2 つのトライアスロンの名前が同じ場合には、名前と日付の組み合わせをキーにすることができます。Google App Engine と JDO でどのようにキーを表現するにしても、JDO オブジェクト内で @PrimaryKey アノテーションを使ってキーを指定する必要があります。さらに、キーの生成方法に関するストラテジーを選択することもできます。選択肢は、自分で生成するか、Google のインフラストラクチャーによって生成するかのいずれかです。ここでは単純に Google にキーの生成を任せることにします。つまり、トライアスロン・オブジェクトのキーは通常の Java の Long オブジェクトとして表現し、ストラテジーの値を指定することによって Google に実際の値を選択させます。主キーを追加する方法は、リスト 3 のとおりです

リスト 3. トライアスロン JDO への主キーの追加
import java.util.Date;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import javax.jdo.annotations.IdentityType;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Triathlon {
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 private Long id;

 @Persistent
 private Date date;

 @Persistent
 private String name;

 @Persistent
 private String description;

 public Triathlon(Date date, String name, String description) {
  super();
  this.date = date;
  this.name = name;
  this.description = description;
 }

 //...setters and getters left out

 public String toString() {
  return ReflectionToStringBuilder.toString(this);
 }

 public int hashCode() {
  return HashCodeBuilder.reflectionHashCode(this);
 }

 public boolean equals(Object obj) {
  return EqualsBuilder.reflectionEquals(this, obj);
 }
}

リスト 3 を見るとわかるように、トライアスロン JDO には Google のインフラストラクチャーが管理するキーを指定し、いくつかの標準メソッド (toStringhashCode、および equals) を追加しました。これらのメソッドは、デバッグやロギングにも、そしてもちろん適切な機能を提供する上でも大いに役立ちます。これらのコードは自分で作成したわけではなく、Apache commons-lang ライブラリーを利用しています (「参考文献」を参照)。さらにコンストラクターも追加して、多数のセッター・メソッドを呼び出すよりも遙かに簡単に、完全に初期化されたオブジェクトを作成できるようにしています。

この JDO は意図的に単純にしますが、ご覧のように、他のオブジェクトとの関係もなければ、ゲッターとセッターも簡潔にするために省略されています。読者の皆さんは、ドメインを単純にモデル化した後、そのモデルをいくつかのアノテーションで修飾してください。後は Google が引き受けてくれます。

オブジェクトを永続化に対応するように定義できたので、残るステップはあと 1 つです。ベースとなるデータ・ストアとやりとりするためには、PersistenceManager を操作しなければなりません。PersistenceManager は JDO 標準クラスで、その名前が示唆するように、ベースとなるデータ・ストアでのオブジェクトの保管、更新、取得、削除を行います (Hibernate の Session オブジェクトとほとんど同じです)。このクラスは、PersistenceManagerFactory によって作成されます。このファクトリーは比較的重いので、Google では、このファクトリーの単一のインスタンスを管理するシングルトン・オブジェクトを作成するように推奨しています (このオブジェクトが、必要に応じて適切な PersistenceManager を返すことになります)。したがって、PersistenceManager のインスタンスを返す単純なシングルトン・オブジェクトをリスト 4 のように定義することができます。

リスト 4. PersistenceManager インスタンスを返す単純なシングルトン
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;

public class PersistenceMgr {

 private static final PersistenceManagerFactory instance =
   JDOHelper.getPersistenceManagerFactory("transactions-optional");

 private PersistenceMgr() {}

 public static PersistenceManager manufacture() {
  return instance.getPersistenceManager();
 }
}

上記のリストからわかるように、この PersistenceMgr はかなり単純で、manufacture という 1 つのメソッドが PersistenceManagerFactory の単一のインスタンスから PersistenceManager インスタンスを返すというものです。またお気付きのとおり、リスト 4 やその他の JDO を利用するリストに、Google に特有のコードはありません。すべて、標準 JDO クラスとインターフェースを参照しています。

新しく定義した 2 つの Java オブジェクトはプロジェクトの src ディレクトリーに置かれます。commons-lang ライブラリーは、war/WEB-INF/lib ディレクトリーに追加しました。

単純なトライアスロン JDO POJO を定義して、PersistenceMgr オブジェクトを扱えるようになったら準備は万端です。あとは、トライアスロン情報を収集する手段を用意すればいいだけです。


Web インターフェースを介したデータの収集

大抵の Web アプリケーションが従うパターンは同じで、HTML フォームによって情報を収集し、その情報をサーバー・サイドのリソースにサブミットして処理させます。もちろん、さまざまな趣向があちこちに散りばめられていますが、ベースとなる技術やインフラストラクチャーが変わっても、このパターンは変わりません。Google App Engine にしても同じです。サーバー・サイドがトライアスロン・データの保管を処理するためのコードはすでに作成済みなので、あとは情報を収集する手段 (フォーム) と、サーバー・サイドとフォームを結び付ける手段が必要なだけです。MVC (Model-View-Controller) の用語で言うなら、必要となるのはコントローラーです。大抵の場合、コントローラーはサーブレットですが、作成するコードを少なくしたいので、ここでは Groovlet を使用します。

この HTML フォームは単純なものです。私が行った作業は、単純な CSS (Cascading Style Sheets) コードを使用する HTML ページを作成しただけです (図 1 を参照)。この CSS コードによって、フォームが (1998年頃の HTML ページのようではなく) Web 2.0 のように見えるようにしています。

図 1. 単純な HTML フォーム
単純な HTML フォーム

図 1 からわかるように、このフォームは名前、説明、日付の情報を収集します。ただし日付に関してはそれほど単純ではなく、実際には、日付の 3 つの属性からなります。

Groovlet で素早くコードを作成

コントローラーのコードを作成するのは、Groovlet ではわけのない話です。必要なコードは少なく、必要なオブジェクトは自動的に提供されます。Groovlet では、request オブジェクトと response オブジェクトを介して、HTML リクエストおよびレスポンスに暗黙的にアクセスすることができます。私の Groovlet の場合、サブミットされた HTML フォームの属性はすべて、request.getParameter("name") 呼び出しによって取得することができます (リスト 5 を参照)。

リスト 5. Groovlet の動作
def triname = request.getParameter("tri_name")
def tridesc = request.getParameter("tri_description")
def month = request.getParameter("tri_month")
def day = request.getParameter("tri_day")
def year = request.getParameter("tri_year")

前に作成した JDO コードが利用するのは Java の Date オブジェクトですが、リスト 5 では、Date の 3 つの別個の属性を扱っています。そこで必要となってくるのが、monthdayyear の組み合わせを通常の Java Date に変換する DateFormat オブジェクトです (リスト 6 を参照)。

リスト 6. 日付フォーマット設定の動作
def formatter = new SimpleDateFormat("MM/dd/yyyy")
def tridate = formatter.parse("${month}/${day}/${year}")

サブミットされた HTML フォームから取得したすべてのパラメーターについては、リスト 7 の JDO、そしてリスト 4PersistenceMgr オブジェクトを使って Google のインフラストラクチャーに永続化することができます。

リスト 7. JDO による簡単な永続化
def triathlon = new Triathlon(tridate, triname, tridesc)
def mgr = PersistenceMgr.manufacture()

try {
 mgr.makePersistent(triathlon)
} finally {
 mgr.close()
}

必要な作業はこれだけです。当然のことながら、この単純なアプリケーションにページを追加するとしたら (特定のトライアスロンの結果を収集するなど)、ウィザードのように別のフォームに転送またはリダイレクトして、そのフォームで追加情報を収集することになります。そうとは言え、私は数少ない簡潔なコード・スニペットで、JDO (通常の Java で作成) と Groovlet (もちろん Groovy で作成) によってデータを Google のインフラストラクチャーに永続化する単純な Web アプリケーションを素早く組み立てました。このアプリケーションはデプロイするのも簡単です。appengine-web.xml ファイルにバージョンを指定して、Deploy ボタンをクリックするだけでデプロイすることができます。

このトライアスロン・イベントを収集する単一フォームの Web アプリケーションは、言ってみれば、世界を驚かせる革新的なアプリケーションではないものの、不定の形でどこにでもある環境にデプロイしたことは確かです。アプリケーションをデプロイするために、Web コンテナーを起動することもなければ、デプロイする場所さえ指定する必要はありませんでした。アプリケーションがカリフォルニアにあるのか、私のハード・ディスクにあるのか、あるいは月にあるのかさえわかりませんが、デプロイメントについては Google がすべて引き受けてくれるというのが長所です。さらに Google は、このアプリケーションをインドで見ている誰かが、例えばアルゼンチンにいる誰かと同じユーザー・エクスペリエンスを得られるように、アプリケーションを地球規模で拡大する方法についても解決済みのはずです。

そうは言うものの、念頭に置いておかなければならない点がいくつかあります。Google のインフラストラクチャーは Java 技術をサポートしますが、何から何までサポートするわけではありません。何年か前に J2ME が登場したときのことを記憶しているとしたら、App Engineの制約は多少、そのときの制約と似ています。つまり、Java ライブラリーとこれらに関連するオープンソース・ライブラリーのなかには、サポートされないものもあります。前述のとおり、Hibernate は使用することができません (その主な理由は、App Engine ではリレーショナル・データベースを使用できないからです)。また私の経験では、base64 エンコーディングが組み込まれた一部のオープンソース・ライブラリーを使用する際に問題がありました (Google 独自の URL Fetch サービスを使用する必要があります)。App Engine はプラットフォームです。プラットフォームに合わせて開発を行ってください。今のところ、開発にプラットフォームを合わせるという道はなさそうです。


未来はすでに到来しています

オブジェクト指向プログラミングの生みの親の一人である Alan Kay 曰く、「未来を予測するのに最も確実な方法は、未来を作り出すことです」。私も Alan Kay と同じ意見です。他の人が言う Java 技術の未来を握る鍵が何であれ、私は Java 技術の未来はすでに到来していると思います。

この記事で説明したように、Google App Engine は Java 開発者にとって、未来のためのプラットフォームです (この記事で取り上げたのは、App Engine のほんの一握りの機能でしかないことを忘れないでください。App Engine には他にも多くの機能があります)。より高度な柔軟性を求める一方 (つまり、リレーショナル・データベースが必要で、Hibernate なしでは生きていけないという場合)、他人のスケーラブルなインフラストラクチャーを借りるという考えにも引かれるのなら、選択肢は他にもあります。Amazon の EC2 は文字通り一定の形を持たないインフラストラクチャーにおける仮想サーバーであり、しかもオンデマンドで呼び出すことができます。これについては、来月の Java 開発 2.0 の記事を読んでください。

参考文献

学ぶために

  • Google App Engine: Google App Engine のホームにアクセスしてください。
  • Google Plugin for Eclipse の使用: Google Plugin for Eclipseのインストール方法、新しい App Engine プロジェクトを作成する方法、そして Eclipse 内で実行している開発サーバーでデバッグする方法を学んでください。
  • Google App Engine for Java」(Rick Hightower 著、developerWorks、2009年8月): この 3 回の連載記事で、Google App Engine for Java の詳細を探ってください。
  • Stop writing so much code!」(Andrew Glover 著、developerWorks、2008年4月): Commons Lang が標準 java.lang API をどのように拡張するかを調べてください。
  • Fluently Groovy」(Andrew Glover 著、developerWorks、2008年3月): このチュートリアルでは Groovy をよく知らない Java 開発者向けに、その基本を簡単にわかりやすく説明しています。
  • Secrets of lightweight development success, Part 6: Persistence strategies」(Bruce Tate 著、developerWorks、2005年9月): この記事では、JDO を含め、Java プラットフォームに用意された多数の永続化オプションについて詳しく説明しています。
  • Technology bookstore で、この記事で取り上げた技術やその他の技術に関する本を探してください。
  • developerWorks Java technology ゾーン: Java プログラミングのあらゆる側面を網羅した記事が豊富に用意されています。

製品や技術を入手するために

  • Google Plugin for Eclipse: Google App Engine 対応 Eclipse プラグインをダウンロードしてください。
  • Gaelyk: Google App Engine 用に設計された軽量の Groovy フレームワークです。
  • developerWorks Cloud Computing Resource Center: Amazon EC2 (Elastic Compute Cloud) 仮想環境に用意された IBM ソフトウェア製品にアクセスしてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Web development
ArticleID=428286
ArticleTitle=Java 開発 2.0: Google App Engine よ、こんにちは
publish-date=08182009