lunes, 30 de noviembre de 2009

viernes, 19 de junio de 2009

Base de Objetos - GemStone/S el Oracle de las OODBMS

Base de Datos Orientadas a Objetos - "GemStone/S el Oracle de las OODBMS"

Las bases de datos relaciones son mucho más usadas que las bases de objetos, esto no quita que las OODBMS tenga sistemas muy grandes en producción, no son meramente algo teórico, ni tampoco han fracasado como se publica en algunos papers. En esta publicación voy a contar el caso de GemStone/S y sus historias exitosas.


GemStone/S es una backend comercial (con licencias free para proyectos comerciales) al estilo Oracle pero es una OODBMS. Su primera versión salio al mercado en 1986, hace ya 20 años, por lo que tiene su tiempo en el mercado.


La licencia free tienen restricciones de tamaño, por más info vistar http://seaside.gemstone.com/ y el sitio oficial del producto es http://www.gemstone.com/products/smalltalk/.


La arquitectura básica consta de 3 partes:

1. El repositorio en disco.
Puede estar distribuido en diferentes maquinas y soporta 8.192 TeraBytes - ninguna aplicación ha llegado a este limite.

2. La VM (virtual machine) que confiere vida a los objetos del repositorio.
Un sistema puede tener multiples VM, en una misma maquina o distruibuido en varias.

3. SPC (shared page cache) es el cache que usa GemStone/S para los objetos accedidos más frecuentemente.
Soporta hasta 32.768 GB de SPC.


No hay mapeo de objetos a una base de datos relacional. Puede ser accedida por Java, C, aplicaciones CORBA, etc.


Cuando se hace: Cliente new (se crea un objeto), el objeto cliente ya nace persistente. Es decir, no hay un servicio no hay un llamada para persistir los objetos. Esto nos lleva a un interesante tema teorico:


* La persistencia es una característica de un objeto ? o

* La persistencia es una característica del medio donde residen los objetos ?

GemStone/S se basa en la segunda, donde GS es un medio (OODBMS) persistente y por lo tanto cualquier objeto que se crea ya nace persistente, y puede ser accedido por multiples usuarios. Tiene transacciones, loqueos, ... y todos los "demás chiches" de las RDBMS.

Sistemas en Producción por más de 10 años usando GemStone/S
La lista de sistemas que sigue tiene más de 10 años en producción y por lo tanto han crecido a lo largo del tiempo y ha afrontado muchos cambios en sus requerimientos.


IRIS-2
Es un sistema creado por la OOCL (orient overseas container line), y luego el sistema fue comprado por una empresa de la competencia COSCO, estas empresas se dedican al transporte de cargas usando containers. COSCO (China Ocean Shipping) mueve el 20% de todos los containers del mundo !!!.


La aplicación:

* 3 millones de lineas de código GemStone/S (que es código Smalltalk)
* 500 GB de repositorio
* 24 GB de cache (SPC)
* Más de 2000 VM (virtual machines)
* 700 transacciones por segundo
* Costo hora por bajada de la aplicación U$ 852.000 (no me gustaria ser el DBA !!!, je je)







TheICE
London Petroleum Exchange. Es la aplicación más grande que usa GemStone/S como backend.

La aplicación:

* Corre sobre un solo servidor AIX Power 6.
* 512 GB de RAM
* 128 procesadores
* Entre 10.000 y 13.000 transacciones de escritura por segundo (en horas pico)
* 8.000 usuarios concurrentes
* 2-3ms de respuesta




Kapital
JP Morgan. El sistema esta en constantes cambios debido a la naturaleza de las finanzas, pero no requiere downtime para incorporarle funcionalidades, se "programa" y se usa al mismo tiempo.


La aplicación:

* Corre sobre un cluster con 500 maquinas Linux.
* 450.000 lineas de cóidgo GemStone/S
* 4.700 clases
* 70.000 métodos
* 20.000 transacciones por día
* Mueve 50 billones de dólares por dia !!!
* Hace unos años era mantenida por 7 desarrolladores !!!, ahora son más pero no tengo el número. JP Morgan hace años hizo una presentación llamada "7 developers move billions".

* Da un promedio de 2 billones de dólares en ganancia, esto es porque la competencia necesita 6 meses más que Kapital para aprovechar nuevas oportunidades de negocios.







