viernes, 31 de diciembre de 2010

¿Cuál es la mejor forma de guardar tu música?

Fue hace aproximadamente 15 años, que descubrí un maravilloso software llamado "MusicMatch Jukebox" que te permitía convertir o "rippear" tus CDs a MP3. En esos momentos, el solo hecho de poder guardar canciones en mi computadora me era fascinante. Hoy que los MP3s son el pan de cada día, mis estándares han cambiado bastante. Eventualmente me di cuenta que el encoder del dichoso MusicMatch era pésimo, y que la música que había guardado usando un bitrate de 96kbps de ninguna manera era fiel al CD original. Decidí que era momento de darle un "upgrade" a mi música y volver a rippearla, solo que ahora utilizando "BladeEnc" a 128kbps. En esos tiempos, el costo de almacenamiento no me permitía el lujo de un bitrate mayor, y pensé que este balance entre calidad/tamaño sería ideal. Hoy, mas de 10 años después, el costo de almacenamiento se ha reducido mas de cien veces, como se puede ver en la siguiente tabla.

Esto significa que otra vez podría rippear toda mi colección de música preocupándome solo por la calidad, sin importar el espacio...¿cierto? En parte. Aún cuando podría simplemente guardar todo en formatos "lossless", como FLAC, que genera alrededor de 30MB por canción, en la vida diaria esto no es práctico. Mi colección completa de música en FLAC ocuparía alrededor de 500GB. En mi computadora de escritorio tengo espacio de sobra para esto, pero ¿que va a pasar cuando quiera hacer streaming de mis canciones a través de Internet? ¿O cuando quiera grabar un CD de MP3 para el coche? ¿Que tal un reproductor portatil de MP3?

Tener una biblioteca completa en un formato lossless no es práctico para ninguna de estas aplicaciones, y eso sin contar los problemas de compatibilidad (Al menos yo no se de ningún estereo de coche que pueda reproducir FLAC). Esto me obliga a regresar a un formato con compresión y pérdidas (lossy), y a la vez me abre un intimidante mundo de opciones. ¿Utilizo MP3, OGG, o WMA? ¿Es mejor ABR, VBR o CBR? ¿160, 192 o 256 kbps? El tiempo que voy a invertir en importar toda mi música otra vez es considerable, y para mi es importante tenerla en un formato que no va a desaparecer en el futuro previsible. Después de investigar un buen rato, encontré que OGG es un excelente codec (además de que es Open Source), pero al momento de escribir esto, no hay mucha compatibilidad fuera de una computadora. WMA es de Microsoft, y si salió de Microsoft, tiene que ser malo ¿o no? En realidad no es tan malo, y aunque le gana a OGG en compatibilidad, yo quiero algo que funcione en la mayor cantidad de aplicaciones. Me quedo con el probado y conocido MP3.

Ahora solo queda contestar la pregunta: ¿En que calidad debo codificar mis MP3? Es decir, ¿En qué punto deja de ser perceptible la diferencia entre un archivo MP3 y el audio original de un CD? La respuesta varía de persona a persona, y aunque ya existen estudios con información al respecto, me dió curiosidad conocer mi percepción personal. Para realizar este experimento, existe un método llamado "Blind A/B testing". La idea general es codificar una canción (que se conozca bien) a diferentes niveles de calidad. A la persona que esta haciendo la prueba se le presentan dos opciones, A y B, y ésta decide cuál suena mejor.

Para reproducir la música, utilizo un DAC FiiO E7, audífonos Etymotic ER-6i, y el excelente ABX Comparator, un plugin para foobar2000 que sirve precisamente para este tipo de pruebas. Para esta prueba, utilicé 3 canciones que conozco bien como muestras:
  • Hotel California - The Eagles (No es mi canción favorita, pero es una buena canción para probar equipos de sonido)
  • Weird Fishes - Radiohead (Buena mezcla de sonidos naturales y sintéticos)
  • Soma - The Smashing Pumpkins (Rock con mucha distorsión)
