domingo, 25 de noviembre de 2007

Congreso Virtual de Delphi en Español

Estoy por ser parte de un gran evento para nuestra comunidad latinoamericana de desarrolladores, especialmente (pero en definitiva no exclusivamente) para los que usamos herramientas de CodeGear (from Borland).

CodeGear organiza los Developer Day en Español los días 4 y 5 de diciembre, en donde habrá conferencias, presentaciones y demo en nuestro idioma. Normalmente mencionaría con mucho gusto este efectivo esfuerzo de CodeGear, pero ahora resulta aun mas especial para mi, ya que tendré la responsabilidad (y la fortuna) de exponer, hablarles sobre Generics y formas en que podemos usar y aprovechar esta nueva característica del lenguaje Delphi for .Net. Pero lo mejor es, que dicha característica, los Generics o clases de tipos parametrizados será la siguiente adición al lenguaje Delphi para Win32 nativo (que usamos en mayoría), como lo podemos ver en el RoadMap de Delphi (nombre clave Tiburon).

Aun mejor, existen otras excelentes ponencias:

  • Fabian Duron (nuestro buen FabianDeus del grupo de Programadores Delphi México) nos mostrara las nuevas caracteristicas del IDE en RAD Studio 2007
  • Norberto Martinez (de Gopac y antes de Smartware) hablara sobre algo que es extremo importante para competir: la calidad de las aplicaciones Delphi
  • Andreano Lanusse (CodeGear) expondrá sobre desarrollo de aplicaciones ASP.NET con AJAX en RAD Studio 2007.
  • Por no mencionar las de nuestros colegas Pablo Soligo de Argentina, José Castillo de Perú, David I y Nick Hodges!

En fin, no tiene caso que sustituya la pagina de CodeGear de REGISTRO para el evento.

lunes, 19 de noviembre de 2007

Llamada dinámica a métodos

No es dinámico como en "dinámico de Bajo nivel" sino llamar métodos por su nombre. La Run-Time Type Information (RTTI) es la forma en que Delphi se vuelve mucho mas poderoso al combinarse con herencia y polimorfismo, sin embargo es el punto ahora, el problema es distinto.

Digamos que queremos hacer un pequeño motor de script (básico para empezar). Podemos guardar las instrucciones del script en un archivo de texto, en un campo de una tabla, etc. Nuestro programa lee esas instrucciones y las va ejecutando una por una, haciendo diversas cosas. ¿Dinámico, no?

Bueno es fácil con Delphi. Los métodos tienen una dirección de memoria donde esta el código (las instrucciones en lenguaje máquina) y una dirección de memoria donde esta los datos (digamos el ambiente del método), en este caso son los datos de la clase a la que el método pertenece.

Ahora, ¿Como guardamos una dirección de memoria en Delphi? Un puntero es un tipo de variable que guarda una dirección de memoria, en dicha dirección puede haber cualquier cosa: una cadena, un numero, un arreglo, o... un método. Como toda clase deriva de la Clase TObject, y dicha clase TObject tiene un método llamado MethodAddress con el que obtenemos el puntero hacia un método que sepamos su nombre, entonces si tenemos una clase llamada MiClase que tiene un método llamado Alerta, obtenemos la dirección de memoria donde esta el código que ejecuta ese método de la siguiente manera:

MiClase.MethodAddress("Alerta");


Para representar un método, Delphi tiene una estructura llamada TMethod. Dicha estructura tiene dos componentes: Code y Data (Código y Datos como lo mencionamos antes). En Code va la dirección de memoria de el método, y en Data guardamos la dirección de memoria de la instancia de la clase (es decir, el objeto) a la cual pertenece el método.

Entonces para llamar ejecutar nuestro Script básico, necesitamos una clase que contenga métodos con el nombre de las instrucciones de nuestro script, y después crear una instancia de esa clase (crear un objeto de esa clase), leer nuestro script y por cada linea del script (una instrucción) crear un TMethod obteniendo el puntero hacia esa función. Lo codifíco aquí en un solo procedimiento por facilidad:

// EjecutaScript con el parámetro del nombre
// del archivo "script"
procedure TMiClase.EjecutaScript(ArchScript: string);
var
p:
procedure of Object; // Un puntero a un metodo
Script: TStringList; // Aqui cargaremos el script
instrucc: string; // para iterar por
// las instrucciones
begin
if FileExists(ArchScript) then
begin
Script :
= TStringList.Create();
try
// Si existe el archivo del script
// Cargamos el script a una lista de strings
Script.LoadFromFile(NombreArchivoScript);
// Por cada instrucción (una linea
// en el archivo):
for instrucc in Script do
begin
// Si la linea no es vacía
if trim(instrucc) <> '' then
begin
// Obtenemos la dirección del método y la
// asignamos al elemento Code de
// p como TMethod
TMethod(p).Code := Self.MethodAddress(instrucc);
// Asignamos el objeto mismo
// como Data del TMethod
TMethod(p).Data := Self;
// Si resulto asignado p (no apunta a nil)
if Assigned(p) then
begin
p();
// Ejecutamos p!!
end;
end;
end;
finally
FreeAndNil(Script);
// liberamos el TStringList
// Como debe de ser :P
end;
end;
end;

Ejemplo: Si tenemos un método llamado Alerta, un BorraCache y un Procesa en la clase TMiClase:

// Actualizado 20/nov/2007 - ver nota al pie
TMiClase = class
...
public
procedure EjecutaScript(ArchScript:
string);
...
published
procedure Alerta;
procedure Procesa;
procedure BorraCache;
...
end;


y nuestro script consiste en un archivo llamado por ejemplo 'haznuevo.txt' que contiene:


alerta
borracache
procesa


al invocar:
var
MiObjeto: TMiClase;
begin
MiObjeto :
= TMiClase.Create;
try
MiObjeto.EjecutaScript(
'haznuevo.txt');
finally
FreeAndNil(MiObjeto);
end;
end;

Entonces se ejecutaran los métodos Alerta, BorraCache y Procesa del Objeto MiObjeto (de clase MiClase :)

También hay forma de pasar parámetros, lo mostrare en un post mas adelante.


Actualización 20/nov/2007: Como bien lo señala Al Gonzalez (¡gracias Al!), el método MethodAddress solo funciona para obtener la dirección de métodos declarados como published!! por lo que declararlos en la sección private no funciona.

miércoles, 14 de noviembre de 2007

Delphi 1!? ok....

Tratando de medir el uso y experiencia en Delphi y sus versiones en nuestra comunidad (la comunidad de programadores a los que nos interesa mejorar) nuestro respetado Al González (que todos conocemos como administrador y principal contribuyente en el grupo Programadores Delphi México) ha abierto recientemente una encuesta sobre la versión (o revisión) del IDE de Delphi que usamos (Delphi 1 o 2 hasta Delphi 2007, no incluye Turbo Pascal - ese es aparte).

La encuesta esta en el sitio de Club Delphi en el siguiente URL:

http://www.clubdelphi.com/foros/showthread.php?t=46171


Si no tienes usuario en Club Delphi puedes ver los resultados de la encuesta hasta ahora y algunos comentarios, para contestarla registrate en el Club (GRATIS Y Definitivamente RECOMENDADO).

Por cierto, yo utilizo felizmente BDS 2006 (y no se que estoy e$$perando para cambiar a RAD Studio 2007) :P

miércoles, 31 de octubre de 2007

El Preclaro pensamiento de Borland

No quiero decir Preclaro como que estaba claro antes que los demás, más bien como que hicieron algo antes de tener claras las cosas: Y me refiero a Kylix una vez mas.

¡Y es que Kylix (la idea de Delphi tras Linux) es algo fantástico ahora! En su momento sonó muy bien, con todo y las dudas: ¿Quien usa Linux? Ninguno de mis clientes o conocidos lo hacia realmente. De hecho solo tres o cuatro camaradas lo teníamos instalado y nos metíamos de vez en cuando o incluso sabíamos administrarlo (usuarios, NFS, Samba, SMTP, Bind, etc.).

Ahora la escena pinta muy diferente, es decir, Ubuntu u OpenSuse (no se diga Suse Enterprise) lo podría usar mi mamá con una mano atada a la espalda y no extrañaría mucho su Office ni su Messenger (bueno, la verdad mi mamá no es buen ejemplo porque es bastante inteligente y puedo tener un buen reto tratando de ganarle en Age of Empires cualquier día de estos) pero saben a lo que me refiero.

Linux no es el futuro escritorio necesariamente, pero si tiene un ENORME futuro como escritorio, mucho más grande del que nos imaginamos. Solo descarguen el ultimo Ubuntu desktop y cálenlo.

Y lo más importante, si hay un gran futuro en Linux, ¿Puede CodeGear explotarlo ahora sí, con gran capacidad y buen enfoque?

Solo hay que ver la creciente popularidad del proyecto Lazarus (freepascal).

jueves, 18 de octubre de 2007

Dia de la Revolucion Delphi 2007

