ハイパーグリッド

OpenSimulator のハイパーグリッド(HyperGrid)
こちらもご覧ください Grider; Virtual World Model; HyperGrid Team

ハイパーグリッドとは何ですか？
ハイパーグリッドは OpenSimulator の拡張機能で、これを使うことでインターネット上の他の OpenSimulator へリンクし、エージェント (Agent) をシームレスにこれらの OpenSimulator へ移動させることができるようになります. この機能はスタンドアロンモードでもグリッドモードでも使用できます. ハイパーグリッドは仮想空間がウェブへ登場するために大きく貢献しています.

ハイパーグリッドの基本的な概念は、地域／グリッドの管理者が他人が運営するハイパーグリッド地域のハイパーリンクを自分のマップ上に作成する、というものです. ハイパーリンクが作成されると、ユーザは自分の地域と同じようにリンク先の地域とも交流できます. 具体的にいうと、ユーザはその地域へテレポートすることができます. ユーザがハイパーリンク先の地域に到着すると、元々いた空間からログアウトせずにそのまま他の仮想空間に触れることになります. また、自分のインベントリには今まで通りアクセスできます.

ハイパーグリッドは GForge プロジェクトとして始まりましたが、今では OpenSimulator の標準パッケージに組み込まれています. OpenSimulator をハイパーグリッドモードで運用したい場合は、Installing and Running を参照してください.

仮想空間のハイパーリンク


ウェブのハイパーリンクはみなさんおなじみです. しかし、仮想空間のハイパーリンクとは何でしょうか？

ハイパーグリッド・モデルでは、仮想空間の 2D マップをウェブページと同じように考えます. 仮想空間のハイパーリンク自体は、マップ上の１つの地域を指します.

OpenSimulator をベースとした仮想空間の基本モデルでは、既にハイパーグリッドの概念をいくらか取り入れています. マップを使って別の地域にテレポートすると、自分のエージェントが他の OpenSimulator サーバに移動する可能性があります. この移動は「エージェント転送 (Agent Transfer)」という立派な名前で、既に稚拙ながらウェブに存在しているものです. ハイパーリンクが参照されたときに発生します. ただし、基本モデルでは、ハイパーリンクには２つの厳しい制約が課せられています.
 * 1) 地域のマップ全体をグリッドサービス(Grid Service)として知られるセントラルサービス(Central Service)で管理すること. このサービスで、空間の全体像を全ての地域に提供すること.
 * 2) 転送可能なエージェントは、ユーザサービス(User Service)と呼ばれる他のセントラルサービスが知っているユーザのものであること. 入ってくるユーザの情報がユーザサービスのデータベースに存在しなければ、エージェントの転送を行わない.

ハイパーグリッドは、単にこれらの２つの制約を取り払ったものです.

最初に、マップのコントロール機能をグリッドサーバからそれぞれの OpenSimulator インスタンスに移すことで、それぞれの OpenSimulator のローカルマップに「隣の地域 (Neightbers)」を追加できるようになっています（ただし、グリッド管理者が希望すれば、ハイパーリンクはグリッドサーバから提供するようにもできます）. こうすると、仮想空間はもっと面白く変化に富んだものになります. ある OpenSimulator で見ることのできるマップは、ハイパーリンクでテレポートすると、全く違うものになってしまいます. OpenSimulator の管理者として、マップに表示したい他の OpenSimulator を自由に設定することができます.

次に、知らないユーザ、例えば、他の仮想空間で登録したユーザなどのエージェントを転送できるようになっています. ハイパーグリッドでは、１つの中央集権的なユーザサービスを前提としたものではなく、世界中に無数に散らばったサービスで動作するようになっています. ハイパーグリッドに対応した OpenSimulator 間でエージェントが転送されると、ユーザに関する多くの詳細情報が渡ります. この情報の中には、転送を行うユーザが必要とする、サーバの一覧が含まれています.

利用シナリオ
ここに利用シナリオを一部紹介します. これらのシナリオの間に明確な区別はなく、だいぶ重なっています. これは排他的なリストではありません. この説明がハイパーグリッドを使ってみる際のヒントになればと思います. うまいシナリオがありましたら、どうぞこのリストに追加していってください.

