desarrollo

Introducción a la programación en Facebook IV

En la primera parte vimos una introducción a las tecnologías usadas para programar en Facebook. En la segunda, creamos una aplicación, y le añadimos algún Social Plugin y etiquetas Open Graph. En el tercero, nos zambullimos en el SDK JavaScript, y autenticamos al usuario en nuestra aplicación, le solicitamos permisos extra, publicamos en su muro, y mostramos algún diálogo.

Hasta ahora hemos trabajado sobre una aplicación que funcione sobre nuestra página web. Sin embargo, como ya sabes, Facebook nos da más opciones: aplicaciones en móviles, y aplicaciones dentro de Facebook. Hoy vamos a ver cómo crear una aplicación dentro de Facebook. Esto se hace mediante un canvas (iframe) en Facebook en el que se mostrará la página web que deseemos. Por supuesto, en esa página web podremos gestionar JavaScript, CSS y HTML como queramos.

Google Chrome ahora con Web Sockets

La noticia del día en cuanto a desarrollo web sin duda ha sido la implementación de Web Sockets en Chromium. una tecnología de comunicación bidireccional para aplicaciones web.

Los Web Sockets son un borrador del W3C que, mediante una conexión TCP, permiten realizar fácilmente un Server Push, es decir, una petición iniciada desde el servidor central. Es un cambio notable en la programación web, hasta ahora dirigida por peticiones iniciadas desde el cliente.

Liberado Zend Framework 1.8.4 y más

A través del Developer Center de Zend me entero de que hoy se ha liberado la última versión estable de Zend Framework. Esta release de mantenimiento ha corregido más de 50 tickets abiertos en 20 componentes distintos. Con un poco de suerte ya podremos disfrutar de la rama 1.8 sin tantos workarounds para salir del paso.

Por lo pronto, y si utilizáis svn, ya tardáis en hacer un svn up :)

A finales del próximo mes de julio lanzarán la versión 1.9.0. ¿Qué está previsto que traiga? Pues bastantes cosas, como por ejemplo un lector de feeds mucho más completo y elaborado, enrutador para peticiones de tipo REST, soporte LDAP, patrón factory en Zend_Log, etc.

Además, acaban de lanzar también un visor de roadmap que estará activo a partir de ahora para todas las futuras releases. Si bien esta herramienta será muy útil tanto para fieles como para curiosos, no contará con fecha de lanzamiento, pues tal y como explican en su blog, es muy complicado estimar fechas cuando todo el trabajo lo realizan voluntarios en su tiempo libre.

Edit: Acabo de comprobar que además han corregido la creación de controladores en modulos desde la utilidad en línea zf. ¡Bravo! :)

Nueva página web de Torrijos

captura5El pasado día 11 de junio se presentó en el salón de plenos del Palacio de Pedro I la nueva página web del Ayuntamiento de Torrijos. Este momento marcó un punto y aparte en este nuevo portal para el ciudadano. Durante los últimos meses hemos dedicado muchísimos esfuerzos, ganas e ilusión a este proyecto, y creo que hemos logrado nuestro objetivo: Ofrecer una web renovada con contenidos de actualidad que sustituyera a la antigua.

MySQL Workbench – Diseño de bases de datos

A menudo las aplicaciones necesitan almacenar información de forma persistente, de manera que pueda ser capturada más adelante. Cada vez son más las aplicaciones de escritorio que lo utilizan, al igual que aplicaciones web, donde los RDBMS más populares son Microsoft SQL Server y MySQL.Este últmo, es sin duda el sistema de bases de datos rey de Internet. Sin embargo, no sé si os pasará como a mí, que trabajar día a día con él a veces me resulta una tarea desorganizada y costosa. Para mejorar eso surge MySQL Workbench.

¿Pero para qué sirve este programa? Es una herramienta visual de diseño, modelado, creación y mantenimiento de bases de datos.

