文章
· 九月 29, 2022 阅读大约需 3 分钟
第一章 Caché 服务器页面简介 - 什么是CSP

第一章 Caché 服务器页面简介 - 什么是CSP

Caché Server Pages (CSP) 既是用于构建交互式 CSP 应用程序的架构又是工具集。 CSP 技术允许构建和部署高性能、高度可扩展的 Web 应用程序。 CSP 允许动态生成网页,通常使用来自 Caché 数据库的数据。 “动态Dynamically”意味着每次从最近更改的数据源请求同一页面时,它可能会提供不同的内容。

CSP 用途广泛。它可以

2 0
0 174
文章
· 九月 24, 2022 阅读大约需 2 分钟
使用Global进行数据可视化---商业智能(BI)

在医院但凡接触“数据”和“指标”的人,对以下场景应该是深有感触。同样的指标、同样的时间,有可能是同一个部门出的,最后“数据不一致”。除了“匪夷所思”,更有“深恶痛绝”。那么,如何解决这个问题?我的答案是商业智能(BI)。随着技术和市场的发展,有很多公司开始研发直接面向业务用户的敏捷BI工具,FineBI就是这样的一款BI工具。这个也是我接触的第一款国产BI。

18 0
0 174
文章
· 八月 16, 2022 阅读大约需 2 分钟
第三章 使用管理门户(三)

第三章 使用管理门户(三)

浏览管理门户

管理门户有两种不同的视图模式可供选择以进行页面导航。可以通过单击管理门户功能区中所需的查看按钮随时在查看模式之间切换。视图模式有:

  • 分栏视图 Columns view ——分栏显示页面;这是默认模式。此查看模式允许选择收藏夹并分配自定义资源。
  • 列表视图 List view — 在下拉列表中显示页面名称。

注意:除了使用视图导航管理门户外,还可以通过位于功能区中的搜索工具直接进入页面;有关详细信息,请参阅本章中的管理门户功能区部分。

Columns view

“列视图”显示用于到达目标页面的子菜单。如果单击最终子菜单中的标题/名称,则会显示目标页面;如果在框内单击而不是在标题/名称本身上单击,则操作窗格将显示在右侧。

操作窗格

操作窗格解释了一个菜单选项,并允许执行与其相关的多项操作。要在“列”视图中显示操作窗格,请在最终子菜单中的选项周围的框内单击,而不是在选项本身上单击。可以在操作窗格中执行以下操作:

0 0
0 173
文章
· 七月 10, 2022 阅读大约需 5 分钟
第一章 嵌入式Python概述(一)

第一章 嵌入式Python概述(一)

嵌入式 Python 允许将 Python 与 IRIS 数据平台的本地编程语言 ObjectScript 一起使用。当使用嵌入式 PythonIRIS 类中编写方法时,Python 源代码与编译后的 ObjectScript 代码一起编译为在服务器上运行的目标代码。与使用网关或 PythonNative SDK 相比,这允许更紧密的集成。还可以导入 Python 包,无论它们是自定义的还是公开的,并在ObjectScript 代码中使用它们。 Python 对象是 ObjectScript 中的一等公民,反之亦然。

0 0
0 173
文章
· 九月 17, 2022 阅读大约需 10 分钟
IRIS镜像配置(3)

把数据库添加进Mirror

以往的经验里, 用户在把数据库添加到镜像时遇到过各种各样的问题,以致必须请求外部帮助才能解决。除了步骤本身比较繁琐,很大的原因是阅读文档不细致。还有一个,就是对英文水平不太高的用户,有些英文句式并不是很好懂,比如说,文档中有这一句其实非常关键:

If you attempt to add a new database to the mirror on a nonprimary member that was not created as a mirrored database on the primary, but rather added to the mirror after it was created, an error message notes this and you cannot complete the operation.

我用最好的翻译器DeepL翻译后的中文是:

如果你试图在一个非主要成员上向镜像添加一个新的数据库,而这个数据库并不是在主要成员上作为镜像数据库创建的,而是在创建后添加到镜像中的,那么就会出现错误信息提示,你无法完成操作。

