Buscar

Limpiar filtro
Artículo
Alberto Fuentes · 14 oct, 2022

Ejemplos en Python de InterSystems IRIS 2021.2+ (Embebido, APIs nativas y Notebooks)

# Iris-python-template Proyecto de plantilla con varios códigos Python para ser utilizados con InterSystems IRIS Community Edition con contenedor. Contenido: * Bloc de notas * Kernel de Python Embebido * Kernel de ObjectScript * Kernel de Vanilla Python * Python Embebido * Ejemplo de código * Demostración de Flask * API nativas de Python de IRIS * Ejemplo de código ![Diagrama](https://user-images.githubusercontent.com/47849411/145866257-cc88109b-db0b-4fed-8886-fddb4c31947d.png) # 2. Índice - [1. iris-python-template](#1-iris-python-template) - [2. Índice](#2-ndice) - [3. Instalación](#3-instalacin) - [3.1. Docker](#31-docker) - [4. Cómo empezar a programar](#4-cmo-empezar-a-programar) - [4.1. Requisitos previos](#4-1-requisitos-previos) - [4.1.1. Empezar a programar en ObjectScript](#4-1-1-empezar-a-programar-en-objectscript) - [4.1.2. Empezar a programar con Python Embebido](#4-1-2-empezar-a-programar-con-python-embebido) - [4.1.3. Empezar a programar con Notebooks](#4-1-3-empezar-a-programar-con-notebooks) - [5. Qué hay dentro del repositorio](#5-qu-hay-dentro-del-repositorio) - [5.1. Dockerfile](#5-1-dockerfile) - [5.2. .vscode/settings.json](#5-2-vscodesettingsjson) - [5.3. .vscode/launch.json](#5-3-vscodelaunchjson) - [5.4. .vscode/extensions.json](#5-4-vscodeextensionsjson) - [5.5. src folder](#5-5-src-folder) - [5.5.1. src/ObjectScript](#5-5-1-srcobjectscript) - [5.5.1.1. src/ObjectScript/Embedded/Python.cls](#5-5-1-1-srcobjectscriptembeddedpythoncls) - [5.5.1.2. src/ObjectScript/Gateway/Python.cls](#5-5-1-2-srcobjectscriptgatewaypythoncls) - [5.5.2. src/Python](#5-5-2-srcpython) - [5.5.2.1. src/Python/embedded/demo.cls](#5-5-2-1-srcpythonembeddeddemocls) - [5.5.2.2. src/Python/native/demo.cls](#5-5-2-2-srcpythonnativedemocls) - [5.5.2.3. src/Python/flask](#5-5-2-3-srcpythonflask) - [5.5.2.3.1. ¿Cómo funciona?](#5-5-2-3-1-cmo-funciona) - [5.5.2.3.2. Lanzamiento del servidor flask](#5-5-2-3-2-lanzamiento-del-servidor-flask) - [5.5.3. src/Notebooks](#5-5-3-srcnotebooks) - [5.5.3.1. src/Notebooks/HelloWorldEmbedded.ipynb](#5-5-3-1-srcnotebookshelloworldembeddedipynb) - [5.5.3.2. src/Notebooks/IrisNative.ipynb](#5-5-3-2-srcnotebooksirisnativeipynb) - [5.5.3.3. src/Notebooks/ObjectScript.ipynb](#5-5-3-3-srcnotebooksobjectscriptipynb) # 3. Instalación ## 3.1. Docker El repositorio está dockerizado para que puedas clonar el repositorio a cualquier directorio local ``` git clone https://github.com/grongierisc/iris-python-template.git ``` Abre el terminal en este directorio y ejecuta: ``` docker-compose up -d ``` y abre después http://localhost:8888/tree para Notebooks O bien, abre la carpeta clonada en VSCode, inicia docker-compose y abre la URL mediante el menú de VSCode: # 4. Cómo empezar a programar ## 4.1. Requisitos previos Asegúrate de tener instalado [git ](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)y [Docker desktop](https://www.docker.com/products/docker-desktop). Este repositorio está listo para codificarse en VSCode con el plugin de ObjectScript. Instala [VSCode](https://code.visualstudio.com/),[Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) y[el plugin de ObjectScript](https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript)y abre la carpeta en VSCode. ### 4.1.1. Empezar a programar en ObjectScript Abre la clase /src/ObjectScript/Embedded/Python.cls e intenta hacer cambios - se compilará en el contenedor Docker IRIS que está funcionando. ### 4.1.2. Empezar a programar con Python Embebido La forma más fácil es ejecutar VsCode en el contenedor. Para adjuntar a un contenedor Docker, selecciona **Remote-Containers: Attach to Running Container...** en la plantilla de comandos (`kbstyle(F1)`) o utiliza el **Remote Explorer** en la barra de actividades y desde la vista **Containers**, selecciona la acción en línea **Attach to Container** en el contenedor al que quieras conectarte. ![Captura de pantalla del Explorador de contenedores](https://github.com/microsoft/vscode-docs/raw/main/docs/remote/images/containers/containers-attach.png) A continuación, configura tu intérprete de python en /usr/irissys/bin/irispython ### 4.1.3. Empezar a programar con Notebooks Abre esta URL: http://localhost:8888/tree Tienes acceso a tres notebooks diferentes con tres kernels diferentes. * Kernel de Python Embebido * Kernel de ObjectScript * Kernel de Vanilla Python3 # 5. Qué hay dentro del repositorio ## 5.1. Dockerfile Un dockerfile que instala algunas dependencias de Python (pip, venv) y Sudo en el contenedor por conveniencia. Después crea el directorio dev y copia en él este repositorio git. Inicia IRIS e importa los archivos Titanics csv, después activa **%Service_CallIn** para **Python Shell**. Utiliza el docker-compose.yml relacionado para configurar fácilmente parámetros adicionales como el número de puerto y dónde asignar claves y carpetas del host. Este dockerfile termina con la instalación de los requisitos para los módulos de Python. La última parte es sobre la instalación de Jupyter Notebook y sus kernels. Utiliza el archivo .env/ para ajustar el dockerfile que se utiliza en docker-compose. ## 5.2. .vscode/settings.json Archivo de configuración para poder codificar inmediatamente en VSCode con el [plugin VSCode ObjectScript](https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript) ## 5.3. .vscode/launch.json Archivo de configuración si quieres depurar con VSCode ObjectScript [Lee sobre todos los archivos en este artículo](https://community.intersystems.com/post/dockerfile-and-friends-or-how-run-and-collaborate-objectscript-projects-intersystems-iris) ## 5.4. .vscode/extensions.json Archivo de recomendación para añadir extensiones si quieres ejecutar VSCode en el contenedor. [Más información aquí](https://code.visualstudio.com/docs/remote/containers) ![Arquitectura](https://code.visualstudio.com/assets/docs/remote/containers/architecture-containers.png) Esto es muy útil para trabajar con Python Embebido. ## 5.5. src folder Esta carpeta está concebida en dos partes, una para el ejemplo de ObjectScript y otra para el código de Python. ### 5.5.1. src/ObjectScript Un código diferente que muestra cómo utilizar Python en IRIS. #### 5.5.1.1. src/ObjectScript/Embedded/Python.cls Todos los comentarios están en francés para que también puedas mejorar tu nivel de francés. ```objectscript /// Embedded python example Class ObjectScript.Embbeded.Python Extends %SwizzleObject { /// HelloWorld with a parameter ClassMethod HelloWorld(name As %String = "toto") As %Boolean [ Language = python ] { print("Hello",name) return True } /// Description Method compare(modèle, chaine) As %Status [ Language = python ] { import re # compare la chaîne [chaîne] au modèle [modèle] # affichage résultats print(f"\nRésultats({chaine},{modèle})") match = re.match(modèle, chaine) if match: print(match.groups()) else: print(f"La chaîne [{chaine}] ne correspond pas au modèle [{modèle}]") } /// Description Method compareObjectScript(modèle, chaine) As %Status { w !,"Résultats("_chaine_","_modèle_")",! set matcher=##class(%Regex.Matcher).%New(modèle) set matcher.Text=chaine if matcher.Locate() { write matcher.GroupGet(1) } else { w "La chaîne ["_chaine_"] ne correspond pas au modèle ["_modèle_"]" } } /// Description Method DemoPyhtonToPython() As %Status [ Language = python ] { # expression régulières en python # récupérer les différents champs d'une chaîne # le modèle : une suite de chiffres entourée de caractères quelconques # on ne veut récupérer que la suite de chiffres modèle = r"^.*?(\d+).*?$" # on confronte la chaîne au modèle self.compare(modèle, "xyz1234abcd") self.compare(modèle, "12 34") self.compare(modèle, "abcd") } Method DemoPyhtonToObjectScript() As %Status [ Language = python ] { # expression régulières en python # récupérer les différents champs d'une chaîne # le modèle : une suite de chiffres entourée de caractères quelconques # on ne veut récupérer que la suite de chiffres modèle = r"^.*?(\d+).*?$" # on confronte la chaîne au modèle self.compareObjectScript(modèle, "xyz1234abcd") self.compareObjectScript(modèle, "12 34") self.compareObjectScript(modèle, "abcd") } /// Description Method DemoObjectScriptToPython() As %Status { // le modèle - une date au format jj/mm/aa set modèle = "^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$" do ..compare(modèle, "10/05/97") do ..compare(modèle, " 04/04/01 ") do ..compare(modèle, "5/1/01") } } ``` * HelloWorld * Función sencilla para decir "Hola" en Python * Utiliza la envoltura OjectScript con la etiqueta [ Language = python ] * compare * Una función de python que compara una cadena con un regx, si hay una coincidencia entonces la imprime, si no la imprime es que no se encontró ninguna coincidencia * compareObjectScript * La misma función que la de Python pero en ObjectScript * DemoPyhtonToPython * Muestra cómo utilizar una función de Python con código de Python envuelto en ObjectScript ```objectscript set demo = ##class(ObjectScript.Embbeded.Python).%New() zw demo.DemoPyhtonToPython() ``` * DemoPyhtonToObjectScript * Una función de Python que muestra cómo llamar a una función de ObjecScript * DemoObjectScriptToPython * Una función de ObjectScript que muestra cómo llamar a una función de Python #### 5.5.1.2. src/ObjectScript/Gateway/Python.cls Una clase de ObjectScript que muestra cómo llamar a un código de Phyton externo con la funcionalidad *gateway*. En este ejemplo el código de Python es **no ejecutado** en el mismo proceso de IRIS. ```objectscript /// Description Class Gateway.Python { /// Demo of a python gateway to execute python code outside of an iris process. ClassMethod Demo() As %Status { Set sc = $$$OK set pyGate = $system.external.getPythonGateway() d pyGate.addToPath("/irisdev/app/src/Python/gateway/Address.py") set objectBase = ##class(%Net.Remote.Object).%New(pyGate,"Address") set street = objectBase.street zw street Return sc } } ``` ### 5.5.2. src/Python Una pieza diferente del código Python que muestra cómo usar Python Embebido en IRIS. #### 5.5.2.1. src/Python/embedded/demo.cls Todos los comentarios están en francés para que también puedas mejorar tu nivel de francés. ```python import iris person = iris.cls('Titanic.Table.Passenger')._OpenId(1) print(person.__dict__) ``` Primero importa el módulo de IRIS que activa las funciones de Python Embebido. Abre una clase persistente con la función cls del módulo de IRIS. Ten en cuenta que todas las funciones `%` se sustituyen por `_`. Para ejecutar este ejemplo hay que utilizar IRIS Python Shell: ```shell /usr/irissys/bin/irispython /opt/irisapp/src/Python/embedded/demo.py ``` #### 5.5.2.2. src/Python/native/demo.cls Muestra cómo utilizar la API nativa en el código de Python. ```python import irisnative # create database connection and IRIS instance connection = irisnative.createConnection("localhost", 1972, "USER", "superuser", "SYS", sharedmemory = False) myIris = irisnative.createIris(connection) # classMethod passenger = myIris.classMethodObject("Titanic.Table.Passenger","%OpenId",1) print(passenger.get("name")) # global myIris.set("hello","myGlobal") print(myIris.get("myGlobal")) ``` Para importar IRISNATIVE, debes instalar las ruedas de las API nativas en tu entorno de Python. ```shell pip3 install /usr/irissys/dev/python/intersystems_irispython-3.2.0-py3-none-any.whl ``` Entonces puedes ejecutar este código de Python ```shell /usr/bin/python3 /opt/irisapp/src/Python/native/demo.py ``` Ten en cuenta que en este caso se realiza una conexión a la base de datos de IRIS, esto significa que **este código se ejecuta en un subproceso diferente al de IRIS**. #### 5.5.2.3. src/Python/flask Una demo completa de la combianción entre Python Embebido y el micro *framework* Flask. Puedes probar este endpoint: ``` GET http://localhost:4040/api/passengers?currPage=1&pageSize=1 ``` ##### 5.5.2.3.1. ¿Cómo funciona? Para utilizar Python Embebido, usamos `irispython` como interepretador de Python, y hacemos: ```python import iris ``` Justo al principio del archivo. Entonces podremos ejecutar métodos como: ![flaskExample](https://raw.githubusercontent.com/thewophile-beep/integrated-ml-demo/main/misc/img/flaskExample.png) Como puedes ver, para OBTENER un pasajero con un ID, simplemente ejecutamos una consulta y utilizamos su conjunto de resultados. También podemos utilizar directamente los objetos de IRIS: ![flaskObjectExample](https://raw.githubusercontent.com/thewophile-beep/integrated-ml-demo/main/misc/img/flaskObjectExample.png) Aquí, utilizamos una consulta SQL para obtener todos los IDs de la tabla, y después recuperamos cada pasajero de la tabla con el método `%OpenId()` de la clase `Titanic.Table.Passenger` (ten en cuenta que como `%` es un carácter ilegal en Python, utilizamos `_` como alternativa). Gracias a Flask, implementamos todas nuestras rutas y métodos de esa manera. ##### 5.5.2.3.2. Lanzamiento del servidor flask Para lanzar el servidor, usamos `gunicornio` con `irispython`. En el archivo docker-compose, añadimos la siguiente línea: ````yaml iris: command: -a "sh /opt/irisapp/server_start.sh" ```` Eso lanzará, después de que se inicie el contenedor (gracias al indicador `-a`), el siguiente script: ````bash #!/bin/bash cd ${SRC_PATH}/src/Python/flask ${PYTHON_PATH} -m gunicorn --bind "0.0.0.0:8080" wsgi:app & exit 1 ```` Con las variables de entorno definidas en el Dockerfile como sigue: ````dockerfile ENV PYTHON_PATH=/usr/irissys/bin/irispython ENV SRC_PATH=/opt/irisapp/ ```` ### 5.5.3. src/Notebooks Tres notebooks con tres kernels diferentes: * Un kernel de Python3 para ejecutar las API nativas * Un kernel de Python Embebido * Un kernel de ObjectScript Se puede acceder a los notebooks aquí: http://localhost:8888/tree #### 5.5.3.1. src/Notebooks/HelloWorldEmbedded.ipynb Este notebook utiliza el kernel de Python Embebido. Muestra un ejemplo para abrir y guardar clases persistentes y cómo ejecutar consultas en SQL. #### 5.5.3.2. src/Notebooks/IrisNative.ipynb Este notebook utiliza el kernel de Vanila python. Muestra ejemplo para ejecutar API nativas de IRIS. #### 5.5.3.3. src/Notebooks/ObjectScript.ipynb Este notebook utiliza el kernel de ObjectScript. Muestra un ejemplo para ejecutar el código ObjectSCript y cómo utilizar Python Embebido en ObjectScript.
Anuncio
Esther Sanchez · 16 feb, 2023

