Microsoft certifica aplicación Open Source desarrollada en PHP

En un mundo que tiende a la convergencia y donde la lucha por los clientes está forzando a todas las empresas a cambiar rápidamente su modelo de negocio, Microsoft no podía permanecer como una isla, si es que no quiere desaparecer. El día de ayer en el blog Port 25, que es el medio oficial que utiliza Microsoft para comunicar sus avances en lo referente a Open Source, apareció el anuncio de que el proyecto SilverStripe CMS, que es un sistema de gestión de contenidos web, había alcanzado oficialmente el status de "Certified for Windows Server 2008 R2". Hoy día Sigurd Magnusson, confundador de Silver Stripe Project, ha escrito sobre el hecho en el blog del proyecto bajo el título "SilverStripe la primera aplicación web Open Source que llega a ser Microsoft Certified", lo cual es un punto fuerte para promover SilverStripe a nivel corporativo.

Esto es interesante ya que demuestra que por un lado PHP ha evolucionado hasta alcanzar un nivel "empresarial", que hace apenas unos 3 años no gozaba, además prueba de que efectivamente no hay una contradicción entre un modelo de desarrollo Open Source (ojo no confundir con Free Software que es más restrictivo) y hacer dinero con un proyecto de esta naturaleza. Decir que no se podía desarrollar un modelo de desarrollo comercial de software basado en herramientas Open Source fue uno de los puntos "fuertes" de la estrategia de Microsoft para tratar de frenar la gran migración de desarrolladores que ha ocurrido en favor de alternativas libres como PHP, Python o Ruby; como ha quedado plenamente demostrado por la propia Microsoft tal contradicción nunca ha existido.

Ayer también Apple terminó por aprobar una aplicación que implementa el servicio de VoIP Google Voice, luego de 16 meses de espera este servicio gratuito de Google está por fin disponible en iTunes, según me enteré por TechCrunch. La conclusión que puedo sacar de todo esto es que estamos ante una nueva era de integración y aquellos que eligen el camino de cerrar sus plataformas sencillamente tienen sus días contados. Por otro lado espero que pronto Google atendiendo el clamor popular de los desarrolladores termine por incluir PHP como uno de los leguajes soportados en Google App Engine.

Usando Google Spreadsheet como base de datos

Google ofrece un API para poder manipular directamente el contenido de sus hojas de cálculo en Google Docs, si reparamos en los detalles y la posibilidad de que pueden ser grabas, actualizadas, borradas y recuperadas filas específicas de una hoja de cálculo en particular, pues resulta evidente de que sería posible utilizar dicho API para usar las hojas de cálculo de Google Docs como un sencillo motor de base de datos.

Buscando encontré en el blog "farinspace web" una librería de PHP que permite manipular fácilmente hojas de cálculo de Google Docs, el nombre es Google_Spreadsheet, aunque no es muy imaginativo refleja claramente su finalidad. Luego se me ocurrió usarlo para una aplicación de ejemplo el clásico guessbook, pero eso requeriría la administración de login y perfiles, entonces se me ocurrió mezclarlo (hacer un mushup) con Facebook Connect. De esa forma la administración de la identidad se hace con el Facebook Connect y el registro de los comentarios se haría usando Google SpreadSheet. En pocas palabras lo único que se tiene localmente es el programa, todo los datos estarían en la red.

He preparado un pequeño server virtual con el ejemplo, que puede ser accedido en este URL. El código listo para desempaquetar y usar puede ser descargado desde este otro URL. Lo único que necesita hacer para probarlo es decargarlo en un server con soporte de PHP 5.2 o superior, tener una cuenta en Google Docs y registrar su aplicación en Facebook (más detalles sobre como registrar una aplicación en Facebook pueden ser contradas aquí). Con las credenciales del caso debe editar el archivo "config.php" de la siguiente manera:

<?

  $api_key  = "abcdefghijklmnopqrstuv0987654321"; <- API Key de Facebook
  $secret   = "1234567890abcdefghijklmnopqrstuv"; <- Secret word de FB
  $username = "user@gmail.com";             <- Usuario Google Docs
  $password = "123456";                      <- Password usuario Google Docs

?>

Con esos sencillos cambios debería de funcionar el script que pongo a disposición. Ojo esto es una prueba de concepto, no está cuidada la estética, y todo el código son dos scripts PHP monolíticos. Es decir este script tiene propósito educativo y no recomiendo su uso en entornos de producción.

Los detalles sobre Facebook Connect pueden ser revisados en la wiki de Facebook, por simplicidad en este post me limitaré a enfocarme en el uso de la librería Google Spreadsheet, en caso de que alguien esté interesado en un tutorial detallado sobre Facebook Connect, pues haganmelo saber en los comentarios, si veo que hay suficiente interés dedicaré un tiempo a escribir uno.

