文章 Shengzhi Wu · 十月 28 13m read

在线体验: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)当成一个业务操作,塞进一条普通的互操作生产里。Agent 不瞎猜——它通过 AI Hub 的 SQL 工具直接查支付平台自己的 IRIS 库,查完按严格的 JSON 格式给结论;剩下的路由、审计、算 token 成本,生产全接管。

混合决策:规则打头,Agent 收尾

每笔支付进生产后走三段:

  • 确定性规则先上。 制裁地区、黑名单、硬性限额、速率尖峰,命中即拦;完全可信的客户加小额加常用设备加本地,直接放行。
0
1 26
InterSystems开发者社区
与开发者和专家交流,提出问题、寻找答案,并分享有关 InterSystems 技术、产品和解决方案的知识。 了解更多
28,956 名开发者,社区仍在不断壮大
文章 John Pan · 十月 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 22
文章 John Pan · 48 秒 前 6m read

Health Connect 中的高性能消息搜索

问题

您是否曾在繁忙的界面中尝试使用“消息查看器”进行搜索,却因查询超时而失败?随着数据量的增加,这可能会成为一个相当严重的问题。举个例子,我正在处理的 Health Connect 实例每天处理约 1.55 亿条消息头,且消息保留期为 21 天。 为提升搜索性能,我们扩展了内置的 SearchTable,添加了常用字段,希望通过为这些字段建立索引来加快查询速度。尽管如此,某些查询仍然无法完成。

更多信息:定义搜索表类。

image

对于我们这些从事 HL7 集成工作的人员来说,我们深知日常的故障排查和问题响应是我们工作的重要组成部分。 快速识别并解决这些问题,对于确保数据流的稳定和准确至关重要。由于搜索性能不佳,我们不得不针对每个具体问题收集非常详细的信息,才能在 Health Connect 中找到相关示例。 如果没有非常严格的时间限制(几分钟内),我们往往无法在超时之前让“消息查看器”搜索返回任何结果。这导致在确定实际问题以及后续解决问题方面都出现了显著延迟。

解决方案

这种情况是不可接受的,因此我们必须找到解决方案,以更好地服务客户。WRC应运而生。

我们提交了一份工单,我很高兴地报告,已经找到了修复方案。该方案需要遍历我们自定义的 SearchTable 字段,并识别出哪些字段的唯一性不足,因此不应被“消息查看器”搜索功能作为索引处理。

0
0 1
文章 John Pan · 5 分鐘 前 7m read

众所周知,在将应用程序部署到生产环境之前,拥有一套合适的测试数据对于确保其可靠性和性能至关重要。这有助于模拟真实场景,并在潜在问题或缺陷影响最终用户之前将其识别出来。 此外,使用具有代表性的数据集进行测试,有助于优化性能、发现瓶颈,并根据需要对算法或流程进行微调。归根结底,拥有一套全面的测试数据有助于交付更高质量的产品,降低生产环境上线后出现问题的可能性,并提升整体用户体验。

在本文中,我们将探讨如何利用生成式人工智能(即谷歌的Gemini)为多个对象的属性生成(希望是)有意义的数据。为此,我将使用RESTful服务生成JSON格式的数据,然后利用收到的数据创建对象。

0
0 1
文章 John Pan · 7 分鐘 前 6m read

最近,关于 Caché ObjectScript 中 for/while 循环性能的话题引发了讨论,我想与社区的其他成员分享一些想法和最佳实践。虽然这本身是一个基础话题,但人们很容易忽视那些看似合理的方法所带来的性能影响。 简而言之,使用$ListNext遍历$ListBuild列表,或使用$Order遍历局部数组,是速度最快的选项。

为了说明这一点,我们将以遍历逗号分隔字符串中的各个部分为例。

以最简洁的代码编写此类循环的一种自然方式是:

For i=1:1:$Length(string,",") {
	Set piece = $Piece(string,",",i)
	//Do something with piece...
}

这虽然直截了当,但许多编码风格指南可能会建议:

Set n = $Length(string,",")
For i=1:1:n {
	Set piece = $Piece(string,",",i)
	//Do something with piece...
}

实际上这两者之间并没有性能差异,因为结束条件并非在每次迭代中都会被评估。(我最初对此理解有误——感谢 Mark 指出这仅仅是风格问题,而非性能问题。)

