Hyperwave は、Graz の IICM において開発されました。 当初は Hyper-G という名前でしたが、 (1996年に)商品化された際に Hyperwave に変更されました。 Hyperwave はフリーソフトウエアではありません。 最新版は5.5で、 http://www.hyperwave.com/ から得ることができます。30 日間試用可能な版を注文することができます。 Hyperwave API モジュールも参照し て下さい。 Hyperwave は、データベースに似た情報システム (HIS, Hyperwave Information Server)です。この システムは、文書の保存と管理に着目しています。文書には、あらゆる データとすることが可能で、同時にファイルに保存することもできます。 各文書には、オブジェクトレコードが付属しています。 オブジェクトレコードは、その文書のメタデータを有しています。 メタデータは、ユーザーにより拡張可能な属性のリストです。 ある種の属性は、Hyperwave サーバーにより常に設定されますが、 その他は、ユーザーにより修正可能です。 属性は、名前=値 という形式の 名前/値 の組です。 完全なオブジェクトレコードは、ユーザーの指定した数のこの 組を有することができます。 属性の名前は、ユニークである必要はありません。 例えば、title はオブジェクトレコードの中に複数回現れる 可能性があります。 これは、複数の言語で title を指定したい場合に意味があります。 このような場合、 各 title の値は、2文字の言語の短縮型の後にコロンが続くものを 前に置くという慣習があります。 例えば、 'en:Title in English' または 'ge:Titel in deutsch' 。 description または keywords のような他の属性は、潜在的な候補です。 残りの属性の値とコロンで区切ることにより他の文字列で言語の短縮形を 置換することも可能です。 各オブジェクトレコードは、各名前/キーの組で表した文字列であり、改 行で区切られています。Hyperwave拡張には、属性名をキーとした連想配 列としての第二の表現も有しています。多言語属性値は、それ自体で言 語の短縮形をキーとする別の連想配列を構成します。実際、複数の属性 は、属性値をキーとし、左にコロンがある文字列で連想配列を構成しま す。(これは完全に実装されていません。まだ、適正に処理されるのは、 属性 Title, Description, Keyword のみです。) 文書と共に文書中の全てのハイパーリンクは、同じくオブジェクトレコー ドとして保存されます。文書がデータベースに挿入される際には、文書 中のハイパーリンクは文書から取り除かれ独立したオブジェクトとして 保存されます。リンクに関するオブジェクトレコードは、リンクに関す る記述を開始した場所と終了した場所に関する情報を有しています。 オリジナルの文書を得るためには、リンクの無いプレーンな文書とリン クのリストを取り出し、リンクを再び挿入する必要があります。 (関数 hw_pipedocument() および hw_gettext() がこれを行います。) リンクを文書から分離する利点は明白です。リンクをされている文書が 名前を変更した場合でも、そのリンクは簡単に適宜変更可能です。 そのリンクを有する文書は、全く影響を受けません。 文書自体を変更せずに文書にリンクを追加することさえ可能です。 hw_pipedocument() および hw_gettext() が自動的にリンクの挿入を行う というのは、耳で聞く程簡単なことではありません。リンクの挿入は、 ある種のドキュメント階層の操作を含んでいます。Web サーバーではこ の機能はファイルシステムにより提供されますが、Hyperwave は固有の 階層を有しており、名前はその階層のオブジェクトの位置を反映しませ ん。このため、リンク作成時はまず Hyperwave の階層および名前空間か ら各Web名前空間の階層への対応付けを必要とします。HyperwaveとWebの 間の根本的な違いは、Hyperwaveでは名前と階層の間を明確に区別するこ とです。名前は、階層におけるオブジェクトの位置に関する情報を全く 有していません。Webでは、名前もオブジェクトの階層における位置に関 する情報を有しています。このため、対応付けには2種類の手法があります。 つまり、Hyperwaveの階層およびHyperwaveオブジェクトの名前がURLに反 映されたものまたは名前のみのどちらかです。簡単のため、第2の方法が 使用されます。 my_object という名前のHyperwaveオ ブジェクトは、Hyperwave階層のどこに位置するかによらず http://host/my_object に対応付けます。 Hyperwave階層においては、名前 parent/my_object を有するオブジェクトは、Hyperwave階層の my_object の子となります。 しかし、Web の名前空間では正反対となるため、ユーザーに混乱を生じる 可能性があります。これは、適当なオブジェクト名を選択することによっ てのみ防止することができます。 この選択により第2の問題が生じます。PHPをどうやって起動しますか? URL http://host/my_object は、例えば、Webサー バーに対してこのURLを http://host/php_script/my_object に書き換えさせ ない限り、いかなる PHPスクリプトもコールしません。 スクリプト php_script は $PATH_INFO 変数を評価し、Hyperwaveサーバーから 名前 my_object を有するオブジェクトを取得します。 一つだけ欠点がありますが、簡単に修正可能です。URLの書き換えは、そ のWebサーバー上の他のドキュメントにアクセスする時には許可されませ ん。Hyperwaveサーバーで検索を行うPHPスクリプトは実現不可能です。 このため、例えば http://host/Hyperwave で始まる ようなURLを除くような少なくとも第2の書き換え規則を必要とします。 上記の機構的なリンクは、他のドキュメントに挿入されます。 PHPがサーバーモジュールでもCGIスクリプトでもなく、例えばCD-ROM上 にHyperwaveサーバーの内容をダンプするといったスタンドアロンのアプ リケーションとして実行されている場合はより複雑になります。 このような場合、Hyperwave 階層を保ち、ファイルシステムに対応付けを 行う必要があります。 これは、(例えば、'/' を含む名前を選択することにより)固有の階層に 対応付けている場合には、オブジェクト名と衝突する可能性があります。 このため、'/' は他の文字、例えば '_' に置換されるべきです。 Hyperwaveサーバーと通信するためのネットワークプロトコルは、 HG-CSP (Hyper-G Client/Serverプロト コル)という名前です。このプロトコルは、例えばオブジェクトレコード を得るといったある動作を始めるためのメッセージに基づいています。 Hyperwaveサーバーの初期の版では、二つの専用クライアント (Harmony,Amadeus) がサーバーとの通信用に提供されていました。 これらは、Hyperwaveが商品化された際になくなりました。代わりに、 wavemasterが提供されました。wavemasterは、 HTTP か ら HG-CSP へのプロトコルコンバーターのようなもので す。これは、データベースの管理とドキュメントの可視化を全てWebイン ターフェースにより行うという考えによるものです。wavemasterは、イ ンターフェースをカスタマイズするための作業用に一連のプレースホル ダーを導入しています。この一連のプレースホルダーは、 PLACE 言語と呼ばれています。 PLACE は、通常のプログラミング言語の機能の 多くを欠いており、言語への拡張としては、プレースホルダーの リストを拡大するだけです。 このことは、JavaScript を使用することにより作業が楽になったわけでは ないということと類似しています。 Hyperwave サポートを PHP に付加することにより、インターフェース のカスタマイズ用のプログラミング言語を有していないという穴を 埋めることになります。 この機能は、 HG-CSP により定義された 全てのメッセージをサポートするだけでなく、 完全なドキュメントの取得といった更に強力なコマンドも提供します。 Hyperwave は、情報の特定の部分を名付けるために固有の用語法を 用います。 この方法は、広範に用いられ、拡張されています。 ほとんどすべの関数は、次のデータ型のどれかを操作します。 object ID: Hyperwave サーバーの各オブジェクトについてユニークな 整数値。オブジェクトレコード (ObjectID) の属性の一つでもあります。 object id は、オブジェクトを指定するための入力パラメータとして しばしば用いられます。 object record: attribute=value 形式の属性-値の組となる文字列。 この組は、復改文字で他と区切られています。 オブジェクトレコードは、 hw_object2array() により オブジェクトレコードに簡単に変換できます。 いくつかの関数は、オブジェクトレコードを返します。 これらの関数の名前は、obj で終わります。 object array: オブジェクトの全ての属性を有する連想配列。 キーは属性名です。ある属性が、 オブジェクトレコードに複数回現れる場合、別の添字または連想配列 が生成されます。(title,keyword,description のような) 言語に依存する属性は、省略語をキーとした連想配列として 作成されます。 他の複数の属性は、添字配列として作成されます。 PHP 関数は、オブジェクト配列を返しません。 hw_document: これは、完全に新規のデータ型であり、 HTML,PDF 等といった実際のドキュメントを保持します。 これは、幾分 HTML 用に最適化されていますが、他のフォーマット に使用することが可能です。 オブジェクトレコードの配列を返すいくつかの関数は、そのレコードに 関する統計情報を有する連想配列も返します。この配列は、オブジェク トレコード配列の最後の要素です。統計配列には、次のエントリがあり ます。 属性 PresentationHints が Hidden であるオブジェクトレコードの数 属性 PresentationHints が CollectionHead であるオブジェクト レコードの数 属性 PresentationHints が FullCollectionHead であるオブジェクト レコードの数 属性 PresentationHints が CollectionHead であるオブジェクト レコードの配列のインデックス 属性 PresentationHints が FullCollectionHead であるオブジェクト レコードの配列のインデックス Total: オブジェクトレコードの数 この拡張モジュールは、Hyperwaveサーバーを必要とします。このサーバー は、 http://www.hyperwave.com/ でダウン ロード可能です。 Hyperwaveサポートを有効にするには、 --with-hyperwave を指定してPHPをコ ンパイルする必要があります。 Hyperwave モジュールは、PHP が Apache モジュールとしてコンパイル された場合に、最適化されています。 この場合、Apache が書き換えエンジンを使用する場合、内部の Hyperwave サーバーをほぼ完全にユーザーから隠すことが可能です。 以下の手順によりこのことを説明します。 Hyperwaveサポートを有効にしてApacheに組み込んだPHPは、wavemaster に基づく本来のHyperwaveの手法を置換するものなので、Apacheサーバー は、Hyperwave Webインターフェースとしてのみ処理を行うと仮定します。 これは必然ではありませんが、設定が容易になります。考え方は非常に 簡単です。まず最初に $_ENV['PATH_INFO'] 変数を評 価し、Hyperwaveオブジェクトの名前としてその値を処理するPHPスクリ プトが必要です。このスクリプトを 'Hyperwave' と 呼びましょう。URL http://your.hostname/Hyperwave/name_of_object 'name_of_object' という名前のHyperwaveオブジェ クトを返します。オブジェクトの型に応じて、スクリプトは対応した処 理を行う必要があります。collectionの場合、恐らく子のリストを返す ことになります。ドキュメントの場合、MIME型と内容を返すことになり ます。Apacheの書換エンジンを使用した場合、若干の改善が見込まれま す。ユーザーの立場で見ると、URL http://your.hostname/name_of_object がオブジェクトを返せば、より簡単になります。書き換えの規則は非常 に簡単です。 オブジェクト自身を返す 検索を許可する 自分を定義する プロファイルを設定する オブジェクト属性を表示したり、ユーザーに関する情報を表示したり、 サーバーのステータスを表示したり等する追加される関数毎に一つ Rewrite Engineの一つの代わりとして、Apache ErrorDocument ディレクティブを使用することもで きます。しかし、 ErrorDocument でリダイレクトさ れたページは、POSTデータを受け取ることはできないことに注意して下 さい。 これらの関数の動作は、 php.ini の設定により変化します。 表 1Hyperwave設定オプション この拡張モジュールはリソース型を全く定義し ません。 これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。 まだやるべきことがいくつかあります。 hw_InsertDocument は、 hw_insertobject() と hw_putdocument() に分割する必要があります。 いくつかの関数の名前はまだ修正されていません。 多くの関数は最初のパラメータとして現在の接続 ID を 必要とします。これにより入力が多くかつ頻繁になってますが、 一つだけの接続をオープンしている場合には必要ないはずです。 デフォルト接続の導入により改善される見込みです。 多重属性を処理するには、オブジェクトレコードからオブジェクト配 列への変換機能が必要です。