Limpiar filtro
Anuncio
Mario Sanchez Macias · 10 feb, 2023
En InterSystems creemos en la divulgación responsable de vulnerabilidades de seguridad descubiertas recientemente. Ofrecemos información oportuna a nuestros clientes, a la vez que la mantenemos fuera del alcance de las personas que puedan hacer un mal uso. También entendemos que cada cliente puede tener diferentes necesidades relacionadas con la resolución de problemas de seguridad.
Desde el inicio de 2023, hemos realizado dos cambios significativos en nuestro enfoque sobre la corrección de las vulnerabilidades de seguridad que me gustaría destacar:
Los parches de vulnerabilidad de seguridad se incluirán en cada actualización
Notificación a los clientes mejorada
Parches de vulnerabilidad de seguridad en cada actualizaciónEn vez de esperar a entregar los parches en una versión de seguridad, cada actualización puede incluir ahora parches de vulnerabilidades de seguridad. Nuestra cadencia de actualizaciones mejorada entregará parches a tiempo.
Notificación a los clientes mejoradaElementos de impacto medio y bajo, que a menudo incluyen vulnerabilidades como ataques de reconocimiento o ataques de inyección de código (cross-site scripting), serán incluidos en cada actualización y descritos en las notas de la actualización del producto.
Las correcciones para elementos de mayor gravedad también se incluirán en cada actualización según estén listas, pero la información sobre la corrección será retenida hasta que los parches estén en todas las actualizaciones soportadas.
Se publicará una Alerta de Seguridad para problemas con gravedad alta y crítica cuando hayan sido corregidos en todas las actualizaciones soportadas.
¿Por qué ha hecho InterSystems estos cambios?Creemos que estas mejoras:
Permitirán ofrecer más rápidamente parches de seguridad a nuestros clientes
Ayudarán a centrarse en las correcciones de mayor gravedad
Permitirán, en algunos casos, ofrecer correcciones de seguridad como parches en vez de kits completos
Ofrecerán más transparencia sobre cómo las vulnerabilidades de seguridad son gestionadas agrupando las vulnerabilidades por su impacto en la seguridad
Permitirán a los administradores de sistemas aplicar más correcciones basadas en sus necesidades y obligaciones
Por supuesto, el proceso se vuelve mucho más complicado con la noción de las Actualizaciones de Mantenimiento y las Actualizaciones de Entrega Continua. Para ayudar a nuestros clientes a entender cuándo y cómo pueden conseguir correcciones de seguridad, hemos publicado nuestra Política de Gestión de la Vulnerabilidad con más información detallada.
En este 2023 esperamos seguir mejorando vuestra experiencia en relación a nuestro programa de gestión de las vulnerabilidades y la seguridad.
Artículo
Muhammad Waseem · 1 jun, 2022
¡Hola comunidad!
Esta publicación es una introducción a mi aplicación iris-fhir-client en Open Exchange.
Usando Python embebido y con la ayuda de la librería fhirpy, iris-fhir-client puede conectarse a cualquier servidor FHIR abierto.Obten información de recursos por terminal y mediante el uso de la aplicación web CSP.
Ver y activar servidores registrados
Conéctate a la terminal IRIS
docker-compose exec iris iris session iris
La aplicación registrará InterSystems FHIR Accelerator Service y SmartHealthIT Open FHIR Server de manera predeterminada y ambos estarán listos para ser usados.
Usa el siguiente comando para enumerar los servidores registrados
do ##class(dc.FhirClient).ServerList()
InterSystems FHIR Accelerator Service está activo. Para seleccionar SmartHealthIT Open FHIR Server, usa la función SetFhirServer de la clase dc.FhirClient pasando la ID del servidor
do ##class(dc.FhirClient).SetFhirServer(2)
Servidores FHIR registrados
Para registrar un nuevo servidor, utiliza la función RegisterServer() de la clase dc.FhirClientclass(dc.FhirClient).RegsterServer("Server Name","Endpoint","ApiKey"[opcional],"EndpointOAuth"[opcional]
do ##class(dc.FhirClient).RegisterServer("INTERSYSTEMS FHIR Server","http://localhost:52773/csp/healthshare/samples/fhir/r4/","","")
Obtener recursos de los servidores FHIR
Para recuperar todos los recursos para el servidor actual, utiliza el método ListResources() de la clase dc.FhirClient
do ##class(dc.FhirClient).ListResources()
Para mostrar la cantidad de registros de cualquier recurso, usa el método CountResource() pasando Resource de dc.FhirClient.El siguiente comando obtendrá el contador de recursos del paciente contra el servidor FHIR activo
set count = ##class(dc.FhirClient).CountResource("Patient")
write count
Para recuperar todos los recursos creados junto con su recuento, simplemente pasa 1 a la función ListResource()
do ##class(dc.FhirClient).ListResources(1)
Para obtener detalles del recurso, usa GetResource() pasando Resource de la clase dc.FhirClientEl siguiente comando recuperará todos los pacientes del servidor FHIR activo
do ##class(dc.FhirClient).GetResource("Patient")
El siguiente comando recuperará todas las Observaciones del servidor FHIR activo
do ##class(dc.FhirClient).GetResource("Observation")
Obtener recursos de los servidores FHIR para un paciente en particular
El siguiente comando recuperará los detalles de las Observaciones contra Patinet ID 1 del servidor FHIR activo
do ##class(dc.FhirClient).GetPatientResources("Observation","1")
Ver información del servidor FHIR desde la aplicación web CSP
Ir a http://localhost:55037/csp/fhirclient/index.cspLa página Index (Índice) mostrará el recuento de pacientes, observaciones, médicos y encuentros del servidor activo junto con los detalles del paciente y de los servidores registrados
La página Index (Índice) mostrará la lista de servidores FHIR con el servidor activo seleccionado. Selecciona otro servidor de la lista para ver los detalles del servidor seleccionado
Desplázate hasta el ID del paciente y selecciónalo para obtener detalles de los Recursos del paciente
Esta página mostrará el recuento de algunos recursos del paciente junto con los detalles de las observaciones del paciente.
Si encuentra útil esta aplicación, considere votar por mi aplicación
¡Gracias!
Artículo
Ricardo Paiva · 12 ene, 2023
Visual Studio Code (VS Code) es el editor de códigos más popular del mercado. Fue creado por Microsoft y distribuido como IDE gratuito. VS Code es compatible con docenas de lenguajes de programación, incluido ObjectScript.
Hasta 2018, Atelier (basado en Eclipse), se consideraba una de las principales opciones para desarrollar los productos de InterSystems. Sin embargo, en diciembre de 2018, cuando la Comunidad de Desarrolladores de InterSystems lanzó el soporte para VSCode, una parte relevante de los profesionales de InterSystems comenzaron a utilizar este editor y lo siguen haciendo desde entonces, especialmente los desarrolladores que trabajan con nuevas tecnologías (Docker, Kubernetes, NodeJS, Angular, React, DevOps, Gitlab, etc.).
Algunas de las mejores características de VSCode son las funciones de depuración. Por eso, en este artículo mostraré en detalle cómo depurar un código ObjectScript, incluido el código de clase y el código %CSP.REST.
## ¿En qué consiste la depuración?
La depuración es un proceso de detección y resolución de "bugs" - errores en el código. Algunos errores son lógicos, no de compilación. Por eso, para comprenderlos en tu lógica de ejecución del código fuente, es necesario ver el programa ejecutándose línea por línea. Esta es la mejor manera de identificar las condiciones o la lógica de la programación y encontrar errores lógicos. Otros errores son de ejecución. Para que podamos depurar este tipo de problemas, es esencial verificar primero los valores de las variables asignadas.
## Instalación de las extensiones de InterSystems IRIS para VSCode
En primer lugar, hay que instalar las extensiones de InterSystems IRIS en tu IDE de VSCode. Para hacerlo, ve a Extensiones, busca InterSystems e instala estas extensiones de InterSystems:
.png)
La última extensión (InterSystems ObjectScript Extension Pack) debería instalarse la primera, porque es un paquete de extensiones necesarias para conectar, editar, desarrollar y depurar ObjectScript. Las demás extensiones de la lista son opcionales.
## Aplicación de muestra
Utilizaremos una aplicación de mi repositorio de GitHub (https://github.com/yurimarx/debug-objectscript.git) para los ejemplos de depuración de este artículo. Por lo tanto, sigue los siguientes pasos para obtener, ejecutar y depurar la aplicación en VSCode:
1. Crea un directorio local e introduce en él el código fuente del proyecto:
$ git clone https://github.com/yurimarx/debug-objectscript.git
2. Abre el terminal en este directorio (directorio iris-rest-api-template) y ejecuta:
$ docker-compose up -d --build
3. Abre VS Code dentro del directorio iris-rest-api-template usando $code, o haga clic-derecho sobre la carpeta y selecciona Abrir con Code.
4. Abajo, haz clic en ObjectScript para abrir las opciones configuradas en .vscode/launch.json:
.png)
5. Selecciona Toggle Connection (Alternar conexión) para activar la conexión actual:
.png)
6. Después de habilitar esta conexión, obtendrás la conexión que se muestra a continuación:
.png)
7. Si no estás conectado con IRIS en VSCode, no podrás depurar el código ObjectScript. Así que comprueba tu conexión haciendo clic sobre la extensión ObjectScript VSCode:
.png)
8. Abre Person.cls, ve a la línea número 25 y señala con el ratón el número 25 que aparece a la izquierda.
.png)
9. Ahora, señala con el ratón en ClassMethod arriba y haz clic en Debug this method:
.png)
10. VSCode abrirá un diálogo para establecer los valores de los parámetros - defínelos como se muestra a continuación, y haz clic en Enter:
.png)
11. VSCode interrumpirá la ejecución del código en la línea 25:
.png)
12. Ahora, en la parte superior izquierda, se pueden ver los valores actuales de las variables.
.png)
13. En la parte inferior izquierda se puede ver la lista de puntos de interrupción y la pila de llamadas para el punto de interrupción actual.
.png)
14. En la parte superior derecha se puede ver el código fuente con el punto de interrupción y un conjunto de botones para controlar la ejecución de la depuración.
.png)
15. Si necesitas utilizar la Consola de Depuración (Debug Console) para escribir algo allí, escribe: Name\_","\_Title para ver la concatenación de variables usando Debut Console:
.png)
16. Selecciona la variable resultante, pulsa el botón derecho del ratón y selecciona Añadir a Watch (Add to Watch):
.png)
17. Ahora puedes controlar o cambiar el valor actual de la variable resultante en la sección WATCH:
.png)
18. Finalmente, la barra que aparece abajo es de color naranja, e indica la depuración:
.png)
## Uso de la Consola de Depuración
La Consola de Depuración permite escribir expresiones durante la depuración, para que se puedan verificar los valores de diferentes variables (de tipo simple o de tipo objeto) o validar el valor actual y otras condiciones. Puede ejecutar cualquier elemento que pueda devolver algunos valores, por lo que $zv también funcionará. Sigue estos pasos para ver algunas opciones:
1. Escribe Name\_", "\_Title\_" From "\_Company en la línea de comando Debug Terminal y mira los valores concatenados Nombre, Título y Empresa como salida:
.png)
## Uso de la barra de herramientas de depuración
La barra de herramientas de depuración permite controlar la ejecución de la depuración. Vamos a ver las funciones de los botones:
.png)
1. Botón Continue (F9): continúa la ejecución hasta el siguiente punto de interrupción. Si no hay ningún punto de interrupción al que ir, continuará hasta el final.
2. Step Over (F8): pasa a la línea siguiente sin entrar en el código fuente de un método interno (no entra en el método Populate).
3. Step Into (F7): pasa a la siguiente línea dentro del código fuente del método interno (pasa a la primera línea del método Populate).
4. Step Out (Shift + F8): pasa a la línea actual del código fuente que llama a un método.
5. Restart (Crtl + Shift + F5): reinicia la depuración.
6. Stop: detiene la sesión de depuración.
## Depurar los métodos de la clase %CSP.REST
Para depurar métodos de la clase REST, es necesario aplicar un pequeño truco revelado por Fábio Gonçalves (puedes leer el artículo aquí: https://es.community.intersystems.com/post/atelier-depuraci%C3%B3n-adjuntar-al-proceso). Es necesario añadir un HANG (mi recomendación es que dure entre 20 y 30 segundos). Solo sigue estos pasos:
1. Abre el archivo src\dc\Sample\PersonREST.cls y ve al método GetInfo(), añade HANG 30 (esto es necesario para disponer de tiempo, 30 segundos, para iniciar la depuración de este método):
.png)
2. Establece puntos de interrupción en las líneas HANG y SET version (círculos rojos):
.png)
3. Abre un cliente HTTP para llamar a un método REST (llamaré a GetInfo desde la clase PersonREST):
.png)
4. Establece Basic Auth en Autorización (Username _SYSTEM y Contraseña SYS):
.png)
5. Envía un GET http://localhost:52773/crud/.
6. Haz clic en la opción Adjuntar ObjectScript que se encuentra en parte de abajo:
.png)
7. Selecciona Adjuntar ObjectScript:
.png)
8. Selecciona el proceso PersonREST:
.png)
9. Espera un poco de tiempo (unos 30 segundos) para que VS Code interrumpa la ejecución actual en el punto de interrupción:
.png)
Nota 1: Elimina HANG 30 cuando termine la depuración, porque el comando HANG pausará la ejecución.
Nota 2: Si el proceso PersonREST no aparece, reinicia tu VS Code, e inténtalo de nuevo.
10. Ahora puedes llevar a cabo tu proceso de depuración.
## Editar el punto de interrupción
Se puede hacer clic con el botón derecho en el punto de interrupción para eliminar o configurar puntos de interrupción condicionales (la interrupción en el punto de interrupción con una condición es verdadera). El comando break que está embebido en el código también será detectado por el depurador. También se puede hacer esto.
1. Haz clic con el botón derecho en el punto de interrupción y selecciona Editar punto de interrupción (Edit breakpoint):
.png)
2. Introduce la expresión siguiente y pulsa Enter:
.png)
Nota: prueba version = 1.0.5 para ver el breakpoint falso y version 1.0.6 para ver el breakpoint verdadero.
## Configurar la opción de depuración en el archivo .vscode/launch.json
El archivo launch.json se utiliza para configurar las opciones de depuración del proyecto. Para ver las alternativas, ve a este archivo:
.png)
Para esta muestra, tenemos dos opciones para depurar:
1. Podemos iniciar la depuración sobre la clase configurada en el atributo program directamente con un programa. En este ejemplo el depurador se iniciará en la clase PackageSample.ObjectScript, método Test().
2. Podemos adjuntar PickProcess al proceso del programa seleccionado que se quiere depurar. En este ejemplo el depurador abrirá en la parte superior una lista de procesos para seleccionar qué proceso se depurará (cada programa tiene su propio proceso). La segunda opción es más habitual.
De manera general, estos atributos son obligatorios para cualquier configuración de depuración (fuente: https://intersystems-community.github.io/vscode-objectscript/rundebug/):
* type - Identifica el tipo de depurador que se utilizará. En este caso, ObjectScript se suministra mediante la extensión InterSystems ObjectScript.
* request - Identifica el tipo de acción para esta configuración de inicio. Los posibles valores son iniciar (launch) y adjuntar (attach).
* name - Un nombre arbitrario para identificar la configuración. Este nombre aparece en la lista desplegable "Iniciar depuración".
Además, para una configuración de inicio en ObjectScript, es necesario proporcionar el atributo program, que especifica la rutina o Método de clase que se ejecutará al iniciar el depurador, como se muestra en el siguiente ejemplo:
"launch": {
"version": "0.2.0",
"configurations": [
{
"type": "objectscript",
"request": "launch",
"name": "ObjectScript Debug HelloWorld",
"program": "##class(Test.MyClass).HelloWorld()",
},
{
"type": "objectscript",
"request": "launch",
"name": "ObjectScript Debug GoodbyeWorld",
"program": "##class(Test.MyOtherClass).GoodbyeWorld()",
},
]
}
Para adjuntar una configuración en ObjectScript, se pueden proporcionar los siguientes atributos:
* processId - Especifica el ID del proceso para adjuntar a una cadena o un número. El valor predeterminado "${command:PickProcess}" proporciona una lista desplegable de los ID de los procesos para adjuntar durante la ejecución.
* system - Especifica si se permiten o no archivos adjuntos en el proceso del sistema. Establece la configuración predeterminada en falso.
El siguiente ejemplo muestra varias configuraciones válidas para adjuntar ObjectScript:
"launch": {
"version": "0.2.0",
"configurations": [
{
"type": "objectscript",
"request": "attach",
"name": "Attach 1",
"processId": 5678
},
{
"type": "objectscript",
"request": "attach",
"name": "Attach 2",
"system": true
},
]
}
Ahora, puedes seleccionar una configuración de depuración de la lista que VS Code proporciona en el campo Run and Debug en la parte superior de la barra lateral de depuración (fuente: https://intersystems-community.github.io/vscode-objectscript/rundebug/):
.png)
Si haces clic en la flecha verde, se ejecutará la configuración de depuración seleccionada en ese momento.
Al iniciar la sesión de depuración de ObjectScript, asegúrate de que el archivo que contiene el programa que estás depurando está abierto en tu editor y se encuentra en la pestaña activa. VS Code iniciará una sesión de depuración con el servidor del archivo en el editor activo (la pestaña en la que está centrado el usuario). Esto también se aplica a las sesiones de depuración ObjectScript adjuntas.
Esta extensión utiliza WebSockets para comunicarse con el servidor de InterSystems durante la depuración. Si tienes problemas al intentar iniciar una sesión de depuración, comprueba que el servidor web de InterSystems permite las conexiones WebSocket.
Los comandos de depuración y los elementos del menú Run funcionan prácticamente igual que en otros lenguajes compatibles con VS Code. Para más información sobre la depuración de VS Code, consulta la documentación enumerada al final de este artículo.
## Establecer la sincronización entre un código fuente local y un código fuente del servidor (en IRIS Server)
También es importante tener una estructura de carpetas para el código fuente, que puede adoptarse mediante la configuración de "objectscript.export". Esta información se utilizará para convertir los nombres de clase del servidor en archivos locales. Si es incorrecto, puede abrir clases en el modo de solo lectura aunque solo existan de forma local.
1. Abre el archivo .vscode\settings.json y configura objectscript.export:
.png)
2. Pasa el ratón por encima de la carpeta y añade Categoría y otros parámetros para ver la documentación sobre ella.
## Otras técnicas para complementar el proceso de depuración
Además de depurar tu programa, recuerdaa documentar bien tu código fuente, registrar las operaciones realizadas por el código importante y realizar pruebas unitarias y herramientas de análisis estático en el código fuente. De esta manera, la calidad de tus programas será mucho mejor, reduciendo el tiempo y el coste de ajustes y mantenimiento.
## Para saber más
1.
2.
3.
4.
5.
Artículo
Alberto Fuentes · 9 mayo, 2019
Me gustaría compartir un trabajo de André-Claude Gendron del CIUSSS de l'Estrie - CHUS (Canadá) presentado en un InterSystems Summit. Consiste en un framework de generación de objetos simulados (mocks) que puede utilizarse para construir UnitTests.Un objeto simulado (o mock) no es más que un objeto que imita el comportamiento de objetos reales de forma controlada. Estos objetos simulados se utilizan en las pruebas unitarias (UnitTest) para simular objetos o dependencias que sean necesarias para la clase que se quiera probar. Lo explica muy bien su presentación:La presentación detalla varios conceptos sobre inyección de dependencias, definiciones y UnitTest además de mostrar ejemplos concretos del framework (si os interesa, YouTube tiene la opción de generar automáticamente subtítulos en español). El código está disponible aquí :https://gitlab.com/ciussse-drit-srd-public/Mocking-Framework No olvidéis habilitar la opción %UnitTest en el Portal de Gestión . Las instrucciones para hacerlo se encuentran on-line: en: http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=...
Pregunta
Yunier Gonzalez · 31 oct, 2019
Saludos comunidad. Me gustaría saber cómo migrar un BD en producción a un entorno local. Cuando tengo un sistema en producción (Servidor BD Sql), lo que hacemos es montar una copia local para hacer el análisis con los datos y no ocupar los recursos del sistema en producción. Mi pregunta es: ¿cómo se hace con la tecnología Intersystems? Ya probé el conector PowerBi y se ve muy bien, pero ahí es donde surgió la pregunta. Hola @Yunier Gonzalez hay varias opciones. Una es hacer como dices un Backup/Restore de la BD para "jugar" con una imagen sin perjudicar los datos reales. Otra cosa que se puede hacer es utilizar un Shadow. Un Shadow replica todo lo que sucede en una BD a otra BD en otra instancia mediante el uso del journal. De esta forma tienes datos "casi" en tiempo real. En el caso de un Mirror se puede usar una replicación asíncrona para uso como Reporting. @David Reche . Me pondre a investigar entonces sobre los temas que me comentas. Muchas gracias!!! El cambio es grande y son muchas las dudas, asi que cualquier cosa no dudare en volver a este hilo a preguntar. Una vez mas Muchas gracias.
Artículo
Mathew Lambert · 14 oct, 2020
Esto lo escribo más para ayudar a mi memoria que para otra cosa. Pensé en compartirlo, porque a menudo aparece en los comentarios, pero no está en la documentación de InterSystems.
Hay una utilidad increíble que se llama ^REDEBUG, que aumenta el nivel de información que se registra en mgr\cconsole.log.
Para activarla:
a) inicia el terminal/login
b) zn "%SYS"
c) do ^REDEBUG
d) cambia el nivel de registro a FFFFFFFF
Si estás en un sistema de producción (con mucho tráfico), sugiero que reproduzcas rápidamente el error, renombres el archivo cconsole.log y repitas los pasos anteriores para configurar el nivel de registro de log en FF. Esto es principalmente porque configurar el nivel de registro de log en FFFFFFFF hará que cconsole.log crezca de forma explosiva en un sistema con alto tráfico.
A veces las entradas en cconsole.log son crípticas - pero a veces pueden ser útiles.
Espero que os resulte útil.
P.D.: si tenéis ejemplos de errores de SSL crípticos y sus significados, por favor publcadlos como un comentario. Si conocéis su significado, sería genial. Si no lo conocéis, podemos pedir ayuda a la comunidad.
Comentarios
Yuri Marx Pereira Gomes · 11 ene, 2022
Para mí, los mejores momentos han sido:
1 - Global Masters, GANADOR de los premios Influitive BAMMIE 2021 en la categoría "Most Passionate Community"
2 - Los concursos de artículos técnicos
3 - Los concursos de programación
4 - Más de 10 000 miembros en la Comunidad de Desarrolladores
5 - El Directorio de Partners y los Servicios gratuitos para Partners
6 - Más de 500 aplicaciones en Open Exchange
7 - Las ponencias del "Virtual Summit"
8 - Los premios obtenidos por los puntos en Global Masters
9 - Los cursos de formación online gratuitos
10 - Los canales de la Comunidad en Discord
11 - Las innovaciones en IRIS
12 - Las comunidades en otros idiomas, como portugués y español
13 - El "Advent of Code" de InterSystems - el reto de programación durante el tiempo de Adviento
¿Y para vosotros?
Me decanto por los webbinar, sobretodo los que tenían quiz al final con grandes premios. Gracias por el comentario, Dani! Nos alegramos de que te gustaran los webinars con gynkana final! Intentaremos seguir haciéndolos durante 2022
Artículo
Muhammad Waseem · 9 jun, 2022