ハイパーリンクとエージェント転送
OpenSimulator から他へリンクを作成すると、情報のリクエスト先であるリンク先の OpenSimulator にメッセージが送信されます. 取得する情報には、OpenSimulator をホストしているネットワークの情報、ローカルグリッドでの最初の地域の座標がリージョン・ハンドル形式で含まれます. 例えば、ノード x.com:9000 をリンクして、それを自分のローカルマップの 900, 900 に置こうとしているとします. 向こうの OpenSimulator では１つ以上の地域が稼働していて、それらの座標は向こうのローカルマップでは 900, 900 ではなく、最初の地域が 1100, 1100 にあるとします. こちらからすると、向こうの座標がどうなっていようと関係なく、知る必要もありません -- これに気づけば、2D マップで提供された「空間」の中心はどうでもいいということがわかります. 自分は 900, 900 に置きたいのですから. 向こうのシミュレータの「実際の」位置というのは、自分の空間から他の OpenSimulator へテレポートするときに、LindenLab ビューアが使用するだけです. この異なる座標間のマッピングが OpenSimulator のハイパーリンクの要となります. ハイパーグリッドの実装において、簡単だけど重要なことです. このマッピングは TeleportFinish イベントで発生します. ビューアにローカル座標を送信する代わりに、ハイパーグリッド・テレポート・ラッパーはリモート座標を送信します.

エージェントがハイパーリンクを使ってテレポートすると、次のようなことが起こります. まず、 InformRegionOfChildAgent の前に、"expect_hg_user" メソッドで、ローカルの OpenSimulator が当該ユーザが外部からやってくる旨をリモートの OpenSimulator に通知します. このメッセージは、ユーザサーバ、インベントリサーバ、アセットサーバなど、このユーザが使用する全てのサーバに行き渡ります. リモートの OpenSimulator はローカルのユーザ・プロフィール・キャッシュにそのユーザのエントリを作成しますが、ユーザ・データベースには作成しません. 外部ユーザの情報は永続させません. これが終わったら、通常のテレポートと全く同じようにテレポート処理されます. 唯一の違いは、リージョン・ハンドルが、リモート地域のローカルグリッドでのハイパーリンク座標を指すか、ローカルグリッドでの実際の座標を指すかが切り替わるぐらいです.

要約すると、ハイパーグリッドは新しい概念を２つ導入しました. ハイパーリンクという概念と、「ローカルユーザ(Local User)」「外部ユーザ(Foreign User)」という概念です.

インベントリへのアクセス
外部からのインベントリへのアクセスは従来のシーン・インベントリ会話処理 (Scene-Inventory Interactions) にコードを追加して、ユーザのアセットサーバからインベントリ・アセットを出し入れするようにラップすることで実現しています. インベントリにアクセスすると、ハイパーグリッド・ラッパーはユーザが外部ユーザかを判定し、そうであれば、ラッパーはユーザのアセットサーバから必要なアセットを取得して、ローカルのアセットキャッシュやサーバに格納します. その後、ラッパーは従来のインベントリアクセス関数に制御を引き継ぎます. インベントリに何か追加されると、ハイパーグリッド・ラッパーはイベントを起こして通知し、アセットをユーザのアセットサーバに入れます. やりとりされたアイテムの識別情報はキャッシュで管理されるため、アイテムの転送が繰り返し発生することはありません.

ハイパーグリッドに対応した OpenSimulator は結果として複数のアセットサーバとやりとりすることとなります. このやりとりは、複数の GridAssetClient インスタンスを作成することでわかりやすく実装されています.