InterSystems Iberia participará en la V Innovation Week de la Universidad CEU San Pablo

¡Hola desarrolladores! Los días 21 y 22 de febrero InterSystems Iberia participará en la V Innovation Week organizada por la Universidad CEU San Pablo, en Madrid. InterSystems ha preparado un reto para los alumnos de la universidad, sobre los desafíos de la salud digital. El reto se presentará el día 21 y los alumnos tendrán un día para trabajar por equipos y pensar cómo resolverlo. El día 22 será la exposición de ideas por parte de los estudiantes. Y de entre todas las ideas presentadas, las dos mejores se llevarán de premio una tarjeta regalo de Amazon. La Innovation Week promueve la innovación universitaria para innovar con sentido, proponiendo ideas que contribuyan a mejorar la sociedad, las personas y las empresas. Es un evento único, donde se reúnen los mejores ingredientes para generar innovación: el talento universitario y el mundo empresarial. Por ello, desde InterSystems Iberia están muy orgullosos de esta colaboración y no se lo han querido perder. ¡Seguro que los universitarios presentan un montón de ideas innovadoras! La semana que viene os contaremos cuales fueron las ideas ganadoras y cómo resolvieron el reto... ¡Estad atentos a las noticias de la Comunidad! 😉
Anuncio
Sergio Farago · 28 mayo, 2025

Conoced a los ganadores del Concurso de Programación con IA en InterSystems READY 2025 @ Tech Exchange.

¡Hola, comunidad! ¡Estamos encantados de anunciar que varios ganadores del Concurso de Programación con IA de InterSystems han sido invitados a presentar sus proyectos en el Tech Exchange durante InterSystems Ready 2025! Acompañadnos el miércoles 25 de junio para descubrir soluciones innovadoras y reales creadas con InterSystems IRIS, IA, LLMs y tecnologías de agentes inteligentes, directamente de la mano de los desarrolladores que las hicieron posibles. Ponente Demo @Muhammad.Waseem, Consultor técnico, Traverse Health Próxima generación de aplicaciones autónomas de IA iris-AgenticAI @Yuri.Gomes, Director, YM Services Gestión del código fuente con IA privada e IRIS langchain-iris-tool @Eric.Fortenberry, Analista Senior de Integración, AdventHealth Una visión minimalista de la IA: exploración de incrustaciones y búsqueda vectorial con EasyBot iris-easybot @Alena.Krasinskiene, Responsable de Calidad y Experiencia del Cliente, Banksia Global Agentes de IA como ciudadanos de primera clase en InterSystems IRIS bg-iris-agent @henry, Tech Leader en BPlus tecnology@Henrique, Arquitecto sénior de plataformas, AI en Zendesk@José.Pereira, Ingeniero de datos en Shift Comanda la tripulación: crea una tripulación de IA para automatizar tu trabajo Facilis Estos desarrolladores han creado soluciones innovadoras utilizando tecnologías de InterSystems IRIS, integrando IA, LLMs y agentes inteligentes para resolver desafíos reales. No perdáis la oportunidad de ver estas demostraciones en vivo y conectar con las mentes que las hicieron posibles en Ready 2025.
Artículo
Alessandra Carena · 6 jun, 2025

Diseñar e implementar APIs REST en InterSystems IRIS a partir de especificaciones OpenAPI

