Buscar

Limpiar filtro
Artículo
Jose-Tomas Salvador · 13 ene, 2021

Por qué migrar de Caché a IRIS: Propuesta de valor

Algunos clientes me preguntan sobre la migración de Caché a IRIS. ¿Por qué migrar a IRIS? Caché es excelente, estable y ofrece un buen rendimiento... Estos clientes tienen razón pero, en los últimos años, la transformación digital requiere soluciones más completas para adaptarse a las nuevas necesidades. E InterSystems fue visionaria en entenderlo y por ello lanzó IRIS al mercado.InterSystems IRIS es una plataforma de datos lista para el reto de la transformación digital. Y para demostrarlo, he creado una Propuesta de Valor ("Value Canvas"). Las Propuestas de Valor son una herramienta perfecta para mostrar en unos pocos minutos el valor del cambio. Si queréis crear una Propuesta de Valor nueva para este tema o para cualquier otro, podéis descargar la versión en PowerPoint aquí: https://github.com/yurimarx/valuecanvas/blob/master/valuecanvasiris.pptx?raw=true Espero que os resulte útil.
Artículo
Jose-Tomas Salvador · 11 mayo, 2022

Cómo añadir VSCode a tu contenedor IRIS

Una de las formas más sencillas de configurar entornos de desarrollo repetibles es utilizar contenedores para ellos. Descubrí que cuando cambian rápidamente, era muy conveniente alojar una instancia de vscode dentro de mi contenedor de desarrollo. De este modo, he creado un script de contenedor sencillo que permite añadir en un contenedor IRIS un vscode basado en un navegador. Esto debería funcionar para la mayoría de los contenedores 2021.1 y posteriores. [El repositorio de mi código se puede encontrar aquí](https://github.com/nickmitchko/Hosting-vscode-in-a-container) > El contenedor de InterSystems IRIS con vscode y pre-conectado | Cred | Value | |--------------|:--------:| | User | _SYSTEM | | Password | SYS | ![image](/sites/default/files/inline/images/hostedvscodebanner.gif) ## Visión general Este proyecto crea un contenedor IRIS con una versión servidor (basada en web) de vscode disponible en el mismo contenedor IRIS. Esto ofrece: * Edición del código en el mismo contenedor * Pre-conexión a la instancia del contenedor de IRIS * Enlaces desde el Management Portal * Arranque automático del IDE con el contenedor # Inicio rápido 1. [Descarga](https://github.com/nickmitchko/Hosting-vscode-in-a-container/archive/refs/heads/master.zip) o `git clone https://github.com/nickmitchko/Hosting-vscode-in-a-container.git` 2. En la raíz del proyecto, ejecuta `docker build . -t vscode-irishealth-ml:latest --no-cache` 3. Ejecuta `docker-compose up` * No usas docker compose? Echa un vistazo [aquí](#No-Docker-Compose) 4. Ve al [Management Portal](http://localhost:52773/csp/sys/%25CSP.Portal.Home.zen) 5. Inicia sesión con el usuario y contraseña mostrada anteriormente 6. Haz clic en el enlace a VSCODE en el panel Favoritos 7. Cuando te pregunte, utiliza la misma contraseña en vscode para conectar con la instancia de IRIS. ```bash # New folder for project mkdir vscode-iris cd vscode-iris # Clone repo here git clone https://github.com/nickmitchko/Hosting-vscode-in-a-container.git . # Build image docker build . -t vscode-irishealth-ml:latest --no-cache # Only Run (A) or (B) # # (A) Run compose file docker-compose up # OR (B) if you want a daemon docker-compose up -d ``` ## Añadiendo Persistencia Si quieres una instancia de IRIS persistente, descomenta las lineas 16 a 20 en el fichero docker-compose.yml. Esto monta un volumen de almacenamiento persistente al contenedor. ```yml volumes: - "./durable/:/durable/" environment: - ISC_DATA_DIRECTORY=/durable/iconfig ``` ## Cambiando la imagen de base Esta imagen se construye sobre las imágenes zpm de la Comunidad de Desarrolladores de InterSystems ([las puedes encontrar aquí](https://hub.docker.com/r/intersystemsdc/iris-community/tags)). Estas imágenes incluyen el comando zpm que nos permite instalar fácilmente desde el repositorio, pero solo tiene una licencia "community" de 90 días. La etiqueta de imagen usada para builds es: ```dockerfile FROM intersystemsdc/irishealth-ml-community:latest ``` Si quieres cambiar la imagen, cambia la primera línea del archivo docker a tu etiqueta de imagen deseada (o una instancia de IRIS modificada o [una oficialmente soportada](https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls?KEY=PAGE_containerregistry#PAGE_containerregistry_public)). Por ejemplo: ```dockerfile FROM containers.intersystems.com/intersystems/irishealth-community:2021.2.0.651.0 ``` # Sin Docker-Compose Si no usas docker compose, aún puedes ejecutar el contenedor así: ```bash # After building the container # --after command is required docker run --name vscode -d \ --publish 1972:1972 \ --publish 52773:52773 \ --publish 51773:51773 \ --publish 53773:53773 \ --publish 8080:8080 \ --publish 8888:8888 \ vscode-irishealth-ml:latest \ --after "/bin/bash /install/boot.sh" ``` 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 · 25 mayo, 2020

¡Cumplimos 1 año!

¡La Comunidad de Desarrolladores de InterSystems en español cumple un año! 🎉🎉Y para celebrarlo con todos vosotros, hemos preparado un SORTEO. 🎁 El premio son 2 tarjetas regalo de Amazon valoradas en 50€ cada una, solo para miembros registrados en la Comunidad. Los empleados de InterSystems no podrán participar en el sorteo. Para participar, debéis: ➡️ Buscar cual es la "APP de la semana" en la Comunidad de Desarrolladores.➡️ Poner la respuesta en un comentario a esta publicación.➡️ Decirnos qué amigo desarrollador se llevará la otra tarjeta. Además... 🎁 Habrá más premios sorpresa para las primeras personas que respondan correctamente. 🗓️ Podéis participar hasta el domingo 31 de mayo a las 24h. 🍀 El lunes 1 de junio haremos el sorteo e informaremos de los ganadores. ¡Muchísimas gracias por seguirnos y usar la Comunidad durante este año! Esperamos seguir cumpliendo juntos muchos años más! 🎊 La app de la semana es: Native Api Contest Template. Y la tarjeta sería para Jorge Prieto La App es: Native Api Contest Template Nota: El 28/05/2020 ha cambiado de app y ahora es IRIS OData Client Y la otra tarjeta, se la regalo a @Félix.deFederico Esther no lo ha dicho pero los empleados de InterSystems lamentablemente no podemos participar... No te preocupes, que si me toca te compro un libro en Amazon Cierto, David. Ya he añadido esa restricción en el anuncio. Gracias La App es de la semana Native Api Contest Templat La otra tarjeta para @Perla.Escarcega Participando 🎊 La app de la semana es: Native Api Contest Template. La tarjeta de regalo sería para Gaspar Sepulveda, nuestro amigo desarrollador de eHealth Care!👩🏼‍🔬 La App es de la semana Native Api Contest Template La otra tarjeta para @Carlos.CollazoFernández La App es: Native Api Contest Template Y la otra tarjeta, es para @Carlos.CollazoFernández La App es: Native Api Contest Template Y la otra tarjeta es para: Jacobo Rios Bordas Hola a todos La app de la semana es: IRIS OData Client , o eso me aparece a mi arriba a la derecha 😉 La otra tarjeta seria para @Joan-Baptista.Fabregas Muy buena iniciativa sobre todo si nos toca a nosotros ¡Felicidades a todos! Gracias por las excelentes traducciones de mis artículos. Y espero tus votos en el Contest OpenExchange Y la tarjeta sería para @Francisco.López1549 La app de la semana es: Native Api Contest Template. Y la tarjeta sería para Ivan Ruiz Gomez Hola a todos, la app de la semana es IRIS ODATA CLIENT y la otra tarjeta sería para @Salvador Rigau Arespacochaga. Saludos! Hola a todos, la app de la semana es IRIS ODATA CLIENT y la otra tarjeta sería para @Javier Lorenzo Mesa La app de la semana es: Native Api Contest Template. La otra tarjeta es para Elena Gutiérrez @Elena Gutiérrez La app de la semana es: Native Api Contest Template. Y la tarjeta sería para @Lorenzo Contador La app de la semana es IRIS ODATA CLIENT y la otra tarjeta sería para @Miguel Leganes La app de la semana es IRIS ODATA CLIENT y la tarjeta otra es para @Josefa Borrego
Anuncio
Esther Sanchez · 23 dic, 2020

Cómo conseguir puntos en Global Masters

¡Hola Comunidad! Global Masters, el Programa de Fidelización de InterSystems, está estrechamente relacionado con la Comunidad de Desarrolladores - cualquier contribución que se realice en la Comunidad, da puntos en Global Masters. Por eso, hemos elaborado una guía sobre cómo obtener puntos en Global Masters: CÓMO CONSEGUIR PUNTOS EN GLOBAL MASTERS Escribir una publicación en la CD en inglésEscribir una publicación en la CD en español 200400 Primer comentario en cualquier Comunidad de Desarrolladores (*)Cada comenterio posterior en la CD en inglésCada comentario posterior en la CD en español 3003060 Primera respuesta que te marquen como "Respuesta aceptada"Cada respuesta posterior marcada como "Aceptada"5 / 10 / 25 / 50 respuestas marcadas como "Aceptadas" 1 0001504 000 / 8 000 / 20 000 / 40 000 Traducir un artículo / una pregunta publicados en la CD 150 / 30 Publicar 1 / 5 / 10 / 25 / 50 artículos en la CD 1 500 / 7 500 / 15 000 / 40 000 / 75 000 Hacer 1 / 5 / 10 / 25 / 50 preguntas en la CD 500 / 2 000 / 5 000 / 15 000 / 30 000 Cada aplicación publicada en Open ExchangePor cada aplicación ZPM, puntos extraPublicar 1 / 5 / 10 / 25 aplicaciones en Open Exchange 8004001 000 / 10 000 / 25 000 / 75 000 Hacer publicaciones que tengan más de 750 / 2000 / 5000 / 15 000 visualizaciones 600 / 2 500 / 7 000 / 20 000 Leer un artículo publicado en la CDVer un vídeo publicado en la CDCompartir un artículo / vídeo en redes sociales 102040 Escribir 1 / 2 / 3 / 4 / 5 artículos etiquetados como "Mejores prácticas" 1 000 / 3 000 / 7 000 / 10 000 / 15 000 Conseguir 50 / 100 / 250 / 500 / 1 000 descargas de tu aplicación en Open Exchange 2 500 / 5 000 / 7 500 / 12 500 / 25 000 Hacer una reseña para InterSystems / sus productos 2 000 - 3 000 Invitar a colegas a la CD 600 Hacer un vídeo sobre tu aplicación publicada en OE 3 000 (*) solo cuentan los comentarios hechos después de registrarse en Global Masters. Completa los retos, gana insignias y sube en los niveles: Insider > Advocate > Specialist > Expert > VIP. ¡Cuanto mayor sea tu nivel, podrás optar a mejores premios! Además... consulta la información adicional sobre Global Masters: Cómo unirse a Global Masters Descripción de las Insignias de Global Masters Descripción de los Niveles de Global Masters Cambios en Global Masters Si aún no perteneces al Programa de Fidelización de InterSystems, ¡te puedes dar de alta ahora mismo! Si tienes alguna duda, puedes dejarnos un comentario en esta publicación y te responderemos al momento.
Artículo
Esther Sanchez · 6 jun, 2023

Global Summit 2023, primeros dos días

¡Hola Comunidad! Estoy segura de que a muchos de vosotros os hubiera encantado asistir al Global Summit 2023, pero no habéis podido por una razón u otra. Por eso haré un resumen de cada día aquí en Florida, empezando por el domingo y el lunes. Aunque la ceremonia de inauguración oficial no era hasta el domingo por la tarde, había muchas actividades interesantes antes del inicio de la Convención. Algunas de las más destacadas, especialmente para los aficionados a los deportes, fueron los torneos de golf y de fútbol. No puedo comentar nada del fútbol porque no estuve allí, aunque me contaron que fue muy interesante. Y si alguno de vosotros estuvo en el torneo, podéis contarnos vuestra experiencia y/o añadir fotos en los comentarios!). Yo os puedo hablar del torneo de golf 😊 Empezó a las 6 (!) de la mañana y continuó hasta las 2 de la tarde. Al principio, el cielo estaba nublado e incluso llovió un rato. Pero un par de horas después, el sol apareció y hasta hizo falta usar el protector solar. Para hacerlo incluso más interesante, la fauna local decidió salir a jugar también. Después de anunciar los ganadores de cada torneo y comer, volvimos al hotel para asistir a otros eventos. Por ejemplo, por la tarde hubo un evento para mujeres. Lo que nos llevó a la actividad principal del domingo - ¡la recepción de bienvenida! Fue el mejor momento para reencontrarse con caras conocidas y volver a hablar con colegas y amigos. Por ejemplo, estuve con @Muhammad.Waseem y @Dmitry.Maslennikov, moderadores de la Comunidad en inglés: Y con @Lorenzo.Scalese, @Dmitry.Maslennikov y @Guillaume.Rongier7183, de la Comunidad en francés: Y esto fue todo el día "previo". ¡Lo más importante empezaba el lunes! El Presidente de InterSystems, Terry Ragon, inauguró el Global Summit 2023. En su discurso, recordó a todos que cualquier empresa de éxito tiene que innovar para seguir siendo relevante. ¡E InterSystems es una de esas empresas! Además, felicitó a todos por el 45 aniversario de InterSystems y el 30 aniversario de los Global Summits! ¿No es increíble? No sé vosotros, pero yo ni había nacido cuando se fundó la empresa! Tras el discurso inaugural, las primeras ponencias estaban dedicadas a la atención sanitaria. @Donald.Woodlock, entre otras cosas, habló sobre IA y cómo puede acercar a los desarrolladores a los clientes y no al revés. Después de la comida, todos nos dispersamos en diferentes sesiones, charlas, reuniones etc. Yo volví al stand de la Comunidad de Desarrolladores en el "Tech Exchange". Si estás en el Global Summit, no te olvides de pasarte por aquí - te daré encantada algún regalito. Y si conoces a alguien que aún no pertenece a la Comunidad, anímale a venir y a recoger su regalo 😉 Estar en el stand de la Comunidad me ha permitido conocer a mucha gente nueva y encontrarme con otros moderadores que se han pasado por aquí, como @Guillaume.Rongier7183 y @Dmitry.Maslennikov @Lorenzo.Scalese, @Dmitry.Maslennikov y @Francisco.López1549 Si estás interesado en la presentación que se proyecta detrás de nosotros, es esta: Además, estar en el área "Tech Exchange" significa que puedo asistir a todas las presentaciones que se hacen allí. Puedo aprender de contenedores, por ejemplo 😉 Y tras este ajetreado día, nos dirigimos a la cena y las demos. Jugamos a algunos juegos y lo pasamos muy bien. Y esto ha sido todo durante los dos primeros días del Global Summit 2023. ¡Estad atentos a las próximas crónicas! 😁
Pregunta
Ignacio Valdes · 1 dic, 2019

