我们有多个 JMP 插件,供 100 多名用户使用。这些插件需要 JMP、Oracle ODBC 客户端和自定义菜单。最初,我们把插件部署到每个用户的电脑上,这需要在每台电脑上安装 JMP 和 Oracle,并配置 ODBC 驱动程序和插件菜单。维护起来简直是噩梦,因为几乎每周都有人硬盘故障或电脑需要重装系统。
为了减轻负担,我们选择使用 Citrix 服务器运行 JMP 及其插件。目前,我们正在从 Citrix 切换到 Microsoft 远程桌面协议 (RDP)。这样做的好处包括:
我叫彼得·莫罗兹,来自强生公司。今天,我将为大家讲解JMP服务器以及它如何改变了我的工作方式。请共享我的屏幕。
大家好,我叫彼得·莫罗兹,来自强生创新医学部门。今天,我将和大家分享我是如何使用服务器版 JMP 及其插件来拯救我的世界的。需要说明的是,本次演讲仅代表我个人观点,并不代表强生公司对任何产品的正式认可。
我们是谁?我们是强生创新医学部。我们的使命是发现和开发创新药物和解决方案,以改善人们的生活,并解决当今最重要的未被满足的医疗需求。我的部门是全球医疗安全部。我们的任务是通过推动卓越的医疗安全和效益风险评估来保护患者。
我的团队叫做方法与分析组,我们的目标是开发和实施分析工具,以提高检测和评估安全信号的效率和分析能力。简而言之,我们负责收集、处理、报告和分析强生公司大部分药物的安全数据。我的团队其他成员都在右边。您可以看到我。这是我的四个孙辈,包括下面这位刚出生不久的孙女。
我们今天的议程是什么?我将先谈谈问题,再谈谈解决方案,然后详细介绍服务器环境、安全性、Oracle 配置、JMP 插件配置以及一些代码维护技巧,最后讲解用户如何从 Citrix 或 RDS 保存文件。我们遇到的问题是,我们有多个 JMP 插件,供 100 多个用户使用,这些插件需要 JMP、Oracle 连接以及自定义菜单。最初,我们将它们作为插件部署到各个 PC 上。因此,每台 PC 都需要安装 JMP、Oracle、配置 ODBC 驱动程序以及添加自定义菜单。这种方法虽然可行,但维护起来却非常麻烦,因为每周都会有人硬盘故障、重装系统,或者收到一台空空如也的新电脑。这简直是工作量巨大。
我们已改用 Citrix 服务器运行 JMP 及其插件。目前我们正在从 Citrix 切换到 Microsoft 远程桌面服务 (RDS),但它们本质上是一样的。好处之一是只需设置一次。对于海外用户来说,性能非常出色,因为只需来回发送屏幕即可。除非保存内容,否则不会发送任何数据。
它还提供了额外的安全保障。当您进行更改时,更改只会部署到每台服务器一次,而不是每个用户一次。我们之所以切换到 RDS,是因为它比 Citrix 更经济实惠,它是 Windows 的一个组件,它使用一种叫做远程桌面协议的技术,而使用远程桌面协议需要 Microsoft 计算机访问许可证。
这就是我们的环境。我们有一个Oracle数据库,目前有三台Citrix服务器,但它们很快就会迁移到RDS,并且运行着JMP。我们的用户通过Web链接连接到服务器,服务器运行JMP并将输出结果发送到他们的屏幕上。
Citrix 是一家美国跨国云计算和虚拟化技术公司,提供从服务器应用到桌面虚拟化、网络、软件即服务 (SaaS) 和云计算技术。微软远程桌面服务 (RDS) 提供应用虚拟化功能,可以映射驱动器和打印机。RDS 是微软开发的专有协议,它为用户提供图形界面,使用户能够通过网络连接连接到另一台计算机。用户使用 RDS 内置的客户端软件,而主机必须启用 RDS 服务软件。
我们有多个服务器,其中涉及负载均衡。关于 RDS 配置,我只能简单介绍到这里。RDS 有一个连接门户,用于选择用于负载均衡的服务器。RDS 还有一个 Web 前端,运行在单独的服务器上,它是 RDS 的一个组件。它显示应用程序列表。这里列出了几个用户可用的应用程序,它使用 Microsoft IIS 来构建网页。这就是我能讲到的最深入的技术细节了。如果您想为公司部署 RDS 或 Citrix,需要联系您的 IT 部门。
为了安全起见,我们使用一种叫做身份管理系统的工具。您提交申请后,系统会将您分配到开发、测试或生产组。只有拥有特定开发、测试或生产组访问权限的用户才能运行 JMP。此外,我们还有 Oracle 表,其中列出了插件、用户和角色,并且每个插件都为每个用户配备了不同安全级别的连接器。然后,我们使用管理员帐户进行维护,以便远程登录服务器。接下来我们来谈谈 Oracle 配置。
在服务器上,您需要安装 Oracle 客户端,并且需要设置两个环境变量:Oracle Home(Oracle 客户端的安装位置)和 TNS_ADMIN(TNSNAMES.ORA 和 SQLNET.ORA 文件所在的位置)。TNSNAMES.ORA 文件包含所有数据库的别名,并告诉 Oracle 在哪里查找这些数据库。您还需要确定 ODBC 连接的 Oracle 驱动程序名称。最简单的方法是按下 Windows 键,选择“ODBC”,然后选择“ODBC 数据源 64 位”,点击“驱动程序”选项卡,即可看到 Oracle 驱动程序名称,即“Oracle in OraClient19Home1”。
如何使用这个 Oracle 驱动程序名称建立连接?这里有一个简单的 JSL 脚本。我有一个名为 tns_alias 的东西,它代表我的数据库。它在 TNSNAMES.ORA 文件中就是这样列出的。
然后是连接器文本,DBQ 是我的 TNS 别名。这是我的用户名和密码。接下来是驱动程序文本,然后是我的 Oracle 数据库,位于 OraClient19Home1。这可能不太容易找到。以下是查找方法的实用技巧。
然后我们将这两个字符串合并成一个 DSN 字符串,并使用该字符串创建一个数据库连接,并将连接结果赋值给变量 1 DBC。完成后,连接器字符串如下所示。要使用此连接运行 SQL,您需要调用 execute_sql 函数,并传入一个连接器和一个类似这样的简单 SQL 语句,然后关闭数据库连接。如何配置 JMP 插件?您需要在服务器上安装 JMP,然后在相应的目录中创建插件文件夹。
C:\ProgramData\SAS\JMP\addIns。大小写很重要。所以 P、D 都要大写,全部大写,I 也要大写。我跟 JMP 技术支持沟通了好几次才搞清楚,原来 I 是大写,P 和 D 是大写。搞清楚之后,一切就正常了。
我们使用插件的“id”作为文件夹名称。这里您可以看到一个示例,其中包含位于此远程服务器上的 5 个插件。每个文件夹都包含一个文件,即 addin.def 文件。以下是 addin.def 文件的示例。
该 ID 标识了插件的别名,即 com.jnj.gms.pv-analyze-prism。它包含名称、主目录和最小版本号。这个主目录是什么意思呢?主目录是核心所在。插件的所有 JSL 脚本都存储在主目录中。
这就是这个文件夹,然后这里是我所有的 JSL 脚本。addin.jmpcust 文件存储了插件的菜单。我们所有的插件都是自定义菜单。但我们先来谈谈菜单。按照我们的设置,我们不希望任何没有适当安全设置的用户运行菜单选项。
每个菜单项都声明了一个指向程序的全局变量,其中包含一个用于检查安全性的启动程序。要查看此设置,您可以点击“视图”,选择“自定义菜单和工具栏”,然后在右上角点击“更改”,选择“JMP 加载项”,然后选择所需的加载项,最后点击“确定”。现在您会看到该加载项的菜单已亮起。您可以进行一些更改。以下是一个典型的菜单项示例。我有一个指向要运行的程序的全局变量,即“打开 datatable.jsl”。
这个数据插件主目录里包含了ID,这意味着你不需要告诉JMP实际的硬盘位置。它会自动查找并解码addin.dev文件中的信息。第二行指示包含launch_pva_menu.jsl脚本。这就是菜单操作部分的内容。只需运行这个jsl脚本即可。你还需要检查并使用插件主文件夹com.jnj.gms.pv-analyze-prism。这是启动程序。我们包含了几个函数和一个数据库访问脚本。然后我调用了有效的PPA用户。
它会在 Oracle 安全表中查找用户。如果用户不在表中,则会收到错误消息并被强制退出。这涉及到一些 JMP 版本依赖关系。我记得这段代码是在 addin.dev 文件中添加最低 JMP 版本要求之前编写的,或者可能是我当时并不知情。
不过,总之,一旦我们通过了那一步,就会查看程序名称中是否包含特定内容。如果包含 JMP 应用程序扩展名(即应用程序构建器),我们就打开该程序。否则,它就是一个 JSL 脚本,我们就将其包含进来。为了进行代码维护,我们设置了三个环境:开发环境、测试环境和生产环境,以及一台用于开发、一台用于测试、三台用于生产环境的服务器。
验证成功后,更新后的文件会被复制到相应的服务器。我使用一款名为 Total Commander 的程序来同步这些文件夹,我们稍后会看到它。Citrix 和 RDS 的情况略有不同。实际上,访问文件的方式……至少我们使用 OneDrive。它有所不同。
如果使用 JMP 将文件保存到服务器的桌面或文档中,文件实际上会保存到服务器本身,这是不允许的。为了解决这个问题,我们点击文件首选项中的文件位置。然后,在“数据文件目录”和“保存位置”中,我们指定 OneDrive 的位置。Citrix 和 RDS 的路径略有不同。Citrix 的路径是 Client\C$,而这里是 tsclient\C。
其余部分是用户、您的用户名、OneDrive 和 JNJ。这是我们自定义的 OneDrive 位置。从此以后,您每次打开或保存文件时,默认情况下都会保存到您的 OneDrive,而不会尝试保存到服务器上。
我们来做个快速演示。点击这里。这是我的 RDS 登录界面。我这就登录。它会生成一个 RDP 文件,然后运行它。如果你右键点击这里,请确保选中“始终打开此类文件”选项。它现在只是连接我到这里。这里是运行在我们开发实例上的 JMP 服务器,我可以打开一些东西……我的数据,我们来运行一下 distribution 命令。
然后我们保存它。它会保存到我的 OneDrive。我把它放在一个名为 temp 的文件夹里。好的。现在我已经把它保存到我的硬盘了。看起来还在保存。现在我的电脑本地运行着 JMP,我们来看看如果我点击并把它拖到这里会发生什么。找到了。它是我在服务器上生成的,只是有一种方法可以证明它确实有效。
好的。我还想给你们展示一下服务器本身。我现在登录的是实际的 RDS 服务器。上面安装了 JMP 16 和 JMP 18,这是我常用的工具,叫做 Total Commander。
我只是想给您展示一下我有一些文件需要复制到服务器的情况。这是在文件共享上。这个 D 盘是这个应用程序的插件所在位置。我将使用这里的按钮同步目录,然后进行比较,并按日期排序。看起来这里有几个文件需要更新。
不过我只想演示一个。我最喜欢的功能之一是,我可以在这里右键点击,然后选择“比较左右”。这只是一个简单的改动。之前有个注释放错了位置,我把它放到了正确的位置。如果我想同步,就点击“同步”。复制内容。搞定。这就是我想演示的服务器版 JMP 的全部内容。我们继续演示吧。总之,在服务器上运行 JMP 对插件来说非常棒。你只需要设置一次。
海外用户体验极佳。安全措施更加完善,而且变更只需在服务器上部署一次,无需针对每个用户单独部署。总之,JMP 服务器及其插件拯救了世界。就是这样。非常感谢。