新增
文章 Jeff Liu · 15 小时 前 1m read

下面是一个如何使用 ObjectScript将 CSV 文件中的数据导入 InterSystems CACHÉ 的实例
假设您的 CSV 文件很简单(例如,逗号分隔,有标题),您可以使用 %Stream.FileCharacter 逐行读取并解析数据。

ClassMethod ImportCSV(filePath As %String) As %Status {
    Set stream = ##class(%Stream.FileCharacter).%New()
    Set sc = stream.LinkToFile(filePath)
    If 'sc Quit sc
    While 'stream.AtEnd {
        Set line = stream.ReadLine()
        Set fields = $ListFromString(line, ",")
        // Example: Save to a persistent class
        Set obj = ##class(MyApp.Data).%New()
        Set obj.Name = $List(fields,1)
        Set obj.Age = $List(fields,2)
        Set obj.Email = $List(fields,3)
        Do obj.%Save()
    }
    Quit $$$OK
}
0
0 5
InterSystems Developer Community is a community of 26,920 amazing developers
InterSystems IRIS 程序员可以在这里学习、分享、了解最新动态、成长,以及收获快乐!
新增
文章 Lilian Huang · 五月 13 2m read

这一次,我们使用 React 作为 IRIS 的前端开发工具,这本身并不是真正的编程。在使用网络开发框架(不限于 React)时,一个关键的考虑因素是使用哪种 CSS 框架。到目前为止,我们一直在使用 Bootstrap,它是标准的,也是最容易上手的。

不过,虽然它很容易使用,但我觉得它提供的自定义灵活性有限。也就是说,即使我们要改用其他 CSS 框架,学习它并从头开始重写所有内容也是一项巨大的工作,所以我们就保持原样。

这一次,在获得了名为 "Claude Code "的强大工具后,我试着让它将 Bootstrap 转换为 Materialize。结果是:修改一次性完成。包括验证在内,整个过程不到五分钟。如果我自己研究 Materialize 并实现它,我想至少需要两三天的时间。

引导式屏幕

BootStrap

Materialize 屏幕

简单地更改样式表并不有趣,所以我还要求修复一个我注意到是错误但一直没有解决的问题。

问题是,即使在编辑屏幕上删除了数据,这些数据仍然会出现在左侧的列表中。

只需一个请求就能轻松解决这个问题。

以下是修复请求的内容:

After pressing the delete button in ExpenseItem.tsx and deleting the corresponding record, update the list in ExpenseItemList.txt so that the deleted item is no longer included in the list.
0
0 3
新增
文章 Nicky Zhu · 五月 12 10m read

RabbitMQ 是一个消息代理,它允许生产者(发送数据消息的一方)和消费者(接收数据消息的一方)建立异步、实时且高性能的海量数据流。RabbitMQ 支持 AMQP(高级消息队列协议),这是一种开放标准的应用层协议。

采用 RabbitMQ 的主要原因包括以下几点:

  • 您可以使用异步方法来提高应用程序的性能。
  • 它通过数据消息中介,让您能够解耦并减少服务、微服务和应用程序之间的依赖关系,这意味着交换数据的生产者和消费者无需互相了解。
  • 它允许在利用响应队列之后,交付(包含结果的)已发送数据的长时间运行处理。
  • 它帮助您从单体架构迁移到微服务架构,其中微服务通过 Rabbit 以解耦和异步的方式交换数据。
  • 它通过使消息能够被存储和转发,提供了可靠性和弹性。一条消息可以被投递多次,直到被处理为止。
  • 消息排队是扩展应用程序的关键。随着工作负载的增加,您只需添加更多的工作进程(worker)来更快地处理队列。
  • 它与数据流应用程序配合良好。
  • 它对物联网(IoT)应用程序有益。
  • 它是机器人(Bots)通信的必备工具。

RabbitMQ 基础概念