Poner port a docker container?

Cuando impiezo una google cloud docker container la port es 52773 pero quiero tener port 9100 9101 tambien. Yo veo en documentos que no es posible cambiarlo ante que esta andado. Que hago? -- IV Los puertos por defecto de IRIS son 52773 (web) y 51773 (tcp superport). Cuando ejecutas el contenedor Docker puedes elegir cómo exponer estos puertos en tu máquina local para que puedas acceder. Por ejemplo, si quieres utilizar los puertos 9100 y 9101 que comentas puedes hacer: docker run --name iris -p 9100:52773 -p 9101:51773 store/intersystems/iris-community:2019.4.0.379.0 De esa forma, tendrías disponible el Portal de Gestión en http://localhost:9100/csp/sys/UtilHome.csp Puedes echar un vistazo a la documentación o al Container Bootcamp que se hizo para el Global Summit.
Anuncio
Esther Sanchez · 31 mar, 2022

Nuevo vídeo: Python Embebido

¡Hola Comunidad! Hemos grabado el webinar que hicimos ayer y lo hemos subido al canal de YouTube de la Comunidad de Desarrolladores en español. Si os perdisteis el webinar o lo queréis volver a ver con más detalle, ya está disponible la grabación! Eduardo Anglada mostró toda la potencia de Python, el nuevo lenguaje de programación añadido a IRIS. Explicó cómo crear datos anónimos, desarrollar cuadros de mando interactivos... ¡y muchas cosas más! Por eso, si queréis conocer la nueva funcionalidad de InterSystems IRIS, ¡no os perdáis el vídeo! ⏯ Explorando las nuevas funcionalidades de IRIS: Python Embebido Por cierto, en las listas de reproducción del canal de YouTube de la Comunidad de Desarrolladores en español podéis ver todos los webinars que hemos realizado (¡ya llevamos diecisiete!), varios tutoriales, trucos, demos... ¡Echadle un ojo y dadle al play! ▶️
Anuncio
Esther Sanchez · 12 jul, 2021

