Razo Duke12

Wednesday, February 04, 2009

Introducción a WURFL con PHP

WURFL (Wireless Universal Resource File) es una base de datos en formato XML que contiene características de dispositivos móviles, es un proyecto libre y colaborativo creado por Lucca Passani. Para poderlo utilizar en nuestros proyectos existen API's en diversos lenguajes como Java, PHP, Python o Perl que permiten el parseo del archivo XML.

Esta herramienta la conocí hace ya casi un año, cuando comencé a introducirme en la onda del desarrollo web para móviles en aplicaciones relativamente sencillas. Cuando me la explicaron brevemente y observé su aplicación, fue cuando conocí también el problema por el cuál surgió esta herramienta, sencillamente conocer las capacidades de los dispositivos móviles para poder adaptar el contenido que se entrega tanto en forma física (archivos) como visual (sitio web/wap).

Wurfl como el resto de la herramientas de su tipo, basan su funcionalidad en el parámetro llamado "UserAgent" de los dispositivos móviles, útil para poder determinar las características del mismo. Tomando el UA se puede consultar la base de datos de WURFL y poder conocer cosas importantes como ancho y alto de su pantalla, si es que soporta la reproducción de archivos en formato de audio MP3, que tipo de vídeos soporta, tipo de lenguaje estándar soportado para visualizar sitios web, etc.

En este post vamos a dar un breve introducción al uso de WURFL usando la librería creada en PHP por Andrea Trasatti, no se emocionen yo también pensé que era nena :P, sin mas choro vamos a comenzar. Para nuestro ejemplo práctico ocupamos los siguientes requerimientos:

* Sistema Operativo Ubuntu GNU/Linux.
* Servidor Web Apache2.
* PHP 5 con soporte para parsear XML.
* Firefox 3

Vamos a nuestro DocumentRoot y creamos una carpeta inicial para hacer las pruebas:

duke12@duke12:/var/www/tests$ mkdir wurfl && cd wurfl

Descargamos la libreria de PHP para utilizar WURFL:

duke12@duke12:/var/www/tests/wurfl$ wget http://downloads.sourceforge.net/wurfl/wurfl_php_tools_21.zip

Descomprimimos el archivo zip:

duke12@duke12:/var/www/tests/wurfl$ unzip wurfl_php_tools_21.zip

Los archivos importantes son wurfl_parser.php, wurfl_class.php y wurfl_config.php, el propio nombre nos dice mucho de su funcionalidad.

Continuamos, vamos a crear una carpeta llamada "data", descargamos al famoso wurfl.xml y su parche para browsers web dentro de la carpeta data:

duke12@duke12:/var/www/tests/wurfl/data$ wget http://wurfl.sourceforge.net/wurfl.xml
duke12@duke12:/var/www/tests/wurfl/data$ wget http://wurfl.sourceforge.net/web_browsers_patch.xml

Editamos el archivo wurfl_config.php y modificamos la constante DATADIR para ubicar la carpeta que contiene nuestro archivo wurfl.xml, en nuestro ejemplo queda:

define("DATADIR", 'data/');

Este archivo contiene directivas generales que podemos configurar para el uso de WURFL, por mencionar algunas encontramos aquellas que nos permiten habilitar (recomendado 100%) o deshabilitar el cache que va desde la creación de arreglos por grupos de dispositivos o en su caso archivos por dispositivos generalizados, también encontramos directivas de direccionamiento donde le especificamos a la librería donde se encuentran los archivos XML, ubicar la propia clase, el parseador y demás, también podemos habilitar el log más no se recomienda para aplicaciones en producción.

Muy bien ahora actualizaremos nuestro cache usando PHP CLI con la siguiente ejecución:

duke12@duke12:/var/www/tests/wurfl$ php update_cache.php

