#InterSystems IRIS for Health

0 关注者 · 862 帖子

InterSystems IRIS for Health™ 是全球第一个也是唯一一个专门为医疗应用程序的快速开发而设计的数据平台,用于管理全世界最重要的数据。它包括强大的开箱即用的功能:事务处理和分析、可扩展的医疗保健数据模型、基于 FHIR 的解决方案开发、对医疗保健互操作性标准的支持等等。所有这些将使开发者能够快速实现价值并构建具有突破性的应用程序。了解更多信息

文章 姚 鑫 · 二月 8, 2021 1m read

第二十八章 Caché 变量大全 $ZEOS 变量

读取压缩流时包含流结束状态。

大纲

$ZEOS

大纲

$Zeos包含一个布尔值,该值指示是否已接收并处理传入(压缩)流的末尾。如果$Zeos=1,则已接收到压缩数据流的流结束。仅当流压缩/解压缩处于活动状态(/GZIP=1)时,$ZOS值才有意义。可以通过从OPENUSE命令发出/GZIP命令关键字来激活流压缩/解压缩。

在通过将设置更改为/GZIP=0来禁用流压缩/解压缩之前,必须检查$Zeos值。如果在处理压缩传入流的末尾之前发出/GZIP=0USE命令,则使用会生成<Translate>错误。如果尚未到达压缩传入流的末尾($ZEOS=0),则必须发出块读取命令,直到$ZEOS=1

不能使用SET命令修改此特殊变量。尝试这样做会导致<SYNTAX>错误。

示例

以下示例以/GZIP=1(启用压缩)开头。它执行一个循环,测试$ZEOS=1,并发出读取命令,直到$ZEOS=1。然后,它可以设置/GZIP=0(禁用压缩):

  OPEN dev:/GZIP=1
  READ block#length
  FOR {QUIT:$ZEOS
       READ x:10 }
  USE dev:/GZIP=0
0
0 84
文章 姚 鑫 · 二月 7, 2021 2m read

第二十七章 Caché 变量大全 $ZEOF 变量

包含指示是否已到达文件末尾的标志。

大纲

$ZEOF

描述

在每次顺序文件读取之后,Caché设置$ZEOF特殊变量以指示是否已到达文件末尾。提供此特殊变量是为了与使用$ZC设备状态检查的MSM例程兼容。

Caché将$ZEOF设置为上次使用的设备的文件状态。例如,如果从顺序文件读取,然后写入主设备,则Caché会将$ZEOF从顺序文件的文件结束状态重置为主设备状态。因此,应该在顺序文件读取之后立即检查$ZEOF值(如果需要,将其复制到变量)。

Caché将$ZEOF设置为下列值:

  • –1 文件结束
  • 0 不在文件末尾

要使用此功能,必须对顺序文件禁用<ENDOFFILE>错误。

  • 要对当前进程禁用此功能,请调用%SYSTEM.Process类的SetZEOF()方法。
  • 若要在系统范围内禁用此功能,请设置Config.Miscellous类的SetZEOF属性,或者转到管理门户并选择“系统管理”、“配置”、“附加设置”、“兼容性(系统、配置、兼容性设置)”。查看和编辑SetZEOF的当前设置。此选项控制在读取顺序文件时Caché遇到意外文件结尾时的行为。当设置为“true”时,Caché设置$ZEOF特殊变量以指示已到达文件末尾。当设置为“false”时,Caché会发出<ENDOFFILE>错误。默认值为“false”。

当到达文件末尾时,读取将返回空字符串,设置$ZB=NULL和设置$ZEOF=-1,而不是发出<ENDOFFILE>错误。

$ZEOF不支持MSM $ZC函数的所有功能。与$ZC不同,$ZEOF不识别文件分隔符字符或I/O错误。$ZEOF不会使用文件分隔符检查文件终止是否正确。I/O错误由读取命令错误检测,而不是由$ZEOF检测。

不能使用set命令修改此特殊变量。尝试这样做会导致<SYNTAX>错误。

0
0 80
文章 姚 鑫 · 二月 6, 2021 2m read

第二十六章 Caché 变量大全 $ZCHILD 变量

当前进程的包含最后一个子进程的ID。

DHC-APP>job ##class(PHA.TEST.SpecialVariables).ZB()
 
DHC-APP>w $zchild
16636
DHC-APP>job ##class(PHA.TEST.SpecialVariables).ZB()
 
DHC-APP>w $zchild
5412

image

大纲

$ZCHILD
$ZC 

描述

$ZCHILD包含当前进程使用JOB命令创建的最后一个子进程的ID。如果进程没有使用JOB创建子进程,则$ZCHILD返回0(零)。

在MSM语言模式中,$ZC特殊变量(拼写如下)有不同的用途。用于确定顺序文件读取中的文件结尾。

不能使用SET命令修改此特殊变量。尝试这样做会导致<SYNTAX>错误。

注意

$ZCHILDJOB的成功启动

设置$ZCHILD并不意味着JOB已成功启动。它只表示进程已创建,参数已成功传递。

例如,如果使用JOB生成一个不存在的例程,则$TEST$ZCHILD都会报告作业命令成功,尽管JOB会立即终止并显示<NOROUTINE>错误。

MSM语言模式下的$ZC

MSM语言模式支持$ZC特殊变量的特殊使用。

如果使用%SYSTEM.Process类的LanguageMode(8)方法将当前语言模式设置为MSM,则$ZC特殊变量将在顺序文件读取期间设置。这提供了与MSM $ZC变量的兼容性。(在所有其他语言模式中,$ZC不是在文件读取过程中设置的;$ZC$ZCHILD的缩写,具有完全不同的功能。)

在MSM语言模式下,成功的顺序文件读取将设置$ZC=0

在MSM语言模式下,文件结束条件设置$ZC=-1(负1)。未出现<ENDOFFILE>错误。

但是,Caché $ZC与MSM $ZC不同:

如果文件的最后一行没有以分隔符结束,则MSM设置其$ZC=-1(负1)。Caché不检查分隔符;在本例中,它设置$ZC=0而不是-1。

如果读取过程中发生I/O错误,MSM会将其$ZC设置为1。Caché不支持此功能;相反,Caché会发出<read>错误。

0
0 87
文章 姚 鑫 · 二月 5, 2021 4m read

第二十五章 Caché 变量大全 $ZB 变量

包含当前I / O设备的状态信息。

大纲

$ZB

描述

$ZB包含读取操作后特定于当前I / O设备的状态信息

  • 从终端,顺序文件或其他基于字符的I / O设备读取时,$ZB包含读取操作的终止字符。它可以是终止符(例如),如果读取操作不需要终止符,则可以是输入数据的最后一个字符;如果需要终止符但未收到终止符,则可以是空字符串(例如,如果读取操作超时)。
  • 从磁带等基于块的I / O设备读取数据时,$ZB包含I / O缓冲区中剩余的字节数。写入磁带时,$ZB还包含I / O缓冲区中的字节数。

不能使用SET命令修改此特殊变量。尝试这样做会导致<SYNTAX>错误。

