Geronimo と REST を使ってサーバー・サイドのマッシュアップを作成する

REST、Ajax、Apache Geronimo を使って Twitter と Google マップのためのマッシュアップを作成する

Apache Geronimo と REST ベースのプロトコル、そして複数ソースからのデータを使ってマッシュアップ・アプリケーションを作成するための手法と技術を学びましょう。このマッシュアップでは、Google マップのデータと Twitter の tweet のデータを組み合わせ、Twitter のユーザーが彼らのTwitter ステータスを更新すると、そうした Twitter ユーザーをピンポイントで特定します。

J. Jeffrey Hanson, CTO, Max International

Jeff HansonJeff Hanson はソフトウェア業界に 20 年以上の経験があり、OpenDoc プロジェクトでの Microsoft Windows への移植でのシニア・エンジニアや、Novell における Route 66 フレームワークの中心アーキテクトを経験してきています。また eReinsure.com, Inc. では J2EE ベースの再保険システム用のフレームワークとプラットフォームの設計と実装のチーフ・アーキテクトとして業務を行ってきました。彼は現在、Max Software, Inc. の CTO (最高技術責任者) であり、インターネットの安全性とペアレンタル・コントロールのための、デスクトップやエンタープライズ向けアプリケーションやプラットフォームを提供する業務を指揮しています。彼は数多くの記事や本を執筆しており、そのなかには『.NET versus J2EE Web Services: A Comparison of Approaches』や『Pro JMX: Java Management Extensions』、『Web Services Business Strategies and Architectures』などがあります。



2008年 10月 21日

マッシュアップという言葉の定義は元々、音楽の世界で 2 曲以上の曲をミキシングすることによってまったく新しい曲を作り出すことでした。ソフトウェア・エンジニアリングの世界でのマッシュアップは、データや UI コンポーネント、プロセスを組み合わせて新しい Web アプリケーションやサイトを作成するための技術やパターンを意味します。

マッシュアップはデータやコンテンツを容易に組み合わせることができるため、サイト開発者の間で人気があります。そうした容易さの背景には、Web のための動的でセマンティクスを豊富に持つ技術が、いつでもどこでも手軽に利用できることが挙げられます。また技術の例としては、XML、JSON (JavaScript Serialized Object Notation)、RDF (Resource Description Framework)、動的 JavaScript、そして Ajax などがあります。これらの技術やその他の技術によって、創造的なコンテンツ開発者には無限の可能性が与えられています。

頻繁に使用する頭字語

  • Ajax: Asynchronous JavaScript + XML
  • API: Application program interface
  • CSS: Cascading Style Sheets
  • DOM: Document Object Model
  • HTML: Hypertext Markup Language
  • HTTP: Hypertext Transfer Protocol
  • UI: User interface
  • XML: Extensible Markup Language
  • XSD: XML Schema Document

通常、マッシュアップを作成するためには、UI コンポーネントや、サービスまたはプロセス、そしてデータを組み合わせます。マッシュアップ可能な UI コンポーネントに含まれるものには、動的な JavaScript や HTML スニペット、RSS フィード、また Web サービスの API を呼び出した結果などがあります。マッシュアップ実現するためには、データ変換や動的な JavaScript、DOM 操作などの手法を使用して、1 つ以上のサイトの UI コンポーネントやプロセス、データを疎結合で混合する必要があります。現在の典型的なマッシュアップでは、Google マップを位置情報データ (指定された地域の犯罪統計や不動産価格など) と組み合わせています。

この記事では Twitter と Google マップで提供されている API と、Ajax と Java™ 言語コードを組み合わせ、Apache Geronimo 環境にデプロイして実行可能なマッシュアップを作成する方法について説明します。
(編集者からの注記: サーバー・サイドのマッシュアップを作成する方法は数多くありますが、この記事ではそうした方法のうちの 1 つを説明します。WebSphere® sMash では Web ベースのアプリケーションを作成するための別の方法として、動的スクリプトを使う手段を提供しています。この記事で取り上げたソフトウェアやその入手方法などの詳細は「参考文献」を参照してください。)

Geronimo について知る

