清除过滤器
公告
Hao Ma · 五月 7, 2021
Hi Developers!
看看2021年4月的开发者社区新版本有些什么改善, 主要的新特性包括:
This is a release of how did we improve the Developer Community in April 2021. The key features:
代码块里的‘拷贝到剪贴板’按钮
帖子翻译页
私信帖子作者
InterSystems官方版本和安全警示
以下是详细介绍。
代码块里的‘拷贝到剪贴板’按钮Copy-to-clipboard button to code blocks
现在你可以轻松的从任何帖子或者回复里拷贝代码 - 把鼠标放在代码块,然后按这个按钮:
帖子翻译页面
在DC网站你可以请求任意帖子的专业翻译,或者您自己翻译,到5中语言中的一种。为了做起来方便,我们改善了翻译页的界面。
1. 从下拉菜单选择您想要的目标语言:
2. 做出您的选择:
生成翻译 - 如果您希望翻译并发帖,按"Translate"
请求翻译 - 如果您希望我们提供专业翻译,按"Request"
私信帖子作者
现在你可以轻松的发送私信给帖子的作者。点击"Direct Message"按钮,私信会自动添加标题。
InterSystems官方版本和安全警示
InterSystems Official tag 会及时向您更新InterSystems官方声明。现在您可以过滤想要收到的声明,从 releases 和 alerts.
希望您喜欢我们的改版
欢迎提交new requests for improvements and bug reports.
请大家保持关注
文章
Jingwei Wang · 十二月 29, 2021
dformat :
值
描述
1
MM/DD/[YY]YY : 07/01/97 或 02/22/2018
2
DD Mmm [YY]YY : 01 Jul 97
3
YYYY-MM-DD :2018-02-22 (ODBC时间格式:默认值在下面的tformat部分有描述) 默认情况下,这种格式与当前的地区设置无关 如果要使用你当前的日期和时间的地区设置与这种格式,请将localeopt设置为0。
4
DD/MM/[YY]YY :01/07/97 或 22/02/2018
5
Mmm [D]D, YYYY :Jul 1, 1997
6
Mmm [D]D YYYY :Jul 1 1997
7
Mmm DD [YY]YY :Jul 01 1997
8
YYYYMMDD :19970701
9
Mmmmm [D]D, YYYY :July 1, 1997
10
W (2) :一个星期的日数,从0(星期日)到6(星期六)编号。
11
Www (Tue) — 日期缩写
12
Wwwwww (Tuesday) —日期全写
13
[D]D/[M]M/YYYY :1/7/2549 或 27/11/2549 泰国日期格式
14
nnn (354) — 年的天数
15
DD/MM/[YY]YY :01/07/97 或者 22/02/2018
16
YYYYc[M]Mc[D]Dc : 日本日期格式
17
YYYYc [M]Mc [D]Dc :日本日期格式
18
[D]D Mmmmm YYYY :伊斯兰日期格式
19
[D]D [M]M YYYY :伊斯兰日期格式
20
[D]D Mmmmm YYYY :伊斯兰日期格式
21
[D]D [M]M YYYY :伊斯兰日期格式
-1
从用户的locale中获取有效的dformat值,fmt.DateFormat,其中fmt是与当前进程相关的##class(%SYS.NLS.Format)的一个实例。如果没有指定dformat,这就是默认值。
-2
$ZDATETIME返回一个整数,指定从一个平台特定的起始日期/时间算起的秒数。这是ISO C编程语言标准中定义的由time()库函数返回的值。 使用-2时,tformat, precision, monthlist, yearopt, startwin, and endwin参数会被忽略。
-3
$ZDATETIME接收一个以$HOROLOG内部格式指定的日期时间值,将该值从本地时间转换为UTC时间,并以相同的内部格式返回结果值。 使用-3时,tformat、monthlist、yearopt、startwin和endwin等参数被忽略。
tformat :
值
描述
-1
从当前地区的TimeFormat属性中获取有效的tformat值,默认值为1。 如果你没有为除3以外的所有dformat值指定tformat,这就是默认行为。
1
hh:mm:ss 24小时制
2
hh:mm 24小时制
3
hh:mm:ss[AM/PM] 12小时制
4
hh:mm[AM/PM] 12小时制
5
hh:mm:ss+/-*hh:mm 24小时制. 时间表示为当地时间。加号(+)或减号(-)的后缀显示系统定义的本地时间与UTC的偏移量,例如+08:00
6
hh:mm+/-*hh:mm 24小时制. 时间表示为当地时间。加号(+)或减号(-)的后缀显示系统定义的本地时间与UTC的偏移量,例如+08:00
7
hh:mm:ssZ 24小时制. 后缀 "Z "表示时间是以UTC,而不是以当地时间表示。
8
hh:mmZ 24小时制. 后缀 "Z "表示时间是以UTC,而不是以当地时间表示。
注意:
如果省略tformat或将其设置为-1,tformat的默认值取决于localeopt参数和NLS TimeFormat属性。
要确定所在地区的默认时间属性,可调用NLS类方法GetFormatItem() 。
WRITE ##class(%SYS.NLS.Format).GetFormatItem("TimeFormat"),!
WRITE ##class(%SYS.NLS.Format).GetFormatItem("TimeSeparator"),!
WRITE ##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
yearopt
在dformat值为0、1、2、4、7或15的情况下,是一个数字代码,用于指定将年份显示为两位数的时间窗口。
值
描述
-1
默认当前的locale
0
用两位数的年份来表示20世纪的日期(1900年到1999年) 用四位数的年份表示所有在20世纪以外或在特定过程的滑动窗口以外的日期
1
用两位数的年份表示20世纪的日期 用四位数的年份表示所有其他日期
2
用两位数的年份表示所有日期。
3
用两位数的年份表示那些属于startwin和(可选)endwin所定义的滑动时间窗口的日期。 用四位数的年代表所有其他的日期。当yearopt=3时,startwin和endwin是$HOROLOG格式的绝对日期。
4
用四位数的年份代表所有日期
5
用两位数的年份表示所有属于startwin和(可选)endwin定义的滑动窗口内的日期。 用四位数的年代表所有其他的日期。当yearopt=5时,startwin和endwin是相对年份
6
用两位数的年份表示本世纪的所有日期 用四位数的年份表示所有其他的日期
问题
洪玉 刘 · 二月 8, 2023
运行池的机制和组件运行池的建议配置大小 请参考我们的社区文章:运行池大小配置的解读 | InterSystems Developer Community | FTP|REST API|SOAP|DevOps
文章
Claire Zheng · 三月 16, 2022
谈到开发体验,什么最重要?如何为客户提供更好的开发体验?InterSystems IRIS的最新版本有哪些新特性极大优化了用户的开发体验?这是本月“极客聊吧”聚焦的话题,我们将通过上、下两期视频进行探讨。在本期视频中,InterSystems中国销售工程师吕正之、马浩和WRC产品支持专家杨乐乐针对以下两点进行了分享:(1)开发语言的多样性与对FHIR的支持;(2)探讨开发平台的前瞻性:对Smart Data Fabric架构的支持。
公告
Michael Lei · 三月 25, 2022
大家好! 对于那些参加了2021年虚拟峰会的体验实验室的人来说,你可能还记得其中一个实验室会议是围绕Kubernetes进行的。我们现在已经将该实验室转换为完全线上按需使用。你可以启动一个小型的虚拟机集群,并按照练习来管理你的Kubernetes集群,将InterSystems IRIS容器部署到其中,并观察它在摧毁一个吊舱时的自我修复性质。
如果你有兴趣,这是一个很好的Kubernetes介绍。请看这里: 用InterSystems IRIS 和 Kubernetes实现高可用
公告
Claire Zheng · 七月 4, 2022
大家好!
一周前,在西雅图举办的InterSystems 2022年全球峰会刚刚结束,但对于那些错过会议现场的人,或者由于种种原因无法亲自参加会议的人(或者只是希望重新回忆并再次聆听会议的人)来说,线上主题演讲刚刚开始!
话不多说,请查收全球峰会上来自社区的问候:
欢迎通过YouTube播放列表观看2022年全球峰会三天所有主题演讲:
➡️ Global Summit 2022 on InterSystems Developers YouTube
明年,来佛罗里达州好莱坞加入我们吧!🤩 详情在这里.
文章
姚 鑫 · 二月 23, 2021
# 第四十五章 Caché 变量大全 $ZVERSION 变量
包含一个字符串,描述`do`命令后面的InterSystems IRIS.line的当前版本。
# 大纲
```java
$ZVERSION
$ZV
```
# 描述
`$ZVERSION`包含一个字符串,该字符串显示当前运行的InterSystems IRIS®Data Platform实例的版本。
以下示例返回`$ZVERSION`字符串:
```java
DHC-APP>WRITE $ZVERSION
Cache for Windows (x86-64) 2016.2 (Build 736U) Fri Sep 30 2016 11:46:02 EDT
```
此字符串包括InterSystems IRIS安装的类型(产品和平台,包括CPU类型)、版本号(2018.1)、该版本中的内部版本号(内部版本号中的`“U”`表示UNICODE以及创建此版本的InterSystems IRIS的日期和时间。`“EST”`是东部标准时间(美国东部的时区),`“EDT”`是东部夏令时
通过调用`GetVersion()`类方法可以返回相同的信息,如下所示:
```java
DHC-APP>WRITE $SYSTEM.Version.GetVersion()
Cache for Windows (x86-64) 2016.2 (Build 736U) Fri Sep 30 2016 11:46:02 EDT
```
以通过调用其他`%SYSTEM.Version`方法来获取此版本字符串的组成部分,可以通过调用以下命令列出这些方法:
```java
DHC-APP> DO $SYSTEM.Version.Help()
'Do $system.Version.Help(method)' 将显示单个方法的完整描述.
类的方法:%SYSTEM.Version
FeatureBits(bit)
Return all the feature codes stored in $zversion(0)
Format(Format,zv)
Formats the version info according to the following format types:
GetBuildDate(zv)
Returns the date the product was built in $HOROLOG format.
GetBuildNumber(zv)
Returns the build number for the product.
GetBuildOS(zv)
Returns the operating system for which the product was built.
GetBuildTime(zv)
Returns the time of day the product was built in $HOROLOG format.
GetCompBuild(component)
Returns the build number for the specified component. (Deprecated)
...
```
通过转到InterSystems IRIS启动器并选择关于...,可以查看版本和内部版本号信息。
不能使用`SET`命令修改`$ZVERSION`特殊变量。尝试这样做会导致``错误。
# 示例
以下示例从版本字符串中提取创建日期,以计算InterSystems IRIS的当前版本有多早(以天为单位)。请注意,此示例特定于Windows平台:
```java
/// d ##class(PHA.TEST.SpecialVariables).ZVERSION()
ClassMethod ZVERSION()
{
SET createdate=$PIECE($ZVERSION," ",9,11)
WRITE !,"Creation date: ",createdate
WRITE !,"Current date: ",$ZDATE($HOROLOG,6)
SET nowcount=$PIECE($HOROLOG,",")
SET thencount=$ZDATEH(createdate,6)
WRITE !,"This version is ",(nowcount-thencount)," days old"
}
```
```
DHC-APP>d ##class(PHA.TEST.SpecialVariables).ZVERSION()
Creation date: Sep 30 2016
Current date: Feb 10 2021
This version is 1594 days old
```
下面的示例通过调用类方法执行相同的操作:
```java
/// d ##class(PHA.TEST.SpecialVariables).ZVERSION1()
ClassMethod ZVERSION1()
{
SET createdate=$SYSTEM.Version.GetBuildDate()
WRITE !,"Creation date: ",$ZDATE(createdate,6)
WRITE !,"Current date: ",$ZDATE($HOROLOG,6)
SET nowcount=$PIECE($HOROLOG,",")
WRITE !,"This version is ",(nowcount-createdate)," days old"
}
```
```java
DHC-APP>d ##class(PHA.TEST.SpecialVariables).ZVERSION1()
Creation date: Sep 30 2016
Current date: Feb 10 2021
This version is 1594 days old
```
文章
Hao Ma · 六月 19, 2023
上篇文章[IRIS, Caché监控指导 - 警告和告警](https://cn.community.intersystems.com/post/iris-cach%C3%A9%E7%9B%91%E6%8E%A7%E6%8C%87%E5%AF%BC-%E8%AD%A6%E5%91%8A%E5%92%8C%E5%91%8A%E8%AD%A6) 发出后收到要求介绍一下发送SNMP通知的具体操作,这里介绍一下。
我省去了SNMP的原理,这个有需要的可以网上查找。这里只做一个配置的操作:测试怎么从一个Windows上安装的IRIS实例发送IRIS Alert给另一台Linux服务器。
## 第一步: 配置 Windows SNMP
因为安全原因,Windows 10不再默认安装中启动SNMP,用户需要手工安装SNMP启动服务。以下两个文章是古老的Window 2003和新的Windows 10中配置SNMP的安装,给各位做个参考。
- [HOW TO: Configure the SNMP Service in Windows Server 2003](https://support.microsoft.com/en-us/help/324263/how-to-configure-the-simple-network-management-protocol-snmp-service-i)
- [How to Install and Configure SNMP Service on Windows 10](https://theitbros.com/snmp-service-on-windows-10/)
简单的总结一下:Windows系统中有两个服务:
- SNMP Service:使简单网络管理协议(SNMP)请求能够在此计算机上被处理。如果此服务停止,计算机将不能处理 SNMP 请求。如果此服务被禁用,所有明确依赖它的服务都将不能启动。
- SNMP Trap:接收本地或远程简单网络管理协议 (SNMP) 代理程序生成的陷阱消息并将消息转发到此计算机上运行的 SNMP 管理程序。如果此服务被停用,此计算机上基于 SNMP 的程序将不会接收 SNMP trap 消息。如果此服务被禁用,任何依赖它的服务将无法启动。
当前我需要从本机向远端发送SNMP, 所以只需要开启SNMP Service即可。然后需要配置SNMP Service的:
- Community名称
- 发送Trap的目的地址
- Community的权限(在”安全”子页面配置,权限为读写,应该选中“发送身份验证Trap”)
如下图,Commnity是”public”, 发送trap到172.16.58.1和172.16.58.101, 分别是两台远端的服务器。
## 第二步: 配置IRIS SNMP
在Windows系统注册iscsnmp.dll
Windows系统中,如果IRIS安装在SNMP服务安装之前, 需要手工执行以下命令来注册iscsnmp.dll到Windows Registry。命令成功执行后要重启操作系统的SNMP Service。
打开IRIS Terminal工具,在%SYS命名空间执行:
```
SYS>set myStatus=$$Register^SNMP()
Cache SNMP Extension Agent DLL successfully added to Registry
```
上述命令行必须是在Administrator的角色执行,否则会有权限问题, 提示错误 “Unable to open Registry key 'SOFTWARE\Microsoft\Windows\CurrentVersion\CommonFilesDir”
开启 %SNMP_Monitor服务
到System>Security Management >Services, 启动%Service_Monitor服务。%Service_Monitor服务负责Caché和本地操作系统的SNMP Agent的通信,如果关闭,本地和远程的SNMP通信都将中断。
到“系统>配置>监视器配置- 配置设置。选中” 开启SNMP服务随系统启动而启动”,英文”Start SNMP Agent at System Startup”。(Cache'中本页面还包括BMC PORTAL监控软件或者WMI选项,如果不使用,可以不用关心)。
最后,为了启用修改后的配置,需要重启Caché实例。如果是测试环境, 也可以不重启,而是在Caché Terminal执行:`Do start^SNMP()` 或者`Do start^SNMP(705,20) `来应用修改, 其中705是ensemble SNPM作为subagent的默认TCP端口号, 20是超时时间。 命令`do stop^SNMP()`命令可以在IRIS停止SNMP工作。
## 第三步: 向远端服务器发送SNMP Trap
这里,远端服务器我使用net-snamp工具。 net-snmp是linux, unix, mac os上第一选择的snmp服务和工具。简单的介绍centos 7 的net-snmp安装命令
```bash
# 安装net-snmp
[root@serverb ~]# yum install net-snmp net-snmp-utils -y
# 查看版本
[root@serverb ~]# snmpd -v
# 启动
[root@serverb ~]# systemctl start snmpd
[root@serverb ~]# systemctl status snmpd
```
(如果接收警告的SNMP Server是Windows系统,您可以选择一些图形化的工具做SNMP Trap的接收,比如[iReasoning](https://www.ireasoning.com/). )
### 设置snmp trap deamon
```bash
hma@CNMBPHMA ~ % snmptrapd -df -Lo
NET-SNMP version 5.6.2.1
```
### 在IRIS发送Alert
简单的制造一个alert的最简单的方法是用下面的命令,它向messages.log写一个级别为2的记录,这个记录会再写到alert.log里,通过SNMP发送给SNMP服务器。
```
%SYS>do ##class(%SYS.System).WriteToConsoleLog("Winter is coming",,2)
```
### 检查SNMP服务器收到警告
这时去刚才的snmptrapd终端,可以看到收到了警告。
```bash
hma@CNMBPHMA ~ % snmptrapd -df -Lo
Received 137 byte packet from UDP: [172.16.58.200]:55212->[0.0.0.0]:0
0000: 30 81 86 02 01 00 04 06 70 75 62 6C 69 63 A4 79 0.......public�y
0016: 06 0A 2B 06 01 04 01 81 81 33 04 02 40 04 AC 10 ..+......3..@.�.
0032: 3A C8 02 01 06 02 01 0E 43 03 5E E4 CB 30 5A 30 :�......C.^��0Z0
0048: 1E 06 14 2B 06 01 04 01 81 81 33 04 01 01 01 01 ...+......3.....
0064: 06 48 43 44 45 4D 4F 04 06 48 43 44 45 4D 4F 30 .HCDEMO..HCDEMO0
0080: 38 06 14 2B 06 01 04 01 81 81 33 04 01 01 01 08 8..+......3.....
0096: 06 48 43 44 45 4D 4F 04 20 5B 55 74 69 6C 69 74 .HCDEMO. [Utilit
0112: 79 2E 45 76 65 6E 74 5D 20 57 69 6E 74 65 72 20 y.Event] Winter
0128: 69 73 20 63 6F 6D 69 6E 67 is coming
```
到这里,IRIS的警告通过SNMP发送已经成功,接下来,您可以做进一步的测试,比如, 如果您对镜像的警告很重视, 您可以测试做如下的测试:
接收镜像相关的警告
- **Becoming primary mirror server**
本镜像成员成为主机
- **Arbiter connection lost**
丢失和arbiter的连接。
- **MirrorServer: Connection to xxxx(backup) terminated**
丢失和backup的连接。
以上3个警告都会写入alert,并发送给snmp服务器。
最后,如果您熟悉其他的监控工具,这时候您可以配置您的工具来接收警告了。 我后面会贴一个zabbix上监控IRIS的介绍,其中的警告用SNMP Trap实现,有兴趣的同学可关注本作者。
文章
Claire Zheng · 八月 17, 2021
FHIR是快速医疗互操作资源(Fast Healthcare Interoperability Resources)的缩写,所以FHIR的核心是资源模型。它的颗粒度和结构都优于之前的V2 、V3、CDA标准,而且能够灵活扩展。另外一个优势就是它的API,它不仅提供了针对于资源模型本身的原子化的CRUD(创建、读取、更新、删除的这样一些原子化操作),而且提供了查询这种更复杂操作的能力,同样API是可以扩展的。
此外,之前的互操作标准基本上都不会涉及到数据的保存,而FHIR资源仓库提供了一个全新的架构、全新的思路来使用FHIR,实现这种互操作。
这是InterSystems公司FHIR的参考架构,处于核心的就是FHIR服务器,它向外提供API的接口能力,包括FHIR的事务、FHIR的各种交互跟FHIR操作,底层是FHIR资源仓库,它可以持久化所有的FHIR资源,同时允许FHIR服务器对FHIR资源进行事务性的操作,所有需要使用FHIR API的客户端都可以使用FHIR服务器发布出来的API来进行相应的操作与访问。
上文我们讲到有常见的4种互操作的方式,HL7 FHIR支持所有的这些方式,而且它提供了第5种互操作方式。
首先,通过RESTful API它能够提供一个更紧密的业务集成度、去中心化的互操作能力,比较适合于搭建医疗微服务业务环境,同时比较适合于像云、互联网、物联网这种有紧密业务集成需求的环境。
另外FHIR依然支持以消息、文档方式来进行使用。这两种使用方式兼顾了传统互操作的模式,主要的目标是解决低业务集成度和跨数据管理域的集成和交换需求。
FHIR也可以基于服务来提供这种互操作,例如IHE已经有了大量的场景规范基于FHIR来实现了。
第五种就是我们说的资源仓库。大家可能会觉得奇怪,它怎么会成为一种互操作的方式?
我们先来看看互联互操作需求的起源:上图是比较传统的三层架构的开发模式,从底层的数据模型进行设计,到业务逻辑层,再到用户界面层,创造的是烟囱一样的应用。这种烟囱应用之间就需要通过互操作来打通,实现信息的共享和交换。
假设建设的不是烟囱类型的应用,我们还需要基于消息、文档的交换吗?
来看看生物界。世界上最大的生物是一种巨大的菌丝,在美国的俄勒冈州的蓝山有一种蜜真菌,它被科学家认为这是世界上最大的生物。地下的菌丝是一个整体,连在一起的,看起来独立的一个个蘑菇,其实都是这个巨大生命体的一部分。科学家估计在蓝山的蜜真菌的面积能够达到9.6平方公里,年龄已经差不多1900岁,甚至有人说可能在6500岁之间。
如果说我们把FHIR的资源仓库视为菌丝,基于FHIR资源仓库开发的应用,就是一个个的小蘑菇,它们只需要关注用户界面和业务逻辑,因为它们所有的数据存储和数据访问能力都是由标准的FHIR服务器提供的,而FHIR服务器下面可以接非常多的FHIR资源仓库,也就说资源仓库可以不止一个。这就是虚拟的集中式架构,在虚拟集中式的架构下的所有应用天生就是互联互通的,这就是FHIR的第5种互操作模式。
大家可能会问真有人这么做吗?还真有——SMART on FHIR就是比较典型的这种应用方式。
SMART是 “可替代医疗应用的、可重复使用技术”的缩写,它起初是哈佛医学院跟波士顿儿童医院在2011年开启的一个项目,它这个项目目标是用来创建这种可复用、可替代的应用开发架构。显然FHIR提供的这种标准化的数据模型和API是SMART能够实现的基础——的确是,在2014年SMART 跟 FHIR融合出来一个新的项目就是今天的SMART on FHIR。这个应用程序开发的架构使用标准的FHIR资源模型,使用标准的FHIR API来操作资源数据,使用OAuth2 和OpenID实现统一的认证授权,而开发者只需要关注在业务逻辑和应用层面。它开发出来的SMART应用底层的数据都保存在FHIR服务器和FHIR资源仓库里面,这些应用跟我们的手机的APP一样,都是即插即用的。这些即插即用的应用可以在所有支持 FHIR的服务器和FHIR资源仓库上实现,而且可以复用。
这些应用程序里面并不保存数据,我们不用担心数据跟应用共存亡的问题,因此这些应用其实可以随时被替代。如果你觉得它不好,有一个更好的应用你觉得喜欢,就直接把旧的扔了,插一个新的应用就ok了,这种建设的应用天生就是互联互通的。
注:本文根据InterSystems中国技术总监乔鹏演讲整理而成。
公告
Claire Zheng · 四月 22, 2021
亲爱的社区开发者们:
本周进入 InterSystems 开发者工具编程大赛 投票时间(4月19日-25日)! 来为你心目中基于InterSystems IRIS而构建的最佳方案投票吧!
🔥 投票入口: 点击投票 🔥
如何投票?有哪些最新信息值得了解一下?
所有的InterSystems员工均可为专家提名奖(Experts Nomination)或社区提名奖(Community Nomination)投票。
所有社区开发者都可以为自己提交的项目投票——投票将根据用户的Global Master级别自动计入专家提名奖(Experts Nomination)和社区提名奖(Community Nomination)。
根据目前的投票引擎和算法,您可以选择三个项目进行投票,选出您心目中的一、二、三名。以下是社区排行榜说明:
社区(Community)提名投票计分方式
如果您满足以下条件
提名
第一名
第二名
第三名
如果您在DC上发布过帖子,且在Open Exchange上传过App
9
6
3
如果您在社区发布过至少一篇帖子,或者在Open Exchange上传过至少一个App
6
4
2
如果您在社区进行过有效贡献(包括发表评论/提问等等)
3
2
1
专家(Experts)提名投票计分会有更复杂的数学计算,不同级别的专家有更多的“点数”权力:
专家(Experts)提名投票计分方式
级别
提名
第一名
第二名
第三名
Global Maters VIP级 & InterSystems产品经理
15
10
5
Global Master 大使级(Ambassador)
12
8
4
Global Master专家级(Expert)& 社区管理员/版主
9
6
3
Global Master专业级(Specialist)
6
4
2
Global Master初级倡导员(Advocate)& InterSystems员工
3
2
1
系统会根据您的级别,对社区(Community)提名和专家(Experts)提名分别自动计票。
请看投票演示(请注意您提名项目的分数变化):
为了顺利参加投票,您需要:
登录 Open Exchange – 利用开发者社区账号即可
确保您在开发者社区进行过有效贡献——回答问题、提问、发帖、在Open Exchange上传应用程序——然后您就可以进行投票了。 点击了解如何成为社区“活跃”用户 。
如果您改变了主意,可以取消并投票给其他您看中的应用——您有充分的时间选择(4月19日-25日)!
提醒:在投票期间,参赛者可以继续修复bug,提升应用,所以投票者不要错过最新发布的版本哦~
➡️ 点击查看最新 InterSystems在线竞赛投票规则.
文章
Hao Ma · 一月 4, 2023
本文章是一个系列,主要目的是介绍给IRIS,Caché的终端用户如何方便的监控您的系统。
InterSystems系统的监控很难吗?需要学习很多技术吗? 我的答案是还好。
关于Caché和IRIS监控,无论是那部分内容,在InterSystems的在线文档或者开发者论坛,其实都能找到相关的说明和方案。但问题是太多,太杂乱,没有一个“操作维护手册”的东西。结果是,如果您是一个新手的InterSystems产品的维护工程师或者管理员,您要花很多的时间在大量的文档里找答案。
还有一个问题是文档中很多章节的内容又太深,包含了一些开发人员才关心的内容,这是Caché或者IRIS的特性造成的,因为它首先是一个开发平台。结果是,对于管理员,很多文档的很不友好。
因此,我要写的这个文章的的目的是这样的:
- 简单。只介绍管理维护人员需要的内容。只介绍和监控相关的内容。其他比如备份恢复,扩容,修改配置等等基本不涉及。
- 易学。文章的期待读者是系统管理员,因此不需要您有编程能力或者InterSystems编程语言的基础。我系统对您的每个日常工作和关注的主题,给出最容易实现的操作步骤。
- 对读者的要求低,您只需要了解基本的Caché操作,包括
- Caché的用户维护界面
- 操作终端(Terminal)的操作
- 基本的Caché命令的格式
让我们进入主题。有几个要点要先交代一下。
### InterSystems产品的几个使用的场景
也就是谁在用什么产品
- 场景一:东华的iMedical用户
iMedical 8.5之前的版本使用Caché。 2022年版本8.5发布并开始部署,它的底层是InterSystems IRIS。
- 场景二:独立的InterSystems IRIS实例或者InterSystems HealthShare
InterSystems HealthShare是在IRIS平台上面构建的数据共享平台,用于多个医疗机构之间的数据共享,通常会由多个InterSystems IRIS实例组成。本文并不介绍HealthShare的具体技术,您如果是HealthShare的用户,可以通过本文了解单一的IRIS实例的监控。
- 场景三: 医院的集成平台Ensemble用户
从监控维护的角度讲,Ensemble和Health Connect对于医院用户其实是一个东西。Health Connect是最近一些年InterSystems公司对医疗行业使用的Ensemble的一个产品名称。在后面的文章里, 我会只用Ensemble这个名字。
### 什么是系统监控
简单说,监控工作基本就两块:
1. 监控告警和日志
简单的说,当系统有需要管理员关注的事件发生时,管理员可以及时得到通知。关注的事件通常包括底层的告警,比如CPU占用或者数据库组件出错,或者上层应用的事件,比如一个消息队列太长了。
2. 指标的测量
如果要监控的系统本身有完美的日志和告警通知,那么指标的检测就不那么重要。但实际场景中,用户不仅要检测客户化的上层应用指标,也希望看到底层的指标值,哪怕仅仅是为了展示。 这时候,就需要一个好的指标测量的方案。这里“好的方案”的意思是稳定,易于维护,容易客户定制化的修改。
### 本文章的组织和您可能感兴趣的内容
如果您是新手,请让我先来强调一下IRIS, Caché和Ensemble的区别
- IRIS, Cache'是开发平台,而不仅仅是数据库。
举例来说,iMedical的生产环境有很多“应用服务器”,它们是一个个单独部署的Caché实例。它们并不存数据,而仅仅是应用。因此对Caché应用服务器的监控肯定是和数据服务器是不一样的。
- Ensemble是一个应用
Ensemble是在Caché平台上的开发出的消息引擎框架(framework)。它内置了很多用于消息分发传递的组件,用于搭建一个消息引擎。如果只用内置的组件,那么Ensemble几乎可以被看成一个应用。但现实实施中,程序员会使用已有的组件,适配器等开发定制化的组件,这时候Ensemble就是一个开发框架。
无论如何,Ensemble是工作在Cache'或者IRIS之上的,所以Ensemble的维护人员一定要先学维护Cache'或者IRIS。
综上所述, InterSystems产品的监控包括
- IRIS或者Caché的监控(适用于上面所有3个场景的维护人员),包括的内容
- [IRIS,Caché健康检查](./IRIS和Caché健康检查建议.md)
- [IRIS,Caché的日志和错误]()
- [指标(metrics)的监控]
- 数据库性能的监控(适用于场景一,场景二的维护人员)
- SQL性能的监控
- 索引的使用情况的监控
- Ensemble的监控(适用于上面场景三的维护人员), 包括
- Ensemble的日志和错误]()
- Ensemble的消息统计
除了最基本的监控有关的工作,文章内容里还会包括最基本的和系统健康检查,提交测试报告的内容。也会介绍一些工具,比如SNMP, InterSystems SAM等等。我在工作中了解的一些用户的好的方案,实现等等, 也会和各位分享。
请看下一篇
[IRIS, Caché监控指导(1)-健康检查](https://cn.community.intersystems.com/post/iris-cach%C3%A9%E7%9B%91%E6%8E%A7%E6%8C%87%E5%AF%BC-%E7%B3%BB%E7%BB%9F%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5)
文章
Claire Zheng · 五月 18, 2023
“数据二十条”体现了怎样的制度创新和政策智慧?FHIR将如何发挥作用?来看InterSystems亚太区总经理老卢(Luciano Brustia)与CHIMA主任委员王才有的精彩探讨!
公告
Michael Lei · 五月 18, 2022
所有人现在可以在 https://evaluation.intersystems.com下载IRIS和IRIS for Health社区和企业版 。
客户以及潜在客户都可以尝试我们最新最强的功能,包括一些还没有发布的新特性。
如何访问:
对于潜在客户,只要选择名称中带有"(预览)"的选项,就可以下载预览软件。
对于客户和InterSystems员工--只需拨动预览复选框,这将包括可用版本菜单下拉中的预览软件:
更多资源:
https://community.intersystems.com/post/introducing-evaluation-service-community-edition-downloads
https://community.intersystems.com/post/intersystems-evaluation-service
有任何问题欢迎拨打 4006019890 或咨询您的ISC客户经理。
文章
Michael Lei · 五月 16, 2021
[FHIR 术语服务](https://www.hl7.org/fhir/R4/terminology-service.html)规范描述了一组对 [CodeSystem](https://www.hl7.org/fhir/R4/codesystem.html)、[ValueSet](https://www.hl7.org/fhir/R4/valueset.html) 和 [ConceptMap](https://www.hl7.org/fhir/R4/conceptmap.html) 资源的操作。 在这些操作中,以下四种操作似乎是最为广泛采用的:
| CodeSystem | ValueSet |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [$lookup](https://www.hl7.org/fhir/R4/codesystem-operation-lookup.html)[$validate-code](https://www.hl7.org/fhir/R4/codesystem-operation-validate-code.html) | [$expand](https://www.hl7.org/fhir/R4/valueset-operation-expand.html)[$validate-code](https://www.hl7.org/fhir/R4/valueset-operation-validate-code.html) |
开发该规范的部分实现一直是探索 IRIS for Health 2020.1 中引入的[全新 FHIR 框架](https://docs.intersystems.com/irisforhealth20203/csp/docbook/Doc.View.cls?KEY=HXFHIR_server_intro#HXFHIR_server_arch)的有效途径。 本[实现](https://github.com/intersystems-ru/fhir-terminology-service)包括上述四种操作,并支持与 [CodeSystem](https://www.hl7.org/fhir/R4/codesystem.html) 和 [ValueSet](https://www.hl7.org/fhir/R4/valueset.html) 资源的[读取](https://www.hl7.org/fhir/R4/http.html#read)和[搜索](https://www.hl7.org/fhir/R4/http.html#search)交互。
需要注意的是,本实现使用普通 ObjectScript 持久化类作为源术语表。
### 安装和测试示例策略
下面列出了安装和基本测试步骤:
1. 安装 IRIS for Health 2020.1 或更新版本。
2. 使用门户的 `System Administration` > `Configuration` > `System Configuration` > `Namespaces` 菜单或在 HSLIB 命名空间中运行命令 `do ##class(HS.HC.Util.Installer).InstallFoundation("")` 来建立一个新的命名空间。 然后从 [intersystems-ru/fhir-terminology-service](https://github.com/intersystems-ru/fhir-terminology-service) GitHub 仓库的 [src/cls](https://github.com/intersystems-ru/fhir-terminology-service/tree/main/src/cls/) 和 [samples/cls](https://github.com/intersystems-ru/fhir-terminology-service/tree/main/samples/cls/) 文件夹导入类。
3. 基于 R4 数据集以及在 [dummy-search-parameters.json](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/fhir-search-parameters/dummy-search-parameters.json) 中定义的附加搜索参数,创建一个自定义 FHIR 元数据集。 这可以使用 `##class(HS.FHIRServer.ConsoleSetup).Setup()` 交互实用工具或运行以下命令来完成:
```
do ##class(HS.FHIRServer.Installer).InstallMetadataSet("", "", "HL7v40", $lb(""), 1)
```
* 为了使 `$expand` 和 `$validate-code` 操作支持 HTTP GET 请求,此步骤是必需的。
* 请注意,与 InterSystems IRIS 一起打包的 FHIR 元数据集文件位于 `/dev/fhir/fhir-metadata` 目录中。
4. 基于新的元数据集和 [Sample.iscru.fhir.fts.SimpleStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/SimpleStrategy.cls) 类创建一个新的 FHIR 端点。 同样,这可以使用交互实用工具或运行以下命令来实现:
```
do ##class(HS.FHIRServer.Installer).InstallInstance("", "Sample.iscru.fhir.fts.SimpleStrategy", "")
```
5. 允许对新端点进行未经身份验证的访问:使用交互实用工具或运行以下[命令](https://docs.intersystems.com/irisforhealth20203/csp/docbook/Doc.View.cls?KEY=HXFHIR_server_install#HXFHIR_server_install_program_configure):
```
set strategy = ##class(HS.FHIRServer.API.InteractionsStrategy).GetStrategyForEndpoint("")
set config = strategy.GetServiceConfigData()
set config.DebugMode = 4
do strategy.SaveServiceConfigData(config)
```
6. 填充 [Sample.iscru.fhir.fts.model.CodeTable](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/model/CodeTable.cls):
```
do ##class(Sample.iscru.fhir.fts.model.CodeTable).Populate(10)
```
7. 将 [fhir-terminology-service.postman_collection.json](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/tests/postman/fhir-terminology-service.postman_collection.json) 文件导入到 Postman 中,调整集合内定义的 `url` 变量,然后针对 `Sample.iscru.fhir.fts.model.CodeTable`(一个简单的持久化类)测试服务。
### 支持的 FHIR 交互
目前 CodeSystem 和 ValueSet 都支持的唯一搜索参数是 `url`。
上述四种操作均支持 HTTP GET 和 HTTP POST 方法。
下表列出了一些针对 [Sample.iscru.fhir.fts.model.CodeTable](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/model/CodeTable.cls) 类的可能 HTTP GET 请求。
| URI(前面加上 `http://:`) | 描述 |
| ---------------------------------------------------------------------------- | ------------------------------------------------------------- |
| /metadata | 获取端点的能力描述资源。 |
| /CodeSystem/Sample.iscru.fhir.fts.model.CodeTable | 读取与 Sample.iscru.fhir.fts.model.CodeTable 类对应的 CodeSystem 资源。 |
| /ValueSet/Sample.iscru.fhir.fts.model.CodeTable | 读取与 Sample.iscru.fhir.fts.model.CodeTable 类对应的 ValueSet 资源。 |
| /CodeSystem?url=urn:CodeSystem:CodeTable | 通过 url 搜索 CodeSystem 资源。 |
| /CodeSystem | 输出所有可用 CodeSystem 资源。 |
| /ValueSet?url=urn:ValueSet:CodeTable | 通过 url 搜索 ValueSet 资源。 |
| /ValueSet | 输出所有可用 ValueSet 资源。 |
| /CodeSystem/$lookup?system=urn:CodeSystem:CodeTable&code=TEST | 在给定系统和代码的情况下,获取有关该概念的所有详细信息。 |
| /ValueSet/$expand?url=urn:ValueSet:CodeTable | 展开 ValueSet。 |
| /CodeSystem/Sample.iscru.fhir.fts.model.CodeTable/$validate-code?code=TEST | 验证某个代码是否在代码系统中。 |
### 创建自定义策略
为了将您自己的持久化类公开为 FHIR 代码系统/值集,您需要创建自定义策略类,方法是先将 [iscru.fhir.fts.FTSStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/cls/iscru/fhir/fts/FTSStrategy.cls) 子类化,然后基于新的自定义策略创建 FHIR 端点(请参见上面的安装步骤 4)。
您的策略类必须覆盖一个类参数和至少三个方法:
* `StrategyKey` 类参数应该被指定一个唯一值。 当前类的名称似乎是一个好选择。
* `getCodeTablePackage()` 类方法应该返回通过[规范 URL](https://www.hl7.org/fhir/R4/resource.html#canonical) 标识的给定代码系统(或值集)的包名称。 通常,所有术语类都属于一个包,因此该方法通常会返回一个相同的包名称,不管参数值如何。
* `getCodePropertyName()` 和 `getDisplayPropertyName()` 类方法应该返回与 `code` 和 `display` 概念元素对应的类属性的名称。 不同的类可能有不同的属性映射到术语 code/display 元素。
[iscru.fhir.fts.FTSStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/src/cls/iscru/fhir/fts/FTSStrategy.cls) 的其他可能适合覆盖的方法和参数如下:
* `listCodeTableClasses()` 类方法需要覆盖,才能支持以返回所有可用代码系统(或值集)为结果的搜索请求。 此方法应该返回所有可用术语类的类名称列表。 [Sample.iscru.fhir.fts.SimpleStrategy](https://github.com/intersystems-ru/fhir-terminology-service/blob/main/samples/cls/Sample/iscru/fhir/fts/SimpleStrategy.cls) 包含此方法的以下基本实现:
```
/// Returns a list of all available code table classes.
ClassMethod listCodeTableClasses() As %List
{
#dim sql As %String = "SELECT name FROM %Dictionary.ClassDefinition WHERE name LIKE '" _ ..#codeTablePACKAGE _ ".%' ORDER BY name"
#dim resultSet As %SQL.StatementResult = ##class(%SQL.Statement).%ExecDirect(, sql)
if (resultSet.%SQLCODE '= 0) && (resultSet.%SQLCODE '= 100) $$$ThrowStatus($$$ERROR($$$SQLError, resultSet.%SQLCODE, resultSet.%Message))
#dim return As %List = ""
while resultSet.%Next()
{
set return = return _ $lb(resultSet.name)
}
quit return
}
```
* 如果您的持久化类的任何特定属性都不应出现在 CodeSystem 资源中,则需要覆盖 `isExcludedProperty()` 类方法。 默认情况下,此方法会过滤掉 `Collection`、`Identity`、`Internal`、`MultiDimensional` 和 `Private` 属性。 需要注意的是,对象引用和流属性当前不受框架支持并被忽略。
* `codeSystemUrlPREFIX` 和 `valueSetUrlPREFIX` 类参数以及 `getCodeSystemForClassname()`、`getValueSetForClassname()`、`determineCodeTableClassname()` 和 `determineCodeSystemForValueSet()` 方法控制类名称与[规范 URL](https://www.hl7.org/fhir/R4/resource.html#canonical) 相互映射的方式。 默认情况下,对规范 URL 使用以下命名方案:
| CodeSystem | ValueSet |
| ----------------------------------------- | --------------------------------------- |
| `urn:CodeSystem:` | `urn:ValueSet:` |
请注意,CodeSystem/ValueSet 资源的[逻辑 id](https://www.hl7.org/fhir/R4/resource.html#id)(也就是服务器 id)等于其对应类的全名。
### 待完成功能
目前缺少的是对代码系统版本管理、概念层次结构和 `$subsumes` 操作、ConceptMap 资源以及其他许多内容的支持。 欢迎发表意见和拉取请求!
文章
Weiwei Gu · 九月 28, 2022
Hi Developers,
嗨,各位开发者们:
各位都知道,Python是一个庞大而强大的生态系统,包含了成千上万的库和包,特别是在数据科学方面。
因此,我想首次尝试使用IRIS最近的一项功能--嵌入式Python,简单地导入一个名为datetime的Python库,生成带有时间戳成分的数据,并在InterSystems IRIS for Health Data Platform中持久化。同样的方法在IRIS数据平台上也可以使用。
我把这个小项目分成了两个主要部分。
*按照IRIS for Health Data Platform的文档设置嵌入式Python环境*使用嵌入式Python创建时间戳数据作为例子,并使用datetime包持久化到IRIS。
1. 在 InterSystems IRIS for Health Data Platform 2022.1 上设置嵌入式 Python。
在Windows上,打开CMD terminal
C:\InterSystems\IRISHealth\bin>irispip install --target C:\InterSystems\IRISHealth\mgr\python numpy
注意:这是检查嵌入式Python环境的步骤,因为我发现当我使用IRIS 2021.0时,irispip经常不工作。
通过导入一个Python math packge来测试Python功能
打开IRIS终端,在USER命名空间中执行以下程序:set pymath = ##class(%SYS.Python).Import("math")
然后执行write pymath.pi,你可以看到你已经成功调用了Python包,输出结果如下。
USER>write pymath.pi
3.141592653589793116
而我们也可以通过从IRIS terminal打开来启动Python shell。
do ##class(%SYS.Python).Shell()
Class User.PythonFirstTry Extends %RegisteredObject{ClassMethod pyHello() As %Status{ set pythonBuiltins = ##class(%SYS.Python).Builtins() do pythonBuiltins.print("Hello World!")}ClassMethod pyForLoop() [ Language = python ]{ for i in range(5): print("Python")}}
我写了两个类方法,你可以试着把它们放在一个.cls文件中,编译一下,看看输出。
执行方法如下:
USER>do ##class(User.PythonFirstTry).pyHello()
Hello World!
USER>do ##class(User. PythonFirstTry).pyForLoop()
Python
Python
Python
Python
Python
2. 使用python库来生成数据流并持久化到InterSystems IRIS中。
生成数据流所需的Python库:
导入datetime包(这不需要使用CLI进行额外的安装)。除了datetime包,我还尝试使用了其他的库和包,但是其中一些并不在Embedded Python中。要安装这些东西,请打开 CMD terminal (Windows),然后运行以下程序 (XX 将被替换成包的名称)。
C:\InterSystems\IRISHealth\bin>irispip install XX
以下是生成数据并持久化到IRIS的步骤:
1.创建 %Persistent类 2. 创建Property3.设置一个类方法(例如:GetData)并指定[Language = python] 。4.通过调用datetime python库生成数据,使用以下代码片段
注意:timeNow需要被转换为字符串数据类型
5.通过IRIS terminal 执行GetData()方法,执行SQL查询
注意:你可以使用一种简单的 "For " 循环来控制这种方式产生的数据量的规模。
感谢翻译!! @Weiwei.Gu