Tenemos un escenario bastante complejo pero creo que es sencillo de explicar y que quede claro.
Estamos desarrollando un ejecutador de tareas que corre en un servidor con una timezone indiferente.
Tenemos un escenario bastante complejo pero creo que es sencillo de explicar y que quede claro.
Estamos desarrollando un ejecutador de tareas que corre en un servidor con una timezone indiferente.
Sobreescribiendo el método Read (que tiene un tipo de retorno %CacheString) en una nueva clase que hereda de %Stream.FileCharacter, se obtiene un error de compilacion informando que el tipo de retorno es incorrecto y ha de ser Binary, aun cuando matchea la firma del padre.
Mirando la global de codigo compilado vemos:
^oddCOM("%Stream.FileBinary","m","Read",42)="%Library.Binary"
Despues de más investigaciones encontramos que hay un método generator que mira la definicion de clase OdbcType.
Seteandolo a LONGVARCHAR nos da:
^oddCOM("User.CStream","m","Read",42)="%Library.String"
Recientemente hemos encontrado que compilando una clase ObjectScript que tiene una proyeccion java, usanfo el flag -d, lo ignora en la parte de la proyeccion:
.png)
Despues de hablar con intersystems afortunadamente proveeran una solucion que se incluye en la siguiente release:
.png)
¡Hola a todos!
Hace poco aprendí algo nuevo mientras trabajaba en un problema con el Centro de Soporte Internacional (WRC), y quería compartirlo con todos por si pudiera ayudar a alguien más.
Tienes archivos que se escriben inexplicablemente en una carpeta de tu servidor y, debido a la cantidad de archivos en la carpeta y al rendimiento general del sistema, no es posible trabajar sobre los archivos para localizar el origen.
A veces necesitas importar datos a IRIS de forma rápida y sencilla. Por eso se ha desarrollado un gestor de importación en IRIS.
Esta aplicación permite importar datos en formato JSON y también ofrece una interfaz muy sencilla para transferir datos desde colecciones en MongoDB a globals en IRIS. Nunca ha sido más fácil.
Vamos a ver unos ejemplos.
Importación de JSON
Supongamos que tenemos datos en formato JSON y queremos importarlos a IRIS. Para hacerlo, solo tienes que especificar el nombre del global e insertar los datos. Tras la importación, verás los datos importados.
Este es Iris-key-uploader, un front-end en Angular con su API REST.
El objetivo de este proyecto es importar fácilmente archivos de claves a IRIS desde una interfaz de usuario web.
Desafortunadamente el panel de IRIS para cambiar la clave no da la oportunidad de subir la licencia.

