Geolocalizar una IP con GeoLite City

GeoLite City es la versión gratuita de Geo City, sirve para conocer la localización aproximada de una IP. Como se puede imaginar, tiene muchas aplicaciones, por ejemplo a partir de los visitantes online en una web tener un mapa o una estadística por países o... Hay que destacar también otra funcionalidad interesante, que es poder consultar la información de un dominio igual que una IP.

Para utilizar este producto, que como es de imaginar tiene menos detalle de datos respecto a la versión de pago, podemos descargarnos los csv y cargarlo en nuestra base de datos, o utilizar un fichero .dat binario con un API open source disponible para varios lenguajes de programación(en mi caso el API Java).

Un ejemplo básico con el API de java, para conocer dónde están los servidores de danilat.com ;):

try {
LookupService cl = new LookupService("mypath/GeoLiteCity.dat", LookupService.GEOIP_MEMORY_CACHE );
//Se podría hacer cl.getLocation de una IP de la misma forma
Location location = cl.getLocation("danilat.com");
System.out.println("País: " + location.countryName +
"\n latitud: " + location.latitude +
"\n longitud: " + location.longitude));
cl.close();
}
catch (IOException e) {
e.printStackTrace();
}

Y ahora un poco de crítica, los atributos de la clase Location están como public(en algunas otras también y en otras usan set/get...), también hay dos clases que sólo tienen métodos estáticos con nombre en minúscula, supongo que para diferenciarlas como clases de utilidades... ¿no sería mejor llamarla por ejemplo TimeZoneUtils que timeZone, y así no salirse de la convención de que los nombres de las clases comiencen con mayúscula?

En conclusión, un producto con funcionalidades interesantes, pero con una implementación del API (de Java) que deberían retocar.

Grails Include Plugin 0.3, acabando el GSoC

Hace días que no escribo sobre mi proyecto del Google Summer of Code, y eso que ya había puesto disponibles un par de releases del Include Plugin de Grails. Sólo lo he ido anunciando en la lista de correo de Grails para ir recibiendo feedback y mejorarlo.

En este momento, que estamos ya en fase de evaluación y en teoría lo que hagamos los participantes del GSoC ya no vale, es una versión casi definitiva, ya que al menos la forma de usarlo en principio ya no va a cambiar.

En las versiones 0.1 y 0.2 se utilizaban dos tags, por cierto que al taglib hubo que añadirle un namespace(inc) por distribuirlo como un plugin, inc:includeUrl y inc:includeController que en esta versión están como deprecated y no se recomienda su uso.

Ahora únicamente es necesario el tag inc:include, que de inicio era mi idea pero chocaba con otro include fantasma que hay en Grails, por estar en el mismo namespace, y al añadirle el nuevo namespace simplemente se me olvidó :P.

En la lista me propusieron que hiciera esa modificación, lo que significaba sacar la versión 0.3. Mientras que al anunciar en la lista la última versión, ya que me han críticado el código para que mejore el rendimiento y haberme dado gran parte de la solución, tocará sacar al menos una nueva versión con esas mejoras. Las grandezas del open source, si alguien más se anima, las críticas son bienvenidas ;).

Hablando ya de la instalación y su uso, es sencillísimo:

Como está en el repositorio oficial de plugins, para instalarlo sólo debemos ejecutar:

grails install-plugin include.

Para hacer includes de otras acciones podemos llamar a una accion de un controlador con unos parámetros, por ejemplo insertar las últimas 5 noticias en una vista:

<inc:include controller="news" action="last" params="[number:5]"/>

Que también podríamos hacer usando la url que devuelve esa acción, con una mayor probabilidad de un cambio en el mapeo de la url:

<inc:include url="/news/last?number=5"/>

Otra de las cosas que pienso es interesante es el poder insertar contenido estático dentro del directorio web-app, de por ejemplo un html, a los que anteriormente no había una forma directa de acceder:

<inc:include url="/test.html"/>

En definitiva, es un plugin que facilita parte del trabajo en webs tipo portal, evita la necesidad de crear taglibs para simplemente mostrar datos o de repetir código en los controllers. En fin, espero aprobar la evaluación y así llevarme la camiseta!! ;)

Algunos links para empezar con Grails

Hace unos días estuve charlando con un amigo que acaba de terminar los estudios, entre otras muchas cosas, sobre auto-formarse en algo novedoso y con posibilidad de futuro. Como él ya había trabajado bastante con Java, en principio quería aprender algún framework web para la plataforma y al explicarle que estaba trabajando en un plugin de Grails para el GSoC, le picó la curiosidad y me pidió unos links.

En fin, que como la recopilación ya está hecha la publico también aquí:

También de algunos proyectos open source:

Con esto y algún pet-project, es más que suficiente para empezar a aprender a usar el framework y estar al día de las novedades que puedan ir surgiendo.

Tests funcionales con Ruby on Rails

El viernes escribí en el blog de flatee un post sobre testing funcional con RoR:

Actualmente nos encontramos en un punto en el que todavía no tenemos una primera maquetación de la interfaz de usuario de flatee, pero de todas formas estamos desarrollando.

¿Cómo lo hacemos?. Bien, estamos desarrollando con la ayuda de test funcionales para comprobar que todo lo que hacemos está correcto. Además estos tests nos servirán para comprobar que no se rompe nada con futuras modificaciones, y si se rompe ver que es lo que hemos tocado más de la cuenta.

Más en tests funcionales con Ruby on Rails.

Actualizar InstantRails a PHP5

En el momento empecé a trabajar con Ruby on Rails, elegí la opción de instalar uno de esos paquetes precocinados para instalar y listo, en este caso, sin duda, InstantRails. Como ya trae instalado PHP, desinstalé XAMPP por no andar matando procesos, además de que para qué quiero dos de estos paquetes casi equivalentes.

El problema es que instantrails viene con PHP4 y no con PHP5, como iba a estar un tiempo sin trabajar con PHP lo dejé así(aparte de un micro-proyecto que puede correr perfectamente con PHP4), hasta que un amigo me pasó un pequeño desarrollo usando el soporte OO de PHP5 para que le pegara una ojeada a un par de cositas, lo que me ha obligado a andar cambiando configuraciones.

En fin, los pasos para actualizar son estos:

  • Para empezar debemos descargar el .zip de la última versión de php.
  • Renombrar la carpeta de instantrails php a php4, por si acaso.
  • Extraer el contenido del .zip a una carpeta php dentro de instantrails.
  • En conf_files/httpd.conf, modificar LoadModule php4_module "${path}/php/php4apache.dll" por LoadModule php5_module "${path}/php/php5apache.dll" y AddModule mod_php4.c por AddModule mod_php5.c.
  • En conf_files/php.ini, modificar extension_dir = "${path}\php\extensions\" a extension_dir = "${path}\php\ext\"
  • Por último reiniciar apache

Y ya hemos actualizado a PHP5