Buscar

Limpiar filtro
Anuncio
Esther Sanchez · 18 nov, 2022

InterSystems Ideas News - todas las novedades del Portal de Sugerencias de InterSystems

¡Hola Comunidad! Esta es la primera publicación con las novedades de InterSystems Ideas, el Portal de Sugerencias de InterSystems. La noticia más importante es el resultado del primer Ideatón (Maratón de Ideas) de InterSystems, que fue todo un éxito y recibimos 75 ideas nuevas. Algunas estadísticas del Portal de Sugerencias: ✓ 42 ideas nuevas publicadas en octubre✓ 147 usuarios nuevos entraron con su cuenta en el Portal en octubre✓ 142 ideas publicadas desde el inicio del Portal✓ 273 usuarios han entrado con su cuenta en el Portal desde su inicio Las 5 ideas más votadas del mes de octubre fueron: IRIS and ZPM(Open Exchange) integration Move users, roles, resources, user tasks, Mappings (etc) to a seperate Database, other than %SYS, so these items can be mirrored RPMShare - Database solution for remote patient monitoring (RPM) datasets of high density vitals Create front-end package based on CSS and JS to be used in NodeJS and Angular projects PM platform Estas son las 42 ideas publicadas en octubre Add IRIS as a supported database for Apache Superset For community articles, let admins (and possibly article authors) pin particular comments to the top Add address standardization to Normalization (using Project US@ standards) PM platform Tool to convert legacy dot syntax code to use bracket syntax TTTC PDF reports for IRIS BI Sample code share opportunity Add basic tutorial of Docker or point to a Docker tutorial in Documentation The ability to export current settings to a %Installer Manifest Move users, roles, resources, user tasks, Mappings (etc) to a seperate Database, other than %SYS, so these items can be mirrored Common Data Modelling CI/CD support String format to numeric values in ZEN.proxyObject Patient Initiated Follow Up - Adding a document to an ROPWL I service Flags Linking I service to JIRA system Linux: iris session [command line] get commands from a file Journal file analysis/visualization Add the option to call class parameters in Embedded Python Create query builder Colour Background on Ward / Clinical Areas Floorplans A Dynamic Cheat Sheet to lookup for Common Core Functions for Reusability Version History for Classes Add wizard to create class with its properties RPMShare - Database solution for remote patient monitoring (RPM) datasets of high density vitals Better handle whitespace in Management Portal Text entry IRIS and ZPM(Open Exchange) integration Visual programming language Backup button before importing Adapting tools for people with special needs and/or disabilities 🌐🔰🦽🦼♿ Reserve licenses Interoperability Wizard Improve journal display in IRIS admin portal Create front-end package based on CSS and JS to be used in NodeJS and Angular projects Mirror Async Member Time Delay in Applying Journals Cache Journal Switch Schedule Monitoring and Programatic way of Starting/Stoping Gateways Embedded Python: Add a built-in variable to represent class LDAP Authentication method by default on Web Applications Please add google oauth authorization to login to the management portal Data Analyzer ¿Habéis entrado ya en InterSystems Ideas? Podéis publicar vuestras ideas y también votar las de otras personas! ¡Os leemos!!
Anuncio
David Reche · 25 oct, 2019

OpenJDK con InterSystems Atelier

InterSystems Atelier se ha validado para OpenJDK 8. El plug-in de InterSystems para Eclipse ya está disponible para Eclipse Photon (4.8), que requiere y se ejecuta sobre Java 8.
Artículo
Jose-Tomas Salvador · 6 sep, 2021

InterSystems ObjectScript 101++

Desde hace ya algunos años he echado en falta poder ofrecer, a todos los que se interesan por ObjectScript, un tutorial más o menos completo de iniciación a ObjectScript. Algo que pueda ayudar más y facilitarles las cosas a esos nuevos desarrolladores que se acercan a nuestra tecnología... algo intermedio, a medio camino entre el típico "Hola Mundo", que no te permite ir mucho más allá, y el "Curso Avanzado de Programación", que te resulta imposible por carecer de tiempo o medios. Si existiese algo que de verdad sirviera no sólo como introducción al ecosistema, sino cómo empujón y punto de partida para empezar a hacer cosas de verdad en ObjectScript y avanzar por ti mismo... ¿no sería estupendo? En fin... como digo, la idea de que algo así tendría que existir me lleva ya rondando bastante tiempo... Y entonces llegó la pandemia, y nos tuvimos que quedar en casa, y vacaciones las justas, y fines de semana laaargos,... ¿qué mejor escenario para hacer lo que siempre decimos que haríamos si tuvieramos tiempo? Pues dicho y hecho... hace meses empecé a trabajar en ello y a sacar ratos para darle forma a esta idea... ya me diréis que tal (sed magnánimos), porque: Hoy puedo anunciar oficialmente el nacimiento del ¡¡¡1er Video Tutorial en español de ObjectScript 101++ !!! Ya, ya,... plus, plus, .... es que no me atreví a llamarle 102...o intermedio o tal....... Lo forman 6 videos más el de presentación. Mejor dicho, lo van a formar, porque los 2 últimos bloques están en el horno... en post-producción vaya. Los iré subiendo según salgan, espero que en breve. En GitHub incluyo también algunos ejemplos del código que se utilizan en distintas partes del tutorial. Para una mejor visualización, os aconsejo que veáis los videos a pantalla completa... también los tenéis disponibles en YouTube directamente. IMPORTANTE: No se trata de una formación oficial de InterSystems y de ningún modo pretende (ni puede) sustituir a la formación oficial, que es mucho más extensa y completa. Mi intención es que sea un recurso más para introducirte en el mundo de ObjectScript y que te sirva de punto de partida y acicate y te ayude a seguir avanzando por tu cuenta o con otros recursos de eLearning o formación presencial. ¡¡Espero que lo disfrutes!! Capítulo 0 - Introducción Capítulo 1 - Ubicándonos Capítulo 2 - Iterando Capítulo 3 - Mi Contexto de Ejecución Capítulo 4 - Indirección y Globals Capítulo 5 - Objetos en ObjectScript Capítulo 6 - ¿Y cómo trabajo con SQL? Bueno, ha tardado más de 3 semanas en salir del horno pero aquí lo tienes, calentito, calentito, el Capítulo 5 - Objetos, penúltimo de este tutorial de ObjectScript. En él nos introducimos ya en la parte de Orientación a Objetos. Me ha quedado un pelín largo para mi gusto, algo más de 2 horas, así que tómatelo con tranquilidad, trocealo a tu gusto,...o ¡qué narices!, ¡dale caña y ponle el turbo al video! Espero que lo disfrutes y te sirva de ayuda. Ah... recien metido en el horno el Capítulo 6, en el que te contaré un poquito qué pasa con SQL y como también ObjectScript lo incorpora de forma nativa... con él cerraré ya este tutorial. A ver lo que tarda en hacerse. ¡Hasta un rato! Parecía que no, pero finalmente llega el momento de cerrar este tutorial de ObjectScript... Publico hoy el Capítulo 6 - ¿Qué pasa con SQL?, dedicado al acceso SQL a IRIS Data Plataform y cierre de este tutorial. Lo he centrado particularmente en los 2 mecanismos básicos de tratar SQL en ObjectScript, de forma estática, embebiendo SQL en el código ObjectScript, o dinámica, a través de las clases del paquete %SQL. Por supuesto, hay muuuucho más que contar y aprender... os invito a navegar por esta comunidad, por la sección de formación de InterSystems, por los cursos online gratuitos, por la sección del desarrollador, a visualizar los webinars que periodicamente realizamos y, si tenéis la opción, complementar vuestra formación con un curso oficial. Ah.. y no olvidéis que la documentación es vuestra amiga! Ahí encontraréis explicaciones en detalle y multitud de ejemplos que os ayudarán a avanzar. En fin... poco más que decir. Para mí ha sido toda una experiencia.... sobre todo la post-producción 😰😉... Espero que os haya sido útil... Con haber ayudado a unos pocos, habrá valido la pena. Happy coding!! Hola, acabo de añadir un PDF con las diapositivas que utilicé en el tutorial. Siéntete libre de utilizarlas. Sí te pido que, si lo haces, incluyas un link referenciando a este post en la Comunidad. Por cierto, para los que me habéis comentado, efectivamente tenía el repositorio de ejemplos en GitHub marcado como privado... ya está accesible: Repositorio GitHub - Ejemplos
Anuncio
Esther Sanchez · 19 sep, 2022

InterSystems en el hackatón HackMIT

¡Empieza la temporada de Hackathons! InterSystems participará en el hackathón HackMIT, organizado por el MIT (Massachusetts Institute of Technology), en el que miles de estudiantes se reúnen durante un fin de semana largo para trabajar en proyectos software y/o hardware. Este año el HackMIT vuelve a ser en persona, en el campus del MIT, y se celebrará el fin de semana del 1-2 de octubre.Este año, los temas principales son Educación, Sostenibilidad, Nuevas Fronteras y Entretenimiento.El reto de InterSystems estará relacionado con 1 o 2 de los temas principales y se anunciará el día 28 de septiembre.¡Estad atentos a los anuncios en la Comunidad!
Anuncio
David Reche · 15 jul, 2019

