martes, julio 03, 2012

Aprendiendo RCP (Rich Client Platform) - 2a. Parte

Hola nuevamente!

Después de tanto tiempo sin escribir estaba en deuda de continuar con la serie de aprendizaje de RCP.

En esta entrada voy con el segundo paso del aprendizaje, la experimientación (el primero fue investigar que había) usando la plataforma Netbeans, como ya lo había mencionado en mi entrada anterior.

Esta vez me voy a centrar en la creación de una aplicación Netbeans RCP esquelética (barebones) para mostrar qué tanto nos ofrece ésta plataforma sin crear una sola línea de código.

Antes de comenzar, voy a asumir (tontamente) que ya tenemos Netbeans (ojalá la versión más reciente) instalado adecuadamente.

Primero que todo iniciamos nuestro entorno de desarrollo Netbeans (obviamente).
Netbeans 7.1.1 iniciado
Inicio de Netbeans, usando versión 7.1.1

Ahora vamos a crear un proyecto nuevo, del tipo "Netbeans Platform Application". Para lograr esto, nos vamos por "File > New Project", o presionamos "Ctrl + Shift + N"

Opción de Nuevo Proyecto

Cuando se nos abra la ventana de nuevo proyecto, seleccionamos en el recuadro "Categories", la opción "Netbeans Modules", y en el recuadro "Projects" seleccionamos "Netbeans Platform Application". Presionamos "Next >".

Asistente de creación de aplicaciones en la plataforma Netbeans

Procedemos entonces a suministrar la información básica de "Nombre del Proyecto", "Ubicación del Proyecto". En la lista desplegable "Netbeans Platform" dejar con el valor por defecto. Presionamos "Finish" al finalizar la entrada de datos.

Editar nombre del proyecto y ubicación de los archivos

Al cerrarse el asistente de configuración del proyecto podemos ver como Netbeans nos ha creado los archivos base requeridos para iniciar el desarrollo de nuestro aplicativo.

Proyecto esqueleto generado por Netbeans

Lo interesante de estos pasos que hemos seguido hasta ahora es que sin ninguna línea de código tenemos todo un marco de trabajo Y una aplicación totalmente funcional (aunque aun no hace nada diferente a ser un esqueleto).

Para comprobar esto, simplemente presionamos el botón de ejecución (F6), o seleccionamos la opción "Run > Run Project" del menú principal.

Aplicación base de "Netbeans Platform"
Como vemos, hemos creado ya todo un esqueleto funcional, y además contamos con todo el marco de trabajo, las interfaces de programación, y un sinfín de componentes ya listos para usar. WOW!

Para mi es muy motivador ver que todo el tema de manejo de ciclo de vida, modularidad y consistencia ya viene listo. Solo hay que comenzar a crear componentes y enlazarlos.

Dejo como ejercicio al lector motivado, que experimente con los menús, las opciones por defecto y las ventanas que tiene construidas la aplicación que acabamos de crear. A mi me abre muchas posibilidades, además de que el resultado final puede llegar a ser tan profesional como cualquier software de una fábrica grande.

Hasta la próxima!.

Referencia:

sábado, febrero 04, 2012

Aprendiendo RCP (Rich Client Platform) - 1a. Parte

Quiero aprovechar este viejo blog como un sitio para realizar anotaciones a modo de recordatorio, sobre las cosas que me han sido útiles, me interesa aprender o simplemente me divierten.

Este es el primero de una serie de artículos que quiero escribir sobre marcos de desarrollo RCP, temática que me parece importante y que no está siendo suficientemente explotada en nuestro medio local.

Desde hace algún tiempo ya, me ha interesado mucho el tema de RCP o "Rich Client Platform", lo que podría traducirse como "Plataforma de Cliente Rico", o más "concisamente", "Plataforma para el desarrollo de aplicaciones de escritorio" ;-).

Para continuar con este artículo de introducción, voy a tratar de explicar en qué consisten dichos marcos de desarrollo (o frameworks, si prefiere), cuál es su objetivo, qué ventajas nos ofrecen y de cuáles alternativas disponemos.

