搜索​​​​

清除过滤器
文章
Jingwei Wang · 九月 20, 2022

在虚拟化环境中使用镜像的注意事项

在虚拟化环境中使用镜像,构成镜像的InterSystems IRIS实例被安装在虚拟主机上,创造了一个混合的高可用性解决方案,将镜像的优点与虚拟化的优点结合起来。镜像通过自动故障切换对计划内或计划外的故障提供即时响应,而虚拟化HA软件在计划外的机器或操作系统故障后自动重新启动承载镜像成员的虚拟机。这允许失败的成员迅速重新加入镜像,充当备份(或在必要时作为主机)。 当镜像被配置在虚拟化环境中时,请参考以下建议: 故障转移成员的虚拟主机和备机不可以配置在同一台物理机上。 为了避免单点存储故障,故障转移成员上的InterSystems IRIS实例所使用的存储应永久隔离在不同磁盘组或存储阵列的独立数据存储中。 在虚拟化平台层面上进行的一些操作,如备份或迁移,可能会导致故障转移成员长时间没有反应,从而导致不需要的故障转移或不理想的警报频率。为了解决这个问题,你可以增加QoS超时设置。 在进行导致故障转移成员连接中断的计划性维护操作时,你可以暂时停止备份上的镜像,以避免不必要的故障转移和警报。 在镜像成员上必须非常谨慎地使用快照管理,因为将一个成员恢复到早期的快照,既会删除该成员的最新状态(例如,自拍摄快照以来,该成员可能已经从主机变为备机),也会删除其他成员仍然拥有的日志数据。 使用虚拟机备份恢复镜像时请特别注意: 被恢复到早期快照的故障转移成员只能从power-off 状态下恢复;从power-on 状态下恢复会造成两个故障转移成员同时作为主机的可能性。 如果被恢复到早期快照的故障转移成员在没有获得自快照以来创建的所有日志数据的情况下成为主要成员--例如,因为它被迫成为主要成员--所有其他镜像成员必须被重建(如需重建镜像,请联系WRC)。
文章
Michael Lei · 十二月 27, 2022

FHIRDrop、FHIRBox - 到 FHIR® 的托管文件传输

一个简单的生产配置,使 FHIR 交易捆绑包能够通过 Box 和 Dropbox 加载到 InterSystems® FHIR® 服务器中。使用包含的 MFT 连接组件和 14 行自定义业务流程,此生产配置会将您的交易捆绑包处理到 FHIR 资源,以便立即使用,就像哈利·波特的魔法一样。 我首先会展示该生产配置的短视频导览、MFT 连接以及 IRIS 上 Box 和 Dropbox 的 Oauth2 应用配置,接下来循序渐进地展示一些步骤,让您使用您喜欢的任何 MFT 供应商以及您选择的任何工作流程、桌面、API 或 Web 控制台拖放操作。 一些陷阱: OAUTH2 回调需要使用 IRIS 的 SSL 端点来提供重定向… 最好在 Health Connect Cloud 上尝试一下! Dropbox for Business 在基于团队的令牌方面面临挑战,个人 Dropbox 则运行良好。 这不是无法忍受的情形,但需要一些耐心。 配置 MFT 连接时,注意 Dropbox 的 baseurl 上的“/”(确保它存在)。 对于 Box 和 DropBox 的路径,MFT 出站适配器都需要具有结尾“/”。 现在,鉴于以上获奖的 OBS 支持的内容可能有不足之处,如果 InterSytems 文档还不够,下面是需要遵循的步骤。 步骤概览: 将 FHIRDrop 或 FHIRBox 应用创建到一个点,然后停止! (协作和倾听) 在您的 InterSystems FHIR 服务器、HealthConnect 或 I4H 上配置 MFT 连接。 完成您的 FHIRDrop 或 FHIRBox 应用,提供来自 MFT 连接的重定向 URL。 授权您的 MFT 连接。 构建您的生产配置。 正常拖放 创建 FHIRDrop 或 FHIRBox 应用 这里的想法是在每个 Box 和 Dropbox 开发者控制台中“开始”您的应用配置,这会让您看到客户端 ID 和客户端密码,然后让选项卡挂起并移动到 IRIS MFT 连接。 (协作和倾听)只需收集您的客户端 ID 和客户端密码,挂起浏览器选项卡,然后继续: 配置 MFT 连接 基 URL:https://api.box.com/2.0 基 URL:https://api.dropboxapi.com/2/(注意结尾斜杠) 完成应用注册 现在,回到应用注册并完成应用。确保插入上述步骤中的重定向 URL,并添加与 file.read、file.write 有关的范围。 授权您的托管文件传输连接 回到您的托管文件传输连接并通过调用“Get Access Token”(获取访问令牌)来“授权”连接。 构建您的生产配置 生产配置 以下是自定义业务流程,生产配置的源代码:https://gitlab.com/isc_cloud/fhir-drop-fhir-box-mft-2-fhir 正常拖放! 现在,获取 FHIR! ![图片](/sites/default/files/inline/images/gar.png)
文章
Louis Lu · 六月 12, 2023

使用 Synthea 生成 FHIR 测试数据