Invitación a adoptar InterSystems IRIS

Secuencia de conversión, paso 4 (ver tabla a continuación) En los últimos meses, hemos realizado cambios en InterSystems IRIS para facilitar la migración de Caché/Ensemble (C/E) a InterSystems IRIS. Los cambios más importantes son la reintroducción de bases de datos que no son Unicode y la conversión in situ. InterSystems IRIS ahora es totalmente compatible con bases de datos no Unicode, con todas las funcionalidades que ya existen con Caché. La conversión in situ es compatible con un proceso de actualización para instalar InterSystems IRIS sobre las implementaciones C/E existentes. Lo llamamos "conversión" porque transforma la instancia de C/E en una verdadera instancia de InterSystems IRIS.Es un placer para InterSystems invitarles a nuestro programa de prueba sobre el terreno de conversión in situ. Este programa estará activo hasta finales de julio y ofrece acceso anticipado para realizar pruebas y experimentar el cambio de C/E a InterSystems IRIS. Ya hemos terminado una pequeña prueba previa y todos los clientes han podido mover su aplicación con éxito y convertir sus instancias actuales a InterSystems IRIS.¿Qué se necesita para participar? InterSystem le dará acceso a dos documentos, un kit especial de InterSystems IRIS que ofrece las funciones para esta prueba de campo y, por supuesto, una clave de licencia.InterSystems IRIS Guía de adopciónEl viaje comienza aquí, donde puede descubrir las diferencias entre las dos líneas de productos y aprender toda la información que necesita para migrar su aplicación a InterSystems IRIS. Una vez que tenga su aplicación ejecutándose en InterSystems IRIS, puede pasar al siguiente paso. Por cierto, no necesita hacer nada especial para activar el aspecto no Unicode. InterSystems IRIS Guía de conversiónEste documento describe, con gran detalle, todos los aspectos y consideraciones para convertir una o varias instancias que forman parte de las configuraciones de duplicación. Las guías, el kit de InterSystems IRIS y la clave de licencia están disponibles en nuestro servidor de descargas del WRC. Busque los archivos que contienen la palabra "conversion" en el nombre.El soporte para la conversión in situ y el soporte no Unicode se lanzará con InterSystems IRIS 2019.1.1 antes de que termine el verano. No utilice el kit de prueba de campo para convertir instalaciones de producción. Envíe todos sus comentarios a conversionft@intersystems.com escogeremos el equipo más adecuado para atender tu solicitud y le haremos llegar el mensaje.Esperamos participar juntos durante esta prueba sobre el terreno e incluir sus comentarios en la publicación oficial. Secuencia de conversión a InterSystems IRIS PasoMigraciones o Conversiones De/AEstado1Migración a IRIS o a IRIS for HealthDisponible2Migration de TrakCare a IRIS for Health Disponible3Conversión in situ para HealthShare Health ConnectDisponible; Contactar con InterSystems para más detalles4Conversión in situ a IRISPrueba de campo limitada: completadoPrueba de campo público: 27 de junio de 2019Fecha de finalización prevista: 31 de julio de 2019.5Conversión in situ para IRIS for Health3 trimestre 20196Conversión in situ para HealthShare {IE, PD, HI, ….}4 trimestre 2019 Las conversiones in-situ están soportadas para Caché y Ensemble versiones 2016.2 y siguientes.
Artículo
Kurro Lopez · 17 jul, 2019

Clases de consulta en InterSystems Caché