0 0
0 171
文章
· 二月 18, 2022 阅读大约需 6 分钟
SQL语句与数据模式(Select Mode)

在InterSystems IRIS和InterSystems Caché 里,是否您遇到过执行一个SQL Insert/Update语句,明明给的是正确的日期值,但被告知“值‘2022-01-01’ 校验失败”的类似情况,并感到困惑?

如果有,那么您需要了解一下InterSystems IRIS和InterSystems Caché保存和显示数据的模式。



一 数据模式

InterSystems IRIS和InterSystems Caché里,数据有3种模式,称之为SELECT MODE:
逻辑模式:这是数据被保存到InterSystems IRIS和InterSystems Cache'时的格式。例如,%Date类型的数据,在数据库里被保存为一个整数,即从1840年12月31号到这个日期的天数,而不是YYYY-MM-DD的格式。

ODBC模式:这是ODBC对数据定义的格式。在这个模式下,%Date类型的数据就会显示为YYYY-MM-DD的格式。

0 0
0 171
文章
· 八月 17, 2022 阅读大约需 5 分钟
第四章 使用管理门户(四)

第四章 使用管理门户(四)

管理门户页面参考

管理门户由多个页面组成,分为以下功能区域:

  • 主页Home — 管理门户主页
  • 健康Health — 医疗保健页面。仅适用于 IRIS for Health™HealthShare® Health Connect
  • 分析AnalyticsIRIS® 商业智能页面
  • 互操作性Interoperability — 产品页面
  • 系统操作 — 系统操作页面
  • 系统资源管理器 — 数据库管理页面
  • 系统管理 — 系统管理页面

Home

主页包含许多用于导航管理门户的选项。

0 0
0 169
文章
· 十一月 20, 2022 阅读大约需 7 分钟
ZPM介绍(2)

发布您自己的软件

首先:要发布您的软件,您要支持这个”命名规范。其中和zmp最相关的是包名和l类名的设计,你要定义成这样:

company.project.subpackage.TheClass.cls

如果您的Package Name定义是: Company.Project, 有大写字母,对不起,是无法用zpm打包的。

这个链接给了最简单的例子,但还不详细,我来总结一下:

发布您的软件前,有几件事情要了解:

  1. zpm的注册中心并不存代码,存的只是一个到您代码的链接。因此,您得找地方放您的代码。当前最常用的是github。

  2. 文件目录的结构

2 2
0 169
文章
· 八月 9, 2022 阅读大约需 1 分钟
GitHub上的VSCode-ObjectScript

不久前,GitHub推出了在浏览器中快速运行VSCode的功能,可以在任何仓库中运行。 在任何仓库或拉动请求上按下 . 键,或将URL中的.com换成.dev,就可以直接进入浏览器中的VS Code环境。

github dev

这个VSCode是桌面版的轻型版本,完全基于浏览器。由于这个原因,它对允许以这种方式工作的扩展插件有限制。让我介绍一下VSCode-ObjectScript扩展的新版本1.2.1,它现在支持在浏览器模式下运行。

0 0
0 167
文章
· 九月 25, 2022 阅读大约需 25 分钟
Ens.Util.JSON类的启发

日常工作中,JSON使用越来越多,很多其他的语言里面有成熟的JSON API,但cache 我一直没找到。而同事们使用的基本都是自己写的一些JSON工具。这些小工具,多多少少有些局限。使用ensemble2016后,发现了 Ens.Util.JSON类,他可以处理JSON。翻阅代码后,实际上主要API是 %ZEN.Auxiliary.abstractController。在使用中,我们遇到一个问题,那就是有些JSON的节点名是带有下划线的,这个不太好处理。一般来说,我们把对象转为xml的时候,对象的属性我们是去掉下划线的,带下划线的名字是用 XMLNAME来设置的,于是考虑JSON里面也使用它(如果配置了)作为对象转JSON的时候,JSON的名字。

12 4
0 166
文章
· 五月 15, 2022 阅读大约需 7 分钟
第143章 SQL函数 TO_DATE(一)

第143章 SQL函数 TO_DATE(一)

将格式化字符串转换为日期的日期函数。

大纲

TO_DATE(date_string[,format])

