19.6.07

Herramientas de gestión de energía para portátiles bajo Debian

Puesto que ya hemos tratado en hilos anteriores el escalado de frecuencia de las CPU, vamos a ir un poco más lejos y configuraremos el "laptop mode" tan famoso que viene con los kernels 2.6 para aprovechar un poco más la gestión de energía en portátiles modernos (ACPI no APM, aunque podría valer para APM con los cambios pertinentes).

Utilizando el kernel de stock de Debian Etch podemos optimizar el consumo de batería gracias a las laptop-mode-tools (si hemos compilado un kernel propio, debemos asegurarnos que hemos activado el Linux Laptop Mode en la configuración). Lo que vamos a hacer es definir los estados hibernación del portátil según los porcentajes de batería restantes y evitar el acceso al disco duro de forma continua cuando estamos utilizando las baterías. El efecto a conseguir es cargar en memoria (en la medida de lo posible) los datos que estamos utilizando en lugar de leerlos bajo demanda (video, mp3, pdf...). Esto, combinado con el escalado de frecuencia, dará más minutos a nuestro equipo.

Los pasos a seguir son los siguientes:

1.- Instalar las aplicaciones necesarias:

apt-get install sdparm laptop-mode-tools hibernate

2.- Editar el fichero de configuración de las laptop mode tools y ajustar según nuestras necesidades:

vi /etc/laptop-mode/laptop-mode.conf


En mi caso he realizado la siguiente configuración:

# Activamos la herramienta cuando no estamos conectados a la corriente eléctrica
ENABLE_LAPTOP_MODE_ON_BATTERY=1
# Herramienta desactivada si estamos usando el adaptador de corriente
ENABLE_LAPTOP_MODE_ON_AC=0
# Herramienta activada cuando cerramos la tapa del portátil
ENABLE_LAPTOP_MODE_WHEN_LID_CLOSED=1
# Desabilitamos todas las herramientas sensibles a la pérdida de datos cuando estamos en el 20% de batería restante, para evitarnos sorpresas
MINIMUM_BATTERY_CHARGE_PERCENT=20
# Deshabilito la herramienta ante un nivel crítico que he definido como 10% de batería restante, para evitar perder datos
DISABLE_LAPTOP_MODE_ON_CRITICAL_BATTERY_LEVEL=10
# Activar el escalado de frecuencia cuando usamos baterías
CONTROL_CPU_FREQUENCY=1
# Permito el apagado del entorno gráfico
CONTROL_DPMS_STANDBY=1
# Permito que la herramienta hiberne el equipo
ENABLE_AUTO_HIBERNATION=1
# Defino los porcentajes de batería para hibernación automática
AUTO_HIBERNATION_BATTERY_CHARGE_PERCENT=9
AUTO_HIBERNATION_ON_CRITICAL_BATTERY_LEVEL=5
# Permito que la herramienta inicie las aplicaciones que necesite y monte/desmonte las unidades de datos que necesite
CONTROL_START_STOP=1
CONTROL_MOUNT_OPTIONS=1


12.6.07

Actualizado el bot que rastrea urls en el IRC

Por fin he podido actualizar el bot (pyHardware) para hacerlo un poco más listo que antes. Entre las nuevas funciones destacan:

- Lista negra de urls a no capturar
- Solucionado el problema de captura doble de urls
- Extracción del tag "title" de la url obtenida
- Extracción de una imagen de tamaño definido de la url obtenida
- Uploading automático del RSS
- Comando !quit para poder matarlo
- Implementado un auto-connect por si se cae

El código fuente del bot está disponible en la dirección:

http://www.cajondesastre.net/pyHardware.txt

8.6.07

Reciclando un equipo viejo: una gramola (jukebox) para la oficina

Para darle vida a un trasto que teníamos por aquí tirado, se nos ha ocurrido darle vida a una gramola en la que podamos subir nuestra música favorita y que nos permita seleccionar tema desde cualquier equipo sin cortar la reproducción. No confundamos este tipo de servicio con un streamer, ya que lo que no queremos hacer es reproducir en el equipo local, sinó conectar el viejo equipo al hilo musical.

La primera propuesta fue Python (como no) con un módulo con glob que busque ficheros y se los pase a pymedia pero, si ya existe, ¿para qué hacerlo?

Lo primero es instalar el sistema base sin X, junto con el alsa y alsa-oss por si las moscas. Aquí os dejo una captura del alsamixer que nos permite controlar el volumen en consola:



Luego instalaremos las librerías de audio (libmad, vorbis y similares) y un estupendo programa llamado moc que lanza un demonio de reproducción de audio y provee de un interface multiusuario que nos permitirá seleccionar tema desde diferentes ubicaciones.

apt-get install moc moc-ffmpeg-plugin

