文章 Shengzhi Wu · 十月 28 13m read

🏆 比赛投票进行中(截止美东时间 11 月 15 日)。如果这篇文章对你有用,欢迎在 Open Exchange 上给 PaymentGuard AI 投一票——在列表里找到 PaymentGuard AI 点 Vote 即可。

在线体验:http://43.139.159.100:8082/paymentguard/

——仪表盘、REST API 与背后的互操作生产全程在线,灰色地带决策由 DeepSeek 实时作出。

本文是英文参赛文章的中文版。源码:github.com/Dylan5237/payment-guard-ai。

以下是正文:


支付授权,本质上是个决策问题。

大多数支付没什么可纠结的:老客户、熟悉的金额、常用的设备,几条确定性规则微秒级就能放行或拦下。真正难的是中间那片灰色地带——新设备、不常见的国家、比平时高出一截的金额、KYC 还没过审的客户。人工分析师的时间基本都耗在这里,而这恰恰是大模型 Agent 能帮上忙的地方——前提是它手里有真工具,查得到真数据。

PaymentGuard AI 做的事就这么直接:把一个真实的 IRIS AI Hub Agent(%AI.Agent)当成一个业务操作,塞进一条普通的互操作生产里。

0
1 33
InterSystems开发者社区
与开发者和专家交流,提出问题、寻找答案,并分享有关 InterSystems 技术、产品和解决方案的知识。 了解更多
29,004 名开发者,社区仍在不断壮大
文章 pan John · 十月 28 16m read

为什么同一个人有两条记录,名字却不同?当相似的记录包含相互冲突的标识符时,系统应如何处理?当关键信息缺失时,系统应给出建议,还是应向来源方索取更多证据?

这些问题促使我开发了“患者身份冲突审查助手”。我希望在互操作性工作流中嵌入一个人工智能代理,供人工审查并可随时暂停。该代理负责收集证据并推荐处理方案;而人工审查员则负责授权记录之间的关联。

该应用程序使用了InterSystems IRIS Community AI Hub EAP 版本 154 中的原生 ObjectScript SDK。本文描述的是 pi-review1.1.0版本(提交编号 ab53930)。 所有案例和源数据均为合成数据,与任何医院均无关联。模型使用情况来自保存的实时呼叫记录。

项目链接:GitHub 代码库·Open Exchange 应用程序 (1.1.0)·带版本号的安装指南。下文所述的实现基于已固定的 1.1.0 源代码。

从一个缺失数据案例开始

合成案例 c6 最初缺少身份标识符和出生日期。一名操作员明确启动了调查。代理读取了该案例,验证了其来源,检索了治理规则,并返回了 NEEDS_DATA。随后,生产环境通过原生 MCP 请求了数据丰富处理。

当操作员获取数据丰富结果时,服务器在更新案例前检查了收据、来源范围和版本。随后,操作员显式地启动了另一项调查

0
1 27
文章 pan John · 11 小时 前 8m read

简介

在医疗保健互操作性环境中,InterSystems Health Connect 通常包含生产环境、业务流程、操作、服务、实用类、例程以及其他 ObjectScript 构建项等关键组件。传统上,这些组件的部署大多是手动完成的,方法包括复制类、导入 XML 或使用管理门户中的管理工具。

虽然这种方法在初期阶段可能有效,但随着项目规模扩大、多名开发人员并行工作,或者需要在开发、集成、预生产和生产等环境之间进行可重复部署时,维护工作就会变得困难。

一种更稳健的替代方案是将 Health Connect 集成到持续集成流程中,使用 Git 作为源代码仓库,并采用 Jenkins 作为部署协调器。

本文旨在展示一种实用的方法来:

  • 在 GitHub 上对 Health Connect 代码进行版本控制。
  • 仅检测自上次部署以来被修改的文件。
  • 将这些文件复制到暂存文件夹中。
  • 将更改加载并编译到 Health Connect 命名空间中。
  • 通过 SSH 从 Jenkins 远程运行整个流程。

架构

在本示例中,我们已配置以下组件:

IRIS for Health 实例

我已在运行 RHEL10 的 AWS 服务器上部署了 InterSystems IRIS for Health,该服务器自带 Apache 服务器,并已启用通过 HTTP 和 SSH 进行连接。

0
0 5
文章 pan John · 11 小时 前 2m read

