碘化物:Mozilla互动科学编辑器


研究Lorenz吸引子,然后在Iodide中编辑代码

在过去的十年中,人们对“科学计算”和“数据科学”产生了浓厚的兴趣,即使用计算方法寻找问题的答案,分析自然科学和社会科学中的数据。 我们看到了专门的PL,工具和方法的蓬勃发展,这些PL,工具和方法可帮助科学家探索和理解数据和概念,并传达其发现。

但是今天,很少有科学工具能够充分利用现代浏览器的全部通信潜力。 数据挖掘的结果在浏览器中查看不是很方便。 因此,今天Mozilla推出了Iodide-一种实验工具,可帮助科学家使用Web技术在许多人熟悉的迭代工作流程中创建漂亮的交互式文档。

它不仅是用于在浏览器中创建交互式文档的编程环境。 碘化物试图通过链接编辑器和预览来帮助工作流程。 这与IDE样式不同,后者会生成pdf类型的演示文稿文档(然后将其与源代码分开)。 而且与笔记本电脑的风格不同,笔记本电脑混合了代码和表示元素。 在Iodide中,您不仅可以看到所需的文档,还可以轻松访问基本代码和编辑环境。

碘化物仍处于Alpha版本中,但是在Internet行业中,通常会说: “如果您对产品的第一个版本不感到困惑,那么发布就太迟了 因此,我们决定尽早发布,希望能收到社区的反馈。 我们有一个可以立即尝试的演示,但是仍然存在很多缺点(请不要在重要工作中使用此alpha!)。 我们希望您能闭上眼睛,了解概念本身的价值,您的反馈意见将帮助您了解我们应该朝哪个方向发展。

我们如何来到碘德


Mozilla的数据科学


Mozilla的数据科学几乎完全基于通信。 尽管有时我们会在用户面前直接部署数据挖掘模型,例如为浏览器推荐扩展的机制,但大多数时候,我们的专家会分析数据以识别模式并与工程师,产品经理和管理人员共享信息。

数据科学涉及编写许多代码,但是与传统的软件开发不同,我们的目标是回答问题,而不是创建软件。 这通常归结为创建某种报告-文档,图表或交互式数据可视化。 像其他所有人一样,我们在Mozilla使用JupyterR-Studio等出色的现代工具研究数据。 但是,当需要共享结果时,我们通常不能仅仅给“客户”一个Jupyter笔记本或R脚本,因此我们经常不得不将关键数字和摘要统计信息复制到Google文档中。

事实证明,从研究代码中的数据转换为易于理解的解释非常困难,反之亦然。 研究表明, 这是一个普遍的问题 。 当一位科学家阅读其他人的报告并想要查看相应的代码时,就会出现许多问题:有时很容易跟踪代码,有时则很容易。 显然,如果专家想通过更改代码进行试验,那仍然会变得复杂。 另一位科学家可能有您的代码,但是计算机上的配置不同,并且设置需要时间。


数据科学中的有用占空比

为什么科学中的网络如此之少?


在这种背景下,我于2017年底在Mozilla中启动了一个有关交互式数据可视化的项目。 现在,您可以使用Python,R和Julia中出色的库来创建此类可视化,但是对于我的项目,有必要切换到Javascript。 这意味着要摆脱熟悉的数据科学环境。 现代Web开发工具功能强大, 但功能极为复杂 。 违背我的愿望,我不得不创建完整的Javascript工具链,以通过大量模块的热装来进行构建,但是仍然找不到能够在生动,迭代的工作流程中生成清晰易读的Web文档的普通编辑器。

我开始想知道为什么没有这样的工具-为什么没有交互式网络文档的Jupyter类似物-我想知道为什么几乎没有人将Javascript用于科学计算。 似乎有三个重要原因:

  1. Java本身在科学界中作为缓慢而令人不适的语言而享有盛誉。
  2. 在浏览器中工作或支持Java的科学计算库并不多。
  3. 我发现缺乏支持快速迭代并直接访问浏览器演示功能的科学编程工具。