Webinar en español: "Continuando con ObjectScript - Persistencia e Integración"

¡Hola desarrolladores! Os invitamos a un nuevo webinar en español: "Continuando con ObjectScript - Persistencia e Integración", el lunes 19 de julio, a las 4:00 PM (CEST). En este webinar continuaremos introduciendo ObjectScript, el lenguaje de programación de InterSystems. Trabajaremos con Clases Persistentes y comenzaremos a trabajar con Producciones para integrar sistemas. Es un webinar dirigido a programadores que empiezan a utilizar ObjectScript y también a aquellos que quieren revisar conceptos. Como en el anterior webinar de ObjectScript, haremos una ginkana en directo para demostrar lo aprendido. ¡Y los tres primeros clasificados ganarán varios premios! ¡Os esperamos! ➡️ Podéis registraros aquí >> El próximo lunes es el webinar de ObjectScript. Además de aprender, pasaremos un rato muy divertido jugando a un juego de preguntas y respuestas online sobre lo explicado en el webinar. Competiremos unos contra otros y el podio final mostrará a los ganadores! ¡Apúntate antes de que se te olvide! :D Empieza la cuenta atrás... ¡hoy es el webinar! ¡Os esperamos!
Artículo
Eduardo Anglada · 30 mar, 2022

Cómo utilizar un grupo de contenedores Docker con IRIS, el conjunto de datos Openflights y Apache Zeppelin

