Nova postagem

Pesquisar

Artigo
· Mar. 7 1min de leitura

QuinielaML - Predicción de la 48ª jornada de la Quiniela

Después de un más que inmerecido descanso que me tomé la pasada semana, ¡retornamos con nuestras predicciones quinielísticas! Jornadas 27 de Primera División y 30 de Segunda.

Veamos los partidos que entran esta jornada:

Predicciones para la Primera División:

Lo mismo para Segunda:

Veamos que Quiniela resulta de lo anterior:

Confiemos en que Bordalás esté levantando un tabique en las porterías del Getafe para ese empate.

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· Mar. 7 2min de leitura

Building AI Agents with interSystems IRIS - What do we mean?

Hi, colleagues!

As you can see the new topic of the programming contest - AI Agents. 

The topic was over-hyped recently on the Internet and has different meanings. You might get curious about what we mean by AI agents in regard to the InterSystems programming contest.

Indeed, we believe that AI agents can change the landscape of IT solutions in almost all spheres significantly boosting its efficiency and often changing the way of management, consumption and operation.

In general, AI agents are about the enablement of different business processes into automation so that automation includes decision-making based on any of the GenAI engines available on the market, e.g., OpenAI, Claude, or Grok which could be used in conjunction with IRIS Vector Search related to RAG solutions. 

Usually, AI agent building assumes leveraging any of the scenario automation engines, such as Zapier, Make, N8N, Pydentic or/and InterSystems IRIS Interoperability.

What AI agents can do? Well, we can ask ChatGPT about it now, but the most usual practices are:

  • - checking, filtering, and answering emails,
  • - looking for events of a kind and booking tickets,
  • - answering support tickets,
  • - monitoring database/services and cleaning up or providing service operations.

So in this contest, we'll consider as an AI Agentic a solution that leverages:

- any LLM engine for making decisions (e.g. OpenAI, Antropic, Grok),

- any automation/interoperability engine (e.g. Zapier, Make, N8N, IRIS Interoperability),

- either IRIS database, IRIS Interoperability, or IRIS Vector Search usage is a mandatory condition.

Good luck, and I am looking forward to introducing more helpful AI agents of any kind powered by InterSystems IRIS!

4 Comments
Discussão (4)3
Entre ou crie uma conta para continuar
Artigo
· Mar. 7 4min de leitura

Plugin moderno y fácil de usar para VSCode de InterSystems ObjectScript: Visualización de diagramas de clases con PlantUML

Motivación

Empecé a programar en 2015, cuando estaba haciendo la carrera de informática. No conocía ObjectScript hasta que empecé en mi nuevo trabajo hace cuatro meses. ObjectScript en realidad no es un lenguaje de programación joven. Comparado con C++, Java y Python, la comunidad no es tan activa, pero queremos hacer que este espacio sea más dinámico, ¿verdad?  

Me he dado cuenta de que a algunos de mis compañeros les cuesta entender las relaciones entre clases en estos proyectos tan enormes. No hay ninguna herramienta moderna y fácil de usar para crear diagramas de clases en ObjectScript.

Trabajos relacionados

He probado trabajos relevantes:

- Vista de clases de InterSystems:  

1. https://github.com/intersystems-community/ClassExplorer  
Es un gran trabajo y el diagrama de clases se ve muy bien y limpio. Pero sigue habiendo un problema con el build en Docker: "#0 0.512 exec ./irissession.sh: no such file or directory". Me da la impresión de que es una función pensada para Studio más que para VSCode. Parece que hay que importar el proyecto de forma manual y requiere cierta configuración para poder utilizarlo.  

2. https://github.com/gjsjohnmurray/vscode-objectscript-class-view  
Este es otro gran trabajo que me ha dado inspiración. La estructura de clases es clara y además soporta no solo las clases del proyecto, sino también las de las bibliotecas. Pero parece más bien una versión mejorada del outline de VSCode.  

- Otros plugins de visualización de diagramas de clases para VSCode en otros lenguajes:  

1. https://github.com/OH318/J-Diagram  
El readme muestra muy bien el resultado usando draw.io. Pero cuando lo probé localmente, no me funcionó, así que no lo usé como referencia.  

2. https://github.com/pierre3/PlantUmlClassDiagramGenerator  
Está relativamente bien y requiere algo de configuración. Tomé la idea de generar primero el UML y después usar PlantUML para generar el diagrama de clases.  

- Mejor implementación de diagramas de clases:  

1. Los productos de JetBrains, como IntelliJ IDEA y PyCharm, son increíbles para diagramas de clases. Solo arrastráis y soltáis las clases, hacéis clic en un hipervínculo y ya podéis generar un diagrama de clases muy potente.  

2. Plugin de diagrama de clases para TypeScript en VSCode  
https://marketplace.visualstudio.com/items?itemName=AlexShen.classdiagra...  
Permite arrastrar y soltar, hacer clic en hipervínculos y también soporta la generación de diagramas de clases para carpetas enteras.  