Unable to log to data/wurfl.log log_message:Thu, 30 Oct 2008 00:10:55 -0500 [duke12 11053][update_cache] Forced cache update started
Unable to log to data/wurfl.log log_message:Thu, 30 Oct 2008 00:10:59 -0500 [duke12 11053][parse] No XML patch file defined
Unable to log to data/wurfl.log log_message:Thu, 30 Oct 2008 00:11:01 -0500 [duke12 11053][update_cache] Updating multicache dir
Unable to log to data/wurfl.log log_message:Thu, 30 Oct 2008 00:11:01 -0500 [duke12 11053][update_cache] Done updating cache
Parser load time:0.0189509391785

Vamos al ejemplo ultra-mega-básico del uso de wurfl para comprobar que la librería esta bien configurada, creamos el archivo prueba1_wurfl.php dentro de nuestra carpeta de prueba y colocamos el siguiente código:

1
<?php
2
require_once('wurfl_config.php');
3 require_once(
WURFL_CLASS_FILE);
4
5
$wurflObj = new wurfl_class();
6
7
$ua = $_SERVER['HTTP_USER_AGENT'];
8
9
$wurflObj->GetDeviceCapabilitiesFromAgent($ua);
10
11 if (
$wurflObj->getDeviceCapability('is_wireless_device') ) {
12 echo
'El UA:'.$ua.'<br /> Es dispositivo movil';
13 } else {
14 echo
'El UA:'.$ua.'<br /> No es dispositivo movil';
15 }
16
?>
17




Expliquemos que onda con este script, la primeras líneas incluyen al archivo de configuración y posteriormente el archivo de la clase, paso siguiente se crea el objeto de la clase en la variable $wurflObj, utilizamos este objeto para invocar el método getDeviceCapabilitiesFromAgent() usando el header de PHP que contiene el UserAgent del dispositivo o navegador $_SERVER['HTTP_USER_AGENT'], la librería crea en este momento un mega-arreglo que contiene las características del dispositivo detectado.

Para conocer esas características se utiliza el método getDeviceCapability('nombre_caracteristica'), en nuestro ejemplo preguntamos a WURFL si es un dispositivo wireles o móvil. Podemos instalar el plugin "Modify Headers" para Firefox y podemos ver los resultados que se obtienen si jugamos con el UserAgent:

* Con el UserAgent propio del navegador vamos a la url http://localhost/tests/wurfl/prueba1_wurfl.php:

From misc


* Simulando a un NokiaN95:

From misc


De esta manera es como podemos detectar si el dispositivo que accesa nuestra pagina web es móvil o no y así poder entregar una pagina de acuerdo a sus características.

