Archivo de la categoría: Software

Merges un poco más inteligentes para C#

Las operaciones de merge son muy comunes en los sistemas de control de versiones distribuidos, y si hay muchos cambios a nivel de pocos ficheros (equipos trabajando en una misma funcionalidad) podemos tener muchos conflictos. Para ayudar a mejorar la productividad en estas operaciones ayer hemos anunciado la disponibilidad a todo el público de la beta de SemanticMerge.

La idea es simplificar la resolución del conflicto entendiendo el código, resolviendo de manera automática aquellos en los que sea posible y permitir al usuario, de manera sencilla, encargarse de los conflictos restantes. En este artículo veremos de un vistazo la herramienta sus características, los casos que cubrimos y cómo la hemos desarrollado.

Una interfaz sencilla

La herramienta, formada básicamente por un panel donde se muestran los conflictos y diferencias, y un visor de código, permite por una parte resolver conflictos, y por otra ver en detalle los cambios sucedidos en cada fichero respecto a la base.

Para ayudar al usuario, cada conflicto tiene, en la cabecera, un campo identificado por una letra y un color por cada cambio que lleven al conflicto, en el ejemplo, un cambio concurrente en un método.

Semantic Merge tool

La magia

Para poder mostrar estos conflictos y resolver de manera automática aquellos en los que sea posible, analizamos los ficheros que el usuario nos pasa por parámetros, o a través de la pantalla inicial, si iniciamos sin parámetros (origen, destino y base).

Una vez hemos leído los ficheros y comprobado que no haya errores de análisis, creamos, para cada uno, un árbol semántico, similar a la ventana de clases que se puede ver en Visual Studio.

Semantic tree

Ya con estos árboles, comparamos el origen y el destino con la base para obtener lo que denominamos un árbol de diferencias. Finalmente comparamos estos árboles de diferencias para obtener los posibles conflictos y las diferentes formas de solucionarlos.

Escenarios

Hemos empleado cientos de horas de análisis, y procesado millones de repositorios para obtener las operacions y los conflictos más comunes, entre los que destacan:

  • Movidos divergentes: Si estamos haciendo refactor de nuestro código y movemos a diferentes partes del mismo (desarrollador A los prefiere por orden alfabético y desarrollador B los prefiere por orden de scope) detectamos el cambio y damos al usuario la opción de elegir.
  • Movidos/borrados: En caso de que un elemento (método, clase…) se haya movido en origen y se haya borrado en destino, lo detectamos y damos al usuario la opción de conservar el movido o el borrado.
  • Movidos + cambiados: En el caso de que un desarrollador mueva un método a otra clase y otro realice cambios en el mismo, se detectará automáticamente, y no habrá conflicto :)

Hay mucho más, disponible en semanticmerge.com

Integración

De momento, tenemos tutoriales sobre cómo integrarlo en Git, PlasticSCM, TFS y Perforce, y pronto deberíamos tener para Mercurial y SVN. Si usas otro sistema de control de versiones, avísanos!

Personalización

Mediante los parámetros de entrada, podemos especificar una herramienta de diff y merge personalizada, a través de los parámetros -emt y -edt de entrada. Además se puede especificar el tipo de fichero que estamos procesando aunque no tenga la extensión adecuada mediante el parámetro -t. En estos momentos el único lenguaje de programación soportado es C#, así que en este caso el único valor válido será text/csharp.

One more thing: Diferencias semánticas

Otra de las cosas que incorporamos es una herramienta de diff, que dados dos ficheros nos permite obtener las diferencias entre ellos.

difftool-included

Cómo se hizo

Aunque la idea ha estado en fase de análisis y diseño varios años, el desarrollo principal del proyecto se ha llevado a cabo en los úitimos 6 meses, en el que una buena parte del equipo de Códice ha estado implicada. Hemos estado divididos en dos grupos, uno encargado de las operaciones de merge y del backend de la herramienta, y otro grupo, que hemos estado cubriendo el diseño y la usabilidad de la herramienta.

Además, llevamos varias semanas usando la herramienta como herramienta de merge por defecto de manera interna, y las primeras betas privadas que distribuimos han tenido una acogida muy buena por parte de los voluntarios.