Tuve el placer de asistir (por que realmente lo fue) a la presentación de CodeGear 2007 en Guadalajara, donde el nuevo representante en México de CodeGear, Gopac Soluciones Integrales, en conjunto con Andreano Lanusse (Product Line Manager para América Latina) y Lisa Flores (Comercialización para Latinoamérica de CodeGear) introdujeron los productos, soluciones y demostraron la voluntad que tiene CodeGear para crecer a nuestro Pais (y nuestra comunidad latina).

Realmente salimos motivados de esa reunión: primero de la presentación de Andreano Lanusse -que resulto ser un gran tipo, muy talentoso y verdaderamente apasionado por Interbase, Delphi y 3rd Rail (el nuevo IDE de CG enfocado en desarrollo con Ruby on Rails)- en la que nos mostro BlackFish y su manejo de triggers y Stored Procedures hechos en Delphi (hechos casi en segundos), Delphi 2007 con una gran, GRAN cantidad de mejoras en dbXpress 4, ECO VI, y en el IDE en sí.

En seguida gopacSI, que realmente tienen ganas de crear y apoyar a nuestra comunidad Mexicana de desarrollo. Muchos de los asistentes conocimos personalmente a su Director General (un Maestro en Sistemas especializado en Base de Datos que es una excelente persona) y a su Ejecutivo Técnico de CodeGear, el Lic. Norberto Martínez Rizo (norberto.martinez@gopac.com.mx) que rápidamente nos organizo a quienes fuéramos ya parte de la comunidad de Foros (como de Programadores Delphi México) para hacer mas sinergia y ponerse a nuestro alcance.

Desde aquí Felicito a todos ellos por su voluntad y profesionalismo, pero sobre todo por la pasión por lo que hacen, asi como a CodeGear por que esos pasos que estan dando son firmes hacia el mismo sentido que los desarrolladores vamos, y que sigan asi. Ahora sí, tenemos que poner todo de nuestra parte para ser una comunidad más dinámica y creativa, por nuestra sociedad Latinoamericana.

sábado, 13 de octubre de 2007

Luchando contra 500 años de Cultura del comerciante

Generalmente en México (me parece que en gran parte de América Latina) los dueños, jefes o "patrones" de empresas (incluso de empresas de tecnología) de la anterior generación tienen una cultura de negocios MUY ARRAIGADA en la que muestran una grave falta de interés por la inversión: les gustan los negocios fáciles, el dinero rápido, la fuerza del impulso antes de la inteligencia de la organización. Sus ideas nacen de la prioridad de ahorrar todos los centavos que puedan, para terminar gastando muchos pesos en la consecuencia de ese ahorro. ¿A quién le suena familiar?

En lo personal, he estado encontrando una infinidad de trabas en investigacion e innovacion en una empresa para la que trabajo como consultor y desarrollador, dicha empresa tiene un potencial enorme, pero simplemente parece no interesar a su dirección, tal vez por pensar que mientras mas grande menos podrá controlar. Y es que al parecer, eso es otro rasgo de la mencionada cultura: el control obsesivo e invasivo.

Y es que, si buscas gente inteligente para que trabaje contigo y para ti, esperas que usen esa inteligencia en resolver sus tareas de la mejor manera (en su justa medida y en su justo ámbito de responsabilidad) conscientes de los objetivos en común, o no? La dirección sirve de eso mismo: dirección de los esfuerzos. No contratas a gente con cerebro (la mayoría de los que trabajan para dicha empresa) para que sea solo una extremidad del cerebro de la dirección, o eso supongo yo.

Es probablemente un reflejo de algún complejo de superioridad/inferioridad del jefe, pensando que él y solo él debe saberlo todo, y que todos deben hacer todo exactamente como él lo haría, sino de seguro no está bien hecho. Pero al mismo tiempo, la misma dirección no les proporciona la información necesaria para que tomen las decisiones correctas, porque la desconfianza no se los permite, ni siquiera cuando están seguros que es GENTE PROFESIONAL y comprometida con los objetivos de la empresa.

En fin, hay tanto que hacer en nuestro país, tanto potencial de crecimiento, y tanta gente que entendemos ese potencial, que tenemos más conciencia de lo que es ser profesional y buscamos serlo día tras día y cada vez mejor, que lo tenemos tatuado en los huesos, junto con la pasión que sentimos por aquello que hacemos. Es una lástima que a pesar de que tratemos de cambiar las cosas visiblemente para crecer, hay quien busca administrar una empresa de desarrollo de software igual que administraria un abarrote pequeño, en el que puede ver, oír y controlar hasta su ultima decisión, y al mismo tiempo explotarlo como si fuera la gallina de los huevos de oro.