文章相关视频参见Synthea生成FHIR测试数据,以及FHIR服务器加载FHIR资源文件 1. 什么是Synthea Synthea是一个开源软件包,可以模拟生成患者就诊数据。他的github地址在这里。 生成的就诊模版从最初的模拟美国前十种常见病、前十种慢性病到现今超过90种不同的模型。详细模型参见这里。 基于当前版本,Synthea的特性包括: 从出生到死亡的全生命周期 可配置的人口统计学信息(默认为美国马萨诸塞州人口普查数据) 模块化规则系统 插入通用模块 用于附加功能的自定义 Java 规则模块 主要医疗事件就诊、急诊室就诊和症状驱动的就诊 症状、 过敏、药品、 疫苗接种、观察/生命体征、实验室、处置、 护理计划 支持格式 HL7 FHIR(R4、STU3 v3.0.1 和 DSTU2 v1.0.2) ndjson 格式的批量 FHIR(设置 exporter.fhir.bulk_data = true 以激活) C-CDA (设置 exporter.ccda.export = true 以激活) CSV (设置 exporter.csv.export = true 以激活) CPCDS (设置 exporter.cpcds.export = true 以激活) 使用Graphviz可视化呈现规则和疾病模块 支持的参数可见下图 比如 -p 5 生成5条测试数据 -g M 生成男性测试数据 -a 60-65 生成年龄在60-65周岁患者测试数据 2. 使用Synthea 生成测试数据 为了方便使用,也将该软件做成了docker,所以你可以简单的执行下面命令行 docker run --rm -v $PWD/output:/output --name synthea-docker intersystemsdc/irisdemo-base-synthea:version-1.3.4 -p 5 该命令会在当前路径的output文件夹下生成5条患者符合FHIR标准的就诊数据,数据相关摘要信息如下面终端输出: 3. 加载生成的 FHIR 数据至 InterSystems IRIS for Health 生成完FHIR数据后,需要加载到FHIR服务器(FHIR资源仓库)中。 我们在输出目录下可以看到生成7条json数据,其中5条患者就诊相关,1条就诊医院信息,一条参与者(就诊医生)信息。 在InterSystems IRIS for health中可以方便的使用DataLoader类中的方法,批量加载FHIR资源数据,进入FHIR 资源仓库命名空间后执行: zw ##class(HS.FHIRServer.Tools.DataLoader).SubmitResourceFiles("/external/fhir/","FHIRServer","/fhir/r4") 该方法中的第一个参数是fhir资源文件路径; 第二个参数服务类型,这里一般是FHIRServer; 第三个参数FHIRServer的service名称。 执行后显示如下: 之后我们可以进入管理门户,或者使用SQL客户端查询相关存储表,表明数据被正确导入
文章
姚 鑫 · 二月 18

第二十八章 T 开头的术语

# 第二十八章 T 开头的术语 # 以 T 开头的术语 ### 表 (table) **InterSystems SQL** 表是一种由表示特定实体的行和表示每个实体特定数据点的列组成的数据结构。 ### 目标角色 (target role) **系统** 在受保护的 `IRIS` 应用中,由应用程序授予给已经是其他角色(称为匹配角色)成员的用户的角色。如果用户拥有匹配角色,则在使用应用程序时,用户还可以被授予一个或多个额外的目标角色。 ### 目标用户 (target user) **系统** 试图认证到 `LDAP` 服务器的用户。`IRIS` 通过在特定 `LDAP` 配置的“编辑 `LDAP` 配置”页面上的 `LDAP` 唯一搜索属性字段中使用提供的值,尝试在 `LDAP` 数据库中查找该用户。可以从 `LDAP` 配置页面(系统管理 > 安全 > 系统安全 > `LDAP` 配置)访问“编辑 `LDAP` 配置”页面。(请注意,如果启用了 `Kerberos`,页面名称和菜单选项中会包含 `Kerberos`。) ### TCP/IP **通用** 传输控制协议/互联网协议(`Transmission Control Protocol/Internet Protocol`),是可以管理关系客户端和关系服务器之间连接的通信协议之一。也称为 `TCP`。 ### 临时全局 (temporary global) **系统** 存储在临时数据库 `IRISTEMP` 中的全局。请参见临时全局和 `IRISTEMP` 数据库。 ### 终端 (Terminal) **系统** 正式而言,该术语指的是 `Windows` 终端应用程序。非正式而言,该术语也可以指 `ObjectScript shell`,即 `IRIS` 的交互式命令行接口。终端应用程序包括 `ObjectScript shell`,但也提供菜单和其他选项。请参见“使用终端”和“使用 `ObjectScript Shell`”。 ### 事务 (transaction) **通用** 一个逻辑工作单元。应用程序开发人员可以使用 `SQL` 或 `ObjectScript` 命令定义事务。`IRIS` 将事务中对全局的更新记录在日志文件中。如果事务不完整,可以回滚。 ### 瞬态属性 (transient property) **对象(Objects)** 瞬态属性存储在内存中,但不存储在磁盘上。 ### 翻译方法 (translation methods) **对象(Objects)** 翻译方法用于在 `ODBC`、显示、逻辑和存储格式之间转换值。 ### 触发器 (trigger) **InterSystems SQL** 由开发人员定义的一系列操作,在 `SQL` 应用程序或使用 `SQL` 存储的对象应用程序的各个点执行。触发器是由对表执行的 `INSERT`、`UPDATE` 或 `DELETE` 操作启动的数据库操作。触发器有助于维护完整性约束和其他数据依赖关系。
文章
Louis Lu · 六月 10, 2024