​En el artículo anterior, Generación de Especificaciones OpenAPI, vimos qué es OpenAPI, por qué es útil para documentar los servicios REST y cómo generar un archivo de especificación en formato .yaml o .json. También exploramos cómo IRIS permite crear automáticamente esta documentación a partir del código existente, siguiendo el enfoque code-first. Pero, ¿qué sucede si partimos del archivo OpenAPI en lugar del código? En otras palabras, ¿si primero definiéramos el comportamiento de nuestra API y luego generáramos las clases necesarias para implementarla en IRIS? Este método, conocido como enfoque specification-first, permite diseñar un servicio de manera clara y coherente, incluso antes de escribir la lógica de aplicación. En este artículo veremos cómo utilizar este enfoque para construir una REST API completa en Intersystems IRIS a partir de una especificación OpenAPI 2.0. Primer paso: construcción del archivo OpenAPI El archivo OpenAPI 2.0 es un documento en formato JSON (o YAML) en el que se describen todas las API de la aplicación: las rutas disponibles (endpoints), los métodos HTTP soportados (GET, POST, PUT, DELETE...), los parámetros aceptados, las respuestas esperadas y mucho más. Para construir correctamente este archivo, es fundamental conocer la estructura definida por el estándar OpenAPI 2.0Algunos recursos útiles para profundizar son: Documentación oficial de OpenAPI 2.0 (Swagger) Propiedades soportadas en InterSystems IRIS A continuación, se muestra un ejemplo sencillo de archivo openapi.json que define una API con un endpoint GET /hello: { "swagger": "2.0", "info": { "title": "API example", "description": "Example of openAPI file", "version": "1.0.0" }, "produces": [ "application/json" ], "consumes": [ "application/json" ], "paths": { "/hello": { "get": { "summary": "Sample greeting", "description": "Returns a greeting message", "responses": { "200": { "description": "OK", "schema": { "type": "string" } } }, "operationId": "hello" } } } } Segundo paso: generación de las clases de la interfaz REST Una vez creado el archivo de especificación, es posible utilizar una de las herramientas de gestión de APIs de InterSystems IRIS para generar automáticamente las tres clases principales que constituyen un servicio REST: Clase de especificación (.spec)Subclase de %REST.Spec, que contiene la especificación OpenAPI 2.0 del servicio REST. Clase de dispatch (.disp)Subclase de %CSP.REST, responsable de recibir las solicitudes HTTP y de invocar los métodos apropiados en la clase de implementación. Clase de implementación (.impl)Subclase de %REST.Impl, contiene la implementación de la lógica de los métodos REST. En este artículo se muestra cómo generar el servicio REST utilizando el servicio /api/mgmnt/. Generación de las clases utilizando el servicio /api/mgmnt Utilizar Postman (o una herramienta similar) para crear un mensaje de solicitud HTTP como sigue: Para la acción HTTP, seleccionar POST. Para la URL, especificar una URL en el siguiente formato, usando la <baseURL> de tu instancia: https://<baseURL>/api/mgmnt/v2/namespace/myapp Donde namespace es el espacio de nombres en el que se desea crear el servicio REST y myapp es el nombre del paquete en el que se desea crear las clases. Ejemplo: http://localhost:1888/api/mgmnt/v2/myNamespace/Greetings En el cuerpo de la solicitud, pegar la especificación OpenAPI 2.0 de tu servicio web en formato JSON. Especificar el tipo de contenido del cuerpo como JSON (application/json). Como método de autenticación, usar Basic Auth e introducir como username y password las credenciales de un usuario con permisos de lectura/escritura sobre el espacio de nombres indicado. Enviar el mensaje de solicitud. Caso de creación del servicio REST: si la llamada tiene éxito, InterSystems IRIS crea las clases .disp, .impl y .spec en el paquete del namespace especificado, y en Postman se recibirá el siguiente mensaje de confirmación: { "msg": "New application myapp created" } Caso de actualización del servicio REST: si la llamada tiene éxito, se recibirá el mensaje: {"msg": "Application lombardia.GUIConvenzioni.OMRREST updated"} Además, InterSystems IRIS regenerará completamente las clases .disp y .spec en el paquete especificado, y actualizará la clase .impl, conservando el código previamente implementado en ella. Atención: cualquier modificación manual realizada a la clase .disp será sobrescrita cada vez que se actualice la especificación, por lo que no se recomienda modificarla directamente. Tercer paso: implementación de la lógica REST Una vez generadas las tres clases (.spec, .disp, .impl), es momento de completar el servicio REST implementando la lógica de las operaciones. Veamos un ejemplo concreto basado en la especificación mostrada anteriormente (que define un endpoint GET /hello).Las clases generadas serán: Clase Greetings.spec Esta clase contiene la definición OpenAPI en formato JSON. No requiere modificaciones manuales, pero puede ser actualizada regenerándola mediante el servicio /api/mgmnt/ cada vez que se modifique la especificación. Class Greetings.spec Extends Extends %REST.Spec [ ProcedureBlock ] { XData OpenAPI [ MimeType = application/json ] "swagger": "2.0", "info": { "title": "API example", "description": "Example of openAPI file", "version": "1.0.0" }, ... }; } Clase Greetings.disp Es la clase de dispatch la que conecta las rutas HTTP con los métodos de implementación. No es necesario (ni recomendable) modificarla, ya que se regenera cada vez que se actualiza la especificación. Class Greetings.disp Extends %CSP.REST [ GeneratedBy = Greetings.spec.cls, ProcedureBlock ] { /// The class containing the RESTSpec which generated this class Parameter SpecificationClass = "Greetings.spec"; /// Ignore any writes done directly by the REST method. Parameter IgnoreWrites = 1; /// Default the Content-Type for this application. Parameter CONTENTTYPE = "application/json"; /// By default convert the input stream to Unicode Parameter CONVERTINPUTSTREAM = 1; /// The default response charset is utf-8 Parameter CHARSET = "utf-8"; XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <Route Url="/hello" Method="GET" Call="hello"/> </Routes> ClassMethod hello() As %Status { Try { Do ##class(%REST.Impl).%SetContentType("application/json") If '##class(%REST.Impl).%CheckAccepts("application/json") Do ##class(%REST.Impl).%ReportRESTError(..#HTTP406NOTACCEPTABLE,$$$ERROR($$$RESTBadAccepts)) Quit Set response=##class(Greetings.impl).hello() Do ##class(Greetings.impl).%WriteResponse(response) } Catch (ex) { Do ##class(%REST.Impl).%ReportRESTError(..#HTTP500INTERNALSERVERERROR,ex.AsStatus(),$parameter("Greetings.impl","ExposeServerExceptions")) } Quit $$$OK } } Como se puede observar, esta clase mapea el endpoint /hello al método hello() presente en la clase Greetings.impl. Clase Greetings.impl Esta es la clase en la que se escribe la lógica de aplicación propiamente dicha. Es una subclase de %REST.Impl y se genera con métodos “vacíos” que deben ser implementados. Class Greetings.impl Extends %REST.Impl [ ProcedureBlock ] { /// Returns a greeting message ClassMethod hello() As %Status { //write here your code.. } } Conclusión Hemos visto cómo, a partir de una especificación OpenAPI 2.0, es posible construir una interfaz REST completa en InterSystems IRIS siguiendo el enfoque specification-first. Con unos pocos pasos, el framework nos proporciona una estructura lista para usar sobre la cual integrar nuestra lógica de negocio, permitiéndonos desarrollar APIs de manera clara, ordenada y escalable. En el próximo artículo veremos cómo exponer efectivamente el servicio REST a través de una aplicación web de IRIS.
Artículo
Katherine Duran · 27 mayo, 2025

Uso de SQL Dinámico vs SQL Embebido en InterSystems IRIS y Plan de ejecución

