Buscar

Limpiar filtro
Artículo
Mathew Lambert · 24 jul, 2020

Herramienta de compresión tar en ObjectScript

¡Hola desarrolladores! Estoy seguro de que la mayoría de vosotros ya conoceis la posibilidad de usar GZIP en los productos de InterSystems. Pero el problema es que GZIP trabaja con un único archivo o flujo de datos, y no admite carpetas. Al trabajar con sistemas Unix, es posible solucionarlo con la herramienta de compresión tar, incluida en cada sistema Linux de forma predeterminada. Pero ¿qué hacer si debemos trabajar también en Windows, que no lo incluye? Me alegra poder enseñaros el nuevo proyecto, isc-tar, que os ayudará a no preocuparos del sistema operativo y os permitirá gestionar los archivos tar en cualquier sitio. Instalación Ve a la página releases (versiones), descarga la última versión de zUtils.FileBinaryTar.xml. Importa y compila de tu forma preferida en cualquier namespace. %SYS>Do $system.OBJ.Load("zUtils.FileBinaryTar.xml", "c") Ahora estará disponible desde cualquier sitio por el nombre de clase %zUtils.FileBinaryTar Requirimientos y limitaciones Ha sido probado en InterSystems IRIS Community Edition 2019.1, pero debería funcionar en casi cualquier otra versión. La excepción es la clase %Stream.FileBinaryGzip, que antes se encargaba de los gzip, y apareció en 2015.1. En este momento, la herramienta no se preocupa de los permisos guardados en el tar, únicamente de la estructura de carpetas y el contenido de los archivos Uso Puedes comprimir cualquier carpeta o un solo archivo, cuando no se requiere el nombre del archivo, aún devuelve el stream comprimido. Set gzip = 1 Set archive = ##class(%zUtils.FileBinaryTar).Compact("/tmp/some/place", gzip, "/tmp/some.tgz") Puedes extraer el archivo a alguna estructura temporal extendida desde %ArrayOfDatatypes y así podrás encontrar cualquier archivo si conoces el nombre exacto Set gzip = 1 Set extracted = ##class(%zUtils.FileBinaryTar).ExtractFile("/tmp/some.tgz", gzip) Set tSC = extracted.FindPath("folder/subfolder/test.txt", .file) Set fileContent = file.fileData While 'fileContent.AtEnd { /// read file from archive } Puedes guardar lo extraído en una carpeta Set tSC = extracted.ExtractTo("/tmp/some/place") O extraer únicamente un stream Set extracted = ##class(%zUtils.FileBinaryTar).ExtractStream(stream) Nota: el segundo parámetro gzip está activado de forma predeterminada. Cualquier notificación de problema o "pull-request" siempre es bienvenida en el repositorio.
Anuncio
Esther Sanchez · 1 abr, 2022

Mejoras en la Comunidad de Desarrolladores, marzo 2022

¡Hola desarrolladores! Hemos hecho algunos cambios en los sitios web de las Comunidades de Desarrolladores de InterSystems: Nueva función de búsqueda Estadísticas generales de la Comunidad Conexión con el perfil de Facebook Cambios en las páginas de las publicaciones: etiquetas, información del autor, resaltado del borrador Vamos a explicar en detalle cada uno de ellos. Búsqueda en la Comunidad Hemos implementado un nuevo motor de búsqueda en los sitios web de la Comunidad. Ahora hay dos opciones de búsqueda: Búsqueda rápida Búsqueda avanzada Con la Búsqueda rápida, se puede encontrar fácilmente una publicación/etiqueta/persona e ir directamente a esa página. Escribe lo que quieras buscar y aparecerá un listado con varias opciones propuestas. ¿No encuentras nada que encaje con lo que buscas? Prueba a usar la Búsqueda Avanzada haciendo clic en el botón con la lupa 🔍: Te llevará a una página en la que puedes añadir fácilmente otros parámetros a tu búsqudeda: buscar las publicaciones de una persona en concreto buscar por publicaciones que incluyan una etiqueta específica buscar por tipo de publicación (preguntas, anuncios, artículos, debates) buscar solo tus publicaciones También se pueden ordenar los resultados por relevancia, por cercanía en el tiempo o durante un tiempo determinado (últimos 7/30/365 días): Estadísticas generales de la Comunidad Ahora se pueden ver los datos de la Comunidad de Desarrolladores de InterSystems en su conjunto: Conexión con el perfil de Facebook Se puede añadir el enlace a un perfil de Facebook en tu perfil de la Comunidad. Haz clic en tu foto de perfil arriba a la derecha y después en "Mi cuenta". Ve a la opción "Editar" en la columna de opciones a la izquierda y en el apartado "Información adicional" podrás añadir tu enlace a Facebook en "Facebook profile". No te olvides de hacer clic en "Guardar" al final de la página :D Cambios en las páginas de publicaciones: etiquetas, información del autor, resaltado del borrador Lo habéis pedido... ¡y lo hemos hecho! Ahora las Etiquetas de las publicaciones aparecen en la publicación, debajo del título. También en la página de cada publicación se puede ver toda la información de contacto del autor, en el bloque a la derecha: Los borradores de las publicaciones ahora aparecen resaltados en azul: ¡Esperamos que os resulten útiles estos cambios! Podéis solicitar mejoras o reportar errores en el GitHub de la Comunidad. O en los comentarios de esta publicación, claro. ¡Muchas gracias!
Artículo
Pierre-Yves Duquesnoy · 16 jun, 2020

Implementar Integraciones IRIS con .NET o Java usando PEX