类定义中如何使用列式存储

列式存储是 InterSystems IRIS 提供的一项较新的技术。与传统的基于行的存储不同,它通过将数据存储在列而不是行中来优化查询处理,从而实现更快的访问和检索相关信息。 下面是使用SQL创建此类表的例子 CREATE TABLE table (column1 type1, column2 type2, column3 type3) WITH STORAGETYPE = COLUMNAR -- ex 1 CREATE TABLE table (column1 type1, column2 type2, column3 type3 WITH STORAGETYPE = COLUMNAR) -- ex 2 我们知道InterSystems IRIS 是支持多模型的DMBS, 它可以无缝的通过关系型或对象的方式访问通一数据, 我们使用下面的方式在使用Object Script类定义的时候定义列存储: 1. 如果你想对类中的所有属性都定义为列存储,则直接通过在类中添加parameter 的方式实现: Parameter STORAGEDEFAULT = "columnar" 如前面的例子,我们使用object script定义就会是这样: Class Post.Address Extends %Persistent [Final] { Parameter STORAGEDEFAULT = "columnar"; Parameter USEEXTENTSET=1; Property City As %String(MAXLEN = 12); Property ZIP As %String(MAXLEN = 9); Property Country As %String(MAXLEN = 12); } 其中 Parameter STORAGEEDFAULT = "columnar" 告诉系统,所有数据都以列的方式保存(意味着每一列都有其自己的global节点) Parameter USEEXTENTSET = 1 告诉系统,为了生成的效率,hashed 的global 使用短名称命名。 你可以将任意表定义为使用列存储。但是将列存作为默认存储模式的表,必须添加Final 或 NoExtent 的类关键字,也就是不能再被继承。 2. 也可以仅对表中的某些字段定义为使用列式存储,要实现此种设计进需要在属性上添加 STORAGEDEFAULT = "columnar" Class Post.Address Extends %Persistent { Parameter STORAGEDEFAULT = "row"; Parameter USEEXTENTSET=1; Property City As %String(MAXLEN = 12); Property ZIP As %String(MAXLEN = 9); Property Country As %String(MAXLEN = 12, STORAGEDEFAULT = "columnar"); } 这个例子中的City 和 ZIP 仍使用行式存储,也就是数据会存储在global ^Post.AddressD 中,而Country会以列式的方式存储在不同的global节点中。 在这个例子中,使用列式存储会是一个更好的方法,因为如果我们有一个包含不同国家不同城市的数据库,国家的数目是有限的,而城市的数目则不是。 3. 还可以对现有行存储的类,针对某些字段添加列式索引 Class Sample.BankTransaction Extends %Persistent [ DdlAllowed ] { // Line below is optional Parameter STORAGEDEFAULT = "row"; Property Amount As %Numeric(SCALE = 2); Index AmountIndex On Amount [ type = columnar ]; . . . } 在这个例子中,金额这样的数字类型字段,使用行式存储,但对其建立列式索引,会极大提高针对该字段的统计类sql查询效率,比如SUM、Avg等。
文章
姚 鑫 · 七月 17, 2021

第六章 使用%File对象

# 第六章 使用%File对象 如果想要操作文件本身,需要使用`%Library.File`的`%New()`方法实例化`%File`对象。该类还提供了允许使用该文件的实例方法。 注意:本节提供了几个使用`%File`对象的示例,以供说明。 对于简单的文件读写,使用`%Stream.FileCharacter`和%`Stream.FileBinary`。因为它们提供了额外的功能,例如,以正确的模式自动打开文件。 ## 创建%File对象的实例 要使用文件,需要使用`%New()`方法实例化表示该文件的%File对象。该文件可能已经存在,也可能不存在于磁盘上。 以下示例在默认目录中为文件`export.xml`实例化一个%File对象。 ```java set fileObj = ##class(%File).%New("export.xml") ``` ## 打开和关闭文件 实例化`%File`对象后,需要使用`open()`方法打开文件,以读取或写入该文件: ```java USER>set status = fileObj.Open() USER>write status 1 ``` 使用`Close()`方法关闭文件: ```java USER>do fileObj.Close() ``` ## 检查%File对象的属性 一旦实例化了文件,就可以直接检查文件的属性。 ```java USER>write fileObj.Name export.xml USER>write fileObj.Size 2512 USER>write $zdate(fileObj.DateCreated) 11/18/2020 USER>write $zdate(fileObj.DateModified) 11/18/2020 USER>write fileObj.LastModified 2020-11-18 14:24:38 USER>write fileObj.IsOpen 0 ``` 请注意,`LastModified`是人类可读的时间戳,而不是`$H`格式的日期。 属性“大小Size”、“创建日期DateCreated”、“修改日期DateModified”和“最后修改日期LastModified”是在访问时计算的。为不存在的文件访问这些属性会返回-2,表示找不到该文件。 注意:Windows是目前唯一跟踪实际创建日期的平台。其他平台存储最后一次文件状态更改的日期。 ```java USER>write ##class(%File).Exists("foo.xml") 0 USER>set fooObj = ##class(%File).%New("foo.xml") USER>write fooObj.Size -2 ``` 如果文件已打开,可以通过访问`CanonicalName`属性来查看其规范名称,这是根目录的完整路径。 ```java USER>write fileObj.CanonicalName USER>set status = fileObj.Open() USER>write fileObj.IsOpen 1 USER>write fileObj.CanonicalName c:\intersystems\IRIS\mgr\user\export.xml ``` ## 从文件中读取 要读取文件,可以打开文件,然后使用`Read()`方法。 以下示例读取`messages.log`的前`200`个字符。 ```java USER>set messages = ##class(%File).%New(##class(%File).ManagerDirectory() _ "messages.log") USER>set status = messages.Open("RU") USER>write status 1 USER>set text = messages.Read(200, .sc) USER>write text *** Recovery started at Mon Dec 09 16:42:01 2019 Current default directory: c:\intersystems\IRIS\mgr Log file directory: .\ WIJ file spec: c:\intersystems\IRIS\mgr\IR USER>write sc 1 USER>do messages.Close() ``` 要从文件中读取整行,请使用`ReadLine()`方法,该方法继承自`%Library.File`的父类`%Library.AbstractStream`。 下面的示例读取`E:\temp\new.txt`的第一行。 ```java /// desc: 读取数据 /// w ##class(Demo.FileDemo).ReadFileData("E:\temp\new.txt") ClassMethod ReadFileData(str) { s fileObj = ##class(%File).%New(str) s status = fileObj.Open("RU") w status,! s text = fileObj.ReadLine(,.sc) w text,! w sc,! d fileObj.Close() q "" } ``` ## 写入文件 要写入文件,可以打开文件,然后使用`Write()`或`WriteLine()`方法。 以下示例将一行文本写入新文件。 ```java /// desc: 写入数据 /// w ##class(Demo.FileDemo).WriteFileData("E:\temp\new.txt") ClassMethod WriteFileData(str) { s fileObj = ##class(%File).%New(str) s status = fileObj.Open("RUWSN") w status,! s status = fileObj.WriteLine("Writing to a new file.") w status,! w fileObj.Size,! d fileObj.Rewind() s text = fileObj.ReadLine(,.sc) w text,! q "" } ``` ## 倒回文件 从文件读取或写入文件后,希望使用`Rewind()`方法倒回文件,以便可以从文件开头执行操作。 从上一个示例停止的地方开始,`fileObj`现在位于其末尾。倒回文件并再次使用`WriteLine()`会覆盖该文件。 ```java USER>set status = fileObj.Rewind() USER>write status 1 USER>set status = fileObj.WriteLine("Rewriting the file from the beginning.") USER>write status 1 USER>write fileObj.Size 40 ``` 关闭文件并重新打开它也会倒回文件。 ```java USER>do fileObj.Close() USER>set status = fileObj.Open("RU") USER>write status 1 USER>set text = fileObj.ReadLine(,.sc) USER>write sc 1 USER>write text Rewriting the file from the beginning. ``` ## 清除文件 要清除文件,可以打开文件,然后使用`Clear()`方法。这将从文件系统中删除该文件。 以下示例清除默认目录中的`junk.xml`。 ```java USER>write ##class(%File).Exists("junk.xml") 1 USER>set fileObj = ##class(%File).%New("junk.xml") USER>set status = fileObj.Open() USER>write status 1 USER>set status = fileObj.Clear() USER>write status 1 USER>write ##class(%File).Exists("junk.xml") 0 ```
文章
Nicky Zhu · 一月 11, 2021

类、表和Globals——工作原理

当我向技术人员介绍InterSystems IRIS时,我一般会先讲其核心是一个多模型DBMS。 我认为这是其主要优势(在DBMS方面)。数据仅存储一次。您只需访问您想用的API。 - 您想要数据的概要?用SQL! - 您想用一份记录做更多事情?用对象! - 想要访问或设置一个值,并且您知道键?用Globals! 乍一看挺好的,简明扼要,又传达了信息,但当人们真正开始使用InterSystems IRIS时,问题就来了。类、表和Globals是如何关联的?它们之间有什么关系?数据是如何存储的? 本文我将尝试回答这些问题,并解释这些到底是怎么回事。 ## 第一部分 模型偏见 处理数据的人往往对他们使用的模型有偏见。 开发者们把数据视为对象。对他们而言,数据库和表都是通过CRUD(增查改删,最好是基于ORM)交互的盒子,但底层的概念模型都是对象(当然这对于我们大多数使用面向对象编程语言的开发者来说没错)。 而DBA大部分时间都在搞关系型DBMS,他们把数据视为表。对象只是行的封装器。 对于InterSystems IRIS,持久类也是一个表,将数据存储在Global中,因此需要进行一些澄清。 ## 第二部分 举例 假设您创建了类Point: ```objectscript Class try.Point Extends %Persistent [DDLAllowed] { Property X; Property Y; } ``` 您也可以用DDL/SQL创建相同的类: ``` CREATE Table try.Point ( X VARCHAR(50), Y VARCHAR(50)) ``` 编译后,新类将自动生成一个存储结构,将原生存储在Global中的数据映射到列(对于面向对象开发者而言,是属性): ``` Storage Default { %%CLASSNAME X Y ^try.PointD PointDefaultData ^try.PointD ^try.PointI ^try.PointS %Library.CacheStorage } ``` 这是怎么回事? 自下向上(加粗文字很重要): - Type: 生成的存储类型,本例中是持久对象的默认存储 - StreamLocation - 存储流的Global - IndexLocation - 索引Global - IdLocation - 存储ID自增计数器的Global - **DefaultData** - 存储将Global值映射到列/属性的XML元素 - **DataLocation** - 存储数据的Global 现在我们的DefaultData是PointDefaultData,让我们分析下它的结构。本质上Global节点有这样的结构: - 1 - %%CLASSNAME - 2 - X - 3 - Y 所以我们可能期望我们的Global是这样的: ``` ^try.PointD(id) = %%CLASSNAME, X, Y ``` 但如果我们输出 Global 它会是空的,因为我们没有添加任何数据: ``` zw ^try.PointD ``` 让我们添加一个对象: ``` set p = ##class(try.Point).%New() set p.X = 1 set p.Y = 2 write p.%Save() ``` 现在我们的Global变成了这样 ``` zw ^try.PointD ^try.PointD=1 ^try.PointD(1)=$lb("",1,2) ``` 可以看到,我们期望的结构%%CLASSNAME, X, Y是用 $lb("",1,2) 设置的,它对应的是对象的X和Y属性(%%CLASSNAME 是系统属性,忽略)。 我们也可以用SQL添加一行: ``` INSERT INTO try.Point (X, Y) VALUES (3,4) ``` 现在我们的Global变成了这样: ``` zw ^try.PointD ^try.PointD=2 ^try.PointD(1)=$lb("",1,2) ^try.PointD(2)=$lb("",3,4) ``` 所以我们通过对象或SQL添加的数据根据存储定义被存储在Global中(备注:可以通过在PointDefaultData 中替换X和Y来手动修改存储定义,看看新数据会怎样!)。 现在,如果我们想执行SQL查询会怎样? ``` SELECT * FROM try.Point ``` 这段sql查询被转换为ObjectScript代码, 遍历^try.PointD,并根据存储定义(其中的 PointDefaultData 部分)填充列。 下面是修改。让我们从表中删除所有数据: ``` DELETE FROM try.Point ``` 看看我们的Global变成什么样了: ``` zw ^try.PointD ^try.PointD=2 ``` 可以看到,只剩下ID计数器,所以新对象/行的ID=3。我们的类和表也继续存在。 但如果我们运行会怎样: ``` DROP TABLE try.Point ``` 它会销毁表、类并删除Global。 ``` zw ^try.PointD ``` 看完这个例子,希望您现在对Global、类和表如何相互集成和互补有了更好的理解。根据实际需要选用正确的API会让开发更快、更敏捷、bug更少。
文章
Lilian Huang · 七月 20, 2022

FHIR 中的问卷和表格(Questionnaire & Forms):从创建到使用

本文将讨论 FHIR 中的问卷和问卷反馈(Questionnaire and Questionnaire Response), 从创建表单到上传到服务器以及如何填写它们。 tl;dr : 通过使用该工具链接“ this online tool” ,您可以轻松的开始构建您自己的表单,或者使用现有模版。 通过使用InterSystems 本地FHIR 服务器链接“ this InterSystems local FHIR server” ,您可以轻松的存储您的FHIR资源和问卷。 通过使用此应用程序“this app” ,您可以像医生一样操作,对您的 FHIR 服务器上的每位患者进行问卷调查和回复。 需要注意的是,该应用程序不使用 Content-Type 'application/json+fhir' 进行通信,而只是使用 Content-Type 'application/json' ,所以它不会像我们的本地 InterSystems FHIR 服务器那样工作。 这就是为什么我创建了这个 GitHub 存储库“this GitHub repo”,其中包含应用程序的修改版本,使用 Content-Type 'application/json+fhir',拥有本地 FHIR 服务器和指向问卷生成器工具的链接以及一些解释。 克隆 repo 后,通过执行 docker-compose up -d, npm ci, npm run build 然后出现 npm run start ,您将可以访问该应用程序,通过选择您想要的 FHIR 服务器和您想要工作的患者使用,您将能够填写调查问卷并将其保存到您的服务器中,只需单击 2 次。 End of tl;dr 接下来是 GitHub 的自述文件。 1. 使用本地 fhir 服务器的 FHIR 表单应用程序包括如下 1. App for FHIR forms using a local fhir server(使用本地 fhir 服务器的 FHIR 表单应用程序) 2. Requirements(要求) 2.1. Add Node.js and npm to your path(将 Node.js 和 npm 添加到您的路径) 2.2. Install Dependencies(安装依赖项) 3. Local FHIR server(本地FHIR服务器) 4. Using the app(使用应用程序) 4.1. Build the application(构建应用程序) 4.2. Run the Application(运行应用程序) 5. FHIR form / questionnaire (FHIR表格/问卷) 5.1. Creating your own FHIR form(创建您自己的 FHIR 表单) 5.2. Importing your FHIR form(导入您的 FHIR 表格) 这是一个基于此“this repo”的应用程序,可用于显示, “FHIR” “SDC” “Questionnaire”并收集数据作为 FHIR 问卷反馈的资源。 通过使用docker-compose up -d ,您将可以访问本地 FHIR 服务器“local FHIR server” 然后可以使用该服务器来测试应用程序。 2. 要求 该应用程序依赖于“LHC-Forms “ 渲染,用于显示表单的小部件,它支持部分 FHIR 问卷(版本 STU3 和 R4) 和结构化数据捕获实现指导“Structured Data Capture ImplementationGuide“。此小部件将与依赖项一起安装。 为可以尝试一些示例表单,这个库里在这个下面e2e-test/data/附带了一些表单, 会在构建时自动加载到本地 FHIR 服务器。 2.1. 将 Node.js 和 npm 添加到您的路径 文件 bashrc.lforms-fhir-app 指定了我们正在为开发使用的 Node.js 的版本,下载Node.js的该版本,并将其 bin 目录添加到你的路径。 2.2. 安装依赖项 通过运行此命令,您将能够安装应用程序运行所需的一切。 npm ci 3. 本地FHIR 服务器 如果您没有 FHIR 服务器来试用此应用程序,您可以在 fhir-form 文件夹中启动并使用由 InterSystems 技术支持的本地 FHIR 服务器: docker-compose up -d 等待一段时间后,您的本地 FHIR 服务器已启动,您可以使用 http://localhost:32783/fhir/r4请注意,此链接已在应用程序中注册。 4. 使用应用程序 要使用该应用程序,您必须构建“build” 并启动“start” 它。您现在可以使用应用程序的菜单访问您选择的任何 FHIR 服务器,但如果您愿意,您可以使用此本地 FHIR 服务器“ local FHIR server”。 4.1. 构建应用程序 npm run build 这将在“dist”目录中创建用于生产的文件,但也会从node_modules 复制一些需要的文件中。 4.2.运行应用程序 npm run start 将启动一个在 8000 端口运行的 http 服务器。 现在在localhost:8000/lforms-fhir-app/浏览到应用程序。 在这里您可以选择要连接的服务器。 如果要使用本地 FHIR 服务器,请启动本地 FHIR 服务器“start the local FHIR server”, 然后在应用程序上选择第一个选项 http://localhost:32783/fhir/r4 5. FHIR表格/问卷 5.1. 创建您自己的 FHIR 表单 通过使用这个在线工具“this online tool”, 您可以轻松地从头开始构建自己的表单或使用现有的表单。 我们建议您导入 e2e-tests/data/R4 文件夹中现有的一个,然后从这里开始了解该工具的工作原理。 5.2. 导入您的FHIR表格 使用该应用程序,您可以轻松导入本地表单并使用上传按钮upload 立即使用它们。 如果您使用的是工具”formbuilder tool “, 如果您有支持Content-Type 'application/json' 的 FHIR 服务器,则可以使用导出按钮将您正在创建的表单直接导出到 fhir 服务器。 如果您的服务器不支持 Content-Type 'application/json' 而只支持 Content-Type 'application/json+fhir' 例如,作为我们的本地 FHIR 服务器“local FHIR server “,您必须将表单导出到文件,然后在应用程序上 ,将文件上传到服务器,因为应用程序以 Content-Type 'application/json+fhir' 进行通信。 原文请点击该链接:https://community.intersystems.com/post/questionnaire-forms-fhir-creation-usage#3-local-fhir-server
文章
Hao Ma · 一月 4, 2023

IRIS, Caché监控指导 - 系统健康检查

以下是我们应客户的要求拟定的Caché系统健康检查的建议。InterSystems的工程师们认为其中的项目足以了解客户当前的系统健康状况。 这些项目中有些,比如Buttons, pButtons报告是必须的,其他内容,尤其是问卷部分,越多回答对系统健康的了解也越清楚。InterSystems公司的技术支持中心WRC(World Response Center),在合适的条件下可以协助用户解读健康检查的结果。 在后面的内容中, 我会详细介绍这些检查的项目,比如报告的执行步骤,已经如何简单的发现问题。 检查的内容也适用于IRIS,仅仅是执行的步骤上有细微的区别,后面文章会详细说。 ## 健康检查项目 本健康检查只用于Caché系统本身的内容, 不包括Caché上使用的各种应用。 建议用户收集下列两部分数据和资料: ### 系统运行数据 - [ ] 所有Caché实例服务器的网络架构图,包含所有的数据服务器,应用服务器,镜像服务器,灾备服务器。还应该包含网段的划分, 相关的Web服务器,负载均衡设备的部署等情况。以及一切客户认为和Caché工作相关的网络配置的情况。 - [ ] Caché数据库使用的存储设备的信息, 不限于类型,大小,品牌等等任何可以帮助了解存储设备的信息。 - [ ] 所有数据库上一次的完整性检查报告。 - [ ] 所有Caché实例的 - [ ] 系统监控检查报告(Buttons) - [ ] 24小时系统性能报告(pButtons): 所有关联的系统,比如一个Caché数据服务器以及和它连接的应用服务器(ECP服务器),应该在尽量相同的时间执行24小时pButton测量 - [ ] 一年内或自上次启动后(以其中更长时间为准)的Console日志 - [ ] 导出的日常任务(Task) - [ ] 导出的后台任务历史列表 - [ ] 系统时钟同步的配置 - [ ] 所有CSP Gateway的配置文件,以及CSP Gateway工作的Apache Web Server, Nginx Web Server,Windows IIS的配置文件。 - [ ] 如果用户使用了外部备份,请提供外部备份的操作步骤及使用的脚本程序。 ### 维护工作的问卷 以下问题的回答能帮助InterSystems的工程师更好的了解客户的Caché工作情况,以及更方便的分析上面采集的数据。 - [ ] 请列出近一年内Caché的软硬件变动 - [ ] 是否有测试环境(TestBed), 测试服务器的梳理,配置 - [ ] 请提供Caché的日常维护的情况说明,尽可能提供以下日常维护的方案,执行频率,执行时长等等。包括但不限于: - [ ] 备份恢复 - 方案,Caché在线备份还是外部备份。如果是Caché在线备份,各种备份类型的安排情况(全备份,增量备份,累计备份) - 执行频率,执行的时间点 - 各种数据量情况下的执行时长,不如全备份的时长,增量备份的数据量是多少,执行时长是多少等等 - [ ] 数据库完整性检查 - 完整性检查的方案,频率 - 数据库的大小及对应的完整性检查的执行时长 - [ ] 告警通知 - 告警通知发送的方式。(告警通知默认是Console log里严重级别为2,3的条目) - 告警通知的处理流程 - 告警通知的产生:是否有客户定制的通知消息 - Console Log中出现的严重级别为1的消息(Warning消息)是否被通知,或者是否有任何处理方式 - [ ] 性能测量 - 提供业务活动量在一段时间内的变动模式, 比如一周,一天中业务量的忙时,闲时,以及是否月初活着月底有大的报表生成等等 - 详细列出各种周期性执行的和Caché性能相关的操作的时间点和时长,处了上面提到的备份恢复,数据库完整性检测等,还可以是任意的Caché操作,以及Caché所在的虚拟机,服务器的操作,还可以包括可能影响Caché性能表现的连接的第3方的业务系统监控系统,审计系统的与之有关的操作 - 是否有常规的性能测试方案,包括Caché上的指标测量(pButtons), 以及操作系统的性能指标测量 - 无论以何种形式,是否能提供Caché系统的性能基准。这个性能基准应该以客户的业务活动量做为采样周期,比如以周为单位 - 上述指标是否能提供图表的展示 - [ ] 尽可能的提供近一年中在Caché日常维护中遇到的各种故障及异常的列表。对列表中的每一项,尽量提供详细的描述和信息,包括并不限于: - 是否报告InterSystems, 如果报告了, WRC号码是多少 - 发生的频率如何? - 如果已经有解决,解决的方案是什么? - 如果没有经过人工处理,那么故障恢复的时长平均是多少? - 维护工程师对故障产生的原因以及造成后果的分析讨论的结果,如果有。 - [ ] 其他内容(可选) - Caché维护团队的工作分配, 以及相关的外部团队的职责,比如应用实施方,用户的其他IT团队,硬件维护,硬件监控团队等等。 - 对Caché维护最期待的改进,工具的提供等 - 其他任何有关Caché维护工作而上面各项中未涵盖的内容。
文章
Michael Lei · 五月 24, 2021

大数据平台的五个等级

作为一个软件架构师,如果要设计一个企业级的架构来满足当前的业务需求时,你需要达到5级的水平,这是一个巨大的挑战。有了InterSystems IRIS。这是有可能的。通过1个产品,你可以得到SQL + NoSQL + ESB + BI + Open Analytics + Real Time Virtual cubes + NLP + AutoML + ML(使用Python)和高级云支持 + Sharding支持。 以Oracle为例,你需要Oracle数据库+ Oracle NoSQL+ Oracle BI+ Oracle SOA套件+一些附加组件,如R、Partitioning和RAC以及一些Oracle云产品的NLP和AI功能。对于开源架构、IBM或者其他友商来说,也是类似的,你需要的组件只可能更多。 医疗机构在数字化转型在技术上最大的挑战之一,就是技术栈过于丰富、快速变化以及对人的技术要求很高(这也是为什么全栈工程师最值钱的原因);一个统一、高效、稳定、现代化、专为医疗定制的一体化数据平台能帮助客户很好地解决这个问题。IRIS for Health 是您的不二选择。
文章
Michael Lei · 六月 1, 2022

部分IRIS-2022-年度编程大奖赛作品展示——定制化 IRIS 互操作production的监控页面

InterSystems Production 监控是管理门户中的一个页面,用于显示当前运行的Production监控信息。我喜欢这个页面的样子,但这并不适合所有人。 2022年5月13日,我在开发者社区上看到这个帖子。 https://community.intersystems.com/post/creating-custom-monitoring-page 我同意马克的观点,Production监控很复杂。我想创建一个更漂亮干净的监控页面。 我开始着手制作一个利用类方法提供Production数据的 CSP(Cache Server Page)页面。 我与马克分享了我的第一次尝试。他根据自己的想法定制了这个页面。我喜欢他对页面的布局,使其在视觉上更有吸引力。我把他的设计整合到我的应用程序Production监控中。 我看到马克对业务服务的显示进行了过滤,只显示需要注意的服务。他在页面的底部添加了服务器的名称和它的镜像状态。 你可以在Open Exchange和当前的竞赛中找到我的Production监控器的应用。 https://openexchange.intersystems.com/package/production-monitor
公告
Claire Zheng · 十一月 22, 2021

欢迎段海华——我们开发者社区中文版的新版主!

大家好! 我们很高兴地向大家介绍我们开发者社区中文版的新版主——段海华( @Duan.Haihua)! 让我们以热烈的掌声欢迎段海华( @Duan.Haihua),以下是他的个人介绍。 段海华,东华医为利润中心副主管 以下是他的个人介绍 @Duan.Haihua: – 我主持参加了多家医院的互联互通评审工作,并主持了互联互通成熟度测评(Health Information Connectivity Maturity Evaluation, HICME)工具的开发与维护。我有丰富的基于InterSystems产品和项目工作经验,对互联互通测评相关标准有较深刻的理解。 – 通过开发者社区,我希望能够帮助刚开始接触互联互通标准的开发者快速理解相应内容,分享互联互通测评过程中常见问题的解决方案,为开发者对系统标准化改造过程提供参考意见。 热烈欢迎! 感谢段海华的付出( @Duan.Haihua)!我们相信你会成为一名优秀的版主! 👏🏼 热烈欢迎👏!!!
文章
Michael Lei · 八月 18, 2022

使用csvgen从文件或URL地址中以编程方式导入CSV

Hi 社区的朋友们,大家好! 有时我们需要以编程方式自动将CSV数据从文件或者UR网址L导入到InterSystems IRIS。我们希望创建具有适当数据类型的类并导入数据。 我在Open Exchange上发布了一个模块csvgen,它正是这样做的。 如果你只需要将CSV文件导入IRIS,你可以这么做: USER>do ##class(community.csvgen).Generate("/usr/data/titanic.csv",,"Data.Titanic") Class name: Data.Titanic Header: PassengerId INTEGER,Survived INTEGER,Pclass INTEGER,Name VARCHAR(250),Sex VARCHAR(250),Age INTEGER,SibSp INTEGER,Parch INTEGER,Ticket VARCHAR(250),Fare MONEY,Cabin VARCHAR(250),Embarked VARCHAR(250) Records imported: 891 USER> 或者你的CSV文件在互联网上, 例如GitHub上面的新冠疫情数据 你可以这样获得数据: USER>d ##class(community.csvgen).GenerateFromURL("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/05-29-2020.csv",",","Data.Covid19") Class name: Data.Covid19 Header: FIPS INTEGER,Admin2 VARCHAR(250),Province_State VARCHAR(250),Country_Region VARCHAR(250),Last_Update DATE,Lat MONEY,Long_ DOUBLE,Confirmed INTEGER,Deaths INTEGER,Recovered INTEGER,Active INTEGER,Combined_Key VARCHAR(250),Incidence_Rate DOUBLE,Case-Fatality_Ratio DOUBLE Records imported: 3522 USER> Installation安装 从ZPM安装: USER>zpm zpm:USER>install csvgen csvgen 模块是打包了 CSV2CLASS method . ObjectiveScript 的profile还不是很理想,欢迎各种建议意见。谢谢!
文章
Jeff Liu · 五月 15

一些 FHIR 互操作性适配器示例

各位开发者,大家好! 或许您不得不实现一些场景,这些场景不需要 FHIR 仓库但需要转发 FHIR 请求、管理响应,并且可能运行转换或在两者之间提取一些值。 在这里,您会找到一些可以使用 *InterSystems IRIS For Health* 或 *HealthShare Health Connect* 实现的示例。 在这些示例中,我使用了具有 [FHIR 互操作性适配器](https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=HXFHIR_fhir_adapter)和 `HS.FHIRServer.Interop.Request` 消息的互操作性生产配置。 第一个场景从头开始构建 FHIR 请求(可以来自文件,也可以来自 SQL 查询),然后将其发送到外部 FHIR 服务。![图片](/sites/default/files/inline/images/scenario-fhirclient-file-simple.png) 下一个场景是一种 FHIR 传递,用于将请求和响应传递到外部 FHIR 仓库,另外还管理 OAuth 令牌。![图片](/sites/default/files/inline/images/scenario-fhirserver-passthrough.png) 最后一个场景包括接收 FHIR 请求,然后将其转发到外部 FHIR 服务,但会提取信息或更改其间的某些字段。![图片](/sites/default/files/inline/images/scenario-fhirservice-handler.png) 您将在 Open Exchange 应用程序中找到实现细节 :) 希望这对您有用!
问题
water huang · 四月 22, 2021