A revisar entonces el código de "index.php" que nos permite leer datos desde una hoja de cálculo de Google Docs.

En esta parte inicializamos el objeto $ss (spreadsheet), e indicamos que deseamos usar la hoja de cálculo "comentarios" y la página "Sheet1", es importante tener presente que los nombres son case-sensitive:

(…)
    $ss = new Google_Spreadsheet($username,$password);
    $ss->useSpreadsheet("comentarios");
    $ss->useWorksheet("Sheet1");
(…)

En esta parte asignamos a la variable $rows, todas las filas que tengan un campo "id" mayor que cero, dado que usaremos la función time() para general el campo "id", este es un número entero mayor que cero siempre. Luego con la función sizeof() obtenemos el número de filas que han sido leídas y usaremos la variable $start para acceder a ellos desde el último insertado:

(…)
    $rows = $ss->getRows("id>0");
    $size = sizeof($rows);
    $start = $size – 1;
    $count = 0;
(…)

Usamos el bucle while() para leer los diez últimos elementos del array que la función getRows() nos provee y los representamos a través de una tabla:

(…)
    echo ‘<hr>Diez &uacute;ltimos comentarios:<br /><br />';
    echo ‘<table>';
    while(($start>=0) && ($count<10)) {
         $row = $rows[$start];
        
         $nombre = $row[‘nombre’];
         $apellido = $row[‘apellido’];
         $avatar = $row[‘avatar’];
         $comment = $row[‘comment’];
         echo ‘<tr><td valign="top">’ . ‘<img src="’ . $avatar . ‘"><br />’ . $nombre . ‘<br />’ . $apellido . ‘<br /></td>';
         echo ‘<td valign="top" width="300">’ . $comment . ‘</td></tr>';
          –$start;
          ++$count;
    }
    echo ‘</table>';
(…)

Como veran el algoritomo es bastante sencillo y sólo nos muestra los últimos 10 comentarios dejados en el guessbook. Ahora si queremos dejar comentarios debemos estar logueados, para ello se debe disponer de una cuenta válida en Facebook.

El script que agrega una fila a la hoja de cálculo de Facebook se llama "addrow.php" y para asegurarnos de que no puede ser usado directamente por alguien, lo primero que hace dicho script es ver si el usuario está logueado en Facebook, de estarlo lee los siguientes datos de su perfil: $nombre, $apellido, $avatar (la foto). Si no está logueado es redirigido a "index.php".

Finalmente si el usuario esta logueado y ha enviado un comentario, entonces el siguiente código se ejecuta:

(…)
      $ss = new Google_Spreadsheet($username,$password);
      $ss->useSpreadsheet("comentarios");
      $row = array (
                  "id" => time(),
                  "nombre" => $nombre,
                  "apellido" => $apellido,
                  "avatar" => $avatar,
                  "comment" => $comment
             );

      if ($ss->addRow($row)) {
         /* Si se puede agregar la fila exitosamente regresa a la pagina principal */
         $url = ‘http://’ . $_SERVER[‘SERVER_NAME’] . "/index.php";
         header("Location: $url") ;
      } else {
         /* Si se produce un error, nos alerta del mismo */
         echo "Error, lo sentimos pero su comentario no ha podido ser grabado.n";
      }     
(…)

Es decir creamos un objeto $ss, especificamos con que hoja de cálculo deseamos trabajar con la función userSpreadsheet() y con la función addRow() podemos escribir el contenido del array $row en la hoja de cálculo llamada "comentarios", de ser exitosa dicha operación somos redirigidos a "index.php", caso contrario se nos presenta un mensaje de error para darnos a saber de que por alguna razón el registro no pudo ser grabado en la hoja de cálculo.

Este tipo de solución es útil por ejemplo si deseamos utilizar Google App Engine con PHP. Como comenté el año pasado es posible usar PHP en App Engine a través del servlet Quercus. Sin embargo no se puede acceder directamente a BigTable desde una aplicación PHP implementada de esta manera, pero la libreria "Google SpreadSheet", debería de funcionar sin problemas en Quercus. Existen varias otros posibles escenarios en donde este tipo de soluciones serían utiles como por ejemplo hosting gratuitos o sencillamente formularios web que llenan directamente una hoja de cálculo que luego puede ser compartida por los empleados de la compañía.

Si alguien utiliza este tipo de solución en algún proyecto le agradecería que nos lo haga saber en los comentarios.

Facebook presenta XHP (un PHP con esteriodes)