0
0 1
文章 John Pan · 8 分鐘 前 4m read

概述

三年前,我们开始将 Azure Service Bus(ASB)作为企业消息传递解决方案投入使用。它目前被用于在组织内的众多应用程序之间发布和消费数据。 由于数据流较为复杂,且一个应用程序的数据通常需要被多个应用程序使用,因此“发布者”→“多个订阅者”的模式非常适合。本组织中ASB的日消息量达数千万条,而IRIS平台的日消息量则约为200万至300万条。

ASB 存在的问题

在开始进行 ASB 集成时,我们发现 AMQP 协议并非 IRIS 部署的“开箱即用”选项,因此我们一直在寻找一种替代方案,以便与 ASB 进行通信。

解决方案

我们开发了一个本地 Windows 服务(基于 .NET 和 Swagger),由其负责与 ASB 进行实际通信。该服务安装在与 IRIS 相同的机器上。我们将消息发送到 ASB 时,会先发送给这个本地 Windows 服务(通过 localhost 并调用 REST API),随后由该服务完成后续处理。 该方案运行了几年,效果良好,但监控流量、调试“丢失”的消息以及衡量整体性能却非常困难。事实上,将这个本地 Windows 服务作为“中间人”始终不是最佳架构。

IRIS 嵌入式 Python 早期访问计划 (EAP)

我受邀(或者是我自告奋勇的,记不清了)参与了嵌入式 Python 的早期发布计划(ERP)。

0
0 1
文章 cheng yu · 24 分鐘 前 1m read

这是我的SQLgateway系列文章的第6篇。作为InterSystems的产品,Caché
,自然成了一个相当自然的选择。除了其他技术之外,SQLgateway还提供了
多种迁移至 IRIS 的途径之一。如果只是部分
且需要反复更新

这次,获取正确的JDBC驱动程序非常容易,因为它已包含在安装包中。
 相关文档内容详尽且清晰。 

注意:
要与 Caché 建立网络连接,您需要相应的许可证。
Caché 默认仅支持单用户且不支持网络连接。 
请添加有效的许可证,并在 /cache/Dockerfile 中启用复制功能。

构建完成后,容器运行完美,迁移过程
十分顺利。DDL 版本方面未出现任何问题。我使用默认的 SAMPLES 命名空间
作为数据源。此外,您还有丰富的选择。

但与其他所有情况一样,请注意跨依赖关系。

警告:这只是经典技术
——IRIS仅支持SQL、Java和ISOS 
——没有机器学习、没有人工智能、没有 Python,也没有其他花哨的工具。
您可能会期待看到更多关于 SQLgateway 的演示。

0
0 1
文章 cheng yu · 25 分鐘 前 1m read

这是我的SQLgateway系列文章的第7篇。 
最后但同样重要的是,作为 InterSystems 旗下产品,IRIS 本身也自然而然地成为了目标。 
除了其他变体外,SQLgateway 还提供了一种与 
。无论是部分迁移,还是需要 
重复更新(归档?)

这次,获取正确的JDBC驱动程序非常容易,因为它已包含在安装包中。
 相关的文档内容详尽且清晰。 

我面临的主要挑战是让 Docker-Compose 运行同一个 Docker 构建
,但需要使用不同的配置——这些配置必须在容器启动时进行设置。

我使用了Caché-SAMPLES中广为人知的Sample.*类子集 
中广为人知的 Sample.* 类的一个子集,并控制其规模适中,以确保启动和测试速度达到可接受的水平。

按要求配置完成后,容器运行完美,模拟的
“迁移”过程十分顺利。DDL 版本无问题,也无依赖关系问题。

警告:这只是经典技术
——仅使用 SQL、Java 和 ISOS 的 IRIS 
——没有机器学习、没有人工智能、没有 Python,也没有其他花哨的工具。

0
0 1
文章 cheng yu · 26 分鐘 前 1m read

这是我关于 IRIS SQLgateway 系列文章的最后一篇。

                         
在介绍了7个将DB_Migration迁移到IRIS的示例后,我实在忍不住将 
将围绕 IRIS 的各个独立包整合到一个包中。
将8个容器整合到1个 Docker-Compose 文件中,感觉就像驾驶一辆八缸发动机汽车一样。

  • sqlgateway-magnificent-7 > IRiS1
  • 1 个 oracle21c
  • 2 个 MySQL
  • 3 个 PostgreSQL
  • 4 IBM DB2
  • 5 MS SQL
  • 6 Caché
  • 7 IRIS2

