Archivos mensuales: octubre 2010

Mapas libres con OpenStreetMap

OSM es un proyecto que supone una alternativa libre a Google Maps. Al estilo de la Wikipedia, son los propios usuarios los crean el contenido a partir de datos recogidos con un GPS, fotos de satélite que lo permitan, etc. Para introducir los datos se pueden usar distintos programas, desde el sencillo Potlach, hecho en Flash, al potente JOSM, escrito en Java. Merkaartor parece interesante, pero quizás esté todavía un poco verde.

Tras descargar JOSM, y lanzarlo en Debian sid con java -jar josm-tested, me he encontrado con que la red no funcionaba desde dentro de la aplicación (java.net.NoRouteToHostException: Network is unreachable). Se trata del bug #560044/#560056 de Debian. Para solucionarlo, sólo hay que ejecutar como root sysctl net.ipv6.bindv6only=0, pero lo cierto es que nunca lo habría averiguado por mí mismo.

Una vez arrancado, vamos a Editar -> Preferencias… -> Complementos, descargamos la lista, e instalamos al menos wmsplugin y validator. En «Configuración del servidor OSM» introducimos nuestro usuario y contraseña, que previamente habremos creado desde la web de OSM. Y a partir de este momento, a familiarizarse con el programa y empezar a cartografiar 🙂

Empiezo a aprender Qt

Los últimos capítulos de Accelerated C++ los he leído un poco por encima, porque tratan de temas complejos (gestión de memoria, etc) que creo que de momento no voy a necesitar. Siempre podré volver a ellos en caso de que lo necesite.

Así que ya he empezado a aprender Qt. Como sabréis, Qt son unas bibliotecas multiplataforma de Nokia (que adquirió la noruega TrollTech a principios 2008). No es un simple conjunto de widgets (window gadgets, es decir elementos gráficos como botones, deslizadores, menús, etc), sino que aporta muchas otras funcionalidades, haciendo innecesaria la STL (Standard Template Library). Probablemente sea más comparable a Boost que a GTK+.

Hay unos cuantos libros sobre Qt, entre los que destacan:

El primero es el libro oficial, el más moderno, y sus autores conocen Qt 4 como la palma de su mano. Pero por los comentarios de Amazon, parece que podría ser más pedagógico.

El último es una introducción a patrones de diseño usando C++ y Qt que sobre Qt en sí, así que no es realmente lo que necesito.

Entre los dos restantes, el de Thelin abarca un poco más que el de Molketin (CMake, unit testing, plugins), así que es el que he elegido.

En C/C++, argc puede ser 0

Esta semana he continuado leyendo Accelerated C++. Intento seguir un ritmo de un capítulo diario, habiendo llegado ya al capítulo 10 (aproximadamente dos tercios del libro). Confío en acabarlo a lo largo de esta semana.

Hoy he descubierto una cosa curiosa. La mayoría de los programas en C/C++ incluye una línea similar a int main(int argc, char **argv) o su equivalente int main(int argc, char* argv[]) para permitir pasarle argumentos.

argv es un puntero a un array de punteros, uno para cada argumento, y argc es el número de punteros del array. El elemento inicial del array, argv[0], representa el nombre con el que se ha llamado al programa, y argv[argc] es siempre un puntero nulo. Los argumentos -si los hay- ocupan los restantes elementos del array, de argv[1] a argv[argc - 1].

Así pues, aparentemente argc debe siempre ser mayor o igual que 1. Sin embargo, resulta que como explican en stackoverflow y alt.comp.c, el estándar dice explícitamente que argc puede ser cero. Y es que por medio de las llamadas al sistema exec() de POSIX, argv[0] puede ser NULL.

Cómo borrar todos los ficheros de hace más de x días

Un usuario no ha descargado su correo electrónico en 9 meses, y me pide que le borre todos los mensajes que tengan más de 15 días. Es muy fácil de hacer, y en How-to Geek lo explican a la perfección, así que me limitaré a traducirlo.

La herramienta find de Unix (así como GNU/Linux, etc) permite que se le pasen varios argumentos interesantes, incluyendo uno para ejecutar otra orden sobre cada uno de los ficheros. Usaremos esto para averiguar qué ficheros tienen más de un cierto número de días, y entonces usar la orden rm para borrarlos.

Sintaxis de la orden

find /home/fulano/Maildir/cur -mtime +15 -exec rm {} ;

Obsérvese que hay espacios entre rm, {}, y ;.

Explicación

  • El primer argumento es la ruta a los ficheros. Puede ser una ruta, un directorio o un comodín. Recomiendo usar la ruta completa, y ejecutar la orden sin el exec rm para estar seguros de que se va a conseguir los resultados deseados.
  • El segundo argumento, -mtime, se usa para indicar el número días que tiene el fichero. Si introducimos +15, buscará ficheros que tengan más de 15 días.
  • El tercer argumento, -exec, permite pasar una orden como rm. El {} ; al final es necesario para terminar la orden.

Otra forma de hacerlo sería:
find /home/usuario/Maildir/cur -mtime +15 | xargs rm

Estas órdenes deberían funcionar en cualquier versión de Unix o distribución de GNU/Linux o *BSD.