| 扬声器 |
抄本 |
| 迈克尔·阿克曼 |
克里斯蒂。 |
| 克里斯蒂·斯潘 |
早上好,迈克尔,你好吗? |
| 迈克尔·阿克曼 |
你好吗。 |
| 克里斯蒂·斯潘 |
太好了,让我关闭我的电子邮件,这样我就不会得到我了。 |
| 迈克尔·阿克曼 |
是的,我正在简化我的计算机设置,这样就不会出现任何异常。 |
| 克里斯蒂·斯潘 |
知道我点击了我的工具栏吗? |
| |
我想我拥有了一切。 |
| |
你的周末过得怎么样? |
| 迈克尔·阿克曼 |
很好,你好吗?周末过得怎么样? |
| |
好的。 |
| 克里斯蒂·斯潘 |
那么你是否生活在黑暗中? |
| 迈克尔·阿克曼 |
海伦等我们。 |
| |
好的,是的,离总部很近,我会去参加真正的发现峰会,是的。 |
| |
亲自出席。 |
| |
这也令人失望,但是。 |
| |
耶哟,嘿。 |
| 克里斯蒂·斯潘 |
你好,早上好,你好吗? |
| 约翰 |
做得很好。 |
| 迈克尔·阿克曼 |
我需要在我身后建立一堵博学的墙,就像约翰你所拥有的那样。 |
| 约翰 |
我确实点击了。 |
| |
这和丹尼的书在里面,所以你不会认得出来的。 |
| 克里斯蒂·斯潘 |
看起来不错。 |
| |
我对于上周的混乱表示抱歉,但是。 |
| |
我很高兴能够在线上与你们见面。 |
| |
由于我是支持 Nova 区域的首要团队的一员,所以我认为他们不应该把我分配给你们。 |
| |
让我们看看,我有几件事需要处理,你们两个是否都将显示器设置为 2010 年 19 月 19 日。 |
| |
我愿意。 |
| 约翰 |
让我再确认一下。 |
| 克里斯蒂·斯潘 |
惊人的。 |
| |
和 |
| |
如果你的声音很好,我想说没有人会佩戴标志。 |
| |
确保视野范围内没有任何可能导致侵犯版权的物品,我不知道你的书在那里会有问题。 |
| |
是的,我们这样做吧,以防万一。 |
| 迈克尔·阿克曼 |
其中之一是来自前 JMP 发现峰会主题演讲者的团队。 |
| 约翰 |
谁是。 |
| 迈克尔·阿克曼 |
哦,我没有,他来谈论那个事情的解释者。 |
| 克里斯蒂·斯潘 |
哦是的,我有那本书。 |
| 迈克尔·阿克曼 |
是啊是啊。 |
| 约翰 |
我没有。 |
| |
保存了电子邮件中的任何内容,但我可以继续将其从电子邮件中提取出来。 |
| 迈克尔·阿克曼 |
我把我的网络摄像头放在一只手臂上,这样我就可以前后上下左右地移动它,就像我可以无限地摆弄它一样。 |
| 克里斯蒂·斯潘 |
噢,这是个好主意。 |
| |
从来没有,从来没有在正确的地方见过我,是的。 |
| |
然后每个人都会点击他们所有的应用程序展望任何我团队。 |
| |
就像那樣。 |
| 迈克尔·阿克曼 |
亲密的团队不应该收到任何通知。 |
| 克里斯蒂·斯潘 |
你有 30 分钟的时间,对吗? |
| 迈克尔·阿克曼 |
是的,这就是我的理解。 |
| 克里斯蒂·斯潘 |
你们也会这样吗? |
| |
理想情况下,我们希望直接开始并直接完成。 |
| |
您是否想对您的屏幕进行测试共享,以便无论何时转换。 |
| 迈克尔·阿克曼 |
因为我们将在我的屏幕和你的屏幕之间切换,所以让我先分享我的屏幕。 |
| |
不需要共享声音。 |
| |
所以。 |
| 迈克尔·阿克曼 |
让我们回到从这里开始。 |
| 克里斯蒂·斯潘 |
嗨,亚历克斯,对的。 |
| |
好的。 |
| 迈克尔·阿克曼 |
所以你在上面,我们做了它做了它做了它做了它做了它然后我们被交给你。 |
| 约翰 |
是的,我们可以自己控制屏幕共享吗?我们可以使用制作人。 |
| 克里斯蒂·斯潘 |
是的,你应该这么做。 |
| |
哦,你的背景看起来很棒。 |
| 约翰 |
谢谢。 |
| 克里斯蒂·斯潘 |
我应该拥有它。 |
| 迈克尔·阿克曼 |
我想我们可以更加统一。 |
| 约翰 |
不,我们应该有自己的个人,但我没有。 |
| |
是的。 |
| 克里斯蒂·斯潘 |
是的,我们去找迈克尔。 |
| 约翰 |
是的。 |
| |
我想我不会在屏幕上进行太多的链接,大部分都是谈话,然后我们会进行屏幕共享,然后。 |
| 迈克尔·阿克曼 |
我不确定当屏幕共享时我们能看到什么。 |
| 克里斯蒂·斯潘 |
好吧,无论何时我拿回录音。 |
| |
我得到了四种不同的。 |
| |
版本中有一个包含你,但有一个不包含你,我不确定 Jeff Perkinson 是否会编辑所有内容,所以我不知道他会选择哪一座山。 |
| |
我认为他想向演讲者表明这一点。 |
| 迈克尔·阿克曼 |
我认为我在屏幕上看到了。 |
| |
顺便说一下,只要单击鼠标右键,就可以关闭图标。 |
| 约翰 |
在管理混淆窗口上,它看起来像。 |
| 克里斯蒂·斯潘 |
那么,这真的很难做到吗? |
| 约翰 |
哦,是的。 |
| |
那么右键单击并查看。 |
| 迈克尔·阿克曼 |
是的,他觉得这很酷。 |
| |
因为我不记得具体在哪里。 |
| |
伙计,我从来没有在桌面上打开过图标,我只是让一些东西安装到上面,所以如果我打开它就像。 |
| 约翰 |
是的。 |
| 克里斯蒂·斯潘 |
所以,迈克尔,当你完成的时候,你只会说好的,把它交给你,在你的屏幕共享上,然后我们就从那里开始,我们不会真的休息,换句话说,是的。 |
| 迈克尔·阿克曼 |
我的房间里有一个黄色过滤器。 |
| 克里斯蒂·斯潘 |
哦,你有一盏你喜欢的红灯。 |
| 迈克尔·阿克曼 |
让我变得忧郁,是的。 |
| 克里斯蒂·斯潘 |
我还没有投资过这些,我的桌子很小,而且我这里有很多空间。 |
| 迈克尔·阿克曼 |
是的,我很早就独立了,我的老板一直抱怨我的麦克风质量和相机质量,所以我想,好吧,你给我买一个新的麦克风相机。 |
| 克里斯蒂·斯潘 |
真棒,我没有买到这个新耳机。 |
| 迈克尔·阿克曼 |
让我赶紧去关门吧。 |
| 克里斯蒂·斯潘 |
哦,好的,是的,如果你认识毛茸茸的朋友或孩子在身边跑来跑去,这一点很重要。 |
| 约翰 |
是的,都不好,所以好吧,我会关上门。 |
| 克里斯蒂·斯潘 |
和 Johan 你在哪里? |
| 约翰 |
在公司。 |
| 克里斯蒂·斯潘 |
比我的好哦。 |
| |
充分。 |
| 约翰 |
噢,你去过。 |
| 克里斯蒂·斯潘 |
我有一个朋友嫁给了。 |
| |
哥本哈根的一位小伙子来自丹麦,所以我们就去那里拜访他。 |
| |
噢,是的,很漂亮。 |
| 克里斯蒂·斯潘 |
好的,如果我能让你们说出你们的公司名称和摘要标题那就太好了。 |
| |
这不是为了录音,只是为了让杰夫识别什么是你的。 |
| 迈克尔·阿克曼 |
名字是肯定的,我的名字是 Michael increment,我是 novozymes 的,摘要标题就像上传照片一样简单。 |
| |
关于包装和账单的一些事情我忘记了具体细节。 |
| 克里斯蒂·斯潘 |
没关系。 |
| 迈克尔·阿克曼 |
大家好。 |
| 约翰 |
我的名字是联合国。 |
| |
也毫无意义。 |
| 克里斯蒂·斯潘 |
我们将录制这段视频并将其发布到发现峰会上,供公众观看,如果您获得许可使用此录音,将会怎样? |
| 迈克尔·阿克曼 |
我们愿意,我也愿意。 |
| |
当你去的时候。 |
| 约翰 |
哦,是的,对不起,对不起,我只是在胡思乱想。 |
| 克里斯蒂·斯潘 |
好的,那么。 |
| |
让我先为你关闭我的相机。 |
| |
没人想见我。 |
| 克里斯蒂·斯潘 |
我想我们已经准备好了,你们准备好了吗? |
| 迈克尔·阿克曼 |
我想我们就从我的屏幕开始吧。 |
| 克里斯蒂·斯潘 |
不管你准备好了没有,让我们看看时间是多长。 |
| |
909,所以从技术上讲,你可以到 939,但是。 |
| |
无论何时你准备好了,都可以给予或接受保险丝。 |
| 迈克尔·阿克曼 |
大家好,欢迎参加我们今天的“Y'All”主题演讲。这是一个我们在 Novozymes 内部构建的插件包管理器,用于实现 JMP 插件的自动化共享、更新以及脚本的维护,服务范围覆盖我们全球公司。我是 Michael Akerman,我的联合演讲者是 Johan Olsen。 |
| |
今天,我想,我们想和你们谈谈 Y'All,并向你们介绍这个工具包,以便任何对它感兴趣的人都可以…… |
| |
...无论是个人用途还是组织用途,想要使用此工具包的用户都应该知道如何获取、开始使用,以及它是什么。因此,我们先来介绍一下我们是谁,以及我们为何创建 Y'All…… |
| |
……Y'All 的核心功能以及用户体验。Johan 会为您介绍用户使用这款工具包时会遇到的情况。 |
| |
我们将深入了解用户与 Y'All 工具包交互时背后发生的情况,然后进行总结和回顾,并提供一些关于在您的组织中采用 Y'All 的提示(如果您发现它对您的目的有趣)。 |
| |
我们是诺维信公司的数据科学家。我的联合主持人是约翰·奥尔森。他是一位从事农业和工业生物解决方案应用研究的数据科学家。 |
| |
我是 Novozymes 同一部门的高级数据科学家。如果您想了解 Y'All 或其他任何信息,我们在这里提供了我们的联系方式。请随时联系我们。 |
| |
Johan 的邮箱是 jpko@novozymes.com,他是 JMP 用户社区的 JPKO。我的邮箱是 mxak@novozymes.com。 |
| |
Michael Akerman 是 JMP 用户社区的 Michael mxak,如果您对 Y'All 有任何疑问、跟进或评论,或者希望改进我们已经构建的内容和正在使用的内容,请随时与我们联系。 |
| |
我们为诺维信工作。诺维信是一家全球生物技术公司。我们致力于构建可持续发展的生物解决方案…… |
| |
……助力全球各行各业提升绩效、降低成本。我们支持农业和生物燃料、家居护理、食品饮料、动物保健等众多行业…… |
| |
……通过这些生物解决方案。我们在全球拥有6000多名员工,其中数百名是JMP用户。 |
| |
我之所以提到这一点,是因为我们拥有大量 JMP 用户,我们支持他们,并与他们合作,他们都在使用 JMP 并在 JMP 中构建事物,这对大家来说确实是一种启发。 |
| |
我们公司的宗旨是“共同寻找生物学答案,让不断发展的世界过上更美好的生活——让我们重新思考明天。” |
| |
正如我所提到的,诺维信公司拥有大量的 JMP 用户。 |
| |
因此,我们希望让他们更轻松地使用 JMP 脚本和 JMP 插件,并使他们的代码更易于重用和发现。 |
| |
所以首先,我们希望更新过程简单易行。我们注意到,诺维信公司内部的员工都在通过电子邮件来回发送处方。 |
| |
有些人会把 JSL 文件发送到个人网络驱动器上。有些人会把它放在闪存盘上分发。我们希望让分发新的和更新的 JMP 脚本尽可能轻松。 |
| |
我们想建立一个档案库来保护代码。我们有很多 JMP 用户,所有这些工作对组织来说都意义非凡。 |
| |
因此,所有有价值的代码都存储在一个中央存储库中,并进行备份和存档。 |
| |
我们希望随着时间的推移跟踪版本,因此随着脚本的变化和改进,我们希望能够看到这些变化并跟踪这些变化。 |
| |
我们希望让您能够轻松发现和重用脚本,因此如果您是 JMP 开发人员…… |
| |
...如果您是一名编写 JSL 脚本的开发人员,您可以找到其他开发人员编写的相关脚本并对其进行改进或... |
| |
根据您的需求,在这些脚本的基础上进行构建。因此,请方便地获取这些脚本并基于它们进行构建,同时也要方便地共享、导入和重用组织中其他成员认为有用的 JSL 函数。 |
| |
因此,为了实现这一目标,我们将三个组件整合在一起。我们有一个 Python 构建脚本、一个 GitLab 接口以及一个 JSL 加载和更新脚本,它们都在这个工具包中协同工作。 |
| |
Python 构建脚本是一个自动化脚本,将在 Python 3 或更高版本中运行,可自动解析并将 JSL 文件构建为插件菜单结构。 |
| |
它还会编写插件定义文件。它会生成一个导入的自定义函数脚本,将所有这些可重用的实用函数添加到 JMP 脚本索引和 JMP IDE 中,并将其全部压缩成一个 .jmpaddin 文件供用户使用。 |
| |
GitLab 是我们为用户提供的与插件脚本交互以及使用插件构建器本身的界面。GitLab 是 GitHub 的开源替代品或竞争对手。 |
| |
我们已在 Novozymes 内部发布了此信息,它提供了一个非常简单的点击用户界面,用于将脚本上传到这个中央存储库...... |
| |
...所有这些脚本都存储在这里并且构建实际上发生在这里。 |
| |
CICD 管道(代表持续集成持续部署)会自动执行 Python 构建脚本并通过发布版和 Beta 版渠道分发插件,以便用户可以... |
| |
...稳定的质量控制版本,或者如果他们是开发人员,他们可以使用该工具包中使用的每个脚本的最新版本获得频繁的快速发布。 |
| |
最后,我们得到了 JSL 的加载和更新脚本。当 JMP 打开并加载此插件时…… |
| |
他们可以检查,它会在所选渠道(测试版或发布版)上检查新版本,并提供下载和更新该插件包的服务。这还会将自定义函数导入脚本索引。 |
| |
任何 JMP 用户都可以在 Y'All 中轻松提交脚本,就像在社交媒体上上传照片一样简单。 |
| |
您进入用户界面,单击上传按钮,几秒钟后它就会在 Y'All 的测试频道上可用。 |
| |
我们有这些脚本的自动版本控制和存储,自动或手动 JMP 插件更新,因此当 JMP 打开时,Y'All 将提供更新... |
| |
...或者用户可以选择通过 Y'All 菜单手动更新 Y'All。 |
| |
如果您是编写脚本的开发人员,我们提供 Beta 版本渠道,方便您快速构建和测试,以便在更新脚本和进行更改时获取插件的最新版本。此外,我们还提供发布渠道,方便您进行受控部署和质量控制。 |
| |
这为我们提供了可发现和可重复使用的 JSL 文件,以便人们可以查看 Novozymes、Y'All 用户提交的脚本文件结构,并查看... |
| |
...找到符合他们想要的目的的脚本并根据自己的目的进行修改。 |
| |
我们还在脚本索引中添加了方便的实用函数;您可以看到一个小截图…… |
| |
...在左侧并进入 JSL 编辑器,因此构建脚本会自动将可导入且可重复使用的函数添加到 JMP 脚本索引中,并使用一个很好的小文档字符串(如果可用)来描述该函数的工作原理和使用方法。 |
| |
我想花点时间确认一下我们在 Y'All 中包含的一些用于演示的代码。Novozymes 内部使用的大部分代码都是 Novozymes 系统特有的,公司外部无法使用。 |
| |
所以我从 JMP 用户社区中抓取了一些脚本,并将它们添加到我的博客中,仅供演示之用。您可以随意保留这些脚本,也可以从 Y'All 中删除它们…… |
| |
...如您所愿。我们找到了 Xan Gregg 和 Craige Hales 编写的 JSON 解析器脚本。我们还找到了在 2020 年 JMP Discovery 峰会上展示的数据清理脚本助手…… |
| |
……作者:Jordan Hiller 和 Mia Stephens。我们在 2020 年 Discovery 峰会上展示了 Heidi Hardner 和 Serkay Olmez 的图像表工具。 |
| |
Nick Holmes 编写的 Color Row Selection.jsl。Byron Wingerd 编写的多 Y 轴图表,以及自动验证设置,我记得也在 JMP Discovery 峰会上展示过…… |
| |
...去年由 Mike Anderson 开发,我们为 Riffyn 数据捕获软件 Riffyn Nexus 提供了一套可导入的功能... |
| |
...与他们的 API 配合使用,该 API 由 Riffyn 编写,并经许可从其 Riffyn 工具 JMP 插件中摘录。这是我们在 Novozymes 大量使用的工具。我们之所以添加此功能,是因为如果有其他 Riffyn 用户,您也可以随意使用此代码。 |
| |
好了,说完了这些,我们想开始一些现场演示,首先是用户体验,以及用户在使用 Y'All 工具包时看到和操作的内容。接下来,我将把演示权交给我的联合主持人 Johan。 |
| |
约翰,你被静音了。 |
| 约翰 |
谢谢你,迈克尔。 |
| |
抱歉。我只能分享我的屏幕了。 |
| |
你看到了嗎? |
| 迈克尔 |
是的。 |
| 约翰 |
好的。 |
| |
正如迈克尔所说,我将带您了解使用 Y'All 的用户体验。 |
| |
Y'All 的用户体验实际上分为三个层次。绝大多数用户基本上把它当成内置的 JMP 平台来使用。他们…… |
| |
...点击脚本并运行它们,以实现其预期目的。我们还有一个相当大的用户组,他们贡献脚本,也正在学习如何…… |
| |
你可以贡献一些简单的脚本。我们还有一小部分开发者和维护人员(??)负责更高级的工作,我们也会尝试加入一些。 |
| |
首先,Y'All 的用法非常简单。安装非常简单,只需点击我们在 GitLab 仓库中创建的构建工件 (??) 链接,下载 JMP 编辑文件并用 JMP 运行即可。 |
| |
现在这促使我进行更新,这次我将取消,但您可以在这里看到我的菜单栏上,我有 Y'All 菜单...... |
| |
...使用 Michael 提到的一些演示脚本。我不会详细介绍这些脚本,因为它们实际上并非 Y'All 软件包的一部分,而只是为了演示目的而包含的。但我要做的是尝试深入研究一下…… |
| |
...哎呀,启用,抱歉,这已经启用了。启用 beta 测试,这样,现在我们开始创建一些东西,我们就可以立即看到它们。 |
| |
大多数用户都会禁用 Beta 测试,在主要版本发布后打开 JMP 时会收到更新提示,更新间隔为几周一次。但对于启用 Beta 测试的用户,Beta 分支的更新时间可能是每天几次,也可能是每周几次。 |
| |
这就是普通用户基本上能得到的内容。 |
| |
如果您想为此贡献脚本,有几种方法可以做到。一种方法是通过 GitLab UI。现在,我们刚刚看到的菜单结构已在... 中进行了镜像。 |
| |
...目录结构在... |
| |
...存储库。因此创建一个新的... |
| |
...菜单或子菜单就像创建一个新目录一样简单。在这里,我们就称之为... |
| |
...“演示” |
| 约翰 |
并添加它。 |
| 约翰 |
如果我们想添加脚本,我们可以在 JMP IDE 中简单地创建它,这样就可以使其变得非常简单。 |
| |
你好世界。 |
| |
这样就足够了。实际上还有一些额外的细节,那就是用一种好听的方式命名菜单项,以便获得工具提示。我们实现了 [???] 或代码魔法,也就是说,如果你一开始就写注释掉,哎呀。 |
| |
你呢。 |
| |
菜单名称。 |
| 迈克尔·阿克曼 |
大家好。 |
| |
菜单名称。 |
| 约翰 |
Y'All 菜单名称 |
| 迈克尔·阿克曼 |
老习惯了。 |
| 约翰 |
我们就叫它“你好”。然后是“你们”工具提示。 |
| |
好的,让我们继续保存它。 |
| |
我想,随便放在哪里,比如桌面。然后上传到这里。 |
| |
是測試嗎? |
| 迈克尔·阿克曼 |
这是脚本,但应该没问题。 |
| 约翰 |
现在... |
| |
一旦我们上传了这个文件,我们就会在这个自动[听不清]中触发一个管道。 |
| |
[听不清] 系统,首先克隆存储库,然后...... |
| |
...之后构建插件,这将在重新启动 JMP 时提示, |
| 约翰 |
并更新所有编辑。 |
| 约翰 |
一旦我们选择更新,就会出现演示菜单和测试脚本。 |
| |
这是向 JMP 贡献脚本最简单的方法。如果您熟悉 Git,也可以使用更经典的 Git 工作流程。这里只需打开一个批处理窗口。让我…… |
| |
我们可以克隆仓库了。我们回到……这里展示的一些内容是专门用于 GitLab 的,我们这里就用到了 GitLab。 |
| |
但在其他远程存储库编码、代码托管系统中也会类似。 |
| |
现在我们正在克隆仓库,这样我们就可以在本地系统中拥有一个完整的仓库镜像。与之前类似,我们可以在这里看到镜像的目录结构,接下来我们尝试创建一个…… |
| |
另一个脚本。 |
| |
为此。Y'All 菜单名称已改进 |
| |
你好。 |
| |
说我们愿意,也许这次...... |
| |
...打开一个提示。 |
| |
它说你好,世界。 |
| |
现在,我们可以使用 JMP 内置的函数之一。让我们转到脚本索引,我们可以…… |
| |
...搜索 Y'All utils。 |
| |
并找到 errorModal 函数,它附带一个小文档字符串,说明如何使用它。 |
| |
而且它已经被导入了... |
| |
Y'All 实用程序 errorModal |
| 约翰 |
我们可以说“你好,世界”。 |
| 约翰 |
让我们看看这个。 |
| |
进入我们的存储库... |
| |
...在演示下。然后推送代码。 |
| |
现在代码被推送到远程存储库,触发 CICD 管道,只需...... |
| |
...几秒钟后,应该能够看到管道正在运行并且...... |
| |
...很快。 |
| |
还没开始。 |
| |
也许我有点... |
| |
……不耐烦。就这样。 |
| |
所以,如果我们去检查 Y'All 的更新,肯定会看到一条新更新。是吗? |
| |
我们将选择更新... |
| |
...插件,现在演示将拥有我们改进的 hello world。 |
| |
好的,我想这就是我为用户演示提供的内容。 |
| 迈克尔·阿克曼 |
谢谢,Johan。如果你同意的话,我就重新接管屏幕共享。 |
| 约翰 |
是的。 |
| 迈克尔·阿克曼 |
我想稍微了解一下这种用户体验背后的原理。所以我将在 Visual Studio Code 中查看这段代码。 |
| |
下载完 Zip 文件后,您可以随时随地查看它。为了方便查看,我先快速进入禅定模式。开始吧。 |
| |
每当 Johan 上传该脚本时,GitLab CICD 流水线就会运行。于是他进入了 Git 仓库…… |
| |
……然后他点击加号按钮上传了一个脚本,并启动了 CICD 管道。这是一个定义服务器应该如何应对这种情况的小脚本。 |
| |
一个准备步骤和一个构建步骤... |
| |
...它将 Git 存储库及其中的所有文件(包括 Johan 的新脚本)克隆到工作目录中,其中... |
| |
...这个称为运行器的处理模块可以处理该代码。然后它构建了代码,因此它运行这个构建阶段,在这个阶段它... |
| |
CD(切换目录)进入构建目录并运行 Python 构建脚本。其实就是这么简单。它会将所有这些新文件克隆到一个工作文件夹中,然后移动到该文件夹中,并在 Python 3 中运行 Python 构建脚本。 |
| |
那么,我们来看看那个 Python 构建脚本。我要点击“控制”选项卡,找到它。它是 build_yall.py。 |
| |
代码量很大,但如果你在看这段代码时,想了解如何浏览,请一直向下滚动到 process 函数。它显示为 def process。 |
| |
这是构建 Y'All 的主要代码,一步一步来。我们会在过程中逐步了解它。 |
| |
首先发生的是 Python 脚本构建了一个菜单层次结构。让我们来看一下。它的作用是创建一个嵌套的 Python 字典,并在 src/scripts 下查找该文件夹结构…… |
| |
……然后把找到的所有 JSL 文件拉到一个字典里,这个字典包含 JSL 文件的名称、工具提示和文件位置。基本上,它会逐个文件夹地构建这个嵌套字典,然后逐个遍历。 |
| |
然后,我们检查每个 JSL 文件的命令名称。我们尝试解析这些文件,并查找 Johan 在脚本顶部添加的 Y'All 菜单名称和 Y'All 工具提示…… |
| |
...定义 JMP 插件菜单中的按钮名称和工具提示。安装 Y'All 时,该 Y'all 菜单会显示,并说明这些按钮的名称以及鼠标悬停在菜单上时工具提示的内容。 |
| |
如果找不到 Y'All 菜单名称或 Y'All 工具提示之类的魔法命令,它就会直接使用没有工具提示的脚本名称。所以 test.jsl 就会变成 test,就像你在 Johan 那里看到的那样。 |
| |
菜单中的命令词典按字母顺序排列,以便于查找,但帮助和设置菜单除外,它们会弹出到顶部,使其始终位于菜单顶部。 |
| |
因为帮助和设置很重要。所有这些信息都会写入 JMPcust 文件。 |
| |
因此,.jmpcust 文件本质上是一种标记语言文档,它定义了 JMP 如何... |
| |
菜单按钮应该是什么,菜单本身应该在哪里,工具提示应该是什么,都在这个 .jmpcust 文件中定义。 |
| |
我要把控制标签页转到“Y'All”,这样你们就能看到它是什么样子了。它实际上是一堆关于菜单的定义…… |
| |
……以及菜单的名称和内容。我们可以看到帮助和设置菜单包含检查 Y'All 更新、切换 Beta 测试模式等等。 |
| |
因此,Python 脚本将使用此写入 jmpcust 文件函数自动写入。 |
| |
然后我们要编写插件定义文件。也就是 addin.def 和 version.txt。Addin.def——我来举个例子——有点…… |
| |
...JMP 用于识别插件并查找版本号以及支持的最低 JMP 版本的描述。 |
| |
我们选择的是 12。这对我们来说有点随意,只是为了不用担心 12 之前的事情。如果您自己开始使用这个,可以在 Python 代码中更改它。插件版本也在这里定义,如您所见。 |
| |
我们将其写入名为 version.txt 的文件中,以便您刚刚在 addin.def 中看到的相同整数也会出现在 version.txt 中。 |
| |
原因是这是一个我们可以远程读取的小文件。我们可以在服务器上通过 HTTP 协议在 JMP 中打开它…… |
| |
...并在 version.txt 文件中快速查看版本号,并与当前版本进行比较。因此,如果我们当前安装的版本与 version.txt 文件中的版本号不匹配... |
| |
……这意味着我们需要更新,或者至少可以更新。我们使用的版本号是运行该程序的日期和时间(UTC 时区)。 |
| |
我们将其转换为自 1970 年以来的基本秒数。因此它是一个整数,可以转换回日期时间格式。 |
| |
所以我们可以以整数形式比较这两个数字,这很棒。我们可以轻松判断它们是大于还是小于对方,并且仍然可以将其转换回日期。所以,在 JMP 中存储版本号对我们来说是一种非常有效的方法。 |
| |
最后。 |
| |
接下来我们要做的事情——我们已经编写了那些附加深度文件——就是创建一个自定义函数脚本。这有点奇怪,也有点难以解释。我会尽力快速简洁地解释。 |
| |
JMP 有两种定义自定义函数的方式。一种是使用 JMP 脚本语言中名为 function 的函数,它的作用是什么呢?我会在这里切换到 utils.jsl 和 Y'All 的 importables 子目录。 |
| |
Function 定义了一个自定义函数,可以从其他位置使用和调用。您可以使用命名空间来定义它。在本例中,我们定义了命名空间 Y'All utils... |
| |
……函数名为 recode if。它接受这些参数,我们得到了这个文档字符串,函数代码也写在这里。 |
| |
在 JSL 中编写自定义函数的第二种方法是使用新的自定义函数 function,它与 function 不同。我相信这是在 JMP 14 中添加的。 |
| |
新自定义函数的作用是将函数添加到 JMP 脚本索引和 JSL IDE 中,以便可以非常轻松地使用该函数并在其他地方通过文档重复使用它。 |
| |
因此,该函数的优势在于它可以一直工作到我甚至不知道 JMP 的哪个版本... |
| |
……在我使用 JMP 之前。新的自定义函数的优势在于它更加强大,而且你可以获得文档和 JMP 脚本索引,还可以在 JSL IDE 中为其着色,并且…… |
| |
...编写代码时提供一些提示。我们喜欢新的自定义函数,但我们希望在 JMP 14 之前支持 JMP。所以构建脚本…… |
| |
...这里,将主要解析可导入目录,寻找与该函数函数函数函数匹配的任何函数定义... |
| |
...在 JSL 中,带有文档字符串。因此,它会尝试解析斜杠星号分隔之间的文档字符串,并将其提取到一个新的自定义函数中。您可以在此处查看示例。 |
| |
我们采用该 recode if 函数,现在将其自动重写为 Y'All utils 命名空间中名为 recode if 的新自定义函数。 |
| |
我们有一个原型、一个描述和一个脚本索引类别,所有这些都显示出来。所以所有这些都自动提供给 JMP 开发人员。所以你可以使用 JSL 中的旧函数编写代码,并且仍然可以获得这个 JMP 脚本索引…… |
| |
...通过自动使用 Y'All 构建脚本来实现。向下滚动到此处查看我的流程代码。 |
| |
写完这些之后,我们现在开始构建插件。JMP 插件使用的是经过修改的 Zip 格式。因此,我们使用 Python 3 将其压缩,重命名为 YALL.jmpaddin,现在就可以在 CICD 运行器的工作目录中使用了。 |
| |
因此,此构建脚本完成后,此 CICD 管道的最后一步是进入该工作目录并上传工件。 |
| |
构建工件是 GitLab CICD 概念,我们将这两个文件 YALL.jmpaddin 和 version.txt 上传到服务器并通过特定的 URL 提供它们。 |
| |
因此该 URL 始终是一致的,并且与我们在 GitLab 中运行它的分支相关联,因此我们使用的是测试版而不是主要发布版本。 |
| |
现在,在 JMP 中——我要跳过去,哈!... |
| |
...到 autoUpgrade.jsl。这是我们检查插件新版本的地方。当 JMP 加载时,Y'All 将运行这个自动升级脚本…… |
| |
...它会在 GitLab 仓库中查找这些新版本。您可以看到,我们在这里加载了 beta 标志,无论是在 beta 模式还是主模式下。 |
| |
我们在特定频道中寻找该模式。所以我们正在拉…… |
| |
…根据所选频道,从特定的 URL 进行查找。因此,如果我们处于测试模式,它会查找测试频道。如果我们处于主模式,它会查找主频道。然后,我们会查找 YALL.jmpaddin 文件和 version.txt 文件。 |
| 迈克尔·阿克曼 |
现在,我们要将该版本号与我们已安装的版本号进行比较,如果不同,则向用户请求更新。弹出您在 Johan 的屏幕上看到的对话框…… |
| 迈克尔·阿克曼 |
……它会询问用户是否需要更新,并告知他们版本号。用户可以选择是否更新。 |
| |
所以。 |
| |
这就是全部内容了。所有这一切都在幕后为用户发生。他们通过 GitLab UI 上传脚本,使用加号按钮上传文件并构建新文件…… |
| |
...JMP 插件,即 Y'All JMP 插件,并使其可供连接到同一存储库的其他用户使用。 |
| |
所有这些都在幕后进行。对于用户来说,这就像从 JMP 中的红色热点保存 JMP 脚本并将其上传到 GitLab 存储库一样简单。 |
| |
所以我想回顾一下 Y'All 的特点。 |
| |
我们的脚本贡献非常简单。正如您所见,我们有一个简洁的用户界面,您可以上传文件、上传 JSL 脚本并将它们发布到您的浏览器中。 |
| |
随之而来的是自动版本控制和代码归档。由于这一切都是通过存储在 Novozymes 服务器上的中央 GitLab 存储库进行的,因此所有这些都会被跟踪和存储…… |
| |
...永久有效。自动更新使开发人员可以非常轻松地向用户发布脚本,并且他们始终可以拥有最新版本…… |
| |
……这些脚本运行正常且质量可控。我们有测试版和正式版渠道。 |
| |
因此,测试渠道基本上会立即构建,新脚本发布到 Y'All 后几秒钟内即可使用,并且会频繁更新。而发布渠道将采用更慢的受控发布结构。我想谈谈我们是如何做到这一点的。 |
| |
您可以在这里看到我们 GitLab 代码库的分支结构。我们有一个包含大量更新的 Beta 分支。我们有一个发布分支。我们还有一个主分支。Novozymes 的运营完全由用户决定。 |
| 迈克尔·阿克曼 |
当这个 Beta 分支处于我们想要发布的状态时,我们会使用它。我们会在 Beta 分支和发布分支之间创建一个合并请求,并将其移至发布分支。这实际上会冻结 Screen 发布分支…… |
| 迈克尔·阿克曼 |
...在代码版本中,我们这样做了,并将代码锁定在这个发布分支上。 |
| |
Beta 版本仍然可以更改。大家仍然可以在 Beta 版本中添加和修改脚本。但发布版本现已冻结。我们会进行质量检查,当我们做好准备,对版本状态感到满意时…… |
| |
...我们将其发布到主分支并将其合并到那里,现在 Y'All 的主分支用户可以使用它了。 |
| |
我们拥有可发现的代码。所有内容都以文件结构的形式存储在中央存储库中。开发人员可以浏览脚本并…… |
| |
...找到类似的代码,以此为基础进行构建和改进。此外,我们还将实用函数自动添加到脚本索引中,供开发人员使用,以便他们可以重复使用类似 recode if 这样的代码块…… |
| |
……或者一些数据库查询之类的,我们也已经把它们作为演示了。所以,如果你浏览一下 Y'All…… |
| |
...在安装了 Y'All 的 JMP 脚本索引中,您可以看到我们包含了一些 Postgres 数据库查询和 Postgres 数据库工具,用于演示如何使用它们。 |
| |
所有这一切都是在 JMP 中开始的,用户使用自己创建的 JSL 脚本,并希望与 Y'All 用户群中的其他人共享该脚本。 |
| |
他们进入 GitLab。然后在用户界面中将其上传到与菜单位置匹配的子目录中,以便他们将其放在 Y'All 中,所以如果他们想将其放在演示、演示、测试中…… |
| |
他们会把这个文件放在 src/scripts/demos/demos 子目录中。一旦他们这样做了,就会启动一个自动构建管道,启动 Python 构建脚本,该脚本会解析结构并构建插件…… |
| |
...插件并将其重新上传到 GitLab 服务器。JMP 会发现新的更新,并自动提供下载,并更新 JMP 中的 Y'All 插件。该脚本只需几秒钟即可在该测试频道上供用户使用。 |
| |
我们希望您对 Y'All 感到兴奋。也希望您有兴趣自己或在您的组织中使用 Y'All。如果您感兴趣,我们想提供一些入门建议。 |
| |
如果您在 JMP 用户社区观看此视频,JMP 用户社区中发布的 Zip 文件应该在同一页面上,其中包含了入门所需的所有元素。其中一些元素需要修改。其中一些是供您使用的演示代码。 |
| |
不过,您可以随意下载并查看。该 Zip 文件中的 Python 构建脚本是基于原生 Python 3 库构建的。我们的构建系统上只安装了 Python。它应该可以在任何标准的 Python 3 安装上运行。 |
| |
我们利用 GitLab 实现 CICD 的中央存储库存储和自动化,以实现持续集成和部署,而其他提供商也提供类似的实现。GitLab、GitHub、Azure 和 AWS 都有类似的实现。 |
| |
存在着大量的选项生态系统,因此实施细节将特定于您的组织。 |
| |
遗憾的是,如果你想在自己的系统上自动运行 CICD 管道文件 gitlab-ci.yml,则需要修改它。除非你是 Novozymes 的员工,否则它无法像在你的系统上那样运行。 |
| |
我们的实用函数中反映内部测试数据库的任何连接字符串都已被 ODBC 我的下划线连接下划线字符串替换。 |
| |
如果您想使用其中任何功能,您将必须进入工作目录中的代码并更改这些字符串以反映您的数据库。 |
| |
所以,再次祝愿大家对 Y'All 感到兴奋。也希望大家对 Y'All 感兴趣。如果您有任何反馈、问题或评论,请随时联系我或 Johan…… |
| |
……和他们一起。我们也非常欢迎您做出任何贡献,如果您能利用这段代码并对其进行改进,或者利用这个工具包并以有趣的方式使用它。谢谢。 |
| 克里斯蒂·斯潘 |
好的,太棒了。 |
| 迈克尔·阿克曼 |
时间。 |
| 克里斯蒂·斯潘 |
合理完美,是的。 |
| 迈克尔·阿克曼 |
是吗? |
| |
尽管 Johan 说 JMP 不想要,但这没关系。 |
| 克里斯蒂·斯潘 |
你知道。 |
| 迈克尔·阿克曼 |
我觉得大多数人可能都不会发现它。 |
| 克里斯蒂·斯潘 |
作为一个新词我喜欢它。 |
| 约翰 |
所以我们被告知不要使用它,所以我们必须重命名它,并且由于没有删除我拥有的版本而陷入困境。 |
| |
先前已安装。 |
| |
所以当我意识到我已经处于测试阶段时,我有点不知所措,然后我就…… |
| |
无论如何。 |
| 克里斯蒂·斯潘 |
是的,我认为这很好,但是现在这非常有趣,我认为人们会喜欢看到这个,所以我们非常感谢你们的参与。 |
| |
正如我所说,我将上传视频供 Jeff 编辑,我不确定什么时候能完成,但是。 |
| |
无论如何,你们将在十月份看到这一切,但如果有任何事情发生,我一定会告诉你们。 |
| |
再次感谢。 |
| 约翰 |
您有一种有关正常 JMP 的新类型。 |
| 迈克尔·阿克曼 |
关于你说你在别的地方,这只是有点。 |
| |
是的。 |
| 约翰 |
你们的目錄。 |
| 克里斯蒂·斯潘 |
是的,非常感谢,我知道。 |
| |
为防治疾病我们做了大量工作,我们对此表示感谢。 |
| 迈克尔·阿克曼 |
我们很高兴。 |
| |
谢谢。 |
| 迈克尔·阿克曼 |
紧接着又快速移动。 |
| 克里斯蒂·斯潘 |
是的,老兄,当然很高兴见到你们。 |
| |
希望下次。 |
| |
至少和迈克尔会亲自见面,约翰我想去那里,也见见你,但是。 |
| |
是的。 |
| 迈克尔·阿克曼 |
你总是知道他是否,特别是如果他在演讲,或者在每次峰会上,或者在过去亲自参加的事情,都是同一周,因为罗利的所有事情都开放,所以你可以做一整周的事情。 |
| |
计算会议。 |
| |
并看到一群当地的员工。 |
| 约翰 |
争论旅行预算可能更容易,是的。 |
| 克里斯蒂·斯潘 |
买一送一,没错。 |
| |
是的。 |
| 约翰 |
好的。 |
| 克里斯蒂·斯潘 |
好的,祝大家周一剩余时间过得愉快,谢谢。 |
| |
您也可以很快再次与您交谈。 |
| 约翰 |
再见。 |
| |
再见。 |