Promoting Firebird in the annual reunion CIAPEM 2012

CIAPEM 2012 is the annual reunion of the TI comitee for state and municipal public administration in Mexico.
It reunites the TI areas of states and municipalities in Mexico. This time the reunion is in Veracruz city, and i was invited to be in the CMD expositor stand. So i have been promoting both CMD services and Firebird as well.

There have been a lot of people interested in Firebird, and i have been giving them information about it. The people interested are mainly from TI areas in municipalities, states and educational institutes.

Today (thursday, october 25) is the second day of the reunion. I’ll report by twitter what’s going on in the stand and in the expositors area.

By the way, there are also big stands from big software (and database) companies in there. Some people has commented me that their institutions can’t afford to pay big licenses accounts from those companies, so they’re also interested in Firebird because of its low cost.

Las herramientas que uso en desarrollos web

Para crear un desarrollo web, se requieren de varias herramientas, librerías de clases y funciones que permitan crear el desarrollo requerido.

He estado trabajando desde el año pasado con Codeigniter como framework de PHP, y me ha funcionado muy bien, y he ido adicionando otras herramientas que permitan conformar un desarrollo web adecuado.

Estas son las herramientas que utilizo en un desarrollo web:

Lenguaje: PHP
Base de datos: Firebird y MySQL
Framework PHP: Codeigniter
Framework Javascript: jQuery
Biblioteca de interfaz: jQuery UI
Generador de gráficas: Flot
Otras herramientas: Thickbox, DatePicker de Kelvin Luck

El editor de que estoy utilizando y que me gusta mucho por su rapidez y practicidad es Sublime Text, muy recomendable. También me ha gustado Aptana, aunque requiere de muchos recursos para funcionar ágilmente.

Testing Codeigniter with Firebird

I’ve been using Codeigniter as my development platform and framework of choice since last year. Being a ten year PHP developer, Codeigner was a refreshing way of coding web apps with PHP.

The first ones developments I did with Codeigniter were using MySQL, a very used database. But since I’ve also been using Firebird SQL Database from ten or more years ago, I decided to give a try to the Codeigniter-Firebird duo.

So I downloaded the Firebird drivers for Codeigniter, written by Carlos Garcia, and installed in my Codeigniter application setup.

Everything went ok, in the first attempts to make a connection and display a table, the data was displayed as expected. But I noted some little differences in using Firebird, here’s the list:

a) You must use the array indexes of the result array of a query in capital letters. For instance, in this code:

$arr =  $this->db->query("select  id, field from table");
$data = $arr->result_array();

When you refer to the content of the data array, you should do that in this way:

echo $data[0]['ID'];

By the way, in the query statement, you can use lower or uppercase letters.

NOTE: Still have not used the ActiveRecord Get methods that return objects for each row of the table, I’ll report them as soon as I use them.

b) When a query fetches a lot of records (sorry, I didn’t test the exact number), it throws an http ‘Internal server 500’ message. I also didn’t test if it’s my server setup. As I know I’ll be using pagination, the error disappeared when I used a 20 record page pagination in the display of the table.

c) I also had an error when making a SELECT * FROM TABLE statement, and if that table has a very large VARCHAR (or CHAR) fields. This was fixed when I specified only a few fields of the table.

d) Another thing I noted is that the num_rows method of a query always returns 1. Don’t know if it’s a bug or product of a special condition in my program. This was resolved by using the sizeof function of PHP, applying it to the result array. This way I know how many rows returned the query.

These are the things I have observed so far. I did my testing today, and plan to continue the application. I’ll report these issues to Carlos, and as he lives in the same city than I, maybe I’ll thank him (in the name of all Codeigniter/Firebird developers) his time and effort in development this piece of software with a pair of beers (maybe more).

Apart from these little issues, the Firebird driver for Codeigniter is working very well and it’s very nice to make web applications with both development softwares.

You can download the Firebird Driver for Codeigniter in this URL:
https://github.com/cgarciagl/Firebird-for-Codeigniter

Configurando Codeigniter para desarrollo en 10 minutos en Mac OSX

