Venga, al lío, que tenemos nueva jornada de la Quiniela, veamos que partidos entran de Primera (24ª jornada) y Segunda (27ª).
Predicciones para Primera División:
Y las de Segunda:
Esto nos da la siguiente Quiniela:
¡Suerte y feliz viernes!
InterSystems IRIS es una Plataforma completa de datos.
InterSystems IRIS le proporciona todo lo que necesita para capturar, compartir, comprender y actuar sobre el activo más valioso de su organización, sus datos.
Dado que es una plataforma completa, InterSystems IRIS elimina la necesidad de integrar varias tecnologías de desarrollo. Las aplicaciones necesitan una menor cantidad de código, menos recursos del sistema y poco mantenimiento.
Venga, al lío, que tenemos nueva jornada de la Quiniela, veamos que partidos entran de Primera (24ª jornada) y Segunda (27ª).
Predicciones para Primera División:
Y las de Segunda:
Esto nos da la siguiente Quiniela:
¡Suerte y feliz viernes!
Si vuestra necesidad es la interacción entre el cliente y la aplicación (y, por lo tanto, la base de datos), SQL Dinámico puede ser más adecuado, ya que se "adapta" fácilmente a los cambios en las consultas. Sin embargo, este dinamismo tiene un costo: con cada nueva consulta, se remodela, lo que puede hacer que su ejecución sea más costosa. A continuación, se muestra un ejemplo sencillo de un fragmento de código en Python.
Podéis encontrar errores en cualquier punto de la ejecución del programa, y hay varias formas de generarlos y manejarlos en IRIS. En este artículo, exploraremos cómo gestionar excepciones de manera eficiente.
Uno de los tipos de retorno más utilizados es %Status, que los métodos emplean para indicar éxito o fallo. Vamos a empezar hablando de los valores de %Status.
Nos han desbordado las previsiones. Así que, ante el éxito de asistencia y todos los comentarios recibidos, os anuncio una nueva convocatoria extraordinaria del curso: Desarrollo de asistentes virtuales con RAG. ¡Mantenemos el precio promocional reducido! (plazas limitadas).
Primero, ¡queremos desearos un Feliz Año Nuevo a toda la comunidad de desarrolladores! Esperamos traer muchas cosas buenas este año, y hoy queremos presentaros la última versión de la extensión Intersystems Language Server para VS Code. La mayoría de las mejoras del Language Server se experimentan a través de la interfaz de la extensión ObjectScript, por lo que es posible que no hayáis notado los avances en áreas como IntelliSense y las ayudas emergentes que se han lanzado a lo largo de 2024. Os animamos a echar un vistazo rápido al CHANGELOG del Language Server para descubrir lo que os habéis
En un entorno con contenedores, podéis gestionar la hora de vuestro contenedor mediante la variable TZ o a través de los directorios /etc/timezone y /etc/localtime.
environment:
- TZ=Europe/Parisvolumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"Podéis encontrar ejemplos completos aquí:
Hola Comunidad,
Nos complace invitaros al seminario web Configuración de un servidor web para su uso con InterSystems IRIS.
Uníos a este seminario web para una charla técnica interesante y perspicaz sobre la configuración de un servidor web para su uso con InterSystems IRIS.
⏱ Fecha y hora: Jueves, 27 de febrero, 10:30 AM GMT
👨🏫 Ponente: @Steve Mallam, Jefe de equipo de HealthShare, InterSystems UK&I

