Artículo Alberto Fuentes · 2 mar, 2021 1m read

Si os habéis pasado de Studio a VSCode recientemente tal vez os hayáis dado cuenta de que en el Explorador faltan algunos elementos. Por ejemplo, cuando se crea una API REST a partir de sus especificaciones, se generan 3 clases: .impl, .disp y .spec, sin embargo la clase no se muestra por defecto en el Explorador.

Como la clase es una clase generada, para mostrarla tendremos que activar la opción correspondiente haciendo click en en el Explorador:

En ese mismo lugar también encontraremos una opción para mostrar los elementos de sistema.

0
0 111
Artículo Alberto Fuentes · 23 feb, 2021 2m read

Hola a todos! Os comparto hoy un artículo sobre la utilización del procesamiento de lenguaje natural y su combinación con FHIR donde se muestra un chatbot que interactúa con FHIR desarrollado por Renato Banzai.

¿Qué significa PLN?

PLN significa Procesamiento del Lenguaje Natural (NLP en inglés) y es un campo de la Inteligencia Artificial muy complejo que utiliza técnicas para, en pocas palabras, “entender de qué se está hablando”.

¿Y qué es FHIR?

0
0 225
Artículo Alberto Fuentes · 17 feb, 2021 1m read

Hola de nuevo a todos!

Cuando hacemos una instalación por defecto de VS Code, nos podemos encontrar que al crear un nuevo archivo, el lenguaje que tiene cargado por defecto es "Plain Text":

Debemos hacer click ahí para cambiar el lenguaje cargado para el archivo.

Por suerte, hay una configuración del VS Code que podemos utilizar para ajustar este comportamiento, se llama files.defaultLanguage. Aquí podemos indicar el ID del lenguaje que queramos o incluso podemos configurarlo para que utilice el mismo lenguaje que tenemos cargado en el contexto en el que estamos trabajando actualmente:

"files.defaultLanguage": "${activeEditorLanguage}"
0
0 210
Artículo Alberto Fuentes · 11 feb, 2021 1m read

Hola a todos,

Compartimos hoy un truco que quizá le resulte útil a aquellos que tienen que trabajar con JavaScript embebido.

Si tienes que trabajar con CSP o Zen probablemente más de una vez has necesitado utilizar JavaScript embebido. Supón que tienes que programar algunos bucles, que utilizan los caracteres <` o `> en alguna expresión, por ejemplo:

&js< 
               var test = document.getElementById('seTest');
               for (var i = 0; i < test.options.length; i++) {

                              // hacer algo con test.options[i]...
               }             

>
0
0 176
Artículo Alberto Fuentes · 28 ene, 2021 2m read

Hola a todos! 

Comparto una pequeña utilidad (servicio REST) para descargar mensajes de una producción de interoperabilidad como ficheros.

Sólo necesitas:

  1. Crear una aplicación web en el Portal de Gestión (e.g. /downloadmsg) que tenga configurado DispatchClass=Util.DownloadMsg.
  2. Llamar a la utilidad pasándole el namespace y el identificador de cabecera del mensaje a descargar. http://localhost:52773/downloadmsg/ns/dev/msgid/17441
/// 
/// Util to download messages given a message header id
/// 
/// Setup:
/// 1. Create a webapplication (e.g. /downloadmsg) and set DispatchClass=Util.DownloadMsg
/// 2. Go to http://localhost:52773/downloadmsg/ns/user/msgid/19 to download the message reference by header 19
Class Util.DownloadMsg Extends %CSP.REST
{

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
    <Route Url="/ns/:ns/msgid/:msgId" Method="GET" Call="DownloadMessage"/>
</Routes>
}

