Hyperwave は、Graz の において開発されました。
当初は Hyper-G という名前でしたが、
(1996年に)商品化された際に Hyperwave に変更されました。
Hyperwave はフリーソフトウエアではありません。
最新版は5.5で、
から得ることができます。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サーバーと通信するためのネットワークプロトコルは、(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 用に最適化されていますが、他のフォーマット
に使用することが可能です。
オブジェクトレコードの配列を返すいくつかの関数は、そのレコードに
関する統計情報を有する連想配列も返します。この配列は、オブジェク
トレコード配列の最後の要素です。統計配列には、次のエントリがあり
ます。
- Hidden
属性 PresentationHints が Hidden であるオブジェクトレコードの数
- CollectionHead
属性 PresentationHints が CollectionHead であるオブジェクト
レコードの数
- FullCollectionHead
属性 PresentationHints が FullCollectionHead であるオブジェクト
レコードの数
- CollectionHeadNr
属性 PresentationHints が CollectionHead であるオブジェクト
レコードの配列のインデックス
- FullCollectionHeadNr
属性 PresentationHints が FullCollectionHead であるオブジェクト
レコードの配列のインデックス
- Total
Total: オブジェクトレコードの数
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
がオブジェクトを返せば、より簡単になります。書き換えの規則は非常
に簡単です。
この状態で、全てのURLはHyperwaveサーバーのオブジェクトに関係付け
られています。これにより問題の解決が容易になります。'Hyperwave'
スクリプト以外の検索といった他のスクリプトを実行することはできま
せん。これは次のような別の規則により修正することができます。
これにより、ディレクトリ
/usr/local/apache/htdocs/hwが追加の
スクリプトや他のファイル用に確保されます。この規則は、一つ前の規
則よりも前に評価されることに注意して下さい。これには若干の欠点が
あります。つまり、
'hw/'で始まる名前を有する
Hyperwave オブジェクトは全て隠されてしまいます。このため、このよ
うな名前を使用しないようにして下さい。例えば画像用により多くのディ
レクトリが必要な場合、更に規則を加えるか一つのディレクトリに全て
を置くかして下さい。最後にRewriteEngineをオンにすることを忘れない
で下さい。
経験上、次のようなスクリプトが必要になることと思われます。
Rewrite Engineの一つの代わりとして、Apache
ErrorDocumentディレクティブを使用することもで
きます。しかし、ErrorDocument でリダイレクトさ
れたページは、POSTデータを受け取ることはできないことに注意して下
さい。