Delirios de un Informático

Actualizador de Calibre en Mac OS X

Uso Calibre para gestionar mi biblioteca digital desde hace mucho, y he sufrido la versionitis de su autor con una actualización semanal. Debido a que no dispone de un actualizador automático he creado este pequeño script que descarga la última versión, la instala en /Applications y deja el archivo DMG en la carpeta de descargas:

#!/bin/bash
 
CALIBRE_DOWN="http://status.calibre-ebook.com/dist/osx32"
CALIBRE_LAST=`curl --head --silent ${CALIBRE_DOWN} | grep "Location" \
	| awk '{print $2}' | perl -pi -e 's/\r\n//g'`
 
CURRENT_USER=`whoami`
CALIBRE_NAME=`echo ${CALIBRE_LAST} | awk -F '/' '{print $5}'`
CALIBRE_FILE="/Users/${CURRENT_USER}/Downloads/${CALIBRE_NAME}"
 
if [ ! -f $CALIBRE_FILE ]; then
	wget "${CALIBRE_LAST}" -O "${CALIBRE_FILE}"
fi
 
if [ -f $CALIBRE_FILE ]; then
	cd "/Applications/"
	rm -rf 'Calibre.app'
 
	CALIBRE_VOLUME=`hdiutil attach "${CALIBRE_FILE}" \
		| grep "calibre" | awk '{print $3}'`
 
	cp -R "${CALIBRE_VOLUME}/calibre.app" "/Applications/Calibre.app"
 
	hdiutil detach "${CALIBRE_VOLUME}" > /dev/null
fi

Cómo instalar Redmine 2.2 con Apache en subdirectorio

En 2011 ya comenté cómo instalar Redmine con Apache en subdirectorio pero se trataba de versión 1.2. Hace unos días recurrí a estas instrucciones para instalar la reciente versión 2.2 pero la cosa se complicó un poco: se proporcionan instrucciones oficiales para instalar en un subdirectorio pero aquí, aquí y aquí se habla largo y tendido de que no funciona correctamente.

El problema parece estar en que al indicar el subdirectorio mediante el archivo environment.rb las direcciones de los archivos estáticos se generan correctamente pero no los enlaces de la interfaz. Modificando la configuración para que se generen correctamente, dejan de funcionar los archivos estáticos. Tras probar mil y una opciones, al final acabé haciendo una instalación híbrida: configurar Apache para que sirva los estáticos y realice las llamadas a Redmine mediante un proxy, utilizando el servidor webrick.

Las instrucciones de instalación sugieren instalar una cantidad de dependencias que no es normal (¿para qué demonios necesito compilar una extensión nativa de PostgreSQL si no lo voy a usar?) por lo que mejor realizar una instalación básica en Debian:

apt-get install ruby rubygems
apt-get install libmagick9-dev libmysqlclient-dev libsqlite3-dev libpq-dev ruby-dev
gem install rails --include-dependencies
gem install rake --version=0.8.7
gem install builder --version=3.0.0
gem install bundler coderay fastercsv jquery-rails json mysql2 net-ldap
gem install pg rack-openid rmagick sqlite3 test-unit yard
gem install jquery-rails --version=2.0.2
gem install mocha --version=0.12.3
gem install mysql --version=2.8.1
gem install shoulda --version=2.11
gem install ruby-openid --version=2.1.8
apt-get remove --purge libmagick9-dev libmysqlclient-dev libsqlite3-dev libpq-dev ruby-dev
apt-get autoremove --purge

Una vez instaladas las dependencias, la instalación de Redmine se realiza con los siguientes comandos:

/var/lib/gems/1.8/bin/rake generate_secret_token --trace
RAILS_ENV=production /var/lib/gems/1.8/bin/rake db:migrate
RAILS_ENV=production /var/lib/gems/1.8/bin/rake redmine:load_default_data
ruby script/rails server webrick -e production

Para que los enlaces de la interfaz se generen con el correspondiente subdirectorio hay que modificar el archivo config/environment.rb cambiando la última línea por lo siguiente:

RedmineApp::Application.routes.default_scope = {:path=>'/redmine', :shallow_path=>'/redmine'}
RedmineApp::Application.initialize!
Redmine::Utils::relative_url_root = '/redmine'

Para que los archivos estáticos se carguen correctamente, es necesario modificar el archivo config/environments/production.rb añadiendo la siguiente línea:

config.action_controller.asset_host = "http://ejemplo.com/estaticos"

Habrá que copiar la carpeta public de Redmine para que sea accesible desde http://ejemplo.com/estaticos/redmine, ya que todas las llamadas se realizarán añadiendo el subdirectorio. Por último, la configuración para que Apache realice las llamadas a webrick sería la siguiente:

<Location /redmine>
	ProxyPass http://localhost:3000/redmine
	ProxyPassReverse http://localhost:3000/redmine
</Location>

Después de realizar todos estos pasos, resulta evidente que un proyecto de la talla de Redmine debería simplificar el proceso para una instalación tan común como esta y tener una documentación más completa al respecto.

