Google

NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7">

XXXVIIIHyperwave 関数

導入

Hyperwave は、Graz の IICM において開発されました。 当初は Hyper-G という名前でしたが、 商品化された際(恐らく 1996 年でした)に Hyperwave に変更されました。

Hyperwave はフリーソフトウエアではありません。 最新版は4.1で、www.hyperwave.com から得ることができます。30 日間試用可能な版を注文することができます。

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/php3_script/my_object' に 書き換えさせない限り、いかなる PHPスクリプトもコールしません。 スクリプト 'php3_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 用に最適化されていますが、他のフォーマット に使用することが可能です。

オブジェクトレコードの配列を返すいくつかの関数は、そのレコードに 関する統計情報を有する連想配列も返します。この配列は、オブジェク トレコード配列の最後の要素です。統計配列には、次のエントリがあり ます。

Hidden

属性 PresentationHints が Hidden であるオブジェクトレコードの数

CollectionHead

属性 PresentationHints が CollectionHead であるオブジェクト レコードの数

FullCollectionHead

属性 PresentationHints が FullCollectionHead であるオブジェクト レコードの数

CollectionHeadNr

属性 PresentationHints が CollectionHead であるオブジェクト レコードの配列のインデックス

FullCollectionHeadNr

属性 PresentationHints が FullCollectionHead であるオブジェクト レコードの配列のインデックス

Total

Total: オブジェクトレコードの数

Apache との組み合わせ

Hyperwave モジュールは、PHP が Apache モジュールとしてコンパイル された場合に、最適化されています。 この場合、Apache が書き換えエンジンを使用する場合、内部の Hyperwave サーバーをほぼ完全にユーザーから隠すことが可能です。 以下の手順によりこのことを説明します。

Hyperwave サポートを有効にして Apache に組み込んだ PHP は、 wavemaster に基づく本来の Hyperwave の手法を置換するものなので、 Apache サーバーは、Hyperwave Web インターフェースとしてのみ 処理を行うと仮定します。 これは必然ではありませんが、設定が容易になります。 考え方は非常に簡単です。 まず最初に 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 がオブジェクトを返せば、より簡単になります。書き換えの規則は非常 に簡単です。

RewriteRule ^/(.*) /usr/local/apache/htdocs/HyperWave/$1 [L]

この状態で、全ての URL は Hyperwave サーバーのオブジェクトに 関係付けられています。これにより問題の解決が容易になります。 'Hyperwave' スクリプト以外の検索といった他のスクリプト を実行することはできません。 これは次のような別の規則により修正することができます。

RewriteRule ^/hw/(.*) /usr/local/apache/htdocs/hw/$1 [L]

これにより、ディレクトリ /usr/local/apache/htdocs/hw が 追加のスクリプトや他のファイル用に確保されます。 この規則は、一つ前の規則よりも前に評価されることに注意して下さい。 これには若干の欠点があります。 つまり、'hw/' で始まる名前を有する Hyperwave オブジェクトは 全て隠されてしまいます。 このため、このような名前を使用しないようにして下さい。 例えば画像用により多くのディレクトリが必要な場合、 更に規則を加えるか一つのディレクトリに全てを置くかして下さい。 最後にRewriteEngineをオンにすることを忘れないで下さい。

RewriteEngine on

経験上、次のようなスクリプトが必要になることと思われます。

  • オブジェクト自身を返す

  • 検索を許可する

  • 自分を定義する

  • プロファイルを設定する

  • オブジェクト属性を表示したり、ユーザーに関する情報を表示したり、 サーバーのステータスを表示したり等する追加される関数毎に一つ

Todo

まだやるべきことがいくつかあります。

  • hw_InsertDocument は、hw_InsertObject() お よびhw_PutDocument() に分割する必要があります。

  • いくつかの関数の名前はまだ修正されていません。

  • 多くの関数は最初のパラメータとして現在の接続 ID を 必要とします。これにより入力が多くかつ頻繁になってますが、 一つだけの接続をオープンしている場合には必要ないはずです。 デフォルト接続の導入により改善される見込みです。

  • 多重属性を処理するには、オブジェクトレコードからオブジェクト配 列への変換機能が必要です。

