13 de octubre de 2010

Instalando Cherokee y MoinMoin en ArchLinux

Instalación de ArchiLinux

ArchLinux (http://www.archlinux.org/) es una distribución de Linux que tiene como objetivo la simplicidad, «Keep It Simple» es su eslogan. Hace algún tiempo había oído hablar bastante bien de ella, pero no había encontrado el tiempo para probarla.

Como también estaba pensando en reorganizar la red en casa, pensé que esta era una buena oportunidad para probar esta distribución.

La instalación es bastante similar a otras distribuciones, aunque sólo en modo texto, el instalador sigue una secuencia de pasos y nos va presentando opciones. Desde aquí puede verse una de las características de ArchLinux, siempre supone que el usuario sabe que es lo que esta haciendo. Por ejemplo un paso antes de finalizar la instalación es presentar al usuario una lista con los archivos de configuración para que pueda customizar el sistema por completo.

En caso de duda uno puede ayudarse de la guía oficial para los detalles más puntuales y la guía para principiantes, si es la primera vez que usan ArchLinux.
De todos me encontré con un par de inconvenientes:

  • Antes de terminar la instalación, grub no podía instalar el sector de arranque en /dev/vda (la instalación fue en una máquina virtual de kvm usando virt-manager). Consultado el wiki entre la solución, primero hay que hacer que la instalación falle, de manera que los archivos necesarios queden en /boot, y luego proceder como en el wiki. 
  • Al iniciar el arranque no encuentra /dev/vdaX para montar como directorio root. El problema es que el disco de inicio o initrd no contiene los drivers para virtio (virtio_blk, virtio_pci), consultando de nuevo el wiki la solución es agregar al final de la instalación los drivers al tener la oportunidad de configurar el archivo mkinitcpio.conf.
Una pieza fundamental para un servidor es openssh, cuya instalación es ejectuar pacman -S openssh y editar los archivos /etc/hosts.allow y /etc/hosts.deny para permitir conexiones. Pueden consultar el wiki para más detalles.

El resto es bastante simple para pacman -Syu para sincronizar y actualizar con los repositorios. 
Instalación de Cherokee y MoinMoin

Para instalar Cherokee ejectuamos pacman -S cherokee, queremos que cherokee se ejecute desde el inicio del sistema tenemos que modificar el archivo /etc/rc.conf y agregar cherokee a la línea DAEMONS.
Una de las ventajas de Cherokee es que tiene un wizard que automatiza la tarea de editar el archivo de configuración, simplemente apuntando donde están los archivos de MoinMoin y spawn-fcgi.
Para poder ejectuar MoinMoin necesitamos instalar spawn-fcgi y moinmoin, para ello basta pacman -S moinmoin spawn-fcgi.

Ahora necesitamos preparar un directorio para que puede ser utilizado por la instalación de MoinMoin. Por ejemplo:

Creamos la carpeta
# mkdir /srv/http/wiki
# cd /srv/http/wiki
Copiamos los archivos de configuración y creamos un enlace para los archivos estáticos
# cp -R /usr/share/moin/* .
# cp server/moin.fcgi config/wikiconfig.py .
# ln -s /usr/lib/python2.6/site-packages/MoinMoin/web/static/htdocs htdocs
Corregimos permisos para que sean accesibles por el servidor web
# chown -R http:http /srv/http/wiki
# chmod -R ug+rwx /srv/http/wiki
# chmod -R o-rwx /srv/http/wiki
Nota: Opté por el camino más simple de copiar todos los archivos pero al parecer no todos son necesarios en una instalación y se podría evitar copiar algunos.
Ahora usando el wizard de Cherokee podemos agregar nuestro MoinMoin. Comprobar que en Sources este correctamente seteado en el interprete que archivo debe ejecutar /srv/http/wiki/moin.fcgi (la línea aparecía trunca en mi servidor).

Para terminar de configurar MoinMoin puede servirse de alguna de las guías del wiki. Pueden usar como punto de partida las guías para Ubuntu o Centos, obviando la parte de la instalación de paquetes.

Para un próximo artículo la instalación de Gitweb en Cherokee.

Update (02/11): Debido a una reciente actualización del interprete default de python a la versión 3.x, mi setup dejo de funcionar. Para arreglarlo seguí parte de este artículo, en concreto lo que me ayudo es borrar los archivos en la cache, en mi caso también tuve que editar algunos archivos .py para que apunten al intérprete correcto /usr/bin/python2.

3 de octubre de 2010

Lista de tareas pendientes.

  • Estoy aprendiendo Scala, es un lenguaje que combina programación funcional con programación imperativa, usando la máquina virtual de java. Tiene una sintaxis muy amplia y rica, que puede parecer demasiado compleja para manejar adecuadamente.
  • Migrar mis repositorios a un sistema de control de versiones distribuido. La mayoría de las cosas que hago son simples y subversión es suficiente, pero los sistemas distribuidos tienen ciertas ventajas interesantes (historial local, branches). Por ahora Git y Mercurial son las alternativas más interesantes, idealmente me gustaría poder conservar el historial de cambios que tengo.
  • Estuve usando Eclipse como IDE de Scala. Con mi configuración (un quad core 2 Ghz y 4 Gb de memoria) es lento, y a medida que pasa el tiempo se ralentiza cada vez más, hasta el punto que es mejor cerrar todo y volver a abrirlo. Ni recuerdo que fuera tan lento cuando tuve que usarlo para programar en C++, supongo que sera culpa de algún plugin, lo que me hacer acordar a Firefox y sus problemas de memoria.
  • Como IDE alternativa decidí probar Emacs, es más difícil de configurar satisfactoriamente, le falta algunas facilidades más avanzadas (como autocomplete), pero debo decir que no me llevo mucho tiempo acostumbrarme, y me sentí más productivo que en Eclipse. Esto me motivo a intentar aprender un poco más.
  • En el lapso de algunos meses rompí un par de discos rígidos, afortunadamente no perdí información, pero debería implementar alguna forma de copias de seguridad, para empezar los archivos de configuración.
  • Otra forma de tener un copia de seguridad de mis archivos de configuración es escribir en el blog algunos artículos al respecto.
  • En algún momento tenía configurado Redmine, pero alguna transición de paquetes en Debian Squeeze hizo que se rompa la instalación. Aunque Redmine siempre me simpatizó por su completitud y cierta facilidad de uso, lo que no me gusta es que este programado en Ruby.
  • Estaba usando TWiki como wiki interno (es más enterprise), pero cayó en desgracia en Debian por motivos varios, en principio me mude a Foswiki (un fork open source de TWiki), pero por ahora no parece que vaya a ser empaquetado oficialmente dentro de Debian. Así que estoy considerando migrar a MoinMoin, pero veo difícil poder conservar el historial, además TWiki/Foswiki estan programados en Perl lo que agrega cierta dificultad tratar de hacerlo a mano.
  • En estos días me surgió la inquietud de hacer algún curso. Es una época fea del año porque la mayoría de los cursos van por la mitad del segundo cuatrimestre, pero voy a ver si encuentro algo que me guste.
  • Tengo que encontrar algún libro que me guste, no puede ser que hace más de un año que no encuentro uno que guste de verdad.
  • Debería tomarme algunos días de vacaciones, me las debo.

13 de septiembre de 2010

Cambiando el icono de una carpeta en Windows

Algunos programas tienen un icono de carpeta diferente, por ejemplo Skype. Esto puede hacer que un programa tenga una mejor “presentación” para el usuario.
Examinando la carpeta con el Explorador de Windows podemos ver que contiene un archivo desktop.ini con atributos de sistema y oculto. Examinando podemos ver que contiene algo parecido a lo siguiente:
[.ShellClassInfo]
IconIndex=42
IconFile=C:\Program Files\Program\MyProgram.exe
Ahora con esta información podemos copiar este archivo desktop.ini, agregarlo a las carpetas de los programas que queremos, y modificar para que use nuestros iconos. Hacemos que IconFile apunte a un archivo .ico, y IconIndex=0.
Podemos consultar el articulo de Microsoft Customizing Folders with Desktop.ini, para saber que otras opciones tenemos disponibles.

* Esto funciona en cualquier carpeta, por ejemplo también funciona en las del Menú de Inicio.

13 de agosto de 2010

Usando LVM para migrar particiones en Linux

Una de las ventajas que tienen los discos duros modernos es que tiene incorporada funciones para predecir un mal funcionamiento, de modo que los datos importantes se puedan salvaguardar.

Hace algunas semanas recibo varias notificaciones que afirmaban que el disco de sistema tenia errores de lectura persistentes. Como esta computadora tiene instalado varios servicios, con sus configuraciones personalizadas, la sola idea de pasar varios días reinstalando servidores no parecía muy atractiva y decidí buscar alternativas para minimizar el downtime.

Primero usando la guia de smartmontools (Bad block HOWTO for smartmontools), intente cuantificar los daños y ver si se podía reparar de alguna forma el disco. Afortunadamente los sectores con errores no correspondían a ninguna partición con datos, pero desafortunadamente los sectores eran irrecuperables. De modo que para evitar cualquier pérdida la mejor opción era reemplazar el disco y migrar los datos antes de que el daño se extienda.

Desde hace varios años que uso LVM para realizar mis instalaciones de sistemas Linux. Una de las ventajas que tiene LVM es que permite cambiar el tamaño de las particiones dinámicamente sin tener que mover los datos; además algunos sistemas de archivos populares, como ext3, xfs, ext4, permiten realizar esta operación aun cuando están siendo usados.

Una de las primeras cosas que pensé es crear una imagen espejo del disco de sistema original y luego copiarla sobre el nuevo disco. Una de las desventajas de esta solución es que necesito que el disco de sistema no este siendo utilizado. Otra es que el disco está dañado y hacer una imagen no esta tan simple.

Buscando enctre una mejor alternativa, usar las herramientas provistas por LVM (pvmove) para migrar las particiones a un nuevo disco (Removing an Old Disk).

Como root primero creamos una volumen físico
# pvcreate /dev/sdd2
Luego agregamos la partición al grupo de volúmenes
# vgextend vg /dev/sdd2
Ahora movemos todos los dato de la antigua partición a la nueva
# pvmove /dev/sda2 /dev/sdd2
Borramos la partición dañada del grupo
# vgreduce vg /dev/sda2
El primer error que cometí es ejecutar pvmove mientras estaba corriendo mi desktop manager. Aparentemente pvmove bloquea las escrituras a las particiones afectadas mientras esta realizando la copia, lo que pareció no gustarle a mi desktop manager. La solución fue ejecutar la instrucción en modo single-user (arrancar en modo de recuperación, o si nos logueamos por consola podemos usar telinit 1 para pasar a modo single-user).

Luego de algun tiempo, que supongo proporcional al tamaño de los datos a copiar, pvmove termina de ejecutar y tenemos los datos en el nuevo disco.

Aquí cometí el segundo error, correctamente me di cuenta que también debía migrar la partición de arranque (que no esta dentro del volumen LVM). Pero me equivoque en el comando adecuado, update-grub solo reinstala en el arranque en la partición previamente configurada, es decir no toma en cuenta que partición esta montada en /boot. Lo correcto es usar dpkg-reconfigure grub-pc, que permite seleccionar una nueva particion como arranque.

7 de agosto de 2010

Little arithmetic tricks applied to programming

Sometimes when programing we have to resolve some simple arithmetic problems, like calculating the remainder elements from a buffer, counting the numbers of elements, etc. In these cases is easy to commit "off by one" mistakes, ie we account one element more or one less. In the better case we are lucky if the program crash in the right place, but we often end up with a bug that is really hard to find.
One trick that I find often useful in these situations is to think that the buffers are much smallers, like zero or one bytes; another option is to think a large and easy number like 1000, etc.

14 de marzo de 2010

Instalando un repositorio de Subversion (en Debian Squeeze)

Estos pasos fueron realizados con la versión testing de Debian Squeeze, pero deberían servir como punto de partida. También debo señalar que estos pasos fueron pensado para facilitar el acceso de los usuarios, y no tanto por la seguridad.

Creación del repositorio

Como usuario root creamos un directorio donde estará el repositorio, por ejemplo:
# mkdir /var/svn-repos
Creamos el repositorio propiamente dicho:
# svnadmin create /var/svn-repos/test_repo

Ajustar permisos del repositorio

Para que el repositorio pueda ser usado por varios usuarios tenemos que ajustar algunos permisos. Primero creamos un grupo, donde agregaremos a aquellos usuarios que van a poder acceder al repositorio. Por ejemplo:
# addgroup development
Ahora agregamos los usuarios al grupo creado:
# adduser juan development
# adduser luis development
Ajustamos los permisos del repositorio:
# chown -R www-data:development /var/svn-repos/*
# chmod -R g+w /var/svn-repos/*
(Este ultimo comando se podría mejorar a find . -perm -u=w -print0 | xargs -0 chmod g+w, de manera que solo agregamos permisos de escritura solo a aquellos archivos que ya lo tienen)

Accediendo al repositorio

Ahora podemos acceder al repositorio a través de ssh:
$ svn co svn+ssh://hostname/var/svn-repos/test_repo
Para evitar que debamos responder repetidas veces la passphrase conviene utilizar ssh-agent con una clave privada. Si queremos acceder al repositorio por http primero tenemos que crear una base de datos con los usuarios permitidos:
# htpasswd -c -m /etc/apache2/dav_svn.passwd juan
# htpasswd -m /etc/apache2/dav_svn.passwd luis
La primera linea crea el archivo, la siguiente sirve para agregar los demás usuarios. Ahora modificamos el archivo /etc/apache2/mods-available/dav_svn.conf agregando:
<Location /test_repo>
   DAV svn
   SVNPath /var/svn-repos/test_repo
   AuthType Basic
   AuthName "Subversion Repository"
   AuthUserFile /etc/apache2/dav_svn.passwd
   Require valid-user
</Location>
Recargando la configuración de apache con # invoke-rc.d apache2 reload, podemos acceder al repositorio como usuario:
$ svn co http://hostname/test_repo
También podremos acceder desde un navegador, con nuestro usuario y password, al repositorio desde la dirección http://hostname/test_repo.

Instalando ViewVC

La página de acceso por web es bastante simple, si queremos algo con más funcionalidad podemos instalar ViewVC. Editamos el archivo /etc/viewvc/viewvc.conf. Dentro de la sección [general] agregamos una linea así:
svn_roots = test_repo : /var/svn-repos/test_repo
Opcionalmente: podemos comentar la linea que comienza con cvs_roots, a menos que hayamos instalado un repositorio Cvs. También podemos habilitar la opción root_as_url_component. Creamos un archivo /etc/viewvc/apache.conf con la configuración para apache. Este archivo contiene la siguiente linea:
ScriptAlias /viewvc /usr/lib/cgi-bin/viewvc.cgi
Agregamos este archivo al directorio con las configuraciones de apache y recargamos:
# ln -sf /etc/viewvc/apache.conf /etc/apache/conf.d/viewvc.conf
# invoke-rc.d apache2 reload
Una vez terminado los pasos anteriores tenemos un interfaz web más bonita que se puede acceder desde: http://hostname/viewvc/test_repo.

Referencias:

28 de enero de 2010

Programmer's Tools (Part II)

More tools that can be useful for the windows programmer

You can check Scott Hanselman's Tool List for Windows http://www.hanselman.com/tools for more utilities.

10 de enero de 2010

Programmer's Tools (Part I)

There are some tools that are useful for a programmer working under windows, independently from the language they work on.

Next installment will bring more advanced tools.