Hasta ahora yo venía funcionando con herramientas con las que, en conjunto, lograba un resultado similar. Para el modelado entidad relación utilizaba Dia, la aplicación de Gnome para la creación de diagramas, o Umbrello, la solución basada en KDE para modelar diagramas UML. Nunca me acabó de convencer ninguna de estas herramientas, aunque lograban su cometido (A veces veía casi más efectivo dibujar las cajitas directamente con un software de diseño vectorial). Posteriormente, bien de forma automática, bien a mano, generaba el código SQL que definía la base de datos. Finalmente, para el mantenimiento del día a día, empleaba mayormente phpmyadmin.

Muchas aplicaciones, muchos cambios de contexto, y mucha semántica que se pierde al pasar de una herramienta a otra. Mmmm eso no mola. Buscando, encuentro una aplicación que hace tiempo que había visto, pero que había olvidado por completo. Efectivamente, me refiero a MySQL Workbench :) Surge como evolución natural de DBDesigner, de FabForce, pues el equipo de desarrollo está liderado por el fundador de DBDesigner, Michael G. Zinner.

Cosas chulas que podemos hacer desde MySQL Workbench:

  1. Ingeniería inversa de DDL de MySQL. A partir del código SQL, sin mediar el servidor de bases de datos, podemos visualizar toda la información en forma de tablas y diagramas generados automáticamente.
  2. Forward engineer, que lógicamente nos permite crear el nuevo código SQL.
  3. Conexión directa con el SGBDR. Podemos incluso sincronizar modelos.
  4. Soporta triggers y procedimientos almacenados.
  5. Diagramas bonitos y personalizables (Por ejemplo, que los únicos campos mostrados sean las claves).

A continuación, pongo un ejemplo de diagrama generado utilizando la base de datos de ejemplo sakila.

esquema de sakila

¿Dónde consigo esta maravilla? Te estarás preguntando. Sígueme… ¿Y dónde funciona? En Windows, Mac OS X y por supuesto Linux. Por cierto, una pega que le veo: Utiliza GTK++ ;-)

Aviso para usuarios de Ubuntu: Existen paquetes .deb de la versión 5.1 Beta disponibles listos para instalar en Ubuntu. Yo estoy ejecutando Kubuntu 9.04 y me han dado problemas de tipo Segmentation Fault en libglade. He probado a compilar e instalar la versión 5.2 Alpha y por el momento todos los errores han desaparecido.

Zend Framework 1.8.0 Released

¡Qué gran noticia! :) Ha sido liberada la nueva versión de Zend Framework. Como principales novedades nos ofrece la posibilidad de utilizar Zend Tool, la herramienta de consola para hacer el trabajo sucio por nosotros, y además una nueva capa para servicios de computación nube (ugh!) en Amazon.

Desde la famosa aparición de Ruby on Rails en el año 2004, no han parado de aparecer nuevos frameworks de desarrollo implementando las fantásticas ideas alrededor de RoR. En PHP, por nombrar algunos, pronto se hicieron muy populares CakePHP o Symphony. Pero por otra parte tenemos a Zend, la empresa detrás del motor intérprete de PHP (En consecuencia, gozan de un principio de autoridad más que merecido en dicho lenguaje). Corría el año 2005 cuando lanzaron la primera versión de su framework.

Pese a que aun hoy se podría decir que carece de muchas funcionalidades que hace años son comunes hasta en los frameworks más espartanos, a título personal Zend Framework fue el que me cautivó desde el primer momento: Su funcionamiento es totalmente modular. A diferencia de sus competidores, no obliga a dar el salto de la noche a la mañana, sino que permite ir adoptando poco a poco sus utilidades, instalándolas bajo demanda. Lenta pero implacablemente vas cayendo presa de sus encantos, hasta que ya un día te das cuenta de que has dejado de programar en PHP; Ahora programas en ZF :)