我们将利用温度监测器作为案例来详述 RabbitMQ 的概念:

  • Producer(生产者):发送消息的软件程序。
  • Exchange(交换机):接收来自生产者的消息,并将其路由到零个或多个队列。
  • Queue(队列):支持小型和大型二进制消息的消息存储区/缓冲区。
0
0 7
新增
文章 Claire Zheng · 五月 12 1m read

要建立一套自动化的数据转换流程,实现临床数据对真实世界证据的支持,面临着诸多困难:数据标准林立、数据转换难、数据质量差、治理耗时耗力。
InterSystems OMOP 数据管道创新地打通“FHIR + OMOP”两个标准。通过FHIR标准解决数据的“互联互通”问题;通过OMOP解决数据的“科研分析”问题——OMOP 的主导型场景体现在真实世界研究,标准化的数据模型能够降低科研门槛,加速从数据到知识的转化,已在全球 80 多个国家的 4000 多家机构得到应用。

 

往期技术视频速递:详细拆解InterSystems FHIR to OMOP解决方案,通过Demo演示,向您展示数据如何从FHIR到OMOP无缝流转,助力您实现临床数据转换流程的自动化,提升研究效率。

0
0 3
新增
文章 姚 鑫 · 五月 8 2m read

大家好!

我很高兴与大家分享一下,在深入研究InterSystems IRIS数据平台数年之后,我终于将自己的项目经验总结成了一本新书:《IRIS编程技术指南》。

撰写这本书对我来说是一项重大的工程挑战。

我的目标是弥合"理解语法 "与 "构建可投入生产的项目 "之间的差距。

为了庆祝本书的发布并为社区做出贡献,我想与大家分享书中的两个具体的技术见解,我相信每个IRIS开发人员都会发现这些见解非常有用。

💡 技术洞察 1:为初学者揭秘 Global 结构

许多新开发者往往把 IRIS 仅仅看作另一个 SQL 数据库。在我的书中,我强调:要真正掌握 ObjectScript,关键在于理解 Globals——即底层的多维存储机制。

核心要点:我会详细讲解 IRIS 是如何将类属性映射到 Global 节点上的。一旦初学者意识到,‘保存一个对象’本质上就是‘设置一个带下标的 Global’,那么性能调优和数据索引背后的逻辑就会豁然开朗。这正是每一位 IRIS 新手都会经历的‘顿悟时刻’。

💡技术洞察 2:%Persistent 类的最佳实践

对于从 Java 或 C# 转向 IRIS 的开发人员来说,适应 IRIS 处理持久化的方式往往是一个常见的挑战。

核心要点:在书中,我深入浅出地讲解了 IRIS 内部的对象关系映射(ORM)概念。

0
0 13
新增
文章 Jeff Liu · 五月 8 8m read

引言 - ObjectScript 中的人工智能流问题

今天,我想介绍一下我在将 AI API 集成到 ObjectScript 应用程序时遇到的一个问题以及找到的解决方案。我最初的测试很成功,但也有些令人沮丧。

HTTP 调用成功了;请求正确地发送到了我的 LLM API。但随后,沉默......漫长的等待。最终,整个响应以单个块的形式到达。

从技术上讲,它成功了,但与 ChatGPT 会话相比,用户体验令人失望。

现代模型设计为逐个令牌流式输出。这使得等待时间大大缩短,因为即使尚未生成完整的答案,您也可以开始读取响应。 要启用此行为,只 需向 API传递 stream=true。 不过,在这种看似简单的操作背后有一个重要的细节:流媒体依赖于服务器发送事件(Server-Sent Events,SSE)。

如果不支持客户端 SSE,就无法利用这种模式。

对于通常在 ObjectScript 中使用的 %Net.HttpRequest 类,响应会被缓冲,直到连接关闭。换句话说,没有增量读取,没有渐进标记,因此也就没有流。