在某些情况下,您只能通过网页浏览器访问服务器,
而完全无法通过终端或控制台进行访问。
在线演示服务器就是这种情况。

因此,您可以使用 WebTerminal。对于 ObjectScript 和嵌入式 Python 来说,这完全没问题。

但我的演示程序是纯Java编写的,而且是交互式的。
$ZF(-100...) 是一种方法。但它更偏向批处理,而非交互式。
@Enrico Parisi 最近展示了一个很棒的 WebTerminal 扩展。
它与我一年前介绍的WebCommand 包非常接近。

它们的工作原理都是一样的。这始终是一种单次执行的方式:
向操作系统发送一条命令并收集响应。没有交互。

在查阅文档时,我发现设备 CPIPE 默认具有一个读取队列。
这意味着你可以像读取文件一样读取命令的结果,直到队列为空!
这倒也不坏,但方向错了。
但是:有一个 /WRITE 开关可以反转方向。就像用于打印一样。
这样好多了。不过,我的需求是同步的 READ/WRITE 交换。
该功能尚未实现。(或者是我没发现)
输出重定向填补了这一空白。
现在,我通过 CPIPE 启动 Java 演示程序,将输出重定向到文件,并
交替执行读写操作。
简化版:

	set"|CPIPE|1"

因此,我通过Java + IRIS NativeAPI实现了一个同步的“乒乓”操作

0
0 5
文章 pan John · 11 小时 前 1m read

基于我本次比赛第二份参赛作品 的成功方案
我针对本套题采用了一个调整后的版本。并有一些发现想与大家分享。

通过 CPIPE 进行的多步通信可能会耗费时间。
在高性能机器上可能难以察觉。但在配置为
Windows + Docker Desktop + 浏览器(以及其他软件)的较慢机器,既不是
既不是“飞毛腿冈萨雷斯”,也不是“路跑者”。🙂

第一个观察结果:你执行了操作系统命令,却看不到任何结果
在控制台上,你只是坐在那里等待回复。
与 IRIS 建立连接就是典型的例子。
Jour重定向的输出内容为空。

这种情况时有发生,因为在
用户输入、命令执行以及重定向文件写入之间存在延迟。
在提交命令后立即读取输出文件
并不合理。
因此,我不得不添加一个延迟,然后再检查结果。
由于在某些情况下延迟时间不够,还添加了 RePaint 操作,

我还观察到我的命令管道也出现了类似的情况。
为避免遗漏内容,有时需要重复提交两次。
我没有找到真正的解决方案,只是一个权宜之计。
这种情况主要发生在我的私人服务器上。
OpenDempServer 的响应速度一直都很快。

欢迎大家就如何排查和解决此问题提出建议。

0
0 5
问题 pan John · 11 小时 前

在为 JavaContest 编写最新示例时,我遇到了一个需求
从 IRIS 中的程序与我的 Java 代码进行通信。

与 |CPIPE| 的通信在“读取”或“写入”模式下均可正常工作,但无法同时进行“读取”和“写入”吗?
在文档中,对命名管道(Named PIPEs)的解释相当简略。
“管道一旦打开,就像一个普通的设备一样工作。” 这种说法不够精确。
我未能实现像 TCP 那样预期的读写功能。

有人有可运行的示例来演示一下吗? 
欢迎提供任何建议。

我为当前情况找到了一种变通方案。
虽然我对此并不太满意。

0
0 5
文章 Teresa Gonxhe · 20 小时 前 5m read

这是我关于 SynapseHealer 的第二篇文章,该作品是我参加 InterSystems 编程大赛“互操作性工作流中的 AI 代理”的参赛作品。 第一篇文章介绍了整体思路:将死信队列转变为一个能够修复损坏消息的处理管道。本文则探讨了我不得不反复推敲的部分,即当代理不应独自做出决策时该如何处理。

Open Exchange:https://openexchange.intersystems.com/package/SynapseHealerGitHub:https://github.com/Josephjbassey/synapse-healer

三种结果,而非两种