Bajo el capó

El lenguaje usado para todo el desarrollo de la app es C#, de ahí nuestro interés con que sea el primer lenguaje de programación soportado (llevamos semanas probando la herramienta a nivel interno).

La interfaz está desarrollada en WPF con algunos toques de Windows Forms, y para la ventana sin marco usamos la integración con Windows a través de Windows.Shell.

Las herramientas utilizadas han sido PlasticSCM como control de versiones, Visual Studio 2010 – 2012 como entorno de desarrollo y Blend 4 como herramienta de diseño de interfaces,

Pasos adicionales

Estamos en fase beta, con lo cual hay muchas cosas que pulir, además seguimos trabajando en mejorar la herramienta, la usabilidad, el diseño, la velocidad, así como el soporte para lenguajes adicionales y escenarios más complejos. Para ello hemos habilitado un portal en uservoice para recibir feedback de nuestros usuarios.

Desarrollando para Windows Phone 8, muchos errores y algún acierto

Este fin de semana he tenido la ocasión de desarrollar una pequeña aplicación de tareas para Windows Phone 8 para el concurso de desarrollo IAppYou. Como todo desarrollo, no ha estado libre de errores, así como de algún acierto que me gustaría repetir en el futuro, así que más que hablar de características o de cómo pasar información entre dos páginas, me pareció interesante compartir los aciertos, pero sobre todo, los errores.

Sigue leyendo

Cómo configurar una máquina virtual de SQL Server 2012 en Azure

Con la última actualización de Azure, a la manera clásica de trabajar con SQL en la nube se le agrega una segunda opción, más potente, ya que nos permite contar con una máquina virtual completa con Windows Server a la cual podemos acceder remotamente, ajustar los servicios a nuestras necesidades, o instalar el software necesario para nuestra infraestructura.

Esta opción requiere algo de configuración, y este artículo pretende ser un pequeño resumen de temas a tener en cuenta a la hora de realizar la puesta a punto de este servicio:

  • Se puede crear la máquina virtual o bien desde línea de comandos o desde el portal de Azure. Para ello es necesario habilitar la característica, que en estos momentos se encuentra en fase Preview. Se ha de especificar que se trata de SQL Server 2012 Evaluation Edition, aunque se cuenta también con la edición 2008 R2.
  • El proceso de aprovisionamiento (copiar, instalar e iniciar la máquina por primera vez) tarda un rato, ya que tiene que crear los discos, copiar la información, y realizar una primera configuración.
  • Al realizar el aprovisionamiento, se configura automáticamente un endpoint para la conexión por RDP, pero es necesario habilitar otro para el puerto 1433 si queremos tener acceso remoto a la base de datos, esto se hace desde la vista de endpoints dentro del panel de la máquina virtual.
  • La máquina tiene el firewall activado por defecto, así que es necesario crear una regla para que permita el paso al puerto 1433 definido antes, la regla debe estar bajo Inbound Rules ya que se desea permitir conexiones entrantes.
  • Desde SQL Server Configuration Manager, habilitar las opciones Named PipesTCP/IP para poder acceder remotamente.
  • A no ser que se configure la máquina virtual para que forme parte de un dominio, será necesario activar la autenticación mixta (Windows y SQL Server) y crear un nuevo usuario para acceder remotamente, estableciendo los permisos adecuados. Ambas operaciones se realizan desde SQL Server Management Studio.
  • Si todo ha ido bien, se podrá realizar la conexión a la recién creada instancia desde un Management Studio local (disponible en el Centro de descargas de Microsoft)

La explicación completa, más ampliada, se puede encontrar en el Blog del equipo de Windows Azure

Sinatra, un framework web para Ruby

sinatra logo

Ruby es un lenguaje de programación que se ha hecho tremendamente conocido (de hecho es el lenguaje más usado en los repositorios de GitHub en estos momentos), Es un lenguaje dinámico y orientado a objetos que es sencillo de aprender. Además, posee diversos frameworks que lo convierte en un lenguaje potente para desarrollar aplicaciones web.

Uno de estos frameworks toma el nombre del célebre artista Frank Sinatra. Se usa en la actualidad por empresas como la BBC o la propia GitHub. Es tremendamente potente y bastante más sencillo que Ruby On Rails, más conocido y complejo. En este artículo veremos una brevísima introducción a qué es trabajar con Sinatra.

