当我们开始在组织内推广 JMP 时,我们面临的最大挑战之一是人们开始学习使用 JSL,并且我们开始看到组织内 JSL 代码的激增。随着 JMP 在公司内大规模应用,我们面临的最大挑战之一是:如何大规模管理所有用户生成的代码?如何控制所有这些代码?
多年来,人们提出了许多不同的方法来实现这一点。有些来自计算机科学和软件开发领域,比如版本控制系统。有些人建议,干脆在某个地方使用共享驱动器吧。事实证明,这两种方法各有利弊。
为了给你一点希望,其实这里有一个折衷方案,效果很好,但又不完全是……我不想把所有资源都投入到内部开发一家成熟的软件开发公司来处理软件管理部分。我不想运行“狂野西部”(Wild Wild West),那只是别人服务器上的一个共享驱动器。
但事实证明,这两种极端做法各有利弊。说到 Git 或版本控制系统,GitHub 通常是大家最熟悉的。管理代码库?这正是它擅长的。它真是个好东西。
轻松部署更新?这不是它的强项。这并非它的设计初衷。它是为专业软件开发工作流程而设计的,而这并非我们在此讨论的重点。它在这方面做得并不好。
当然,它控制访问和版本权限做得很好。保持版本控制,了解随时间推移的变更跟踪,所有这些功能都正是版本控制系统的设计初衷。正因为如此,它对新手不太友好。它是为专业人士设计的。
我见过一些实际使用的例子,但这些公司通常拥有专门的人员、资源和时间,在公司内部建立了专门的软件开发团队。在某些情况下,这可能有效,或者他们可能出于其他原因已经建立了这个团队。
另一个极端是,只使用 JSL 文件和共享文件夹(某个服务器上的共享目录)。这几乎和版本控制系统的问题如出一辙。代码库管理不太好。虽然有些云系统在这方面有所改进,但仍然不够好。
轻松部署更新?当然。你只需点击最新更新即可。你也可以发送电子邮件或其他方式,或者使用一些插件,以及一些过去提出的、有助于实现此特定工作流程的代码,你可以将其添加到你的插件中。这绝对是一种可能性,但并非易事。从这一点来看,它比版本控制系统更好。
访问控制?说实话,不太好。新手友好吗?是的。它不算差,但也谈不上极致。结果发现,这其中有一个折衷方案。我和我的同事,以及我的合著者,实际上都是从两个不同的开发活动中想到这个方案的。我们或多或少都找到了相同的解决方案。看到我们最终在这个想法上达成妥协,真是有趣。
不管你信不信,其实这个想法就是 OneDrive。每个人都有它。它是一个企业系统。好吧,不是每个人都有,但很多组织都可以访问 OneDrive 或类似的东西。我将在本次会议上使用 OneDrive,因为我有 OneDrive,但也有类似的东西。
然而,这样做的好处确实令人惊讶。代码库的管理与 JSL 类似,但拥有更强大的版本控制,或者说编辑控制,并且能够追踪历史记录并回滚到代码的早期版本。如果出现问题,例如代码损坏或类似情况,我们可以回滚。我们通过使用我们这里讨论的企业系统获得了这些功能。
轻松部署更新。这正是此解决方案的关键所在。我们可以为整个公司设置一套自动化更新策略。实际上,无需动手。几乎无需任何代码。我们只需要在插件中添加一些代码,除此之外,所有操作都只需点击即可。使用这些系统,一切操作都极其简单。
控制和编辑权限。同样,这些权限是附带的。您可以授予用户查看和编辑权限,也可以授予用户下载和编辑权限。您可以根据需要授予用户完全访问权限,也可以根据需要打开或关闭该权限。您可以为群组设置这些权限。它有策略选项等等。
它确实拥有非常优秀的访问权限系统,而且对新手非常友好。就像我一直说的,几乎不需要额外的编码。如果你已经编写过插件,那么你对它已经了如指掌了。它超级容易实现。
这其中有什么诀窍?其实诀窍就在于,JMP 安装插件时,插件本质上就是一个文件夹,里面包含一堆 JSL 文件,以及一些特殊文件,用于指示 JMP 将其放在 GUI 的哪个位置,以及一些关于插件的元数据。但在大多数情况下,它只是一个 JSL 文件的文件夹,JMP 会将其提取出来,然后将其放到一个它知道在哪里可以找到的特定位置。
不过,有趣的是,插件的重要文件可以放在 JMP 可以访问的任何位置。它们不必放在那个文件夹中。你可以把它们放在任何你想要的地方。我和 Hyde 意识到,是什么阻止了我们将重要文件放在 OneDrive 文件夹中,然后只需让插件中的指针指向这些重要文件并在 OneDrive 文件夹中打开它们呢?
事实证明什么都没有。没有什么能阻止你这么做。这就是你这么做的结果。下一张和下一张幻灯片中的一些内容稍后会作为参考,但我们会快速浏览一下,以便对这里发生的事情有一个大致的了解。
在云端的 OneDrive 中,OneDrive 文件夹将是插件的核心。我们将拥有用户界面和插件代码。这就是 Hyde 的想法。我的想法是,将资源、庞大的资料库放在一起,这些资料会占用用户的硬盘大量空间,而用户实际上只需要在需要的时候才需要用到它们。否则,他们不想占用硬盘空间。所有这些内容都可以放在 OneDrive 文件夹中,这就是它们的存放位置。
JMP 桌面上有一个很小的脚本,大概 20 行。大部分内容只是为了方便用户阅读。它主要做三件事,具体来说就是三件事。首先,它会检查是否知道这些插件文件的位置。它有具体的位置吗?如果没有,它需要提供一个对话框,提示“嘿,我应该在哪里找到这个插件?”然后打开插件包。这就是它的全部功能。就是这三件事。
用户硬盘上还存在着另一个东西,我称之为 OneDrive 位置的镜像。现在,根据你的设置方式,这个镜像要么只包含逻辑链接,要么只包含指向文件的链接或别名(如果你知道这些是什么),要么包含同步的实际文件的副本。这两种方式各有利弊,而且效果都一样好。
选项一,只包含逻辑链接。优点是文件非常小。它只占用硬盘空间。它只是链接,并在运行时提取文件。您可以获得最新的、准确的文件信息。缺点是,它在没有网络连接时无法工作。如果您在飞机上或类似情况下,并且没有 Wi-Fi 连接,您的插件可能根本无法加载。
另一个缺点是,根据插件的大小,在 JMP 中点击链接和插件打开之间可能会有一点延迟。这两个都是缺点。我不会把这算作缺点,只是需要注意的是,对于较大的插件,可能会有一点延迟。
第二种选择,也就是我今天要教给大家的,是同步文件夹选项。这个选项会占用更多硬盘空间,但它允许离线访问,而且加载速度虽然不是即时的,但肯定更快。如果它需要拉取文件的较新版本,而文件尚未同步,那么可能会有一点延迟。但这样做的好处是,当文件在这里被更改时,它们会自动复制到你的本地文件夹中。
在这两种情况下,您仍然拥有读/写版本控制权限。如果有人在本地硬盘上进行了更改,它会创建该文件的副本。它不允许更改原始文件,并且只会引用原始文件。如果有人修改了某些内容并犯了错误,那么下次加载插件时,它将加载原始文件,而不会加载他们的更改。无论如何,我们都有这个版本控制,这个受保护的工作流程。
现在,设置 OneDrive 位置,我们可以通过多种方式进行。我发现最简单的方法是通过 Teams。今天我们开始演示部分就是从 Teams 开始的。在 Teams 中,如果你设置了一个团队,它会自动创建你需要的 SharePoint 网站。然后,你可以在 Teams 中添加一个文件夹,也可以在那里设置同步。
然后,您可以选择访问 SharePoint 网站(如果您愿意)。这就是您的用户所做的。他们直接访问 SharePoint 网站,并在那里设置同步。您可以在那里授予他们查看、编辑、下载等权限。您还可以在那里授予他们访问内容的权限/实际上,您也拥有对插件的访问权限。这很方便。让我们快速看看如何做到这一点。
这是 Teams。我拥有 Teams。实际上,我就在我的 Teams 群组里。你进去后,通常会显示一个按钮,我现在看到的是这么小的按钮。有一个按钮写着“创建新团队”。你创建一个新团队,然后创建频道。然后,当你进入频道时,在频道下方,有一个选项,上面写着“文件”。
您可以创建一个新文件或新文件夹。我通常会创建一个新文件夹,并将其称为“插件内容”。在这里,我可以使用我的小点,这里可以选择下载,或者同步到我的 SharePoint。我想打开我的 SharePoint Drive。这就是我的 SharePoint Drive。它位于同一位置。我实际上位于该文件夹中。这是插件的内容。这就是我要向您展示的插件的核心。
在这三个点下面,有一个“同步”选项。它的作用是在我的文件系统上……在 Windows 上看起来有点不同,但在 Mac 上,它在我的文件系统中的作用是创建一个共享库位置,并在此处创建该文件夹的副本。
现在,当我对此文件夹进行更改时,由于我拥有编辑权限,因此当我对此文件进行更改时,其他有权访问此文件夹的用户都会自动收到推送给他们的更改副本。更改内容会被推送到 SharePoint 网站,然后再发送给其他所有人。这就是我开始编辑的地方。
现在,我们快速浏览一下这个文件。这个文件其实不是特别重要,只是内容而已。不过,我们先来看看其中一个文件是什么样子的。这是我创建的插件本身,我会引导你一步步操作……我不会直接指导你如何创建插件本身,因为只需要使用插件向导即可。
让我们看看这里都有些什么。这些是我们不太关心的部分。这些是 JMP 需要知道的内容。我们关心的是插件启动器和插件首选项。插件首选项里有一个文件夹或文件。我打算把它放在这里,不要选中,因为前几天我测试的时候把它删掉了。
这就是它默认的查找方式。这个 Shell 脚本会提示我:“嘿,这个插件的内容在哪里?” 当它知道后,就会把它写回到这个首选项脚本中,这样我就不用每次运行插件时都询问我了。它只需要询问一次,就能记住。
让我们快速看一下这个 Shell 脚本。先不说博客部分。它只有三段非常短的代码,没什么可看的。有一个对话框会询问这个插件的 JSL 文件实际存放在哪里。尝试打开首选项。然后,这里会有一个循环,要么尝试打开代码,要么询问代码存放在哪里。这就是我们在这里要看的全部内容。
我已经创建了这个插件,并把它放在了我的插件文件夹中。如果我打开 JMP 并点击“演示”,它会说,嘿……你在这里看不到,但它会说,“请选择你的培训入门目录”。嗯,就是这个插件。我忘了改那个文本了。我只需要进去,说,这是我的共享驱动器,这是我的文件夹所在位置。然后我会说,好的,打开。这个插件是从 OneDrive 位置启动的。
我可以做的是回到这里,重新打开这个插件,然后我得到了这个插件文件的不同文本。我已经进入插件文件,并添加了插件本身。我将再次运行该插件。现在,它会在底部显示新的文本。为了让你了解这有多复杂,我想快速展示两个不同的插件,它们都利用了这一点。我不会详细介绍它们。让我先结束讨论。这就是我想要的。
第一个是我创建的,叫做 JMP on the Spot。它实际上是利用我们今天讨论的概念,将内容拉取到 Web 浏览器或查看器之类的工具中。用存储库或库来描述可能更贴切。如果我们打开 JMP on the Spot,里面的所有内容都只存在于云端。如果我想打开它,它会实时下载这些内容。
另一个选择是我们作为系统工程师在学习新版本时用来管理资料的方案,这非常适合 JMP 19。但我们的资料就存放在这里。它使用的正是这个插件。这个 GUI 以及与之相关的所有内容都存储在 OneDrive 上。
如果我们进去看看的话,实际上,它就在这里。我硬盘上实际插件里只有我们已经看到的首选项文件,以及我在演示示例中展示的那个文件。其他所有内容都是实时的。我把它下载到硬盘里,因为团队正在编辑它。
当我们上传 JMP 19 和 JMP 18 的资料时,它们会被上传到 OneDrive,并自动拉取到我的电脑上。我不必担心更新我的插件、视频等等,有时我们培训所需的大量内容也都存储在云端,我不需要下载。我不需要下载。下载过程不会占用我的硬盘空间。
我们今天看到了什么?嗯,我们看到 OneDrive 为我们提供了管理代码库的能力,让我们能够轻松部署更新、控制访问和权限,而且它对新手非常友好,除了编写自己的 JSL 代码之外,几乎不需要额外的编码,因为您已经掌握了所有必要的知识。您只需记住一个小技巧:没有规定说插件必须放在插件存储库中。