Geronimo は標準に完全準拠した Java EE (Java Platform, Enterprise Edition) プラットフォームであり、エンタープライズ・サービスやアプリケーションの構築に使用することができます。Geronimo の設計アーキテクチャーでは、IoC (Inversion of Control) の手法を使用することによってサービスとコンポーネントが明確に分離されています。このような明確な分離によって、デプロイメントと実行のための環境は極めてモジュール化の進んだ、構成が容易なものとなっています。Geronimo は JMX (Java Management Extensions) と、JMX に似た Geronimo 専用の MBean スタイルのフレームワークを積極的に使用しているため、強力で管理が容易なエンタープライズ・プラットフォームでもあります。

Geronimo のランタイム環境を作成するためには、軽量のカーネル・エンジンによって組み立てられ、管理されるモジュールを、カスタマイズ可能な方法で集約して使用します。カーネル・エンジンは 1 つの Geronimo モジュールであり、クラスや他のモジュール、シリアライズ可能な構成を任意の組み合わせで集めたものです。Geronimo のカーネルは、Geronimo のランタイム・インスタンスが起動するとモジュールをロードして組み合わせ、そして協調動作させます。デプロイメントと実行のための Geronimo 環境の機能は、組み合わされたモジュールによって決定されます。Geronimo のランタイム・インスタンスのすべてのサービスはモジュールとしてデプロイされます。

Geronimo のモジュール群はデプロイメント・プランという XML 文書の中で定義されます。Geronimo の最終的なデプロイメント・プランは、元々のデプロイメント・プランと Maven の project.properties ファイル、そして Maven の POM (Project Object Model) ファイルを組み合わせたもので構成されます。図 1 は、これらの成果物がどのように処理されて最終的なデプロイメント・プランが作成されるかを示しています。

図 1. Geronimo のデプロイメント・プランの処理
Geronimo のデプロイメント・プランの処理

デプロイメント・プランの内容は XSD ファイルによって制御されます。デプロイメント・プランで定義されるものは、モジュール ID、モジュールの環境プロパティー、モジュールの依存関係、そのモジュールが提供するサービス、そのモジュールの GBean (Geronimo Bean) などです。リスト 1 は Geronimo の簡単なデプロイメント・プランを示しています。

リスト 1. Geronimo のデプロイメント・プランの例
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="http://geronimo.apache.org/xml/ns/deployment-1.1">
  <environment>
    <moduleId>
      <groupId>geronimo</groupId>
      <artifactId>example</artifactId>
      <version>1.0.0</version>
      <type>car</type>
    </moduleId>  
    <dependencies>
      <dependency>
        <groupId>geronimo</groupId>
        <artifactId>j2ee-server</artifactId>
        <type>car</type>
      </dependency>
    </dependencies>
    <hidden-classes/>
    <non-overridable-classes/>
  </environment>
  
  <gbean name="ExampleService" class="com.example.myservices.MyServiceGBean">
    <attribute name="prop1">12345</attribute>
    <attribute name="prop2">This is a value for a property</attribute>
  </gbean>
</module>

ビルド・プロセスによってリスト 1 のようなデプロイメント・プランがコンパイルされると、一意の名前を持つ CAR (Configuration Archive) ファイルが作成されます。リスト 1 の構成に対して生成される一意の名前は geronimo/example-1.0.0/car です。

Geronimo の CAR ファイル

Geronimo の CAR ファイルは、シリアライズされた形式のデプロイメント・プランと他の任意の追加リソースを含む JAR (Java Archive) ファイルです。シリアライズされたデプロイメント・プランは、CAR の META-INF ディレクトリーの中にある config.ser という名前のフォルダーの中に含まれています。CAR ファイルは Maven 用に用意された Geronimo のパッケージ・プラグインによってビルド・プロセス中に作成されます。

Geronimo のリポジトリー

Geronimo のリポジトリーは成果物のレジストリーであり、通常はファイルシステム上のフォルダーの階層構造として実現されます。Geronimo のバイナリー・ディストリビューションには repository という名前のフォルダーが提供されており、このフォルダーの中に、Geronimo のコア・プラットフォームを表現するモジュール群に関するすべての依存関係が含まれています。

Geronimo では成果物は任意のコンポーネントであり (例えば WAR (Web Archive) ファイルや JAR ファイル、CAR ファイルなど)、Geronimo のリポジトリーの中に保存されます。また成果物は Geronimo のディストリビューションに提供されているコマンドライン・デプロイメント・ユーティリティーの中、あるいは Geronimo の Web コンソールの中に保存されます。