Instalación

Lo primero que necesitamos es una instalación de Ruby, para lo cual tenemos varios enlaces en su página oficial dependiendo de nuestro sistema operativo. Una vez instalado ruby podremos agregar nuevos paquetes usando RubyGems, y deberemos ejecutar el siguiente comando desde nuestra consola:

$ gem install sinatra

Descifrando el Hola Mundo

El hola mundo que nos ofrece el framework es muy sencillo, y es lo que podemos encontrar en la página principal. Acudimos a una carpeta cualquiera de nuestro sistema, y creamos un fichero llamado hi.rb:

require 'sinatra'

get '/hi' do
  "Hello World!"
end

Para ejecutar esta aplicación solamente tendremos que escribir el siguiente comando en nuestra terminal:


$ ruby -rubygems hi.rb
== Sinatra has taken the stage ...
>> Listening on 0.0.0.0:4567

A continuación se cargará el servidor de desarrollo de ruby, y solamente tendremos que acudir a localhost:4567 y ver nuestra página en funcionamiento.

El primer valor que se muestra es el comando HTTP al que responde (si recordamos este artículo los diferentes comandos HTTP son get, post, put, delete… ) con lo cual podemos hacer que nuestra aplicación responda a una petición en concreto, lo cual nos puede ser de gran utilidad si estamos desarrollando cualquier tipo de servicio web.

Además de mostrar código, podemos hacer uso de los diferentes motores de visualización que soporta. Uno de ellos se conoce como erb (acrónimo de embebed ruby), y permite tener en una página HTML código ruby.

Para ello editamos nuestra aplicación y agregamos el siguiente código:

...

get '/hello/:id' do
  @name = params[:id]
  erb :hello
end

Además necesitamos crear una carpeta llamada views (que contendrá las vistas de nuestra aplicación) y agregar el fichero, que tendrá extensión erb.



</pre>
<h2>Hello</h2>
<pre>


Esto no es del todo cómodo ya que nos obliga a repetir el código de marcado para cada vista que queramos tener en nuestra aplicación, sin embargo lo que podemos hacer es tener una plantilla que inserte cierto código antes y después de la vista, para lo cual usamos un fichero llamado layout.erb que contendrá la estructura básica del sitio, y actualizaremos el código para mostrar esta diferencia.


    
    

 


El código anterior contiene una etiqueta, yield, que especifica donde se ha de cargar el código específico de nuestra vista. El fichero de la vista actualizado contendría la siguiente información:

</pre>
<h2>Hello</h2>
<pre>

Con esto seríamos capaces de crear un portal básico que responda a ciertos parámetros de entrada.

Pasos adicionales

Tenemos mucho más que poder agregar a nuestra app: Modelos de datos con DataMapper, autorización con Warden, posibilidad de devolver los resultados en formato json (y usarlo entonces como un servicio web)… Las posibilidades son infinitas, pero todo comienza con get “/hi”….

Más información

Repositorios para versiones antiguas de Ubuntu

Una cosa que nos puede ocurrir es que estemos trabajando en una solución basada en Ubuntu y que, por las razones que sean, no sea posible/viable su actualización.

El problema radica en que los repositorios que se emplean para actualizar los paquetes van cambiando con el tiempo, con lo cual si seguimos usando una versión antigua llegará el día en que no pueda acceder al mismo.

La solución pasa por editar el fichero /etc/apt/sources.list, y sustituir la dirección que tengamos por la siguiente:


http://old-releases.ubuntu.com/ubuntu/

.En el momento de la redacción de este artículo se encontraban disponibles repositorios hasta la versión 4.10 de Ubuntu.

Imagen: CrystalXP 

Compilando C++ desde la consola de comandos de Visual Studio

Es posible que en alguna ocasión queramos compilar un fichero individual para comprobar el funcionamiento de una función o de un algoritmo, y abrir Visual Studio, cargar un proyecto y similar se nos antoje demasiado engorroso, una posible solución es usar la consola de comandos de visual studio, y compilar de una manera rápida. Para este artículo compilaré un fichero C++ nativo.