这些是很大的问题。 但是对于我们在Mozilla研究的“通信”数据科学而言,使用浏览器工作具有一些真正的优势。 当然,最大的优点是浏览器具有最先进和最受支持的数据可视化技术集:从DOMWebGLCanvasWebVR

考虑到上述沟通困难,我想到了另一个潜在的优势:在浏览器中,最终文档不必与创建它的工具分开。 我想制作一个用于Web文档(具有特定功能的Web应用程序)进行迭代科学工作的工具,而我们的许多工具本质上都是Web应用程序。 对于这些小型Web文档应用程序,为什么不将文档链接到编辑器?

因此,未经技术培训的读者可以查看精美的文档,科学家立即切换到源代码模式。 此外,由于计算是在浏览器JS引擎中进行的,因此科学家可以立即开始尝试使用该代码。 而这一切都无需连接到远程计算资源或安装任何软件。

碘化物的到来


我开始与同事讨论浏览器中科学计算的潜在利弊,在交谈中我们注意到了其他有趣的趋势。

在Mozilla内部, WebAssembly上出现了许多有趣的演示, WebAssembly是一个新平台,可在用Java语言以外的语言编写的浏览器中启动代码。 WebAssembly允许您以惊人的速度运行程序,在某些情况下,这些程序接近于本机二进制文件。 WASM运行资源密集型流程,即使是整个3D游戏引擎也不会出现问题。 原则上,您可以为WebAssembly编译世界上最好的C和C ++数值计算库,并将它们包装在符合人体工程学的JS API中,就像Python的SciPy项目所做的那样。 最后, 这样的 项目 已经 存在


WebAssembly允许您在浏览器中运行代码,几乎没有任何开销

我们还注意到,如果Javascript社区可以帮助人们更有效地解决他们的问题,则准备引入新的语法 。 也许您应该尝试模仿一些关键的语法元素,这些元素使数值编程在MATLAB,Julia和Python中更易于理解和灵活-这是矩阵乘法,多维切片,广播数组运算等。 再一次,我们发现许多人都同意我们的观点。

所有这些前提导致了一个问题:网络平台对科学计算的适用性如何? 至少,它可以帮助我们在Mozilla遇到的过程中(以及许多行业和学术界遇到的过程)进行通信。 凭借不断完善的 Javascript核心以及为数字编程添加语法扩展的能力,JS本身可能对科学家更具吸引力。 WebAssembly似乎允许使用严肃的科学图书馆。 椅子的第三脚是用于创建科学文档的网络环境。 在最后一个元素上,我们集中了实验,这使我们产生了碘化物。

解剖碘化物


Iodide是一种工具,可为科学家提供熟悉的工作流程,以利用Web平台的全部功能来创建出色的交互式文档。 作品以“报告”的形式构建-实际上,这是您填写内容的网页。 加上一些工具来迭代检查数据并修改报告以创建最终文档。 准备就绪后,您可以直接向其发送链接。 如果同事和员工要查看代码,则只需单击一下即可切换到学习模式。 如果您要尝试使用该代码并将其用作工作的基础,则只需单击一下鼠标即可。

接下来,我们将讨论一些有关如何使工作流程更加灵活的实验性想法。

报告模式和学习模式


碘化物致力于将研究,解释和协作联系在一起。 这里的中心位置是能够在美观的报告和有用科学计算进行迭代研究的有用环境之间移动的能力。

创建新的Iodide笔记本时,请进入“浏览视图”。 这是一组面板,包括用于编写代码的编辑器,用于查看输出数据的控制台,用于查看工作空间以检查在会话期间创建的变量的工具以及“预览报告”面板。


在碘化物研究模式下编辑降价代码

通过单击右上角的“报告”按钮,可以将预览面板的内容扩展到整个窗口。 对技术细节不感兴趣的读者可以专注于本文档的介绍,而无需研究代码。 当读者单击报告链接时,代码将自动启动。 要查看代码,请单击右上角的“ 浏览”按钮。 从那里,您可以复制笔记本以供自己研究。


从研究模式过渡到报告模式

只要您共享指向Iodide笔记本的链接,您的同事就始终可以访问这两个视图。 干净,可读的文档永远不会与基础代码和编辑环境分开。