m里面如何获取cpu的序列号?

m 里面如何获取cpu的序列号? 可以调用操作系统的命令来获取CPU序列号。例如在Cache' for Windows上,可以执行:SAMPLES>s args=3SAMPLES>s args(1)="CPU"SAMPLES>s args(2)="get"SAMPLES>s args(3)="ProcessorID"SAMPLES>d $ZF(-100,"","wmic",.args)ProcessorId0FABFBFF000506EX0FABFBFF000006EX0FABFBFF000006EX0FABFBFF000006EX 乔工,请问 $zf函数的使用,在哪里可以查询到它的所有使用说明 InterSystems Cache'InterSystems IRIS 刚才试了一下,这个不行呢 感谢你的回答 但是我用的是ensemble2016 是Windows吗?在Windows命令行,执行wmic CPU get ProcessorID,能得到CPU序列号吗? Ensemble 2016有点久,没有$ZF(-100)。用$ZF(-1): https://cedocs.intersystems.com/ens20161/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_fzf-1#RCOS_B80417 是Windows,在Windows命令行,执行wmic CPU get ProcessorID,能得到CPU序列号 刚才试了 还是不行 用$ZF(-1), 可以将OS命令输出保存到文件里。例如:w $ZF(-1,"wmic CPU get ProcessorID > c:\temp\cpuinfo.txt") 系统是windows 10 试了,不行,返回的值是1 返回值是1,说明报错了。确认一下是否OS命令写正确了。另外,输出不是看返回值,是看输出的文件 我直接复制的你写的这个命令。