Una de las ventajas de que sea tan increíblemente modular es que puedes dar el salto a su sistema MVC poco a poco. Primero empiezas con un bootstrap y controladres básicos, luego vas dominando las vistas y los layouts, hasta que finalmente un día añades modelos de datos, y modificas el enrutador a tu antojo. Todo ello controlando desde el primer momento qué estructura de directorios emplear, o de qué manera funcionará la maquinaria.

No sé a vosotros, pero yo una de las cosas que mas detesto de todas las novedosas herramientas de programación que surgen últimamente es la magia. Sigues los tutoriales y piensas “¡Dios mio! ¡He creado un blog en 10 minutos! Pero no tengo ni idea de cómo“. Y eso no deja buen sabor de boca. ¿Que ocurre si necesitas alterar levemente el funcionamiento de la aplicación que se crea en el tutorial? Pues que sudas tinta y en el peor de los casos vuelves acobardado a tu metodología de siempre. Esto no pasa zon ZF :)

Pero al lío, que mi disertación sobre frameworks se ha alargado. ¿Por qué me emociona tanto la nueva release? Porque, tras varios meses programando con él, acaba de salir el script de consola que permite crear los andamios de tu aplicación (Scaffolding). Pero, como todo en Zend, es totalmente personalizable. Puedes configurar el funcionamiento por defecto del script mediante el Provider y el Manifest.

Además, y cosa que me encanta, esta herramienta ha sido lanzada junto con una nueva arquitectura de aplicaciones: Zend_Application. Básicamente encapsula las funcionalidades del fichero bootstraping en un recurso reutilizable dentro de un objeto. O visto desde otra perspectiva, es el objeto principal con su método main(). Orientación a objetos al poder!

Respecto al apartado de la computación nube… No tengo mucho que comentar. Me gustan las infraestructuras estándar (Como LAMP), y eso de volcar mis recursos en plataformas propietarias, heterogéneas, y sólo en manos de un proveedor, no me gusta nada. Así que por el momento dejo el cloud computing a los gurús de las blackberries.

Facebook como plataforma de usuarios

Facebook es un monstruo que cada día gana más y más adeptos. Por suerte o por desgracia parece que se está convirtiendo en una necesidad para todos los usuarios contar con una cuenta en este sistema. Uno de las razones de su éxito es la de facilitar a los desarrolladores interactuar con su plataforma. Todo comenzó permitiendo el desarrollo de aplicaciones dentro de su web. Ahora ofrecen mucho más. ¿Qué podemos hacer gracias a Facebook?

Lejos quedan aquellos tiempos en los que una página web era autocontenida. Hoy todos entendemos como normal relegar ciertos servicios en manos de terceros, como por ejemplo mapas, vídeos, audios, encuestas o fotografías. Sin embargo hasta ahora ninguna plataforma de usuarios ha llegado a cuajar del todo.

Si bien existe OpenID y su uso está muy extendido, poca gente lo utiliza o entiende cómo funciona, ni siquiera mediante la ayuda de Google y Yahoo! En cambio Facebook, con su conocido Facebook Connect parece estar ganando la batalla.

Facebook Connect

Facebook Connect en funcionamiento

Es un todos ganan:

  1. Facebook, porque hace más necesaria e ubicua su plataforma.
  2. Desarrolladores, porque se agiliza la programación, se invita a participar con facilidad, y se cuentan con fichas más exactas y completas.
  3. Usuarios, ya que no necesitan registrarse en otra nueva página para participar.

La gran pega, como ya se sabe, es la dependencia de terceros para algo tan crítico como son los usuarios. Además que no todo el mundo tiene cuenta en Facebook.

Igualmente curioso es el hecho de que esta misma tecnología consiste básicamente en lo mismo que Microsoft siempre ha querido hacer con Windows Live ID (Anteriormente Microsoft Passport), que no es mas que un servicio de Single Sign-On: Utilizar una misma cuenta para acceder a diferentes servicios.

Pero ahora Facebook no sólo nos ofrece su sistema de autenticación de usuarios, sino que desde hoy también permite añadir un sistema de comentarios sencillo de administrar y sin necesidad de programación. En esto tampoco son pioneros, pues con Google Friend Connect ya podíamos hacerlo.