如果我们希望将 LLM 集成到 IRIS 应用程序中,那么能够处理 文本/事件 流、即时解析事件和实时处理数据是至关重要的

0
0 13
新增
文章 Kelly Huang · 五月 7 5m read

持续训练(CT)流水线将基于特定时间点可用数据,通过数据科学实验开发出的机器学习(ML)模型规范化。它不仅为模型部署做好准备,还支持在新数据可用时进行自主更新,同时具备用于审计目的的稳健性能监控、日志记录和模型注册功能。

InterSystems IRIS 已经提供了支持此类流水线所需的几乎所有组件。然而,缺少一个关键要素:标准化的模型注册工具。在本文中,我将介绍一种结合 IRIS 优势与开源 AI 工程平台 MLflow 的方法。它们共同作为构建有效持续训练(CT)流水线的互补工具。

本仓库中的实现利用了 MLflow 的内置配置来存储 SHAP 解释器,以提供对相应模型预测结果的解释,包括随机森林(Random Forest)、XGBoost、神经网络等“黑盒”复杂模型。

**演示视频**:https://youtu.be/qLdc4jhn83c

---

CT 流水线组件

该 CT 流水线模块背后的理论基于 Google 在相关文章中定义的 MLOps 1 级行业标准。每个组件的实现都利用了 IRIS 和 MLflow 的最佳特性(如下图所示,红色部分突出显示):

对于那些刚接触 CT 流水线的人来说,上图描述了数据科学项目中传统的实验阶段(上半部分“实验/开发/测试”,通常在 Jupyter Notebook 中进行)如何转化为生产级模型部署。

0
0 12
新增
文章 Lilian Huang · 五月 6 2m read

如果您有长时间运行的报文,这里有一段简单的代码可以捕获它们。您也可以使用队列等待警报(Queue Wait Alert)来获得相同的结果,不过这段代码甚至可以捕获队列为空的单条活动消息。它还能扫描所有命名空间,且不会对生产进行修改,因此可用于调试。

Include Ensemble

Class User.LongMessagesTask Extends %SYS.Task.Definition
{

Parameter TaskName = "Long running messages";

Property LongRunningMessageThreshold As %Integer(MINVAL = 1) [ InitialExpression = 60 ];

Method OnTask() As %Status
{
	set ts = $zdatetime($NOW(0),3,1)
	set ns = ""
	while 1 {
		// Iterate namespaces
		set ns = $o($$$EnsJobMonitorRoot(ns))
		quit:ns=""
		
		set job =""
		while 1 {
			// Iterate jobs
			set job = $o($$$EnsJobMonitorRoot(ns, job))
			quit:job=""
			
			// Get business host name
			set bh = $o($$$EnsJobMonitorRoot(ns,job,""))
			
			// Get the time of the last state change
			set lastActivity = $$$EnsJobMonitorRoot(ns,job,bh,"%LastActivity")
			
			// Get active message, if any - bh can be just idling
			set active = $d(^[ns]Ens.ActiveMessage(job),messageid) // From $$$EnsActiveMessage
			if active {
				set time = $system.SQL.Functions.DATEDIFF("s", lastActivity,  ts)
				if time > ..LongRunningMessageThreshold {
					set text = $$$FormatText("Long running message %1, in ns: %2, BH: %3, processing since %4, for %5 seconds", messageid, ns, bh, lastActivity, time)
					// For debug
					// write text, !
					do ##class(%SYS.System).WriteToConsoleLog(text)
				}
			}
		}
	}
	quit $$$OK
}

}
0
0 10
文章 Lilian Huang · 四月 30 7m read

我们一开始并没有大的人工智能战略。

我们有一个传统的 InterSystems Caché 2018 应用程序、大量老旧的业务逻辑和一个实际需求:构建一个新的用户界面并改进已运行多年的代码。起初,我认为人工智能编码代理只能帮助完成一小部分工作。也许是一些模板、系统周围的一些 REST 工作,以及帮助阅读旧的 ObjectScript。

