Instalar SUMO en OSX Yosemite

SUMO (Simulation of Urban MObility, en http://goo.gl/W8r9Vz) es un micro-simulador de tráfico distribuido bajo licencia GPL v3 disponible para Windows, GNU/Linux y OSX.

Screen Shot 2015-04-26 at 11.00.41 PM

Este fin de semana lo he instalado en una máquina Windows, y sin problema (doble click y arreando), en una GNU/Linux y lo mismo (un poco más porque había que compilar los fuentes, pero fácil siguiendo el tutorial), pero al llegar a OSX, no había manera. Como me ha costado un poco, dejo la receta aquí abajo para quien tenga la necesidad, que lo pueda compilar y hacer funcionar rápido.

  1. Instalar las command-line-tools. Si tenéis Xcode instalado, no hay problema. Si no, para instalarlas es tan fácil como invocar un comando que venga incluido en ellas, como por ejemplo git.
  2. Instalar Homebrew. Paquete esencial para tener los mínimos quebraderos de cabeza posibles. Como dicen en la página principal, se instala lanzando el comando ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)".
  3. Instalar las dependencias de SUMO. Con el comando brew install Caskroom/cask/xquartz homebrew/x11/fox gdal xerces-c.
  4. Exportar las variables de entorno CPPFLAGS y LDFLAGS. Para compilar los fuentes y enlazar los compilados: export CPPFLAGS="$CPPFLAGS -I/usr/local/include/python2.7 -I/usr/local/include -I/opt/X11/include -I/usr/X11/include/freetype2" y export LDFLAGS="$LDFLAGS -lpython2.7 -L/usr/local/lib -L/usr/X11/lib"
  5. Descargar los fuentes de SUMO y descomprimirlos. Algo hay que compilar, ¿no? pues eso, wget http://www.dlr.de/ts/en/Portaldata/16/Resources/sumo/sumo-src-0.23.0.zip (o la versión que corresponda) y descomprimirlo (vamos a suponer que está descomprimido en /Users/neko/Downloads/sumo-0.23.0). Si no tenemos wget instalado, basta con instalarlo a través de brew (brew install wget) o descargar el fichero de cualquier otra forma.
  6. Compilar los fuentes. Para ello, accedemos al directorio (cd /Users/neko/Downloads/sumo-0.23.0), preparamos los fuentes con el comando ./configure --with-fox-config=/usr/local/Cellar/fox/1.6.49/bin/fox-config -with-proj-gdal=/opt/local --with-xerces=/opt/local --prefix=/opt/sumo, compilamos con el comando make -j4 e instalamos con sudo make install sudo porque lo queremos instalar en /opt/sumo, tal y como pone en el parámetro --prefix del comando configure.

Si todo ha ido correcto, SUMO estará instalado en /opt/sumo. Para lanzarlo, los ejecutables serán /opt/sumo/bin/sumo y /opt/sumo/bin/sumo-gui, dependiendo de si queremos lanzar la simulación sin o con gráficos respectivamente.

Al lanzar el entorno gráfico de simulación puede salir el siguiente error:

FXApp::openDisplay: unable to open display :0.0

No pasa nada, es simplemente que el servidor de las X tiene que estar corriendo. Estará dentro de /Applications/Utilities, pero con escribir X11 en spotlight lo encontrará sin problemas.

Espero que os haya servido de mucho. ¡Que disfrutéis con vuestras simulaciones!

Añadir a git los ficheros migrate de django en pycharm

Pycharm doesn't love django + git

Si usas el IDE pycharm y django ≥ 1.7 (o < 1.7 con south) y como gestor de versiones usas git, probablemente te ha pasado que haces un commit y se te olvida añadir (git add) los ficheros de las migraciones. Pycharm hace «git add» automáticamente a todos los ficheros creados, salvo a los creados tras hacer un makemigrations. Para saberlo, pycharm nos los muestra en rojo en lugar de en verde.
¿Por qué este comportamiento? Realmente lo desconozco, pero imagino que porque no ha sido una acción hecha directamente por el usuario, sino como consecuencia de un migrate.

A mí me pasa a menudo que hago un commit y luego otro como un comentario «los migrates del anterior commit». Cuando esto no sólo te pasa a ti, sino que es algo común en los demás compañeros empiezas a preguntarte cómo solucionarlo, y ya de paso convertirte en el héroe que evita el 1×2 en los commits. Depende de la manera de trabajar que tengas, el tipo de integración de las ramas que hagas y demás, esto puede serte útil o no, pero nunca está de más probar algo desconocido.

Para ello podemos usar los hooks de git, que son pequeños scripts que se ejecutan cuando ocurre algún evento, como commit, push, receive. Podemos crear un hook de tipo pre-commit, que se ejecutará antes de hacer un commit, para que no nos deje hacer commit si tenemos algún fichero sin añadir.

Los hooks se instalan en la carpeta .git/hooks del repositorio de git que queramos. Cuando inicializamos un repositorio ya nos crea el directorio con algunos ejemplos.

De acuerdo con la respuesta correcta de este hilo de stackoverflow, podemos crear meter el siguiente código en el fichero pre-commit hook:

ud=`git status -u | grep '^Untracked files:$'`
 
if [ -n "$ud" ];
then 
    cat < <EOF 
¡Cuidado! Hay ficheros que no se han añadido al repositorio
EOF
    exit 1
fi

Este script lo único que hace es ver si al ejecutar git status -u existe la frase ‘Untracked files’. Si es así nos avisa con un bonito texto y no efectúa el commit. De esta manera nos dará un aviso antes de efectuar el commit y podremos subsanarlo sin tener que añadir posteriormente un commit separado.

Si aún así queremos dejar ficheros sin subir, podemos usar git commit --no-verify para que no ejecute el hook.

Más sobre git hooks:

http://git-scm.com/book/es/v2/Customizing-Git-Git-Hooks
http://githooks.com/
https://www.atlassian.com/git/tutorials/git-hooks/