¡Hola desarrolladores! Para el concurso de Opendataset he desarrollado una aplicación, en formato docker, que utiliza InterSystems IRIS y Openflights Dataset en un contenedor y un segundo contenedor con Apache Zeppelin. Puedes encontrar los detalles aquí: Con esto, se puede consultar el conjunto de datos de Opendflights desde Apache Zepplin sin necesidad de realizar ninguna configuración. Los contenedores están en hub.docker por lo que se puede utilizar de forma muy sencilla. Si observamos el panel de control de Docker, veremos que hay un grupo llamado **openflights_demo**: ![](/sites/default/files/inline/images/running-container-group.png)   Apache Zeppelin está disponible por medio de: http://localhost:8080 Como puedes ver en la captura de pantalla, el puerto de la base de datos también está expuesto, así que puedes conectar IRIS directamente como te guste. Además, echa un vistazo al súper complejo y sofisticado video de youtube! ;-) Para conectar el sonido, recomiendo un dispositivo Dolby Atmos  ;-)
Artículo
Nancy Martínez · 18 ene, 2023

IRIS y Jupyter - La versión sencilla

En la Comunidad de Desarrolladores hay muchos artículos interesantes que muestran cómo utilizar Jupyter e InterSystems IRIS juntos, y os animo a echarles un vistazo - al final de esta publicación tenéis un enlace a los artículos. Este es otro de esos artículos. La diferencia con los otros está en la sencillez. ¿Solo quieres iniciar un contenedor en el que Jupyter ya está conectado a una instancia de IRIS? ¡Entonces esto es para ti! Solo con ejecutar `docker-compose up` ya podrás acceder a un entorno de trabajo con un par de ejemplos. No quiero estropear la sencillez, así que probadlo. ![login](https://github.com/OneLastTry/iris-jupyter/raw/main/misc/work.png) Más artículos sobre IRIS y Jupyter: * En español: [Artículos sobre IRIS y Jupyter](https://es.community.intersystems.com/smartsearch?search=jupyter&type=articles&sort=0&members=&typesearchuser=users) * En inglés: [Jupyter+IRIS Articles](https://community.intersystems.com/smartsearch?search=jupyter&type=articles&sort=0&members=&typesearchuser=users)
Artículo
Ricardo Paiva · 18 ene, 2023

Validación de documentos XML con Schematron mediante Python

Schematron es un lenguaje de validación basado en reglas para hacer aserciones/afirmaciones sobre la presencia o ausencia de ciertos patrones en documentos XML. Un Schematron se refiere a una colección de una o más reglas que contienen pruebas. Los Schematron están escritos en una forma de XML, lo que los hace relativamente fáciles de inspeccionar, comprender y escribir para todos, incluso los que no son programadores. Esencialmente, un Schematron realiza dos acciones en secuencia: Encuentra nodos de contexto de interés en el documento. Un "nodo de contexto" puede ser un elemento de un tipo particular o un elemento específico en un lugar determinado del documento, un atributo o un valor de atributo. Por ejemplo, supone que quieres verificar si la suma de los elementos <Percent> dentro de cada un nodo contexto es de 100%. En este caso, el nodo de contexto sería el elemento <Total>. Para cada uno de esos nodos de interés, comprueba si una declaración específica es verdadera o falsa. Por ejemplo, puede tener una regla escrita para responder a la pregunta "¿Es la suma total de 100%?". El recurso idóneo para buscar más detalle sobre el tema sería: https://www.schematron.com/. Para nosotros lo que importa es que podamos validar nuestro documento XML en base a una definición Schematron. Para ello hay que tener en cuenta que hay múltiples proyectos open source con implementaciones de Schematron para XSLT. Uno de los más interesantes lo tenéis disponible en https://github.com/schxslt/schxslt.git. En este artículo se pretende apalancar las capacidades de Python disponibles en InterSystems IRIS (for Health) o HealthShare (Health Connect). Para ello necesitamos una instancia de InterSystems IRIS o HealthShare Health Connect. Para nuestro ejemplo usaremos un contenedor con la última community edition de InterSystems IRIS for Health. Hemos de arrancar la instancia publicando las puertas default y mapeando el directorio corriente a la carpeta durable en el container. $ docker run --name iris4health -d --publish 51773:51773 --publish 52773:52773 --volume $(pwd):/durable containers.intersystems.com/intersystems/irishealth-community:2022.3.0.589.0 Ahora que ya tenemos nuestra instancia en ejecución podremos arrancar una consola en el container. $ docker exec -it <containerID> bash Ahora ya nos podemos dedicar al modulo Python. Usaremos lxml. Se trata de un enlace Python para las bibliotecas C libxml2 y libxslt. Es único en el sentido de que combina la velocidad y la integridad de las funciones XML de estas bibliotecas con la simplicidad de una API Python nativa, en su mayoría compatible con la conocida API de ElementTree. Para más información sobre lxml https://lxml.de/index.html Asumiendo que el gestor de paquetes pip3 (y por supuesto Python 3) ya está instalado en la instancia, habrá que instalar el modulo debido. $ pip3 install --target /usr/irissys/mgr/python lxml El método ejemplo que usaremos estará codificado en Python y estará encargado del parseo y validación de las reglas del schematron. El código de la clase que usaremos es el siguiente: Class dc.schematron Extends %RegisteredObject { /// Description ClassMethod simpleTest() [ Language = python ] { from lxml import isoschematron from lxml import etree print("Validating File...\n") # def runsch(rulesFile, xmlFile): #open files rules = open('/durable/test-schema.sch', 'rb') # Schematron schema XMLhere = open('/durable/test-file.xml', 'rb') # XML file to check #Parse schema sct_doc= etree.parse(rules) schematron=isoschematron.Schematron(sct_doc, store_report=True) #Parse XML doc = etree.parse(XMLhere) #Validate against schema validationResult = schematron.validate(doc) report = schematron._validation_report #Check result if validationResult: print("passed") else: print("failed") print(report) } } La verdad es que se trata de un método bastante sencillo. Abre 2 ficheros – el fichero con las reglas (schematron) y un fichero ejemplo. La regla es verificar si la suma de los elementos <Percent> dentro de cada nodo <Total> es de 100%. Para ejecutarlo habrá que lanzar el siguiente comando desde la consola: d ##class(dc.schematron).simpleTest() El resultado se presentará en la consola. La misma lógica se podrá usar en una producción de interoperabilidad. El código fuente conteniendo todos los elementos esta disponible aquí.
Artículo
Ricardo Paiva · 22 abr, 2025

Consideraciones al migrar de Oracle, MSSQL, etc. a IRIS

Migrar desde Oracle, MSSQL u otros sistemas de bases de datos puramente relacionales a un sistema multimodelo como InterSystems IRIS es una decisión estratégica que requiere una planificación y ejecución cuidadosas. Aunque esta transición ofrece beneficios significativos, como un mejor rendimiento, escalabilidad y soporte para arquitecturas modernas, también conlleva desafíos. En este artículo destacaré algunas de las consideraciones relacionadas con la codificación para asegurar una migración exitosa. Dejaré fuera del alcance de este artículo todo lo relacionado con la migración real de estructuras y datos. Primero, cuando estáis considerando migrar a un sistema de base de datos diferente, necesitáis comprender vuestra lógica de negocio, ya sea del lado de la aplicación (servidor de aplicaciones) o del servidor de bases de datos. Básicamente, ¿dónde tenéis vuestras sentencias SQL que potencialmente tendréis que reescribir? Cuando vuestra lógica de aplicación depende en gran medida de SQL ejecutado directamente dentro del código de la aplicación (en lugar de procedimientos almacenados o triggers en la base de datos), migrar desde una base de datos relacional a InterSystems IRIS requiere un examen cuidadoso de vuestras sentencias SQL. Veamos algunos de los factores más importantes que debéis tener en cuenta. Diferencias en el dialecto SQL. SQL de IRIS admite el estándar SQL-92. Esto no significa que no estén implementadas algunas funcionalidades más modernas. Simplemente significa que necesitáis comprobarlo de antemano. Por ejemplo, las funciones de ventana aparecieron en SQL:2003, pero aún así podéis escribirlas en IRIS. --window function select id, rating from (select a.id, r.rating, avg(r.rating) over () as avg_rating from SQLUSER.Actor a join SQLUser.Review r on a.id = r.Reviews) as sub where rating > avg_rating Al mismo tiempo, los nuevos tipos de datos complejos, como XML, JSON, Arrays y tipos de datos geográficos, no están soportados. Así que la siguiente consulta: SELECT a.id, a.firstname, ARRAY_AGG(r.rating) AS ratings FROM SQLUSER.Actor a LEFT JOIN SQLUser.Review r ON a.id = r.Reviews GROUP BY a.firstname devolverá un error: ERROR #5540: SQLCODE: -359 Message: User defined SQL function 'SQLUSER.ARRAY_AGG' does not exist Pero no es el fin del mundo. Hay muchas funciones integradas que os permitirán reescribir las consultas para obtener el resultado esperado. 2. Funciones integradas. Los distintos sistemas de gestión de bases de datos tienen diferentes funciones integradas. Por lo tanto, necesitáis comprender cómo se corresponden con las disponibles en IRIS. Aquí tenéis varios ejemplos de lo que os estoy comentando: funciones usadas en Oracle y sus equivalentes en IRIS. Oracle IRIS NVL ISNULL(field, default_value) substr $extract(field, start_pos, end_pos) instr $find(field, text_to_find) concat {fn CONCAT(string1,string2)} Cuando vuestra lógica SQL principal reside dentro de la base de datos (por ejemplo, procedimientos almacenados, triggers, vistas), migrar a InterSystems IRIS requiere un enfoque diferente. Aquí tenéis algunas consideraciones: Migración de objetos de base de datos Todos los procedimientos almacenados deben reescribirse usando ObjectScript. Esta también puede ser una buena oportunidad para cambiar al modelo orientado a objetos, ya que obtendréis una tabla igualmente al crear una clase. Sin embargo, trabajar con clases os permitirá escribir métodos (que pueden llamarse como procedimientos almacenados) y usar todo el potencial del paradigma orientado a objetos. Los triggers, índices y vistas están todos soportados por IRIS. Incluso podéis dejar las vistas tal como están si las columnas de las tablas se mantienen iguales y no utilizan funciones o sintaxis no soportadas (ved el punto anterior). La migración de definiciones también es importante y puede presentar algunos desafíos. Primero, debéis hacer una correspondencia cuidadosa de los tipos de datos de vuestra base de datos anterior con los de IRIS, especialmente si estáis usando tipos de datos complejos. Además, al tener más flexibilidad con los índices, quizás queráis redefinirlos de forma distinta. Aquí tenéis algunas cosas que debéis considerar al decidir migrar a InterSystems IRIS desde otra base de datos relacional. Es una decisión estratégica que puede desbloquear beneficios significativos, incluyendo una mayor escalabilidad, rendimiento y eficiencia. Sin embargo, una planificación cuidadosa es crucial para asegurar una transición fluida y abordar necesidades de compatibilidad, transformación de datos y refactorización de la aplicación.
Artículo
Ricardo Paiva · 22 mayo, 2020

MonCaché - Caché como parte de MongoDB

¡Hola desarrollador! En este articulo repasaremos una publicación original de Maks Atygaev sobre la Implementación de una API de MongoDB, basada en InterSystems Caché - MonCaché. Descargo de responsabilidad: En este artículo se muestra la opinión personal del autor y no tiene ninguna relación con opinión oficial de InterSystems. Idea La idea del proyecto es implementar las características básicas de la API en MongoDB (v2.4.9) , con la finalidad de buscar, guardar, actualizar y eliminar documentos de una manera que permita el uso de InterSystems Caché, en lugar de MongoDB, sin cambiar el código del lado del cliente. Motivación Probablemente, si tomamos una interfaz basada en MongoDB y utilizamos InterSystems Caché para el almacenamiento de los datos, podríamos ver un aumento en el rendimiento. El proyecto comenzó como un proyecto de investigación durante mis estudios universitarios. Hey, ¡¿por qué no?! ¯\_(ツ)_/¯ Limitaciones En el transcurso de este proyecto de investigación se hicieron algunas simplificaciones: solamente se utilizaron tipos de datos primitivos: nulos, booleanos, numéricos, cadenas de texto, conjuntos, objetos, ObjectId; el código del lado del cliente funciona con MongoDB mediante un controlador de MongoDB el código del lado del cliente utiliza el controlador MongoDB Node.js el código del lado del cliente solamente utiliza las funciones básicas de la API en MongoDB: find, findOne — para buscar los documentos; save, insert — para guardar los documentos; update — para actualizar los documentos; remove — para eliminar los documentos; count — para contar los documentos. Implementación La tarea finalmente se dividió en las siguientes subtareas: recrear la interfaz del controlador MongoDB Node.js para las funciones básicas que se seleccionaron, implementar esta interfaz utilizando InterSystems Caché para el almacenamiento de los datos: diseñar un esquema que represente las bases de datos en Caché, diseñar un esquema que represente a las colecciones en Caché, diseñar un esquema que represente a los documentos en Caché, diseñar un esquema que permita la interacción con Caché mediante Node.js, implementar los esquemas que se diseñaron y probarlos brevemente. :) Detalles sobre la implementación Realizar la primera subtarea no fue complicado, de modo que iré al grano y describiré la parte de la implementación de la interfaz. MongoDB define una base datos como un contenedor físico para las colecciones. Una colección como un conjunto de documentos. Un documento como un conjunto de datos. Un documento es similar a los documentos en JSON, pero permite un mayor número de clases - BSON. En InterSystems Caché todos los datos se almacenan en los globales. Por simplicidad, puede pensarse en ellos como estructuras de datos ordenadas de manera jerárquica. En este proyecto, todos los datos se almacenarán en un único global: ^MonCache. Por lo tanto, necesitamos diseñar un esquema que represente a las bases de datos, colecciones y documentos utilizando estructuras de datos ordenadas de manera jerárquica. Esquema para representar las bases de datos en Caché Para diseñar el global, únicamente implementé uno de entre los muchos diseños posibles, ya que cada diseño tiene diferentes beneficios y limitaciones. En MongoDB puede haber varias bases de datos en una sola instancia, lo cual significa que necesitamos diseñar un esquema para representarlas que nos permita almacenar varias bases de datos por separado. Es importante señalar que MongoDB es compatible con bases de datos que no contienen colecciones (me referiré a ellas como bases de datos “vacías”). Elegí la forma más sencilla y obvia para solucionar este problema. Las bases de datos se representan como un nodo de primer nivel en el global ^MonCache. Además, dicho nodo obtiene un valor "" para permitir que sea compatible con las bases de datos “vacías”. La cosa es que, si no hace este paso y solamente agrega nodos hijo, cuando los elimine también eliminará al nodo padre (esa es la forma en que funcionan los globales). Por lo tanto, cada base de datos se representa en Caché de la siguiente manera: ^MonCache(<db>) = "" Por ejemplo, la representación de la base de datos “my_database” se verá de la siguiente manera: ^MonCache("my_database") = "" Esquema para representar las colecciones en Caché MongoDB define a una colección como uno de los elementos en una base de datos. Todas las colecciones que estén en una sola base de datos tienen un nombre único, el cual puede utilizarse para identificar de manera precisa a la colección. Este hecho fue lo que me ayudó a encontrar una manera sencilla para representar a las colecciones en un global y, en particular, a utilizar nodos de segundo nivel. Ahora debemos resolver dos pequeños problemas. El primero es que las colecciones, al igual que las bases de datos, pueden estar vacías. El segundo es que una colección es un conjunto de documentos. Y todos estos documentos deben estar separados unos de otros. Para ser honesto, no se me ocurrió una mejor idea que tener un contador, algo similar a un valor que se incrementará de manera automática, como un valor en la colección de nodos. Todos los documentos tienen un número único. Cuando se inserta un nuevo documento, se crea un nuevo nodo con el mismo nombre que tiene el valor del contador actual, y el valor del contador se incrementa en 1. Por lo tanto, cada una de las colecciones en Caché se representa de la siguiente manera: ^MonCache(<db>) = ""^MonCache(<db>, <collection>) = 0 Por ejemplo, la colección “my_collection” que se encuentra en la base de datos “my_database” se representará de la siguiente manera: ^MonCache("my_database") = ""^MonCache("my_database", "my_collection") = 0 Esquema para representar a los documentos en Caché En este proyecto, un documento es un documento en JSON, que se amplia mediante una clase adicional: ObjectId. Tuve que diseñar un esquema que representara a los documentos para estructuras de datos ordenadas de manera jerárquica. Ahí fue donde me enfrenté a algunas sorpresas. En primer lugar, no podía usar el valor nulo “nativo“ en Caché, ya que no era compatible. Otra cosa es que los valores booleanos se implementan mediante las constantes 0 y 1. En otras palabras, 1 significa verdadero y 0 significa falso. El problema más grande fue que debía encontrar una forma para almacenar a ObjectId. Al final, todos estos problemas se resolvieron exitosamente y de la manera más sencilla, o al menos eso creía yo. En el siguiente artículo, examinaré cada uno de los tipos de datos y cómo se representan. Esquema para interactuar con Caché La elección del controlador Node.js pareció ser una decisión lógica y sencilla para trabajar con InterSystems Caché (puede encontrar otros controladores para interactuar con Caché en los documentos de apoyo que se encuentran disponibles en el sitio web). Sin embargo, tenga en cuenta que la capacidad del controlador puede no ser suficiente. Quería realizar varias inserciones con una sola transacción. Es por eso que decidí desarrollar un conjunto de clases en Caché ObjectScript, que se utilizaron para emular la API de MongoDB en el lado de Caché. El controlador de Caché, Node.js, no podía acceder a las clases en Caché, pero podía llamar al programa desde Caché. Este hecho resultó en la creación de una pequeña herramienta: Una especie de puente entre el controlador y las clases en Caché. Al final, el esquema se veía de la siguiente manera: Mientras trabajaba en el proyecto, establecí un formato especial que llamé NSNJSON (Not So Normal JSON) que me permitió "pasar de contrabando" ObjectId, valores nulos, verdaderos y falsos a través del controlador a Caché. Puede encontrar más información sobre este formato en la página correspondiente de GitHub — NSNJSON. Funcionalidad de MonCaché Para la búsqueda de documentos están disponibles los siguientes criterios: $eq — equivalencia; $ne — no equivalencia; $not — negación; $lt — menor que; $gt — mayor que; $exists — existe. Para las operaciones de actualización de documentos están disponibles los siguientes operadores: $set — configurar un valor; $inc — incrementar un valor por un número específico; $mul — multiplicar un valor por un número específico; $unset — eliminar un valor; $rename — cambiar el nombre de un valor. Ejemplo Tomé este código de la página oficial del controlador y lo modifiqué un poco. var insertDocuments = function(db, callback) { var collection = db.collection('documents'); collection.insertOne({ site: 'Habrahabr.ru', topic: 276391 }, function(err, result) { assert.equal(err, null); console.log("Inserted 1 document into the document collection"); callback(result); });} var MongoClient = require('mongodb').MongoClient , assert = require('assert'); var url = 'mongodb://localhost:27017/myproject'; MongoClient.connect(url, function(err, db) { assert.equal(null, err); console.log("Successfully connected to the server"); insertDocument(db, function() { db.close(); });}); ¡Este código se puede modificar fácilmente para hacerlo compatible con MonCaché! ¡Lo único que necesitamos para hacerlo es cambiar el driver! // var MongoClient = require('mongodb').MongoClientvar MongoClient = require('moncache-driver').MongoClient Después de ejecutar el código, el global de ^MonCache se verá de la siguiente manera: ^MonCache("myproject","documents")=1^MonCache("myproject","documents",1,"_id","t")="objectid"^MonCache("myproject","documents",1,"_id","v")="b18cd934860c8b26be50ba34"^MonCache("myproject","documents",1,"site","t")="string"^MonCache("myproject","documents",1,"site","v")="Habrahabr.ru"^MonCache("myproject","documents",1,"topic","t")="number"^MonCache("myproject","documents",1,"topic","v")=267391 Demostración Aparte de todo lo demás, lanzamos una pequeña demostración de la aplicación (código fuente), la cual también se implementó con Node.js para demostrar cómo se realiza el cambio del controlador desde MongoDB Node.js hacia MonCaché Node.js, sin que fuera necesario reiniciar el servidor y cambiar el código fuente. La aplicación es una pequeña herramienta para realizar operaciones CRUD en productos y oficinas, así como una interfaz para cambiar la configuración (modificar el controlador). El servidor permite crear productos y funciones que se guardan para después almacenarse en la configuración que se seleccionó (Caché o MongoDB). La pestaña "Órdenes" contiene una lista de las órdenes. Ya establecí los registros, pero el formulario aún no está completo. Usted es bienvenido a colaborar en el proyecto (código fuente). Puede cambiar la configuración desde la página "Configuración". En esta página hay dos botones: MongoDB y MonCache. Puede seleccionar la configuración que desee al hacer clic sobre el botón correspondiente. Cuando se cambia la configuración, la aplicación del cliente se conectará nuevamente a la fuente de los datos (una abstracción que separa la aplicación del controlador que se utiliza en ese momento). Conclusión En resumen, permítanme responder la pregunta más importante. ¡Exacto! Logramos aumentar el rendimiento cuando se realizan las operaciones básicas. El proyecto MonCaché se publicó en GitHub y está disponible bajo una licencia del MIT. Guía Breve Instale Caché Cargue los componentes que sean necesarios para MonCaché en Caché Establezca un área en Caché para MONCACHE En Caché, establezca un usuario que se llame “moncache” con la contraseña “ehcacnom” (es “moncache” al revés) Establezca una variable de entorno MONCACHE_USERNAME = moncache Establezca una variable de entorno MONCACHE_PASSWORD = ehcacnom Establezca una variable de entorno MONCACHE_NAMESPACE = MONCACHE En su proyecto, modifique la dependencia de 'mongodb' hacia 'moncache-driver' ¡Inicie su proyecto! :-) Programa Académico de InterSystems Si está interesado en iniciar su propio proyecto de investigación basado en las tecnologías de InterSystems, puede visitar una página especializada que se dedica a brindar información sobre los programas académicos de InterSystems.
Anuncio
Mario Sanchez Macias · 25 mayo, 2020

