清除过滤器
公告
Claire Zheng · 五月 19, 2022
在集成平台建设如火如荼的今天,如何能最大程度发挥集成平台价值,让集成平台不再止步于业务系统接口的打通,而是真正作为医院的IT基础架构,释放出更大价值?5月27日,InterSystems技术总监乔鹏 ( @Qiao.Peng )和InterSystems销售工程师王菁伟( @Jingwei.Wang )将针对集成平台建成后的应用价值,围绕“业务流程再造”角度,探讨以低代码方式梳理并再造业务闭环流程、从而赋能业务创新并促进医院精细化管理和高质量发展。点击链接或扫描报名。
公告
Claire Zheng · 六月 14, 2023
InterSystems 已纠正导致进程内存使用量增加的缺陷。
具体来说,在对局部变量执行$Order 、 $Query 或 Merge时,会出现本地进程分区内存消耗增加的问题。虽然这对大多数运行环境没有不利影响,但支持大量进程或严格限制每个进程最大内存使用的环境可能会受到影响。某些进程可能会遇到<STORE> 错误。
该缺陷存在于2023.1.0.229.0中,但它被重新发布为2023.1.0.235.1,并包含了修复程序,以加快修正,而无需客户等待维护版本。
此缺陷的更正标识为 DP-423127 和 DP-423237。这些将包含在所有未来版本中。
该缺陷出现在 InterSystems IRIS ® 、InterSystems IRIS for Health ™ 和HealthShare ® Health Connect 的版本 2022.2、2022.3 和 2023.1(内部版本 229)中。如果您运行的是这些版本之一,我们建议升级到 2023.1(内部版本 235)。
此修复也可通过 Ad hoc 分发获得。
如果您对此警报有任何疑问,请联系全球响应中心。
文章
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功能
公告
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在线竞赛投票规则.
文章
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
文章
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 资源以及其他许多内容的支持。 欢迎发表意见和拉取请求!
文章
Botai Zhang · 一月 26, 2021
利用Intersystems IRIS医疗版数据平台内置多模型整合
医院信息查询业务解决方案
概述:
随着医院信息化建设的逐步完善,医院子系统越来越多,系统间接口越来越多,同时接口费用不断增加,管理工作变得越来越复杂。其中,查询类业务接口根据业务类型分化,数量也是逐步递增,带来接口量大、开发工作繁重、代码冗余、维护困难等等问题。针对这一困境,我们利用Intersystems IRIS数据平台内置多模型整合医院信息查询业务解决方案。该应用程序可通过内置模型应用完成查询业务,大大缩小开发、维护、实施等项目关键运转周期。
应用链接:HealthInfoQueryLayer
关键应用:IRIS for Health、REST API、ObjectScript、Globals 、SQL、DATA LOOKUP TABLES
应用程序采用模型及应用介绍:
1.采用模型
1.1. Globals (key-value)
Globals是可以在IRIS数据库中存储和管理的稀疏多维数组。您可以使用ObjectScript和本机API处理Globals。
工具:
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GGBL_MANAGING
应用:
应用程序根据Globals的键值对、访问速度快的特性。应用在本次程序的Rest分派类与BP流程管理中取值应用,解决了频繁取值速度慢、实现在查找表前端页面配置操作,如:存储了SQL模型、服务配置信息等等。
1.2. SQL访问
InterSystems IRIS通过 ObjectScript、REST API及JDBC提供对数据的SQL访问.
工具:
https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GSQL_smp
应用:
在查询业务中,三方系统不配合接口改造,导致接口实现困难问题。此时,我们采用IRIS内嵌模型ObjectScript、REST API及JDBC来实现对数据的SQL访问,来建立业务接口。
1.3. Object访问
通过ObjectScript、REST API,InterSystems IRIS提供了在Globals 存储和更改对象实例的途径。
文档:
https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=PAGE_multimodel_object
应用:
在整个交互过程中,直接操纵InterSystems IRIS对象。ObjectScript类定义通常用作创建对象(例如患者,科室或医护人员)的模板。
建立应用案例(此应用程序以患者为例)
2.1应用搭建:
2.1.2基本环境
IRIS版本信息:IRIS for Windows (x86-64) 2020.1 (Build 215U) Mon Mar 30 2020 20:14:33 EDT [HealthConnect:2.1.0]
IRIS具有JAVA、JDBC环境
可采用PostMan进行测试
2.1.2安装步骤
①建立Rest服务
新建Web应用程序→配置分派类→配置权限。
该步骤可见图片:应用程序运行情况/webaplication(Query).png及webaplication(role).png
②配置SQL-JDBC
建立SQL连接,连接测试数据库Mysql,导入测试jhip_patient_info.sql
③配置查找表
Global-^Ens.LookupTable中查找表文件导入
④导入代码
导入ApplicationCode中的代码,编译,打开Production,
注意:修改BO配置信息(DNS)、配置JavaGateway等
2.2应用流程
2.3应用测试
可采用Postman工具(其他工具也可以)进行测试验证
Postman可导入Query.postman_collection.json,更改IP、端口号信息、URL进行测试。
2.4应用总结
本应用程序以查询患者为案例,采用IRIS中REST API、ObjectScript、Globals 、SQL内置多种模型实现医院信息查询业务。如果有需要可根据此方案丰富业务满足需求。
最后,如果您认可此解决方案,请在系统间多模型数据库竞赛中为该应用程序投票。
投票链接:投票链接
应用程序名称:HealthInfoQueryLayer 点击Vote投票即可。
感谢各位! 集成平台应用典型案例 感谢您的分享
文章
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 · 十月 24, 2022
各位开发者社区的同学们,大家好!
我们的🏆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)之开发
感谢大家的积极参与!
请获奖嘉宾及时通过此链接提交相关信息,以便我们及时与您联系奖品寄送事宜。
问题
Michael Lei · 五月 18, 2021
大家好,首先,为我的无知感到抱歉,但是,由于我是InterSystems领域的新人,因此我产生了以下疑问:考虑数据库迁移。是否可以以非创伤性的方式获取Oracle数据库并将其完全迁移到Caché?
文章
Qiao Peng · 三月 10, 2022
3.1 InterSystems IRIS内码与多语言支持
3.1.1 InterSystems IRIS内码与字符集转换
InterSystems IRIS的内码是UTF-16,因此它支持Unicode多语言字符集。对于其它字符编码,例如UTF-8、GB18030、Big 5,它会自动进行转码。例如对于简体中文,它将GB18030输入数据转换为UTF-16,或者将UTF-16数据转换为GB18030输出。
因为GB18030兼容GB2312,所以InterSystems IRIS也支持GB2312。
注意:在第一篇介绍过,GB18030与GBK并不完全兼容,因此InterSystems IRIS理论上不支持GBK。
InterSystems IRIS如何做字符集编码系统间的转换?它使用2种方式:
对于可以通过算法转换的,例如UTF-8与UTF-16的相互转换,InterSystems IRIS会使用算法转换;
对于无法通过算法转换的,例如与UTF-16的相互转换,InterSystems IRIS会使用I/O转换表转换,它其实是两个映射关系表,一个用于特定字符集转UTF-16、另一个用于UTF-16转特定字符集。
注意,大家可能会注意到,GB18030的I/O转换表里并没有所有的GB18030编码,这是为什么呢?回顾一下第一篇关于GB18030的介绍,它提到了GB18030编码中一部分与Unicode编码非连续相关,而另一部分与Unicode编码连续相关。在InterSystems IRIS的GB18030的I/O转换表,其实只有与Unicode编码非连续相关的那部分编码,就是需要通过对照表关联的部分;而连续相关的那部分,是通过算法转换的,因此不在I/O转换表里。这么做的目的是降低把GB18030这么大的代码表全部加载到内存里的硬件成本。
3.1.2 字符集相关的命令、函数和方法
InterSystems IRIS提供了一系列与字符集相关的命令、函数和方法。它们可以帮助我们理解InterSystems IRIS的字符集处理逻辑、帮忙在字符集相关问题出现时进行排错。
这里以汉字为例介绍这些命令、函数和方法。汉字的UTF-16编码的16进制值是9451、GB18030的16进制值是E861。
ZZDUMP:查看变量16进制编码的命令
例如:我们看一下变量x的16进制值
这里,可以看到变量x保存的是汉字,它的16进制的值是9451。9451就是汉字的UTF-16(Unicode)16进制码。
$ZCONVERT($ZCVT):转码函数
如果需要通过代码控制不同字符集编码间的转换,可以使用$ZCVT函数。例如,我们把上面变量x的字符转码为GB18030编码:
这个例子中,传递给$ZCVT的第一个参数是变量x;第二个参数是“O”,意思是将x的字符编码转码为目标码;第三个参数是要转换的目标编码,“GB18030”。现在变量y的值就是汉字的GB18030编码。
同样,你可以把变量y的GB18030编码再转为IRIS内码UTF-16。这时,第二个参数要设置为“I”,意思是设置源编码;而第三个参数还是“GB18030”:
现在变量z仍是汉字的UTF-16编码。
$ASCII、$WASCII :将字符转为10进制UTF-16码
这两个系统函数将所有字符转为其10进制的UTF-16码。名字有点迷惑,它们并不是获得字符的ASCII码,当然对于ASCII字符,ASCII码和UTF-16码是一样的。
其中$ASCII可以将UCS基本平面的字符转为UTF-16,也就是双字节UTF-16编码。例如汉字的就是这样的:
但那些超过双字节UTF-16的汉字就需要用$WASCII来获取其UTF-16的值了。例如汉字“”,它的UTF-16编码是4字节的D85FDFF9,获取它的UTF-16值,就需要用$WASCII($WA)。当然,也可以全用$WASCII来获取所有字符的UTF-16编码。
$CHAR、$WCHAR: 将10进制UTF-16码转为字符
这两个系统函数将10进制的UTF-16码转为字符。例如:
同样,$CHAR可以转双字节的UTF-16;$WCHAR可以转双字节或四字节的UTF-16。
$ZHEX:将16进制数转10进制数、10进制数转16进制数
上面有些函数处理16进制数、一些处理10进制数,可以用函数$ZHEX做10进制和16进制数的转换。例如:
USER>w $ZHEX("E861")
59489
大家可能对这个函数比较迷惑:只有一个参数,那么怎么知道它是10进制数还是16进制数呢?例如9451,既可以表达一个10进制数,也可以表达一个16进制数。$ZHEX是这么判断的:是以字符串传入的参数(加了双引号的)就是16进制,而以数字传入的参数(没加双引号的)就是10进制。因此会得到这样的结果:
USER>w $ZHEX(9451)
24EB
USER>w $ZHEX("9451")
37969
3.2 常见字符集相关问题
既然InterSystems IRIS支持GB18030-2005,那么还会有中文字符集相关问题吗?还是会有,因为InterSystems IRIS不仅是一个数据库,它的互操作功能会和各种数据源和数据目标连接,接收和发送各种编码的数据。如果数据源/数据目标所声明使用的字符集与其实际使用的字符集不同,或者未声明使用的字符集并且实际字符集和IRIS默认的字符集不符,就会造成问题。这也是绝大多数的InterSystems IRIS相关字符集问题的根源。
所以在InterSystems IRIS中遇到字符乱码问题时,首先应该看一下数据声明的字符集是什么,实际收到数据的字符集是什么。数据声明的字符集信息,可以看上一篇《各种技术对字符集使用的声明》的介绍,而实际收到数据的字符集可以使用Wireshark等工具检查。
下面列举一些常见的字符集相关的问题处理方式:
3.2.1 文件
对于正确编码的文件,InterSystems IRIS都可以正常处理。但如果文件声明的字符集编码与实际的编码不同时,可以使用$ZCVT进行转码。
如果在使用文件(File)或FTP适配器,这2个适配器都会CHARSET设置项,可以使用这个设置项做InterSystems IRIS内码(UTF-16)和真实需要的字符编码间自动做相互转换。
InterSystems IRIS提供了好几个字符文件的操作类:%Library.File、%Library.FileCharacterStream、%Stream.FileCharacter。在使用它们创建文件时,需要注意指明文字字符集,否则默认为ANSI,从而造成生僻字异常。
InterSystems IRIS不同的字符文件操作类,对于字符集的声明稍有差异,如下:
对于%Library.File,在执行Open方法时设置字符集,例如设置为UTF8
Set tFile = ##class(%File).%New("c:\temp\test.txt")
Do tFile.Open("WSN:/IOTABLE=""UTF8""")
对于%Library.FileCharacterStream,设置其TranslateTable属性,或调用TranslateTableSet方法设置
Set tStream=##class(%FileCharacterStream).%New()
Set tStream.Filename="c:\temp\test.txt"
Set tStream.TranslateTable="UTF8"
对于%Stream.FileCharacter,设置其TranslateTable属性,或调用TranslateTableSet方法设置
Set tStream = ##class(%Stream.FileCharacter).%New()
Set tST=tStream.LinkToFile("C:\temp\test.txt")
Set tStream.TranslateTable="UTF8"
另外,还要考虑BOM问题,有些文本编辑器打开没有BOM的UTF-8文件时会显示乱码、而另外一些有BOM反而显示乱码。 对于BOM,%Library.File无法在文件头插入BOM,%Library.FileCharacterStream、%Stream.FileCharacter可以通过设置其BOM属性,例如设置字符集为UTF8,且设置BOM为UTF8的EF BB BF(10进制239 187 191):
Set tStream = ##class(%Stream.FileCharacter).%New()
Set st= tStream.LinkToFile("C:\temp\test.txt")
Set tStream.TranslateTable="UTF8"
Set tStream.BOM=$char(239,187,191)
Do tStream.Write($C(8224))
Do tStream.%Save()
从性能和功能角度,推荐使用%Stream.FileCharacter和%Library.FileCharacterStream,而不是%Library.File。
3.2.2 数据库
通过InterSystems IRIS连接到第三方数据库进行查询或更新数据操作而出现乱码是比较典型的字符集问题。
当遇到问题时,尤其是Oracle数据库时,首先检查一下数据源的内码设置。如果是其内码设置问题,那么通常需要通过$ZCVT来转码。
如果不是内码设置问题,查一下InterSystems IRIS使用什么方式连接到对方数据库:ODBC还是JDBC。如果是JDBC,看看连接字符串中的字符集设置是否正确;如果是ODBC,看看是不是生僻字乱码,如果是可能需要用$ZCVT转码,否则要检查ODBC驱动是否正确,尤其是是否在使用其ODBC3.5的驱动。
3.2.3 HTTP
遇到HTTP相关的字符乱码,首先查一下HTTP头Content-Type的参数charset设置。如果对方没有设置或设置不正确,且对方不能修稿,可以使用$ZCVT转码。
对于使用HTTP适配器的IRIS业务服务,可以通过其CHARSET设置项来配置字符集,并通过"FORCE CHARSET" 设置项强制跳过HTTP头Content-Type的参数charset设置。
3.2.4 SOAP/REST传递的XML字符流/字符串
首先检查下encoding属性的设置。如果它没有设置或设置错误,且不能修改,可以使用$ZCVT转码。
3.2.5 HL7 V2消息
HL7 V2是医疗行业常用的消息协议,InterSystems IRIS提供了大量的工具和特性以支持HL7 V2消息。
如果是HL7 V2传输中出现的中文乱码问题,首先查一下MSH-18的设置。如果数据源没有设置或设置错了,都可以使用InterSystems IRIS数据转换能力先将其修正为正确的值。当然有可能接收目标系统不按MSH-18设置的字符集解码数据,这时,可以按目标系统要求的字符集来编码数据,而忽略MSH-18。
InterSystems IRIS提供了很多工具,可以查看HL7 V2消息或文件的内容, 例如HL7查看器、消息追踪。InterSystems IRIS会按MSH-18设置的值进行数据的解码,当MSH-18值缺失时,默认值是Latin1。如果是因为MSH-18缺失而造成中文显示为乱码,且HL7 V2消息源无法修改时,可以考虑修改EnsLib.HL7.Util.IOFraming的DefCharEncoding(字符集编码默认值)为消息源使用的字符集。
注意,这种乱码情况不会影响HL7消息的接受接收和发送,仅影响显示。
3.2.6 其它
可能还会碰到一些的中文乱码其实是显示问题,尤其是那些仅生僻字显示有问题的情况。
出现这类显示问题的原因是并不是所有的操作系统和IT工具都支持完整的汉字字符集或汉字字形。
例如,常见的字符终端工具仅支持GB2312,所以对GB2312字符集之外的汉字就会显示为一个特定的符号,看起来就像乱码。
而MacOS的Safari浏览器、Pages文稿和很多应用都不能显示一些GB18030字符集的生僻字,例如:
这种情况下,数据本身没有问题,只是显示不正常而已,通常不需要担心。
这就是InterSystems IRIS多语言字符集的支持的主要内容内容。后面我会持续将客户遇到的与字符集相关的典型问题持续更新到文章的末尾,供大家参考。
附录1: 列表类型的中文数据显示乱码?
最近一个客户问了一个中文显示乱码问题。经过查看,发现乱码字段/属性的类型是list of %String,而且使用逻辑模式查看数据。换成ODBC模式或显示模式就没有问题了。原因是列表元素间是有特殊控制字符的,不同显示模式处理列表类型的数据方式不同,详见 显示模式 。对于列表类型的属性/字段,建议通过STORAGEDEFAULT="array" 将其映射为SQL子表,从而更容易通过SQL查看和操作数据,同时对象和global的访问不产生任何影响。例如:
Property MyList as list of %String (STORAGEDEFAULT="array");
文章
jingqi LIu · 三月 3, 2021
在InterSystems IRIS中使用ObjectScript构建REST API。
开发的API可以遵循OPEN API规范,可以使用Docker和VSCode开发,可以部署为ZPM模块,同时也可用作酒店超售系统的Data API。
什么是酒店超售管理系统?
超售管理系统结合了酒店的独特条件,例如房价,订购渠道,客户需求等。系统使用机器学习算法(例如:KNN / ES-RNN ...)来准确预测酒店的每日未入住和入住率,并进一步与收益方程式结合以找到最佳的最大客房销售量,从而可以大大增加酒店的边际收益。
来看看我们的Repo!
https://github.com/BroadCastAir/hotel_api
和
https://github.com/BroadCastAir/Hotel_OverBooking_Sys
投票支持我们的应用程序!
InterSystems IRIS不仅在医疗保健行业,在零售和酒店业中也具有广阔的发展前景。
InterSystems IRIS不仅在医疗保健行业,在零售和酒店业中也具有广阔的发展前景。说的好! 了解了,行业的应用证明了系统的可用性 希望多支持! 这是应用在其他行业中的典型案例,很棒! 看到了酒店行业应用,棒👍
公告
Claire Zheng · 十月 9, 2022
2022年9月5日-10月24日(北京时间),我们正在举办🏆InterSystems开发者社区中文版首届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)!投票截止至10月23日,你的支持与喜爱,是作者获得“开发者社区奖”的关键!如何为你喜欢的作品投票呢?
第一步,你需要成为开发者社区的活跃用户(Active User)
成功注册后,在社区发帖、点赞、回复问题等,接下来需要……等24小时。因为我们的系统会每天进行一次active user的更新。
成为Active user后,就可以给你心仪的项目投票啦!
第二步,点击进入参赛页面🏆InterSystems开发者社区中文版首届技术征文大赛🏆
第三步,在参赛页面查看所有文章,看到感兴趣的文章,就可以点赞点赞,你可以为你喜欢的每篇文章点赞一次。
10月24日,我们将宣布获奖名单!
欢迎大家积极投稿、点赞、分享、学习!
欢迎关注InterSystems开发者社区中文版首届技术征文大赛
文章
Hao Ma · 四月 18, 2021
IRIS相比Caché在部署上的一个进步是支持docker。即便不是云部署, 使用docker也带来非常多的便利。 尤其是在开发测试环节,由于docker的使用更便捷,除非要模拟客户的环境或者做规定的性能测试,我在测试中基本已经不再使用本机的实例或者虚机。IRIS的联机文档有[详细的IRIS docker安装使用指导](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_compose),本文只是一个简单的,快速上手的**在测试环境**安装IRIS docker的简单步骤,尤其适合初学者。
注意Windows上docker可能会遇到这样那样的问题,因此通常还是推荐在Linux或者Mac OS上使用。正式的生产环境的IRIS docker container也是不支持Windows系统的。
> Referrence
- [First Look: InterSystems Products in Docker Containers](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=AFL_containers)
- [Running an InterSystems IRIS Container: Docker Run ExamplesRunning an InterSystems IRIS Container: Docker Run Examples](https://irisdocs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_running_dockerrun)
##1. 在操作系统上安装Docker环境
[Docker官方文档的安装步骤](https://docs.docker.com/engine/install/)非常清晰,我按照上面的步骤在MAC和CentOS上安装docker从来没有出现过问题。恰恰是这个文档中没有的Redhat上的安装,过程中曾碰到过几个问题,在网上搜索了答案,也不算困难。
简单的复述一下步骤:root用户的最简单安装,没有权限问题, 没有docker网络修改等等:
1. 安装yum-util, 用于添加yum源,如果您的系统中已经有了yum-utils包这步可以省略
sudo yum install -y yum-utils
2. 添加docker的Repo到yum源并确认
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum repolist
3. 安装3个docker组件
sudo yum install docker-ce docker-ce-cli containerd.io
4. 启动Docker
sudo systemctl start docker
5. 确认安装成功。'docker run'命令会去本地的库里找'hello-world',没有找到就去网上下一个"images",然后创建一个docker容器给你使用。
sudo docker run hello-world
安装结束您想要到注册一个账户,用来下载上传docker image。 下载命令使用'docker pull', 比如
```
docker pull nginx
```
## 2. 下载IRIS Docker image
在线文档[Container Images Available from InterSystems](https://docs.intersystems.com/components/csp/docbook/Doc.View.cls?KEY=PAGE_containerregistry#PAGE_containerregistry)中介绍了网站上可以下载的IRIS images的列表,其中community版本不需要license,其他的版本需要从InterSystems处获得IRIS docker版的专用license.
下面是登录并下载iris docker image的记录。从网页登录,您会得到docker的登录密码"使用的密码"jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb"。
[root@centos7 ~]# docker login -u="hma" -p="jaRWSBJjcUcNprCKTuMX10PYHNq2IYPrAQoYdp6Siokb" containers.intersystems.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@centos7 ~]# docker pull containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
2020.3.0.304.0: Pulling from intersystems/iris-ml
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
d21839215a64: Pull complete
7995f836674b: Pull complete
841ee3aaa7aa: Pull complete
739c318c2223: Pull complete
d76886412dda: Pull complete
Digest: sha256:4c62690f4d0391d801d3ac157dc4abbf47ab3d8f6b46144288e0234e68f8f10e
Status: Downloaded newer image for containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0
[root@centos7 ~]#
另外,您也可以从InterSystems的技术支持网站下载iris docker的压缩包"iris*.tar.gz",然后使用"docker load"安装, 比如:
CNMBPHMA:~ hma$ docker load -i iris-2020.4.0.524.0-docker.tar.gz
## 3. 创建并运行IRIS Container
###简单的办法
如果是只是简单的测试,可以直接运行,但如果不是community版本的docker, 您还需要把license拷贝到container内部。 比如下面的步骤
CNMBPHMA:~ hma$ docker run -d -i -p 52773:52773 -p 51773:51773 --name iris20204 intersystems/irishealth:2020.2.0.211.0
CNMBPHMA:~ hma$ docker cp iris.key iris20204:/usr/irissys/mgr/iris.key
需要注意的是,不同版本的超级端口可能不同,有些是1972,有些是51773。为了省事,您也许可以使用"-P"把所有container内部的端口都映射出来。
除了要拷贝license到container内部,在做测试的时候,您可能还要经常的使用"docker cp"把各种测试文件拷入container。而且,当查看和修改container内部文件的使用,还需要使用下面的命令进入container内部:
CNMBPHMA:~ hma$ docker exec -it iris20204 /bin/sh
因此,如果是您需要一个经常使用的iris container环境,我还是建议您使用下面的方法。
### IRIS Container使用外部存储
简单的说,下面的命令
- 使用"--volume"参数为container创建外部存储,将host上的"/root/data/dur"文件夹和container内部的"/dur"文件夹链接起来。(/root/data/dur文件夹要在host上手工创建,这只是一个示意,您可以使用任何可用的目录)
- ISC_DATA_DIRECTORY环境设置会在创建iris container时在/dur文件夹下创建一个子目录”/dur/irisepy",所有IRIS运行的日志,客户配置,mgr目录下的用户数据都会保存在这个目录。因为"/dur"是外部存储,即使docker container被删除数据也不会丢失。这对container的重新创建或者iris升级都带来很大的方便。在线文档上对如果覆盖或者升级带有外部存储的iris container有详细的介绍。
- “key"参数定义了在IRIS container创建时会把"/dur/license"目录下的iris.key拷贝到iris安装目录的mgr下并激活。也就是说,在运行命令前, 您需要在host上在"/root/data/dur"目录下创建"license"子目录并将iris.key拷贝进去。
docker run --name irisepy --init -d\
-p 9091:1972 -p 9092:52773\
-v /root/data/dur:/dur\
--env ISC_DATA_DIRECTORY=/dur/irisepy \
containers.intersystems.com/intersystems/iris-ml:2020.3.0.304.0 \
--key /dur/license/iris.key
希望您喜欢使用docker
文章
王喆 👀 · 十一月 17, 2022
经过一段时间的学习和使用本文总结了一些使用VsCode开发的使用方法,本文偏向于应用但会对少量的我知晓的原理进行一部分解释。
参考教程链接:https://cn.community.intersystems.com/node/488611
VSCode下载:https://code.visualstudio.com/
使用VSCode开发的优劣:
1 优势:
跨平台(Windows|MAC|Linux)开发调试远程服务端代码,而且可以快速导出COS代码(M语言也可以)。
SQL辅助查询数据
快捷的代码调试方式,一种是直接在VSCode中调试,另一种是快速复制类名和方法名在Terminal中调试。
代码智能联想补全,类似其它语言,输入开头的前几个字符可以联想后面的。
快速跳转到方法定义(ctrl+鼠标左键 | F12)
主题图标多样化,可以使用默认的黑色,当然也可以使用和studio一样的样式,链接:https://cn.community.intersystems.com/node/516996
2 劣势:
无法导入导出XML文件
缺少一些Studio的常用功能:
SOAP向导
Java网关
DT转换拖拽编写
BP流程拖拽编写
安装步骤
1官网安装Visual Studio Code编辑器
https://code.visualstudio.com/Download
安装直接下一步 - 下一步
2 汉化
如果安装为英文要切换为中文则可以通过Command Palette 中运行Configure Display Language,install another language, 选择中文,再根据提示安装相应的语言插件。
3 扩展安装
打开软件,侧边栏点击扩展按钮->搜索 "InterSystems" -> 安装扩展,如图所示:
前三个是IRIS官方推荐按安装的插件,其中InterSystems ObjectScript Extension Pack (集成好的InterSystems插件包),在此还推荐安装SQL Tools InterSystems IRIS(连接数据库插件,使用效果类似于SQLdbx)
4 配置
VSCode支持图形化的配置,但实测并不好用,而且容易保存失败,在此推荐使用settings.json
打开:设置 -> 扩展 -> InterSystems Server Manager -> settings.json
{
"intersystems.servers": {
"loc": {
"webServer": {
"scheme": "http",
"host": "127.0.0.1",
"port": 52773
},
"askForPassword": false,
"username": "Superuser",
"password":"SYS",
"description":"228"
},
},
"terminal.integrated.detectLocale": "on",
"intersystems.language-server.diagnostics.routines": true,
"editor.renderControlCharacters": false,
"editor.unicodeHighlight.ambiguousCharacters": false,
"git.autorefresh": false,
"git.autoRepositoryDetection": false,
"git.confirmEmptyCommits": false,
"git.confirmForcePush": false,
"git.confirmNoVerifyCommit": false,
"git.confirmSync": false,
"git.countBadge": "off",
"diffEditor.wordWrap": "on",
"editor.wordWrap": "on",
"workbench.colorTheme": "InterSystems Default Dark",
"workbench.editor.enablePreview": false,
"vsicons.dontShowNewVersionMessage": true,
"git.enableSmartCommit": true,
"explorer.confirmDelete": false,
"editor.fontSize": 13,
"objectscript.conn": {
"host": "127.0.0.1", // 连接数据库IP
"port": 57772, // 连接数据库端口
"username": "Superuser", // 用户名
"password": "SYS", // 密码
"ns": "BKlinik", // 命名空间
"active": true, // 是否开启
"https": true,
"server": "bklinik" // intersystems.servers中设置的数据库服务器名
},
"sqltools.connections": [
{
"namespace": "BKlinik",
"connectionMethod": "Server and Port",
"showSystem": false,
"previewLimit": 50,
"server": "localhost",
"port": 52773,
"askForPassword": false,
"driver": "InterSystems IRIS",
"name": "BKlinik",
"username": "Superuser",
"password": "SYS"
}
],
"intersystemsServerManager.credentialsProvider.deletePasswordOnSignout": "never",
}
这是我目前使用的:
intersystems.servers :指的是IRIS的服务器的设置,内部的服务器命名不可大写,相比较官方出具的设置,我增加了【"askForPassword": false, "password":"123456",】此处的增加是方便后面打开代码的时候不需要再输入密码。
5 打开代码
打开代码有两种方式:一种是直连代码打开,另一种是客户端方式连接,第一种相当于studio直接连着代码进行编辑,第二种是把代码下载到本地磁盘的对应目录进行编辑。第一种方式好处是完全无感的查看编辑代码,但是如果不小心删掉之后无法恢复。第二种方式删掉之后可以恢复,而且也可以用GIT等代码版本控制,但是如果多人同时编辑代码,可能会存在冲突覆盖的情况。
直连代码
Instersystems tools – All Servers – 【服务器名】– NameSpace – 命名空间
然后你就可以愉快的编辑代码了
客户端方式打开
首先,你得建立一个文件夹,如图:本文是在D://workspace建立的一个aaa文件
点击打开文件夹 – 选择对应文件
此时会出现一个IRIS的图标,ObjectScript,如图所示:
点击ObjectScript – Choose Server and Namespace – 选择对应的服务器
再选择你需要的命名空间 比如我这边选择的是【HSLIB】
选择你需要编辑的代码 - 右键 - 选择Export
输出的框里会显示导出详情,如下图所示:
等待导出完毕,回到代码编辑,你的代码会出现在src目录下,如图所示:
如果你了解过ZPM的话,你现在还可以在这边添加一个module.xml,方便你把这个代码导入到其它机器上,ZPM相关的知识可以去GitHub上看看,关键就两个命令 [zpm] [load -v 【路径】] 和一个文件的编写,特别好用的是导入发布订阅和查找表,导代码的话得保证你的代码一行都没有问题,如果你的代码在使用的时候跨命名空间做了一些操作的话ZPM也会报错。
如何配置GIT的话,可以通过命令行的方式在本地文件上配置,也可以在VSCode上处理,和其它代码的处理方式差不多。
如果你安装了【SQL Tools InterSystems IRIS】那么上述配置中的sqltools.connections就是你需要的连接配置,你可以尝试改成你自己的库,然后进行一些简单的SQL操作。当然个人还是推荐使用DBeaver,这个更好用。
总结
好了,以上就是如何进行VSCode开发的我的一些小分享,如果有纠正请联系!!!
非常棒的文章! 补充InterSystems使用VSCode开发的官方文档 Welcome to the VS Code InterSystems ObjectScript documentation - InterSystems ObjectScript for VS Code (intersystems-community.github.io) 可以通过下面网址直接打开SOAP 向导页:
{serverurl}/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?Namespace={namespace}
比如:http://localhost:52779/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?Namespace=MyTest
也可以在VSCode里添加用户自定义的快捷键:
"objectscript.conn": {
"links": {
"Portal Explorer": "${serverUrl}/csp/sys/exp/%25CSP.UI.Portal.ClassList.zen?$NAMESPACE=${ns}",
"SOAP Wizard": "${serverUrl}/isc/studio/templates/%25ZEN.Template.AddInWizard.SOAPWizard.cls?$NAMESPACE=${ns}"
},
}
参考文档:https://intersystems-community.github.io/vscode-objectscript/configuration/#server-actions-menu
另:BPL,DTL一般直接在浏览器中进行编辑,完全不需要VSCode。 感谢 感谢 学到了