¿Qué es una plataforma RCP de desarrollo de aplicaciones, para qué sirve y cómo nos ayuda?

Podría decirse que es un entorno completo que maneja el ciclo de vida de una aplicación de escritorio. Esto es importante en cuanto nos provee de mecanismos para controlar aspectos críticos como la interfaz de usuario, la configuración, la modularidad, la actualización y la distribución, dejándonos espacio para concentrar nuestros esfuerzos de desarrollo en lo realmente importante de nuestra aplicación y no en aspectos "triviales" o de "plomería" que generalmente consumen gran parte de nuestro tiempo.

En otras palabras, es una tecnología que nos permite seleccionar el conjunto de componentes y módulos que más nos convenga y a acoplarlos a nuestra funcionalidad particular para lograr construir una aplicación de escritorio completa en una fracción del tiempo estimado, con menor índice de defectos, con interfaces de usuario consistentes e independiente de la plataforma operativa (en la medida de lo posible).

Una característica importante de una plataforma RCP es su arquitectura, ya que es ella la que dicta las normas de construcción y acoplamiento de módulos.

Es importante no confundir RCP con RIA (o Rich Internet Applications), ya que son dos tecnologías diferentes orientadas hacia propósitos distintos: RCP se enfoca en la construcción de aplicaciones de escritorio (que pueden ser desplegadas a través de internet) mientras que RIA se enfoca en aplicaciones ricas de internet, desplegadas en un navegador. Es fácil confundirse, ya que la línea que divide RCP y RIA es muy difusa.

¿Qué alternativas son conocidas?

Dentro de las opciones que conozco para construir aplicaciones de escritorio usando RCP se tienen las siguientes (agrupando por lenguaje de programación):

Para C++
Para este lenguaje, las cosas están bastante complejas y difíciles en este terreno

  • KDevPlatform, es la base del entorno de desarrollo KDevelop y está pensada para ser usada en aplicaciones de este tipo. Provee la infraestructura básica RCP: sistema de módulos, componentes de edición, infraestructura de configuración. Está fundamentada en el framework QT y KDE.
Para C# (.NET)
Aunque para la plataforma .NET no conozco ningún referente (a pesar de que las herramientas de Microsoft utilicen Visual Studio como base), lo más parecido a una plataforma de "fácil" acceso es SODA:
  • SODA - "SharpDevelop Open Development Architecture", es similar al anterior, aunque no es un plataforma RCP per se, su arquitectura permite construir aplicaciones de escritorio usando sus componentes, tal como se puede leer en este documento (en inglés).
  • Aparte de ésta, Microsoft provee una serie de bloques de desarrollo de aplicación, específicamente, el Smart Client Software Factory, que supuestamente provee la arquitectura de una aplicación de escritorio, pero que personalmente no la he explorado en profundidad y no se parece mucho a lo que RCP es.
Para Groovy
Groovy es un lenguaje interpretado que corre sobre la máquina virtual de java, con una sintaxis que permite hacer más con menos código. Por ejecutarse sobre la JVM tiene la característica de poder utilizar funcionalidades sobre otros lenguajes que también corran sobre la JVM, además de poder utilizar artefactos hechos en java.

  • Griffon, es todo un framework completo que facilita la construcción de aplicaciones de escritorio en Groovy; está diseñado siguiendo la filosofía de Grails, es cual es un framework de desarrollo web muy popular, también en este lenguaje.
Para Java
Aquí las cosas están un poco mejor en cuanto a RCP, inclusive, me atrevería a decir que nació o se materializó en este lenguaje (si alguien me puede confirmar o desmentir esto, muchas gracias :-) ).