TODATE(date_string[,format])

参数

  • date_string - 要转换为日期的字符串。基础数据类型为 CHARVARCHAR2 的字符串日期表达式。
  • format - 可选 — 对应于 date_string 的日期格式字符串。如果省略格式,DD MON YYYY& 是默认值;此默认值是可配置的。

描述

名称 TO_DATETODATE 是可互换的,并且支持 Oracle 兼容性。

0 0
0 163
文章
· 十一月 14, 2022 阅读大约需 7 分钟
ZPM介绍(1)

ZPM介绍

有Developer听闻了InterSystems的包管理器ZPM, 希望我能介绍一下。正好刚刚看到一个开发者论坛的新闻: Open Exchange ZPM is now InterSystems Package Manager , 觉得更有必要了。

zpm是什么

简单说:zpm, 全称InterSystems ObjectScript Package Manager, 是一个包管理器, 开发者是Nikolay Soloviev和Dmitry Maslennikov。它先是在开发者社区里得到认可,以至于InterSystems开发者社区最近的一些比赛,要求参赛作品用zpm打包。然后就有了上面的链接的内容:InterSystems决定把它做为自己官方的打包工具, 将它改名字叫IPM(InterSystems Package Manager),同时保持它的开源状况不变。

3 1
0 162
文章
· 八月 10, 2022 阅读大约需 4 分钟
第二十三章 源代码文件 REST API 参考(五)

第二十三章 源代码文件 REST API 参考(五)

DeleteDoc

此方法删除指定命名空间中的命名源代码文件。它返回相应的源代码文件对象。

与源代码文件有关的错误将在源代码文件对象的状态属性中。

有关示例和其他详细信息,请参阅本手册教程章节中的删除文件。

URL

DELETE http://server:port/api/atelier/v1/namespace/doc/doc-name

注意:如果要删除 CSP 文件 ,则 doc-name 的值包括 /(斜杠)字符。这就是定义 DeleteDocURLMap 包含此参数名称的 (.*) 而不是 :docname 的原因。有关详细信息,请参阅创建 REST 服务中的“为 REST 创建 URL 映射”。

0 0
0 161
文章
· 四月 13, 2022 阅读大约需 7 分钟
用Globals 作为图数据库来存储和抽取图结构数据

image

这篇文章是对我的  iris-globals-graphDB 应用的介绍。
在这篇文章中,我将演示如何在Python Flask Web 框架和PYVIS交互式网络可视化库的帮助下,将图形数据保存和抽取到InterSystems Globals中。

建议

 

第一步 : 通过使用Python 原生SDK建立与IRIS Globals的链接

 #create and establish connection
  if not self.iris_connection:
         self.iris_connection = irisnative.createConnection("localhost", 1972, "USER", "superuser", "SYS")
                                     
  # Create an iris object
  self.iris_native = irisnative.createIris(self.iris_connection)
  return self.iris_native

 

第二步 : 使用 iris_native.set( ) 功能把数据保存到Globals 里     

#import nodes data from csv file
isdefined = self.iris_native.isDefined("^g1nodes")
if isdefined == 0:
    with open("/opt/irisapp/misc/g1nodes.csv", newline='') as csvfile:

 reader = csv.DictReader(csvfile)
 for row in reader:
    self.iris_native.set(row["name"], "^g1nodes", row["id"])

 #import edges data from csv file
 isdefined = self.iris_native.isDefined("^g1edges")
 if isdefined == 0:
    with open("/opt/irisapp/misc/g1edges.csv", newline='') as csvfile:
 reader = csv.DictReader(csvfile)
 counter = 0                
 for row in reader:
    counter = counter + 1
    #Save data to globals
    self.iris_native.set(row["source"]+'-'+row["target"], "^g1edges", counter)  

 