¡Hola a todos!
Solo quería compartir aquí una publicación rápida sobre mi proyecto para el Gran Premio :D
FHIR Patient Viewer es una herramienta de renderizado de una sola página, basada en Vue.js, que muestra de forma sencilla los datos devueltos de una llamada /Patient/{id}/$everything realizada a un servidor FHIR de InterSystems.
En el archivo Readme he incluido 3 cosas principales:
1. Una demostración en video que conecta FHIR Patient Viewer a un servidor sandbox IRIS FHIR (la forma más rápida de probarlo);
2. Un segundo video que muestra cómo usaría yo FHIR Patient Viewer en un entorno de producción (usando un backend personalizado para manejar las llamadas a la API, escrito en PHP/Laravel en mi ejemplo, pero transferible a otros lenguajes/frameworks);
3. Instrucciones para modificar los componentes, crear tu propia versión de la herramienta y crear tus propios archivos dist.
¡Gracias a todos! ¡Ha habido una calidad extraordinaria en los proyectos presentados al Gran Premio!
Anuncio
Esther Sanchez · 19 jul, 2022
¡Hola Comunidad!
Estamos encantados de anunciar los ganadores del último Concurso de Programación de InterSystems: Full Stack 2022
Muchas gracias a todos los que habéis participado en la competición.
Y los ganadores son...
Nominación de los expertos
🥇 1er premio y $4,000 a la app Kozo, de @Sean.Connelly
🥈 2º premio y $2,000 a la app iris-climate-change, de @Muhammad.Waseem
🥉 3er premio y $1,000 a la app Carbon Footprint Counter, de @Yuri.Gomes
Más ganadores:
🏅 $100 para la app interoperability-manager, de @Oliver.Wilms
🏅 $100 para la app Arctic sea ice viewer, de @Oleh.Dontsov
🏅 $100 para la app iris-for-money, de @Oliver.Wilms
Nominación de la Comunidad
🥇 1er premio y $1,000 a la app Kozo, de @Sean.Connelly
🥈 2º premio y $750 a la app iris-climate-change, de @Muhammad.Waseem
🥉 3er premio y $500 a la app Carbon Footprint Counter, de @Yuri.Gomes
¡Enhorabuena a todos los ganadores!
Nos vemos en el próximo concurso. 😎
Anuncio
Esther Sanchez · 19 ago, 2022
¡Hola a todos los miembros de la Comunidad!
Estamos muy orgullosos de anunciar que la Comunidad de Desarrolladores de InterSystems ha logrado tres nuevos récords:
📝 10 000 publicaciones
👥 11 000 usuarios registrados
👁 5 000 000 de visualizaciones (¡cinco millones!)
Nos gustaría daros las gracias a vosotros, usuarios, y también a todos los que están "detrás" de la Comunidad (administradores, gestores de contenido, moderadores...) por todos estos hitos. Estamos orgullosos de ser parte de este éxito, que es posible solo gracias a vosotros!
Gracias a todos por formar parte de este grupo. Por vuestras preguntas y vuestros comentarios. Por compartir vuestro conocimiento. Por vuestras sugerencias para hacer que la Comunidad sea aún mejor y más útil para todos. Vosotros sois los que mantenéis vivo este espacio y estamos encantados de que así lo hagáis. ❤️
Y para hacer que este momento sea aún mejor...
El canal de la Comunidad de Desarrolladores en Discord ha alcanzado los 500 miembros! 🎉 Aún nos queda mucho trabajo por hacer en este canal, pero trabajamos encantados. Y esperamos veros a todos por allí. Podéis uniros aquí >>
¡Muchas gracias a todos! ¡Sigamos creciento juntos!
Anuncio
Esther Sanchez · 27 ene, 2023
Hola a todos:
¡Muchas gracias por seguir con nosotros un año más en la Comunidad de Desarrolladores en español!
Todos los días nos esforzamos por hacer que sea mejor y más útil para todos los miembros que la componen.
Por ello, hemos preparado una breve encuesta para saber qué pensáis de la Comunidad en español, si os resulta útil y qué podríamos mejorar. Y entre todas las personas que respondan, ¡sortearemos dos polos de InterSystems!
👉🏼 Encuesta sobre la Comunidad de Desarrolladores en español (2022) 👈🏼Nota: Os llevará menos de 5 minutos responderla.
También podéis dejar vuestra opinión en los comentarios de esta publicación.
¡Estamos deseando leer vuestras respuestas!
¡Muchas gracias a todos! Ya hemos recibido varias respuestas a la encuesta sobre la Comunidad de Desarrolladores en español. ¡Pero nos gustaría recibir más! 😄 ¡Animaos a responder! No os llevará ni cinco minutos...
¡Muchas gracias! Tenéis hasta este viernes 17 para responder a la encuesta sobre la Comunidad de Desarrolladores en español. ¿La habéis respondido ya? No os llevará ni cinco minutos...
¡Muchas gracias!
Artículo
Luis Angel Pérez Ramos · 7 abr, 2025
Preguntas frecuentes de InterSystems
La configuración predeterminada para Stay Connected y Pool Size para los hosts de negocio (antiguamente, business service) que utilizan el adaptador TCP es la siguiente:
StayConnected = -1(no timeout)PoolSize = 1
Si un problema de red causa que se pierda la conexión con un host de negocio, el lado de la producción no podrá detectar esto y no aceptará nuevas conexiones. En esta situación, no se registrará ningún evento en el registro de eventos. Si StayConnected está configurado con su valor predeterminado (-1), las conexiones no se cerrarán por tiempo de espera, y será necesario reiniciar el host de negocios antes de que pueda aceptar nuevas conexiones. Recomendamos configurar StayConnected a un valor mayor o igual a 0 para evitar esta situación.
Por ejemplo, si lo configuráis a 300 (segundos), un host de negocios TCP podrá desconectarse y reconectarse automáticamente si no recibe nuevos mensajes durante 300 segundos o más.
Para sistemas con mucho tráfico, normalmente configuraríais el valor de StayConnected a un valor más pequeño, como 5 segundos.
Artículo
Ricardo Paiva · 4 jun, 2021
Durante las últimas semanas, el equipo de *Solution Architecture* (Soluciones de Arquitectura) ha estado trabajando para terminar la carga de trabajo de 2019: esto incluyó la creación del código abierto de la Demostración de Readmisiones que llevó a cabo HIMSS el año pasado, para poder ponerla a disposición de cualquiera que busque una forma interactiva de explorar las herramientas proporcionadas por IRIS.
Durante el proceso de creación del código abierto de la demostración, nos encontramos de inmediato con un error crítico. Los datos subyacentes de los pacientes que se utilizaron para crear la demo no podían utilizarse como parte de un proyecto de código abierto porque no eran propiedad de InterSystems, eran propiedad de nuestro socio Baystate Health.
Nuestro equipo estaba en un pequeño aprieto y tenía que encontrar una forma de sustituir los datos originales por datos sintéticos que pudieran utilizarse, pero manteniendo la "historia" de las demos, o su funcionalidad subyacente, consistente. Dado que la demo muestra cómo IRIS admite el *workflow* de *machine learning* de un científico de datos, había un nivel de complejidad añadido porque cualquier dato que utilizáramos tenía que ser lo suficientemente realista como para poder apoyar nuestro modelo de investigación. Después de una breve investigación, Synthea vino a nuestro rescate.
Synthea es un generador de pacientes sintéticos, que modela sus historiales médicos. Es de código abierto. Synthea proporciona datos de alta calidad, realistas, pero no reales, de pacientes; en una variedad de formatos (incluido FHIR), con diferentes niveles de complejidad, cubriendo todos los aspectos de la atención médica. Los datos obtenidos no tienen coste, ni privacidad ni restricciones de seguridad, lo que permite investigar con datos de salud que de otra manera no estarían disponibles, de forma legal o práctica.
Después de una investigación inicial, se eligió Synthea como la herramienta para solucionar nuestro problema de datos. Synthea es una herramienta increíble; sin embargo, un problema que encontramos fue que, para ejecutar el software y obtener los pacientes, teníamos que instalar varias dependencias en nuestros equipos.
* Java JDK 1.8
* Gradle Build Tool
Cuando trabajas por tu cuenta, esto generalmente no es un problema, pero como nuestro equipo está formado por varias personas, es importante que todos puedan actualizarse con un nuevo software rápidamente; y la instalación de dependencias puede ser una pesadilla. Tenemos el propósito de que el menor número de personas posible sufra durante los procesos de instalación al integrar un nuevo software en nuestro flujo de trabajo.
Como necesitábamos que cualquier persona de nuestro equipo pudiera realizar actualizaciones en la Demo de readmisiones para poder generar pacientes fácilmente, y no queríamos que todos tuvieran que instalar Gradle en sus equipos, nos apoyamos en Docker e introdujimos el software de Synthea dentro de una imagen de Docker, permitiendo que la imagen se ocupe de las dependencias ambientales subyacentes.
Esto terminó funcionando muy bien para nuestro equipo, ya que nos dimos cuenta de que ser capaz de generar datos de pacientes sintéticos sobre la marcha es probablemente un caso de uso muy común al que se enfrentan nuestros compañeros Ingenieros de ventas, por lo que nuestro equipo quería compartirlo con la Comunidad de Desarrolladores.
Cualquiera puede utilizar la siguiente línea de código para generar rápidamente 5 historiales médicos de pacientes sintéticos en formato FHIR, y dejar los pacientes resultantes en una carpeta de salida en el directorio donde está trabajando actualmente.
docker run --rm -v $PWD/output:/output --name synthea-docker intersystemsdc/irisdemo-base-synthea:version-1.3.4 -p 5
El código de esta imagen Docker tiene su propio repositorio en Github y se puede encontrar aquí para cualquier persona que quiera echar un vistazo, hacer cambios personalizados, o contribuir: https://github.com/intersystems-community/irisdemo-base-synthea
Ahora estamos realizando actualizaciones para que el proyecto sea compatible con módulos personalizados, de modo que cualquiera que desee agregar una enfermedad a sus pacientes generados pueda hacerlo, si Synthea no la proporciona de forma predeterminada, y se incorporará automáticamente a su imagen.
¿Dónde se usa actualmente?
El proceso actual de creación de la Demo de readmisiones utiliza la imagen irisdemo-base-synthea para generar 5 000 pacientes sintéticos sobre la marcha y cargarlos en nuestro repositorio de datos IRIS relacional, normalizado. Cualquier persona que esté interesada en verificar cómo analizar estos datos de pacientes generados de forma sintética (en formato FHIR), puede consultar la Demo de readmisiones creada recientemente con código abierto. La clase que hay que buscar es: IRISDemo.DataLake.Utils. a partir de la línea 613.
La Demo de readmisiones se puede encontrar aquí: https://github.com/intersystems-community/irisdemo-demo-readmission
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.
Artículo
Ricardo Paiva · 14 jul, 2022
A veces es necesario transferir o migrar datos y esquemas de datos de Postgres a IRIS. Actualmente hay varias opciones para hacerlo, pero las dos más populares son [DBeaver](https://openexchange.intersystems.com/package/DBeaver) y SQLGateway. Ésta última es descrita por Robert Cemper en este excelente artículo: [DB Migration using SQLgateway](https://es.community.intersystems.com/post/migración-de-base-de-datos-usando-sqlgateway) (Migración de base de datos usando SQLgateway).
Yo describiré en este artículo cómo realizar la migración utilizando DBeaver:
## Obtener los datos de muestra para realizar el proceso de migración
En GitHub es posible descargar un proyecto de Docker Compose para crear y ejecutar 2 bases de datos:
* **Base de datos de origen**: Instancia Docker para la base de datos PostgreSQL con una base de datos de muestra.
* **Base de datos objetivo**: Instancia Docker para InterSystems IRIS con un esquema preparado para recibir la base de datos de origen.
Sigue estos pasos para obtener el ejemplo y ejecutarlo:
1. Ve a https://github.com/yurimarx/migration-pg-iris y haz clic en *Download* para ir al repositorio de git.
2. Clona el proyecto: git clone https://github.com/yurimarx/migration-pg-iris.git.
3. Ve a la carpeta del proyecto migration-pg-iris.
4. Realiza la compilación: docker-compose build.
5. Ejecuta los contenedores: docker-compose up -d.
6. Consulta en tu escritorio Docker si las instancias están bien:
.png)
## Sobre los datos que se van a migrar
Los datos que se van a migrar se representan aquí:
.png)
Así que el proceso de migración de PostgreSQL a IRIS migrará:
* 08 tablas.
* 1 000 000 de filas de "sale".
* 250 000 filas de "users".
* 300 filas de "product".
* 500 filas de "store".
* 100 filas de "country".
* 30 filas de "city".
* 5 filas de "status_name".
El destino de la migración será el esquema dc_test que se encuentra dentro del *namespace* USER en la base de datos de InterSystems IRIS.
## Herramienta de código abierto para migrar de PostgreSQL a IRIS: DBeaver
DBeaver es una herramienta de gestión de base de datos para conectar, crear, seleccionar, actualizar y eliminar objetos de datos de las principales bases de datos del mercado. Descárgala en: [https://openexchange.intersystems.com/package/DBeaver]. Ahora, sigue las instrucciones de instalación para tener este magnífico producto en tu equipo.
DBeaver puede utilizarse para migrar datos entre conexiones de bases de datos, incluso si son de diferentes fabricantes y versiones.
## Conectar las bases de datos de origen y destino mediante DBeaver
Ahora vamos a establecer las conexiones de las bases de datos que se van a migrar.
**Para establecer la conexión de PostgreSQL con DBeaver:**
1. En DBeaver ve a File > New.
2. Selecciona Database Connection y haz clic en Next:
.png)
3. Selecciona la pestaña SQL > PostgreSQL y haz clic en Next:
.png)
4. Completa los campos de conexión de PostgreSQL como se muestra en esta imagen:
Host: localhost Port: 5438 Database: postgres Username: postgres Password: postgres Haga clic en Finish.
**Para establecer la conexión de InterSystems IRIS con DBeaver:**
1. En DBeaver ve a File > New.
2. Selecciona Database Connection y haz clic en Next:
.png)
3. Selecciona la pestaña SQL > InterSystems IRIS y haz clic en Next:
.png)
4. Si DBeaver solicita que se descargue el controlador de InterSystems IRIS, pulse Sí u Ok.
5. Completa los campos de conexión de InterSystems IRIS como se muestra en esta imagen:
Host: localhost
Database/Schema: user
Username: _SYSTEM
Password: SYS
Click Text Connection and Finish.
6. Las conexiones (postgres y user) están disponibles en Database Navigator:
.png)
## Realizar la migración
**Sigue estos pasos para realizar la migración:**
1. Expande la conexión de postgres > public y selecciona todas las tablas. Con las tablas seleccionadas, haz clic con el botón derecho del ratón y elige Export Data, como se ve en esta imagen:
.png)
2. Selecciona Database, como en esta imagen y haz clic en Next
.png)
3. Haz clic en el botón Choose:
.png)
4. Selecciona dc_test y haz clic en Ok.
.png)
5. Ahora será necesario cambiar algunas configuraciones de tipos de datos para la base de datos de destino, ya que IRIS y PostgreSQL utilizan diferentes tipos de datos para valores enteros y decimales.
6. Expande la tabla public.country, selecciona el primer campo (country_id) y haz clic en Columns…
.png)
7. Cambia el Target Type de int4 a integer y haz clic en Ok.
.png)
8. Repite el proceso con las tablas
a. public.product.b. public.status_name.c. public.users.d. public.city (cambia el tipo a integer para city_id y country_id).e. public.store (cambia el tipo a integer para store_id y city_id).f. public.sale (cambia el type a double para amount e integer para product_id, user_id y store_id)
.png)
g. public.order_status (cambia status_name_id a integer).
9. Ahora, con los Target Data Types cambiados, haz clic en Next.
.png)
10. Establece el Fetch size en 1000000 y haz clic en Next.
.png)
11. Acepta los valores predeterminados de Data load settings y haz clic en Next.
.png)
12. En Confirm haz clic en Proceed.
.png)
13. Ahora podrás ver en el Navegador de bases de datos todas las tablas PostgreSQL que se encuentran dentro del esquema de InterSystems IRIS dc_test.
.png)
El proceso de migración es muy sencillo en el caso de las tablas, pero en el caso de las vistas, funciones, triggers y procedimientos almacenados, será necesario reescribir el código fuente SQL utilizando ObjectScript o SQL.
¿Qué se obtiene al migrar a IRIS?
Esta lista resume lo que se obtiene en IRIS:
* Gestión de API.
* Informes visuales (IRIS Reports).
* AutoML (IntegratedML).
* Desarrollo de aplicación/datos multilenguaje (Python, Java, .NET, JavaScript).
* ESB.
* Inteligencia empresarial (BI)/Analíticas.
* PLN.
* Desarrollo de microservicios.
* Base de datos multimodelo (SQL, JSON, cubos analíticos, orientada a objetos).
* Sharding.
En resumen, al migrar a IRIS se obtiene una plataforma de datos, cuando antes solo se tiene una base de datos.
[https://openexchange.intersystems.com/package/DBeaver]: https://openexchange.intersystems.com/package/DBeaver
Artículo
Jose-Tomas Salvador · 6 oct, 2022
Python se ha convertido en el lenguaje de programación más utilizado del mundo (fuente: https://www.tiobe.com/tiobe-index/) y SQL sigue siendo el líder como lenguaje para las bases de datos. ¿No sería genial que Python y SQL trabajaran juntos para ofrecer nuevas funcionalidades que SQL por sí mismo no puede? Después de todo, Python tiene más de 380.000 librerías publicadas (fuente: https://pypi.org/) con funciones muy interesantes para ampliar las consultas SQL dentro de Python.
En este artículo detallo cómo crear nuevos Procedimientos Almacenados de SQL en la base de datos de InterSystems IRIS usando Embedded Python.
## Librerías de Python utilizadas como muestras
En este artículo utilizaré dos librerías muy útiles para cualquiera que trabaje con SQL en IRIS: Geopy y Chronyk.
**Geopy** es una librería utilizada para aplicar la geocodificación (asignación de coordenadas geográficas a direcciones) a los datos de direcciones. Con ella es posible, a partir del nombre de la calle, obtener el código postal y la dirección completa, en el formato de la oficina de correos. Es muy útil, ya que muchos registros tienen una dirección.
**Chronyk** se utiliza para procesar fechas y horas mediante el lenguaje humano. Esto es muy útil, porque internamente, tanto para IRIS como para Python, una fecha es un número que representa la cantidad de tiempo que ha transcurrido desde una fecha inicial. Para los humanos, una fecha es el 20 de julio, o ayer, o mañana, o hace dos horas. Chronyk acepta recibir la fecha así y luego la convierte al formato de fecha universal.
## Soporte de Python en InterSystems IRIS
Desde la versión 2021.2 es posible utilizar Python para crear métodos de clase, procedimientos almacenados, producciones de interoperabilidad y llamadas nativas entre Python e IRIS (ObjectScript) de forma bidireccional. No conozco ninguna otra plataforma de datos que trabaje tan estrechamente con Python. El requisito para que esto funcione es que Python se instale en la misma máquina física o virtual o contenedor que IRIS. Consulta más detalles en: https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_epython.
Para instalar Python ejecuta:
# install libraries required for python and pip
RUN apt-get -y update \
&& apt-get -y install apt-utils \
&& apt-get install -y build-essential unzip pkg-config wget \
&& apt-get install -y python3-pip
## Soporte de librerías de Python en InterSystems IRIS
Para que InterSystems IRIS pueda utilizar una librería de Python es obligatorio que esté instalada dentro de <installdir>/mgr/python. installdir es la carpeta en la que está instalado IRIS. Para instalar nuevos paquetes ejecuta:
# use pip3 (the python zpm) to install geopy and chronyk packages
RUN pip3 install --upgrade pip setuptools wheel
RUN pip3 install --target /usr/irissys/mgr/python geopy chronyk
Pip3 es el administrador e instalador de paquetes más popular de Python, Pip.
## Cómo crear Procedimientos Almacenados en lenguaje de Python
Una de las posibilidades de utilizar Python en InterSystems IRIS es crear Procedimientos Almacenados usando Python.
Hay dos posibilidades:
1. Crear un Procedimiento Almacenado en Python utilizando la sentencia SQL de crear función o procedimiento
2. Crear un Método de clase dentro de la clase ObjectScript con las etiquetas sqlProc y language=Python.
### Cómo crear un Procedimiento Almacenado en Python utilizando la sentencia SQL de Crear Procedimiento
Según la documentación de InterSystems, también se puede escribir una función SQL o un Procedimiento Almacenado utilizando Python Embebido si se especifica el argumento LANGUAGE PYTHON en la sentencia CREATE, como se muestra a continuación (fuente: https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON\_runpython\_sql):
CREATE FUNCTION tzconvert(dt TIMESTAMP, tzfrom VARCHAR, tzto VARCHAR)
RETURNS TIMESTAMP
LANGUAGE PYTHON
{
from datetime import datetime
from dateutil import parser, tz
d = parser.parse(dt)
if (tzfrom is not None):
tzf = tz.gettz(tzfrom)
d = d.replace(tzinfo = tzf)
return d.astimezone(tz.gettz(tzto)).strftime("%Y-%m-%d %H:%M:%S")
}
Cuando se ejecuta esta nueva función SQL:
SELECT tzconvert(now(), 'US/Eastern', 'UTC')
La función devuelve algo como:
2022-07-20 15:10:05
### Cómo crear el Método de clase dentro de la clase ObjectScript con las etiquetas sqlProc y language=Python
Confieso que este enfoque es mi favorito: crear un método de clase con las etiquetas sqlProc y language=Python.
En mi opinión es más fácil de mantener, está mejor documentado y con una mejor administración de las versiones del código fuente. Para este enfoque he publicado una aplicación de muestra: https://openexchange.intersystems.com/package/Python-IRIS-SQL-Procedures-Sample. La utilizaré para mostrar este segundo enfoque con detalle.
## Instalación de la aplicación de muestra
Para instalar la aplicación de muestra, sigue estos pasos:
1. Clonar/git pull el repositorio en cualquier directorio local: ``$ git clone https://github.com/yurimarx/iris-sql-python-sample.git``
2. Abrir un terminal de Docker en este directorio y ejecutar: ``$ docker-compose build``
3. Ejecutar el contenedor de IRIS: ``$ docker-compose up -d``
Otra posibilidad para instalar es utilizar el ZPM:
zpm "install iris-sql-python-sample"
## Ejemplos de Procedimientos Almacenamiento usando Python
El primer ejemplo es un Procedimiento Almacenado para administrar la geocodificación de direcciones, consulta el código fuente:
ClassMethod GetFullAddress(Street As %String, City As %String, State As %String)
As %String [ Language = python, SqlName = GetFullAddress, SqlProc ]
{
import geopy.geocoders
from geopy.geocoders import Nominatim
geopy.geocoders.options.default_timeout = 7
geolocator = Nominatim(user_agent="intersystems_iris")
location = geolocator.geocode(Street + ", " + City + ", " + State, country_codes="US")
return location.address
}
Fíjate que se declaró un Método de clase (dentro de la clase dc.pythonsql.Company) con las etiquetas [ Language = python, SqlProc]. La etiqueta SqlName permite establecer un nombre para el nuevo Procedimiento Almacenado en sentencias SQL. Ve al Portal de administración, Sistema > SQL y ejecuta el siguiente código:
SELECT ID, City, Name, State, Street, Zip, dc_pythonsql.GetFullAddress(Street, City, State) As FullAddress
FROM dc_pythonsql.Company
Verás estos resultados:

Ahora las direcciones incompletas regresan como direcciones "completas" (completas y calificadas).
_Nota: Si no devuelve nada, ejecuta ``#class(dc.pythonsql.Company).CreateFiveCompanies()``. Creará cinco empresas para utilizar en las pruebas._
Este paquete puede funcionar con los principales servicios de geocodificación abiertos y comerciales. En este ejemplo utilizamos el servicio abierto **Nominatim**, pero es posible utilizar Bing, Google, ArcGIS y otros. Consulta las posibilidades en https://geopy.readthedocs.io/en/stable/#module-geopy.geocoders.
El segundo ejemplo es un paquete de fecha y hora en formato humanizado, Chronyk. Permite enviar frases como "mañana", "ayer", "dentro de 4 horas", "4 de julio del 2022" y obtener el resultado en formato de fecha universal. Mira la creación del Procedimiento Almacenado:
ClassMethod GetHumanDate(Sentence As %String) As %String [ Language = python, SqlName = GetHumanDate, SqlProc ]
{
from chronyk import Chronyk
t = Chronyk(Sentence)
return t.ctime()
}
Realiza la siguiente llamada en el Portal de administración > Sistema > SQL:
SELECT ID, City, Name, State, Street, Zip, dc_pythonsql.GetHumanDate('yesterday') As Datetime FROM dc_pythonsql.Company
Verás resultados como este:
Si quieres simplemente llamar al Procedimiento Almacenado, puedes usar esta sentencia SQL:
select dc_pythonsql.GetHumanDate('yesterday') as Datetime
Esta librería tiene varias posibilidades de fechas y horas humanizadas, consulta https://github.com/KoffeinFlummi/Chronyk.
Así que es fácil crear Procedimientos Almacenados en Python. ¡Disfrútalo! 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.