Venga que nos vamos acercando ya en aciertos, veamos que tal se da esta 41ª jornada de la Quiniela, con partidos de la jornada 23ª de Primera División y 26ª de Segunda.
Veamos los partidos que entran en esta Quiniela:
Con pleno al 15 del derby madrileño por excelencia.
Aquí están las predicciones de Primera División:
Y las de Segunda:
Dándonos la siguiente Quiniela:
¡Suerte y buen fin de semana a todos!
Estimada comunidad,
Quería comentarles que hoy publique en OpenExchange un acelerador de APIs muy simple de implementar (con algún parecido a Redis, pero más funcional) y con resultados bastante buenos, a continuación está la publicación del README, espero les sea de ayuda!
https://openexchange.intersystems.com/package/memoria
Esta aplicación permite almacenar el resultado de una llamada a la API GET de forma permanente o por un periodo de tiempo, reduciendo los tiempos de respuesta al cliente final.
En el ejemplo a continuación se utiliza la API pública de Rick & Morty para realizar varias consultas al servidor. Cada consulta por sí sola y utilizando la conexión a internet del hogar demora alrededor de 300 ms. Al utilizar el acelerador el tiempo de respuesta es de alrededor de 7 ms.
La clase memoria.client es la encargada de llamar al método MGet, este método ejecuta la llamada a la API externa pero primero valida si la información de esta API está cacheada en la tabla memoria.store, de ser así valida que esté dentro del Time to Live (TTL) configurado y retorna el dato, si el TTL ya expiró borra la información y genera la llamada, almacena el resultado y lo retorna al programa.

Para una API estática, es decir, lista de países, nombre de ciudades, etc., recomiendo usar TTL=0 para mantener la lista en la tienda.
En la primera llamada (cuadrado rojo en la parte superior), el tiempo de la llamada fue de 722 ms y en todas las demás llamadas, el tiempo fue de aproximadamente 7 ms, en este caso solo un 1 % del tiempo original.
Después de 10 segundos (valor TTL), el tiempo aumentó a 220 ms

El Panel es una pequeña aplicación que le permite administrar los datos almacenados en caché y eliminarlos si es necesario.

Todos los pods reciben una asignación de Calidad de Servicio (QoS). Existen tres niveles de prioridad dentro de un nodo:
Es una forma de indicar al kubelet cuáles son vuestras prioridades en un nodo si es necesario recuperar recursos. Este fantástico GIF de Anvesh Muppeda lo explica.

La Interfaz de Pasarela de Servidor Web (WSGI, por sus siglas en inglés) es una convención de llamada para que los servidores web puedan reenviar solicitudes a aplicaciones o frameworks web escritos en el lenguaje de programación Python. WSGI es un estándar de Python descrito en detalle en PEP 3333.
🤔 Ok, gran definición, ¿y qué tiene que ver con IRIS?
IRIS 2024.2+ tiene una nueva característica que os permite ejecutar aplicaciones WSGI directamente en IRIS. Esta característica es una excelente manera de integrar IRIS con otros frameworks y bibliotecas de Python.
Esto sigue la tendencia de la experiencia Python primero, donde podéis usar Python para interactuar con IRIS, y ahora también podéis ejecutar aplicaciones Python directamente en IRIS.
Para instanciar una aplicación WSGI en IRIS, necesitáis configurarla en la sección Seguridad->Aplicaciones->Aplicaciones Web del Portal de Gestión de IRIS.
Ejemplo simple de Flask:
Archivo llamado app.py en el directorio /irisdev/app/community:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'