第三步: 使用iris_native.get() 功能把节点和边缘数据从Globals传递给PYVIS

 #Get nodes data for basic graph    
  def get_g1nodes(self):
        iris = self.get_iris_native()
        leverl1_subscript_iter = iris.iterator("^g1nodes")
        result = []
        # Iterate over all nodes forwards
        for level1_subscript, level1_value in leverl1_subscript_iter:
            #Get data from globals
            val = iris.get("^g1nodes",level1_subscript)
            element = {"id": level1_subscript, "label": val, "shape":"circle"}
            result.append(element)            
        return result

    #Get edges data for basic graph  
    def get_g1edges(self):
        iris = self.get_iris_native()
        leverl1_subscript_iter = iris.iterator("^g1edges")
        result = []
        # Iterate over all nodes forwards
        for level1_subscript, level1_value in leverl1_subscript_iter:
            #Get data from globals
            val = iris.get("^g1edges",level1_subscript)
            element = {"from": int(val.rpartition('-')[0]), "to": int(val.rpartition('-')[2])}
            result.append(element)            
        return result

 

Step4: Use PYVIS Javascript to generate graph data

<script type="text/javascript">
    // initialize global variables.
    var edges;
    var nodes;
    var network;
    var container;
    var options, data;
  
    // This method is responsible for drawing the graph, returns the drawn network
    function drawGraph() {
        var container = document.getElementById('mynetwork');
        let node = JSON.parse('{{ nodes | tojson }}');
        let edge = JSON.parse('{{ edges | tojson }}');
     
        // parsing and collecting nodes and edges from the python
        nodes = new vis.DataSet(node);
        edges = new vis.DataSet(edge);

        // adding nodes and edges to the graph
        data = {nodes: nodes, edges: edges};

        var options = {
            "configure": {
                "enabled": true,
                "filter": [
                "physics","nodes"
            ]
            },
            "nodes": {
                "color": {
                  "border": "rgba(233,180,56,1)",
                  "background": "rgba(252,175,41,1)",
                  "highlight": {
                    "border": "rgba(38,137,233,1)",
                    "background": "rgba(40,138,255,1)"
                  },
                  "hover": {
                    "border": "rgba(42,127,233,1)",
                    "background": "rgba(42,126,255,1)"
                 }
                },

                "font": {
                  "color": "rgba(255,255,255,1)"
                }
              },
            "edges": {
                "color": {
                    "inherit": true
                },
                "smooth": {
                    "enabled": false,
                    "type": "continuous"
                }
            },
            "interaction": {
                "dragNodes": true,
                "hideEdgesOnDrag": false,
                "hideNodesOnDrag": false,
                "navigationButtons": true,
                "hover": true
            },

            "physics": {
                "barnesHut": {
                    "avoidOverlap": 0,
                    "centralGravity": 0.3,
                    "damping": 0.09,
                    "gravitationalConstant": -80000,
                    "springConstant": 0.001,
                    "springLength": 250
                },

                "enabled": true,
                "stabilization": {
                    "enabled": true,
                    "fit": true,
                    "iterations": 1000,
                    "onlyDynamicEdges": false,
                    "updateInterval": 50
                }
            }
        }
        // if this network requires displaying the configure window,
        // put it in its div
        options.configure["container"] = document.getElementById("config");
        network = new vis.Network(container, data, options);
        return network;
    }
    drawGraph();
</script>

 

第五步: 从app.py 主文件调用上面的代码

#Mian route. (index)
@app.route("/")
def index():
    #Establish connection and import data to globals
    irisglobal = IRISGLOBAL()
    irisglobal.import_g1_nodes_edges()
    irisglobal.import_g2_nodes_edges()

    #getting nodes data from globals
    nodes = irisglobal.get_g1nodes()
    #getting edges data from globals
    edges = irisglobal.get_g1edges()

    #To display graph with configuration
    pyvis = True
    return render_template('index.html', nodes = nodes,edges=edges,pyvis=pyvis)    

下面是关于此项目的 介绍视频:

0 0
0 161
文章
· 六月 9, 2022 阅读大约需 3 分钟
InterSystems 最佳实践系列之 - 在DeepSee中设计有效的层级

当使用DeepSee工具来设计层级的时候,一个子级必须有且仅有一个父级。当出现一个子级对应两个父级的情况时,数据结果就有可能会不可靠。另一种情况是当两个相似的级别存在,它们的主键必须要做相应的变更以确保唯一性。我们接下来将通过两个案例来解释这两种情况是如何发生的以及如何避免。