Las clases de consulta en InterSystems Caché son una herramienta muy útil que separa las consultas SQL del código Object Script de Caché. Básicamente funciona de la siguiente manera: supongamos que quiere utilizar la misma consulta SQL con distintos argumentos en varios lugares diferentes. En este caso, puede evitar la duplicación del código si declara el contenido de la consulta como una clase de consulta y después llama a esta consulta por su nombre. Este método también es conveniente para las consultas personalizadas, donde el desarrollador define con cuál de las tareas obtendrá la siguiente fila. ¿Esto le parece interesante? Entones, ¡siga leyendo!Clase básica de consultaEn resumen, las consultas de clases básicas le permiten representar consultas SQL SELECT. El optimizador y el compilador SQL las administran de la misma forma que las consultas SQL estándar, pero son más convenientes en el momento de ejecutarlas desde el contexto de Caché Object Script. Se declaran como elementos de consulta en las definiciones de clase (al igual que los métodos o propiedades), de la siguiente manera:Tipo: %SQLQueryTodos los argumentos de su consulta SQL deben estar en la lista de argumentosTipo de consulta: SELECTUtilice los dos puntos para acceder a cada argumento (de forma similar al SQL estático)Defina el parámetro ROWSPEC, el cual contiene información sobre los nombres y el tipo de datos en los resultados de salida, al igual que el orden de los campos(Opcional) Defina el parámetro CONTAINID, el cual corresponde al orden numérico si el campo contiene un ID. Si no necesita la devolución del ID, no asigne ninguno de los valores a CONTAINID(Opcional) Defina el parámetro COMPILEMODE, el cual corresponde a un parámetro similar que se encuentra en el SQL estático y especifica cuando debe compilarse la expresión SQL. Cuando este parámetro se configura para IMMEDIATE (de forma predeterminada), la consulta se compilará simultáneamente con la clase. Cuando este parámetro se configura para DYNAMIC, la consulta se compilará antes de que se ejecute por primera vez (de forma similar al SQL dinámico)(Opcional) Defina el parámetro SELECTMODE, el cual especifica el formato que tendrán los resultados de las consultasSi desea llamar esta consulta como un procedimiento SQL, agregue la propiedad SqlProc.Si desea renombrar la consulta, configure la propiedad SqlName. El nombre predeterminado de una consulta en un contexto SQL es el siguiente: PackageName.ClassName_QueryNameCaché Studio proporciona un asistente incorporado para crear consultas de clasesDefina la muestra para la clase Sample.Person mediante la consulta ByName, la cual devolverá los nombres de todos los usuarios que comiencen con una letra específica Class Sample.Person Extends %Persistent { Property Name As %String; Property DOB As %Date; Property SSN As %String; Query ByName(name As %String = "") As %SQLQuery (ROWSPEC="ID:%Integer,Name:%String,DOB:%Date,SSN:%String", CONTAINID = 1, SELECTMODE = "RUNTIME", COMPILEMODE = "IMMEDIATE") [ SqlName = SP_Sample_By_Name, SqlProc ] { SELECT ID, Name, DOB, SSN FROM Sample.Person WHERE (Name %STARTSWITH :name) ORDER BY Name } } Puede llamar esta consulta desde Caché Object Script de la siguiente manera: Set statement=##class(%SQL.Statement).%New() Set status=statement.%PrepareClassQuery("Sample.Person","ByName") If $$$ISERR(status) { Do $system.OBJ.DisplayError(status) } Set resultset=statement.%Execute("A") While resultset.%Next() { Write !, resultset.%Get("Name") } O bien, puede obtener un resultado utilizando el método queryNameFunc que se generó automáticamente: Set resultset = ##class(Sample.Person).ByNameFunc("A") While resultset.%Next() { Write !, resultset.%Get("Name") } Esta consulta también puede llamarse desde SQLcontext de las siguientes dos formas: Call Sample.SP_Sample_By_Name('A') Select * from Sample.SP_Sample_By_Name('A') Puede encontrar esta clase en el namespace predeterminado de Caché para SAMPLES. Eso es todo lo que necesita saber sobre las consultas simples. Ahora, prosigamos con las personalizadas. Clases de consulta personalizadas Aunque las consultas de clases básicas funcionan bien en la mayoría de los casos, algunas veces es necesario ejecutar un control absoluto sobre el comportamiento que tendrán las consultas en las aplicaciones, por ejemplo: Un sofisticado criterio de selección. Dado que en las consultas personalizadas se implementa un método Object Script de Caché, el cual devuelve la siguiente fila por su cuenta, estos criterios pueden ser tan sofisticados como sea necesario.Si los datos únicamente son accesibles mediante una API, en un formato que no desea utilizarSi los datos se almacenaron en globales (sin clases)Si necesita aumentar los permisos, con el fin de acceder a los datosSi necesita llamar a una API externa, con el fin de acceder a los datosSi necesita obtener acceso al sistema de archivos, con el fin de acceder a los datosSi necesita realizar operaciones adicionales antes de ejecutar la consulta (por ejemplo, establecer una conexión, comprobar las autorizaciones, etc.) Por lo tanto, ¿cómo se crean las consultas de clases personalizadas? En primer lugar, necesita definir los 4 métodos que implementará durante todo el flujo de trabajo para su consulta, desde la inicialización hasta la eliminación: queryName — proporciona información sobre una consulta (de forma similar a las consultas básicas de clases)queryNameExecute — ejecuta una consultaqueryNameFetch — obtiene la siguiente fila como resultado de una consultaqueryNameClose — elimina una consulta Ahora, analizaremos estos métodos con mayor detalle. El método queryName El método queryName representa la información sobre una consulta. Tipo: %QueryDeje el contenido en blancoDefina el parámetro ROWSPEC, el cual contiene la información sobre los nombres y el tipo de datos en los resultados de salida, al igual que el orden de los campos(Opcional) Defina el parámetro CONTAINID, el cual corresponde al orden numérico si el campo contiene un ID. Si no necesita la devolución del ID, no asigne ningún valor a CONTAINID Por ejemplo, crearemos la consulta AllRecords (queryName = AllRecords, y el método se llama simplemente AllRecords) de la cual saldrán todas las instancias, una por una, de la nueva clase persistente Utils.CustomQuery. Primero, crearemos una nueva clase persistente Utils.CustomQuery: Class Utils.CustomQuery Extends (%Persistent, %Populate){ Property Prop1 As %String; Property Prop2 As %Integer; } Ahora, escribiremos la consulta AllRecords: Query AllRecords() As %Query(CONTAINID = 1, ROWSPEC = "Id:%String,Prop1:%String,Prop2:%Integer") [ SqlName = AllRecords, SqlProc ] { } El método queryNameExecuteCon el método queryNameExecute se inicializa por completo una consulta. La estructura característica de este método es la siguiente: ClassMethod queryNameExecute(ByRef qHandle As %Binary, args) As %Status Donde: qHandle se utiliza para las comunicaciones con otros métodos durante la implementación de una consultaEste método debe configurar a qHandle dentro del estado, el cual después aprobará al método queryNameFetchqHandle puede configurarse para OREF, una variante o una variable multidimensionalLos args son parámetros adicionales aprobados para la consulta. Puede agregar tantos args como necesite (o no utilizarlos en absoluto)El método debe regresar la consulta al estado de inicialización Pero continuemos con nuestro ejemplo. Es libre de realizar iteraciones mediante varias formas de extensión (a continuación, describiré los métodos de trabajo básicos para las consultas personalizadas), pero en este ejemplo realizaré iteraciones mediante el global utilizando la función $Order. En este caso, qHandle almacenará el ID actual y, dado que no necesita ningún argumento adicional, no se necesita el argumento arg. El resultado se verá de la siguiente manera: ClassMethod AllRecordsExecute(ByRef qHandle As %Binary) As %Status { Set qHandle = "" Quit $$$OK } El método queryNameFetchEl método queryNameFetch devuelve un solo resultado en el formulario $List The signature of this method is as follows: ClassMethod queryNameFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = queryNameExecute ] where: qHandle se utiliza para las comunicaciones con otros métodos durante la implementación de una consultaCuando se ejecuta la consulta, qHandle comienza asignando los valores especificados por queryNameExecute o por llamadas previas de queryNameFetch.Cada fila debe configurarse con un valor de %List o hacia una cadena vacía, si se procesaron todos los datosAtEnd debe configurarse en 1, una vez que llegó al final de los datos.La función de la palabra clave PlaceAfter es identificar la posición del método en el código int. El método "Fetch" debe colocarse después del método "Execute", pero esto solamente es importante para el SQL estático, por ejemplo cursors dentro de las consultas En general, dentro de este método se realizan las siguientes operaciones: Compruebe que haya llegado hasta el final de los datosSi aún quedan algunos datos: Cree una nueva %List y asigne un valor a la variable RowDe lo contrario, configure AtEnd en 1Prepare qHandle para el siguiente resultado de fetchDevuelva el estado Así es como se verá en nuestro ejemplo: ClassMethod AllRecordsFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status { #; Iterating through ^Utils.CustomQueryD #; Writing the next id to qHandle and writing the global's value with the new id into val Set qHandle = $Order(^Utils.CustomQueryD(qHandle),1,val) #; Checking whether there is any more data left If qHandle = "" { Set AtEnd = 1 Set Row = "" Quit $$$OK } #; If not, create %List #; val = $Lb("", Prop1, Prop2) see Storage definition #; Row =$lb(Id,Prop1, Prop2) see ROWSPEC for the AllRecords request Set Row = $Lb(qHandle, $Lg(val,2), $Lg(val,3)) Quit $$$OK } El método queryNameCloseThe queryNameClose method terminates the query, once all the data is obtained. The signature of this method is as follows: ClassMethod queryNameClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = queryNameFetch ] Donde: Caché ejecuta este método después de la última llamada del método queryNameFetchEn otras palabras, es un eliminador de consultasPor lo tanto, debe disponer de todos los cursores SQL, consultas y variables locales en su implementaciónLos métodos devuelven los estados actuales En nuestro ejemplo, debemos eliminar la variable local qHandle: ClassMethod AllRecordsClose(ByRef qHandle As %Binary) As %Status { Kill qHandle Quit $$$OK } ¡Y aquí vamos! Una vez que compile la clase, podrá utilizar la consulta AllRecords desde %SQL.Statement, de manera similar al procedimiento de las consultas de clases básicas. Métodos lógicos de iteración para consultas personalizadas ¿Cuáles métodos pueden utilizarse para realizar consultas personalizadas? En general, existen 3 métodos básicos: Iteración mediante un globalSQL estáticoSQL dinámico Iteración mediante un globalEste método se basa en utilizar $Order y funciones similares para realizar iteraciones mediante un global. Este método puede utilizarse en los siguientes casos: Cuando los datos se almacenaron en globales (sin clases)Cuando desea reducir el número de glorefs en el códigoLos resultados deben/pueden ordenarse por el subíndice del global SQL estáticoEste método se basa en cursores y en el SQL estático. Y se utiliza para: Hacer que el código int sea más comprensibleHacer que el trabajo con cursores sea más sencilloAcelerar el proceso de compilación (el SQL estático incluye las consultas de clases y, por lo tanto, se compila solo una vez). Nota: Los cursores generados por consultas del tipo %SQLQuery se nombran automáticamente, por ejemplo, Q14.Todos los cursores utilizados dentro de una clase deben tener nombres diferentes.Los mensajes de error se relacionan con los nombres internos de los cursores, los cuales tienen caracteres adicionales que se encuentran al final de sus nombres. Por ejemplo, un error en el cursor Q140 en realidad lo causa el cursor Q14.Utilice PlaceAfter y asegúrese de que los cursores se utilizaron en la misma rutina donde se declararon.INTO debe utilizarse junto con FETCH, pero no con DECLARE. Ejemplo de un SQL estático para Utils.CustomQuery: Query AllStatic() As %Query(CONTAINID = 1, ROWSPEC = "Id:%String,Prop1:%String,Prop2:%Integer") [ SqlName = AllStatic, SqlProc ] { } ClassMethod AllStaticExecute(ByRef qHandle As %Binary) As %Status { &sql(DECLARE C CURSOR FOR SELECT Id, Prop1, Prop2 FROM Utils.CustomQuery ) &sql(OPEN C) Quit $$$OK } ClassMethod AllStaticFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = AllStaticExecute ] { #; INTO must be with FETCH &sql(FETCH C INTO :Id, :Prop1, :Prop2) #; Check if we reached end of data If (SQLCODE'=0) { Set AtEnd = 1 Set Row = "" Quit $$$OK } Set Row = $Lb(Id, Prop1, Prop2) Quit $$$OK } ClassMethod AllStaticClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = AllStaticFetch ] { &sql(CLOSE C) Quit $$$OK } SQL dinámicoEste método se basa en otras consultas de clases y en el SQL dinámico. Esto es razonable cuando, además de una consulta SQL por sí misma, también necesita realizar algunas operaciones adicionales, por ejemplo, ejecutar una consulta SQL en varios namespaces, o aumentar las autorizaciones antes de ejecutar la consulta. Ejemplo de un SQL dinámico para Utils.CustomQuery: Query AllDynamic() As %Query(CONTAINID = 1, ROWSPEC = "Id:%String,Prop1:%String,Prop2:%Integer") [ SqlName = AllDynamic, SqlProc ] { } ClassMethod AllDynamicExecute(ByRef qHandle As %Binary) As %Status { Set qHandle = ##class(%SQL.Statement).%ExecDirect(,"SELECT * FROM Utils.CustomQuery") Quit $$$OK } ClassMethod AllDynamicFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status { If qHandle.%Next()=0 { Set AtEnd = 1 Set Row = "" Quit $$$OK } Set Row = $Lb(qHandle.%Get("Id"), qHandle.%Get("Prop1"), qHandle.%Get("Prop2")) Quit $$$OK } ClassMethod AllDynamicClose(ByRef qHandle As %Binary) As %Status { Kill qHandle Quit $$$OK } Método alternativo: %SQL.CustomResultSet O bien, puede crear una consulta mediante una subclasificación desde la clase %SQL.CustomResultSet. Los beneficios de este método son los siguientes: Aumentar ligeramente la velocidadNo es necesario utilizar ROWSPEC, ya que todos los metadatos se obtienen a partir de la definición de claseCumplir con los principios del diseño orientado a objetos Para crear una consulta desde la subclase que pertenece a la clase %SQL.CustomResultSet, asegúrese de realizar los siguientes pasos: Definir las propiedades correspondientes en los campos resultantesDefinir las propiedades privadas donde se almacenará el contexto de la consultaAnular el método %OpenCursor (de forma similar a queryNameExecute) que inicia el contexto. En caso de que se produzca algún error, establezca %SQLCODE y también %MessageAnular el método %Next (de forma similar a queryNameFetch), el cual obtiene el siguiente resultado. Complete las propiedades. El método devuelve 0 si se procesaron todos los datos, y 1 si todavía faltan algunos datosAnular el método %CloseCursor (de forma similar a queryNameClose) si es necesario Ejemplo de %SQL.CustomResultSet para Utils.CustomQuery: Class Utils.CustomQueryRS Extends %SQL.CustomResultSet { Property Id As %String; Property Prop1 As %String; Property Prop2 As %Integer; Method %OpenCursor() As %Library.Status { Set ..Id = "" Quit $$$OK } Method %Next(ByRef sc As %Library.Status) As %Library.Integer [ PlaceAfter = %Execute ] { Set sc = $$$OK Set ..Id = $Order(^Utils.CustomQueryD(..Id),1,val) Quit:..Id="" 0 Set ..Prop1 = $Lg(val,2) Set ..Prop2 = $Lg(val,3) Quit $$$OK } } Puede llamarlo desde el código Object Script de Caché, de la siguiente manera: Set resultset= ##class(Utils.CustomQueryRS).%New() While resultset.%Next() { Write resultset.Id,! } Existe otro ejemplo disponible para el namespace SAMPLES, la clase Sample.CustomResultSet, que implementa una consulta para Samples.Person. Resumen Las consultas personalizadas le ayudarán a separar las expresiones SQL del código Object Script de Caché, e implementar un comportamiento sofisticado que puede ser muy difícil de manejar con el SQL puro. Referenciass Consultas de clases Iteración mediante un global SQL estático SQL dinámico %SQL.CustomResultSet La clase Utils.CustomQuery La clase Utils.CustomQueryRS El autor quiere expresar su agradecimiento a Alexander Koblov por la ayuda brindada durante la redacción de este artículo.
Anuncio
David Reche · 6 ago, 2019