El día de ayer, mientras todo el mundo estaba discutiendo las aplicaciones presentes y futuras de Google Buzz, Facebook presentó XHP. Una de las razones por las que me dí cuenta de la existencia de XHP, fue gracias a que Google no ha habilitado aún Buzz en mi cuenta de Gmail. Lo cual en el fondo agradezco ya que de otro modo hubiera pasado por alto XHP.

¿Qué es XHP?, pues bien XHP es una extensión de PHP que valga la redundancia extiende la sintaxis del lenguaje para hacer la elaboración de front-end más fácil de leer y además incrementar la seguridad. Para conseguir dicho fin hace que PHP pueda entender XML de manera nativa.

La aplicación que Facebook le está dando a XHP es Facebook Lite, una versión mucho más ligera de la web de Facebook. Aunque su autor Marcel Laverdet, dice que es usado además para renderizar varias partes de la web de Facebook, ya que permite combinar porciones de código HTML en un simple nuevo objeto, con todas las ventajas que ello representa.

Pero veamos un ejemplo de cómo la sintaxis de PHP ha cambiado con XHP, usaremos el ejemplo que Facebook da:

<?php
if ($_POST[‘name’]) {
?>
    <span>Hello, <?=$_POST[‘name’]?>.</span>
<?php
} else {
?>
    <form method="post">
    What is your name?<br>
    <input type="text" name="name">
    <input type="submit">
    </form>
<?php
}

En el código anterior pueden presentarse dos problemas, el primero y más obvio es que seremos víctimas de XSS; el segundo problema es que si olvidamos abrir o cerrar los tag PHP, nustra página generaría un error. Con XHP ambos problemas se resuelven, aquí el mismo código anterior pero implementado con XHP:

<?php
// note: includes omitted
if ($_POST[‘name’]) {
  echo <span>Hello, {$_POST[‘name’]}</span>;
} else {
  echo
    <form method="post">
      What is your name?<br />
      <input type="text" name="name" />
      <input type="submit" />
    </form>;
}

Note que ahora todo es un simple block de código PHP, no hay que estar abriendo y cerrando tags PHP. Este cambio en la sintaxis del lenguaje trae consigo algunas ventajas:

  •  Debido a PHP es ahora context-specific, sabe que cuando la variable $_POST es invocada la entrada de datos será HTML y por lo tanto debe escapar los caracteres.
  •  Incorporar XML dentro de la sintaxis PHP permite detectar errores de con los marcadores (markup) en tiempo de parseo y no en tiempo de ejecución. Con lo que no podría existir una página web generada con scripts de XHP malformada.
  • Ya que XML ahora forma parte del lenguaje, en adición a su uso con "echo", también es posible asignarlos a una variable y manipularlos como un objeto cualquiera.
  • Adicionalmente XHP permite definir nuevos tags, con lo que complejas secciones de código HTML, pueden ser ahora definidas como un nuevo marcador, desempleñando de hecho el XHP el papel de un sistema de templates.

Debido a que todas estas ventajas me han interesado decidí probarlo y les dejo un pequeño tutorial de cómo intalar XHP en su server. Lo he probado con CodeIgniter y al parecer XHP no añade ninguna incompatiblidad que impida usarlo en un server donde ya tengamos código PHP. Aquí les dejo como instalar XHP en un server Debian Lenny (esto puede ser usado también para Ubuntu pero recordando usar el  "sudo").

Primero hay que asegurarnos que tenemos instaladas todas las herramientas para compilar XHP:

# apt-get install build-essential flex bisson php5-dev

Ahora descargamos las fuentes y descomprimimos el archivo:

# cd /tmp
# wget http://github.com/facebook/xhp/tarball/1.3.7
# cd /usr/src
# tar -zxvf facebook-xhp-290b185.tar.gz
# cd /usr/src/facebook-xhp-290b185

Ahora comenzamos el proceso de compilación:

# phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519

# ./configure
(…)
appending configuration tag "F77" to libtool
configure: creating ./config.status
config.status: creating config.h

# make
(…)
———————————————————————-
Libraries have been installed in:
   /usr/src/facebook-xhp-290b185/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR’
flag during linking and do at least one of the following:
   – add LIBDIR to the `LD_LIBRARY_PATH’ environment variable
     during execution
   – add LIBDIR to the `LD_RUN_PATH’ environment variable
     during linking
   – use the `-Wl,–rpath -Wl,LIBDIR’ linker flag
   – have your system administrator add LIBDIR to `/etc/ld.so.conf’

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
———————————————————————-

Build complete.
Don’t forget to run ‘make test’.

# make test
(…)

# make install
(…)

