6 de abril de 2010

Librería YQL Geo

Cada día son más las aplicaciones que hacen uso de la geolocalización, dos de los ejemplos más claros son los de Twitter y Flickr, Twitter geolocaliza los mensajes y Flickr geolocaliza las fotos.

Existen diferentes alternativas para trabajar la geolocalización mediante JavaScript, probablemente la opción más usada por los desarrolladores es la de usar la API de Google Maps, en la versión 2 con GClientGeocoder, y la versión 3 con google.maps.Geocoder.

Una de las alternativas al uso de la API de Google Maps es YQL Geo, una librería pensada para geolocalizar información, hacer geolozación inversa y análisis de contenido.

YQL Geo hace uso de los siguientes servicios para devolver sus resultados.

- Yahoo Placemaker
- Yahoo GeoPlanet
- jsonip.appspot.com
- IP location tools
- W3C Geo location
- Flickr.places.findByLatLon

Su uso es extremandamente simple, tan solo hay que añadir la librería en la cabecera de la página y hacer uso del metodo get.


yqlgeo.get(what, callback)


what
Es cualquier cosa que se desee analizar, puede ser desde una URL a un documento web, un texto, una IP, una coordenada dada con longitud y latitud, o "visitor" para detectar la localización geografica del usuario que visita la página.

callback
es el método de devolución que será llamado cuando se de una recuperación exitosa de la información. Los datos se devuelven en forma objeto - si hay algún error al recuperar la información se devolverá envuelto en una propiedad de error.

Ejemplos



Obtener la localización geográfica de un texto



yqlgeo.get('paris,fr',function(o){
alert(o.place.name+' ('+
o.place.centroid.latitude+','+
o.place.centroid.longitude+
')');
});


Obtener la información sobre la ubicación de lat/lon



yqlgeo.get(33.748,-84.393,function(o){
alert(o.place.name + ',' + o.place.country.content);
});

yqlgeo.get([33.748,-84.393],function(o){
alert(o.place.name + ',' + o.place.country.content);
});


Obtener todas las ubicaciones geográficas de una determinada URL



yqlgeo.get('http://icant.co.uk',function(o){
var out = '';
var all = o.place.length;
for(var i=0;i out+=o.place[i].name+'\n';
};
alert(out);
});


Obtener el lugar de un número de IP



yqlgeo.get('217.12.14.240',function(o){
alert(o.place.name + ',' + o.place.country.content +
' (' + o.place.centroid.latitude + ',' +
o.place.centroid.longitude + ')'
);
});


Localización de usuario (utilizando la API de geolocalización del W3C y la IP)



yqlgeo.get('visitor',function(o){
alert(o.place.name + ',' + o.place.country.content +
' (' + o.place.centroid.latitude + ',' +
o.place.centroid.longitude + ')'
);
});

Generar PDFs en un proyecto usando symfony

Muchos de los desarrollos que realizamos diariamente requieren la generación de informes en formato PDF. Hoy me han pedido en el trabajo que busque información sobre como generar ficheros PDF en proyectos que usan symfony, trás Googlear un poco, estas son algunas alternativas que podemos utilizar:

sfPDFLatextPlugin



