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