Los parentesis (…) indican que verán algunos mensajes, donde he sido específico es en donde muestro algún resultado útil para saber si vamos bien o no. Las líneas en azul son las que Ud. debe tipear (claro omitiendo el prompt ‘#’).

Luego debemos de agregar al archivo de configuración php.ini la línea "extension=xhp.so", en Debian hay dos archivos que modificar:

/etc/php5/apache2/php.ini
/etc/php5/cli/php.ini

El primero es para agregar la extensión dentro del PHP incorporado como módulo de Apache y el segundo para hacer el cambio en PHP cuando se usa como CGI.

Más información sobre el proyecto, la nueva sitaxis que se ha agregado y como resolver algunos errores comunes, pueden encontrarse en la wiki de XHP.

Aplicaciones Facebook usando CodeIgniter

Según InternetNews, para el 2010 habrá un aumento en la demanda de programadores PHP. Tal vez sea en parte porque el lenguaje esta alcanzando su madurez. Pero desde mi punto de vista, una de las principales razones es el hecho de que si se desea desarrollar aplicaciones para Facebook, la red social de mayor proyección en estos momentos, la forma más natural de hacerlo es utilizando PHP.

Programar aplicaciones para Facebook es sencillo, la documentación que provee dicha red social en su sección para desarrolladores es clara. Sin embargo embarcarnos un proyecto que sea un poco más complejo que un simple juego flash sin el uso de un framework puede resultar una experiencia bastante desagradable. En teoría dado que usamos PHP para desarrollar las aplicaciones, cualquier framework para este lenguaje como CakePHP, CodeIgniter o Zend Framework debería ser de utilidad, sin embargo aquellos que siguen este blog sabrán que soy un fan de CodeIgniter y por lo tanto es que me interesé en como hacer funcionar CodeIgniter con el API de Facebook.

Debo confesar que encontrar la información no fue fácil, la mayor parte de ella no esta actualizada y en muchos casos la información se encuentra segmentada entre diversas páginas web. Las dos páginas sobre las que me basé para desarrollar una aplicación de prueba han sido estas:

Facebook & CodeIgniter – Definitive Guide
Facebook Connect CodeIgniter Library

La aplicación de prueba que he desarrollado consiste en una simple página de bienvenida que muestra su nombre, la fotografía que utiliza como avatar en Facebook y los avatares de sus cinco primeros contactos. El resultado final puede ser probado (si tiene una cuenta en facebook) desde el siguiente URL:

http://apps.facebook.com/mycifbapp/

El código completo de la aplicación ejemplo puede ser descargado en formato zip haciendo click aquí.

Solo debe descomprimirlo y editar el archivo ./myfbapp/system/application/config/constants.php y editar estas líneas:

define(‘FB_API_KEY’, ‘1234567890abcdef1234567890abcdef’);
define(‘FB_SECRET’,  ‘1234567890abcdef1234567890abcdef’);
define(‘APPLICATION_URL’, ‘http://apps.facebook.com/mi_applicacion/’);

Debe reemplazar los valores apropiados que obtendrá luego de registrar su aplicación en Facebook.

Para poder usar este ejemplo Ud. necesita:

  • Un servidor web accesible desde Internet.
  • Soporte para PHP 5.2 (al menos).

Espero que éste ejemplo les ayude a iniciar el desarrollo de sus propias aplicaciones Facebook, a la vez que espero sus comentarios para poder mejorar o aclarar algún aspecto que no haya quedado claro.

Hasta la vista PHP4

El pasado viernes 8 de agosto, marcó el final de la vida para el popular lenguaje de scripting PHP4, con el lanzamiento del último release estable de este popular lenguaje el 4.4.9, un completo análisis sobre las alternativas para migrar aplicaciones a PHP5 puede ser encontrado en la página web de la revista ComputerWorld.

Después de haber estado en el mercado por más de 10 años (su release como estable fue el 22 de mayo del 2000), el lenguaje que potencia la mayor cantidad de aplicaciones web, continúa su evolución. Hay que recordar que aunque PHP5 es el actual estable, la comunidad PHP sigue activamente trabajando en la siguiente versión PHP6 que estará completamente orientada a objetos, y espero que pronto la veremos lista para el gran público.

Tal vez una de las aplicación populares que ha ofrecido mayor resistencia al cambio a PHP5 ha sido OsCommerce, aunque ya podemos ver que anda en su OsCommerce 3.0 Alpha 4, y tal vez en unos meses más tendremos una versión estable del popular programa de sitios de comercio electrónico, la verdad es que aquellos que no migren sus aplicaciones a PHP5, perderán por completo el soporte del lenguaje y tendrán que parcharlo por ellos mismos.

Si tiene que migrar su aplicación web a PHP5, hágalo usando un framework que le ahorre el trabajo, y como siempre he dicho mi candidato número uno para el desarrollo rápido de aplicaciones web es CodeIgniter.