借助Web平台的功能,实时互动文档


碘化物文档存在于浏览器中。 这意味着计算引擎始终可用。 每个文档都是带有运行代码的实时交互式报告。 而且,由于计算是在浏览器中与演示同时进行的,因此无需在另一个过程中调用语言后端。 因此,交互式文档被实时更新,从而提供了平滑3D可视化的可能性。 低延迟和高帧率甚至可以满足VR要求


投稿人德文·贝利(Devin Bailey)检查了她的大脑MRI数据

共享和可复制


与其他工具相比,对网络的依赖简化了许多工作流程元素。 共享是本机实现的:可以在同一URL上访问文档和代码,例如,您无需在Google Docs脚注中插入指向脚本的链接。 计算核心是浏览器,并且像任何脚本一样,库都加载了HTTP请求-不需要其他语言,库或工具。 并且由于浏览器提供了兼容性,因此记事本在所有计算机和操作系统上看起来都一样。

为了确保协作,我们创建了一个相当简单的服务器,用于保存记事本。 有一个iodide.io的公共实例可以尝试Iodide并发布您的作品。 但是您可以在防火墙后面创建一个私有实例(Mozilla在我们内部的一些内部文档中执行此操作)。 但是需要注意的是,笔记本电脑本身并不绑定到单个Iodide服务器。 如果需要,可以轻松地将工作转移到另一台服务器或将笔记本作为软件包导出以在其他服务(例如Netlify或GitHub Pages)上共享(有关导出软件包的更多信息,请参见下面的“下一步是什么?”一节)。 将计算传递给客户端使我们能够专注于创建真正出色的交流和协作环境,而不必在云中分配计算资源。

Pyodide:浏览器中的Python科学堆栈


当我们开始考虑让科学家们更好地使用Web时,我们专注于简化使用Javascript的方法,例如将现有的科学库编译为WebAssembly,并将其打包为简单的JS API。 当我们向Mozilla中的WebAssembly开发人员概述该想法时,他们提出了一个更雄心勃勃的想法:如果许多科学家更喜欢Python,然后进入他们的领域-编译Python科学堆栈以在WebAssembly中运行。

我们认为这听起来令人生畏,这将是一个巨大的项目,并且永远无法提供令人满意的性能……但是两周后Mike Droettbum在Iodide笔记本中使用了有效的Python实现。 在接下来的几个月中,我们添加了Numpy,Pandas和Matplotlib,这是Python科学生态系统中最常用的模块 。 在Nexedi的Kirill Smelkov和Roman Yurchak的帮助下,出现了对Scipy和scikit-learn的支持。 从那时起,我们将继续缓慢添加其他库

在Javascript虚拟机中运行Python解释器会增加性能开销,但它们却小得令人惊讶。 与本机代码相比,在我们的测试中,该代码在Firefox中运行的速度慢1-12倍,在Chrome中运行的速度慢1-16倍。 经验表明,生产率足以进行舒适的交互式研究。


浏览器中的Matplotlib支持在静态环境中不可用的交互式功能

将Python移植到浏览器会创建神奇的工作流程。 例如,您可以使用Python导入和处理数据,然后使用d3之类的 JS库从Javascript访问结果对象(大多数情况下,转换自动发生)以显示它们。 更神奇的是,您可以从Python代码访问浏览器API,例如, 无需使用Javascript即可操作DOM

当然,关于Pyodide的内容还有很多,值得一提。我们将在下个月更详细地讨论它。

JSMD(JavaScript MarkDown)


就像R中的Jupyter和R-Markdown一样,Iodide编辑器允许您自由地替换代码和注释,将代码分成可更改并作为独立单元运行的片段。 我们对这个想法的实现与MATLAB中R Markdown和“单元格模式”的实现相对应:Iodide记事本的内容不是使用显式的基于单元格的界面,而是一个使用特殊语法界定某些类型的单元格的文本文档。 我们称这种文本格式为JSMD。

在MATLAB之后,代码片段以%%符号开头,后接一行指示语言。 我们目前支持包含Javascript,CSS,Markdown(和HTML),Python的代码段,简化资源加载的特殊“提取”代码段以及通过添加新单元格类型扩展Iodide功能的插件。