En esta sección, podéis configurar la aplicación WSGI introduciendo lo siguiente:
Nombre de Aplicación
esto corresponde al nombre del archivo de la aplicación WSGI.
Ejemplo: app.py pero sin la extensión .py: app.
Nombre de la función a llamar
la función invocable que será llamada por el servidor WSGI
por ejemplo, app corresponde a la variable app en el archivo app.py
app = Flask(__name__)Directorio de aplicaciones WSGI
/irisdev/app/communityTipo de protocolo Python
wsgi o asgiwsgi es el valor por defecto y el utilizado en este ejemploasgi es para aplicaciones asíncronas
asgi de forma sincronizada con el adaptador a2wsgiDEBUG
También podéis configurar la aplicación WSGI utilizando el fichero de configuración CPF de IRIS. He aquí un ejemplo de configuración:
[Actions]
CreateApplication:Name=/flask,NameSpace=IRISAPP,WSGIAppLocation=/irisdev/app/community/,WSGIAppName=app,WSGICallable=app,Type=2,DispatchClass=%SYS.Python.WSGI,MatchRoles=:%ALL,WSGIDebug=0,WSGIType=0
Los registros de la aplicación (logs) WSGI se almacenan en el archivo WSGI.log ubicado en el directorio mgr de la instancia.
Aquí tenéis algunos ejemplos de aplicaciones WSGI que podéis ejecutar en IRIS, pretenden mostrar cómo ejecutar diferentes frameworks de Python en IRIS.
Básicamente, el caso de uso será el mismo para todos los frameworks:
/iris - Devuelve un objeto JSON con las 10 principales clases presentes en el espacio de nombres IRISAPP./interop - Un endpoint que hará de "ping" para probar el framework de interoperabilidad de IRIS./posts - Un endpoint CRUD sencillo para un objeto Post./comments - Un endpoint CRUD sencillo para un objeto Comment.Objeto Post:
Objeto Comment:
a2wsgi.tornado ( jupyter, streamlit, .. ) no están soportadas ya que no son compatibles con WSGI.Variables de host son una característica de programación bastante común en muchas implementaciones de SQL.
Una pregunta reciente en DC me hizo darme cuenta de que en IRIS, Caché, Ensemble,...
las variables del host simplemente existen dentro del embedded SQL.
> You can supply host variables for Embedded SQL queries only. <
Se incluyen ejemplos relacionados en la documentación disponible.
A continuación se incluye una descripción de una solución alternativa si no utiliza o no puede utilizar embedded SQL.
Habemus fin de semana ergo, ¡habemus quiniela!
Jornadas 22ª de Primera División y 25ª de Segunda. Echemos un vistazo a los partidos que forman parte de la quiniela esta jornada:
Veamos la predicción para Primera División:
Y para Segunda:
Así queda pues la Quiniela:
¡Buen fin de semana!
No estoy seguro de que haya muchos que se conecten a MS SQL para ejecutar consultas, procedimientos almacenados, etc., pero nuestro sistema de salud tiene muchas bases de datos diferentes basadas en MS SQL que usamos en el entorno de interoperabilidad por diversas razones.
Con el impulso de movernos de on-premises a la nube, nos encontramos con algunas dificultades con nuestras conexiones SQL Gateway y cómo configurarlas para usar Microsoft Entra para la autenticación de Active Directory.
Ya están disponibles las últimas versiones de mantenimiento extendido de InterSystems IRIS, InterSystems IRIS for Health y HealthShare Health Connect.
La versión 2024.1.3 proporciona correcciones de errores para cualquiera de las versiones anteriores 2024.1.x, incluida la corrección para la siguiente alerta recientemente emitida: Alerta: Datos inválidos introducidos en la base de datos y archivos de registro con condiciones específicas...
Podéis encontrar las listas detalladas de cambios y las listas de verificación para la actualización en estas páginas:
Me alegra anunciar la nueva versión de IoP, que, por cierto, no es solo una línea de comandos. Lo digo porque el nuevo motor de búsqueda con IA aún cree que IoP es solo una línea de comandos. Pero no lo es. Es todo un framework para construir aplicaciones sobre las funcionalidades de interoperabilidad de IRIS con un enfoque Python.
La nueva versión de IoP: 3.2.0 viene con muchas características nuevas, pero la más importante es el soporte para DTL . 🥳
Tanto para mensajes de IoP como para jsonschema. 🎉

