(57)【要約】【課題】Ｗｅｂオフィス・ソフトウェアにおいて、他のユーザの編集を妨げることなく、他のユーザに編集されたくないオブジェクトを指定可能にする。【解決手段】本発明は、第１のユーザに関連付けられた第１のクライアントと第２のユーザに関連付けられた第２のクライアントとにネットワークを介して接続可能なサーバ・コンピュータがコンテンツ・データ中のオブジェクトの共同編集を可能にする方法、並びにそのシステム及びプログラムを提供する。本発明はまた、第１のユーザに関連付けられた第１のクライアントと第２のユーザに関連付けられた第２のクライアントとの間においてコンテンツ・データ中のオブジェクトの共同編集を可能にする方法、並びにそのシステム及びプログラムを提供する。【選択図】図６
2011253229.tif 000002
【特許請求の範囲】
【請求項１】
第１のユーザに関連付けられた第１のクライアント・コンピュータ（以下、第１のクライアント）と第２のユーザに関連付けられた第２のクライアント・コンピュータ（以下、第２のクライアント）とにネットワークを介して接続可能なサーバ・コンピュータ（以下、サーバ）がコンテンツ・データ中のオブジェクトの共同編集を可能にする方法であって、前記サーバは、ユーザによるオブジェクトの変更の指示を示す変更指示データを格納する記憶部を備えており、
前記サーバが、
前記第２のユーザによる編集が許されないオブジェクトが前記第１のユーザによって指定されることに応じて、当該指定されたオブジェクト（以下、指定オブジェクト）を示す情報を前記第１のクライアントから受信するステップと、
前記指定オブジェクトを示す情報を受信後に、前記指定オブジェクトについての前記第２のユーザによる変更の指示を示す変更指示データを前記第２のクライアントから受信し、当該受信した変更指示データを前記記憶部に格納するステップと、
前記第２のクライアントからの前記変更指示データの受信に応じて、前記指定オブジェクトについてのブランチ・データを作成するステップと、
前記指定オブジェクトを示す情報を受信後に、前記指定オブジェクトについての前記第１のユーザによる変更の指示を示す変更指示データを前記第１のクライアントから受信し、当該受信した変更指示データを前記記憶部に格納するステップであって、前記ブランチ・データに対して、前記第１のクライアントから受信した変更指示データに対応する操作が反映される、前記格納するステップと、
前記第１のクライアントから受信した前記変更指示データに対応する操作列（以下、第１の操作列）と前記第２のクライアントから受信した前記変更指示データに対応する操作列（以下、第２の操作列）とをマージすることが可能であるかをオペレーショナル・トランスフォーメーション（以下、ＯＴ）を使用して判断するステップと、
前記マージすることが可能であることに応じて、ＯＴを使用して、前記第１の操作列を前記第２のユーザのコンテンツ・データに適用するステップと
を実行すること含む、前記方法。
【請求項２】
前記マージすることが可能であることが、
前記指定オブジェクトについてのブランチ・データの作成後における前記第２の操作列全てをＯＴで計算した結果であるＨｔが空であることである、請求項１に記載の方法。
【請求項３】
前記マージすることが可能であることが、
前記指定オブジェクトについてのブランチ・データの作成後における前記第２の操作列全てをＯＴで計算した結果であるＨｔと、前記指定オブジェクトについてのブランチ・データの作成後における前記第１の操作列全てをＯＴで計算した結果であるＨｂとの距離がゼロであることである、請求項１に記載の方法。
【請求項４】
前記サーバが、
前記適用するステップの後に、前記ブランチ・データ及び前記第１のクライアントから受信した前記変更指示データを前記記憶部から削除するステップを実行することをさらに含む、請求項１〜３のいずれか一項に記載の方法。
【請求項５】
前記判断するステップが、前記第１の操作列と前記第２の操作列との差分の大小を第１のユーザに示すためのユーザ・インタフェースに、当該差分の大小についてのデータを提供するステップをさらに含む、請求項１〜４のいずれか一項に記載の方法。
【請求項６】
前記サーバが、
前記指定オブジェクトが指定される前に、前記第１のユーザによるオブジェクトの変更の指示を示す変更指示データを前記第１のクライアントから受信するステップと、
当該受信した変更指示データを用いて、前記第２のユーザのコンテンツ・データを同期するステップと
を実行することをさらに含む、請求項１〜５のいずれか一項に記載の方法。
【請求項７】
前記指定オブジェクトについてのブランチ・データの作成後に、前記ブランチ・データ及び前記第１のクライアントからの前記変更指示データが前記記憶部中の第１のバッファに格納され、前記第２のクライアントからの前記変更指示データが前記記憶部中の第２のバッファに格納される、請求項１〜６のいずれか一項に記載の方法。
【請求項８】
第１のユーザに関連付けられた第１のクライアント・コンピュータ（以下、第１のクライアント）と第２のユーザに関連付けられた第２のクライアント・コンピュータ（以下、第２のクライアント）との間においてコンテンツ・データ中のオブジェクトの共同編集を可能にする方法であって、前記第１のクライアントは前記第１のユーザによるオブジェクトの変更の指示を示す変更指示データを格納する第１の記憶部を備えており、及び前記第２のクライアントは前記第２のユーザによるオブジェクトの変更の指示を示す変更指示データを格納する第２の記憶部を備えており、
前記第２のクライアントが、
前記第２のユーザによる編集が許されないオブジェクトが前記第１のユーザによって指定されることに応じて、当該指定されたオブジェクト（以下、指定オブジェクト）を示す情報を前記第１のクライアントから受信するステップと、
前記指定オブジェクトを示す情報を受信後に、前記指定オブジェクトについての前記第２のユーザによる変更の指示を示す変更指示データを前記第２の記憶部に格納するステップと、
前記変更指示データを前記第１のクライアントに送信するステップと
を実行することを含み、
前記第１のクライアントが、
前記第２のクライアントからの最初の前記変更指示データの受信に応じて、前記指定オブジェクトについてのブランチ・データを前記第１の記憶部内に作成するステップと、
前記指定オブジェクトを示す情報を受信後に、前記指定オブジェクトについての前記第１のユーザによる変更の指示を示す変更指示データを前記第１の記憶部に格納するステップであって、前記ブランチ・データに対して、前記第１のクライアントから受信した変更指示データに対応する操作が反映される、前記格納するステップと、
前記第１のクライアントから受信した前記変更指示データに対応する操作列（以下、第１の操作列）と前記第２のクライアントから受信した前記変更指示データに対応する操作列（以下、第２の操作列）とをマージすることが可能であるかをオペレーショナル・トランスフォーメーション（以下、ＯＴ）を使用して判断するステップと、
前記マージすることが可能であることに応じて、前記第１の操作列を前記第２のクライアントに送信するステップと
を実行することを含み、
前記第２のクライアントが、
前記第１の操作列を受信することに応じて、ＯＴを使用して、前記第１の操作列を前記第２のユーザのコンテンツ・データに適用するステップ
をさらに実行すること含む、前記方法。
【請求項９】
前記第１のクライアントが、
前記第１の操作列を前記第２のクライアントに送信するステップの後に、ブランチ・データを削除するステップをさらに実行することを含む、請求項８に記載の方法。
【請求項１０】
第１のユーザに関連付けられた第１のクライアント・コンピュータ（以下、第１のクライアント）と第２のユーザに関連付けられた第２のクライアント・コンピュータ（以下、第２のクライアント）との間においてコンテンツ・データ中のオブジェクトの共同編集を可能にする方法であって、前記第１のクライアントは前記第１のユーザによるオブジェクトの変更の指示を示す変更指示データを格納する第１の記憶部を備えており、及び前記第２のクライアントは前記第２のユーザによるオブジェクトの変更の指示を示す変更指示データを格納する第２の記憶部を備えており、
前記第２のクライアントが、
前記第２のユーザによる編集が許されないオブジェクトが前記第１のユーザによって指定されることに応じて、当該指定されたオブジェクト（以下、指定オブジェクト）を示す情報を前記第１のクライアントから受信するステップと、
前記指定オブジェクトについての前記第２のユーザによる変更の指示を示す変更指示データを前記第２の記憶部に格納するステップと、
前記第２のユーザによる最初の変更の指示が生成されることに応じて、前記指定オブジェクトについてのブランチ・データを前記第２の記憶部内に作成するステップであって、前記ブランチ・データに対して、前記変更指示データに対応する操作が反映される、前記作成するステップと、
前記第２のユーザによる最初の変更の指示が生成されることに応じて、前記指定オブジェクトが変更されたことを示すデータを第１のクライアントに送信するステップと
を実行することを含み、
前記第１のクライアントが、
前記指定オブジェクトが変更されたことを示すデータを受信することに応じて、前記第１のユーザによる変更の指示を示す変更指示データを前記第２のクライアントに送信するステップと
を実行することを含み、
前記第２のクライアントが、
前記第１のクライアントからの前記変更指示データに対応する操作列（以下、第１の操作列）と前記第２のクライアントからの前記変更指示データに対応する操作列（以下、第２の操作列）とをマージすることが可能であるかをオペレーショナル・トランスフォーメーション（以下、ＯＴ）を使用して判断するステップと、
前記マージすることが可能であることに応じて、前記第１の操作列を前記第１のクライアントに送信するステップと
を実行することを含み、
前記第１のクライアントが、
ＯＴを使用して、前記第２のクライアントから送信された前記第１の操作列を前記第２のユーザのコンテンツ・データに適用するステップと
を実行することを含む、前記方法。
【請求項１１】
前記第２のクライアントが、
前記適用するステップの後に、ブランチ・データを削除するステップをさらに実行することを含む、請求項１０に記載の方法。
【請求項１２】
前記第１のクライアントが、
前記第２のユーザによって編集されたコンテンツ・データを表示させるという前記第１のユーザの指示に応じて、前記第２のユーザによって編集されたコンテンツ・データを表示するステップと、
前記第１の操作列と前記第２の操作列との差分の大小を第１のユーザに示すステップと
をさらに実行することを含み、
前記適用するステップが、前記第１のユーザによる指示に従い実行される、請求項８に記載の方法。
【請求項１３】
前記第１のクライアント及び前記第２のクライアントが仮想クライアント・コンピュータであり、前記第１のクライアントと前記第２のクライアントが同一のコンピュータ上で実装される、請求項８〜１２のいずれか一項に記載の方法。
【請求項１４】
コンテンツ・データ中のオブジェクトの共同編集を可能にするサーバ・コンピュータ（以下、サーバ）であって、前記サーバは、第１のユーザに関連付けられた第１のクライアント・コンピュータ（以下、第１のクライアント）と第２のユーザに関連付けられた第２のクライアント・コンピュータ（以下、第２のクライアント）とにネットワークを介して接続可能であり、
前記サーバが、
前記第２のユーザによる編集が許されないオブジェクトが前記第１のユーザによって指定されることに応じて、当該指定されたオブジェクト（以下、指定オブジェクト）を示す情報を前記第１のクライアントから受信する受信部と、
前記指定オブジェクトを示す情報を受信後に、前記指定オブジェクトについての前記第２のユーザによる変更の指示を示す変更指示データを前記第２のクライアントから受信する受信部と、
前記第２のクライアントからの前記変更指示データの受信に応じて、前記指定オブジェクトについてのブランチ・データを作成する作成部と、
前記指定オブジェクトを示す情報を受信後に、前記指定オブジェクトについての前記第１のユーザによる変更の指示を示す変更指示データを前記第１のクライアントから受信する受信部と、
前記第２のクライアントから受信した前記変更指示データ、前記第１のクライアントから受信した前記変更指示データ、及び前記ブランチ・データを格納する格納部であって、前記ブランチ・データに対して、前記第１のクライアントから受信した変更指示データに対応する操作が反映される、前記格納部と、
前記第１のクライアントから受信した前記変更指示データに対応する操作列（以下、第１の操作列）と前記第２のクライアントから受信した前記変更指示データに対応する操作列（以下、第２の操作列）とをマージすることが可能であるかをオペレーショナル・トランスフォーメーション（以下、ＯＴ）を使用して判断する判断部と、
前記マージすることが可能であることに応じて、ＯＴを使用して、前記第１の操作列を前記第２のユーザのコンテンツ・データに適用する適用部と
をさらに備えている、前記サーバ。
【請求項１５】
前記マージすることが可能であることが、
前記指定オブジェクトについてのブランチ・データの作成後における前記第２の操作列全てをＯＴで計算した結果であるＨｔが空であることである、請求項１４に記載のサーバ。
【請求項１６】
前記マージすることが可能であることが、
前記指定オブジェクトについてのブランチ・データの作成後における前記第２の操作列全てをＯＴで計算した結果であるＨｔと、前記指定オブジェクトについてのブランチ・データの作成後における前記第１の操作列全てをＯＴで計算した結果であるＨｂとの距離がゼロであることである、請求項１４に記載のサーバ。
【請求項１７】
前記適用の後に、前記ブランチ・データ及び前記第１のクライアントから受信した前記変更指示データを前記記憶部から削除するバッファ・コントロール部をさらに備えている、請求項１４〜１６のいずれか一項に記載のサーバ。
【請求項１８】
前記第１の操作列と前記第２の操作列との差分の大小を第１のユーザに示すためのユーザ・インタフェースに、当該差分の大小についてのデータを提供する提供部をさらに備えている、請求項１４〜１７のいずれか一項に記載のサーバ。
【請求項１９】
前記指定オブジェクトが指定される前に、前記第１のユーザによるオブジェクトの変更の指示を示す変更指示データを受信し、当該受信した変更指示データを用いて、前記第２のユーザのコンテンツ・データを同期する、請求項１４〜１８のいずれか一項に記載のサーバ。
【請求項２０】
第１のユーザに関連付けられた第１のクライアント・コンピュータと第２のユーザに関連付けられた第２のクライアント・コンピュータとにネットワークを介して接続可能なサーバ・コンピュータに、請求項１〜７のいずれか一項に記載の方法の各ステップを実行させるコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンテンツ・データ中のオブジェクトの共同編集を可能にする方法、並びにそのコンピュータ・システム及びコンピュータ・プログラムに関する。
【背景技術】
【０００２】
ウェブベースのオフィス・ソフトウェア（以下、Ｗｅｂオフィス・ソフトウェア）とは、共同編集をサポートするウェブ・アプリケーションの１つである。Ｗｅｂオフィス・ソフトウェアとして、例えばGoogle（商標）ドキュメント（Google Docs）（下記非特許文献１を参照）、Zoho（商標） Office（Zoho Docs、Zoho Sheet、Zoho Show、Zoho Writer）及びOpenGooがある。Ｗｅｂオフィス・ソフトウェアでは、複数のユーザがネットワークを介してデータを共同編集することが可能であり、サーバが編集中のデータを一元管理する（下記非特許文献２を参照）。
しかしながら、共同編集が可能であることによって、Ｗｅｂオフィス・ソフトウェアは次の問題点を有する：（１）編集されたくないオブジェクトが、他の共同編集者（ユーザ）によって編集されてしまうことがある；（２）例えばGoogle Docsは文章の一部をロックする機能を提供している。しかし、この機能はメインユーザ以外の他のユーザの編集をも妨げてしまう。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】インターネット（URL:http://www.google.com/google-d-s/intl/en/tour1.html）
【非特許文献２】インターネット（URL:http://www.google.com/google-d-s/intl/en/tour2.html）
【非特許文献３】インターネット（URL:http://en.wikipedia.org/wiki/Operational_transformation）
【非特許文献４】インターネット（URL:http://www.waveprotocol.org/whitepapers/operational-transform）
【非特許文献５】インターネット（URL:http://portal.acm.org/citation.cfm?id=675712）, Haifeng Shen, Chengzheng Sun, "A Log Compression Algorithm for Operation-based Version Control Systems," Computer Software and Applications Conference, Annual International, p. 867, 26th Annual International Computer Software and Applications Conference, 2002
【非特許文献６】インターネット（http://portal.acm.org/citation.cfm?id=587088）, Aguido Horatio Davis等、”Generalizing operational transformation to the standard general markup language”, Computer Supported Cooperative Work, Proceedings of the 2002 ACM conference on Computer supported cooperative work, ACM, 58-67, 2002
【発明の概要】
【発明が解決しようとする課題】
【０００４】
Ｗｅｂオフィス・ソフトウェアにおいて、他のユーザの編集を妨げることなく、他のユーザに編集されたくないオブジェクトを指定可能にすることが求められている。
【課題を解決するための手段】
【０００５】
本発明は、サーバ・コンピュータ（以下、サーバともいう）がコンテンツ・データ中のオブジェクトの共同編集を可能にする方法を提供する（図７Ａを参照）。
当該サーバは、第１のユーザに関連付けられた第１のクライアント・コンピュータ（以下、第１のクライアントともいう）と第２のユーザに関連付けられた第２のクライアント・コンピュータ（以下、第２のクライアントともいう）とにネットワークを介して接続可能である。
上記方法は、サーバが、
上記第２のユーザによる編集が許されないオブジェクトが上記第１のユーザによって指定されることに応じて、当該指定されたオブジェクト（以下、指定オブジェクト）を示す情報を上記第１のクライアントから受信するステップと（図７Ａ（以下、同じ））、７０１）、
上記指定オブジェクトを示す情報を受信後に、上記指定オブジェクトについての上記第２のユーザによる変更の指示を示す変更指示データを上記第２のクライアントから受信し、当該受信した変更指示データを上記記憶部に格納するステップと（７０２〜７０３）、
上記第２のクライアントからの上記変更指示データの受信に応じて、上記指定オブジェクトについてのブランチ・データを作成するステップ（７０４）と、
上記指定オブジェクトを示す情報を受信後に、上記指定オブジェクトについての上記第１のユーザによる変更の指示を示す変更指示データを上記第１のクライアントから受信し、当該受信した変更指示データを上記記憶部に格納するステップであって、上記ブランチ・データに対して、上記第１のクライアントから受信した変更指示データに対応する操作が反映される、上記格納するステップ（７０５〜７０６）と、
上記第１のクライアントから受信した上記変更指示データに対応する操作列（第１の操作列）と上記第２のクライアントから受信した上記変更指示データに対応する操作列（第２の操作列）とをマージすることが可能であるかをオペレーショナル・トランスフォーメーション（以下、ＯＴともいう）を使用して判断するステップ（７０９）と、
上記マージすることが可能であることに応じて、ＯＴを使用して、上記第１の操作列を上記第２のユーザのコンテンツ・データに適用するステップ（７１０）と
を実行すること含む。
【０００６】
本発明の１つの実施態様において、上記マージすることが可能であることが、上記指定オブジェクトについてのブランチ・データの作成後における上記第２の操作列全てをＯＴで計算した結果であるＨｔが空であることである（図８、８０４）。
本発明の別の実施態様において、上記マージすることが可能であることが、上記指定オブジェクトについてのブランチ・データの作成後における上記第２の操作列全てをＯＴで計算した結果であるＨｔと、上記指定オブジェクトについてのブランチ・データの作成後における上記第１の操作列全てをＯＴで計算した結果であるＨｂとの距離がゼロであることである（８０４）。
【０００７】
本発明の１つの実施態様において、上記方法はまた、サーバが、上記適用するステップの後に、上記ブランチ・データ及び上記第１のクライアントから受信した上記変更指示データを上記記憶部から削除するステップをさらに実行することを含む。
【０００８】
本発明の１つの実施態様において、上記判断するステップが、上記第１の操作列と上記第２の操作列との差分の大小を第１のユーザに示すためのユーザ・インタフェースに、当該差分の大小についてのデータを提供するステップをさらに含む。
【０００９】
本発明の１つの実施態様において、上記方法はまた、サーバが、
上記指定オブジェクトが指定される前に、上記第１のユーザによるオブジェクトの変更の指示を示す変更指示データを上記第１のクライアントから受信するステップと、
当該受信した変更指示データを用いて、上記第２のユーザのコンテンツ・データを同期するステップと
を実行することをさらに含む。
【００１０】
本発明の実施態様において、上記指定オブジェクトについてのブランチ・データの作成後に、上記ブランチ・データ及び上記第１のクライアントからの上記変更指示データが上記記憶部中の第１のバッファに格納され、上記第２のクライアントからの上記変更指示データが上記記憶部中の第２のバッファに格納される。
【００１１】
本発明はまた、サーバに上記方法のいずれか１つに記載の各ステップを実行させるコンピュータ・プログラムを提供する。
【００１２】
本発明はまた、第１のクライアントと第２のクライアントとの間においてコンテンツ・データ中のオブジェクトの共同編集を可能にする方法を提供する（図７Ｂを参照）。当該方法において、上記第１のクライアントは上記第１のユーザによるオブジェクトの変更の指示を示す変更指示データを格納する第１の記憶部を備えており、及び上記第２のクライアントは上記第２のユーザによるオブジェクトの変更の指示を示す変更指示データを格納する第２の記憶部を備えている。
上記方法は、
上記第２のクライアントが、
上記第２のユーザによる編集が許されないオブジェクトが上記第１のユーザによって指定されることに応じて、当該指定オブジェクトを示す情報を上記第１のクライアントから受信するステップと（図７Ｂ（以下、同じ））、７２２）、
上記指定オブジェクトを示す情報を受信後に、上記指定オブジェクトについての上記第２のユーザによる変更の指示を示す変更指示データを上記第２の記憶部に格納するステップと、
上記変更指示データを上記第１のクライアントに送信するステップと（７２３）
を実行することを含み、
上記第１のクライアントが、
上記第２のクライアントからの最初の上記変更指示データの受信に応じて、上記指定オブジェクトについてのブランチ・データを上記第１の記憶部内に作成するステップと（７２４）、
上記指定オブジェクトを示す情報を受信後に、上記指定オブジェクトについての上記第１のユーザによる変更の指示を示す変更指示データを上記第１の記憶部に格納するステップであって、上記ブランチ・データに対して、上記第１のクライアントから受信した変更指示データに対応する操作が反映される、上記格納するステップと（７２５）、
上記第１のクライアントから受信した上記変更指示データに対応する操作列（第１の操作列）と上記第２のクライアントから受信した上記変更指示データに対応する操作列（第２の操作列）とをマージすることが可能であるかをＯＴを使用して判断するステップと（７２７）、
上記マージすることが可能であることに応じて、上記第１の操作列を上記第２のクライアントに送信するステップと（７２８）
を実行することを含み、
上記第２のクライアントが、
上記第１の操作列を受信することに応じて、ＯＴを使用して、上記第１の操作列を上記第２のユーザのコンテンツ・データに適用するステップ（７２９）
をさらに実行すること含む。
【００１３】
本発明の１つの実施態様において、上記方法は、上記第１のクライアントが、上記第１の操作列を上記第２のクライアントに送信するステップの後に、ブランチ・データを削除するステップをさらに実行することを含む。
【００１４】
本発明はまた、第１のクライアントと第２のクライアントとの間においてコンテンツ・データ中のオブジェクトの共同編集を可能にする方法を提供する（図７Ｃを参照）。当該方法において、上記第１のクライアントは上記第１のユーザによるオブジェクトの変更の指示を示す変更指示データを格納する第１の記憶部を備えており、及び上記第２のクライアントは上記第２のユーザによるオブジェクトの変更の指示を示す変更指示データを格納する第２の記憶部を備えている。
上記方法は、
上記第２のクライアントが、
上記第２のユーザによる編集が許されないオブジェクトが上記第１のユーザによって指定されることに応じて、当該指定オブジェクトを示す情報を上記第１のクライアントから受信するステップと（図７Ｃ（以下、同じ）、７４２）、
上記指定オブジェクトについての上記第２のユーザによる変更の指示を示す変更指示データを上記第２の記憶部に格納するステップと、
上記第２のユーザによる最初の変更の指示が生成されることに応じて、上記指定オブジェクトについてのブランチ・データを上記第２の記憶部内に作成するステップであって、上記ブランチ・データに対して、上記変更指示データに対応する操作が反映される、上記作成するステップと（７４６）、
上記第２のユーザによる最初の変更の指示が生成されることに応じて、上記指定オブジェクトが変更されたことを示すデータを第１のクライアントに送信するステップと（７４４）
を実行することを含み、
上記第１のクライアントが、
上記指定オブジェクトが変更されたことを示すデータを受信することに応じて、上記第１のユーザによる変更の指示を示す変更指示データを上記第２のクライアントに送信するステップと（７４５）
を実行することを含み、
上記第２のクライアントが、
上記第１のクライアントからの上記変更指示データに対応する操作列（第１の操作列）と上記第２のクライアントからの上記変更指示データに対応する操作列（第２の操作列）とをマージすることが可能であるかをＯＴを使用して判断するステップと（７４７）、
上記マージすることが可能であることに応じて、上記第１の操作列を上記第１のクライアントに送信するステップと（７４８）
を実行することを含み、
上記第１のクライアントが、
ＯＴを使用して、上記第２のクライアントから送信された上記第１の操作列を上記第２のユーザのコンテンツ・データに適用するステップ（７４９）
を実行することを含む。
【００１５】
本発明の１つの実施態様において、上記方法は、
上記第１のクライアントが、
上記第２のユーザによって編集されたコンテンツ・データを表示させるという上記第１のユーザの指示に応じて、上記第２のユーザによって編集されたコンテンツ・データを表示するステップと、
上記第１の操作列と上記第２の操作列との差分の大小を第１のユーザに示すステップと
をさらに実行することを含み、
上記適用するステップが、上記第１のユーザによる指示に従い実行される。
【００１６】
本発明はまた、コンテンツ・データ中のオブジェクトの共同編集を可能にするサーバを提供する。上記サーバ（図３Ａ及び図３Ｂ（以下、同じ）、３０１）は、第１のユーザに関連付けられた第１のクライアント（３０２ａ）と第２のユーザに関連付けられた第２のクライアント（３０２ｂ）とにネットワークを介して接続可能である。
上記サーバは、
上記第２のユーザによる編集が許されないオブジェクトが上記第１のユーザによって指定されることに応じて、当該指定オブジェクトを示す情報を上記第１のクライアントから受信する第１の受信部と、
上記指定オブジェクトを示す情報を受信後に、上記指定オブジェクトについての上記第２のユーザによる変更の指示を示す変更指示データを上記第２のクライアントから受信する第２の受信部と、
上記第２のクライアントからの上記変更指示データの受信に応じて、上記指定オブジェクトについてのブランチ・データを作成する作成部（３０５）と、
上記指定オブジェクトを示す情報を受信後に、上記指定オブジェクトについての上記第１のユーザによる変更の指示を示す変更指示データを上記第１のクライアントから受信する第３の受信部と、
上記第２のクライアントから受信した上記変更指示データ、上記第１のクライアントから受信した上記変更指示データ、及び上記ブランチ・データを格納する格納部であって、上記ブランチ・データに対して、上記第１のクライアントから受信した変更指示データに対応する操作が反映される、上記格納部（３０４）と、
上記第１のクライアントから受信した上記変更指示データに対応する操作列（第１の操作列）と上記第２のクライアントから受信した上記変更指示データに対応する操作列（第２の操作列）とをマージすることが可能であるかをＯＴを使用して判断する判断部（３０６）と、
上記マージすることが可能であることに応じて、ＯＴを使用して、上記第１の操作列を上記第２のユーザのコンテンツ・データに適用する適用部（３０７）と
をさらに備えている。上記第１の受信部、上記第２の受信部及び上記第３の受信部は、１つにまとめられていてもよい（３０３）。
【００１７】
本発明の１つの実施態様において、上記サーバは、上記適用の後に、上記ブランチ・データ及び上記第１のクライアントから受信した上記変更指示データを上記記憶部から削除するバッファ・コントロール部（３０８）をさらに含む。
【００１８】
本発明の１つの実施態様において、上記サーバは、上記第１の操作列と上記第２の操作列との差分の大小を第１のユーザに示すためのユーザ・インタフェースに、当該差分の大小についてのデータを提供する提供部（３０９）をさらに備えている。
【００１９】
本発明の１つの実施態様において、上記サーバは、上記指定オブジェクトが指定される前に、上記第１のユーザによるオブジェクトの変更の指示を示す変更指示データを受信する。また、上記サーバは、当該受信した変更指示データを用いて、上記第２のユーザのコンテンツ・データを同期する。
【発明の効果】
【００２０】
本発明では、ユーザは、他のユーザの編集作業を妨げることなく、コンテンツ・データ中のオブジェクト単位で他のユーザに変更されたくない部分を指定することができるので、効率的に共同編集が可能である。
本発明ではまた、共同編集のユーザ全員が、コンテンツ・データ中のオブジェクトが保護されているかどうかを意識することなく、全てのオブジェクトを自由に編集可能である。
本発明ではまた、共同編集者の数は多い場合に、他のユーザによる予期せぬ変更に対処することができる。
【００２１】
本発明は、例えば、ブレインストーミング等のインタラクティブな会議形式で自由にスライドで意見を出し合いつつも、自分の意見は編集されたくないが出来るだけ同じ内容を共有したい場面で有効である。
本発明は、例えば、ｅ−ラーニングで生徒が講義資料を共有し、講義資料に自由に書き込みを許しつつも、自分のメモを変更されたくないが、出来るだけ同じ内容を共有したい場面で有効である。
【図面の簡単な説明】
【００２２】
【図１】本発明の実施形態における、サーバ・コンピュータ及びクライアント・コンピュータに共通のコンピュータ・ハードウェアの基本的なブロック図を示す。
【図２Ａ】本発明の実施形態における、サーバ及びクライアントの関係を示す。
【図２Ｂ】本発明の実施形態における、サーバ及びクライアントの関係を示す。
【図２Ｃ】本発明の実施形態における、サーバ及びクライアントの関係を示す。
【図２Ｄ】本発明の実施形態における、クライアント同士の関係を示す。
【図３Ａ】本発明の実施形態における、図２Ａ〜図２Ｃに示すサーバのブロック構成図を示す。
【図３Ｂ】本発明の実施形態における、図２Ｄの場合のクライアントのブロック構成図を示す。
【図４Ａ】第１のクライアントと第２のクライアントとの間で同じ文書を編集した場合に、操作列の送受信で同期に失敗する例を示す。
【図４Ｂ】図４Ａの例にＯＴを適用し、データを同期する例を示す。
【図５】ＯＴを適用し、２つの操作列をマージする例を示す。
【図６】本発明の実施形態である、トランク・データとブランチ・データとの関係を示すフローチャートである。
【図７Ａ】本発明の実施形態における、図２Ａ〜図２Ｃ及び図３Ａに示すようなサーバ−クライアント・システムにおいて、コンテンツ・データ中のオブジェクトの共同編集を可能にするフローを示す。
【図７Ｂ】本発明の実施形態における、図２Ｄ及び図３Ｂに示すようなクライアント−クライアント・システムにおいて、コンテンツ・データ中のオブジェクトの共同編集を可能にするフローを示す。
【図７Ｃ】本発明の実施形態における、図２Ｄ及び図３Ｂに示すようなクライアント−クライアント・システムにおいて、コンテンツ・データ中のオブジェクトの共同編集を可能にするフローを示す。
【図８】本発明の実施形態である、図６のステップ６１６の比較のフローチャートである。
【図９】コンテンツの差分を示すグラフである。
【図１０】本発明の実施形態である、指定オブジェクトが図形である場合のマージの例を示す。
【図１１】本発明の実施形態である、指定オブジェクトがテキストである場合のマージの例を示す。
【図１２】本発明の実施形態である、指定オブジェクトがテキストである場合のマージの例を示す。
【図１３】本発明の実施形態である、指定オブジェクトが複雑なテキストである場合のマージの例を示す。
【図１４】本発明の実施形態である、トランク・データの操作列とブランチ・データの操作列との差分に従って、マージを促すユーザ・インタフェースの例である。
【図１５】本発明の実施形態である、ブランチ・データの状態を視覚化することによって、マージを促すユーザ・インタフェースの例である。
【発明を実施するための形態】
【００２３】
本発明の実施形態において、「コンテンツ・データ」とは、ネットワークを介して複数のユーザが共同編集可能なアプリケーションにより作成されたデータである。コンテンツ・データは、例えばワードプロセッサ・ソフトウェア若しくはテキスト・エディタ・ソフトウェアのデータ、スプレッドシート・ソフトウェアのデータ、プレゼンテーション・ソフトウェアのデータ、又はデータベース・ソフトウェアのデータ、又はメッセージ・コラボレーション・ソフトウェアのデータであるが、これらに限定されない。
【００２４】
本発明の実施形態において、「オブジェクト」とは、コンテンツ・データ中のユーザによる編集対象である。オブジェクトは、例えば文字、文字列、図形若しくはそれらの組み合わせ、ページ、（ワーク）シート、又はスライドであるが、これらに限定されない。シートは、例えばスプレッドシート・ソフトウェアのシートである。スライドは、例えばプレゼンテーション・ソフトウェアのスライドである。「オブジェクト」それぞれは、オブジェクトを示す情報によって特定可能である。オブジェクトを示す情報は、例えば識別子（ＩＤ）である。
【００２５】
本発明の実施形態において、「サーバ・コンピュータ」（以下、サーバともいう）は、ネットワーク、例えばインタ−ネット、エクストラネット若しくはイントラネット又はその組み合わせを介してクライアント・コンピュータに接続されうる。
【００２６】
本発明の実施形態において、「クライアント・コンピュータ」（以下、クライアントともいう）は、ネットワークを介してコンテンツ・データを編集することが可能な装置であればよい。クライアントは、例えばパーソナル・コンピュータ、パーソナルデジタルアシスタント又は携帯電話であるがこれらに限定されない。また、本発明の実施形態において、第１のクライアント及び第２のクライアントが、同一のハードウェアであるクライアント・コンピュータ内で実現される仮想クライアント・コンピュータであってもよい。当該仮想クライアント・コンピュータは、例えばシン・クライアントである。
【００２７】
本発明の実施形態において、「ネットワーク」は、例えばインターネット、エクストラネット、若しくはイントラネット、又はその組み合わせであってよい。また、「ネットワーク」は、サーバとシン・クライアントとの種々の接続関係も含む。
【００２８】
本発明の実施形態において、「第１のユーザ」は、当該第１のユーザ以外の第２のユーザ（他のユーザともいう）によって編集が許されないオブジェクトを指定したユーザである。
【００２９】
本発明の実施形態において、「第１のクライアント」は、第１のユーザによって操作されるクライアントである。第１のクライアントは、コンテンツ・データを共同編集するために使用される。
【００３０】
本発明の実施形態において、「第２のユーザ」は、第１のユーザ以外のユーザである。なお、ユーザは、他のユーザによって編集が許されないオブジェクトを指定したユーザであれば第１のユーザであり、そうでなければ第２のユーザでありうる。すなわち、ユーザは、第１のユーザ、第２のユーザのいずれでもありうる。
【００３１】
本発明の実施形態において、「第２のクライアント」は、第２のユーザによって操作されるクライアントである。第２のクライアントは、コンテンツ・データを共同編集するために使用される。
【００３２】
「共同編集」とは、少なくとも２つのクライアント・コンピュータの各ユーザが上記コンテンツ・データを編集することである。
【００３３】
本発明の実施形態において、「指定オブジェクト」とは、編集が許されないオブジェクトとして指定されたオブジェクトをいう。編集が許されないオブジェクトとは、第１のユーザが第２のユーザによって編集されたくないオブジェクトであって、第１のユーザによって指定される。
【００３４】
本発明の実施形態において、「指定オブジェクトを示す情報」とは、指定オブジェクトを特定するための情報をいう。指定オブジェクトを示す情報は、例えばオブジェクトの識別子（オブジェクトＩＤ）、ＸＭＬのエレメントのパス、又は独自のデータ形式で表されうる。
【００３５】
本発明の実施形態において、「変更指示データ」とは、ユーザによるオブジェクトの変更の指示を示すデータである。変更指示データは、例えばＸＭＬ、ＪＳＯＮ（Java Script Object Notation）、又は独自のデータ形式で表されうる。
【００３６】
本発明の実施形態において、「変更指示データに対応する操作列」とは、変更指示データに対応する操作の列（操作列ともいう）をいう（例えば、下記図６を参照）。操作列は、少なくとも１、又は複数の操作を含む。本発明の実施形態において、「第１の操作列」は、第１のクライアントから受信した変更指示データに対応する操作列である。また、発明の実施形態において、「第２の操作列」は、第２のクライアントから受信した変更指示データに対応する操作列である。
【００３７】
本発明の実施形態において、「マージする」とは、第２のクライアントのデータに第１のクライアントの操作列を適用し、第２のクライアントのデータを第１のクライアントのデータと同一のものとした上で、第１のクライアントのブランチ・データを削除することである。
【００３８】
「オペレーショナル・トランスフォーメーション」（Operational Transformation、ＯＴ）は、操作変換ともいう。ＯＴの基本的な説明については、下記ＵＲＬにおいて記載されている；（１）http://en.wikipedia.org/wiki/Operational_transformation（上記非特許文献３）、及び（２）http://www.waveprotocol.org/whitepapers/operational-transform（上記非特許文献４）。下記図４Ａ、図４Ｂ及び図５において、ＯＴについて別途説明する。
【００３９】
以下、図面に従って、本発明の実施形態を説明する。本実施形態は、本発明の好適な形態を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。
【００４０】
図１は、本発明の実施形態における、サーバ・コンピュータ及びクライアント・コンピュータに共通のコンピュータ・ハードウェアの基本的なブロック図を示す。以下、サーバ・コンピュータ及びクライアント・コンピュータをまとめて、コンピュータという。
コンピュータ（１０１）は、ＣＰＵ（１０２）とメイン・メモリ（１０３）とを含み、これらはバス（１０４）に接続されている。ＣＰＵ（１０２）は好ましくは、３２ビット又は６４ビットのアーキテクチャに基づくものであり、例えば、インテル社のＣｏｒｅ  ｉ（商標）シリーズ、Ｃｏｒｅ  ２（商標）シリーズ、Ａｔｏｍ（商標）シリーズ、Ｘｅｏｎ（商標）シリーズ、Ｐｅｎｔｉｕｍ（登録商標）シリーズ、Ｃｅｌｅｒｏｎ（登録商標）シリーズ、ＡＭＤ社のＰｈｅｎｏｍ（商標）シリーズ、Ａｔｈｌｏｎ（商標）シリーズ、Ｔｕｒｉｏｎ（商標）シリーズ又はＳｅｍｐｒｏｎ（商標）が使用されうる。バス（１０４）には、ディスプレイ・コントローラ（１０５）を介して、ディスプレイ（１０６）、例えば液晶ディスプレイ（ＬＣＤ）が接続されうる。ディスプレイ（１０６）は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。バス（１０４）にはまた、Ｓ−ＡＴＡ又はＩＤＥコントローラ（１０７）を介して、ディスク（１０８）、例えばハードディスク又はシリコン・ディスクと、ドライブ（１０９）、例えばＣＤ、ＤＶＤ又はＢＤドライブとが接続されうる。バス（１０４）にはさらに、キーボード・マウスコントローラ（１１０）又はＵＳＢバス（図示せず）を介して、キーボード（１１１）及びマウス（１１２）が接続されうる。
ディスク（１０８）には、オペレーティング・システム、Ｊ２ＥＥなどのＪａｖａ（登録商標）処理環境を提供するプログラム、その他のプログラム、及びデータが、メイン・メモリにロード可能に記憶されている。
ドライブ（１０９）は、必要に応じて、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ又はＢＤからプログラムをディスク（１０８）にインストールするために使用される。
通信インタフェース（１１４）は、例えばイーサネット（登録商標）・プロトコルに従う。通信インタフェース（１１４）は、通信コントローラ（１１３）を介してバス（１０４）に接続され、コンピュータ（１０１）を通信回線（１１５）に物理的に接続する役割を担い、コンピュータ（１０１）のオペレーティング・システムの通信機能のＴＣＰ／ＩＰ通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線ＬＡＮ環境、或いは例えばＩＥＥＥ８０２．１１ａ／ｂ／ｇ／ｎなどの無線ＬＡＮ接続規格に基づく無線ＬＡＮ環境であってもよい。
【００４１】
図２Ａ〜図２Ｃは、本発明の実施形態における、サーバ及びクライアントの関係を示す。図２Ｄは、本発明の実施形態における、クライアント同士の関係を示す。
【００４２】
図２Ａは、サーバ（２０１）が、各クライアント（２０２ａ〜２０２ｃ）とネットワーク（２０４）を介して接続されていることを示す。
各クライアント（２０２ａ〜２０２ｃ）は、各ユーザ（２０３ａ〜２０３ｃ）によって操作されうる。なお、図２Ａでは、クライアントが３台描かれているが、クライアントの数は２台であってもよく、または３台より多くてもよい。
【００４３】
図２Ｂは、サーバ（２１１）が、クライアント（２１２）とネットワーク（２１４）を介して接続されていることを示す。
クライアント（２１２）は、仮想クライアント（２１２ａ及び２１２ｂ）を実装している。仮想クライアント（２１２ａ及び２１２ｂ）は、同じオペレーティング・システムを実装していてもよく、又は異なるオペレーティング・システムを実装していてもよい。各クライアント（２１２ａ及び２１２ｂ）は、各ユーザ（２１３ａ及び２１３ｂ）によって操作されうる。なお、図２Ｂでは、仮想クライアントが２台描かれているが、クライアントの数は３台以上であってもよい。
【００４４】
図２Ｃは、サーバ（２２１）が、各シン・クライアント（２２２ａ〜２２２ｃ）と各ネットワーク（２２４ａ〜２２４ｃ）を介して接続されていることを示す。
各シン・クライアント（２２２ａ〜２２２ｃ）は、各ユーザ（２２３ａ〜２２３ｃ）によって操作されうる。なお、図２Ｃでは、シン・クライアントが３台描かれているが、シン・クライアントの数は２台であってもよく、または３台より多くてもよい。
【００４５】
図２Ｄは、クライアント（２３２ａ）が、ネットワーク（２３４）を介してクライアント（２３２ｂ）と接続されていることを示す。
図２Ｄはサーバが不要な例である。各クライアント（２３２ａ及び２３２ｂ）は、各ユーザ（２３３ａ及び２３３ｂ）によって操作されうる。なお、図２Ｄでは、クライアントが２台描かれているが、クライアントの数は２台より多くてもよい。
【００４６】
本発明は、図２Ａ〜図２Ｃのように、サーバ−クライアントの関係にあるネットワーク環境、及び図２Ｄのように、サーバのないクライアント同士の関係にあるネットワーク環境のいずれにおいても実装可能である。
【００４７】
図３Ａは、本発明の実施形態における、図２Ａ〜図２Ｃに示すサーバのブロック構成図を示す。
サーバ（３０１）は、クライアント（３０２ａ及び３０２ｂ）と接続している。サーバ（３０１）は、受信部（３０３）、記憶部（３０４）、作成部（３０５）、判断部（３０６）及び適用部（３０７）を備えている。サーバ（３０１）はまた、バッファ・コントロール部（３０８）を備えていてもよい。サーバ（３０１）はさらに、提供部（３０９）を備えていてもよい。
受信部（３０３）は、クライアント（３０２ａ）及びクライアント（３０２ｂ）の一方から、指定オブジェクトを示す情報を受信する。また、受信部（３０３）は、クライアント・コンピュータ（３０２ａ）及び／又はクライアント（３０２ｂ）から、変更指示データを受信する。
【００４８】
記憶部（３０４）は、バッファＡ（３０４ａ）及びバッファＢ（３０４ｂ）を備えていてもよい。バッファＡ（３０４ａ）及びバッファＢ（３０４ｂ）は、異なる記憶部内にあってもよい。バッファは、例えばキャッシュであってよい。記憶部（３０４）は、トランク・データ及びブランチ・データを格納する。トランク（trunk）及びブランチ（branch）は、バージョン管理において使用されている用語である。トランク・データとは、共同編集における幹となるデータであり、一方、ブランチ・データとは、トランク・データから分岐したものであり、指定オブジェクトのコピーである。
【００４９】
記憶部がバッファＡ（３０４ａ）及びバッファＢ（３０４ｂ）を備えている場合において、バッファＡ（３０４ａ）が第２のバッファであり、バッファＢ（３０４ｂ）が第１のバッファである場合、バッファＡ（３０４ａ）にトランク・データが格納され、及びバッファＢ（３０４ｂ）にブランチ・データが格納される。あるいは、バッファＡ（３０４ａ）が第１のバッファであり、バッファＢ（３０４ｂ）が第２のバッファである場合、バッファＡ（３０４ａ）にブランチ・データが格納され、及びバッファＢ（３０４ｂ）にトランク・データが格納される。
【００５０】
例えば、バッファＡ（３０４ａ）にトランク・データが格納されており及びバッファＢ（３０４ｂ）にブランチ・データが格納されている場合、クライアント（３０２ａ）が第２のクライアントであり、クライアント（３０２ｂ）が第１のクライアントである。この場合、バッファＡ（３０４ａ）は、さらにクライアント（３０２ａ）からの変更指示データを格納し、バッファＢ（３０４ｂ）は、さらにクライアント（３０２ｂ）からの変更指示データを格納する。また、この場合、クライアント（３０２ａ）を操作するユーザが第２のユーザであり、クライアント（３０２ｂ）を操作するユーザが第１のユーザである。
【００５１】
また、例えば、バッファＡ（３０４ａ）にブランチ・データが格納されており及びバッファＢ（３０４ｂ）にトランク・データが格納されている場合、クライアント（３０２ａ）が第１のクライアントであり、クライアント（３０２ｂ）が第２のクライアントである。この場合、バッファＡ（３０４ａ）は、さらにクライアント（３０２ａ）からの変更指示データを格納し、バッファＢ（３０４ｂ）は、さらにクライアント（３０２ｂ）からの変更指示データを格納する。また、この場合、クライアント（３０２ａ）を操作するユーザが第１のユーザであり、クライアント（３０２ｂ）を操作するユーザが第２のユーザである。
【００５２】
作成部（３０５）は、ある指定オブジェクトについての変更指示データを第２のクライアントから最初に受信することに応じて、記憶部（３０４ａ）内にブランチ・データを作成する。
【００５３】
判断部（３０６）は、第１のバッファに蓄積された第１のクライアントからの変更（第１の変更ともいう）と第２のバッファに蓄積された第２のクライアントからの変更（第２の変更ともいう）とがマージ可能であるかどうかをＯＴを使用して判断する。ＯＴについて、下記図４Ａ、図４Ｂ及び図５において説明する。
【００５４】
適用部（３０７）は、マージ可能であることに応じて、ＯＴを使用して、第１の操作列を、第２のユーザのコンテンツ・データに適用する。
バッファ・コントロール部（３０８）は、適用部（３０７）が第１の操作列を第２のユーザのコンテンツ・データに適用後に、ブランチ・データ及び第１のクライアントからの変更指示データを記憶部（３０４）から削除する。記憶部がバッファ（３０４ａ及び３０４ｂ）を備えている場合、ブランチ・データ及び第１のクライアントからの変更指示データを格納しているバッファそのものをクリアーにするようにしてもよい。
【００５５】
提供部（３０９）は、第１の操作列と第２の操作列との差分の大小を第１のユーザに示すためのユーザ・インタフェースに、当該差分の大小についてのデータを提供する。
【００５６】
クライアント（３０２ａ及び３０２ｂ）の基本的な構成は、図１に示したとおりである。クライアント（３０２ａ）が第１のクライアントであり、クライアント（３０２ｂ）が第２のクライアントであってもよく、又はクライアント（３０２ａ）が第２のクライアントであり、クライアント（３０２ｂ）が第１のクライアントであってもよい。クライアント（３０２ａ）及びクライアント（３０２ｂ）のいずれも、第１のクライアント又は第２のクライアントになりうる。クライアント（３０２ａ及び３０２ｂ）が第１のクライアントであるか又は第２のクライアントであるかは、当該クライアントのユーザが他のユーザによる編集が許されないオブジェクトを指定する権利を有しているかがどうかによって決まる。すなわち、当該クライアントのユーザが他のユーザによる編集が許されないオブジェクトを指定する権利を有する場合、当該クライアントは第１のクライアントであり、残りのクライアントは第２のクライアントである。当該クライアントのユーザが他のユーザによる編集が許されないオブジェクトを指定する権利を有するかどうかは、例えばデータの所有者であるかどうか、データの管理権限を有するかどうかによって判断される。具体的には、クライアント（３０２ａ）は、当該クライアント（３０２ａ）のユーザが他のユーザによる編集が許されないオブジェクトを指定する権利を有する場合には第１のクライアントであり、当該権利を有しない場合には第２のクライアントである。クライアント（３０２ａ）は、第１のクライアント又は第２のクライアントのいずれでもありうる。クライアント（３０２ｂ）についても同様である。
【００５７】
図３Ｂは、本発明の実施形態における、図２Ｄの場合のクライアントのブロック構成図を示す。
クライアント（３１２ａ）は、クライアント（３１２ｂ）と接続している。クライアント（３１２ａ）は、受信部（３１３）、記憶部（３１４）、作成部（３１５）、判断部（３１６）及び適用部（３１７）を備えている。クライアント（３１２ａ）はまた、バッファ・コントロール部（３１８）を備えていてもよい。クライアント（３１２ａ）はさらに、提供部（３１９）を備えていてもよい。
受信部（３１３）は、クライアント（３１２ｂ）方から、指定オブジェクトを示す情報を受信する。また、受信部（３１３）は、クライアント・コンピュータ（３１２ｂ）から、変更指示データを受信する。
【００５８】
記憶部（３１４）は、バッファＡ（３１４ａ）及びバッファＢ（３１４ｂ）を備えていてもよい。記憶部（３１４）は、トランク・データ及びブランチ・データを格納する。
【００５９】
記憶部がバッファＡ（３１４ａ）及びバッファＢ（３１４ｂ）を備えている場合において、バッファＡ（３１４ａ）が第２のバッファであり、バッファＢ（３１４ｂ）が第１のバッファである場合、バッファＡ（３１４ａ）にトランク・データが格納され、及びバッファＢ（３１４ｂ）にブランチ・データが格納される。あるいは、バッファＡ（３１４ａ）が第１のバッファであり、バッファＢ（３１４ｂ）が第２のバッファである場合、バッファＡ（３１４ａ）にブランチ・データが格納され、及びバッファＢ（３１４ｂ）にトランク・データが格納される。
【００６０】
例えば、バッファＡ（３１４ａ）にトランク・データが格納されており及びバッファＢ（３１４ｂ）にブランチ・データが格納されている場合、クライアント（３１２ａ）が第２のクライアントであり、クライアント（３１２ｂ）が第１のクライアントである。この場合、バッファＡ（３１４ａ）は、さらにクライアント（３１２ａ）からの変更指示データを格納し、バッファＢ（３１４ｂ）は、さらにクライアント（３１２ｂ）からの変更指示データを格納する。また、この場合、クライアント（３１２ａ）を操作するユーザが第２のユーザであり、クライアント（３１２ｂ）を操作するユーザが第１のユーザである。
【００６１】
また、例えば、バッファＡ（３１４ａ）にブランチ・データが格納されており及びバッファＢ（３１４ｂ）にトランク・データが格納されている場合、クライアント（３１２ａ）が第１のコンピュータであり、クライアント（３１２ｂ）が第２のコンピュータである。この場合、バッファＡ（３１４ａ）は、さらにクライアント（３１２ａ）からの変更指示データを格納し、バッファＢ（３１４ｂ）は、さらにクライアント（３１２ｂ）からの変更指示データを格納する。また、この場合、クライアント（３１２ａ）が第１のユーザであり、クライアント（３１２ｂ）が第２のユーザである。
【００６２】
作成部（３１５）は、ある指定オブジェクトについての変更指示データを第２のクライアントから最初に受信することに応じて、記憶部（３１４ａ）内にブランチ・データを作成する。
【００６３】
判断部（３１６）は、第１のバッファに蓄積された第１のクライアントからの変更（第１の変更ともいう）と第２のバッファに蓄積された第２のクライアントからの変更（第２の変更ともいう）とがマージ可能であるかどうかをＯＴを使用して判断する。
【００６４】
適用部（３１７）は、マージ可能であることに応じて、ＯＴを使用して、第１の操作列を、第２のユーザのコンテンツ・データに適用する。
バッファ・コントロール部（３１８）は、適用部（３１７）が第１の操作列を第２のユーザのコンテンツ・データに適用後に、ブランチ・データ及び第１のクライアントからの変更指示データを記憶部（３１４）から削除する。記憶部がバッファ（３１４ａ及び３１４ｂ）を備えている場合、ブランチ・データ及び第１のクライアントからの変更指示データを格納しているバッファそのものをクリアーにするようにしてもよい。
【００６５】
提供部（３１９）は、第１の操作列と第２の操作列との差分の大小を第１のユーザに示すためのユーザ・インタフェースに、当該差分の大小についてのデータを提供する。
【００６６】
クライアント（３１２ａ及び３１２ｂ）の基本的な構成は、図１に示したとおりである。クライアント（３１２ａ）が第１のクライアントであり、クライアント（３１２ｂ）が第２のクライアントであってもよく、又はクライアント（３１２ａ）が第２のクライアントであり、クライアント（３１２ｂ）が第１のクライアントであってもよい。クライアント（３１２ａ）及びクライアント（３１２ｂ）のいずれも、第１のクライアント又は第２のクライアントになりうる。クライアント（３１２ａ及び３１２ｂ）が第１のクライアントであるか又は第２のクライアントであるかは、当該クライアントのユーザが他のユーザによる編集が許されないオブジェクトを指定する権利を有しているかがどうかによって決まる。すなわち、当該クライアントのユーザが他のユーザによる編集が許されないオブジェクトを指定する権利を有する場合、当該クライアントは第１のクライアントであり、残りのクライアントは第２のクライアントである。当該クライアントのユーザが他のユーザによる編集が許されないオブジェクトを指定する権利を有するかどうかは、例えばデータの所有者であるかどうか、データの管理権限を有するかどうかによって判断される。具体的には、クライアント（３１２ａ）は、当該クライアント（３１２ａ）のユーザが他のユーザによる編集が許されないオブジェクトを指定する権利を有する場合には第１のクライアントであり、当該権利を有しない場合には第２のクライアントである。クライアント（３１２ａ）は、第１のクライアント又は第２のクライアントのいずれでもありうる。クライアント（３１２ｂ）についても同様である。
【００６７】
図４Ａ、図４Ｂ及び図５は、ＯＴの一般的な内容の理解を容易にするために示したものである。
【００６８】
ＯＴの記号の定義について、以下に説明する。
（１）操作列 H のうち i 番目の操作を H[i]とする。
（２）操作列 H に含まれる操作の個数を |H| とする。
（３）操作列 H に含まれる各操作 O は、下記（Ａ）〜（Ｌ）に述べる情報を持つ。
【００６９】
（Ａ）O.t は、文書中での操作の種類を示す。
O.t= ins であれば、操作Oが文字列の挿入操作である。
O.t= del であれば、操作Oが文字列の削除の操作である。
（Ｂ）O.p は、文書中での操作を適用する位置を示す。
O.t= ins, O.p=1 であれば、文書の１文字目の後に文字を挿入する。
O.t= del, O.p=3 であれば、文書の３文字目の文字を削除する 
（Ｃ）O.len は、文書中での変更される文字列の長さを示す。変更は文書中に文字を挿入すること、又は文書中の文字を削除することを含む。
文字列“abc”が文書中に挿入されるとき、O.len = 3 である。
（Ｄ）O.s は、文書中に挿入する文字列、又は文書から削除される文字列を示す。
文字列“abc”が文書中に挿入されるとき、O.s = “abc” である。
（Ｅ）O1 ⊥ O2は、同じ状態の文書に対して起こった操作であることを示す。すなわち、２つの操作O1及びO2は、コンテクスト等価（Context equivalent）であることを示す。コンテクスト等価である場合、ＯＴによってコンテクスト等価でない操作に変換する必要がある 
（Ｆ）O1 → O2は、O1がO2の前に起こっていることを示す。
O2の操作には既にO1の操作の影響が含まれているので、ＯＴの必要はない。
（Ｇ）O1 |→ O2 は、O1がO2の前に起こっていて、且つ、O1を実行後の状態はO2を実行する前の状態であることを示す。すなわち、２つの操作O1とO2は、コンテクスト先行（Context preceding）である。
（Ｈ）IT(Ob, Oa) は、インクルージョン・トランスフォーメーション（Inclusion Transformation）であり、Ob の操作にOaの操作の影響を含めて、新しい操作Ob’を作ることを示す。
Oa⊥ Ob のとき、Oa |→ Ob’ となる。
（Ｉ）ET(Ob, Oa) は、エクスクルージョン・トランスフォーメーション（Exclusion Transformation）であり、Ob の操作からOaの操作の影響を取り除くことを示す。
（Ｊ）SWAP(Ob, Oa)は、Oa |→Ob のときに Ob’ |→ Oa’ となる操作 Oa’, Ob’を作ることを示す。ITとETとを組み合わせて、SWAPができる。
（Ｋ）MERGE(Ob, Oa)は、Oa |→Ob のときにOa’ |→ Ob’ であり、且つ操作の位置がオーバラップしない２つの操作を作ることを示す。
（Ｌ）H1・H2は、２つの操作の履歴 H1,H2 をつなげたものを示す。
【００７０】
SWAP（上記（Ｊ））及びMERGE（上記（Ｋ））について、以下に詳しく説明する。
（ａ）SWAP
O1|→ O2 のときに、以下の操作によって、O2’ |→ O1’ となる操作が得られる。
【００７１】
SWAP(O1,O2) {
O2’ = ET(O2, O1);
O1’ = IT(O1, O2’);
return (O2’, O1’);
}
【００７２】
（ｂ）MERGE
O1|→ O2 のとき、以下の操作によって、O1’ |→ O2’ であり、且つ２つの操作の位置がオーバラップしていない操作が得られる。
【００７３】
MERGEのアルゴリズムについては、例えば下記ＵＲＬに記載の文献に記載されている：URL:http://portal.acm.org/citation.cfm?id=675712（上記非特許文献５）。
【００７４】
図４Ａは、第１のクライアントと第２のクライアントとの間で同じ文書を編集した場合に、操作列の送受信で同期に失敗する例を示す。
Ｗｅｂオフィス・ソフトウェアで共同編集をサポートするために、第１のクライアント（４０１）と第２のクライアント（４０２）は、互いの操作列を送受信する。
第１のクライアント（４０１）は、第１のユーザ（４０３）による文書の編集操作を受信し、その操作列を第２のクライアント（４０２）にネットワークを経由して送信する。
第２のクライアント（４０２）は、第２のユーザ（４０４）による文書の編集操作を受信し、その操作列を第１のクライアント（４０１）にネットワークを経由して送信する。
しかし、図４Ａの例に示すように、第１のクライアント（４０１）と第２のクライアント（４０２）との間でデータが同期しないことがある。
ステップ４１１及びステップ４２１で、第１のユーザ（４０３）及び第２のユーザ（４０４）は、同じ文章の内容“ＣＬＯＵＤ”から編集をそれぞれ開始する。
ステップ４１２で、第１のクライアント（４０１）は、４文字目を消去する操作を第１のユーザ（４０３）から受け取る。従って、“ＣＬＯＵＤ”は、“ＣＬＯＤ”となる。一方、ステップ４２２で、第２のクライアント（４０２）は、２文字目を消去する操作を第２のユーザ（４０４）から受け取る。従って、“ＣＬＯＵＤ”は、“ＣＯＵＤ”となる。
次に、ステップ４１３で、第１のクライアント（４０１）は、ステップ４２２で行われた２文字目を消去する操作列を第２のクライアント（４０２）から受け取る。従って、“ＣＬＯＤ”は、“ＣＯＤ”となる。一方、ステップ４２３で、第２のクライアント（４０２）は、ステップ４１２で行われた４文字目を消去する操作列を第１のクライアント（４０１）から受け取る。従って、“ＣＯＵＤ”は、“ＣＯＵ”となる。
よって、第１のクライアント（４０１）での編集結果は“ＣＯＤ”であり、一方、第２のクライアント（４０２）での編集結果は“ＣＯＵ”である。従って、第１のクライアント（４０１）と第２のクライアント（４０２）との間でコンテンツが一致しない。
以上の通りであるから、図４Ａの例では、同期が操作列の送受信において失敗している。
【００７５】
図４Ｂは、図４Ａの例にＯＴを適用し、データを同期する例を示す。
ステップ４３１及びステップ４４１で、第１のユーザ（４０３）及び第２のユーザ（４０４）は、同じ文章の内容“ＣＬＯＵＤ”から編集をそれぞれ開始する。
ステップ４３２で、第１のクライアント（４０１）が、４文字目を消去する操作を第１のユーザ（４０３）から受け取る。従って、“ＣＬＯＵＤ”は、“ＣＬＯＤ”となる。一方、ステップ４４２で、第２のクライアント（４０２）が、２文字目を消去する操作を第２のユーザ（４０４）から受け取る。従って、“ＣＬＯＵＤ”は、“ＣＯＵＤ”となる。
次に、ステップ４３３で、第１のクライアント（４０１）が、ステップ４４２で行われた２文字目を消去する操作列を第２のクライアント（４０２）から受け取る。ＯＴによって、第２のクライアント（４０２）から受け取ったこの操作がステップ４３２の４文字目を消去する操作（ステップ４３２）に依存しないことが判定されるので、当該操作は、そのまま実行される。従って、“ＣＬＯＤ”は、“ＣＯＤ”となる。一方、ステップ４４３で、第２のクライアント（４０２）は、ステップ４３２で行われた４文字目を消去する操作列を第１のクライアント（４０１）から受け取る。ＯＴによって、第１のクライアント（４０１）から受け取ったこの操作が前の２文字目を消去する操作（ステップ４４２）に依存することが判定される。そして、ＯＴによって、当該操作は４文字目を消去する操作から３文字目を消去する操作に変換されて実行される。従って、“ＣＯＵＤ”は、“ＣＯＤ”となる。
よって、第１のクライアント（４０１）及び第２のクライアント（４０２）での編集結果はいずれも“ＣＯＤ”であるので、第１のクライアント（４０１）及び第２のクライアント（４０２）との間でコンテンツが一致する。
以上の通りであるから、図４Ｂの例では、ＯＴを使用することによって、同期が操作列の送受信において成功している。
【００７６】
図５は、ＯＴを適用し、２つの操作列をマージする例を示す。
サーバ（５０１）で第１のクライアント（５０２）及び第２のクライアント（５０３）からそれぞれ操作列１（５１１）及び操作列２（５１２）を受信したとする。
操作列１（５１１）はＡ〜Ｄ及びＦ〜Ｈの各操作からなり、Ｃは削除する操作であり、Ｇ及びＨは挿入する操作であることを示す。
操作列２（５１２）はＡ〜Ｂ及びＤ〜Ｈの各操作からなり、Ｂ、Ｄ及びＧは削除する操作であり、Ｅは挿入する操作であることを示す。
操作列１（５１１）及び操作列２（５１２）を、ＯＴを適用してマージした結果、操作列１のＧ（挿入である）は、操作列２のＧ（削除である）によって消されてしまう。そして、操作列１（５１１）及び操作列２（５１２）をマージした操作列（５１３）は、Ａ〜Ｆ及びＨの各操作からなり、Ｂ、Ｃ及びＤは削除する操作であり、Ｅは挿入する操作であることを示す。結果的に、ＯＴによるマージされた操作列は、Ａ〜Ｆ及びＨである。操作列１（５１１）及び操作列２（５１２）をマージした上で、１つの操作列として実行しても、同じ結果が得られる（５１３）。
さらに、マージによって、送受信するデータの削減が可能である。
【００７７】
図６は、本発明の実施形態である、トランク・データとブランチ・データとの関係を示すフローチャートである。
各ステップの主体は、ブランチ・データ（６０２）とトランク・データ（６０１）とのコンテンツの比較を行うハードウェアである。図２Ａ〜図２Ｃ及び図３Ａに示すようなサーバ−クライアント関係にあるシステムの場合、図６に示す各ステップの主体はサーバである。図２Ｄ及び図３Ｂに示すようなクライアント−クライアント関係にあるシステムの場合、各ステップの主体は第１のクライアント又は第２のクライアントのいずれかであり、上記比較を行うハードウェアである。図８及び図１０〜図１５についても同様である。
【００７８】
以下では、図２Ａ〜図２Ｃ及び図３Ａに示すサーバ−クライアント関係にあるシステムの場合を例に述べるが、図２Ｄ及び図３Ｂに示すようなクライアント−クライアント関係にある場合を排除するものでない。図３Ａに示すクライアント−サーバ環境において、クライアント（３０２ａ）が第１のクライアントであり、及びクライアント（３０２ｂ）が第２のクライアントであるとして説明する。クライアント（３０２ａ）とクライアント（３０２ｂ）とは、ネットワークを介してサーバ（３０１）に接続されている。第１のクライアント（３０２ａ）は、第１のユーザによって操作される。第２のクライアント（３０２ｂ）は、第２のユーザによって操作される。第２のクライアントは、１又は複数あってよい。
【００７９】
ステップ６１１では、第１のユーザが他のユーザ（すなわち第２のユーザ）に編集されたくないオブジェクト（指定オブジェクト）を第１のクライアントを介して指定する。当該指定は、例えばマウス又はカーソルによる範囲選択、項目のメニュー選択によって行われうる。項目は、例えばタイトル、文字、図形である。指定オブジェクトを示す情報は、第１のクライアントからサーバに送信される。サーバは、指定オブジェクトを示す情報を第１のクライアントから受信し、当該指定オブジェクトを示す情報をサーバのメモリ内に格納する。当該指定オブジェクトを示す情報は、例えばオブジェクトの識別子でありうる。当該指定オブジェクトを示す情報は、コンテンツ・データごとにファイルとして保存されてもよく、あるいは、複数のコンテンツ・データについてまとめて保存されていてもよい。
ステップ６１２では、サーバは、第２のユーザが当該指定オブジェクトに変更を加えたかどうかを監視する。当該監視は、第２のクライアントから送信されるオブジェクトの変更の指示を示すデータにより行われる。変更の指示を示すデータは、例えばオブジェクトのＩＤと、当該ＩＤで指示されているオブジェクトへの操作の情報である。具体的には、あるオブジェクトの色を変える場合では、オブジェクトの変更の指示を示すデータは、当該オブジェクトのＩＤと当該オブジェクトに新たに設定された色である。第２のユーザが指定オブジェクトを変更していない間は、第１のユーザによる変更の指示を示すデータがサーバに送信され、そして、当該サーバのメモリ内にあるトランク・データに対して変更が加えられる（なぜならば、下記に述べるようにブランチ・データがまだ作成されていなためである）。トランク・データとは、上述したように、共同編集における幹となるデータである。
ステップ６１３では、サーバは、第２のユーザが指定オブジェクトを変更したことを検出する。
ステップ６１４では、サーバは、上記検出に応じて、当該変更された指定オブジェクトについてのブランチ・データをサーバのメモリ内に自動的に作成する。ブランチ・データとは、上述したように、トランク・データから分岐したものであり、指定オブジェクトのコピーである。サーバはまた、第１のクライアントから送信される指定オブジェクトについての変更の指示を示すデータを上記ブランチ・データが格納されているメモリ内に格納する。
ステップ６１５では、サーバは、第２のクライアントから送信される指定オブジェクトについての変更の指示を示すデータを上記トランク・データが格納されているメモリ内に格納する。サーバは、指定オブジェクトについての変更の指示を示すデータが第１のクライアントからのものであるか、第２のクライアントのものであるかを、例えばクライアントＩＤにより識別し、当該データが第１のクライアントからのものである場合には当該データを上記ブランチ・データが格納されているメモリ内に格納し、一方当該データが第２のクライアントからのものである場合には当該データを上記トランク・データが格納されているメモリ内に格納するようにしうる。
ステップ６１６では、サーバは、トランク・データ（６０１）が格納されているメモリ内の変更指示データに対応する操作列と、ブランチ・データ（６０２）が格納されているメモリ内の変更指示データに対応する操作列とがマージ可能であるかどうかを判定する。当該判定において、ＯＴが適用される。ＯＴを使用することで、効率的な計算をすることが可能である。トランク・データ（６０１）の上記操作列とブランチ・データ（６０２）の上記操作列との比較をＯＴの枠組みで行うことにより、比較のリアルタイム性が確保される。第２のユーザの編集内容が第１のユーザの編集内容のサブセットとなっているとき、サーバは、ブランチ・データ（６０２）の内容がトランク・データ（６０１）の内容とマージ可能であると判定する。そして、サーバは、ＯＴを使用して、第１のユーザによる操作列を第２ユーザのコンテンツ・データ（すなわち、指定オブジェクトについてのブランチ・データの作成後におけるトランク・データ（６０１）である）に適用する。その後、サーバは、ブランチ・データ（６０２）を上記メモリから削除する。このように、マージできるときにブランチ・データ（６０２）をメモリから削除するので、ファイルが必要以上に分散することを防ぐことが可能である。ブランチ・データ（６０２）の削除によって、トランク・データ（６０１）に戻る。
ステップ６１７では、サーバは、ステップ６１２に戻り、第２のユーザが当該指定オブジェクトに変更を加えたかどうかを新たに監視する。すなわち、サーバは、指定オブジェクトを示す情報を新たに待つ。
【００８０】
図７Ａは、本発明の実施形態における、図２Ａ〜図２Ｃ及び図３Ａに示すようなサーバ−クライアント・システムにおいて、コンテンツ・データ中のオブジェクトの共同編集を可能にするフローを示す。
以下では、図３Ａに示すようなサーバ−クライアント環境にあるシステムの場合を例に述べる。図３Ａに示すクライアント−サーバ環境において、クライアント（３０２ａ）が第１のクライアントであり、及びクライアント（３０２ｂ）が第２のクライアントであるとして説明する。
ステップ７０１では、サーバは、編集対象のコンテンツ・データのトランク・データを当該サーバのメモリ内に作成し、保存する。サーバは、第１のクライアント及び第２のクライアントからデータを受信する。当該データが、オブジェクトの変更である場合、上記メモリ内にあるトランク・データに対して変更を加える。当該データが指定オブジェクトを示す情報である場合、当該データを送信したクライアントを第１のクライアントとし、その他のクライアントを第２のクライアントとする。当該指定オブジェクトは、第１のユーザが第２のユーザによる編集が許されないオブジェクトとして指定したものである。
ステップ７０２では、サーバは、コンテンツ・データ中のオブジェクトの変更の指示を監視する。
（ａ）当該オブジェクトの変更指示データが、指定オブジェクト以外のオブジェクトに対する変更指示データであれば、当該オブジェクトの変更指示データが第１のユーザからの変更指示データであるか又は第２のユーザからの変更指示データであるかを問わずに、上記メモリ内にあるトランク・データに対して変更が加えられる。
（ｂ）当該オブジェクトの変更指示データが、指定オブジェクトに対する変更である場合、処理はステップ７０３に進む。
ステップ７０３では、サーバは、指定オブジェクトに対する変更指示データが、第１のユーザからのものであるか、又は第２のユーザからのものであるかを判定する。当該判定は、例えばクライアントのＩＤを使用して行われる。
（ｃ）当該オブジェクトの変更指示データが第１のユーザからのものである場合、上記トランク・データに対して変更が加えられる。そして、処理はステップ７０２に戻る。
（ｄ）当該オブジェクトの変更指示データが、指定オブジェクトに対する変更であり、当該オブジェクトの変更の指示が第２のユーザからのものである場合、処理はステップ７０４に進む。
ステップ７０４では、サーバは、上記（ｄ）の場合に、当該サーバのメモリ内に、指定オブジェクトについてのブランチ・データを自動的に作成する。ここで、ブランチ・データは指定オブジェクトについてのものであり、指定オブジェクト以外のオブジェクトについてブランチ・データは作成されない。メモリのコストを削減するためである。
ステップ７０５では、サーバは、オブジェクトの変更指示データを監視する。
（ｅ）当該オブジェクトの変更指示データが、指定オブジェクト以外のオブジェクトに対する変更指示データであれば、当該オブジェクトの変更指示データが第１のユーザからの変更指示データであるか又は第２のユーザからの変更指示データであるかを問わずに、上記メモリ内にあるトランク・データに対して変更が加えられる。そして、処理はステップ７０２に戻る。
（ｆ）当該オブジェクトの変更指示データが、指定オブジェクトに対する変更指示データである場合、処理はステップ７０６に進む。
ステップ７０６では、サーバは、指定オブジェクトに対する変更指示データが、第１のユーザからのものであるか、又は第２のユーザからのものであるかを判定する。当該判定は、例えばクライアントのＩＤを使用して行われる。
（ｇ）当該オブジェクトの変更指示データが第２のユーザからの変更指示データである場合、処理はステップ７０７に進む。
（ｈ）当該オブジェクトの変更指示データが第１のユーザからの変更指示データである場合、処理はステップ７０８に進む。
ステップ７０７では、サーバは、第２のユーザからの変更指示データに対応する操作列をトランク・データとして保存する。そして、処理はステップ７０２に戻る。
ステップ７０８では、サーバは、第１のユーザからの変更指示データに対応する操作列をブランチ・データとして保存する。
ステップ７０９は、ブランチ・データが作成されてから所定の時間を経過することによって、又はユーザからの指示によって（下記図１４及び図１５を参照）開始される。サーバは、トランク・データの変更指示データに対応する操作列と、ブランチ・データの変更指示データに対応する操作列とがマージ可能であるかどうかを判定する。当該判定において、ＯＴが適用される。マージが可能である場合は、処理はステップ７１０に進む。マージが不可能である場合は、処理はステップ７０２に戻る。
ステップ７１０では、サーバは、マージが可能であるとの判断に応じて、ＯＴを使用して、第１のユーザによる操作列を第２ユーザのコンテンツ・データ（すなわち、指定オブジェクトについてのブランチ・データの作成後におけるトランク・データである）に適用する。
ステップ７１１では、マージ適用後に、当該処理を終了する。
【００８１】
図７Ｂは、本発明の実施形態における、図２Ｄ及び図３Ｂに示すようなクライアント−クライアント・システムにおいて、コンテンツ・データ中のオブジェクトの共同編集を可能にするフローを示す。
以下では、図３Ｂに示すようなクライアント−クライアント環境にあるシステムの場合を例に述べる。図３Ｂに示すクライアント−クライアント環境において、クライアント（３１２ａ）が第１のクライアントであり、及びクライアント（３１２ｂ）が第２のクライアントであるとして説明する。
ステップ７２１では、第１のクライアント及び第２のクライアントの一方のユーザが他のユーザによって編集されたくないオブジェクトを指定する。指定オブジェクトを指定したクライアントが第１のクライアントであり、その他のクライアント全てが第２のクライアントである。第１のクライアントは、指定オブジェクトを示す情報を第２のクライアントへ送信する。
ステップ７２２では、第２のクライアントは、第１のクライアントから指定オブジェクトを示す情報を受信し、当該第２のクライアントの記憶部に格納する。
ステップ７２３では、第２のクライアントは、指定オブジェクトを示す情報を受信後に、指定オブジェクトについて第２のユーザによる変更の指示を示す変更指示データを受信した場合、当該変更指示データを第１のクライアントに送信する。当該変更指示データの送信は、所定の時間ごとに、所定の変更指示データ数ごとに、又はユーザの指示により行われるようにしてよい。
ステップ７２４では、第１のクライアントは、第２のクライアントからの最初の変更指示データの受信に応じて、指定オブジェクトについてのブランチ・データを当該第1のクライアントの記憶部内に作成する。
ステップ７２５では、第１のクライアントは、指定オブジェクトを示す情報を受信後に、指定オブジェクトについて第１のユーザによる変更の指示を示す変更指示データを当該第１のクライアントの記憶部内に格納する。
ステップ７２６では、第２のクライアントは、ステップ７２３の上記変更指示データを第２のクライアントの記憶部に格納する。なお、当該格納は、ステップ７２３において上記変更指示データの第１のクライアントへの送信前に、又は送信と同時に行ってもよい。
ステップ７２７は、ブランチ・データが作成されてから所定の時間を経過することによって、又はユーザからの指示によって（下記図１４及び図１５を参照）開始される。トランク・データ全ては、当該開始の決定に応じて、第２のクライアントから第１のクライアントに送信するようにしてよい。代替的には、トランク・データは、その作成ごとに、第２のクライアントから第１のクライアントに送信するようにしてよい。第１のクライアントは、トランク・データの変更指示データに対応する操作列と、ブランチ・データの変更指示データに対応する操作列とがマージ可能であるかどうかを判定する。当該判定において、ＯＴが適用される。マージが可能である場合は、処理はステップ７２８に進む。マージが不可能である場合は、処理はステップ７２５に戻る。
ステップ７２８では、第１のクライアントは、トランク・データの変更指示データを第２のクライアントに送信する。
ステップ７２９では、第２のクライアントは、マージが可能であるとの判断に応じて、ＯＴを使用して、第１のユーザによる操作列を第２ユーザのコンテンツ・データ（すなわち、指定オブジェクトについてのブランチ・データの作成後におけるトランク・データである）に適用する。適用後に、第２のクライアントはブランチ・データを削除してもよい旨のメッセージを第１のクライアントに送信する。
ステップ７３０では、マージを適用後に、或いは第１のクライアントからブランチ・データを削除した旨のメッセージを受信することに応じて、当該処理を終了する。
【００８２】
図７Ｃは、本発明の実施形態における、図２Ｄ及び図３Ｂに示すようなクライアント−クライアント・システムにおいて、コンテンツ・データ中のオブジェクトの共同編集を可能にするフローを示す。
図７Ｂと同様に、以下では、図３Ｂに示すようなクライアント−クライアント環境にあるシステムの場合を例に述べる。図３Ｂに示すクライアント−クライアント環境において、クライアント（３１２ａ）が第１のクライアントであり、及びクライアント（３１２ｂ）が第２のクライアントであるとして説明する。
ステップ７４１では、第１のクライアント及び第２のクライアントの一方のユーザが他のユーザによって編集されたくないオブジェクトを指定する。指定オブジェクトを指定したクライアントが第１のクライアントであり、その他のクライアント全てが第２のクライアントである。第１のクライアントは、指定オブジェクトを示す情報を第２のクライアントへ送信する。
ステップ７４２では、第２のクライアントは、第１のクライアントから指定オブジェクトを示す情報を受信し、当該第２のクライアントの記憶部に格納する。
ステップ７４３では、第２のクライアントは、指定オブジェクトの最初の変更が第２のユーザによって行われることにより、指定オブジェクトについてのブランチ・データを当該第２のクライアントの記憶部内に作成する。そして、第２のクライアントは、指定オブジェクトについてのブランチ・データが作成されたことを第１のクライアントに知らせるメッセージを送信する。
ステップ７４４では、第１のクライアントは、ステップ７４３のメッセージを受信する。
ステップ７４５では、第１のクライアントは、ブランチ・データが作成されたメッセージの受信することに応じて、当該メッセージに含まれるブランチ・データの作成時間以降の第１のユーザによる変更の指示を示す変更指示データを、トランク・データとして当該第２のクライアントの記憶部内に格納する。
ステップ７４６では、第２のクライアントは、指定オブジェクトを示す情報を受信後に、指定オブジェクトについて第２のユーザによる変更の指示を示す変更指示データを、ブランチ・データとして当該第２のクライアントの記憶部内に格納する。
ステップ７４７は、ブランチ・データが作成されてから所定の時間を経過することによって、又はユーザからの指示によって（下記図１４及び図１５を参照）開始される。トランク・データ全ては、当該開始の決定に応じて、第１のクライアントから第２のクライアントに送信するようにしてよい。代替的には、トランク・データは、その作成ごとに、第１のクライアントから第２のクライアントに送信するようにしてよい。第２のクライアントは、トランク・データの変更指示データに対応する操作列と、ブランチ・データの変更指示データに対応する操作列とがマージ可能であるかどうかを判定する。当該判定において、ＯＴが適用される。マージが可能である場合は、処理はステップ７４８に進む。マージが不可能である場合は、処理はステップ７４６に戻る。
ステップ７４８では、第２のクライアントは、ブランチ・データの変更指示データに対応する操作列を第１のクライアントに送信する。
ステップ７４９では、第１のクライアントは、マージが可能であるとの判断に応じて、ＯＴを使用して、ブランチ・データの変更指示データに対応する操作列を第１ユーザのコンテンツ・データ（すなわち、指定オブジェクトについてのブランチ・データの作成後におけるトランク・データである）に適用する。適用後に、第１のクライアントはブランチ・データを削除してもよい旨のメッセージを第２のクライアントに送信する。
ステップ７５０では、マージを適用後に、或いは第２のクライアントからブランチ・データを削除した旨のメッセージを受信することに応じて、当該処理を終了する。
【００８３】
図８は、本発明の実施形態である、図６のステップ６１６の比較のフローチャートである。
ステップ８０１では、サーバは、ブランチ・データ（６０２）とトランク・データ（６０１）との比較を、ＯＴを適用して開始する。
ステップ８０２では、サーバは、ブランチ・データ（６０２）を作成後に第１のユーザ以外の第２のユーザ全てによって変更された指定オブジェクトについての操作列全てをＯＴで計算し、結果Htを得る。Htとは、トランク・データに対する第１のユーザ以外の第２のユーザ全てによる操作列である。
ステップ８０３では、サーバは、ブランチ・データ（６０２）を作成後に第１のユーザのみによって変更された指定オブジェクトについての操作列全てをＯＴで計算し、結果Hbを得る。Hbとは、ブランチ・データに対する第１のユーザだけによる操作列である。
ステップ８０４では、サーバは、ＯＴを用いて、ブランチ・データとトランク・データとがマージ可能であるかどうかを判定する。マージ可能である条件の１つは、指定オブジェクトについてのブランチ・データの作成後におけるHtの操作列全てをＯＴで計算した結果であるHtが空であることであり、又はマージ可能である条件の他は、指定オブジェクトについてのブランチ・データの作成後におけるHtの操作列全てをＯＴで計算した結果であるHtと、指定オブジェクトについてのブランチ・データの作成後におけるHbの操作列全てをＯＴで計算した結果であるHbとの距離が０（ゼロ）であることである。距離が０でない場合、すなわちマージ不可能である場合には、ステップ８０６に進み、比較のプロセスを終了する。
ステップ８０５では、サーバは、マージ可能であると判定することに応じて、ブランチ・データとトランク・データをマージする（ステップ８０６）。
ステップ８０６では、サーバは、上記比較のプロセスを終了する。
【００８４】
上記比較においてＯＴを用いる方法では、ユーザの意図とは違うが、結果的に内容が同じであったときには検出できない。例えば、“ｄｄｄ”という文字列の１文字目を消したものと、当該文字列の３文字目を消したものとは違うものとして扱う。結果的に内容が同じであったときの検出は、いずれのユーザ（第１のユーザ、第２のユーザ）もオフラインのときに、バッチ処理でブランチ・データ（６０２）とトランク・データ（６０１）との比較をすることで対処する。
【００８５】
操作列に新しい操作を追加するために実装される定義を、以下に説明する。
（１）Onewは、新しくトランクに適用された操作を示す。
ａ）Onew は、トランクを編集中のユーザ間のコンテンツの同期をするために、既にＯＴによって、Htの全ての操作に対して、コンテクスト等価でない操作に変換されている。また、最後にトランクに対して適用された操作に対して、コンテクスト先行になっている。
Oi→Onew, 0<i<|Ht|
O|Ht|-1 |→ Onew
ｂ）ブランチの操作列に関しては、一人で操作しているので、コンテクスト等価な操作はないため、ブランチに対する新しい操作をOnewとすると、
Oi→Onew, 0<i<|Hb|
O|Hb|-1 |→ Onew
が常に成り立つので以下省略する。
【００８６】
（２）トランクの操作列 Ht は、以下のように保持されている。
Ht= Htd・Hti
ａ）Htd は、Ht の中で文字の削除の操作を示す。Ht の他の操作と変更点がオーバラップする場合、既にマージされている。 Htd は文字を削除する位置によって降順にソートされている。
ａ１）Hti のオーバラップする操作と既にマージされていることにより、Htd に含まれる削除の操作は元のコンテンツに対する削除の操作のみである。
ａ２）文字の挿入位置によって逆順にソートされていることで、 Htd に含まれる操作の位置は、元のコンテンツに対する位置と同一になる。ET(Htd[i],Htd[i-1])=Htd[i]  が常に成り立つためである。
ｂ）Hti は、Ht の中で文字の挿入の操作を示す。Ht の他の操作と変更点がオーバラップする場合、既にマージされている。 Htiは文字を挿入する位置によって逆順にソートされている。
ｂ１）文字の挿入位置によって逆順にソートされていることで、Hti に含まれる操作の位置は、元のコンテンツに対する位置と同一になる。ET(Hti[i],Hti[i-1])=Hti[i]  が常に成り立つためである。
【００８７】
トランク・データの操作列とブランチ・データの操作列の比較方法について、以下に説明する。
オブジェクトの色又は位置については操作列の比較は簡単であり、例えばオブジェクトの色や、サイズなどのオブジェクトの属性を比較して、異なる属性の数をそのまま距離にして行うことによって可能である。
テキストの変更についての操作列の比較を下記に説明する。説明を容易にするために、プレインテキストの例で説明する。ＯＴを一般のＸＭＬに拡張するのは、各操作を適用する位置 O.p を整数値を持つベクトルで表すことによって可能である。例えば、下記ＵＲＬに記載されている技術を使用することにより可能である：http://portal.acm.org/citation.cfm?id=587088（Aguido Horatio Davis等、”Generalizing operational transformation to the standard general markup language”, Computer Supported Cooperative Work, Proceedings of the 2002 ACM conference on Computer supported cooperative work, ACM, 58-67, 2002）（上記非特許文献６）。操作列は、文字の削除についての操作列、文字の挿入についての操作列の順に保持することによって、各操作を最大限にマージでき、そして操作列を小さくできる。例えば、下記ＵＲＬに記載されている技術を使用して可能である：http://portal.acm.org/citation.cfm?id=675712（Haifeng Shen等、”A Log Compression Algorithm for Operation-based Version Control Systems”, COMPSAC,Proceedings of the 26th International Computer Software and Applications Conference on Prolonging Software Life: Development and Redevelopment, IEEEComputer Society, 867-872, 2002）（上記非特許文献５）。
【００８８】
トランク・データの操作列 Ht は、文字の削除についての操作列を Htd、 文字の挿入についての操作列 Hti とすると、Ht = Htd ・Htiで表される。ブランチ・データの操作列Hbは同様に、文字の削除についての操作列を Hbd、文字の挿入についての操作列 Hbi とすると、Hb = Hbd ・ Hbiで表される。
また、Htdの操作は、Htiのうち操作の位置がオーバラップするものとマージされている。また同様に、Hbdの操作は、Hbiのうち操作の位置がオーバラップするものとマージされている。よって、文字の削除についての操作列Htd及びHbdは他の操作とマージされているため、元のコンテンツに対する削除の操作のみであり、挿入操作で新しく追加される文字についての削除の操作は含まない。
操作列を、文字の削除についての操作列、文字の挿入についての操作列の順に保持するのに加えて、Htd、Hti、Hbd、Hbi それぞれを各操作を適用する位置 O.p によって降順にソートして保持する。この計算方法の詳細は、下記にupdateHとして述べる。
【００８９】
O.pによって降順にソートされていれば、各操作を適用する位置は他の操作の影響を受けていない。
例１： [O1(1, “abc”),O2(5, “xyz”)]  の２つの操作列を、元のコンテンツが“親譲りの無鉄砲で小供の時から損ばかりしている”という文書に適用する場合
結果１： “親abc譲xyzりの無鉄砲で小供の時から損ばかりしている”
結果１では、O2は、元のコンテンツに対して、２文字目に挿入されている。
例２： [O1(5, “VW”), O2(2,“DEF”)] の２つの操作列を、元のコンテンツが“親譲りの無鉄砲で小供の時から損ばかりしている”という文書に適用する場合
結果２：“親譲DEFりの無VW鉄砲で小供の時から損ばかりしている”
【００９０】
Htd及びHbdは、挿入の操作よりも履歴の中で前方にあるので、編集位置でソートされていれば各操作を適用する位置は他の操作の影響を受けていない。すなわち、トランク・データとブランチ・データの操作で同じ位置を編集する操作は、元のコンテンツでも同じ位置を編集していることが保証できる。そのために、操作列の比較をすることによって、コンテンツ同士の比較をすることができる。
Hti及びHbiについては、Htd及びHbdそれぞれが履歴の前方にあることによって編集の位置がずれている。Hti及びHbiから、Htd及びHbdの影響を除けば、挿入の操作についてもトランク・データとブランチ・データの操作列を比較することによって、コンテンツ同士の比較をすることができる。この計算方法の詳細は、下記にexcludeDeleteとして述べる。
【００９１】
上記方法で得られたトランク・データとブランチ・データに対する文字の挿入の操作列は、それぞれの操作位置が元のコンテンツに対する操作位置と見なせるように保持されているので、以下に示すcalculateDistance のように、コンテンツの差分を動的計画法で計算できる。これを図示すると、図９のようになる。
【００９２】
図９は、コンテンツの差分を示すグラフである。
editDistanceは既存の文字列間の編集距離を計算する手法を用いる。Htd とHbd の計算は、HtiとHbiの距離の計算と同様であるので省略する。
【００９３】
calculateDistance(Hti,Hbi) {
dist ← 0;
y ← 0;
for (x=0; x<|Hti|; x++) {  // トランク・データに対する挿入の操作についてブランチ・データとの差分を調べる
if (y<|Hbi|) { 
while (Hbi[y].p  > Hti[x].p) { //トランク・データの操作と関係のない位置のブランチ・データの操作をスキップする
y++;
}
if (Hti[x].p==Hbi[y].p) {  // ブランチ・データ及びトランク・データの操作が同じ位置を編集する
dist += editDistance(Hti[x].s, Hbi[y].s);  //編集距離を計算する
} else { // ブランチ・データに同じ位置の編集がない
dist += Hti[x].len;  // トランク・データの編集内容がそのまま差分になる 
}
} else { // 既に、ブランチの操作全てを調べたとき
dist += Hti[x].len;  // トランク・データの編集内容がそのまま差分になる
}
}
return dist;
}
【００９４】
トランク・データとブランチ・データのコンテンツの差分は、文字の削除についての操作列の距離と、文字の挿入についての操作列の距離の和になる。この計算方法の詳細は、下記にdistanceTBとして述べる。
【００９５】
updateHについて、以下に説明する。
updateHは、Ht に新しい操作 Onew を追加して、上記のHt と同様の条件を満たす操作の履歴 Ht’ = Htd’・Hti’ を得る関数である。updateH(Ht, Onew) について、下記に詳述する。
【００９６】
updateH(H,Onew) {
H‘← H・Onew;  // 新しい操作をトランク・データの操作列に追加
for (i=|H’|-1;i>0; i--) { 
if (H’[i].p≧H’[i-1].p ∧ H’[i].p≦H’[i-1].p+ H’[i-1].len) {  // 新しい操作と編集位置とがオーバラップしている
(H’ [i], H’[i-1]) =MERGE(H’[i], H’[i-1]);  // 操作をマージする
} 
if (H’[i-1].t=del ∧ H’[i-1].p < H’[i-2].p){
break;  // 新しい操作はこれ以上マージできる操作がない
}  else {
(H’[i], H’[i-1]) =SWAP(H’[i], H’[i-1]);  // 新しい操作をさらに配列の前方に移動してマージできる操作があるか調べる
}
}
【００９７】
Onew’ ← H’[i];  // マージ可能な操作の履歴とマージした後の新しい操作は i 番目にある
if (Onew’.t=ins) {  // Onew’ が挿入の操作であれば、Hi の中の適切な位置に移動する
while (H[i+1].t=del ∨ H[i+1].p>H[i].p) {
(H’[i], H’[i+1]) =SWAP(H’[i], H’[i+1]);  // 新しい操作を操作の位置で正しくマージされるまで配列の後方に移動する
i++;
}
} else {
// Onew’ が削除の操作であれば既にソート済み
}
return H’;
}
【００９８】
excludeDeleteについて、以下に説明する。
トランク・データ及びブランチ・データの操作列 Ht, Hb の中の挿入に関する操作列 Hti及びHbi の編集位置は、Htd及びHbd の影響を受けている。Hti及びHbi に対して以下の計算を行うことで、Htd及びHbd による影響が取り除かれる。
【００９９】
excludeDelete(Hi, Hd) {
Hi’ ←  Hi;
for (i=0; i<|Hi|; i++) {
for (j=0; j<|Hd|; j++) {
Hi’[i] = ET(Hi’[i],Hj[j]);
}
}
return Hi’;
}
【０１００】
calculateDistanceについて、以下に説明する。
calculateDistanceは、トランク・データとブランチ・データとのコンテンツの距離は、以下のようにHtd及びHbd の距離と、Hti及びHbi の距離の和として計算できる。
【０１０１】
distanceTB(Ht,Hb) {
dist ← 0;
d  ist += calculateDistance(Htd, Hbd);
Hti’ ← excludeDelete(Hti, Htd);
Hbi’ ← excludeDelete(Hbi, Hbd);
dist += calculateDistance(Hti’, Hbi’);
return  dist;
}
【０１０２】
図１０〜図１３は、トランク・データとブランチ・データとのマージの例を示す。
【０１０３】
図１０は、本発明の実施形態である、指定オブジェクトが図形である場合のマージの例を示す。
図１０では、トランク・データに複数の図形（三角形、丸）が描かれている。
ステップ１００１では、第１のユーザは、図形  丸について編集されたくないために、丸を指定オブジェクトとして選択する。
ステップ１００２では、第２のユーザが指定オブジェクトである丸を上に移動する［（１）の操作］。
ステップ１００３では、第２のユーザが指定オブジェクトを移動したことに応じて、丸だけをブランチ・データとしてバッファ内に作成する［（２）の操作］。
ステップ１００４では、第１のユーザが丸を左に移動する［（３）の操作］。
ステップ１００５では、トランク・データとブランチ・データとがマージ可能であるかをＯＴを適用して判断する。
ステップ１００６では、マージ可能であることに応じて、（１）の操作は（３）の操作でキャンセルされるので（マージ）、丸は左に移動される。また、ブランチ・データが、バッファから削除される。
【０１０４】
図１１は、本発明の実施形態である、指定オブジェクトがテキストである場合のマージの例を示す。
図１１では、トランク・データに図形（三角形）及びテキスト（ＡＢＣ）が描かれている。
ステップ１１０１では、第１のユーザは、テキスト  ＡＢＣについて編集されたくないために、ＡＢＣを指定オブジェクトとして選択する。
ステップ１１０２では、第２のユーザが指定オブジェクトであるＡＢＣのうち、２文字目（Ｂ）に下線を入れる［（１）の操作］。
ステップ１１０３では、第２のユーザが指定オブジェクトを編集したことに応じて、ＡＢＣだけをブランチ・データとしてバッファ内に作成する［（２）の操作］。
ステップ１１０４では、第１のユーザが１〜３文字目を斜体にする［（３）の操作］。
ステップ１１０５では、第１のユーザが１〜３文字目に下線を入れる［（４）の操作］。
ステップ１１０６では、トランク・データとブランチ・データとがマージ可能であるかをＯＴを適用して判断する。
ステップ１１０７では、マージ可能であることに応じて、（１）の操作は（４）の操作でキャンセルされる（マージ）。結果として、ＡＢＣは斜体にされ、ＡＢＣに下線が付される。また、ブランチ・データが、バッファから削除される［（５）の操作］。
【０１０５】
図１２は、本発明の実施形態である、指定オブジェクトがテキストである場合のマージの例を示す。
図１２では、トランク・データに図形（三角形）及びテキスト（ＡＢＣ）が描かれている。
ステップ１２０１では、第１のユーザは、テキスト  ＡＢＣについて編集されたくないために、ＡＢＣを指定オブジェクトとして選択する。
ステップ１２０２では、第２のユーザが４文字目にＤを挿入する操作をしたために、指定オブジェクトであるＡＢＣの４文字目にＤが挿入される（（１）の操作）。
ステップ１２０３では、第２のユーザが指定オブジェクトを編集したことに応じて、ＡＢＣだけをブランチ・データとしてバッファ内に作成する（（２）の操作）。
ステップ１２０４では、第１のユーザが１文字目にＡを挿入する操作をしたために、指定オブジェクトであるＡＢＣの１文字目にＡが挿入される（（３）の操作）。
ステップ１２０５では、第１のユーザが５文字目にＤを挿入する操作をしたために、ＡＡＢＣの５文字目にＤが挿入される（（４）の操作）。
ステップ１２０６では、トランク・データとブランチ・データとがマージ可能であるかをＯＴを適用して判断する。
ステップ１２０７では、マージ可能であることに応じて、（１）の操作は（４）の操作でキャンセルされる（マージ）。結果として、ＡＢＣの１文字目にＡが挿入され、ＡＡＢＣの５文字目にＤが挿入されて、ＡＡＢＣＤとなる。また、ブランチ・データが、バッファから削除される。
【０１０６】
図１３は、本発明の実施形態である、指定オブジェクトが複雑なテキストである場合のマージの例を示す。
図１３では、トランク・データに、タイトル「Objectives」の下にあるテキスト「− Provide a tool for easy access to the Web」（以下、「テキスト１」及びテキスト「− Make Web a new information resource」（以下、「テキスト２」）、図形（矢印）及びテキスト（Reduce information gap.）が描かれている。
ステップ１３０１では、第１のユーザは、タイトル「Objectives」及びそのタイトル下に配置されるテキストについて編集されたくないために、タイトル「Objectives」を指定オブジェクトとして選択する。なお、タイトル「Objectives」を選択することによって、そのタイトル下にあるテキストについても編集されたくないことを示すことができるとする。
ステップ１３０２では、第２のユーザが指定オブジェクトを編集する。第２のユーザは、タイトル「Objectives」下のテキスト１の最後及びテキスト２の最後に、文字列「for blind」及び文字列「for blind」をそれぞれ挿入する操作をした。
ステップ１３０３では、ステップ１３０２の第２のユーザが指定オブジェクトを編集したことに応じて、タイトル「Objectives」及びそのタイトル下にあるテキストだけをブランチ・データとして記憶装置内に作成する。
そして、第１のユーザが、タイトル「Objectives」下のテキスト１の最後に文字列「for blind」を挿入し、テキスト２の１つめの語「Make」と２つめの語「Web」の間に語「the」を挿入し及びテキスト２の最後に文字列「for blind」を挿入し、並びにテキスト３として「provide tool for web developers」を挿入する操作をした。
ステップ１３０４では、トランク・データ（１３０２）とブランチ・データ（１３０３）とがマージ可能であるかをＯＴを使用して判断する。その結果、マージ可能であると判断される。従って、第１のユーザの操作列が、ＯＴを使用して、第２のユーザの操作列であるトランク・データ（１３０２）に適用される。
【０１０７】
ツリー構造（１３１１）はブランチ・データが作成される前のトランク・データについてのものであり、タイトル「Objectives」内の各テキスト１及び２がツリー構造で表現可能であることを示す。すなわち、タイトル「Objectives」が親ノードであり、テキスト１及び２それぞれが当該親ノードに対する子ノードである。
ツリー構造（１３１２）は、ブランチ・データが作成された後のトランク・データについてのものであり、タイトル「Objectives」内の各テキスト１、２及び３がツリー構造で表現可能であることを示す。ステップ１３０２では、テキスト１及びテキスト２に文字列「for blind」がそれぞれ追加されている。しかし、ステップ１３０１のツリー構造（１３１１）と比較して、ステップ１３０２のツリー構造（１３１２）は、親ノード及び子ノードとも変化していない。
ツリー構造（１３１３）はブランチ・データについてのものであり、タイトル「Objectives」内の各テキスト１及び２がツリー構造で表現可能であることを示す。ステップ１３０３では、テキスト３が追加されている。そこで、ステップ１３０１のツリー構造（１３１１）と比較して、ステップ１３０３のツリー構造（１３１３）において、第１層目のテキスト３についての子ノードが追加されている。
ツリー構造（１３１４）はトランク・データについてのものであり、タイトル「Objectives」内の各テキスト１、２及び３がツリー構造で表現可能であることを示す。テキスト１が、トランク・データ（１３０２）及びブランチ・データ（１３０３）で同じである。よって、テキスト１は、トランク・データ（１３０２）とブランチ・データ（１３０３）との間でマージ可能である。
トランク・データについてのツリー構造（１３１１）とブランチ・データについてのツリー構造（１３１２）に対する操作列の差分を計算することにより、コンテンツの差分を求めることができる。
【０１０８】
図１４から図１５は、本発明の実施形態である、トランク・データとブランチ・データとのマージを促すユーザ・インタフェースの例を示す。
【０１０９】
図１４は、本発明の実施形態である、トランク・データの操作列とブランチ・データの操作列との差分に従って、マージを促すユーザ・インタフェースの例である。
１４１１は、トランク・データの操作列とブランチ・データの操作列との差分の大小をグラデーションで示している。グラデーションは、例えば差分が大きいほど赤色になり、差分が小さいほど緑色になるようにしてよい。
元のコンテンツは、図１３の１３０１と同じであり、タイトル「Objectives」の下にテキスト１及びテキスト２を有する。
トランク・データ（１４０１）では、元のコンテンツに対して、タイトル「Objectives」下のテキスト１の最後に文字列「for blind」が挿入され、テキスト２の１つめの語「Make」と２つめの語「Web」の間に語「the」が挿入され及びテキスト２の最後に文字列「for blind」が挿入されている。
ブランチ・データ（１４０２）では、元のコンテンツに対して、タイトル「Objectives」下のテキスト１の最後に文字列「for blind」が挿入され、及びテキスト２の最後に文字列「for blind」が挿入されている。
従って、トランク・データ（１４０１）とブランチ・データ（１４０２）とのコンテンツのＯＴで求められる差分は小さい。そこで、ブランチ・データが作成されたオブジェクトの近傍に又は吹き出しで当該差分の大小を示すアイコンを表示し、その色を緑で表示する。ユーザは、該アイコンの色が緑であるので、マージがまだ必要でないと判断することが可能である。
トランク・データ（１４０３）では、トランク・データ（１４０１）に対して、テキスト３として「provide tool for web developers」が挿入されている。
ブランチ・データ（１４０４）では、トランク・データ（１４０２）と同じである。
従って、トランク・データ（１４０１）とブランチ・データ（１４０２）とのコンテンツの差分は大きい。そこで、ブランチ・データが作成されたオブジェクトの近傍に又は吹き出しで当該差分の大小を示すアイコンを表示し、その色を赤で表示する。ユーザは、該アイコンの色が赤であるので、マージが必要であると判断することが可能である。
上記コンテンツの差分の計算は、上記に示したcalculateDistanceのように、コンテンツの差分を動的計画法で計算できる。
上記コンテンツの差分が特に小さい場合に、マージを促す上記ユーザ・インタフェースを提供することによって、マージを促進することが可能である。
【０１１０】
図１５は、本発明の実施形態である、ブランチ・データの状態を視覚化することによって、マージを促すユーザ・インタフェースの例である。
元のコンテンツは、図１３の１３０１と同じであり、タイトル「Objectives」の下にテキスト１及びテキスト２を有する。
ブランチ・データ（１５０１）では、元のコンテンツに対して、タイトル「Objectives」下のテキスト１の最後に文字列「for blind」が挿入され、及びテキスト２の最後に文字列「for blind」が挿入されている。
ブランチ・データ（１５０２）のコンテンツは、ブランチ・データ（１５０１）と同じである。
トランク・データ（１５０３）では、元のコンテンツに対して、タイトル「Objectives」下のテキスト１の最後に文字列「for blind」が挿入され、テキスト２の１つめの語「Make」と２つめの語「Web」の間に語「the」が挿入され及びテキスト２の最後に文字列「for blind」が挿入され、並びにテキスト３として「provide tool for web developers」が挿入されている。
ステップ１５１１では、第１のユーザ（編集されたくないオブジェクトを指定したユーザ）は、ブランチ・データ（１５０１）のコンテンツを見ている。第１のユーザは、トランク・データの状態を視覚化するアイコンをクリックする。当該アイコンは、例えば、指定オブジェクトの近傍に又は吹き出しで表示されうる。
ステップ１５１２では、トランク・データ（１５０３）のコンテンツが、第１のユーザのモニタ画面に表示される。トランク・データ（１５０３）のコンテンツの表示は、例えばブランチ・データ（１５０２）の近傍に又は吹き出しで表示されうる。第１のユーザのモニタ画面は、トランク・データ（１５０３）のコンテンツの表示とともに、ブランチ・データ（１５０２）とトランク・データ（１５０３）とをマージするかどうかの指示を可能にするアイコンを備えていてよい。当該アイコンは、例えば「上書き」及び「キャンセル」である。「上書き」アイコンは、ブランチ・データ（１５０２）とトランク・データ（１５０３）とをマージすることを指示するアイコンである。「キャンセル」アイコンは、ブランチ・データ（１５０２）とトランク・データ（１５０３）とをマージすることを指示しないアイコンである。
ステップ１５１３では、第１のユーザが「上書き」をクリックすることによって、ブランチ・データ（１５０２）の操作列をトランク・データ（１５０３）に適用することにより、ブランチ・データ（１５０２）とトランク・データ（１５０３）のコンテンツがマージされる。そして、ブランチ・データ（１５０２）がバッファから削除される。
【図１】
2011253229.tif 000003
【図２Ａ】
2011253229.tif 000004
【図２Ｂ】
2011253229.tif 000005
【図２Ｃ】
2011253229.tif 000006
【図２Ｄ】
2011253229.tif 000007
【図３Ａ】
2011253229.tif 000008
【図３Ｂ】
2011253229.tif 000009
【図４Ａ】
2011253229.tif 000010
【図４Ｂ】
2011253229.tif 000011
【図５】
2011253229.tif 000012
【図６】
2011253229.tif 000013
【図７Ａ】
2011253229.tif 000014
【図７Ｂ】
2011253229.tif 000015
【図７Ｃ】
2011253229.tif 000016
【図８】
2011253229.tif 000017
【図９】
2011253229.tif 000018
【図１０】
2011253229.tif 000019
【図１１】
2011253229.tif 000020
【図１２】
2011253229.tif 000021
【図１３】
2011253229.tif 000022
【図１４】
2011253229.tif 000023
【図１５】
2011253229.tif 000024