本ドキュメントは、Servlet版の月山実行環境である「櫻花(おうか)」の製作者であるD.Miki氏が、
コンピュータ技術専門誌「XML PRESS」(技術評論社)に向けて書かれた原稿を元に編集、作成されました。
使用許諾条件 (2001年 6月 1日 現在)
風林火山は、GNU の GPL(General Public License)に基づく条件のもとで本ソフトウェアの利用を許諾します。
商標について
Javaおよび Java ベースの商標は、 Sun Microsystems, Inc. の米国、その他の国における商標または登録商標です。
Windows,Windows95, Windows98,WindowsMe, WindowsNT,Windows2000,Win32 は、Microsoft
Corporation の米国、その他の国における商標あるいは登録商標です。
UNIX は、X/Open Company Limited がライセンスしている米国ならびにその他の国における登録商標です。
上記以外の、このドキュメントに記載した社名および製品名などは、一般に各社の商標または登録商標です。
風林火山ではシナリオ記述言語としてGEML/GSMLを開発していました。
GEML/GSMLはXMLを応用した構造化言語で、従来の単純なテキストベースでのスクリプト言語よりもシナリオを明確に記述できるという利点を持っています。
当初、GEML/GSMLを閲覧する専用のアプリケーションとして月山が開発されました。
月山はJavaで開発されており様々に優れた機能を持っていましたが、反面、起動するためにJavaをインストールする必要があり一般ユーザが利用するには敷居が高いという問題点がありました。
また既存のGEML/GSML作成者からも、GEML/GSMLで作成したシナリオをWebで簡易に公開するための手段が欲しいという要求が挙がっていました。
そこでGEML/GSMLをHTMLに変換し、汎用的なHTMLブラウザで閲覧するための方法が風林火山でいくつか検討されました。
その一つとして、Servlet技術の応用を選択したのが櫻花です。
櫻花はGEML/GSMLを解釈し、それをHTMLに変換して出力するServletアプリケーションです。
櫻花はSession内部にシナリオの状態を保持しており、ユーザからのリクエストを元にシナリオを進めます。
また櫻花はサーバ側で画像を合成し、クライアント側には単一のJPEGファイルのみを送信します。
従って、ユーザはHTMLやJPEGを表示することのできるブラウザを用意するだけで、GEML/GSMLで記述されたシナリオを閲覧する事が可能になります。
櫻花はJavaアプリケーションなのでその実装の一部を月山と共有しています。
例えば、シナリオの分岐やフラグ状態の保持、それに画像の合成の部分がそれに当たります。
櫻花はシナリオ実行状況のセーブ/ロードに対応しています。
ユーザはシナリオを任意の場所で中断したり、再開したりといった使い方が出来ます。
櫻花の利用方法としては、以下の3通りを考えることが出来ます。
[図1:櫻花の利用形態]
コンテンツの作成
コンテンツ作成者はまず、GEML/GSMLを作成します。
これにはGEML/GSML専用エディタである厳島を利用しても良いですし、汎用のテキストエディタでももちろん構いません。
GEML/GSMLで利用する画像や音声については別途作成する必要がありますが、これらも特に何か特別なことをする必要はありません。
通常通り作成頂けば良いかと思います。
コンテンツの公開
出来あがったGEML/GSMLは、公開されている任意のWebサーバに配置して下さい。
これは、どこでも構いません。
配置するサーバ上で櫻花が稼動している必要はなく、櫻花の稼動しているサーバからコンテンツが参照できれば問題ありません。
櫻花はユーザからのリクエストを受けて自分自身でコンテンツを探しに行きますので、公開するだけであれば、コンテンツ作成者の側で櫻花を意識する必要はありません。
コンテンツへのリンク
ご自分でWebサイトを公開されているコンテンツ作成者の方だと、自前のWebサイトからGEML/GSMLのコンテンツにリンクを張りたいということがあるかと思います。
その場合には、以下のようにリンクを記述する事で、コンテンツのトップへのリンクを張ることが可能です。
<A HREF="http://(櫻花Servletが利用可能なサーバ)/(櫻花へのPATH).../org.wffm.ooka.OokaServlet?gemlurl=(櫻花へのパラメータが記述されたGEMLファイルへのURL)">...</A>
ご自身で設置したGEML/GSMLへ直接リンクするのではなく、櫻花へのリンクのパラメータの一部としてGEMLファイルの場所を指定するという点に注意が必要です。
また、GSMLではなくGEMLを指定するという点も、間違えやすいところかもしれません。
コンテンツへのURLは「http://...」といったように、省略せずに指定して下さい。
?マークの意味などについては別途、HTMLの解説書などをご覧下さい。
ちなみに、風林火山の方で設置している公開テストサーバを使って、サンプルシナリオを表示させるためのリンクは以下のようになります。
<A HREF="http://izumo.ph.ns.musashi-tech.ac.jp/miki/servlet/org.wffm.ooka.OokaServlet?gemlurl=http://izumo.ph.ns.musashi-tech.ac.jp/miki/xmlday5/xmlday5.geml">...</A>
結局のところ、コンテンツの作成者にとっては月山も櫻花も関係なく、単にGEML/GSMLを作成すれば良いだけです。
コンテンツ作成者にかかる追加の負担は、どこかの公開サーバに配置する手間だけという事になりますが、これは月山と同梱してCD-ROMなどで配布する際の手間と比べると、どっこいどっこいと言えるかもしれません。
一度作成したコンテンツは内容を変更することなしに、月山でも櫻花でもどちらでも公開可能ですので作成者にとってみれば公開手段の選択肢が広がったと言えるかもしれません。
次にユーザが櫻花を利用してGEML/GSMLを閲覧する方法を詳しく説明します。
Webブラウザを起動する
まずは何をおいてもブラウザを用意して頂く必要があります。
ベータ版の櫻花ではブラウザ依存を可能な限り無くしてありますので、お手元のいつも使っているブラウザで問題ありません。
一応、GEML/GSMLでは画像を利用する事が多いですので、画像の表示できるブラウザであることが望ましいですが、テキストのみのブラウザでも動作しない事は無いと思います。
櫻花サーバにアクセスする
次に、起動頂いたブラウザで櫻花が利用可能なサーバにアクセスして下さい。
例えば、風林火山の方で用意した公開テストサーバにアクセスする場合には以下のようにURLを入力頂ければ完了です。
http://izumo.ph.ns.musashi-tech.ac.jp/miki/servlet/org.wffm.ooka.OokaServlet
ブラウザには図2のような画面が表示されることと思います。
[図2:櫻花サーバの初期画面]
※コンテンツ作成者が自身のWebページからリンクを張っている場合には、それを辿って頂くだけでシナリオを開始することが出来ますが、ここではユーザがシナリオの場所を指定する方法を説明します。
シナリオ環境(GEML)を呼び出す
表示された画面のテキストフィールドに、閲覧したいシナリオ環境(GEML)へのURLを入力して下さい。
URLは「http://...」といったように、省略せずに指定して下さい。
例えば、風林火山で用意しているサンプルシナリオを閲覧するには、以下のように入力します。
http://izumo.ph.ns.musashi-tech.ac.jp/miki/xmlday5/xmlday5.geml
入力が完了した後、「LOAD」ボタンをクリックして頂くと、図3のような画面が表示されると思います。
[図3:シナリオのメニュー画面]
シナリオ(GSML)を開始する
シナリオのメニュー画面には「START」「LOAD」「EXIT」の3つのボタンがあります。
通常、シナリオを始めて開始するには「START」ボタンをクリックして下さい。
シナリオが開始され、図4のようにGSMLの内容がHTMLに変換されて表示されます。
以前にシナリオを実行したことがあり、セーブデータを保存している場合には、この画面からそれを用いて続きを再開することも可能です。
再開するには「LOAD」ボタンを用います。
詳細については後述します。
「EXIT」ボタンはシナリオの実行を中断するのに用います。
クリックすると、櫻花の初期画面に戻ります。
[図4:シナリオ開始後の画面]
シナリオを実行する
以上で、シナリオを開始することが出来ました。
シナリオが開始されると、画面上にはシナリオの内容とともに「NEXT」「SAVE」「LOAD」「MENU」「EXIT」の5つのボタンが常時表示されます。
シナリオを進めるためには「NEXT」ボタンを用います。
画面に選択肢のラジオボタンが存在する場合には、適宜それを選択してから進んで下さい。
「SAVE」ボタンをクリックすると、セーブデータをダウンロードすることが出来ます。
ファイルダイアログボックスから保存したい場所に保存して下さい。
ファイル名は何でもいいのですが、「sample20010401_a.dat」のように、シナリオ名と日付を入れておくことをお勧めします。
「LOAD」ボタンをクリックすると、シナリオを中断してシナリオ再開画面に移動します。
シナリオ再開画面については後述します。
「MENU」と「EXIT」はシナリオを中断するために使用します。
「MENU」はシナリオのメニュー画面へ、「EXIT」は櫻花の初期画面に戻ります。
[図5:セーブデータ保存の様子]
シナリオの続きから再開する
シナリオの実行途中で「LOAD」ボタンをクリックすると、図6のようなシナリオ再開画面が表示されます。
シナリオを再開するためには、以前にセーブデータをダウンロードしておく必要があります。
画面に表示されているテキストフィールドに保存しておいたセーブデータへのPATHを入力して下さい。
例えば、WindowsでC:\tempフォルダに保存している場合などには、以下のように指定します。
C:\temp\sample20010401_a.dat
直接指定するのが面倒な場合には、テキストフィールドの横にある「参照」ボタンをクリックして下さい。
ファイルの場所を選択するためのファイルダイアログボックスが開きます。
保存しておいたセーブデータを選択すれば、画面上に反映されます。
テキストフィールドへの入力が完了した後、「LOAD」ボタンをクリックすればシナリオが再開されます。
なお、シナリオの再開をキャンセルしたい場合には「BACK」ボタンをクリックして下さい。
中断していたシナリオに戻り、続行することが出来ます。
ちなみに、シナリオのメニュー画面にもシナリオ再開画面と同様に、テキストフィールドと「LOAD」ボタンがあります。
使い方も全く同じです。
[図6:シナリオ再開画面]
以上で、ユーザが櫻花を利用してGEML/GSMLで記述されたシナリオを閲覧するための方法の解説を終わります。
櫻花はSessionを用いて各ユーザを個別に扱って居ますので、複数のユーザが同時に別途のシナリオを閲覧することも可能です。
なお、ブラウザの「戻る(back)」ボタンによるリクエストは無効扱いしますので、「戻る(back)」ボタンはお使いになれません。ご注意下さい。
[図7:櫻花の画面遷移]
本章ではサーバ管理者として櫻花を運用する場合について簡単に解説します。
WindowsMe上で櫻花を構築する例を追っていきますので、UNIXなど他のOSで設置を試みる場合には、PATHの記述などを適宜読み換えて下さい。
実際に櫻花が稼動し始めると、サーバ管理者が行なうことはそれを眺めるだけになります。
もちろん、櫻花も含めたサーバ全般の日常的な管理は随時行なう必要がある訳ですが、櫻花Servletの稼動後に特別な作業が追加になるようなことは通常ありえません。
Javaの実行環境を構築する
櫻花はJavaでコーディングされたServletアプリケーションですので、Javaの実行環境が必要です。
Javaの実行環境にはいくつかのバージョンがありますが、櫻花はJava2SDK1.3で開発で行なわれました。
おそらくJava2SDK1.2以降相当の環境であれば動作するのではないかと思われます。
確認はしていませんが、それ以前のバージョンについては動作しないと予想されます。
実行環境があれば十分ですので、開発キット(JDK)でなく実行ランタイム(JRE)でもいいはずです。
JavaServletAPIを入手する
ServletのAPIはJavaの標準APIではなく、拡張APIという位置付けになっています。
そのため、標準の実行環境にはその実行のためのライブラリが付属していません。
櫻花Servletの構築のために、JavaServletAPI をJavaの実行環境とは別途に入手する必要があります。
JavaServletAPI にはいくつかのバージョンがありますが、櫻花の動作確認はJSDK2.0で行なわれました。
それ以降のバージョンであれば、櫻花は問題なく動作すると思われます。
Servletエンジンを構築する
ServletはServletエンジンの管理下で稼動します。
従って櫻花Servletの構築の前に、Servletエンジンが動作するWebサーバーを構築する必要があります。
Servletエンジンにもメーカ製品からフリーのものまで、いくつかの実装が提供されています。
大抵のServletエンジンであれば問題なく櫻花が稼動するかと思います。
今回、櫻花の動作確認はApacheJServで行ないました。
ApacheJServはフリーのServletエンジンですのでネットからダウンロードして入手することが出来ます。
Setupに従い、適宜インストールして下さい。
Servletの環境設定を行なう
さて、ここまでで櫻花Servletの構築の為に必要なアプリケーション/ライブラリ類が一通り揃った事になります。
次に行なうのは、それらを適切に組合せて櫻花を稼動させるための環境を整えることです。
そのためにはいくつかの設定ファイルを編集する必要があります。
ここでは櫻花を稼動させるための必要最低限の情報に絞って、解説したいと思います。
ただしその前に最低限、Javaの実行確認とWebサーバの稼動確認は行なっておいた方が良いかと思います。
設定が悪いのかと思いきや、実はWebサーバが全然動いていなかったということは良くあるからです。
可能であればServletエンジンについても簡単な稼動確認をしておきたいところですが、それが出来る方はこの部分を読むまでもないような気もしますね。
本例における、ここまでの作業でのフォルダ構成のうち、説明に関係する部分は図8のようになっています。
[図8:サーバのフォルダ構成]
httpd.conf
httpd.confはApacheの設定ファイルです。
昔のバージョンではこのファイル以外にいくつかの設定ファイルが在りましたが、いまではこのファイルを編集するだけで良いようになっているようです。
このファイル内に、ApacheがApacheJServと連携して動作するための設定を記述する必要があります。
ただし、現状ではApacheJServとの連携設定の部分を別ファイルとして記述し、そのファイル内容をhttpd.conf内にIncludeさせることが多いようです。
連携部分の設定をC:\ApacheJServ\confフォルダのjserv.confに記述し、httpd.confには以下の行を追加します。
Include "C:\ApacheJServ\conf\jserv.conf"
実は正常にApacheJServがインストールされていれば、この部分はApacheJServのインストーラが行なってくれているはずなのですが、念のため一度は確認して置くことをお勧めします。
jserv.conf
先ほどhttpd.confで指定した設定ファイルです。
ここにはApacheとApacheJServを連携動作させるための設定をまとめて記述しておくことになります。
ほとんどの記述は初期設定のままで良いのですが、一部分についてはその記述内容を確認しておくことをお勧めします。
ApJServProperties "C:\ApacheJServ\conf\jserv.properties"
ApJServPropertiesはApacheJServのための設定ファイルを指定するための項目です。
これは初期設定のままでよいですが、ファイル名とPATHは確認しておきましょう。
ApJServMount /servlets /root
ApJServMountは、Webサーバ(この場合はApache)でのURL位置とApacheJServ内部のServletの論理位置とを関連付けるための項目です。
Servletの論理位置は後述するzonesの設定で決まりますので、それを任意のURLに対応付けて下さい。
ここでは/rootという論理位置を、http://hogehoge/servletsといったURLに関連付けています。
jserv.properties
jserv.conf内で指定した、ApacheJServの設定ファイルです。
ここにはServletエンジンを起動するための設定を記述します。
やはりほとんどの記述は初期設定のままでよいのですが、いくつかの内容については確認しておくことをお勧めします。
wrapper.bin=C:\jdk1.3\bin\java.exe
wrapper.binには、ApacheJServが動作するためのJavaの実行環境を指定します。
本例では、C:\jdk1.3\binフォルダのjava.exeを使用していますので、それを指定します。
インストールがきちんと出来ていればここは自動で設定されているはずですが、お使いのJava実行環境が指定されているかどうかを確認しておくことをお勧めします。
wrapper.classpath=C:\jsdk2.0\jsdk.jar
wrapper.classpath=C:\ApacheJServ\ApacheJServ.jar
wrapper.classpathにはApacheJServが動作するために必要となる拡張ライブラリを指定します。
通常必要となるのはJavaServletAPIとその実装クラス群ですが、人によってはここに色々なライブラリを指定することもあるようです。
本例では、JavaServletAPIとして用意しておいたC:\jsdk2.0\jsdk.jarを指定しています。
これらの指定もインストール時に自動で設定されるはずですが、一度は確認しておくことをお勧めします。
zones=root
zonesはApacheJServ内のServletの論理位置を追加するための項目です。
論理位置はApacheの実URLと関連付けされて、外部に公開されます。
ここではrootというzoneを追加しておきました。
root.properties=C:\servlets\zone.properties
root.propertiesはrootというzoneの設定を記述するファイルを指定するための項目です。
ちなみにもしhogeというzoneを追加した場合には、その設定ファイルの指定のための項目はhoge.propertiesとなります。
本例では、櫻花のライブラリをC:\servletsというフォルダに置く事にし、そこにzone.propertiesという設定ファイルも置くことにしました。
以上で、櫻花を稼動させるための環境設定は終了です。
櫻花Servletを構築する
いよいよ櫻花を構築しましょう。
とは言っても、単に櫻花のライブラリをzone.properties内のrepositries項目で指定した場所に配置するだけです。
設置が完了したら、Apacheを起動させ、お手元のブラウザでアクセスしてみましょう。
前章で見てきたような画面が表示されれば、無事完了です。
櫻花の環境変数を設定する
上記までで櫻花を稼動させることができるようになりました。
余談ですが、以下では櫻花の起動時オプションについて解説します。
櫻花は起動時のオプションとして以下のような項目に対応しています。
ookaTitle
設置した櫻花サーバの名称を設定することが出来ます。
ここで指定された名称は、櫻花の初期画面のタイトルとして使用されます。
デフォルトは「OokaStartupPage」です。
ookaImage
設置した櫻花サーバのイメージ画像のURLを設定することが出来ます。
ここで指定した画像は、櫻花の初期画面で表示されます。
指定しなかった場合、画像は表示されません。
defaultGeml
櫻花の初期画面のシナリオを指定するフィールドに初期表示されるシナリオのURLを指定出来ます。
指定しなかった場合には何も表示されません。
以上、簡単ですが櫻花Servletの構築について解説しました。
WindowsMeではUNIXなどと違いユーザの権限の設定などがありませんので、そういった点についての記述は省いてあります。
UNIXなどのユーザ権限の設定できるOSを利用する場合には、それらの設定にも十分注意する必要があるかと思います。
櫻花はJavaのプログラムですので、Javaのコーディングについての知識があれば、カスタマイズすることが可能です。
櫻花の仕組み自体をカスタマイズする必要はあまり無さそうですので、ここでは櫻花が出力するHTMLをカスタマイズする方法を解説します。
櫻花で、HTMLを出力している部分はorg.wffm.ooka.processパッケージです。
パッケージ内には以下のようなクラスが含まれています。
OokaProcess
HTMLを出力するクラス群に共通なインターフェイスを定義しています。
実際にはHTMLを出力するだけでは無く、GSMLの内容解釈全般を扱うためのインターフェイスですが、今回はHTMLの出力に絞って解説します。
OokaProcessFactory
各種のOokaProcessを生成するためのFactoryです。
GSMLの内容はGElement(月山要素)というクラスに保持されています。
OokaProcessFactoryは受け取ったGElementを調べて、それに対応する適切なOokaProcessを生成します。
OokaCut
櫻花ではGSMLをcutタグ単位に解釈、表示します。
そのため、内容解釈の基本単位として主な処理をOokaCutというクラスの中にまとめてあります。
とはいっても、実質的な処理は前述のOokaProcessFactory内で行なっていますので、OokaCut自体をカスタマイズする必要はほとんど無いでしょう。
OokaProcessAudio
cutタグ内のaudioタグを取り扱うクラスです。
ベータ版では、単に内部の属性をテキストとして表示させているだけです。
カスタマイズの余地が大いにあります。
OokaProcessImagelist
cutタグ内のimagelistタグを取り扱うクラスです。
画像合成の指示やIMGタグの出力など、かなり込み入った処理を担当していますので、櫻花の振る舞いをしっかり理解するまでは手を出さないほうが無難です。
OokaProcessPlugin
cutタグ内のpluginタグを取り扱うクラスです。
ベータ版では、単に内部の属性をテキストとして表示させているだけです。
OokaProcessAudioと同じく、カスタマイズの余地が大いにありますが、どうカスタマイズすればいいのかがまだよく分かっていません。
OokaProcessSelection
cutタグ内のselectionタグを取り扱うクラスです。
選択肢の保持やINPUTタグの出力など、これまた込み入った処理を担当していますので、OokaProcessImagelistと同じく手を出さないほうが無難です。
カスタマイズに失敗すると最悪の場合、櫻花の挙動がおかしくなります。
OokaProcessText
何度も同じ事を書いているようで恐縮なのですが、cutタグ内のtextタグを取り扱うクラスです。
ベータ版では、単に内部の属性をテキストとして表示させているだけですが、これは今後のバージョンでも変わらないと思います。
カスタマイズの必要もほとんど無いと思います。
OokaProcessTimer
cutタグ内のtimerタグを取り扱うクラスです。
ベータ版では、単に内部の属性をテキストとして表示させているだけです。
OokaProcessAudioとか同じく、カスタマイズの余地が大いにありますが、HTMLとしてtimer機能をどう扱うべきなのかが謎なので、たぶんカスタマイズの必要はありません。
OokaProcessOthers
cutタグ内に含まれるタグのなかで、上記した以外のタグを取り扱うクラスです。
ベータ版では、サポートしていないことを示すメッセージをテキストとして表示させているだけです。
さて、OokaProcessAudioをカスタマイズすることを試みます。
ベータ版では単にタグの内容をテキストとして出力しているだけですが、これをEMBEDタグとして出力させることにします。
まず、OokaProcessAudio内でカスタマイズの対象となる部分を見ることにします。以下のようになっています。
public void process(OokaRequest req, OokaStatus status){ status.addContent(new Text("Audio: " + ge.getAttributeValue("file"))); status.addContent(new Tag("BR")); status.addContent(new Text(" Layer: "+ ge.getAttributeValue("layer"))); status.addContent(new Text(" /Command : "+ ge.getAttributeValue("command"))); status.addContent(new Tag("BR")); }
public void process(OokaRequest req, OokaStatus status){ Tag embed = new Tag("EMBED"); embed.put(new AttrDefault("AUTOSTART", "false")); embed.put(new AttrDefault( "SRC", ge.getBaseURL().toString() + ge.getAttributeValue("file") )); status.addContent(embed); status.addContent(new Tag("P")); }
org.wffm.ooka.OokaRequest
櫻花が受け取ったユーザからのリクエストを取りまとめるためのクラス。
javax.servlet.http.HttpRequestからの情報や、GEML内に記述されているシナリオ環境などを保持している。
ここからHTMLに必要な情報を取得することができる。
org.wffm.ooka.OokaStatus
シナリオの現在の状態を保持するクラス。
ユーザに送るコンテンツ内容や合成すべき画像の情報、選択肢の状態などを格納している。
各OokaProcessはこのOokaStatusに対して、処理の結果を反映させる。
OokaStatusに格納された処理結果をもとに櫻花はユーザとのやり取りを制御するが、その辺の仕組みを理解するには前述のOokaRequestも含めたorg.wffm.ookaパッケージ全体を理解する必要がある。
上級者はそれに挑戦してみるのも一興かも。
org.wffm.ooka.doc.html.Tag
HTMLのタグを出力するためのクラス。
子ノードとして別途のTagインスタンスを保持することができる。
また、後述のAttrを属性として保持することもできる。
基本的に、各OokaProcessはTagクラスを用いて文書ツリーを生成するためだけに存在しているといっても過言ではない。
org.wffm.ooka.doc.html.Attr
Tagに属性を追加するためのクラスが実装すべきインターフェイス。
実装クラスとしては通常、AttrDefaultを使用する。
他にもリンクのHREF属性を生成するのに便利なAttrQueryURLというものもある。
org.wffm.ooka.doc.htmlパッケージには前述のTagクラス他にも、HTMLを生成する際に便利なクラスが含まれているので、興味がある場合には参考にするとよいかも。
org.wffm.gassan.model.scenario.GElement
GEML/GSMLを読み込んだ結果を保持するためのクラス。
このクラスは月山と共通のライブラリの中に含まれている。
OokaProcessは大抵、このGElementのインスタンスを保持しており、ここからシナリオの内容を取得して解釈処理を行う。
ちなみにGElement「G」は月山の「G」。
詳細については、別途公開されている櫻花ライブラリのAPIドキュメントを参照下さい。
以上で、櫻花のカスタマイズについての解説を終わります。
Copyright © 2001 著作権はすべて風林火山に帰属します。
Copyright © 2001 WFFM. All Rights Reserved.