Pero eso no debe detener el crecimiento de nuestros países y la explosión de nuevas y mejores oportunidades de desempeño profesional.

Solo como muestra de lo que van a ser las cosas: Hay muchas empresas de tecnología que están cambiando, innovando, aprovechando (si bien de manera aun escueta) su potencial. Por ejemplo Sistemas GH, una empresa de desarrollo basada en Morelia, Michoacán, que con inteligencia privilegia la inteligencia y autonomía de la gente sobre la ambición desmedida, su mentor (y fundador del grupo Programadores Delphi México) Al Gonzalez, sabe que un desarrollador profesional es alguien que sabe lo que hace y que vale la confianza que se deposite en el (o ella). Digo, al fin y al cabo es un negocio: el principal objetivo son las ganancias, pero es una forma más inteligente, más consciente, responsable, duradera y sostenible de lograrlas, te encuentras con la lealtad y la motivación intrínseca de las personas que trabajan a tu alrededor, es decir, los demás hacen bien y cada vez mejor las cosas, por el simple hecho que querer ser buenos en lo que hacen y cada vez mejores, y de lograr los objetivos en común.

viernes, 21 de septiembre de 2007

Nuevo libro de Delphi de Marco Cantu

El nuevo libro de Marco Cantu ha sido liberado. Parece un libro excelente como todos los que ha escrito, aunque este esta dedicado 100% a actualizar nuestro conocimiento y dominio de Delphi hacia la versión 2007 con todas las novedades: Delphi 2007 Handbook.

Por lo pronto ya lo pedí. Por cierto que ahora el libro se vende a través de un novedoso servicio de impresión bajo demanda: El libro se imprime a medida que se compra, por lo tanto cuando no se hace una inversión exorbitante de entrada. Cualquiera que escriba algo o tenga algo escrito, que pueda ser vendido, se puede subir a este servicio llamada Lulu, se le pone precio y si se vende, pues que bien (claro que ayuda si es algo útil para alguien mas :P )

Cuando me llegue espero tener la oportunidad de escribir una reseña. Mucha suerte a Marco, aunque la verdad creo que no la necesita (El libro rompió toda expectativa de venta en sus primeros días)

miércoles, 25 de julio de 2007

Dinamic binding for properties in the VCL

There is something that I *REALLY* wish to have in RAD Studio that I think is a really nice idea from VS and could be taken even beyond: Dynamic binding of component's properties to any data source (XML, DB, INI files, Registry, Porperties from other components/controls, etc.)

This could be a major step for VCL, plus I guess that RTTI and maybe initialization code might be the core of this technology, so it's not far from there. Just think about it!

That is just the kind of ideas that I think should be part of RAD, don't you think?

sábado, 7 de julio de 2007

Empresa RADical con Delphi

El concepto RAD de Delphi es sorprendente. Ningún concepto me he hecho sentir mas cómodo programando pequeñas y medianas aplicaciones poderosas que el Rapid Application Develompent. Es tan fácil como jugar con Lego pero aquí puedes aprender a crear tus propias piezas y extenderlas hasta donde quieras, tus propios componentes y controles, así de sencillo, toma lo mejor de la programación orientada a objetos y lo aplica de manera pragmática. Sorprendentemente increíble y poderoso.

Lo que me pregunto es porque no he escuchado más de arquitectura y diseño de las aplicaciones creadas con Delphi más allá del RAD. No escucho o leo que alguien este aplicando o encontrando patrones de diseño aplicados al RAD. Parece que todos tendemos a confiar en el concepto atrás de la VCL y seguirlo pensando que es suficiente. En lo particular a mi me ha hecho sentir desorientado cuando trato de ir aun mas allá, hacer aplicaciones genéricas por ejemplo.

Digamos que quiero ser aun más productivo y crear un administrador de estilos gráficos (temas) para las aplicaciones, o un marco de persistencia (un Mapeador Objeto-Relacional por ejemplo) que pueda reutilizar de manera genérica.

Yo sé, estamos hablando de Delphi, no de Java. En Java hay muy interesantes conceptos que hacen a veces palidecer a Delphi en otros rubros: hablo de esfuerzos comunitarios bien apoyados como Spring, Hibernate, SWT; hablo de arquitectura ( Write-once-Run-everywhere del que la CLX fue un esbozo) y de sus aplicaciones empresariales, con transacciones distribuidas u orientadas a servicios (SOA).