Introducción InterSystems IRIS 2020.1 incluye PEX (Production EXtension Framework), para facilitar el desarrollo de producciones de Interoperabilidad de IRIS con componentes escritos en Java o .NET. Gracias a PEX, un desarrollador de integraciones con conocimientos Java o .NET puede beneficiarse de la potencia, escalabilidad y robustez del framework de Interoperabilidad de InterSystems IRIS, y ser productivo en muy poco tiempo. Para un experto en el framework de Interoperabilidad IRIS, PEX aporta facilidad para enriquecer las integraciones con componentes externos pre-existentes en lenguajes Java o .NET. Este tutorial propone explorar PEX y guiar el desarrollador .NET en sus primeros pasos con PEX. El código esta disponible en https://github.com/es-comunidad-intersystems/webinar-PE El tutorial complementa la documentación de PEX disponible en linea en https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=EPEX Arquitectura de Interoperabilidad InterSystems IRIS PEX permite escoger el lenguaje de programación (actualmente Java o .NET, más adelante también python) para implementar cualquier de los distintos componentes (Business Service, Business Process, Business Operation, InboundAdapter, OutboundAdapter, Mensajes) que forman una producción de Interoperabilidad de IRIS. Los 3 componentes principales de interoperabilidad de IRIS son: Business Services: Componentes que ofrecen un servicio que se puede invocar desde fuera. Ejemplo de Business Services son un Servicio REST, un servicio SOAP Web Service, pero también un Service que lee y procesa los nuevos ficheros que han sido escritos en un directorio, un servicio que lee y procesa filas de una tabla de BBDD, un servicio que lee ficheros por FTP, etc. El Business Service puede tener un Inbound Adapter asociado, que se encarga de los detalles de implementación de un protocolo especifico (SQLInboundAdapter para leer tablas SQL, FileInboundAdapter para leer ficheros, etc. El Business Service se encarga de procesar la información, copiarla a un mensaje de Interoperabilidad de IRIS, y enviar el mensaje a un Business Process o Business Operations y posiblemente esperar una respuesta si hay. Business Operation: Componente que recibiendo un mensaje de interoperabilidad de IRIS, actúa sobre un sistema externo, posiblemente con la ayuda de un OutboundAdapter que se encarga de los detalles de implementación de protocolos (TCP, REST, SOAP,Ficheros, SQL, etc). El Business Operation puede o no devolver una respuesta a quien le haya llamado. Business Process: proceso de orquestación, que, recibiendo un mensaje de Interoperabilidad de IRIS, puede hacer procesamientos y llamadas a uno o varios otros business processes o business operations para realizar operaciones complejas y/o devolver un mensaje con información agregada al Business Service que le he enviado el mensaje. Toda la configuración de los componentes se agrupa en una "Producción"; la producción es una clase de InterSystems IRIS que contiene la definición de todas las integraciones que se arrancan juntas al iniciar IRIS, y la configuración de cada componente de estas integraciones. Se puede editar como una clase de IRIS, o modificar desde el portal de gestión. Arquitectura de PEX Para ejecutar el código .NET o Java, InterSystems IRIS usa el Object Gateway correspondiente. Este Gateway se puede instanciar localmente o en un servidor remoto. Los Java y .Net Gateways El Gateway es un componente nativo de .NET o Java, que escucha en un puerto TCP/IP concreto y recibe peticiones desde el proceso IRIS, las ejecuta y devuelve los resultados. Los Componentes PEX pre-construidos Para usar PEX en una producción de IRIS, es necesario añadir a la Producción un componente pre-construido para cada componente desarrollado en Java o .NET. El componente pre-construido sirve de envoltorio (wrapper) al elemento externo que referencia, y permite definir sus propiedades y configuración dentro de la producción. Los componentes Java o .NET que se ejecutan desde el Gateway correspondiente deben heredar (ser subclase) de un componente de PEX pre-existente. A continuación se ofrece una recopilación de estos elementos: Componentes de IRIS Para .NET y para Java Función Clase Comentario Business Service EnsLib.PEX.BusinessService Adaptador configurado: Ens.InboundAdapter Business Process EnsLib.PEX.BusinessProcess. Business Operation EnsLib.PEX.BusinessOperation Inbound Adapter EnsLib.PEX.InboundAdapter Outbound Adapter EnsLib.PEX.OutboundAdapter PEX Message EnsLib.PEX.Message Mensaje para enviar a un componente PEX IRIS Message Se Mapea al Mensaje IRIS Mensaje de componente PEX a componente IRIS Componentes Java o .NET Estos componentes están disponibles en librerías que hay que añadir al proyecto java o .NET. La librería mínima a referenciar en un proyecto PEX es la del Gateway. Adicionalmente, si se quiere usar mensajes IRISObject para llamar a componentes IRIS desde PEX, es necesario referenciar la librería IRISClient: Lenguaje Librerías .NET <installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.Gateway64.exe <installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.IRISClient.dll Java <installdir>\dev\java\lib\JDK18\intersystems-gateway-3.1.0.jar <installdir>\dev\java\lib\JDK18\intersystems-jdbc-3.1.0.jar <installdir>\dev\java\lib\gson\gson-2.8.5.jar SuperClase a usar para componentes .NET Función Clase .NET Business Service InterSystems.EnsLib.PEX.BusinessService Business Process InterSystems.EnsLib.PEX.BusinessProcess Business Operation InterSystems.EnsLib.PEX.BusinessOperation Inbound Adapter InterSystems.EnsLib.PEX.InboundAdapter Outbound Adapter InterSystems.EnsLib.PEX.OutboundAdapter Mensaje PEX InterSystems.EnsLib.PEX.Message Mensaje IRIS InterSystems.Data.IRISClient.ADO.IRISObject Superclase a usar para componentes en Java Función Clase Java Business Service com.intersystems.enslib.BusinessService Business Process com.intersystems.enslib.BusinessProcess Business Operation com.intersystems.enslib.BusinessOperation. Inbound Adapter com.intersystems.enslib.pex.InboundAdapter Outbound Adapter com.intersystems.enslib.pex.OutboundAdapter Mensaje PEX com.intersystems.enslib.pex.Message Mensaje IRIS <...>.IRISObject Funciones de Utilidades En los componentes implementados en ObjectScript, InterSystems IRIS ofrece unos comandos en forma de MACRO para añadir información al log de Eventos de IRIS. Estos métodos están disponibles en JAVA y .NET en la forma siguiente: Método Descripción LOGINFO(mensaje) Añadir mensaje al Log de Eventos con estado "info" LOGALERT(mensaje) Añadir mensaje al Log de Eventos con estado "alert" LOGWARNING(mensaje) Añadir mensaje al Log de Eventos con estado "warning" LOGERROR(mensaje) Añadir mensaje al Log de Eventos con estado "error" LOGASSERT(mensaje) Añadir mensaje al log de Eventos con estado "assert" Interoperabilidad entre componentes nativos y componentes PEX Es posible combinar componentes en lenguaje nativo ObjectScript de InterSystems IRIS con componentes PEX desarrollados en Java o .NET. Cuando los 2 componentes son de tipo BusinessService - InboundAdapter o BusinessOperation - OutboundAdapter el desarrollador puede escoger el tipo de datos/tipo de objeto a usar en las llamadas: La llamadas se realizan entre IRIS y el Java/.NET gateway siguiendo las reglas de conversión de tipos de datos que determina el Gateway. Cuando los 2 componentes que intercambian información son Business Hosts (BS,BP, BO), el componente que debe recibir el mensaje (de petición o de respuesta) impone el tipo de objetos a usar para el mensaje: Un Componente PEX siempre recibe un mensaje EnsLib.PEX.Message Un Componente IRIS recibe un mensaje IRISObject EnsLib.PEX.Message El EnsLib.PEX.Message permite una representación en IRIS ObjectScript de un mensaje cuya estructura has sido definida en .NET o en Java. IRIS usa la funcionalidad de DynamicObject para manipular las propiedades. Internamente, IRIS usa JSON como medio de transporte entre IRIS y .NET/Java. Al crear un mensaje PEX en IRIS, es necesario informar en %classname el nombre de la clase de NET/Java que se debe instanciar para usar el mensaje. IRISObject Para poder llamar a un componente pre-construido de InterSystems IRIS desde un componente PEX, es necesario definir un mensaje que sea de tipo IRISObject (en .NET la clase completa es InterSystems.Data.IRISClient.ADO.IRISObject). Primeros Pasos con PEX y .NET En estos primeros pasos se procede a: crear un proyecto .NET con las librerias PEX necesarias, de la version 4.5 de .NET framework Añadir un BusinessOperation y un mensaje Simple al proyecto .NET Configurar el .NET Gateway de Intersystems IRIS Crear una Producción de Interoperabilidad Añadir un BO preconstruido Creación de un Proyecto .NET con Visual Studio 2019 En Visual Studio, se crea un nuevo proyecto de tipo "Class Library .Net Standard in C#". Se escoge el nombre "PEX.Webinar.FirstDemo": Para poder trabajar con PEX, se añaden las dependencias necesarias, desde el "Solution Explorer", menú contextual "Add Reference": y con el botón "Browse", se añaden las 2 librerías (compatibles con .NET Framework 4.5!) ubicadas en un subdirectorio de la instalación de InterSystems IRIS: <installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.Gateway64.exe <installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.IRISClient.dll A continuación, se renombra desde el solution Explorer Class1.cs para llamarlo "FirstOperation.cs", y se modifica la clase para que herede de la clase PEX de BusinessOperation (InterSystems.EnsLib.PEX.BusinessOperation). Se sobrescriben los 3 métodos de PEX.BusinessOperation: Metodo Descripción OnInit Se ejecuta 1 vez cuando se arranca este componente en la producción. Permite inicializar librerías, conexiones, variables... OnTearDown Se ejecuta 1 vez cuando se para este componente o la producción. Permite liberar recursos que se hayan usado en el ciclo de vida del componente OnMessage Se ejecuta para cada Mensaje recibido. Permite tratar el mensaje y devolver respuesta De momento, no se ha definido ningún mensaje, y ninguna tarea que realizar. Por lo cual, se añade simplemente funciones LOGINFO en los 3 métodos. Por otra parte, no hace falta llamar al método de la superclase , por lo cual se puede eliminar las llamadas a la clase base (base.OnInit(), base.OnTearDown(), base.OnMessage). Dejamos la implementación como sigue: Metodo Implementación Inicial OnInit OnInit public override void OnInit() { LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnInit()"); } OnTearDown OnTearDown public override void OnTearDown() { LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnTearDown()"); } OnMessage OnMessage public override object OnMessage(object request) { LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnMessage()"); return request; } Con esto, se puede compilar esta versión Inicial del proyecto .NET, con el Menú "Build Solution". Esto genera el fichero siguiente, que se utiliza a continuación desde IRIS: 1>------ Build started: Project: PEX.Webinar.FirstDemo, Configuration: Debug Any CPU ------1>PEX.Webinar.FirstDemo -> C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\netstandard2.0\PEX.Webinar.FirstDemo.dll========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ========== Creación de una Producción de Interoperabilidad InterSystems IRIS Ahora, desde el Portal de Gestión de IRIS, se puede escoger el menú "Interoperability", el namespace "Ensemble", y los menus "Configure", "Production". La pestaña "Actions", y el botón "New" permiten definir una nueva producción de Integración de IRIS. Para activar el Servicio de Pruebas, se selecciona la pestaña "Settings" y en el último apartado de la lista ("Development and Debugging") se habilita "Testing Enabled" y se hace click sobre el botón Apply: Añadir el NET Gateway a la Producción Para poder trabajar con PEX, se debe arrancar el Gateway de Java o .NET correspondiente. InterSystems recomienda configurar y arrancar estos gateway desde el menú "System Administration / Configuration / Connectivity / Object Gateways" par entornos de producción (live). Para este entorno de desarrollo, se puede añadir directamente un componente a la producción para arrancar el Gateway. Esto permite arrancar y parar el gateway al mismo tiempo que la producción en un solo click, y así liberar el acceso a la .DLL de proyecto de .NET cuando se quiere re- compilarla (Visual Studio no la puede recompilar si el .NET gateway está arrancado). Para añadir el componente ".Net Gateway", se añade un Business Service a la producción con el botón "+" al lado de "Services". El nombre de clase del componente (Service Class) a añadir es "EnsLib.DotNetGateway.Service", y se selecciona "Enable now" para habilitar el componente. Se editan los parámetros de configuración del componente añadido, haciendo click sobre este, y rellenando a continuación los valores en la pestaña "Settings", seleccionado finalmente el botón "Apply": Parametro Valor Descripción Port 44444 Se puede cambiar al puerto si el puerto 55000 por defecto ya esta ocupado por otro proceso FilePath <installdir>\dev\dotnet\bin\v4.5\ Indica la ubicación donde encontrar el ejecutable del Gateway (InterSystems.Data.Gateway64.exe) <InstallDir> es el directorio de instalación de IRIS: Por ejemplo: C:\InterSystems\IRIS20201\dev\dotnet\bin\v4.5\ Exec64 true Seleccionar la version 64Bits del gateway .NET Version 4.5 La versión de .Net debe ser 4.5 Añadir el Business Operation creado en .NET Se añade ahora un Business Operation de PEX para referenciar el código .NET creado anteriormente, con el botón "+" al lado de "Operations". El tipo de clase es "EnsLib.PEX.BusinessOperation", se nombra el componente (opcional) "PEX.Webinar.FirstOperation", se habilita con "Enable Now". A continuación, se configura el componente (haciendo click sobre el componente añadido) y seleccionando la pestaña "Settings" a la derecha: Parámetro Valor Descripción Remote Classname PEX.Webinar.FirstDemo.FirstOperation El Nombre de la clase .NET generada Gateway Port 44444 El puerto TCP en el cual esta configurado el .NET Gateway Gateway Extra CLASSPATH C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\ netstandard2.0\PEX.Webinar.FirstDemo.dll Ubicación de las .DLL a incluir. Es la ubicación donde la compilación de Visual Studio ha generado la DLL Para aplicar los cambio, se hace click sobre el botón "Apply": Arrancar la Producción y Probar El botón "Start" permite arrancar la producción y todos sus componentes: InterSystems IRIS permite probar de manera simple y aislada un componente. Se hace click para seleccionar el "Business Operation" llamado "PEX.Webinar.FirstOperation", y se selecciona el botón "Test" de la pestaña Actions: En la pantalla siguiente, se rellenan los datos como sigue: Parámetro Valor Descripción Request Type EnsLib.PEX.Message El tipo de mensaje de IRIS que se envía. Siempre es un EnsLib.PEX.Message. Permite añadir propiedades dinámicas para traspasar valores al componente PEX Java o .NET %classname InterSystems.EnsLib.PEX.Message Es el Nombre de la clase del mensaje definido en Java o .NET como petición (request) del componente. Para .NET tiene que ser InterSystems.EnsLib.PEX.Message o una subclase Cuando se hace click en "Invoke Testing Service", el framework de Interoperabilidad de IRIS envía el mensaje al componente y el código .NET se ejecuta. Haciendo click sobre el "Visual Trace", se pueden ver los detalles. El punto blanco numerado "3" muestra la traza "LOGINFO" implementada en .NET. El Log de Eventos de IRIS contiene un recopilatorio de todos los mensajes LOGINFO() generados, incluidos en OnInit() y OnTearDown(). Siguientes Pasos con PEX: Completando la producción A continuación se crean componentes de otros tipos en .NET: Mensajes .NET Business Services .NET Business Process .NET Creación y uso de un mensaje PEX con datos Para pasar información desde Ensemble a componentes PEX, se define una clase en .NET como subclase de InterSystems.EnsLib.PEX.Message, con las propiedades para la información que se quiere pasar. Siguiendo con un ejemplo simplificado, añadimos una propiedad "value" de tipo string al mensaje. El Business Operation PEX devolverá el mismo tipo de mensaje, con el contenido transformado a majusculas. Clase de mensaje en .NET Se añade un nuevo fichero "FirstMessage.cs" as proyecto .NET, con la siguiente definición: FirstMessage using System; using System.Collections.Generic; using System.Text; namespace PEX.Webinar.FirstDemo { class FirstMessage : InterSystems.EnsLib.PEX.Message { public string value; } } Uso del mensaje desde .NET En el Business Operation FirstOperation, el tipo de Datos de OnMessage está definido como Object. Se tiene que hacer el cast a la clase "FirstMesssage" para usarlo: OnMessageV2 public override object OnMessage(object request) { LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnMessage()"); ///se Instancia el mensaje de respuesta FirstMessage response = new FirstMessage(); //Se copia el value en "uppercase" de la peticion response.value = ((FirstMessage)request).value.ToUpper(); //Se devuelve la respuesta return response; } Es necesario parar la producción de IRIS (con el botón "Stop"), o como mínimo deshabilitar el .NET Gateway (doble-click sobre el componente), y recompilar el proyecto .NET Uso de la clase desde InterSystems IRIS El botón "Test" (Testing Service) no permite rellenar las propiedades dinámicas de la clase EnsLib.PEX.Message. Sin embargo, se puede usar el Testing Service con un mensaje de tipo "Ens.StringRequest" nativo de IRIS, y transformar (Con una Transformación de Datos) este mensaje en un mensaje PEX desde una transformaciçon de datos. La transformación se invocar desde un Business Process de tipo Enrutador ya pre-construido. Transformación de Datos Se crea una Transformación de Datos para copiar los datos del mensaje nativo ensemble: source target Comentario Clase EnsLib.StringRequest EnsLib.PEX.Message Las clases de origen y de destino de la transformación %classname n/a PEX.Webinar.FirstDemo.FirstMessage Para un mensaje PEX (target), el %classname define el nombre de la clase .NET/Java a usar. property source.StringValue target.%jsonObject.value El en mensaje PEX de destino, las propiedades dinámicas esta ubicadas dentro del %jsonObject. La Transformación de Datos se puede crear desde el portal de gestión "Interoperability" / "Build" / "Data Transformations", con el botón "New": A continuación se definen las transformaciones del mensaje "source" al "target" como descrito en la tabla anterior, usando la herramienta gráfica y completando el texto en la pestaña "Action" a la derecha, para obtener las 2 líneas de texto mostradas abajo. Después, se puede guardar (botón "Save"), Compilar (botó "Compile") y probar con la pestaña "Tools". Ahora, abriendo la pestaña tools, se puede probar esta Transformación de Datos: Se abre la Ventana de Pruebas, donde se puede especificar valores para el mensaje de origen (en StringValue) y verificar el resultado: Como se puede ver, el mensaje PEX usa una representación interna en json para traspasar los valores entre IRIS y Java o .NET. Creación de un Business Process de tipo Enrutador Ahora es posible añadir un Business Process de tipo Enrutador a la Producción, y definir una regla de Enrutamiento que llame a la Transformación de Datos creada e envie en mensaje al Business Operation existente. En el portal de getión, se vuelve a la pantalla de Configuración de Producción ( "Interoperability" / "Configure" / "Production"), y se añade el Business Process de tipo "EnsLib.Message.Router", haciendo "click" sobre el "+" al lado de "Processes", y rellenando como sigue: Parametro valor descripcio Business Process Class EnsLib.MsgRouter.RoutingEngine Un Business Process para enrutamiento de mensajes basado en reglas Auto-Create Rule SI Definir el esqueleto de una regla de Enrutamiento Business Process Name MessageRouter Una nombre para nombrar este componente en la producción Enable Now SI Activar este componente de inmediato Pool Size 1 Escalabilidad. Permite definir el número de procesos activos en parallelo. Queda por Editar la Regla de Enrutamiento de este Componente. Par esto se selecciona el componente "MessageRouter" en la producción, y se hace "click" sobre la lupa al lado de la Regla de Enrutamiento (Business Rule Name): El editor de Reglas permite editar la Regla para enviar todos los mensajes de tipo "Ens.StringRequest" al Business Operation llamado "PEX.Webinar.FirstOperation" después de aplicarles la transformación. El botón "+" permite añadir elementos a las reglas, y se puede editar un elemento seleccionando-lo previamente. La regla a guardar debe estar como sigue: Por defecto este componente no espera respuesta. Se cambia su configuración en la pestaña "Settings" del componente, para recibir la respuesta del Business Operation: Prueba del Enrutador con el Servicio de Pruebas De vuelta a la página de la producción, se puede usar el botón "Start" para arrancar la producción, seleccionar el componente "MessageRouter", y con la pestaña "Actions", hacer click sobre el botón "Test", para enviar un mensaje de tipo "Ens.StringRequest": El mensaje de Respuesta de la prueba se puede ver en "Test Results", y la traza de mensaje completa muestra todos los detalles de la ejecución en los distintos componentes de la producción de Interoperabilidad de IRIS: Respuesta: Traza de los mensajes: Business Service en .NET Implementación en .NET Se vuelve a Visual Studio para crear un Business Service en .NET. En este ejemplo Inicial, este Business Service no tiene "Inbound Adapter" especifico asociado; Se usa el "EnsLib.InboundAdapter", un componente que se ejecuta a intervalos regulares (según el valor de CallInterval) y hace una llamada al Business Service cada CallInterval. En Visual Studio, se genera un nuevo fichero "FirstService.cs", para la clase "FirstService". El procesamiento de cada evento detectado por el Inbound Adapter se hace en el método "OnProcessInput". El objeto pasado en parámetro depende de la implementación del InboundAdapter, es este caso no se usa: FirstService:OnProcessInput public override object OnProcessInput(object messageInput) { //crear un nuevo Objeto de Petición FirstMessage myRequest = new FirstMessage(); myRequest.value = "La Hora de envio es: " + System.DateTime.Now.ToString(); //Para Enviar Sin esperar una respuesta: //SendRequestAsync("PEX.Webinar.FirstOperation", myRequest); //Para Enviar y Esperar la respuesta con un timeout de 20 segundos: FirstMessage myResponse=(FirstMessage) SendRequestSync("PEX.Webinar.FirstOperation", myRequest, 20); return null; } FirstService:OnProcessInput public override object OnProcessInput(object messageInput) { //crear un nuevo Objeto de Petición FirstMessage myRequest = new FirstMessage(); myRequest.value = "La Hora de envio es: " + System.DateTime.Now.ToString(); //Para Enviar Sin esperar una respuesta: //SendRequestAsync("PEX.Webinar.FirstOperation", myRequest); //Para Enviar y Esperar la respuesta con un timeout de 20 segundos: FirstMessage myResponse=(FirstMessage) SendRequestSync("PEX.Webinar.FirstOperation", myRequest, 20); return null; } Para poder enviar el mensaje a cualquier componente de la producción si tener que recompilar, se puede usar un parámetro que se configure desde el portal de gestión; los valores se especifican en formato de una cadena json dentro del parámetro de configuración "RemoteSettings". Parameters class FirstService : InterSystems.EnsLib.PEX.BusinessService { /// <summary> /// Un parametro que se puede cambiar desde el Portal /// </summary> public string TargetConfigName; (...) Si el valor especificado parar "TargetConfigName" esta a null, el Business Service no podrá enviar el mensaje a ningún destino. Para detectar este problema lo antes posible, una opción es validar el valor de TargetConfigName cuando se inicia el componente, en la llamada a OnInit(): FirstService:OnInit public override void OnInit() { //Verificar que las propiedades esten correctamente informadas if (TargetConfigName==null ) { LOGWARNING("Falta valor para TargetConfigName; es necsario asignarle un valor en RemoteSettings"); }else { LOGINFO("TargetConfigname=" + TargetConfigName); } } Ahora, se puede Cambiar el OnProcessInput para usar el valor de TargetConfigName: OnProcessInput //Para Enviar y Esperar la respuesta con un timeout de 20 segundos: FirstMessage myResponse=(FirstMessage) SendRequestSync(TargetConfigName, myRequest, 20); Business Service PEX en InterSystems IRIS En el portal de Gestión, en la definición de la Producción se añade un componente de tipo Business Service, haciendo click sobre el "+" al lado de A continuación, se configura el componente (haciendo click sobre el componente añadido) y seleccionando la pestaña "Settings" a la derecha: Parámetro Valor Descripción CallInterval 20 El tiempo entre cada ejecución del OnTask() del Adaptador Associado, y de cada llamada a OnProcessInput() Remote Classname PEX.Webinar.FirstDemo.FirstService El Nombre de la clase .NET generada Remote Settings TargetConfigName=PEX.Webinar.FirstOperation Una Lista de parametros en formato param=value, separados por <newline> Gateway Port 44444 El puerto TCP en el cual esta configurado el .NET Gateway Gateway Extra CLASSPATH C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\ netstandard2.0\PEX.Webinar.FirstDemo.dll Ubicación de las .DLL a incluir. Es la ubicación donde la compilación de Visual Studio ha generado la DLL Al Activar este Business Service, cada CallIntervall el OnTask() del adaptador asociado (Ens.InboundAdapter) se ejecuta. Aquí, el OnTask simplemente llama FirstService.OnProcessInput(). Es Decir, cada callInterval, FirstService.OnProcessInput() genera un mensaje que envia al componente definido en "TargetConfigName". La Traza de Mensajes (Message Viewer) permite verificar esto: Con los detalles de una llamada: Business Process .NET Implementación .NET Como Cada Business Host, el Business Process tiene los Metodos de CallBack OnInit() y OnTearDown(). Los Metodos especificos de un Business Process son los siguientes: Metodo Descripción OnRequest(mensaje) Se ejecuta para cada mensaje que se envía al Business Process. Es el sitio donde implementar las acciones iniciales del Proceso, y realizar envíos asíncronos a otros componentes (Procesos o Operaciones) OnResponse Se ejecuta 1 vez para cada respuesta de las llamadas asíncronas realizadas. Permite gestionar las respuestas y guardar los resultados OnComplete Se ejecuta 1 vez al final de la ejecución del Business Process. Permite construir el mensaje de respuesta final del Proceso. Es importante notar que un Business Process puede tener una ejecución que se alarga en el tiempo (horas o días, esperando una respuesta asíncrona). Para permitir esto, el Framework de IRIS puede interrumpir y reanudar la ejecución de un proceso. Todos los valores que se quieren mantener durante un proceso se tienen que poner en propiedades de la clase que IRIS guarda de manera persistente. Para esto, es necesario indicarlo con la anotación "[persistent]". En este Ejemplo, se realiza una implementación minimalista, donde el Business Process enruta a un destino el mensaje PEX que recibe: Se usan 2 variables que se pueden modificar desde el portal de Gestión: FirstProcess class FirstProcess: InterSystems.EnsLib.PEX.BusinessProcess { //Timeout para las Llamadas public string Timeout = "PT10S"; public string TargetConfigName; public override void OnInit() { //Verificar que las propiedades esten correctamente informadas if (TargetConfigName == null) { LOGWARNING("Falta valor para TargetConfigName; es necesario asignarle un valor en RemoteSettings"); } else { LOGINFO("TargetConfigname=" + TargetConfigName); } } Cuando recibe un mensaje se envia de manera asincrona al TargetConfigName: FirstProces:OnRequest public override object OnRequest(object request) { LOGINFO("OnRequest"); SendRequestAsync(TargetConfigName, (InterSystems.EnsLib.PEX.Message)request, true); //ResponseRequired=true SetTimer(Timeout, "HasTimedOut"); return null; } En OnResponse permite gestionar las respuestas de las llamadas: FirstProcess:OnResponse public override object OnResponse(object request, object response, object callRequest, object callResponse, string completionKey) { LOGINFO("OnResponse, CompletionKey=" + completionKey); if (completionKey!= "HasTimedOut") { response = (FirstMessage)callResponse; } LOGINFO("Response:" + response.ToString()); return response; } Y al finalizar el proceso, se devuelve la respuesta: FirstProcess:OnComplete public override object OnComplete(object request, object response) { LOGINFO("OnComplete"); return response; } Business Process PEX en Intersystems IRIS Se añade un Business Process de tipo EnsLib.PEX.BusinessProcess, se configura como sigue, y se cambia el TargetConfigName del Business Service "PEX.Webinar.FirstProcess" para enviar los mensajes al nuevo Processo en vez de enviarlos dicectamente al BO. Los "Settings" del componente se definen así: Parametro valor Remote Classname PEX.Webinar.FirstDemo.FirstProcess Remote Settings Timeout=PT20STargetConfigName=PEX.Webinar.FirstOperation Gateway Port 44444 Gateway Extra Classpath C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\netstandard2.0\PEX.Webinar.FirstDemo.dll El Resultado en la traza es este: Conclusión PEX permite implementar integraciones en .NET o Java de manera muy fluida y ofrece toda la potencia y robustez de la capa de interoperabilidad de InterSystems IRIS para desarrolladores con experiencia en estos lenguajes. 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
Esther Sanchez · 1 jul, 2019