Me inspiré en su diseño. Por desgracia, son de código cerrado, así que tendré que diseñar mi propio proyecto desde cero.

InterSystems ObjectScript Class Diagram View

es una extensión de Visual Studio Code que genera diagramas de clases UML a partir de archivos InterSystems ObjectScript (.cls). Ofrece funciones de visualización interactiva y navegación, y está basada en PlantUML para garantizar un renderizado fiable de los diagramas.

Características principales

  • Generación de diagramas de clases UML a partir de archivos .cls
  • Soporte para la generación de diagramas tanto a nivel de clase única como de carpeta
  • Integración del menú contextual del botón derecho del ratón tanto en el editor como en el explorador
  • Visualización de relaciones entre clases, propiedades y métodos
  • Construido sobre PlantUML para un renderizado de diagramas fiable
  • Generación de diagramas mediante PlantUML Web Server (no requiere Java)
  • Exploración interactiva de diagramas de clases
    • Haced clic en nombres de clases, propiedades o métodos para saltar directamente al código correspondiente
    • Diagramas SVG incrustados en HTML para una interacción fluida
    • Navegación visual de relaciones entre clases

Probé el plugin en otro gran proyecto de ObjectScript, apiPub

Para una sola clase:

Para una carpeta

Para todo el proyecto. El diagrama de clases está en formato SVG, y siempre se ve nítido y claro.

Requisitos

OS Requerido Opcional (para generación de PlantUML local)
Windows - VSCode 1.96.0+
- ObjectScript Class Files(.cls)
- Java 8+
Linux - VSCode 1.96.0+
- ObjectScript Class Files(.cls)
- Java 8+
- Graphviz

Uso

  • Abrid un archivo .cls y generad un diagrama de clases utilizando:
    • Atajo Ctrl+Alt+U
    • Haced clic con el botón derecho en un archivo o carpeta y seleccionad «Generar diagrama de clases»
  • Haced clic en los elementos del diagrama para saltar a las definiciones de clase, propiedades y métodos

Problemas conocidos

 

  • Navegación por bibliotecas externas: No se puede navegar a las definiciones de la biblioteca InterSystems objectscript a través de interacciones de clic
  • Generación de subclases: Falta funcionalidad para generar diagramas de subclase para la clase actual
  • Rendimiento de proyectos grandes:
    • La generación de diagramas para carpetas grandes a través del botón derecho del ratón puede experimentar retrasos significativos.
    • La vista web/SVG generada para proyectos grandes carece de una funcionalidad de zoom suave y de un escalado adecuado.

Notificad cualquier problema en el repositorio de GitHub.

Contribución & licencia

  • Abierto a contribuciones a través de GitHub
  • Licencia MIT

Podéis encontrar este plugin en el marketplace, sentíos libres de crear issues en issue y contribuir con PR.

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· Mar. 7 3min de leitura

Forcer une variable à s'auto-observer

Je me suis lancé un défi : trouver un moyen de faire en sorte qu'une variable se surveille elle-même pour une certaine valeur et fasse quelque chose lorsqu'elle atteint cette valeur sans avoir à la vérifier à chaque fois que quelque chose la touche. En gros, un moyen de dire "à un moment donné pendant l'exécution de ce code, si x = 0 (ou quelle que soit la condition) faire ceci". La classe avec laquelle j'ai fini par surveiller un %Status :