各个映射的同步是最大的挑战。
其次是提供的测试数据量。下载部分
GB数据的下载过程令人煎熬,还引发了一些麻烦。

再次衷心感谢@Yuri Marx提供的这套出色的数据集。
测试系列与独立软件包中的完全一致
可能只有IP端口发生了变化。尝试连接其他数据库是一次有趣的体验
接触其他数据库。MSSQL 带来了最多的麻烦。
提示:
此外,我的 Docker Desktop 在单个 Compose 文件中同时启动 8 个容器时似乎遇到了困难。
通过 Docker 控制台手动重启容器解决了该问题:
若缺少 Cache.Key,则需重建镜像或手动添加。

在我个人的评分中,IRIS 毫无疑问是赢家。 
你感到惊讶吗?

0
0 1
文章 cheng yu · 27 分鐘 前 2m read

我之前关于SQLgateway 迁移的系列文章,是一篇篇幅较长的文章,介绍了
了可用的各种方案。不过它既不易操作,又难以追踪。
因此,我的挑战是:如何“吃掉一头大象”?>> 把它切成小块!!

我的目标是兼顾两点:既能独立创建每个容器,又能
同时支持一键构建整个集合。因此现在可以
在不影响其他容器的情况下修复单个容器的问题。

结果证明,这变成了一次关于 Docker 网络和脚本编写的实践,

  • 每次执行 Docker-Compose Up 都会创建一个独立的网络。因此,与
    前面的示例那样简单地启动,也会生成8个彼此隔离的网络。
    解决方案:定义一个公共网络并将容器加入其中。
    现在 TCP/JDBC 可以找到服务器,而且我们再也不会遇到端口冲突了
  • 为了启动所有容器而连续执行 8 次 `docker-compose up -d` 实在不太好玩 
  • 解决方案:Docker Compose 提供了一个 INCLUDE 指令。只需点击一下,一切就搞定了。
include:   
  - ./iris1/docker-compose.yml   
  - ./cache/docker-compose.yml    
  - ./ibmDB2/docker-compose.yml   
  - ./iris2/docker-compose.yml    
  - ./MSsql/docker-compose.yml   
  - ./mysql/docker-compose.yml   
  - ./ORACLE/docker-compose.yml   
  - ./postgres/docker-compose.yml
0
0 1
文章 cheng yu · 28 分鐘 前 2m read

通过邮件发送信息是网络中历史最悠久的技术之一
。邮件传输标准于1980年正式发布。
SMTP 代表简单邮件传输协议。
IRIS自诞生之初乃至更早之前就已支持SMTP。
随着时间的推移,各种功能不断演进,特别是与
安全、编码、身份验证、多部分邮件等方面……
相关文档在各个细节上都十分详尽。您可以在
类、方法、实用程序和示例。

本示例提供了一个非常简单的入门起点。
如果您要发送电子邮件,就需要一台能够接收邮件的 SMTP 服务器。
这可以是你选择的某个外部服务器,但同样,IRIS
已做好充分准备为您提供服务。互操作性功能可满足您的所有需求。
因此,该软件包为您提供了一个用于测试的最小规模生产环境。
该服务不会将数据写入真实的生产环境,而是将输入写入一个全局
,您可以立即查看。
因此,该演示程序可以在单个实例中运行,以发送和接收邮件。
提供了一个涵盖所有必要步骤的精简测试例程。

所有操作均通过一个包含 5 个操作的命令行会话进行控制

  • do mail; 编写一封包含2行的简单邮件
    若需更多文本,请向字符流 %mail.TextData 中添加内容
    ,同时别忘了调整文本大小
  • do start ; 启动 SMTP 服务器生产环境
    • 17:27:37.285:Ens.Director: Production 'mail.Receive' starting...
      17:27:37.332:Ens.Director: Production 'mail.Receive' started.1
0
0 1
文章 cheng yu · 29 分鐘 前 2m read