A continuación mostraré una manera rápida de tener un entorno de desarrollo Codeigniter, ya se para crear desarrollos o para aprender, todo esto en 10 minutos (dependiendo obviamente de la velocidad de descarga que tengas).

  • 1.- Descarga MAMP de la dirección http://www.mamp.info
  • 2.- Descarga el editor Aptana Studio desde la dirección: http://aptana.com
  • 3.- Descarga el administrador de MySQL Sequel Pro desde: http://www.sequelpro.com
  • 4.- Descargar la versión más reciente de Codeigniter: http://codeigniter.com
  • 5.- Instalar MAMP, Aptana Studio y Sequel Pro.
  • 6.- Crear una carpeta de desarrollo (puede ser en Documentos (documents) en nuestra Mac)
  • 7.- Iniciar MAMP, escribir la contraseña de administrador para que inicien los servidores (MySQL y Apache).
  • 8.- Detener los servidores, y cambiar la configuración (botón Preferencias…) poner los puertos 80 en Apache y 3306 en MySQL. En la pestaña Apache, seleccionar la carpeta creada en el punto 6. Dar click en OK.

Haga Clic para ver la Imagen original en una ventana nueva
9.- Reiniciar los servidores (punto 7).
10.- Desempaquetar Codeigniter en la carpeta de desarrollo.
11.- Abrir el archivo database.php que se encuentra en la carpeta Applications/Config de Codeigniter
12.- Modificar las líneas de configuración:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = 'root';
$db['default']['database'] = 'ejemplo';
$db['default']['dbdriver'] = 'mysql';

Donde la línea que indica la base de datos, debe contener el nombre de una base de datos a crear.
13.- Crear la base de datos “ejemplo”, usando Sequel Pro, conectándose al servidor con estas configuraciones:
Haga Clic para ver la Imagen original en una ventana nueva

14.- Una vez conectado, y utilizando el botón Choose Database, seleccionar la opción Add Database.
Haga Clic para ver la Imagen original en una ventana nueva
15.- Escribir el nombre de la base de datos (en este caso, ejemplo).
16.- Listo, ya tenemos un entorno para una aplicación Codeigniter. Lo siguiente es crear modelos, controladores y vistas.

Cambiar el tema de Xoops si se accede con un dispositivo móvil

