ユーザーの挑戦

フリーAPサーバで音楽ダウンロードサイトを構築


羽生章洋
有限会社エア・ビート
取締役兼CEO
2001/1/24

後編 バーチャル組織で成功した理由と「Enhydra」の優位性


 

「Enhydra」の開発スタイル

 さて、当社は実はバーチャル組織です。もともと会社設立に当たって、それまでネットワークのコミュニティを通じて知り合った仲間同士の中で志を同じくするメンバーが中心となりました。当然住んでいる地域もバラバラです。主として関西と関東でほぼ半数ずつの人数であり、九州にも積極的にサポートしてくれているメンバーがいます。

エア・ビートは、ネットワーク上のコミュニティで知り合った仲間同士が集まったバーチャル組織。2回の集合ミーティングを除いては、遠隔地に離れたメンバー同士による共同作業でサイト構築に成功した。写真奥が筆者の羽生章洋氏

また、そもそも資金が少なかったのでオフィスを構えるという余裕もありませんでした。本社は奈良にあるのですが、これは当社の代表取締役の自宅です。いわゆるガレージカンパニーです。

 そこで当社は企業活動の大半を電子メールベースで行っています。 こういう状況の中でエア・ビート・ドットコムは開発されました。カットオーバ直前にはすべてのリソースを集約せざるを得ないため、本社に集合可能なメンバーが集まって作業を行ったたのですが、開発メンバーは作業のほとんどをそれぞれ別の場所で行ってきました。具体的には個々人の自宅です。

 このような開発スタイルに、Enhydraを採用したということがプラスに働きました。どのようにプラスとなったかを説明するために、まずはEnhydraの非常に大きな特徴であるPOとXMLCについて簡単に紹介したいと思います。

POとは何か?

 PO(Presentation Object)はブラウザに表示するコンテンツを動的に生成するためのオブジェクトです。Enhydraはクライアントから「.po」で終わるURLの要求を受けた場合、その要求を対応したプレゼンテーションオブジェクトに渡します。例えば、「http://www.air-beat.com/Login.po」が要求されたときに、呼び出されるプレゼンテーションオブジェクトは「Login」です。このように、URLとPOが対応していることにより、ユーザーが要求する1URLごとに1つ以上のPOが必要となります。POは必ずcom.lutris.appserver.server.httpPresentation.HttpPresentationインターフェイスを実装しています。このインターフェイスには、run(HttpPresentationComms)というメソッドが定義されており、これに処理を記述することにより動的なコンテンツの生成を行います。そしてPOは要求を受け取ると、run()メソッドより開始し、処理が終了すると、クライアントに動的に生成したコンテンツをブラウザに返します。

 POの最小構成としては以上のとおりなのですが、実際にはまず元となるコンテンツ(HTMLファイルなど)があり、その一部を動的に変更してその結果をブラウザに返す、といった処理形態になるのが普通です。その場合は、元となるコンテンツとそれに対して変更を加えブラウザへ応答を返すといった処理を行うオブジェクトの2つの要素でPOが構成されることになります。

 実際にはコンテンツを生成するオブジェクトも処理オブジェクトも実態はJavaオブジェクトとして実装されることになります。そこで必要となるのが、次に説明するXMLCです。