IRIS 在处理和管理表格中的数据方面表现非常出色。
但正如您在标准包中所见,它在逻辑处理方面同样表现出色
分析、互操作性、所有与健康相关的处理,最重要的是,
来自我们全球合作伙伴的庞大应用程序集合。

所有这些应用程序都有一个共同的需求:
总有一些中小规模的信息需要处理,
,这些数据根本无法适应任何重复的表格结构。我常举的例子 
就是一串文本行,比如我从妻子那里收到的购物清单。

  • 它具有有限的生命周期, 
  • 维度有限, 
  • 结构难以预测
  • ,且每一条都是独一无二的作品 

将此类信息强行塞入表格是可行的,且这种情况经常发生。
但这种做法效率低下,特别是对于易变信息而言。

一种典型的做法是将信息保存在本地数组中:
但这可能会导致处理分区的内存达到极限。
因此,请将原始信息保存到一个全局数组中,该数组应采用与
处理机制的 GLOBAL 数组中保存原始信息。
这种方法速度很快,而且作为一名经验丰富的ObjectScript开发者,你会使用
“进程私有全局变量”(Process Private Global)来规避日志处理的开销
,一旦工作完成,它就会随你的进程一同消失,不留痕迹。

下一个挑战:  
由于处理过程可能耗时较长,可能会阻塞进程中的交互式
用户界面。那么,你可以将处理任务移交给一个 
后台作业,其优势在于可以预先选择要
:食品购物清单可能与园艺购物清单有所不同。
此时,您的“流程私有全局变量”将无法正常工作。它在后台环境中不可用。

0
0 1
文章 cheng yu · 29 分鐘 前 1m read

OEX半持久化表中的前一个示例与一篇 
,该文发表于2020年, 题为《半持久类与表》,其内容 侧重于传统的 
存储模型,并通过间接引用实现存储全局变量的动态变更。
这种方法存在局限性和风险,而本文则避免了这些问题。  

描述

基类(User.Common)是一个模板,可应用于
USER、CLERKS、CUSTOMERS、PPG……等类,这些类彼此独立
。 
区别在于:User.Common 类使用了[NoExtent]参数
,因此不包含存储定义。
随后,将在各个类中指定要使用的存储。 
现在,它是一个静态值,用于定义要使用的全局变量。 
而且这是一个非常简单的定义。例如:

Class User.USR Extends User.Common [ Not NoExtent ]
{
Parameter DEFAULTGLOBAL As STRING = "^USR";
}

其余所有工作均由编译器完成。
副作用:POPULATE 现在针对每个类/表都是特定的。

0
0 1
文章 cheng yu · 30 分鐘 前 1m read

 一位隐世传奇的几点观察

大约80个月前(约6.5年),我开始列出实际的
Open Exchange中软件包的实际评测,方法是反向分析
相关网页。因此,这也算是一种历史记录。
我之所以对此特别感兴趣,源于我2005年提出的一项相关提案
,但当时被否决了。不过,10年后这一构想终于得以实现。 
因此,我感觉自己有点像OEX的“虚拟爷爷”。
我收集的已发布软件包数量比 
,因为其中有些软件包已被删除,或者只是 
未发布。与软件包类似,有些贡献者也已消失或退出了。
尽管IPM/ZPM的实现使得在极少数情况下,
即使代码已从GitHub上消失,也能在极少数情况下“找回”这些“丢失”的代码。

现在来看具体数据:

  • 已识别软件包总数: 1420
  • 已审核的软件包: 1065
  • 由我审核的包: 873
  • 由他人审核的包: 192
  • 贡献成员: 392

令人惊讶的结果:

  • 仅27名成员的贡献就占了50%的软件包(即720个) 
  • 仅10名成员提供了排名前33%的软件包(=470)
  • 仅有 6 名成员贡献了排名前 25% 的软件包(=354) 

0
0 1
文章 cheng yu · 31 分鐘 前 2m read

在 OEX 上浏览我的包时,我想起了一个
关于SQL主机变量的示例。 