每条进入生产环境的被拒绝消息最终都会落入以下三个位置之一:

  • AUTO_HEAL:修复操作与已知的运行手册匹配,通过了验证,且风险较低。 ResubmitDeliveryOp 将其转发。
  • QUARANTINE:有效载荷已损坏或看起来危险(脚本标签、SQL 片段)。QuarantineVaultOp 将其隔离。
  • HUMAN_WORKFLOW:修复方案看似合理,但我不希望由软件来做最终决定。例如 1985-02-31 这种不合理的出生日期就是典型的案例。代理可以提出修复建议,但猜测患者的真实生日并非其职责所在。

负责做出该决定。在实时模式下,它会咨询一位 (Synapse.Agent.DeadLetterHealerAgent

0
0 6
文章 cheng yu · 十一月 11 14m read

自从我开始使用 IRIS 以来,我就一直在思考是否能在 IRIS 上创建代理。这似乎显而易见:我们有一个能够追踪消息的互操作性图形用户界面(GUI),还有一个底层对象数据库,可以存储 SQL、向量甚至 Base64 编码的图像。 目前我们有一个 Python SDK,允许我们使用 Python 与该平台进行交互,但它并未针对代理工作流的开发进行特别优化。因此,我尝试创建了一个 Python SDK,它能够利用 IRIS 的多个组件来支持代理系统的开发。

0
0 6
文章 cheng yu · 十一月 8 10m read

简介

我希望让医学影像的探索变得更加轻松,同时又不丢失赋予图像意义的关键信息。三维模型有助于人们理解解剖结构。如果能了解该模型的来源、其边界是如何定义的,以及***哪些部分实际上已经过检查,***该模型就会更加实用。

这正是我一直在开发的开源研究与教育项目DICOM3D 所致力于解决的问题。该项目现已公开发布;本文将从更个人的角度介绍该项目,以及我为何投身其中。

兴趣源于技术层面,而我之所以不断回归这个项目,原因则在于个人层面。

我为何开始思考这些问题

2025年11月,我的妻子接受了紧急剖宫产手术。我们的双胞胎女儿在孕30周时出生。当时我就在手术室里,站在麻醉师身旁,亲眼目睹了整个过程。

手术过程中,我妻子发生了严重大出血,在极短时间内失血量巨大。我曾一度濒临失去妻子和两个新生女儿的绝境。那段经历至今仍深深影响着我。

此外,我妻子还患有巨大的子宫肌瘤,尺寸约为10×8×9厘米,虽然在孕期已被记录在案,但并未有效告知我们。*(我无法确定这是否导致了紧急情况,也无法断言它是否解释了所有医疗决策。)*令我印象深刻的是,记录在案的信息与我们对其存在的认知之间存在着巨大鸿沟。

我自身经历的慢性疼痛、脊柱问题、就医过程以及影像检查,也让我有充足的时间站在了病历的另一端。我深知,当对涉及自身身体的信息心存疑问,**却又无从查证时,**那种感受是怎样的。我是一名开发者,而非医疗专业人士。

2
1 10
文章 Nicky Zhu · 十一月 10 13m read

IRIS Production 可以成功生成、编译并启动,但集成仍可能出错:映射可能产生错误值;消息完成不一定代表预期数据已正确落地;组件也可能因为许可调度而存在于 Production 中却处于停用状态。

承接上一篇《从组件拓扑到 IRIS Production:生成、编译与启动》,作为主线系列的收尾篇,本文讨论生成之后如何解读验证证据、平台如何响应检查结果,以及管道如何在长期运行中保持可管理。本文不再逐步讲解常规消息处理过程。

1. “已生成”不等于“能正常工作”

我们经常把几个不同的问题混为一谈:

  • 拓扑中是否包含管道所需的组件和关系?
  • IRIS 是否加载并编译了 Production 定义?
  • Production 是否正在运行,这条管道的组件是否启用?
  • 相关消息是否正常流转,没有运行错误?
  • 目标端是否出现预期结果,而且值正确?

每个问题都需要各自的证据。某一层的检查通过固然有用,却不能替代下一层的检查。编译成功无法证明映射在业务语义上正确;Production 正在运行无法证明源端已经产生消息;消息已完成也无法证明每个目标值都正确。

验证证据是分层的:每项检查回答不同的问题

图 1:证据从定义有效性逐渐深入到目标数据观察;任何单一层都不足以证明端到端正确。

2. 验证不是一个绿灯,而是一组检查

生成链路会汇总一份事实验证报告。根据管道类型和可用证据,报告可能包含:

  1. 拓扑:预期的组件类型与关系是否存在?
0
0 12
文章 pan John · 十一月 10 3m read

这个故事已经伴随我二十多年了。

在ObjectScript的早期,$Functions的容量是有限的。
你必须将其作为程序的一部分来编写。
但这些功能通常都已实现,只是没有名字而已。
要使用它,你需要通过 $ZU() 函数进行“系统”调用。 参见参考手册

随着时间的推移,大多数 $ZU() 函数已被弃用,并被“官方”的 $Functions 所取代。
但要如何在数十年间写下的上千行代码中
——这些代码由无数早已销声匿迹的程序员编写而成。
Studio 虽然是款新工具,但性能并不理想。
因此,我开发了一个搜索工具,用于扫描所有可能的ObjectScript代码角落 
它完全采用ObjectScript编写,完全避开了所有系统方法。
这使其具有独立性,并在准备向 IRIS 迁移时发挥了重要作用

它看起来是这样的:

USER>do^rcc
  • 首先输入要搜索的字符串
  • 启用“详细模式”可查看匹配项的详细信息
  • “强制大写”功能可使扫描不区分大小写
  • “代码类型”可将扫描拆分为多个步骤
  • “命名空间”定义了扫描的执行位置
    • 对于 %SYS 以外的命名空间,%-routines 和 %-classes 始终被排除在外

实用提示

0
0 5
文章 pan John · 十一月 10 2m read

在测试新增的多命名空间功能时,我遇到了一个难题
,这需要人工干预。这个简单的请求产生了1000行的输出。

USER>do^rcc
  • 至于详细模式,你可以在终端上运行日志以获取详细结果
  • ,尽管真正的摘要仍然缺失。

因此,我决定在摘要行后附加一个非常简练的统计信息

1206

我附加在末尾的这份摘要展示了
90000+次点击的分布情况。

该统计同样适用于“ALL”命名空间的选择,也适用于单一代码类型

enter search string [

请在演示服务器上试用

演示服务器 SMP
演示服务器 WebTerminal
 

0
0 5
文章 pan John · 十一月 10 3m read

受@Eberle的个人反馈 以及
中@Michael. Braam关于向量搜索的一场精彩演讲的启发, 我想分享
——这是我个人对向量处理的方法。
当我刚开始接触256、384甚至超过1200维的向量时,曾感到无所适从。
不过,我的示例“Vector-inside-IRIS”(即对iris-vector-search 的简化版)运行得相当顺利。
为了理解其背后的运作机制,我决定从小处着手。
我们常见的3维空间足以很好地描述我们的物理世界。
即使是爱因斯坦添加的“半第四维”(不包含负数),也不难理解。
而具有0到11+维度的宇宙弦理论,对我来说确实是一道难以逾越的门槛。

所以回到起点:=> 对于初学者来说,2维就足够了。
地理坐标提供了一个很好的起点,并附有足够的测试数据。
在我的 地理向量搜索示例中,VECTOR_COSINE() 函数是我主要关注的目标

在准平坦投影地图上,-1 到 +1 的结果范围很容易理解。
这是基础数学,将其推广到额外维度并非什么奇迹。
但如果是上百个维度呢?

;#1010494301472898

为便于阅读,此处的示例已进行简化

经过一番思考后,我脑海中浮现出这样一幅画面:

  • 当我在谷歌地图上搜索一个并非近在咫尺的目的地时,系统会提供多种路线供我选择。
  • 最短路线、最快路线、油耗最低的路线、公共交通路线……
  • 我会根据自己的需求做出选择
0
0 7
文章 pan John · 十一月 10 3m read

最近,我遇到了一个与代码维护相关的由来已久的问题:

  • 你只能通过 ODBC/JDBC 访问 IRIS 服务器
  • 无法通过 VSCode 访问,也无法通过 Studio 访问
  • 也无法通过(Web)终端访问

但您需要查看类、子程序或全局变量!!
无论如何,SQL 都是您的得力助手。

  • 首先,你需要一个简单的表作为临时文本存储。
CREATEGLOBALTEMPORARY

这并不是什么令人兴奋的操作。

  • 接下来,将代码导出到本地文件,并将其导入到表格中
IN

使用方法:

where

结果如下:

"1"
  • 或者,如果您更倾向于使用XML输出而非UDL,请使用以下传统方法:
  • 请将$system.OBJ.Export() 作为 导出方法。

如有需要,XML 对于全局导出可能很有用

where

而所有这些操作都是通过 ODBC/JDBC 运行的

0
0 5
文章 pan John · 十一月 10 3m read

主机变量是许多 SQL 实现中相当常见的编程特性。 
最近在DC上看到的一个问题让我意识到,在IRIS、Caché、Ensemble等系统中…… 
主机变量仅存在于嵌入式 SQL 中

> 您只能为嵌入式 SQL查询提供主机变量。<

相关示例包含在现有文档中

以下是针对无法或不愿使用嵌入式 SQL 时的解决方法说明。
 

0
0 8
文章 pan John · 十一月 10 3m read

15秒简介:https://youtu.be/veKSM1THLeo

大家好,我是阿诺尔夫(Arnolf),一名独立开发者。

我正在开发Medichrona,它能将一名患者的终身医疗记录转换为运行在 InterSystems IRIS for Health 上的时序知识图谱,并允许您在浏览器中以 3D 形式逐年探索这些数据。这些数据来自 InterSystems 示例中的 Synthea 合成患者数据。

本文将详细说明数据如何从FHIR数据包呈现到3D界面。

演示视频

0
0 7
文章 pan John · 十一月 10 18m read

本文介绍了SHAP可解释性方法,将其作为理解机器学习“黑箱”模型预测背后原因的一种途径。文中还提供了一个简单的Jupyter笔记本,您可以使用并修改它,从而对这些概念进行实践操作:

https://www.kaggle.com/code/jorgeivnjh/explainability-in-ml-models

https://github.com/JorgeIvanJH/Explainability-in-ML-models

我们将利用这些概念,在未来将它们应用到我们的持续培训管道中:https://community.intersystems.com/post/complementing-iris-mlflow-continuous-training-ct-pipeline

在本笔记本中,我们将探讨黑盒模型可解释性的直观理解。黑盒模型是指复杂程度超出人类直接理解范围的模型,例如神经网络以及梯度提升(如 XGBoost、LightGBM、CatBoost)等集成学习方法。

在开始之前,有必要澄清可解释模型与可解释性模型之间的区别:

可解释模型是指仅通过观察模型本身,我们就能直接理解输入的变化如何影响输出的模型。 线性回归便是如此,其中每个变量都关联一个系数,该系数表明该变量如何影响预测结果。单棵决策树也是如此,通过追踪其分支,我们可以准确理解预测是如何得出的。

0
0 7
文章 pan John · 十一月 10 5m read

在通过集成引擎管理关键医疗数据时,您希望在队列开始积压或服务中断的瞬间立即得知。 

遗憾的是,这通常会导致收件箱被通知邮件塞得满满当当,有时甚至让人觉得根本无从处理。

好吧,我并没有解决这个问题。 

但我开发了一款可能有所帮助的工具……

0
0 8
文章 pan John · 十一月 10 3m read

欢迎阅读我的CI/CD 系列文章的下一章,本章将探讨利用 InterSystems 技术和 GitLab 进行软件开发的可行方案。

今天,我想分享几种能够缩短编译时间的方法(特别是当你采用增量/差异编译而非全量构建时)。

编译器标志和限定符

代码加载和编译会受到各种标志和限定符的影响。如果您正在编写针对 InterSystems 平台的部署脚本,我强烈建议您至少通读一遍相关文档。虽然大多数标志和限定符都有非常具体的用途,但了解它们的功能,将来某一天可能会为您节省大量时间。要列出所有标志和限定符,请执行以下命令:

Do$systemDo

文档中也有相关说明 。无论如何,这里最重要的标志是u(仅更新)——如果启用该标志,系统将跳过对已处于最新状态的类的编译。 在进行增量编译时,使用此标志可节省 99% 的时间,因为只有修改过的代码才会被编译。 
 

仅加载已修改的代码

递归导入固然不错,但如果你有上千个类,而上次提交中仅修改了其中两个,那么除了为了简单起见之外,其余 998 个类就完全没有必要加载了。 值得庆幸的是,Git 可以轻松回答诸如“在abc 和 xyz 这两个提交之间,哪些文件发生了变化?”之类的问题。以下是一个示例代码,它接受两个 Git 标识符(提交、分支名称、标签),并返回三个列表:

  • 新增文件
0
0 6
文章 pan John · 十一月 10 11m read

加入 InterSystems 已经一年了,我在开发者社区上看到过许多精彩的文章。问题在于,当我的代码真正需要用到这些文章时,却很难再次找到它们。

Claude Code 已经与我们的服务器、文档和 Perforce 紧密集成。但社区层还缺失,所以我为此编写了一个技能:一个 Python 脚本,无依赖,外加一个 SKILL.md。

我想解答的问题是:我正在编写这个类,社区对其中涉及的模式已经有哪些讨论了?

为什么不直接封装网站自带的搜索功能呢?因为它是客户端渲染的:通过 HTTP,/search?search_api_fulltext= 返回页面框架,因此任何查询都会显示相同的 11 个热门侧边栏链接。 服务器端渲染返回的内容是 /tags/ 页面、文章正文及其评论,以及 /sitemap.xml(约 17,500 个 slugs)。该技能正是基于这三部分构建的。

命令

共有九个命令,每个命令提供一种不同的访问方式。有些将关键词解析为标签,有些搜索标题,有些获取文章或作者,还有一个命令以整个类作为输入。以下是这些命令的列表,每个命令下方都配有实际示例。

所有输出均为 JSON 格式,这是助手最易处理的格式。

tags

探索词汇表。这是首要步骤,因为该网站有234个标签,且这些词并非你所能猜到的。

$ python dc_search.py tags "zen report pdf"
["zen", "intersystems-reports-logi", "data-import-and-export"]
0
0 6
文章 pan John · 十一月 10 10m read

在第 1 部分中,我们探讨了窗口函数的工作原理。我们了解了 PARTITION BY、ORDER BY 以及 ROW_NUMBER() 和 RANK() 等函数背后的逻辑。现在,在第 2 部分中,让我们通过实际示例深入探讨更多窗口函数。


  1. 窗口聚合函数

概述

这些函数会在定义的窗口范围内计算聚合值(例如:求和、求平均值、求最小值、求最大值、计数等),但不会合并行。 每行数据仍保持可见,并附加其分区对应的聚合值。

支持的函数包括以下内容:

  • AVG() — 窗口帧内值的平均值。
  • SUM() — 窗口帧内值的总和。
  • MIN() — 最小值。
  • MAX() — 最大值。
  • COUNT() — 行数或非空值的个数。

语法:

function(...) OVER (PARTITION BY ... ORDER BY ...)

示例 1 — 部门薪资分析

让我们分析一下每位员工的薪资

0
0 8
文章 pan John · 十一月 10 8m read

字符串相关问题

我正在使用 Python 通过 JDBC(或 ODBC)访问 IRIS 数据库。我想将数据导入pandas数据框中,以便对数据进行处理并生成图表。 在使用 JDBC 时,我遇到了字符串处理方面的问题。撰写这篇文章是为了帮助可能遇到同样问题的其他人。或者,如果有什么更简单的方法可以解决这个问题,请在评论中告诉我!

我使用的是 OSX 系统,因此不确定这个问题是否具有特殊性。我使用的是 Jupyter Notebooks,不过即使您使用其他 Python 程序或框架,代码通常也大致相同。

JDBC 问题

当我从数据库中提取数据时,列描述和任何字符串数据都会被返回为数据类型 java.lang.String。 如果你将 print 字符串数据作为输入,结果会显示为: "(p,a,i,n,i,n,t,h,e,r,e,a,r)",而不是预期的 。

这很可能是因为使用 JDBC 检索时,数据类型为 的字符串被作为可迭代对象或数组返回。 如果所使用的 Python-Java 桥接库(例如 JayDeBeApi、JDBC)无法在单一步骤中自动将 转换为 Python 中的 str,就会出现这种情况。

相比之下,Python 的 字符串表示法将整个字符串视为一个整体。当 Python 检索普通的 (例如通过 ODBC)时,不会将其拆分为单个字符。

JDBC 解决方案

0
0 5
文章 pan John · 十一月 10 3m read

每天都应该有这样一句:“我不知道你还能那样做”。

背景

我在 Linux 操作系统上使用 Neovim 文本编辑器已经有一年了,主要用 Python 开发一些新的 LLM 模型。前阵子我曾尝试将 IRIS 语言服务器与 Neovim 结合使用,但这个过程有些费时费力。今天的需求是:

  1. 在我的 Ubuntu 环境中使用 IRIS 进行编辑,但无需在主机上直接安装 VSCode。
  2. 不希望我的代码在云端进行AI训练
  3. 现在就做!!

要求

我在开发周期中已经使用了 Docker。继续沿用这一方案非常合适。

VSCode 是一款可视化编辑器,而非纯文本编辑器,因此我需要借助 Docker 来建立远程桌面会话,并运行基于图形界面的工具。

该容器为一次性容器,将在每次会话结束时被销毁。

该容器绝不能连接到云端托管的 AI 工具。

该容器严禁连接互联网上的任何其他服务。

该容器已预先安装并配置好,可用于运行 IRIS Editor。

只需执行 **docker run** 命令即可开始使用。

研发

经过半天的时间,我尝试搭建了一个搭载不同XRDP服务且采用多种连接协议的纯净版Ubuntu Docker镜像,并进行了测试。

0
0 7
文章 pan John · 十一月 10 3m read

持久化类是使 InterSystems IRIS 与传统应用程序数据库区别开来的功能之一。开发人员无需将数据库表与应用程序对象分开设计,而是可以定义一个类,并让 IRIS 管理其持久化表示形式。这使得应用程序的对象模型与底层数据模型之间建立了紧密的联系。

一个基本的持久化类继承自 %Persistent:

Class MyApp.Product Extends %Persistent
{
    Property Name As %String;
    Property Price As %Numeric;
    Property Stock As %Integer;
}

编译后,该类即可作为持久化数据模型使用。每个实例代表一个产品,该产品可被存储在数据库中。但是,创建对象并不意味着数据会立即插入数据库。该对象最初仅存在于内存中。

Set product = ##class(MyApp.Product).%New()
Set product.Name = "Keyboard"
Set product.Price = 99.90
Set product.Stock = 25

Set status = product.%Save()

对于初学者而言,内存对象与持久化对象之间的这一区别非常重要。 方法用于创建对象,而 %Save() 则用于将对象的当前状态持久化。

0
0 10
文章 pan John · 十一月 10 3m read

持久化类是使 InterSystems IRIS 与传统应用程序数据库区别开来的功能之一。开发人员无需将数据库表与应用程序对象分开设计,而是可以定义一个类,并让 IRIS 管理其持久化表示形式。这使得应用程序的对象模型与底层数据模型之间建立了紧密的联系。

一个基本的持久化类继承自 %Persistent:

Class MyApp.Product Extends %Persistent
{
    Property Name As %String;
    Property Price As %Numeric;
    Property Stock As %Integer;
}

编译后,该类即可作为持久化数据模型使用。每个实例代表一个产品,该产品可被存储在数据库中。但是,创建对象并不意味着数据会立即插入数据库。该对象最初仅存在于内存中。

Set product = ##class(MyApp.Product).%New()
Set product.Name = "Keyboard"
Set product.Price = 99.90
Set product.Stock = 25

Set status = product.%Save()

对于初学者而言,内存对象与持久化对象之间的这一区别非常重要。 方法用于创建对象,而 %Save() 则用于将对象的当前状态持久化。

0
0 5
文章 pan John · 十一月 10 1m read

如果您正在将 InterSystems IRIS for Health(或 HealthShare Health Connect)升级至 v2025.3 或更高版本(例如 2026.1.x),并且正在使用我们的 FHIR 服务器,请务必注意一项可能对您的环境产生严重影响的变更。

0
0 8
文章 cheng yu · 十一月 10 5m read

2020年,我为FHIR竞赛编写了iris-fhir-portal,并在四篇文章中对此进行了说明:

  1. 我使用 FHIR 的经验
  2. irisfhir-portal 概述
  3. 使用 fhir.js 更新患者资源
  4. 使用 SQL 获取 FHIR 信息

该门户仍由 iris-fhir-template (zpm "install fhir-portal") 安装,但在当前的 IRIS 系统上已无法正常运行:实验室结果页面显示为空,文章的 SQL 模式已丢失,且页面上没有登录功能。 本文将介绍如何将其迁移至 IRIS for Health 2026.2 版本,以及各文章中发生了哪些变化。

The patient chart

0
0 6