搜索​​​​

文章
Jingwei Wang · 5 hr 前

配置 DSN

在Windows配置DSN 确认InterSystems ODBC客户端驱动已安装 InterSystems IRIS ODBC驱动会随着InterSystems IRIS安装包默认安装。 如果没有随着InterSystems IRIS安装,请由此下载驱动,下载后执行.exe文件进行安装。 定义DSN(Data Source Names) 打开Administrative Tools 打开ODBC Data Sources Administrator(32-bit 或者 64-bit) 选择‘System DSN’,点击右边 ‘Add’,弹出‘Create New Data Source’窗口。 选择一个InterSystems IRIS 安装版本的ODBC驱动,点击‘Finish’ 如下图所示,输入驱动名称,IP地址,端口号(使用超级服务端口号),命名空间,用户名和密码。 然后点击 'Test Connection' 进行连接测试 在Linux配置DSN 确认InterSystems ODBC客户端驱动已安装 InterSystems IRIS ODBC驱动会随着InterSystems IRIS安装包默认安装。 如果没有随着InterSystems IRIS安装,请先安装ODBC驱动 Linux 点击下载ODBC驱动 创建一个文件夹,例如/usr/irisodbc,存放刚刚下载的.tar文件 解压.tar文件,执行ODBCinstall安装脚本,irisodbc.ini会被创建: # tar xvf ODBC-2022.1.0.209.0-lnxrharm64.tar.gz # ./ODBCInstall Mac 执行以下命令安装unixODBC brew install unixODBC 配置DSN - 根据InterSystems IRIS服务器修改odbcinst.ini文件的配置信息 [ODBC Data Sources] User = User Userunixodbc = Userunixodbc ​ [User] Driver = /isc/iris/bin/libirisodbc35.so Description = IRIS ODBC driver Host = localhost Namespace = IRISAPP UID = username Password = pws Port = 51773 Protocol = TCP Query Timeout = 1 Static Cursors = 0 Trace = off TraceFile = iodbctrace.log Authentication Method = 0 Security Level = 2 Service Principal Name = iris/localhost.domain.com ​ [Userunixodbc] Driver = /isc/iris/bin/libirisodbcur6435.so Description = IRIS ODBC driver Host = localhost Namespace = IRISAPP UID = username Password = pws Port = 51773 Protocol = TCP Query Timeout = 1 Static Cursors = 0 Trace = off TraceFile = iodbctrace.log Authentication Method = 0 Security Level = 2 Service Principal Name = iris/localhost.domain.com
文章
Hao Ma · 十一月 26

ZPM介绍(3)

## 建立私服(Porxy-Registry) 这张图解释了您的私服是怎么工作的, 整篇文章在这里: [Proxy-Registry](https://community.intersystems.com/post/new-zpm-registry-feature-%E2%80%93-proxy-registry) ![](https://community.intersystems.com/sites/default/files/inline/images/proxy.png) ### 搭建私服 您需要有一台自己的的服务器, 在上面安装IRIS, zpm, 然后用zpm去下载另一个软件包“zpm-registry"。象这样 ```sh zpm:DEMO>search -r zpm-registry registry https://pm.community.intersystems.com: zpm-registry 1.1.11Repository: https://github.com/intersystems-community/zpm-registry/ zpm:DEMO>install zpm-registry [DEMO|zpm-registry] Reload START (/usr/irissys/mgr/.modules/DEMO/zpm-registry/1.1.11/) [DEMO|zpm-registry] Reload SUCCESS [zpm-registry] Module object refreshed. [DEMO|zpm-registry] Validate START [DEMO|zpm-registry] Validate SUCCESS [DEMO|zpm-registry] Compile START [DEMO|zpm-registry] Compile SUCCESS [DEMO|zpm-registry] Activate START [DEMO|zpm-registry] Configure START [DEMO|zpm-registry] Configure SUCCESS [DEMO|zpm-registry] Activate SUCCESS zpm:DEMO> ``` 到github页面, https://github.com/intersystems-community/zpm-registry/, 你可以得到更详细的软件信息。 配置私服连接公服, 需要在私服的IRIS的安装目录添加一个yaml文件, 定义uplink: ```yaml uplinks: pm: url: https://pm.community.intersystems.com/ allow_packages: dsw,zpm*,?u* ``` 几点说明: - uplinks的项目可以有多个,pm是intersystems的默认公共registry - allow_packages: - a comma-separated list of allowed packages, you can use the exact package name or mask: * - any sequence of characters, ? - any charac - registry 提供的rest 接口描述: https://pm.community.intersystems.com/_spec ### 设置zpm client连接私服 通过repo命令将您的zpm client切换到刚刚配置的私服。`repo -n registry`里面的 - user, - pass是你搭建的私服的账号密码。您也可以在私服上修改/registryWeb应用不做用户验证。 ```sh zpm:DEMO>repo -list registry Source: https://pm.community.intersystems.com Enabled? Yes Available? Yes Use for Snapshots? Yes Use for Prereleases? Yes Is Read-Only? No Deployment Enabled? No zpm:DEMO>repo -n registry -r -url http://localhost:52773/registry/ -user superuser -pass demo registry Source: http://localhost:52773/registry/ Enabled? Yes Available? Yes Use for Snapshots? Yes Use for Prereleases? Yes Is Read-Only? No Deployment Enabled? No Username: superuser Password: zpm:DEMO> ``` 这时的私服时没有连接gongfuu ### 发布软件包到私服 **发布一个 GitHub 的包** 先把软件存在github, 然后用curl命令把包发布在私服的地址。 ```sh $ curl -i -X POST -H "Content-Type:application/json" -u superuser:1104 -d '{"repository":"https://github.com/psteiwer/ObjectScript-Math"}' 'http://localhost:52773/registry/package’ ``` **使用zpm 客户端先在本地load,然后使用publish 命令** 大概像这个样子: ```sh zpm:USER>help load ... ■ Examples ∙ load C:\module\root\path\ load C:\module\root\path\module-0.0.1.tgz Loads the module described in C:\module\root\path\module.xml ∙ load -dev -verbose C:\module\root\path\ load -dev -verbose C:\module\root\path\module-0.0.1.tgz Loads the module described in C:\module\root\path\module.xml in developer mode and with verbose output. ∙ load https://github.com/user/repository.git load https://github.com/user/repository.git -b branch-name Loads the module described in C:\module\root\path\module.xml in developer mode and with verbose output. zpm:USER> load https://github.com/user/repository.git zpm: USER> publish ``` 这样还不是很方便,所以有人在 ## 其他的Feature 在使用中您还会有各种各样的需求, 但我相信看到现在您应该对怎么寻找答案非常清楚了。这里简单的说两个feautre ### 1. 发布为Delopyed模式 如果您要隐藏自己的代码,只发布编译后的软件, 可以简单的修改Module.xml, 设置““, zpm会自动完成。 ### 2. 包的依赖 因为有朋友问,所以说一些包依赖的功能。是的, zpm是设计了包依赖的功能的,在module.xml里添加Dependencies节点, 可以定被依赖的包的列表。 具体的写法请参见这个例子:[module.xml example](https://github.com/intersystems/ipm/wiki/03.-Module.xml#modulexml-example)。 虽然但是,对ObjectScript程序来说,定义包依赖的机会并不多。我能想到的应用场景就是, 当您的软件中想用社区其他包,比如上面的bitmap-adoption的包的话,您可以包"bitmap-adoption"打包到module.xml里面。 我对当前发布的200多软件包随便挑了一些,还没有发现有哪个使用了包依赖, 象这样: ```sh zpm:USER>list-dependents yaml-utils zpm:USER>list-dependents terminal-multiline-editor zpm:USER>list-dependents bitmap-adoption zpm:USER>list-dependents global-dump-sql ... ```
文章
Hao Ma · 十一月 22