Para ello, si tenemos Visual Studio 2010 (Professional en mi caso), puedes  encontrar, dentro de la carpeta de Visual Studio 2010/Visual Studio Tools, una utilidad llamada Visual Studio Command Prompt (2010) que cargará el entorno de desarrollo.

Una vez ahí, usando los comandos clásicos (cd carpeta) o arrastrando la carpeta a la consola de comandos, nos situamos en el directorio donde queramos realizar la compilación y escribimos:

 \> cl /EHsc nombreDelFichero.cpp 

Donde cl es el compilador, y EH permite habilitar el manejo de excepciones. Esto debería realizar la compiilación correspondiente y generar un fichero llamado nombreDelFichero.exe

Si estás acostumbrado (por otros lenguajes u otros sistemas operativos) al uso intensivo de la consola de comandos, no has de renunciar a sus ventajas en la plataforma Windows/VS.

Más información (en inglés):

Configurando el APN de internet con Simyo en Windows Phone 7.5

Hace unos días tuve la suerte de conseguir un Nokia Lumia 800 desarrollando apps para Windows Phone, pero como mi tarifa actual de datos no era compatible y no quería comprometer la otra línea con una potabilidad o un cambio de contrato, decidí comprar una tarjeta con Simyo.

Al llegar la tarjeta e introducirla en el teléfono, no detectó los ajustes de conexión, con lo cual, tras un buen rato de búsqueda en la red, encontré la información que necesitaba.

Pasos para configurar Internet

  1. Introducir la SIM, encender el móvil, y activar la tarjeta (si has hecho alguna llamada y te han cogido el teléfono (es decir, se ha producido gasto), está activa).
  2. Navega hasta el menú de Configuración > Datos Móviles
  3. En él, has de asegurarte que están activadas las siguientes opciones:
    • Conexión de datos: Activada
    • Opciones de roaming de datos: Activar roaming
    • Conexión 3G: Activada
    • Selección de red: automático
  4. Pulsa en agregar apn (o editar apn si ya lo has intentado anteriormente), e introduce el siguiente dato:
    • APN: gprs-service.com

Es importante destacar que hemos activado la opción de activar roaming, con lo cual debemos recordar DESACTIVARLA cuando viajemos al extranjero ya que podemos incurrir en costes adicionales (y no precisamente pocos).

Actualización:

Al finalizar los pasos verás el icono de un triángulo en el área de notificación. Este icono indica que estás en Roaming (algo normal, ya que lo hemos habilitado en el paso 3).

Esto no indica que el operador te vaya a cobrar como si estuvieras en dicha zona, y lo puedes comprobar en tu zona de cliente de Simyo. Puedes ver el significado de los iconos del área de notificación aquí: ¿Qué significan los iconos del teléfono?

Code 52 project. Un proyecto a la semana

Una de las cosas que nos pueden echar para atrás al empezar un proyecto de software libre o intentar colaborar con uno es que nos cueste encontrar proyectos vivos o no estar seguro qué hacer.

Con este problema en mente, he encontrado esta comunidad que tiene un objetivo muy simple, conseguir desarrollar una aplicación en una semana de manera colaborativa.

La idea es conseguir que los desarrolladores se involucren en proyectos open source, dar apoyo a áreas que necesiten soporte y crear una comunidad alrededor de estos proyectos. Podríamos definirlo como un acelerador de proyectos open-source.

Para elegir la aplicación a desarrollar se emplea Uservoice, y la propia comunidad da el feedback sobre qué se puede desarrollar. Se emplea Jabber para organizar el equipo y GitHub para control de código fuente. El tiempo máximo de cada proyecto es de 1 semana, para poder hacer proyectos pequeños, mantener el interés y poder tener nuevos retos cada poco tiempo.

Espero este año poder sacar algo de tiempo para contribuir al proyecto, te animo a que , si te interesa contribuir a algun proyecto, te unas o envíes alguna idea.

Más información

Hola mundo con Kinect SDK

Kinect, originalmente concebido como un accesorio para la XBOX, ha superado las expectativas de la consola al convertirse en un dispositivo que ha cambiado la manera de interactuar con el ordenador.

