7 de enero de 2013

Configurar una conexión ad-hoc para compartir internet

La idea es que tenemos dos computadoras, una con acceso a internet, y queremos que la otra también puede conectarse a internet, pero no contamos con un router.

Lo primero que vamos a hacer es conectar las dos computadoras, luego vamos a configurar esta conexión para que la segunda computadora pueda acceder a internet.

Ahora en la máquina que tiene la conexión a internet, que vamos a llamar Servidor, ponemos la conexión inalámbrica en modo ad-hoc, con el nombre MYSID, usando WEP con la clave 12345 (algunas versiones de windows sólo funcionan con claves de longitud 5 ó 10), usando como IP 192.68.22.1.
# iwconfig wlan0 mode ad-hoc
# iwconfig wlan0 essid MYSID
# iwconfig wlan0 key s:12345
# ifconfig wlan0 192.168.22.1 up
En la otra computadora, que vamos a llamar Cliente, repetimos estos pasos (cambiando el IP pero dentro del mismo rango por ejemplo 192.168.22.2). Sólo falta configurar Cliente para que use la conexión de Servidor como salida.
# route add default gw 192.168.22.1
Después de estos pasos deberiamos tener conectividad entre las dos computadoras.

Para compartir la conexión de internet de la computadora Servidor con la Cliente, tenemos que configurar Servidor para que pueda enrutar correctamente los paquetes de Cliente, y luego pueda reenviar la respuesta. Este tipo de conexión se llama NAT.
# sysctl -w net.ipv4.ip_forward=1
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A FORWARD -i wlan0 -j ACCEPT
El primer comando habilita en el núcleo el reenvio de paquetes. El segundo y tercero habilitan que Cliente se pueda conectar a internet usando la IP de Servidor y poder recibir las respuestas.

10 de noviembre de 2012

Nuevas Herramientas

Algunas herramientas que me fueron bastante útiles:
  • FAR: Un manejador de archivos al estilo del viejo Norton Commander para DOS, pero para Windows. Esta es su página oficial.
  • ConEmu: Un emulador de consolas para Windows con tabs. Permite por ejemplo tener varias sesiones de PuTTY abiertas simultáneamente en la misma ventana y cambiar entre ellas por medio de los tabs. El nombre oficial es ConEmu-Maximus5.
  • Clink: Agrega varias mejoras a la línea de comandos, el autocompletado es más parecido al de bash, y permite usar combinaciones de teclas para copiar (Ctrl+C) y pegar (Ctrl+V). Página oficial Clink.
  • Ffmbc: Una versión de FFmpeg con soporte de formatos más 'profesionales', aquí su sitio oficial.
  • grepWin: Para buscar en archivos. Es bastante poderoso, con muchas opciones y muy rápido para obtener resultados. Página oficial.

27 de junio de 2012

Configurando el sonido 5.1 por HDMI en Debian Wheezy

Intente varias veces configurar audio 5.1 usando solo ALSA, pero siempre me encontraba con alguna incompatibilidad con alguna aplicación. A decir verdad ALSA es un componente de bajo nivel, que hace un buen trabajo tratando de abstraer el hardware. Por otro lado muchas aplicaciones solo quieren usar el audio sin tener que preocuparse demasiado por toda la variedad de hardware existente. Si uno tiene mala suerte puede caer en ese pequeño limbo donde ciertas características del hardware son soportadas por ALSA pero no todas las aplicaciones funcionan correctamente sin hacer ajustes. Que es mi caso de sonido 5.1 por HDMI.

Pulseaudio es un intermediario entre las aplicaciones y la parte de bajo nivel (es decir ALSA). Provee una API de alto nivel. Y brinda diferentes implementaciones de bajo nivel para permitir reproducir en diferentes dispositivos, por ejemplo una salida de audio local, un servidor de audio remoto.