您可能看过我关于《Open Exchange Reviews》的系列文章
每条报告行都会被分配一个系列编号(末尾的 #76)
一旦发布,我就不再太关注它了。 
我只关注最后那份尚未发布的、带有 MAX(serial) 的报告。
简单思路:

SELECT serial,label, . . . from oex.dir WHERE serial = MAX(serial)

哎呀:: SQLCODE=-19
   聚合函数不能用于WHERE或GROUP BY子句中  
此外:对每个“serial”的出现位置都运行MAX(),性能并不理想。 
我当时想找一种方法,计算出一个静态值来与之进行比较。
因此,我编写了一个名为 SMX 的自定义静态 SQL 方法,如下所示:

ClassMethod SMX(dif As %Integer = 0) As %Integer [ SqlName = SMX, SqlProc ]
{
 set max=$g(^||max,0)
 if 'max {
    &sql(SELECT max(serial) into :max from oex.dir)
    set ^||max=max
 }
 quit max+dif
}
0
0 1
文章 cheng yu · 35 分鐘 前 4m read

这是对Caché问世前历史的一种相当个人化的看法。
这绝非意在与前文中讨论的迈克·卡多(Mike Kadow)所著的那些优秀书籍相抗衡。
我们的经历各不相同,因此本文旨在从另一个角度来审视过去。

整个故事始于 1966 年,地点在MGH(马萨诸塞州总医院),当时一台序列号为 103 的PDP-7
,该机配备 8K 内存(18 位字)[相当于今天的 18K 字节],当时作为备用系统使用。

“序列号103——当时位于现已拆除的塞耶大楼(Thayer Building)地下室,地址为
,目前 [2014年]该地是MGH考克斯癌症中心(Cox Cancer Center)的所在地。”
“尼尔·帕帕拉多(Neil Papparlardo)和柯特·马布尔(Curt Marble)在奥克托·巴内特(Octo Barnett)的指导下,开发并发布了
——这是该机器上的首款软件。” 
他们将其命名为MUMPS。(来源)


PDP-7

该语言本身与旧式的Basic语言相当接近。
但与其他编程语言相比,它有着显著的改进:

  • 其核心理念在于无需处理文件系统即可存储和检索持久数据。
0
0 2
文章 cheng yu · 38 分鐘 前 5m read

大家好,

本文旨在说明如何在 IRIS 和 Microsoft Teams 之间建立消息传递功能。

在我们公司,为了监控错误消息,我们曾使用 Ens.Alert 类通过一个业务操作将这些错误消息重定向,该操作会发送一封电子邮件。
问题在于,这些错误消息被发送到一个支持邮箱,而该邮箱已积压了大量邮件。我们希望为特定的团队提供专属的错误通知机制。

因此,我们研究了如何让这些消息直接送达开发团队,使他们能够实时收到生产环境出现错误的通知。
由于公司将 Microsoft Teams 作为企业级协作工具,我们便思考:如何让这些消息直接送达 IRIS 开发团队?

0
0 1
文章 cheng yu · 39 分鐘 前 2m read

大家好

对于感兴趣的朋友,这里分享一个我在某个项目中使用的实现示例,该示例利用 pymongo 包实现了与 MongoDB 的互操作。

iris-mongodb

通过 pymongo 包实现 InterSystems IRIS 与 MongoDB 的互操作(包括出站适配器)

请务必导入pymongo包。

此处提供用于测试的实现示例

NAMESPACE> do ##class(custom.python.pymongo.test).TestMongoDBCrud()

为了实现互操作性,请在业务操作中使用以下适配器:

Parameter ADAPTER = "custom.python.pymongo.outboundAdapter";

Parameter INVOCATION = "Queue";

查询示例:

/// parameters: (dbName, collectionName, query, fields, sort, limit) => query, fields and sort are %DynamicObjects
/// resultset is an array of objects (%DynamicArray)
set resultset = ..Adapter.Query("mydb","mycollection", {"_id":(tId)})
0
0 1
文章 cheng yu · 47 分鐘 前 19m read

我每天都在使用嵌入式 Python,至今已有两年多了。 也许现在是时候分享一下这段经历的感想了。

为什么要写这篇心得?因为,我想,我和这里的大多数人一样,都是一名ObjectScript开发者,而且我认为这些心得能给社区带来帮助,让大家更好地了解在IRIS中选择嵌入式Python进行开发所涉及的利弊,同时也避免一些陷阱。

image

引言

我自2010年起从事开发工作,自2013年起开始使用ObjectScript。

0
0 1
文章 cheng yu · 50 分鐘 前 17m read

引言