Con todo esto, si utilizamos Facebook como plataforma de usuarios obtendríamos:

  • Agilidad. En unos minutos tendríamos el sistema de usuarios listo en nuestra web.
  • Exactitud de información. Los datos que los usuarios completan en Facebook suelen ser de bastante calidad.
  • Mayor presencia. Podríamos añadir notas en su muro.
  • Comentarios. Gracias a la nueva herramienta.
  • Red social. Por supuesto los enlaces de usuarios dentro de Facebook puede funcionar dentro de nuestra web.
  • Más participación. Puesto que no es necesario registrarse para participar en nuestra web.

Pero como dije antes, puede resultar un precio demasiado caro.

A título personal, todas las páginas que he creado funcionaban con un sistema de usuarios propio. Tengo bastantes ganas de poner en práctica una visión distinta, y Facebook hoy por hoy me parece la opción más sencilla y con posibilidades de éxito.

Estándar de código en PHP

Los convenios son buenos. Ayudan a resolver siempre de una misma forma situaciones similares. Cada programador/proyecto tiene sus propios convenios de programación. En este artículo voy a contar los mios cuando desarrollo en PHP.

Sangrado y edición

No utilizo el caracter tabulador. En su lugar, empleo 3 espacios. Motivo: El caracter tabulador (t) no se muestra igual en todos los lectores de ficheros.

No utilizo más de 80 caracteres de ancho por línea. Motivo: El código es mucho más legible y cómo de imprimir.

Si una línea excede de 80 caracteres:

preg_match('expresion regular de la muerte larga larga', $cadena, $match);

quizás meto la cadena larga en una variable

$reg = 'expresion regular de la muerte larga larga';
preg_match($reg, $cadena, $match);

o si la cadena es muy larga, concateno las partes

$reg = 'expresion regular de ';
$reg .= 'la muerte larga larga';
preg_match($reg, $cadena, $match);

o si no es tan larga, divido en lineas la función

preg_match('expresion regular de la muerte larga larga',
   $cadena, $match);

¿Y con los ifs de muchas condiciones que sobrepasan los 80 caracteres?

if ($condicion1 && $condicion2 && $condicion3 && $condicion4) {
   // código
}

pasa a ser

if ($condicion1 &&
   $condicion2 &&
   $condicion3 &&
   $condicion4)
{
   // código
}

Bloques de código

Las llaves, para definir bloques de código, siempre las coloco así:

expresión {
   // código
}

salvo que la expresión exceda de 80 caracteres, en cuyo caso lo hago así:

expresión larga
   muy larga
{
   // código
}

En este segundo caso la razón de pasar la llave a la izquierda es poder distinguir dóde empieza el bloque de código. Sin embargo, en el primer caso lo pongo al final de la línea por costumbre.

Nombres

Por supuesto deben ser descriptivos, salvo algunas excepciones, como variables de contadores.

Los nombres de funciones, métodos y clases, siempre procuro ponerlos en CamelCase, esto es, eliminando los espacios y poniendo la primera letra de cada palabra en mayúscula. En funciones y métodos, la primera letra de todas es minúscula, y en el caso de clases, en mayúscula.

Por ejemplo

class Car {
   public function getSpeed() {
   }
}

En el caso de atributos y variables suelo emplear palabras en minúsculas delimitadas por guiones bajos, por ejemplo:

private $main_container;

Las constantes, como no, en mayúsculas.

Y por último, los nombres de ficheros, que los pongo también sustituyendo espacios por guiones bajos, por ejemplo foo_bar.php.

Cadenas de texto

Nunca empotro variables dentro de una cadena entrecomillada. Por ejemplo

"Hola $nombre, bienvenido"

Lo pondría como

'Hola ' . $nombre . ', bienvenido'