Una vez que se desarrolló SWING, hubo muchas quejas debido a que no había un marco de prácticas bien estructuradas para construir aplicaciones de escritorio, por lo tanto hubo gran cantidad de proyectos que se enfocaron en facilitar esta labor, me remito a proyectos como el swing application framework, que escaló a JSR-296 e iba a ser incluido en Java 7, pero que fue puesto a dormir indefinidamente.
  • Netbeans Platform, fundamentado en SWING, tiene todo lo que generalmente se usa en las aplicaciones de escritorio, tal como configuración de menú, barras de herramientas, panel acoplable (docking); muy activo, con gran documentación y una gran comunidad detrás de él.
  • Eclipse RCP, igualmente completo al anterior, solo que está basado fundamentalmente en las librerias SWT, que son una alternativa a SWING. Utiliza OSGi como mecanismo de modularidad y extensión; también muy activo, con buena documentación y una comunidad muy grande que lo soporta.
  • Spring Rich Client, iniciado y soportado originalmente por SpringSource, pero está en estado inactivo en el momento. Es mas liviano que los dos anteriores pero no deja de ser una opción interesante para proyectos de corta envergadura que no requieren grandes elementos.
Estas son las alternativas open source que más visibilidad tienen, sin embargo no son las únicas, también a niver comercial hay una serie de marcos de desarrollo de aplicaciones de escritorio con enfoques similares a los mencionados anteriormente.

¿Qué sigue?

Bueno, habiendo hecho una "corta" introducción sobre el tema de RCP, voy a continuar la serie usando "Netbeans Platform" como herramienta por las siguientes razones:
  1. Está hecha en Java, lo que nos permite crear aplicaciones multiplataforma y aprovechar muchos módulos ya construidos. 
  2. Tiene muy buena documentación.
  3. Está basada en Swing, lo que nos permite tener una experiencia de usuario consistente.
  4. Me he enterado de que uno de los desarrolladores y arquitectos principales de la plataforma, y además empleado de Oracle (Geertjan Wielenga) ha comenzado a trabajar en un proyecto basado en la infraestructura de Netbeans pero usando JavaFX 2.0 en vez de Swing: eFX.
  5. Oracle está apoyando fuertemente a este proyecto.
  6. El modo de licenciamiento de las aplicaciones construidas con Netbeans Platform es "amigable con el pequeño empresario" ;-)
Así, que para ponerme manos a la obra, me he conseguido la siguiente documentación, y espero poder entenderla sin mayores problemas:
  1. Professional Java, JDK 6 Edition
  2. Patterns of Enterprise Application Architecture
No más por hoy, ya en la siguiente entrega, empezaré a comentar los detalles de netbeans platform.

sábado, enero 21, 2012

Rotación de Tablas

Hola a todos.

Después de pensar mucho sobre un post que fuera de utilidad, pagándole un regalo de cumpleaños a mi amigüita Sorey, y además de tener un ratico en el almuerzo, les quiero compartir la siguiente experiencia que tuve hace unos años cuando trabajaba para una empresa que me dejó muy malos recuerdos (pero esa es otra historia :-) ).

Sucede que trabajando para un proyecto de telcos, tenía(mos) que monitorear un conjunto de tablas INMENSAS, tanto en metadata, la que menos tenía, tenía 60 columnas, siendo varchar2(64) el común denominador, como en registros (diariamente bajita la mano, eran 9 millones de registros y al final de mes, ya pueden hacer cálculos...).

Uno de los requisitos sobre los que se hizo mucho hincapié fue el almacenamiento de los datos de los últimos 6 meses (por ley para telcos en ese entonces).

El siguiente requisito, origen de este post, era que el respaldo de dicha información no podría demorar más de un segundo (!!!), lo cual tiene sentido, dado el carácter de alta disponibilidad del sistema.

Después de mucho trastabillar con el conocido "Insert Into Historico Select * From Tbl; Truncate Table Tbl;" y viendo que, cuando nos iba bien, se demoraba 1 hora el cambio de mes, se me ocurrió una idea interesante a la que llamé "Rotación de Tablas" (y si alguién ya la había implementado, me disculpa, pero citando a topogigio "lo dije yo primero" ).

El razonamiento inicial fue intentar mover los datos entre tablas, lo cual cumplía el primer requisito, pero no el segundo; asi que en vez de moverlos, más bien se recalculaban sus identificadores y voilá, una operación lógica en vez de una física: "caching!" .