Hay muchas otras aplicaciones corriendo en GemStone/S pero sería demasiado largo enumerarlas a todos. Lo interesante es notar el tamaño de las aplicaciones y como esta tecnología se puede adaptar a diferentes arquitecturas.


TheICE corre sobre un solo servidor con 512 GB de RAM y 128 procesadores, en cambio Kapital usa escalabilidad horizontal con cluster de 500 máquinas Linux. Esto demuestra la flexibilidad de la arquitectura de GemStone/S.


Es claro que Oracle tiene muchas más aplicaciones que GemStone/S, pero esto demuestra que se puede utilizar bases de datos orientadas a objetos en sistemas mega grandes y con gran exito.


Tambien existe Versant y otras ODBMS pero puse GemStone/S porque es la que conosco más y la he usado.


Saludos,
Bruno

jueves, 21 de mayo de 2009

Los Padres de Todas las Demos

Viendo estos videos es imposible no preguntarse "Ha avanzado tanto la informática como medio para la expresión de ideas de cada individuo?"

O se puede decir con respecto a este tema (expresión de ideas) que estamos igual que en los '70 ?
Como dice Alan Kay "The Computer Revolution Hasn't Happened Yet", aqui esta el video del OOPSLA de 1997.

Paso los links de los siguientes videos

El pirmero de Ivan Sutherland (1963) y su Sketchpad creando modelos gráficos.

El segundo de Douglas Engelbart es multimedia en el año 1968, si ven la parte 7/9 hay una teleconferencia, si en 1968 !!!

El tercero es de Adele Golberg mostrando el Smalltalk-80, no encontre ninguna de Smalltalk 72 o 76, que son parecidos. Pero pueden leer en Smalltalk-76 .

Alan Kay y su equipo fue quienes integraron todas estas ideas ("multimedia para la expresión del espíritu creativo") en un sistema totalmente de objetos Smalltalk.
El Dynabook fue creado en 1968, este link muestras los principios de diseño de estas ideas y su implementación: Smalltalk.

Ivan Sutherland : Sketchpad Demo (2/2) 1963
http://www.youtube.com/watch?v=BKM3CmRqK2o

Douglas Engelbar 1968 The Mother of all Demos (1/9)
http://www.youtube.com/watch?v=JfIgzSoTMOs

Adele Goldberg 1980
http://www.youtube.com/watch?v=AuXCc7WSczM

Y el video del primer mouse:

PD: los videos son verdaderos ! 
NO son una broma, esto sucedia en esos años 196x 

Este es interesante, el primer juego Doom (tiene 3D y todo):

Historia y datos de los logros de Xerox en ese entonces:

Ambiente Smalltalk-76 de la Xerox (editor de imagenes, mail, file system, browser de clases Smalltalk, y un Debugger abierto)



miércoles, 22 de abril de 2009

Esta disponible VA Smalltalk 8.0