目次
hw_Array2Objrec --  オブジェクト配列からオブジェクトレコードに属性を変換する
hw_changeobject --  オブジェクトの属性を変更する(古い関数)
hw_Children -- 子のオブジェクト ID
hw_ChildrenObj -- 子のオブジェクトレコード
hw_Close -- Hyperwave 接続を閉じる
hw_Connect -- 接続をオープンする
hw_connection_info --  Hyperwaveサーバへの接続に関する情報を出力する
hw_Cp -- オブジェクトをコピーする
hw_Deleteobject -- オブジェクトを削除する
hw_DocByAnchor -- アンカーに属するオブジェクトのオブジェクト ID
hw_DocByAnchorObj -- アンカーが指すオブジェクトレコード
hw_Document_Attributes -- hw_document のオブジェクトレコード
hw_Document_BodyTag -- hw_document の BODY タグ
hw_Document_Content -- hw_documentの内容を返す
hw_Document_SetContent -- hw_document の内容を設定/置換する
hw_Document_Size -- hw_document のサイ?
hw_dummy --  Hyperwaveダミー関数
hw_EditText -- テキストドキュメントを取得する
hw_Error -- エラー番号
hw_ErrorMsg --  エラーメッセージを返す
hw_Free_Document -- hw_document を解放する
hw_GetAnchors -- ドキュメントのアンカーのオブジェクト ID
hw_GetAnchorsObj -- ドキュメントのアンカーのオブジェクトレコード
hw_GetAndLock --  オブジェクトレコードを返しおよびオブジェクトをロックする
hw_GetChildColl -- 子のコレクションのオブジェクト ID
hw_GetChildCollObj -- 子のコレクションのオブジェクトレコード
hw_GetChildDocColl -- コレクションの子ドキュメントのオブジェクト ID
hw_GetChildDocCollObj -- コレクションの子ドキュメントのオブジェクトレコード
hw_GetObject -- オブジェクトレコード
hw_GetObjectByQuery -- オブジェクトを検索する
hw_GetObjectByQueryColl -- コレクションのオブジェクトを検索する
hw_GetObjectByQueryCollObj -- コレクションのオブジェクトを検索する
hw_GetObjectByQueryObj -- オブジェクトを朧Ԣする
hw_GetParents -- 親のオブジェクト ID
hw_GetParentsObj -- 親のオブジェクトレコード
hw_getrellink --  rootidに相対的なsourceからdestへのリンクを得る
hw_GetRemote -- リモートドキュメントを得る
hw_GetRemoteChildren -- リモートドキュメントの子を得る
hw_GetSrcByDestObj -- オブジェクトを指すアンカーを返す
hw_GetText -- テキストドキュメントを取得する
hw_getusername -- 現在ログインしているユーザーの名前
hw_Identify -- ユーザーとして認証する
hw_InCollections --  コレクションにオブジェクト ID があるかどうかを確認する
hw_Info -- 接続に関する情報
hw_InsColl -- コレクションを挿入する
hw_InsDoc -- ドキュメントを挿入する
hw_insertanchors --  textにアンカーのみを挿入する
hw_InsertDocument -- ドキュメントをアップロードする
hw_InsertObject -- オブジェクトレコードを挿入する
hw_mapid -- グローバルIDを仮想的なローカルIDに割りつける
hw_Modifyobject -- オブジェクトレコードを修正する
hw_Mv -- オブジェクトを移動する
hw_New_Document -- 新しいドキュメントを作成する
hw_Objrec2Array --  属性をオブジェクトレコードからオブジェクト配列に変換する
hw_Output_Document -- hw_document を出力する
hw_pConnect -- 持続的データベース接続を作成する
hw_PipeDocument -- ドキュメントを取得する
hw_Root -- ルートオブジェクト ID
hw_setlinkroot --  計算されたリンクのIDを設定する Set the id to which links are calculated
hw_stat --  ステータス文字列を返す
hw_Unlock -- オブジェクトをアンロックする
hw_Who -- 現在ログイン中のユーザーのリスト