Ahora veamos otro ejemplo para conocer otro tipo de características de los móviles. Tenemos el siguiente código en el archivo prueba2_wurfl.php, los comentarios contienen una breve explicación:
1
<?php
2
require_once('wurfl_config.php');
3 require_once(
WURFL_CLASS_FILE);
4
5
//*** Comenzamos creando el objeto de la clase. ***//
6
$wurflObj = new wurfl_class();
7
8
$ua = $_SERVER['HTTP_USER_AGENT'];
9
10
//*** Obtenemos las capacidades usando el UserAgent ***//
11
$wurflObj->GetDeviceCapabilitiesFromAgent($ua);
12
13 if (
$wurflObj->getDeviceCapability('is_wireless_device') ) {
14
15
//*********** Info del Producto ********************//
16
$marca = $wurflObj->getDeviceCapability('brand_name');
17
$modelo = $wurflObj->getDeviceCapability('model_name');
18
$perfil_ua = $wurflObj->getDeviceCapability('uaprof');
19
$navegador = $wurflObj->getDeviceCapability('mobile_browser');
20
21
//********** Multimedia Basica *************************
22
$soporta_jpg = $wurflObj->getDeviceCapability('jpg') ? 'Si' : 'No';
23
$soporta_gif = $wurflObj->getDeviceCapability('gif') ? 'Si' : 'No';
24
$soporta_mp3 = $wurflObj->getDeviceCapability('mp3') ? 'Si' : 'No';
25
$soporta_video = $wurflObj->getDeviceCapability('video_3gpp') ? 'Si' : 'No';
26
27
//********** Lenguaje de Marcado ***********************
28
$nivel_xhtml = $wurflObj->getDeviceCapability('xhtml_support_level');
29
$leng_preferente = $wurflObj->getDeviceCapability('preferred_markup');
30
31
//********** Pantalla **********************************
32
$ancho = $wurflObj->getDeviceCapability('resolution_width');
33
$alto = $wurflObj->getDeviceCapability('resolution_height');
34
35
//******************* Desplegamos ***********************
36
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
37 <html><head><title>Probando Wurfl</title>
38 <meta content="text/html; charset=UTF-8" http-equiv="content-type">
39 </head><body>'
;
40 echo
"El UserAgent: <b>$ua</b> <br /> tiene las siguientes caracteristicas basicas: <br /><br />";
41 echo
'<b>[Información del producto]</b><br />';
42 echo
'Marca: '.$marca.'<br />';
43 echo
'Modelo: '.$modelo.'<br />';
44 echo
'Navegador: '.$navegador.'<br />';
45 echo
"Perfil del Agente: <a href='$perfil_ua'> $perfil_ua </a><br /><br />";
46
47 echo
'<b>[Multimedia Básica]</b><br />';
48 echo
'Soporta JPG: '.$soporta_jpg.'<br />';
49 echo
'Soporta GIF: '.$soporta_gif.'<br />';
50 echo
'Soporta MP3 '.$soporta_mp3.'<br />';
51 echo
'Soporta Video: '.$soporta_video.'<br /><br />';
52
53 echo
'<b>[Lenguaje de Marcado]</b><br />';
54 echo
'Soporta XHTML Nivel: '.$nivel_xhtml.'<br />';
55 echo
'Lenguaje Preferente: '.$leng_preferente.'<br /><br />';
56
57 echo
'<b>[Pantalla]</b><br />';
58 echo
'Ancho: '.$ancho.'<br />';
59 echo
'Alto: '.$alto.'<br />';
60
61 echo
'</body></html>';
62
63 } else {
64 echo
'El UA:'.$ua.'<br /> No es dispositivo movil';
65 }
66 echo
'</body></html>';
67
?>



Aquí podemos apreciar el resultado de jugar con el userAgent = "Nokia5200/2.0 (06.03) Profile/MIDP-2.0 Configuration/CLDC-1.1"

From misc


Con este ejemplo podemos observar que Wurfl es de gran utilidad cuando desarrollamos web para móviles para poder determinar que tipo de pagina puedo entregar al navegador de ese dispositivo, empezando por determinar el lenguaje de marcado estándar, el tipo de imágenes que puede desplegar, un idea del tamaño de pantalla, y más cosillas que le querramos colgarle.

Las debilidades de estas librerías PHP para usar Wurfl son principalmente el uso de archivos (E/S en disco) para generar el cache necesario, así como los recursos para parsear el XML.

Existen alternativas que intentan mejorar las deficiencias encontradas en esta versión de Wurfl + PHP, y algunas herramientas q se basan en Wurfl para diversas funcionalidades, tal es el caso de TeraWurfl y de WALL, de quienes hablaremos en otra ocasión, x el momento es todo --> Seguimos en la resistencia!

Wednesday, October 22, 2008

Revista NüNet #1

En una iniciativa del buen Garaged se llevó acabo el esfuerzo compartido con los miembros de la comunidad de Software Libre del Estado de Morelos Gruslic y SLM para elaborar un revista electrónica de interés tecnológico, ideólogico, cómico, mágico y aún no músical utilizando SL.

El anuncio del lanzamiento de Nünet, aquí.

Descarga la revista, aquí.

Nos gustaría conocer su opinión al respecto q invitarlos a que participen, ya se encuentra lista la convocatoria de envío de articulos para el segundo numero.

From Comunidad SL

Friday, August 01, 2008

A un año...

Un día como hoy 1 de agosto pero del año 2007 llega un ciudadano mexicano de provincia a trabajar x primera vez al D.F., llegó nervioso, temeroso y con mucha incertidumbre.