Geronimo のダウンロードとインストール

Geronimo プラットフォーム (「参考文献」を参照) をダウンロードし、これらのファイルをディレクトリーに解凍します (このディレクトリーを GERONIMO_HOME と呼ぶことにします)。Geronimo をインストールできたら、コマンドライン・コンソールを開いて GERONIMO_HOME/bin ディレクトリーに変更し、startup.sh を実行します。すると新しいコンソール・ウィンドウでサーバーが起動します。サーバーが起動すると、図 2 のような画面が表示されるはずです。

図 2. Geronimo の起動コンソール
Geronimo の起動コンソール

起動コンソールには、Geronimo のランタイム環境が確立されるとロードされて起動されるモジュールとコネクター、そしてアプリケーションが表示されます。Geronimo のランタイムを停止するためには、同じく Geronimo のインストールの GERONIMO_HOME\bin\ ディレクトリーの中にある shutdown.sh スクリプトを使います。


REST について知る

REST (Representational State Transfer) はネットワーク上のリソースへのアクセスと更新を行うためのソフトウェアのアーキテクチャー・パターンであり、呼び出しスタイルでもあります。REST という用語は Roy Thomas Fielding による博士論文 (「参考文献」を参照) で定義されたものであり、デフォルトの HTTP メソッド・セット (GETPOSTDELETEPUT) で定義される標準的なリクエストとレスポンスを使って HTTP を介して送信するデータを説明する際によく使われます。

REST のアーキテクチャー・スタイルでは、リソースを表現したもの (リソースの representational state (状態表現) と呼ばれます) を、URI (uniform resource identifier) を使って発見し、アクセスすることを強く推奨しています。representational state へのアクセスと変更は、限られた一連の操作である CRUD (create, read, update, and delete) という動詞のセットを使用することで行うことができ、それによって HTTP のような標準プロトコルで実現されるものに追加されるオーバーヘッドはほとんどありません。REST ベースの通信はステートレスに保つ必要があり、そのためセマンティック・データ・フォーマット (RSS、RDF、OWL (Web Ontology Language)、Atom など) を扱うためには最適です。


Google マップについて知る

Google Mpas API には、地図を操作したり、作成したりする方法や、Web ページに埋め込める地図を取得する方法などがいくつか用意されています。この記事で関心があるのは、Google Maps API を利用すると、指定された位置ストリングに基づいて地図を取得できる点です。

Google マップ用の公開インターフェース

Google マップには、標準的な HTTP リクエストを使ってアクセスできる API が用意されています。各 API リクエストには API キーが必要であり、この API キーを事前に取得しておく必要があります。Google Maps API は KML データ・フォーマットと GeoRSS データ・フォーマットのHTTP レスポンスをサポートしています。

Google Maps API の使い方

Google Maps API を使い始めるためには、まずサインアップして Google Code サイトから API キーを取得する必要があります。取得したキーは 1 つの Web ドメインに対してのみ有効です。

Google マップを使って地図を取得する

