New post

查找

Article
· Dec 25, 2024 2m read

在IRIS 2024.2 中使用 WebTerminal

IRIS 2024.2 版本包含一项变更(DP-432503),该变更要求Web Gateway最初连接到 IRIS 时所使用的用户(通常是 CSPSystem)必须对承载 REST web applicatioon 的dispatch类的数据库具备 READ 权限。

在不满足该条件的情况下,就会引发一个错误,这会向调用者返回一个 HTTP 404 状态码,而非预期的 HTTP 401 状态码。

显然,这个问题将在 2024.3 版本中修复,参考编号为 DP-432898 / ALI048:REST 登录端点将返回 401 HTTP 错误码而非 404,但作为持续交付(CD)版本,2024.2 不会获得维护版本修正。

解决方法是让 CSPSystem 用户对安装WebTerminal所在命名空间的数据库具备读权限。

下面是所需的步骤:

1. 创建一个新的资源 “%DB_WEBTERMINAL”,并设置 “WEBTERMINAL” 数据库使用该资源,而非 “%DB_% DEFAULT”。

2. 创建一个名为 “% DB_WEBTERMINAL” 的角色,该角色能让角色持有者对 “% DB_WEBTERMINAL” 资源具有读写(RW)访问权限。

3. 再创建另一个角色(我将其命名为 “DBread_WEBTERMINAL”),该角色仅赋予角色持有者对该资源的读(R)访问权限。

4. 为 “CSPSystem” 用户赋予 “DBread_WEBTERMINAL” 角色。这样可以解决 2024.2 版本存在的这个漏洞。

5. 编辑 “/terminalsocket” web application,并将 “%DB_WEBTERMINAL” 添加到 “应用程序角色(Application Roles)” 选项卡中。这一步骤是必要的,因为WebTerminal 最初是以 “UnknownUser” 身份运行其 websocket 进程的,并且甚至在切换为以已认证用户身份运行之前,就需要更新其数据库中的状态信息。

另一种简便单但不是安全的方式:

  • 创建一个具有读写(RW)公共权限的新安全资源 “%DB_WEBTERMINAL”,然后设置 “WEBTERMINAL” 数据库使用该资源,而非 “%DB_%DEFAULT”。

更多以及详细信息参见下面内容:https://github.com/intersystems-community/webterminal/issues/155

Discussion (0)1
Log in or sign up to continue
Article
· Dec 24, 2024 1m read

新的WebTerminal —— iterm

Web Terminal 已经存在相当长一段时间了,但它存在诸多限制,并非所有功能都能正常使用。它不支持 shell,也没有诸如嵌入式 Python 支持这样的最新功能。对于那些需要编程模式的工具来说,存在一些问题。基本身份验证也不如简单的登录页面便捷,使用登录页面的话,倘若你想要改变登录应用程序的方式(比如使用单点登录,即 SSO),你还可以自行添加登录页面。

通过将最初的iris terminal 封装到一个网页表单中,利用在网络领域应用极为广泛且同样被像 Visual Studio Code(VSCode)这类工具所使用的 xterm.js,并借助 Python 施展的一些 “魔法”(这些 “魔法” 有助于实现进程间的终端交互),我们就能在网络上完整地实现终端功能了。

安装方法

zn "%SYS"
zpm "install iterm"

iTerm

为了测试它是如何在web中工作的,可以执行 term routine,如下

iTerm

Discussion (0)1
Log in or sign up to continue
Article
· Dec 24, 2024 1m read

如何基于表格现有数据新增数据列

现有一个数据表的数据像这样:

我们的需求是基于表中的Item列新增一个status字段,如果item的内容是第一次出现,那么status列就是New,反之显示Old,

比如,应该是下面的显示内容

 

在原文章的回复中, Robert Cemper给出了下面的建议

新建一个存储过程,并在SELECT查询语句中生效:

/// Return NEW for first occurance of item 
/// otherwise return OLD
Class User.ItemStat Extends %RegisteredObject
{
ClassMethod NewOld(item As %String = "") As %String [ SqlProc ]
{
    if item="" quit "?"
    if $d(^||list(item)) quit "OLD"
    if $i(^||list(item)) quit "NEW"
}
}

使用下面SELECT语句使之生效:

SELECT *, ItemStat_NewOld(item) as Status
FROM items order by 2

结果如下:

ID	date	  item	Status
1	09/13/1932	A	NEW
2	04/06/1933	D	NEW
10	06/15/1940	A	OLD
4	11/26/1940	A	OLD
6	02/19/1956	B	NEW
8	04/22/1957	D	OLD
7	05/01/1959	D	OLD
9	06/29/1961		?
3	07/04/1992	B	OLD
5	12/08/2020	D	OLD
Discussion (0)1
Log in or sign up to continue
Announcement
· Dec 24, 2024

★受賞者発表!★InterSystems アイデア実現コンテスト(USコミュニティ)

開発者の皆さん、こんにちは。

アイデア実現コンテストの勝者が発表されましたのでお知らせします!