XMLC、その利便性

 XMLC(XML Compiler)は、XMLまたはHTMLで記述されたコンテンツからJavaのクラスを生成するためのツールです。生成されたクラスはW3Cで標準化されているDOMの定義に従ったインターフェイスを持っていて、アプリケーション実行時に動的にそのコンテンツを変更することができるようになっています。また、コンテンツはアプリケーションの実行前にJavaのクラスにコンパイルされているので、実行時に動的に文書を生成するほかのテクニックに比べて、高速に動作するというメリットがあります。

 基本的にW3Cが提供するAPIの利用のみで、望みどおりにコンテンツを変更することができますが、XMLCは、さらに属性の変更などに関する追加のAPIを用意していて、より生産性の高い環境を提供しています。

 実際には、元となるHTMLファイルをXMLCが読み込んで2つのJavaクラスを生成します。1つは元となったHTMLファイルを吐き出すクラスです。このクラスは元となったHTMLの中に記述されたID属性の部分を操作するためのプロパティが用意されます。そして、もう1つはそのプロパティを操作してやるためのクラスです。このようにXMLCによって、出力するHTMLの構成を管理するクラスと、その中にコンテンツを動的に埋め込んでいくための処理を行うクラスを分離して開発することが可能になります。これによって、プレゼンテーション層における分業、すなわちデザインと処理の分離開発を進めることが可能となるのです。これはJSPなどと比較しても非常に大きな利点となっています。

 XMLCを利用したPOの開発における基礎知識について、Enhydraに付属のサンプルプロジェクトであるDiskRackのソースコードを手本として、簡単に説明しましょう。

●ID 属性と<SPAN>タグ
 ID属性は、HTMLドキュメント内の要素に名前を付けてXMLCがその要素に簡単にアクセスできるようにしたいときに使用します。また、インライン属性のタグやテキストなどの直接id属性を付加することができないものに対しては<SPAN>タグを使用して間接的にID属性(タグ内では「id」)を付加します。<SPAN>タグとID属性は、以下のHTMLの赤字部分です。

(ID属性使用例)
<HTML>
<HEAD><TITLE>Hello, World</TITLE></HEAD>
<BODY BGCOLOR=#FFFFFF TEXT="#000000">
<H1>Hello, World</H1>
<TABLE>
<TR id=TemplateRow>
<TD><SPAN id=Artist>Van Halen</SPAN></TD>
<TD><SPAN id=Title>Fair Warning</SPAN></TD>
<TD><SPAN id=Time>Good Stuff</SPAN></TD>
</TR>
</TABLE>
</BODY>
</HTML>

●XMLCプログラミングの方法
 XMLCを利用したプログラミングの例を以下に示します。

(Enhydraに付属するサンプルコード)

public class TableSample implements HttpPresentation {
  String[][] cdList =
  { { "Van Halen", "Ain't Talkin' 'Bout Love", "3:49" },
  { "THE BEATLES", "Help!", "2:24" },
  { "ANGRA", "Carry On", "5:03" } };
  public void run(HttpPresentationComms comms)
    throws HttpPresentationException {

    TableSampleHTML tshtml = new TableSampleHTML(); ……A

    HTMLTableRowElement templateRow =
      tshtml.getElementTemplateRow();
    templateRow.removeAttribute("id"); ……B

    Node cdTable = templateRow.getParentNode(); ……C
    for(int numDiscs = 0; numDiscs < cdList.length; numDiscs++) {
      tshtml.setTextArtist(cdList[numDiscs][0]); ……D
      tshtml.setTextTitle(cdList[numDiscs][1]);
      tshtml.setTextTime(cdList[numDiscs][2]);
      cdTable.appendChild(templateRow.cloneNode(true)); ……E
    }
    cdTable.removeChild(templateRow); ……F

    comms.response.writeHTML(tshtml.toDocument()); ……G
    }
}


(HTMLコンテンツ)
<HTML>
<HEAD><TITLE>Welcome to Air-Beat</TITLE></HEAD>
<BODY>
<H2 align=center>DiscList</H2>
<TABLE border=3>
<TR><TH>Artist</TH><TH>Title</TH><TH>Time</TH></TR>
<TR id=TemplateRow>
<TD><SPAN id=Artist>Van Halen</SPAN></TD>
<TD><SPAN id=Title>Fair Warning</SPAN></TD>
<TD><SPAN id=Time>Good Stuff</SPAN></TD>
</TR>
</TABLE>
</BODY>
</HTML>

 コードの各部分について解説しましょう。

