| 扬声器 |
抄本 |
| 塞尔凯·奥尔梅兹 |
大家好,我是 Seagate 的 Serkay 和 Fred,今天我们将讨论如何构建 JSL 生态系统来管理我们的 JSL 脚本。 |
| |
我们使用 Git 来管理源代码控制、JSL 脚本的源代码以及分发它们。这就是今天演讲的重点。 |
| |
除此之外,我还将讨论如何用 VBA 集成 PowerPoint,以及崩溃日志收集和单元测试。我会快速跳到大纲。 |
| |
首先我想谈谈 JSL 的历史。我用 JSL 写脚本大概有 10 年左右了。 |
| |
我们对目前的状况感到非常满意,但我们花了相当多的时间才达到今天的水平,我想谈谈我们经历的里程碑、我们迄今为止所做的事情以及我们这样做的原因。 |
| |
然后我们会讨论 Git,以及如何启用 Git 来控制 JSL 脚本的源代码,以及如何通过 Git 构建更多功能。例如,启用 Git 后, |
| |
你可以添加更多功能,比如监控脚本。这样开发人员就能知道他们的脚本正在被使用,从而监控其使用情况。 |
| |
更重要的是,它们还可以收集日志。如果脚本崩溃,开发人员会知道,然后可以回去修复这些错误。而且你还可以…… |
| |
您可以更进一步添加一项功能。您甚至可以创建自动错误工单,即使您已知脚本崩溃了。这样您就可以自动创建错误工单。您可以使用 JIRA 或 Atlassian 等跟踪软件来跟踪这些工单。 |
| |
最后我将总结我们迄今为止的最佳实践和经验教训。 |
| |
所以, |
| |
附录中还附有我将要讨论的一个脚本的手册。这个脚本可以将图像推送到 PowerPoint。 |
| |
我有一本非常详细的手册,我应该让你知道,我在这里谈论的所有内容、数据和脚本都将可用。 |
| |
它们发布在参考资料部分的公共存储库中,如果你愿意的话,可以直接去那里获取这些文件。首先,我先说一下 |
| |
简单回顾一下。我和 JSL 合作了大概 10 年左右,一开始,我 |
| |
非常基础,我对 JSL 脚本了解不多。 |
| |
然后,一旦你开始这样做,你就会意识到你必须有一些适当的源代码控制,并且你需要适当的方式来分发你的脚本。 |
| |
JMP 脚本的特点是零门槛。您可以直接手动绘制图表,然后获取脚本。脚本已经为您编写好了。 |
| |
您还可以使用 JMP.com 上的 JMP 社区来提问并获得答案。 |
| |
而你……脚本编写得非常高效,以至于你的工作效率很高,人们会注意到的。他们会问你怎么做事,你会说我有个脚本。然后他们就会 |
| |
问:“你能和我分享一下吗?”然后突然间你就成为了一名开发人员,尽管你并没有打算这样做。 |
| |
然后你得处理脚本的分发问题。我第一个想到的办法就是直接把它们附加到附件里,这想法很糟糕,我已经这么做了好一阵子了。 |
| |
很明显这不是一个好主意,因为你附上了一个脚本,然后你把它发送出去,第二天你又制作了一个 |
| |
修改后,你还得重新发送,你甚至不知道用户是否会接受下一个版本。我只是想在这里说明一下。 |
| |
最近,我收到一位同事的邮件,他提到了我 2017 年创作的一个脚本,而我只是用这些代码来给脚本编号 |
| |
版本号,这不是个好主意。所以三四年后你又发现人们还在用三年前的脚本,因为他们没有更新。 |
| |
解决这个问题的一种方法是使用共享驱动器,并根据我与其中的人的互动 |
| |
Discovery Summits 的一大优势在于,很多公司和个人都在使用这个平台。开发者需要做的就是 |
| |
把脚本转储到共享驱动器,用户就可以直接从共享驱动器拉取,这解决了一半的分发问题,但它对源代码控制没有任何作用。你无法追踪你在代码中所做的更改。 |
| |
这就是我们真正转向 Git 的原因。这对我们来说是一个突破,并且启用了许多功能。那么,Git 的作用是什么呢?开发人员会将他们的脚本推送到代码库,然后 |
| |
用户将直接从 Git 提取脚本。这对我们来说是一个很大的改进,它使我们能够收集崩溃日志, |
| |
脚本的使用等等。我还想谈谈我从峰会上学到的一些东西。这些峰会对我提高脚本编写技能很有帮助,我参加了2018年的一次峰会,学到了很多关于表达式等方面的知识。所以 |
| |
人们可能想回去听听这些演示,因为它们确实有助于提高脚本编写技能。 |
| |
我们的另一个里程碑是测试。去年峰会上的一次演讲给了我很大的启发,那次演讲讲的是单元测试,它能让你在发布脚本之前自动测试它们。 |
| |
今天我将主要谈论集成测试,因为单元测试是……单元测试是必需的,但还不够。 |
| |
因为你可以进行单元测试,所以你可以测试所有模块,而且它们检查起来都很好。但是当你把它们放在一起时,它们就无法工作了。它们会崩溃,就像这里展示的那样。每个抽屉可能都经过了测试,但当你把它们放在一起时,它们就无法运行了。 |
| |
一个对开发人员有很大帮助的功能就是日志收集。 |
| |
了解你的脚本崩溃了,以及它是如何崩溃的,这非常有帮助。你可以通过收集用户的日志来做到这一点,然后你可以返回并修复脚本并推送更改,这样用户就可以立即获得修复后的脚本。 |
| |
我们最近推出的最后一个功能是自动错误报告。既然您已经拥有崩溃报告,为什么不根据这些信息采取行动呢?因此,我们创建了一个自动报告系统。 |
| |
监控 |
| |
系统会跟踪这些崩溃日志,并自动创建错误报告,以便开发人员能够处理这些问题。此外,您还可以将用户添加为观察者,以便用户知道有人正在处理该问题。这样就解决了 |
| |
解决了用户和开发者之间的信息差距。 |
| |
这是时间线,我会花一些时间 |
| |
在单个项目上,但我们将从 Git 开始,我将快速构建它并让 Fred 讨论它。 |
| 163084 |
好的。 |
| |
所以, |
| |
Git 只是一个版本控制系统,我并没有使用“版本控制”这个词。实际上,我想说的是,即使你只在自己的本地电脑上使用 Git,它也能有效地帮助你无限次地重做。它 |
| |
使您能够跟踪文件的修订并返回旧版本,以防您认为过去几周所做的某些工作不正确,并且想要返回几周前的某些工作。 |
| |
Git 只是一个安装在本地电脑上的软件。它会创建一个仓库,然后这个仓库可以发布到其他仓库。 |
| |
比如 GitLab 或 GitHub。TortoiseGit 是一个 GUI 界面,可以在本地计算机上使用,让操作更简单。Serkay,请打开下一张幻灯片。 |
| |
所以我尝试让开发人员在本地电脑上使用的模型。本地的开发人员,安装 Git 客户端并启动 |
| |
在本地电脑上对文件进行版本控制。一旦他们养成了这样做的习惯,我们就可以将它们连接到远程存储库 |
| |
Git 连接到远程存储库或通过 SSH 或其他方法,他们可以推送 |
| |
将其 Git 数据库的副本上传到远程存储库。一旦上传到远程存储库,HTTP Web 服务器就可以将其共享给 JMP |
| |
然后可以指向 URL 和 HTTP……HTTP Web 服务器并从中加载脚本。因此,我们没有使用共享驱动器,而是使用通过推送到 Git 仓库来填充内容的 HTTP Web 服务器。 |
| |
下面的要点指出了它的好处以及它的具体工作原理。 |
| |
我们可以转到下一张幻灯片。 |
| 塞尔凯·奥尔梅兹 |
因此我将接手这里,弗雷德,我将向您展示...展示一个非常基本的插图实现,并且脚本可以在参考文献中找到。 |
| |
所以, |
| |
这将是一段非常基础的代码。我这里展示的是开发人员正在开发的代码。这是最基本的,对吧?它只是一个对话框,上面写着“Hello World”。 |
| |
假设开发者想把这段代码传递给用户。那么开发者传递的不是这段代码,而是这段代码。 |
| |
这是代码库的链接。所以,这就是 hello JSL 脚本的源代码库…… |
| |
在远程存储库中。用户所做的就是抓取……用户抓取 |
| |
脚本来自 URL。所以这是静态代码。它不需要任何更改,开发人员可以随时更改脚本,但用户无需执行任何操作。我在这里只展示一个示例,我只想全屏显示。 |
| |
只是演示了如何通过特定的 GUI(也就是 GitHub Desktop)来操作。你需要安装这个 |
| |
在你的电脑上创建一个本地存储库,这样它们就会跟踪你所做的更改。例如,在本例中,我刚刚创建了这个 hello JSL 脚本 |
| |
软件会识别出有变化,并自动高亮显示。你需要先将其提交到本地仓库, |
| |
它会把这些东西推送到你的本地仓库,然后你再把它们推送到源仓库(也就是远程仓库)。现在,我会把它们推送到远程仓库,这样用户就可以使用了。 |
| |
一旦你这样做了,用户现在就可以拉取这段新代码了。现在我切换回用户角色,然后用户运行这个脚本,当你……一旦你这样做了,对话框就会出现。所以你正在运行从代码库中拉取的脚本。 |
| |
因此我将使用更高级的代码来更好地说明这一点,这也与 PowerPoint 相关。 |
| |
人们在 JMP 中做了很多分析,但很多人最终还是想把结果推送到 PowerPoint 中。我知道 JMP 有一些功能可以 |
| |
图像直接导入到 PowerPoint 中,但我们想要更多……更复杂的东西。我们想 |
| |
管理 PowerPoint 的模板。我们想在 PowerPoint 中做更多的事情,比如决定每张幻灯片放多少张图片等等。 |
| |
为了做到这一点,您首先需要将 JMP 与 PowerPoint 连接起来,实际上您可以非常轻松地做到这一点…… |
| |
非常好用,你甚至不用离开 JMP。所以你可以找到 PowerPoint 可执行文件的位置,它通常位于 Program Files 目录下。 |
| |
然后创建一个批处理文件来触发这个 PowerPoint 可执行文件,它会抓取你要运行的 PowerPoint 文件并直接运行。所有这些操作都可以在 JMP 中完成。它的作用基本上就是搜索 PowerPoint 可执行文件。 |
| |
一旦找到它,它就会将其打包到这个批处理文件中。它还包含你要运行的 PowerPoint 的路径 |
| |
以及宏,所以 PowerPoint 中会有一个宏来在 PowerPoint 中进行管理。所以你可以这样做 |
| |
将 JMP 绑定到 PowerPoint 上,你甚至需要把 JMP 留在 PowerPoint 中才能完成这项工作。但问题是,你如何才能把这个 PowerPoint 文件发送给你的用户?你可以 |
| |
让他去下载,这并不理想,因为你想自动管理它,同时又想控制你的PowerPoint的源代码。所以它需要是一个好的候选者;它需要成为整个生态系统的重要组成部分。你不会想把它放在外面。 |
| |
还有一个要求是,你不想每次脚本运行时都下载 PowerPoint。所以,只有当图像存储库中的内容发生变化或 PowerPoint 出现新内容时,你才需要下载 PowerPoint。 |
| |
一种方法是使用这个 JMP 脚本,一个包含创建日期的 JMP 命令。我在这里做的是检查 |
| |
本地文件的日期。所以如果本地 PowerPoint 比我存储库中的旧,我就会去下载它。所以 |
| |
它将使用 HTTP 请求下载 PowerPoint,并且 |
| |
看起来像这样。所以你只需要在本地电脑上检查你的 PowerPoint 文件。如果它不存在,你就可以通过 HTTP 请求从存储库中拉取它。如果它存在,你就查看它的日期,如果它已经过期,你仍然可以 |
| |
拉取新的。所以,关键在于,您可以将 PowerPoint 无缝集成到 JMP 环境中,这样您就可以将结果(包括表格和图像)推送到 JMP 中。而且,所有这些操作都无需破坏源代码控制,我将在这里进行演示。 |
| |
比如,这就是你要提供给用户的代码。同样,这是静态代码。它除了一个 URL(链接到远程代码库的脚本)之外什么也没有。所以它会去抓取 |
| |
存储库中的 JMP 脚本,这些脚本再次可用,您可以从参考文献中提取它们。 |
| |
从开发者的角度来看,这是实际的脚本,对吧。这是开发人员开发的脚本, |
| |
他或她将其推送到远程存储库。这个脚本的优点在于,我只想在这里快速指出几个特性。 |
| |
例如,看看这个。这是一个独立的文本脚本,你不需要分发 PowerPoint 文件或其他脚本 |
| |
分别进行。你需要在脚本中链接它们,它们也链接到这里的存储库中。 |
| |
包括 PowerPoint。这个脚本会管理所有分发。它会去抓取 PowerPoint。 |
| |
如果需要,它会去抓取其他附加文件。所以所有内容都捆绑到脚本中,它会帮你完成所有管理工作。我来快速演示一下。我会把它拉回来 |
| |
并将其置于全屏 |
| |
这样你就能看得清楚了。这将是自动触发 PowerPoint 的演示 |
| |
针对特定情况。这个脚本的作用是从表中获取路径,这是一个包含大量图像路径的 JMP 表,这些路径指的是这个特定的 |
| |
服务器,它将采用这些路径,并将只采用这里突出显示的路径,然后将它们推送到 PowerPoint。 |
| |
我直接运行这个脚本,如果你想试试的话,这个脚本可以供你使用。它是一个功能齐全、实用的脚本。所以,我正在运行这个 |
| |
脚本在这里。再次强调,它指的是存储库。所以它没有行脚本,它只是从存储库中拉取。运行它,它会检索代码,并运行一个对话框。 |
| |
我只需运行它即可。我不会详细介绍,一旦运行它,它就会自动触发 PowerPoint。 |
| |
PowerPoint 会启动,然后……它开始……它正在制作幻灯片。它会提取 20 张图片,这需要 10 到 20 秒,然后你就会有 PowerPoint |
| |
完成了。这就是您得到的 PowerPoint,一切都是自动完成的,所有内容都已从存储库中提取。 |
| |
那么下一步是什么?你会如何修改这份 PowerPoint?所以,我建议你对模板做一些修改。 |
| |
你可以在附录中看到更多细节,但我想展示的是如何改变 |
| |
PowerPoint 中的脚本。然后我会全屏显示, |
| |
我先运行一下。我们现在开始的是上一张幻灯片剩下的内容,对,就是这些图片。 |
| |
我想做的只是稍微修改一下模板,只是为了说明这一点。所以你去…… |
| |
你打开宏,向下滚动,找到你想修改的内容,我会在这里做一个简单的修改。我会改变标题的颜色,只是为了强调这一点。所以你修改这个 |
| |
和 |
| |
保存它。这是实时的。 |
| |
您可以保存它并删除幻灯片,以便它更快地进入存储库,因为您将把它推送到存储库。 |
| |
然后你使用 Git GUI 推送它。它会进入仓库 |
| |
它会将修改内容提供给您的用户。这样,所有用户都会立即获得修改。这样,您就不必让他们去更新 PowerPoint 或其他任何东西了。 |
| |
这只是进入存储库。 |
| |
我将切换回 JMP 并进入用户模式,然后再次运行脚本,这将检索新的 PowerPoint。 |
| |
如果你再次运行它,它将通过 |
| |
幻灯片,它会创建幻灯片。你会注意到,你确实做了一些更改,也就是更改标题行的颜色。 |
| |
所以, |
| |
我们还有什么? |
| |
脚本监控。我认为这是我们开发的最好的功能之一,因为它让开发人员能够查看 |
| |
他们的剧本……他的剧本,不管它被欣赏与否。对。那么它运行了吗?有人定期运行它吗? |
| |
这是其中一个好处。另一个好处是 |
| |
日志……崩溃日志收集。如果脚本失败,您可以使用 JMP 的日志捕获功能来捕获故障。这样,您就可以将子程序嵌入到日志捕获中。 |
| |
如果失败了……失败的日志会返回到这个日志返回文本中。然后你还需要做的是 |
| |
将其包含在尝试中,以便脚本仍然可以进行报告。 |
| |
然后检查它是否为空。如果为空,则表示根本没有崩溃,所以你的脚本仍然有效。 |
| |
但如果不是,如果它不为空,则表示发生了崩溃,并且您已将其控制住。您可以抓取日志,然后报告它。方法是使用 HTTP |
| |
用户 ID、脚本名称和日志注释,是否崩溃...... |
| |
无论是崩溃还是正常的运行,都可能涉及一些性能指标。所以,最重要的是,你可以将一些关于脚本的数据元数据传回给开发人员。 |
| |
服务器会记录这些操作,然后你会在服务器中存储一组文件,你可以监控它们。我只是举个例子 |
| |
表格。这是崩溃日志,有日期戳,有脚本名称,所以这个脚本在日期失败了 |
| |
这次崩溃的情况。这对开发者来说非常有用,因为他们可以返回并修复这个问题。我会把这个和这个折叠起来,然后在这里做一个快速演示,展示如何 |
| |
你怎么样 |
| |
包含崩溃以及如何向用户报告。所以我在这里要做的是让子程序崩溃。我将创建一个未定义的参数 |
| |
JMP 会报错。它会说这个东西没有定义,所以脚本崩溃了。但我要做的是调用那个子程序 |
| |
在日志捕获功能中,所有内容都会被夹在try下。因此,尽管脚本与子例程一起崩溃,但它总体上仍然有效,并且能够报告 |
| |
崩溃报告。那么,你给用户发送一个格式清晰的通知,并告知用户。脚本因为这个错误崩溃了,我们创建了一个日志,正在处理。这就是你给用户的通知。 |
| |
我在峰会上学到的一个关键点就是自动化测试。我以前都是手动测试,这很让人沮丧。 |
| |
因为这需要时间,而且你不可能捕捉到脚本的每一个细节。当你做一个小改动时,你不可能花几个小时进行测试。 |
| |
所以我开始接触自动化测试,单元测试非常重要。测试指的是对单个子程序的测试。比如,你有一个函数,你想测试它。 |
| |
在将它放入整个系统之前,你可以进行多次单元测试 |
| |
对于单个模块来说,这还不够。我可以给你们看几个例子。 |
| |
例如,美国宇航局因一个非常奇怪的错误丢失了他们的火星气候探测器……因为有两个软件团队,一个在欧洲, |
| |
一个在美国。其中一个使用英镑单位,一个在美国,一个在欧洲 |
| |
他们用的是牛顿法。所以他们当然做了单元测试。但是当他们把代码整合在一起时,却无法工作,因为一个期望牛顿法,另一个却得到了磅。所以他们真的失去了 |
| |
轨道飞行器,只是因为他们忘记把磅换算成牛顿。最近,波音公司也失去了他们的星际客机,后来他们承认,如果他们当时做了这些,就能发现这个错误。 |
| |
严格的集成测试。最终,重要的是 |
| |
集成测试,因为模块在脚本中不是单独存在的,而是一起对话的。 |
| |
这很有趣地说明了这个问题。所以你可以有两个对象进行彻底的测试。这是一扇窗户,对吧?窗户会出什么问题呢? |
| |
但是如果你将两个放在一起,它们甚至无法打开,所以你必须做一些集成测试来查看它们是否组合在一起,是否可以正常工作。 |
| |
我想在这里简单说明一下我是如何开始做自动化测试的。这里指的是一个具体的例子, |
| |
公平地说,这是一个困难的情况,因为这将是对模态窗口的测试,而模态窗口不会消失,除非你点击按钮。所以你必须 |
| |
创建一个 JMP 脚本,点击一个按钮,模仿人类的行为,我在这里做的是将测试人员注入到 |
| |
模态窗口。我认为这种方法的好处在于,你仍然可以分发 |
| |
这个东西,这个脚本给你的用户,用户甚至不会意识到其中实际上有一些测试程序。 |
| |
因此,它具有测试人员的钩子,但是当您单独运行它时,它所做的就是查找此测试模式参数,但该参数尚未设置。 |
| |
因此,如果未设置,脚本会将其设置为零,从而禁用表中的所有钩子。因此,您可以将其提供给用户,让他们以此方式运行。 |
| |
但是,如果你想测试你的脚本,你需要在它上面构建一个测试代码。测试代码会将测试模式设置为 1,并且还会创建测试器…… |
| |
你想注入到脚本中的测试对象。例如,在这个例子中,它的作用是选择一个特定的列 |
| |
然后通过点击按钮将其分配到角色,然后运行脚本,对吧。所以这实际上是在模仿人类的行为。 |
| |
然后它会加载实际的脚本。基本上就是把这些参数注入到你想要测试的脚本中。现在你正在自动运行脚本,它会加载并运行脚本,点击这个按钮和那个按钮后,它会关闭用户界面。 |
| |
然后,您要做的就是在日志捕获功能中再次运行它,这样您就知道如果出现问题,您将捕获故障。 |
| |
你还把它放在了 Enter Try 语句中,这样总体来说,脚本可以继续执行并报告日志。如果没有错误,你将看到空的日志返回,这意味着你的脚本没有失败。 |
| |
如果出了什么问题,你会在日志捕获中知道。这就是我们的想法。 |
| |
所以, |
| |
我们有 |
| |
监控脚本的能力。我们有能力 |
| |
捕获崩溃日志。所以我们想,为什么不根据崩溃日志采取行动呢?如果你看到崩溃日志,这意味着出了问题,并且脚本……用户已经知道了,因为脚本显然崩溃了,而开发人员也知道脚本崩溃了,因为日志 |
| |
存储在服务器中。所以它们在那里等着你采取行动。但问题是,这还不是一个闭环,因为用户不知道开发者知道。你可以通过创建自动化工单来闭合这个闭环。既然你已经掌握了这些信息,你就可以 |
| |
使用错误跟踪软件(例如 JIRA Atlassian),然后就可以使用 REST 功能 |
| |
从服务器收集信息,创建工单,分配给开发人员,还可以将用户指定为观察者。观察者意味着,每当开发人员执行任何操作时 |
| |
关于该错误的信息并将该信息输入到 JIRA 中,该信息将循环返回给用户,以便他或她收到通知并知道有人正在处理该错误。 |
| |
有多种方法可以做到这一点,具体取决于您拥有的 JIRA 的风格,我只是给您提供 |
| |
这里有一些基本代码。这是一个你可以创建的 curl 代码,你可以从崩溃日志中收集元数据,并将其嵌入到 JSL 文件中,然后通过 REST 进行传输,并进入 |
| |
JIRA,它会帮你追踪。然后,如果你设置正确,JIRA 会通知它……JIRA 会通知开发人员,甚至可能 |
| |
脚本崩溃的用户……以及导致崩溃的用户。所有这些都联系在一起,开发人员会知道存在需要他/她处理的 bug,用户也会知道有人正在处理这个 bug。 |
| |
好的。我想这就到了我的总结部分。总结一下大家可以从本次演讲中获得的收获。 |
| |
Git 一直是我们系统的基石,它使我们能够实现许多不错的功能,我甚至没有提到基本功能, |
| |
这很明显,因为它也赋予了你协作的能力。所以,如果多人同时处理同一个脚本,你可以使用 |