但实际上,它的作用远不止这些。

当我们开始认真使用它时,我们意识到它可以跨越庞大的代码库,理解模式,提出重构建议,并帮助我们以比我预期快得多的速度实现 Caché 的现代化。但这只是在开始时经历了一段令人沮丧的时期之后才发生的。

真正的挑战不是获得代码建议。而是教会代理我们的 Caché 环境如何实际运行。

我们为什么能使用它

在进行任何技术工作之前,我们必须回答一个安全问题。

我们不能将企业资源规划代码和内部业务逻辑直接发送给公共人工智能服务,并寄希望于最好的结果。这样做永远无法通过严格的安全审查。

亚马逊 Bedrock 改变了我们的想法。我们的服务器、数据和开发环境已经在 AWS 中,因此 Bedrock 可以很自然地融入我们已经信任和管理的云环境。我们可以使用该模型,同时将流量、访问控制和周边安全控制保持在我们已经在使用的 AWS 框架内。

0
0 15
文章 Claire Zheng · 四月 28 2m read

有时,客户需要一个小型 IRIS 实例在云中执行某些操作,然后将其关闭,或者他们需要数百个容器(即每个最终用户或每个界面一个容器)来处理小型工作负载。 这个练习的目的是了解 IRIS 实例可以做到多小。在这次练习中,我们重点研究了IRIS 实例可配置的最小内存量。 您知道影响 IRIS 内存分配的所有参数吗?

内存设置

这些是影响 IRIS 内存分配的不同桶及其相应参数:

  • 全局缓冲区(Global Buffers)(32 MB) => 8k 数据库的最小值似乎为 32 MB
  • 常规缓冲区(Routine Buffers)(26 MB) => 文档中的理论最小值为 430 个缓冲区 x 每个缓冲区 64k ~ 26 MB,实际为 26 MB
  • 日志缓冲区(Journal Buffers)(16 MB) => 理论上和实际上,Unicode 系统的最小值为 16 MB(8 位为 8 MB)
  • 缓冲区描述符(Buffer descriptors)(3 MB) => 似乎是 3 MB,无法调整
  • gmheap(16 MB) => 最小值为 256 页 x 每页 64k = 16 MB(CPF 中的配置字节数 = 16384)
  • ECP(1 MB) => CPF 中有几个参数控制这个参数。MaxServerConn 和 MaxServers。
0
0 10
文章 Jeff Liu · 四月 26 1m read

作为新的互操作性用户界面浪潮的一部分(请参阅@Aya Heshmat2025.12025.3中介绍的新内容),v2026.1已经作为开发者预览版发布,这可能是您尝试一下的理由——它将发布用于消息查看和搜索的新用户界面,包括可视化跟踪(以及其他用户界面好东西)。

以下是一个快速预告:

0
0 34
文章 姚 鑫 · 四月 26 3m read

在这里插入图片描述

📘新书发布|《IRIS(数据平台)编程技术指南》正式发售!

大家好,我是姚鑫

最近一段时间,我把自己过去几年在 InterSystems IRIS 项目中的开发经验,系统整理成了一本书—— 📕 《IRIS(数据平台)编程技术指南》 现已由 北京航空航天大学出版社 正式出版发行。

说实话,写书的过程比我想象中要难很多。 如果说写博客是“随手记录”,那么写书就是一次真正的“工程项目”:要保证结构完整、逻辑严谨、内容能从入门一路带到实战。


🚀这本书写了什么?

本书围绕 InterSystems IRIS 的核心开发语言 ObjectScript 展开,内容不仅讲语法,更注重“工程实践”。

主要包括:

✅ IRIS 平台介绍与开发环境搭建 ✅ ObjectScript 语法规则、变量体系、全局变量机制 ✅ 常用数据类型、表达式、系统命令、系统函数 ✅ 函数与方法、面向对象编程基础 ✅ %Persistent 持久类(ORM 与 SQL 映射) ✅ Storage 存储策略、懒加载机制、并发分析 ✅ 嵌入式数据结构、常见性能问题与技术难点解析

整体内容更偏向“项目实战型”,不是纯概念堆砌。


🎯适合哪些人?

0
0 127
文章 Claire Zheng · 四月 23 1m read

InterSystems Ready 2026 大会即将召开——这是您在参加现场认证考试之前进行准备和检查知识的大好时机。

InterSystems 认证并非易事:您需要根据真实考试目标进行试题练习。

exam-prep.es正是为实现这一目标而建立的免费平台:练习、找出薄弱环节并做好充分准备

你会发现

* 1200 多道与官方认证目标一致的练习题 * 带有 InterSystems 文档链接的详细解释 * 涵盖每个考试知识点的学习材料 * 进度跟踪

涵盖的认证

* HL7 接口专家 * IRIS SQL 专家 * IRIS 系统管理专家 * IRIS 开发专家

学习材料+互动测验的组合使其特别适用于在考试前验证您的水平。

https://exam-prep.es

:exam-prep.es 与 InterSystems 无关。它是一个补充练习资源。

0
0 19
文章 Kelly Huang · 四月 22 6m read

痛点所在

我们在将 IRIS 实例迁移到另一台机器(甚至可能是升级版本)后,有多少次是在几天之后才猛然惊觉:我们忘了迁移那个对于业务操作(Business Operations)至关重要的 SSL 配置?或者是漏掉了某个凭据(Credential),又或是某个包里孤零零的一个类?

解决方案

最简单的法子就是列一张清单¹。把我们必须迁移的实体项都罗列出来。但是,Word 文档里的简易清单往往会被人抛诸脑后,甚至干脆被无视。

管理学的基本原理告诉我们:如果你希望人们遵循流程,你可以采取以下手段:

  1. 通过监控行为来强制他们执行;
  2. 将某项活动系统地锁定在某个流程之后(例如使用流水线部署代码,并要求自动化测试通过才能合并 PR);
  3. 让流程比人工操作更便捷、更省力。​ 这样人们才会心甘情愿地去用。(这正是我的目标所在)

Python 脚本固然可行,但人们可能会忘记脚本放在哪儿,或者去哪儿下载。一旦有了新版本,所有使用者都得重新下载。

IRIS 类或任务似乎也是理想选择,直到你意识到有时你是迁移到另一个网络的服务器,一个实例根本无法访问另一个。

这就是为什么我选择了浏览器插件一旦安装,它便触手可及(哪怕你几个月不用它);更新会自动完成。即便你换了浏览器或出于某种原因弄丢了插件,从应用商店重新安装也只是点击一下的事。

0
0 24
文章 Jeff Liu · 四月 21 4m read

尽管LOCK(docs) 是 InterSystems IRIS 的基础部分,负责并发性,但开发者社区上关于它的讨论并不多。这是可以理解的,因为它是一个稳定且相当低级的命令。在本文中,我将举一个简单的例子,说明如何使用互操作性锁。在示例中,我们将有一个本地表,其中的引用数据由两个不同的进程使用:

  • 从表中读取数据的实用功能(由生产中的各种 DTL/Rules 使用)
  • 更新表的专用业务操作

这里的问题是,当业务操作更新表时(最糟糕的情况是进行完全重建),自定义函数将无法从表中获取数据,这将导致 DTL/规则处理出现问题。

锁可以帮助我们解决这个问题。具体方法如下:

  • 实用程序将在获取数据前获得共享锁。任何数量的进程都可以持有共享锁,因此不会出现并发问题。一旦检索到数据,我们就会释放共享锁。
  • 更新器业务操作会先使用共享锁,然后再释放独占锁。一旦某个进程获得独占锁,IRIS 就会保证其他进程无法获得同一资源上的锁。这样,当独占锁被持有时,实用程序就无法获取共享锁。一旦我们的业务操作完成对表的更新,它就会释放独占锁,允许实用程序访问表。

    让我们开始吧