Valla un año ya chambeando por aqui se ha ido de volada cuando yo habia jurado y perjurado nunca venir a trabajar al D.F. pero en fin las oportunidades se presentan y no estamos para ponernos nuestros moños jejejej...la adaptación fue un poco compleja pero hasta el momento sigo en saldo blanco en cuanto a sustos, la verdad no me gusta exponerme y llevarmela relax con los df-eños.

pd. Seguimos en la resistencia.

Tuesday, July 22, 2008

Reunion Gruslic-era 26-julio-08

Próxima reunión Gruslic:

Fecha: Sábado 26 de Julio 2008
Horario: 9:00 am a 12:00 pm +/-
Lugar: Casa de Iván Alemán (bonovoxmofo) Cuernavaca Morelos
Mapa de ubicación.

Calle Nicolas Bravo 201-9
Lomas de Selva
62270
Entre las calles Nueva Italia y Nueva Francia en frente y a una cuadra
de Gayoso y el restaurant 'Iker' exactamente a un lado y atras de lo
que era el taller mecanico 'Speedy' ahora agencia de autos FAW (si los
chinos)


Como llegar: si vienen de Cuautla bajarse en La Luna o plan de ayala o el Vergel en Cuernavaca tomar la ruta 13 que va a la UNI x Alta Tension y Domingo Diez, bajarse como bien indica el mapa, en el cruce de Domingo Diez con la calle Nueva Italia, caminas hacia la derecha y a la primer cuadra doblas a la derecha, hay unos portones negros, no recuerdo el numero solo se que la calle es Nicolas Bravo.





Itinerario: temas diversos de interés para el grupo.


Friday, July 18, 2008

Given To Fly

"Given To Fly" - Pearl Jam

He could've tuned in, tuned in
But he tuned out
A bad time, nothing could save him
Alone in a corridor, waiting, locked out
He got up outta there, ran for hundreds of miles
He made it to the ocean, had a smoke in a tree
The wind rose up, set him down on his knee

A wave came crashing like a fist to the jaw
Delivered him wings, "Hey, look at me now"
Arms wide open with the sea as his floor
Oh, power, oh

He's.. flying
Whole
High.. wide, oh

He floated back down 'cause he wanted to share
His key to the locks on the chains he saw everywhere
But first he was stripped and then he was stabbed
By faceless men, well, fuckers
He still stands

And he still gives his love, he just gives it away
The love he receives is the love that is saved
And sometimes is seen a strange spot in the sky
A human being that was given to fly

High.. flying
Oh, oh
High.. flying
Oh, oh
He's flying
Oh, oh

Wednesday, July 16, 2008

Reuniones Gruslic - Reloaded

A la comunidad Gruslic:

Saludos listeros, el pasado sábado 12 de julio tuvimos una mini reunión entre algunos miembros de la comunidad gruslic entre ellos Carlos Alberto (y su primo se me fue su nombre), CesarUnix, Alejandro Flores, Max Valdez y Razo, a grandes razgos la reunión sirvio para intercambiar puntos de vista con respecto a como recargar las actividades del Gruslic no solo en cuestión de fomentar el uso de SL si no ver más alla, algunos temas se tocaron ya en reuniones pasadas pero muy ligeros, mi resumen desde mi perspectiva es:

* Orientar los esfuerzos del grupo para llevarlo hacia el business usando SL, como puede ser dar soporte, dar capacitación especializada, desarrollar y/o implementar software.
* Identificar posibles clientes potenciales enfoncandolo hacía las principales actividades ecónomicas del estado como el turismo, otro posible target pueden er escuelas.
* Comenzar a ofrecer servicios, como los mencionados en el primer punto, de momento de manera informal.
* Conocer las habilidades, conocimientos y experiencias de los miembros para orgnanizarnos de acuerdo a las necesidades de los posibles proyectos. Aquí se tuvo un primer intento cuando se solicitó que lo miembros registrarán algunos de sus datos en la wiki http://wiki.gruslic.org.mx/Inventario_de_Miembros solo que ahora tal vez podamos ampliarlo e incluir nuestras experiencias laborales, habilidades adquiridas y campos de aplicación.