¿Qué pasó el mes pasado en la Comunidad de Desarrolladores? - Junio 2019

a {color:#2a2e78;} Lo más vistoYa está disponible IRIS Studio 2019.2by David Reche 33El Arte del Mapeo de Globales para Clases (1 de 3)by Milo Martinez 26Cómo hacer preguntas de calidad como entradas de la Comunidadby David Reche 20Funciones del lenguaje que deberías conocer desde el día 1by Jose-Tomas Salvador 17Cómo publicar un artículo desde Word o Google Docsby David Reche 17Enviar alertas desde Ensemble mediante Telegramby Francisco López 16Crear un servicio SOAP Pass-throughby Francisco López 16Ensemble y los adaptadores para la salida de archivos, un pequeño trucoby Francisco López 16La aplicación IRIS API Explorerby David Reche 15API RESTfulby Francisco López 15"Mejores Prácticas" de InterSystemsby David Reche 15¿Cómo probar automáticamente los cuadros de mando dinámicos y los paneles de DeepSee?by Evgeny Shvarov 15El Arte del Mapeo de Globales para Clases (2 de 3)by Milo Martinez 15GitHub ahora soporta ObjectScriptby Dmitry Maslennikov 14Nuevo Vídeo: Productividad para Ingenieros de Interfazby Esther Sanchez 13Nueva versión de VSCode-ObjectScript (0.7.11)by Nancy Martinez 12Ya está disponible IRIS for Health 2019.2by David Reche 11Cómo evitar el truncamiento en mensajes HL7 con campos muy grandes (más de 32K)by Nancy Martinez 11Administración de la fecha y hora durante las operaciones en Cachéby Nancy Martinez 10Nuevo vídeo: InterSystems IRIS en un contenedorby Esther Sanchez 9Lo más votadoCómo hacer preguntas de calidad como entradas de la Comunidadby David Reche 1Administración de la fecha y hora durante las operaciones en Cachéby Nancy Martinez 1Lo más comentadoYa está disponible IRIS Studio 2019.2by David Reche 310 autores a los que seguirDavid Reche 49Francisco López 47Milo Martinez 41Nancy Martinez 21Jose-Tomas Salvador 17Dmitry Maslennikov 14AnunciosInterSystems IRISYa está disponible InterSystems IRIS 2019.2 by David RecheYa está disponible IRIS Studio 2019.2by David RecheNuevo vídeo: InterSystems IRIS en un contenedorby Esther SanchezInterSystems IRIS for HealthYa está disponible IRIS for Health 2019.2by David RecheHealthShareNuevo Vídeo: Productividad para Ingenieros de Interfazby Esther SanchezOtroNueva versión de VSCode-ObjectScript (0.7.11)by Nancy Martinez"Mejores Prácticas" de InterSystemsby David RecheArtículosOtroCómo hacer preguntas de calidad como entradas de la Comunidadby David RecheGitHub ahora soporta ObjectScriptby Dmitry MaslennikovCómo publicar un artículo desde Word o Google Docsby David RecheInterSystems IRISEnviar alertas desde Ensemble mediante Telegramby Francisco LópezLa aplicación IRIS API Explorerby David RecheFunciones del lenguaje que deberías conocer desde el día 1by Jose-Tomas SalvadorCachéEl Arte del Mapeo de Globales para Clases (1 de 3)by Milo MartinezAdministración de la fecha y hora durante las operaciones en Cachéby Nancy MartinezAPI RESTfulby Francisco LópezEl Arte del Mapeo de Globales para Clases (2 de 3)by Milo MartinezEnsembleCómo evitar el truncamiento en mensajes HL7 con campos muy grandes (más de 32K)by Nancy MartinezEnsemble y los adaptadores para la salida de archivos, un pequeño trucoby Francisco LópezPreguntasInterSystems IRIS¿Cómo probar automáticamente los cuadros de mando dinámicos y los paneles de DeepSee?by Evgeny ShvarovObtener el valor de la propiedad de la instancia o obtener el valor de la columna del registroby Evgeny ShvarovEnsembleCrear un servicio SOAP Pass-throughby Francisco López
Artículo
Ricardo Paiva · 15 mar, 2023

Cómo llamar métodos de clase con la API nativa para Python

El [SDK nativo para Python](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=BPYNAT_about) de InterSystems es una interfaz ligera para las APIs de InterSystems IRIS, que anteriormente solo estaba disponible mediante ObjectScript. Estoy especialmente interesado en la capacidad de llamar a los métodos de ObjectScript, a los métodos de clase, para ser más preciso. Esto funciona, y funciona muy bien, pero de manera predeterminada, las llamadas únicamente admiten argumentos escalares: strings, booleanos, enteros y flotantes. Pero si lo que quieres es: - Pasar o devolver estructuras, como diccionarios (dicts) o listas - Pasar o devolver *streams* Necesitarás escribir algún código adhesivo (*glue code*) o aprovechar este [proyecto](https://github.com/eduard93/edpy) (se instala mediante `pip install edpy`). El paquete `edpy` te da una estructura sencilla: ```python call(iris, class_name, method_name, args) ``` que te permite llamar a cualquier método de ObjectScript y obtener los resultados. Se importa así: ```python from edpy import iris ``` `call` acepta 4 argumentos necesarios: - `iris` - hace referencia a un [objeto de IRIS](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=BPYNAT_refapi#BPYNAT_refapi_class-iris) establecido - `class_name` - la clase de IRIS que debe llamarse - `method_name` - el método de IRIS que debe llamarse - `args` - lista con 0 o más argumentos ## Argumentos Cada argumento puede ser alguno de los siguientes: - *string* (de cualquier longitud, si es mayor que `$$$MaxStringLength` o 3641144 símbolos, se convertirá automáticamente en un *stream*) - booleano - entero - flotante - dict (se convierte en un objeto dinámico) - lista o tupla (se convierte en una matriz dinámica) Los argumentos de dict, lista y tupla pueden contener otros dicts, listas y tuplas de forma recurrente (mientras dure la memoria). ## Valor devuelto A cambio, esperamos o un objeto/matriz dinámico o una string/stream JSON. En ese caso, edpy primero lo convertiría en un string Python y, si fuera posible, lo interpretaría como un dict o lista Python. De lo contrario, el resultado sería devuelto tal cual. Eso es todo lo que debemos saber por el momento, pero permíteme dar algunos ejemplos de métodos ObjectScript y cómo llamarlos usando esta función de Python. ## Ejemplo 1: Pong ```objectscript ClassMethod Test(arg1, arg2, arg3) As %DynamicArray { return [(arg1), (arg2), (arg3)] } ``` Se llama con: ``` >>> iris.call(iris_native, "User.Py", "Test", [1, 1.2, "ABC"]) [1, 1.2, 'ABC'] ``` El resultado no es ninguna sorpresa. Los argumentos se vuelven a empaquetar en una matriz y se devuelven. ## Ejemplo 2: Propiedades ```objectscript ClassMethod Test2(arg As %DynamicObject) As %String { return arg.Prop } ``` Se llama así: ``` >>> iris.call(iris_native, "User.Py", "Test2", [{"Prop":123}]) 123 ``` Para una invocación más embebida: ``` >>> iris.call(iris_native, "User.Py", "Test2", [{"Prop":{"Prop2":123}}]) {'Prop2': 123} ``` No hay ningún problema si una propiedad es demasiado larga: se utilizarán *streams* para enviarla y/o devolverla a IRIS: ``` ret = iris.call(iris_native, "User.Py", "Test2", [{"Prop":"A" * 10000000}]) >>> len(ret) 10000000 ``` Si necesitas streams garantizados en el lado de InterSystems IRIS, puedes usar [%Get](https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=%25SYS&CLASSNAME=%25Library.DynamicObject#%25Get): ```objectscript set stream = arg.%Get("Prop",,"stream") ``` Si el stream está codificado en base64, puedes descodificarlo automáticamente mediante: ```objectscript set stream = arg.%Get("Prop",,"stream
Artículo
Ricardo Paiva · 29 abr, 2021

Cómo crear un repositorio FHIR + Configuración del servidor de autorización/de recursos OAuth2 en IRIS for Health - Parte 1

¡Hola desarrolladores! En este artículo, nos centraremos en OAuth2, un protocolo que se utiliza cada vez con más frecuencia en combinación con FHIR para realizar la autorización. En esta primera parte, comenzaremos con el contenedor Docker para IRIS for Health y Apache, configuraremos la función del servidor de autorización OAuth2 en IRIS for Health, accederemos a él desde la herramienta de desarrollo Postman para REST y obtendremos un token de acceso. Además, en la Parte 2 y en las siguientes, añadiremos las funciones del repositorio FHIR a IRIS for Health, también agregaremos la configuración del servidor de recursos OAuth2, y explicaremos cómo ejecutar las solicitudes de FHIR utilizando los tokens de acceso desde Postman. En la Comunidad de Desarrolladores ya se han publicado varios artículos excelentes donde se explican las funciones de OAuth2 en los productos de InterSystems; sin embargo, me gustaría explicar nuevamente cómo configurar la última versión. [Cómo implementar la estructura de InterSystems IRIS Open Authorization (OAuth 2.0) - Parte 1](https://es.community.intersystems.com/post/implementaci%C3%B3n-de-la-estructura-open-authorization-oauth-20-en-intersystems-iris-parte-1) En este artículo, utilizaremos la última versión de InterSystems IRIS for Health 2020.3 (es una versión de prueba). Si quieres desarrollar un entorno basado en este artículo, asegúrate de utilizar esta versión o una posterior del kit. Algunas características no están incluidas en los productos anteriores a esta versión. ## Preparativos preliminares El primer paso es hacer unos preparativos preliminares. Son muchas las cosas que deben prepararse para crear un entorno seguro. La versión de prueba de IRIS for Health 2020.3 solo está disponible en una versión para el contenedor Docker ([InterSystems Docker Hub/IRIS for Health](https://hub.docker.com/_/intersystems-iris-for-health/)). Para efectuar la configuración de OAuth2, también deberás realizar la configuración del servidor web y de SSL. En este artículo, utilizaremos Apache. Al realizar la configuración de SSL en Apache, el certificado de configuración de SSL debe coincidir con el nombre del servidor. Ten en cuenta este punto. ### Cómo obtener los archivos de muestra del repositorio intersystems-jp de GitHub El archivo docker-compose.yml/Dockerfile y otros archivos de muestra utilizados en esta configuración están disponibles en el repositorio de GitHub reservado para la Comunidad de Desarrolladores de InterSystems. En primer lugar, descomprime este archivo en tu entorno utilizando el siguiente comando. (También puedes hacerlo desde el archivo adjunto que se encuentra en este artículo). Este archivo docker-compose.yml/Dockerfile y otros archivos se crean tomando como referencia la [aplicación iris-webgateway-example](https://openexchange.intersystems.com/package/iris-webgateway-example) publicada en OpenExchange. ```console git clone https://github.com/Intersystems-jp/IRIS4H-OAuth2-handson.git ``` ### Cómo cambiar la configuración para que coincida con el kit que se está utilizando En este archivo docker-compose.yml, se configuran dos contenedores para iniciarse: el contenedor de IRIS for Health y el contenedor de Apache (httpd) se crearán por el comando docker build. El archivo docker-compose.yml, disponible en GitHub, hace referencia a la versión de prueba 2020.3.200.0 de la Community Edition de IRIS for Health. La Community Edition puede utilizarse para evaluar los productos de InterSystems. ```docker iris: image: store/intersystems/irishealth-community:2020.3.0.200.0 ``` Si utilizas una versión diferente (la versión oficial o una más reciente), cambia esta parte de la especificación. El contenedor Apache se creará con el contenido del Dockerfile, que requiere un kit [WebGateway](https://docs.intersystems.com/irisforhealth20201/csp/docbook/DocBook.UI.Page.cls?KEY=GCGI) para conectarse a IRIS desde Apache. Para saber cómo conseguir el kit, contacta con el Centro de Soporte Internacional (WRC) de Intersystems. Para consultas sobre el SO del servidor, puedes ponerte en contacto con nosotros en [esta dirección](mailto:jpcommunity@intersystems.com?subject=howtogetWebGatewayKit). Modifica las siguientes partes del Dockerfile según el producto que hayas obtenido. Independientemente del SO del servidor (Windows/Ubuntu/CentOS), la plataforma será lnxubuntux64 porque el SO base del contenedor httpd es Debian. ```docker ARG version=2020.3.0.200.0 ARG platform=lnxubuntux64 ADD WebGateway-${version}-${platform}.tar.gz /tmp/ ``` ### Cómo preparar un certificado SSL En el siguiente paso, se prepara un certificado SSL. Cuando se accede a la autorización OAuth2, debe comprobarse si el certificado SSL establecido en el servidor web coincide con la URL a la que se tiene acceso. No es necesario utilizar un certificado oficial, es posible utilizar OpenSSL, etc. Introduce el nombre del servidor en el campo "Common Name" al crear el certificado. Además, como el certificado que acabas de crear se cargará automáticamente durante el arranque, debes cambiar el archivo por uno que no requiera una contraseña. Consulta el siguiente comando. ```console $ openssl rsa -in cert.key.org -out cert.key ``` Coloca los archivos CRT y KEY que se crearon, en el mismo directorio con el Dockerfile, con los nombres de archivo **server.crt / server.key** respectivamente. Además de utilizarlo con el servidor web Apache, necesitarás un certificado SSL para la configuración de OAuth2. Estos no requieren que introduzcas un nombre de servidor, etc., pero debes crear tres conjuntos (En las configuraciones posteriores, aparecen como auth.cer/auth.key, client.cer/client.key, resserver.cer/resserver.key). ### Cómo crear e iniciar un contenedor docker ¡Ya estás listo! Además de los cuatro archivos que descargaste, ahora tienes un kit de instalación Web Gateway y dos certificados SSL en tu directorio. Ten cuidado con los permisos de acceso y ejecución de cada archivo (por ejemplo, yo añadí el permiso de ejecución para webgateway-entrypoint.sh). ```docker docker-compose build docker-compose up -d ``` Una vez iniciado, utiliza el comando docker ps para verificar que los dos contenedores están en ejecución. ``` Apache Container name:_web IRIS for Health container name:store/intersystems/irishealth-community:2020.3.0.200.0(or other name depend on kit) ``` Ahora, intenta acceder al portal de administración mediante alguna de estas tres formas. Si el tercer método funciona, ¡tu configuración SSL a través del servidor web Apache es un éxito! http://[hostname]**:52773**/csp/sys/UtilHome.csp :A esta URL se accede a través del servidor Apache privado en el contenedor IRIS. Este no pasa por el Apache que se configuró. http://[hostname]/csp/sys/UtilHome.csp :Esta URL accede al portal de administración a través del Apache que se configuró. http**s**://[hostname]/csp/sys/UtilHome.csp :Esta URL accede al Portal de administración utilizando una conexión SSL a través del Apache que se configuró. ### Cómo crear una configuración SSL Ahora que IRIS for Health está listo y en funcionamiento, y tenemos acceso al Portal de administración, vamos a crear la configuración SSL para los últimos preparativos. Ve a Management Portal -> System Administration -> Security -> SSL/TLS Configuration y crea tres configuraciones SSL utilizando los tres pares de certificado/llave que preparaste. Puedes seleccionar el nombre que quieras, pero en este artículo utilizaremos SSL4AUTH/SSL4CLIENT/SSL4RESSERVER, siguiendo los artículos anteriores relacionados con OAuth2. ![imagen](/sites/default/files/inline/images/oauth2fhir_1.png) *Acerca de compartir directorios entre servidores y contenedores En la siguiente especificación de volúmenes que se encuentra en el archivo docker-compose se muestra la ubicación actual del directorio host = /ISC en el contenedor. Utiliza este directorio cuando especifiques el archivo del certificado en la configuración anterior, etc. ```docker volumes: - .:/ISC ``` Este directorio no solo contendrá archivos, sino también archivos de la base de datos IRIS y archivos de la configuración. Consulta el documento “[Persistencia de %SYS para almacenar datos de instancias persistentes](https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=ADOCK#ADOCK_iris_durable)” para obtener más información. ## Cómo configurar OAuth2 en IRIS for Health ¡Ahora es el momento de entrar en los detalles del acceso a IRIS for Health utilizando OAuth2! ### Configuración del servidor de autorización OAuth2 Primero, vamos a configurar el servidor de autorización OAuth2. Ve a Management Portal → System Administration → Security → OAuth 2.0 → Server. Sigue estas instrucciones para ajustar la configuración. | Configuración en la pestaña “General” | | | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Issuer endpoint: Host name | Escribe el nombre actual del servidor | | Issuer endpoint: Prefix | Puedes escribir cualquier valor que quieras, pero aquí lo establecimos como “authserver”. | | Supported grant types | En este artículo, solo utilizaremos “Authorization Code”, pero si quieres probar otros “Grant Types”, añade una marca de verificación. Además, añade una verificación a la “JWT authorization” | | SSL/TLS configuration | Especifica la configuración SSL que acabas de añadir. | ![imagen](/sites/default/files/inline/images/oauth2fhir_2.png) En la pestaña “Scopes", haz clic en “Add Supported Scope” para añadirlos. Más adelante, la pantalla de inicio de sesión del Código de Autorización mostrará la “Descripción” que escribiste aquí. ![imagen](/sites/default/files/inline/images/oauth2fhir_3.png) No hagas cambios de la configuración predeterminada en la pestaña “Intervals". En la pestaña “JWT Settings”, seleccionaremos “RS512” como el algoritmo de firma. ![imagen](/sites/default/files/inline/images/oauth2fhir_4.png) En la última pestaña de “Customization”, cambia la especificación Generate Token Class a %OAuth2.Server.JWT. ![imagen](/sites/default/files/inline/images/oauth2fhir_5.png) Una vez que hayas introducido la información, haz clic en el botón “Save” para guardar la configuración. Ahora que tienes la configuración necesaria para que IRIS for Health se ejecute como un servidor de autorización de OAuth2, ¡estás listo para probarlo! ¡Intentaremos acceder desde Postman y veremos si podemos obtener un token de acceso! Sin embargo, antes de hacer eso, necesitamos configurar dos cosas más. ### Añadir la descripción del cliente En primer lugar, añade la información de Postman para acceder como un cliente de OAuth2. El registro de clientes de OAuth2 se puede añadir por medio del registro dinámico u otros métodos. Haz clic en “Client Description” en la página de configuración del servidor para continuar. ![imagen](/sites/default/files/inline/images/oauth2fhir_6.png) Haz clic en “Create Client Description” para añadir una entrada. Sigue estas instrucciones para crear una suscripción de cliente. | Configuración en la pestaña “General” | | | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Name | Escribe el nombre que quieras. En este caso, hemos elegido “postman”. | | Client Type | Elige “Confidential” | | Redirect URLs | Haz clic en el botón “Add URL” para añadir una URL de redirección para Postman. https://www.getpostman.com/oauth2/callback como la URL de redirección para Postman. | | Supported grant types | Especifica el mismo “Authorization Code” (Código de autorización) configurado en la configuración del servidor de autorización de OAuth2. (Predeterminado) Añade una marca si quieres probar también otros tipos de permisos. Sin embargo, la configuración debe ser la misma que la del servidor de autorización. Además, marca la casilla “JWT authorization”. Especifícalo aquí | | Authenticated Signing Algorithm | Marca la opción "Autorización JWT" en Supported grant Types para que se pueda seleccionar. Selecciona “RS512”. | | | | ![imagen](/sites/default/files/inline/images/oauth2fhir_7.png) Una vez que hayas introducido la información, haz clic en el botón “Save” para guardar la descripción del cliente. Haz clic en la pestaña “Client Credentials” para ver el client ID y la clave privada del cliente para esta entrada. Necesitarás este ID y la clave privada cuando realices las pruebas desde POSTMAN. ![imagen](/sites/default/files/inline/images/oauth2fhir_8.png) ### Añadir una aplicación web Es necesario agregar una configuración más antes de acceder desde POSTMAN. La pantalla de configuración del servidor de autorización OAuth2 ha determinado que el endpoint para esta configuración es https:///authserver/oauth2. Para que el acceso a este endpoint sea administrado correctamente por IRIS, necesitamos añadir una aplicación web para esta ruta de URL. Ve a System Administration→Security→Applications→Web Applications, y haz clic en “Create a new web application”. ![imagen](/sites/default/files/inline/images/oauth2fhir_9.png) Se proporciona una plantilla de aplicación web OAuth2, así que primero, selecciona “/oauth2” desde “Copy from”. | Configuración de “Edit Web Application” | | | --------------------------------------- | ---------------------------------------------------------------------- | | Copy From | “/oauth2” : Siempre selecciona este primero desde el menú desplegable. | | Name | /authserver/oauth2 | | Enable | Marca el botón de la opción “REST”. | | | | Después de introducir cada valor, guárdalo. ![imagen](/sites/default/files/inline/images/oauth2fhir_10.png) ## Cómo probar OAuth2 desde POSTMAN Lo vamos a probar desde POSTMAN. Las pruebas también se pueden ejecutar desde otras herramientas o desde el propio programa. La explicación detallada de POSTMAN va más allá del alcance de este artículo, pero cabe señalar que la verificación del certificado SSL debe cambiar a OFF en la configuración de POSTMAN. Después de crear una nueva solicitud en POSTMAN, selecciona “OAuth 2.0” en la pestaña TYPE of Authorization y haz clic en “Get New Access Token”. ![](https://jp.community.intersystems.com/sites/default/files/inline/images/images/image(846).png) En la siguiente pantalla, introduce los valores según lo siguiente. | Configuración「GET NEW ACCESS TOKEN」 | | | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Token Name | Escriba el nombre que quieras. | | Grant Type | Selecciona “Authorization Code”. | | Callback URL | | | Auth URL | "https:///authserver/oauth2/authorize" Introduce el valor del endpoint +/"authorize". Al añadir "? ui_locales=ja", puedes mostrar la pantalla de inicio de sesión en japonés. | | Auth Token URL | https:///authserver/oauth2/token. Introduce el valor del endpoint +/"token". | | Client ID | Introduce el client ID que aparece en la pestaña de Client Credentials después de registrarte para la descripción del cliente. | | Client Secret | Introduce la clave privada del cliente, que se muestra en la pestaña Client Credentials después de registrar la descripción del cliente. | | Scope | Introduce el scope registrado en la configuración del servidor de autorización, por ejemplo, “scope1”. También puedes especificar varios scopes separados por espacios. | | State | Introduce el parámetro State, que se utiliza para las medidas contra el CSRF. No se utiliza explícitamente, pero no se puede dejar en blanco, por lo que se introduce una cadena arbitraria. | | | | ![](https://jp.community.intersystems.com/sites/default/files/inline/images/images/image(849).png) Después de introducir los parámetros y hacer clic en el botón “Request Token”, verás la pantalla de inicio de sesión: ![imagen](/sites/default/files/inline/images/oauth2fhir_11.png) Intenta iniciar sesión con la información del usuario (por ejemplo, _SYSTEM) con acceso al Portal de administración. En la siguiente pantalla después del inicio de sesión, puedes decidir conceder permisos a esta aplicación. Después de hacer clic en “Allow”, si el token de acceso aparece en la siguiente pantalla, como se muestra a continuación, ¡la prueba de adquisición del token de acceso se realizó con éxito! ![](https://jp.community.intersystems.com/sites/default/files/inline/images/images/image(853).png) ### Cómo probar OpenID Connect IRIS for Health puede llevar a cabo el procesamiento de autorización de OAuth2, así como el procesamiento de autenticación compatible con OpenID Connect. Consulta [este documento](https://docs.intersystems.com/irisforhealth20201/csp/docbook/DocBook.UI.Page.cls?KEY=GOAUTH) para obtener más información. En esta configuración, OpenID Connect está habilitado, ¡así que vamos a probar si también podemos obtener el token de ID de OpenID Connect! Es fácil de implementar. En la pantalla GET NEW ACCESS TOKEN, añade “openid” al scope y realiza una solicitud. ![](https://jp.community.intersystems.com/sites/default/files/inline/images/images/image(852).png) OpenID Connect también se mostrará en la página de solicitud de autorización. Después de que hayas iniciado sesión y hayas dado tus permisos, asegúrate de obtener también un token de identificación (id_token) cuando veas la siguiente pantalla. (Es posible que necesites desplazarse hacia abajo por la pantalla.) ![](https://jp.community.intersystems.com/sites/default/files/inline/images/images/image(856).png) ¿Pudiste obtener el token de acceso y el id_token? Aunque hay algunos preparativos, como los certificados que requieren un poco de tiempo y esfuerzo, podríamos construir un servidor de autorización OAuth2 muy sencillo utilizando IRIS for Health. En el siguiente artículo de esta serie, finalmente os mostraré cómo crear un repositorio FHIR y registrarlo como un servidor de recursos OAuth2. Y también cómo acceder con REST al repositorio FHIR por medio de un token de acceso OAuth2 desde POSTMAN.
Anuncio
Esther Sanchez · 20 oct, 2020

¡Empieza el Virtual Summit 2020!

¡Hola Comunidad! ¿Todos listos para el InterSystems Virtual Summit 2020? Si aún no te has registrado,⚡️todavía puedes inscribirte aquí ⚡️ Habrá de todo, para todo el mundo; desde gerentes, desarrolladores, integradores de sistemas, personal de soporte... ¡Y todas las sesiones serán gratis! El tema general de la Convención virtual es Interacción & Información. ¿Cómo se organizarán las jornadas? ✅ SESIONES INAUGURALES (KEYNOTES)Cómo crear una organización flexible20-22 de octubre, 2020 ✅ MÁS DE 60 SESIONES TÉCNICAS (FOCUS SESSIONS)Mejores prácticas, nuevas tecnologías y hojas de ruta27-29 de octubre, 2020 ✅ ENCUENTROS VIRTUALES PRIVADOS (ASK THE EXPERTS)Reuniones privadas30 de octubre & 2 de noviembre, 2020 ✅ AULAS PRÁCTICAS (EXPERIENCE LABS)Manos a la obra con nuestra tecnología2-5 de noviembre, 2020 Puedes descargarte el programa de cada día en: intersystems.com/summit20 ¡Nos "vemos" en el Virtual Summit 2020! Hoy es el último día de las Sesiones Inaugurales (Keynotes). ¿Cuál te interesa? :D
Pregunta
Robert Cemper · 31 mayo, 2021

Cómo desactivar la Interoperabilidad de forma rápida

Cuando inicio una instalación nueva de IRIS o de un contenedor, siempre encuentro los paquetes de interoperabilidad mapeados en el namespace USER. ¿Existe alguna utilidad para quitar este mapeo de forma sencilla, con un clic?Quitar el mapeo global a global, rutina a rutina, paquete a paquete es muy aburrido. Es decir: busco una utilidad dentro de IRIS. La utilidad externa es obvia: Notepad (o cualquier otro editor de texto) - limpiar iris,cpf,- reiniciar IRIS Es rápido, es eficiente, pero es muy tedioso. Una de las opciones - No usar el namespace USER. Por qué preocuparnos de lidiar con USER? Una opción más productiva y limpia es crear tu propia base y namespace desde cero. Eso es por lo que creamos una nueva base de datos y namespace IRISAPP en cada plantailla, por ejemplo: las plantillas objectscript, rest o ZPM package. Con esta aproximación del tipo infrastructure-as-a-code, sabes con seguridad que namespaces, mapeos, seguridad, bases de datos, usuarios, ... utilizas y cómo se configuran, porque son los que creas tu. En todo caso, en instalaciones iniciales de InterSystems IRIS, al menos desde la versión 2020.1, el namespace USER no viene configurado por defecto con la opción de interoperabilidad activada.
Artículo
Alberto Fuentes · 25 sep, 2019

Algoritmo de agrupamiento K-medias sobre datos en IRIS

¡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. Conjunto de datos flor Iris El conjunto de datos flor Iris contiene diferentes características de la flor Iris de 3 especies distintas. Las especies pueden ser Iris-setosa, Iris-versicolor e Iris-virginica. Cada flor posee 5 características: Longitud del pétalo (Petal Length), Anchura del pétalo (Petal Width), Longitud del sépalo (Sepal Length), Anchura del sépalo (Sepal Width) y Especie (Species). Requerimientos En este otro artículo comentamos cómo conectar InterSystems IRIS con Apache Zeppelin / Spark: Guía rápida para conectar Apache Spark y Apache Zeppelin con InterSystems IRIS. Necesitaremos también tener instalado python3 junto con python3-pip (el gestor de paquetes de python). Podéis encontrar guías de instalación para Linux, macOS y Windows. Una vez instalado python3 y python3-pip, instalaremos pyspark (para poder interactuar con spark desde python). pip3 install pyspark En Apache Zeppelin hemos de cambiar la configuración zeppelin.pyspark.python del intérprete de Spark y especificar la ruta nuestro intérprete (podemos obtenerla con which python3 por ejemplo) Finalmente, creamos una nueva nota en Zeppelin y si todo ha ido correctamente podremos ejecutar sin error lo siguiente: %pysparkimport sysprint(sys.version) Agrupamiento de datos En primer lugar, cargamos los datos que ya tenemos almacenados en IRIS Para ver los diferentes tipos de especie que están cargadas, podemos ejecutar lo siguiente en un nuevo párrafo de Zeppelin: %pysparkdataFrame.select("Species").show(150) Antes de continuar, sería una buena idea echarle un vistazo a los datos que tenemos. En otro párrafo podemos ejecutar: %pysparkz.show(dataFrame) Nos aparecen las 5 características de la flor que almacenamos en la tabla: PetalLength, PetalWidth, SepalLength, SepalWidth y Species. Escogemos a continuación la opción de gráfica Scatter Chart. De esta forma podemos apreciar los diferentes grupos. No podemos ver una imagen completa porque son vectores de 4-dimensiones, pero para ver los grupos desde otra perspectiva podemos cambiar los parámetros de xAxis y yAxis. El objetivo es predecir la especie de la flor utilizando sus características. En un nuevo párrafo escribimos lo siguiente: %pysparkfrom pyspark.ml.linalg import Vectorsfrom pyspark.ml.feature import VectorAssemblerassembler = VectorAssembler(inputCols = ["PetalLength", "PetalWidth", "SepalLength", "SepalWidth"], outputCol="features") // it makes a vector with 4 parameters mentioned in inputCols and name it as outputCol.irisFeatures = assembler.transform(dataFrame) // this will add to the table outputCol column with vectors.irisFeatures.show(5) A continuación, en otro párrafo introducimos lo siguiente: %pysparkfrom pyspark.ml.clustering import KMeans(trainingData, testData) = irisFeatures.randomSplit([0.7, 0.3]) // split data into two parts randomlykmeans = KMeans().setK(3).setSeed(101010) // KMeans model with 3 clusters. setSeed makes reproducible results.model = kmeans.fit(trainingData) // train kmeans modeltransformed = model.transform(trainingData) // add a new column to the table with predicted resultstransformed.show(150) Utilizamos el modelo en nuestros datos de prueba: %pysparkpredictions = model.transform(testData)predictions.show(151) Y evaluamos cómo de acertado ha sido el modelo: %pysparkSpeciesAndPreds = predictions.select("Species", "prediction").collect()def getCluster(specie): if specie == "Iris-setosa": return 0 elif specie == "Iris-versicolor": return 1 else: return 2def getAccuracy(flowers): counter = 0; for flower in flowers: if getCluster(flower[0]) == flower[1]: counter += 1 return counter / len(flowers)accuracy = getAccuracy(SpeciesAndPreds)print("accuracy is " + str(accuracy))// My result is 0.9090909090909091 Para ver cuántas flores hay en cada grupo, podemos ejecutar z.show(predictions) y escoger el tipo de gráfica Bar Chart: Conclusión Hemos creado un modelo que predice la especie de datos de flores iris almacenadas en InterSystems IRIS :) con una precisión bastante buena (> 90%). También hemos comprobado que el grupo "Iris-setosa" puede separarse utilizando el algoritmo K-Medias pero "Iris-virginica" y "Iris-versicolor" no. Así que en resumen, sería muy útil utilizar alguna otra idea para mejorar la precisión del modelo.
Artículo
Esther Sanchez · 28 oct, 2022

Cómo publicar una aplicación en Open Exchange

¡Hola desarrolladores! Podéis publicar vuestras aplicaciones en Open Exchange y aparecerán en la Galería de aplicaciones. El proceso de publicación es el siguiente: Inicia sesión en Open Exchange Escribe la descripción de la aplicación Envía la aplicación para su aprobación ¡Hecho! Os explico los detalles más abajo. Para publicar una aplicación, lo primero que hay que hacer es registrarse en Open Exchange. Se puede hacer con la misma cuenta de la Comunidad de Desarrolladores o crear una cuenta nueva. Una vez registrado, ve a "Manage my Apps" en el menu: Después haz clic en "Submit new Application": Cómo configurar una aplicación: Importar datos de GitHub Si tu aplicación tiene el repositorio público en GitHub, puedes importar la mayoría de los campos automáticamente desde Github - Pon la URL de tu repositorio en el campo "Github URL": Y los datos se importarán automáticamente desde el repositorio en GitHub: Tienes que elegir la categoría y completar algunos campos obligatorios antes de hacer clic en "Send for approval" (Enviar para aprobación). Configuración manual de la aplicación También se pueden rellenar los campos manualmente: Name (Nombre) El nombre de tu aplicación. Debe ser único y distinto al de cualquier otra aplicación de Open Exchange. Download URL (URL de descarga) La URL donde se puede descargar la aplicación. Se convertirá en el botón "Download" (Descarga) en la página de tu aplicación: License URL (URL de la licencia) Pon ahí una URL que describa la licencia disponible para cualquier interacción con tu aplicación. La mayoría de los desarrolladores Open Source ponen una Licencia MIT, pero puede ser otra. Las aplicaciones comerciales pueden proporcionar diferentes tipos y formas de licencia, se puede facilitar un enlace donde ver esos términos y condiciones. Category (Categoría) Elige una categoría a la que pertenezca tu aplicación. Estas son las opciones: Analytics Development Environment Framework Interoperability Solution Technology Example InterSystems Technology (Tecnología de InterSystems) Elige el producto y/o tecnología de InterSystems con el que funciona tu aplicación: Industry (Industria) Elige la industria o industrias a la que aplica tu solución: Casilla "Publish in Package Manager" Marca esa casilla si vas a enviar tu aplicación al ZPM Package Manager. Más información aquí Echa un vistazo al proceso completo de creación y envío de aplicaciones ObjectScript a Github con soporte ZPM Método de Desarrollo Package First con InterSystems IRIS y ZPM Short description (Descripción corta) Es la descripción que aparecerá en la ficha de tu aplicación en la galería. Otros campos Long description (Descripción larga) Es lo que aparece en la página de cada aplicación, por ejemplo. Si tu aplicación está en GitHub, puede usar el GitHub README.md de este repositorio marcando esa casilla: La descripción larga debe incluir:- Los objetivos y funciones de la aplicación- Cómo usar la aplicación- Si es una aplicación de código abierto, hay que proporcionar las instrucciones de instalación La descripción larga permite la notación markdown, por lo que se puede usar formato de texto enriquecido e insertar pantallazos y vídeos desde YouTube, por ejemplo. Tags (Etiquetas) Es un campo obligatorio. Haz clic en la flecha para ver las etiquetas de la lista desplegable o empieza a escribir tu etiqueta y aparecerá el listado con las palabras que contienen esas letras. Community Article URL (URL del artículo en la Comunidad) Pon el enlace al artículo en la Comunidad en el que anuncias la aplicación o invita a comentar sus funcionalidades o las nuevas versiones - eso se convertirá en el botón "Discuss" en la página de la aplicación. YouTube URL (URL en YouTube) Pon el enlace al vídeo en YouTube que describe tu aplicación - el vídeo se incluirá automáticamente en la página de tu aplicación. Ejemplo. Documentation URL (URL a documentación) Enlace a la documentación online de tu aplicación, si hay. Support URL (URL de soporte) Enlace a la página donde se puede enviar un ticket de soporte. Borrador de la aplicación Haciendo clic en el botón con un ojo ("Preview") se puede ir comprobando cómo se ve la página de tu aplicación. También se puede guardar el borrador haciendo clic en el botón "Save" (Guardar). Cómo cambiar el icono de una aplicación Puedes personalizar el icon/logo de tu aplicación mientras la página está en borrador. Haz clic en el botón "Upload" y sube una imagen en alguno de los formatos indicados: Envío de la aplicación para aprobación Una vez que hayas cumplimentado toda la información de tu aplicación, puedes enviar el borrador para su aprobación. Aparecerán unas preguntas sobre la primera versión y las notas de la versión. Complétalas y haz clic en "Send" (Enviar). ¡Y ya está! Ahora tienes que esperar la aprobación por email del equipo de Open Exchange y verás tu aplicación publicada en la Galería de aplicaciones. A partir de ahora Una vez que tu aplicación esté publicada, puedes enviar nuevas versiones. Aquí se explica cómo. Si quieres cambiar la descripción de la aplicación, puedes editarla, hacer los cambios y tendrás que enviarlos para su aprobación. Aquí se explica cómo.
Artículo
Jose-Tomas Salvador · 27 nov, 2019

Pistas para entender, y lidiar con, la persistencia en Docker for Windows

¡Hola a todos! Como seguramente ya sabréis, ya está disponible en Docker Hub una versión totalmente gratuita de InterSystems IRIS for Health (I4H). Se trata de la versión Community y, como digo, es totalmente gratuita y funcional. Ya se ha hablado de ella en algunos artículos y posts,... así que hoy no va de eso. Aquí vamos a ver el "misterioso caso de la desaparición o, mejor, ausencia de mis datos persistentes cuando arranco el contenedor con la opción durable" (no he encontrado la fuente de letra terrorífica para darle más suspense... el editor de posts da para lo que da ) . Bien, pues si seguimos las instrucciones de instalación que encontramos en Docker Hub para una utilización básica de la imagen, veremos que hay un apartado titulado "Start an InterSystems IRIS container with persistent instance-specific storage", donde se nos indica el comando de Docker que tenemos que ejecutar para que nuestro contenedor mantenga las bases de datos, directorios y archivos relevantes del sistema (y por tanto toda la configuración de seguridad, etc..), en nuestro host, permitiéndonos igualmente tener una ubicación para otras bases de datos que quisiésemos crear y mantener aún cuando decidiéramos destruir el contenedor. En concreto, el comando es: docker run --name my-iris -d --publish 9091:51773 --publish 9092:52773 `--volume /home/user1:/durable `--env ISC_DATA_DIRECTORY=/durable/iris store/intersystems/iris-community:2019.4.0.379.0 Si ejecutamos este comando en nuestra consola de Powershell, veremos que el contenedor arranca sin problemas. Podemos entrar en el portal desde nuestro navegador (utilizando el puerto mapeado) con http://localhost:9092/csp/sys/UtilHome.csp y nos dará acceso a nuestro I4H tras indicar una nueva password (por defecto la pasword es SYS). Pero... ¿dónde están mis datos persistentes?... podéis pensar: "Ah... claro! Le he puesto /home/user1... claro, como esta gente sólo piensa en Linux o Mac y no se acuerda de que el 80% de los sistemas están en Windows puesss... (perdón a los maClinuxeros ... dejad que nos quejemos un poco los que todavía nos gusta Windows ) ... Claro, lo que habrá pasado es que ha dado error y lo ha arrancado por defecto sin mantener un volumen durable ". ¡Error! Se ha arrancado bien, lo ha hecho bien, y tenéis un volumen "durable", sólo que no está donde puede que creyerais. El caso es que Docker for Windows se ejecuta realmente junto con una máquina virtual mobyLinux en Hyper-V. Y es ahí, en el host real (aunque sea virtual..vaya lío, eh?), y no en Windows, dónde realmente tendrás que buscar tu directorio: /home/user1 ; al que está mapeado el directorio /durable del contenedor. En /home/user1 tendrás la copia de tus ficheros de sistema y bases de datos que quieras mantener incluso cuando el contenedor se destruye. Y diréis: "Ya... pero vaya faena... no tengo forma de 'jugar' con esos datos porque no puedo entrar en la máquina virtual que trae Docker"... bueno, sí y no. Igual no puedes entrar con una shell directa, pero sí que podemos acceder al contenido del disco que utiliza la máquina mobyLinux. Para ello, cuando tengas arrancado tu contenedor I4H, abre otra consola PowerShell y ejecuta lo siguiente: docker run --net=host --ipc=host --uts=host --pid=host -it `--security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh Con esto descargareis una imagen de Linux Alpine (si no lo tenéis ya), arrancaréis un contenedor ¡ligado a tu máquina mobyLinux! y entraréis en la shell de Alpine. Una vez allí, al ejecutar un simple ls -l , veréis que hay un directorio /host, y ¡¡et voilá!!, dentro de él habrá un ./home/user1 donde tendréis todo vuestro contenido que queréis mantener. Por supuesto existe la posibilidad de ubicar el /durable en un directorio de vuestro Windows. Si ejecutamos lo mismo pero cambiando el path (para que no haya conflicto de nombre y puertos debemos parar antes el otro contenedor con docker stop my-iris): docker run --name my-iris -d --publish 9091:51773 --publish 9092:52773 `--volume c:/Temp/Data:/durable `--env ISC_DATA_DIRECTORY=/durable/iris store/intersystems/iris-community:2019.4.0.379.0 Comprobaremos que, si existe en nuestro Windows el directorio c:/Temp/Data, se habrán copiado archivos y BDs de sistema de I4H en ese directorio y, por tanto, serán accesibles desde Windows. ¡Precaución! El problema que nos podemos encontrar aquí es con los permisos de los directorios y ficheros. Es un problema común cuando se habla de persistencia y contenedores Linux en Windows, no sólo de I4H, y viene derivado del hecho de que la tecnología de contenedores viene básicamente del mundo Linux, de ahí que se necesite la máquina virtual mobyLinux, y de que no hay una equivalencia exacta entre el sistema de permisos de Windows y el de Linux... De hecho, si volvéis a entrar en la shell de Alpine, veréis que tambíén tenéis acceso a vuestro host Windows desde mobyLinux. Ejecutad lo siguiente: cd /host/host_mnt/c/Temp/Data/iris y estaréis, desde Alpine->MobyLinux, viendo el contenido de c:/Temp/Data/iris. Si ahí ejecutáis un ls -l, veréis que todos los directorios pertenecen a root y están en el grupo root. Si ahora ejecutáis en la shell de Alpine: cd /host/home/user1/iris y después ls -l, veréis que aparecen usuarios y grupos (no definidos) con uid 52773 (irisuser) y gid 51773 (irisowner) respectivamente. Este tema de los permisos puede darnos conflictos cuando usamos imágenes con SO base Linux con Docker for Windows... ya digo, no es exclusivo de I4H y tiene que ver con la no equivalencia entre usuarios/permisos en Linux y en Windows. Conviene tenerlo en cuenta para evitar quebraderos de cabeza. IMPORTANTE: Docker resetea el directorio /home de la máquina virtual mobyLinux cada vez que se reinicia, por lo que si rearrancamos el ordenador o simplemente paramos e iniciamos Docker, veremos que todo el contenido de nuestro /home/user1 ha desaparecido. Para preservarlo, puedes almacenarlo en el mismo sitio en que él almacena los volumenes: /var/lib/docker/volumes; que, si entramos con nuestra "shell mágica", estaría en /host/var/lib/docker/volumes.Así, podríamos arrancar el contenedor de este modo:docker run --name my-iris -d --publish 9091:51773 --publish 9092:52773 --volume /var/lib/docker/volumes/user1:/durable --env ISC_DATA_DIRECTORY=/durable/iris store/intersystems/iris-community:2019.4.0.379.0y así nos aseguraríamos de que nuestra información persistente sigue ahí, no sólo aunque destruyamos nuestro contenedor, sino incluso tras reiniciar Docker for Windows (ojo, si reinstalamos Docker ya sí que perderíamos todo). Bueno, espero que os haya servido. ¡¡Disfrutad!!
Artículo
Alberto Fuentes · 9 dic, 2021

Codespaces de GitHub con IRIS

¡Hola a todos! Comparto hoy con vosotros un artículo muy interesante de [Dmitry Maslennikov](https://community.intersystems.com/user/dmitry-maslennikov-5) acerca de una nueva funcionalidad de GitHub llamada [GitHub Codespaces](https://github.com/features/codespaces). Permite ejecutar VSCode en el navegador, con casi la misma potencia con la que se ejecutaría de forma local en tu equipo, pero con la potencia de la nube, por lo que podrás elegir el tipo de equipo con hasta 32 núcleos de CPU y 64 GB de RAM. ![](/sites/default/files/inline/images/images/image(2535).png) Parece impresionante, ¿verdad? Pero, ¿cómo nos podría ayudar a trabajar con proyectos realizados con InterSystems IRIS? Vamos a ver cómo configurarlo. ### Un inicio sencillo para cualquier repositorio Con esta funcionalidad, podrás editar cualquier repositorio en la nube, mediante el botón Code. Ten en cuenta que esta función aún está en fase beta, y podría no estar disponible para todos, y después del periodo beta solo estará disponible para cuentas de pago. ![](/sites/default/files/inline/images/images/image(2537).png) Así que este repositorio no se ha preparado especialmente para Codespaces, solo para VSCode. Haz clic en el botón *New codespace*, para crear un entorno solo para ti. ![](/sites/default/files/inline/images/images/image(2538).png) En mi caso, en el uso anterior de codespaces, ya había instalado la extensión ObjectScript y la había habilitado de forma global mediante línea de comando desde Codespaces. Por lo tanto, me lo instala cada vez, y el código ObjectScript ya se resaltó. Pero IRIS aún no está disponible. Empecemos con docker-compose. ![](/sites/default/files/inline/images/images/image(2539).png) Después de eso, ahora podremos conectarnos al terminal de IRIS, y compilar el código ![](/sites/default/files/inline/images/images/image(2540).png)![](/sites/default/files/inline/images/images/image(2541).png) Los puertos de docker-compose se reconocen automáticamente y se pueden abrir en el navegador, por lo que también es posible abrir el Portal de Administración del Sistema ![](/sites/default/files/inline/images/images/image(2543).png) ### Uso con repositorio preparado Logramos ejecutar VSCode e IRIS en la nube, pero tuvimos que hacer algunas cosas manualmente para que estuviera listo. Pero también es posible hacer que tu repositorio esté listo para el desarrollo desde el inicio. Esto es posible, con [devcontainer.json](https://docs.github.com/en/codespaces/customizing-your-codespace/configuring-codespaces-for-your-project). Mostraré un ejemplo basado en el proyecto [Realworld](https://github.com/daimor/realworld-intersystems-iris). Este proyecto es bastante complejo, tiene un backend y un frontend y utiliza docker-compose para empezar todo a la vez.  devcontainer también puede utilizar docker-compose, así que mi configuración es algo así: {   "name": "IRIS RealWorld example",   "dockerComposeFile": "docker-compose.yml",   "service": "server",   "extensions": [     "intersystems-community.vscode-objectscript"   ],   "forwardPorts": [     80,     52773   ],   "workspaceFolder": "/home/irisowner/conduit",   "remoteUser": "irisowner",   "postCreateCommand": "iris start iris",   "settings": {     "terminal.integrated.defaultProfile.linux": "bash",     "terminal.integrated.profiles.linux": {       "bash": {         "path": "bash",         "icon": "terminal-bash"       },       "iris": {         "path": "iris",         "args": ["session", "iris"]       }     },     "intersystems.servers": {       "/ignore": true     },     "objectscript.ignoreInstallServerManager": true,     "objectscript.ignoreInstallLanguageServer": true,     "objectscript.conn": {       "active": true,       "host": "localhost",       "port": 52773,       "ns": "CONDUIT",       "username": "demo",       "password": "demo",       "links": {         "Conduit APP": "http://localhost:80/",         "Conduit API": "http://${host}:${port}/conduit/"       }     }   } } Hay varias cosas configuradas: * La ruta a docker-compose.yml personalizado, en especial para Codespaces * El nombre para el servicio principal, donde está el desarrollo  * La lista de extensiones instaladas por defecto en VSCode * Los puertos que se deben publicar, en este caso, el puerto del servidor web para IRIS y para el frontend * La ruta al directorio de trabajo * El usuario dentro del contenedor, como estamos entrando en el contenedor de IRIS, necesitamos el usuario irisowner  * En docker-compose nuestro contenedor IRIS se configuró para no utilizar el entrypoint iris-main de forma predeterminada, sino simplemente suspenderlo con Infinity, y después de iniciar el entorno, debemos iniciar nuestro IRIS * Y por último, la configuración de VSCode, también se puede ajustar aquí, es el nivel de configuración del equipo. Que por supuesto se puede anular o añadir con .vscode/settings.json Poner en marcha Codespaces para dicho repositorio llevará un poco más de tiempo, ya que necesitará crear todos los contenedores necesarios e iniciarlos. GitHub afirma que será posible preconfigurar dichas imágenes después de realizar cualquier actualización en el repositorio, por lo que el inicio será más rápido. ![](/sites/default/files/inline/images/images/image(2544).png) Cuando comience, no se necesitarán más acciones, estará listo para el desarrollo ![](/sites/default/files/inline/images/images/image(2545).png) Este proyecto tiene una opción para probar la API REST con pruebas preparadas de Postman, así que he instalado npm y newman dentro del contenedor de backend con IRIS. Es posible realizar estas pruebas allí. Todo fue aprobado, bien hecho. ![](/sites/default/files/inline/images/images/image(2546).png) La parte del frontend está disponible ![](/sites/default/files/inline/images/images/image(2547).png) GitHub también permite conectar a Codespaces desde el VSCode local. Cuando se pulsa el área verde en la esquina de Codespaces, se puede elegir abrir en VS Code (deberá estar instalada la extensión GitHub Codespaces) ![](/sites/default/files/inline/images/images/image(2548).png) Y aquí está, el mismo proyecto, abierto con tu VSCode local, pero que se ejecuta en la nube, como se puede ver el resultado de ifconfig, no estoy en Singapur en este momento :) ![](/sites/default/files/inline/images/images/image(2549).png) ### En el navegador pero sin los Codespaces de GitHub Qué pasa si no tienes acceso a la funcionalidad de Codespaces o no quieres usarla de esta manera, pero aun así te gustaría probar VSCode en el navegador. Bien, es posible con otro proyecto [code-server](https://github.com/cdr/code-server) Basta con ejecutar este VSCode con este comando `docker run -it -p 8080:8080 codercom/code-server --auth=none` Se ejecutará la versión predeterminada de VSCode, sin carpetas mapeadas en su interior. Simplemente organiza cualquier carpeta, y establécela como el directorio de trabajo workdir y la verás en su interior.  ``docker run -it -p 8080:8080 -v `pwd`:/opt/realworld -w /opt/realworld codercom/code-server --auth=none`` ![](/sites/default/files/inline/images/images/image(2550).png) Es el VSCode predeterminado, sin la extensión instalada de ObjectScript. Tiene una limitación en cuanto a las extensiones, no tiene acceso al *marketplace* original de VSCode, sino que utiliza otro sitio, open-vsx.org, y la extensión principal de ObjectScript también está [disponible](https://open-vsx.org/extension/intersystems-community/vscode-objectscript) allí. Con un Dockerfile como este podríamos hacer nuestro propio Code Server, con cualquier cosa instalada allí, así como algunas extensiones ya instaladas FROM codercom/code-server USER root RUN curl -fsSL https://deb.nodesource.com/setup_15.x | bash - && \     apt-get install -y jq nodejs python3-pip python3-dev unixodbc-dev && \     rm -rf /var/lib/apt/lists/* && \     pip3 install pyodbc && \     npm install -g yarn && \   sudo chown -R 1000:1000 /home/coder COPY extensions extensions COPY settings.json /root/.local/share/code-server/User/settings.json ENV SERVICE_URL=https://open-vsx.org/vscode/gallery ENV ITEM_URL=https://open-vsx.org/vscode/item RUN \   code-server --install-extension ms-python.python && \   code-server --install-extension intersystems-community.vscode-objectscript && \   find extensions -type f -exec code-server --install-extension {} \; WORKDIR /opt/intersystems CMD [ "--auth=none", "--disable-telemetry" ] Puedes definir algunos ajustes predeterminados settings.json para el nivel de usuario y si algunas extensiones que necesita no están disponibles en open-vsx, descárgalas manualmente, colócalas en la carpeta de extensiones junto a Dockerfile, y también las tendrá instaladas. Ahora puedes ejecutar el nuevo code-server con todas las extensiones instaladas que necesites docker run -it -p 8080:8080 -v `pwd`:/opt/realworld -w /opt/realworld <strong>caretdev/code-server</strong> --auth=none Además, ya hay una sintaxis resaltada, lo único que falta es ejecutar el propio IRIS. Esto se puede hacer con docker-compose ampliado, donde el code-server será como un servicio más junto a IRIS ![](/sites/default/files/inline/images/images/image(2551).png)   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
Alberto Fuentes · 20 ene, 2023

Tutorial de IntegratedML

La funcionalidad IntegratedML de InterSystems IRIS se utiliza para obtener predicciones y probabilidades mediante el uso de la técnica AutoML. AutoML es una tecnología de Machine Learning utilizada para seleccionar el mejor algoritmo/modelo de Machine Learning para predecir el estado, los números y los resultados generales basados en los datos pasados (datos utilizados para entrenar el modelo AutoML). No necesitas un científico de datos, porque AutoML probará los algoritmos de Machine Learning más comunes y seleccionará el mejor algoritmo para ti, basado en las características de los datos analizados. InterSystems IRIS incorpora un motor AutoML, pero también permite utilizar H2O y DataRobot. En este artículo mostraré los pasos para utilizar el motor AutoML de InterSystems. Paso 1 - Descargar la aplicación de muestra para hacer los ejercicios 1. Ve a https://openexchange.intersystems.com/package/Health-Dataset 2. Clonar/git pull el repositorio en cualquier directorio local $ git clone https://github.com/yurimarx/automl-heart.git 3. Abrir un terminal de Docker en este directorio y ejecutar: $ docker-compose build 4. Ejecutar el contenedor de IRIS: $ docker-compose up -d Paso 2 - Comprender el escenario y los datos El escenario consiste en predecir, a partir de datos previos, las enfermedades cardíacas. Los datos disponibles para hacerlo, son: SELECT age, bp, chestPainType, cholesterol, ekgResults, exerciseAngina, fbsOver120, heartDisease, maxHr, numberOfVesselsFluro, sex, slopeOfSt, stDepression, thallium FROM dc_data_health.HeartDisease El diccionario de datos de la tabla HeartDisease es (fuente: https://data.world/informatics-edu/heart-disease-prediction/workspace/data-dictionary): Nombre de la columna Tipo Descripción age Número entero En años sex Número entero (1 = hombre; 0 = mujer) chestPainType Número entero Valor 1: Angina típica -- Valor 2: Angina atípica -- Valor 3: Sin dolor de angina -- Valor 4: Asintomático bp Número entero Presión arterial en reposo (en mm Hg al ingresar en el hospital) cholesterol Número entero Colesterol sérico en mg/dl fbsOver120 Número entero (glucosa en sangre en ayunas > 120 mg/dl) (1 = verdadero, 0 = falso) ekgResults Número entero Resultados del electrocardiograma de reposo -- Valor 0: normal -- Valor 1: con anormalidad en la onda ST-T (inversiones de la onda T y/o elevación o depresión del ST de > 0,05 mV) -- Valor 2: que muestra hipertrofia ventricular izquierda probable o definida maxHr Número entero Frecuencia cardíaca máxima alcanzada exerciseAngina Número entero Angina inducida por el ejercicio (1 = sí, 0 = no) stDepression Doble Descenso del segmento ST inducida por el ejercicio relacionado al reposo slopeOfSt Número entero La pendiente del segmento ST para el ejercicio máximo -- Valor 1: pendiente ascendente -- Valor 2: plano -- Valor 3: pendiente descendente numberOfVesselsFluro Número entero Número de vasos mayores (de 0 a 3) coloreados por la fluoroscopia thallium Número entero 3 = normal, 6 = defecto fijo, 7 = defecto reversible heartDisease Cadena Valor 0: < 50% de estrechamiento del diámetro -- Valor 1: > 50% de estrechamiento del diámetro heartDisease es la propiedad que tenemos que predecir. Paso 3 - Preparar los datos para el entrenamiento La tabla HeartDisease tiene 270 filas. Tomaremos 250 para entrenar nuestro modelo de predicción. Para ello, crearemos la siguiente vista dentro del Portal de administración > Explorador de sistemas > SQL: CREATE VIEW automl.HeartDiseaseTrainData AS SELECT * FROM dc_data_health.HeartDisease WHERE ID < 251 Paso 4 - Preparar los datos para la validación Tomaremos 20 filas para validar los resultados de la predicción. Para ello, crearemos la siguiente vista dentro del Portal de administración > Explorador de sistemas > SQL: CREATE VIEW automl.HeartDiseaseTestData AS SELECT * FROM dc_data_health.HeartDisease WHERE ID > 250 Paso 5 - Crear el modelo de AutoML para predecir las enfermedades cardíacas IntegratedML permite crear un modelo de AutoML para hacer predicciones y probabilidades (más información en ). Para ello, crearemos el siguiente modelo dentro de Portal de administración > Explorador de sistemas > SQL: CREATE MODEL HeartDiseaseModel PREDICTING (heartDisease) FROM automl.HeartDiseaseTrainData El modelo obtendrá los datos del entrenamiento (aprendizaje) de la vista automl.HeartDiseaseTrainData. Paso 6 - Ejecutar el entrenamiento Para hacer esto, ejecutaremos la siguiente instrucción de SQL dentro del Portal de administración > Explorador de sistemas > SQL: TRAIN MODEL HeartDiseaseModel Paso 7 - Validar el modelo de entrenamiento Para validar el modelo que acabamos de entrenar, ejecutaremos la siguiente instrucción de SQL dentro del Portal de administración > Explorador de sistemas > SQL: VALIDATE MODEL HeartDiseaseModel FROM automl.HeartDiseaseTestData Validamos el HeartDiseaseModel utilizando datos de prueba extraídos de la vista automl.HeartDiseaseTestData. Paso 8 - Obtener las métricas de validación Para conocer las métricas de validación del proceso de validación, ejecutaremos la siguiente instrucción SQL dentro del Portal de administración > Explorador de sistemas > SQL: SELECT * FROM INFORMATION_SCHEMA_ML_VALIDATION_METRICS Para entender los resultados obtenidos, consulta: [https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GIML_VALIDATEMODEL.](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GIML_VALIDATEMODEL) La documentación de InterSystems IRIS detalla lo siguiente a partir de los resultados de validación: La salida de VALIDATE MODEL es un conjunto de métricas de validación que se puede ver en la tabla INFORMATION_SCHEMA_ML_VALIDATION_METRICS. Para los modelos de regresión, se guardan las siguientes métricas: Varianza R cuadrado Error cuadrático medio Error cuadrático medio de la raíz Para los modelos de clasificación, se guardan las siguientes métricas: Precision — Se calcula dividiendo el número de positivos verdaderos por el número de positivos predichos (suma de positivos verdaderos y falsos positivos). Recall — Se calcula dividiendo el número de positivos verdaderos por el número de positivos reales (suma de positivos verdaderos y falsos negativos). F-Measure — Se calcula mediante la siguiente expresión: F = 2 * (precision * recall) / (precision + recall) Accuracy — Se calcula dividiendo el número de verdaderos positivos y verdaderos negativos por el número total de filas (suma de verdaderos positivos, falsos positivos, verdaderos negativos y falsos negativos) en todo el conjunto de pruebas. Paso 9 - Ejecutar las predicciones con el nuevo modelo de AutoML - ¡el último paso! Para conocer las métricas de validación del proceso de validación, ejecutaremos la siguiente instrucción SQL dentro del Portal de administración > Explorador de sistemas > SQL: SELECT *, PREDICT(HeartDiseaseModel ) AS heartDiseasePrediction FROM automl.HeartDiseaseTestData Compara las columnas heartDisease (valor real) y heartDiseasePrediction (el valor de la predicción) ¡Espero que os resulte útil! Hola Alberto, he intentado seguir el paso a paso, pero ya en el punto 3 del paso 1 me ha fallado con el siguiente error: Global buffer setting requires attention. Auto-selected 25% of total memory.Allocated 726MB shared memory: 495MB global buffers, 80MB routine buffersThis copy of InterSystems IRIS has been licensed for use exclusively by:Community License expired.Copyright (c) 1986-2021 by InterSystems CorporationAny other use is a violation of your license agreement Error: Invalid Community Edition license, may have exceeded core limit. - Shutting down the system : $zu(56,2)= 0Starting IRIS An error was detected during InterSystems IRIS startup.** Startup aborted **The command '/bin/sh -c iris start IRIS && iris session IRIS < /tmp/iris.script && iris stop IRIS quietly' returned a non-zero code: 1ERROR: Service 'iris' failed to build : Build failed Saludos Hola José Manuel, Creo que quizá la imagen que tiene el ejemplo tiene una versión de IRIS Community que ya ha caducado. En el directorio donde lo hayas descargado, modifica el fichero `Dockerfile` ([al comienzo](https://github.com/yurimarx/automl-heart/blob/master/Dockerfile#L2)) y prueba a utilizar por ejemplo esta versión: ``` ARG IMAGE=intersystemsdc/irishealth-ml-community:2022.2.0.368.0-zpm ``` Hola Alberto, He realizado el cambio que indicas y ahora si la imagen se ha levantado de manera correcta, muchas gracias. Pero los siguientes pasos son dentro del portal de administración y el portal me solicita las claves de acceso, he revisado dentro de los archivos pero no he encontrado alguna pista del usuario y password que debo utilizar. Gracias por tu ayuda Hola José Manuel, Prueba con usuario `superuser` y contraseña por defecto del sistema `SYS` Hola Alberto, muchas gracias. Con esas claves he logrado entrar.
Artículo
Jose-Tomas Salvador · 17 mar, 2021

¿Por qué el Portal de Administración no carga las imágenes?

En el Centro de Soporte Internacional (WRC), con frecuencia los clientes plantean preguntas sobre la configuración de un nuevo Web Gateway, en el que el Portal de Administración se carga a medias, pero no muestra imágenes. En este artículo explicaré por qué se produce este error, así como la forma de solucionarlo. Mi explicación se centra en el Web Gateway que enlaza con las instancias de InterSystems IRIS, pero la misma explicación debería aplicar también a la CSP Gateway que enlaza con instancias de Caché. El problema: Acabas de instalar el Web Gateway en un servidor web independiente. Cuando vas a cargar el Portal de Administración, ves que no puede mostrar o cargar imágenes, así: Por qué sucede esto: El problema es que para cargar el Portal de Administración en su totalidad, InterSystems IRIS debe cargar una serie de archivos .js, .css y .png (archivos estáticos). Si estás viendo una página del Portal de administración como la de arriba, no dudes en abrir la applet de Herramientas para Desarrolladores de tu navegador, ir a la pestaña de Red, y confirmar que no se están sirviendo varios componentes de tipo .js, .css, y .png: Cuando se instala inicialmente la la Web Gateway, configuramos los mapeos solo para las siguientes extensiones: .csp .cls .zen .cxw Estos son los tipos de extensiones de archivo que los clientes van a utilizar con más frecuencia para sus propias aplicaciones personalizadas, además de la extensión .cxw que se utiliza para mostrar el Portal de administración de la Web Gateway. Si quieres cargar los componentes adicionales del Portal de Administración, tendrás que registrar tipos de archivo adicionales para que sean servidos por el Web Gateway. Cómo solucionar el problema: Para que el Portal de Administración se muestre completamente, debes configurar la Web Gateway para que sirva tipos de archivos adicionales. En el caso de IIS, se pueden añadir mapeos individuales para las extensiones .js, .png, .css, etc., o se puede agregar un mapeo genérico (wildcard mapping). La documentación para el Registro de tipos de archivos adicionales para IIS se puede encontrar aquí: https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GCGI_win#GCGI_registering Si estás ejecutando el Web Gateway sobre Apache en un sistema Unix/Linux, tienes un par de opciones. Puedes configurar esto añadiendo extensiones de archivo adicionales, como es el caso de IIS, o puedes añadir una directiva de localización CSP. Consulta esta documentación para obtener más detalles: https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GCGI_ux, en el "Registro de tipos de archivos adicionales con CSP"
Pregunta
Mathew Lambert · 16 jun, 2020

Callback de resultado CRUD para clases persistentes

Me gustaría saber si hay alguna forma de tener un callback o similar para clases persistentes, que se ejecute siempre después de la operacion (ya sea que falle o que vaya bien) %OnOpen se ejecuta antes de la accion y no hay callback de after. %OnAfterDelete y %OnAfterSave se ejecutan solo después de una operación satisfactoria. Hola Mathew, Siempre se puede hacer una clase que herede de %Persistent y que exponga los métodos que quieras para guardar por ejemplo. Internamente allí puedes crear tu Callback y luego llamar al %Save. Algo así como: Class MiPersistente Extends %Persistent { Method OnGuardar() { } Method Guardar() { ..OnGuardar() ..%Save() } } Luego en lugar de heredar de %Persistent heredas de esta clase y sobre escribes el Callback. No lo he probado pero es una alternativa a investigar Gracias Ya pero esto tiene dos problemas, el %Save es diferente para cada clase (es code generator) por llo que no es lo mismo hacer un save de mi clase que de esta "super", por otro lado, me gustaría evitar tener que modificar >17k llamadas a %Save Buscar/Reemplazar todo 17 mil veces... ¿qué puede salir mal? Como parece que no hay nada que pueda solucionar esto ahora mismo, vamos a hablar con InterSystems. Creo que puede ser interesante.