Google マップで公開されている API を利用すると、指定された場所をジオコードで描画したものを取得することができます。あるユーザーに関する場所その他の情報を取得するためには、単純に標準的な HTTP の GET リクエストを実行します (http://maps.google.com/maps/geo?q=Salt+Lake+City%2C+UT&output=xml&key={apikey} を使います)。ただし {apikey} は Google によって割り当てられた API キーで置き換える必要があります。下記の例は、コマンドラインから (curl で) この API を使う方法を示しています。

C:\>curl -G http://maps.google.com/maps/geo?q=Salt%20Lake%20City
   %2C%20UT%26output=xml%26key=ABQIAAAA7kHuyDenRy7D_
   kXwDkUfhBQCabR54RQscLxLTjQlrb8wKm07EBRSANMlyMuVIxp6jUQazrN52Pzp3w

このレスポンスは、指定された場所に関する情報を含む、KML という XML ベースのデータとして返されます。KML は OGC (Open Geospatial Consortium Inc.) が管理するオープン・スタンダードです。この KML データの例をソルト・レーク・シティー (Salt Lake City) という場所について示したものがリスト 2 です。

リスト 2. KML 文書の例
<kml xmlns="http://earth.google.com/kml/2.0">
  <Response>
    <name>Salt Lake City, UT</name>
    <Status>
      <code>200</code>
      <request>geocode</request>
    </Status>
    <Placemark id="p1">
      ...
      <Point>
        <coordinates>-111.888189,40.771592,0</coordinates>
      </Point>
    </Placemark>
  </Response>
</kml>

このリストの <coordinates> 要素は、それぞれソルト・レーク・シティーの経度、緯度、高度を指定する値を含んでいます。


Twitter について知る

Twitter が提供するサービスを利用すると、標準的な HTTP リクエストやインスタント・メッセージ、テキスト・メッセージを使ってユーザー同士を接続することができます。Twitter サービスでは、ユーザーが何をしているかを記述した (tweet として知られている) ショート・メッセージをユーザーが送信できることを前提としています。tweet は Twitter サーバーに送信され、その tweet を送信しているユーザーの「follower」に中継されます。

Twitter の公開インターフェース

Twitter には標準的な HTTP リクエストを使ってアクセスできる一連の API が提供されています。Twitter API は大まかには REST アーキテクチャーをベースにしています。各 Twitter API が現在サポートしている HTTP レスポンスのデータ・フォーマットは、XML、JSON、RSS、Atom です。一例として、コマンドラインから curl コマンドにより Twitter API を使って Twitter の公開タイムラインを RSS フォーマットで取得する方法は、C:\>curl -G http://twitter.com/statuses/public_timeline.rss のように指定します。

Twitter の API には他にも、友人のタイムラインの取得、状態の更新の投稿、プロファイルの場所の更新、あるユーザーのプロファイル・データの取得のための API があります。

Twitter のユーザーの場所を取得する

Twitter はユーザー・プロファイルの location プロパティーを取得できる API を公開しています。あるユーザーの場所やその他の情報を取得するためには、http://twitter.com/users/show/{targetUserID}.xml を使って単純に標準的な HTTP GET リクエストを実行します。ただし {targetUserID} は、その情報の取得元となるユーザーの Twitter ID で置き換える必要があります。コマンドラインから curl コマンドによりこの API を使う方法の例は下記のとおりです。

C:\>curl -G http://twitter.com/users/show/jhanson583.xml

このレスポンスは、そのユーザーに関する情報 (ユーザーのプロファイルの中に構成されている、ユーザーの場所など) を含む XML フォーマットのデータとして返されます。下記は jhanson583 というユーザーの XML データの例です。

リスト 3. Twitter のユーザー・プロファイルの XML データの例
<?xml version="1.0" encoding="UTF-8"?>
<user>
  <id>10852552</id>
  <name>Jeff Hanson</name>
  <screen_name>jhanson583</screen_name>
  <location>Salt Lake City, UT</location>
   …
</user>

ここで <location> 要素は jhanson583 というユーザーのプロファイルに入力されたデータを含んでいます。このストリングはフリーフォームで入力できるため、Google マップのクエリーに使用できる有効なものとは限らないことに注意してください。従って、<location> 要素の中に有効な位置データが含まれているユーザー・プロファイルの地図データのみを取得する必要があります。上記のプロファイルの中に示した位置データは Google マップのクエリーに使用できる有効なものです。

Twitter ユーザーの場所を Java コードを使って取得する

ユーザーのプロファイル情報を Java 言語を使って取得するためには、単純に HTTP GET リクエストを送信してレスポンスを解析すればよいだけです。リスト 4 のスニペットは汎用の HTTP GET リクエストを送信するための Java コードを示しています。

リスト 4. Java 言語での HTTP リクエストの例
  public static String sendHTTPRequest(String url)
    throws Exception
  {
    String res = null;

    try
    {
      HttpURLConnection con = null;
      InputStream inStream = null;
      OutputStream outputStream = null;

      try
      {
        con = (HttpURLConnection) new URL(url).openConnection();
        con.setDoInput(true);
        con.setRequestMethod("GET");
        inStream = con.getInputStream();
        res = parseHTTPResponse(inStream);
      }
      finally
      {
        try
        {
          inStream.close();
          outputStream.close();
          con.disconnect();
        }
        catch (Exception e)
        {
        }
      }
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }

    return res;
  }

  public static String parseHTTPResponse(InputStream inStream)
    throws IOException
  {
    BufferedReader br = null;
    br = new BufferedReader(new InputStreamReader(inStream, "UTF-8"));
    StringBuffer buf = new StringBuffer();
    String line;
    while (null != (line = br.readLine()))
    {
      buf.append(line).append("\n");
    }
    return buf.toString();
  }

このリストで、HttpURLConnection 要素は GET リクエストを送信するために使われています。このリクエストのレスポンスは InputStream として取得され、このストリームを行ごとに読み取ることによって XML データにアクセスします。HTTP リクエストを送信するための上記のコードを使うと、Twitter API を呼び出してユーザー・プロファイルを取得することができます (リスト 5)。

リスト 5. Java 言語で Twitter プロファイル・データを取得するための HTTP リクエスト
public class Twitter
{
  private static final String API_URL = "http://twitter.com/users/show/";

  public static String getUserLocation(String targetUserID)
    throws Exception
  {
    String response =
      HTTP.sendHTTPRequest(API_URL + targetUserID + ".xml", null);
    DocumentBuilder docBuilder =
       DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc =
      docBuilder.parse(new InputSource(new StringReader(response)));
    if (null != doc)
    {
      NodeList nodeList = doc.getElementsByTagName("location");
      if (null != nodeList && nodeList.getLength() > 0)
      {
        Node locationNode = nodeList.item(0);
        if (null != locationNode)
        {
          return locationNode.getTextContent();
        }
      }
    }

    throw new Exception("Invalid HTTP response content encountered");
  }
}

Ajax について知る

Ajax は、JavaScript 対応のブラウザーからページを直接更新せずにサーバー・リクエストを呼び出し、HTTP サーバーとやり取りするための手法や概念の集合です。また Ajax は、JavaScript や CSS、DOM 操作などを使ってブラウザーのページを動的に更新するための手法や概念の集合でもあります。ブラウザーのページを介してサーバーからデータを取得でき、またページを更新せずにそのデータを適用できる機能によって、デスクトップ・アプリケーションに匹敵するリッチな UI エクスペリエンスを備えたブラウザー・ベースのアプリケーションを作成できるようになりました。

Ajax ベースのページでは、XMLHttpRequest オブジェクトとして知られる JavaScript オブジェクトを使用します。このオブジェクトは、ブラウザーからサーバーへの HTTP リクエストの送信とサーバーからのレスポンスの受信を同期または非同期に行うために使われます。

リスト 6 のスニペットは ajaxPost メソッドの中に XMLHttpRequest オブジェクトのインスタンスを作成します。そして XMLHttpRequest オブジェクトを使ってサーバー・フレームワークの標準的な HTTP の POST メソッドを呼び出します。サーバー・フレームワークから取得したデータは XMLHttpRequest オブジェクトの send メソッドに送られてデータが取得、解析され、createMap メソッドに渡されます。そして createMap メソッドによって Google マップによる地図が作成され、その地図がページに適用されます。

リスト 6. XMLHttpRequest リクエストとレスポンスの処理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
   Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
  <title>Google Maps</title>
  
  <script src="http://maps.google.com/maps?file=api&v=2&key=..."
    type="text/javascript"></script>

  <script type="text/javascript">
    //<![CDATA[

    if (GBrowserIsCompatible())
    {
      // =============================================
      // createMarker function
      // =============================================
      function createMarker(point, html)
      {
        var marker = new GMarker(point);
        GEvent.addListener(marker, "click", function()
        {
          marker.openInfoWindowHtml(html);
        });
        return marker;
      }

      // =============================================
      // createMap function
      // =============================================
      function createMap(latitude, longitude, twitterUser)
      {
        // Display the map, with some controls, and set the initial location
        var map = new GMap2(document.getElementById("map"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.setCenter(new GLatLng(latitude, longitude), 8);

        // Set up marker

        var point = new GLatLng(latitude, longitude);
        var marker = createMarker(point, twitterUser)
        map.addOverlay(marker);
      }
      
      // =============================================
      // ajaxPost function
      // =============================================
      function ajaxPost(apiURL)
      {
        var twitterUser = document.getMapForm.TwitterUser.value;
        var xmlRequest = new XMLHttpRequest();

        // The false parameter indicates a synchronous call
        //
        xmlRequest.open("POST", apiURL + '?TwitterUser=' + twitterUser, false);
        xmlRequest.send(twitterUser);
        if (xmlRequest.status == 200)
        {
          if (xmlRequest.responseText)
          {
            var xmlDoc = xmlRequest.responseXML;

            var latitude =
              xmlDoc.getElementsByTagName('latitude')[0].firstChild.data;
            var longitude =
              xmlDoc.getElementsByTagName('longitude')[0].firstChild.data;

            createMap(latitude, longitude, twitterUser);
          }
        }
        else
        {
          alert("ajaxPost failed with status: " + xmlRequest.status);
        }
      }
    }
    else
    {
      // display a warning if the browser was not compatible
      alert("Sorry, the Google Maps API is not compatible with this browser");
    }

    //]]>
  </script>
</head>

<body onunload="GUnload()">

<p/>

<form method="POST"
    action="javascript:ajaxPost('http://localhost:8080/twoogle/service/getMap')"
    name="getMapForm">
  Twitter user name: <input type="text" value="" name="TwitterUser"/>
  <input type="submit" value="Get Map" name="submit"/>
</form>

<p/>

<div id="map" style="width: 550px; height: 450px"></div>
</body>

</html>

このコードは、指定された Twitter ユーザーの緯度と経度として取得された値を使って Google マップ による地図を作成します。そしてこの地図がそのページの DOM に適用されます (そのページでは、この地図は map という <div> 要素の子要素になります)。


REST と Ajax の手法を使って Twitter と Google マップのデータを組み合わせる

Twitter ユーザーの位置データと Google マップのジオコード・データを取得できると、Twitter のデータと Google マップのデータを公開する関連サービスを作成することができます。マッシュアップは、この関連サービスを利用し、組み合わせることで、組み合わされたデータを基に集約した UI を作成することができます。

この記事で紹介するフレームワークでは、Twitter ユーザーのプロファイルの中にある位置データを取得するサービスを呼び出した結果得られるデータと、Google マップの位置データから得られる経度と緯度のデータとを組み合わせています。そしてこれらのデータをマッシュアップ・ページの JavaScript から Ajax の手法を使って取得します。マッシュアップ・ページでは、取得されたデータがページの DOM に動的に適用され、その Twitter ユーザーの場所の地図が表示されます。この例のソース・プロジェクトは「ダウンロード」セクションから入手することができます。

このフレームワークの制御フローは非常に単純です。マッシュアップからサーバー・サイドの Ajax 対応の Java サーブレットに対して、REST ベースの同期サービス呼び出しを Ajax を使って行います。このサービスの呼び出しの構造は http://{host}:{port}/twoogle/service/getMap です。呼び出された Java サーブレットは Twitter と Google マップに対してサービスの呼び出しを行い、ある Twitter ユーザーの場所を取得します。そのユーザーの場所の緯度と経度はマッシュアップに渡され、そのページに適用されて地図が作成されます。このフレームワークを図 3 に示します。

図 3. Twitter と Google マップをマッシュアップするフレームワーク
Twitter と Google マップをマッシュアップするフレームワーク

このフレームワークはマッシュアップのクライアントから Ajax ベースの HTTP リクエストを受信し、そのリクエストのデータを使って Twitter と Google マップから位置データを取得します。指定された Twitter ユーザーの緯度と経度の値はマッシュアップのクライアントに XML として渡され、その XML が構文解析されてマッシュアップ・ページに適用されます。


フレームワークをデプロイし、実行する

Twitter と Google マップを組み合わせた Ajax と REST のフレームワークによって 1 つのサーブレットが公開され、このサーブレットが Ajax ベースで REST の構造を持つ HTTP リクエストを受信します。こうしたリクエストのデータは Twitter と Google マップのサービスに渡され、指定された Twitter ユーザーの位置データが取得されます。

このフレームワークをデプロイするためには、このフレームワーク用のコンパイルされたクラスと、静的な HTML ファイルやその他のリソースを、展開された WAR ファイルの構造を持つフォルダーの中に格納してパッケージにします。展開された WAR ファイル・フォルダーに下記のコマンドを適用すると、このフレームワークを Geronimo にデプロイすることができます。

GERONIMO_HOME\bin>deploy --user system 
    --password manager deploy --inPlace MYAPPDIR\MYAPPNAME

MYAPPDIR と MYAPPNAME を、それぞれ必ず皆さんのアプリケーションの場所と名前で置き換える必要があります。このフレームワークを Geronimo からアンデプロイするためには下記のコマンドを使います。

GERONIMO_HOME\bin>deploy --user system 
    --password manager undeploy MYAPPNAME

この場合も、MYAPPNAME を必ず皆さんのアプリケーションの名前で置き換える必要があります。


フレームワークのテスト

アプリケーションが適切にデプロイできたら、Web ブラウザーに URL として http://host:port/twoogle と入力します。このページが表示されたら、ページの先頭にあるボックスに Twitter のユーザー名を入力し、Get Map と入力します。そのユーザーのプロファイルに有効な <location> 要素が含まれていると、そのページに Google マップによる地図が表示されます。

まとめ

Apache Geronimo はエンタープライズ・サービスやアプリケーションの構築に使用できる Java EE プラットフォームです。Geronimo はサービスとコンポーネントを分離するように設計されているため、デプロイメントと実行のための環境を、極めてモジュール化の進んだ、管理や構成が容易な形で実現することができます。マッシュアップは大きな可能性を示しており、またデータやコンテンツを容易に組み合わせることができるため、サイト開発者の間で人気があります。そうした組み合わせが容易な理由は、Web 用の動的でセマンティクスを豊富に持つ技術 (XML、JSON、RDF、動的 JavaScript、Ajax など) をいつでもどこでも利用できるためです。

この記事では、REST スタイルのサービス呼び出しと、Ajax ベースのクライアントとサーバーとを Java フレームワークの中で組み合わせ、指定された Twitter ユーザーの位置データを取得する方法について説明しました。そしてこの位置データを使って Google マップから緯度と経度のデータを取得し、クライアント・サイドの Ajax 手法を使ってそれらのデータを適用することで Google マップによる地図を作成し、その地図をマッシュアップ・ページに動的に適用しました。

これで、皆さんの課題は、最新バージョンの Geronimo をダウンロードし、Twitter の API と Google Maps API に慣れ、そしてマッシュアップに関する一般的な概念を調べることです。REST と Ajax によって実現される Web アプリケーション・プログラミングのための単純化されたモデルを使用することによって、Geronimo と Twitter、そして Google マップの強力さを活用できるようになり、堅牢で非常に柔軟なマッシュアップの作成を開始することができます。


ダウンロード

内容ファイル名サイズ
Sample projectos-ag-mashup-rest-TwitterFramework.zip13KB

参考文献

学ぶために

  • IBM developerWorks には Apache Geronimo プラットフォームを使うために必要なすべてのリソースが用意されています。
  • Bill Higgins 著の記事「Ajax と REST、第 1 回」を読み、REST と Ajax について学んでください。
  • Duane Merrill 著の記事「マッシュアップ: 新種の Web アプリケーション」を読み、マッシュアップに関する調査を続けてください。
  • Twitter の開発サイトを訪れてください。
  • Google マップの開発サイトを訪れてください。
  • Roy Thomas Fielding による、REST に関する博士論文を読んでください。
  • KML に関して知るために OGC を訪れてください。
  • WebSphere sMash は、Groovy や PHP といったスクリプト言語を使って動的な Web アプリケーションを作成するための開発及びランタイム環境として IBM が提供するものです。WebSphere Smash は Eclipse と統合され、Groovy や PHP を使った REST スタイルのサービスを生み出します。
  • developerWorks podcasts では、ソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • IBM オープンソース開発者にとって関心のある、世界中で今後開催される会議や業界展示会、ウェブキャスト、その他のイベントについて調べてみてください。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。
  • IBM とオープンソース技術、そして製品機能を調べ、学ぶために、無料の developerWorks On demand demos をご覧ください。

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

  • Apache Geronimo の最新バージョンをダウンロードしてください。
  • 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
  • IBM 製品の試用版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。

議論するために

コメント

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=Open source
ArticleID=352997
ArticleTitle=Geronimo と REST を使ってサーバー・サイドのマッシュアップを作成する
publish-date=10212008