A partir de la versión 3.2.0, IoP admite transformaciones DTL.
DTL es la Capa de Transformación de Datos (Data Transformation Layer) en interoperabilidad de IRIS.
Las transformaciones DTL se utilizan para convertir datos de un formato a otro mediante un editor gráfico.
También es compatible con estructuras de jsonschema.
Primero, tenéis que registrar vuestra clase de mensaje en un archivo settings.py.
Para hacerlo, debéis añadir la siguiente línea en el archivo settings.py:
settings.py
from msg import MyMessage
SCHEMAS = [MyMessage]
Luego, podéis usar el comando de migración de IoP para generar los archivos de esquema para vuestras clases de mensaje.
iop --migrate /path/to/your/project/settings.py
msg.py
from iop import Message
from dataclasses import dataclass
@dataclass
class MyMessage(Message):
name: str = None
age: int = None
settings.py
from msg import MyMessage
SCHEMAS = [MyMessage]
Migrad los archivos de esquema
iop --migrate /path/to/your/project/settings.py
Para construir una transformación DTL, tenéis que crear una nueva clase de transformación DTL.
Id al Portal de Gestión de Interoperabilidad de IRIS y cread una nueva transformación DTL.

Luego, seleccionad las clases de mensaje de origen y destino.

Y su esquema.

Luego, podéis comenzar a construir vuestra transformación.

Incluso podéis probar vuestra transformación.

