Código fuente para generar los mapas de acceso
Actualización: por los comentarios sobre los colores confusos ahora lo ha cambiado para usar iconos de tamaños diferentes. El código javascript también está mucho más optimizados para consumir menos memoria en los clientes. Espero que os guste más.
Como algunas personas me lo pidieron –la verdad es que sólo una, hola David– generalicé, optimicé, ordené y puse dos líneas de comentarios al código del mapa para que sea fácil ponerlo en marcha en cualquier sitio web.
Primero lo que toca, descorazonar a los valientes sin los conocimientos que hacen falta para maravillarse con mi obra.
Requerimientos
Entender la castiza frase cagarme en tus muertos si violas la licencia GPL.
Haber obtenido una clave del Google API.
Saber como crear bases de datos en MySQL, y los permisos adecuados para hacerlo.
Saber como instalar módulos estándar de Perl. En particular hace falta el DBI, DBD::mysql, LWP::Simple, File::Tail y Net::Netmask. En Debian están en los paquetes libdbi-perl, libdbd-mysql-perl, libwww-perl, libfile-tail-perl y libnet-netmask-perl respectivamente. Espero no olvidarme de ninguno.
Saber que existe PHP y que te funciona con el mysql en tu servidor.
Saber que es un fichero log de Apache. Y en qué directorio están.
Saber qué es un URL.
Saber cambiar las asignaciones de variables en un perl, php y javascript.
Saber como extraer un fichero tgz.
Saber usar un editor de texto.
Saber arrancar el Firefox.
Si sabes todo lo anterior, ya está el 95% hecho. Si no lo entiendes regresa a Google, tampoco has pagado o hecho más esfuerzo que leer hasta aquí
Como funciona
Un daemon en Perl, el query_mysql.pl, analiza los logs del Apache en tiempo real, consulta y actualiza la base de datos –el esquema está en geo.sql– y hace las consultas a hostip para obtener las coordenadas de cada dirección IP. Este demonio es muy eficiente, en este servidor no llega a consumir 10 segundos de CPU por día. Además mantiene la BBDD en un tamaño muy pequeño y minimiza las consultas por red.
Para visualizar el mapa se accede a un html, el example1.html, que carga el API de Google y visualiza el mapa. Otro Javascript incluido en el tgz, el example1.js, es el que actualiza y pone los marcadores de acuerdo a las coordenadas. Los valores de las coordenadas lo obtiene de xml.php, que consulta a la base de datos y responde con un XML.
Simple, ¿no?. Te habrás dado cuenta que hay unos ficheros en negrita, son porque están incluidos en el fichero tar y los que tendrás que abrirlos con un editor de texto, mirar las primeras líneas de cada uno y poner tus propios datos.
Si has entendido hasta aquí, felicitaciones, ya tienes una mayor comprensión que la mayoría de los mortales. Pide desde ahora que te llamen geek como mínimo. Si logras instalar todo sin leer las instrucciones que hay más abajo, has de pedir que te llamen hacker a secas. Aunque si sigues mis instrucciones y entiendes mejor, dílo a mis alumnos, no me creen.
Bajar
El tgz está aquí. No tiene ni número de versión, pero acepto parches en formato diff -u.
Instalar
Descomprime el fichero en un directorio accesible desde el Apache, por ejemplo en
~/public_html/. Te habrá generado un directoriomapcon una serie de ficheros. Ese directorio debe ser accesible desde el web, asegúrate de eso antes de continuar.Crea una base de datos llamado –por ejemplo– geo. Importa el esquema del
geo.sql(mysql < geo.sql).Asegúrate que también puedes acceder a esa base de datos desde el web. Si accedes a
http://tuweb/~tu_usuario/map/xml.phpno debería dar errores, deberías obtener un XML bastante pequeño. Para poner el servidor, usuario y clave de la base de datos edita el ficherorecordset.incy específicalos en las variables de las primeras líneas.Edita
map/query_mysql.pl. Mira las primeras líneas y cámbialas para adaptarlas a tu entorno, especialmente la ubicación del fichero de logs del Apache, el URL base sobre el que quieres mostrar los accesos (en mis caso es/gallir/, si quieres para todo el web pon ‘/’), la dirección IP que será usada en vez de las direcciones privadas de conexiones que puedan venir de tu red local, el nombre de la BBDD, el usuario y la clave de acceso a la BBDD.Asegúrate que funciona el programa. Arráncalo y a los pocos segundos debería dar mensajes del tipo:
Inserting GEO: 50.65, -2.4167
update_ip: 111.222.333.444
Si ves esos mensajes, ya está casi todo.
Edita el
example1.htmly pon la clave que hayas obtenido de Google.Edita el
example1.jsy cambia algo si deseas, por ejemplo dónde estará centrado el mapa, el nombre de tu sitio, el período de los últimos N segundos –el argumento del xml.php– que quieres visualizar y el tiempo refresco del la página web en segundos.Ya debería funcionar todo. Si accedes a
http://tuweb/~tu_usuario/map/example1.html, deberías ver algo así.FINAL: Si ya te has asegurado que todo funciona –mira que repetí mucho el asegúrate– ahora deja las cosas para que funcionen solas aunque el ordenador se reinicie. El
query_mysql.pl -dhace que el daemon se daemonice de verdad –me entiendes, ¿verdad?–, así que ya puedes ir a tu crontab (i.e.crontab -e) y agregar la siguiente línea:@reboot /camino/al/directorio/map/query_mysql.pl -d
Luego de asegurarte una y mil veces que has puesto bien el camino, ya puedes parar la ejecución del anterior que has puesto en marcha y ahora arrancarlo ya de forma definitiva.
/camino/al/directorio/map/query_mysql.pl -d
Profit!
Si haces cosas guapas, pon enlaces desde aquí… si así lo deseas. Pero, dado que a mí me ha costado un par decenas de horas de aprender y programar como un poseso –y todo el sexo que he desperdiciado–, es lo mínimo que debes hacer si no quieres ir al infierno u optar hablar con RMS las horas que te hagan falta para entenderlo. ¿Vale?
Esto no tiene nada que ver con el tema del mapa, pero igual te hace algo de gracia.
http://www.informativos.telecinco.es/power_point/accidente/columbia/dn_12277.htm
Saludos!
Comment by Hello — Tuesday 20/9/2005 @ 0:23
Ya lo sabía:
http://mnm.uib.es/gallir/conferencies/no.sxi
Comment by gallir — Tuesday 20/9/2005 @ 0:28
Gràcies Ricardo!
Ja m’he baixat el codi i ho he instal.lat… ha funcionat tot ok de seguida (bé, només el detall q em faltaven un parell de mòduls de Perl que he instal.lat de CPAN i que he canviat una mica el xml.php per ajustar-lo a lo que jo necessitava)
De moment ho tinc en proves, a un directori reservat. Però quan ho posi en marxa (suposo que aquesta mateixa setmana) ja et faré saber l’adreça completa
De nou, gràcies per posar-ho tan fàcil
Comment by david — Tuesday 20/9/2005 @ 12:58
A través de Tecnología Obsoleta:
http://www.alpoma.net/tecob/?p=24
“Para aquellos interesados en conseguir información geográfica de calidad, ya sea para GIS o análisis de teledeteccción o para utilizarla en cualquier otra tecnología geoespacial, se ha puesto en marcha Geotorrent, donde se puede encontrar un gran volúmen de datos geográficos, libres y redistribuibles.”
http://geotorrent.org/
Comment by maty — Tuesday 20/9/2005 @ 20:02
“Entender la castiza frase cagarme en tus muertos si violas la licencia GPL.”
xDDDDDDDDD
Comment by davidcg — Wednesday 21/9/2005 @ 14:11
Muy bueno. Ahora mismo me pongo a revisar si tengo instalados todos los modulos de perl necesarios y me lio… Aunque no se pa qué, si en mi wé no entra ni dió :P.
Comment by Manuko — Thursday 22/9/2005 @ 2:28
Muy interesante, ahora sólo queda que el .sql que pasas sea un poquitín más compatible con las versiones de mysql de la debian stable y tal… más que nada por un par de detalles y que hay una clave primaria con default null, y me da a mi que eso el mysql que tengo yo y que conozco no lo traga muy bien que digamos.
Pero lo dicho, está muy bien logrado. Gracias y felicidades (y no te cagues en mis muertos que no infringiré la GPL).
Comment by jose — Thursday 22/9/2005 @ 3:07
Yo estoy usando el mysql 4.1, si no me equivoco también está en la estable de Debian (al menos estaba en testing desde hace mucho tiempo).
Comment by gallir — Thursday 22/9/2005 @ 3:08
La aplicación es muy util e interesante, lo que desearía es si alguien tiene la base de datos geo.sql en un formato mas idoneo y que me permita importarla.
Me da este error con la base de dato que tienes actualmente en el .tgz
”
ERROR 1064 at line 10: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ‘CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
lat decimal(10
”
Felicidades Ricardo por tan buena idea y sobre todo que sea GPL.
Comment by jose — Thursday 22/9/2005 @ 10:04
Saludos es formidable el concepto, yo trate de implementarlo en mi sitio pero al tratar de ejecutar el xml.php me da estos dos errores: Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /var/www/html/webfunda/mapas/map/recordset.inc on line 146
Warning: mysql_error(): supplied argument is not a valid MySQL-Link resource in /var/www/html/webfunda/mapas/map/recordset.inc on line 167
Comment by Jean Alcala — Friday 23/9/2005 @ 20:11
Porque la conexión a la base de datos te está fallando. Mira los requerimientos e instrucciones para probarla que hay en este artículo
(podrías tener problemas de permisos).
Comment by gallir — Friday 23/9/2005 @ 20:46
Saludos, gracias por su atencion mira ya segui tus pasos instale todo tal cual tu me indicas, excepto el paso :
Asegúrate que también puedes acceder a esa base de datos desde el web. Si accedes a http://tuweb/~tu_usuario/map/xml.php no debería dar errores, deberías obtener un XML bastante pequeño.
ejecuto el XML.php y me da los errores que antes te comente, de hecho el captura los datos y todos en las tablas ip y geo.
No se que mas revisar tu me dices que revise los permisos pero en verdad lo ejecuto con usuario root, deberia tener todo los privilegios. Ahora si te comento que quise crear otro usuario con accesos y clave para utilizarlo en lugar de root y al ejecutar el query_mysql.pl me indica que el usuario tiene acceso denegado, aun cuando le coloco los datos exacto, BBDD, usuario y contraseña. solo me esta funcionando con root. espero tu ayuda. Gracias
Comment by Jean Alcala — Monday 26/9/2005 @ 22:30
Los permisos del mysql no tienen nada que ver con los normales o con el root… ese es tu problema, que no sabes cómo van.
Comment by gallir — Monday 26/9/2005 @ 23:00
Lo entiendo, se que hay usuarios root, tanto en mysql como en linux (no es el mismo usuario). Mi comentario es que utilizo el usuario root y su contraseña(mysql) para definirlos en las variables $db_user y $db_passwd del archivo query_mysql.pl y funciona la captura de datos mas no el archivo xml.php?, eso no es logico, al igual que si creo otro usuario mysql con todos los privilegios como el root y lo sustituyo en esas variables da un error de acceso denegado. A que permisologia en especifico te refieres?. Por eso acudo a ti para una orientacion, pero si no es tu intencion ayudarme lo acepto.
Comment by Jean Alcala — Tuesday 27/9/2005 @ 14:03
No es que no quiera ayudar, es que es off-topic y muy largo para explicarlo aquí. Hay mucha documentación. Por eso explícitamente lo asumo como “dominado”. Mira el “mysql_pconnect” en recordset.inc y ponel allí el usuario y password que toca (no lo tenía por separado/explícito, ahora lo haré, bájalo en unos minutos).
Comment by gallir — Tuesday 27/9/2005 @ 17:22
ok gracias por tu comentario para ayudarme.
Comment by Jean Alcala — Tuesday 27/9/2005 @ 21:26
Algúno tiene actualizada la base de datos del amigo gallir para una versión mas reciente de la base de datos mysql
Vamos que no de el error ese de
mysqladmin -u micuenta -p create googlemap
Comment by jonas — Friday 14/10/2005 @ 0:18
¿Más reciente que la 4.1? ¿que tiene que ver ese comando con el esquema de la bbdd? (nada)
Comment by gallir — Friday 14/10/2005 @ 0:30
Hola ricardo, la insertar la bbdd me da este error en debian.
ERROR 1064 at line 21: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ‘CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`lat` decimal(
Comment by josue — Saturday 15/10/2005 @ 0:03
Se comentó antes, necesitas mysql 4.1. Si tienes una anterior deberás crear la base manualmente, no es difícil.
Comment by gallir — Saturday 15/10/2005 @ 1:51