Instantiations ha liberado la versión 8 del conocido VA Smalltalk (sucesor del Visual Age for Smalltalk). 
La versión 8 tiene soporte para Seaside, framework web para hacer aplicaciones complejas en la red.
Las más importantes características del VASmalltalk son:
* 100% compatible con Visual Age for Smalltalk.
* Soporte para desarrollo y deployment en varias plataformas:
- AIX
- Linux
- Solaris
- Windows
- z/OS platforms
* Integración con el framwork web Seaside (www.seaside.st

El VASmalltalk es gigantesco así que es imposible enumerar todas las características, más información se puede encontrar en el link: http://www.instantiations.com/VAST/prod/vast.html
Instantiations también tiene productos muy buenos para Java.

Esta buena noticia del VASmalltalk 8.0 se suma a la ya conocida del Dolphin Smalltalk NG que será liberado en unos meses. 

Creo que la noticia de Dolphin Smalltalk NG es más importante dado que no solo representa una nueva versión de Dolphin, sino mucho más...

Es la unión de Object-Arts (Dolphin Smalltalk X6) y Lesser Software (LSW Vision Smalltalk) en un mismo producto.

El Dolphin Smalltalk NG tendrá una nueva Virtual Machine (la Vision VM), creada por Lesser Software para su Smalltalk (LSW Vision Smalltalk).  

Por lo que esta nueva versión será el ambiente Dolphin Smalltalk X6 corriendo sobre la virtual machine del LSW Vision Smalltalk. Con el tiempo se irán portando algunos framework del LSW al Dolphin NG, por lo que la primera versión de Dolphin NG (ng - next generation) será más parecida al Dolphin X6 que al LSW Vision Smalltalk

Otro dato no menor es que la virtual machine Vision VM es compatible con Visual Smalltalk  (si otro Smalltalk más) a nivel de bytecodes, por lo que es posible migrar aplicaciones de Visual Smalltalk a Dolphin Smalltalk NG, por lo que constituye la unión de tres comunidades de Smalltalk

Saludos,
Bruno


sábado, 4 de abril de 2009

Programación Ultra Dinámica II

 Simulador de Tráfico Aéreo (Completo)

 En el siguiente link se muestra como construir un Simulador de Tráfico Aéreo en un ambiente dinámico (dónde no hay definición de tipos, aunque cada objeto tiene su clase).
Esta compuesto en 4 videos (que son largos) pero creo que vale la pena ver, muestra como se construyen simulaciones en ambientes dinámicos. En este caso se usa Dolphin Smalltalk (que es una ambiente comercial con una versión community), pero también se puede hacer algo parecido en Squeak que es un Smalltalk totalmente free. Los paquetes (fuentes) están para bajar en la página de Object-Arts.
Por que el título Programación Ultra Dinámica ?, en los videos se ve que la metodología de desarrollo en este ambiente es extremadamente dinámica y bastante diferente a como estamos acostumbrados a programar:

* Modificación del código fuente sin detener la aplicación.
* Creación de métodos on the fly.  
* Cada objeto es capaz de presentarse en pantalla de una manera entendible para ser observado y manipulado (Inspectors). Esto viene dado por el ambiente.
* Todo es un objeto (incluso enteros, false, true, nil, strings, etc) y los objetos se comunican enviándose mensajes. Hay una metáfora de comunicación uniforme entre los objetos (mensajes).
* Se construye sobre el MVP, un framework gráfico que solo permite construir la interfase en 3 capas (MVP: Model-dominio o modelo, View-GUI, Presenter-"administrador" de acciones del usuario).
* Ambiente dinámico pero con intellisense, donde no hay definición de tipos.
* Es un ambiente donde hay más múltiples herramientas para desarrollar: SystemBrowser, ClassBrowser, Workspaces, Inspectors, Debbuger, Idea Space, SUnit Browser, TestRunner, etc, etc.

Espero no haber aburrido con toda esta descripción. Lo que recomendaría es bajarse la versión community y bajar de aquí este paquete e instalarlo, y junto con el video ir modificando la aplicación mientras esta corriendo. 

Como dije es bastante tiempo pero vale la pena !!!

Link principal:
Videos:
Parte 1
Parte 2
Parte 3
Parte 4

Imagen de la Simulación (Juego):


Copio un cambio al método #drawOn: de la clase AtcPlane para que emita ondas también, al igual que las ciudades. Se copia el texto en la clase AtcPlane y se da Accept. En realidad este método debería refactorizarse porque es demasiado largo.

AtcPlane 
drawOn: aCanvas 
| flText textExtent vector velocity2D state |
state := aCanvas save.

20 to: 50 by: 15 do: [:n | | ringBox |
ringBox := Rectangle center: self position extent: n.
ringBox := (ringBox expandBy: (Time now asMilliseconds / 4 % 1500 //20)).
aCanvas brush: Brush transparent.
aCanvas pen: (Pen withStyle: PS_DOT width: 1 color: RGB white ).
aCanvas ellipse: ringBox asParameter asRectangle].


aCanvas pen: Pen black.
velocity2D := self velocity asPoint.
velocity2D r >
 ifTrue:[vector := (velocity2D * self velocityVectorLength) rounded.
aCanvas moveTo: self box center.
aCanvas lineTo: self box center + vector].
aCanvas setBkMode: TRANSPARENT.
aCanvas font: (Font name: 'Arial' pointSize: 8).
aCanvas fillRectangle: self box color: self color.
aCanvas text: self flightId at: self box bottomRight.
flText := 'FL' , self flightLevel displayString.
textExtent := aCanvas textExtent: flText.
aCanvas text: flText at: self box topLeft - textExtent.
aCanvas restore: state

Saludos,
Bruno

lunes, 2 de marzo de 2009

Programación "Ultra Dinámica"

En el siguiente link: http://www.object-arts.com/content/news/newVideoLibrary.html o también en http://blip.tv/file/1808947

Es una demostración de Andy Bower (uno de los creadores de Dolphin Smalltalk) de como programar una simulación sencilla de un controlador de tráfico aéreo.

Lo interesante del video (que es largo y tiene dos partes) es como va construyendo la aplicación ("programándola") con la aplicación siempre corriendo. Nunca se detiene el sistema para recompilar algo; las clases, objetos y la GUI se construyen y modifican con la aplicación siempre corriendo.

También en una parte habla del "Visual Object Finder" de Dolphin Smalltalk, creo que la sensación de ambiente biológico o eco sistema (el sistema siempre esta andando) sumado al "Visual Object Finder" podría llamarse perfectamente: Programación "Ultra Dinámica". Donde selecciono los objetos y creo o modifico su comportamiento con el sistema andando y observando de manera instantánea los resultados de esos cambios.

Si se fijan bien gran parte de la programación la hace dentro del debugger que es una práctica de TDD (test driven development), y en la izquierda tiene la ventana de la aplicación con la simulación siempre corriendo, y cada cambio se refleja inmediatamente.

Saludos,
Bruno

jueves, 8 de enero de 2009

El Meta Modelo

Meta Modelo
En un ambiente de objetos todo es un objeto, cadenas, números reales, números enteros, código fuente (instancias de CompiledMethod), clases y metaclases.

Como funciona el Meta Modelo en Smalltalk

Cuando creo una clase digamos Alfil (para simular un juego de ajedrez) se crean dos cosas:
1. La meta clase Alfil class
2. La clase Alfil

Alfil class y Alfil son dos cosas diferentes. Alfil class es la meta clase de la clase Alfil.
(o con el clásico ejemplo: Cliente class y Cliente)
La única instancia de Alfil class es Alfil. Es decir, que cada meta clase (en este ejemplo la meta clase Alfil classtiene un única instancia (es un como un singleton), y esta instancia es la clase Alfil. Y las instancias de la clase Alfil son los alfiles que utilizo en la partida.

REGLAS
1. "Cada clase es instancia de su meta clase"
2. "Cada meta clase es instancia de la clase Metaclass"

Por cada clase que creo en mi modelo, Cliente, Factura, IVA, etc voy a tener la correspondiente meta clase: nombre de la clase + class.

Ahora bien, si todo es un objeto, que clase de objeto es una meta clase ?
Cada meta clase (Alfil class) es una instancia de la clase Metaclass (observar que es Metaclass solamente, sin el post fijo class), es decir, Metaclass es una clase.

Resumiendo tenemos que:
Mi clase Alfil es una instancia de Alfil class (que se crea cuando creo Alfil).
Además Alfil class es una instancia de Metaclass.

Esto nos lleva a una aparente "contradicción", que es interesante.

Por regla 1 entonces tendría que Metaclass es instancia de su meta clase pero por regla 2 cada meta clase es instancia de Metaclass.

El Meta Modelo de Smalltalk se apoya en esta aparente contradicción dónde Metaclass es instancia de Metaclass class (regla 1), y que Metaclass class es instancia de Metaclass (regla 2). Metaclass es una instancia de si misma, es casi filosófico (esto en broma claro, jajaja)

La jerarquía de clases es la siguiente:
Behavior
ClassDescription
Class
Metaclass

martes, 6 de enero de 2009

La "sentencia" IF es un Mensaje (no una sentencia) a un objeto booleano

La sentencia IF es un Mensaje a un objeto booleano

Al trabajar en un ambiente de objetos todo es un mensaje a un objeto, la "sentencia" if tambien !!
En Smalltalk para indicar la toma de decisión frente a un objeto booleano se hace de la siguiente forma:
Cliente
saldoSupera: anInteger desplegar: mensajeString
"Si el saldo del receptor del mensaje supera <anIntegerentonces desplega el mensaje <mensajeString>"

self saldo anInteger ifTrue:[MessageBox notifymensajeString]

En este caso sencillo vemos como IF es un mensaje, a quien? como funciona?

self saldo - retorna un número y este se compara con anInteger, o sea, si:
self saldo = 450 y anInteger=300
450>300 devuelve un objeto Booleano en este caso True.
Boolean (jerarquia de clases)
False
True
El mensaje es ifTrue: y se le pasa como parametro: [MessageBox notify: mensajeString].
En Smalltalk cualquier secuencia de mensajes puesta entre [parentesis rectos] es una instancia de la clase BlockClosure (el nombre de esta clase puede diferir según el Smalltalk). Si le envio el mensaje value entonces el BlockClosure envia todos los mensajes contenidos en él.
Ejemplos de uso de BlockClosure:

block := [MessageBox notify: 'Hola Mundo'.  MessageBox notify: 'Hola Mundo otra vez'.].
"Despues de evaluar la expresion anterior la variable block ahora es una instancia de BlockClosure. "
block value. "me muestra los mensajes Hola Mundo y luego Hola Mundo otra vez"

tablaDelTres := [:numero | numero * 3].
"Este es un BlockClosure con parametro"
tablaDelTres value: 3. "devuelve 9"
tablaDelTres value: 6. "devuelve 18"
tablaDelTres value: 11. "devuelve 33" 

Estos son ejemplos muy sencillos de como se utilizan los BlockClosure en Smalltalk. A nivel de aplicaciones comerciales se utilizan para indicar que se hace en caso de alguna Excepcion. En Smalltalk los bloques de código se pueden pasar como parametros. En otra ocasión publicaré sobre los BlockClosure en Smalltalk, ya que casi no tienen igual en la programación, y los ejemplos aqui expuestos son bastantes sencillos.

Por lo que los BlockClosure se utilizan para la famosa sentencia IF.
Las clases True y False implementan los 4 mensajes:
#ifTrue:
#ifFalse:
#ifTrue:ifFalse:
#ifFalse:ifTrue:
Ahora veremos como cada clase implementa cada uno de estos mensajes:
True
ifTrue: aBlockClosure
"Evaluate and answer the result of the evaluating the
argument, aBlockClosure, if the receiver is true, otherwise answer nil. "
^aBlockClosure value

ifFalseaBlockClosure
"Evaluate and answer the result of the evaluating the
argument, aBlockClosure, if the receiver is false, otherwise answer nil."
^nil

ifTrue: trueBlock ifFalse: falseBlock
"Evaluate, and answer the result, of the , falseBlock, if 
the receiver is false, or the , trueBlock , if the receiver is 
true."
^trueBlock value

ifFalse: falseBlock ifTruetrueBlock 
"Evaluate, and answer the result, of the , falseBlock , if the receiver is false, or the , trueBlock , if the receiver is true."
^trueBlock value

False
ifTrueaBlockClosure
"Evaluate and answer the result of the evaluating the
argument, aBlockClosure, if the receiver is true, otherwise answer nil."
^nil

ifFalseaBlockClosure
"Evaluate and answer the result of the evaluating the
argument, aBlockClosure, if the receiver is false, otherwise answer nil. "
^aBlockClosure value

ifTrue: trueBlock ifFalsefalseBlock
"Evaluate, and answer the result, of the , falseBlock , if the receiver is false, or the , trueBlock , if the receiver is true."
^falseBlock value

ifFalse: falseBlock ifTruetrueBlock 
"Evaluate, and answer the result, of the , falseBlock , if the receiver is false, or the , trueBlock , if the receiver is true."
^falseBlock value

(4 > 5) ifTrue:[some code]. 
"4> 5 retorna el objeto false, entonces queda: false ifTrue:[some code].
Si vamos a la implementacion de ifTrue: de False vemos que retorna nil, entonces [some code] no es evaluado "
(4 > 5) ifFalse:[some code]. 
"4> 5 retorna el objeto falseentonces queda: false ifFalse:[some code].
Si vamos a la implementacion de ifFalsede False vemos que retorna ^aBlock value , entonces [some code] es evaluado "
De la misma forma funciona para el resto de los mensajes de Boolean.

La sentencia if en Smalltalk esconde la magia de los BlockClosures, que en Smalltalk se utilizan ampliamente.