我们发现此格式非常方便。 它简化了文本工具的使用,例如差异查看器和您自己喜欢的文本编辑器。 您可以执行标准的文本操作(剪切/复制/粘贴),而无需学习单元格管理命令。 有关更多详细信息,请参见JSMD文档

接下来是什么?


值得重复的是,这只是一个Alpha版本:我们将继续完善界面并修复错误。 除此之外,以下实验还有很多想法。 如果这些想法中的任何一个对您似乎特别有用,请告诉我们! 更好的是,帮助发展!

先进的协作功能


如前所述,我们创建了一个非常简单的后端,使您可以简单地保存工作,查看其他人完成的工作,快速创建和扩展其他人的笔记本。 但是,这些只是协作工作流程中的第一步。

现在,我们正在查看另外三个出色的功能:

  1. Google文档样式的注释线程。
  2. 可以通过fork / merge机制在其他人的笔记本中提出更改建议,例如GitHub。
  3. 与在Google文档中一样,同时编辑笔记本。

目前,我们按此顺序排列优先级,但是如果您决定以不同的方式排列它们或有其他建议,请随时报告!

更多语言!


我们与R和Julia社区讨论了在WebAssembly中编译这些语言以在Iodide和其他浏览器项目中使用它们的可能性。 乍看之下,这是可行的,但实现会比Python复杂一些。 与Python中一样,打开了一些有趣的工作流程:例如,您可以在R中应用统计模型或在Julia中求解微分方程,然后使用浏览器API显示结果。 如果您学习这些语言,请让我知道-特别是,我们希望获得FORTRAN和LLVM专家的帮助。

导出笔记本


Iodide的早期版本是独立的HTML可执行文件,其中包括分析中使用的JSMD代码和运行Iodide本身的JS代码,但是我们放弃了这种体系结构。 最近的实验使我们确信,与Iodide服务器一起使用的好处超过了在本地系统上管理文件的好处。 但是,这些实验表明,可以通过将Iodide代码以及在一个大HTML文件中使用的所有数据和库一起添加,来制作独立的Iodide可执行记事本。 它可能很棒,但作为可完美复制和存档的图片很有用。

适用于文本编辑器的Iodide浏览器扩展


尽管许多科学家习惯于在基于浏览器的编程环境中工作,但有些人永远不会放弃自己喜欢的文本编辑器。 我们确实希望Iodide能够被人们认为工作方便的地方,包括那些喜欢在另一个编辑器中输入代码但又想访问Iodide提供的交互和迭代功能的人。 为了满足这一需求,我们开始考虑创建一个简单的浏览器扩展和一些简单的API,以允许Iodide与客户端编辑器进行通信。

欢迎提供反馈和帮助!


我们并没有试图解决科学数据和科学计算的所有问题,并且碘化物不是通用解决方案。 如果您需要在GPU群集上处理TB级的数据,则Iodide不太可能为您提供任何帮助。 如果您发布杂志文章,而只需要用LaTeX编写文档,那么会有更好的工具。 如果您不喜欢将所有内容都传输到浏览器的想法,那没有问题-您可以在科学中使用许多非常出色的工具,我们对此表示感谢! 我们不想改变某人的习惯,而且许多科学家不需要基于网络的交流。 太好了! 尽自己所能做!

但是,从制作或想要制作Internet内容的科学家那里,我想听听您在工作中需要哪些工具!

请转到iodide.io ,尝试使用此工具并进行评论(但要再次提醒您:请记住该项目为Alpha版本-请不要将其用于任何重要工作,并且请记住所有内容都可以在Alpha中更改)。 您可以填写简短表格 ,也欢迎在Github上提供票证和错误报告 。 有关功能和一般想法的请求留在我们的Google小组Gitter中

如果您想参与创建Iodide,源代码将发布在Github上 。 碘化物涵盖了广泛的软件学科:从现代界面的开发和科学计算到编译和编译,因此,有很多有趣的事情!

Source: https://habr.com/ru/post/zh-CN444596/


All Articles