5

背景: 複数の人が 1 つのドキュメント/メモ帳を編集できる、メモ帳に似たアプリケーションを作成したいと考えています。グラフィック インターフェイスは既に作成しており、マルチ ユーザー コラボレーションの部分について調査を開始したいと考えています。

質問: あるクライアントのテキスト ボックスから別のクライアントのテキスト ボックスにテキストを移動するにはどうすればよいですか。ソケットを使用しますか?すべてのクライアントと共有するテキストをどこに保存しますか? 機能するリアルタイムの共同テキストボックスを作成するには、何を使用/実行する必要がありますか? 私が研究できる良い出発点は何ですか?

例 : Etherpad.com / Titanpad.com / Piratepad.com または Docs.Google.com (ウェブサイトではなく、デスクトップ アプリケーションを作成したい場合を除く)

回答で発生したいくつかの質問に対処します。

ユーザーが編集するドキュメントを選択する方法: はい

ユーザーが新しいドキュメントを作成する方法 : メイン メニューで [新しいファイル] オプションを選択する

多くのユーザーが一度に同じドキュメントを編集しようとするとどうなりますか? : 全員が文書の編集を許可されています。

変更が反映される前に、ユーザーは「保存」ボタンをクリックする必要がありますか? :いいえ、同時に変更を反映する必要があります

ユーザーはログインする必要がありますか? : はい

誰でも文書を編集できますか? またはアクセス制限はありますか? :制限があります。ドキュメントの作成者は、ユーザーがドキュメントを編集できないようにする可能性があります..

4

4 に答える 4

2

解決策を探すための最初のステップは、目的の最終結果を十分に詳細に定義することです。マルチユーザーコラボレーションの部分だけを検討するのではなく、ユーザーエクスペリエンス全体を説明してみてください。

  • ユーザーは編集したいドキュメントをどのように選択しますか?
  • ユーザーはどのようにして新しいドキュメントを作成しますか?
  • 多くのユーザーが同じドキュメントを一度に編集しようとするとどうなりますか?
  • 変更が反映される前に、ユーザーは「保存」ボタンをクリックする必要がありますか?
  • ユーザーはログインする必要がありますか?
  • 誰でもドキュメントを編集できますか、それともアクセス制限がありますか?

これらの設計上の決定を検討することにより、最終的には、いくつかの特定の実装に関する質問に答えることができます。

于 2012-05-12T05:13:46.413 に答える
0

Googleが(廃止された)Wave製品に使用していた操作変換を見てください。ライブラリへの関連リンクについては、こちらを確認してください。

于 2012-05-16T03:14:13.127 に答える
0

あなたは間違いなくetherpadのソースコードを調べる必要がありCollab_server.jsます.特に.それは多くの機能主義者を行うメインファイルです.このファイルの主な方法の1つは次のとおりです。チェックする価値があります:

function applyUserChanges(pad, baseRev, changeset, optSocketId, optAuthor) {
  // changeset must be already adapted to the server's apool

  var apool = pad.pool();
  var r = baseRev;
  while (r < pad.getHeadRevisionNumber()) {
    r++;
    var c = pad.getRevisionChangeset(r);
    changeset = Changeset.follow(c, changeset, false, apool);
  }

  var prevText = pad.text();
  if (Changeset.oldLen(changeset) != prevText.length) {
    _doWarn("Can't apply USER_CHANGES "+changeset+" to document of length "+
            prevText.length);
    return;
  }

  var thisAuthor = '';
  if (optSocketId) {
    var connectionId = getSocketConnectionId(optSocketId);
    if (connectionId) {
      var connection = getConnection(connectionId);
      if (connection) {
        thisAuthor = connection.data.userInfo.userId;
      }
    }
  }
  if (optAuthor) {
    thisAuthor = optAuthor;
  }

  pad.appendRevision(changeset, thisAuthor);
  var newRev = pad.getHeadRevisionNumber();
  if (optSocketId) {
    _getPadRevisionSockets(pad)[newRev] = optSocketId;
  }

  var correctionChangeset = _correctMarkersInPad(pad.atext(), pad.pool());
  if (correctionChangeset) {
    pad.appendRevision(correctionChangeset);
  }

  ///// make document end in blank line if it doesn't:
  if (pad.text().lastIndexOf("\n\n") != pad.text().length-2) {
    var nlChangeset = Changeset.makeSplice(
      pad.text(), pad.text().length-1, 0, "\n");
    pad.appendRevision(nlChangeset);
  }

  updatePadClients(pad);

  activepads.touch(pad.getId());
  padevents.onEditPad(pad, thisAuthor);
}

これは、最初から始めるのに役立つかもしれません。

于 2012-05-12T05:46:53.513 に答える