Según lo que investigué, lo ideal es hacer un máximo de 16 pruebas continuas para cada muestra. Este número asegura un resultado confiable, ya que mas de esto puede causar fatiga auditiva. En mi caso, estaré comparando un archivo "lossless" (FLAC) contra su equivalente codificado usando LAME en las siguientes configuraciones (en orden de calidad):
  • 96kbps CBR
  • 128kbps CBR
  • 160kbps CBR
  • medium preset(~150kpbs)
  • 192kbps CBR
  • standard preset (~190kbps)
  • extreme preset (~240kbps)
Todavía existe otro nivel de calidad (insane preset), pero dudo mucho que pueda distinguir alguna diferencia después de 192kbps. Para automatizar la conversión, programé un script en Perl que se puede bajar aquí. El script acepta un archivo wav como parámetro. Después de terminar la conversión de cada una de las canciones, las cargué a foobar y comencé las pruebas con las muestras en orden ascendente de calidad. Me fué muy facil identificar cuál era el archivo lossless en todas las pruebas hasta 160kbps. Sin embargo, como era de esperarse, a partir de 192kbps tuve muchos problemas para distinguir las dos muestras. Aún así, juraría que en unos casos pude escuchar algunos artefactos de compresión, y para no quedarme con la duda, me decidí por la última opción: extreme preset. Con todas las consideraciones anteriores, es mi opinión que esta configuración es la ideal. Con ésta se logra comprimir una canción a 8MB en promedio, y se utiliza un bitrate variable alrededor de 240Kbps. La realidad es que pocas personas se preocupan por la calidad del audio que escuchan, y de las que lo hacen, todavía menos podrían distinguir la diferencia entre una codificación de esta calidad y el audio directo de un CD. Me es difícil creer que algún día esta calidad no sea suficiente para mi, y por tanto empezaré de nueva cuenta el arduo proceso de convertir todos mis CDs usando esta elección.

¡Feliz año 2011!

lunes, 27 de diciembre de 2010

Como compartir una conexión VPN usando VPNC

Tengo lo siguiente:
  • Router 192.168.1.1
  • Desktop 192.168.1.10 (Ubuntu)
  • Laptop 192.168.1.49 (Windows Vista)
En la desktop estoy utilizando 'vpnc', un cliente para VPNs de Cisco. Este cliente crea una nueva conexión 'tun0' (checa el nombre usando ifconfig). Quiero compartir esta conexión con la laptop. Podemos lograrlo con estos comandos:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i eth0 -d 10.0.0.0/8 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
sysctl net.netfilter.nf_conntrack_acct=1

Esto solo redirecciona el tráfico hacia la vpn. Para redireccionar lo demás:
iptables -A FORWARD -i eth0 -j ACCEPT

A la laptop le ponemos un IP fijo (192.168.1.49), máscara 255.255.255.0, y como gateway la desktop (192.168.1.10). Para DNS usamos 192.168.1.10 y 192.168.1.1.

lunes, 15 de noviembre de 2010

Ajustar la velocidad del mouse en Ubuntu

Como se nota que ya estoy envejeciendo. Hace algunos años, problemas como RSI no era en absoluto algo que me preocupara. Sin embargo, mis articulaciones, en especial mis muñecas, ya resienten las largas horas de trabajar en la computadora. Para prevenir algún problema mas serio, decidí probar el Zero Tension Mouse. Es un mouse horrible y estorboso, pero lo que importa es que sea cómodo.



Un problema con este mouse es que tiene un sensor láser demasiado sensible, tanto asi que no es posible usarlo ni con el ajuste de velocidad mas lenta en Ubuntu. Para arreglar este problema tuve que buscar otra manera de ajustar la sensibilidad. Primero, hay que buscar la lista de dispositivos que estan conectados:

kenneth@coolnas:~$ xinput --list --short
⎡ Virtual core pointer                  
id=2 [master pointer  (3)] ⎜  
↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)] ⎜  
↳ Logitech USB Receiver                    id=8 [slave  pointer  (2)] ⎜  
↳ Logitech USB Receiver                    id=9 [slave  pointer  (2)] ⎜  
↳ Logitech USB Trackball                   id=11 [slave  pointer  (2)] ⎜ 
↳ Macintosh mouse button emulation         id=12 [slave  pointer  (2)] ⎜ 
↳ btnx mouse                               id=13 [slave  pointer  (2)] ⎜ 
↳ HID 0a45:0001                            id=15 [slave  pointer  (2)] 
⎣ Virtual core keyboard                    id=3 [master keyboard (2)]  
↳ Virtual core XTEST keyboard              id=5 [slave  keyboard (3)]  
↳ Power Button                             id=6 [slave  keyboard (3)]  
↳ Power Button                             id=7 [slave  keyboard (3)]    
↳ Dell Dell USB Keyboard                   id=10 [slave  keyboard (3)]   
↳ btnx keyboard                            id=14 [slave  keyboard (3)]

En mi caso, la entrada que corresponde a mi mouse es "HID 0a45:0001".
Ya identificado, ahora podemos ajustar la sensibilidad:
xinput --set-prop "HID 0a45:0001" "Device Accel Constant Deceleration" 6
¡Listo! Si no estas conforme, puedes cambiar el último valor para hacerlo mas rápido o lento.

martes, 5 de octubre de 2010

Problemas con SVN merge

Hoy traté de reintegrar una rama de un proyecto hacia el "trunk". Normalmente cuando hago esto con subclipse todo funciona perfectamente, pero me salió un error como este:
Working copy and merge source not ready for reintegration
svn: Reintegrate can only be used if revisions 4443 through 4776 were previously merged from https://example.com/svn/myproject/trunk to the reintegrate source, but this is not the case:
  branches/mybranch/foo.php
    Missing ranges: /trunk/foo.php:4721-4775
Esto se puede solucionar así:
  1. Hacer switch al branch
  2. Hacer merge nada mas del archivo problemático
  3. Commit
  4. Switch al trunk
  5. Reintegrate

martes, 29 de junio de 2010

Como configurar PHP para enviar correos localmente con mail()

Si quieres poder probar mandando emails de forma local con PHP, estos son los pasos:
  1. Instala Postfix:
    sudo apt-get install postfix
  2. Cuando te pregunte que tipo de servidor quieres manejar, selecciona "Local".
  3. Edita o crea un nuevo archivo /etc/postfix/virtual para hacer una lista de los dominios que vas a atender:
    example.com  this-text-is-ignored
    postmaster@example.com postmaster
    address1@example.com destuser1
    address2@example.com destuser2
    @example.com  destuser1
    
    El formato es sencillo:
    • En la primera linea va el nombre del dominio, seguido de espacios, y el texto que quieras.
    • En las siguientes líneas, pones los aliases, espacio, y el destino real.
    • En la última línea puedes poner un "catch all".
    Recuerda que estamos enviando correos solamente de forma local, entonces los dominios que pongas aquí también deben estar en /etc/hosts, como aliases de localhost.
  4. Agrega esta línea a /etc/postfix/main.cf :
    virtual_alias_maps = hash:/etc/postfix/virtual
  5. Agrega los dominios nuevos a la linea:
    mydestination = 'localhost, otrodominio.com,...'
  6. Reinicia postfix y actualiza la base de datos de aliases:
    postfix reload
    postmap /etc/postfix/virtual
    

jueves, 24 de junio de 2010

Como deshabilitar las funciones de ruteo del modem de infinitum