如今,像Claude、GitHub Copilot和Cursor这样的编码助手已经彻底改变了开发者编写代码的方式。 然而,这些工具因与开发人员日常使用的系统和数据源隔离而受到限制。这一限制可以通过模型上下文协议(MCP)来克服——这是一项开放标准,旨在以安全且标准化的方式将 AI 助手与外部数据源和工具连接起来。

在这篇综述文章中,我们将探讨 InterSystems 生态系统内 MCP 的最新发展状况。 此外,我们将探讨该开放标准如何将 AI 助手与外部数据源连接起来,并展示一个用 Python 开发且与intersystems-irispython 包集成的自定义 MCP 服务器的首个示例。

目录

目录

  • 第 1 部分:什么是模型上下文协议?
    • 1.1 起源与背景
    • 1.2 为什么 MCP 很重要
  • 第 2 部分:了解 MCP 架构
    • 2.1 客户端-主机-服务器模型
    • 2.2 传输层
    • 2.3 数据层
    • 2.4 核心原语
  • 第 3 部分:使用 Python 从零开始构建 MCP 服务器
    • 3.1 使用 uv 创建新的 Python 包
    • 3.2 MCP 服务器的基本结构
    • 3.3 实现核心原语
  • 第 4 部分:将 MCP 与 AI 开发工具结合使用
    • 4.1 配置 MCP 服务器
  • 第 5 部分:使用 uv 和 uvx 分发和运行 MCP 服务器
    • 5.1 本地克隆(开发模式)
    • 5.2 GitHub 仓库
    • 5.3 PyPI
      • 5.3.
0
0 1
文章 cheng yu · 51 分鐘 前 8m read

https://media.giphy.com/media/Nxu57gIbNuYOQ/giphy.gif

别急,别急,我可不是在鼓吹那种科幻片里常见的“反机器战争”,为了阻止奥创或天网统治世界。 还没到那一步,还没到那一步 🤔

我邀请大家通过使用 ObjectScript 并嵌入 Python 来制作一款非常简单的游戏,以此向机器发起挑战。

我必须说,InterSystems IRIS 上的“嵌入式 Python”功能让我超级兴奋,它为创建精彩的应用打开了无数可能性,简直令人难以置信。

让我们来制作一个井字棋游戏吧,规则非常简单,我相信大家都知道怎么玩。

在孩子们还没有手机或平板电脑的年代,正是这个游戏让我在童年时期与家人长途驾车旅行时免于无聊——没有什么比在模糊的车窗玻璃上挑战兄弟姐妹来几局更让人乐在其中的了。

所以,系好安全带,我们开始吧!

规则

如前所述,规则非常简单:

  • 每局仅限2名玩家
  • 在3×3的网格上轮流下棋
  • 人类玩家始终代表字母X,电脑代表字母O
  • 玩家只能将字母填入空格中
  • 最先在水平、垂直或对角线上连成3个相同字母的一方获胜
  • 当9个空格全部被填满时,即为平局,比赛结束

所有机制和规则都将用ObjectScript编写,而电脑玩家的机制将用Python编写。

让我们动手实践吧

我们将通过一个全局变量来控制棋盘,其中每一行对应一个节点,每一列对应一枚棋子。

0
0 1
文章 cheng yu · 53 分鐘 前 2m read

与图片中提到的电影(对于不了解的人来说,就是1999年的《黑客帝国》)不同,在动态SQL和嵌入式SQL之间做出选择,并非在现实与幻想之间抉择,但这仍然是一个需要做出的决定。下面,我将尝试帮助您更轻松地做出选择。

如果您的需求是客户端与应用程序(进而与数据库)之间的交互,那么动态 SQL 可能更合适,因为它能非常轻松地“适应”这些查询变化。然而,这种动态性是有代价的:每次新的查询都会重新构建,这可能会导致更高的执行成本。下面是一个简单的 Python 代码片段示例。

0
0 2
文章 cheng yu · 56 分鐘 前 4m read

我决定在时间抹去我的记忆之前把这件事写下来
这是一个非常私人的故事,涉及我作为合作伙伴、竞争对手、员工、
作为客户,以及最后作为InterSystems的外部观察者,

0
0 2
文章 cheng yu · 59 分鐘 前 6m read

引言