从基于字符的设备或文件中读取时,$ZB$KEY都可以用于返回READ终止字符。对于基于字符的读取,这两个特殊变量非常相似,但不完全相同。对于基于块的读写(例如磁带),请使用$ZB; $KEY不支持基于块的读取和写入操作。

文件结束行为

默认情况下,Caché通过发出<ENDOFFILE>错误来处理顺序文件的文件结尾;它不会设置$ZB。可以以与MSM兼容的方式配置文件结束行为。在这种情况下,遇到文件结尾时,Caché不会发出错误,而是将$ZB设置为“”(空字符串),并将$ZEOF设置为-1。

要配置文件结束处理,请转到管理门户,依次选择“系统”,“配置”,“兼容性设置”。查看和编辑SetZEOF的当前设置。设置为“true”时,Caché将$ZB设置为“”(空字符串),并将$ZEOF设置为-1。默认值为“false”。

可以使用%SYSTEM.Process类的SetZEOF()方法控制当前进程的文件结束处理。可以通过设置Config.Miscellaneous类的SetZEOF属性来建立系统范围的默认行为。

从终端或文件读取

$ZB包含涉及终端,顺序文件或其他基于字符的I / O设备的读取操作中的终止字符(或字符序列)。 $ZB可以包含以下任意一项:

  • 终止符,例如回车符。
  • 转义序列(最多16个字符)。
  • 固定长度READ x#n中的第n个字符。 (在这种情况下,$KEY特殊变量返回空字符串。)
  • READ * x的单个字符。
  • 定时读取到期后为空字符串(“”)。

例如,考虑以下具有5秒超时的可变长度读取:

/// d ##class(PHA.TEST.SpecialVariables).ZB()
ClassMethod ZB()
{
Zbread
	READ !,"Enter number:",num:5
	WRITE !, num
	WRITE !, $ASCII($ZB)
	QUIT
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).ZB()
 
Enter number:
 
13
DHC-APP>d ##class(PHA.TEST.SpecialVariables).ZB()
 
Enter number:2
2
13

如果用户在读取提示符下键入123并按<Return>,则Caché将123存储在num变量中,并将<Return>(ASCII十进制代码13,十六进制0D)存储在$ZB中。如果读取超时,$ZB包含空字符串;$ASCII(“”)返回值-1。

命令行上的$ZB

从终端命令行交互发出命令时,按<Return>可发出每个命令行。$ZB$KEY特殊变量记录此命令行终止符。因此,当使用$ZB$KEY返回读取操作的终止状态时,必须将变量设置为同一命令行的一部分。

例如,如果发出以下命令:

DHC-APP>READ x:10

从命令行检查$ZB,它将不包含读取操作的结果;它将包含执行命令行的<return>字符。要返回读取操作的结果,请在同一命令行中使用$ZB设置一个局部变量,如下所示:

DHC-APP>READ x:10 SET rzb=$ZB

这将保留由读取操作设置的$ZB的值。要显示此读取操作值,请发出以下命令行语句之一:

WRITE $ASCII(rzb)
   ; 空字符串(超时)返回-1,
   ; 返回终止符字符的ASCII十进制值
ZZDUMP rkey
   ; 为空字符串返回空行(超时)
   ; 返回终止符的十六进制值

$ZB,带磁带I/O

$ZB包含有关驱动程序缓冲区的状态信息。具体地说,它包含磁带驱动器内部缓冲区中剩余的字节数。

读完一个区块后,Caché会立即将$ZB设置为该区块的大小。当将逻辑记录从缓冲区转移到变量(使用READ命令)时,Caché将$ZB值递减,直到其达到0,然后发生下一个块读取。

写入磁带时,$ZB显示驱动程序内部缓冲区中剩余的可用空间(以字节为单位)。写入块后,Caché立即将$ZB设置为OPEN命令指定的缓冲区大小。当将逻辑记录从Caché变量传输到缓冲区(使用WRITE命令)时,Caché递减$ZB号,直到其达到0并发生块写入。

大多数磁带程序不必关心$ZB,除非它们必须处理异常的格式和可变长度的块。

为了监视磁带操作,程序可以在每次读写后测试$ZA的相应位。

以下代码在每次读取磁带后都检查$ZA$ZB,并在这些变量中的任何一个指示错误时设置MTERR。发生磁带错误时,它还会设置$ZTRAP

   ; $$MTIN(mtdev)=磁带设备mtdev的下一个逻辑记录。还返回za = $ZA和zb = $ZB在出现磁带错误时,mterr = 1和$$MTIN(mtdev)=“”期望调用者设置$ZT来捕获其他错误。
MTIN(io)
  NEW rec,curdev
  SET mterr=0,curdev=$IO,$ZT="MTIERR"
  USE io 
  READ rec
MTIEXIT
  SET za=$ZA,zb=$ZB
  USE curdev
  QUIT rec