ObjectScript的命名规范

命名规范,英文叫"name convention", 是对写代码取名字的一些”共识“。也就是说, 你可以不遵守,但大家都选择了遵守,照者一个规范来。为什么呢?因为有社区,大家要共享代码, 你不照着规矩来, 别人会鄙视你, 懒的用你的代码。 ObjectScript以前没什么社区,大家各写各的, 使用ObjectScript的大公司也没谁把自己的代码拿出来共享。因此,个人开发者基本就是参考官方InterSystems的命名规范。举个例子, 比如以下的代码: ```java Class Ens.Util.ResponseBodyMethods { property NoFailWhileDisconnected as %Boolean; property FirstName as %String; parameter SETTINGS = "ReplyCodeActions"; method OnKeepalive(pAdapterStatus As %Status) as %String { return "okay" } } ``` 我来简单总结一下: - **包名和类名**:Pascal格式,也就是首字母大写。其中%开头的是官方独占, - **Property名字**:首字母大写 - **method Name**:同上。但出入参用的是驼峰格式,也就是第一个单词小写,后面单词大写开头。 - **Parameter Name**:常量。 官方的代码都是这个规范吗? 大体上是,但也有例外, 比如%xsd包,包名类名全小写, 像这样: %xsd.string。这个从Caché年代就这样,我是不明白为什么这个包这么特殊。 到了IRIS上,更多瞎写了, 比如这个: [%SYSTEM.external.SQL](https://docs.intersystems.com/iris20222/csp/documatic/%25CSP.Documatic.cls?LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.external.SQL)。不光是它,我发现很多和“external“相关的包名,都开始用小写了,写在代码里是这样的: %system.external.help(), %system.dotnet.SQL.addPath()。后面一个为什么SQL大小,dotnet小写,我也是没想明白。 然后,重要的来了。 InterSystems Developer Community贴出了这样的[community代码命名规范](https://community.intersystems.com/post/objectscript-package-manager-naming-convention)。它是怎么被推广的呢? 通过zpm,也就是社区里的代码ObjectScript的包管理工具。曾经一度你要参加社区的代码比赛,就必须使用zpm打包,而zpm对使用这个代码规范有硬要求,所以这个convention得到了一定程度的接受,能看到越来越多的开发者这么写代码了。 原文上面有链接,这里说最重要的: **package名字全小写,class名字用首字母大写**。比如class会定义成: ```java class company.project.subpackage.TheClass{ ... } ``` 这基本上是借鉴Java。作者也说了:*The approach borrowed from the naming convention for java classes.* 作者还做了个解释:全小写的Package名字避免了和class或者interface的名字冲突。这句话我不是很明白。 我觉得网友只所以接受它,纯粹就是java和python用惯了,烦大写的类名。 如果都是c++, c#的程序员,估计这个命名规范还得有得吵。 我这里只说了包名类名, 其他的method, property, 变量的命名什么的,还包括github上repo起名字的规范, 有兴趣去原文看看吧。 我是挺喜欢这个规范的。 唯一有点不满意的是:Java中定义Package name 和class name不是连着写在一起的,比如下面: ```java package org.springframework.asm; public abstract class AnnotationVisitor { ... } ``` 所以你很少能看到包名和类名连写在一起的情况,所以小写的小写, 大写的大写,都不挨着。而ObjectScript的类定义一定要写全了, 上面的定义如果在ObjectScript里就是: ```java public class org.springframework.asm.AnnotationVisitor { ... } ``` 因此这样的写法会有个视觉上的大小写的落差。 我属于没事找事的。 结论: 社区有了命名规范,矮骡子们纷纷表示支持。 按这个convention,Tony老师如果去写一个示例代码贡献给社区的话,可能是这样的 ```java class com.dhc.tony.demo.xml.TestUtils { property noFailWhileDisconnected as %Boolean; property firstname as %String; parameter SETTINGS = "ReplyCodeActions"; method onKeepalive(pAdapterStatus As %Status) as %String { return "okay" } } ```
文章
Hao Ma · 十一月 20

ZPM介绍(2)

## 发布您自己的软件 首先:要发布您的软件,您要支持这个”[命名规范](https://community.intersystems.com/post/objectscript-package-manager-naming-convention)。其中和zmp最相关的是包名和l类名的设计,你要定义成这样: **company.project.subpackage.TheClass.cls** 如果您的Package Name定义是: Company.Project, 有大写字母,对不起,是无法用zpm打包的。 [这个链接](https://community.intersystems.com/post/zpm-simple-implementation-cookbook)给了最简单的例子,但还不详细,我来总结一下: 发布您的软件前,有几件事情要了解: 1. zpm的注册中心并不存代码,存的只是一个到您代码的链接。因此,您得找地方放您的代码。当前最常用的是github。 2. 文件目录的结构 举例:有一个class定义是 `com.tony.Test1.cls`, 你的目录应该这么组织,假设您要放在 `/myDemo`, 那么class应该在`/myDemo/src/com/tony/Test1.cls`。这是使用VSCode组织代码的默认方式,**只有保证这样的目录结构,您才可能用zpm加载代码到iris**. 让我来做个简单的例子。 首先,有这样的class: ```java Class com.tony.Test1 { Property p1; } ``` 我的文件目录设置 ```sh $ ls -l /external/myDemo/src total 4 -rw-r--r-- 1 irisowner irisowner 40 Nov 12 10:00 Test1.cls $ ``` 这时候我来使用zpm打包测试 ### module.xml的生成和加载 第一步,生成module.xml 我们看看最简单的用zpm generate命令生成module的例子: ```sh zpm:USER>generate /external/myDemo/project1 Enter module name: project1 Enter module version: 1.0.0 => Enter module description: Enter module keywords: Enter module source folder: src => Existing Web Applications: /csp/user /terminal /terminalsocket Enter a comma separated list of web applications or * for all: Dependencies: Enter module:version or empty string to continue: zpm:USER> ``` `zpm generate`会把/external/myDemo/project1目录下的文件打包,在这个目录下创建一个module.xml文件, 是这样的: ```sh project1 1.0.0 module src ``` 先等等解释这个xml, 让我们先执行第2步。 第2步: 把文件load到iris ```sh zpm:USER>load /external/myDemo/ [USER|firstdemo] Reload START (/external/myDemo/) [USER|firstdemo] Reload SUCCESS [firstdemo] Module object refreshed. [USER|firstdemo] Validate START [USER|firstdemo] Validate SUCCESS [USER|firstdemo] Compile START [USER|firstdemo] Compile SUCCESS [USER|firstdemo] Activate START [USER|firstdemo] Configure START [USER|firstdemo] Configure SUCCESS [USER|firstdemo] Activate SUCCESS zpm:USER> ``` 您去iris里看看, 确认class已经被loaded 第3步: 删除(optional, 但你可能会用到这个命令) ```sh zpm:USER>uninstall firstdemo [USER|firstdemo] Clean START [USER|firstdemo] Unconfigure START [USER|firstdemo] Unconfigure SUCCESS Deleting class com.tony.Test1 [USER|firstdemo] Clean SUCCESS zpm:USER> ``` 这时候您应该可以发现com.tong.Test1类已经从Iris删除了。 对上面的例子总结一下: 1. 打包是对一个文件夹打包 2. 使用zpm把软件包加载进iris是先找包里面的module.xml文件。通过module.xml里定义的信息来知道包的名字,版本,打包的内容等等。 这个module.xml是在打包的时候用`zpm generate`创建的, 但您也可以自己手工创建,比如copy其他包的module.xml改改, 有时候会更快捷,尤其是您对zpm命令不是很熟悉的时候, 对很多打包的需求,比如后面会提到的定义依赖等等,直接改module.xml比`zpm generate`容易多了。 3. 让我来说说可能的问题: module.xml中``定义了包名*com.PKG*, 加载数据包到iris很成功。但是,如果您还记得,刚刚例子里打包的是class是`com.tony.Test1`,那么如果你再定义一个新的类,叫`com.tiedan.Test1`, 用`zpm generate`一个新module, 名字叫project2(注意第一个打包的module名字是project1), project2的"Resource Name"也还是"com.PKG, 它能正确加载吗? 不会, 你会被告知:"ERROR! Resource 'com.PKG' is already defined as part of module 'project1'; cannot also be listed in module 'project2'" ​ 解决方法:手工将module.xml里面的Resource Name改成“com.tony.PKG"和"com.tiedan.PKG", 这样两个包都能成功加载了。 还有个小问题,Mac用户可能会看到这样的提示: >zpm:USER>load /external/myDemo/project1 > >[USER|project1] Reload START (/external/myDemo/project1/) >[project1] Reload FAILURE >ERROR! Unable to import file '/external/myDemo/project1/src/com/.DS_Store' as this is not a supported type. >zpm:USER> 这是说打包的文件夹下面有.DS_Store文件,而zpm不认识。zpm会把里面认识的文件, 比如.cls文件成功加载, 然后告诉你"Roload FAILURE" 好吧, 到这里我们知道怎么打包和把包加载到iris里, 接着看看什么文件可以被打包。 ### Package可以包含的文件类型 这时候要好好了解module.xml的内容的细节了, 请阅读[技术文档的module.xml部分](https://github.com/intersystems/ipm/wiki/03.-Module.xml#elements)。 其中的resource部分,阐明了您可以打包的内容: 第一部分:可以被加载到iris的文件类型。 > Use the following suffixes for different types of resources: > > .PKG - Package > .CLS - Class > .INC - Include > .MAC - Routine > .LOC - LocalizedErrorMessages > .GBL - Global > .DFI - DeepSee Item 第二部分:jar包 ```xml Copies content of lib folder to Target Copies just desired file to Target ``` 第三部分:UnitTest module.xml的例子里给出的UnitTest部分是这个样子 ```xml ``` 说实话,我还没研究怎么使用`zpm generate`可以做到这一点,能想到的就是手工去修改module.xml文件。 第四部分:Web Application 执行`zpm generate`的时候, 会列出当前命名空间可以使用的Web Application列表。让我重新执行一下打包的第一步,看看结果是什么样子 ```sh zpm:USER>generate /external/myDemo/project1 Enter module name: project11 Enter module version: 1.0.0 => Enter module description: Enter module keywords: Enter module source folder: src => Existing Web Applications: /csp/user /terminal /terminalsocket Enter a comma separated list of web applications or * for all: /csp/user Enter path to csp files for /csp/user: Dependencies: Enter module:version or empty string to continue: zpm:USER> ``` 得出的module.xml里多了如下内容: ```xml src ``` 其中,打包时提问`Enter path to csp files for /csp/user:。 这里,您需要填入的是当前要load的csp文件。比如:您有一个tony.csp要加载,那么您可以在要打包的目录下创建一个子目录“cspfiles", 把tony.csp放在cspfiles目录里, 回答提问的使用这样 `Enter path to csp files for /csp/user:/cspfiles` > 这里用的是相对路径,但格式是绝对路径的格式,我把它看成一个bug。 module.xml中还有其他很多配置的内容,我在后面会介绍包的依赖的部分。 ### 软件包的Package 用package命令,在iris里将软件打包。打包的结果是得倒一个project1-1.0.0.tgz的文件。 `package -v`显示verbose信息,您可以清楚的看到project1-1.0.0.tgz和module.xml的存放位置。 ```sh zpm:USER>project1 package -v [USER|project1] Reload START (/external/myDemo/project1/) Skipping preload - directory does not exist. Load of directory started on 11/20/2022 13:15:17 '*' Loading file /external/myDemo/project1/src/com/tony/Test1.cls as udl Load finished successfully. [USER|project1] Reload SUCCESS [project1] Module object refreshed. [USER|project1] Validate START [USER|project1] Validate SUCCESS [USER|project1] Compile START Compilation started on 11/20/2022 13:15:17 with qualifiers 'd-lck' Compiling class com.tony.Test1 Compiling routine com.tony.Test1.1 Compilation finished successfully in 0.008s. [USER|project1] Compile SUCCESS [USER|project1] Activate START [USER|project1] Configure START [USER|project1] Configure SUCCESS Studio project created/updated: project1.PRJ [USER|project1] Activate SUCCESS [USER|project1] Package START Exporting 'com.tony.Test1.cls' to '/usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/src/com/tony/Test1.cls' Exported to /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/module.xml Module exported to: /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0/ Module package generated: /usr/irissys/mgr/Temp/dirKBwoaM/project1-1.0.0.tgz [USER|project1] Package SUCCESS zpm:USER> ``` ### 软件包的Publish 我们并没有权限把软件包直接发布到官方的registry去。您需要去InterSystems的[OpenExchange页面](https://openexchange.intersystems.com),提交您的软件包。如下图填入软件包的信息,Github URL, 注意勾选右下角的"Publish in Package Manager" 。 ![image](/sites/default/files/inline/images/image-20221120215709459.png) 后面, 我会介绍怎么创建自己team的私服, 用zpm publish可以简单的把iris的软件包发布到私服上去,这对一个开发团队共享软件包并方便部署应该是更有吸引力些。
公告
Claire Zheng · 十一月 17

创意社区新闻摘要 | InterSystems Ideas News!

Hi 开发者社区的成员们,大家好! 欢迎关注我们第一期 InterSystems Ideas News! 最重要的消息是我们第一次非常成功的 创意马拉松。我们收到了75个有趣的新想法。 以下是创意社区(Ideas Portal)一些数据: ✓ 上月,我们收到了42条新创意✓ 上月,我们迎来了147位新用户✓ 迄今为止,我们共收到142 条新创意✓ 迄今为止,共有 273 位用户加入我们 以下是评选出来的当月最佳创意的前5名: IRIS and ZPM(Open Exchange) integration Move users, roles, resources, user tasks, Mappings (etc) to a seperate Database, other than %SYS, so these items can be mirrored RPMShare - Database solution for remote patient monitoring (RPM) datasets of high density vitals Create front-end package based on CSS and JS to be used in NodeJS and Angular projects PM platform 这里是上个月发布的所有想法的列表 目前就这些啦! 访问我们的 InterSystems Ideas portal(创意社区),提出你的观点,为你认同的创意投票! 下期见!
文章
Hao Ma · 十一月 14

ZPM介绍(1)

# ZPM介绍 有Developer听闻了InterSystems的包管理器ZPM, 希望我能介绍一下。正好刚刚看到一个开发者论坛的新闻:[ Open Exchange ZPM is now InterSystems Package Manager ](https://community.intersystems.com/post/zpm-now-intersystems-package-manager-ipm), 觉得更有必要了。 ## zpm是什么 简单说:zpm, 全称InterSystems ObjectScript Package Manager, 是一个包管理器。可以下载开源社区和InterSystems放在github/自己Repo的软件包,发布你你自己的软件包,并在InterSystems IRIS上轻松的管理测试和部署他们。ZPM, 是包管理器。它的开发者是Nikolay Soloviev和Dmitry Maslennikov。zpm先是在开发者社区里得到认可,尤其是InterSystems开放者社区最近的一些比赛,要求参赛作品用zpm打包,这里渐渐的得到了开发者的认可。 上面的链接是最近的新闻:InterSystems决定用它来打包自己的components, 然后把InterSystems原本放在Github的东西放到自己创建的Repo上。同时,将ZPM改名字叫IPM(InterSystems Package Manager),并保持它的开源状况不变。 这里我还是要坚持介绍zpm。两个原因。1. 操作的命令没变,还是用zpm, 所谓ipm,只是官方给的名字。2. ipm新的注册中心还不太了解,而且**到目前为止,IPM的注册中心还只对自己的雇员和付费用户开放**。考虑到本文的读者应该都还没来得及付费,所以暂时先放放,还是说zpm。 考虑到没有程序员背景的读者而对包管理器不熟悉,简单的啰嗦两句。 ### 什么是包管理器 大多数开发工具都有自己的包管理器,Java开发使用MAVEN, Python用PIP, NodeJS使用npm, 它们细节有区别,功能大致是一致的,就是安装管理程序包,最基本的工作是: 1. 找到自己要的程序包。 简单的命令能让你在网上找到它,用名字找,或者其他方法搜索。 2. 安装包。 - 这里面最重要的是发现包之间的依赖。比如你要装一个软件包叫“包饺子”,作者在开发的时候使用了另一个软件叫“和面”,这个“和面”可能是作者自己写的,或者是网上其他人写的,注册在包管理器的。这时候作者在”包饺子“里声明,我依赖”和面“。 那么,当您去下载安装"包饺子“的时候,包管理器会自动的把”和面“也给你下载并安装上。 3. 管理包: 比如升级,删除等等。 ### ZPM的特点 没有zpm的时候,人们是怎么传递ObjectScript代码的? 大概是这样:发布者把代码从studio导出成一个XML;接受者拿到这个xml, 然后使用Studio或者iris管理门户把它导入到一个命名空间。 这里面有两个问题:1. 麻烦, 2. 没有打包各种类型文件的能力。通常一个项目,除非是只使用ObjectScript, 多数都用到各种文件:前段的css, html, javascript, 图片; 各种配置文件xml或者yaml, 其他语言的包 (iris支持嵌入式python,以及集成多种编程语言工作)等等。 ZPM是怎么工作的? 1. 作者把自己的数据放在一个公网地址上,比如github; 使用zpm生成一个配置文件(module.xml); 把module.xml发布到zpm的registry, 让别人能找到你的软件包。 2. 使用者在Registry搜寻并下载这个程序包,zpm命令自动把它导入到IRIS的一个命名空间。 为什么能自动导入到iris ? 这里有个ZPM和其他包管理器的很大的区别: **ZPM命令是在IRIS的terminal里执行的, 而不是操作系统上。** 还有一个特点:**zpm的设计假设大家开发代码使用的IDE是VSCode而不是Studio**,这非常关键。Studio上的开发是在服务端的开发,没有一个类应该存在哪个文件目录的概念。VSCode相反,你创建一个类:`Demo.Web.Test`, 那么默认的文件保存是在一个这样的目录下: `./src/Dome/Web/Test.cls` 不遵循这样的目录结构,您要额外做很多手工的调整才能使用zpm保存加载程序包。 这里还有很多问题, 我们后面详细说。 ## ZPM的下载安装 您可以从github上的InterSystems-Community用户的[zpm Repo](https://github.com/intersystems-community/zpm/wiki/01.-Getting-started)下载zpm-xxx.xml文件, 其中xxx是版本号, 当前(2022年10月)最新的版本是0.4.0。 把下载的xml文件导入到IRIS的**任何**命名空间。这样安装就成功了。 要下载安装软件的时候,您要先进入安装目标的命名空间(比如下面的USER),然后输入zpm, 也就进入了ZPM的操作界面: *ZPM Shell* ```sh USER>zpm ============================================================================= || Welcome to the Package Manager Shell (ZPM). || || Enter q/quit to exit the shell. Enter ?/help to view available commands || ============================================================================= zpm:USER> ``` 输入help, 您可以看到帮助文件。(帮助文件很长, 我只贴一小段。) ```sh zpm:USER>help -v Available commands: NOTE: [] around a parameter indicates it is optional arrange [flags] [] ■ Description: Rearranges the resources in a module manifest to follow the standard format # 此处省略许多行 ........ For more detail, run: help or help -v zpm:USER> ``` 接着, 我相信您一定想看看安装命令是怎么执行的,比如这样: ```sh zpm:USER>help install install [flags] [] ...此处省略若干行... ■ Examples ∙ install HS.JSON 1.x Installs the most recent 1.x version of HS.JSON available in any configured repository in the current namespace. zpm:USER>quit USER> ``` 好吧,让我们来下载一个最受欢迎的开发者应用“webTerminal”,了解最基本的zpm操作。 ## 最基本的ZPM操作 ### 搜索package 输入`zpm:USER>search`或者, 您可以使用`zpm:USER>search -r`,“-r"显示数据包所在的repo的位置。我没有贴在这里是因为显示的内容太宽了。在我的帖子的代码框里显示看上去有点乱。 ```sh zpm:USER>zpm:USER>search registry https://pm.community.intersystems.com: alwo-goselector 1.0.1 analytics-okr 1.0.0 ...此处省略许多行... zpm-shields 1.0.1 zpmhub 0.3.1 zpmshow 1.0.3 zpm:USER> ``` 除了search, 还有个find命令。 它可以使用*,但无法忽略大小写。 ```sh zpm:USER>find *Webt* registry https://pm.community.intersystems.com: zpm:USER>find *webt* registry https://pm.community.intersystems.com: webterminal 4.9.6 zpm:USER> ``` ### 安装package ```sh zpm:USER>install webterminal ...(省略若干行)... WebTerminal package successfully mapped into all namespaces. [USER|webterminal] Compile SUCCESS [USER|webterminal] Activate START [USER|webterminal] Configure START [USER|webterminal] Configure SUCCESS [USER|webterminal] Activate SUCCESS zpm:USER> ``` **到这里, 我来再次总结一下ZPM的最基本的功能:原本您想要使用一个其他开发者使用的程序,您要把它从某处,比如一个帖子,InterSystems的OpenExchange网站,或者一个github的主页上下载程序(XML文件),然后导入到IRIS执行。有了ZPM, 你可以在IRIS的terminal里通过ZPM命令,直接获得这个程序并执行。前提是:作者的程序是用ZPM打包并放在ZPM注册中心。** 来先了解一下ZMP的注册中心 ## 注册中心(Registry) 默认安装下, zpm的注册中心是这样的 ```sh zpm:USER>repo -list registry Source: https://pm.community.intersystems.com Enabled? Yes Available? Yes Use for Snapshots? Yes Use for Prereleases? Yes Is Read-Only? No Deployment Enabled? No zpm:USER> ``` 这也是当前zpm唯一的一个注册中心(配置私服会在后面介绍), 组册的软件包是最近一些年社区开发者写的各种工具和示例代码。说一下它的当前状况: - 当前能下载到278个软件包。 - 所有的包都放在了github。 - 包都很新。 这么说吧,release能到2.0的都是凤毛麟角 这里有个让人意外的事。我安装完webterminal并开始使用的时候,浏览器跳出这个提示。 “Welcome to WebTerminal! ...New update is available. ”。这说明这个registry并没有给出最新的webterminal版本。 我有点好奇,去看了一下webterminal的github page, 发现WebTerminal当前的版本是4.9.5。而zpm registry上下载的版本是4.9.2, 发行于2019年。 webterminal是一个前台工具,作者理所当然的的在代码里做了版本更新的检查并提醒了用户。而对于纯后台的ObjectScript语言的代码, 我估计大多数程序员都做不到这一点。 那么如果要保证其他人看到的是新版的软件, 就要求软件的作者,除了更新自己Github上的代码,还要把新版本及时更新在zpm的注册中心上。 文章太长了, 先贴一部分,后面会介绍 - 软件的发布 - 定义软件包的依赖 - 配置私服 *to be continued*
文章
Claire Zheng · 十一月 7

InterSystems开发者关系主管Dean:集成FHIR,改变游戏规则

作为开发者社区的一员,多年来我亲眼目睹了访问和共享数据的障碍是如何阻碍创新的。在与医疗科技领域的初创公司和大企业合作时,我看到了封闭的数据是如何阻碍了我们的合作,那种我们都意识到的对提供高质量医疗服务至关重要的合作。 随着我对FHIR®(快速医疗互操作性资源)标准的了解,我开始相信这是医疗创新的前进之路。我希望全世界的开发人员——包括我们全球InterSystems开发社区的1.1万余名开发人员——都能够充满激情地来了解如何使用FHIR推动数据驱动的医疗解决方案,来了解这种以前所未有的方式促进生态系统利益相关者之间合作的技术。 Sage Growth Partners的一项调查发现,医疗行业有一半的高管表示,数据集成和互操作性是实现其战略数据分析目标的最大障碍。只有20%的人对自己的数据充满信心。 他们渴望改变。其中约80%的高管表示,在整个组织内创建和共享高质量数据是他们的首要任务。一个全球性的运动正在呼吁更多的协作医疗,然而数据的缺陷阻碍了这一进程。 集成FHIR,就可以改变游戏规则。 协作医疗意味着协同IT 将医疗行业的利益相关者聚集在一起、交换信息和知识,毫无疑问将改善患者的结果。但是当你观察成功的协作医疗的背后,你会发现什么呢? 协同IT。这意味着实现健康信息的互操作性,无论是测试结果、报告患者监测数据、索赔信息还是电子健康记录(EHR)。随着医疗健康数据比以往任何时候都更加庞大和分散,从多个系统访问数据,以及从一个应用程序实时访问数据,能够使利益相关者更好地关注细节,并快速构建定制的医疗护理计划。 FHIR是医疗互操作性的未来 简单介绍一下背景知识:FHIR是一个全球互操作性标准,描述了机构间如何共享大约150种医疗健康“资源(Resource)”——例如药物、医疗设备数据、付款人信息以及跨EHR和其他系统托管的其他数据。 从去年开始,医疗计划必须允许成员通过使用安全FHIR Release 4 (R4) API的应用程序访问其医疗数据。这迎来了来自世界各地的开发人员的爆发式创新,开发人员能够构建FHIR应用程序、工具和技术,利用这一标准来促进协作医疗。 这惠及患者。现在,只需轻轻一划手指,患者就能轻松获取个人医疗健康信息,使用基于FHIR的应用程序编程接口(API)从移动设备上获取医疗健康数据。 用FHIR改变医疗 作为InterSystems开发者关系主管,我很自豪我们正在构建核心医疗IT的协作工具,帮助开发人员充分利用FHIR。InterSystems IRIS for Health(医疗版)、InterSystems HealthShare®和InterSystems IRIS云服务都利用FHIR来支持互操作性。 HL7 达芬奇项目(Da Vinci)是一项倡议,通过该倡议,医疗IT专家和行业领袖通过利用HL7 FHIR,在基于价值的医疗中改善跨社区数据共享。该项目侧重于在质量改进、覆盖率/减轻负担、成员访问、流程改进和临床数据交换方面取得成果。 看看正在进行和已经上市的产品,很明显,FHIR集成将改变医疗健康行业。当医疗服务提供者、支付方和医疗护理行业的其他人能够利用庞大的健康数据来改善患者的结果时,每个人都是赢家。 作者介绍 本文作者 Dean Andrews (社区ID: @Dean.Andrews2971 )是InterSystems数据平台开发者关系主管。他的团队管理着InterSystems开发者社区、黑客马拉松项目和创业加速器项目。Dean专注于为开发人员、创业公司和客户提供工具和信息,使他们能够在InterSystems技术上进行创新。Dean还是非营利组织HealthTech Build的顾问委员会成员,他是出版自己的专著,并且经常在行业活动中发表演讲。 原文链接可以点击此处查看:How Collaborative IT Can Unlock Collaborative Care
公告
Claire Zheng · 十一月 2

广而告之!寻找第500名InterSystems开发者社区(中文版)会员!

Hi!大家好! 截至11月3日中午,我们的开发者社区会员共495人!我们准备了一份惊喜礼品,准备送给第500名开发者社区会员! 那么,谁是第500名幸运的开发者社区成员呢?我们拭目以待!(*^▽^*)
公告
Claire Zheng · 十一月 2

礼品全部寄出,大赛落下帷幕!一起期待下一次InterSystems开发者社区精彩活动!

各位开发者社区的同学们,大家好! 在各位社区同学的大力支持下,我们的“首届技术征文大赛”圆满完赛!在过去一周多的时间里,我们整理了各类奖项及礼品,目前已经全部寄出! 最新寄出的是开发者征文大赛获奖者的奖品,请以下同学留意查收,如未收到快递信息,请及时与我们联系: @Zhe Wang @姚.鑫 @聆严 周 @John Pan @he hf @sun yao @Meng Cao @lizw lizw @shaosheng shengshao @Guangliang Zhang @zhanglianzhu zhanglianzhu @water huang @yaoguai wan @bai hongtao @Liu Tangh @li wang @Yuxiang Niu 目前我们仍未收到以下几位获奖者的信息,请于11月30日前尽快与我们沟通奖品领取事宜哦:D @Chang Liu @li dong @Vincent Wu 让我们一起期待下一次InterSystems开发者社区的精彩活动吧!如果大家有什么好点子,欢迎跟帖!✿✿ヽ(°▽°)ノ✿
文章
Michael Lei · 十一月 2

InterSystems IRIS医疗版的“专精特新”

门为医疗行业打造,深度整合国内外医疗行业标准,专有技术服务医疗行业44年,可能是全球最早从事医疗信息化的公司; 耕细做打磨数十年的稳定、可靠、易用、可扩展的数据平台; 色鲜明,不唯技术、终生负责、以解决客户问题为核心的特色企业文化; 一代混合一体化架构,一个平台同时支持混合事务处理、传统架构、容器化、云原生等多种应用场景;
文章
Claire Zheng · 十一月 1

【动画视频】医院需要什么样的互联互通平台?

医院管理者、信息中心、业务骨干,每个角色都有独特的业务诉求,InterSystems IRIS医疗版互联互通套件专为国内用户设计,截至2021年,InterSystems技术已助力一百余家医院通过四级及以上医院信息互联互通标准化成熟度评级,其中,五乙用户占全国30%以上。
文章
YuHao Wan · 十一月 1

Caché实现SM3密码杂凑算法

### 0. 算法概述 SM3密码杂凑算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。该算法于2012年发布为密码行业标准(GM/T 0004-2012),2016年发布为国家密码杂凑算法标准(GB/T 32905-2016)。 SM3适用于商用密码应用中的数字签名和验证,是在[SHA-256]基础上改进实现的一种算法,其安全性和SHA-256相当。SM3和MD5的迭代过程类似,也采用Merkle-Damgard结构。消息分组长度为512位,摘要值长度为256位。 整个算法的执行过程可以概括成四个步骤:**消息填充、消息扩展、迭代压缩、输出结果**。 ### 1. 消息填充 SM3的消息扩展步骤是以512位的数据分组作为输入的。因此,我们需要在一开始就把数据长度填充至512位的倍数。具体步骤如下: 1、先填充一个“1”,后面加上k个“0”。其中k是满足(n+1+k) mod 512 = 448的最小正整数。 2、追加64位的数据长度。 ![消息填充](https://gitee.com/wanyuhao/intersystems/raw/master/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95SM3,SM4/images/SM3-01.png) ### 2. 消息分组扩展 将填充后的消息m′按512比特进行分组:m′ = B(0)B(1)...B(n−1) 其中n=(l+k+65)/512。 SM3的迭代压缩步骤没有直接使用数据分组进行运算,而是使用这个步骤产生的132个消息字。(一个消息字的长度为32位/4个字节/8个16进制数字)概括来说,先将一个512位数据分组划分为16个消息字,并且作为生成的132个消息字的前16个。再用这16个消息字递推生成剩余的116个消息字。 ![消息分组](https://gitee.com/wanyuhao/intersystems/raw/master/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95SM3,SM4/images/SM3-02.png) ### 3. 迭代压缩 SM3使用消息扩展得到的消息字进行迭代运算。 ![迭代运算](https://gitee.com/wanyuhao/intersystems/raw/master/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95SM3,SM4/images/SM3-03.png) 初值IV被放在A、B、C、D、E、F、G、H八个32位变量中,整个算法中最核心、也最复杂的地方就在于**压缩函数**。压缩函数将这八个变量进行64轮相同的计算。 ![压缩函数](https://gitee.com/wanyuhao/intersystems/raw/master/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95SM3,SM4/images/SM3-04.png) ### 4. 输出结果 将得到的A、B、C、D、E、F、G、H八个变量拼接输出,就是SM3算法的输出。 ![杂凑值输出](https://gitee.com/wanyuhao/intersystems/raw/master/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95SM3,SM4/images/SM3-05.png) ### 5. 附录 ![符号](https://gitee.com/wanyuhao/intersystems/raw/master/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95SM3,SM4/images/SM3-07.png) ![常数与函数](https://gitee.com/wanyuhao/intersystems/raw/master/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95SM3,SM4/images/SM3-06.png) ### 6. Caché实现 ``` /// SM3密码杂凑算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准 /// 该算法于2012年发布为密码行业标准(GM/T 0004-2012),2016年发布为国家密码杂凑算法标准(GB/T 32905-2016)。 /// 对长度为l(l < 2^64)比特的消息m,SM3杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特。 Class Utility.SM3 Extends %RegisteredObject { /// Creator: wyh /// CreatDate: 2022-11-01 /// Description:SM3加密 /// Input: msg:原文 /// Output: 16进制密文 /// Debug: w ##class(Utility.SM3).Hashsm3("{""appId"":""60C90F3B796B41878B8D9C393E2B6329"",""nonceStr"":""1234567890"",""timestamp"":""60C90F3B796B41878B8D9C393E2B6329"",""version"":""V2.0.0""}F2D8D966CD3D47788449C19D5EF2081B") ClassMethod Hashsm3(msg) { #; 初始值IV =7380166f 4914b2b9 172442d7 da8a0600 a96f30bc 163138aa e38dee4d b0fb0e4e s V(0) = "01110011100000000001011001101111 01001001000101001011001010111001 00010111001001000100001011010111 11011010100010100000011000000000 10101001011011110011000010111100 00010110001100010011100010101010 11100011100011011110111001001101 10110000111110110000111001001110" #; 1. 消息填充 s m = ..s2m(msg) #; 2. 消息分组 #; 将填充后的消息m′按512比特进行分组:m′ = B(0)B(1)...B(n−1) #; 其中n=(l+k+65)/512。 s n = $l(m)/512 f i = 0 : 1 : n-1 d .s B(i) = $e(m, 512 * i + 1, 512 * (i + 1)) #; 3. 迭代压缩 #; 对m′按下列方式迭代: #; FOR i=0 TO n-1 #; V(i+1) = CF(V(i),B(i)) #; ENDFOR #; 其中CF是压缩函数,V(0)为256比特初始值IV,B(i)为填充后的消息分组,迭代压缩的结果为V(n)。 .s V(i+1) = ..CF(V(i) ,B(i)) #; 4. 杂凑输出 #; ABCDEFGH = V(n) #; 输出256比特的杂凑值y = ABCDEFGH。 s rtn = "" f i = 1 : 1 : 8 d .s bit = $p(V(n), " ", i) .s num = ..bs2n(bit) .s hex = $ZHEX(num) .i $l(hex) < 8 d ..f j = 1 : 1 : 8 - $l(hex) d ...s hex = "0" _ hex .s rtn = rtn _ hex s rtn = $zcvt(rtn, "L") return rtn } /// 1. 消息填充 /// 将填充后的消息m′按512比特进行分组:m′ = B(0)B(1)...B(n−1) /// 其中n=(l+k+65)/512 ClassMethod s2m(msg) { s len = $l(msg) s r = "" f i = 1 : 1 : len d .s num = $ascii($e(msg, i)) .s bs = ..n2bs(num) .s r = r _ bs s rtn = r s rtn = rtn _ "1" s k = 512 - (64 + ($l(r) + 1)) # 512 f i = 1 : 1 : k d .s rtn = rtn _ "0" s lenbs = ..n2bs($l(r)) s t = 64 - $l(lenbs) f i = 1 : 1 : t d .s rtn = rtn _ "0" s rtn = rtn _ lenbs return rtn } /// 3. 迭代压缩 /// 令A,B,C,D,E,F,G,H为字寄存器,SS1,SS2,TT1,TT2为中间变量,压缩函数V(i+1) = CF(V(i),B(i)), 0
文章
Michael Lei · 十月 27

2022最新第三方性能测试报告摘要!

WinterCorp 性能测试报告摘要 InterSystems的性能测试方法用来衡量 "许多运行状态下数据库应用的关键构件 "是有效的。 与AWS Aurora MySQL、MariaDB、Microsoft SQL Server、Oracle和PostgreSQL相比,InterSystems IRIS显示出 "巨大的性能优势"。 InterSystems IRIS的插入速度是其他系统的1.7到9倍。InterSystems IRIS的数据速率是1.1到600倍。在插入率和查询率的组合上,没有其他系统在性能上能接近于InterSystems IRIS。 InterSystems IRIS的效率是AWS Aurora MySQL的2.7到3.1倍,而且随着集群中节点数量的增加,效率优势也越来越大。 在整个三到五分钟的集群测试中,InterSystems IRIS插入的记录在插入后很快出现在查询中。 图1. 每vCPU每秒查询对比(InterSystems IRIS vs AWS Aurora MySQL,1-4 查询节点) 图2. 单节点插入/查询速度对比(InterSystems IRIS vs AWS Aurora MySQL vs MS SQL Server) 图3. 单节点插入/查询测试(Maria DB vs Oracle vs PostgreSQL vs InterSystems IRIS) 图4. 1-4节点集群测试(AWS Aurora vs InterSystems IRIS) 欢迎点击获取报告全文。 关于WinterCorp WinterCorp 成立于1992年,是专业从事数据库性能/可扩展性评测的第三方专业机构。更多信息欢迎访问https://wintercorp.com。
公告
Claire Zheng · 十月 24

获奖名单公布!一起来关注InterSystems开发者社区中文版首届技术征文大赛

各位开发者社区的同学们,大家好! 我们的🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)已经结束,此次大赛收到了来自20名参赛者的30篇参赛文章,感谢大家的积极参与! 以下是获奖名单! 1. 专家提名奖:活动期间发布文章且成功参赛后,由InterSystems专家评选得出 🥇一等奖1名,Apple iPad @Zhe Wang 获奖作品:IRIS如何进行CRUD操作 🥈二等奖2名,Beats Fit Pro @姚 鑫 获奖作品:IRIS与Caché的23种设计模式 @聆严 周 获奖作品:使用Prometheus监控Cache集群 🥉三等奖3名,WD 固态硬盘 @John Pan 获奖作品:如何调用Ensemble/IRIS内置的HL7 V2 webservice - Java,PB9,Delphi7样例 @he hf 获奖作品:10分钟快速开发一个连接到InterSystems IRIS数据库的C#应用 @sun yao 获奖作品:前端操作自动生成BS、BP、BO 2. 开发者社区奖:活动期间发布文章且成功参赛后,由社区成员点赞评选得出,点赞前五名获得以下奖品 🥇第一名,HUAWEI WATCH 3智能手表 @Meng Cao 获奖作品:Caché数据库私有apache版本升级 🥈第二名,罗技(Logitech)ERGO键盘 @lizw lizw 获奖作品:关于%Dictionary.CompiledClass类在实际业务中的一些应用 🥉第三名-第五名,KEEP 运动智能手环 @Chang Liu 获奖作品:在国产系统上安装Healthconnect2021 @shaosheng shengshao 获奖作品:HEALTHSHARE2018版如何实现AES(CBC)的HEX输出,并可以实现加密和解密 @Guangliang Zhang 获奖作品:基于cconsole.log的cache数据库的实时监控 3. 入围奖:在征文大赛期间,所有在InterSystems开发者中文社区发布文章且成功参赛的其余用户都将获得特别奖励。 @water huang 获奖作品:对 %XML.PropertyParameters类的探索 @zhanglianzhu zhanglianzhu 获奖作品:Cache死循环检测和申明式事务 @li wang 获奖作品:HealthConnect访问HTTPS开头地址 @bai hongtao 获奖作品:第三方HA软件结合MIRROR使用方法探讨 @Liu Tangh 获奖作品:在Cache系统中使用负载均衡服务的探讨 @yaoguai wan 获奖作品:IRIS架构的浅显理解以及windows10、docker安装IRIS Health详解流程及部分问题浅析 @li dong 获奖作品:实现Cache/IRIS中zip文件的下载、解压及读取 @Yuxiang Niu 获奖作品:Cache中不同类型锁的理解与分析 @Vincent Wu 获奖作品:TrakCare Lab之延伸应用-护理站自动采检备管系统(NSAD)之开发 感谢大家的积极参与! 请获奖嘉宾及时通过此链接提交相关信息,以便我们及时与您联系奖品寄送事宜。
文章
Lilian Huang · 十月 24