REST API(表征状态转移)是一种接口,它允许不同的应用程序通过HTTP协议,利用GET、POST、PUT和DELETE等标准操作进行相互通信。REST API在软件开发中被广泛应用,用于提供可供其他应用程序访问的服务,从而实现不同系统之间的集成。

然而,为了确保 API 易于理解和使用,完善的文档至关重要。这就是 OpenAPI 发挥作用的地方。

OpenAPI 是一种用于描述 RESTful API 的标准。它允许以结构化的方式定义 API 的功能,包括指定可用的端点、接受和返回的数据类型、必需的参数以及预期的响应。 所有这些信息都汇总在一个规范文件中(通常扩展名为 .yaml 或 .json),自动化工具可以解析该文件以生成代码、文档等内容。

OpenAPI 规范旨在同时满足机器和人类的可读性,从而以标准化方式实现 RESTful Web 服务的描述、生成、使用和可视化。因此,OpenAPI 文档代表了对 API 的正式描述,既有助于需要使用该API 的开发者,也便于相关工具利用它来自动化各种流程。

定义规范文件有什么用处?

采用 OpenAPI 来记录 API 具有以下几个好处:

  • 清晰度:它提供了详细且结构化的文档,使开发人员能够快速了解如何与 API 交互、应发送哪些请求以及响应中会包含哪些数据。
  • 自动化:文档可从代码中自动生成,并能随着 API 的任何变更而保持最新。
0
0 2
文章 cheng yu · 1 小时 前 6m read

Prettier 适用于 ObjectScript

如果您在 JavaScript 或 TypeScript 代码中使用Prettier,现在也可以将其用于 ObjectScript 了。prettier-plugin-objectscript是一个 Prettier 插件,可对类(.cls)、例程(.mac, .int)以及包含文件()。

前后对比

该插件使用tree-sitter-objectscript 的语法规则、用于类的 UDL 语法以及用于例程和包含文件的例程语法来解析文件,并通过 Prettier 3 进行格式化输出。语法规则的选用依据文件扩展名、命令行参数以及 VS Code 中的设置。以以下类为例:

Class Demo.Greeter Extends %RegisteredObject {
Property Name As %String [Required];

/// Returns a greeting for the given name.
ClassMethod Greet(name As %String="world",times As %Integer=1) As %String [ Private ]
{
 s result=""
 f i=1:1:times {
 s result=result_"Hello, "_name_"! "
 }
 q:name="" "nobody"
 i times>1 { w "Greeted ",times," times",! }
 q result
}
}
0
0 4
问题 John Pan · 3 小时 前

你好,

我正在使用Ensemble 2018,并通过EnsLib.HL7.Operation.HTTPOperation经由 HTTPS 发送 HL7 消息。
我正在研究是否可以通过ReplyCodeActions及相关操作设置,针对不同的失败类型配置不同的重试行为。

我的需求是:

  • 对 TCP/IP 连接问题进行无限期重试。
  • 对其他错误仅在短时间内(300秒)进行重试。

我已配置如下:

ReplyCodeActions: E*无法打开 TCP/IP 套接字=R,E=RF
FailureTimeout : 300s

我原本希望诸如“无法打开 TCP/IP 套接字”之类的 TCP/IP 连接错误能无限期地继续重试,而其他错误则仅重试 300 秒。

然而,我观察到 TCP/IP 错误在配置的 FailureTimeout 时间段结束后也会停止重试。

是否有任何设置或支持的机制,可以允许特定错误(例如,由 E* ReplyCodeAction 模式标识的 TCP/IP 连接错误)无限期重试,同时对所有其他错误保持有限的 FailureTimeout 重试时间?

谢谢

0
0 5
公告 Claire Zheng · 17 小时 前

InterSystems Reports 26.2 版本现已在 InterSystems 软件分发网站的“组件”部分发布。该软件以“InterSystems Reports Designer”和“InterSystems Reports Server”的名义列出,支持 macOS、Windows 和 Linux 操作系统。

此版本对通过 Reports Server 提供的 Page Studio 和 Web Studio 的焕新用户界面进行了进一步优化。(请参阅下文的许可更新。)其他增强功能包括通过 TrueType 字体扩展了字体支持,新增了 2D 条形码,以及来自我们的合作伙伴 insightsoftware 的众多修复、安全更新和其他增强功能。