Como se puede ver, solo se puede navegar desde el lado del servidor.
¿Qué pasa si no se tiene un acceso directo a él?
Te gustaría tener una página web sencilla para subir la nueva clave y activarla.
Ese es el propósito de este proyecto.
Una unidad de código en ObjectScript (pongamos, un ClassMethod) puede producir una gran variedad de efectos secundarios inesperados cuando interactúa con partes del sistema que están fuera de su propio alcance y no han sido depuradas adecuadamente.
En los recientes trabajos de benchmarking a gran escala, observamos un tiempo excesivo de uso del CPU %sys que afectó negativamente en la escalabilidad de la aplicación.
Problema
Encontramos que gran parte del tiempo se pasó llamando a la llamada localtime() del sistema, debido a que la variable de entorno TZ no estaba configurada. Se creó una rutina de prueba sencilla para confirmar la observación, y las diferencias entre el tiempo transcurrido y los recursos que necesitó la CPU con la variable TZ vs. cuando TZ no estaba establecida, fueron extraordinarios.
¿Alguien sabe si hay una manera fácil de saber si la ejecución del comando $ System.SQL.PurgeForTable ha ido bien / mal?
La documentación describe que se devuelve un string, pero de hecho hay un bonito Quit "" en el código.
¿Quizás dentro de PurgeForTable ^% apiSQL hay alguna variable de proceso establecida cuando va bien / mal?
¡Muchas gracias!
Hace poco, tuve que generar una especificación en Swagger a partir de clases persistentes y en serie, así que ahora publico el código (no está completo, aún queda resolver las especificaciones de la aplicación, pero es un comienzo).
El código está disponible aquí.
Supongamos que tenemos estas clases:
Uno de los principales beneficios de ObjectScript es la velocidad y eficiencia que ofrece a un desarrollador experimentado. Veamos un ejemplo de todos los beneficios que se pueden obtener con ObjectScript.
Imagina que tienes una clase que almacena nombres de sus usuarios. Llamaremos a la clase **Data.User**, y le daremos las mismas propiedades que tiene una cadena _Name_. A continuación, necesitaremos un método para crear un nuevo usuario o actualizar uno ya existente.
Este artículo fue creado como efecto secundario de las preparaciones para un conjunto más extendido de artículos sobre la simple, pero útil, implementación de MapReduce en Caché. Estaba buscando una forma relativamente fácil de pasar argumentos a (potencialmente) múltiples objetivos mediante mecanismos de invocación remota. Y tras varios intentos, me di cuenta de que en el ObjectScript de Caché contamos con mecanismos muy potentes que podrían ser de utilidad para esto: dynamix dispatching para métodos y propiedades.
A partir de Caché 5.
Esto lo escribo más para ayudar a mi memoria que para otra cosa. Pensé en compartirlo, porque a menudo aparece en los comentarios, pero no está en la documentación de InterSystems.
Hay una utilidad increíble que se llama ^REDEBUG, que aumenta el nivel de información que se registra en mgr\cconsole.log.
Para activarla:
a) inicia el terminal/login
b) zn "%SYS"
c) do ^REDEBUG
d) cambia el nivel de registro a FFFFFFFF
Si estás en un sistema de producción (con mucho tráfico), sugiero que reproduzcas rápidamente el error, renombres el archivo cconsole.
¡Hola desarrolladores!
Cuando desarrollas o mantienes aplicaciones en Cache Object Script, en ocasiones es muy útil poder investigar dependencias.
He encontrado la tool Yuzinji que analiza el diccionario de clases y el código COS incluyendo rutinas y mete los resultados en el famoso Structure101g Studio.
Haciendo esto se vuelve sencillo responder a preguntas como "¿Quien usa ese código?", ya que se dispone de la información en un formato que permite explorar fácilmente. Por ejemplo analicé todos los packages en el namespace de SAMPLES de una 2016.
¡Hola desarrolladores!
Después de trabajar un poco con IRIS, queremos compartir con vosotros la "caja de herramientas" para InterSystems IRIS: ToolBox-4-Iris.
¿En qué consiste?
ToolBox-4-Iris es una API para IRIS que incluye un conjunto de herramientas muy útiles, no disponibles en IRIS y que simplifican enormemente el desarrollo de aplicaciones. Permite ahorrar tiempo y esfuerzo en las "herramientas típicas" que todo desarrollador necesita. Esto incluye clases adicionales, métodos individuales o incluso macros más eficientes, que se describen en sus respectivos paquetes.
¡Hola desarrolladores!
Estoy seguro de que la mayoría de vosotros ya conoceis la posibilidad de usar GZIP en los productos de InterSystems. Pero el problema es que GZIP trabaja con un único archivo o flujo de datos, y no admite carpetas. Al trabajar con sistemas Unix, es posible solucionarlo con la herramienta de compresión tar, incluida en cada sistema Linux de forma predeterminada. Pero ¿qué hacer si debemos trabajar también en Windows, que no lo incluye?
Me alegra poder enseñaros el nuevo proyecto, isc-tar, que os ayudará a no preocuparos del sistema operativo y os permitirá gestionar los archivos tar en cualquier sitio.
¡Hola desarrolladores!
Aquí podéis ver el anuncio del proyecto isc-tar de @Dmitriy Maslennikov. En ocasiones, la historia de porque se ha llegado a un resultado es igual o más interesante que el resultado: cómo se construyó, cómo funciona y qué sucede en torno al proyecto. Esta es la historia:
Os hablaré de todo eso.
Introducción
El propósito de este artículo es reforzar el perfil de un procedimiento muy potente que ha estado disponible desde hace mucho tiempo para nosotros, y abrir un debate sobre las maneras en que puede utilizarse (o explotarse).
Puedes leer más información sobre el el mecanismo aquí. En resumen, cuando definas una clase puedes utilizar la palabra clave Projection para referirte a una o más clases de proyección. Una clase de proyección permite implementar métodos que se llaman desde puntos clave en el ciclo de vida de tu clase.
Una clase de proyección debe contener %Projection.
Me gustaría saber si hay alguna forma de tener un callback o similar para clases persistentes, que se ejecute siempre después de la operacion (ya sea que falle o que vaya bien)
%OnOpen se ejecuta antes de la accion y no hay callback de after.
%OnAfterDelete y %OnAfterSave se ejecutan solo después de una operación satisfactoria.
Esta es una guía para principiantes, para el desarrollo de servicios web RESTful con Ensemble.
Antes de comenzar a leer esta breve introducción, lee la documentación de Ensemble, prestando especial atención al capítulo sobre creación de servicios y clientes REST con Ensemble (“Creating REST services and clients with Ensemble”)
El enfoque de esa documentación creo que es indiscutiblemente la forma más rápida y simple de crear servicios RESTful. Como principiante, leí la documentación y me quedaron varias dudas.
Los WebSockets, como tecnología de comunicación, están ganando una importancia cada vez mayor.
En el namespace SAMPLES puedes encontrar un buen ejemplo para ejecutar un WebSocket Server.
También hay un útil ejemplo para un Browser Client, pero sigue estando en el navegador.
La cuestión es:
¿Cómo consumir la salida de un WebSocket Server en tu aplicación?
Los WebSockets, como tecnología de comunicación, están ganando una importancia cada vez mayor.
En el namespace SAMPLES puedes encontrar un buen ejemplo para ejecutar un WebSocket Server.
También hay un ejemplo útil para un Browser Client en el cual JavaScript hace la mayor parte del trabajo.
La cuestión es:
¿Cómo consumir la salida de un WebSocket Server en tu aplicación?
¡Hola Comunidad!
Hace un par de días, un cliente me comunicó su intención de mejorar su aplicación legacy existente, que usa Servicios Web SOAP, por lo que comparte la misma autorización con su nueva API de aplicación basada en REST. Como su nueva aplicación usa OAuth2, el desafío estaba claro: cómo pasar un token de acceso con una solicitud SOAP al servidor.
Tras Googlear un poco, descubrí que una de las formas posibles de hacer esto era agregar un elemento de encabezado adicional al SOAP envelope y luego asegurarse de que la implementación del Webservice haga lo necesario para validar el token de acceso.
He estado leyendo la guía de documentación para 2018.1 sobre los planes de consultas congeladas varias veces en los últimos días ( enlace ) y hay una respuesta que no encuentro directamente.
¡Hola Comunidad!
Descubrí el Desarrollo Basado en Pruebas (TDD) hace casi 9 años y me enamoré del concepto inmediatamente.
Hoy se ha vuelto muy popular pero, desafortunadamente, muchas empresas no lo usan. Es más, muchos desarrolladores, sobre todo principiantes, ni siquiera saben exactamente qué es ni como usarlo.