自动部署自适应分析Adaptive Analytics

当我们使用IRIS时,我们通常有能力快速的部署一个现成使用的BI基础模块(数据、分析立方体和IRIS BI仪表盘)。当我们开始使用Adaptive Analytics时,我们通常希望有同样的功能。Adaptive Analytics拥有我们需要的所有工具。文档中包含了对如何使用开放的网络API的描述。用户界面和引擎之间的所有交互也都是通过内部的Web API发生的,并且可以被发射出来。 有必要将这两个过程自动化:在容器中部署Adaptive Analytics和直接部署到服务器系统。为此,最简单的方法是使用bash脚本来处理API。我们唯一需要的第三方应用程序是一个名为jq的JSON文件解析器。你可以使用以下命令来安装它: apt update apt install -y jq 首先,我们需要登录以获得一个API访问令牌。这个令牌也适用于引擎本身的方法。我们必须将访问令牌保存在一个变量中,因为现在我们几乎在每个请求中都需要它。对于一个标准的登录和密码admin/admin,该命令将看起来像这样: TOKEN=$(curl -u admin:admin --location --request GET 'http ://localhost:10500/default/auth') 接下来,我们需要一个活跃的引擎来与API交互。如果没有许可证检查,引擎是不可用的,所以我们要为它提供许可证。Web API没有这个选项,所以我们必须使用引擎命令: curl --location --request PUT 'http://127.0.0.1:10502/license' --header 'Content-Type: application/json' --data-binary "@$license" 许可证变量包含许可证文件的路径。当我们在不同的平台和不同容量的PC上做一些测试时,我们注意到一个奇特的现象。在系统启动脚本完成后,Adaptive Analytics可能会出现这样的情况:服务还没有启动,但初始化脚本已经将控制权交给了我们的脚本。为了确保引擎启动和运行,我们在一个循环中组织发送许可证,直到我们收到许可证已被接受的消息。这样做的代码看起来像这样: RESPONSE="1" TIME=1 echo "Waiting for engine ......." while [ "$RESPONSE" != "200 OK" ] do for license in /root/license/* do RESPONSE =$(curl --location --request PUT 'http://127.0.0.1:10502/license' --header 'Content-Type: application/json' --data-binary "@$license" | jq -r '.status.message') sleep 1s done echo "$TIME seconds waiting" TIME=$(($TIME + 1)) done echo "Engine started" 打印时间变量对于调试启动问题很有用。正如你所看到的,我们在一个特定的文件夹中循环浏览文件,以便不被文件名所束缚。我们将在未来再次使用这种方法。 现在我们可以与web API互动,我们可以将我们的项目上传到Adaptive Analytics。我们使用下面的代码将所有放在指定文件夹中的项目发送到引擎: for cube in /root/cubes/* do sleep 1s curl --location --request POST "http://localhost:10500/api/1.0/org/default/"Authorization: Bearer $TOKEN" --header "Content-Type: application/xml" --data-binary "@$cube" sleep 5s done 如果我们希望我们的项目可以被BI系统使用,我们必须发布它们。幸运的是,在API中也有这样的方法。由于项目在导入时得到一个随机的唯一ID,首先,我们应该把这些ID解析成一个变量: PROJECTS_ID=$(curl --location --request GET "http://localhost:10500/api/1.0/org/default/projects" -- header "Authorization: Bearer $TOKEN" | jq -r '.response[].id') 然后我们需要遍历变量中的所有项目并发布它们。 for project in $PROJECTS_ID do curl --location --request POST "http://localhost:10500/api/1.0/org/default/project/$project/publish" --header "Authorization: Bearer $TOKEN" sleep 1s done 现在我们需要告诉Adaptive Analytics如何连接到IRIS,以及应该如何命名连接,以便我们的项目能够接收它们。在API中有一个方法,但是它有不同的URL地址。事实证明,这是一个有文档记录的引擎方法。所以如果我们想使用它,我们需要访问一个不同的端口。该方法接受JSON文件形式的连接信息,但不可能从Adaptive Analytics以相同的格式导出它。API根据请求返回给我们的JSON文件有一些额外/缺失的字段。以下是用于IRIS连接的JSON文件模板: { "platformType": "iris", "name": "name_you_want", "connectionId": "name_you_want", "overrideConnectionId":true, "extraProperties": { "namespace": "Your_namespase ", "udafMode": "customer_managed" }, "aggregateSchema": "ATSCALE", "readOnly":false, "isImpersonationEnabled": false, "isCanaryAlwaysEnabled": false, "isPartialAggHitEnabled": false, "subgroups": [ { " name": "iris", "hosts": "iris", "port": 1972, "connectorType": "iris", "username": "Your_username", "password":"Your_password", "isKerberosClientEnabled": false , "queryRoles": [ "large_user_query_role", "small_user_query_role", "system_query_role" ], "extraProperties": {}, "connectionGroupsExtraProps": {} } ] } 值得一提的是“udafMode”参数:如果在IRIS中安装了UDAF,我们可以将其设置为“customer_managed”,如果没有安装UDAF,则设置为“none”。要了解更多关于UDAF是什么、为什么需要它以及在安装它时可能会遇到什么缺陷的信息,请查看这篇()文章。 当我们为所有连接准备好这样的文件时,我们应该从文件夹中加载它们: for connection in /root/connections/* do sleep 1s curl --location --request POST "http://localhost:10502/connection-groups/orgId/default" - -header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --data-binary "@$connection" sleep 5s done 接下来,我们希望有机会将Logi Report Designer连接到Adaptive Analytics实例。这就是为什么我们需要模拟Adaptive Analytics初始化的第一个步骤之一。因此,我们为hive连接设置端口: sleep 1s curl --location --request POST "http://localhost:10502/organizations/orgId/default" --header "Authorization : Bearer $TOKEN" --header "Content-Type: application/json" --data-raw '{"hiveServer2Port": 11111}' 为了不超过IRIS社区版本中的连接限制,我们必须限制Adaptive Analytics的同时连接数量。根据我们的经验,为了防止在测试场景中超过限制,在5个连接中保留3个是值得的。我们使用下面的代码模拟更改设置: for settings_list in /root/settings/* do curl --location --request PATCH 'http://localhost:10502/settings' --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --data-binary "@$settings_list" done 在文件夹下的JSON文件中,写入如下内容: { "name": "bulkUpdate", "elements": [ { "name": "connection.pool.group.maxConnections", "value": "3" }, { "name": "connection.pool.user.maxConnections", "value": "3 " } ] } 根据我使用Adaptive Analytics的经验,这种限制对性能影响不大。 修改设置后,需要重新启动引擎: curl --location --request POST 'http://localhost:10500/api/1.0/referrerOrg/default/support/service-control/engine/restart' 现在我们有了自动准备Adaptive Analytics工作所需的一切。为方便您,我们已将上述脚本发表在: https://github.com/intersystems-community/dc-analytics/blob/master/atscale-server/entrypoint.sh 在这个存储库中,您还可以找到使用聚合更新计划的脚本。聚合是在IRIS中配置UDAF时由Adaptive Analytics生成的特殊表。这些表存储聚合查询的缓存结果,从而加快了BI系统的工作速度。Adaptive Analytics有一个更新聚合的内部逻辑,但是自己控制这个过程要方便得多。 我们曾经遇到过这样的情况:这些表存储的数据已经过时好几天了。相应地,Adaptive Analytics返回的值与真实值明显不同。为了避免这种情况,我们在更新BI系统中的数据之前设置了每日的聚合更新。 您可以在Adaptive Analytics的web界面中按每个立方体配置更新。然后,您将能够使用脚本将时间表导出和导入到另一个实例,或者使用导出的时间表文件作为备份。如果不想单独配置每个数据集,还可以在应用程序中找到一个脚本,将所有数据集设置为相同的更新计划。 最后一件便于自动化的事情是在开发阶段从Adaptive Analytics备份项目本身。为了设置这种自动化,我们编写了另一个OEX应用程序,它每天一次将所选项目保存到Git存储库中。 最后一件便于自动化的事情是在开发阶段从Adaptive Analytics备份项目本身。为了设置这种自动化,我们编写了另一个OEX应用程序OEX application,它每天一次将所选项目保存到Git存储库中。 初学者指南描述了在新报表文件中创建小部件的过程。如果使用“插入”选项卡或“组件”窗口,也可以将图表或表格插入到现有的报表中。