En esta pasada reunión pudimos exponer nuestras habilidades y conocimientos las personas que asistimos, de igual manera aquellos que se interesen en entrarle a este esfuerzo pueden exponerlo mediante la lista o en las futuras reuniones.

* Recibir propuestas y puntos de vista de la comunidad gruslic-era y hacer la convocatoria en general para que se unan a este esfuerzo.
* Comunicación mediante esta lista de correo.
* Generar una agenda de reuniones presenciales, la propuesta fue al menos 1 al mes, la siguiente reunión se agendó para el día sábado 26 de julio en casa de Ivan (Cuernavaca) como propuesta de lugar, en un horario de 9 a 12 aproximadamente, si hay más propuestas favor de hacerlas saber. En este punto tambien se comentó la posibilidad de diversificar los lugares de las reuniones ya sea en Cuernavaca, Cuautla o puntos intermedios.
* Propuesta de reuniones mediante IRC canal #linuxcuautla
* Tener presencia como grupo en los congresos de SL.
* Otro punto q se toco ligeramente fue reactivar las pláticas de SL del ViveLinux! así como intentar buscar contactos con escuelas para hacerles las propuesta.

X favor las personas que asistieron a esta pasada reunión si algo se me escapa favor de anexarlo así como sus comentarios al respecto de la reunión.

Y a la comunidad Gruslic en general hacemos la convocatoria para que nos apoyen y se unan al objetivo grupal!
- Qué opinina?
- Qué pueden aportar?
- Pros / Contras de las propuestas
- Etc....

Gracias x su tiempo.

Sigan el hilo en http://groups.google.com.mx/group/gruslic/t/137647bc382a4a37?hl=es

Tuesday, June 24, 2008

Google Developer Day MX 2008

Hace como un mes se hizo el anuncio que se llevaría acabo el primer Developer Day de Google en México por lo cual me fui de volada a registrarme tomando en cuenta que este evento tendría un gran demanda.



Se llego el día 23 de junio y nos alistamos para acudir al evento, nos quedamos de ver con Garaged en Taxqueña por ahí de las 8 de la mañana, tomamos el metro rumbo de lado a lado hasta cuatro caminos, tomamos un taxi y después de enfrentarnos al trafico pudimos llegar al Centro Banamex cerca de las 9:30 am.



Llegamos al área de registro y obtuvimos nuestro kit de bienvenida así como nuestro gafete de identificación, poco después nos encontramos entre la multitud a varios conocidos (algunos de vista solamente) de la comunidad linuxera, entre ellos al estimado ChilliCoder a quien conocí x alla en el Fonasol 2007.



El evento comenzó a las 10:00 am, logrando ver una excelente organización y en su andar una fuerte emoción por todo lo que signifca Google para uno como desarrollador y usuario de Software Libre. Un buen refrigerio, refrescos, nesteas, galletas, bocadillos, mesas, sillas y "colchoncitos relajantes" dieron lugar a un espacio digno para un evento de Google, hacían recordar a esos vídeos donde suelen presumirnos como esta empresa "maltrata" a sus trabajadores.





Desgraciadamente se nos escaparon un par de sesiones muy interesantes por cupo limitado en sus salas. Las sesiones con un tiempo muy corto pero justo para poder explicar a grandes rasgos lo que promueven los proyectos de Google (App Engine, Ajax, Gears, OpenSocial, Android, etc), al fin y al cabo la info y talacha se dan en línea.



Al final pasamos x nuestro regalito: una playera del evento :D, de antemano gracias a Google por esta oportunidad que le dieron a nuestro país.



Como siempre me pasa en este tipo de eventos la emoción y motivación emergen de mi pero valla de nuevo a la realidad, como a veces digo: "No trabajo en Google" :P y tal vez nunca lo haga... aun así seguimos en la resistencia.....