Administración del Conocimiento – UML Simulation

Dolphin Smalltalk 7 is open source incluyendo la Máquina Virtual

Posted in Aplicaciones, POO by smalltalkuy on febrero 19, 2016
Dolphin Smalltalk

Dolphin Smalltalk

Excelente NOTICIA, Dolphin Smalltalk es open source (http://www.object-arts.com/) incluyendo el código de la Máquina Virtual.

El código esta en:

https://github.com/dolphinsmalltalk

Se pueden bajar Dolphin Smalltalk 7 con los fuentes o simplemente bajarse el instalador.

https://github.com/dolphinsmalltalk/Dolphin

El código de la Máquina Virtual esta en (para compilar la VM se necesita Visual Studio 2015 -community-):

https://github.com/dolphinsmalltalk/DolphinVM

Si simplemente quieren usar o probar Dolphin Smalltalk no hay necesidad de bajarse la VM el instalador trae todo empaquetado para instalar y comenzar a usar. El código de la VM es para quienes constribuimos a mejorar esta excelente herramienta.

Por cualquier duda pueden preguntar en el news groups en:

https://groups.google.com/forum/#!forum/comp.lang.smalltalk.dolphin

 

AST para detectar código malicioso

Posted in OODBMS - Base de Objetos, POO by smalltalkuy on mayo 21, 2015

Problema: en la importación de archivos XPDL generados por Bizagi se importan también reglas de negocio generalmente asociadas a gateways:

bifurCondiciones de bifuracación pueden ser:

– monto > 10000

– edad > 18 y monto > 10000

– En un bloque de Smalltak es:  [:form | form edad > 18 and:[form amount > 10000]]

La implementación y ejecución de estas reglas es bastante sencilla, se crea un BlockClosure y se evalua:

block := self evaluate: ‘[:form | form edad > 18 and:[form amount > 1000]]’.

Aquí se crea un bloque de código que se puede evaluar N veces, en este caso el bloque tiene solamente un argumento “form“. Para evaluar el bloque:

block value: aFormObject.

“en este caso ejecuta –> aFormObject edad > 18 and:[aFormObject amount > 1000]”

PROBLEMA

El Problema es la injección de código malicioso dentro de Bizagi. Si en lugar de la regla previamente presentada se pone la siguiente condición:

‘[:form | MySystem removeAllProcesses]’

En este caso cuando se evalue la condición –> se eliminarán todas las instancias de procesos (un desastre !!!).

SOLUCION

La solución es usar un AST (abstract syntax tree) para evitar este tipo de situaciones.

Si bien en GemStone/S se puede usar otras opciones como la clase GsObjectSecurityPolicy voy a analizar solamente el uso de un AST. Dentro del AST usaremos solamente los mensajes más basicos y no usaremos el RBParseTreeSearcher, que es para hacer búsquedas mucho más complejas (ver Secrets of the Rewriter Tool).

parser := RBParser parseExpression: ‘[:form | MySystem removeAllProcesses].

atomicMessages := parser allChildren select: [:each | each isMessage and: [each receiver isVariable]].

argumentName := parser arguments last name.

(atomicMessages select: [:each | each receiver name ~= argumentName])
do: [:each | self addBlockWarning: ‘Message is sent to object [‘, each receiver name, ‘] that is NOT the argument of the Block.’ ].

Estas simples lineas de código evitan que dentro del bloque se envie mensajes a cualquier objeto o clase.

select: [:each | each isMessage and: [each receiver isVariable]].

De todos los nodos del código selecciona los nodos que son mensajes (isMessage) y además el receptor del mensaje (receiver) es del tipo variable (isVariable). Así obtenemos los objetos a los que se le envián mensajes.

(atomicMessages select: [:each | each receiver name ~= argumentName])

Aquí comparamos los objetos obtenidos anteriormente con el nombre del argumento del bloque (form). Si algún receptor de mensaje difiere del argumento del bloque –> estamos en problemas.

Para el caso:

‘[:form | MySystem removeAllProcesses]

Uno de los receptores de mensaje es ‘MySystem‘ y como difiere de form –> salta el error/advertencia.

Hay otros controles que se hacen pero el post sería muy largo…

Usando JADE en Producción

Posted in Aplicaciones, OODBMS - Base de Objetos, POO by smalltalkuy on marzo 18, 2014

La siguiente figura muestra de forma simplificada como queda la instalación de un sistema con GemStone/S 64 bits: 

(http://gemtalksystems.com/(http://seaside.gemtalksystems.com/).

Los clientes Web se contectan al servidor GemStone/S por internet, de esta forma dan usa a la aplicación web.

Al mismo tiempo que los usuarios usan el sistema, existe la posibilidad que desarrolladores se conecten on-line al sistema para hacer modificaciones (paso 1) que una vez “comiteadas” (luego del #commit) quedan disponibles a los usuarios finales (paso 2).

No hay limitaciones en los tipos de cambio a realizar: cambios en la estructura de objetos (o clases), migraciones de objetos (datos), cambios de comportamiento de la aplicación, cualquier cambio es posible.

Alternative development environment

Alternative development environment

 

Importacion de Maquinas de Estado en U-Fabrik

Posted in Executable UML, GUI, POO, UML, Web by smalltalkuy on agosto 17, 2013

El U-Fabrik ahora soporta la importación de Máquinas de Estado UML. Básicamente una máquina de estados consta de 3 partes que serán representadas por 3 clases diferentes dentro de U-Fabrik. Estas 3 partes son: el estado, la transición (estado inicial y estado final) y la máquina misma. En la siguiente imagen, la máquina de estado es representada por toda la imagen, los estados son: Creada, Enviada, Recibida, EnEstudio, EnProceso, Rechazada, Respondida. Las transiciones son: crear, enviarCreada, recibirEnviada, estudiarRecibida, aceptarRecibida, aceptarEstudiada, rechazarEstudiada, responderProceso, finalizarRechazada y finalizarRespondida.

Image

Cuando importamos la máquina de esatdo deberemos indicar que clase UML representa cada parte del estado. En nuestro caso como muestra la figura correspondiente son: Estado, DefinicionTransicion, y DefinicionProceso.

DefinicionProceso es una colección de DefinicionTransicion y cada DefinicionTransicion tiene un estado actual y estado siguiente.

Image

Cuando U-Fabrik importa el diagrama de estado relaciona la máquina de estados con estas clases. Y crea una instancia de DefiniciónProceso por cada diagrama en el archivo XML. Cada instancia de DefiniciónProceso a su vez tiene una colección de instancias de DefinicionTransicion que representan las transiciones. Y cada DefinicionTransicion tiene dos variables del tipo Estado (actual y siguiente). Mientras las clases UML tengan esta estructura cualquiera puede representar los elementos de la máquina de estados.

Este framework de tres clases puede ser asociado a otras clases del modelo para dar sentido a la máquina de estados como muestra la siguiente figura:

Image

Como se ve en la figura anterior las clases que representan TODAS las máquinas de estado están integradas al modelo clases. La clase Rol asociada a DefinicionTransicion indica que roles pueden accionar esa transición. La clase Transicion representa un DefinicionTransicion en el tiempo. Y la clase Proceso son todos los procesos del sistema y cada Proceso sigue una ruta determinada por DefinicionProceso. A su vez, cada Proceso esta compuesto por una colección de Transiciones. Y cada Proceso es el proceso de una Solicitud que ha ingresado al sistema.

De esta forma U-Fabrik integra los diagramas de estado UML con los diagramas de clases UML.

Proceso

Image

Transiciones del Proceso

Image

Una Transición del Proceso

Image

GemTalk Systems compra GemStone/S a la VMWare

Posted in Uncategorized by smalltalkuy on mayo 6, 2013

gemtalk

 

vmware

 

http://gemtalksystems.com/index.php/about-us/for-the-press/

BEAVERTON OR, May 2, 2013GemTalk Systems today announced it has acquired the VMware GemStone/S platform for developing, deploying and managing mission-critical Smalltalk-based applications. Financial terms of the transaction were not disclosed.

GemTalk Systems anuncia que ha comprado todos los productos GemStone/S a VMWare.

La nueva empresa GemTalk Systems se dedica exclusivamente a Smalltalk mediante su producto GemStone/S.

http://gemtalksystems.com/

http://gemtalksystems.com/index.php/to-our-customers/

http://gemtalksystems.com/index.php/to-our-customers/faq-transition/

gemstone 64

Mapeo de usuarios Web con usuarios UML

Posted in Aplicaciones, Executable UML, GUI, POO, UML, UML Ejecutable by smalltalkuy on febrero 19, 2013

Para poder mapear los usuarios del UML Almighty Web Server con los usuarios UML debemos seguir los siguientes pasos:

1. Crear los usuarios de mi aplicación UML application. Será algo como:security wokspace 01

Recordar que la clase User debe ser la Login Manager Class.

2. Ahora tenemos que mapear (o replicar) el User “John” en el UML Almighty Web Server.
2.1. Logerse con User: admin password: password.
2.2. Ir a  Security Settings
security 01

3. En los Security Settings agregar un nuevo usuario New User (John), llenar datos y presionar Save
security 02

security 03
5. Ir a los Access Rights del usuario John User
security 04
6. Ahora hay que seleccionar la aplicación UMLInstanceApp que es el Servidor Web para el UML Almighty
security 05
7. Ahora estamos en la aplicación UMLInstanceApp que maneja los permisos de John
security 06
8. El último paso es hacer Click en “Yes” para habilitar todos los permisos de John. El usuario creado en el paso step 1.
security 07

Máquina Virtual: ahora soporta métodos a nivel de instancias

Posted in Uncategorized by smalltalkuy on diciembre 15, 2012

El metamodelo del UML Almighty siempre soporto métodos a nivel de instancias (objetos), pero en el ruteo de mensajes (method lookup) de la Máquina Virtual NO estaba programada esta capacidad. Es decir, que la Máquina Virtual a la hora de despachar un mensaje no tenía en cuenta a la instancia (objeto).

Como se muestra en la figura siguiente, la VM usaba la instancia (objeto) solamente para obtener su clase (paso 3). No busca en el Catálogo de Métodos de la instancia, va al de la clase (paso 4). La nueva versión de la VM incluye la búsqueda en el Catálogo de Métodos de la instancia. El siguiente es el proceso simplificado de look up (ruteo de mensajes) dado que no se incluyen los Traits de las clases.Image

En la siguiente figura se muestra el nuevo proceso dentro de la Máquina Virtual que incluye los métodos de las instancias (objetos).Image

Hay un paso más (paso 3) para chequear al Catálogo de Métodos de la instacias. Como mencionamos este es el proceso simplificado sin incluir los Traits, en la siguiente figura se muestra todo el proceso. En el ruteo de mensajes (method lookup) se pueden dar tres casos:

Caso 1 – El mensaje es para una instancia y el método invocado se encuentra en el catágolo de métodos de la instancia. Si el método no se encuentra a nivel de la instancia entonces estamos en el caso 2.

Caso 2 – El mensaje es para una instancia y el método invocado se encuentra en el catágolo de métodos de la clase o en los traits de la clase.

Caso 3 – El mensaje es para una clase y el método se encuentra en el catágolo de métodos de la metaclase.

Image

Tagged with: ,

Smalltalks 2012, Puerto Madryn, Chubut, Argentina

Posted in Uncategorized by smalltalkuy on agosto 16, 2012

Este año la conferencia Smalltalks de Argentina se hace en Puerto Madryn, Chubut. Es un año en capital y un año en el interior.

Lo IMPRESIONANTE de este año es que el keynote lo da el mismo Alan Kay, IMPRESIONANTE.

Alan Kay link

Principio de “Conexión Inmediata” en la Programación

Posted in Aplicaciones, GUI, POO by smalltalkuy on marzo 24, 2012

“Conexión Inmediata” en la Programación

http://instanceof.me/post/18455380137/inventing-on-principle-by-bret-victor

El principio de Conexion Inmediata es una redefinición de una principio que data de los ’60, el Principio Reactivo.

Principio Reactivo: Cada componente accesible al usuario debería ser capaz de presentarse de una manera entendible para ser observado y manipulado.

Esto es poder acceder al componente e interactuar con el en tiempo real, recibiendo respuestas en tiempo real.

Este principio reactivo o conexión inmediata es soportado por el Smalltalk y también por UML Almighty .

Sin una demostración cara a cara es difícil mostrar las ventajas de estos principios  principio reactivo/conexión inmediata, y casi imposible plasmar esto en un blog, pero por suerte Bret Victor ha realizado una excelente demostración de su conexión inmediata.

La charla esta en ingles (lamentablemente) y dura 55 minutos, pero todo PROGRAMADOR debe ver esta charla, es excelente !

Muestra claramente como la conexión inmediata (o principio reactivo) afecta la capacidad de CREACIÓN de un programador.

http://instanceof.me/post/18455380137/inventing-on-principle-by-bret-victor

Ventajas de la Reflexión en Programación – Meta-programación Simple

Posted in POO by smalltalkuy on enero 26, 2012

Sistema

Se está construyendo un sistema el cual debido a su naturaleza fuera de lo común tiene cerca de 200 métodos que devuelven un String simplemente.

En la siguiente imagen se muestra 1 de estos métodos, como el sistema está relacionado con el PMI, el texto que se muestra es copyright  © de PMI.org.

Problema

Por cada uno de estos 200 métodos hay que crear otro método derivado que replique un mismo patrón, por lo hay que crear 200 nuevos métodos. Es un trabajo que tedioso que lleva tiempo y es propenso a errores.  Aquí es donde nos “salva” la REFLEXIÓN y la META PROGRAMACIÓN, en este caso es bastante sencilla.

Como quedaría el método luego de aplicar el patrón a mano:

Habría que aplicar el mismo patrón para otros 199 metodos y así sucesivamente. Con este nuevo método #changeRequestsNew tendría una instancia con la descripción que devuelve el método original (#changeRequests) que es solamente texto, que es justamente lo que quiero para este método y el resto.

Patrón

1. nombreNuevoMetodo := Nombre del método actual  + ‘New’. En este caso: changeRequests‘New’ = changeRequestsNew

2. El argumento que se pasa al mensaje #name:  debe ser el nombre del método actual, pero separado por un espacio y cada palabra en mayúsculas.  En este caso es:

name: ‘Change Requests’ – recordar el nombre del método actual (self) es #changeRequests

3. El argumento que se pasa al mensaje #description:  debe  ser una llamada al método actual que devuelve un String. En este caso es:

description: self changeRequests. – la descripción queda con el String del método original.

Este patrón debe aplicarse a 199 métodos más…

Solución

La solución me tomo unos 5 minutos ! y consiste en implementar un método en la clase CompiledMethod. En Smalltalk cada vez que creo un método se crea una instancia de esta clase CompiledMethod, y esta clase es editable y modificable como cualquier otra.

La variable [selector] del método actual (#changeRequests) se concatena con ‘New‘ para formar el selector (nombre) del nuevo método a ser creado.  Este nombre se almacena en la variable temporal [newSelector] como un símbolo #asSymbol (es una clase especial de String).

Ahora en la variable temporal [pmpName] formo el nombre según las reglas. La primera letra la paso a mayúscula (first asUppercase asString) y luego proceso el resto.

Ahora proceso todo menos la primera letra (c) [hangeRequests]. Si esta en minúscula copio y si esta en mayúscula agrego un espacio en blanco y copio. Guardo el resultado de la iteración en la temporal [pmpName].

Ahora creo un template para compilar el método en la variable [newMethod]. Uso el nombre del nuevo método y uso el selector actual (nombre actual) para crear la llamada (description: self’, selector,). Y por último compilo el template [newMethod] en la clase del método actual (methodClass compile: newMethod).

Ahora solamente cada vez que quiero crear uno de estos 200 métodos simplemente le envio el mensaje #compileMethodStringForPMPNewDocument y me crea el derivado.

En un principio pensé hacer esto con el Code Rewriter pero después opte por implementar un método en CompiledMethod.

El Code Rewriter es una herramienta muy poderosa que sirve para hacer transformaciones masivas de código de forma segura, basicamente suplante un AST por otro AST equivalente (mismo comportamiento) pero más óptimo.