ハイパーグリッドのクラス
現在、ハイパーグリッドは OpenSimulator 名前空間の外で実装されています. このため、従来の挙動と新しい挙動の間に明確な区別がついています. HyperGrid という独自の名前空間で実装されています. この中には、OpenSimulator のソフトウェア構成にならって、４つのサブの名前空間があります. これから、具体的に説明します.


 * OpenSim.Framework:
 * ForeignUserProfileData が UserProfileData を拡張し、ユーザの「ホーム」の情報を追加しています. 具体的には、ホームのアドレス、ポート、リモートのポートです. ユーザのホームはユーザのユーザサービスにおけるホームではありません. ユーザが自分でホームと決めた OpenSimulator になります. ホームへ戻る (Ctrl-Shift-H) を実現するために必要な処理です.
 * HGNetworkServersInfo は NetworkServersInfo の考え方を受け継ぎますが、継承や包含の関係ではありません. 今のところ、これはユーティリティクラスです. 主要な２つの機能で、サーバのドメイン名から IP アドレスを解決し、整形したものを bool IsLocalUser(...) に回答しています.


 * OpenSim.Region.Framework.Scenes.Hypergrid:
 * HGSceneCommunicationService は SceneCommunicationService を拡張し、RequestTeleportToLocation をオーバーライドしています. 基底メソッドに対して２つの非常に小さな、しかし重要な変更を行っています. (a) TeleportFinish イベントで、テレポート先地域がハイパーリンクの場合に、リージョン・ハンドルを切り替えています. (b) ハイパーリンクのテレポートに備え、終了時に必ずコネクションをクローズしています.
 * HGScene は Scene を拡張し、TeleportClientHome(...) をオーバーライドしています. 基底メソッドに対する唯一の変更は、ユーザサービスはまだ完全に外部ユーザのためにラップされていないため、暫定的にユーザサーバとの関係を切ったことです. ユーザサービスが適切にラップされれば、このクラスは不要となります.
 * HGScene.Inventory は HGScene の内部クラスです. このような実装は OpenSimulator フレームワークでよく見かけます. この HGScene の内部クラスでは、一部のインベントリ・シーン会話処理メソッドをオーバーライドし、ユーザのアセットサーバからの出し入れができるようになっています. 出し入れが完了したら、このメソッドは基底メソッドに制御を引き継ぎます.
 * HGAssetMapper: このクラスはハイパーグリッド専用で、ユーザがいる外部の地域とユーザのアセットサーバの間でアセットの出し入れの管理をします.


 * OpenSim.Region.Communications.HyperGrid は OpenSim.Region.Communications.* の寄せ集めです. ここにほとんどのハイパーグリッドの拡張機能が入っています. ハイパーグリッドのコミュニケーション処理で１つ余分な処理をしているのがその理由の１つです. その処理で、スタンドアロンをネットワーク接続可能にしています.
 * HGCommunicationsStandalone は CommuniationsLocal を拡張しています. 基底クラスと同じように、複数のネットワークを収容するハブとなっており、これはスタンドアロンモードで利用できます. 主な違いは、これらのサービスは OpenSimulator にあるサービスの拡張であることです.
 * HGCommunicationsGridMode は直接 CommunicationsManager を継承しています. これはグリッドモードで使用できるネットワークサービスのハブです. OpenSimulator の拡張となっています.
 * HGGridServices (基底クラス), HGGridServicesStandalone, HGGridServicesGridMode (サブクラス) は OpenSimulator のインターフェースである IGridServices と IInterRegionCommunications を実装しています. サブクラスの２つはそれぞれ LocalBackEndServices と OGS1GridServices のラッパーとなっています. ３つのクラスを通して、共通のパターンで実装されています. これから会話をする地域がハイパーリンクかを判定し、そうでなければ処理を LocalBackEndServices/OGS1GridServices に引き継ぎます. ハイパーリンクであれば、HGGridServices に処理を押し上げます. HGGridServices では、代わりに、ハイパーリンク地域の管理を行い、地域間連携プロトコルの２つの追加項目を指定します.
 * region_uuid: 地域をリンクする際に必要
 * expect_hg_user: expect_user インターフェースに似ていますが、転送するユーザに関するより詳細な情報が含まれます. 具体的には、ユーザの全てのサーバです（インベントリ、アセット、ユーザ、ホームなど）.
 * HGInventoryService は LocalInventoryService を拡張し、ISecureInventoryService を実装ています. このクラスはまさに野良処理の寄せ集めのようなクラスで、スタンドアロンユーザ向けのローカルのサービスアクセスと、外に出て行ったときのためのリモートのインベントリアクセスが混ざっています. 今のところは、OGS1InventoryService と OGS1SecureInventoryService を巻き込んで見苦しくなるのを避けるために、コピペを乱発しています. HGInventoryService はいつでも ISecureInventoryService です. 全てのメソッドは同じパターンになっています. ユーザがローカルのスタンドアロンユーザであるかを判定し、もしそうなら、（LocalInventoryService の）基底メソッドに処理を引き継ぎます. そうでないなら、セキュアなリモートアクセスを実施します.
 * HGUserServices は OSG1UserServices をラップしていますが、まだ動作しません.


 * OpenSim.Region.CoreModules.HyperGrid は３つの地域モジュールの集合です.
 * HGWorldMapModule は WorldMapModule を拡張しています. 基底クラスのものをほとんど再利用しています. 唯一の小さな変更は RequestMapBlocks で、オフラインのマップ閉塞信号をクライアントに送信しようとします.
 * HGStandaloneInventoryService と HGStandaloneAssetService は名前通りの処理を行います. これらはスタンドアロンのインベントリとアセットにアクセスする地域モジュールで、スタンドアロンユーザが出かけるときに動作します. 考え方としては、これらのモジュールと REST のインベントリ／アセットプラグインには多くの共通点があります. 残念ながら、プラグインは使えませんでした. プラグインは従来のインベントリ／アセットサーバで使用されていたインターフェースと完全に異なっていたからです. ハイパーグリッドへのアクセスは一貫したインターフェースでなければなりません.

インストールと実行
ハイパーグリッドのインストールと運用 を参照してください.

ハイパーグリッドとセキュリティ
Hypergrid Security を参照してください.

外部ユーザの BAN
Banning Foreign Users in Hypergrid を参照してください.

ハイパーグリッドの公開ノード
Public Hypergrid Nodes を参照してください.

ハイパーグリッドのリスト
Hypergrid Lists を参照してください.

開発者ミーティング
Hypergrid Meetings