InterSystems Reports 26.2 基于 Logi Report 26.2 Service Pack 2 构建。如需了解更多信息,请参阅 insightsoftware 提供的发布说明。

2026 年的许可更新

自 2026 年 1 月起,InterSystems 增加了对Page Report Studio和Web Report Studio 的访问权限。这些功能使客户能够直接在报告服务器上执行更多报告编辑操作,从而减少了许多报告设计任务对安装 Report Designer 的需求。

0
0 6
文章 John Pan · 17 小时 前 9m read

《Readback》是我参加 InterSystems 编程大赛*“互操作性工作流中的 AI 代理*”主题的参赛作品。 一个 InterSystems AI Hub 代理在 IRIS for Health 互操作性生产环境中对实验室结果进行分级处理。它可以将结果升级为“危急”级别,但绝不会将规则已判定为“危急”的结果降级,且在有人正确复核该数值之前,系统不会向任何人发送“危急”结果的通知。

通过构建该代理,我总结出的核心经验是:**规则保障安全,而代理负责解释。**我对此进行了测试,相关数据如下。

问题

一项关键的实验室检测结果——例如钾离子浓度为6.9 mmol/L,或血红蛋白在一天内下降了4 g/dL——如果相关人员未能获知并复述该结果,那么这些数据便毫无用处。以下两个环节的失误至关重要:

  • **遗漏:**危急结果被误报为正常。
  • **开环:**通知已发出,但无人确认。
0
0 8
文章 John Pan · 十一月 5 5m read

Hugging Face 提供了一个庞大的数据集集合,涵盖自然语言处理、分类、问答以及其他机器学习任务。要在 InterSystems IRIS 中使用这些数据集之一,开发人员通常需要下载该数据集,将其字段映射到 SQL 数据类型,创建表,并加载数据行。

iris-hf-import简化了这一流程。它允许您通过单个 ObjectScript 调用,将 Hugging Face 数据集导入到 IRIS SQL 表中。

该项目实现了Ideas Portal 中的 DPI-I-543 提案:将 Hugging Face 数据集加载到 IRIS 中,并为社区赏金计划的第三轮而创建。

导入数据集

安装包后,打开 IRIS 终端并运行:

write ##class(dc.hfloader.Loader).Load("hitorilabs/iris", "train")

该命令将加载数据集 hitorilabs/iris 的 train 分割集,创建目标表,并插入相关行。

在我的测试环境中,该调用返回了如下结果:

{
  "status": "success",
  "error": "",
  "dataset": "hitorilabs/iris",
  "config": "default",
  "split": "train",
  "table": "HFData.iris",
  "rowsWritten": 150,
  "columns": 5
}
0
0 8
文章 cheng yu · 十一月 5 10m read

人工智能代理即使出错,依然可能很有用

回复丢失了,但变更依然生效。我觉得我以前遇到过这种情况。

一个管理请求可以成功到达 InterSystems IRIS,修改配置,但在返回途中丢失了响应。操作员看到一条错误提示,但配置变更实际上已经生效。如果软件将无响应视为失败并重新发送请求,那么自动化反而会引发下一起故障事件。

这一切始于“请求超时。IRIS 是否已更改?”。首要任务是让不确定性保持可见,并防止因回复丢失而导致重复操作。现在,我们要求代理协助调查这种不确定性,同时仍坚持对证据的相同要求。

在《让创造力引领》一文中 让执行可追溯》一文中,我曾探讨如何在给予人员和代理创新空间的同时,确保最终工作结果能经得起证据检验。在那一阶段,Battery 已具备合成演示环境和经过测试的实时只读连接。下一步是进行真实的配置变更,通过原生 AI Hub 进行审查,并找出我们的信心超前于实际实现的环节。

这就是接下来的这一步。代理出错了,我们的代码也出错了。但我们继续前行。

这正是我希望Armada Battery去面对的问题。我打算通过让机器对其行为负责来取得成功。这当然不是什么特殊的设计难题,但很少有人会将此视为一项耀眼的成就。这是一个值得坚守的真理:怀疑并非弱点。批判性的眼光比盲目的崇拜更有价值。

那个比响应更持久的变更

我们的联机测试使用了 IRIS AI Hub EAP 109 版的一次性安装环境。

0
0 6