案例1

在多个州里都会有一个城市叫做Boston。在我的样本数据里,我已经记录的与Boston对应的州有MA和Boston.NY。我的维度定义如下:

城市和州在这里都是简单的字符串格式。当构建到我的Cube中时,我会需要两个州级别成员:“MA”和“NY”,以及两个城市级别成员:“Boston”和“Boston”。为什么我需要两个Boston的城市级别成员而不是一个呢?因为一个级别成员不能有两个父级。所以我们需要创建两个分别的子级成员来对应各自的父级。遗憾的是,我们现在处于“糟糕的层级”场景,因为我们只有一个键值来对应两个不同的级别成员。

0 0
0 157
文章
· 二月 24, 2022 阅读大约需 7 分钟
列出类的所有属性 (我喜欢 ObjectScript 的原因)

@Ming Zhou 在 https://community.intersystems.com/post/how-get-all-properties-defined-c 上问了一个很好的问题......而这个答案正好总结了为什么ObjectScript 是我最喜欢的语言。

当我第一次向别人介绍ObjectScript或IRIS时,我总是解释说,你可以写一个类,编译它,得到一个表,并从对象或关系的角度来处理你的数据--这是一种最自然的方式。

0 1
0 157
文章
· 八月 8, 2022 阅读大约需 3 分钟
第二十一章 源代码文件 REST API 参考(三)

第二十一章 源代码文件 REST API 参考(三)

GetDocNames

此方法返回源代码文件名列表。可选的 cattype 约束源代码文件的类型。

URL

GET http://server:port/api/atelier/v1/namespace/docnames

GET http://server:port/api/atelier/v1/namespace/docnames/cat

GET http://server:port/api/atelier/v1/namespace/docnames/cat/type

其中

0 0
0 157
文章
· 四月 22, 2022 阅读大约需 1 分钟
IRIS SQL网关连接Oracle19C数据库报错解决

问题:
通过JDBC连接Oracle19C数据报错 "ORA-28040: No matching authentication protocal"

解决 :
1、在数据库服务器上找到sqlnet.ora文件,一般在oracle安装目录app/oracle/product/19.0.0.0/db_1/network/admin/sqlnet.ora

2、如果有进行修改,没有直接创建

3、slqnet.ora文件新增或修改以下
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8

4、注意事项:
① 如果没有sqlnet.ora文件可以直接创建 vi sqlnet.ora
② 如果有不能直接vi 需要使sed -a 命令追加,否则会导致ora文件乱码
③ 添加参数后新无需重启数据库或者监听,但是需要修改用户密码,否则会报错

5、修改用户名密码

sqlplus / as sysdba

alter user 用户名 identified by 新密码;

0 2
0 155

由麻省理工大学斯隆学院数字经济研究院Michael(Michael Schrage)主持,参与这次探讨的专家有人工智能布道师、数字化转型的先驱者、面临数字化转型挑战的传统公司,他们共同探讨了如何更迅速、更优质、更优价地获得切实可行的洞察,研讨涵盖了数字化转型面临的技术操作难点、投入产出性价比、数据科学家的角色、数据分析的类型、如何建设正确的基础设施和架构等等内容。面对越来越复杂的数据处理需求,这次研讨有一个观点值得借鉴:更大的数据量、种类和真实性实际上唤起了谦虚,而不是更大的信心。

0 0
0 154

多院区信息化建设离不开医院的管理模式,这是在建设信息系统前我们必须要搞清楚的事。比如医院财务是不是独立、分院之间住院患者流转是转科还是转院、检验检查是不是可以跨院区预约,是否有统一的职能部门管理业务流程等等。类似这样一些问题在建设前要认真梳理,做好多院区信息建设的顶层布局。

0 0
0 154
文章
· 一月 26, 2022 阅读大约需 5 分钟
跟Robert Cemper老师学习 IRIS 和Caché

@Robert Cemper 我们全球(几乎是)最资深最活跃粉丝最多的社区成员 (最畅销!). Robert 老师从1970年代就开始从事软件行业,从1978年就开始从事MUMPS, DSM, ... Caché, ...IRIS等等直到今天还在活越地写代码。所以跟着Robert老师超过100篇的社区文章中学习 InterSystems 技术是最好不过的选择了。我们按照主题精选了一些文章,后面会陆续翻译,大家希望优先翻译哪一篇,欢迎在评论区留言。