En este artículo veremos cómo ha pasado de ser un mero accesorio a una plataforma para la que desarrollar proyectos interesantes. Podremos, además ver un primer ejemplo de código que usa la plataforma.

Un poco de historia

La historia de Kinect se remonta a noviembre de 2010, cuando es presentado en junio de 2009 en el evento E3 como “Project Natal”. Posteriormente en noviembre de 2010 sale al mercado como accesorio de la XBOX360. Contaba con una conexión USB que no se había protegido, lo que hizo que la comunidad de desarrolladores le prestase mucha atención, obteniéndose el primer driver de vídeo para Linux a finales de ese mismo mes.

A partir de ese momento la comunidad empezó a trabajar en este inquietante dispositivo hasta el punto de tener drivers bastante completos en poco tiempo. Microsoft decidió reaccionar lanzando una primera beta del SDK no comercial en Junio de este año (que implica que no podemos usar Kinect para vender aplicaciones ni para publicidad, de momento). Esta beta se ha actualizado el pasado Noviembre, y está previsto para principios de 2012 una nueva actualización de caracter comercial.

Nuestro primer Hola Mundo

Para poder trabajar con el SDK necesitamos Visual Studio Express, disponible de manera gratuita en la web de Visual Studio. Una vez instalado, podemos descargar e instalar el SDK, para poder empezar a trabajar con la Kinect.

El primer paso consiste en agregar la referencia al espacio de nombres que se muestra a continuación:

using Microsoft.Research.Kinect.Nui;

Una vez esté agregada, podemos escribir nuestro primer trozo de código. El código a continuación, pese a no estar completo por parámetros de inicialización muestra varias cosas:

//Inicializar el sensor
nui = Runtime.Kinects[0];
nui.Initialize(...);

nui.VideoStream.Open(...);
PlanarImage planarImage = nui.VideoStream.GetNextFrame(1000).Image;

//Cerrar la conexión
nui.Uninitialize();

La primera es que tenemos la posibilidad de contar con varios sensores Kinect, y que en este ejemplo seleccionamos solamente el primero. Posteriormente inicializamos el sensor.

El siguiente paso consiste en abrir una conexión con el flujo de vídeo, esperar 1000 milisegundos y recibir la siguiente imagen. Esta imagen la podremos procesar en nuestro código de la manera que consideremos más oportuna.

Es importante destacar que cuando terminemos de trabajar con Kinect cerremos la conexión llamando al método Uninitialize.

Para ver ejemplos más completos y complejos, en el SDK que enlazo al final del artículo puedes encontrar varios ejemplos de código funcionales.

¿Qué más incluye el SDK?

Lo que se ha visto hasta ahora es cómo obtener una imagen, sin embargo el SDK de Kinect tiene varias características adicionales:

  • Drivers (para que el PC reconozca la Kinect): Esto puede sonar bastante obvio, pero necesitamos que el ordenador reconozca todas las capacidades del dispositivo, las cámaras y los micrófonos.
  • NUI: Se engloban en este área todos los métodos relacionados con las cámaras
    • Imagen de la cámara: Lo que hemos captado antes, una imagen de lo que está captando la cámara principal en estos momentos.
    • Datos de profundidad: Es también una imagen, pero en escala de grises que es capaz de detectar la profundidad de una figura.
    • Seguimiento de esqueleto: Es una de las características más destacadas de Kinect, ya que es capaz de detectar 20 articulaciones de 2 personas diferentes orientadas al sensor.
  • Speech: Por último y no menos importante, este área engloba todos los métodos relacionados con la escucha y comandos de voz.
    • Captura de audio con detección de ruido: El hecho de que Kinect tenga 4 micrófonos permite aislar el ruido y detectar la fuente de las órdenes concretas.
    • Comandos de voz: Además, usando la tecnología de reconocimiento de voz, se pueden crear diccionarios personalizados para que el programa reconozca nuestras órdenes.

Conclusiones

Si tienes una Kinect te animo a que la desenchufes de la consola, la conectes a tu ordenador, descargues el SDK y descubras cómo funciona. Es un accesorio interesante que puede tener mucho futuro en entornos de hogar o incluso corporativos, por no hablar de temas relacionados con robótica.