Mi objetivo con este artículo es mostrar cómo usar TDD con %UnitTest. Mostraré mi flujo de trabajo y explicaré cómo usar cosFaker, un proyecto de @Henry Pereira, usando Caché y que hace poco lo subió a OpenExchange.
Así que... ¡preparaos que allá vamos!

¡Hola Comunidad!
Creo que hoy en día todo el mundo guarda el código fuente de sus proyectos en repositorios como Github, GitLab, bitbucket, etc. Lo mismo sucede con proyectos de InterSystems IRIS, se pueden ver algunos ejemplos en Open Exchange.
¿Qué hacemos cada vez que empezamos o continuamos nuestro trabajo con un repositorio en particular con la plataforma de datos InterSystems?
Hola a tod@s,
En recientes conversaciones, respuestas y comentarios, la redirección IO (con el famoso código) se veía como la solución indiscutible. Sin duda, es una solución potente y no solo permite registrar la salida, sino también hacer captura de teclas en la entrada.
Pero creo que para simplemente generar un registro (log), supone un sobretrabajo. Si solo necesitas obtener un texto o descargar sus variables u objetos, entonces SPOOL debería ser suficiente.
¡Hola Comunidad!
Esta publicación es para presentarles uno de los primeros proyectos en COS de @henry . Lo creó cuando empezó a aprender el lenguaje y lo sigue mejorando hasta hoy.
El CosFaker (aquí en Github) es una biblioteca de COS pura, para generar datos falsos.
cosFaker vs Utils de populación
¿Por qué usar cosFaker si Caché tiene la utilidad de popular datos?
La utilidad de populado tiene algunas características excelentes, como por ejemplo el generador de SSN, ¿pero qué hacer cuando tenemos un campo con una descripción larga de un producto?