(57)【特許請求の範囲】
【請求項１】
複数のデータオブジェクトの一致を保持する方法であって、動作可能なようにネットワークによって相互に接続された複数のコンピュータのうちの異なる一つのコンピュータによって、各データオブジェクトが保持される方法において、前記複数のコンピュータのうちの第１のコンピュータにおいて受信したユーザ入力に応答して、
前記第１のコンピュータによって保持されている前記データオブジェクトのうち第１のデータオブジェクトを修正する現在オペレーションを前記第１のコンピュータが実行するステップと、
同期化メッセージを前記第１のコンピュータがフォーマット化するステップと、
前記第１のコンピュータから他の前記複数のコンピュータに前記同期化メッセージを伝送するステップと
を備え、前記同期化メッセージは、
前記現在オペレーションを示すデータと、第１のコンピュータと他の複数のコンピュータとの同期を可能とするように前記他の複数のコンピュータに前記現在オペレーションを実行可能にするデータと、前記現在オペレーションを実行するためのオペレーションの段階を識別する実行段階のデータとを含む現在オペレーションパラメータと、
前記第１のコンピュータによって実行される従前オペレーションを示すデータと、前記従前オペレーションが前記第１のコンピュータによって実行されたオペレーションの段階を示す実行段階データとを含む従前オペレーションパラメータと、
前記第１のコンピュータの一意的な優先順位を、前記他の複数のコンピュータに関連して示すパラメータと
を有することを特徴とする方法。
【請求項２】
前記従前オペレーションパラメータは、前記複数のコンピュータのうち、直前のオペレーションを開始する一つのコンピュータを示すパラメータをさらに含み、該一つのコンピュータは、前記第１のコンピュータ以外であることを特徴とする請求項１に記載の方法。
【請求項３】
前記第１のコンピュータから前記他の複数のコンピュータに伝送するステップは、ピアツーピアネットワーク伝送を用いて伝送するステップを含むことを特徴とする請求項１に記載の方法。
【請求項４】
前記第１のコンピュータによる前記他のコンピュータへの伝送を可能にするため、前記第１のコンピュータにおいて前記他の複数のコンピュータ各々のネットワーク識別情報を記憶するステップをさらに備えたことを特徴とする請求項３に記載の方法。
【請求項５】
前記優先順位を示すパラメータは、前記第１のコンピュータのネットワーク識別情報を含むことを特徴とする請求項３に記載の方法。
【請求項６】
請求項１に記載の方法を実施するコンピュータプロセッサによって実行するための命令を記憶したことを特徴とするデータ記録媒体。
【請求項７】
複数のデータオブジェクトの一致を保持するコンピュータ実装方法であって、動作可能なようにネットワークによって相互に接続された複数のコンピュータうちの異なる各コンピュータによって各データオブジェクトは保持され、前記方法は、前記データオブジェクトのうちの第１のデータオブジェクトを保持するため、前記複数のコンピュータのうち第１のコンピュータにおいて実行される方法において、
前記複数のコンピュータのうちの第２のコンピュータから同期化メッセージを前記第１のコンピュータが受信するステップと、
前記第１のコンピュータが正しい実行段階にある場合、前記第１のコンピュータにおける現在オペレーションパラメータの示すオペレーションを実行することによって前記複数のデータオブジェクトのうちの第１のデータオブジェクトを前記第１のコンピュータが更新するステップと
を備え、前記同期化メッセージは、現在オペレーションパラメータと、従前オペレーションパラメータと、他の複数のコンピュータに関連した第２のコンピュータの優先順位を示すパラメータとを有し、
前記現在オペレーションパラメータは、
前記第２のコンピュータによって実行された第１のオペレーションを示すデータと、第１のコンピュータと第２のコンピュータとの同期の効果をなすように前記第１のデータオブジェクトを操作するために第１のコンピュータにおける第１のオペレーションを実行するため要求されるデータと、前記第１のオペレーションが前記第２のコンピュータによって実行されたオペレーション段階を示す第１の実行段階パラメータと、第２のコンピュータを示す値とを含み、
前記従前オペレーションパラメータは、
第１のオペレーションを実行する前に第２のコンピュータで実行された第２のオペレーションを示すパラメータと、前記第２のオペレーションが前記第２のコンピュータによって実行されたオペレーションの段階を示す第２の実行段階パラメータと、前記第２のオペレーションを開始するコンピュータの識別情報（ｉｄｅｎｔｉｔｙ）とを含むことを特徴とする方法。
【請求項８】
前記第２のオペレーションを開始するコンピュータの識別情報は、前記開始するコンピュータのネットワーク識別情報を含むことを特徴とする請求項７に記載の方法。
【請求項９】
前記第１のコンピュータが正しい実行段階にある場合、更新するステップは、前記現在オペレーションパラメータと、前記第１のコンピュータで記憶されるローカル状態データに対する従来オペレーションパラメータとを比較するステップであって、そこでは、前記ローカル状態データは現在実行段階および最後に実行のオペレーションを示すステップと、
第１のコンピュータにおける現在オペレーションの段階が第１の実行段階パラメータによって示された前記実行段階に対応し、前記従前オペレーションパラメータが前記第１のコンピュータにおいて実行される実行オペレーションを前記ローカルの状態データが示している場合、前記第１のオペレーションを実行するステップと
をさらに有することを特徴とする請求項７に記載の方法。
【請求項１０】
前記第１のコンピュータにおける現在実行段階が、前記第１の実行段階パラメータによって示される前記オペレーション実行段階よりも早い場合、待ちリストに前記同期化メッセージを記憶するステップをさらに備えたことを特徴とする請求項９に記載の方法。
【請求項１１】
前記同期化メッセージを記憶するステップは、
前記待ちリストから同期化メッセージを削除するステップをさらに有し、
前記同期化メッセージは、より低い実行優先順位と、前記同期化メッセージと同一の第１の実行段階パラメータ値と、前記同期化メッセージと同一の第２の実行段階パラメータ値とを有することを特徴とする請求項１０に記載の方法。
【請求項１２】
前記第１の実行段階パラメータによって示された実行段階に引き続く実行段階に前記第１のコンピュータがあることを前記ローカルの状態データが示す場合、
前記第１のコンピュータによって実行されたオペレーションの記録（ｊｏｕｒｎａｌ）を探索して、前記第１のオペレーション段階パラメータによって示されたのと同一の実行段階において実行され記録されたオペレーションの位置を探索するステップと、
前記記録されたオペレーションが前記第１の同期化メッセージに関する前記実行の優先順位よりも低い実行の優先順位を有する場合、前記記録されたオペレーションと引き続くオペレーションをアンドゥし、前記第１の同期化メッセージによって示されるオペレーションを実行するステップと
をさらに備えたことを特徴とする請求項９に記載の方法。
【請求項１３】
前記記録されたオペレーションと、引き続くオペレーションとをアンドゥするステップは、前記従前オペレーションパラメータが、前記記録されたオペレーションの実行前に実行されたのと同一のオペレーションを示す場合にのみアンドゥを行うステップを有することを特徴とする請求項１２に記載の方法。
【請求項１４】
前記記録されたオペレーションと引き続くオペレーションをアンドゥするステップは、アンドゥされたオペレーションを引き続きの再実行可能とするため、待ちキューに前記アンドゥされたオペレーションの各々を記憶するステップを有することを特徴とする請求項１２に記載の方法。
【請求項１５】
前記記録されたオペレーションが、前記第１の同期化メッセージに関する前記実行の優先順位よりも高い実行の優先順位を有する場合、待ちリストに前記第１の同期化メッセージを記憶するステップを備えたことを特徴とする請求項１２に記載の方法。
【請求項１６】
請求項７に記載の方法をコンピュータプロセッサにより実行する命令を記憶したことを特徴とするデータ記録媒体。
【請求項１７】
コンピュータシステムにおいて、
プロセッサと、
該プロセッサに結合され、複数の他のコンピュータシステムと前記コンピュータシステムとを動作可能なように結合するネットワークインタフェースと、
前記プロセッサに結合され、他の前記複数のコンピュータにおいてコピーされたローカルデータのコピーである第１のデータオブジェクトを記憶するメモリと、
該第１のデータオブジェクトの同期化の効果をなすオペレーションを記録するメモリを有し、前記第１のデータオブジェクトの処理の効果をなすデータを前記プロセッサが記録するように構成されたローカル状態モジュールと、
前記プロセッサおよび前記メモリに結合され、前記複数の他のコンピュータシステムにおいて記憶されているデータオブジェクトのコピーでもって前記第１のデータオブジェクトの一致を前記プロセッサが保持するよう操作する一致モジュールとを備え、
前記モジュールは、メモリに格納されたプログラムであり、前記プロセッサにより実行され、
前記保持は、受信した同期化メッセージの処理に基づいて実行され、
当該受信した同期化メッセージは、
他のコンピュータで実行された第１のオペレーションを示すデータと、前記他のコンピュータにおいて記憶されたデータオブジェクトと前記第１のデータオブジェクトとの同期の効果をなすように前記第１のデータオブジェクトを処理するために前記第１のオペレーションを実行するために要求されるデータと、前記第１のオペレーションが前記他のコンピュータによって実行されるオペレーションの段階を示す第１の実行段階パラメータと、前記他のコンピュータを示す値とを含む現在オペレーションパラメータと、
前記第１のオペレーションの実行前に前記他のコンピュータによって実行された第２のオペレーションを示すパラメータと、前記第２のオペレーションが前記複数の他のコンピュータにおいて実行されたオペレーションの段階を示す第２の実行段階パラメータと、前記第２のオペレーションを開始するコンピュータの識別情報とを含む従前オペレーションパラメータと
前記第１のオペレーションの一意的な優先順位を、前記他のコンピュータに関連して示すパラメータと
を有することを特徴とするシステム。
【請求項１８】
前記ローカル状態モジュールは、
前記現時点でのオペレーションパラメータおよび前記従前オペレーションパラメータと、前記第１のデータオブジェクトの処理に関する前記システムの現時点での段階および前記第１のデータオブジェクトの効果をなす最後のオペレーションを示す前記ローカル状態モジュールによって保持されるデータとを比較する処理と、
前記システムが正しい実行段階にある場合、現在オペレーションパラメータによって示されるオペレーションを実行することによって前記第１のデータオブジェクトを更新するよう、前記一致モジュールに命令する処理と、
前記システムが、前記第１の実行段階パラメータによって示されるより早い実行段階にある場合、待ちリストに前記同期化メッセージを記憶する処理と、
より低い実行優先順位と、前記同期化メッセージと同一の第１の実行段階パラメータ値と、前記同期化メッセージと同一の第２の実行段階パラメータ値とを有する前記同期化メッセージを、前記待ちリストから削除する処理とを
前記プロセッサに実行させるための、記憶された命令を有することを特徴とする請求項１７に記載のシステム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、共同作業システム（ｃｏｌｌａｂｏｒａｔｉｖｅ  ｗｏｒｋ  ｓｙｓｔｅｍ）のためのコンフリクトの解決の方法およびシステムに関する。
【０００２】
【従来の技術】
発明の背景
共同アプリケーションは、しばしばグループウェアアプリケーションと呼ばれるが、異なるコンピュータを各々が使用する２以上の者が、仮想的な作業空間の共通する画面を共有し、そのような作業空間において共有されたデータオブジェクトの処理を取り扱うことができる。通常は、共同アプリケーションのコピーが各ユーザのコンピュータにおいて実行され、作業空間をシミュレートし、共同して処理され表示されているデータのローカルコピーを取り扱う。例えば、共同しての描画アプリケーションは、１つのグループのコンピュータの各々において同一の描画を表示させることができ、それらのコンピュータの各々のユーザは、他のユーザが変更した画像をもとにその描画を変更することができる。これを行う一つの方法は、各ユーザのコンピュータに共有されたデータオブジェクトのローカルコピーを提供することである。共有されたデータオブジェクトは、共同アプリケーションユーザのローカルコピーによって処理される。共有されたデータオブジェクトのローカルコピーは、他のコンピュータにおいて保持されている共有されたデータオブジェクトのコピーと同期を取るため、コンピュータ間で同期化メッセージを交換する。例えば、共有されたワープロ（ｗｏｒｄ  ｐｒｏｃｅｓｓｉｎｇ）のアプリケーションにおいて、第１のコンピュータのユーザが、ドキュメントのあるパラグラフを削除すると、他のコンピュータにメッセージが送られて、共同アプリケーションのコピーに対して命令され、共有されたデータオブジェクトから同一のパラグラフを削除することができる。
【０００３】
グループウェア設計者が直面する一つの問題は、共有されたデータオブジェクトが一致した状態で保持されることを保証することである。適切な制御がなされない場合、同時発生のコンフリクトおよび一時的なエラーのため、共有されたデータオブジェクトの異なる処理が発生するかもしれない。これらのエラーは、オーダリングまたはシーケンシングエラーとも呼ばれるが、同期化メッセージが異なるコンピュータにおいて異なる順番で受信および／または処理される場合に発生することがある。
【０００４】
一時的なエラーは、同期化メッセージが、異なるコンピュータに異なる順番で到達する場合に発生する。これは、例えばコンピュータ間での異なるネットワーク遅延のため発生しうる。結果として、異なるコンピュータにおいて、同期化オペレーションについての別のシーケンスが実行されるかもしれない。異なるコンピュータにおいて、一致した結果となるように、オペレーションが行われることを保証することにより、並行（ｃｏｎｃｕｒｒｅｎｃｙ）制御で一時的なエラーに対処（ａｄｄｒｅｓｓ）することができる。大まかに言うと、このような一致制御は、「楽観的」か「悲観的」（すなわち、非楽観的）のいずれかとして、性格付けることができる。悲観的なシステム、例えばレコードロッキング（ｒｅｃｏｒｄ  ｌｏｃｋｉｎｇ）またはセマフォア（ｓｅｍａｐｈｏｒｅ）は、適正な順序でオペレーションの受信と実行の双方が行われることを保証することができる。しかし、悲観的システムは、共有されたデータオブジェクトにアクセスする場合に高遅延を有する可能性があり、この遅延のため、リアルタイムな共同システムにおいて、悲観的な制御を使用することができないかもしれない。
【０００５】
【発明が解決しようとする課題】
楽観的システムは、順番に関係なくオペレーションを受信し、および／または実行することを許容する。楽観的システムは、悲観的システムに比べ相対的に低遅延であり、したがって、リアルタイムユーザの体感（ｅｘｐｅｒｉｅｎｃｅ）を改善する可能性がある。しかし、楽観的システムは、複雑なエラー検出を使用して、順番が変わったオペレーションを修復するように対処する必要がある。一つの修復手法は、到着するのが早すぎるオペレーションをキューに登録するか、さもなくば、実行され順番が変わってしまったのオペレーションを元に戻して（ｕｎｄｏ）、再度、順に実行することである。別の手法は、受信した順番が異なるオペレーションを新しいセットのオペレーションに修正する変換を行うことである。この変換による手法においては、オペレーションに変換処理を適用すると、異なる実行シーケンスでも同一の結果を生み出すことができる。図１は、２つのメッセージ処理シーケンス（それぞれ図１の右側と左側に示される）を示している。左側のシーケンスは、コンピュータ１０１でオペレーションαが実行され、次に（オペレーションβを変換した）β’が実行されることを示している。このシーケンスは、コンピュータ１０２においてβが実行され次に（オペレーションαを変換した）α’が実行される、図１の右側に示されるシーケンスと同一の効果を有する。図１に示されるオペレーション変換手法では変換行列が要求されるが、多くのアプリケーションにとってこれを定めることは、困難であるかまたは不可能である。
【０００６】
【課題を解決するための手段】
データ一致の問題を取り扱うためにいくつかの解決方法が存在するが、ソフトウェア開発者の個々の設計のニーズに対処する（ａｄｄｒｅｓｓ）ため、並行処理のシステムを追加することによりソフトウェア開発を改善することができる。
【０００７】
発明の要約
一般的に、ある形態では、本発明は、複数のコンピュータでコピーされるデータオブジェクトの一致を保持する方法に特徴がある。各データオブジェクトは、ネットワークにおいてピアツーピア型で交換される同期化メッセージの処理に基づいて、異なるコンピュータによって保持される。同期化メッセージは、現在（ｃｕｒｒｅｎｔ）オペレーションパラメータと従前（ｐｒｅｖｉｏｕｓ）オペレーションパラメータとを含み、これらパラメータを情報処理して、コピーされたデータオブジェクトをどのように何時、取り扱うべきかを決定する。現在オペレーションパラメータは、１つのオペレーション、すなわち、同期化メッセージを受信するコンピュータにおいてデータオブジェクトを更新するために実行（すなわち、実施）されるオペレーションを識別する。現在オペレーションパラメータは、送信側コンピュータと同期を取ることができるように、受信側コンピュータにその現在オペレーションを実行可能にさせるデータをも含む。そのオペレーションの正しい実行タイミングを特定するため、実行段階パラメータも送信される。従前のオペレーションパラメータにより、送信側コンピュータにより実行された従前のオペレーションと、送信側コンピュータで従前のオペレーションが実行された実行段階と、従前のオペレーションを開始した最初のコンピュータとを識別する（例えば、示された従前のオペレーションを送信側コンピュータに実行するよう、その前、命令していた第３のコンピュータの識別）。現在および従前のオペレーションパラメータに含まれるデータは、コンフリクトの別のタイプの内容（ｓｃｅｎａｒｉｏｓ）を検出するために用いられる。同期化メッセージに含まれるデータは、また、他のコンピュータに対する送信側コンピュータの一意の優先順位も示す。
【０００８】
【発明の実施の形態】
実施例は、１つまたは２つ以上の以下の利点を含む。このコンフリクトの解決方法は、複合のデータ構造で動作し、アプリケーション性能と遅延応答に最小限の影響しか与えず、ワークステーション間のメッセージ通信量が増加することはない。本発明の１つまたは２つ以上の実施形態の詳細が、図面および以下の説明に示される。本発明の他の態様、目的、利点は、以下の説明と図面および特許請求の範囲から明らかであろう。
【０００９】
本発明の詳細な説明
図２は、ピアツーピア型でネットワークに接続された一群のコンピュータ２０１〜２０３を示している。コンピュータ２０１〜２０３は、共同して修正するデータ（共有されたデータオブジェクト）をユーザに許容するグループウェアアプリケーションを実行する。図３は、グループウェアアプリケーションの構造を示す。アプリケーション３０１は、コンピュータ２０１〜２０３の各々でコピーされた共有されたデータオブジェクト３０５に関して動作するための機能（ｆｕｎｃｔｉｏｎａｌｉｔｙ）３０４を含む。機能３０４は、例えば計算機支援設計の機能とすることができ、共有されたデータオブジェクト３０５は、３次元オブジェクトのモデルを表現することができる。アプリケーション３０１は、また、各ピア（ｐｅｅｒ）２０１〜２０３にメッセージを配信（すなわち、送信）し、ネットワーク３０８経由でメッセージを受信するメッセージ配信コンポーネント３０２を含む。コンポーネント３０２によって配信されるメッセージは、データ３０５を処理するアプリケーション３０１により実行されるオペレーションを詳述することができる。例えば、メッセージは、コンピュータ２０１によってコンピュータ２０２〜２０３に送られ、指定されたアプリケーションの機能（ｆｕｎｃｔｉｏｎ）を実行するようコンピュータ２０２〜２０３に命令することができる。そうすることで、コンピュータ２０１からのメッセージは、並行で共有のデータオブジェクト３０５のローカルコピーについての同期をコンピュータ２０２〜２０３にとらせることが可能となる。また、中央の同期サーバを必要とすることがない。
【００１０】
図４は、配信コンポーネント３０２によって交換される同期化メッセージのために使用するメッセージフォーマット４０１を示している。メッセージ４０１は、アプリケーション３０１によって実行するために機能３０４を指定し、このような機能を実行するための関連するデータを含むオペレーションセクション４０２を含む。例えば、計算機支援設計アプリケーションのためのオペレーションセクション４０２は、３次元モデルデータ３０５を修正するためのアプリケーション機能３０４をトリガするデータを含む。メッセージ４０１は、またコンフリクトの解決およびピア２０１〜２０３の間の共有されたデータオブジェクト３０５の一致を保証するために使用されるデータを含むタイムスタンプセクション４０３をも含む。
【００１１】
配信コンポーネント３０２において、別のコンピュータからメッセージを受信した場合、配信コンポーネント３０２は、一致コンポーネント３０３にそのメッセージを送る。一致コンポーネント３０３は、メッセージオペレーション４０２がアプリケーション機能３０４によって直ちに処理されるべきか、または待ちリスト３０７に置かれるべきか否かを決定する。ある場合は、一致コンポーネント３０３は、１つまたは２つ以上前に実行されたオペレーションを、より最近受信したオペレーション４０２を実行する前に（例えば、「アンドゥ」関数を使って）取消して元に戻さなければならないことを決定する。
【００１２】
オペレーション巻戻し（ｒｏｌｌ−ｂａｃｋ）は、一連の従前の実行されたオペレーションおよび共有のデータオブジェクト３０５に対するデータ変更とを詳述するジャーナル３０６（すなわち、巻戻しキュー）を格納することによってサポートされる。あるケースでは、回数制限のないアンドゥオペレーションがサポートされ、他のケースでは、特定の実施形態でサポートされるアンドゥオペレーションの回数は、経験的に決定される（すなわち、データ同期アルゴリズムの機能を有効にするのに必要なサイズとして「最良の推定」が存在するかもしれない）。したがって、ジャーナル３０６のサイズは調整可能である。信頼性のある同期オペレーションを保持するためにアプリケーション３０１がサポートする必要のある巻戻しオペレーションの回数は、ネットワーク遅延、オペレーションを入力し処理することが可能なスピードおよびそのアプリケーションにとって許容できるエラートレランスレベルに依存するであろう。巻戻しを使用して、順不同の実行（別称、オーダリングエラー、シーケンシングエラーまたは一時的なエラー）を修正する。シーケンシングエラーを修正するため、一致コンポーネント３０３は、１つまたは２つ以上の巻戻しオペレーションを実行するための機能３０４をトリガする。オペレーションが巻戻されると、それらは待ちキュー３０５上で戻される。単一のオペレーションは、別のメッセージが他のコンピュータから到着する順番に依存する巻戻しと再実行の双方に関係するかもしれないため、これが必要となる。
【００１３】
一致コンポーネント３０３は、また同時的コンフリクトを管理する。同時的コンフリクトは、２つの異なるコンピュータにおけるオペレーションが同時に（すなわち、同一のシーケンスの位置で）実行されると考えられるとき発生する。ある実施例では、待ちリスト３０７は、アンドゥ機能と共に順番のコンフリクトを解決するために使用され、優先順位のスキームは、同時的コンフリクトを管理するために使用される。優先順位のスキームは、一群の同時的なオペレーションのいずれが実行されるべきかを決定するため、異なる優先順位を割り当てる処理を含むことができる。本発明で用いられるように、オペレーションは、同一の絶対的または論理的時間に、またはオペレーションのシーケンスにおける同一の位置で発生するため、「同時的」と考えることができる。
【００１４】
同時的オペレーションの例は、以下の状況において発生する。（ｉ）コンピュータ２０１〜２０３の全てが１０個のオペレーションを実行していて、（ｉｉ）コンピュータ２０１および２０２のユーザが各々独立して、もう一つのオペレーションを入力し、（ｉｉｉ）コンピュータ２０１は、その新しいオペレーションメッセージをコンピュータ２０２から新しいオペレーションのメッセージを受信する前に、コンピュータ２０２〜２０３に伝送し、および（ｉｖ）コンピュータ２０２はその新しいオペレーションメッセージをコンピュータ２０１から新しいオペレーションメッセージを受信する前に、コンピュータ２０１、２０３に伝送する。この場合、コンピュータ２０１および２０３の各々は、同一のカウンタ４０６の値（すなわち値１１）でメッセージをコンピュータ２０３に送信した。カウンタ値が同一であるため、これらのメッセージの各々によって定められたオペレーションはコンピュータ２０３では同時的（すなわち、コンピュータ２０１〜２０２においてメッセージが生成される（普通の時計によって計測されるような）絶対的な時間にかかわらず、一連のオペレーションの中で同一のシーケンス番号を持つ）と考えられる。
【００１５】
一致のコンポーネント３０３は、一群の同時的なオペレーションのいずれが実行されるか、およびいずれが拒絶されるかを決定するための優先順位のスキームを用いて同時的エラーを解決する。優先順位のスキームは、多くの異なる攻め方（ｓｔｒａｔｅｇｉｅｓ）を用いて優先順位を割り当てることができる。その攻め方には、メッセージ４０１を生成するコンピュータの一意的な名称またはネットワークアドレスに基づくアルファベット順、特定のオペレーション４０２に基づいて優先順位の転換、ネットワーク条件に基づいて決定される優先順位（例えば、より高い帯域幅で接続されたクライアント２０１は、より低い帯域幅で接続されたクライアント２０２の上の優先順位を有する。その逆もまた同じ）などが含まれる。
【００１６】
ワークステーション２０１〜２０３によるメッセージの伝送および処理は、図２〜６を参照して説明されるであろう。簡潔にするため、図５では、コンピュータ２０１〜２０３は、それぞれ「Ａ」、「Ｂ」および「Ｃ」と表し、コンピュータ「Ａ」からのメッセージの優先順位は、「Ｂ」および「Ｃ」からのものより高く、「Ｂ」からのメッセージの優先順位は、「Ｃ」からのものより高くする。最初に、各コンピュータ「Ａ」、「Ｂ」、「Ｃ」（２０１〜２０３）における一致コンポーネント３０３は、ローカルカウンタの値が０（ＬＣA＝ＬＣB＝ＬＣC＝０）、ジャーナル３０６が空（すなわち、ヌル（ｎｕｌｌ））および待ちリスト３０７が空である。さらに、コンポーネント３０３は、共同のグループの内にある全てのコンピュータ（「Ａ」、「Ｂ」、「Ｃ」）のリストおよび共有されたデータオブジェクト３０５の同一のコピーを有する。
【００１７】
時刻ｔ1において、コンピュータ「Ａ」のユーザは、「Ａ」において実行される共有のデータオブジェクト３０５のローカルコピー上で、アプリケーション指定のオペレーション（Ａ1）を実行する（ステップ６０１〜６０２）。「Ａ」はそのローカルカウンタの値ＬＣAをインクリメント（すなわち、ＬＣA＝ＬＣA＋１＝１）させる（ステップ６０３）。オペレーションＡ1は、メッセージ５０１および５０２の中にフォーマットされ（ステップ６０４）、「Ｂ」および「Ｃ」に（フォーマット４０１のメッセージを用いて）送られる（ステップ６０５）。メッセージ５０１、５０２の各々を生成するため、パラメータ４０２〜４０９は、もとのコンピュータ「Ａ」によって設定（ｆｉｌｌｅｄ−ｉｎ）される。一般に、パラメータ４０２〜４０９はメッセージ５０１と５０２の各々で同一となるであろう（しかし、他のパラメータ、例えばアドレシング情報が、メッセージ４０１に追加され、結果としてメッセージ５０１と５０２とで相違が生じることがあり得る）。オペレーションパラメータ４０２は、アプリケーション指定のパラメータであり、特定の共同アプリケーションのファンクションおよびそれらのファンクションのために必要なデータに依存するであろう。例えば、ＣＡＤアプリケーションでは、パラメータ４０２は、個々のオペレーション（例えば、エクストルード（ｅｘｔｒｕｄｅ）、カット（ｃｕｔ）、フィレット（ｆｉｌｌｅｔ）、サイズ（ｓｉｚｅ））を指定する。この個々のオペレーションを「Ａ」のユーザがモデル上またはモデルのコンポーネントおよびデータ上で要求（例えば、ｅｘｔｒｕｄｅ  １０ｍｍ、ｆｉｌｌｅｔ  ｐａｒｔ  ＩＤ＃ＡＢＣなど）する。
【００１８】
タイムスタンプパラメータ４０３は、「Ａ」における一致コンポーネント３０３により保持されるデータを用いて設定される。タイムスタンプ４０３は、２つのサブグループを含む：（ｉ）現在オペレーションのタイムスタンプ（ＣＯＴ）パラメータ４０４〜４０６、および（ｉｉ）従前のオペレーションのタイムスタンプ（ＰＯＴ）パラメータ４０７〜４０９。ＣＯＴパラメータは、現在オペレーション４０２に関連するタイミングおよびシーケンシングの情報を伝達するのに対し、ＰＯＴパラメータは履歴データを伝達し、同一のシーケンス値４０６を有するオペレーションを、２つのコンピュータから送信することにより生じるコンフリクトを識別するために使用する。
【００１９】
オペレーション識別子パラメータ４０４は、メッセージ４０１によって要求されたオペレーションを識別する。パラメータ４０４は、パラメータ４０２のデータと冗長性を有することもあり、したがって、実施例によっては、選択によりパラメータ４０４を削除してもよい。トランスミッタ名パラメータ４０５は、送信側コンピュータ「Ａ」と共同する他のコンピュータ「Ｂ」および「Ｃ」とを区別するための一意的な名前を用いて設定される。トランスミッタ名は、「Ａ」に割り当てられるネットワーク名、ユーザ名、ネットワークポート番号（例えば、イーサネット（登録商標）アドレス）、ランダムな番号またはその他の一意的な名前の一意の組み合わせとすることができる。したがって、異なる一意的な名前は、同期が取られるデータ３０５の各一意のコピーに関連する。
【００２０】
ローカルカウンタ値４０６は逐次インクリメントする値であり、特定のオペレーションおよびメッセージ（例えば５０１）が、実行されたオペレーション／受信されたメッセージ５０１〜５０６のシーケンスの中のどこにあるかを示している（すなわち、オペレーションが行われた場合、それはコンピュータのオペレーション上の段階を示している）。したがって、この例では、「段階」または「時刻」のパラメータは、シーケンスにおける位置である。このような絶対的な時間を表す、他のパラメータもまた、使用することができる。各コンピュータ「Ａ」、「Ｂ」、「Ｃ」は、そのローカルカウンタ値（ＬＣ）を、予め定められた初期値（この例では、初期値ゼロである）で開始し、および実行された各オペレーションについて固定された量（この例では、１）だけインクリメントし、各「アンドゥ」オペレーションについて固定された量（同様に、１）を減じることにより保持する。最初の同期化メッセージ５０１〜５０２に関して、（ステップ６０３で計算される）「Ａ」のローカルカウンタ値（ＬＣA）は、メッセージパラメータ４０６の中に設定される；したがって、５０１〜５０２の各々におけるパラメータ４０６は値１を有するであろう。
【００２１】
ＰＯＴパラメータ４０７〜４０９は、「Ａ」によって実行された従前のオペレーションに関するタイムスタンプパラメータを含む。ＰＯＴパラメータは、「Ａ」におけるジャーナル３０６に格納された従前に実行されたオペレーションのうち最新のものに関連するＣＯＴパラメータを用いて設定される。最初のメッセージ５０１〜５０２を送信する際、そのジャーナルは空であり、したがって、従前のオペレーションのタイムスタンプパラメータ４０７〜４０９は、ヌル値に設定される。
【００２２】
メッセージ５０１〜５０２を送信する際、コンピュータ「Ａ」は、パラメータ４０６の現時点のローカルカウンタ値ＬＣA（すなわち１）で、メッセージ５０１〜５０２の各々をフォーマットする。結果として、メッセージは「Ｂ」および「Ｃ」に（メッセージ５０１〜５０２として）伝送され（ステップ６０５）、オペレーションＡ1は、「Ａ」において記録（すなわち、データベース３０６に設定）される（ステップ６０６）。実施例によっては、他のコンピュータから受信したオペレーションおよびメッセージ（すなわち、「Ａ」において、「Ｂ」と「Ｃ」から受信したメッセージ）のために用いられるのと同一の形式で、ローカルに生成されたオペレーション（すなわちコンピュータ「Ａ」におけるＡ1）を記録することができる。したがって、オペレーションＡ1を、送信メッセージ５０１または５０２の全てのパラメータと共に、「Ａ」において記録することができる。明らかなように、ステップ６０１〜６０３は異なる順番で実行することができる。例えば、ステップ６０６はステップ６０５の前または後に実行することができる。
【００２３】
時刻ｔ2において、「Ｂ」のユーザは、オペレーションＢ1を入力して「Ｂ」におけるローカルの共有されたデータオブジェクトを修正し、「Ｂ」は、手順６０１〜６０３を用いて、コンピュータ「Ａ」および「Ｃ」に同期化メッセージ５０３〜５０４を伝送する。メッセージ５０１が時刻ｔ2の前に「Ｂ」において受信されなかったため、「Ｂ」もまた、ローカルカウンタ値４０６がＬＣB＝１のメッセージ５０３〜５０４を伝送する。同様に、時刻ｔ3において「Ａ」のユーザは、「Ｂ」および「Ｃ」へのメッセージ５０４〜５０４によって伝送されたオペレーションＡ2を入力する。このケースでは、メッセージ５０４〜５０５のパラメータ４０６は、ＬＣA＝２に設定され、ＰＯＴパラメータ４０７〜４０９は、最新の記録されたオペレーションに関連するＣＯＴパラメータ４０４〜４０６に等しく設定される（すなわち、パラメータ４０７〜４０９によって、オペレーションＡ1が示される）。
【００２４】
メッセージ５０１〜５０６を受信するためのプロセスを、図６Ｂを参照して説明する。図６Ｂは、受信のメッセージ（ＭRと示す）を処理する際のコンフリクトの解決のためのプロセスを示している。メッセージ（「ＭR」）をあるコンピュータで受信すると（ステップ６１０）、その受信のコンピュータは、（ｉ）メッセージが正規の順番であり、実行準備されているか否か、（ｉｉ）メッセージが早すぎ、待ちリスト３０７に設定されるべきか否か、または（ｉｉｉ）同時的コンフリクトまたはオーダリングコンフリクトが存在するか否かを決定する。受信のメッセージＭRをテストして、（「ＭR,count」と示される）タイムスタンプパラメータ４０６が、受信側コンピュータにおいて増加されたローカルカウンタ値（すなわち、ＬＣ＋１）に等しいか、および（「ＭR,POT」と示される）ＰＯＴパラメータ４０７〜４０９が受信側コンピュータのジャーナル３０６に関する最後のメッセージ／オペレーションを示すか否かを決定する（ステップ６１１）。もしそうであれば、メッセージＭRは、正規のシーケンスにあると考えられ、受信側コンピュータはメッセージＭRによって定められるオペレーション４０２を実行し、ジャーナル３０６にＭRを追加し、およびそのローカルカウンタをインクリメントする（ＬＣ＝ＬＣ＋１）（ステップ６１２）。受信側コンピュータは、それから、その待ちリスト３０７が，受信側コンピュータのローカルカウンタの再増加値（すなわち、（ステップ６１２による（ＬＣ＋１））＋１）に等しいカウンタ４０６、および最後の記録されたメッセージのＣＯＴパラメータに等しいＰＯＴパラメータを持つ追加のメッセージを有するか否かを決定する（ステップ６２３）。もしそうであれば、その待ちのメッセージは待ちリストから取り除かれ、ステップ６１１において開始しているメッセージＭRとして処理されるが、そうでない場合、コンピュータは、他のタスクの処理およびユーザ命令、またはメッセージの待ちに復帰する。
【００２５】
ステップ６１１の判定が、メッセージＭRがステップ６１２を経由して処理する準備ができていないとなった場合は、メッセージＭRが早すぎるか、および／または同時的コンフリクトが存在する。この場合、受信メッセージのタイムスタンプパラメータ（ＭR,count）が、ローカルカウンタ値ＬＣ＋１と比較される（ステップ６１３）。メッセージのタイムスタンプの値（４０６、ＭR,count）が、ローカルカウンタ値ＬＣ＋１以上のときは、メッセージＭRは、早いメッセージであり（ＭR,count＞ＬＣ＋１）、および／または（もし、ＭR,count＝ＬＣ＋１ならば）同時的コンフリクトが存在するであろう。この場合、待ちリストが探索され、カウンタ４０２および従前のオペレーションのタイムスタンプ値４０７〜４０９はメッセージＭRと同一であるが、優先順位はメッセージＭRよりも低い待ちのメッセージが存在するか否かを決定する（ステップ６１４）。もしそうであれば、その待ちのメッセージは削除される（ステップ６１５）。いかなる場合も、メッセージＭRは待ちリストに追加される（ステップ６１６）（同時的コンフリクトを解決するために、図６Ｂのアルゴリズムの部分的手順が必要となるであろう）。ステップ６２３および６２４を通して処理が続けられる。
【００２６】
もし、ステップ６１３で、カウンタ値４０６が（ＬＣ＋１）よりも小さいと判定された場合、順番のコンフリクトが存在する。すなわち、カウンタ４０６と同じ値を持つ別のオペレーションが従前に処理されている。この場合、ジャーナルが探索され、従前に処理された（「ＭJ」と示す）メッセージを発見する（ステップ６１９）。メッセージＭRがメッセージＭJより高い優先順位、および同一のＰＯＴパラメータ（４０７〜４０９）を有する（すなわち、ＭR,POT＝ＭJ,POT）場合、メッセージＭJおよびその全ての部分シーケンスのメッセージは、アンドゥされる（ステップ６２１）。メッセージＭRは実行され、ジャーナルに追加され、およびローカルカウンタはパラメータ４０６の値にセットされる（ステップ６２２）。そうでない場合、メッセージＭRは待ちリストに追加される（ステップ６１８）。メッセージがアンドゥされると（ステップ６２１）、それらは、部分シーケンスの再実行を可能にするため、待ちキュー３０５に置かれる。例えば、もしもアンドゥされたメッセージが正規に実行される次のメッセージＭRである場合、またはもしも別のコンピュータからの同期化メッセージが、最新の「アンドゥ」プロセス６２１を生じさせて、そのプロセスで、アンドゥされたメッセージのいくつかを実行すべきであると決定された場合に、再実行処理が生じる。
【００２７】
図５に戻って参照すると、時刻ｔ4において、メッセージ５０４は「Ｃ」で受信される。メッセージ５０４は、「通常」のメッセージとして処理される（すなわち、コンフリクトがあることは示さない）。すなわち、メッセージ５０４はステップ６１０→６１１→６１２→６２３→６２４のプロセスを実行することにより処理される。
【００２８】
時刻ｔ5において、メッセージ５０１は「Ｂ」で、メッセージ５０３は「Ａ」で、およびメッセージ５０６は「Ｃ」で受信される。この場合、「Ａ」、「Ｂ」、および「Ｃ」における処理は、以下のとおりである：
「Ａ」において：時刻ｔ5において、メッセージ５０３のパラメータ４０６は値１を有し、ＬＣAは値２を有する。結果として、処理はステップ６１０→６１１→６１３→６１９の経路に沿って生じる。ステップ６１９において、「Ａ」のジャーナル３０６は、５０３のそれと同一のカウントを持つメッセージを探索する。したがって、メッセージ５０１が発見される。メッセージ５０１および５０３の優先順位およびＰＯＴ値が比較される（ステップ６２０）。この例では、「Ａ」（すなわち、５０１）からのメッセージは、「Ｂ」からのそれより高い優先順位を有し、その結果として、受信したメッセージ５０３は廃棄される（ステップ６１８）。それから、ステップ６２３→６２４に沿って処理が続く。
【００２９】
「Ｂ」において:時刻ｔ5において、メッセージ５０１のパラメータ４０６は値１を有し、ＬＣBは値１を有する。「Ａ」における処理と同様、「Ｂ」における処理も、ステップ６１０→６１１→６１３→６１９の経路に沿って生じる。ジャーナル３０６の探索により、時刻ｔ2において「Ｂ」から開始されたオペレーションＢ1が設置される。メッセージ５０１および５０３（すなわち、オペレーションＢ1）の優先順位が、それらのＰＯＴ値同様、比較される（ステップ６２０）。その結果、ステップ６２１における処理に続くことになる。ステップ６２１は、オペレーションＢ1をアンドゥするため、「アンドゥ」機能を行使して、Ｂのジャーナルから取り去る。メッセージ５０１は、それから、実行され、ジャーナルに追加され、およびＬＣBが、メッセージ５０１のカウントパラメータ４０６の値に設定される。
【００３０】
「Ｃ」において:時刻ｔ5において、メッセージ５０６のパラメータ４０６は、「Ｃ」におけるローカルカウンタ＋１（ＬＣC＋１）に等しくなるが、ＰＯＴパラメータ４０７〜４０９は、「Ｃ」における最後の記録されるオペレーションを特定することはできない。結果として、メッセージ処理は、ステップ６１０→６１１→６１３→６１４の経路に沿って移行する。ステップ６１４では、「Ｃ」における待ちメッセージキュー３０７を探索し、メッセージ５０６に同一のカウント値４０６およびＰＯＴ値４０７〜４０９を持つ待ちのメッセージが存在するか否かを決定する。この場合、このようなメッセージは存在しておらず、メッセージＭRが待ちリスト３０７に追加される。ステップ６２３→６２４に沿って処理が続く。
【００３１】
時刻ｔ6において、メッセージ５０５はＢで受信され、メッセージ５０２は「Ｃ」で受信される。「Ｂ」におけるメッセージ５０５の処理は、一直線になされ、ステップ６１０→６１１→６１２→６２３→６２４の経路に沿って生じる。「Ｃ」におけるメッセージ５０２の処理は、ステップ６１０→６１１→６１３→（ジャーナルでメッセージ５０４を識別する）６１９→（メッセージ５０２が５０４を超える優先順位を有することを決定する）６２０→（メッセージ５０４に「アンドゥ」機能を実施する）６２１→（メッセージ５０６において特定された（「ＭR,OP」で示す）オペレーションを実行する）６２２→６２３の経路に沿って発生する。ステップ６２３において、メッセージ５０６がキュー３０７に有り、処理の準備がまさにできていることが検出される。メッセージ５０６は、メッセージＭRとして、ステップ６１１→６１２→６２３→６２４の処理経路に沿って処理される。時刻ｔ6に続き、「Ａ」、「Ｂ」および「Ｃ」の各々は、オペレーションＡ1およびＡ2を実行およびジャーナルに記録し、オペレーションＢ1およびＢ2を廃棄する。
【００３２】
ほとんどの実施例においては、アプリケーション３０１のただ一つのインスタンスのみが、コンピュータ２０１で実行される。しかし、実施例によっては、アプリケーション３０１の複数のインスタンスが各コンピュータ上で実行されることも考えられる。例えば、あるコンピュータの複数のユーザ各々が、アプリケーション３０１のそれら自身のインスタンスを実行させる場合である。このような場合、各「インスタンス」は、論理的に分離した別のコンピュータ上で実行しているとみることができ、そのように扱われる。例えば、別のメッセージ４０１が、各コンピュータ上のアプリケーションの各インスタンスに送信され、各インスタンスは一意名４０５を有するであろう。
【００３３】
上述のメッセージ伝送、受信、および処理アルゴリズムの一実施例は、擬似コードで以下のように実装される：
（共有データオブジェクトを最初に変更するコンピュータ「Ａ」からのメッセージを配信するためのアルゴリズム）
【００３４】
【表１】
0003779263.tif 000002
【００３５】
【表２】
0003779263.tif 000003
【００３６】
【表３】
0003779263.tif 000004
【００３７】
【表４】
0003779263.tif 000005
【００３８】
あるケースでは、アプリケーションは巻戻すことができないオペレーションを実行するかもしれない。もし特定のオペレーションが（例えば、一方向データ変換であるため）実行後に巻戻しができない場合、悲観的ロッキング方法が、このような不可逆オペレーションに先立って用いられ、これにより不可逆のオペレーションを実行する前に各コンピュータ２０１〜２０３が、共有のデータオブジェクト３０５と一致するコピーを有することを保証することができる。悲観的ロッキング方法が要求されるときは、悲観的ロッキング方法を要求するコンピュータ、例えば、２０１は、その最も最近実行されたオペレーションに関連するタイムスタンプ４０３のコピーを提供することができる。この最も最近実行されたオペレーションのタイムスタンプは、他のコンピュータ２０２〜２０３の各々におけるジャーナル３０６のタイムスタンプ情報と比較され、各コンピュータ２０２〜２０３がデータ３０５と一致するビューを有することを保証する。もしデータ３０５と一致しない場合、そのロッキング方法は否認される。否認するコンピュータは、その最も最近に実行されたオペレーションに関するタイムスタンプ情報を返却して、ロッキング方法を要求するコンピュータに現在の状態を通知することができる。ロッキング方法を要求するコンピュータは、悲観的ロッキング方法を再要求する前に、適切に同期が取られる（正規の状態が得られる）まで待機することができる。したがって、悲観的ロッキング方法は、要求されれば、一致コンポーネント３０３によってトランスペアレントに用いることができる。その待ちキュー３０５が大量のメッセージを有するか、またはそのメッセージがキューの中で大量の時間を消費する場合、このような悲観的ロッキング方法を、コンピュータによって開始することもできる。あるケースでは、キュー３０５は、実行することができないメッセージを有するかもしれない（これは、同期化メッセージの交換シナリオにおいて発生することもある）。時折悲観的ロッキング方法および同期化を働かせることによって、コンピュータ２０１〜２０３は、悲観的同期化の後に存在する、キューされたメッセージを廃棄することを決定することができる。
【００３９】
あるケースでは、パラメータ４０２によって示されたオペレーションは、複合的なオペレーション、すなわち、単一の原子的なトランザクションとして実行される複数の部分オペレーション（すなわち、成功か失敗かのどちらかになる全てのオペレーション）からなる複合的なオペレーションかもしれない。ＣＡＤシステムのユーザインタフェースは、ユーザに一群のオペレーションをバッチ処理させることも許容する選択機能を含ませることができる。例えば、ユーザは、複合的なトランザクションの入力を開始するときは「バッチ開始」の印をクリックし、トランザクションが入力され、別のコンピュータに送信されるべきときは「完了（ｃｏｍｐｌｅｔｅｄ）」の印をクリックすることができる。複合的なオペレーションは、また、例えば、マクロ機能によって自動的に生成されるかもしれない。したがって、パラメータ４０２は、可変サイズとすることができ、特定のオペレーションの要求にしたがって、複数のサブコンポーネントを含むことができる。パラメータ４０４および４０７は、複数のサブパーツを識別するために同様に適応させることができる。
【００４０】
本発明は、デジタル電子回路内で、データ記憶媒体に記憶されたコンピュータコードとしてコンピュータハードウェア、ファームウェア、ソフトウェアで、またはこれらの組み合わせで実施することができる。コンピュータは、固定（ワイヤード）ネットワーク、無線、移動体無線、およびその他のネットワークタイプを含む多様なネットワークを介して相互接続することができる。本発明の装置は、プログラム可能なプロセッサによって実行するために機械読み取り可能な記憶装置に、実体的に実施されたコンピュータプログラム製品において実施することができる；本発明の方法のステップは、プログラム可能なプロセッサによって実施することができ、入力データにオペレーションを行い出力を生成することによって、本発明の機能を実施するためのプログラムの命令を実行することができる。本発明は、データおよび命令をデータ記憶システムと送受信する、結合された少なくとも１つのプログラム可能なプロセッサ、少なくとも１つの入力装置、および少なくとも１つの出力装置を含む、プログラム可能なシステム上で実行可能な１つまたは２つ以上のコンピュータプログラムで有効に実施することができる。各コンピュータプログラムは、高レベルの手続きないしオブジェクト指向プログラミング言語、または必要ならばアセンブリ言語ないし機械語で実施することができる；いずれの場合でも、その言語はコンパイルまたはインタプリットされる言語とすることができる。適切なプロセッサには、例えば、汎用および専用の双方のマイクロプロセッサを含む。一般に、プロセッサは、読取専用メモリおよび／またはランダムアクセスメモリから命令とデータを受信する。コンピュータプログラム命令およびデータを実体的に実施するのに適した記憶装置には、全ての形式の不揮発性メモリが含まれ、例えば、これには、ＥＰＲＯＭ、ＥＥＰＲＯＭおよびフラッシュメモリ装置などの半導体メモリ装置；内蔵ハードディスクおよび取外し可能なディスクなどの磁気ディスク；磁気光ディスク；およびＣＤ−ＲＯＭディスクが含まれる。上述のいかなるものも、特別に設計されたＡＳＩＣ（特定用途向けＩＣ）により補い、あるいはそれに一体化することができる。
【００４１】
本発明の多くの実施例を説明してきた。それにもかかわらず、本発明の精神と範囲から離れることなく多様な変更が可能であることが理解されるであろう。したがって、他の実施例も特許請求の範囲に含まれる。
【図面の簡単な説明】
【図１】メッセージフローを示す図である。
【図２】ピアツーピア型のネットワークを示す図である。
【図３】ソフトウェアアプリケーションの構造を示す図である。
【図４】メッセージフォーマットを示す図である。
【図５】メッセージフローを示す図である。
【図６Ａ】プロセスのフローを示す図である。
【図６Ｂ】プロセスのフローを示す図である。
【符号の説明】
１０１、１０２、２０１〜２０３  コンピュータ
３０１  アプリケーション
３０２  メッセージ配信コンポーネント
３０３  一致コンポーネント
３０４  アプリケーション機能
３０５  データオブジェクト
３０６  ジャーナル
３０７  待ちリスト
３０８  ネットワーク
４０１  メッセージ
４０２  オペレーションセクション
４０３  タイムスタンプセクション
４０４〜４０９  パラメータ
５０１〜５０６  メッセージ
【図１】
0003779263.tif 000006
【図２】
0003779263.tif 000007
【図３】
0003779263.tif 000008
【図４】
0003779263.tif 000009
【図５】
0003779263.tif 000010
【図６Ａ】
0003779263.tif 000011
【図６Ｂ】
0003779263.tif 000012