Recursos:

Console.WriteLine("Felices Fiestas a todos");

¿Qué es un ORM y por qué nos interesa?

En el desarrollo de una aplicación suelen estar involucradas dos entidades diferentes, por una parte  el código que mueve la aplicación y por otra los datos que se manejan. Con el tiempo estas dos entidades han evolucionado de manera diferente, y el acceso a los datos desde los programas se ha vuelto una tarea en ocasiones, complicada. Los sistemas de Mapeo Objeto-Relacional u ORM ayudan a combatir esta complicación.

En este artículo se verá una definición de estos sistemas, así como algunos ejemplos de motores ORM empleados en la actualidad de manera comercial.

Origen de los conflictos: Las bases de datos relacionales

En un principio los programas accedían físicamente al disco para escribir los datos, algo que implicaba que el programa tuviese que implementar toda la lógica de una base de datos para permitir agregar, modificar o eliminar datos.

Con el tiempo se han desarrollado lo que se conoce como sistemas de bases de datos relacionales, que permiten mantener entidades (Artículo, Ficha médica o Factura), sus respectivas relaciones (Una ficha médica corresponde a un solo paciente) y sus atributos (Una ficha médica contiene fecha de entrada, fecha de salida, síntomas… etc).

Estos sistemas poseen además una interfaz para acceder a ellos llamada SQL o Structured Queried Language (lenguaje estructurado de consultas) que permiten hacer peticiones de una base de datos usando una notación muy similar a lenguaje natural, como muestra el siguiente ejemplo:

    select nombre,apellidos from pacientes where id_paciente = 1;

Este código tendría como objetivo hacer una petición a la base de datos pacientes, buscar el identificador 1 y devolver la fila (o filas) resultante de la petición.

Estos sistemas permiten mantener cierta integridad de los datos, y usando ciertas reglas se pueden definir tablas y restricciones como muestra el siguiente ejemplo:

    create database pacientes(
        id_paciente int,
        nombre varchar(80),
        apellidos varchar(120)
    );

Entre los sistemas gestores de bases de datos más utilizados se encuentran:

  • SQL Server de Microsoft: Es la solución por excelencia del stack Microsoft. Existen al menos una docena de ediciones diferentes dirigidas a un público específico, desde la versión Express, gratuita y con limitaciones (1 GB de consumo de memoria y 4 GB de capacidad) hasta la Datacenter, que permite el uso de 256 núcleos (poca cosa…)  y dirigida a un mercado empresarial.
  • mySQL: Anteriormente propiedad de Sun Microsystems y con doble licencia (libre para proyectos compatibles con la licencia GNU GPL y privativa para el resto de los proyectos, que implica la compra de una licencia), actualmente propiedad de Oracle, es la base de datos más empleada por la comunidad OpenSource (+6.000.000 de instalaciones).
  • PosgreSQL: Empleada en ámbito docente aunque no por ello menos potente que la anterior, libre (licencia BSD) y mantenida por la comunidad de desarrolladores.
  • Oracle: Considerado por muchos uno de los sistemas de bases de datos más complejos, usado fundamentalmente en el mercado de servidores empresariales donde su hegemonía ha sido casi total hasta hace poco, por la competencia del resto de sistemas antes mencionados. Posee también una versión Express (gratuita)

Antes de los ORM

Antes de la aparición de estos sistemas las consultas se tenían que realizar a mano dentro de las propias aplicaciones, con lo cual la ventaja de los lenguajes orientados a objetos se perdía, ya que había que crear una petición a la base de datos de manera manual (y específica para cada sistema, ya que no todos los gestores de bases de datos tienen la misma implementación del lenguaje SQL).

Para muestra, un ejemplo que se puede encontrar en la documentación del lenguaje PHP:

// El siguiente código puede ser proporcionado por el usuario, a modo de ejemplo
$firstname = 'fred';
$lastname  = 'fox';

// Formular Consulta
// Este es el mejor método para formular una consulta SQL
// Para más ejemplos, consulte mysql_real_escape_string()
$query = sprintf("SELECT firstname, lastname, address, age FROM friends
    WHERE firstname='%s' AND lastname='%s'",
    mysql_real_escape_string($firstname),
    mysql_real_escape_string($lastname));