Class User.WatchedStatus Extends %RegisteredObject
{
Property sc As %Status [ InitialExpression = 1, SqlComputeCode = {set {*} = ##class(User.WatchedStatus).Reset({sc},{resetSelf})}, SqlComputed, SqlComputeOnChange = isErr ];
Property isErr As %Boolean [ InitialExpression = 0, SqlComputeCode = {set {*} = ##class(User.WatchedStatus).ErrCheck({sc},{writeSelf},{logSelf},{throwSelf})}, SqlComputed, SqlComputeOnChange = sc ];
Property throwSelf As %Boolean [ InitialExpression = 0 ];
Property logSelf As %Boolean [ InitialExpression = 0 ];
Property writeSelf As %Boolean [ InitialExpression = 0 ];
Property resetSelf As %Boolean [ InitialExpression = 0 ];
/// Handles status according to flags set, then sets isErr.
ClassMethod ErrCheck(sc, writeSelf, logSelf, throwSelf) As %Boolean [ Internal ]
{
	if $$$ISERR(sc){
		if writeSelf{
			write $SYSTEM.Status.GetErrorText(sc)
		}
		if logSelf = 1{
			do ##class(%Exception.StatusException).CreateFromStatus(sc).Log()
		}
		if throwSelf = 1{
			$$$ThrowStatus(sc)
		}
		quit 1
	}
	else{
		quit 0
	}
}

/// If resetSelf is true, resets the status code after error handling occurs.
ClassMethod Reset(sc, resetSelf) As %Status [ Internal ]
{
	return:resetSelf $$$OK
	return sc
}

/// flags is a string which determines status behavior when an error occurs
/// T = throw the status
/// L = log the status as an exception
/// W = write the status error text
/// R = reset status after error handling; if set, isErr goes back to 0 and sc goes back to 1
ClassMethod New(flags As %String) As User.WatchedStatus
{
	set status = ##class(User.WatchedStatus).%New()
	set flags = $ZCVT(flags,"U")
	set:(flags [ "T") status.throwSelf = 1
	set:(flags [ "L") status.logSelf = 1
	set:(flags [ "W") status.writeSelf = 1
	set:(flags [ "R") status.resetSelf = 1
	return status
}

}

Si je crée une nouvelle instance de cette classe en utilisant set status = ##class(User.WatchedStatus).New("wr"), alors lorsque j'appelle des méthodes qui renvoient un %Status, je peux utiliser set status.sc = (quelle que soit la méthode ici) et si elle renvoie un statut d'erreur, elle écrira ce statut sans que j'aie à vérifier s'il s'agit d'une erreur et lui dire de le faire à chaque fois, puis se réinitialisera pour sa prochaine utilisation. J'ai également un indicateur t ou l pour savoir si je veux que le statut se déclenche ou s'enregistre comme une exception dans les journaux système. (Notez que si je n'incluais pas l'indicateur r, il ne se réinitialiserait pas, de sorte que vous pourriez toujours vérifier le code de statut par la suite.)

Cela utilise SqlComputeCode d'une manière qui n'est probablement pas censée être utilisée, et vous devez être prudent en l'écrivant de cette façon. Étant donné que isErr se calcule lui-même lors d'un changement de sc et que sc se calcule lui-même lors d'un changement d'isErr, vous pourriez vous retrouver dans une boucle. Cela n'arrivera pas ici, car l'ensemble du système finira par se stabiliser à nouveau.

Je ne sais pas exactement à quel point tout le monde tirera parti de cet exemple de %Status, mais je documente ici comment je l'ai fait au cas où quelqu'un d'autre essaierait de comprendre cela pour un autre type d'objet.

Discussão (0)1
Entre ou crie uma conta para continuar
Pergunta
· Mar. 6

SDA3 to HL7 transform

Has anyone used this transform to convert SDA3 to HL7?

HS.Gateway.SDA3.SDA3ToHL7.ADTA0N

Seeing below error

ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/PatientNumbers/[1]/Organization/UniversalId' because UniversalId in /Patient/PatientNumbers/[1]/Organization/UniversalId is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/PatientNumbers/[2]/Organization/UniversalId' because UniversalId in /Patient/PatientNumbers/[2]/Organization/UniversalId is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/Name/MiddleName' because MiddleName in /Patient/Name/MiddleName is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/Name/NameSuffix' because NameSuffix in /Patient/Name/NameSuffix is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/Name/NamePrefix' because NamePrefix in /Patient/Name/NamePrefix is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/MothersFullName/GivenName' because GivenName in /Patient/MothersFullName/GivenName is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/MothersFullName/MiddleName' because MiddleName in /Patient/MothersFullName/MiddleName is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/MothersFullName/NameSuffix' because NameSuffix in /Patient/MothersFullName/NameSuffix is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/MothersFullName/NamePrefix' because NamePrefix in /Patient/MothersFullName/NamePrefix is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/MothersFullName/NamePrefix' because NamePrefix in /Patient/MothersFullName/NamePrefix is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/Aliases/[1]/MiddleName' because MiddleName in /Patient/Aliases/[1]/MiddleName is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/Aliases/[1]/NameSuffix' because NameSuffix in /Patient/Aliases/[1]/NameSuffix is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/Race/CodeSystemVersionId' because CodeSystemVersionId in /Patient/Race/CodeSystemVersionId is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/Races/[1]/CodeSystemVersionId' because CodeSystemVersionId in /Patient/Races/[1]/CodeSystemVersionId is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/PrimaryLanguage/Code' because Code in /Patient/PrimaryLanguage/Code is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/PrimaryLanguage/SDACodingStandard' because SDACodingStandard in /Patient/PrimaryLanguage/SDACodingStandard is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/MaritalStatus/SDACodingStandard' because SDACodingStandard in /Patient/MaritalStatus/SDACodingStandard is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/Religion/SDACodingStandard' because SDACodingStandard in /Patient/Religion/SDACodingStandard is not an element, instead this node is a 'unknown' node. + ERROR <Ens>ErrGeneral: Can't evaluate DOM path '/Patient/EnteredOn/' because EnteredOn in /Patient/EnteredOn is not an element, instead this node is a 'unknown' node.

Discussão (0)1
Entre ou crie uma conta para continuar