Alerta: Posibles problemas de integridad de datos con el backup online de grandes bases de datos

InterSystems ha corregido dos defectos que afectan al backup online de grandes bases de datos. Los backups realizados a través de métodos externos, como snapshots o copias directas de ficheros, no están afectados. Estos defectos existen en todas las versiones de los productos de InterSystems. El primer defecto solo afecta a bases de datos con más de 231 bloques. Da lugar a una base de datos degradada tras recuperarla de un backup online. Por ejemplo, bases de datos que tienen un tamaño de bloque de 8 KB (el valor por defecto) solo se ven afectadas si ocupan más de 16 TB. La corrección a este defecto se identifica como RJF437. El segundo defecto afecta a bases de datos que tienen un tamaño de bloque de 8 KB y ocupan más de ~29 TB. Con este defecto, el backup online falla debido a un error <DATABASE> impreciso; esto da lugar a un backup que no puede ser recuperado. La corrección a este defecto se identifica como RJF438. Hay que tener en cuenta que este defecto también afecta a las bases de datos que tienen un tamaño de bloques menor de 8 KB. Las correcciones a estos defectos se incluirán en todas las futuras versiones de los productos. También están disponibles solicitando una distribución ad hoc al Centro de Soporte Internacional (WRC). Para cualquier pregunta sobre esta alerta, se puede contactar con el Centro de Soporte Internacional (WRC). Como nota personal a la noticia oficial anterior, me gustaría resaltar que si estáis haciendo backups online de bases de datos tan grandes como las que se mencionan, deberíais replantear la estrategia de Backup. El Backup Online de Caché es genial para bases de datos no muy grandes. Cuando las bases de datos empiezan a ser grandes (por ejemplo más de un 1TB) lo más recomendable es utilizar backup externos, con tecnologías tipo snapshot, que te van a permitir hacer copias en pocos segundos y lo más importante, poder restaurar en mucho menos tiempo. Gracias por el aviso y por la nota Mario... siempre es útil este tipo de recomendaciones
Artículo
Ricardo Paiva · 29 sep, 2022