// Ejecutar Consulta
$result = mysql_query($query);

// Comprobar resultado
// El siguiente código muestra la consulta enviada a MySQL y el error ocurrido. Útil para debugging.
if (!$result) {
    $message  = 'Invalid query: ' . mysql_error() . "\n";
    $message .= 'Whole query: ' . $query;
    die($message);
}

// Usar resultado
// Si intenta imprimir $result no será posible acceder a la información del recurso
// Una de las funciones mysql result debe ser usada
// Consulte también mysql_result(), mysql_fetch_array(), mysql_fetch_row(), etc.
while ($row = mysql_fetch_assoc($result)) {
    echo $row['firstname'];
    echo $row['lastname'];
    echo $row['address'];
    echo $row['age'];
}

// Libere los recursos asociados con el resultset
// Esto es ejecutado automáticamente al finalizar el script.
mysql_free_result($result);

Como se aprecia, es necesaria una adaptación de los datos a la aplicación además del aprendizaje del lenguaje de gestión de las bases de datos.

El mapeo relacional

La ventaja principal de estos sistemas es que reducen la cantidad de código necesario para lograr lo que se conoce como una persistencia de objetos

Esto permite además, lograr una integración con otros patrones como el Modelo-Vista-Controlador, donde el modelo puede ser este objeto. En el ejemplo siguiente se muestra cómo se define un modelo usando Doctrine, uno de los sistemas ORM más usados para PHP, donde se muestra el tipo usuario y los campos username y password. Será el propio sistema el que se encargue de convertir esta información a tablas SQL y a realizar el procesamiento, mientras que nosotros trabajaremos fundamentalmente con objetos

class User extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('username', 'string', 255);
        $this->hasColumn('password', 'string', 255);
    }
}

Este otro ejemplo, que usa ADO.net Entity Framework, el ORM de .NET, se pueden apreciar también la facilidad para establecer propiedades a campos, como en este caso establecer obligatoriedad.

namespace MyApp.Models
{
    public class User
    {
        public int Id { get; set; }
        [Required] public string UserName { get; set; }
        [Required] public string Password { get; set; }
    }
}

Motores de persistencia

Estos son algunos motores de persistencia a los que he podido echar un vistazo, algunos forman parte de frameworks más potentes (Como Core Data en el caso de iOS) y otros son independientes (como el anteriormente mencionado Doctrine), aunque todos comparten la misma base, dar un modelo de persistencia de objetos.

  • C#: Entity Framework es un conjunto de APIs que proporcionan acceso a datos en .NET. Se distribuye junto con el .NET framework y tiene 3 posibles modos de trabajo, Database First, Model First y Code First, más información en el sitio oficial
  • Java: Hibernate es una herramienta de mapeo relacional para la plataforma Java, que emplea atributos declarativos mediante XML o anotaciones, se distribuye con licencia GNU/LGPL y posee una versión para .NET llamada nHibernate, más información en el sitio oficial
  • Objective-C: Core Data (Parte de la API de Cocoa), proporciona la capacidad de persistencia mediante serialización para dispositivos con Mac OSX o iOS, más información en la guía de programación de Core Data
  • PHP: Doctrine, mencionado anteriormente, un proyecto independiente, con la especialidad de que posee su propio lenguaje para el acceso a datos, llamado Doctrine Query Language. Más información en el sitio oficial
  • Ruby: ActiveRecord (Parte de Ruby On Rails), genera un modelo de persistencia basado en las clases, proporciona acceso a datos en el framework y es la clase base para los modelos del mismo. En la API de Rails se puede ver el sistema en detalle.

Conclusiones

Los modelos ORM proporcionan grandes ventajas a proyectos que empiezan, ya que permiten tener acceso a los datos de una manera sencilla y rápida, además de proporcionar cierta abstracción sobre la base de datos que se encuentra por debajo.

Es cierto que no es la única manera de acceder a los datos, ya que soluciones específicas habitualmente tendrán mejor rendimiento, ya que no se hace una transformación de las ordenes y de los datos.

Finalmente creo que se deben conocer, y tenerlos como alternativa o como sistema principal. Como siempre, todo depende del uso.