FriendsBlog Archive
|
July 2006El dÃa que la cigarra imitó a la hormigaDrums please!
Now, ladies and gentlemans, I'm proud to show you, the new, the improved, the wonderful DAOGen-20060730.tar.gz. This new version can generate the DAO object implementation for PostgreSQL access. This baby is getting useful. Now there is only a preliminary version for the Factory class, but soon, the whole enchilada will be exposed. What's missing? More documentation, the factory interface and its PGSQL implementation. What's foreseen? PGSQL composite types as data transport objects and PGSQL functions as DAO objects. What I want? Peace and love... un mal libro en el inter
un furioso perezoso tomó esto personalToday is a celebration day. Today I decided release a new version of DAOGen. There is several new features:
* First cppunit unit test. Just tries the postgresql connection * Better autotools support * Interfaces to DAO Objects headers * PG DAO Objects headers * PGException * PGDBConn singleton class Yesterday I went to the cinema and watched two wonderful movies: 5x2 and Match Point. Locuras de fin de semana...Fui al café iguana, me gustaron un par de bandas. Me compré tenis nuevos. Y fui al cine a ver una pelÃcula buenÃsima: Joyeux Noël. Avancé un poco en el DAOgen y escribà un aborto de cuento que resultó demasiado complicado para mi cabecita.
First Release!Finally got a somewhat clean first version for my DAOGen. The code is here. Basically is a Perl program using templates which connects to a database, extract all the metadata from the selected schema and generates the Data Transport Classes for all the tables. The script also generates a directory following the GNU projects specification, and the necessary autotools scripts in order to obtain a configure/make/make install project.
Remember to read de README and be happy. How I whish you were hereEstoy cansado. Vengo de vuelta del cine. Vi Breakfast on Pluto. Toda una tragedia narrada con comicidad... humor totalmente negro. Me conmovió.
El generador de código va tomando forma. El plan de mañana es ponerle un poco de magia de las autotools. The DAO code generatorFinally I got a preliminary version of my code generator for the DAO pattern! It's a Perlish hack and it's a complete mess, but it generates C++ data transport objects which compile without warnings, even with the -pedantic compiler flag enabled.
In general, the generator search for tables in a specific database schema (right now only PostgreSQL is supported). For each table, extracts their attributes and their properties (primary key and autoincremented), then using simple templates (using Text::Template), creates a data transport object (.h and .cpp respectively) for each table. The generated code also is also capable to build a perfect Doxygen documentation. Currently the generator is hardcoded, so it's quite lame give away something. My TODO list: clean the generator in order to offer it in the web, create an directory infrastructure, generate autoconf magic, create the DAO objects, create DAO factory, pack all in a libdb.a library, document, document and document. En otro orden de ideas, la inexperencia cómo nos hace lucir como soberanos pendejos. viernes, sábado y domingoViernes: raptado por Emilia y Alan para ir a tomar margaritas en un bar del Barrio Antiguo. ¡Ah qué cosas! Emilia entra en mi top5 de las chicas más raras que he conocido. Rematamos la noche bebiendo un six en el departamento.
Sábado: Ir a ver el partido en el Das Bierhaus, con unas cervezas y hacer compras necesarias para la casa. El Shala llegó y conversamos con un six. Muy agradable una conversación asÃ. Domingo: Ir a ver la final del mundial a Sanborns mientras comimos. Más cervezas. El resto de la tarde frente el monitor. /dev/miscSéptimo arteAyer me salió mi espÃritu explorador y decidà tomar una ruta desconocida hasta ese momento para ir al cine de arte que está a un lado del Tec de Mty. Tomé la ruta 95 en Aramberri, a un par de cuadras del departamento, y llegué sin contratiempos.HabÃa varias opciones, pero eran las 7pm y sólo habÃa una pelÃcula que empezaba a esa hora u otra a las 7:40. Leà las sinópsis y algo capturó mi atención en la pelÃcula de las 7:40: la historia de la hija de un matemático. Yo tenÃa inclinaciones por ver la de Good Night, and Good Luck, pero la proyectaban hasta las nueve. Compré la entrada a la pelÃcula de las 7:40. ¡Qué grandiosa pelÃcula! Me encantó, me fascinó, la disfruté enormemente. No puedo evitar recomendarla, ¡veánla! es una orden. En inglés se llama Proof. Quisiera contarla, pero serÃa una injusticia. Al salir querÃa otra vez tomar la ruta para regresar, pero no pasaba. Al comenzar un chipi chipi decidà abordar el primer taxi que viera. Al subirme la tromba hizo su aparición. Y no dejó de llover hasta ya muy entrada la noche. ¡Vaya que llueve por acá! C++He estado jugando mucho con C++.Regla del diseño de software: PROGRAMA ORIENTADO A INTERFACES. El objetivo de esto es mantener bajo el nivel de acoplamiento entre los objetos y facilitar el manejo de cambios en la implementación. Para los que ignoren la ventaja de esto, basta decir que los costos de mantenimiento del código decrecen sustancialmente. El punto es que C++ es un lenguaje más bien de bajo nivel (comparado con Java o C#) y no provee un mecanismo nativo y claro para el manejo de interfaces, pero se puede hacer algo a través de la herencia de clases virtuales puras. Después de pelarme con el compilador de mingw, con un trozo de código grande y algo complejo, decidà hacer una pequeña prueba de concepto para ver si cómo hacer esto y he aquà el resultado:
#include <iostream> using namespace std; // Interface class IBar { public: virtual ~IBar () {}; virtual void print () = 0; }; // Implementation class Bar : public IBar { public: Bar () { cout << "Constructor" << endl; } virtual ~Bar () { cout << "Destructor" << endl; } virtual void print () { cout << "Metodo print ()" << endl; } }; // Class factory class Factory { public: static IBar *createBar () { return new Bar (); } }; // Program int main (int argc, char <strong>argv) { IBar *bar = Factory::createBar (); bar->print (); delete bar; }
#include <iostream> using namespace std; class IException { public: virtual ~IException () {} virtual void print () = 0; }; class MyEx : public IException { public: MyEx () { cout << "Constructor" << endl; } virtual ~MyEx () { cout << "Destructor" << endl; } virtual void print () { cout << "Hubo un error" << endl; } }; void failproc () // throw (MyEx *) { throw (new MyEx ()); } int main (int argc, char </strong>argv) { try { failproc (); } catch (IException *ex) { ex->print (); delete ex; } } El punto es hacer trabajar al compilador/máquina virtual para que resuelva los tipos de dato en tiempo de ejecución. De esta manera nuestra capa superior del sofware manejara las interfaces sin preocuparle que implementación está utilizando. La frase del dÃa en el chat: Lo único constante es lo que está de la chingada. Organizando IdeasVarios escritos en los últimos dÃas:
Pasando a otras cosas: el trabajo parece estar tomando ya un tenor más prometedor, aún no me recupero del viaje a Celaya. Fue el cumpleaños más raro de mi vida: sin compañÃa fÃsica, pero mucha virtual... Me gustó. No me sentà para nada sólo, todo lo contrario, me sentà apreciado a pesar de las distancias. Un grandiosos libro que no debe tomarse en serio....
|
Recent Comments On Blog