协作编辑 - àLaGoog文档 - 是一个您仍然很少在应用程序中找到的功能。这种大流行中出现的少数好事之一是,更多的人似乎关心他们的应用程序适合远程协作。当然,他们总是关心实时合作。它只是添加到应用程序的一个非常硬的功能。 jupyter项目几年才占据了这一功能。最后,他们最终获得了一种基于我撰写的YJS框架的解决方案。本文概述了将所有工作放入Jupyter笔记本电脑的工作,最后描述了如何进行更多组件协作。
Jupyter笔记本始于2011年(后台,那么iPython Notebook)作为使数据科学可重现的努力,通过在笔记本上动态可视化数据。基本上,它允许您直接在文档中编写Markdown和代码。代码可以直接从笔记本交互方式执行,并在代码下方显示结果。这对于想要与他人分享研究的数据科学家非常棒。但它也是学习编程的一个很好的工具,因为它不需要设置编程环境。
从一开始,协作编辑是关于Jupyter笔记本的议程。 2012年,Jupyter贡献者和jupyterhub的核心贡献者和创造者/领导,@minrk在github问题跟踪器中写道:
[..]这最终将成为可行的实时合作可行的,这是我们最令人要求的最优先的新功能。 (来源)
然后,每个人都试图复制Google文档的协作编辑功能。 Google文档于2006年发布,是第一个支持丰富文本协作编辑的Web应用程序。在许多方面,谷歌文件在其时间之前。其他人需要数年来复制这个功能。即使在今天,协同编辑也远未普遍可用,即使这项技术已经获得80年代以来。
难怪,第一个协作jupyter笔记本实现,思考人士(或Colab)是由谷歌工程师创建的。他们为Jupyter笔记本重写了UI,并通过Google的RealTime API为它提供了一个协作笔记本模型,它在2017年被推翻了。该历史强调了将实时协作建立到应用程序中的挑战性:当谷歌实时API被弃用时,COLAB失去了实时协作能力,这是一个持续到这一天的差距。
2013年,威廉斯坦·斯坦伊·一家jupyter笔记本服务启动了Cocalc,从一开始就具有协作编辑支持。像Cocalc一样,Cocalc为Jupyter笔记本写了一个新的UI,同时重用了Jupyter架构的其他部分。他们制作了不同的选择,并为冲突解决了定制解决方案。我强烈建议观看下面的谈话,威廉斯坦威廉斯坦分享了他对近期共享编辑的最先进解决方案的经验。
仍然,开源jupyterlab项目不包括协作编辑。以下是一系列关于集成到jupyterlab的最佳共享编辑解决方案的一系列讨论,以对开源项目的用户提供协作编辑。 2017年Brian Granger,Chris Colbert和Ian Rose分享了他们的工作,将Google Realtime API集成到现有的Jupyterlab项目中,在那里他们表现出一个很棒的演示,可以成为协作的编辑可能成为什么。
在我的研究期间,我发现Ian Rose的几个PRS分开了视图(如何如何从模型中渲染Jupyter编辑器)(如何表示数据)。我没有跟他说过话,但我认为他发现的是,具有可以使用一些冲突解决框架同步的可观察数据结构是有助于的。在这种情况下,他刚刚碰巧使用Google Realtime API进行同步。他的工作包括抽象的工厂iModeldB,用于创建习惯的可观察数据结构。理论上,只需要使用一些实时API自动同步的可观察数据结构来实现IModeldB接口。
但是,提供的解决方案仍然基于专有的API,要求您将数据交给Google服务。因此,Jupyter社区正在研究实施自己的冲突解决方案。不同的人开始探索同时复制的数据类型(“CRDT”),以在其可观察数据结构上自动冲突解决方案。近年来,这项技术变得非常受欢迎,作为同时同时由许多同行设备操纵的数据的解决方案。如果您对该主题感兴趣,我建议在https://crdt.tech/上读取一些介绍材料。
Lumino(以前磷光体)是一个JS工具包,它通过在Jupyterlab扩展系统的基础上提供富有小部件,布局,事件,数据结构和插件系统的富有窗口小部件,布局,事件,数据结构和插件系统来提升Jupyterlab IDE。专为我们的用例而言,它提供了可观察数据结构,该结构用作所有Jupyter包的型号。 2017年,Chris Colbert开始雄心勃勃的努力来构建可用作可观察数据模型的高性能CRDT数据结构。从理论上讲,我们可以使用它来制作任何应用程序,这是基于Jupyter数据结构的协作。虽然Lumino CRDT很少知道,但到这一天它仍然是在网上工作的第二最快的CRDT实现。
2019年,Vidar Tonaas Fauske,Ian Rose和Saul Shanabrook开始工作,将Lumino CRDT融入Jupyterlab。他们的工作在Jupyterlab#6871中居住了一段时间,后来已被移动到单独的存储库Jupyterlab / RTC。
这基本上是我进来的地方。虽然Lumino CRDT非常令人敬畏,但在2020年,Brian Granger创建了一种亮相CRDT性能基准,揭示了关键的性能和算法问题(例如所谓的交织Anomoly)。在这个过程中,Brian发现了我的CRDT实现YJS,我们两个人开始讨论CRDT实现和YJS。
要添加对竞争对手的协作编辑功能,我们需要一堆功能,除了自动冲突解决方案。例如,我们预计我们在撤消撤消按钮时我们从未恢复其他用户的变更。因此,我们需要一个选择性撤消管理器,以某种方式忽略远程用户的变化。这样的东西真的很难在CRDT之上正确实施。
布莱恩最终让我与QuantStack一起使用,为Jupyterlab带来合作编辑。 YJS拥有现成的解决方案,适用于与构建协作应用有关的大多数问题,并且是唯一的CRDT实现,可在性能中击败Lumino CRDT。
当我听说Jupyterlab推动了8年来推动合作编辑时,我决定尽可能快地生产结果。我很欣赏我面前的所有工作,因为CodeBase已经清楚地将视图与模型分开。我的工作只是为了用YJS的共享类型(这是一个相当类似的概念)交换现有的可观察数据结构。在一个月的工作之后,我能够生产第一个原型。
但有一个问题。另一组由Eric Charles领导,也获得了在协作编辑上工作的资金,并选择另一种方法。虽然我简单地替换了现有的可观察数据结构,但他们试图重用现有的数据结构。我想充分利用YJS的功能,不想建立额外的抽象层,以便能够切换到另一个CRDT实现。有一段时间,似乎我们无法调和我们的方法。
经过许多与埃里克讨论后,我们终于提出了一个妥协,即我现在真的很兴奋。 YJS和ModeldB仅提供原始数据结构来构建协作应用程序。我们的计划是建立一个笔记本模型,易于使用的API来操作,观察和同步笔记本电脑上的更改。这将使其他应用程序可以保持与JupyterLab的兼容性,而不会刻到整个Jupyterlab存储库。我的希望是,像Cocalc或Vscode这样的其他笔记本相关的产品最终将使用该协作模型与其他Jupyter服务提供交叉兼容性。当然,一切协作。
自2月Eric Charles,Carlos Herrero,Jeremy Tuloup,我一直在努力设计和将这种协作模型集成到Jupyterlab中。其他人可以使用NPM注册表中的@ jupyterlab / shared模型包,使用相同的共享编辑技术为Jupyter笔记本电脑构建自己的接口。我们的更改终于合并为Jupyterlab,并且已经在jupyterlab v3.1.0的Alpha版本中提供。只需启动jupyterlab与--collaborative标志即可启用协作编辑。
使模型与共享数据结构之间的分离对我来说是一个令人兴奋的。 YJS的共享类型非常强大,并允许您制作任何类型的应用程序协作。但是,定义特定于应用程序的API的共享模型使开发人员更容易操作数据而不了解数据如何在CRDT中表示数据。这尤其相关,因为CRDT实现几乎总是概要(坎布里亚是例外)。维护良好的模型可以确保模型与以前的版本兼容。在未来,我想为在YJS,与日历,联系人,图纸和图表中表示不普通的事情定义更多共享模型。
我目前正在使用Bartosz Sypytkowski对YJS的生锈实施。生锈实现将是YJS CRDT对其他语言的所有其他港口的基线。感谢Pierre-Olivier Simonard和Pyo3,我们已经拥有模板,以从YRS CRDT创建语言绑定到Python封装“Y-PY”。在未来几个月内,我们将实现一个Python CRDT,它与Jupyterlab中使用的基于Web的CRDT完全兼容。这将允许后端和前端能够有效地交换可以同时操纵的数据。
目前,我们仍然通过Jupyter Server发送HTTP PRO请求以将文档保存到文件系统。一旦我们在Python工作的YJS CRDT,我们将创建一个Python实现的共享笔记本模型,这将允许Jupyter Server直接访问协作状态并将其与文件系统同步。此外,这将最终解决一段时间已久的问题,允许内核将输出直接写入笔记本,而无需先连接到客户端。为什么这重要?这将使您能够运行笔记本,然后关闭浏览器以运行计算过夜。内核将计算背景中的输出,并将其写入共享模型,然后通过Jupyter Server保存到文件系统。
我们希望提供不仅仅是一种合作的文本编辑体验。 YJS提供数据结构,以制作任何类型的应用程序协作。 YJS的用户使用它来构建协作绘图和图解解决方案。例如,relm.us使用YJS为建模3D世界提供建模的协作数据结构,其中数以千计的用户可以访问一起工作。我们正在探索我们如何使用相同技术使Jupyter小部件进行协作。
Carlos Herrero正在研究Jupyterlab的Drawio小部件,它使用他开发的自定义共享模型自动同步。我们要生成关于如何为jupyterlab创建自定义协作小部件的文档。 Jupyter小部件将能够利用YJS CRDT的丰富生态系统来创建小部件。例如,您想要添加WYSIWYG Rich-Text Editor小部件?当然,只需将Awesome Tiptap编辑器添加到窗口小部件,因为它已经使用YJS作为默认共享编辑技术。
Jeremy Tuloup正在努力追踪jupyterlab发行版,我特别兴奋。 Jupyterlite仅使用静态资产在浏览器中运行。使用基于WebasseMbly的Python运行时执行代码单元格。这已经很棒了疯狂的科学。现在他整合了我们的协作编辑方法,但使用WebRTC同步对等体,而无需设置冲突解决中的中央服务器。这为您提供了一个离线准备好的协作编辑体验,而无需设置任何服务器。非常酷!
我希望这让你对Jupyter的未来感到兴奋。肯定,我是。
最后,我希望我们能够欣赏这么多人进入这个项目的惊人的开源工作。我期待着人们采取合作编辑理所当然的未来。它一直是一条艰难的道路,我们都需要学习我们的课程来达到工作的解决方案。
资金承认:我对Quantstack的这项努力的工作已由Schmidt期货和Alfred P. Sloan基金会资助Cal Poly San Luis ObiSpo资助。