InterSystems IRIS permite ejecutar consultas SQL directamente desde ObjectScript mediante: SQL Embebido (Embedded SQL): consultas SQL compiladas en tiempo de desarrollo, con chequeo de tipos y mayor eficiencia. SQL Dinámico (Dynamic SQL): permite construir y ejecutar sentencias SQL en tiempo de ejecución, ideal para casos flexibles o condicionales. Que es SQL (Structured Query Language) es un lenguaje estándar utilizado para interactuar con bases de datos relacionales. Permite realizar operaciones como: Consultar datos (SELECT) Insertar registros (INSERT) Actualizar datos (UPDATE) Eliminar registros (DELETE) Crear y modificar estructuras (tablas, índices, vistas, etc.) SQL es usado en... Bases de datos tradicionales: Oracle, MySQL, SQL Server, PostgreSQL Bases de datos modernas: InterSystems IRIS, Snowflake, BigQuery, etc. Aplicaciones web y móviles para acceder a datos desde backend o APIs ¿Por qué es importante? Es el lenguaje universal para bases de datos Permite extraer información útil desde grandes volúmenes de datos Es compatible con herramientas de BI, ETL, dashboards, análisis y más Según la documentación de intersystems en el siguiente link pueden obtener mayor detalle https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL Incluye: Sintaxis general de SQL Consultas SELECT, INSERT, UPDATE, DELETE Uso de índices Funciones agregadas (COUNT, SUM, AVG, etc.) JOIN, subconsultas y UNION Optimización de consultas Vistas y procedimientos almacenados En este artículo exploraremos ambos enfoques con ejemplos prácticos y su uso en clases definidas en IRIS. Pero optimizar consultas SQL es una de las tareas más importantes para mantener el buen rendimiento de una aplicación basada en InterSystems IRIS. Muchas veces, pequeñas mejoras en el diseño de la consulta o en los índices pueden producir mejoras significativas en velocidad, especialmente cuando se trabaja con grandes volúmenes de datos. En este artículo técnico, exploraremos también cómo usar El Plan de Ejecución, cómo interpretar los planes de ejecución y qué prácticas seguir para escribir consultas eficientes. También agregue imagenes y detalle del paso a paso para poder probar y ejecutar un caso práctico con clases cargadas y un proyecto en Github, el cual tiene toda la estructura de clases y ejecución para usar con Docker Definición de clase de ejemplo Primero, crearemos una clase de ejemplo para almacenar datos de pacientes: Class Demo.Paciente Extends (%Persistent) { Property Nombre As %String; Property Edad As %Integer; Property Diagnostico As %String; } Y crearemos otra clase de ejemplo para almacenar datos de pacientes pero con índice: Class Demo.PacienteIndice Extends (%Persistent) { Property Nombre As %String; Property Edad As %Integer; Property Diagnostico As %String; Index EdadIndex On Edad; } Cómo funciona la ejecución de consultas en IRIS El motor SQL de InterSystems IRIS convierte una consulta en un plan de ejecución, que define cómo se van a recuperar los datos. Este plan puede incluir: Escaneos completos de tabla Uso de índices Ordenamientos intermedios Tipos de join (nested loop, merge join, etc.) Entender ese plan permite mejorar consultas que de otro modo serían lentas. Continuamos con el script para insertar los datos https://github.com/kathitadurcon/sql-iris-demo/blob/main/sql-iris-demo/iris.script SQL Embebido ¿Qué es? SQL Embebido te permite insertar consultas SQL dentro del código ObjectScript. Estas consultas se compilan con el código, proporcionando rendimiento y verificación anticipada. Ahora un ejemplo práctico Class Demo.SQLEmbebido { ClassMethod BuscarPacientes(minEdad As %Integer) { &sql(DECLARE c CURSOR FOR SELECT Nombre, Edad FROM Demo.Paciente WHERE Edad >= :minEdad) &sql(OPEN c) While (SQLCODE = 0) { &sql(FETCH c INTO :nombre, :edad) If (SQLCODE = 0) { Write "Paciente: ", nombre, " (", edad, " años)", ! } } &sql(CLOSE c) } } Ejecución: USER>Do ##class(Demo.SQLEmbebido).BuscarPacientes(35) Resultado: Paciente: Luis (45 años) SQL Dinámico ¿Qué es? SQL Dinámico te permite construir sentencias SQL en tiempo de ejecución, ideal para situaciones en las que no sabes con anticipación los filtros o campos que se usarán. Ejemplo práctico Class Demo.SQLDinamico { ClassMethod BuscarPorDiagnostico(diagnostico As %String) { Set consulta = "SELECT Nombre, Edad FROM Demo.Paciente WHERE Diagnostico = ?" Set rs = ##class(%SQL.Statement).%New() Set sc = rs.%Prepare(consulta) If $$$ISERR(sc) { Write "Error preparando consulta",! Quit } Set r = rs.%Execute(diagnostico) While r.%Next() { Write "Paciente: ", r.%Get("Nombre"), " (", r.%Get("Edad"), " años)", ! } } } Ejecución: Do ##class(Demo.SQLDinamico).BuscarPorDiagnostico("Diabetes") Resultado: Paciente: Luis (45 años) Comparación rápida Característica SQL Embebido SQL Dinámico Validación en compilación Sí No (se evalúa en ejecución) Rendimiento Rápido Ligeramente más lento Flexibilidad Menor Alta (puedes construir consultas) Uso recomendado Lógica fija y conocida Filtros condicionales o configurables Tanto el SQL Embebido como el Dinámico son herramientas valiosas en InterSystems IRIS. Puedes usarlos según el contexto: ¿Consultas conocidas, validadas y frecuentes? ➜ Usa SQL Embebido. ¿Consultas variables o configurables? ➜ Usa SQL Dinámico. Sigamos con un caso práctico! Que necesitamos? Un contenedor Docker con IRIS Community Edition. Código fuente .cls con los ejemplos. Script de inicialización para poblar la base de datos. Instrucciones paso a paso. Estructura del proyecto sql-iris-demo/ ├── Dockerfile ├── iris.script └── cls/ ├── Demo.Paciente.cls ├── Demo.SQL_Embebido.cls └── Demo.SQL_Dinamico.cls Cómo ejecutar la demo Crea una carpeta local, por ejemplo: sql-iris-demo/ Clonamos el repo https://github.com/kathitadurcon/sql-iris-demo Abre una terminal y navega a esa carpeta Ejecuta: docker build -t iris-sql-demo . docker run -d --name iris-sql -p 52773:52773 -p 1972:1972 iris-sql-demo Inicia sesión en la terminal de IRIS: docker exec -it iris-sql iris session IRIS Dentro de la sesión, ejecuta: Do ##class(Demo.SQLEmbebido).BuscarPacientes(35) Do ##class(Demo.SQLDinamico).BuscarPorDiagnostico("Diabetes") Salida esperada Paciente: Luis (45 años) Paciente: Luis (45 años) Portal de Gestión para ver el Plan de ejecución Entramos al Portal de Gestión, normalmente usamos usuario SuperUser clave SYS y nos pedirá cambiar la clave http://localhost:52773/csp/sys/%25CSP.Portal.Home.zen Vamos a SQL Y nos aseguramos que el NameSpace sea USER Anteriormente creamos dos clase Demo.Paciente y la clase Demo.PacienteIndice que tiene creado el índice para edad Index EdadIndex On Edad; Ejecutamos lo siguienteSELECT ID, Diagnostico, Edad, Nombre FROM Demo.Paciente WHERE Edad=32 Resultado Ejecutamos lo siguiente SELECT ID, Diagnostico, Edad, Nombre FROM Demo.PacienteIndice WHERE Edad=32 Resultado Interpretación: Al agregar los indices a una clase y después hacer las consultas el costo relativo baja, a mayor volumen de datos se ve reflejado con respuestas más rápidas. Reescritura de consultas para mejorar rendimiento Algunos consejos útiles: Problema Solución sugerida WHERE YEAR(Fecha) = 2023 WHERE Fecha BETWEEN '2023-01-01' AND '2023-12-31' SELECT * Seleccionar solo las columnas necesarias WHERE sin condición clara Asegurarse de usar claves o índices en join o where Ahora Vamos con el VIDEO
Artículo
Marco Bahamondes · 30 jun, 2025

Exponer una API REST básica con InterSystems IRIS: Ejemplo paso a paso en Docker