Este plugin permite utilizar la potencia de LaTex (http://www.latex-project.org/) para generar ficheros PDF.

- Licencia MIT
- Estado BETA
- Web http://symfony.ibr-oss.de/article/sfpdflatexplugin/


sfTCPDFPlugin



Este plugin proporciona la abstracción de la librería TCPDF. El interés principal de este "fork" de FPDF reside en el hecho de que puede manejar cualquier cadena UTF8 con la codificación nativa de symfony.

Un ejemplo de su uso se puede ver en la siguiente URL http://symfonynerds.com/blog/?p=158

- Licencia MIT
- Estado STABLE
- web http://www.symfony-project.org/plugins/sfTCPDFPlugin

sfDomPDFPlugin



El plugin sfDomPDFPlugin permite convertir HTML en PDF. El plugin utiliza la librería DomPDF. Es muy útil para la conversión de cosas como facturas y documentos personalizados en formato PDF no editable.

Hay que tener en cuenta que DomPDF soporta CSS 2.1, sin embargo, es muy exigente con el formato, por lo hay que evitar el uso de abreviaturas de estilos o combinación de estilos.

Para conocer la compatibilidad con CSS 2.1 consulta la siguiente URL http://www.digitaljunkies.ca/dompdf/css21.php

- Licencia LGPL
- Estado STABLE
- Web http://www.symfony-project.org/plugins/sfDomPDFPlugin

Usar Zend PDF para generar ficheros PDF



Siguiendo con la filosofía de symfony, "No reinventar la rueda" podemos hacer uso de esta parte del Zend Framework.

Para poder usar esta librería del Zend Framework, tienes que añadir en el directorio lib/vendor/Zend/ los siguientes ficheros y directorios:

* Exception.php
* Loader/
* Loader.php
* Pdf/

Una vez hecho esto, deberás añadir el código siguiente a la clase ProjectConfiguration para proporcionar una manera simple de registrar el Zend autoloader.


// config/ProjectConfiguration.class.php
class ProjectConfiguration extends sfProjectConfiguration
{
static protected $zendLoaded = false;

static public function registerZend()
{
if (self::$zendLoaded)
{
return;
}

set_include_path(sfConfig::get('sf_lib_dir').'/vendor'.PATH_SEPARATOR.get_include_path());
require_once sfConfig::get('sf_lib_dir').'/vendor/Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
self::$zendLoaded = true;
}

// ...
}


Una vez tengamos cargado el autoloader de Zend podremos invocar a las clases para generar ficheros PDF.

Un ejemplo del uso de Zend PDF lo puedes encontrar en la siguiente URL http://framework.zend.com/manual/en/zend.pdf.usage.html

- Licencia New BSD License
- Estado STABLE
- Web http://framework.zend.com/manual/en/zend.pdf.html

3 de abril de 2010

Web Workers - Qué son y para que sirven

Con la llegada de HTML5 llegan nuevas funcionalidades a los navegadores web, es el caso del Storage (almacenamiento en el cliente), Geolocation (geolocalización) o los Web Workers (ejecución de scripts en procesos en segundo plano).

En éste artículo vamos a ver que son y para que sirven los Web Workers (de ahora en adelante los llamaremos Workers).

Los Workers no son más que una API que permite a los desarrolladores web ejecutar procesos en segundo plano, son totalmente independientemene a los procesos de la interfaz de usuario.

Esto permite que las secuencias de comandos de larga duración no se vean interrumpidas por secuencias de comandos que responden a clicks u otras interacciones por parte del usuario, y de esta manera permite ejecutar tareas de larga duración sin necesidad de interrumpir la respuesta del usuario.

Los Workers son relativamente gruesos y resistentes, y no están destinados a ser utilizados en grandes cantidades. Por ejemplo, no sería apropiado para lanzar un Worker por cada píxel de una imagen de cuatro megapíxeles.

En general, los Workers se espera que sean de larga duración, tienen un alto costo inicial de rendimiento, y un alto costo por ejemplo la memoria.

Un simple ejemplo del uso de Workers sería el siguiente, un programa que calcula el mayor numero primo:

example01.html

<!DOCTYPE HTML>
<html>
<head>
<title>Worker example: One-core computation</title>
</head>
<body>
<p>The highest prime number discovered so far is: <output id="result"></output></p>
<script>
var worker = new Worker('worker.js');
worker.onmessage = function (event) {
document.getElementById('result').textContent = event.data;
};
</script>
</body>
</html>


worker.js

var n = 1;
search: while (true) {
n += 1;
for (var i = 2; i <= Math.sqrt(n); i += 1)
if (n % i == 0)
continue search;
// found a prime!
postMessage(n);
}


La definición de un Worker se realiza mediante la instancia de la clase Worker, como argumento de la clase se indica el nombre del script a cargar (o los scripts, separados por comas, en caso de ser más de uno).

Una vez instanciada la clase, se debe definir el proceso a realizar cuando recibe un mensaje por parte del script que esta ejecutandose en segundo plano, para ello, el objeto cuenta con el método onmessage, al que se debe pasar una función.

La segunda parte, donde escribimos el código del script a ejecutar en segundo plano, no es más que un simple script, la único nuevo que se le añade es la función postMessage, esta función es la utilizada para realizar la comunicación con el Worker, la función envía la información necesaria al primer proceso, y ésta puede ser usada desde el primer proceso.

Hasta aquí esta breve introducción al uso de Workers. Para más información leer los siguientes enlaces:

http://www.whatwg.org/specs/web-workers/current-work/
https://developer.mozilla.org/En/Using_web_workers