Limpiar filtro
Anuncio
Jose-Tomas Salvador · 16 abr, 2020
Estoy encantado de anunciar que InterSystems se unirá a la comunidad de código abierto (open source) en el proyecto de Extensión de Visual Studio Code para InterSystems ObjectScript. A principios de este año Raj Singh publicó que emprendíamos un viaje para redefinir el futuro de nuestra estrategia en relación al IDE, y llegamos a la conclusión de que es Visual Studio Code el IDE que puede soportar ese futuro. Es rápido, estable, rico en funcionalidad, y construido sobre una arquitectura tecnológica moderna que nos da la posibilidad de ofrecerte una funcionalidad como nunca antes para tu trabajo con ObjectScript, particularmente en el área de DevOps, desarrollo continuo y programación colaborativa.
La comunidad de desarrolladores coincide con nosotros, ya que por primera vez desde que yo recuerdo, un producto ha captado más de la mitad del mercado de IDEs de propósito general. La historia con otros lenguajes es incluso más llamativa, con VS Code siendo utilizado exponencialmente más que cualquier otro IDE. Aparte de Java, que esta repartido de forma muy uniforme, el resto de comunidades de desarrolladores han elegido VS Code. La innovación sólo tiene lugar donde hay una comunidad para soportarla, y cada año más y más, ese lugar es VS Code.
Además de decidir sobre VS Code como plataforma, hemos tomado también una decisión significativa, en lugar de crear nuestra propia extensión desde cero, nos hemos unido a la comunidad de código abierto para impulsar el proyecto ya existente creado por @Dmitry.Maslennikov, que ha realizado un increible trabajo construyendo una herramienta con la cual muchos están ya haciendo un trabajo muy productivo con ObjectScript.
Nuestro misión para el proyecto es desarrollar el soporte en VS Code para flujos de trabajo basados en servidor que sean familiares para los clientes que llevan ya muchos años trabajando con InterSystems, a la vez que ofrecer un paradigma de flujo de trabajo centrado en cliente, más en linea con la forma de pensar y trabajar de la mayoría de programadores de hoy en día.
Para ser claros, todavía no estamos ahí, y llevar la herramienta actual a ese punto llevará tiempo. Pero esperamos entregar una versión de la extensión de VS Code para ObjectScript, con calidad de producción y soportada por InterSystems, hacia finales de año. Otro punto importante es que Studio continuará teniendo un lugar importante en nuestros planes de IDE por muchos años. Si Studio cubre tus necesidades, no tienes de qué preocuparte. Sigue siendo la herramienta de elección para aquellos con los requerimientos más sofisticados. Pero nuestros esfuerzos de desarrollo se centrarán en VS Code.
¿Qué sucede ahora?
Lo primero es dejarte que lo pruebes y nos des feedback. Con el fin de hacerlo más sencillo trabajaremos duro para hacer mejoras frecuentes de documentación en la Wiki del proyecto en GitHub.
Si encuentras algo que no funciona, o una característica que te gustaría tener, por favor añádelo al Panel de temas de GitHub (GitHub issues board). Sé que muchos usuarios no están familiarizados con GitHub, por lo que hablaremos un poco sobre eso aquí en las siguientes semanas.
Esto es código abierto
Probablemente habrás notado que el feedback y las comunicaciones sobre este producto se hacen de forma abierta. Esto seguira siendo software de código abierto, con InterSystems como una voz importante en la comunidad, pero para nada la única voz. Los principios del código abierto serán la base de todas las actividades alrededor de este proyecto, estructurado por los principios formales de governanza destacados en el fichero governance.md en el repositorio GitHub. Por remarcar algunos:
Cualquiera puede publicar un asunto (issue) – que puede ser un error (bug) or una petición de funcionalidad
Cualquiera puede enviar una petición de inclusión (pull request - PR) para añadir una funcionalidad, corregir un error o mejorar la documentación
Los committers (quienes aceptan finalmente los cambios) pueden aprovar PRs
El Comite de Gestión del proyecto (Project Management Committee - PMC) aprueba los committers y prioriza la lista de asuntos, y por lo tanto establece la hoja de ruta del proyecto
El PMC está presidido por @Dmitry.Maslennikov e incluye a 2 miembros de InterSystems y a @John.Murray
El PMC se esforzará por buscar el consenso pero requiere sólo mayoría simple
Qué es lo siguiente
Prueba VS Code e incluye tus apreciaciones, plantea tus issues. Procesaremos esa información durante las próximas semanas para trabajar en una hoja de ruta que nos llevará a la versión 1.0 de la release de producción que InterSystems soportará formalmente a través de los canales normales.
Aprende más acerca de este trabajo y las prácticas de desarrollo modernas en general. CaretDev, presentando @Dmitry.Maslennikov, ofreció un webinar el 14 de Abril, e InterSystems realizará un webinar dentrado en IDEs a mediados de Mayo. También publicaremos artículos aquí sobre varios temas relacionados con los IDE, tales como integración continua y pruebas, aprovechamiento de la nube con servicios como Azure DevOps, y gestión de proyectos multi-lenguaje.
Va a ser un año muy excitante para el desarrollo de herramientas en esta comunidad, y ¡estamos deseando ayudarte a llevar tu negocio a nuevos niveles!
Enlaces importantes
Instalación: https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript
Documentación: https://github.com/intersystems-community/vscode-objectscript/wiki
Issues: https://github.com/intersystems-community/vscode-objectscript/issues
Anuncio
Jose-Tomas Salvador · 3 jul, 2020
Ya está disponible la primera versión oficial (v1.0) de InterSystems System Alerting and Monitoring (InterSystems SAM) InterSystems SAM v1.0 proporciona una solución moderna de monitorización para productos basados en InterSystems IRIS. Permite vistas a alto nivel de grupos de instancias (clusters) así como la visualización de métricas bajando al nivel de nodos individuales, todo ello junto con la notificación de alertas. Esta primera versión permite visualizar más de 100 métricas del kernel de InterSystems IRIS, y los usuarios pueden extender la plantilla de Grafana que se incluye por defecto para adaptarla a sus gustos y necesidades. La v1.0 se ha concebido para ser un punto de referencia sencillo e intuitivo. ¡Ayúdanos a mejorarla probándola y enviándonos feedback! SAM puede mostrar información de instancias de IRIS a partir de la versión 2020.1 SAM sólo está disponible en formato contenedor. Necesitarás un contenedor con el SAM Manager junto a un pequeño conjunto de componentes adicionales de código abierto (Prometheus and Grafana) que son añadidos automáticamente por el fichero de composición al instalar/arrancar SAM.
Los componentes de SAM y el SAM Manager Community Edition están disponibles en:
la página de componentes del WRC como “SAM Components”, y la página de contenedores del WRC como “SAM Manager”
externamente vía el repositorio de componentes Github y en la página de contenedor de Docker Hub
Podéis encontrar la documentación aquí.
Anuncio
Esther Sanchez · 19 ene, 2021
¡Hola desarrolladores!
Os invitamos a un nuevo webinar en español: "Desarrolla un chatbot con Google Dialogflow, Telegram e InterSystems IRIS", el martes 2 de febrero, a las 4:00 PM (CET).
En este webinar:
aprenderás a desarrollar un chatbot que permita a los usuarios interactuar con un sistema de citas. Para ello, coordinaremos con InterSystems IRIS los servicios de Google Dialogflow y Telegram y el backend del sistema de citas
conocerás cómo puedes plantear añadir un chatbot para ayudar a los usuarios a utilizar tus servicios de una forma más inteligente
repasaremos los conceptos necesarios para poner en marcha un chatbot, qué necesitas preparar y cómo puedes diseñar la coordinación de diferentes servicios externos
¡Os esperamos a todos!
➡️ Podéis registraros aquí >> ¡Recordad que el webinar es el próximo martes día 2! Por si aún no os habéis apuntado :D El webinar empieza en 45 minutos.
Podréis seguirlo aquí: ➡️ Acceso al webinar
¡Os esperamos!
Anuncio
Esther Sanchez · 8 feb, 2021
¡Hola Comunidad!
¿No pudistéis ver el webinar que hicimos la semana pasada? Por si os lo perdisteis o lo queréis volver a ver, ya está disponible la grabación completa.
⏯ Webinar: Desarrolla un chatbot con Google DialogFlow, Telegram e InterSystems IRIS
Por cierto... ¿habéis entrado al Canal de YouTube de la Comunidad de Desarrolladores en español? En él podéis ver todos los webinars que hemos realizado (¡ya llevamos ocho!), varios tutoriales y otros vídeos.
Y si os suscribís al canal, podréis ver nuestros vídeos directamente en vuestro muro de "Suscripciones" cuando entréis en YouTube
¡Esperamos que os resulte útil!
Artículo
Mario Sanchez Macias · 27 abr, 2021
Esta publicación es la traducción de un artículo que publicó mi compañero Murray hace un tiempo. Durante mi trabajo en soporte la he recomendado muchas veces, pues lo que aquí se explica es bastante común y los ejemplos que se dan pueden ayudar a muchos de vosotros.
En esta publicación muestro estrategias para realizar copias de seguridad de Caché utilizando un Backup externo, con ejemplos de integración con soluciones basadas en snapshots. La mayoría de soluciones que veo hoy en día se implementan en Linux con VMware, por lo que gran parte de este artículo muestra, como ejemplos, cómo las soluciones integran la tecnología snapshot de VMware.
Backup de Caché
El backup online de Caché se incluye de forma predeterminada con la instalación de Caché, lo que permite la creación continua de copias de seguridad de las bases de datos de Caché. Pero hay soluciones de backup más eficientes, que se deberían considerar conforme se escalan los sistemas. El backup externo, integrado con tecnologías snapshot, es la solución recomendada para hacer copias de seguridad de sistema, incluyendo las bases de datos de Caché.
Consideraciones para los backups externos
En la documentación sobre los Backups externos están todos los detalles. Una consideración importante es:
"Para asegurar la integridad del snapshot, Caché ofrece métodos para bloquear las escrituras en la bases de datos mientras se crea el snapshot. Solo las escrituras físicas en los archivos de la base de datos se bloquean durante la creación del snapshot, lo que permite que los procesos sigan realizando actualizaciones en la memoria, sin interrupciones".
También es importante tener en cuenta que parte del proceso de snapshot en los sistemas virtualizados causa una breve pausa en la máquina virtual de la que se está haciendo la copia de seguridad, lo que a menudo se llama "stun time" (tiempo de parálisis). Esto normalmente tarda menos de un segundo, por lo que los usuarios no lo notan ni tiene un efecto sobre el funcionamiento del sistema. Sin embargo, en algunos casos la parálisis puede durar más. Si la parálisis dura más que el tiempo de inactividad permitido por el QoS para mirroring de Caché, entonces el nodo del backup creerá que ha ocurrido un fallo en el primario y tomará el control. Más adelante en este artículo explicaré cómo se pueden revisar los stun times en caso de que se necesite hacer cambios en el tiempo de inactividad de mirroring en el QoS.
Aquí puedes ver un listado con el resto de publicaciones de esta serie sobre Plataformas de datos InterSystems y su rendimiento.
Para este artículo, también debes revisar la documentación de Caché: Guía de copias de seguridad y restauración.
Opciones de backup
Solución de backup mínima: Backup Online de Caché
Si no se tiene otra opción, este viene incluido de forma predeterminada con la plataforma de datos InterSystems, y permite realizar copias de seguridad sin interrupción del servicio. Recuerda que el backup online de Caché solo hace una copia de seguridad de los archivos de la base de datos de Caché, en la que captura todos los bloques de las bases de datos que están asignados para datos, y escribe la salida en un archivo secuencial. El backup online de Caché admite copias de seguridad acumulativas e incrementales.
En el contexto de VMware, un backup online de Caché es una solución de copia de seguridad "in-guest" (para el sistema operativo invitado). Como otras soluciones "in-guest", las operaciones de la copia de seguridad online de Caché son esencialmente las mismas tanto si la aplicación está virtualizada como si se ejecuta directamente en un equipo. El backup online de Caché debe coordinarse con un backup del sistema, y así copiar el archivo de salida del backup online (.cbk) a una unidad de backup, junto con otros archivos del sistema que esté usando tu aplicación. Como mínimo, una copia de seguridad del sistema debe incluir el directorio de instalación, los directorios de journal y alternate journal , los archivos de aplicación y cualquier otro directorio que contenga archivos externos usados por la aplicación.
El backup online de Caché debe considerarse como una opción básica para sitios menores que desean implementar una solución económica, únicamente para crear copias de seguridad de bases de datos de Caché o copias de seguridad específicas. Es útil, por ejemplo, en la configuración de mirroring. Sin embargo, conforme las bases de datos aumentan en tamaño, y como Caché normalmente es solo una parte del ecosistema de datos de un cliente, se recomienda usar backups externos junto con tecnologías snapshot y utilidades de terceros. Esta es la práctica recomendada, que presenta ventajas como incluir el backup de archivos que no son bases de datos, menores tiempos de restauración, visión de los datos de toda la empresa y mejores herramientas de catalogación y administración.
Solución de backup recomendada: Backup Externo
Utilizando VMware como ejemplo, la virtualización en VMware añade funciones y opciones adicionales para proteger máquinas virtuales completas. Una vez que has virtualizado una solución, has encapsulado tu sistema eficazmente (incluyendo el sistema operativo, la aplicación y los datos), todo dentro de archivos .vmdk (y algunos otros). Cuando es necesario, es muy fácil administrar estos archivos y usarlos para recuperar un sistema completo. Esta misma situación es muy distinta en un sistema físico, en el que debes recuperar y configurar los componentes por separado: sistema operativo, drivers, aplicaciones de terceros, base de datos y archivos de base de datos, etc.
Snapshot de VMware
La aplicación vSphere Data Protection (VDP) de VMware y otras soluciones de terceros para realizar backups de máquinas virtuales, como Veeam o Cmmvault, aprovechan las funciones de los snapshots de VMware para crear copias de seguridad. A continuación, explicaré en detalle los snapshots de VMware. Para obtener más información, consulta la documentación de VMware.
Es importante recordar que los snapshots se aplican a toda la máquina virtual y que el sistema operativo y cualquier aplicación o el motor de la base de datos no saben que se están haciendo los snapshots. Recuerda también que: >
¡Por sí mismos, los snapshots de VMware no son copias de seguridad!
Los snapshots permiten a las aplicaciones de backup crear copias de seguridad, pero no son copias de seguridad en sí mismas.
VDP y otras soluciones para backups de terceros usan el proceso de snapshots de VMware, junto con la aplicación de backup, para gestionar la creación y, lo que es muy importante, la eliminación de los snapshots. El proceso y secuencia de eventos para la creación de una copia de seguridad externa con snapshots de VMware es el siguiente:
Un software de backup solicita al host ESXi crear un snapshot de VMware.
Los archivos .vmdk de una máquina virtual se ponen en un estado de solo lectura y se crea un archivo delta vmdk secundario para cada archivo .vmdk.
Se usa una copia en modo escritura con todos los cambios para la máquina virtual escritos en los archivos delta. Todas las lecturas se hacen primero desde el archivo delta.
El software de backup gestiona la copia de los archivos .vmdk principales de solo lectura en el backup de destino.
Cuando se completa la copia de seguridad, el snapshot se confirma (los discos de la máquina virtual retoman las escrituras y los bloques actualizados en los archivos delta se escriben en el controlador).
Ahora se elimina el snapshot de VMware.
Las soluciones de backup también usan otras funciones como Change Block Tracking (CBT) para realizar copias de seguridad incrementales o acumulativas, para mejorar la velocidad y eficiencia (especialmente importante para ahorrar espacio) y en general también agregan otras funciones importantes como la deduplicación y compresión de datos, planificación, montaje de máquinas virtuales con direcciones IP cambiadas para verificaciones de integridad, etc., restauraciones totales de máquina virtual y a nivel de archivo y administración de catálogo.
Los snapshots de VMware que no se gestionan correctamente o se dejan funcionando durante un largo tiempo pueden ocupar un espacio de almacenamiento excesivo (si cada vez más datos cambian, los archivos delta siguen creciendo) y también ralentizar las máquinas virtuales.
Debes pensar con cuidado antes de ejecutar un snapshot manual sobre una instancia de producción. ¿Por qué quieres hacer esto? ¿Qué pasará si vuelves atrás en el tiempo al momento en que se creó el snapshot? ¿Qué les sucederá a todas las transacciones de aplicación entre el momento de creación y el momento de volver atrás?
Está bien si tu software de backup crea y elimina un snapshot. El snapshot solo debería existir por un corto plazo. Y una parte clave de tu estrategia de backup será elegir un momento en que el sistema tenga baja carga, para minimizar el impacto sobre los usuarios y el rendimiento.
Consideraciones de la base de datos de Caché para snapshots
Antes de ejecutar el snapshot, la base de datos se debe poner en modo inactivo, de forma que todas las escrituras pendientes se confirmen y la base de datos quede en un estado consistente. Caché cuenta con métodos y una API para confirmar y luego detener (freeze) las escrituras a las bases de datos durante el breve periodo en el que se crea el snapshot. De esta forma, sólo las escrituras físicas en los archivos de la base de datos se paran durante la creación del snapshot, lo que permite que los procesos sigan realizando actualizaciones en la memoria de forma ininterrumpida. Una vez que se active el snapshot, las escrituras en la base de datos se reinician (thaw) y el backup sigue copiando datos a la unidad física. El tiempo entre el freeze y el thaw debe ser muy breve (unos pocos segundos).
Además de pausar las escrituras, el freeze de Caché también gestiona el cambio de los archivos de registro (journals) y escribe un marcador de backup en el fichero de journal. Los journals se seguirán escribiendo normalmente mientras que las escrituras a la base de datos física están detenidas. Si el sistema sufriese un fallo mientras las escrituras en la base de datos física están detenidas, los datos se recuperarían de los journals durante el arranque.
El siguiente diagrama muestra el freeze y el thaw con los pasos del snapshot de VMware para crear una de copia de seguridad con una imagen consistente de la base de datos.
Fíjate en el poco tiempo entre freeze y thaw - apenas el tiempo necesario para crear el snapshot, no el tiempo para copiar el padre de solo lectura en el destino del backup.
Integración de freeze y thaw de Caché
vSphere permite invocar automáticamente un script de cualquier lado de la creación del snapshot. Este es el momento en el que se invoca el freeze y thaw de Caché. Nota: para que esta funcionalidad funcione correctamente, el host ESXi requiere que el sistema operativo invitado desactive los discos a través de VMware Tools.
Las herramientas VMware Tools deben instalarse en el sistema operativo invitado.
Los scripts deben cumplir estrictas reglas de nomenclatura y ubicación. También deben definirse los permisos de archivo. Para VMware en Linux, los nombres de los scripts son:
# /usr/sbin/pre-freeze-script
# /usr/sbin/post-thaw-script
A continuación, se muestran ejemplos de scripts de freeze y thaw que nuestro equipo usa con el backup Veeam para nuestras instancias de pruebas internas en laboratorio, pero estos scripts también deberían funcionar con otras soluciones. Estos ejemplos fueron probados y usados en vSphere 6 y Red Hat 7. >
Aunque es posible usar estos scripts como ejemplos y para ilustrar el método, ¡debes validarlos para tus propios entornos!
Ejemplo de script pre-freeze:
#!/bin/sh
#
# Script invocado por VMWare inmediatamente antes de la toma del snapshot para el backup.
# Tested on Red Hat 7.2
#
LOGDIR=/var/log
SNAPLOG=$LOGDIR/snapshot.log
echo >> $SNAPLOG
echo "`date`: Pre freeze script started" >> $SNAPLOG
exit_code=0
# Only for running instances
for INST in `ccontrol qall 2>/dev/null | tail -n +3 | grep '^up' | cut -c5- | awk '{print $1}'`; do
echo "`date`: Attempting to freeze $INST" >> $SNAPLOG
# Detailed instances specific log
LOGFILE=$LOGDIR/$INST-pre_post.log
# Freeze
csession $INST -U '%SYS' "##Class(Backup.General).ExternalFreeze(\"$LOGFILE\",,,,,,1800)" >> $SNAPLOG $
status=$?
case $status in
5) echo "`date`: $INST IS FROZEN" >> $SNAPLOG
;;
3) echo "`date`: $INST FREEZE FAILED" >> $SNAPLOG
logger -p user.err "freeze of $INST failed"
exit_code=1
;;
*) echo "`date`: ERROR: Unknown status code: $status" >> $SNAPLOG
logger -p user.err "ERROR when freezing $INST"
exit_code=1
;;
esac
echo "`date`: Completed freeze of $INST" >> $SNAPLOG
done
echo "`date`: Pre freeze script finished" >> $SNAPLOG
exit $exit_code
Ejemplo de script thaw:
#!/bin/sh
#
# Script called by VMWare immediately after backup snapshot has been created
# Tested on Red Hat 7.2
#
LOGDIR=/var/log
SNAPLOG=$LOGDIR/snapshot.log
echo >> $SNAPLOG
echo "`date`: Post thaw script started" >> $SNAPLOG
exit_code=0
if [ -d "$LOGDIR" ]; then
# Only for running instances
for INST in `ccontrol qall 2>/dev/null | tail -n +3 | grep '^up' | cut -c5- | awk '{print $1}'`; do
echo "`date`: Attempting to thaw $INST" >> $SNAPLOG
# Detailed instances specific log
LOGFILE=$LOGDIR/$INST-pre_post.log
# Thaw
csession $INST -U%SYS "##Class(Backup.General).ExternalThaw(\"$LOGFILE\")" >> $SNAPLOG 2>&1
status=$?
case $status in
5) echo "`date`: $INST IS THAWED" >> $SNAPLOG
csession $INST -U%SYS "##Class(Backup.General).ExternalSetHistory(\"$LOGFILE\")" >> $SNAPLOG$
;;
3) echo "`date`: $INST THAW FAILED" >> $SNAPLOG
logger -p user.err "thaw of $INST failed"
exit_code=1
;;
*) echo "`date`: ERROR: Unknown status code: $status" >> $SNAPLOG
logger -p user.err "ERROR when thawing $INST"
exit_code=1
;;
esac
echo "`date`: Completed thaw of $INST" >> $SNAPLOG
done
fi
echo "`date`: Post thaw script finished" >> $SNAPLOG
exit $exit_code
Recuerda definir los permisos:
# sudo chown root.root /usr/sbin/pre-freeze-script /usr/sbin/post-thaw-script
# sudo chmod 0700 /usr/sbin/pre-freeze-script /usr/sbin/post-thaw-script
Prueba de freeze y thaw
Para probar que los scripts están funcionando correctamente, puedes ejecutar un snapshot manualmente sobre una máquina virtual y verificar la salida del script. La siguiente captura de pantalla muestra el cuadro de diálogo "Take VM Snapshot" y sus opciones.
Deselecciona- "Snapshot de la memoria de la máquina virtual".
Selecciona- "Desactivar sistema de archivos invitado (Necesita VMware Tools instalado)" para pausar los procesos en ejecución en el sistema operativo invitado para que los contenidos del sistema de archivos estén en un estado conocido consistente al tomar el snapshot.
¡Importante! ¡¡¡Después de realizar la prueba, recuerda eliminar el snapshot!!!
Si la marca de "quiesce" está activa y la máquina virtual está encendida cuando se realiza el snapshot, se usará VMware Tools para desactivar el sistema de archivos en la máquina virtual. Desactivar un sistema de archivos es el proceso de llevar los datos en disco a un estado adecuado para hacer una copia de seguridad. Este proceso podría incluir operaciones como pasar los búferes sucios desde el caché en memoria del sistema operativo hasta el disco duro.
La siguiente salida muestra los contenidos del archivo de registro $SNAPSHOT definido en los scripts del ejemplo anterior para freeze/thaw, después de ejecutar una copia de seguridad que incluye snapshot como parte de su operación.
Wed Jan 4 16:30:35 EST 2017: Pre freeze script started
Wed Jan 4 16:30:35 EST 2017: Attempting to freeze H20152
Wed Jan 4 16:30:36 EST 2017: H20152 IS FROZEN
Wed Jan 4 16:30:36 EST 2017: Completed freeze of H20152
Wed Jan 4 16:30:36 EST 2017: Pre freeze script finished
Wed Jan 4 16:30:41 EST 2017: Post thaw script started
Wed Jan 4 16:30:41 EST 2017: Attempting to thaw H20152
Wed Jan 4 16:30:42 EST 2017: H20152 IS THAWED
Wed Jan 4 16:30:42 EST 2017: Completed thaw of H20152
Wed Jan 4 16:30:42 EST 2017: Post thaw script finished
Este ejemplo muestra que pasaron 6 segundos entre freeze y thaw (16:30:36 a 16:30:42). Las operaciones del usuario NO se interrumpen durante este periodo. Deberás recoger métricas de tus propios sistemas, pero para dar un poco de contexto, este ejemplo proviene de un sistema que ejecuta una aplicación benchmark sobre una máquina virtual sin cuellos de botella de E/S y un promedio de más de 2 millones de Glorefs/seg, 170 000 Gloupds/seg y una media de 1 100 lecturas físicas/seg y 3 000 escrituras por ciclo de daemon de escritura.
Recuerda que la memoria no es parte del snapshot, por lo que, al reiniciar, la máquina virtual se reiniciará y se recuperará. Los ficheros de la base de datos serán consistentes. No se quiere "reanudar" una copia de seguridad, sino que se quiere obtener una copia en un punto determinado en el tiempo. Luego se podrán aplicar los journals y otros pasos de recuperación necesarios para la consistencia tanto de aplicaciones como de transacciones, una vez que se han recuperado los ficheros.
Para una protección adicional de los datos, también se puede realizar un cambio de journal por sí mismo y se puede realizar una copia de seguridad de los journals o replicarlos en otra ubicación, por ejemplo, cada hora.
A continuación se muestra el resultado de $LOGFILE en los scripts de freeze/thaw de los ejemplos anteriores, que muestran los detalles del registro para el snapshot.
01/04/2017 16:30:35: Backup.General.ExternalFreeze: Suspending system
Journal file switched to:
/trak/jnl/jrnpri/h20152/H20152_20170104.011
01/04/2017 16:30:35: Backup.General.ExternalFreeze: Start a journal restore for this backup with journal file: /trak/jnl/jrnpri/h20152/H20152_20170104.011
Journal marker set at
offset 197192 of /trak/jnl/jrnpri/h20152/H20152_20170104.011
01/04/2017 16:30:36: Backup.General.ExternalFreeze: System suspended
01/04/2017 16:30:41: Backup.General.ExternalThaw: Resuming system
01/04/2017 16:30:42: Backup.General.ExternalThaw: System resumed
STUN TIMES de máquina virtual
En el momento de creación de un snapshot de máquina virtual y después de completar la copia de seguridad y de confirmar el snapshot, la máquina virtual debe detenerse por un breve lapso. A este breve freeze a menudo se le llama "stunning" de la máquina virtual. Aquí puedes leer un buen artículo sobre los stun times. A continuación, resumo los detalles y los pongo en el contexto de la base de datos Caché.
Del artículo sobre los stun times: “Para crear un snapshot de una máquina virtual, la máquina virtual se "paraliza" para (i) serializar el estado del dispositivo al disco y (ii) cerrar el disco en ejecución actual y crear un punto de snapshot.… Al consolidar, la máquina virtual se "paraliza" para cerrar los discos y ponerlos en un estado adecuado para la consolidación.”
El stun time es normalmente de unos pocos centenares de milisegundos. Sin embargo, es posible que si hay una actividad muy elevada de escritura en disco durante la fase de confirmación, el tiempo de stun time puede ser de varios segundos.
Si la máquina virtual es un miembro Primario o de Backup que participa en el mirroring de la base de datos Caché y el stun time es mayor que el tiempo de espera del mirror de calidad de servicio (QoS), el mirror reportará un fallo de la máquina virtual donde esté el nodo primario y se producirá un failover de mirror al nodo backup o secundario.
Actualización marzo de 2018:
Mi colega Peter Greskoff me indicó que un miembro mirror del backup podría iniciar el sistema de emergencia en un tiempo tan breve como solo un poco más de la mitad del tiempo de espera de QoS durante la parálisis de una máquina virtual o en cualquier otro momento que el miembro mirror primario no esté disponible.
Para una descripción detallada de las consideraciones de QoS y escenarios de tolerancia a fallos, puedes consultar este recomendable artículo: Guía de tiempo de espera de calidad de servicio para Mirroring. La versión resumida sobre los stun times de la máquina virtual y la QoS es la siguiente:
Si el mirror de la copia de seguridad no recibe mensajes del mirror primario dentro de la mitad del tiempo de espera de la QoS, enviará un mensaje para comprobar que el primario sigue funcionando. Luego, la copia de seguridad espera una respuesta de la máquina primaria durante una mitad adicional del tiempo de QoS. Si no recibe respuesta del primario, asume que no está activo y la copia de seguridad toma el control.
En un sistema con carga, se envían journals continuamente desde el mirror primario al mirror de backup, y la copia de seguridad no necesitará verificar si el primario sigue activo. Sin embargo, durante un tiempo de poca actividad (cuando es más probable que se realicen copias de seguridad), si la aplicación está inactiva es posible que no haya mensajes entre el mirror primario y la de copia de seguridad durante más de la mitad del tiempo de QoS.
Este es el ejemplo de Peter: piensa en este rango de tiempo para un sistema inactivo con un tiempo de espera de QoS de :08 segundos y un stun time de máquina virtual de :07 segundos:
:00 el primario envía un mensaje keepalive al árbitro, el árbitro responde inmediatamente
:01 un miembro de la copia de seguridad envía un mensaje keepalive al primario. El primario responde inmediatamente
:02
:03 comienza el stun de la máquina virtual
:04 el primario intenta enviar un mensaje de keepalive al árbitro, pero no llega a destino hasta que finalice el stun
:05 el miembro de la copia de seguridad envía un ping al primario, cuando haya vencido la mitad del QoS
:06
:07
:08 el árbitro no ha recibido nada del primario durante un tiempo de espera completo de QoS, por lo que cierra la conexión
:09 la copia de seguridad no ha obtenido respuesta del primario, y confirma con el árbitro que también perdió la conexión, por lo que asume el control
:10 finaliza el stun de la máquina virtual, ¡¡demasiado tarde!!
Lee también la sección, "Obstáculos y preocupaciones al configurar el tiempo de espera de calidad de servicio" en la publicación indicada más arriba, para entender el equilibrio para tener QoS solo durante el tiempo necesario. Tener QoS durante demasiado tiempo, especialmente más de 30 segundos, puede causar problemas.
Fin de la actualización marzo de 2018:
Para tener más información sobre el mirroring de QoS, consulta también esta documentación.
Algunas estrategias para reducir el stun time al mínimo, son crear copias de seguridad cuando la actividad de la base de datos es baja y tener un almacenamiento bien configurado.
Como se indicó más arriba al crear un snapshot, hay varias opciones que se pueden especificar- una de ellas es incluir el estado de la memoria en la snapshot. Recuerda: el estado de la memoria NO se necesita para realizar copias de seguridad de la bases de datos Caché. Si se elije la marca de memoria, se incluye en el snapshot una copia de datos del estado interno de la máquina virtual. Lleva mucho más tiempo crear los snapshots de memoria. Los snapshots de memoria se usan para permitir la reversión a un estado de una máquina virtual en funcionamiento tal como estaba al momento del snapshot. Esto NO es necesario para realizar una copia de seguridad de archivos de una base de datos.
Al tomar un snapshot de la memoria, se paralizará todo el estado completo de la máquina virtual. El stun time es variable.
Como se explicó antes, para copias de seguridad se debe marcar la opción de "quiesce" para hacer snapshots manuales o que las tome el software de backup, para garantizar así una copia de seguridad consistente y utilizable.
Análisis de los stun time en registros de VMware
A partir de ESXi 5.0, los stun time por snapshot se registran en el archivo de registro de cada máquina virtual (vmware.log), con mensajes como estos:
2017-01-04T22:15:58.846Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 38123 us
Los stun time están en microsegundos, por lo que en el ejemplo anterior 38123 us es 38123/1,000,000 segundos o 0.038 segundos.
Para asegurarse de que los stun time están dentro de los límites aceptables, o para resolver problemas si sospechas que los stun times prolongados generan problemas, puedes descargar y consultar los archivos vmware.log de la carpeta de la máquina virtual que te interesa. Una vez descargados, puedes extraer y ordenar el registro, por ejemplo usando los siguientes comandos de Linux.
Ejemplo de descarga de archivos vmware.log
Hay varias formas de descargar registros de soporte, incluyendo crear un paquete de soporte de VMware a través de la consola de gestión de vSphere, o desde la línea de comando del host ESXi. Consulta la documentación de VMware para obtener más detalles, pero a continuación ofrecemos un sencillo método para crear y recoger un paquete de soporte mucho más reducido, que incluye el archivo vmware.log para que puedas revisar los stun times.
Necesitarás el nombre largo del directorio donde se encuentran los archivos de la máquina virtual. Inicia sesión en el host ESXi donde se ejecuta la máquina virtual de la base de datos que utiliza ssh y usa el comando: vim-cmd vmsvc/getallvms para enumerar los archivos vmx y los nombres largos únicos asociados con ellos.
Por ejemplo, el nombre largo para la máquina virtual de la base de datos del ejemplo usado en esta publicación sale como: 26 vsan-tc2016-db1 [vsanDatastore] e2fe4e58-dbd1-5e79-e3e2-246e9613a6f0/vsan-tc2016-db1.vmx rhel7_64Guest vmx-11
A continuación, ejecuta el comando para recoger y agrupar en un paquete únicamente los archivos de registro: vm-support -a VirtualMachines:logs.
El comando replicará la ubicación del paquete de soporte, por ejemplo: Para ver los archivos recolectados, revisa '/vmfs/volumes/datastore1 (3)/esx-esxvsan4.iscinternal.com-2016-12-30--07.19-9235879.tgz'.
Ahora puedes usar sftp para transferir el archivo hacia fuera del host para su posterior procesamiento y revisión.
En este ejemplo, después de descomprimir el paquete de soporte, ve hacia la ruta correspondiente al nombre largo de la máquina virtual de base de datos. Por ejemplo, en este caso: /vmfs/volumes//e2fe4e58-dbd1-5e79-e3e2-246e9613a6f0.
Ahí podrás ver varios archivos de registro numerados. El archivo de registro más reciente no tiene número, es decir vmware.log. Puede que el registro sea de unos pocos cientos de KB, pero contiene mucha información. Sin embargo, solo nos importan los stun/unstun times, que son fáciles de encontrar con grep. Por ejemplo:
$ grep Unstun vmware.log
2017-01-04T21:30:19.662Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 1091706 us
---
2017-01-04T22:15:58.846Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 38123 us
2017-01-04T22:15:59.573Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 298346 us
2017-01-04T22:16:03.672Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 301099 us
2017-01-04T22:16:06.471Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 341616 us
2017-01-04T22:16:24.813Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 264392 us
2017-01-04T22:16:30.921Z| vcpu-0| I125: Checkpoint_Unstun: vm stopped for 221633 us
Podemos ver dos grupos de stun times en el ejemplo, uno de la creación de la snapshot, y el segundo creado 45 minutos después para cada disco cuando la snapshot se elimina/consolida (por ejemplo, después de que el software de backup haya terminado de copiar el archivo vmx de solo lectura). En el ejemplo anterior, podemos ver que la mayoría de los stun times son de menos de un segundo, si bien el tiempo de parálisis inicial es de apenas más de un segundo.
Los stun times cortos son imperceptibles para un usuario final. Sin embargo, procesos del sistema como el Mirroring de la base de datos Caché supervisan continuamente si una instancia está "viva". Si el stun time supera el tiempo de espera de QoS de mirroring, entonces el nodo podrá considerarse como no contactable y "muerto", y se activará una tolerancia de fallos.
Consejo: para revisar todos los registros o para resolver problemas, un comando útil es hacer un grep de todos los archivos vmware*.log y buscar valores atípicos o instancias en las que el stun time se aproxime al tiempo de espera de QoS. El siguiente comando canaliza la salida a awk para formatearla: grep Unstun vmware* | awk '{ printf ("%'"'"'d", $8)} {print " ---" $0}' | sort -nr
Resumen
Deberías supervisar tu sistema con frecuencia durante su funcionamiento normal, para entender los stun times y cómo pueden impactar sobre el tiempo de espera de QoS para aplicaciones de alta disponibilidad como mirroring. Como se indicó anteriormente, algunas estrategias para reducir los stun/unstun times al mínimo son crear copias de seguridad cuando la actividad de la base de datos y del almacenamiento es baja y tener un almacenamiento bien configurado. Para una supervisión constante, es posible procesar los registros usando VMware Log insight u otras herramientas.
En futuras publicaciones volveré a tratar las operaciones de backup y restauración para las plataformas de datos InterSystems. Pero por ahora, si tienes algún comentario o sugerencia basada en los flujos de trabajo de tus sistemas, compártelos en la sección de comentarios de abajo.
Artículo
Mario Sanchez Macias · 21 mar, 2022
Soporte te está ayudando a resolver una incidencia con un informe y necesitan reproducir el problema en su sistema local. ¡Es una pena que no puedan ejecutar el informe porque la conexión JDBC al origen de datos fallará! O... ¿hay alguna forma?
Hay una forma de ejecutar un informe offline sin acceso a la base de datos origen. Debes proporcionar los resultados de una query cacheada exportada desde Designer. Es un fichero que contiene los datos de la query. Soporte lo usará para evitar el origen de datos del informe. Cuando ejecuten el informe, cogerá los datos del fichero, no de la conexión JDBC.
Aclaración
Esto no tiene nada que ver con IRIS BI query cache.
IRIS BI query cache
Globals usados por el motor de consultas de BI para mejorar el rendimiento.
InterSystems Reports cached query result
Un fichero que permite ejecutar un informe offline, sin acceso a la base de datos origen. El informe recupera los datos del fichero, no de la conexión JDBC habitual.
Cómo enviar informes con registros de queries cacheadas.
1. Comprime y envía la carpeta "Catalog" completa. Indica qué informe estás probando.
2. Abre tu informe en Designer. En el panel "Data" a la izquierda, haz clic con el botón derecho en el conjunto de datos y elige Create Cached Query Result. Si el informe tiene varios conjuntos de datos, hazlo en cada uno. Envía los archivos exportados.
Descargo de responsabilidad
¡Ojo! No envíes registros de queries cacheadas que contenga datos confidenciales.
Documentación
Logi Cached Query documentation (v18)
Anuncio
Esther Sanchez · 5 ago, 2022
¡Hola Comunidad!
Estamos encantados de anunciar que vuelven los webinars de la Comunidad!
Os invitamos al webinar Cómo escalar el servidor FHIR de InterSystems en Amazon Web Services con ECP.
⏱ Fecha: Jueves 18 de agosto, 14:00 (CEST)👨🏫 Ponente: @Ron.Sweeney1582, Full Stack Architect en Integration Required➡️ El webinar será en inglés
No os perdáis esta oportunidad de aprender más sobre FHIR, ECP y AWS y cómo mezclarlo todo!
>> REGISTRO AQUÍ <<
Artículo
Alberto Fuentes · 14 oct, 2022
# Iris-python-template
Proyecto de plantilla con varios códigos Python para ser utilizados con InterSystems IRIS Community Edition con contenedor.
Contenido:
* Bloc de notas
* Kernel de Python Embebido
* Kernel de ObjectScript
* Kernel de Vanilla Python
* Python Embebido
* Ejemplo de código
* Demostración de Flask
* API nativas de Python de IRIS
* Ejemplo de código