Aprovechando las características de las tablas que tenía en ese entonces, redireccionar su metadata fue fácil, y eso logró cumplir con el segundo requisito.

No voy a publicar código debido a que tengo poco tiempo, más bien voy a dar los lineamientos generales que aplican para cualquier motor de base de datos. Asi pués que, entrando en materia:

Precondiciones de las tablas a rotar

  • Nombre de los constraints (pk, uk, fk, defaults, checks) predecibles o ninguno (preferible).
  • Nombre de los índices también predecibles.
  • Nombre de los autoincrementos (si hay, secuencias, identity, etc) también predecibles.
  • Cero Triggers (muy importante: facilitan el trabajo)
  • Cero claves foráneas (muy importante, mejor si sólo son tablas de vaciado de datos)

Precondiciones del motor de base de datos:

  • Soporte para manipulación de metadatos (renombrar tablas, columnas, constraints, índices, autoincrementos, etc).
  • Soporte para bloqueo de metadatos y restricción de conexiones temporalmente.

Ahora si, cumpliendo las precondiciones, se puede delinear la transacción de la siguiente forma lógica:

  1. Bloquear acceso a las tablas y su metadata solo a la operación entrante.
  2. Deshabilitar los constraints como índices, checks, y claves foráneas (se puede hacer a través de un procedimiento que analice el INFORMATION_SCHEMA).
  3. Renombrar la(s) tabla(s) (por ejm: TablaDatos -> TablaDatosHist201102)
  4. Renombrar los constraints referenciando el nombre nuevo de la tabla.
  5. Crear una tabla nueva idéntica en metadata. (por ejm: Create Table TablaDatos As TablaDatosHist201102, o mejor tener una tabla plantilla)
  6. Crear los constraints para la nueva tabla con los nombres originales.
  7. Re-habilitar los constraints deshabilitados.
  8. Liberar el acceso.

Dependiendo del motor de base de datos que estemos usando, es probable que otras consideraciones técnicas deban tenerse en cuenta, como por ejemplo, reindexar, re-calcular estadísticas en la tabla vieja, recuperar espacio físico, pero eso puede hacerse de forma asíncrona una vez ya esté en sitio la nueva tabla vacía y el sistema en línea.

Con este método se logró solucionar el problema cambio de mes en un segundo en el dichoso sistema ese.

Saludos, hasta otra oportunidad.

jueves, marzo 08, 2007

Propuestas para el nombre de mi nuevo portatil.

Hola, otra vez yo...

En este momento estoy otra vez trabajando... no pasó una semana y ya había encontrado un nuevo empleo.... la mala noticia es que para un seguidor de GNU/Linux como yo, la vida le preparó un chiste divertido: trabajar con tecnología microsoft.
Pero bueno, eso es divertido desde que aprenda nuevas cosas.
Una entrada más, hace una semanita estoy estrenando portatil, un dell inspiron 1501 (muchas gracias a beatricita que me atendió muy bien). Como viene con un turion de doble núcleo y con ese nuevo sistema de ms... aun estoy decidiendo que distribución voy a instalar, hasta ahora va ganando gentoo.
A propósito, acepto sugerencias para el nombre de mi maquinita.
Proponme uno:...

martes, enero 02, 2007

Uno más...

31 de enero de 2007 a las 10: 30 a.m.:
"Nuestra empresa no tiene liquidez suficiente para seguir con su contrato, hasta ahora ningún negocio ha sido solidificado.
Hasta hoy contamos con sus servicios. He aqui su liquidación".


Bueno, es increible lo fácil que uno puede perder el trabajo en este país. 
Pero bueno, asi es la vida. Mejores oportunidades vendrán; hasta ahora, ya tengo tres propuestas...

mi objetivo primordial es graduarme, ya es justo y necesario... 10 años son 10 años... y no, no me da pena! :-P.

sábado, septiembre 24, 2005

Inicio del Blog

Bueno, esto es el inicio de, lo que creo será, un sitio dónde publicar algunos de mis proyectos.
Cualquier comentario será bienvenido.
______
EdwinF.