Visual Trace y la libertad de eleccion

¡Hola Comunidad! A lo largo de los años siempre he pensado en crear cosas nuevas, modificar las existentes, experimentar, probar, romper (siempre pasa), construir de nuevo, y empezar otra vez. Los concursos promovidos por InterSystems son una excelente fuente de motivación. Obviamente los premios llaman la atención y eso no se puede negar. Pero no se trata solo de los premios/regalos - los concursos son un reto creativo, una oportunidad de crear, reimaginar, probar, experimentar... Y lo mejor de todo es que eres libre de hacer todo lo que quieras! Así que ví estos concursos como una oportunidad de crear mi propio Y si...? (la serie en la que Marvel permite a los autores re-imaginar sus historias como quieran) y he sido muy afortunado de encontrar otra persona que recibe estas ideas con los brazos abiertos ¡Muchas gracias, @José.Pereira! En el último concurso de Interoperabilidad, creé el visualizador de mensajes Message Viewer y en este concurso de Interoperabilidad traigo de nuevo el Message Viewer, pero esta vez con Visual Trace! Cualquiera que ya trabaje con la tecnología de InterSystems y conozca la parte de integración (Ensemble / Interoperabilidad), sabe que Visual Trace ha estado ahí durante mucho tiempo, sin cambiar y sin ningún problema. Funciona, muestra el diagrama de secuencia de tu mensaje, los detalles, presenta la información, XML, etc. Pero... ¿solo porque funciona no puedo re-diseñarlo? Intentando darle una nueva perspectiva y quizá motivando un pequeño cambio? Steve Rogers (Capitán America) es un example de esto - es uno de los personajes más importantes de Marvel y aun así lo re-diseñaron y re-crearon, probando a Peggy Carter como Capitán, para la serie What if...? 😂 Así que vamos a hablar un poco más de nuestra nueva "Peggy Carter", es decir, Visual Trace! Este es nuestro viejo y efectivo Visual Trace: Ahora, imagina tener miles de mensajes aquí y que no puedes re-enviar de forma sencilla un simple mensaje? Tendrías que volver a la pantalla del Message Viewer, investigar, buscar y re-enviar tu mensaje. Por eso pensamos que es posible mostrar la información con un nuevo look, ofreciendo una funcionalidad sencilla. Y creo que puede ayudar y hacer la vida un poco más fácil a los desarrolladores. DEMO Vídeo en YouTube >> .