Xoops es el CMS que utilizo desde hace algún tiempo para crear sitios y portales.
Últimamente con el auge de las plataformas móviles, es necesario que nuestras páginas tengan una forma de visualización adaptada a los navegadores de tales plataformas.
Estuve investigando un poco y encontré un módulo de WURLF que permite seleccionar un tema distinto de Xoops de manera automática cuando detecta que la página está siendo visualizada desde un navegador móvil.
Desgraciadamente no funcionó como yo esperaba el módulo WURLF y debido a limitaciones de tiempo, tuve que buscar otra opción.
Encontré una clase llamada Mobile_Detect (http://code.google.com/p/php-mobile-detect/) que permite detectar si se está usando un dispositivo móvil para visualizar la página donde se usa la clase.
El siguiente paso era descubrir dónde se puede cambiar el tema que utiliza Xoops para mostrar una página, instanciar la clase Mobile_Detect y verificar si se está visualizando desde un dispositivo móvil, y entonces cambiar el tema si ese es el caso.
Descubrí unas líneas en el archivo header.php de Xoops (ubicado en el directorio raíz de Xoops) y por ahí de la línea 51 (no sé si moví el código y los números de línea cambiaron) encontré estos códigos:

$xoopsThemeFactory = null;
$xoopsThemeFactory = new xos_opal_ThemeFactory();
$xoopsThemeFactory->allowedThemes = $xoopsConfig['theme_set_allowed'];
$xoopsThemeFactory->defaultTheme = $xoopsConfig['theme_set'];

Finalmente, agregué estas líneas, para lo cual tuve que colocar el archivo Mobile_Detect.php en el directorio /class (puede colocarse en cualquier otro directorio, pero por orden, lo puse ahí):

require_once $GLOBALS['xoops']->path('class/Mobile_Detect.php');
$detect = new Mobile_Detect();

if ($detect->isMobile())
$xoopsThemeFactory->defaultTheme = "default";

Y listo, con esta modificación, el tema a usarse será el tema llamado “default”, en lugar del tema que utiliza la página normalmente.

Lo que sigue es adaptar el tema “default” para que funcione adecuadamente en los dispositivos móviles. Hice algunos cambios al archivo theme.html y al style.css para hacer más grandes las letras y cambiar a una sola columna la disposición de la página.

Una manera fácil y rápida de adaptar Xoops, en lo que puedo echar a andar WURLF o se encuentra otra manera más adecuada y personalizable.

Este sitio ya está trabajando con esa modificación.

Mis primeras experiencias (con CodeIgniter)

Estoy terminando mi primer trabajo con CodeIgniter y han sido meses de trabajo en los que he conocido este Framework para PHP.

Como en este mundo del desarrollo y la programación hay tantas opciones, es claro que cada punto de vista es muy subjetivo y refleja mi opinión basada en mi área exclusiva de trabajo y mi experiencia.
Empezaré diciendo que CodeIgniter es un framework muy ligero, se instala muy rápido e igualmente se configura muy rápidamente. Este trabajo que he desarrollado tenía por requisito trabajar con MySQL, así que me ajusté a esa condición y configuré el framework para trabajar con MySQL. Haciendo un paréntesis, tengo en mente probar el driver para Firebird que desarrolló Carlos García, espero realizar esto en los próximos días.

Como primer punto, hay que destacar que utiliza el patrón Modelo Vista Controlador, y lo implementa de una manera muy sencilla:

  • Los modelos controlan los accesos a los datos.
  • Los controladores aplican la lógica del programa, haciendo uso de los modelos, y
  • Las vistas, que igualmente se referencian desde el controlador, contienen el despliegue de los datos.

Contrario a otros frameworks, es muy flexible, pudiendo utilizar Controladores y Vistas sin Modelos e incluso solamente Controladores, aunque lo más deseable es aprovechar todos estos recursos. Entonces vemos que el elemento central es el Controlador, que es el que recibe los datos y despliega las vistas cada vez que llamamos a una URL de nuestro sitio.
Cada controlador se refleja como un “directorio” ó “carpeta” tradicional de una URL, y a su vez cada función de un controlador es el siguiente nivel de “carpeta” o “archivo”.
Hablando estrictamente en POO, un controlador es una clase (derivada de la clase CI_Controller, y las funciones son métodos de la clase.

Hasta aquí, este es el punto central de CodeIgniter: Modelos, Controladores y Vistas.
Otros puntos a destacar y que complementan al núcleo de CI son los Helpers, Clases, Bibliotecas de clases, y enrutamientos, lo cual comentaré en artículos posteriores.

Concluyendo este breve e introductorio artículo, y teniendo el antecedente de haber utilizado CakePHP, me parece que CodeIgniter es:

  • Muy sencillo de usar, para aquellos que dominan conceptos de POO y Frameworks.
  • Muchas cosas no son tan automáticas como en CakePHP, pero a su vez esto le da una sencillez muy deseable.
  • Aunque no tiene tanta “Automagic” como CakePHP, cuenta con un nivel de automatización de tareas que reduce de manera muy grande los tiempos de desarrollo –comparado con PHP sin usar Framework-, y una organización excelente, al tener la aplicación separada en capas.

En fin, hay muchas Frameworks para PHP, para muestra solamente hay que visitar http://www.phpframeworks.com/ por lo que evaluar una a una es un trabajo arduo y que algunos no podríamos realizar. Sin embargo CakePHP tiene todo lo que un programador desea para realizar aplicaciones PHP de manera rápida y segura, y con una instalación y configuración igualmente ágil.

Uso de Frameworks en PHP

Hace poco un amigo (quien también se dedica al desarrollo de software) me preguntó si yo seguía utilizando PHP para desarrollar. Le dije que sí, que ya tenía muchos años utilizándolo y que aún sigo usándolo como lenguaje principal para desarrollo en web.

Le platiqué que estaba haciendo unos trabajos con CodeIgniter, y que anteriormente usé CakePHP para algunas cosas sencillas. Al mencionarle que éstas son Frameworks, parece que no me entendió y tuve que explicarle sobre qué es un Framework.
Por eso hoy se me ocurrió escribir un breve comentario sobre lo que son los Frameworks, para las pocas o muchas personas que aún no los utilizan. Lo haré con mis propias palabras y quien desee obtener la definición formal, puede consultar otras fuentes más confiables .

Un Framework es un conjunto de clases que facilitan la programación de aplicaciones con un lenguaje de programación el cual, por definición, debe tener capacidades de orientación a objetos.

Un Framework permite entre otras cosas:

  • Acelerar el proceso de desarrollo
  • Fijar estándares de codificación
  • Automatizar funcionalidades básicas
  • Proveer una API (interfase de programación compuesta por clases y funciones, dependiendo del Framework) que permita automatizar y acelerar las necesidades de programación

Un Framework está compuesto por varias clases que deben estar bien diseñadas y codificadas para proporcionar las características mencionadas. Muchas integran patrones de diseño, los cuales proveen de soluciones reutilizables para problemas comunes. Algunos de estos patrones más utilizados en los Framewors son, por ejemplo: MVC (Model View Controller) y ActiveRecord.

Para no perder la brevedad, y en términos prácticos, puedo decir que un Framework:

  • Acelerará el desarrollo de aplicaciones de manera impresionante
  • Permitirá que el código de mis aplicaciones quede ordenado y legible
  • Dará a mis aplicaciones más solidez y características sin escribir tanto código

Por ello el uso de Frameworks es lo más recomendable en la actualidad y si usas PHP para desarrollar, puedes escoger entre muchas Frameworks, hay una lista muy completa en http://www.phpframeworks.com.

Sé que la mayoría de los desarrolladores actuales ya las utiliza pero todavía hay quien hace sus programas “desde cero” y para ell@s va dedicado este artículo.

Si desean ver tutoriales y ejemplos de código, simplemente escojan un Framework y busquen alguna página sobre programación con ese Framework.

Actualmente yo utilizo CakePHP y CodeIgniter.

How to make a trigger for an autoincrement field without using a generator

Sometimes we need to make an autoincrement field (as in the primary key of a table) but we know that such table won’t have a concurrent use, so we don’t want to use a generator to get the values.

For such situations i use this trigger, obviously, it must be a BEFORE INSERT one:

CREATE TRIGGER DATOS_BI FOR DATOS
ACTIVE BEFORE INSERT
AS
BEGIN
SELECT COALESCE(MAX(ID),0) + 1 FROM DATOS  INTO NEW.ID;
END

Where ID is the primary key field and DATOS is the name of the table.

The COALESCE function is for the case when there are not rows in the table, and the MAX function returns NULL, so COALESCE returns 0 in that case.

¿LAMP o LAFP?

Hace ya algunos años se creó el acrónimo LAMP para definir a un servidor con una configuración de Linux, Apache, MySQL y PHP donde una vez configurados todos los servicios, funcionaba como un servidor de aplicaciones web: despachando páginas web dinámicas creadas a partir de datos guardados en la base de datos MySQL, procesados por el lenguaje de scripts PHP y enviados por el servidor http Apache, todos estos programas bajo el sistema operativo Linux.


Ha sido una fórmula muy exitosa sobre todo para la combinación AMP, ya que hay veces en que se cambia de sistema operativo, utilizando Windows o MacOSX en lugar de Linux, y dando lugar a nuevos acrónimos como WAMP o MAMP. De hecho existen paquetes de software que se distribuyen bajo esos nombres y que sirven para instalar conjuntamente tales aplicaciones en Windows y en MacOSX, respectivamente. Como mencioné antes, la fórmula (AMP) ha dado lugar a muchos desarrollos de software, por ejemplo, manejadores de contenidos (CMS) como Drupal, Mambo, WordPress, Xoops, etc.
MySQL ha demostrado ser una buena base de datos aunque tiene algunos detalles con respecto a su doble licenciamiento, falta de características avanzadas en su versión libre y algunas inconsistencias en los datos y validaciones de fecha, por ejemplo.

Sus bondades ha sido que gracias a que ha estado tanto tiempo en el mercado como software libre, por lo que hay mucho conocimiento sobre su uso y muchas aplicaciones que ayudan a administrarla.
Sin embargo esto no necesariamente indica que es la base de datos a usar en aplicaciones web con PHP, ya que existen otras opciones, específicamente me refiero a Firebird.

Firebird, por su licencia y características avanzadas, madurez, estabilidad y eficiencia es una base de datos ideal para el desarrollo de aplicaciones web, sean manejadores de contenidos para portales, aplicaciones administrativas, para negocios, sistemas de información o cualquier otro tipo de aplicación.


Firebird permite hacer más fáciles los desarrollos ya que con sus triggers y procedimientos almacenados, puede dejarse buena parte de la lógica de la aplicación dentro de la base de datos, haciendo que los programas realizados con PHP sean más sencillos en su programación y separando la lógica de la presentación. Si se utilizan además otros componentes de software para PHP, por ejemplo Smarty, se puede llegar a separar la presentación de los datos, de la lógica y acceso a lso datos en dos archivos PHP por documento html.

Tal vez un reto importante para que Firebird logre establecerse al nivel de MySQL dentro de distribuciones de software como LAMP, WAMP ó MAMP, es que se empiecen a migrar algunas aplicaciones diseñadas para LAMP para que funcionen con Firebird, algo así como LAFP. Muchas de las aplicaciones LAMP actuales –sobre todo las que están programadas usando clases y POO- permiten cambiar de manejador de base de datos creando archivos que contienen las instrucciones SQL básicas de cada base de datos, y especificando en la configuración del sitio o aplicación, cuál base de datos se utilizará. Generalmente vienen configuradas de inicio para usar MySQL, por lo que si se cuenta con el archivo para utilizar Firebird, solamente hay que especificarlo, y de otra manera hay que crear el archivo con las instrucciones específicas para Firebird, tarea no del todo fácil y que debe ser realizada por programadores especialistas en Firebird.

Creo que es cuestión de tiempo y de esfuerzo de los programadores para desarrollar los programas necesarios para que muchas aplicaciones LAMP se vuelvan LAFP y permitan aprovechar las bondades de eficiencia, licenciamiento y estabilidad que da Firebird.

Aplicando filtros a los datos con FIBPlus e IBDAC

Dos opciones de conectividad para Firebird en Delphi son los componentes FIBPlus de Devrace y los IBDAC de DevArt.

Ambos proveen de propiedades y métodos que permiten modificar de manera fácil la sección WHERE de las instrucciones SQL de consulta, y que otros conjuntos de componentes no traen.

Empezaré con los FIBPlus. Cuentan con una propiedad llamada Conditions que permite agregar criterios de búsqueda de manera fácil, vamos a un ejemplo directamente:

Si tenemos la tabla CUENTAS donde queremos aplicarle un filtro
en base al campo NIVEL, de tipo INTEGER, y deseamos obtener todas las cuentas de nivel 1, entonces podemos crear
la condición NIVEL=1 ya sea en modo de diseño, haciendo click en la propiedad Conditions del componente pFIBDataset:

Después en el código podemos activar o desactivar esa condición en específico, con este código:

pFIBDataset1.Close;
pFIBDataset1.Conditions.ByName(‘NIVEL’).Enabled := true;
pFIBDataset1.ApplyConditions(false);
pFIBDataset1.Open;

Como se aprecia, es muy sencillo el uso de Conditions, simplemente se activa la condición y se debe ejecutar el método ApplyConditions para que se modifique el SQL. El parámetro de ApplyConditions define si se abre el dataset, lo cual por claridad en código siempre trato de ponerlo en falso y posteriormente hacer un Open al dataset -simple cuestión de gustos-.

En IBDAC, es un poco distinto, ya que se hace utilizando dos métodos de IBCQuery: DeleteWhere y AddWhere. Con DeleteWhere se eliminan las condiciones y con AddWhere se agregan una a una los criterios de filtrado. Con el mismo ejemplo y usando IBDAC, quedaría así el código:

IBCQuery1.Close;
IBCQuery1.DeleteWhere;
IBCQuery1.AddWhere(‘NIVEL=1′);
IBCQuery1.Open;

Ambos conjuntos de componentes son muy buenos para conectarse a Firebird desde Delphi, y estas facilidades ayudan mucho en los desarrollos ya que permiten hacer modificaciones al vuelo a la sección WHERE de las instrucciones SQL de los datasets.