Introducción InterSystems IRIS permite crear APIs REST utilizando clases ObjectScript y el framework %CSP.REST. Esta funcionalidad permite desarrollar servicios modernos para exponer datos a aplicaciones web, móviles o integraciones externas. En este artículo aprenderás cómo crear una API REST básica en InterSystems IRIS, incluyendo: Clase de datos persistente Clase REST con métodos GET y POST Web application para exponer la API Demostración completa con Docker Paso 1: Crear la clase de datos Demo.Producto Class Demo.Producto Extends (%Persistent, %JSON.Adaptor) { Property Nombre As %String; Property Precio As %Numeric(10,2); } %Persistent permite almacenar en la base de datos. %JSON.Adaptor facilita convertir objetos a JSON. Paso 2: Crear la clase REST Demo.ProductoAPI Class Demo.ProductoAPI Extends %CSP.REST { XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <Route Url="/producto" Method="GET" Call="Listar"/> <Route Url="/producto" Method="POST" Call="Crear"/> </Routes> } ClassMethod Listar() As %Status { Try { Set productos = [] &sql(DECLARE C1 CURSOR FOR SELECT ID, Nombre, Precio FROM Demo.Producto) &sql(OPEN C1) While (SQLCODE=0) { &sql(FETCH C1 INTO :id, :nombre, :precio) Quit:SQLCODE'=0 Do productos.%Push({"ID": (id), "Nombre": (nombre), "Precio": (precio)}) } Do ##class(%REST.Impl).%SetContentType("application/json") Do ##class(%REST.Impl).%SetStatusCode("200") Write productos.%ToJSON() } Catch (ex) { Do ##class(%REST.Impl).%SetStatusCode("400") Write ex.DisplayString() } Quit $$$OK } ClassMethod Crear() As %Status { Try { set dynamicBody = {}.%FromJSON(%request.Content) Set prod = ##class(Demo.Producto).%New() Set prod.Nombre = dynamicBody.%Get("Nombre") Set prod.Precio = dynamicBody.%Get("Precio") Do prod.%Save() Do ##class(%REST.Impl).%SetContentType("application/json") Do ##class(%REST.Impl).%SetStatusCode("200") Write prod.%JSONExport() } Catch (ex) { Do ##class(%REST.Impl).%SetStatusCode("400") Write ex.DisplayString() } Quit $$$OK } } Paso 3: Crear una Web Application Desde el Portal de Administración: Ir a System Administration > Security > Applications > Web Applications Crear una nueva aplicación: URL: /api/productos Namespace: USER Clase: Demo.ProductoAPI Activar REST y acceso anónimo para pruebas para entrar al portal http://localhost:52773/csp/sys/%25CSP.Portal.Home.zen Usuario=SuperUser Clave=SYS Agregar la Funciones de aplicacion Developer Paso 4: Docker de demostración Estructura del proyecto apirest-demo/ ├── Dockerfile ├── iris.script └── cls/ ├── Demo.Producto.cls └── Demo.ProductoAPI.cls Dockerfile FROM intersystemsdc/iris-community:latest COPY cls /irisdev/app/cls COPY iris.script /irisdev/app/iris.script RUN iris start IRIS \ && iris session IRIS < /irisdev/app/iris.script \ && iris stop IRIS quietly Comandos para construir y correr el contenedor cd apirest-demo docker build -t iris-apirest-demo . docker run -d --name iris-api -p 52773:52773 -p 1972:1972 iris-apirest-demo Pruebas con Postman o curl GET productos curl http://localhost:52773/api/productos/producto POST producto curl -X POST http://localhost:52773/api/productos/producto \ -H "Content-Type: application/json" \ -d '{"Nombre":"Cafe","Precio":2500}' para descarcar el codigo de ejemplo https://github.com/MarcoBahamondes/apirest-demo git clone https://github.com/MarcoBahamondes/apirest-demo
Anuncio
Mario Sanchez Macias · 17 dic, 2021

Aviso: Vulnerabilidad en la Librería Apache Log4j2 afectando a los productos de InterSystems

13 de diciembre de 2021 InterSystems está investigando el impacto de una vulnerabilidad de seguridad relacionada con Apache Log4j2. La vulnerabilidad — impactando al menos a Apache Log4j2 (versiones 2.0 a 2.14.1) — fue anunciada recientemente por Apache y ha sido notificada en la Base de Datos de Vulnerabilidad Local de Estados Unidos (NVD) como CVE-2021-44228 con la calificación de gravedad más alta, 10.0. Por favor, consultad esta página para conocer más detalles sobre la vulnerabilidad y actualizaciones sobre si los productos de InterSystems están afectados.
Artículo
Ricardo Paiva · 6 feb, 2020

Implementación de la estructura Open Authorization (OAuth 2.0) en InterSystems IRIS - Parte 1

Este artículo, y los dos siguientes de la serie, se conciben como una guía para los usuarios, los desarrolladores o para los administradores de sistemas que necesiten trabajar con la estructura de OAuth 2.0 (conocido también por simplicidad como OAUTH) en aplicaciones que estén basadas en los productos de InterSystems. Correcciones y cambios después de la publicación 3 de agosto, 2016 - se corrigió la configuración para capturas de pantalla en la API Client de Google y se actualizaron las capturas de pantalla en las API de Google para incorporar la nueva versión en las páginas 28 de agosto, 2016 - se realizaron cambios en el código que se relaciona con JSON, dichos cambios se ven reflejados en la compatibilidad entre JSON y Cache 2016.2 3 de mayo, 2017 - se realizaron actualizaciones en el texto y en las pantallas para incluir la nueva IU y las funcionalidades disponibles con el lanzamiento de Cache 2017.1 19 de febrero, 2018 - Caché se cambió a InterSystems IRIS para mostrar los últimos desarrollos. Sin embargo, hay que tener en cuenta que a pesar de los cambios en el nombre del producto, el artículo cubre todos los productos de InterSystems - la plataforma de datos InterSystems IRIS, Ensemble y Caché. Parte 1. Cliente Introducción Esta es la primera parte de una serie de 3 artículos sobre la implementación de la estructura Open Authorization en InterSystems. En esta primera parte, veremos una breve introducción al tema y mostraremos un escenario sencillo en el que la aplicación InterSystems IRIS actúa como cliente para un Servidor de autorización, solicitando algunos recursos que están protegidos. En la segunda parte se describirá un escenario más complejo, donde el propio InterSystems IRIS actúa como un servidor de autorización y también como un servidor de autenticación mediante OpenID Connect. En la última parte de esta serie se describirán los distintos componentes de las clases en la estructura OAUTH, tal y como son implementados por InterSystems IRIS. En qué consiste la estructura Open Authorization[1] Muchos de ustedes ya han oído hablar sobre la estructura Open Authorization y para qué se puede utilizar. Así que solamente haré un breve resumen para aquellos que aún no la conocen. La estructura Open Authorization, OAUTH (actualmente en su versión 2.0), es un protocolo que básicamente permite que las aplicaciones basadas en la web intercambien información de forma segura al establecer confianza, de manera indirecta, entre un cliente (la aplicación que solicita los datos) y el propietario de los recursos (la aplicación que posee los datos que se solicitaron). La confianza como tal se proporciona mediante un agente que tanto el cliente como el servidor de recursos reconocen y en el que confían. Este agente se denomina el servidor de autorización. A continuación, se muestra un caso sencillo en el que podría utilizarse: Supongamos que Jenny (en la terminología de OAUTH sería la propietaria del recurso) trabaja en un proyecto para la empresa JennyCorp. Ella crea un plan para realizar un proyecto sobre un negocio que será potencialmente más grande, e invita a su socio John (el usuario cliente) de JohnInc para que revise el documento. Sin embargo, a ella no le gusta que John entre en la VPN de su empresa, por lo que coloca el documento en una unidad de Google Drive (el Servidor de recursos) u otro tipo de almacenamiento similar en la nube. Cuando hizo esto, estableció una confianza digital entre ella y Google (el Servidor de autorización). Ella etiqueta el documento para ser compartido con John (John ya utiliza Google Drive y Jenny conoce su email). Cuando John quiere leer el documento, primero lo autentica con su cuenta de Google y desde su dispositivo móvil (tableta, bloc de notas, etc.) abre un editor de documentos (el servidor del cliente) y carga el archivo del proyecto de Jenny. Aunque esto parezca bastante sencillo, existe mucha comunicación entre las dos personas y Google. Toda la comunicación sigue la especificación de OAuth 2.0, por lo que el cliente de John (la aplicación de lectura), tiene que autenticarse primero con Google (este paso no está cubierto por OAUTH) y una vez que John otorgue su consentimiento en el formulario que proporciona Google, Google dará su autorización para que la aplicación de lectura tenga acceso al documento mediante la emisión de un token de acceso. La aplicación de lectura utiliza el token de acceso para emitir una solicitud hacia el servicio de Google Drive, con el fin de que sea posible recuperar el archivo de Jenny. En el siguiente diagrama se muestra cómo ocurre la comunicación entre cada una de las partes: Tenga en cuenta que aunque todas las comunicaciones de OAUTH 2.0 utilizan solicitudes HTTP, no es necesario que los servidores sean aplicaciones web. Vamos a mostrar este sencillo escenario con InterSystems IRIS. Demo sencilla de Google Drive En esta demostración crearemos una pequeña aplicación con base en CSP, que solicitará los recursos (la lista de archivos) guardados en Google Drive con nuestra propia cuenta (y también una lista de nuestros eventos en el calendario como una ventaja adicional). Requisitos previos Antes de que comenzar a programar la aplicación, necesitamos preparar el entorno. Esto incluye un servidor web que tenga habilitado el protocolo SSL y un perfil de Google. Configuración del servidor web Como se indicó anteriormente, necesitamos que el Servidor de autorización se comunique con SSL, ya que esto es un requisito establecido por OAuth 2.0 de forma predeterminada. Queremos que nuestros datos se mantengan seguros, ¿verdad? La explicación de cómo configurar un servidor web para que sea compatible con SSL está fuera del alcance de este artículo, por lo que debe consultar los manuales de usuario correspondientes al servidor web de su preferencia. Para su conocimiento (como veremos más adelante con algunas capturas de pantalla), en este ejemplo en particular utilizaremos el servidor Microsoft IIS. Configuración de Google Para registrarnos en Google, necesitamos usar el administrador de APIs de Google (Google API Manager) - https://console.developers.google.com/apis/library?project=globalsummit2016demo Para esta demo, creamos la cuenta GlobalSummit2016Demo. Asegúrese de que tenemos habilitada la API del Drive API. Ahora se definen las credenciales: Y tenga en cuenta lo siguiente. Authorized JavaScript – solamente permitimos a los scripts que se originan de forma local, y que tengan relación con la llamada a la página Authorized redirect URIs – en teoría podemos redirigir nuestra aplicación del cliente hacia cualquier sitio, pero cuando utilizamos la implementación de InterSystems IRIS, OAUTH, debemos redirigirla hacia https://localhost/csp/sys/oauth2/OAuth2.Response.cls. Puede definir varias URI de redireccionamiento autorizadas, como se muestra en la captura de pantalla, aunque para esta demostración únicamente necesitamos la segunda entrada de las dos que hay disponibles Por último, es necesario que se configure InterSystems IRIS como cliente del Servidor de Autorización de Google. Configuración de Caché La configuración como cliente de InterSystems IRIS OAUTH2 es un proceso en dos pasos. Primero, necesitamos crear una Configuración para el Servidor. En SMP, vaya a System Administration > Security > OAuth 2.0 > Client Configurations. Haga click en el botón Create Server Configuration, complete el formulario y guárdelo. Toda la información que introdujo en el formulario está disponible en el sitio web para desarrolladores de Google ("Google Developers"). Tenga en cuenta que InterSystems IRIS es compatible con el reconocimiento automático de Open ID. Sin embargo, como no utilizamos ese protocolo, introdujimos toda la información de forma manual. Ahora, haga clic en el enlace Client Configurations que se encuentra junto al Issuer Endpoint recién creado y haga clic en el botón Create Client Configuration. Deje vacías las pestañas Client Information y JWT Settings (con los valores predeterminados) y complete los campos de la pestaña Client credentials. Tenga en cuenta que creamos un Confidential Client (este es más seguro que el público), lo que significa que la información confidencial del cliente nunca sale de la aplicación cliente-servidor (nunca se transmite al navegador). También, debe asegurarse de que la opción Use SSL/TLS está seleccionada, proporcione el nombre del servidor (debe ser localhost, ya que estamos redirigiendo la aplicación del cliente de manera local) y finalmente el puerto y el prefijo (esto es útil cuando existen varias instancias de InterSystems IRIS en el mismo equipo). De acuerdo a la información que se introdujo, la URL de redireccionamiento del cliente será registrada y se mostrará en la línea de arriba. En la captura de pantalla anterior, proporcionamos una configuración SSL llamada GOOGLE. El nombre en sí solamente sirve para ayudarle a determinar cuál de las muchas posibles configuraciones de la SSL se utilizará para este canal de comunicación en particular. Caché utiliza las configuraciones SSL/TLS para almacenar toda la información necesaria para establecer un tráfico seguro con el servidor (en este caso, los URI de Google OAuth 2.0). Consulte la documentación para obtener más información. Proporcione los valores de Client ID y los de Client Secret que se obtuvieron del formulario para definir Google Credentials (si utiliza la configuración manual). Ahora ya hemos terminado todos los pasos de la configuración y podemos avanzar hacia la programación de una aplicación CSP. La aplicación del cliente La aplicación del cliente es una sencilla aplicación web que se basa en CSP. Como tal, consiste en el código fuente del lado del servidor, que se define y ejecuta mediante el servidor web y una interfaz de usuario, y se muestra a los usuarios mediante un navegador web. El servidor del cliente El servidor del cliente es una aplicación sencilla de 2 páginas. Dentro de la aplicación, podemos: · Juntar el redireccionamiento de la URL con el Servidor de Autorización de Google · Realizar solicitudes a las APIs de Google Drive y de Google Calendar y mostrar el resultado Página 1 Esta es una página de la aplicación, donde decidimos llamar a Google mediante sus recursos. A continuación, se muestra un código minimalista, pero totalmente funcional, para representar la página. Class Web.OAUTH2.Google1N Extends %CSP.Page { Parameter OAUTH2CLIENTREDIRECTURI = "https://localhost/csp/google/Web.OAUTH2.Google2N.cls"; Parameter OAUTH2APPNAME = "Google"; ClassMethod OnPage() As %Status { &html<<html> <head> </head> <body style="text-align: center;"> <!-- insert the page content here --> <h1>Google OAuth2 API</h1> <p>This page demo shows how to call Google API functions using OAuth2 authorization. <p>We are going to retrieve information about user and his/her Google Drive files as well as calendar entries. > // we need to supply openid scope to authenticate to Google set scope="openid https://www.googleapis.com/auth/userinfo.email "_ "https://www.googleapis.com/auth/userinfo.profile "_ "https://www.googleapis.com/auth/drive.metadata.readonly "_ "https://www.googleapis.com/auth/calendar.readonly" set properties("approval_prompt")="force" set properties("include_granted_scopes")="true" set url=##class(%SYS.OAuth2.Authorization).GetAuthorizationCodeEndpoint(..#OAUTH2APPNAME,scope, ..#OAUTH2CLIENTREDIRECTURI,.properties,.isAuthorized,.sc) w !,"<p><a href='"_url_"'><img border='0' alt='Google Sign In' src='images/google-signin-button.png' ></a>" &html<</body> </html>> Quit $$$OK } ClassMethod OnPreHTTP() As %Boolean [ ServerOnly = 1 ] { #dim %response as %CSP.Response set scope="openid https://www.googleapis.com/auth/userinfo.email "_ "https://www.googleapis.com/auth/userinfo.profile "_ "https://www.googleapis.com/auth/drive.metadata.readonly "_ "https://www.googleapis.com/auth/calendar.readonly" if ##class(%SYS.OAuth2.AccessToken).IsAuthorized(..#OAUTH2APPNAME,,scope,.accessToken,.idtoken,.responseProperties,.error) { set %response.ServerSideRedirect="Web.OAUTH2.Google2N.cls" } quit 1 } } Explicamos brevemente el código: 1. Método OnPreHTTP - primero, debemos verificar si, por casualidad, ya obtuvimos un token de acceso válido como resultado de la autorización de Google (esto puede suceder, por ejemplo, cuando simplemente actualizamos la página). Si no es así, necesitaremos la autorización. Si ya tenemos un token, simplemente redirigiremos la página hacia la página que muestra los resultados 2. Método OnPage - solo lo utilizamos si no contamos con un token de acceso válido disponible. Para iniciar la comunicación, tenemos que realizar nosotros mismos la autenticación y la autorización con Google para que nos conceda el token de acceso 3. Definimos el objetivo de una cadena y las propiedades de la matriz que modifican el comportamiento del cuadro de diálogo para la autenticación de Google (necesitamos autenticarnos frente a Google antes de que éste nos otorgue su autorización según nuestra identidad) 4. Por último, recibimos la URL para una página de inicio de sesión en Google y se la presentamos al usuario seguida de la página de consentimiento Una última cosa a tener en cuenta: Especificamos la verdadera página de redireccionamiento en https://www.localhost/csp/google/Web.OAUTH2.Google2N.cls con el parámetro OAUTH2CLIENTREDIRECTURI. Sin embargo, ¡hemos usado la página del sistema de InterSystems IRIS con la estructura OAUTH para definir las credenciales de Google! El redireccionamiento se gestiona internamente mediante la clase de nuestro controlador OAUTH. Página 2 En esta página se muestran los resultados de la autorización de Google y, si salió bien, recurriremos a las llamadas de la API de Google para recuperar los datos. Una vez más, es un código minimalista, pero totalmente funcional. Dejamos a la imaginación del lector una forma más estructurada para mostrar los datos que obtienen. Include %occInclude Class Web.OAUTH2.Google2N Extends %CSP.Page { Parameter OAUTH2APPNAME = "Google"; Parameter OAUTH2ROOT = "https://www.googleapis.com"; ClassMethod OnPage() As %Status { &html<<html> <head> </head> <body>> // Check if we have an access token set scope="openid https://www.googleapis.com/auth/userinfo.email "_ "https://www.googleapis.com/auth/userinfo.profile "_ "https://www.googleapis.com/auth/drive.metadata.readonly "_ "https://www.googleapis.com/auth/calendar.readonly" set isAuthorized=##class(%SYS.OAuth2.AccessToken).IsAuthorized(..#OAUTH2APPNAME,,scope,.accessToken,.idtoken,.responseProperties,.error) if isAuthorized { // Google has no introspection endpoint - nothing to call - the introspection endpoint and display result -- see RFC 7662. w "<h3>Data from <span style='color:red;'>GetUserInfo API</span></h3>" // userinfo has special API, but could be also retrieved by just calling Get() method with appropriate url try { set tHttpRequest=##class(%Net.HttpRequest).%New() $$$THROWONERROR(sc,##class(%SYS.OAuth2.AccessToken).AddAccessToken(tHttpRequest,"query","GOOGLE",..#OAUTH2APPNAME)) $$$THROWONERROR(sc,##class(%SYS.OAuth2.AccessToken).GetUserinfo(..#OAUTH2APPNAME,accessToken,,.jsonObject)) w jsonObject.%ToJSON() } catch (e) { w "<h3><span style='color: red;'>ERROR: ",$zcvt(e.DisplayString(),"O","HTML")_"</span></h3>" } /****************************************** * * * Retrieve info from other APIs * * * ******************************************/ w "<hr>" do ..RetrieveAPIInfo("/drive/v3/files") do ..RetrieveAPIInfo("/calendar/v3/users/me/calendarList") } else { w "<h1>Not authorized!</h1>" } &html<</body> </html>> Quit $$$OK } ClassMethod RetrieveAPIInfo(api As %String) { w "<h3>Data from <span style='color:red;'>"_api_"</span></h3><p>" try { set tHttpRequest=##class(%Net.HttpRequest).%New() $$$THROWONERROR(sc,##class(%SYS.OAuth2.AccessToken).AddAccessToken(tHttpRequest,"query","GOOGLE",..#OAUTH2APPNAME)) $$$THROWONERROR(sc,tHttpRequest.Get(..#OAUTH2ROOT_api)) set tHttpResponse=tHttpRequest.HttpResponse s tJSONString=tHttpResponse.Data.Read() if $e(tJSONString)'="{" { // not a JSON d tHttpResponse.OutputToDevice() } else { w tJSONString w "<hr/>" /* // new JSON API &html<<table border=1 style='border-collapse: collapse'>> s tJSONObject={}.%FromJSON(tJSONString) set iterator=tJSONObject.%GetIterator() while iterator.%GetNext(.key,.value) { if $isobject(value) { set iterator1=value.%GetIterator() w "<tr><td>",key,"</td><td><table border=1 style='border-collapse: collapse'>" while iterator1.%GetNext(.key1,.value1) { if $isobject(value1) { set iterator2=value1.%GetIterator() w "<tr><td>",key1,"</td><td><table border=0 style='border-collapse: collapse'>" while iterator2.%GetNext(.key2,.value2) { write !, "<tr><td>",key2, "</td><td>",value2,"</td></tr>" } // this way we can go on and on into the embedded objects/arrays w "</table></td></tr>" } else { write !, "<tr><td>",key1, "</td><td>",value1,"</td></tr>" } } w "</table></td></tr>" } else { write !, "<tr><td>",key, "</td><td>",value,"</td></tr>" } } &html<</table><hr/> > */ } } catch (e) { w "<h3><span style='color: red;'>ERROR: ",$zcvt(e.DisplayString(),"O","HTML")_"</span></h3>" } } } Echemos un vistazo rápido al código: 1. En primer lugar, debemos comprobar si contamos con un token de acceso válido (que estamos autorizados) 2. Si es así, podemos hacer solicitudes a las APIs que ofrece Google, y están cubiertas por el token de acceso que se emitió 3. Para ello, utilizamos la clase estándar %Net.HttpRequest, pero añadimos el token de acceso a los métodos GET o POST, de acuerdo con la especificación de la API que se llamó 4. Como puede ver, la estructura OAUTH tiene implementado el método GetUserInfo() para su comodidad, pero puede recuperar directamente la información del usuario utilizando la especificación de la API de Google, de igual forma que lo hicimos con el método de ayuda RetrieveAPIInfo() 5. OAUTH intercambia los datos en formato JSON, simplemente leemos los datos que obtenemos y los volcamos en el navegador. Le corresponde al desarrollador de la aplicación analizar y dar formato a los datos recibidos, para que el usuario pueda verlos de una manera que sea útil para él. Pero esto va más allá del objetivo de esta demostración. (Aunque existen algunos comentarios en el código que muestran cómo realizar estos análisis) Aquí se puede ver una captura de pantalla con los resultados, donde se muestran datos sin procesar en JSON. Continúe con la parte 2, en la que se describe cómo actúa InterSystems IRIS como un servidor de autorización y como un proveedor de OpenID Connect. [1] https://tools.ietf.org/html/rfc6749, https://tools.ietf.org/html/rfc6750
Artículo
Jose-Tomas Salvador · 28 ene, 2020

Editar y Compilar múltiples proyectos en InterSystems IRIS con ObjectScript utilizando VSCode y Docker

Hola Desarrolladores! "objectscript.conn" :{ "ns": "IRISAPP", "active": true, "docker-compose": { "service": "iris", "internalPort": 52773 } Quiero compartir con vosotros una estupenda nueva funcionalidad que he descubierto en la nueva versión 0.8 del plugin de VSCode ObjectScript desarrollado por @Dmitry.Maslennikov y CaretDev. La versión viene con un nuevo parámetro de configuración: "docker-compose"; que resuelve el problema con los puertos que necesitas para conectar tu editor VSCode a IRIS. No era muy cómodo si tenías más de un contenedor docker con IRIS corriendo en la misma máquina. Ahora ¡esto está resuelto! Veamos como funciona ahora... El concepto de utilizar docker localmente para desarrollar con IRIS supone que tienes un dockerfile y un docker-compose.yml en el repositorio, con los que tu construyes el entorno del proyecto y cargas todo el código ObjectScript dentro del contenedor IRIS descargado de Docker Hub. Y también tienes el archivo .vscode/settings.json de VSCode en el repositorio, en el cual indicas el puerto del servidor web de IRIS al que te conectas (junto con otros parámetros de conexión tales como URL, Namespace y credenciales de acceso). La cuestión es: ¿cuál es el puerto al que se debería conectar VSCode? Puedes utilizar el puerto 52773, que es el puerto por defecto del servidor web de IRIS. Pero si intentas lanzar un segundo contenedor docker, fallará porque no puedes ejecutar dos contenedores docker en la misma máquina que comparten conexiones en el mismo puerto. Puedes exponer un puerto externo para un contenedor docker y esto se puede configurar en el archivo docker-compose.yml. Aquí vemos un ejemplo (en negrita el puerto mapeado): version: '3.6' services: iris: build: . restart: always ports: - 52791:52773 volumes: - ~/iris.key:/usr/irissys/mgr/iris.key - ./:/irisdev/app De este modo, puedes mirar en el docker-compose y escribir el mismo puerto en .vscode/settings.json: Entonces, te preguntarás, ¿cuál es el problema? El problema está en cuando expones tu proyecto como una librería o demo e invitas a la gente a ejecutar y editar código con VSCode. No quieres que tengan que configurar el puerto manualmente y quieres que puedan clonar el repositorio, ejecutar docker y tener la opción de colaborar inmediatamente. Y esta es la cuestión: ¿a qué puertos deberías mapear tu proyecto en docker-compose de modo que no provoque ningún conflicto en el entorno de cualquier otro desarrollador? Incluso si no lo expones a nadie más que a tí, ¿qué puerto pondrías en los parámetros de la conexión en .vscode/settings.json? La cuestión es que, cuando lanzas un nuevo docker con IRIS, ves un mensaje de error diciendo que el puerto ya está en uso y, o bien paras el otro contenedor o bien te inventas otro puerto que quizá no esté siendo utilizado y pruebas con él en docker-compose y settings.json. Es aburrido, es una pérdida de tiempo, es un esfuerzo inútil. A nadie le gusta. Y ocurre lo mismo si expones la librería. La solución la encontramos con la nueva release 0.8 de VSCode ObjectScript, donde puedes introducir una sección docker-compose, que resuelve para siempre este tema: "objectscript.conn" :{ "ns": "IRISAPP", "active": true, "docker-compose": { "service": "iris", "internalPort": 52773 } Contiene los parámetros service e internalPort que le indican a VSCode que para encontrar el puerto al que debe conectarse debe mirar en el fichero docker-compose.yml que tenemos en el mismo repositorio e ir a la sección del servicio "iris" donde encontrará el puerto que está mapeado al puerto interno 52773. ¡Bien! Y lo que aún es mejor, Docker ahora tiene el modo para docker-compose.yml en el que puedes no configurar ningún puerto en docker, y en su lugar dejar el símbolo "-" como puerto mapeado, lo que significa que docker utilizará, de forma aleatoria, cualquier puerto que esté disponible. iris: build: context: . dockerfile: Dockerfile-zpm restart: always ports: - 51773 - 52773 - 53773 volumes: - ~/iris.key:/usr/irissys/mgr/iris.key - ./:/irisdev/app ¡Bien, por partida doble! Porque esto te da la opción de no preocuparte nunca más sobre los puertos del servidor web de IRIS a los que se debe conectar VSCode. ¿Cómo funciona en este caso? Ejecutamos docker-compose.yml , docker coge un puerto aleatorio para el servidor web y ejecuta IRIS con él, VSCode obtiene este puerto desde docker y conecta con IRIS a través de él de modo que tú puedes editar y compilar código inmediatamente. Sin configuraciónes adicionales. ¡Aprovecha! Puedes sentir la magia con el siguiente template que modificamos recientemente de acuerdo a la nueva funciontalidad de VSCode ObjectScript 0.8 y que ya tiene modificados los ficheros settings.json y docker-compose.yml. Para probar el template ejecuta los siguientes comandos en el terminal (probado en Windows 10 y en Mac). También necesitas tener instalado git y Docker Desktop. $ git clone https://github.com/intersystems-community/objectscript-docker-template.git $ cd objectscript-docker-template $ docker-compose up -d Abre este directorio en VSCode (asegúrate de que tienes el plugin VScode ObjectScript instalado): Comprueba si VSCode está conectado - haz click en la línea de estado de VSCode: Reconecta VSCode si es necesario. Si lo necesitas también puedes abrir un terminal IRIS en VSCode con el menú de ObjectScript (*). ¡Hecho! Ahora puedes ejecutar, compilar y debugar el código! ¡Disfruta! Nota.- A fecha de hoy, la opción de abrir un terminal de IRIS directamente desde VSCode puede dar un error. No obstante, se puede entrar en la consola de IRIS desde VSCode abriendo un terminal y ejecutando el comando: docker-compose exec iris /bin/bash -c 'command -v ccontrol >/dev/null 2>&1 && ccontrol session $ISC_PACKAGE_INSTANCENAME -U IRISAPP || iris session $ISC_PACKAGE_INSTANCENAME -U IRISAPP' Este problema será resuelto en posteriores versiones. Si te lo encuentras, añade un comentario para hacerle seguimiento. Este artículo ha sido etiquetado como "Mejores prácticas" ("Best practices"). Los artículos con la etiqueta "Mejores prácticas" incluyen recomendaciones sobre cómo desarrollar, probar, implementar y administrar mejor las soluciones de InterSystems.
Anuncio
Jose-Tomas Salvador · 26 mayo, 2020

InterSystems IRIS ya disponible en instancias EC2 de AWS basadas en ARM Graviton2

AWS ha liberado oficialmente su segunda generación de procesadores Graviton2 basados en ARM y asociados al tipo de instancia Amazon EC2 M6g, que presume de ser hasta un 40% mejor en precio-rendimiento sobre la actual generación de instancias M5 basadas en Xeon. Hace pocos meses, Inthhis nos llevó a suportar arquitecturas ARM64 por primera vez. ¡Ahora puedes probar InterSystems IRIS e InterSystems IRIS for Health sobre instancias Amazon EC2 M6g basadas en Graviton2 accesibles a través del AWS Marketplace! Si no estás familiarizado con el lanzamiento de una instancia a través del AWS Marketplace, vamos a hacerlo ahora. Lo primero es hacer log-in en tu cuenta AWS, después navega al listado de InterSystems IRIS del AWS Marketplace y haz clien en ‘Continue to Subscribe’ Click en ‘Accept Terms’ para subscribirte, espera un minuto, y después ‘Continue to Configuration’ Puedes aceptar los valores por defecto y ‘Continue to Launch’ En la página de lanzamiento, asegúrate de seleccionar el tipo de instancia m6g.large Ve bajando, y selecciona un par de claves válido, o sigue el link para crear uno nuevo si no tienes ya uno. Después selecciona Launch. Ahora ya puedes navegar a tu consola EC2 para acceder a tu nueva instancia. Le puedes dar un nombre, acceder a la dirección IP pública, como ves a continuación: Y entrar vía SSH a la instancia utilizando tu clave privada y el nombre del host (ubuntu@<Public-IP-Address>). Aquí estoy usando PuTTY, asegúrate de que apuntas a tu fichero de clave privada (.ppk for PuTTY, under SSH > Auth) Para otros clientes SSH e información adicional, por favor echa un vistazo a las Instrucciones de Uso copiadas aquí: Instrucciones de Uso para IRIS 2020.1(Arm64) Community Edition Para comenzar: - Entrar vía SSH a la instancia Ubuntu EC2 siguiendo las instrucciones aquí: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html El usuario por defecto es "ubuntu" - Tomar nota de la información de conexión proporcionada en el mensaje de conexión. - Comienza por resetear la pasword de IRIS: "$iris password" - Conecta tu IDE - ver: https://www.intersystems.com/developers/ - Aprender más con un Quickstart - https://learning.intersystems.com/course/view.php?id=1055&ssoPass=1 - Entra directamente al terminal de IRIS con: $docker exec -it iris iris session iris Recursos adicionales: Empezando con InterSystems IRIS - https://gettingstarted.intersystems.com/ InterSystems se esfuerza en dar a sus clientes la libertad para elegir plataforma. En InterSystems estamos entusiasmados por ver las ganancias en rendimiento y el ahorro en coste que los procesadores AWS Graviton2 pueden proporcionar a los usuarios de InterSystems IRIS. Preveemos que estos beneficios combinados deberían llevar a una adopción significativa de plataformas basadas en ARM entre usuarios de IRIS, y ¡nos emociona soportar InterSystems IRIS corriendo sobre instancias AWS Graviton2-based M6g EC2!
Anuncio
David Reche · 10 jun, 2020

Versión de prueba de InterSystems IRIS Advanced Analytics y de IRIS for Health Advanced Analytics

Ya están disponibles las versiones de prueba de InterSystems IRIS Advanced Analytics y de InterSystems IRIS for Health Advanced Analytics. El add-on Advanced Analytics para InterSystems IRIS introduce IntegratedML como una nueva funcionalidad. El número de compilación de estas versiones es el: 2020.3.0AA.331.0 Los kits para la instalación, las imágenes del contenedor y las licencias de evaluación están disponibles en la página de descargas para pruebas del Centro de Soporte Internacional (WRC). Los contenedores de la "Community Edition" también pueden obtenerse la Docker Store usando los siguientes comandos: docker pull store/intersystems/iris-aa-community:2020.3.0AA.331.0 docker pull store/intersystems/irishealth-aa-community:2020.3.0AA.331.0 Advanced Analytics es un add-on de InterSystems IRIS, e introduce IntegratedML, una nueva funcionalidad que ofrece el mejor machine learning a los analistas y desarrolladores, a través de una sencilla e intuitiva sintaxis de SQL. Los desarrolladores ahora pueden preparar y desplegar potentes modelos predictivos dentro de IRIS, justo donde se encuentran sus datos. Las versiones futuras de Advanced Analytics constarán de características adicionales y componentes de terceros para ofrecer funcionalidades avanzadas de analítica y machine learning. Esta versión incluye documentación para IntegratedML, como esta Guía de Usuario o estos recursos para IntegratedML del Servicio de Formación de InterSystems.
Artículo
Ricardo Paiva · 19 jun, 2020

Cómo crear una nueva base de datos, namespace y aplicación web para InterSystems IRIS de forma programática

¡Hola desarrolladores! ¿Os habéis encontrado con la necesidad de crear una base de datos, un namespace o una aplicación web de manera programática? Quiero compartir con vosotros un fragmento de código ObjectScript que permite crear una base de datos, un namespace y una aplicación web para InterSystems IRIS. ``` set currentNS = $namespace zn "%SYS" write "Create DB ...",! set dbName="testDB" set dbProperties("Directory") = "/InterSystems/IRIS/mgr/testDB" set status=##Class(Config.Databases).Create(dbName,.dbProperties) write:'status $system.Status.DisplayError(status) write "DB """_dbName_""" was created!",!! write "Create namespace ...",! set nsName="testNS" //DB for globals set nsProperties("Globals") = dbName //DB for routines set nsProperties("Routines") = dbName set status=##Class(Config.Namespaces).Create(nsName,.nsProperties) write:'status $system.Status.DisplayError(status) write "Namespace """_nsName_""" was created!",!! write "Create web application ...",! set webName = "/csp/testApplication" set webProperties("NameSpace") = nsName set webProperties("Enabled") = $$$YES set webProperties("IsNameSpaceDefault") = $$$YES set webProperties("CSPZENEnabled") = $$$YES set webProperties("DeepSeeEnabled") = $$$YES set webProperties("AutheEnabled") = $$$AutheCache set status = ##class(Security.Applications).Create(webName, .webProperties) write:'status $system.Status.DisplayError(status) write "Web application """webName""" was created!",! zn currentNS ``` También podéis consultar estos manuales: - [Creating Database](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Config.Databases) - [Namespace](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Config.Namespaces) - [CSP Application](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Security.Applications)
Anuncio
David Reche · 23 oct, 2020

Ya están disponibles InterSystems IRIS e IRIS for Health 2020.3 con IntegratedML

Ya está liberada la versión 2020.3 de InterSystems IRIS e IRIS for Health, con IntegratedML. Esta es la primera versión de InterSystems IRIS que incluye IntegratedML, una nueva funcionalidad de la plataforma de datos que ofrece a analistas y desarrolladores el mejor "machine learning" del mercado, con una sencilla e intuitiva sintaxis SQL. Ahora, los desarrolladores pueden crear, probar e implementar potentes modelos desde IRIS, justo donde se encuentran sus datos. La documentación sobre IntegratedML está disponible en esta Guía de usuario. Y también en IntegratedML Resource Guide. Durante el Virtual Summit 2020 habrá varias sesiones y un aula práctica sobre IntegratedML. Para esta versión: Los contenedores de las versiones Standard y Community están disponibles desde el Registro de Contenedores de InterSystems (RCI/ICR, documentado aquí) Los contenedores de la Community Edition también están disponibles en el Docker Hub Los kits (y ficheros de imágenes descargables) para la instalación de los programas, están disponibles en el página de distribución de software del Centro de Soporte Internacional (WRC) NOTA: Los kits completos de instalación se ofrecen para un subconjunto de plataformas de servidores, en el Centro de Soporte Internacional (WRC). Esto permitirá utilizar IntegratedML a los clientes que no usan contenedores, con la opción de actualizar a la versión 2021.1 Extended Maintenance. El número de compilación de estas versiones es 2020.3.0.302.0. Los contenedores de la Community Edition pueden obtenerse desde el Registro de Contenedores de InterSystems usando los siguientes comandos: docker pull containers.intersystems.com/intersystems/iris-ml-community:2020.3.0.302.0 docker pull containers.intersystems.com/intersystems/irishealth-ml-community:2020.3.0.302.0
Anuncio
Esther Sanchez · 18 nov, 2020

Nuevo vídeo: Como crear en 10 minutos una app usando Python Flask con InterSystems IRIS

¡Hola desarrolladores! Os traemos un nuevo vídeo, grabado por Raj Singh, Product Manager de InterSystems. ⏯ Cómo crear en 10 minutos una app usando Python Flask con InterSystems IRIS Podéis usar InterSystems IRIS como vuestra base de datos de backend para una aplicación web creada en Python Flask. Es tan fácil como con otras bases de datos. Configura una conexión ODBC a la base de datos y usa SQL dentro de Python para comunicar con ella. ⬇️ Python Flask middleware usando InterSystems IRIS como la base de datos del backend También podéis encontrar el vídeo en el canal de YouTube de la Comunidad de Desarrolladores en inglés: Esperamos que os resulte útil
Anuncio
David Reche · 21 abr, 2021

Versiones de prueba de InterSystems IRIS, IRIS for Health y Health Connect 2021.1

Ya están disponibles las versiones de prueba 2021.1 de InterSystems IRIS, IRIS for Health y HealthShare Health Connect. Al ser versiones de prueba, estamos impacientes por aprender de vuestras experiencias con las nuevas versiones, antes de su lanzamiento oficial el próximo mes. Podéis compartir vuestros comentarios a través de la Comunidad de Desarrolladores, para crear entre todos un mejor producto. InterSystems IRIS Data Platform 2021.1 es una versión EM (extended maintenance). Desde la anterior versión EM (la 2020.1), se han ido añadiendo muchas mejoras y funcionalidades nuevas en versiones CD (Continuous delivery, entrega continua). Podéis consultar las notas de las versiones 2020.2, 2020.3 y 2020.4 para conocer todas las mejoras. Las mejoras en esta versión ofrecen a los desarrolladores más libertad para crear aplicaciones rápidas y robustas en el lenguaje que prefieran. Y permite a los usuarios consumir grandes cantidades de información de forma más efectiva, a través de nuevas funciones analíticas más eficientes. Con InterSystems IRIS 2021.1, los clientes pueden implementar InterSystems IRIS Adaptive Analytics, un complemento ("add-on") que extiende InterSystems IRIS para ofrecer una mayor facilidad de uso, flexibilidad, escalabilidad y eficiencia a los usuarios analistas, independientemente de las herramientas de business intelligence (BI) que utilicen. Permite definir un modelo de negocio analytics-friendly y acelera de forma transparente las cargas de trabajo de consultas analíticas que se ejecutan contra este modelo, mediante la creación y mantenimiento, de forma autónoma, de estructuras de datos provisionales en segundo plano. Otras destacadas funcionalidades nuevas en esta versión son: un conjunto consolidado de External Language Gateways, con gestión mejorada y ahora incluyendo R y Python para construir código server-side robusto y escalable en el lenguaje de tu elección InterSystems Kubernetes Operator (IKO) ofrece configuración declarativa y automatización para tus entornos, y ahora también se soporta despliegue de InterSystems System Alerting & Monitoring (SAM) InterSystems API Manager v1.5, incluye una experiencia de usuario mejorada y soporte a Kafka Disponibilidad general de IntegratedML, facilitando a los desarrolladores SQL construir y desplegar modelos de Machine Learning directamente en un ambiente puro SQL InterSystems IRIS for Health 2021.1 incluye todas las mejoras de InterSystems IRIS. Además, esta versión amplía el soporte extendido de la plataforma al estándar FHIR®, a través de APIs para análisis y evaluación de expresiones FHIRPath contra datos FHIR. Esto es un añadido a las importantes funcionalidades relacionadas con FHIR lanzadas desde la versión 2020.1, incluyendo soporte a Perfiles FHIR, FHIR R4 Transforms y la FHIR client API. Todas estas mejoras se detallan en la: Documentación y notas de la versión de InterSystems IRIS 2021.1 Documentación y notas de la versión de InterSystems IRIS for Health 2021.1 Documentación y notas de la versión de HealthShare Health Connect 2021.1 Las versiones EM vienen con los paquetes de instalación clásicos para todas las plataformas soportadas, así como con las imágenes para contenedor en OCI (Open Container Initiative) es decir, en formato contenedor Docker. Para más detalles, podéis consultar el documento de Plataformas Soportadas. Los paquetes para la instalación y las claves para evaluación están disponibles en la página de descargas para pruebas del Centro de Soporte Internacional (WRC). Las imágenes del contenedor para las Enterprise Editions de InterSystems IRIS e IRIS for Health y todos sus componentes correspondientes están disponibles desde el Registro de Contenedores de InterSystems, usando los siguientes comandos: docker pull containers.intersystems.com/intersystems/iris:2021.1.0.205.0 docker pull containers.intersystems.com/intersystems/irishealth:2021.1.0.205.0 Para una lista completa de las imágenes disponibles, podéis consultar esta documentación. Las imágenes del contenedor para la Community Edition también pueden obtenerse desde el Docker store, usando los siguientes comandos: docker pull store/intersystems/iris-community:2021.1.0.205.0 docker pull store/intersystems/iris-community-arm64:2021.1.0.205.0 docker pull store/intersystems/irishealth-community:2021.1.0.205.0 docker pull store/intersystems/irishealth-community-arm64:2021.1.0.205.0 Además, las versiones en formato tarball de todos los contenedores están disponibles en la página de descargas para pruebas del Centro de Soporte Internacional (WRC). InterSystems IRIS Studio 2021.1 es una imagen independiente para desarrollo, soportada sobre Microsoft Windows y puede descargarse en la página de descargas para pruebas del Centro de Soporte Internacional (WRC). Es compatible con la versión 2021.1 y anteriores de InterSystems IRIS and IRIS for Health. InterSystems también soporta el plugin VSCode-ObjectScript para el desarrollo de aplicaciones para InterSystems IRIS con Visual Studio Code, disponible para Microsoft Windows, Linux y MacOS. Otros componentes standalone de InterSystems IRIS 2021.1, como el driver ODBC y Web Gateway, están disponibles desde la misma página. El número de compilación de estas versiones es 2021.1.0.205.0.