(A)の部分
 コンテンツ(HTML)を保持しているオブジェクトをtshtmlに設定します。

TableSampleHTML tshtml = new TableSampleHTML();

(B)の部分
 テンプレートとなるTR要素(<TR id="templateRow"> ― </TR>)をtemplateRowに取得し、このTR要素からid属性を削除します。

HTMLTableRowElement templateRow = tshtml.getElementTemplateRow();
templateRow.removeAttribute("id");

(C)の部分
 上記のTR要素のすぐ上の階層の要素であるTABLEをcdTableに取得します。

Node cdTable = templateRow.getParentNode();

(D)の部分
 Artist、Title、Timeのid属性を持った<SPAN>要素内のテキストを変更します。

tshtml.setTextXXX(cdList[numDiscs][x]);

(E)の部分
 上記のTR要素の複製を生成し、そのTR要素をTABLE要素のすぐ下の階層に追加します(すなわち、テーブルの行が1行増加します)。

cdTable.appendChild(templateRow.cloneNode(true));

(F)の部分
 TABLE要素のすぐ下の階層に最後に追加された要素を削除します (ループ内で最後に追加された行は余分なので削除する必要があります)。

cdTable.removeChild(templateRow);

(G)の部分
 コンテンツをテキスト(HTML)で取り出し、ブラウザへ返します。

comms.response.writeHTML(tshtml.toDocument());

 ……と、長々と書いてきましたが、結局のところXMLCの利点とは「HTMLの中にID属性を記述するだけでよい」ということになります。違う言い回しをすると、「HTMLの中にはID属性しか記述できない」という方が正確かもしれません。つまりデザイナーはあくまでもデザインをきちんと行い、その成果物としてのHTMLファイルに対してID属性だけをきちんと追記してやれば、プログラミングロジックはすべて別のJavaクラスに記述することが可能なのです。

 こう書くとJSPであっても同様のように感じられるかもしれません。しかし、XMLCはJSPのようなuseBean宣言の必要はありません。どんなBeanが必要なのかなど考える必要さえありません。「何か」を行う対象の個所にさえID属性を記述しておけば、そのID属性の名称さえ気を付けておけばデザインはどんなふうに変更しても構わないのです。

 これは同じロジックを複数のケースで使いまわせる可能性を大きく高めます。例えばXMLCはWMLに対応しています。WMLというのは、携帯端末用のHTMLとでもいえる世界標準規格です(WAP方式での規格)。ここでイメージしていただきたいのは、例えばすでにHTMLで作成したWebサービスを携帯電話向けにWMLにも転用したいと考えた場合、WMLでデザインを行ったものに対してHTMLファイルと同様のIDタグを付与すれば、プログラミングロジックの転用ができるわけです。

 HTMLの中にID属性を記述する「だけ」であるため、HTMLの中についついプログラミングロジックを混入してしまうということはありません。もちろんJavaScriptを直接書くのであれば別ですし、Scriptletそのものを否定するつもりもありませんが、プログラマーの仕事がHTMLから完全に分離できるという点ではXMLCは非常に有用です。また、ID属性も<SPAN>タグもあまり一般的に多用されることはないかもしれませんがHTML4.0の標準であり、固有の独自タグを必要としない点は評価できると考えています。

開発の手順はどうなる?


Index
フリーAPサーバで音楽ダウンロードサイトを構築(後編)
「Enhydra」の開発スタイル
 
PCとは何か?
 XMLC、その利便性
 Javaで作られているメリット 
  開発の手順はどうなる?
 (1)Enhydraアプリケーションの作成
 (2)ID属性の埋め込み
 (3)XMLCコンパイル
 (4)POの作成
  遠隔地に離れたメンバー同士で開発
 デザイナーとプログラマの完全分業
 わずか3ヶ月間で構築を終了
フリーAPサーバで音楽ダウンロードサイトを構築
(前編 アプリケーションサーバ「Enhydra」で挑戦)




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間