# 2. Índice
- [1. iris-python-template](#1-iris-python-template)
- [2. Índice](#2-ndice)
- [3. Instalación](#3-instalacin)
- [3.1. Docker](#31-docker)
- [4. Cómo empezar a programar](#4-cmo-empezar-a-programar)
- [4.1. Requisitos previos](#4-1-requisitos-previos)
- [4.1.1. Empezar a programar en ObjectScript](#4-1-1-empezar-a-programar-en-objectscript)
- [4.1.2. Empezar a programar con Python Embebido](#4-1-2-empezar-a-programar-con-python-embebido)
- [4.1.3. Empezar a programar con Notebooks](#4-1-3-empezar-a-programar-con-notebooks)
- [5. Qué hay dentro del repositorio](#5-qu-hay-dentro-del-repositorio)
- [5.1. Dockerfile](#5-1-dockerfile)
- [5.2. .vscode/settings.json](#5-2-vscodesettingsjson)
- [5.3. .vscode/launch.json](#5-3-vscodelaunchjson)
- [5.4. .vscode/extensions.json](#5-4-vscodeextensionsjson)
- [5.5. src folder](#5-5-src-folder)
- [5.5.1. src/ObjectScript](#5-5-1-srcobjectscript)
- [5.5.1.1. src/ObjectScript/Embedded/Python.cls](#5-5-1-1-srcobjectscriptembeddedpythoncls)
- [5.5.1.2. src/ObjectScript/Gateway/Python.cls](#5-5-1-2-srcobjectscriptgatewaypythoncls)
- [5.5.2. src/Python](#5-5-2-srcpython)
- [5.5.2.1. src/Python/embedded/demo.cls](#5-5-2-1-srcpythonembeddeddemocls)
- [5.5.2.2. src/Python/native/demo.cls](#5-5-2-2-srcpythonnativedemocls)
- [5.5.2.3. src/Python/flask](#5-5-2-3-srcpythonflask)
- [5.5.2.3.1. ¿Cómo funciona?](#5-5-2-3-1-cmo-funciona)
- [5.5.2.3.2. Lanzamiento del servidor flask](#5-5-2-3-2-lanzamiento-del-servidor-flask)
- [5.5.3. src/Notebooks](#5-5-3-srcnotebooks)
- [5.5.3.1. src/Notebooks/HelloWorldEmbedded.ipynb](#5-5-3-1-srcnotebookshelloworldembeddedipynb)
- [5.5.3.2. src/Notebooks/IrisNative.ipynb](#5-5-3-2-srcnotebooksirisnativeipynb)
- [5.5.3.3. src/Notebooks/ObjectScript.ipynb](#5-5-3-3-srcnotebooksobjectscriptipynb)
# 3. Instalación
## 3.1. Docker
El repositorio está dockerizado para que puedas clonar el repositorio a cualquier directorio local
```
git clone https://github.com/grongierisc/iris-python-template.git
```
Abre el terminal en este directorio y ejecuta:
```
docker-compose up -d
```
y abre después http://localhost:8888/tree para Notebooks
O bien, abre la carpeta clonada en VSCode, inicia docker-compose y abre la URL mediante el menú de VSCode:
# 4. Cómo empezar a programar
## 4.1. Requisitos previos
Asegúrate de tener instalado [git ](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)y [Docker desktop](https://www.docker.com/products/docker-desktop).
Este repositorio está listo para codificarse en VSCode con el plugin de ObjectScript. Instala [VSCode](https://code.visualstudio.com/),[Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) y[el plugin de ObjectScript](https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript)y abre la carpeta en VSCode.
### 4.1.1. Empezar a programar en ObjectScript
Abre la clase /src/ObjectScript/Embedded/Python.cls e intenta hacer cambios - se compilará en el contenedor Docker IRIS que está funcionando.
### 4.1.2. Empezar a programar con Python Embebido
La forma más fácil es ejecutar VsCode en el contenedor.
Para adjuntar a un contenedor Docker, selecciona **Remote-Containers: Attach to Running Container...** en la plantilla de comandos (`kbstyle(F1)`) o utiliza el **Remote Explorer** en la barra de actividades y desde la vista **Containers**, selecciona la acción en línea **Attach to Container** en el contenedor al que quieras conectarte.

A continuación, configura tu intérprete de python en /usr/irissys/bin/irispython
### 4.1.3. Empezar a programar con Notebooks
Abre esta URL: http://localhost:8888/tree
Tienes acceso a tres notebooks diferentes con tres kernels diferentes.
* Kernel de Python Embebido
* Kernel de ObjectScript
* Kernel de Vanilla Python3
# 5. Qué hay dentro del repositorio
## 5.1. Dockerfile
Un dockerfile que instala algunas dependencias de Python (pip, venv) y Sudo en el contenedor por conveniencia. Después crea el directorio dev y copia en él este repositorio git.
Inicia IRIS e importa los archivos Titanics csv, después activa **%Service_CallIn** para **Python Shell**. Utiliza el docker-compose.yml relacionado para configurar fácilmente parámetros adicionales como el número de puerto y dónde asignar claves y carpetas del host.
Este dockerfile termina con la instalación de los requisitos para los módulos de Python.
La última parte es sobre la instalación de Jupyter Notebook y sus kernels.
Utiliza el archivo .env/ para ajustar el dockerfile que se utiliza en docker-compose.
## 5.2. .vscode/settings.json
Archivo de configuración para poder codificar inmediatamente en VSCode con el [plugin VSCode ObjectScript](https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript)
## 5.3. .vscode/launch.json
Archivo de configuración si quieres depurar con VSCode ObjectScript
[Lee sobre todos los archivos en este artículo](https://community.intersystems.com/post/dockerfile-and-friends-or-how-run-and-collaborate-objectscript-projects-intersystems-iris)
## 5.4. .vscode/extensions.json
Archivo de recomendación para añadir extensiones si quieres ejecutar VSCode en el contenedor.
[Más información aquí](https://code.visualstudio.com/docs/remote/containers)

Esto es muy útil para trabajar con Python Embebido.
## 5.5. src folder
Esta carpeta está concebida en dos partes, una para el ejemplo de ObjectScript y otra para el código de Python.
### 5.5.1. src/ObjectScript
Un código diferente que muestra cómo utilizar Python en IRIS.
#### 5.5.1.1. src/ObjectScript/Embedded/Python.cls
Todos los comentarios están en francés para que también puedas mejorar tu nivel de francés.
```objectscript
/// Embedded python example
Class ObjectScript.Embbeded.Python Extends %SwizzleObject
{
/// HelloWorld with a parameter
ClassMethod HelloWorld(name As %String = "toto") As %Boolean [ Language = python ]
{
print("Hello",name)
return True
}
/// Description
Method compare(modèle, chaine) As %Status [ Language = python ]
{
import re
# compare la chaîne [chaîne] au modèle [modèle]
# affichage résultats
print(f"\nRésultats({chaine},{modèle})")
match = re.match(modèle, chaine)
if match:
print(match.groups())
else:
print(f"La chaîne [{chaine}] ne correspond pas au modèle [{modèle}]")
}
/// Description
Method compareObjectScript(modèle, chaine) As %Status
{
w !,"Résultats("_chaine_","_modèle_")",!
set matcher=##class(%Regex.Matcher).%New(modèle)
set matcher.Text=chaine
if matcher.Locate() {
write matcher.GroupGet(1)
}
else {
w "La chaîne ["_chaine_"] ne correspond pas au modèle ["_modèle_"]"
}
}
/// Description
Method DemoPyhtonToPython() As %Status [ Language = python ]
{
# expression régulières en python
# récupérer les différents champs d'une chaîne
# le modèle : une suite de chiffres entourée de caractères quelconques
# on ne veut récupérer que la suite de chiffres
modèle = r"^.*?(\d+).*?$"
# on confronte la chaîne au modèle
self.compare(modèle, "xyz1234abcd")
self.compare(modèle, "12 34")
self.compare(modèle, "abcd")
}
Method DemoPyhtonToObjectScript() As %Status [ Language = python ]
{
# expression régulières en python
# récupérer les différents champs d'une chaîne
# le modèle : une suite de chiffres entourée de caractères quelconques
# on ne veut récupérer que la suite de chiffres
modèle = r"^.*?(\d+).*?$"
# on confronte la chaîne au modèle
self.compareObjectScript(modèle, "xyz1234abcd")
self.compareObjectScript(modèle, "12 34")
self.compareObjectScript(modèle, "abcd")
}
/// Description
Method DemoObjectScriptToPython() As %Status
{
// le modèle - une date au format jj/mm/aa
set modèle = "^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$"
do ..compare(modèle, "10/05/97")
do ..compare(modèle, " 04/04/01 ")
do ..compare(modèle, "5/1/01")
}
}
```
* HelloWorld
* Función sencilla para decir "Hola" en Python
* Utiliza la envoltura OjectScript con la etiqueta [ Language = python ]
* compare
* Una función de python que compara una cadena con un regx, si hay una coincidencia entonces la imprime, si no la imprime es que no se encontró ninguna coincidencia
* compareObjectScript
* La misma función que la de Python pero en ObjectScript
* DemoPyhtonToPython
* Muestra cómo utilizar una función de Python con código de Python envuelto en ObjectScript
```objectscript
set demo = ##class(ObjectScript.Embbeded.Python).%New()
zw demo.DemoPyhtonToPython()
```
* DemoPyhtonToObjectScript
* Una función de Python que muestra cómo llamar a una función de ObjecScript
* DemoObjectScriptToPython
* Una función de ObjectScript que muestra cómo llamar a una función de Python
#### 5.5.1.2. src/ObjectScript/Gateway/Python.cls
Una clase de ObjectScript que muestra cómo llamar a un código de Phyton externo con la funcionalidad *gateway*.
En este ejemplo el código de Python es **no ejecutado** en el mismo proceso de IRIS.
```objectscript
/// Description
Class Gateway.Python
{
/// Demo of a python gateway to execute python code outside of an iris process.
ClassMethod Demo() As %Status
{
Set sc = $$$OK
set pyGate = $system.external.getPythonGateway()
d pyGate.addToPath("/irisdev/app/src/Python/gateway/Address.py")
set objectBase = ##class(%Net.Remote.Object).%New(pyGate,"Address")
set street = objectBase.street
zw street
Return sc
}
}
```
### 5.5.2. src/Python
Una pieza diferente del código Python que muestra cómo usar Python Embebido en IRIS.
#### 5.5.2.1. src/Python/embedded/demo.cls
Todos los comentarios están en francés para que también puedas mejorar tu nivel de francés.
```python
import iris
person = iris.cls('Titanic.Table.Passenger')._OpenId(1)
print(person.__dict__)
```
Primero importa el módulo de IRIS que activa las funciones de Python Embebido. Abre una clase persistente con la función cls del módulo de IRIS. Ten en cuenta que todas las funciones `%` se sustituyen por `_`.
Para ejecutar este ejemplo hay que utilizar IRIS Python Shell:
```shell
/usr/irissys/bin/irispython /opt/irisapp/src/Python/embedded/demo.py
```
#### 5.5.2.2. src/Python/native/demo.cls
Muestra cómo utilizar la API nativa en el código de Python.
```python
import irisnative
# create database connection and IRIS instance
connection = irisnative.createConnection("localhost", 1972, "USER", "superuser", "SYS", sharedmemory = False)
myIris = irisnative.createIris(connection)
# classMethod
passenger = myIris.classMethodObject("Titanic.Table.Passenger","%OpenId",1)
print(passenger.get("name"))
# global
myIris.set("hello","myGlobal")
print(myIris.get("myGlobal"))
```
Para importar IRISNATIVE, debes instalar las ruedas de las API nativas en tu entorno de Python.
```shell
pip3 install /usr/irissys/dev/python/intersystems_irispython-3.2.0-py3-none-any.whl
```
Entonces puedes ejecutar este código de Python
```shell
/usr/bin/python3 /opt/irisapp/src/Python/native/demo.py
```
Ten en cuenta que en este caso se realiza una conexión a la base de datos de IRIS, esto significa que **este código se ejecuta en un subproceso diferente al de IRIS**.
#### 5.5.2.3. src/Python/flask
Una demo completa de la combianción entre Python Embebido y el micro *framework* Flask. Puedes probar este endpoint:
```
GET http://localhost:4040/api/passengers?currPage=1&pageSize=1
```
##### 5.5.2.3.1. ¿Cómo funciona?
Para utilizar Python Embebido, usamos `irispython` como interepretador de Python, y hacemos:
```python
import iris
```
Justo al principio del archivo.
Entonces podremos ejecutar métodos como:

Como puedes ver, para OBTENER un pasajero con un ID, simplemente ejecutamos una consulta y utilizamos su conjunto de resultados.
También podemos utilizar directamente los objetos de IRIS:

Aquí, utilizamos una consulta SQL para obtener todos los IDs de la tabla, y después recuperamos cada pasajero de la tabla con el método `%OpenId()` de la clase `Titanic.Table.Passenger` (ten en cuenta que como `%` es un carácter ilegal en Python, utilizamos `_` como alternativa).
Gracias a Flask, implementamos todas nuestras rutas y métodos de esa manera.
##### 5.5.2.3.2. Lanzamiento del servidor flask
Para lanzar el servidor, usamos `gunicornio` con `irispython`.
En el archivo docker-compose, añadimos la siguiente línea:
````yaml
iris:
command: -a "sh /opt/irisapp/server_start.sh"
````
Eso lanzará, después de que se inicie el contenedor (gracias al indicador `-a`), el siguiente script:
````bash
#!/bin/bash
cd ${SRC_PATH}/src/Python/flask
${PYTHON_PATH} -m gunicorn --bind "0.0.0.0:8080" wsgi:app &
exit 1
````
Con las variables de entorno definidas en el Dockerfile como sigue:
````dockerfile
ENV PYTHON_PATH=/usr/irissys/bin/irispython
ENV SRC_PATH=/opt/irisapp/
````
### 5.5.3. src/Notebooks
Tres notebooks con tres kernels diferentes:
* Un kernel de Python3 para ejecutar las API nativas
* Un kernel de Python Embebido
* Un kernel de ObjectScript
Se puede acceder a los notebooks aquí: http://localhost:8888/tree
#### 5.5.3.1. src/Notebooks/HelloWorldEmbedded.ipynb
Este notebook utiliza el kernel de Python Embebido.
Muestra un ejemplo para abrir y guardar clases persistentes y cómo ejecutar consultas en SQL.
#### 5.5.3.2. src/Notebooks/IrisNative.ipynb
Este notebook utiliza el kernel de Vanila python.
Muestra ejemplo para ejecutar API nativas de IRIS.
#### 5.5.3.3. src/Notebooks/ObjectScript.ipynb
Este notebook utiliza el kernel de ObjectScript.
Muestra un ejemplo para ejecutar el código ObjectSCript y cómo utilizar Python Embebido en ObjectScript.
Anuncio
Esther Sanchez · 16 feb, 2023
¡Hola desarrolladores!
Los días 21 y 22 de febrero InterSystems Iberia participará en la V Innovation Week organizada por la Universidad CEU San Pablo, en Madrid.
InterSystems ha preparado un reto para los alumnos de la universidad, sobre los desafíos de la salud digital. El reto se presentará el día 21 y los alumnos tendrán un día para trabajar por equipos y pensar cómo resolverlo. El día 22 será la exposición de ideas por parte de los estudiantes. Y de entre todas las ideas presentadas, las dos mejores se llevarán de premio una tarjeta regalo de Amazon.
La Innovation Week promueve la innovación universitaria para innovar con sentido, proponiendo ideas que contribuyan a mejorar la sociedad, las personas y las empresas. Es un evento único, donde se reúnen los mejores ingredientes para generar innovación: el talento universitario y el mundo empresarial.
Por ello, desde InterSystems Iberia están muy orgullosos de esta colaboración y no se lo han querido perder. ¡Seguro que los universitarios presentan un montón de ideas innovadoras!
La semana que viene os contaremos cuales fueron las ideas ganadoras y cómo resolvieron el reto... ¡Estad atentos a las noticias de la Comunidad! 😉
Anuncio
Mario Sanchez Macias · 17 dic, 2021
13 de diciembre de 2021
InterSystems está investigando el impacto de una vulnerabilidad de seguridad relacionada con Apache Log4j2.
La vulnerabilidad — impactando al menos a Apache Log4j2 (versiones 2.0 a 2.14.1) — fue anunciada recientemente por Apache y ha sido notificada en la Base de Datos de Vulnerabilidad Local de Estados Unidos (NVD) como CVE-2021-44228 con la calificación de gravedad más alta, 10.0.
Por favor, consultad esta página para conocer más detalles sobre la vulnerabilidad y actualizaciones sobre si los productos de InterSystems están afectados.
Artículo
Ricardo Paiva · 6 feb, 2020
Este artículo, y los dos siguientes de la serie, se conciben como una guía para los usuarios, los desarrolladores o para los administradores de sistemas que necesiten trabajar con la estructura de OAuth 2.0 (conocido también por simplicidad como OAUTH) en aplicaciones que estén basadas en los productos de InterSystems.
Correcciones y cambios después de la publicación
3 de agosto, 2016 - se corrigió la configuración para capturas de pantalla en la API Client de Google y se actualizaron las capturas de pantalla en las API de Google para incorporar la nueva versión en las páginas
28 de agosto, 2016 - se realizaron cambios en el código que se relaciona con JSON, dichos cambios se ven reflejados en la compatibilidad entre JSON y Cache 2016.2
3 de mayo, 2017 - se realizaron actualizaciones en el texto y en las pantallas para incluir la nueva IU y las funcionalidades disponibles con el lanzamiento de Cache 2017.1
19 de febrero, 2018 - Caché se cambió a InterSystems IRIS para mostrar los últimos desarrollos. Sin embargo, hay que tener en cuenta que a pesar de los cambios en el nombre del producto, el artículo cubre todos los productos de InterSystems - la plataforma de datos InterSystems IRIS, Ensemble y Caché.
Parte 1. Cliente
Introducción
Esta es la primera parte de una serie de 3 artículos sobre la implementación de la estructura Open Authorization en InterSystems.
En esta primera parte, veremos una breve introducción al tema y mostraremos un escenario sencillo en el que la aplicación InterSystems IRIS actúa como cliente para un Servidor de autorización, solicitando algunos recursos que están protegidos.
En la segunda parte se describirá un escenario más complejo, donde el propio InterSystems IRIS actúa como un servidor de autorización y también como un servidor de autenticación mediante OpenID Connect.
En la última parte de esta serie se describirán los distintos componentes de las clases en la estructura OAUTH, tal y como son implementados por InterSystems IRIS.
En qué consiste la estructura Open Authorization[1]
Muchos de ustedes ya han oído hablar sobre la estructura Open Authorization y para qué se puede utilizar. Así que solamente haré un breve resumen para aquellos que aún no la conocen.
La estructura Open Authorization, OAUTH (actualmente en su versión 2.0), es un protocolo que básicamente permite que las aplicaciones basadas en la web intercambien información de forma segura al establecer confianza, de manera indirecta, entre un cliente (la aplicación que solicita los datos) y el propietario de los recursos (la aplicación que posee los datos que se solicitaron). La confianza como tal se proporciona mediante un agente que tanto el cliente como el servidor de recursos reconocen y en el que confían. Este agente se denomina el servidor de autorización.
A continuación, se muestra un caso sencillo en el que podría utilizarse:
Supongamos que Jenny (en la terminología de OAUTH sería la propietaria del recurso) trabaja en un proyecto para la empresa JennyCorp. Ella crea un plan para realizar un proyecto sobre un negocio que será potencialmente más grande, e invita a su socio John (el usuario cliente) de JohnInc para que revise el documento. Sin embargo, a ella no le gusta que John entre en la VPN de su empresa, por lo que coloca el documento en una unidad de Google Drive (el Servidor de recursos) u otro tipo de almacenamiento similar en la nube. Cuando hizo esto, estableció una confianza digital entre ella y Google (el Servidor de autorización). Ella etiqueta el documento para ser compartido con John (John ya utiliza Google Drive y Jenny conoce su email).
Cuando John quiere leer el documento, primero lo autentica con su cuenta de Google y desde su dispositivo móvil (tableta, bloc de notas, etc.) abre un editor de documentos (el servidor del cliente) y carga el archivo del proyecto de Jenny.
Aunque esto parezca bastante sencillo, existe mucha comunicación entre las dos personas y Google. Toda la comunicación sigue la especificación de OAuth 2.0, por lo que el cliente de John (la aplicación de lectura), tiene que autenticarse primero con Google (este paso no está cubierto por OAUTH) y una vez que John otorgue su consentimiento en el formulario que proporciona Google, Google dará su autorización para que la aplicación de lectura tenga acceso al documento mediante la emisión de un token de acceso. La aplicación de lectura utiliza el token de acceso para emitir una solicitud hacia el servicio de Google Drive, con el fin de que sea posible recuperar el archivo de Jenny.
En el siguiente diagrama se muestra cómo ocurre la comunicación entre cada una de las partes:
Tenga en cuenta que aunque todas las comunicaciones de OAUTH 2.0 utilizan solicitudes HTTP, no es necesario que los servidores sean aplicaciones web.
Vamos a mostrar este sencillo escenario con InterSystems IRIS.
Demo sencilla de Google Drive
En esta demostración crearemos una pequeña aplicación con base en CSP, que solicitará los recursos (la lista de archivos) guardados en Google Drive con nuestra propia cuenta (y también una lista de nuestros eventos en el calendario como una ventaja adicional).
Requisitos previos
Antes de que comenzar a programar la aplicación, necesitamos preparar el entorno. Esto incluye un servidor web que tenga habilitado el protocolo SSL y un perfil de Google.
Configuración del servidor web
Como se indicó anteriormente, necesitamos que el Servidor de autorización se comunique con SSL, ya que esto es un requisito establecido por OAuth 2.0 de forma predeterminada. Queremos que nuestros datos se mantengan seguros, ¿verdad?
La explicación de cómo configurar un servidor web para que sea compatible con SSL está fuera del alcance de este artículo, por lo que debe consultar los manuales de usuario correspondientes al servidor web de su preferencia. Para su conocimiento (como veremos más adelante con algunas capturas de pantalla), en este ejemplo en particular utilizaremos el servidor Microsoft IIS.
Configuración de Google
Para registrarnos en Google, necesitamos usar el administrador de APIs de Google (Google API Manager) - https://console.developers.google.com/apis/library?project=globalsummit2016demo
Para esta demo, creamos la cuenta GlobalSummit2016Demo. Asegúrese de que tenemos habilitada la API del Drive API.
Ahora se definen las credenciales:
Y tenga en cuenta lo siguiente.
Authorized JavaScript – solamente permitimos a los scripts que se originan de forma local, y que tengan relación con la llamada a la página
Authorized redirect URIs – en teoría podemos redirigir nuestra aplicación del cliente hacia cualquier sitio, pero cuando utilizamos la implementación de InterSystems IRIS, OAUTH, debemos redirigirla hacia https://localhost/csp/sys/oauth2/OAuth2.Response.cls. Puede definir varias URI de redireccionamiento autorizadas, como se muestra en la captura de pantalla, aunque para esta demostración únicamente necesitamos la segunda entrada de las dos que hay disponibles
Por último, es necesario que se configure InterSystems IRIS como cliente del Servidor de Autorización de Google.
Configuración de Caché
La configuración como cliente de InterSystems IRIS OAUTH2 es un proceso en dos pasos. Primero, necesitamos crear una Configuración para el Servidor.
En SMP, vaya a System Administration > Security > OAuth 2.0 > Client Configurations.
Haga click en el botón Create Server Configuration, complete el formulario y guárdelo.
Toda la información que introdujo en el formulario está disponible en el sitio web para desarrolladores de Google ("Google Developers"). Tenga en cuenta que InterSystems IRIS es compatible con el reconocimiento automático de Open ID. Sin embargo, como no utilizamos ese protocolo, introdujimos toda la información de forma manual.
Ahora, haga clic en el enlace Client Configurations que se encuentra junto al Issuer Endpoint recién creado y haga clic en el botón Create Client Configuration.
Deje vacías las pestañas Client Information y JWT Settings (con los valores predeterminados) y complete los campos de la pestaña Client credentials.
Tenga en cuenta que creamos un Confidential Client (este es más seguro que el público), lo que significa que la información confidencial del cliente nunca sale de la aplicación cliente-servidor (nunca se transmite al navegador).
También, debe asegurarse de que la opción Use SSL/TLS está seleccionada, proporcione el nombre del servidor (debe ser localhost, ya que estamos redirigiendo la aplicación del cliente de manera local) y finalmente el puerto y el prefijo (esto es útil cuando existen varias instancias de InterSystems IRIS en el mismo equipo). De acuerdo a la información que se introdujo, la URL de redireccionamiento del cliente será registrada y se mostrará en la línea de arriba.
En la captura de pantalla anterior, proporcionamos una configuración SSL llamada GOOGLE. El nombre en sí solamente sirve para ayudarle a determinar cuál de las muchas posibles configuraciones de la SSL se utilizará para este canal de comunicación en particular. Caché utiliza las configuraciones SSL/TLS para almacenar toda la información necesaria para establecer un tráfico seguro con el servidor (en este caso, los URI de Google OAuth 2.0).
Consulte la documentación para obtener más información.
Proporcione los valores de Client ID y los de Client Secret que se obtuvieron del formulario para definir Google Credentials (si utiliza la configuración manual).
Ahora ya hemos terminado todos los pasos de la configuración y podemos avanzar hacia la programación de una aplicación CSP.
La aplicación del cliente
La aplicación del cliente es una sencilla aplicación web que se basa en CSP. Como tal, consiste en el código fuente del lado del servidor, que se define y ejecuta mediante el servidor web y una interfaz de usuario, y se muestra a los usuarios mediante un navegador web.
El servidor del cliente
El servidor del cliente es una aplicación sencilla de 2 páginas. Dentro de la aplicación, podemos:
· Juntar el redireccionamiento de la URL con el Servidor de Autorización de Google
· Realizar solicitudes a las APIs de Google Drive y de Google Calendar y mostrar el resultado
Página 1
Esta es una página de la aplicación, donde decidimos llamar a Google mediante sus recursos.
A continuación, se muestra un código minimalista, pero totalmente funcional, para representar la página.
Class Web.OAUTH2.Google1N Extends %CSP.Page
{
Parameter OAUTH2CLIENTREDIRECTURI = "https://localhost/csp/google/Web.OAUTH2.Google2N.cls";
Parameter OAUTH2APPNAME = "Google";
ClassMethod OnPage() As %Status
{
&html<<html>
<head>
</head>
<body style="text-align: center;">
<!-- insert the page content here -->
<h1>Google OAuth2 API</h1>
<p>This page demo shows how to call Google API functions using OAuth2 authorization.
<p>We are going to retrieve information about user and his/her Google Drive files as well as calendar entries.
>
// we need to supply openid scope to authenticate to Google
set scope="openid https://www.googleapis.com/auth/userinfo.email "_
"https://www.googleapis.com/auth/userinfo.profile "_
"https://www.googleapis.com/auth/drive.metadata.readonly "_
"https://www.googleapis.com/auth/calendar.readonly"
set properties("approval_prompt")="force"
set properties("include_granted_scopes")="true"
set url=##class(%SYS.OAuth2.Authorization).GetAuthorizationCodeEndpoint(..#OAUTH2APPNAME,scope,
..#OAUTH2CLIENTREDIRECTURI,.properties,.isAuthorized,.sc)
w !,"<p><a href='"_url_"'><img border='0' alt='Google Sign In' src='images/google-signin-button.png' ></a>"
&html<</body>
</html>>
Quit $$$OK
}
ClassMethod OnPreHTTP() As %Boolean [ ServerOnly = 1 ]
{
#dim %response as %CSP.Response
set scope="openid https://www.googleapis.com/auth/userinfo.email "_
"https://www.googleapis.com/auth/userinfo.profile "_
"https://www.googleapis.com/auth/drive.metadata.readonly "_
"https://www.googleapis.com/auth/calendar.readonly"
if ##class(%SYS.OAuth2.AccessToken).IsAuthorized(..#OAUTH2APPNAME,,scope,.accessToken,.idtoken,.responseProperties,.error) {
set %response.ServerSideRedirect="Web.OAUTH2.Google2N.cls"
}
quit 1
}
}
Explicamos brevemente el código:
1. Método OnPreHTTP - primero, debemos verificar si, por casualidad, ya obtuvimos un token de acceso válido como resultado de la autorización de Google (esto puede suceder, por ejemplo, cuando simplemente actualizamos la página). Si no es así, necesitaremos la autorización. Si ya tenemos un token, simplemente redirigiremos la página hacia la página que muestra los resultados
2. Método OnPage - solo lo utilizamos si no contamos con un token de acceso válido disponible. Para iniciar la comunicación, tenemos que realizar nosotros mismos la autenticación y la autorización con Google para que nos conceda el token de acceso
3. Definimos el objetivo de una cadena y las propiedades de la matriz que modifican el comportamiento del cuadro de diálogo para la autenticación de Google (necesitamos autenticarnos frente a Google antes de que éste nos otorgue su autorización según nuestra identidad)
4. Por último, recibimos la URL para una página de inicio de sesión en Google y se la presentamos al usuario seguida de la página de consentimiento
Una última cosa a tener en cuenta:
Especificamos la verdadera página de redireccionamiento en https://www.localhost/csp/google/Web.OAUTH2.Google2N.cls con el parámetro OAUTH2CLIENTREDIRECTURI. Sin embargo, ¡hemos usado la página del sistema de InterSystems IRIS con la estructura OAUTH para definir las credenciales de Google! El redireccionamiento se gestiona internamente mediante la clase de nuestro controlador OAUTH.
Página 2
En esta página se muestran los resultados de la autorización de Google y, si salió bien, recurriremos a las llamadas de la API de Google para recuperar los datos. Una vez más, es un código minimalista, pero totalmente funcional. Dejamos a la imaginación del lector una forma más estructurada para mostrar los datos que obtienen.
Include %occInclude
Class Web.OAUTH2.Google2N Extends %CSP.Page
{
Parameter OAUTH2APPNAME = "Google";
Parameter OAUTH2ROOT = "https://www.googleapis.com";
ClassMethod OnPage() As %Status
{
&html<<html>
<head>
</head>
<body>>
// Check if we have an access token
set scope="openid https://www.googleapis.com/auth/userinfo.email "_
"https://www.googleapis.com/auth/userinfo.profile "_
"https://www.googleapis.com/auth/drive.metadata.readonly "_
"https://www.googleapis.com/auth/calendar.readonly"
set isAuthorized=##class(%SYS.OAuth2.AccessToken).IsAuthorized(..#OAUTH2APPNAME,,scope,.accessToken,.idtoken,.responseProperties,.error)
if isAuthorized {
// Google has no introspection endpoint - nothing to call - the introspection endpoint and display result -- see RFC 7662.
w "<h3>Data from <span style='color:red;'>GetUserInfo API</span></h3>"
// userinfo has special API, but could be also retrieved by just calling Get() method with appropriate url
try {
set tHttpRequest=##class(%Net.HttpRequest).%New()
$$$THROWONERROR(sc,##class(%SYS.OAuth2.AccessToken).AddAccessToken(tHttpRequest,"query","GOOGLE",..#OAUTH2APPNAME))
$$$THROWONERROR(sc,##class(%SYS.OAuth2.AccessToken).GetUserinfo(..#OAUTH2APPNAME,accessToken,,.jsonObject))
w jsonObject.%ToJSON()
} catch (e) {
w "<h3><span style='color: red;'>ERROR: ",$zcvt(e.DisplayString(),"O","HTML")_"</span></h3>"
}
/******************************************
* *
* Retrieve info from other APIs *
* *
******************************************/
w "<hr>"
do ..RetrieveAPIInfo("/drive/v3/files")
do ..RetrieveAPIInfo("/calendar/v3/users/me/calendarList")
} else {
w "<h1>Not authorized!</h1>"
}
&html<</body>
</html>>
Quit $$$OK
}
ClassMethod RetrieveAPIInfo(api As %String)
{
w "<h3>Data from <span style='color:red;'>"_api_"</span></h3><p>"
try {
set tHttpRequest=##class(%Net.HttpRequest).%New()
$$$THROWONERROR(sc,##class(%SYS.OAuth2.AccessToken).AddAccessToken(tHttpRequest,"query","GOOGLE",..#OAUTH2APPNAME))
$$$THROWONERROR(sc,tHttpRequest.Get(..#OAUTH2ROOT_api))
set tHttpResponse=tHttpRequest.HttpResponse
s tJSONString=tHttpResponse.Data.Read()
if $e(tJSONString)'="{" {
// not a JSON
d tHttpResponse.OutputToDevice()
} else {
w tJSONString
w "<hr/>"
/*
// new JSON API
&html<<table border=1 style='border-collapse: collapse'>>
s tJSONObject={}.%FromJSON(tJSONString)
set iterator=tJSONObject.%GetIterator()
while iterator.%GetNext(.key,.value) {
if $isobject(value) {
set iterator1=value.%GetIterator()
w "<tr><td>",key,"</td><td><table border=1 style='border-collapse: collapse'>"
while iterator1.%GetNext(.key1,.value1) {
if $isobject(value1) {
set iterator2=value1.%GetIterator()
w "<tr><td>",key1,"</td><td><table border=0 style='border-collapse: collapse'>"
while iterator2.%GetNext(.key2,.value2) {
write !, "<tr><td>",key2, "</td><td>",value2,"</td></tr>"
}
// this way we can go on and on into the embedded objects/arrays
w "</table></td></tr>"
} else {
write !, "<tr><td>",key1, "</td><td>",value1,"</td></tr>"
}
}
w "</table></td></tr>"
} else {
write !, "<tr><td>",key, "</td><td>",value,"</td></tr>"
}
}
&html<</table><hr/>
>
*/
}
} catch (e) {
w "<h3><span style='color: red;'>ERROR: ",$zcvt(e.DisplayString(),"O","HTML")_"</span></h3>"
}
}
}
Echemos un vistazo rápido al código:
1. En primer lugar, debemos comprobar si contamos con un token de acceso válido (que estamos autorizados)
2. Si es así, podemos hacer solicitudes a las APIs que ofrece Google, y están cubiertas por el token de acceso que se emitió
3. Para ello, utilizamos la clase estándar %Net.HttpRequest, pero añadimos el token de acceso a los métodos GET o POST, de acuerdo con la especificación de la API que se llamó
4. Como puede ver, la estructura OAUTH tiene implementado el método GetUserInfo() para su comodidad, pero puede recuperar directamente la información del usuario utilizando la especificación de la API de Google, de igual forma que lo hicimos con el método de ayuda RetrieveAPIInfo()
5. OAUTH intercambia los datos en formato JSON, simplemente leemos los datos que obtenemos y los volcamos en el navegador. Le corresponde al desarrollador de la aplicación analizar y dar formato a los datos recibidos, para que el usuario pueda verlos de una manera que sea útil para él. Pero esto va más allá del objetivo de esta demostración. (Aunque existen algunos comentarios en el código que muestran cómo realizar estos análisis)
Aquí se puede ver una captura de pantalla con los resultados, donde se muestran datos sin procesar en JSON.
Continúe con la parte 2, en la que se describe cómo actúa InterSystems IRIS como un servidor de autorización y como un proveedor de OpenID Connect.
[1] https://tools.ietf.org/html/rfc6749, https://tools.ietf.org/html/rfc6750
Artículo
Jose-Tomas Salvador · 28 ene, 2020
Hola Desarrolladores!
"objectscript.conn" :{
"ns": "IRISAPP",
"active": true,
"docker-compose": {
"service": "iris",
"internalPort": 52773
}
Quiero compartir con vosotros una estupenda nueva funcionalidad que he descubierto en la nueva versión 0.8 del plugin de VSCode ObjectScript desarrollado por @Dmitry.Maslennikov y CaretDev.
La versión viene con un nuevo parámetro de configuración: "docker-compose"; que resuelve el problema con los puertos que necesitas para conectar tu editor VSCode a IRIS. No era muy cómodo si tenías más de un contenedor docker con IRIS corriendo en la misma máquina. Ahora ¡esto está resuelto!
Veamos como funciona ahora...
El concepto de utilizar docker localmente para desarrollar con IRIS supone que tienes un dockerfile y un docker-compose.yml en el repositorio, con los que tu construyes el entorno del proyecto y cargas todo el código ObjectScript dentro del contenedor IRIS descargado de Docker Hub. Y también tienes el archivo .vscode/settings.json de VSCode en el repositorio, en el cual indicas el puerto del servidor web de IRIS al que te conectas (junto con otros parámetros de conexión tales como URL, Namespace y credenciales de acceso).
La cuestión es: ¿cuál es el puerto al que se debería conectar VSCode?
Puedes utilizar el puerto 52773, que es el puerto por defecto del servidor web de IRIS. Pero si intentas lanzar un segundo contenedor docker, fallará porque no puedes ejecutar dos contenedores docker en la misma máquina que comparten conexiones en el mismo puerto. Puedes exponer un puerto externo para un contenedor docker y esto se puede configurar en el archivo docker-compose.yml. Aquí vemos un ejemplo (en negrita el puerto mapeado):
version: '3.6'
services:
iris:
build: .
restart: always
ports:
- 52791:52773
volumes:
- ~/iris.key:/usr/irissys/mgr/iris.key
- ./:/irisdev/app
De este modo, puedes mirar en el docker-compose y escribir el mismo puerto en .vscode/settings.json:
Entonces, te preguntarás, ¿cuál es el problema?
El problema está en cuando expones tu proyecto como una librería o demo e invitas a la gente a ejecutar y editar código con VSCode. No quieres que tengan que configurar el puerto manualmente y quieres que puedan clonar el repositorio, ejecutar docker y tener la opción de colaborar inmediatamente. Y esta es la cuestión: ¿a qué puertos deberías mapear tu proyecto en docker-compose de modo que no provoque ningún conflicto en el entorno de cualquier otro desarrollador?
Incluso si no lo expones a nadie más que a tí, ¿qué puerto pondrías en los parámetros de la conexión en .vscode/settings.json?
La cuestión es que, cuando lanzas un nuevo docker con IRIS, ves un mensaje de error diciendo que el puerto ya está en uso y, o bien paras el otro contenedor o bien te inventas otro puerto que quizá no esté siendo utilizado y pruebas con él en docker-compose y settings.json.
Es aburrido, es una pérdida de tiempo, es un esfuerzo inútil. A nadie le gusta.
Y ocurre lo mismo si expones la librería.
La solución la encontramos con la nueva release 0.8 de VSCode ObjectScript, donde puedes introducir una sección docker-compose, que resuelve para siempre este tema:
"objectscript.conn" :{
"ns": "IRISAPP",
"active": true,
"docker-compose": {
"service": "iris",
"internalPort": 52773
}
Contiene los parámetros service e internalPort que le indican a VSCode que para encontrar el puerto al que debe conectarse debe mirar en el fichero docker-compose.yml que tenemos en el mismo repositorio e ir a la sección del servicio "iris" donde encontrará el puerto que está mapeado al puerto interno 52773.
¡Bien!
Y lo que aún es mejor, Docker ahora tiene el modo para docker-compose.yml en el que puedes no configurar ningún puerto en docker, y en su lugar dejar el símbolo "-" como puerto mapeado, lo que significa que docker utilizará, de forma aleatoria, cualquier puerto que esté disponible.
iris:
build:
context: .
dockerfile: Dockerfile-zpm
restart: always
ports:
- 51773
- 52773
- 53773
volumes:
- ~/iris.key:/usr/irissys/mgr/iris.key
- ./:/irisdev/app
¡Bien, por partida doble! Porque esto te da la opción de no preocuparte nunca más sobre los puertos del servidor web de IRIS a los que se debe conectar VSCode.
¿Cómo funciona en este caso? Ejecutamos docker-compose.yml , docker coge un puerto aleatorio para el servidor web y ejecuta IRIS con él, VSCode obtiene este puerto desde docker y conecta con IRIS a través de él de modo que tú puedes editar y compilar código inmediatamente. Sin configuraciónes adicionales.
¡Aprovecha!
Puedes sentir la magia con el siguiente template que modificamos recientemente de acuerdo a la nueva funciontalidad de VSCode ObjectScript 0.8 y que ya tiene modificados los ficheros settings.json y docker-compose.yml. Para probar el template ejecuta los siguientes comandos en el terminal (probado en Windows 10 y en Mac). También necesitas tener instalado git y Docker Desktop.
$ git clone https://github.com/intersystems-community/objectscript-docker-template.git
$ cd objectscript-docker-template
$ docker-compose up -d
Abre este directorio en VSCode (asegúrate de que tienes el plugin VScode ObjectScript instalado):
Comprueba si VSCode está conectado - haz click en la línea de estado de VSCode:
Reconecta VSCode si es necesario.
Si lo necesitas también puedes abrir un terminal IRIS en VSCode con el menú de ObjectScript (*).
¡Hecho! Ahora puedes ejecutar, compilar y debugar el código!
¡Disfruta!
Nota.- A fecha de hoy, la opción de abrir un terminal de IRIS directamente desde VSCode puede dar un error. No obstante, se puede entrar en la consola de IRIS desde VSCode abriendo un terminal y ejecutando el comando:
docker-compose exec iris /bin/bash -c 'command -v ccontrol >/dev/null 2>&1 && ccontrol session $ISC_PACKAGE_INSTANCENAME -U IRISAPP || iris session $ISC_PACKAGE_INSTANCENAME -U IRISAPP'
Este problema será resuelto en posteriores versiones. Si te lo encuentras, añade un comentario para hacerle seguimiento. 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
Jose-Tomas Salvador · 26 mayo, 2020
AWS ha liberado oficialmente su segunda generación de procesadores Graviton2 basados en ARM y asociados al tipo de instancia Amazon EC2 M6g, que presume de ser hasta un 40% mejor en precio-rendimiento sobre la actual generación de instancias M5 basadas en Xeon.
Hace pocos meses, Inthhis nos llevó a suportar arquitecturas ARM64 por primera vez.
¡Ahora puedes probar InterSystems IRIS e InterSystems IRIS for Health sobre instancias Amazon EC2 M6g basadas en Graviton2 accesibles a través del AWS Marketplace!
Si no estás familiarizado con el lanzamiento de una instancia a través del AWS Marketplace, vamos a hacerlo ahora. Lo primero es hacer log-in en tu cuenta AWS, después navega al listado de InterSystems IRIS del AWS Marketplace y haz clien en ‘Continue to Subscribe’
Click en ‘Accept Terms’ para subscribirte, espera un minuto, y después ‘Continue to Configuration’
Puedes aceptar los valores por defecto y ‘Continue to Launch’
En la página de lanzamiento, asegúrate de seleccionar el tipo de instancia m6g.large
Ve bajando, y selecciona un par de claves válido, o sigue el link para crear uno nuevo si no tienes ya uno. Después selecciona Launch.
Ahora ya puedes navegar a tu consola EC2 para acceder a tu nueva instancia.
Le puedes dar un nombre, acceder a la dirección IP pública, como ves a continuación:
Y entrar vía SSH a la instancia utilizando tu clave privada y el nombre del host (ubuntu@<Public-IP-Address>). Aquí estoy usando PuTTY, asegúrate de que apuntas a tu fichero de clave privada (.ppk for PuTTY, under SSH > Auth)
Para otros clientes SSH e información adicional, por favor echa un vistazo a las Instrucciones de Uso copiadas aquí:
Instrucciones de Uso para IRIS 2020.1(Arm64) Community Edition
Para comenzar:
- Entrar vía SSH a la instancia Ubuntu EC2 siguiendo las instrucciones aquí: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html
El usuario por defecto es "ubuntu"
- Tomar nota de la información de conexión proporcionada en el mensaje de conexión.
- Comienza por resetear la pasword de IRIS: "$iris password"
- Conecta tu IDE - ver: https://www.intersystems.com/developers/
- Aprender más con un Quickstart - https://learning.intersystems.com/course/view.php?id=1055&ssoPass=1
- Entra directamente al terminal de IRIS con: $docker exec -it iris iris session iris
Recursos adicionales:
Empezando con InterSystems IRIS - https://gettingstarted.intersystems.com/
InterSystems se esfuerza en dar a sus clientes la libertad para elegir plataforma. En InterSystems estamos entusiasmados por ver las ganancias en rendimiento y el ahorro en coste que los procesadores AWS Graviton2 pueden proporcionar a los usuarios de InterSystems IRIS. Preveemos que estos beneficios combinados deberían llevar a una adopción significativa de plataformas basadas en ARM entre usuarios de IRIS, y ¡nos emociona soportar InterSystems IRIS corriendo sobre instancias AWS Graviton2-based M6g EC2!
Anuncio
David Reche · 10 jun, 2020
Ya están disponibles las versiones de prueba de InterSystems IRIS Advanced Analytics y de InterSystems IRIS for Health Advanced Analytics. El add-on Advanced Analytics para InterSystems IRIS introduce IntegratedML como una nueva funcionalidad.
El número de compilación de estas versiones es el: 2020.3.0AA.331.0
Los kits para la instalación, las imágenes del contenedor y las licencias de evaluación están disponibles en la página de descargas para pruebas del Centro de Soporte Internacional (WRC).
Los contenedores de la "Community Edition" también pueden obtenerse la Docker Store usando los siguientes comandos:
docker pull store/intersystems/iris-aa-community:2020.3.0AA.331.0
docker pull store/intersystems/irishealth-aa-community:2020.3.0AA.331.0
Advanced Analytics es un add-on de InterSystems IRIS, e introduce IntegratedML, una nueva funcionalidad que ofrece el mejor machine learning a los analistas y desarrolladores, a través de una sencilla e intuitiva sintaxis de SQL. Los desarrolladores ahora pueden preparar y desplegar potentes modelos predictivos dentro de IRIS, justo donde se encuentran sus datos. Las versiones futuras de Advanced Analytics constarán de características adicionales y componentes de terceros para ofrecer funcionalidades avanzadas de analítica y machine learning.
Esta versión incluye documentación para IntegratedML, como esta Guía de Usuario o estos recursos para IntegratedML del Servicio de Formación de InterSystems.
Artículo
Ricardo Paiva · 19 jun, 2020
¡Hola desarrolladores!
¿Os habéis encontrado con la necesidad de crear una base de datos, un namespace o una aplicación web de manera programática?
Quiero compartir con vosotros un fragmento de código ObjectScript que permite crear una base de datos, un namespace y una aplicación web para InterSystems IRIS.
```
set currentNS = $namespace
zn "%SYS"
write "Create DB ...",!
set dbName="testDB"
set dbProperties("Directory") = "/InterSystems/IRIS/mgr/testDB"
set status=##Class(Config.Databases).Create(dbName,.dbProperties)
write:'status $system.Status.DisplayError(status)
write "DB """_dbName_""" was created!",!!
write "Create namespace ...",!
set nsName="testNS"
//DB for globals
set nsProperties("Globals") = dbName
//DB for routines
set nsProperties("Routines") = dbName
set status=##Class(Config.Namespaces).Create(nsName,.nsProperties)
write:'status $system.Status.DisplayError(status)
write "Namespace """_nsName_""" was created!",!!
write "Create web application ...",!
set webName = "/csp/testApplication"
set webProperties("NameSpace") = nsName
set webProperties("Enabled") = $$$YES
set webProperties("IsNameSpaceDefault") = $$$YES
set webProperties("CSPZENEnabled") = $$$YES
set webProperties("DeepSeeEnabled") = $$$YES
set webProperties("AutheEnabled") = $$$AutheCache
set status = ##class(Security.Applications).Create(webName, .webProperties)
write:'status $system.Status.DisplayError(status)
write "Web application """webName""" was created!",!
zn currentNS
```
También podéis consultar estos manuales:
- [Creating Database](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Config.Databases)
- [Namespace](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Config.Namespaces)
- [CSP Application](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Security.Applications)