Mi migración a Evernote: tareas, favoritos, lectura y notas

Llevaba bastante tiempo utilizando Evernote para la gestión de notas sencillas y estaba muy contento con el servicio. Las aplicaciones nativas para iOS y Android me parecen excelentes y la nueva versión de la aplicación para Mac OS X (la 5.0) ha mejorado enormemente, acabando con los serios problemas de rendimiento que tenía la rama 3.x cuando se tenían muchas etiquetas. Además, la versión web también es bastante buena, aunque los navegadores sufren bastante y a veces se hace lenta.

La posibilidad de añadir a las notas contenido HTML, asociarle una URL, añadirle etiquetas y geolocalización hace que cubra las necesidades para anotar casi cualquier cosa, así que poco a poco se ha ido convirtiendo en la solución a varios de mis problemas.

Tareas / Getting Things Done

Encontrar un software decente para la gestión de tareas (compatible con Getting Things Done) es algo que me ha costado mucho. He probado multitud de alternativas pero nunca me encontraba realmente cómodo por lo que al final las tareas se realizaban sin llevar el recomendado registro. Pasé por Wunderlist, Producteev, Astrid, Remember The Milk, Tracks e incluso Redmine para acabar recurriendo a lo más simple: notas sencillas organizadas en carpetas. Al poder crear pilas de libretas, se pueden organizar las tareas de forma muy eficiente:

Personal:

  • Blog
  • Frikadas
  • Lectura
  • Lugares
Trabajo:

  • Proyecto1
  • Proyecto2
  • Proyecto3
  • Proyecto4
Papelera:

  • Descartado
  • Eliminado
  • Finalizado
  • Leído

La lógica es sencilla: cada tarea es una nota en la correspondiente libreta. Se separan las tareas personales de las de trabajo, y una vez finalizadas se mueven a la libreta correspondiente dentro de la pila Papelera. De este modo se lleva un registro detallado de todo lo realizado, quedando categorizado el motivo de la finalización de la tarea. Opté por este sistema porque es más fácil mover una nota a una libreta para cada motivo (descartado, finalizado…) que moverla a una única libreta añadiéndole una etiqueta que indique lo mismo…

El único problema que encontré resultó ser la interfaz de la aplicación de escritorio, ya que la disposición cuadriculada por defecto no me resultaba la más cómoda para la gestión de tareas. Pero como Evernote dispone de varias disposiciones, me llegó con cambiar a Vista de lista para que se pareciera mucho más a un software clásico de gestión de tareas.

Favoritos

Los cambios realizados en Delicious después de que fuera vendido por Yahoo! no gustaron a muchos. Yo seguí utilizando el servicio hasta que la necesidad de gestionarlos desde diferentes dispositivos (teléfono, tablet, portátil…) me hizo buscar aplicaciones. No encontré nada que fuera mínimamente cómodo, por lo que tras buscar alternativas me topé con este post (a través de Life Hacker) en el que se explicaba cómo realizar una migración completa desde Delicious, generando un un archivo XML que Evernote permite importar. El autor proporciona una utilidad programada en Javascript que permite convertir el XML del volcado de Delicious en el archivo Enex que reconoce Evernote.

Lectura / Read it Later

Otra de las necesidades que tengo es el concepto Read itLater que software como Pocket, Instapaper o Readability permiten gestionar de forma bastante decente. Cada uno tiene sus ventajas pero requiere acceder a otra web o usar otra aplicación más. Además, Evernote dispone de Clearly, una extensión para Firefox y Chrome que permite formatear para lectura cualquier página web (al igual que los servicios que he comentado) con el plus de poder añadirlo directamente a una libreta en Evernote (en mi caso, Lectura) para su posterior lectura en cualquier dispositivo.

En mi caso, lo mejor es que después de leerlo puedo añadir directamente a mis favoritos con sólo mover la nota a la libreta correspondiente. Y para rizar más el rizo, tengo configurada una tarea en IFTTT que al marcar como starred un elemento en Google Reader, cree una nota con el título, dirección y contenido en la libreta Lectura, simplificando el proceso de añadir contenidos a la lista de Read it Later.

Otros usos

En la pila de Personal tengo además varias libretas que me ayudan a organizar más cosas:

  • Restaurantes: cada vez que me recomiendan un lugar donde ir a comer lo anoto aquí añadiendo la dirección en el campo Posición, de modo que luego puedo abrir directamente un software de mapas para generar una ruta o visualizar la lista completa de restaurantes en un mapa general. El contenido de la nota es ideal para anotar las especialidades o lo que no se debe probar…
  • Lugares: al igual que con los restaurantes, anoto los lugares pendientes de visitar con la posición y una web de referencia, así como cualquier información de utilidad a la hora de visitarlo
  • Recetas: como la mayoría de recetas que me interesa tener a buen recaudo proceden de la web, utilizo Evernote para guardar todo el contenido de la web con un enlace, y añadiendo los ingredientes como etiquetas para después localizarlas fácilmente cuando me encuentro con el típico problema de “tengo unas cuantas setas y unas verduras que sobraron ayer, ¿qué demonios puedo cocinar?