Ejemplo de payload para probar como mensaje de origen:
<test>
<Message>
<json><![CDATA[
{
"list_str":["toto","titi"],
"post":{"Title":"foo","Selftext":"baz"},
"list_post":[{"Title":"bar","Selftext":"baz"},{"Title":"foo","Selftext":"foo"}]
}
]]></json>
</Message>
</test>
A partir de la versión 3.2.0, IoP admite estructuras jsonschema para las transformaciones DTL.
Al igual que con las clases de mensaje, necesitáis registrar vuestro jsonschema.
Para hacerlo, debéis invocar este comando de Iris:
zw ##class(IOP.Message.JSONSchema).ImportFromFile("/irisdev/app/random_jsonschema.json","Demo","Demo")
Donde el primer argumento es la ruta al archivo jsonschema, el segundo argumento es el nombre del paquete y el tercer argumento es el nombre del esquema.
Luego, podéis usarlo en vuestra transformación DTL.
El esquema estará disponible con el nombre de Demo.
Ejemplo de archivo jsonschema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"title": "PostMessage",
"properties": {
"post": {
"allOf": [
{
"$ref": "#/$defs/PostClass"
}
]
},
"to_email_address": {
"type": "string",
"default": null
},
"my_list": {
"type": "array",
"items": {
"type": "string"
}
},
"found": {
"type": "string",
"default": null
},
"list_of_post": {
"type": "array",
"items": {
"allOf": [
{
"$ref": "#/$defs/PostClass"
}
]
}
}
},
"$defs": {
"PostClass": {
"type": "object",
"title": "PostClass",
"properties": {
"title": {
"type": "string"
},
"selftext": {
"type": "string"
},
"author": {
"type": "string"
},
"url": {
"type": "string"
},
"created_utc": {
"type": "number"
},
"original_json": {
"type": "string",
"default": null
}
},
"required": [
"title",
"selftext",
"author",
"url",
"created_utc"
]
}
}
}
Muchos se pueden encontrar en el paquete UnitTest en el directorio ./src/tests/cls.
Class UnitTest.ComplexTransform Extends Ens.DataTransformDTL [ DependsOn = IOP.Message ]
{
Parameter IGNOREMISSINGSOURCE = 1;
Parameter REPORTERRORS = 1;
Parameter TREATEMPTYREPEATINGFIELDASNULL = 0;
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='IOP.Message' targetClass='IOP.Message' sourceDocType='registerFilesIop.message.ComplexMessage' targetDocType='registerFilesIop.message.ComplexMessage' create='new' language='objectscript' >
<assign value='source.{post}' property='target.{post}' action='set' />
<foreach property='source.{list_str()}' key='k1' >
<assign value='source.{list_str(k1)}_"foo"' property='target.{list_str()}' action='append' />
</foreach>
<foreach property='source.{list_post()}' key='k2' >
<assign value='source.{list_post().Title}' property='target.{list_post(k2).Title}' action='append' />
</foreach>
</transform>
}
}
IoP viene con una nueva documentación, la cual está disponible en https://grongierisc.github.io/interoperability-embedded-python/.
Allí encontraréis toda la información que necesitáis para comenzar a usar IoP.
Espero que disfrutéis esta nueva versión de IoP. 🎉
Venga, a fracasar una nueva jornada de la Quiniela, ¡si es que ya no se puede confiar en ningún equipo de esta liga! Bueno, los madridistas podéis estar tranquilos, que mi estimado Valladolid no le va a suponer ninguna molestia.😭
Veamos qué partidos entran esta jornada, 21ª de Primera División y 24ª de Segunda:
Aquí tenemos las previsiones para Primera División:
Y Segunda:
Esto nos da la siguiente Quiniela:
¡A ver si nos reverdecemos los laureles de glorias pasadas!
En vuestra Producción de Interoperabilidad, siempre podíais tener una Business Operation (BO) que fuera un cliente HTTP y que utilizara OAuth 2.0 para la autenticación. Sin embargo, teníais que personalizar la BO para esta metodología de autenticación. Desde la versión 2024.3, que se lanzó recientemente, hay una nueva capacidad que proporciona nuevos ajustes para gestionar esto de forma más sencilla.
¡Hola! He ampliado mi repositorio de demostración, andreas5588/demo-dbs-iris, para facilitar las pruebas de las funciones FOREIGN SERVER y FOREIGN TABLE en IRIS.
Para lograrlo, creé un espacio de nombres llamado FEDERATION. La idea es la siguiente:
El Script: demo-dbs-iris/src/sql/02_create_foreign_server.sql.png)
Si queréis averiguar qué versión exacta tiene vuestra imagen (y dado que con el último esquema de etiquetado de imágenes no podéis confiar únicamente en la etiqueta de la imagen; y suponiendo que no queréis ejecutarla solo para averiguarlo), podéis ejecutar este comando de Docker:
Pues ya es viernes nuevamente, así que vamos con una nueva predicción de la Quiniela. Jornada 20 de Primera División y jornada 23 de Segunda División, veamos qué partidos entran a formar parte:
Esta es la predicción para Primera División:
Y aquí están para Segunda División:
Lo que nos da la siguiente Quiniela:
¡Suerte con vuestras apuestas!
En este tutorial, voy a explicar cómo podéis conectar la plataforma de datos IRIS a una base de datos SQL Server utilizando ODBC.
Prerequisitos:
InterSystems ha corregido un defecto que provoca la introducción de registros no válidos en la base de datos y en los ficheros de journal al utilizar una sintaxis específica de $LIST. La probabilidad de encontrar este defecto es muy baja, pero los impactos operativos pueden ser significativos.
Productos afectados
La utilidad devuelve los valores deseados del texto y muestra múltiples valores si existen, basándose en una cadena de inicio y una de fin.
Hola Comunidad!
¡Estamos encantados de invitaros a todos, clientes, socios y miembros de la comunidad, a participar en la Cumbre de InterSystems Benelux y Francia 2025! Las inscripciones para la Cumbre 2025 ya están abiertas.
Este evento promete ser una experiencia interactiva que destacará casos de estudio inspiradores, innovaciones tecnológicas y hojas de ruta para el próximo año en los campos de la atención sanitaria y las plataformas de datos. Además, las demostraciones prácticas os permitirán explorar de manera tangible los últimos desarrollos.
➡️ Cumbre de InterSystems Benelux y Francia
🗓 Fechas : Los días 11 - 12 de febrero, 2025
📍 Place : Hilton Rotterdam | Weena 10 | 3012 CM Rotterdam | Netherlands
Pasadas las Navidades, volvemos nuevamente con la publicación más esperada de la Comunidad, ¡la predicción de la Quiniela!
Esta jornada la Quiniela se conformará con partidos de la 19ª jornada de Primera División y la 22ª de Segunda, veamoslos:
Estas son las predicciones para Primera División:
Y estas las de Segunda:
Resultando en la siguiente Quiniela:
Pues nos hemos abonado al empate en esta jornada. Suerte a todos.
Hola colegas,
Hace unos días me surgio el requerimiento de cargar un archivo parquet, tal y como viene a una tabla en IRIS, así que desarrolló este classmethod que gatilla la carga solo indicando la ruta y nombre del archivo y el nombre de la tabla destino (en el mismo espacio de nombres). Para esto, escribí un pequeño código en Python que requiere las librerías: Pandas, pyarrow y fastparquet, las cuales deben instalar en el directorio de instalación de IRIS según su instalación, en mi caso el comando es:
instalación de pip3 --target /usr/irissys/mgr/python/ pandas pyarrow fastparquet
Para cargar los datos se deberán entregar los siguientes parametros
archivo: ruta completa al archivo parquet a cargar /var/data/archivo.parquet tabla: tabla en la cual se cargaran los datos
desde el terminal:
do ##class(testing.python).cargaParquet("/var/data/files/testing-ndoc.parquet","testing.ndoc")
Espero les sea de utilidad.
Class testing.python Extends %RegisteredObject
{
ClassMethod cargaParquet(parquet, tabla) [ Language = python ]
{
try:
import pandas as pd
import iris
parquet_file= parquet
df = pd.read_parquet(parquet_file)
i=0
linea=""
valores=""
sql=""
max_index = len(df)
for x in df.columns:
linea = linea + x + ","
linea = linea.replace("_","")[:-1]
sql="insert into "+ tabla +" (" + linea + ")"
while i<max_index:
for x in df.columns:
valores = valores + "'" + str(df.at[i,x]) + "',"
valores = " values("+ valores[:-1] +")"
tsc = iris.sql.exec(sql + valores)
valores=""
i+=1
except:
print("error de carga de registro " +i)
}
}
Cuando desplegáis código desde un repositorio, la eliminación de clases (archivos) podría no reflejarse en vuestro sistema CICD. Por ejemplo si en vuestro repositorio elimináis una clase y queréis que se refleje en el código desplegado.
Aquí tenéis un sencillo comando de una sola línea para eliminar automáticamente todas las clases en un paquete específico que no hayan sido importadas. Se puede ajustar fácilmente para una variedad de tareas adicionales:
set packages = "USER.*,MyCustomPackage.*"set dir = "C:\InterSystems\src\"set sc = $SYSTEM.OBJ.LoadDir(dir,"ck", .err, 1, .loaded)
set sc = $SYSTEM.OBJ.Delete(packages _ ",'" _ $LTS($LI($LFS(loaded_",",".cls,"), 1, *-1), ",'"),, .err2)El primer comando compila las clases y también devuelve una lista de las clases cargadas.
El segundo comando elimina todas las clases de los paquetes especificados, excepto las clases que se cargaron justo antes en el paso anterior.
Link de Git: https://github.com/ecelg/InterSystems-IRIS-as-a-Spotify-REST-client
Recientemente se me ocurrió una idea: ¿cómo puedo poner mi lista de reproducción en IRIS? 🧐
Al mismo tiempo, me dijeron que debía pagar mi suscripción de Spotify 💸💸... oooh... ¿y si obtengo algunos datos de la API de Spotify? Así que empecé a investigar sobre eso.
Como en la mayoría de los desarrollos, comencemos con la documentación de la API: https://developer.spotify.com/documentation/web-api
Para obtener los datos, se requiere solicitar un token de acceso en la URL del endpoint de token. 🧐
¡Hola, compañeros desarrolladores en InterSystems IRIS!
A menudo me preguntan, especialmente en relación con los bonus técnicos que incentivamos en cada concurso de Open Exchange, por qué siempre damos bonus por Docker, IPM y por aprobar ObjectScript Quality.
En realidad, es muy fácil de responder.