Ahora solo queda lanzarlo y darle a play más rápido que el compañero.

7.6.07

Imprimiendo en Debian en una Epson Aculaser C1100

La Aculaser 1100 es una impresora de gran formato de Epson, Láser Color con soporte para impresión por red. Está soportada por Bindous y Mac y en la página de Epson de pueden bajar rpms con los ppd para Suse/Mandrake/RedHat/Centos y similares. También se dispone de un tgz con el código fuente del driver, supuestamente para Debian compatibles.

Tras buscar en Google diferentes soluciones he visto que lo que hace la gente es descargarse el .rpm, convertirlo a .deb e instalarlo pero... a mi no me funciona. He probado también a descargarme el ppd, incrustárselo a cups y... tampoco va. Así que vamos a instalarlo desde los fuentes:

1) Descargarse los fuentes de la web de Epson:

http://www.avasys.jp/english/linux_e/dl_laser.html

2) Descomprimir el fichero descargado (Epson-ALC1100-filter-1.2.tar.gz) y compilar:

tar zxf Epson-ALC1100-1.2.tar.gz
cd Epson-ALC1100-1.2
./configure
make
make install


Es probable que al ejecutar el script ./configure rompa con algo similar a esto:

./configure: line 2830: test: =: unary operator expected
configure: error: *** 'cups-config' missing, please install CUPS or fix your $PATH ***
atreides:/usr/src/Epson-ALC1100-filter-1.2#


Para solucionarlo, vamos a la línea en cuestión (2830) del script y nos cargamos todo el if:

vi configure (y nos vamos a la línea :2830 y borramos las siguientes líneas)

if test $have_cups_config = yes; then
CUPS_CFLAGS=`cups-config --cflags`
CUPS_LDFLAGS=`cups-config --ldflags`
CUPS_LIBS=`cups-config --libs`
CUPS_IMAGE_LIBS=`cups-config --image --libs`
CUPS_SERVER_DIR=`cups-config --serverbin`
CUPS_DATA_DIR=`cups-config --datadir`
else
{ { echo "$as_me:$LINENO: error: *** 'cups-config' missing, please install CUPS or fix your \$PATH ***" >&5
echo "$as_me: error: *** 'cups-config' missing, please install CUPS or fix your \$PATH ***" >&2;}
{ (exit 1); exit 1; }; }
fi


Ahora ya podemos compilar

3) Añadir la impresora a CUPS utilizando el ppd disponible en la carpeta ppd del tgz que hemos descomprimido:

atreides:/usr/src/Epson-ALC1100-filter-1.2/ppd# l
total 36
-rw-r--r-- 1 root root 34561 2006-10-12 14:54 Epson-AL-C1100-fm3.ppd


Los parámetros de configuración de la impresora para imprimir por red son los siguientes:

URI de la conexión: lpd://direccion_ip:515/PASSTHRU


4) Reiniciar cups y comenzar a disfrutar de la máquina

5.6.07

Yakuake, consola rápida en KDE

Tras haber echado tantas pestes durante tanto tiempo KDE, no me queda otra que reconocer que es más ligero que Gnome y que las utilidades que lo acompañan son realmente fantásticas. De entre ellas, hay una aplicación realmente útil, Yakuake.

Yakuake nos provee de una consola rápida que se muestra y se esconde pulsando la tecla F12, simplemente fantástico.

Para instalar sobra decir apt-get install yakuake

Calculando la diferencia en días entre dos fechas con Python

Es probable que esta función exista dentro del módulo time de Python pero, al no haberla encontrado, ha tocado hacerse una más casera.

El funcionamiento es simple, aportando dos fechas en formato estándar (YYYY-mm-dd) con separadores estándar (/ - .) se realiza el cálculo con una simple función, tal como sigue:

#!/usr/bin/python

from datetime import date

def daysDifference(date1,date2):


   d1 = date(int(date1[0:4]),int(date1[5:7]),int(date1[-2:]))

   d2 = date(int(date2[0:4]),int(date2[5:7]),int(date2[-2:]))

   diff = d2 - d1

   return diff.days

if __name__=='__main__':

   numeroDias = daysDifference('20050203','20070423')

1.6.07

Caracteres jeroglíficos en la consola, resetear el terminal

A quien no le pasa que la consola se le queda totalmente pez por haber volcado un binario por pantalla? Algo tal que así:

q�x��h�ʺ�40�N$���<�#�!�8�M�O#RՀ���\UP�@���%.���<��UXv�Sp���N>��Qɒ�7�7K�X��▒3ʩ�ͻ������7Gk�qK�=�=.*_���0!+�p��>�\� 8�q�a����#@��Gv�k��N���P�u'�W�?�▒����J5�z���r}]

Resolver este problema es realmente sencillo con el comando reset:

reset