MTIERR
  IF $ZERROR["MAGTAPE" {
        USE curdev 
        ZQUIT 1 
        GOTO @$ZTRAP }
     ; Use caller's error trap.
  ELSE {
       SET $ZTRAP="",mterr=1,rec=""
       GOTO MTIEXIT }

如果终止符完成READ,则Caché 模式将终止符作为$ZB中的字符串返回。

如果转义序列终止读取,则Caché模式将ASCII转义序列作为$ZB中的字符串返回。

0
0 130
文章 姚 鑫 · 二月 4, 2021 5m read

# <center> 第二十四章 Caché 变量大全 $ZA 变量

包含当前设备上最后一次读取的状态。

# 大纲

```java
$ZA
```

# 描述

`$ZA`包含当前设备上最后一次读取的状态。

不能使用`SET`命令修改此特殊变量。尝试这样做会导致`<SYNTAX>`错误。

# 注意

## `$ZA`,带终端I / O

`$ZA`被实现为一系列位标志,每个位表示一条特定的信息。下表显示了可能的值、它们的含义,以及如何使用模(`#`)和整数除(`\`)运算符测试它们:

0
0 138
文章 姚 鑫 · 二月 3, 2021 2m read

第二十三章 Caché 变量大全 $Y 变量

包含光标的当前垂直位置。

大纲

$Y

描述

$Y包含光标的当前垂直位置。当字符写入设备时,Caché会更新$Y以反映垂直光标位置。

输出的每个换行符(换行符)(ASCII 10)将$Y递增1。换页符(ASCII 12)将$Y重置为0。

$Y是16位无符号整数。当其值达到65536时,$Y换行为0。换句话说,如果$Y为65535,则下一个输出字符将其重置为0。

可以使用set命令为$X$Y赋值。例如,可以使用特殊的转义序列来改变物理游标位置,而不更新$X$Y的值。在这种情况下,在使用转义序列之后,使用set将正确的值分配给$X$Y

注意

NLS字符映射

国家语言支持(NLS)实用程序$X/$Y选项卡定义当前区域设置的$X$Y光标移动字符。

带终端I/O的$Y

下表显示了不同字符对$Y的影响。

Echoed CharacterASCII CodeEffect on $X
<FORM FEED>12$Y=0
<RETURN>13$Y=$Y
<LINE FEED>10$Y=$Y+1
<BACKSPACE>8$Y=$Y
<TAB>9$Y=$Y
任何可打印的ASCII字符32-126$Y=$Y

OPENUSE命令的S(ECRET)协议关闭回显。它还可以防止$Y在输入过程中被更改,因此它指示真实的光标位置。

更改垂直位置的WRITE $CHAR()也会更改$Y。更改垂直位置的WRITE*不会更改$Y。例如,WRITE$Y,$CHAR(10),$Y执行换行并递增$Y。相比之下,WRITE$Y,*10,$Y执行换行符,但不会递增$Y

因为WRITE*不会改变$Y,所以可以向终端发送一个控制序列,而$Y仍将反映真实的光标位置。由于某些控制序列确实会移动光标,因此可以使用SET命令直接设置$Y。例如,以下命令将光标移动到VT100型端子上的列20和行10,并相应地设置$X$Y

  SET dy=10,dx=20
  WRITE *27,*91,dy+1,*59,dx+1,*72
  SET $Y=dy,$X=dx

设备执行但不输出的ANSI标准控制序列(如转义序列)可能会在$X$Y值与真实光标位置之间产生差异。要避免此问题,请使用WRITE*语句并指定字符串中每个字符的ASCII值。例如,不使用以下代码:

WRITE $CHAR(27)_"[1m"

使用此等效表:

WRITE *27,*91,*49,*109

通常,在显式移动光标的任何转义序列之后,应更新$X$Y以反映实际光标位置。

0
0 124
文章 姚 鑫 · 二月 2, 2021 3m read

第二十二章 Caché 变量大全 $X 变量

包含光标的当前水平位置。

大纲

$X

描述

$X包含光标的当前水平位置。将字符写入设备时,Caché会更新$X以反映水平光标位置。

输出的每个可打印字符将$X加1。回车符(ASCII 13)或换页符(ASCII 12)将$X重置为0(零)。

$X是16位无符号整数。

  • 在非UNICODE系统上,当$X的值达到65536时,它会换行为0。换句话说,如果$X为65535,则下一个输出字符将其重置为0。
  • 在UNICODE系统上,$X在其值达到16384时换行为0(其余两位用于日语音调编码)。

可以使用set命令为$X$Y赋值。例如,可以使用特殊的转义序列来改变物理游标位置,而不更新$X$Y的值。在这种情况下,在使用转义序列之后,使用set将正确的值分配给$X$Y

注意

NLS字符映射

国家语言支持(NLS)实用程序$X/$Y选项卡定义当前区域设置的$X$Y光标移动字符。

带终端I/O的$X

下表显示了不同字符对$X的影响。

Echoed CharacterASCII CodeEffect on $X
<FORM FEED>12$X=0
<RETURN>13$X=0
<LINE FEED>10$X=$X
<BACKSPACE>8$X=$X-1
<TAB>9$X=$X+1
任何可打印的ASCII字符32-126$X=$X+1
不可打印的字符(如转义序列)127-255参考 Caché ObjectScript.

OPENUSE命令的S(ECRET)协议关闭回显。它还可以防止$X在输入过程中被更改,因此它指示真实的光标位置。

WRITE $CHAR() 更改$XWRITE *不会更改$X。例如,WRITE $X,"/",$CHAR(8),$X 执行退格(删除/字符)并相应地重置$X,返回01。相反,WRITE $X,"/",*8,$X 执行退格键(删除/字符),但不重置$X;它返回02。

使用WRITE*,可以向终端发送控制序列,$X仍将反映真实光标位置。由于某些控制序列确实会移动光标,因此可以使用SET命令直接设置$X。例如,以下命令将光标移动到数字VT100终端(或等效终端)上的列20和行10,并相应地设置$X$Y

/// d ##class(PHA.TEST.SpecialVariables).X()
ClassMethod X()
{
	SET dy=10,dx=20
	WRITE *27,*91,dy+1,*59,dx+1,*72
	SET $Y=dy,$X=dx
	w $Y,!,$X,!
}

DHC-APP>d ##class(PHA.TEST.SpecialVariables).X()
 
 
 
 
 
 
 
 
                    10
0
 

设备执行但不输出的ANSI标准控制序列(如转义序列)可能会在$X和$Y值与真实光标位置之间产生差异。要避免此问题,请使用WRITE*(整数表达式)语法并指定字符串中每个字符的ASCII值。例如,不使用:

   WRITE !,$CHAR(27)_"[1m"
   WRITE !,$X

使用此等效表:

   WRITE !,*27,*91,*49,*109
   WRITE !,$X

通常,在显式移动光标的任何转义序列之后,应更新$X和$Y以反映实际光标位置。

可以使用%SYSTEM.Process类的dx()方法设置$X如何处理当前进程的转义序列。可以通过设置Config.Miscellous类的DX属性来建立系统范围的默认行为。

$X,带TCP和进程间通信

当使用WRITE命令向客户端或服务器TCP设备发送数据时,Caché首先将数据存储在缓冲区中。它还更新$X以反映缓冲区中的字符数。此计数中不包括ASCII字符,因为它们被视为记录的一部分。

如果使用写入刷新$X缓冲区!命令时,Caché会将$X重置为0,并将$Y值递增1。如果使用Write#命令刷新$X和$Y缓冲区,则Caché会将ASCII字符作为单独的记录写入,并将$X和$Y都重置为0。

0
0 111
文章 Claire Zheng · 一月 20, 2021 5m read

我们不必等待SAM发布才开始规划和试用该API来监控IRIS实例。在以后的文章中,我将更深入地探讨可用的指标及其意义,并提供一些交互式仪表板的示例。首先,我将介绍一下相关背景和一些问题及答案。

IRIS(和Caché)一直在收集自身及其运行平台的数十个指标。收集这些指标来监控Caché和IRIS的方法向来有很多。我发现,很少有安装软件使用IRIS和Caché的内置解决方案。譬如,History Monitor作为性能和系统使用指标的历史数据库,已经推出很长时间了,但它没有简便方法可实时显示这些指标和仪表系统。

IRIS平台解决方案(以及整个业界)正在从仅在一些本地实例上运行的单体式应用程序过渡到“随处”部署的分布式解决方案。在许多用例中,原有的IRIS监控方案并不适用于这些新的模式。InterSystems没有做重复工作,而是将目光投向当前流行的、经过验证的监控和告警开源解决方案。

0
0 397
文章 Claire Zheng · 一月 20, 2021 15m read

跨行业用例大多要求具备每秒接收数千或数百万条记录的能力,同时能够支持实时同步查询,例如:股票交易处理、欺诈检测、物联网应用(包括异常检测和实时OEE监控)等。Gartner将这种能力称为“HTAP”(混合事务分析处理)。Forrester等其他公司将其称为Translytics。InterSystems IRIS是功能强大、可扩展、高性能、资源高效的事务分析型数据平台,同时具备内存数据库的高性能以及传统数据库的一致性、可用性、可靠性以及低成本的特性。

0
0 372
文章 Li Yan · 一月 13, 2021 15m read

本文提供了一个参考架构,作为示例说明基于 InterSystems Technologies(适用于 CachéEnsembleHealthShareTrakCare 以及相关的嵌入式技术,例如 DeepSeeiKnowZen Zen Mojo)提供的强大性能和高可用性应用。
Azure 有两种用于创建和管理资源的不同部署模型:Azure Classic Azure Resource Manager本文中的详细信息基于 Azure Resource Manager (ARM) 模型。

0
0 311
文章 Li Yan · 一月 11, 2021 27m read

Amazon Web Services (AWS) 云提供广泛的云基础设施服务,例如计算资源、存储选项和网络,这些都非常实用:按需提供,几秒内就可用,采用即付即用定价的模式。 新服务可得到快速配置,且前期无需支出大量资金。 这使得大企业、初创公司、中小型企业以及公共部门的客户可以访问他们所需的基础设施,从而快速响应不断变化的业务需求。

更新日期:2019 年 10 月 15 日

0
0 317
文章 Nicky Zhu · 一月 11, 2021 5m read

本文将描述通过ObjectScript包管理器(见https://openexchange.intersystems.com/package/ObjectScript-Package-Manager-2)运行单元测试的过程,包括测试覆盖率测量(见https://openexchange.intersystems.com/package/Test-Coverage-Tool)。

ObjectScript中的单元测试

关于在ObjectScript中编写单元测试,已经有很好的文档,因此我就不再赘述了。您可以在这里找到单元测试教程:https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=TUNT_preface

最好的做法是将单元测试代码单独放在源代码树中,无论它只是“/tests”还是其他名字。在InterSystems中,我们最终使用/internal/testing/unit_tests/作为我们事实上的标准,这是有意义的,因为测试是内部/非发布的,而且除了单元测试还有其他类型的测试,但这对于简单的开源项目来说可能有点复杂。您可以在我们的一些GitHub仓库中看到这种结构。

从工作流的角度来看,这在VSCode中非常简单,您只需创建目录并将类放在里面。对于较老的以服务器为中心的源代码控制方法(Studio中使用的方法),您需要正确地地映射这个包,使用的方法会因源代码控制程序而异。

从单元测试类命名的角度来看,我个人的偏好(以及我的团队的最佳实践)是:

UnitTest.<待测试的包/类>[.<待测试的方法/特性>] 例如,如果在类MyApplication.SomeClass 中对方法Foo进行单元测试,单元测试类将被命名为UnitTest.MyApplication.SomeClass.Foo;如果测试是针对整个类的,那么名字就是UnitTest.MyApplication.SomeClass。

ObjectScript 包管理器中的单元测试

让ObjectScript包管理器知道您的单元测试,很简单!只需按如下所示向module.xml中添加一行代码(来自https://github.com/timleavitt/ObjectScript-Math/blob/master/module.xml - 这是Open Exchange上的@Get Oxycodone Online Trusted Affordable & Fast Steiwer的出色数学扩展包,我以它作为简单的正面例子):

<Module> 
  ... 
  <UnitTest Name="tests" Package="UnitTest.Math" Phase="test"/> 
</Module> 

这些代码的意思是:

  • 单元测试位于模块根目录下的“tests”目录中。
  • 单元测试在“UnitTest.Math”包中。这样很直观,因为被测试的类就在“Math”包中。
  • 单元测试在包生命周期的“测试”阶段运行。(当然还有一个可以运行它们的“验证”阶段,这里不赘述。)

运行单元测试

对于上述定义的单元测试,包管理器提供了一些实用工具来运行它们。您仍然可以像平常使用%UnitTest.Manager那样设置^UnitTestRoot等,但下面的方法可能更简单,尤其在同一个环境下做几个项目的时候。

您可以克隆上述objectscript-math仓库,然后用 zpm "load /path/to/cloned/repo/" 加载,或者在您自己的包上使用包名(和测试名)替换“objectscript-math”来尝试所有这些方法。

重新加载模块,然后运行所有单元测试: zpm "objectscript-math test"

只运行单元测试(不重新加载): zpm "objectscript-math test -only"

只运行单元测试(不重新加载)并提供详细输出: zpm "objectscript-math test -only -verbose"

运行一个特定的测试套件(指一个测试目录 - 在本例中,是UnitTest/Math/Utils中的所有测试)而不重新加载,并提供详细输出: zpm "objectscript-math test -only -verbose -DUnitTest.Suite=UnitTest.Math.Utils"

运行一个特定的测试用例(在本例中,是UnitTest.Math.Utils.TestValidateRange)而不重新加载,并提供详细输出: zpm "objectscript-math test -only -verbose -DUnitTest.Case=UnitTest.Math.Utils.TestValidateRange"

如果您只是想解决单个测试方法中的小问题: zpm "objectscript-math test -only -verbose -DUnitTest.Case=UnitTest.Math.Utils.TestValidateRange -DUnitTest.Method=TestpValueNull"

通过ObjectScript包管理器进行测试覆盖率测量

怎样评估单元测试的质量?测量测试覆盖率虽然并不全面,但至少有参考意义。早在2018年的全球峰会上,我就展示过。 见 - https://youtu.be/nUSeGHwN5pc

首先需要安装“测试覆盖率”包: zpm "install testcoverage"

注意,并不需要ObjectScript包管理器才能安装/运行;可以在Open Exchange上了解更多信息:https://openexchange.intersystems.com/package/Test-Coverage-Tool

不过如果您已经在用ObjectScript包管理器,那么您可以更好地利用这个“测试覆盖率”工具。

运行测试前,需要指定测试所覆盖的类/routine宏。这一点很重要,因为在非常大的代码库中(例如,HealthShare),测试和收集项目中所有文件的测试覆盖率所需要的内存可能超出您的系统内存。(提一句,如果您感兴趣,可以使用逐行监视器的gmheap。)

文件列表在您的单元测试根目录下的coverage.list文件中;单元测试的不同子目录(套件)可以拥有它们自己的副本,以覆盖在测试套件运行时将跟踪的类/例程。

有关objectscript-math的简单示例,见:https://github.com/timleavitt/ObjectScript-Math/blob/master/tests/UnitTest/coverage.list;测试覆盖率工具用户指南有更详细的介绍。

要在启用测试覆盖率测量的情况下运行单元测试,只需再向命令添加一个参数,指定应使用TestCoverage.Manager而非%UnitTest.Manager 来运行测试: zpm "objectscript-math test -only -DUnitTest.ManagerClass=TestCoverage.Manager"

输出(即使是非详细模式)将包括一个URL,供您查看您的类/routine(宏)的哪些行被单元测试覆盖了,以及一些汇总统计信息。

接下来的步骤

这些能不能在CI中自动化?能不能报告单元测试的结果和覆盖率分数/差异?答案是:能!您可以使用Docker,Travis CI和codecov.io来试一下这个简单示例,见https://github.com/timleavitt/ObjectScript-Math;我打算以后写篇文章来详细讲讲,介绍几种不同的方法。

0
0 263
文章 Nicky Zhu · 一月 10, 2021 8m read

当您首次使用InterSystems IRIS时,通常只需安装最低安全级别的系统。您输入密码的次数会比较少,这样有利于快速了解和操作开发服务和Web应用程序。而且,最低的安全性有时更便于部署开发项目或解决方案。

然而,有时需要将项目移出开发环境,迁移到一个可能很不友好的互联网环境中。在部署到生产环境之前,需要使用最大的安全设置(即,完全锁定)对其进行测试。这就是我们在本文中将要讨论的内容。

如果想更全面地了解InterSystems Caché、Ensemble和IRIS中的DBMS安全性问题,请阅读我的另一篇文章《在生产环境中安装InterSystems Caché DBMS的相关建议》。

InterSystems IRIS中安全系统的设计概念是针对不同的类别(用户、角色、服务、资源、特权和应用程序)应用不同的安全设置。

image 可以为用户分配角色。用户和角色可以对资源(数据库、服务和应用程序)拥有不同的读、写和使用权限。用户和角色还可以对数据库中的SQL表拥有SQL权限。

安全级别的差异

用户在安装InterSystems IRIS时,可以为其选择安全级别:最小、正常或锁定。这些级别在用户参与程度、可用角色和服务,以及服务和应用程序的身份验证方法的配置方面存在差异。如需了解更多信息,请阅读《InterSystems IRIS安装准备》指南中的《InterSystems安全性准备》章节。

在文档中,您可以找到下面这些表格,其中显示了每个级别的安全设置。这些安全设置可以在系统管理门户界面进行更改。

初始用户安全设置

Security SettingMinimalNormalLocked Down
Password Pattern3.32ANP3.32ANP8.32ANP
Inactive Limit090 days90 days
Enable _SYSTEM UserYesYesNo
Roles assigned to UnknownUser%AllNoneNone

初始服务属性设置

Service PropertyMinimalNormalLocked Down
Use Permission is PublicYesYesNo
Requires AuthenticationNoYesYes
Enabled ServicesMostSomeFewest

初始服务启用设置

ServiceMinimalNormalLocked Down
%Service_BindingsEnabledEnabledDisabled
*%Service_CSPEnabledEnabledEnabled
%Service_CacheDirectEnabledDisabledDisabled
%Service_CallInEnabledDisabledDisabled
%Service_ComPortDisabledDisabledDisabled
%Service_ConsoleEnabledEnabledEnabled
%Service_ECPDisabledDisabledDisabled
%Service_MSMActivateDisabledDisabledDisabled
%Service_MonitorDisabledDisabledDisabled
%Service_ShadowDisabledDisabledDisabled
%Service_TelnetDisabledDisabledDisabled
%Service_TerminalEnabledEnabledEnabled
%Service_WebLinkDisabledDisabledDisabled

*InterSystems IRIS环境下,%Service_CSP应用%Service_WebGateway。 不同的操作系统所使用的服务略有不同。

如何提高安全性

您需要为每个启用的服务选择合适的身份验证方法,包括:无认证(unauthenticated)、密码、Kerberos或授权。

您还需要禁用系统中未使用的web应用程序。对已启用的web应用程序选择正确的身份验证方法:认证、密码、Kerberos、授权、登录或cookie。

当然,管理员可以为每一个项目和解决方案选择安全设置,以满足客户的项目要求。整个过程应始终保持一种平衡,即,一方面要保证系统足够方便以支持用户完成实际工作,另一方面又要保证系统足够安全能够阻止入侵者。不过众所周知,被禁用的系统才是最安全的系统。

如果遇到需要多次手动提高系统安全级别的情况,这就是一个明确的迹象,表明需要编写一个软件模块来解决这些问题。

实际上,InterSystems Open Exchange提供了一个锁定(LockDown)程序,可以帮助您提高安全性。该程序的源代码可以在InterSystems isc-apptools-lockdown页面的存储库中找到。

LockDown程序有以下几种作用:

首先,更改以下预安装用户的密码:

  • Admin,
  • CSPSystem,
  • IAM,
  • SuperUser,
  • UnknownUser,
  • _Ensemble,
  • _SYSTEM.

其次,禁用除以下服务之外的所有服务:

  • %%service_web gateway
  • %service_console
  • %service_login
  • %service_terminal

再次,为所有web应用程序设置密码保护,包括:

  • /csp/ensdemo
  • /csp/samples
  • /csp/user
  • /isc/studio/usertemplates
  • /csp/docbook
  • /csp/documatic
  • /isc/studio/rules
  • /isc/studio/templates

最后,设置系统范围内的安全参数,包括:

  • 密码复杂度为 "8.32 ANP"
  • 限制90天内不活跃的用户
  • 开启审计和其他所有安全相关的事件

您可以从GitHub下载LockDown.cls,在系统上安装好LockDown程序。然后在终端输入以下内容:

USER>zn “%SYS”
%SYS>do $system.OBJ.Load("/home/irisusr/LockDown.cls","ck")

或者可以使用以下命令从公共注册中心通过ZPM批处理管理器进行安装:

USER>zn “%SYS”
%SYS> zpm “install isc-apptools-lockdown”

执行LockDown程序

强烈建议在执行LockDown程序之前先进行备份。

必须从%SYS命名空间执行LockDown程序。如果您不想更改所有预安装用户的密码,请将第一个参数保留为空。

如果希望保留使用IRIS Studio、Atelier或VSCode编辑程序和类的能力,请不要禁用%Service_Bindings服务,只需将bindings参数设置为1即可。下面是一个示例: do ##class(App.Security.LockDown).Apply("New Password 123",.msg,1) 此模块还包含一个功能,该功能在系统密码被盗用、需要替换所有预装帐户但无需执行锁定的情况下很有用。可以参考下面的运行: do ##class(App.Security.LockDown).Change Password("New Password 123", "Admin,CSPSystem,IAM,SuperUser,Unknown User, _Ensemble,_SYSTEM") 在执行锁定之后,应用程序或项目极有可能会停止工作。为了解决这个问题,需要将一些安全设置恢复到原始状态。这个操作可以通过管理门户界面(安全性部分)实现或以编程方式完成。

锁定后更改安全设置

锁定之后,如果您的web应用程序使用了密码以外的身份验证方法,就需要进行启用。

建议运行软件模块zpm-registry-test-deployment,它有一个在ZPM-registry项目中使用LockDown的示例。

在IRIS上以最低的安全级别安装该项目,安装结束时将开始运行其中的代码。代码可以用来:

  • 更改所有预安装用户的密码。
  • 禁用此项目中未使用的所有服务。
  • 为系统上的所有应用程序启用密码保护,但Web应用程序/注册表(允许未经授权的用户获取注册表中的软件包列表)除外。
  • 创建一个拥有在注册表中发布新包特权的新用户。该用户必须对IRISAPP数据库中的项目表具有写权限。

创建一个新用户:

set tSC= ##class(App.Security.LockDown).CreateUser(pUsername, "%DB_"_Namespace, pPassword, "ZMP registry user",Namespace)
If $$$ISERR(tSC) quit tSC
write !,"Create user "_pUsername

为新的未授权用户添加权限:

set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package", "s", "UnknownUser")
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM.Package_dependencies", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "1,ZPM_Analytics.Event", "s", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "9,ZPM.Package_Extent", "e", pUsername)
set tSC=##class(App.Security.LockDown).addSQLPrivilege(Namespace, "9,ZPM_Analytics.Event_Extent", "e", pUsername)
If $$$ISERR(tSC) quit tSC
write  !,"Add privileges "

运行LockDown项目:

set tSC= ##class(App.Security.LockDown).Apply(NewPassSys)
If $$$ISERR(tSC) quit tSC

Change the settings for the web app so that an unknown user can log in:
set prop("AutheEnabled")=96
set tSC=##class(Security.Applications).Modify("/registry",.prop)
If $$$ISERR(tSC) quit tSC
write !,"Modify /registry "

Change the settings for the %service_terminal service, changing the authorization method to Operating System, Password:
set name="%service_terminal"
set prop("Enabled")=1
set prop("AutheEnabled")=48 ; Operating System,Password
set tSC=##class(Security.Services).Modify(name,.prop)
If $$$ISERR(tSC) quit tSC
write !,"Modify service terminal"

总结

在本文中,我讨论了为何要提高系统安全性级别的原因,并且通过一个InterSystems LockDown程序运行示例,演示了如何通过编程的方式提升安全性。

在本文所介绍的方法中,我们首先关闭了系统中的所有内容(即,设置最大安全级别)。然后通过开放项目运行所需的服务和应用程序(但仅限于这些)来控制安全性。我相信还有许多其他的方法和最佳实践,欢迎大家在文章评论区留言告诉我们。

0
0 248
文章 Qiao Peng · 一月 10, 2021 9m read

Swift-FHIR-Iris

iOS应用程序支持将HealthKit数据导入InterSystems IRIS医疗版(或任何FHIR资源仓库库)

main

目录

演示目的

目的是创建FHIR协议的端到端演示。

这里的端到端指的是从一个信息源到另一个信息源,例如iPhone。 苹果HealthKit将收集到的健康数据转换为FHIR,再发送到InterSystems IRIS 医疗版存储库。

必须通过web接口访问这些信息。

TL;DR: iPhone -> InterSystems FHIR -> web界面.

如何运行此演示

先决条件

  • 客户端 (iOS)
    • Xcode 12
  • 服务器和Web应用程序
    • Docker

安装 Xcode

这里没有太多要说的,打开AppStore,搜索Xcode,安装。

打开SwiftUi project

Swift是苹果在iOS、Mac、Apple TV和Apple Watch中使用的一种编程语言,是objective-C的替代品。

双击Swift-FHIR-Iris.xcodeproj

单击左上角的箭头打开模拟器。

xcode

配置模拟器

打开Health

点击“Steps”

添加数据

simulator

启动InterSystems FHIR服务器

在该git的根目录下,运行以下命令:

docker-compose up -d

构建过程结束时,你将连接到FHIR资源仓库:

http://localhost:32783/fhir/portal/patientlist.html

portal

该门户网站由@diashenrique创建.

为处理Apple活动足迹,进行了一些修改。

在iOS应用程序上操作

iOS应用程序首先会请求你同意分享部分信息。

点击授权

authorize

然后点击“Save and test server”对FHIR服务器进行测试

默认设置指向docker配置。

操作成功后,就可以输入患者信息。

名字、姓氏、生日、性别。

将患者信息保存到Fhir。弹出窗口将显示唯一的Fhir ID。

savepatient

可在门户网站查阅该患者信息:

访问: http://localhost:32783/fhir/portal/patientlist.html

在这里我们可以看到,增加了一个新的病人“Toto”,0个活动。

patient portal

发送她的活动信息:

回到iOS应用程序,点击“Step count”。

这里显示的是一周的步数。在我们的案例中有2条记录。

现在可以单击发送,将这些数据发送到InterSystems IRIS FHIR。

ios send

从门户网站上查询新的活动记录:

现在我们可以看到Toto有两条新的观察和活动消息。

portal activites

你还可以单击“chart”按钮以图表格式显示。

portal charts

工作原理

iOS

该demo大部分是基于SwiftUI构建的。

https://developer.apple.com/xcode/swiftui/

iOS和co的最新框架。

如何检查健康数据的授权

它在SwiftFhirIrisManager 类中。

该类采用单例模式,可使用@EnvironmentObject对应用程序中进行的所有操作进行注释。

更多信息请访问 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views

调用requestAuthorization的方法如下:

    // Request authorization to access HealthKit.
    func requestAuthorization() {
        // Requesting authorization.
        /// - Tag: RequestAuthorization
        
        let writeDataTypes: Set<HKSampleType> = dataTypesToWrite()
        let readDataTypes: Set<HKObjectType> = dataTypesToRead()
        
        // requset authorization
        healthStore.requestAuthorization(toShare: writeDataTypes, read: readDataTypes) { (success, error) in
            if !success {
                // Handle the error here.
            } else {
                
                DispatchQueue.main.async {
                    self.authorizedHK = true
                }
                
            }
        }
    }

其中healthStore是HKHealthStore()的对象。

HKHealthStore类似于iOS中的healthdata数据库。

dataTypesToWrite和dataTypesToRead是我们想要在数据库中查询的对象。

授权的目的可以通过在Info.plist xml文件中添加以下内容完成:

    <key>NSHealthClinicalHealthRecordsShareUsageDescription</key>
    <string>Read data for IrisExporter</string>
    <key>NSHealthShareUsageDescription</key>
    <string>Send data to IRIS</string>
    <key>NSHealthUpdateUsageDescription</key>
    <string>Write date for IrisExporter</string>

如何连接FHIR资源仓库

对于这一部分,我使用了从Smart-On-FHIR网站下载的FHIR包 : https://github.com/smart-on-fhir/Swift-FHIR

使用的类是FHIROpenServer。.

    private func test() {
        
        progress = true
        
        let url = URL(string: self.url)

        swiftIrisManager.fhirServer = FHIROpenServer(baseURL : url! , auth: nil)
        
        swiftIrisManager.fhirServer.getCapabilityStatement() { FHIRError in
            
            progress = false
            showingPopup = true
            
            if FHIRError == nil {
                showingSuccess = true
                textSuccess = "Connected to the fhir repository"
            } else {
                textError = FHIRError?.description ?? "Unknow error"
                showingSuccess = false
            }
            
            return
        }
 
    }

这一步将在单例swiftIrisManager中创建一个新的对象fhirServer。

接下来使用getCapabilityStatement()

如果能够检索到FHIR服务器的capabilityStatement,则意味着已成功连接到FHIR资源仓库。

这个资源仓库不在HTTPS下,默认情况下Apple会阻止这种通信。

想要获取HTTP支持,可以对Info.plist xml文件进行如下编辑:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>localhost</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>

如何将患者信息保存到FHIR资源仓库

基本操作:首先检查存储库中是否已经存在该患者的信息

Patient.search(["family": "\(self.lastName)"]).perform(fhirServer)

搜索具有相同姓氏的患者。

在这里,我们可以想象一下其他场景,比如使用Oauth2和JWT令牌加入patientId及其令牌。但在这个演示中,我们简单操作即可。

如果该患者信息已经存在,可以对其进行检索;否则,则创建新的患者信息 :

    func createPatient(callback: @escaping (Patient?, Error?) -> Void) {
        // Create the new patient resource
        let patient = Patient.createPatient(given: firstName, family: lastName, dateOfBirth: birthDay, gender: gender)
        
        patient?.create(fhirServer, callback: { (error) in
            callback(patient, error)
        })
    }

如何从HealthKit中提取数据

通过查询healthkit商店 store(HKHealthStore())即可完成。

这里我们查询一下步数。

使用predicate做好查询准备。

        //Last week
        let startDate = swiftFhirIrisManager.startDate
        //Now
        let endDate = swiftFhirIrisManager.endDate

        print("Collecting workouts between \(startDate) and \(endDate)")

        let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: HKQueryOptions.strictEndDate)

然后,会根据数据类型(HKQuantityType.quantityType(forIdentifier: .stepCount))和predicate内容进行查询。

func queryStepCount(){
        
        //Last week
        let startDate = swiftFhirIrisManager.startDate
        //Now
        let endDate = swiftFhirIrisManager.endDate

        print("Collecting workouts between \(startDate) and \(endDate)")

        let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: HKQueryOptions.strictEndDate)

        let query = HKSampleQuery(sampleType: HKQuantityType.quantityType(forIdentifier: .stepCount)!, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { (query, results, error) in
            
            guard let results = results as? [HKQuantitySample] else {
                   return
            }
       
            process(results, type: .stepCount)
        
        }

        healthStore.execute(query)

    }

如何将HealthKit数据转换为FHIR

在这部分,我们使用了微软软件包HealthKitToFHIR

https://github.com/microsoft/healthkit-to-fhir

这个包很有用,为开发商提供了将HKQuantitySample转换为FHIR Observation的功能。

     let observation = try! ObservationFactory().observation(from: item)
      let patientReference = try! Reference(json: ["reference" : "Patient/\(patientId)"])
      observation.category = try! [CodeableConcept(json: [
          "coding": [
            [
              "system": "http://terminology.hl7.org/CodeSystem/observation-category",
              "code": "activity",
              "display": "Activity"
            ]
          ]
      ])]
      observation.subject = patientReference
      observation.status = .final
      print(observation)
      observation.create(self.fhirServer,callback: { (error) in
          if error != nil {
              completion(error)
          }
      })

其中item是HKQuantitySample,在我们的例子中是stepCount类型。

这个factory完成了大部分工作,将“unit”和“type”转换为FHIR codeableConcept,并将“value”转换为FHIR valueQuantity。

对PatientId的引用是通过强制转换json fhir引用手动完成的。

let patientReference = try! Reference(json: ["reference" : "Patient/\(patientId)"])

对类别进行同样的操作 :

      observation.category = try! [CodeableConcept(json: [
          "coding": [
            [
              "system": "http://terminology.hl7.org/CodeSystem/observation-category",
              "code": "activity",
              "display": "Activity"
            ]
          ]
      ])]

最后,在fhir资源仓库中创建observation :

      observation.create(self.fhirServer,callback: { (error) in
          if error != nil {
              completion(error)
          }
      })

后端 (FHIR)

没什么好说的,它基于InterSystems社区的fhir模板 :

https://openexchange.intersystems.com/package/iris-fhir-template

前端

基于Henrique作品,Henrique是使用jquery制作的FHIR资源仓库的一个很好的前端。

https://openexchange.intersystems.com/package/iris-fhir-portal

0
0 431
公告 Jeff Liu · 一月 7, 2021

现在,InterSystems IRIS、IRIS for Health 和 IRIS Studio 的 2020.4 版发布了预览版本。由于是预览版本,因此我们渴望在下个月正式发布之前了解您对新版本的体验。

**InterSystems IRIS 数据平台 2020.4 **使开发、部署和管理增强型应用程序和业务流程(桥接数据和应用程序孤岛)变得更加容易。 其拥有众多新功能,包括:

面向应用程序和界面开发者的增强功能,包括:

  • 使用 Oracle OpenJDK 和 AdoptOpenJDK 时均支持 Java SE 11 LTS
  • 支持 JDBC 连接池
  • 分段虚拟文档的路由规则新增“foreach”操作

面向数据库和系统管理员的增强功能,包括:

  • ICM 现在支持部署系统警报和监视 (SAM) 以及 InterSystems API 管理器(IAM)
  • 常见管理任务的 SQL 语法得到扩展
  • InterSystems 报告的部署得到简化

** InterSystems IRIS for Health 2020.4 **包括 InterSystems IRIS 的所有增强功能。 另外,此版本还包括:

  • 增强的 FHIR 支持,包括对 FHIR 配置文件的支持
  • 支持 RMD IHE 配置文件
  • 在 HL7 迁移工具中支持 DataGate

有关这些功能的更多详细信息,请参见产品文档:

由于这是 CD 版本,因此仅以 OCI(开放容器计划) 亦即 Docker 容器格式提供。  容器映像可用于面向 Linux x86-64 和 Linux ARM64 的 OCI 兼容运行时间引擎,如支持的平台文档中详述。

企业版容器映像及其所有相应组件都可以使用以下命从 InterSystems 容器注册表中获得:

docker pull containers.intersystems.com/intersystems/iris:2020.4.0.521.0
docker pull containers.intersystems.com/intersystems/irishealth:2020.4.0.521.0

有关可用映像的完整列表,请参阅 ICR 文档

也可以使用以下命令从 Docker 存储库提取社区版的容器映像:

docker pull store/intersystems/iris-community:2020.4.0.521.0
docker pull store/intersystems/iris-community-arm64:2020.4.0.521.0
docker pull store/intersystems/irishealth-community:2020.4.0.521.0
docker pull store/intersystems/irishealth-community-arm64:2020.4.0.521.0

另外,可以通过 WRC 的预览版本下载网站获取所有容器映像的 tarball 版本。

InterSystems IRIS Studio 2020.4 是 Microsoft Windows 支持的独立开发映像。 其可以与 InterSystems IRIS 和 IRIS for Health 版本 2020.4 及更低版本一起使用,还可以与 Caché 和 Ensemble 一起使用。 可以通过 WRC 的预览下载网站进行下载。

此预览版本的内部版本号是 2020.4.0.521.0。

0
0 138
文章 Jeff Liu · 一月 7, 2021 5m read

非常高兴地宣布,InterSystems 容器注册表现在可以使用了。 这为客户访问基于容器的版本及预览提供了新的渠道。 所有的社区版像都可在公共存储库中找到,且无需登录。 所有完整发布的像(IRIS、IRIS for Health、Health Connect、System Alerting and Monitoring、InterSystems Cloud Manager)和实用程序镜像(例如,仲裁器、Web 网关和 PasswordHash)都需要登录令牌,该令牌从 WRC 帐户生成。WRC 发布网站暂时将继续以 tarball 方式提供已发布像。 不过,您现在可以配置 CI/CD 管道以直接从 InterSystems 容器注册表“docker pull”镜像。
可通过 https://containers.intersystems.com 访问该注册表。 有关完整的使用说明,请参阅下文或参阅文档(使用 InterSystems 容器注册表)。如果您遇到任何问题或有任何反馈要分享,请在下面的评论中告知我们,或联系 support@intersystems.com。
--------------------------------------------------------------

使用 InterSystems 容器注册表

本文档列出了 InterSystems 容器注册表 (ICR) 中可用的像,并提供了使用说明。该注册表位于 containers.intersystems.com 上。

可以使用 docker pull 命令下载 ICR 中的像,例如:

docker pull containers.intersystems.com/intersystems/iris-community:2020.3.0.221.0

本文档包含以下部分:

  • 公共像
  • 受限访问镜像
  • 对 ICR 进行身份验证
  • 列出 ICR 清单

公共镜像

以下 ICR 像是公开可用的,无需身份验证即可拉取:

InterSystems IRIS

IntegratedML

2020.3

containers.intersystems.com/intersystems/iris-ml-community:2020.3.0.302.0

Community Edition

2020.3

containers.intersystems.com/intersystems/iris-community:2020.3.0.221.0

2020.3 ARM64

containers.intersystems.com/intersystems/iris-community-arm64:2020.3.0.221.0

InterSystems IRIS for Health

IntegratedML2020.3containers.intersystems.com/intersystems/irishealth-ml-community:2020.3.0.302.0
Community Edition

2020.3

containers.intersystems.com/intersystems/irishealth-community:2020.3.0.221.0

2020.3 ARM64

containers.intersystems.com/intersystems/irishealth-community-arm64:2020.3.0.221.0

System Alerting and Monitoring

 

1.0

containers.intersystems.com/intersystems/sam:1.0.0.115

以下 ICR 镜像仅对经过身份验证的用户可用:受限访问镜像

以下 ICR 像是公开可用的,无需身份验证即可拉取:

Arbiter

2020.1

containers.intersystems.com/intersystems/arbiter:2020.1.0.215.0

2020.2

containers.intersystems.com/intersystems/arbiter:2020.2.0.211.0

2020.3

containers.intersystems.com/intersystems/arbiter:2020.3.0.210.0

Health Connect

2020.1

containers.intersystems.com/intersystems/healthconnect:2020.1.0.215.0

InterSystems Cloud Manager (ICM)

2020.1

containers.intersystems.com/intersystems/icm:2020.1.0.215.0

2020.2

containers.intersystems.com/intersystems/icm:2020.2.0.211.0

2020.3

containers.intersystems.com/intersystems/icm:2020.3.0.221

InterSystems IRIS

2020.1

containers.intersystems.com/intersystems/iris:2020.1.0.215.0

2020.2

containers.intersystems.com/intersystems/iris:2020.2.0.211.0

2020.3

containers.intersystems.com/intersystems/iris:2020.3.0.221.0

2020.1 ARM64

containers.intersystems.com/intersystems/iris-arm64:2020.1.0.215.0

2020.2 ARM64

containers.intersystems.com/intersystems/iris-arm64:2020.2.0.211.0

2020.3 ARM64

containers.intersystems.com/intersystems/iris-arm64:2020.3.0.221.0

2020.3 IntegratedMLcontainers.intersystems.com/intersystems/iris-ml:2020.3.0.302.0

InterSystems IRIS for Health

2020.1

containers.intersystems.com/intersystems/irishealth:2020.1.0.217.1

2020.2

containers.intersystems.com/intersystems/irishealth:2020.2.0.211.0

2020.3

containers.intersystems.com/intersystems/irishealth:2020.3.0.221.0

2020.1 ARM64

containers.intersystems.com/intersystems/irishealth-arm64:2020.1.0.217.1

2020.2 ARM64

containers.intersystems.com/intersystems/irishealth-arm64:2020.2.0.211.0

2020.3 ARM64

containers.intersystems.com/intersystems/irishealth-arm64:2020.3.0.221.0

2020.3 IntegratedMLcontainers.intersystems.com/intersystems/irishealth-ml:2020.3.0.302.0

PasswordHash

1.0

containers.intersystems.com/intersystems/passwordhash:1.0

Web Gateway

2020.2

containers.intersystems.com/intersystems/webgateway:2020.2.0.211.0

2020.3

containers.intersystems.com/intersystems/webgateway:2020.3.0.221.0


要登录至 ICR,请执行以下步骤:对 ICR 进行身份验证

  • 在您的浏览器中加载 https://containers.intersystems.com/,然后使用您的 InterSystems/WRC 凭据登录。
  • 检索您的 Docker 登录令牌或完整的登录命令。
  • 在 Docker 界面(例如,PowerShell 窗口或 Linux 命令行)中,使用提供的凭据对 ICR 进行身份验证。 您可以通过复制并粘贴显示的完整 docker login 命令来执行此操作,例如:
docker login -u="bbinstoc" -p="provided_password" containers.intersystems.com

但是,出于安全原因,您可能想要输入命令 docker login container.intersystems.com,然后在 Username 提示符下输入用户名并将密码粘贴到 Password: 提示符下。

注意:如果您登录到另一个 Docker 注册表,则 docker login 命令可能会导致错误;登录到 container.intersystems.com 之前,请先注销其他注册表。

  1. 现在,您可以从 ICR 中拉取镜像,例如:
docker pull containers.intersystems.com/intersystems/iris:2020.3.0.221.0

列出 ICR 清单

API 可用于列出 Docker 注册表中的镜像和标签。 可用于列出注册表清单的开源第三方实用程序的一个示例是 docker-ls ,其可从 https://github.com/mayflower/docker-ls 获取。

获取此实用程序的方法有几种。 你可以:

  • 下载用于各种平台的预编译 docker-ls 二进制文件
  • 直接在某些平台上安装该实用程序,例如,在 Linux 系统上使用以下命令进行安装:
sudo snap install docker-ls
  • 在 Linux 平台上拉取并运行镜carinadigital/docker-ls:latest 以安装该实用程序,例如:
docker run --rm carinadigital/docker-ls:latest

安装 docker-ls 后,您可以使用以下命令列出 ICR 中的存储库:

docker-ls repositories --registry https://containers.intersystems.com --user username --password password

注意:使用 --interactive-password 选项提示输入密码,不要在命令行中输入密码。

要仅列出公开可用的像,请为 -user --password 选项提供空字符串 ("") 作为参数, 例如,以下仅列出了公共 InterSystems IRIS for Health 镜像的标签:

docker-ls tags --registry https://containers.intersystems.com --user "" --password "" intersystems/irishealth-community

如果希望看到非公共像的完整列表,则无论是否登录 container.intersystems.com,都需要向该实用程序提供用户名和密码。

可访问 https://github.com/mayflower/docker-ls 了解其他示例。

0
0 178
文章 Qiao Peng · 一月 5, 2021 4m read

各位开发者们大家好!

此前,我向各位介绍了一个非常好用的运行分析监控面板,它能使消息处理过程中的关键指标可视化,例如入站/出站消息的数量和平均处理时间等。  

现在,我想用一项许多人已熟悉的工作流程,来展示一个增强型日志监视器——将警告信息作为Production中的消息来处理。我们可以通过创建路由规则来实现对告警消息的过滤和路由,并运用预先构建的组件(例如电子邮件适配器等)来发送粒度级别的通知。  

如你所知,监视和管理警告信息是确保任何应用程序平稳运行的关键。对诸如HealthShare和IRIS医疗版这样支撑医疗系统运转的一级应用程序和集成引擎来说对告警信息的处理更显得尤为重要。

让我们先来梳理一下InterSystems产品中已经附带的警告信息监视和管理工具:

0
0 263