Si bien hace unos años la diferencia de rendimiento al utilizar comillas dobles o simples era muy notable, debido a que las dobles permiten interpretar las variables dentro de ellas, hoy día es un obstáculo superado para PHP. En cualquier caso, sigo prefiriendo comillas simples salvo que sea imprescindible.

Nunca separo una misma cadena en varias líneas. En su lugar concateno las partes.

Comentarios

Los ficheros, clases y métodos los documento con comentarios con phpDocumentor.

Para comentar trozos de código utilizo doble barra (//), aunque exceda dos líneas:

// Este comentario tiene dos líneas, pero
// aun así no utilizo comentarios multilínea

Para poner comentarios importantes, por ejemplo, informando de qué me queda por hacer en un código sin acabar, lo pongo con tres barras (///):

/// Terminar la validación de variables introducidas por el usuario

Y para poner avisos importantes con algo que sé que hasta dentro de un tiempo no me volveré a encontrar, pongo:

/// NOTE: recuerda eliminar este método

Miscelánea

Por último, las etiquetas de PHP <?php y ?>, que tan poquito me gustan, las escribo siempre como <?php y ?> salvo en el caso de hacer un echo, que utilizo la forma abreviada <?=$var?>. Esto último está desrecomendado, ya que por ejemplo, daría error la primera línea de un fichero en XML:

<?xml ?>

Además muchos servicios de alojamiento no permiten las etiquetas cortas de PHP.

Y respecto al importado de ficheros, tenemos include(), include_once(), require() y require_once(). Siempre utilizo los terminados en once(), ya que de ese modo puedo llamar varias veces sin preocuparme a un mismo fichero. Además, procuro usar siempre require_once() (Aunque a menudo se me olvida) pues, a diferencia de include, require lanza un error que interrumpe la ejecución. Y no queremos que nuestra aplicación continue la ejecución si falta un fichero importante :)

Algunos estándares

Cada framework y casi cada proyecto tienen su propio estándar. A continuación enumero algunos:

SVG y la web

Los mapas de bits no escalan (Y nunca mejor dicho), por lo que en numerosas situaciones es preferible utilizar imágenes vectoriales. Por ejemplo, los escritorios de Linux ya están permitiendo emplear iconos vectoriales, de modo que se vean siempre bien definidos independientemente de su tamaño o de la resolución de la pantalla. Existen muchos formatos propietarios, pero, como siempre, para garantizar la interoperabilidad es preferible utilizar estándares, y ese es el formato SVG, que es un lenguaje para describir imágenes y aplicaciones gráficas en XML.

En el mundo web es igualmente interesante poder empotrar imágenes dinámicas generadas mediante SVG. Por ejemplo, hace un tiempo quise hacer unos mapas de densidades de población por municipios generados de forma automática para la Wikipedia. En realidad es muy sencillo. En ese caso podemos partir de una imagen con un objeto por cada término municipal, y mediante un editor de SVG (Por ejemplo, Inkscape) editar las propiedades del objeto y establecer como ID el código postal del municipio. De ese modo, podremos acceder mediante DOM al objeto que representa cada término municipal para posteriormente establecer el color de fondo dependiendo de su densidad (Expresiones regulares al rescate).
Mapa de España por provincias generado utilizando PHP y SVG

Y es que a veces nos complicamos mucho la vida, como por ejemplo dibujando a pelo polígonos sobre la API de Google Maps, cuando incluso podemos empotrar directamente imágenes SVG en un mapa de Google.

A día de hoy, la mayoría de los navegadores permiten visualizar directamente imágenes vectoriales SVG dentro de un documento XHTML, pero como a menudo sucede, Internet Explorer no renderiza de forma nativa SVG. ¿Qué podemos hacer en esos casos? Muy sencillo. Convertir dinámicamente a un mapa de bits. En el caso de PHP no he encontrado ninguna biblioteca o clase que permita la conversión de forma eficaz, sin embargo existen utilidades en la línea de comandos a las que podemos llamar para que realicen conviertan al formato deseado (Como el propio Inkscape o la utilidad convert de ImageMagick).