問題タブ [collaborative-editing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
microsoft-sync-framework - 同期フレームワーク: 単一のデータ (ファイル) を同じアプリケーションの複数のインスタンスで使用/同期する方法
現在、xml ファイルに状態を保存およびロード (シリアル化) できるアプリケーション (ダイアグラム エディター) があります。
ここで、このアプリケーションを Microsoft OneNote アプリケーションのように動作させたいと考えています。複数のユーザーが同じファイルにアクセスできる場所。
後で、(1) 何が変更され、誰が変更したか、(2) 競合があればそれを解決するオプションなど、他のことを強化する必要があるかもしれません。
これを解決する同期フレームワークについて知りました。これまでのところ、私はそれを試していません。
私が欲しいのは、
- 実質的に単一のファイルは、同じアプリケーションの複数のインスタンスで編集する必要があります。
以下を実行する dll (同期フレームワーク) が必要です。
- ファイル処理の完全な責任を負います。
- この dll を使用して、アプリケーションの各インスタンスは独自の変更を通知します。
- アプリケーションの各インスタンスには、最近行われた変更 (いつ、誰が、どのような変更を行ったか) を検出する機能が必要です。
私の質問:
- 同期フレームワークはこの要件に適していますか?
- もしそうなら、これを表すデモアプリケーションはありますか?
algorithm - Google ドキュメントは編集の競合をどのように処理しますか?
私は、Google Docs に似た機能 (複数の人が同時に作業できるようにする) を備えた、独自の Javascript エディターを作成することをいじっています。私が理解していないことの1つ:
ユーザー A とユーザー B が 10 ミリ秒のネットワーク遅延で互いに直接接続されているとします。私は、編集が「インデックス 3 に「テキスト」を挿入」のように表される diff システム (Docs が行っていることを理解している) をエディターが使用していると仮定しています。
「xyz123」というテキストを含むドキュメントから始めましょう。
ユーザー A はタイムスタンプ 001ms でドキュメントの先頭に「abc」と入力し、ユーザー B はタイムスタンプ 005ms で「xyz」と「123」の間に「hello」と入力します。
どちらのユーザーも、結果が「abcxyzhello123」になることを期待しますが、ネットワークの遅延を考慮すると、次のようになります。
- ユーザー B は、時間 011ms にユーザー A の「インデックス 0 に 'abc' を挿入」の編集を受け取ります。時系列の順序を維持するために、ユーザー B はユーザー B のインデックス 3 での挿入を元に戻し、ユーザー A の「abc」をインデックス 0 で挿入し、次にユーザー B のインデックス 3 での挿入を再挿入します。これは現在「abc」と「xyz」の間にあります。 、」したがって、「abchelloxyz123」が得られます
- ユーザー A は、時間 015ms にユーザー B の「インデックス 3 に「hello」を挿入」の編集を受け取ります。ユーザー B の挿入がユーザー A の後に行われたことを認識し、インデックス 3 (現在は "abc" と "xyz" の間) に "hello" を挿入するだけで、"abchelloxyz123" となります。
もちろん、「abchello xyz123」は「 abc xyz hello 123」と同じではありません。
文字通りすべてのキャラクターに独自の一意の ID を割り当てる以外に、Google がこの問題を効果的に解決する方法を想像することはできません。
私が考えたいくつかの可能性:
- ユーザー B が編集前に挿入ポイントを 1 ミリ秒移動した場合、まったく同じ問題が発生することを除いて、差分を含むインデックスを送信する代わりに挿入ポイントを追跡することは機能します。
- ユーザー B に、「'xyz' の後に挿入」などの情報を diff で送信してもらい、ユーザー A がこれが発生したことをインテリジェントに認識できるようにすることもできますが、ユーザー A がテキスト「xyz」を挿入するとどうなるでしょうか。
- ユーザー B は、これが発生したことを認識し (ユーザー A の diff を受信し、それが競合していることを確認すると)、ユーザー B の編集を元に戻す diff と、ユーザー B の "hello" "abc".length インデックスをさらに挿入する新しい diff を送信します。右。これに関する問題は、(1) ユーザー A がテキストに「ジャンプ」を表示すること、および (2) ユーザー A が編集を続ける場合、ユーザー B は継続的に差分を修正する必要があることです。修正する必要があり、複雑さが指数関数的に増加します。
- ユーザー B は、最後に受信したタイムスタンプ付きの diff が -005ms か何かであるというプロパティを diff と共に送信できます。その後、A は B がその変更について知らなかったことを認識し (A の diff は 001ms であったため)、競合の解決を行うことができます。問題は、(1) ほとんどのコンピューターの時計がミリ秒単位で正確ではないことを考慮すると、すべてのユーザーのタイムスタンプがわずかにずれることと、(2) ユーザー A との遅延が 25 ミリ秒でユーザー B との遅延が 2 ミリ秒の 3 番目のユーザー C が存在する場合、ユーザー C が -003ms で「x」と「y」の間にテキストを追加すると、ユーザー B はユーザー C の編集を参照点として使用しますが、ユーザー A はユーザー C の編集については知りません (したがって、ユーザー B の参照点) 22msまで。共通のサーバーを使用してすべての編集にタイムスタンプを付ければ、これは解決できると思いますが、それはかなり複雑なようです。
- 各キャラクターに一意の ID を与え、インデックスの代わりにそれらの ID を使用することもできますが、それはやり過ぎのように思えます...
http://www.waveprotocol.org/whitepapers/operational-transformを読んでいますが、この問題を解決するためのあらゆるアプローチを聞きたいです。
google-drive-api - 作成したばかりの共同マップ エントリの更新
ユーザーがノードを作成するオプションを持つグラフエディターがあります。現在選択されているすべてのノードに接続されます。Google ドキュメントでは、ノード (その文字列ラベル) が接続されたラベルのコンマ区切りセットにマップされているように見えます。ノードを追加するには、まず空のマップ アイテムを作成します。
次に、接続されたアイテムを個別に追加します
問題は、ノードがまだマップに追加されていないことを map.get が検出することです。時間がかかります。単一のJSクライアント内でも操作がブロックされないようです(read-my-writes inconsistent)。私はそれをどのように扱うべきですか?
2 つの接続を確立しようとしたときに、この不一致に気付きました (接続が失われ、すべての編集内容がサーバーに反映されない可能性があるため、接続がいつ失敗したかを検出するためであり、ユーザーにそのことを知らせたかったのです)。
distributed-computing - フル機能の共同リッチ テキスト エディターを実装するために使用できる CRDT はどれですか?
私は CRDT を研究しており、それらが Ritzy 、 TreeDoc、WOOT、Logootなどの共同エディターを構築するために使用されていることを理解しています。
私はそのようなエディタを構築することに興味があり、CRDT がこの問題を一般的に処理できることが知られているかどうかを知る必要があります。
詳しく説明すると、リッチ テキスト ドキュメント (html と考えてください) はツリー構造を持っていますが、ノードは異種です。ブロック要素、インライン要素、テーブル、リストなどがあります。さらに、ドキュメントにはスタイルとスタイルシート (css など) が埋め込まれている場合があります。最後に、取り消しは不可欠です。
上記のエディタは、テーブル、埋め込みスタイルシート、元に戻す/やり直しなどの高度な機能を処理しません。
Ritzy のドキュメントは、CRDT ベースの因果ツリー ( pdf ) を説明する論文にリンクしていますが、私はこの論文をよく理解していません。
因果樹 CRDT の背後にある基本原理は何ですか? 上記の異種ツリーを処理するのに十分強力ですか? あるいは、このシナリオを処理できる他の CRDT はありますか?
reactjs - 共同テキスト編集のための IPFS
私は ReactJS と IPFS を初めて使用し、テキストエリアを使用してウェブページを作成しようとしています。ウェブページ 1 のテキストエリアに入力すると、他のページに反映され、その逆も同様です。また、これをipfsで行う必要があります。これを進める方法を理解する上での助け。yjs、http-server、ipfsをインストールしてみました。textarea バインディングを使用しましたが、複製できませんでした。これを達成するための手順を教えてください。