Lanzamiento de InterSystems API Manager

¡Hola a tod@s! Estamos encantados de anunciar el lanzamiento de InterSystems API Manager (IAM). IAM es una nueva funcionalidad de InterSystems IRIS Data Platform™, que permite monitorizar y controlar el tráfico hacia y desde las APIS web dentro de su infraestructura de TI. El desarrollo de API's crece de forma exponencial en todos los sectores, porque cada vez más empresas desarrollan capas de aplicación orientadas a servicios. Con el aumento de las API's, los entornos de software cada vez están más distribuidos, siendo crucial monitorizar y controlar adecuadamente el tráfico de las API's. InterSystems API Manager es muy fácil de utilizar y permite a los desarrolladores dirigir todo el tráfico a través de un portal centralizado y reenviar las peticiones a los nodos destino adecuados. Los desarrolladores que utilizan InterSystems API Manager podrán también: Controlar todo el tráfico de las API's desde una ubicación central, permitiendo a los usuarios identificar y resolver problemas; Controlar el tráfico de las API's regulando su rendimiento, configurando los tamaños de carga útil permitidos, definiendo direcciones IP permitidas o prohibidas, poniendo extremos ("endpoints") en modo mantenimiento; Trabajar con desarrolladores internos y externos, ofreciéndoles documentación interactiva sobre las API's, a través de un portal para desarrolladores, dedicado y personalizable; y Proteger las APIs en un lugar centralizado. InterSystems API Manager funciona con InterSystems IRIS o IRIS for Health 2019.2 y superior. (Los clientes con la versión 2019.2 necesitan una nueva versión, la 2019.2.0.109.0, disponible en el Centro de Soporte Internacional (WRC). Para aprovechar todo el potencial de IAM, los partners necesitan una licencia de InterSystems IRIS que incluya la funcionalidad de API Management. Esta licencia está disponible de forma gratuita, pero InterSystems tiene que emitir una nueva clave de licencia para activar la funcionalidad. La distribución de IAM solo está disponible en formato contenedor y se puede descargar del Centro de Soporte Internacional (WRC). La documentación se encuentra aquí (en inglés): InterSystems API Manager Documentation La versión de IAM correspondiente a este lanzamiento es 0.34-1-1. Recursos adicionales Nota de prensa oficial (en inglés): InterSystems IRIS Data Platform 2019.2 introduces API Management capabilities Corto video animado (en inglés): What is InterSystems API Manager Video de 8 minutos que repasa lo más destacado de IAM (en inglés): Introducing InterSystems API Manager Pronto publicaremos un artículo con todas las funcionalidades de InterSystems API Manager.
Artículo
David Reche · 27 ago, 2019

Presentación de InterSystems API Manager

¡Hola a tod@s! Como posiblemente haya oído, acabamos de presentar InterSystems API Manager (IAM); una nueva característica de InterSystems IRIS Data Platform™, que permite monitorizar, controlar y gobernar el trafico desde y hacia APIs basadas en web, dentro de su infraestructura de TI. En caso de que se lo haya perdido, aquí está el enlace al anuncio. En este artículo, mostraré como habilitar IAM y resaltar algunas de las muchas capacidades a las que IAM permite sacar provecho. InterSystems API Manager trae todo lo que se necesita para: Monitorizar el tráfico de APIs basadas en HTTP y entender quién está usando tus APIs; cuál es la API más popular y cuál requiere retoques Controlar quién está usando tus APIs y restringir el uso en diferentes maneras. Permite un control detallado y capacidad de reacción rápida desde para una simple restricción de acceso hasta para una regulación del canal del tráfico de la API (throttlling) y afinado del volumen de solicitudes Proteger sus APIs con mecanismos de seguridad centralizados como OAuth2.0 o autenticación basada en Token Enrolar desarrolladores de terceros y proporcionarles una experiencia de usuario superior desde el inicio, proporcionando un Portal para Desarrolladores diseñado para sus necesidades Escalar la demanda de su API y procesar respuestas con baja latencia Estoy ansioso por mostrar un primer vistazo de IAM, así que... ¡pasemos a la acción! Comenzando IAM está disponible como descarga desde el sitio de distribución de software de WRC y se despliega como un contenedor Docker. Así que hay que asegurarse de que cumplimos con los requisitos mínimos: Docker engine. Versión mínima soportada 17.04.0+. Herramienta docker-compose CLI. Versión mínima soportada 1.12.0+. IRIS versión mínima 2019.2+. El primer paso es cargar la imagen descargada con el siguiente comando: docker load -i iam_image.tar Esto hace que la imagen IAM esté disponible para usar en contenedores que se ejecutan en su máquina. IAM se ejecuta en un contenedor separado del backend implementado mediante InterSystems IRIS, de manera que se puede escalar de forma independiente. Para poner en marcha IAM requiere acceso a la instancia de IRIS para cargar la información de licencia requerida. Para que IAM pueda tener acceso a la instancia de IRIS debemos iniciar sesión en IRIS y realizar las siguientes acciones: Habilitar la aplicación web /api/IAM (desde seguridad/aplicaciones) Habilitar el usuario IAM (desde seguridad/usuarios) Establecer una contraseña para el usuario IAM Al arrancar IAM, trata de conectarse a una instancia de IRIS y acceder a la API anterior mediante el usuario IAM para obtener los detalles de la licencia. Por lo tanto, al arrancar IAM debe conocer la URL de la API mediante (la dirección IP y el puerto sobre el que se ejecuta la API ) y el nombre y contraseña del usuario IAM. Toda esta información se establece en una variable de entorno ISC_IRIS_URL que posteriormente usará el contenedor. Algo así como la siguiente: export ISC_IRIS_URL="http://IAM:password@servidor:puerto/api/iam/license" Se dispone de un fichero docker-compose para facilitar la ejecución del contenedor, pero se debe conocer el nombre de la imagen del IAM que se va a ejecutar. Para ello también se utiliza una variable de entorno: export ISC_IAM_IMAGE=intersystems/iam:0.34-1-1 La buena noticia es que hay un script que nos facilita la tarea de establecer esas variables de entorno. Dentro del fichero de IAM descargado, al descomprimir vemos que hay una carpeta "scripts" y dentro de ella está el fichero de docker-compose y los scripts para Windows y Unix (Linux/Mac). En mi caso, uso Mac y el script se debe ejecutar mediante el comando source. Así, este es el ejemplo de ejecución: source ./iam-setup.sh Welcome to the InterSystems IRIS and InterSystems API Manager (IAM) setup script.This script sets the ISC_IRIS_URL environment variable that is used by the IAM container to get the IAM license key from InterSystems IRIS.Enter the full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1Enter the IP address for your InterSystems IRIS instance. The IP address has to be accessible from within the IAM container, therefore, do not use "localhost" or "127.0.0.1" if IRIS is running on your local machine. Instead use the public IP address of your local machine. If IRIS is running in a container, use the public IP address of the host environment, not the IP address of the IRIS container. xxx.xxx.xxx.xxx Enter the web server port for your InterSystems IRIS instance: 52773Enter the password for the IAM user for your InterSystems IRIS instance: Re-enter your password: Your inputs are:Full image repository, name and tag for your IAM docker image: intersystems/iam:0.34-1-1IP address for your InterSystems IRIS instance: xxx.xxx.xxx.xxxWeb server port for your InterSystems IRIS instance: 52773Would you like to continue with these inputs (y/n)? yGetting IAM license using your inputs...Successfully got IAM license!The ISC_IRIS_URL environment variable was set to: http://IAM:****************@xxx.xxx.xxx.xxx:52773/api/iam/licenseWARNING: The environment variable is set for this shell only!To start the services, run the following command in the top level directory: docker-compose up -dTo stop the services, run the following command in the top level directory: docker-compose downURL for the IAM Manager portal: http://localhost:8002 Ya podemos arrancar el contenedor de IAM mediante el siguiente comando: docker-compose up -d Opcionalmente, si no usas la opción "-d", podrás ver el registro de acciones del contenedor para ver que todo se inicia correctamente. Si todo ha ido bien, podremos acceder al portal de IAM en la URL http://localhost:8002. Lo primero que vemos es el informe global que no arroja ninguna información ya que este es un nuevo nodo. Cambiaremos esto en breve. IAM soporta el concepto de workspace (espacio de trabajo) para separar nuestro trabajo en módulos y/o equipos. Si hacemos scroll hacia abajo podemos seleccionar el workspace por defecto (default) y accederemos al cuadro de mando para este cuadro de mando. Bien, usaremos este workspace para nuestro primeros experimentos. De nuevo, el número de solicitudes para este workspace sigue siendo cero. Sin embargo, en el menú de la izquierda podemos ver los principales conceptos del API Gateway. Los primeros dos elementos son los más importantes: Servicios y Rutas. Un servicio es una API que queremos exponer a consumidores. Por lo tanto, una API REST en tu instancia de IRIS se considera un Servicio. Una ruta decide a cuál servicio debe dirigir las solicitudes de entrada. Cada ruta tiene un conjunto de condiciones y si la solicitud cumple con esas condiciones, esta es dirigida al servicio asociado. Por ejemplo, una ruta puede requerir coincidencia con la IP o el dominio del emisor, con métodos HTTP, partes de la URI o una combinación de lo anterior. Podemos comenzar creando un servicio con los siguientes valores: campo valor descripción name test-iris El nombre que le damos al servicio host xxx.xxx.xxx.xxx Dirección IP pública de nuestra instancia port 52773 El puerto utilizado para nuestra solicitud HTTP protocol http El protocolo que soporta Para todos los demás campos, mantendremos los valores por defecto. Ahora crearemos una ruta: campo valor descripción paths /api/atelier Las solicitudes con esta ruta serán dirigidas al servicio definido protocols http El protocolo que se soporta service_id xxxx Id del servicio al que serán dirigidas las solicitudes entrantes De nuevo, mantén los valores por defecto para todo lo demás. IAM por defecto está escuchando en el puerto 8000 para las solicitudes entrantes por defecto. Desde este momento las solicitudes que se envíen a http://localhost:8000 y comiencen con la ruta /api/atelier serán dirigidas a nuestra instancia IRIS. Probemos el funcionamiento con un cliente REST (estoy usando Postman aquí). Enviamos un HTTP GET a http://localhost:8000/api/atelier/ y efectivamente devuelve una respuesta de nuestra Instancia IRIS. Cada solicitud se procesa a través del IAM y se monitorizan métricas como el código de estado HTTP, la latencia y el consumidor (si se configura). Realicemos un par de solicitudes más (incluyendo solicitudes donde no existe el endpoint como /api/atelier/test/) y podremos ver todas ellas agregadas en el cuadro de mando: Trabajando con complementos (plugins) Ahora que tenemos una ruta básica definida, podemos comenzar a administrar el tráfico. Además ya podemos comenzar a agregar comportamientos que complementen nuestro servicio. Ahora sucede la magia. La forma más común de imponer un determinado comportamiento es agregar un complemento. Los complementos aíslan una cierta funcionalidad y, por lo general, se pueden conectar a ciertas partes de IAM. Pueden asociarse a nivel global o solo a partes como a un usuario (grupo), un servicio o una ruta. Comenzaremos agregando un complemento de limitación de volumen a nuestra ruta. Lo que necesitamos para establecer el enlace entre el complemento y la ruta es el identificador único de la ruta. Puede buscarlo viendo los detalles de la ruta. Copie el identificador que tenga tu ruta para usarlo en el siguiente paso. Haga clic en Complementos (Plugins) en el menú de la barra lateral izquierda. Por lo general, verá todos los complementos activos en esta pantalla, pero como este nodo es relativamente nuevo, todavía no hay complementos activos. Por lo tanto, continúe seleccionando "Agregar nuevo complemento". El complemento que buscamos está en la categoría "Control de tráfico" y se llama "Limitación de volumen" (Rate Limiting). Hay bastantes campos que puede definir aquí, ya que los complementos son muy flexibles, pero ahora solo nos interesan dos campos: campo valor descripción route_id ***** Identificador de tu ruta config.minute 5 Número de llamadas permitidas por minuto Eso es. El complemento está configurado y activo. Probablemente haya visto que podemos elegir entre una variedad de intervalos de tiempo, como minutos, horas o días, pero deliberadamente usé minutos, ya que esto nos permite comprender fácilmente el impacto de este complemento. Si vuelve a enviar la misma solicitud en Postman, se darás cuenta de que la respuesta vuelve con 2 encabezados adicionales. XRateLimit-Limit-minute (valor 5) y XRateLimit-Remaining-minute (valor 4). Esto le dice al cliente que puede hacer hasta 5 llamadas por minuto y tiene 4 solicitudes más disponibles en el intervalo de tiempo actual. Si sigue haciendo la misma solicitud una y otra vez, eventualmente se quedará sin su cuota disponible y en su lugar obtendrá un código de estado HTTP 429 con la siguiente información: Si espera hasta que termine el minuto, podrás pasar solicitudes de nuevo. Este es un mecanismo bastante útil que permite lograr un par de cosas: Proteger su backend de picos de actividad Establecer una expectativa para el cliente sobre cuántas llamadas puede realizar de manera transparente para sus servicios Monetizar (potencialmente) en función del tráfico de la API mediante la introducción de niveles (por ejemplo, 100 llamadas por hora en el nivel de bronce e ilimitado con oro) Puede establecer valores para diferentes intervalos de tiempo y de este modo suavizar el tráfico API durante un período determinado. Digamos que permites600 llamadas por hora para una ruta determinada. Eso es 10 llamadas por minuto en promedio. Pero no está evitando que los clientes utilicen todas sus 600 llamadas en el primer minuto de su hora. Tal vez eso es lo que quiere. O tal vez le gustaría asegurarse de que la carga se distribuya más equitativamente a lo largo de la hora. Al establecer el campo config_minute en 20, se asegura de que los usuarios no realicen más de 20 llamadas por minuto y 600 por hora. Esto permitiría algunos picos en el intervalo de nivel de minutos, ya que solo pueden hacer 10 llamadas por minuto en promedio, pero los usuarios no pueden usar la cuota por hora en un solo minuto. Ahora les tomará al menos 30 minutos si alcanzan su sistema con plena capacidad. Los clientes recibirán encabezados adicionales para cada intervalo de tiempo configurado, por ejemplo: Cabecera Valor X-RateLimit-Limit-hour 600 X-RateLimit-Remaining-hour 595 X-RateLimit-Limit-minute 20 X-RateLimit-Remaining-minute 16 Por supuesto, hay muchas formas diferentes de configurar los límites de uso dependiendo de lo que se quiera lograr. Me detendré en este punto, ya que probablemente sea suficiente para el primer artículo sobre el InterSystems API Manager. Hay muchas más cosas que puedes hacer con IAM, ¡acabamos de usar solo uno de los más de 40 complementos y aún no hemos usado todos los conceptos básicos! Aquí hay un par de cosas que puede hacer también y que podríamos cubrir en futuros artículos: Agregar un mecanismo de autenticación central para todos sus servicios Escalar horizontalmente mediante solicitudes de balanceo de carga a múltiples destinos que admiten el mismo conjunto de APIs Presentar nuevas funciones o correcciones de errores a un público más pequeño y monitorizar cómo funciona antes de abrirlo a todos Incorporar desarrolladores internos y externos y proporcionarles un portal de desarrolladores dedicado y personalizable que documente todas las API a las que tienen acceso Cachear respuestas que se solicitan a menudo para reducir la latencia de respuesta y la carga en los sistemas de servicio No deje de probar IAM y cuéntenos qué le parece en los comentarios a este artículo. Hemos trabajado duro para ofrecer esta funcionalidad y estamos ansiosos por saber qué desafíos se pueden superar ahora con esta tecnología. Más recursos El comunicado de prensa oficial se puede encontrar aquí: InterSystems IRIS Data Platform 2019.2 introduces API Management capabilities Un pequeño video animado de introducción: What is InterSystems API Manager Un video de 8 minutos, explicando brevemente algunas de las cuestiones principales: Introducing InterSystems API Manager La documentación forma parte de la documentación regular de IRIS: InterSystems API Manager Documentation
Anuncio
David Reche · 2 oct, 2019

Servicio de Evaluación de InterSystems IRIS

Hola a todos: Es un placer anunciar que ya está disponible el Servicio de Evaluación! Si eres Usuario Final o un Partner de InterSystems y quieres probar la última versión de InterSystems IRIS con todas las características empresariales disponibles (mirroring, ECP, sharding) y quieres hacerlo ya, esto es para ti. El Servicio de Evaluación permite tener disponible en tus manos un kit de InterSystems IRIS con una licencia completa para tus pruebas y evaluación en menos de 1 minuto. Sin papeleos. Sin necesidad de hablar con nadie. Totalmente auto-servicio. Este servicio está disponible solo para IRIS e IRIS for Health y es muy fácil de usar. Hay dos formas de llegar a este servicio: WRC - Si eres usuario final o partner y tienes cuenta en nuestro Worldwide Response Center puedes acceder al servicio desde http://wrc.intersystems.com Partner Hub - Si eres un partner, puedes acceder al servicio utilizando el nuevo Partner Hub en http://partnerhub.intersystems.com WRC Para acceder al servicio usando el WRC debes tener una cuenta de usuario de WRC. Si necesitas ayuda para configurar tu cuenta, por favor envía un correo a support@intersystems.com y desde allí te ayudaremos con mucho gusto. Una vez que dispongas de acceso al WRC, tan solo haz clic en Online Distributions. Y luego click en el botón Evaluations. Partner Hub Si eres Partner de InterSystems puedes acceder al servicio de evaluación desde el WRC o desde el Partner Hub. Verás el botón Evaluation Service en el cuadro de mando principal. El Servicio Esta es una captura de pantalla del servicio: ¡Es muy sencillo! Tan solo escoge un producto, escoge una plataforma, escoge una versión y haz clic en el gran botón verde! El servicio de evaluación te enviará el fichero de licencia para usar en el producto, plataforma y versión de IRIS que hayas elegido y comenzará la descarga del kit. ¿Cuál es el tamaño de la licencia de evaluación? La licencia permite el uso de 256 cores y tiene todas las características empresariales habilitadas (Mirroring, ECP y Sharding). También dispone de NLP, Interoperabilidad y Analítica. Resumiendo, todo está incluido y la licencia es válida durante 35 días. ¿Qué ocurre cuando la licencia caduca? Después de 35 días, la licencia caducará. Puedes volver al servicio y obtener otra nueva. Tan simple como eso. Cada vez que solicites una nueva licencia o renueves la existente el gerente de cuenta asignado recibirá una notificación. De está manera podrá ofrecerte ayuda en el proceso de evaluación. ¿Dónde está IRIS 2019.1.1? IRIS 2019.1.1 permite actualización in-situ de Caché y Ensemble y puede utilizar el nuevo IRIS API Management. Pero IRIS y IRIS for Health 2019.1.1 no están disponibles en el servicio de evaluación ya que la versión 2019.1.1 aún está en Preview. Si quieres probarlo puedes hacerlo gratuitamente cuando quieras desde la zona de WRC Preview, así como una licencia de evaluación sin necesidad de usar el servicio de evaluación. Cuando IRIS 2019.1.1 se libere con disponibilidad general, el servicio de evaluación será el lugar más rápido y sencillo para obtener un licencia completa de evaluación. ¿Dónde solicito ayuda? Si tienes dudas, simplemente envíanos un correo a support@intersystems.com y estaremos encantados de ayudarte!
Artículo
Ricardo Paiva · 14 ene, 2020

Escalabilidad horizontal con InterSystems IRIS

Nuestra plataforma de datos InterSystems IRIS es una plataforma perfecta para todo lo que necesite realizar con sus datos, ya sean transacciones, análisis o ambos. Incluye muchas de las funciones de Caché y Ensemble que nuestros clientes ya conocen, y en este artículo descubriremos un poco más acerca de una de sus nuevas funcionalidades: SQL Sharding. Si solo dispone de 5 minutos, puede echar un vistazo a este sencillo vídeo para aprender más sobre la escalabilidad. O puede seguir leyendo... Escalabilidad vertical y horizontal Ya sea porque gestionan millones de ventas o porque tratan a decenas de miles de pacientes al día, una plataforma de datos que ofrezca soporte a esas empresas debería ser capaz de enfrentarse eficientemente con la gestión de datos a gran escala. Eficientemente significa que los desarrolladores y los usuarios no tengan que preocuparse por esos números y puedan concentrarse en su negocio, mientras que la plataforma se encarga de la escalabilidad. Durante muchos años, Caché fue compatible con la escalabilidad vertical, donde los avances en el hardware son beneficiosos para el software, al aprovechar de manera eficiente un gran número de núcleos y enormes cantidades de RAM. En este tipo de escalabilidad, un buen esfuerzo inicial por establecer las dimensiones puede proporcionarle un sistema perfectamente equilibrado, pero existe un límite inherente a lo que se puede lograr con un solo sistema para que este sea rentable. Entonces surge la escalabilidad horizontal, donde la carga de trabajo se distribuye entre varios servidores separados que trabajan en conjunto, en vez de utilizar uno solo. Caché fue compatible con los servidores para aplicaciones ECP como una manera de escalar horizontalmente, pero InterSystems IRIS ahora también añade SQL sharding. ¿Cuál es la novedad? Entonces, ¿cuál es la diferencia entre los servidores para aplicaciones ECP y la nueva funcionalidad de sharding? Para entender en qué son diferentes, vamos a examinar más de cerca las cargas de trabajo. Una carga de trabajo puede consistir en decenas de miles de pequeños dispositivos que escriben continuamente pequeñas cantidades de datos en la base de datos, o un grupo de analistas que realizan consultas analíticas, que ocupan los GB disponibles para datos, al mismo tiempo. ¿Cuál de ellos tiene la escala más grande? Es difícil saberlo. Las cargas de trabajo tienen más de una dimensión y, por lo tanto, la escalabilidad que necesitan también debe ser un poco más especializada. Para explicarlo de manera general, vamos a considerar los siguientes componentes en la carga de trabajo de una aplicación: N representa la carga de trabajo del usuario y Q el tamaño de la consulta. En los ejemplos que vimos anteriormente, la primera carga de trabajo tiene una N grande pero una Q pequeña y la siguiente carga de trabajo tiene una N pequeña y una Q grande. Los servidores para las aplicaciones ECP son excelentes para soportar N grandes, ya que permiten particionar la aplicación del usuario entre diferentes servidores. Sin embargo, esto no necesariamente es útil si el conjunto de datos es muy grande y el conjunto de trabajo no cabe en la memoria de un solo equipo. Sharding se encarga de las Q grandes, lo que le permitirá particionar el conjunto de datos entre varios servidores, al mismo tiempo que se reduce al máximo el trabajo que realizan los servidores de shard. SQL Sharding Entonces, ¿qué hace realmente el sharding? Es una funcionalidad de SQL que permite la división de los datos en conjuntos desarticulados de filas dentro de una tabla "sharded", que se almacenan en los servidores "shard". Cuando se conecte al "shard" maestro, seguirá viendo esta tabla como si fuera una tabla única con todos los datos dentro de ella, pero las consultas que se realicen allí se dividirán en consultas "shard" locales y se enviarán a todos los servidores "shard". Una vez allí, los servidores "shard" calcularán los resultados basándose en los datos que almacenaron de forma local y enviarán sus resultados al "shard" maestro. Éste junta los resultados, realiza la combinación lógica que sea relevante y devuelve los resultados a la aplicación. Aunque este sistema es trivial para utilizarlo con una simple tabla SELECT * FROM, en el fondo, existen una gran cantidad de razonamientos lógicos que garantizan que se pueda usar en (casi) cualquier consulta SQL y que la mayor cantidad de trabajo se envíe hacia los fragmentos para aprovechar al máximo el paralelismo. El "shard" principal, que define qué filas y dónde van, es el que le permite anticipar los patrones de consulta más frecuentes. Y aún más importante, si puede garantizar que las tablas que usualmente se unen (JOIN) entre sí se fragmentan a lo largo de los mismos "shard" principales, las uniones (JOINS) pueden resolverse por completo al nivel "shard", lo que le proporcionará el elevado rendimiento que busca. Por supuesto, esto es solo un avance y aún faltan muchas cosas por descubrir, pero lo más importante es lo que representa la imagen anterior: SQL sharding es como una nueva receta en el libro de los platos altamente escalables que usted puede cocinar con InterSystems IRIS. Es un complemento a los servidores para aplicaciones ECP y se centra en el tamaño de los conjuntos de datos complejos, lo que le convierte en una buena opción para la mayoría de los casos en los que se realicen análisis. Al igual que los servidores para aplicaciones ECP, es totalmente transparente durante su uso y cuenta con algunas variaciones de arquitectura para escenarios muy específicos. Para saber más... Puede ver un par de ponencias sobre el tema, realizadas en el Global Summit 2017. Los vídeos están disponibles en estos enlaces: What's Lurking in Your Data Lake, un resumen técnico sobre la escabilidad y el sharding en particular We Want More! Solving Scalability, un resumen sobre las aplicaciones principales que requieren de una plataforma altamente escalable y en learning.intersystems.com También puede consultar este curso online sobre InterSystems IRIS y descubrir otras funcionalidades de la nueva plataforma. Si quiere probar el sharding en algún caso particular, entre en http://www.intersystems.com/iris.
Anuncio
Esther Sanchez · 24 ene, 2020

InterSystems Iberia Summit 2020

¡Hola Comunidad! Estamos encantados de invitaros a una edición más del Iberia Summit 2020, que se celebrará los días 18 y 19 de febrero en Barcelona. ¡Sois todos más que bienvenidos al hotel Meliá Sarriá! Los "Local Summits" de InterSystems se celebran en distintos países y constituyen el principal evento en torno a su comunidad y su tecnología: una reunión de empresas y desarrolladores, a la vanguardia de sus respectivos sectores. El evento atrae una gran variedad de asistentes, desde directivos a expertos en diversos campos, gerentes, ejecutivos y desarrolladores. Los asistentes se reúnen para contactar con colegas y con partners de InterSystems, para aprender mejores prácticas de desarrollo y para conocer de primera mano las nuevas funcionalidades de los productos y las futuras innovaciones de InterSystems. Podéis ver la agenda, conocer a los ponentes e inscribiros al evento aquí >> ¡Os esperamos!
Anuncio
Esther Sanchez · 26 feb, 2020

Podcast 1. ¿Qué es InterSystems IRIS?

¡Hola Comunidad! Os traemos el primer episodio de nuestro nuevo podcast (Data Points), que trata sobre lo que es InterSystems IRIS en conjunto. Fue un placer charlar 15 minutos con @jennifer.ames sobre lo que hace diferente a IRIS. Y también nos contó los mejores usos de la tecnología de InterSystems que ella ha visto en todos sus años trabajando como formadora primero y como desarrolladora de contenido online después. Puedes escuchar el podcast dandole a Play o entrando en la web de Data Points: datapoints.intersystems.com
Anuncio
David Reche · 5 mar, 2020

Primer Concurso para Desarrolladores de InterSystems

¡Hola desarrolladores! Este mes de marzo lanzamos nuestro primer Concurso de Programación con InterSystems IRIS! El objetivo del concurso es crear soluciones de código abierto utilizando InterSystems IRIS Data Platform. El tema del primer concurso es InterSystems IRIS, Docker y ObjectScript. El concurso estará activo durante tres semanas, del 9 al 31 de marzo de 2020. Premios: Habrá una Nominación de los Expertos, en la que los ganadores serán elegidos por un jurado especialmente formado para el concurso. Los premios serán: 🥇 1er puesto - $2,000 🥈 2º puesto - $1,000 🥉 3er puesto - $500 Además, habrá una Nominación de la Comunidad, en la que ganará la aplicación que obtenga el mayor número total de votos. El premio será: 🏆 1er puesto - $1,000 Los ganadores también recibirán las insignias de mayor nivel del programa de fidelización Global Masters. Requisitos generales: 1. La aplicación debe ser publicada bajo una licencia de código abierto (Open Source), como la licencia MIT, por ejemplo. 2. La aplicación debe ser aprobada y publicarse en Open Exchange. 3. La aplicación debe utilizar InterSystems IRIS o InterSystems IRIS for Health. 4. Pueden participar tanto aplicaciones nuevas como ya existentes. 5. Cada concursante puede presentar un número ilimitado de aplicaciones. ¿Quién puede participar? Cualquier miembro registrado en la Comunidad de Desarrolladores de cualquier país puede participar en el concurso, excepto los empleados de InterSystems. Jurado: Los miembros del jurado para la Nominación de Expertos serán Product Managers de InterSystems, moderadores de la Developer Community y embajadores de Global Masters con nivel VIP, Embajador y Experto. Cada miembro del jurado solo podrá votar por una aplicación. El valor de los votos es el siguiente: Votos de los Product Managers - 3 puntos Votos de los Moderadores - 2 puntos Votos de los miembros de Global Master con nivel VIP - 2 puntos Votos de los miembros de Global Master con nivel Embajador - 1 punto Votos de los miembros de Global Master con nivel Experto - 1 punto Los miembros del jurado para la Nominación de la Comunidad serán cualquier miembro registrado de la Comunidad, que al menos haya publicado una vez en la Comunidad. Los votos para esta Nominación valdrán 1 punto. Los miembros de los jurados pueden participar en el concurso, pero no podrán votar por sus propias aplicaciones. Criterios del jurado: En la Nominación de los Expertos, se elegirá la aplicación que mejor cumpla los siguientes criterios: Que haga del mundo un lugar mejor o que mejore la vida de los desarrolladores; Que tenga la mejor funcionalidad - cuánto hace la librería/aplicación Que tenga código ObjectScript legible y de calidad. Duración del concurso: Del 9 al 22 de marzo de 2020: Dos semanas para subir las aplicaciones a Open Exchange (durante este período, se podrán modificar los proyectos). Del 23 al 29 de marzo de 2020: Una semana para votar. Los ganadores serán anunciados el día 30 de marzo de 2020. El tema ➡️ InterSystems ObjectScript e InterSystems IRIS en Docker Container ⬅️ Se elegirá la mejor aplicación desarrollada con InterSystems ObjectScript y que pueda ser lanzada o bien sobre InterSystems IRIS Community Edition (IRIS CE) o InterSystems IRIS for Health Community Edition (IRIS CE4H). Requisitos de InterSystems IRIS CE Docker y ObjectScript: Si se clona o descarga la aplicación, debe ser ejecutable, por ejemplo, con: $ docker-compose up -d Ejemplo de la aplicación >> La aplicación puede ser implementada como CLI, con ejecución desde el terminal de IRIS, por ejemplo: $ docker-compose exec iris iris session iris Node: 981b8e5c8f7a, Instance: IRIS USER>w ##class(Your.Application).Run() Para un ejemplo dado, el test será: $ docker-compose exec iris iris session iris Node: 981b8e5c8f7a, Instance: IRIS IRISAPP>w ##class(PackageSample.ObjectScript).Test() It works! IRISAPP> El archivo README.md en la descripción debe contener una sección que describa cómo se puede probar la funcionalidad mediante CLI. Se aceptan repositorios GitHub que están reconocidos por GitHub como ObjectScript, por ejemplo este: Para que Github pueda introducir esta indicación, guarde su código ObjectScript en archivos con extensión.cls. Se puede usar la siguiente plantilla de ObjectScript. Solo hay que sustituir los archivos en la carpeta /src folder por la nueva solución, o usarla como una plantilla de GitHub para los nuevos repositorios de GitHub, o importar el conjunto de ficheros para habilitar Docker. Más información. Aquí se puede ver un vídeo sobre cómo hacer un repositorio desde una plantilla de GitHub. Hay varios ejemplos de aplicaciones que encajan en el tema del concurso, cumplen con el requisito de usar IRIS Community Edition y correr sobre Docker: Python Gateway, Healthcare XML, Document Template, Game of Life, ForEach, ObjectScript Template. ¡Recuerda, comenzaremos dentro de muy poco! Déjanos tus preguntas o dudas en los comentarios. Seguiremos informando... Solo para dar alguna idea de que se podría enviar al concurso, echa un ojo a Rosetta Code - hay un montón de oportunidades de implementar esto u otros algoritmos populares que ya están implementados en otros lenguajes pero no en ObjectScript.
Anuncio
Esther Sanchez · 10 jul, 2020

Podcast 6: Certificación en InterSystems

¡Hola desarrolladores! Os traemos el sexto episodio de Data Points, el podcast de InterSystems en inglés. En esta ocasión, charlamos con @James.Kantor, Certification Manager en InterSystems, sobre el Programa de Certificación de la empresa- qué exámenes ofrece en la actualidad, cuáles están en desarrollo y por qué son importantes para desarrolladores y empresas. ¡Dadle al play! También podéis escuchar el podcast entrando en la web de Data Points: datapoints.intersystems.com. ¿Queréis escuchar los episodios anteriores del podcast?: Episodio 5. Bases de Datos en Mirroring para Alta Disponibilidad Episodio 4. Optimización del rendimiento de tus consultas SQL Episodio 3. IntegratedML en InterSystems IRIS Episodio 2. ¿Qué es Kubernetes? Episodio 1. ¿Qué es InterSystems IRIS? Esperamos que os resulte útil
Anuncio
Eduardo Anglada · 4 sep, 2020

Lanzamiento del Registro de Contenedores de InterSystems

¡Hola desarrolladores! Es un placer anunciar la disponibilidad del Registro de Contenedores de InterSystems. Es un nuevo canal para que los clientes tengan acceso a las versiones finales y de prueba de software, en formato apto para contenedores. Todas las imágenes Community Edition están disponibles en un repositorio público que no necesita autenticación. Las imágenes finales (IRIS, IRIS for Health, Health Connect, System Alerting and Monitoring, InterSystems Cloud Manager) y las utilidades (como pueden ser arbiter, Web Gateway y PasswordHash) requieren un token de autenticación que se genera a partir de las credenciales de la cuenta del WRC. La página de distribución de software del Centro de Soporte Internacional (WRC) seguirá siendo el canal de distribución de imágenes en otros formatos, pero ya se pueden configurar sus pipelines CI/CD para hacer ‘docker pull’ de las imágenes directamente del Registro de Contenedores de InterSystems. La primera versión del Registro de Contenedores de InterSystems sólo distribuye imágenes de contenedores. En el futuro, está planeado que proporcione todo el contenido disponible, como kits completos, drivers, archivos de configuración, etc El Registro está disponible en https://containers.intersystems.com. Las instrucciones de uso se encuentran en la tabla de esta publicación y en el fichero PDF adjunto. Si encuentras algún problema o tienes cualquier sugerencia, escríbenos en los comentarios abajo o contacta con support@intersystems.com. -------------------------------------------------------------- Cómo usar el Registro de Contenedores de InterSystems Este documento contiene un listado de imágenes disponibles en el Registro de Contenedores de InterSystems (RCI), situado en containers.intersystems.com, e incluye instrucciones para usarlo. Las imágenes se pueden descargar usando el comando docker pull, por ejemplo: docker pull containers.intersystems.com/intersystems/iris-community:2020.2.0.211.0 Este documento contiene las siguientes secciones: Imágenes públicas Imágene de acceso restringido Autenticación en el RCI Listado del contenido del RCI Imágenes públicas Las siguientes imágenes del RCI son públicas y no requieren autenticación: InterSystems IRIS IntegratedML (preview) containers.intersystems.com/intersystems/iris-aa-community:2020.3.0AA.331.0 Community Edition 2020.2 containers.intersystems.com/intersystems/iris-community:2020.2.0.211.0 2020.3 (preview) containers.intersystems.com/intersystems/iris-community:2020.3.0.200.0 2020.2 ARM64 containers.intersystems.com/intersystems/iris-community-arm64:2020.2.0.211.0 2020.3 ARM64 (preview) containers.intersystems.com/intersystems/iris-community-arm64:2020.3.0.200.0 InterSystems IRIS for Health IntegratedML (preview) containers.intersystems.com/intersystems/irishealth-aa-community:2020.3.0AA.331.0 Community Edition 2020.2 containers.intersystems.com/intersystems/irishealth-community:2020.2.0.211.0 2020.3 (preview) containers.intersystems.com/intersystems/irishealth-community:2020.3.0.200.0 2020.2 ARM64 containers.intersystems.com/intersystems/irishealth-community-arm64:2020.2.0.211.0 2020.3 ARM64 (preview) containers.intersystems.com/intersystems/irishealth-community-arm64:2020.3.0.200.0 System Alerting and Monitoring 1.0 containers.intersystems.com/intersystems/sam:1.0.0.115 Imágenes de Accesso Restringido Las siguientes imágenes del RCI solo están disponibles para usuarios autentificados: Arbiter 2020.1 containers.intersystems.com/intersystems/arbiter:2020.1.0.215.0 2020.2 containers.intersystems.com/intersystems/arbiter:2020.2.0.211.0 2020.3 (preview) containers.intersystems.com/intersystems/arbiter:2020.3.0.200.0 2020.3 ARM64 (preview) containers.intersystems.com/intersystems/arbiter-arm64:2020.3.0.200.0 Health Connect 2020.1 containers.intersystems.com/intersystems/healthconnect:2020.1.0.215.0 2020.3 ARM64 (preview) containers.intersystems.com/intersystems/healthconnect-arm64:2020.3.0.200.0 InterSystems Cloud Manager (ICM) 2020.1 containers.intersystems.com/intersystems/icm:2020.1.0.215.0 2020.2 containers.intersystems.com/intersystems/icm:2020.2.0.211.0 2020.2 ARM64 containers.intersystems.com/intersystems/icm-arm64:2020.2.0.211.0 2020.3 (preview) containers.intersystems.com/intersystems/icm:2020.3.0.200 InterSystems IRIS 2020.1 containers.intersystems.com/intersystems/iris:2020.1.0.215.0 2020.2 containers.intersystems.com/intersystems/iris:2020.2.0.211.0 2020.3 (preview) containers.intersystems.com/intersystems/iris:2020.3.0.200.0 2020.1 ARM64 containers.intersystems.com/intersystems/iris-arm64:2020.1.0.215.0 2020.2 ARM64 containers.intersystems.com/intersystems/iris-arm64:2020.2.0.211.0 2020.3 ARM64 (preview) containers.intersystems.com/intersystems/iris-arm64:2020.3.0.200.0 InterSystems IRIS for Health 2020.1 containers.intersystems.com/intersystems/irishealth:2020.1.0.217.1 2020.2 containers.intersystems.com/intersystems/irishealth:2020.2.0.211.0 2020.3 (preview) containers.intersystems.com/intersystems/irishealth:2020.3.0.200.0 2020.1 ARM64 containers.intersystems.com/intersystems/irishealth-arm64:2020.1.0.217.1 2020.2 ARM64 containers.intersystems.com/intersystems/irishealth-arm64:2020.2.0.211.0 2020.3 ARM64 (preview) containers.intersystems.com/intersystems/irishealth-arm64:2020.3.0.200.0 PasswordHash 1.0 containers.intersystems.com/intersystems/passwordhash:1.0 Web Gateway 2020.2 containers.intersystems.com/intersystems/webgateway:2020.2.0.211.0 2020.3 (preview) containers.intersystems.com/intersystems/webgateway:2020.3.0.200.0 2020.3 ARM64 containers.intersystems.com/intersystems/webgateway-arm64:2020.3.0.200.0 Autenticación en el RCI Estos son los pasos a seguir: Ve a https://containers.intersystems.com/ e inicia sesión con tus credenciales de InterSystems/WRC. Copia el token del login de Docker login token, o el comando completo. En la interfaz de Docker que estés usando (PowerShell en MS Windows o la línea de comando de Linux), autentíquese usando las credenciales obtenidas en el paso anterior. Puedes hacerlo copiando y pegando el comando docker login: docker login -u="bbinstoc" -p="provided_password" containers.intersystems.com Por razones de seguridad, puede que quieras hacerlo en dos pasos: primero ejecuta el comando docker login containers.intersystems.com, y después introduce tu usuario y copia tu contraseña. Nota: Si ya has iniciado sesión en otro registro de imágenes de Docker, debes cerrar esa sesión antes de usar el RCI. Ya puedes descargar imágenes del CRI, por ejemplo: docker pull containers.intersystems.com/intersystems/iris:2020.2.0.211.0 Listado del contenido del RCI Existen APIs para listar imágenes y etiquetas de un registro Docker. Un ejemplo es la útilidad docker-ls, que ha sido desarrollada por terceros y se encuentra disponible en https://github.com/mayflower/docker-ls. Para obtener docker-ls, puedes: Descargar imágenes precompiladas de docker-ls Instalar la utilidad directamente, por ejemplo en algunos sistemas Linux con el comando sudo snap install docker-ls Descargar y usar la imagen carinadigital/docker-ls:latest, por ejemplo: docker run --rm carinadigital/docker-ls:latest Una vez completada la instalación, puedes usar este comando para listar el contendido del RCI: docker-ls repositories --registry https://containers.intersystems.com --user username --password password Nota: Usa la opción --interactive-password para ser preguntado por la contraseña en vez de incluirla en el propio comando. Para listar las imágenes públicas, emplee cadenas vacías (“”) como argumentos para las opciones de --user y --password. Por ejemplo, el siguiente comando solo lista las imágenes públicas de InterSystems IRIS for Health: docker-ls tags --registry https://containers.intersystems.com --user "" --password "" intersystems/irishealth-community Si quieres ver la lista de imágenes no públicas, siempre debe usar las opciones de usuario y contraseña, independientemente de que haya iniciado sesión en containers.intersystems.com. Puedes encontrar más ejemplos en https://github.com/mayflower/docker-ls