¿Que nos impide usarlos con Delphi? Nada. ¿Que nos impide aplicarlos y mejorar aun mas el concepto RAD? De hecho nada, solo la finta de que Delphi es solo para aplicaciones GUI cliente/servidor. ¿Quien dijo eso? No sé, y no importa.

Quiero ver más de eso, quiero usar Delphi en un sistema ENORME, crear componentes reutilizables del tamaño de una aplicación mediana, que me permitan con unas líneas de código o de manera declarativa (mediante XML por ejemplo), unir mis clases con la base de datos y no preocuparme más por saber si la BDE esta descontinuada, la dbExpress mejoro, necesito comprar MyDAC o Borland le cambio el nombre de los componentes ADO a dbGo. Quiero poder hacer de manera sencilla transacciones que abarquen varios procedimientos y una forma fácil y eficiente de mantener la aplicación, aplicar temas, cambiar por completo la vista de mi aplicación sin impactar el estilo grafico sin que esto implique real esfuerzo, MAYOR DESACOPLAMIENTO.

De hecho voy a hacer algunos experimentos con esto: Teoria de patrones de diseño con RAD, algún ORM 100% desacoplado de la tecnología de almacenamiento de datos tal vez, controles con vista 99% personalizable. Ya no estamos lejos (JediVCL, InstantObjects, repositorio de patrones del IDE, ECO, CLX) pero mi propuesta es esa: generar más conocimiento y practica, subirnos a la ola en lugar de intentar subirla y dejarla pasar, digamos Practica de Arquitectura y Diseño avanzado con Delphi.

viernes, 29 de junio de 2007

Patrones del exito

Muchos programadores han escuchado acerca de ó aplican de manera diaria en su trabajo el concepto de Patrón: una solución refinada y adecuada a un tipo de problema específico y bien identificado. Incluso existen los anti-patrones: supuestas soluciones o comportamientos, tendencias y reacciones comunes a determinados problemas, que terminan siendo un desastre por razones comprobadas a lo largo de la historia de la programación.

Ahora imaginemos la misma filosofía del patrón (ir mas allá de la simple resolución del problema), pero aplicada AL MISMÍSIMO COMPORTAMIENTO DEL PROGRAMADOR: los problemas a los que nos enfrentamos de manera constante, nuestro desarrollo profesional y todo nuestro trabajo diario analizados desde la perspectiva de programadores exitosos, con más de veinte años de experiencia y que se mantienen más que vigentes a la fecha, los patrones de comportamiento de los usuarios, de los jefes, pero sobre todo del programador en sí, con tips, consejos y sobre todo soluciones inteligentes llenas de pragmatismo.

Eso es exactamente lo que Andrew Hunt y David Thomas publicaron en un libro por demás excelente, titulado El programador pragmático (de hecho The pragmatic programmer: from journeyman to master ya que por supuesto, hasta donde yo se no ha sido publicado en español).

A pesar de haber salido en el año de 1999 (hace como 30 años-web ;) no deja ni dejara pronto de ser vigente en lo absoluto, de hecho esta gente se adelanto un poco al tiempo así que al contrario, yo diría que es más vigente que nunca, después de todo, la ciencia avanzara pero los humanos seguimos siendo humanos.

Los mismos autores mantienen un sitio web de su compañía: www.pragmaticprogrammer.com que junto con el libro ha sido un enorme éxito al mantener la mente de muchos programadores fresca y abierta para su uso continuo.

No hay forma de explicar mas el libro y la idea más que leerlo detenidamente y con verdadero "Análisis Critico" (tip no. 9 del mismo libro), pero basta decir que ha inspirado a la generación de programadores que ahora son líderes en la industria e innovadores como Martin Fowler (Refactoring), Kent Beck (Extreme programming), Alistair Cockburn (Crystal Clear) y un montón mas.

Por cierto, de acuerdo a wikipedia:

...la palabra pragmatismo proviene del vocablo griego praxis que significa acción. Para los pragmatistas la verdad debe ser medida de acuerdo con el éxito que tenga en la práctica. En el pragmatismo no existe el conocer por conocer. Si algo no tiene un fin o uso determinado no hay razón para que tal cosa exista.

El programador pragmático, por lo tanto se podría definir, pero solo en parte, como aquel que hace lo que funciona para lograr que las cosas se hagan, que piensa lo que está haciendo y no trabaja en automático, y tiene la experiencia y el uso de la inteligencia a su servicio todo el tiempo, se adapta al cambio y se mantiene actualizado.