问题标签 [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.

0 投票
1 回答
111 浏览

synchronization - 锁定 Google 实时数据库

我看到谷歌为 javascript 提供了 api 进行协作:所有客户端都看到相同的模型。日期(我相信在model.beginCompoundOperationand之间model.endCompoundOperation)声称是原子的和持久的。这对于单个控制器来说似乎是理想的 - 多个查看器(在模型更新时刷新),但对于并发应用程序来说似乎不够,IMO。就保护并发控制器而言,当它们都开始操纵模型而不考虑其他模型时,可能会导致模型不一致。

考虑身份计数器。您维护一个图表。那是你的模型。每个节点都必须有自己的 id。模型中有一个 nextID 值。当客户端创建一个节点时,它会增加该字段。但是,您知道另一个客户可以同时做同样的事情。他们都将计数器从 4 增加到 5。但是,添加了两个节点。这表明共享数据访问还必须提供锁定接口。我在 Google Realtime API 中看不到任何内容。甚至没有讨论。为什么似乎没有人注意到,也没有人关心?

0 投票
1 回答
102 浏览

microsoft-sync-framework - 同步框架:如何在同一应用程序的多个实例中使用/同步单个数据(文件)

目前我们有一个应用程序(图表编辑器),它能够在 xml 文件中保存和加载(序列化)其状态。

现在我们希望此应用程序的行为类似于 Microsoft OneNote 应用程序。多个用户可以访问同一个文件。

稍后我们可能还需要增强其他内容,例如(1)更改了什么以及谁更改了它,(2)解决冲突的选项(如果有)。

我开始了解同步框架来解决这个问题。到目前为止,我还没有尝试过。

我想要的只是,

  1. 几乎单个文件应该由同一应用程序的多个实例编辑。
  2. 我们需要一个执行以下操作的 dll(同步框架)

    • 它完全负责文件处理。
    • 使用这个 dll,应用程序的每个实例都会通知它们自己的更改。
    • 应用程序的每个实例都应该能够检测最近所做的更改(何时、谁、什么是更改)。

我的问题:

  1. 同步框架是否适合此要求?
  2. 如果是这样,是否有代表此的演示应用程序?
0 投票
1 回答
11424 浏览

algorithm - Google Docs 如何处理编辑冲突?

我一直在尝试编写自己的 Javascript 编辑器,其功能类似于 Google Docs(允许多人同时处理)。我不明白的一件事:

假设您已经让用户 A 和用户 B 直接相互连接,网络延迟为 10 毫秒。我假设编辑器使用差异系统(正如我理解 Docs 所做的那样),其中编辑表示为“在索引 3 处插入'文本'”,并且差异带有时间戳并强制由所有客户端按时间顺序应用。

让我们从包含以下文本的文档开始:“xyz123”

用户 A 在文档开头的时间戳 001ms 处键入“abc”,而用户 B 在时间戳 005ms 处在“xyz”和“123”之间键入“hello”。

两个用户都希望结果是:“abcxyzhello123”,但是,考虑到网络延迟:

  • 用户 B 将在 011 毫秒时收到用户 A 对“在索引 0 处插入 'abc'”的编辑。为了保持时间顺序,用户 B 将撤消用户 B 在索引 3 处的插入,在索引 0 处插入用户 A 的“abc”,然后在索引 3 处重新插入用户 B 的插入,现在位于“abc”和“xyz”之间”,因此给出“abchelloxyz123”
  • 用户 A 将在 015 毫秒时收到用户 B 对“在索引 3 处插入 'hello'”的编辑。它将识别出用户 B 的插入是在用户 A 之后完成的,并且只需在索引 3 处插入“hello”(现在在“abc”和“xyz”之间),给出“abchelloxyz123”

当然,“ abchello xyz123”与“ abc xyz hello 123”不一样

除了从字面上为每个字符分配自己的唯一 ID 之外,我无法想象 Google 将如何有效地解决这个问题。

我想到的一些可能性:

  • 跟踪插入点而不是发送带有差异的索引会起作用,但如果用户 B 在编辑前 1 毫秒移动了他的插入点,则会遇到完全相同的问题。
  • 您可以让用户 B 发送一些带有他的差异的信息,例如“在 'xyz' 之后插入”,以便用户 A 可以智能地识别这已经发生,但是如果用户 A 插入文本“xyz”怎么办?
  • 用户 B 可以识别这已经发生(当它接收到用户 A 的 diff 并看到它是冲突时),然后发送一个 diff 撤消用户 B 的编辑和一个插入用户 B 的 "hello" "abc".length 索引的新 diff正确的。这样做的问题是(1)用户 A 会在文本中看到“跳转”,并且(2)如果用户 A 继续编辑,那么用户 B 将不得不不断修复其差异 - 即使“修复器”差异也会关闭并需要修复,成倍增加复杂性。
  • 用户 B 可以连同它的 diff 一起发送一个属性,它收到的最后一个时间戳 diff 是 -005ms 或其他东西,然后 A 可以识别 B 不知道它的变化(因为 A 的 diff 是在 001ms)然后进行冲突解决。问题是(1)考虑到大多数计算机时钟不精确到毫秒,所有用户的时间戳都会略有偏差;(2)如果有第三个用户 C 与用户 A 有 25 毫秒的延迟,但与用户 B 有 2 毫秒的延迟,并且用户 C 在 -003ms 在“x”和“y”之间添加了一些文本,然后用户 B 将使用用户 C 的编辑作为参考点,但用户 A 不知道用户 C 的编辑(因此用户 B 的参考点)直到 22 毫秒。我相信如果您使用通用服务器为所有编辑添加时间戳,则可以解决此问题,但这似乎相当复杂。
  • 您可以给每个角色一个唯一的 ID,然后使用这些 ID 而不是索引,但这似乎有点矫枉过正......

我正在阅读http://www.waveprotocol.org/whitepapers/operational-transform,但很想听听解决此问题的所有方法。

0 投票
1 回答
991 浏览

java - 使用 CoderPad,为什么我在 System.in 上使用 Scanner 得到 NoSuchElementException?

我正在准备几天后的面试。有人告诉我,我应该熟悉CoderPad,因为这是我将要采访的合作者。然而,当我意识到我无法使用 Scanner 类从 System.in 读取输入时,我正在回答一个问题。

例如,运行以下命令:

给我的信息:

这里发生了什么?

0 投票
1 回答
566 浏览

rest - 如何在 swagger 文档上进行协作?

有没有办法在招摇的文件上进行协作?将 yml 放入 git 中,同时拥有 swagger 编辑器的出色功能?

0 投票
1 回答
32 浏览

google-drive-api - 更新刚刚创建的协作地图条目

我有一个图形编辑器,用户可以选择创建一个节点。它与所有当前选定的节点连接。在谷歌文档中,看起来一个节点(其字符串标签)映射到逗号分隔的一组连接标签。所以,要添加一个节点,我首先创建一个空地图项

然后,分别添加连接的项目

问题是 map.get 检测到该节点尚未添加到地图中。这需要一些时间。即使在单个 JS 客户端中,操作似乎也是非阻塞的(读我写不一致)。我应该如何处理它?

我在尝试建立两个连接时注意到了这种不一致(只是为了检测连接何时失败,因为可能会发生连接丢失并且我的所有编辑都不会传播到服务器,我想让用户知道这一点)。

0 投票
1 回答
956 浏览

distributed-computing - 哪些 CRDT 可用于实现功能齐全的协作富文本编辑器?

我一直在研究 CRDT,了解到它们已被用于构建协作编辑器,包括Ritzy、TreeDoc、WOOT 和 Logoot。

我对构建这样的编辑器很感兴趣,并且需要知道 CRDT 是否能够在一般情况下处理这个问题。

详细说明:富文本文档(想想 html)具有树结构,但节点是异构的。有块元素、行内元素、表格、列表等。此外,文档中可能嵌入了样式和样式表(例如 css)。最后,撤消是必不可少的。

上面列出的编辑器不处理更高级的功能,例如表格、嵌入式样式表和撤消/重做。

Ritzy 文档链接到描述基于 CRDT 的因果树的论文 ( pdf ),但我并不真正理解这篇论文。

因果树 CRDT 背后的基本原理是什么?处理上述异构树是否足够强大?或者,是否有其他 CRDT 可以处理这种情况?

0 投票
1 回答
170 浏览

p2p - 为什么 logoot 方法需要时钟?

我正在计划一个 P2P 协作编辑软件,我正计划使用 WOOT。问题是我会有大量的墓碑(原子是字符......)所以我搜索了更多并找到了这个关于 Logoot 方法的 PDF。除了一件事,我很清楚:为什么每个站点都需要时钟?我在文档中找不到任何提及此值用途的内容。

是否存在需要解决时钟而不发生冲突的情况?

0 投票
0 回答
217 浏览

git - 为什么 Git 不能跟踪所有文档文件类型的更改?

为什么 Git 会跟踪文本文件、markdown 文件和 LaTeX 文件的更改,而不是 Word 文件或 Google 文档?

我想弄清楚如何简化使用 Git 与不使用、不需要或想要像 Git 一样强大的东西的人协作写作。

0 投票
1 回答
92 浏览

reactjs - 用于协作文本编辑的 IPFS

我是 ReactJS 和 IPFS 的新手,试图用 textarea 创建网页,当我输入网页 1 的 textarea 时,它应该反映在另一个上,反之亦然。另外,我需要用 ipfs 来做这件事。任何有助于理解如何进行此操作。我尝试安装 yjs、http-server 和 ipfs。使用 textarea 绑定,但无法复制。帮助我了解如何实现这一目标。