关于SQL

DB Migration using SQLgateway IRIS 使用 SQLgateway 迁移到IRIS.

0 0
0 153
文章
· 五月 12, 2022 阅读大约需 9 分钟
第140章 SQL函数 TO_CHAR(一)

第140章 SQL函数 TO_CHAR(一)

将日期、时间戳或数字转换为格式化字符串的字符串函数。

大纲

TO_CHAR(tochar-expression[,format])

TOCHAR(tochar-expression[,format])

参数

  • tochar-expression - 要转换的逻辑日期、时间戳或数字表达式。
  • format - 可选 — 为 tochar 表达式转换指定日期、时间戳或数字格式的字符代码。如果省略,TO_CHARtochar-expression 作为规范数字返回。

描述

名称 TO_CHARTOCHAR 是可互换的,并且支持 Oracle 兼容性。

带格式的 TO_CHAR 函数有五种用途:
- 将日期整数转换为格式化的日期字符串。

0 0
0 150
文章
· 十二月 2, 2022 阅读大约需 9 分钟
通过智能数据编织应对数据挑战

1.数据的价值

数据的核心价值是帮助我们决策。

我们无时无刻不在决策,大到战略决策——为一家新医院选址,还有战术决策——鉴别产品的目标市场或抵押贷款审批,更频繁的是操作决策——决定患者的手术方案或患者药物的调整。

这些决策要求不同的决策速度,传统的数据中心已经能较好地帮助我们做战略决策、战术决策,甚至一些操作决策。但新的业务需求要求我们的决策速度越来越快,甚至借助机器学习自动为我们做出即时的决策,例如批准还是拒绝一笔信用卡交易或基于算法自动交易。

无论是人工决策还是基于机器学习的自动决策,决策的依据是数据。数据的速度和质量决定了决策的速度和质量。要支持决策,需要数据具有如下特征:

(1)完整 :关联且具有完整上下文;

(2)干净 :数据质量没有问题;

(3)及时 :在决策点上没有延迟。

1 0
0 150

正如德勤最近的一份报告所强调的,数字孪生的设计和部署是为了实现虚拟协作,吸收和处理大数据,以及协助我们以更有效和安全的方式管理物理世界。

有几个行业在使用数字孪生能力方面取得了重大进展,如汽车、飞机、能源、城市规划和医疗保健等,仅举几例。疫情的影响和对全球经济造成的破坏只会加速全球数字孪生的发展速度和采用。因此,预计到2026年,全球数字孪生市场将达到482亿美元,年复合增长率为58%。虽然目前北美市场拥有最大的份额,但预计亚太市场将在未来几年经历最快的增长。

按照Gartner的说法,数字孪生是现实世界实体或系统的数字代表。数字孪生体的实现是一个封装的软件对象或模型,它反映了一个独特的物理对象、过程、组织、人或其他抽象概念。

数字孪生的设计和部署是复杂的,与其他数字技术密切相关,如云计算、人工智能、物联网、5G网络、区块链和虚拟、增强或混合现实。预计所有这些技术的采用率将对数字孪生产业产生深远影响。迄今为止,系统数字孪生体已经在所有行业中占主导地位,但专家们一致认为,产品和流程数字孪生体类型将在未来几年内上升。

0 0
0 150

许多使用InterSystems IRIS的用户在调试代码的时候习惯使用命令行的方式,比如运行一个函数查看输出或者查看代码运行过程中保存在global中的数据等等。

对于将 InterSystems IRIS 安装在 Windows 操作系统的用户,只需要点击右下角图标选择Terminal 就可以很方便的使用。

但是对于将其安装到 Linux 或者Docker 容器中的用户,要使用命令行却不那么方便,下面我将会介绍在我们 Openexchange 中的一个应用 -- Web Terminal。

也就是说可以在网页中直接执行Terminal中的命令。

2016-09-18_212035

或者查看SQL执行结果:

0 0
0 150