今回は 13 applications 🔥の素晴らしい投稿がありました!


Experts Nomination

🥇 1位 - $5,000 は、vault-link を開発された @Henrique Dias さん @Henry Pereira さん  @José Pereira さんに贈られました。 

🥈 2位と3位 - $2,250 は、IRIS Global VSCode Editor を開発された @Yuri Marx Pereira Gomes さんと tz - ObjectScript Time Zone Conversion Library を開発された @Eric Fortenberry さんに贈られました。  

🏅 4位 - $750 は、docs-intersystems を開発された @Dmitry Maslennikov さんに贈られました。 

🏅 5位 - $500 は、iris-unit-test-dashboard を開発された @Chi Nguyen-Rettig さんに贈られました。  

🌟 $100 - iris-HL7v2Gen を開発された @Muhammad Waseem さんに贈られました。 

🌟 $100- iris-http-calls を開発された @Oliver Wilms さんに贈られました。  

🌟 $100 - SharePoint Online SPO REST API を開発された @Mark OReilly さんに贈られました。  

🌟 $100 - Doxygenerate を開発された @John Murray さんに贈られました。  

🌟 $100 - ks-fhir-gen を開発された @Robert Barbiaux さんに贈られました。  

Community Nomination

🥇 1位 - $1,000 は、Database-Size-Monitoring を開発された @sara aplin さんに贈られました。  

🥈 2位 - $750 は、ServiceInspection を開発された @Wolis Oliavr さんに贈られました。 

🥉 3位 - $500 は、IRIS Global VSCode Editor を開発された @Yuri Marx Pereira Gomes さんに贈られました。  

🏅 4位 - $300 は、vault-link を開発された @Henrique Dias さん @Henry Pereira さん @José Pereira さんに贈られました。  

🏅 5位 - $200 は、iris-unit-test-dashboard を開発された @Chi Nguyen-Rettig さんに贈られました。 

受賞された皆さん、おめでとうございます!また、コンテストにご興味お持ちいただきありがとうございました!

次回のコンテストもご期待ください!

Discussion (0)1
Log in or sign up to continue
Article
· Dec 24, 2024 3m read

Interoperability(Ensemble)の大量にたまったイベントログやメッセージをAPIを利用して削除する方法

これは InterSystems FAQ サイトの記事です。

イベントログの削除には、Ens.Util.LogクラスのPurge()メソッドを使用します。実行時以下の引数を指定します。

第1引数:削除数(参照渡し)

第2引数:保持日数(デフォルト7)

 

メッセージの削除には、2種類の方法があります。

1) 2022.1.2以降の導入されたマルチプロセスで削除する方法

Ens.Ens.Util.MessagePurgeクラスのPurge()メソッドを使用します。実行時以下の引数を指定します。

第1引数:削除数(参照渡し)

第2引数:保持日数(デフォルト7)

第3引数:1を指定(Completeではないメッセージの削除を防止するための指定)

第4引数:メッセージボディも一緒に削除する場合は1を指定

第5引数:デフォルトは500(秒)が設定されていますが、大量のメッセージをパージするとクリアされたビットマップの最適化に時間を要して最適化が完了しない場合があるため、大量削除の場合は 10000000000など大きな値を指定します。

2) Ens.MessageHeaderクラスのPurge()メソッドを使用する方法。

実行時以下の引数を指定します。

第1引数:削除数(参照渡し)

第2引数:保持日数(デフォルト7)

第3引数:1を指定(Completeではないメッセージの削除を防止するための指定)

第4引数:メッセージボディも一緒に削除する場合は1を指定

 

上記パージ用メソッド実行時、ログ削除の内容もジャーナルに記録されますので、Purge()メソッド実行中プロセスのジャーナルファイルへの書き込みを無効にする設定を使用します。

※ジャーナルファイルへの書き込みが無効化されるのは、以下ユーティリティを実行しているプロセスのみのため、システム全体に影響はありません。

※注意※ ミラーリングを使用している環境でミラーデータベースへの更新ではこのジャーナル無効化の影響を受けず、ジャーナルが記録されますのでご注意ください。

以下実行例です。

//使用中プロセスのジャーナルファイルへの書き込み無効化
do DISABLE^%NOJRN
//イベントログを直近7日分を保持して削除
set st=##class(Ens.Util.Log).Purge(.cnt,7,1)
//削除数確認
write cnt,!

//マルチスレッド対応のメッセージヘッダとボディを直近7日分を保持して削除する
set st=##class(Ens.Util.MessagePurge).Purge(.cnt2,7,1,1,10000000000)
//削除数確認
write cnt2,!

//メッセージヘッダとボディを直近7日間分を保持して削除
set st=##class(Ens.MessageHeader).Purge(.cnt3,7,1,1)
//削除数確認
write cnt3,!

//使用中プロセスのジャーナルファイルへの書き込み有効化
do ENABLE^%NOJRN
Discussion (0)1
Log in or sign up to continue