/// Download a message given a Ens.MessageHeader id
ClassMethod DownloadMessage(ns As %String, msgId As %String = "") As %Status
{
    set ret = $$$OK
    set currentNs = $namespace

    try {
        set $namespace = ns
        $$$ThrowOnError(..ExportMsgToStream(msgId, .stream, .filename))

        // set headers to download stream as filename
        do %response.SetHeader("Content-Type", "application/octet-stream")
        do %response.SetHeader("Content-Disposition", "attachment; filename="""_filename_"""")
        do %response.SetHeader("Content-Length", stream.Size)
        do stream.Rewind()
        do stream.OutputToDevice()

    } catch ex {
        set ret = ex.AsStatus()
    }

    // restore namespace
    set $namespace = currentNs

    quit ret
}

/// Export a message to stream given a Ens.MessageHeader id
ClassMethod ExportMsgToStream(msgId As %String, Output stream As %Stream.Object, Output filename As %String) As %Status
{
    set ret = $$$OK
    try {
        // stream
        set stream = ##class(%Stream.GlobalCharacter).%New()
        set filename = ""

        // message header
        set headerObj = ##class(Ens.MessageHeader).%OpenId(msgId,,.sc)
        $$$ThrowOnError(sc)

        // message body
        set obj = $classmethod(headerObj.MessageBodyClassName, "%OpenId", headerObj.MessageBodyId)
        set classname = $classname(obj) 

        // output to stream
		if classname="EnsLib.HL7.Message" {
			set sc = $method(obj, "OutputToLibraryStream", .stream)
			$$$ThrowOnError(sc)
			set filename = msgId_".hl7"
		}
		else {
			set writer = ##class(%XML.Writer).%New()
			set writer.Indent=1
			set writer.NoXMLDeclaration=1
			$$$ThrowOnError(writer.OutputToStream(.stream))
			$$$ThrowOnError(writer.RootObject(obj))
			set filename = msgId_".xml"
		}
    } catch ex {
        set ret = ex.AsStatus()
    }
    quit ret
}

}
2
0 214
Artículo Alberto Fuentes · 15 mayo, 2020 12m read

¡Muy buenas! Repasemos hoy un genial artículo de David E. Nelson sobre cómo montar un entorno de pruebas utilizando contenedores Docker para experimentar con IRIS, Spark y Zeppelin.

Gracias a la creciente disponibilidad de contenedores y el cada vez más útil Docker para Windows / MacOs, tengo mi propia selección de entornos preconfigurados para aprendizaje automático y data science. Por ejemplo, Jupyter Docker Stacks y Zeppelin en Docker Hub. Gracias también a la edición IRIS Community en un contenedor, tenemos un práctico acceso a una plataforma de datos que admite tanto el aprendizaje automático y análisis junto con otras muchas funciones. Al usar contenedores, no necesito preocuparme por actualizaciones automáticas que puedan arruinar mi área de pruebas. Si mi oficina se inundara y el portátil quedara inservible, podría recrear fácilmente el área de pruebas con un único archivo de texto, que por supuesto subí a un sistema de control de versiones ;-)

0
0 315
Artículo Alberto Fuentes · 3 abr, 2020 4m read

¡Hola a todos! 
Hoy hablaremos de cómo cargar un modelo de Machine Learning en IRIS y cómo probarlo, a través de un artículo genial de Niyaz Khafizov.

Nota: lo siguiente se realizó utilizando Ubuntu 18.04, Apache Zeppelin 0.8.0 y Python 3.6.5.

Introducción

Actualmente, muchas de las diferentes herramientas que están disponibles para data mining permiten desarrollar modelospredictivos y analizar los datos con gran facilidad.

0
0 623
Artículo Alberto Fuentes · 10 ene, 2020 8m read

A continuación veremos cómo mostrar una lista de métricas de ejemplo disponibles a través del servicio /api/monitor.

En el artículo anterior, echamos un vistazo al servicio que expone las métricas de IRIS en formato Prometheus. Veamos cómo configurar y ejecutar IRIS preview release 2019.4 en un contenedor y listar las métricas disponibles.

Asumimos que tienes Docker instalado. Si no es así, descárgalo e instálalo para tu sistema operativo :)

Si ya te resulta familiar trabajar con IRIS y contenedores Docker, puedes saltar directamente al Paso 2. Mostrar métricas.

Paso 1.

0
0 270
Artículo Alberto Fuentes · 7 ene, 2020 2m read

¡Hola Comunidad!

El gestor de paquetes InterSystems Package Manager (ZPM) es una gran herramienta, pero es aún mejor si la puedes usar directamente en lugar de tener que instalarla.

Hay varias formas de hacer esto, a continuación veremos una forma de tener un contenedor IRIS con ZPM instalado a través del Dockerfile.

Hemos preparado un ejemplo con algunas líneas en el Dockerfile que se ocupan de la descarga e instalación de la última versión de ZPM
Añade estas líneas a tu Dockerfile estándar que utiliza el IRIS Community y tendrás ZPM instalado y listo para usar.

Para descargar la última versión del cliente ZPM:

0
0 274
Artículo Alberto Fuentes · 16 dic, 2019 7m read

En InterSystems IRIS 2019.1.4 se incluye ya el servicio /api/monitor, que permite acceder a métricas de IRIS en formato Prometheus.

Esto es una gran noticia para aquellos interesados en utilizar métricas de IRIS como parte de su solución de monitorización y alertas. Este servicio (API) es un componente del nuevo System Alerting and Monitoring (SAM) que se liberará en próximas versiones de InterSystems IRIS.

Sin embargo, no es necesario esperar a que se libere System Alerting and Monitoring (SAM) para empezar a planificar y probar esta API para monitorizar tus instancias de IRIS.

0
0 406
Artículo Alberto Fuentes · 24 oct, 2019 3m read

¡Hola!

¿Te gustaría saber si tus transformaciones de datos funcionan como tienes previsto con un solo comando? ¿Y qué te parecería poder escribir pruebas unitarias de forma fácil y simple para las transformaciones de datos que utilizas?

Al hablar de interoperabilidad, normalmente encontraremos muchas transformaciones de datos involucradas. Esas transformaciones de datos se utilizan para convertir datos entre diferentes sistemas o aplicaciones en tu código, así que realmente se encargan de un trabajo muy importante.

0
0 371
Artículo Alberto Fuentes · 14 oct, 2019 6m read

¡Hola a tod@s!

Me gustaría comentar con vosotros algunas de las mejoras en procesamiento JSON que incorpora IRIS desde la versión 2019.1. Utilizar JSON como formato de serialización es muy común a la hora de construir aplicaciones hoy en día, especialmente si desarrollamos o interactuamos con servicios REST.

Dar formato a cadenas a JSON

Ayuda mucho poder dar un formato fácilmente interpretable por una persona a una cadena JSON. Especialmente cuando queremos depurar código y acabamos teniendo que examinar por ejemplo una respuesta JSON de un tamaño considerable.

0
0 363
Artículo Alberto Fuentes · 25 sep, 2019 4m read

¡Hola a tod@s!

K-Medias es uno de los algoritmos de aprendizaje no supervisado más simples para resolver el problema de agrupamiento. Este problema consiste en formar grupos de objetos con características similares. Por ejemplo, si tenemos una imagen de una pelota roja sobre césped verde, K-Medias separará los pixels de la imagen en dos grupos (clusters): un grupo con los pixels que forman la pelota, y otro grupo con los pixels del césped.

Repasaremos un artículo publicado por Niyaz Khafizov en el que implementaremos un ejemplo donde cargaremos un conjunto de datos en IRIS y ejecutaremos el algoritmo K-Medias utilizando Apache Zeppelin con el conector Spark. Utilizaremos InterSystems IRIS, Apache Zeppelin 0.8.0 y python.

0
0 1713
Artículo Alberto Fuentes · 29 ago, 2019 3m read

¡Hola a todos!

Hoy me gustaría contaros cómo podemos añadir la documentación de un servicio REST al Developer Portal de InterSystems API Manager.

¿Por dónde empezamos?

Necesitamos tener instalado InterSystems IRIS 2019.2 junto con InterSystems API Manager (IAM).

En el post Presentación de InterSystems API Manager, David nos cuenta cómo instalarlo, configurarlo y hacer una primera prueba.

1
0 577
Artículo Alberto Fuentes · 8 ago, 2019 2m read

¡Hola a todos!

En ocasiones, mientras depuramos  código COS podemos obtener mensajes de error como: <UNDEFINED>test^routine *test

El error (al que podemos acceder con la variable especial $zerror) nos indica la rutina y la línea que ha fallado.
Para revisar el código desde la línea de comandos, escribimos:

ZLOAD routine 

ZPRINT test

Posiblemente también nos sea útil  echar un vistazo a las líneas que se encuentran antes de la línea donde se produjo el error, ya que estas le proporcionan contexto. Utilizando ZPRINT podemos escribir ZPRINT +1:test pero esto podría mostrarnos cientos de líneas.

0
0 172
Artículo Alberto Fuentes · 29 jul, 2019 4m read

¡Hola a tod@s!

Hoy os traigo un artículo de Kyle Baxter sobre búsquedas de texto libre que vale la pena guardar como referencia :)

¿Os gustaría buscar de forma eficiente campos de texto libres almacenados en vuestra aplicación? ¿Lo habéis intentado alguna vez pero no habéis encontrado una manera que os ofrezca un buen rendimiento? Hay un truco especial que resuelve el problema :)

Como es habitual, si preferís la versión TL;DR (Demasiado largo, no lo he leído), podéis ir directamente al final del artículo, pero preferiríamos que leyeseis el artículo entero para evitar herir sentimientos.

1
0 360
Artículo Alberto Fuentes · 9 jul, 2019 4m read

¡Hola! Me gustaría revisitar hoy con vosotros un artículo muy útil de Amir Samary donde se detalla cómo ejecutar un comando del sistema operativo desde IRIS / Caché / Ensemble de forma interactiva.

Con frecuencia es necesario ejecutar algún comando externo, como por ejemplo un programa Python o un script de bash desde Caché/Ensemble. Existen dos formas principales:

  • $ZF(-100) - Ejecuta un comando como un proceso hijo. La ejecución puede ser síncrona o asíncrona. Permite redireccionar la entrada y salida estándar a ficheros. Esta función reemplaza a las obsoletas $ZF(-1), $ZF(-2).
0
0 624
Artículo Alberto Fuentes · 24 mayo, 2019 18m read

Al igual que con Pattern Matching, se pueden utilizar Expresiones Regularespara identificar patrones en textos en ObjectScript, sólo que con una potencia mucho mayor.

En este artículo se proporciona una breve introducción sobre las Expresiones Regulares y lo que puede hacerse con ellas en ObjectScript. La información que se proporciona aquí se basa en varias fuentes, entre las que destaca el libro “Mastering Regular Expressions” (Dominando las expresiones regulares) escrito por Jeffrey Friedl y, por supuesto, la documentación online de la plataforma.

3
1 1128
Archivo
Artículo Alberto Fuentes · 14 mayo, 2019 3m read

Hola a todos, me gustaría compartir una guía rápida publicada en el Developer Community sobre cómo conectar Apache Spark +  Apache Zeppelin con InterSystems IRIS. 

Introducción

Apache Spark es un framework opensource para computación en cluster. Proporciona una interfaz para desarrollar sobre clusters incluyendo paralelismo y tolerancia a fallos. Por ello es muy utilizado en Big Data.

Apache Zeppelin es un bloc de notas, que cuenta con una excelente interfaz de usuario para trabajar con diversos tipos análisis y machine learning

1
0 1579
Artículo Alberto Fuentes · 9 mayo, 2019 1m read

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.

0
0 988
Artículo Alberto Fuentes · 17 abr, 2019 2m read

El archivo events_examples.zip contiene dos ejemplos que muestran cómo procesar una carga de trabajo de forma asíncrona utilizando colas persistentes.

Events Simple

Este es un ejemplo muy sencillo que crea algunos procesos trabajadores y les encola mensajes utilizando $system.Event.

; crear un recurso compartido y crear los procesos trabajadores
USER>do ##class(IAT.S04.Event.Test).Setup()
 
; encolar algunos mensajes hacia los trabajadores y ver qué sucede
USER>do ##class(IAT.S04.Event.Test).Run()
Show log? no/[yes]:
^Samples.Log=10
^Samples.Log(1)="[2016-02-19 09:43:14] Enqueuing 1"
^Samples.Log(2)="[2016-02-19 09:43:14] Worker 8168 grabs: 1"
^Samples.Log(3)="[2016-02-19 09:43:14] Enqueuing 2"
^Samples.Log(4)="[2016-02-19 09:43:14] Worker 18184 grabs: 2"
^Samples.Log(5)="[2016-02-19 09:43:14] Enqueuing 3"
^Samples.Log(6)="[2016-02-19 09:43:14] Worker 8168 grabs: 3"
^Samples.Log(7)="[2016-02-19 09:43:14] Enqueuing 4"
^Samples.Log(8)="[2016-02-19 09:43:14] Worker 18184 grabs: 4"
^Samples.Log(9)="[2016-02-19 09:43:14] Enqueuing 5"
^Samples.Log(10)="[2016-02-19 09:43:14] Worker 8168 grabs: 5"
 
; trabajo terminado, podemos enviar más mensajes o matar a los procesos trabajadores
write $system.Process.Terminate(8168)
1
write $system.Process.Terminate(18184)
1
1
0 231
Artículo Alberto Fuentes · 17 abr, 2019 2m read

El archivo workmgr_simple.prj_.zip contiene un ejemplo simple de paralelización con $system.WorkMgr 

El ejemplo utiliza diferentes procesos (trabajadoresworkers) para actualizar pedazos de una misma tabla .

¿En qué consiste el ejemplo?

  • Crea una tabla con 100 filas.
  • Divide la tabla en distintos pedazos (cada pedazo es un grupo de filas) sobre las que actuarán los trabajadores.
  • Inicializa $system.WorkMgr y asigna los pedazos en que se ha dividido la tabla a los procesos trabajadores:
    • Cada proceso trabajador actualiza las filas del pedazo de la tabla que le haya tocado.
0
0 142