清除过滤器
文章
Claire Zheng · 七月 20, 2021
InterSystems极客俱乐部线上直播课“Health Connect系统运维培训”回放已准备好,欢迎您点击报名,扫码看回放!
文章
Michael Lei · 五月 23, 2022
大家是不是经常遇到以下情况:
系统有 bug 但是无法在本地复现
你需要在受影响的实例中运行几行代码
能完整访问系统管理门户,但是没有终端或者管理控制台, 也不能访问 Studio, Atelier 或者 VSCode
你要怎么运行你的几行代码来测试???
进入SMP/资源管理器/SQL标签=执行查询
用你需要的任何代码创建一个存储过程
复杂没有限制, 我就只做个简单的来实现可以预测的结果。
CREATE PROCEDURE RUN.ISOS()
LANGUAGE OBJECTSCRIPT
{
For i=1:1:20 write i," > "
Write "<br>THANKS !"
}
点击 EXECUTE 并看到新的 Procedure
下一步, 检查一下这个新的 Procedure 并执行它
另一个执行激活
然后得出结果
作为一个受过良好培训的专家, 记得在结束之后清空你的环境
DROP PROCEDURE RUN.ISOS
希望这个对您有所帮助.文档
文章
姚 鑫 · 七月 13, 2022
# 第四章 使用嵌入式 Python (一)
嵌入式 `Python` 允许使用 `Python` 作为编程 `IRIS` 应用程序的本机选项。
# 预备知识
使用嵌入式 `Python` 所需的 `Python` 版本取决于运行的平台。
在 M`icrosoft Windows` 上,`IRIS` 安装工具包安装正确版本的 `Python`(当前为 `3.9.5`),仅用于嵌入式 `Python`。如果在开发机器上并希望将 `Python` 用于一般用途,建议从 `https://www.python.org/downloads/` 下载并安装相同的版本。
许多基于 UNIX 的操作系统都安装了 `Python`。如果需要安装,请使用包管理器为操作系统推荐的版本,例如:
- `macOS`:使用 `Homebrew` 安装 `Python 3.9` `(https://formulae.brew.sh/formula/python@3.9)`
- `Ubuntu`: `apt-get install python3`
- `Red Hat Enterprise Linux or Oracle Linux: yum install python3`
- `SUSE`: `zypper install python3`
如果收到“无法加载 `python`”的错误,这意味着没有安装 `Python`,或者系统上安装了意外版本的 `Python`。使用上述方法之一安装或重新安装。
在基于 `UNIX` 的系统上,可能希望使用 `pip3` 命令安装 `Python` 包。如果尚未安装 `pip3`,请使用系统的包管理器安装包 `python3-pip`。
要防止在运行 `Embedded Python` 时出现 `IRIS_ACCESSDENIED` 错误,请启用 `%Service_Callin`。在管理门户中,` System Administration > Security > Services`,选择 `%Service_CallIn`,然后选中启用服务框。
# 运行嵌入式 Python
本节详细介绍了运行 `Embedded Python` 的几种方法:
## 从Python Shell
可以从终端会话或命令行启动 `Python shell`。
### 从终端启动 Python Shell
通过调用 `%SYS.Python` 类的 `Shell()` 方法,从 终端会话启动 `Python shell`。这将以交互模式启动 `Python` 解释器。终端会话中的用户和命名空间被传递给 `Python shell`。
通过键入命令 `quit()` 退出 `Python shell`。
以下示例在终端会话中从 `USER` 命名空间启动 `Python shell`。它打印斐波那契数列中的前几个数字,然后使用 `IRIS SYSTEM.OBJ.ShowClasses()` 方法打印当前命名空间中的类列表。
```java
USER>do ##class(%SYS.Python).Shell()
Python 3.9.5 (default, Jul 6 2021, 13:03:56) [MSC v.1927 64 bit (AMD64)] on win32
Type quit() or Ctrl-D to exit this shell.
>>> a, b = 0, 1
>>> while a < 10:
... print(a, end=' ')
... a, b = b, a+b
...
0 1 1 2 3 5 8 >>>
>>> status = iris.cls('%SYSTEM.OBJ').ShowClasses()
User.Company
User.Person
>>> print(status)
1
>>> quit()
USER>
```
方法 `%SYSTEM.OBJ.ShowClasses()` 返回一个 `IRIS %Status` 值。在这种情况下,`1` 表示未检测到错误。
注意:使用 `%SYS.Python` 类的 `Shell()` 方法运行 `Python shell` 时,不需要显式导入 `iris` 模块。继续使用该模块。
### 从命令行启动 `Python Shell`
使用 `irispython` 命令从命令行启动 `Python shell`。这与从终端启动 `shell` 的工作方式大致相同,但必须传入 `IRIS` 用户名、密码和命名空间。
以下示例从 `Windows` 命令行启动 `Python shell`:
```java
C:\InterSystems\IRIS\bin>set IRISUSERNAME =
C:\InterSystems\IRIS\bin>set IRISPASSWORD =
C:\InterSystems\IRIS\bin>set IRISNAMESPACE = USER
C:\InterSystems\IRIS\bin>irispython
Python 3.9.5 (default, Jul 6 2021, 13:03:56) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
在基于 `UNIX` 的系统上,使用 `export` 而不是 `set`。
```java
/InterSystems/IRIS/bin$ export IRISUSERNAME=
/InterSystems/IRIS/bin$ export IRISPASSWORD=
/InterSystems/IRIS/bin$ export IRISNAMESPACE=USER
/InterSystems/IRIS/bin$ ./irispython
Python 3.9.5 (default, Jul 22 2021, 23:12:58)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
注意:如果尝试运行 `import iris` 并看到一条消息说 `IRIS_ACCESSDENIED,请启用 %Service_Callin`。在管理门户中,转至 `System Administration > Security > Services`,选择 `%Service_CallIn`,然后选中启用服务框。
公告
Michael Lei · 二月 28, 2023
我们很高兴地宣布我们的抢先体验计划的最新成员 - Health Data De-ID工具。
该工具将根据 *HIPAA 安全港* 对结构化临床数据进行去标识化处理,并允许在需要时进行重新标识。它使用 InterSystems 的 *SDA* 规范格式,该格式用于我们从一种格式到另一种格式的所有标准转换,例如 *HL7* 到 *CDA*、*HL7* 到 *FHIR* 等。虽然该工具使用 XSLT 转换来提高性能原因,它提供了辅助方法,您不需要成为 XSLT 专家的情况下更轻松地调整开箱即用的去标识化规则。
Health Data De-ID 适用于任何 InterSystems 产品,从 InterSystems IRIS for Health 到 Health Connect 再到 Unified Care Record。
您可以在此处加入抢先体验计划 - [如何注册抢先体验计划 (EAP)]?我们需要您的反馈,因此请在您完成整个过程或遇到任何问题时与我们联系。
公告
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.
请大家保持关注
公告
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在线竞赛投票规则.
文章
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中国技术总监乔鹏演讲整理而成。
文章
姚 鑫 · 二月 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 · 一月 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 · 七月 4, 2022
大家好!
一周前,在西雅图举办的InterSystems 2022年全球峰会刚刚结束,但对于那些错过会议现场的人,或者由于种种原因无法亲自参加会议的人(或者只是希望重新回忆并再次聆听会议的人)来说,线上主题演讲刚刚开始!
话不多说,请查收全球峰会上来自社区的问候:
欢迎通过YouTube播放列表观看2022年全球峰会三天所有主题演讲:
➡️ Global Summit 2022 on InterSystems Developers YouTube
明年,来佛罗里达州好莱坞加入我们吧!🤩 详情在这里.
公告
Michael Lei · 三月 25, 2022
大家好! 对于那些参加了2021年虚拟峰会的体验实验室的人来说,你可能还记得其中一个实验室会议是围绕Kubernetes进行的。我们现在已经将该实验室转换为完全线上按需使用。你可以启动一个小型的虚拟机集群,并按照练习来管理你的Kubernetes集群,将InterSystems IRIS容器部署到其中,并观察它在摧毁一个吊舱时的自我修复性质。
如果你有兴趣,这是一个很好的Kubernetes介绍。请看这里: 用InterSystems IRIS 和 Kubernetes实现高可用
文章
Claire Zheng · 三月 16, 2022
谈到开发体验,什么最重要?如何为客户提供更好的开发体验?InterSystems IRIS的最新版本有哪些新特性极大优化了用户的开发体验?这是本月“极客聊吧”聚焦的话题,我们将通过上、下两期视频进行探讨。在本期视频中,InterSystems中国销售工程师吕正之、马浩和WRC产品支持专家杨乐乐针对以下两点进行了分享:(1)开发语言的多样性与对FHIR的支持;(2)探讨开发平台的前瞻性:对Smart Data Fabric架构的支持。
文章
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
文章
Qiao Peng · 三月 29, 2021
Caché Shadow
上次介绍了使用InterSystems IRIS/Caché的Reporting类型的异步镜像成员获取数据变更。但早期的Caché并不支持镜像,例如Caché 2008,它只支持Shadow。
在这些早期版本上是否也可以实利用Journal实现类似CDC的功能呢?答案是肯定的,就是利用Shadow服务器的Dejournaling filter routine (Dejournaling过滤器routine)。
Dejournaling filter routine
InterSystems Caché的 Dejournaling过滤器routine是一个用户自定义的routine,用于在Shadow服务器上过滤Journal记录。当配置了Dejournaling 过滤器后,Shadow服务器在redo journal前会自动调用Dejournaling过滤器routine。该routine传入参数以下:
pid:记录进程ID;
dir:源数据库目录;
glo:Global节点(包括下标);
type: 操作类型,为S (Set)、K (Kill)、s (BITSET)、k (ZKILL);
addr:Journal记录在Journal文件中的偏移量;
time:记录的时间戳。
该Routine返回1,说明此journal记录需要被Shadow恢复,而返回0说明此journal记录不需要被Shadow恢复。
因为这是一个自定义routine,且会被Shadow服务器恢复Journal时自动调用,因此我们可以利用它记录数据变更。
注意:
Shadow配置不在本文内容里,请参考文档: [Caché] https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_shadow
编写Dejournaling filter routine
Routine的名字可以任意,但这个routine需要保存在Caché Shadow服务器的%SYS下。
例如,将global的数据变更记录在^CDCLog中:
MyShadowFilter(pid,dir,glo,type,addr,time)
{
Set ^CDCLog($I(^CDCLog))=$lb(dir,glo,type,addr)
Quit 1
}
配置Dejournaling filter routine
在 Caché Shadow服务器的系统管理门户的[Home] > [Configuration] > [Shadow Server Settings] 上选择已经建立好的Shadow服务器,选择高级(Advanced)设置,在Filter routine里填写上面创建的routine名称即可。
CDC系列
更多的CDC选项实现,请参考:
1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能
2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC
3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系
4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能