本地表

有点简单(在实际项目中作为 LUT 可能会更好),但我们的目的是展示锁是如何工作的,而不是构建一个复杂的表:

Class Lock.RefData Extends %Persistent
{
Property Value;
}
0
0 22
文章 Claire Zheng · 四月 20 4m read

大家好。又是我!!😀

最近,我试图整理InterSystems IRIS😆的一些学习材料,并意识到这些资源实际上非常分散。

因此,我在这里列出了一个按类别分组的列表,供以下人员使用:

  • 是 InterSystems 的新手
  • 或想深入了解某个特定领域的人

此外,我还补充了一些自己的经验,说明哪些有用(哪些没用,可能只是对我没用🤫🤐)。


1.对于初学者

如果您不知道从哪里开始,请从这里开始:

我的体验 从 Developer Hub + 入门开始效果很好。它提供了快速运行的足够条件(无需安装,直接测试!!!!ᾒ)。

不适合我的地方 一开始就直接进入文档→正如我常说的...我知道句子中的每个单词,但就是不理解🥲。


2.设置/安装/工具

当你想真正开始工作时:

0
0 139
文章 Kelly Huang · 四月 15 2m read

背景情况

急诊医疗服务(EMS)团队到达急诊科时,常常会遇到人口统计数据不完整或未知的病人——没有病历号(MRN),没有确认的姓名,有时甚至没有出生日期。然而,急救医疗运送记录仍然需要准确无误地记录在病历中。

为了支持安全可靠的记录,急救医疗机构、第三方集成服务和医院集成团队建立了安全接口,用于交换识别码和临床信息。当这些标识符不一致时,下游系统就无法自动发布转运记录,从而产生可避免的人工操作,并延误记录的完整性。本文概述了如何使用 FHIR Patient.Search (R4) 来填补最常见的人口统计空白并改进自动发布。

挑战

在许多 EMS 到医院的集成中,患者最初是以通用或临时标识符注册的。最终登记和任何记录合并可能要到稍后才会发生,有时是在出院后。在这些更新传播之前,EMS 患者标识符和电子病历 (EMR) 标识符可能一直不同步。

当转运记录因不匹配而无法发布时,集成通常会生成一个错误,并转到 EMR 工作队列进行人工审核。在 EMS 处理量大的情况下,队列会迅速增长。

0
0 152
文章 Lilian Huang · 四月 15 8m read

关键词 氛围编码(Vibe coding), Windsurf, IRIS, TIE

为什么不呢? "氛围编码 "从来都与氛围无关!( "Vibe coding" is never about the vibe!)

迄今为止,有人没有尝试过 "氛围编码(vibe coding) "吗?

即使仅仅在三年前,如果有人问

  • "我可以用英语、西班牙语或只用中文为 NHS TIE 实施 IRIS 吗?"或
  • "我能否用英语指示 TIE 建立自己的 e2e 路由,获取 PDF 报告,然后将其转化为 ORU/MDM 信息并提交到 PAS?
  • "我们能否只用英语查询 IRIS 数据库,并根据英语指令建立仪表板或我自己的特别报告?

你可能会大笑一声,尽量不生气,找把椅子坐下来,开始计算光是这些分析/SoW/需求/设计/测试/服务文档就需要多少人*日或人*周,以及实际工程工作。

然而,随着基础模型的飞跃和进步,今天的情况肯定会变得更加现实。

我也希望了解其他人是如何使用它的。 以下只是我自己匆忙写下的随笔。

范围

  • IDE:**Windsurf (是的,它还在那里) **或 Cursor 等(现在大约有 20 多个流行/强大的),或者只是带有此类扩展的 VSCode。
0
0 139