En resumen: en vez de utilizar varias aplicaciones para las diferentes necesidades, creo mucho mejor utilizar un buen software que permita centralizar todo de un modo cómodo. Simplemente tener una única interfaz para todo ahorra mucho mucho tiempo….

Port knocking

Gracias al siempre útil Vicente Navarro descubro el port knocking, una técnica que permite abrir puertos únicamente cuando se van a utilizar y de un modo muy ingenioso: mediante el envío de una serie de paquetes predefinidos a diferentes puertos y a ciertos intervalos que un daemon interpreta para abrir el puerto. Es una medida de seguridad estupenda, ya que de este modo nunca se tendrá abierto un puerto que puede ser vulnerable a ataques :).

Cómo instalar Redmine con Apache en subdirectorio

Ya comenté anteriormente cómo instalar una aplicación programada en Ruby en Debian. En este caso se trata de Redmine, un estupendo gestor de proyectos que tiene la gran ventaja de ser muy completo para desarrolladores pero que también resulta muy sencillo para usuarios no técnicos.

El mayor problema que tuve al instalar Redmine fué al configurarlo para que funcionara sin problemas en un subdirectorio del tipo midominio.com/redmine, ya que parece pensado para ejecutarse en un dominio directamente. Para eso he optado por usar el directorio /var/lib/redmine porque si se ubica en la raiz del servidor web y se utiliza el servidor integrado a través de un proxy (que explicaré más adelante), se podría acceder directamente a los archivos Ruby en texto plano, lo que supone un evidente problema. Por otro lado, he utilizado SQLite de nuevo, pero también es posible utilizar MySQL.

El proceso sería el siguiente:

cd /var/lib
wget http://rubyforge.org/frs/download.php/75097/redmine-1.2.1.tar.gz
tar xzvf redmine-1.2.1.tar.gz
mv redmine-1.2.1.tar.gz redmine && cd redmine
sudo apt-get install ruby libruby rubygems rake ruby1.8-dev libsqlite3-dev
export GEM_HOME=/var/lib/redmine/vendor
gem install rails -v=2.3.11
gem install rake -v=1.1.0
gem install i18n -v=0.4.2
gem install fcgi sqlite3
cp config/database.yml.example config/database.yml

En este punto es necesario editar el archivo database.yml para añadir la configuración de la base de datos. En mi caso, para SQLite he usado lo siguiente:

production:
  adapter: sqlite3
  database: db/redmine.db
  host: localhost
  username: root
  password:
  encoding: utf8

El siguiente paso es realizar la instalación de Redmine:

rake generate_session_store
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data

Ahora es necesario dejar las primeras líneas del archivo environment.rb así:

# Be sure to restart your web server when you modify this file.

# Uncomment below to force Rails into production mode when 
# you don't control web/app server and can't set it the proper way
ENV['RAILS_ENV'] ||= 'production'
ENV['GEM_HOME'] = '/var/lib/redmine/vendor'

También es necesario añadir la línea Redmine::Utils::relative_url_root = "/redmine" al final del archivo para indicar el subdirectorio en donde estará instalado. Una vez realizados los cambios puede comprobarse que funcione correctamente ejecutando el servidor integrado mediante el comando ruby script/server webrick -e production que no debería dar ningún error.

Para integrar Redmine con Apache mediante FastCGI, es necesario añadir lo siguiente a la configuración, bien global o bien de un vhost:

Alias /redmine/ "/var/lib/redmine/public/"
FastCgiServer /var/lib/redmine/public/dispatch.fcgi -processes 1

<Directory "/var/lib/redmine/public>
	AddHandler fastcgi-script .fcgi
	Options +ExecCGI
	AllowOverride all
	Allow from all
	Order allow,deny
</Directory>

En el directorio /var/lib/redmine/public es necesario también renombrar el archivo dispatch.fcgi.example a dispatch.fcgi y añadir crear un .htaccess con el siguiente contenido:

RewriteEngine On
RewriteBase /redmine
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /redmine/dispatch.fcgi [QSA,L]

Con estos pasos por fin quedará instalado en el subdirectorio /redmine. Si esta alternativa no es posible, puede recurrirse al servidor integrado WEBRick y que Apache realice peticiones mediante proxy. Para este caso, la configuración de Apache sería:

<Location /redmine>
        ProxyPass http://127.0.0.1:3000
        ProxyPassReverse http://127.0.0.1:3000/
</Location>

El servidor se puede lanzar con el comando ruby /var/lib/redmine/script/server webrick -d -e production. Por último, si se quiere usar SSL con este método, es necesario añadir a la configuración de Apache la línea RequestHeader set X_FORWARDED_PROTO 'https' para que el servidor WEBRick genere las URLs correctamente.