En mi casa tengo contratado (desafortunadamente) Infinitum de Telmex. El modem/router que proveen es un 2Wire que no me convence mucho. En cambio, tengo un router Linksys que funciona de maravilla con DD-WRT. Con este firmware, la funcionalidad supera por mucho a lo que ofrece el 2Wire. El plan entonces, es deshabilitar las funciones de ruteo del 2Wire para que solo funcione como modem, y dejar el trabajo pesado para el Linksys. Estos son los pasos:
  1. Entra a la interfaz "oculta" del 2wire en http://ip_del_2wire/management (la IP default es 192.168.1.254)
  2. En el menu que aparece a la izquierda busca "Link Manager"
  3. Aparecerá un árbol con varios elementos. Haz click en "apvc0"
  4. Apunta el valor de VPI y VCI que realmente se esta usando (en mi caso fue 8 y 35)
  5. En el menú, haz click en "Configure" debajo de "Broadband Link"
  6. Selecciona "Disable PVC search"
  7. Ingresa los valores que encontraste de VPI y VCI
  8. Cambia "Connection Type" a "Direct IP"
  9. Haz click en "submit" para guardar los cambios
  10. Selecciona "Configure Services" en el menú
  11. Deshabilita la opción de "Enable routing"
  12. Submit!
Ya con eso queda el 2wire funcionando solamente como modem. Ahora solo debes configurar el router para que se conecte por PPPoE en vez de usar DHCP.

lunes, 26 de abril de 2010

Convertiendo archivos a MP3 con iTunes

El otro día me topé con un problema al tratar de reproducir archivos de audio que no eran MP3. iTunes ofrece una forma fácil de convertir los archivos, simplemente los seleccionas, click derecho, y después "Convert to MP3". Yo pensé que al hacer la conversión, iTunes ofrecería la opción de reemplazar los archivos originales. Lo que pasa en realidad es que después de convertir la canción, acabas con dos canciones iguales, pero en diferente formato. Esto no es un problema si tienes que convertir 10 o 20 canciones, pero en mi caso implicaría tener que manualmente buscar y eliminar cada duplicado mas de 800 veces.

Para casos como estos, iTunes ofrece el "iTunes COM Interface". Esto es un API que se conecta directamente a iTunes, y permite control programático de casi todas las funciones del reproductor. Para información detallada, recomiento bajar el iTunes COM for Windows SDK (require registro). Los scripts son fáciles de programar, y son ejecutados por el Windows Scripting Host (WSH). Yo elegí programar en JScript, aunque podrías usar Visual Basic, C# o C++.

Aquí dejo el código del script, por si a alguien le sirve. Para correrlo, hay que seguir estos pasos:
  • Escoger las opciones de conversión en iTunes(Menu edit -> preferences -> Import Settings)
  • Seleccionar las canciones que quieres convertir. El script solo funciona si seleccionas canciones dentro de la biblioteca principal de iTunes, no un playlist.
  • Correr el script desde la linea de comando, e.g.
    c:\>cscript <ruta al archivo>\convert_and_delete.js
    

martes, 13 de abril de 2010

Nunca hay suficiente espacio

Recuerdo que a principio de los 90s, mi papá llegó a la casa con un disco duro de 1GB. En ese entonces, esto era de lo más grande que se podía conseguir a precios comerciales. Era increible la cantidad de cosas que imaginaba podrían caberle a este nuevo disco. Aún asi, siempre aplica la ley que dice que cuanto mas espacio tengamos, mas espacio ocuparemos. Para experimentar con el nuevo disco, le copié el CD completo de Novastorm, para ver si lo podía jugar sin tener que meter el CD. Con esto y otras cosas, logré ocupar el 90% del disco en menos de 3 horas, pero no dejó de impresionarme que al disco le pudiera copiar un CD-ROM completo. Casi 20 años después, me sorprende mucho poder comprar una memoria flash USB de 8GB en menos de $300 pesos. Es ocho veces la capacidad de aquel "enorme" disco de 1GB, a una décima parte del precio (en su tiempo costó alrededor de $3,000 pesos), sin mencionar que cabe en la bolsa de mi pantalón. La capacidad de los discos no ha dejado de aumentar en forma exponencial:



En fin, a lo que voy es que una vez más me estoy quedando sin espacio. Tengo un NAS de 1TB que muy pronto no va a ser suficiente. Entre música, películas y series ya solo me quedan alrededor de 100GB. Este NAS fue mi primera experiencia con almacenamiento en red, y resultó ser una maravilla en comparación con mi solución anterior de tener todo en discos USB externos. Usar un NAS como este, sin embargo, tiene varios problemas. El primero es que entre mas información almaceno, mas preocupante se vuelve tenerlo todo en un solo lugar. Toda esa información se puede perder en cualquier momento. No tengo la disciplina para estar haciendo respaldos, además de que hacer un respaldo completo representa un gasto adicional. Otro problema es que este dispositivo no otorga muchas prestaciones aparte de almacenamiento, y aunque hay formas de lograrlo, el hardware no da para mucho. Con estos puntos en consideración, decidí armar un servidor de archivos basado en Ubuntu, que además de funcionar como un NAS (samba, ftp), me sirva para esto:
  • Servidor de música accesible desde cualquier lugar utilizando Subsonic
  • Cliente de torrents con transmission
  • Servidor web
  • HTPC con XBMC o MythTV
  • Y lo mas importante de todo: almacenamiento con RAID basado en software
Después de analizar varias opciones, me decidí por esta configuración:
  • Tarjeta Madre Gigabyte P43-ES3G(6 puertos SATA)
  • Disco duro 40GB @ 7200RPM
  • 3 Disco duros de 1TB @ 7200RPM
  • Procesador Intel Core 2 Duo @ 2.93GHz
  • 2GB de RAM @ 800MHz
  • Tarjeta de red gigabit D-Link
Los 6 puertos SATA me dejan bien preparado para aumentar el espacio cuando sea necesario. El plan es empezar con 3 discos para poder crear un volumen de RAID 5. Este tipo de arreglo mantiene un buen balance entre redundancia y eficiencia de espacio. Próximamente estaré publicando mis experiencias armando este sistema.

miércoles, 10 de marzo de 2010

Las cuotas de cyrus no se actualizan!

Estuve teniendo problemas con una cuenta de correo. Por mas que borraba mensajes, me salía apareciendo el error "Over-quota". Esta fué la solución:
sudo -u cyrus /usr/lib/cyrus-imapd/quota -f

Correos atorados en mailq

Si por alguna razón no estan saliendo los correos en mailq, puedes usar esto:
/usr/sbin/postqueue -f

jueves, 11 de febrero de 2010

Configuración de Rackspace

Ya empecé a configurar mi servidor. Seleccioné la imagen de Ubuntu 9.10, y hasta ahora todo ha sido bastante fácil gracias a las excelentes guías que provee Rackspace. Estos son los pasos que he completado hasta ahora:
  1. Seguir la guía de configuración inicial para Ubuntu Intrepid. Esto incluye una configuración básica del firewall.
  2. Seguir la guía para instalar ISPConfig 3. Esta es una guía mas larga que incluye la configuración de mysql, correo, apache, ftp, etc. y finalmente ISPConfig.
  3. No me gusta SquirrelMail, entonces voy a probar con RoundCube WebMail

martes, 2 de febrero de 2010

Migracion de servidor

Contraté otro "virtual dedicated server" con GoDaddy para empezar a hacer la migración, pero resulta que CentOS no fue tan buena elección. Al parecer, los repositorios de CentOS no distribuyen los paquetes mas nuevos, solo los probadamente estables. Esto me complica instalar varias cosas, por ejemplo PHP 5.3.1. Decidí entonces probar con la otra opción que ofrece GoDaddy, Fedora 7. Esto generó aún mas problemas, dado que esa versión es tan vieja que ya no es soportada por el Fedora Project (Fedora ya va en la versión 12). Esto me puso a pensar en buscar una alternativa de proveedor de hosting que ofreciera software actual. La mejor opción que encontré fue Rackspace. Ofrecen "Cloud Servers" con precios muy bajos. Voy a empezar con este plan:
  • $11 al mes
  • $0.22 por GB transferido
  • 256 RAM
  • 10 GB espacio
Si me funciona bien, lo puedo actualizar facilmente a este plan:
  • $21 al mes
  • $0.22 por GB transferido
  • 512 RAM
  • 20 GB espacio