Este es un resumen de los pasos que seguí para configurar la salida correctamente.

  • Primero instalamos pulseaudio: sudo aptitude install pulseaudio.
  • Ahora averiguamos cual es la salida HDMI: aplay -l.
    En la salida de ese comando buscamos alguna linea donde aparezca HDMI, en mi caso aparece
    card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
    anotamos la placa (0 en el caso de arriba), y el dispositivo (3 según la salida anterior).
    Si no aparece ninguna linea lo más probable es que ALSA necesite algún parámetro para configurar la placa de audio correctamente, o que la salida HDMI no este soportada todavía.
  • Configuramos Pulseaudio para que la salida de audio sea por HDMI
    Editamos el archivo /etc/pulseaudio/default.pa y agregamos una linea similar a la siguiente
    load-module module-alsa-sink device=hw:0,3
    donde hw:0,3 hace referencia a los valores encontrados en el punto anterior.
  • Reiniciamos Pulseaudio con pulseaudio -k, para comprobar que tome los valores ingresados.
    (A veces tuve que esperar algunos segundos hasta que el servidor de Pulseaudio reinicie, o repetir varias veces pulseaudio -k).
  • Usamos speaker-test -cNN -twav para comprobar si tenemos salida por todos los canales. Reemplazamos NN por 2 para estéreo, 6 para audio 5.1 y 8 para salida 7.1. Este comando reproduce un archivo de audio con el nombre del canal por cada canal, lo que nos sirve para identificar si todas las salidas funcionan, y si los canales estan configurados correctamente.
  • Si todo funciono correctamente entonces terminamos.
  • Si solo tenemos salida estéreo entonces editamos /etc/pulseaudio/daemon, y agregamos una linea como la siguiente:
    default-sample-channels = 6
    Donde reemplazamos 6 por la cantidad correcta de canales que tenemos. Ahora volvermos a reiniciar Pulseaudio y probamos con speaker-test.
  • Si llegamos a este punto seguimos sólo con salida estéreo el problema puede estar en que el driver sólo soporte estéreo.
  • Si los canales no salen correctamente podemos intentar modificar el mapeo de canales. Editamos /etc/pulseaudio/default.pa, modificamos la linea que agregamos anteriormente para que quede algo asi:
    load-module module-alsa-sink device=hw:0,3 channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe
    Este ejemplo es para audio 5.1. Reiniciamos pulseaudio y comprobamos con speaker-test las salidas. Si no es la correcta podemos intercambiar los elementos de la lista que sigue a channel_map.
Esto fue todo.

10 de octubre de 2011

Programmer's Tools (Part III)

Some new utilities I've discovered since the last time.
  • HxD: A really fast hexadecimal file viewer and disk editor. Here is the homepage http://mh-nexus.de/en/hxd/. If you need to load very large files and other editors will fail.
  • Cygwin: The homepage of the project http://www.cygwin.com/ states that cygwin is... “A collection of tools which provide a Linux look and feel environment for Windows”. If you came from a Linux environment this is a must.
  • ImDisk: Small utility that let you mount an image disk as a virtual drive, create arbitrary size ramdisks. The page also contains other utilities http://www.ltr-data.se/opencode.html/#ImDisk (and it also is open source). I use as a ramdisk drive for compiler's temporary files.
  • Xming: An excelent X Windows Server for windows. You can configure it to work together with PuTTY and use your windows workstation to display an application running under linux.
  • Bullzip: A very nice printer driver for windows that generate a PDF file with your printing, it uses Ghostscript to generate the PDF file.

28 de junio de 2011

Compilando remotamente desde Eclipse

Mi configuración es la siguiente:
  • Una computadora de escritorio con Windows donde se ejecuta Eclipse.
  • Un servidor con Linux con los compiladores y el fuente.
Desde el servidor Linux se comparten los fuentes usando NFS o Samba. Otra opción es tener los fuentes en la computadora de escritorio y montar en el servidor usando CIFS. Como la operación más intensa sobre los fuentes es cuando se compila prefiero que el compilador pueda acceder de manera nativa a los fuentes.

Ahora que los pasos preliminares están completos, seguimos con estos pasos:

  1. Creamos un login sin password para acceder al servidor Linux. La idea es generar un par de clave pública y privada usando PuTTYgen, salvar la clave privada en un lugar seguro y agregar la clave pública al fichero ~/.ssh/authorized_keys2 en el servidor Linux. Los pasos se puede encontrar de manera más detallada por ejemplo este tutorial, o buscando en Internet "passwordless login".
  2. Creamos una sesión en PuTTY que contenga los datos necesarios para poder acceder al servidor, para seguir el ejemplo la llamamos servidor. El paso más importante aquí es asegurarnos de agregar la clave privada a la sesión en Connection/SSH/Auth.
  3. Modificamos el comando make dentro de Eclipse para que quede algo así: plink.exe -load servidor make -C /remote/src/repository , donde servidor es el nombre de la sesión creada en el paso 2 y /remote/src/repository es el path donde están las fuentes en el servidor.

En el paso 3 plink.exe nos permite ejecutar un comando en el servidor. En el ejemplo el comando make con el parámetro -C /path que sirve para indicarle un path. En el caso de necesitar algunos pasos extras antes del make se podría crear un .bat en la maquina escritorio o un script del shell en el servidor.

Nota: La razón de esta configuración es que los compiladores utilizados no tenían una versión para Windows actualizada.

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.