Conseguir que Mac OS X suene «a-la-Windows» al insertar un dispositivo USB

Escribo este post por una pregunta que me ha llegado a la lista de correo del GUM Sevilla. Concretamente la pregunta era:

Tengo una consulta sobre Growl y eventos de sonido. Quisiera que, cuando pincho un dispositivo USB, al igual que sucede en Windows, suene un sonidito en mi MacOs Snow leopard.
¿Es esto posible?

Growl es un sistema de notificaciones en pantalla que se controla mediante un panel de preferencias. Si vamos a las Preferencias del Sistema veremos a Growl en la parte final «Complementos». Un click y lo abrimos. Se nos mostrará la pestaña General. Vamos a la pestaña Applications. Ahí disponemos de una lista de aplicaciones que tenemos instaladas y que soportan el sistema de notificaciones de Growl. Es decir, estas aplicaciones, cuando tienen algo que contarnos, le mandan ese mensaje a Growl y el se encarga de ponerlo en pantalla, tocar un sonido, etc.

En el caso que nos ocupa, como es un tema hardware (conectar un dispositivo USB), buscaremos la aplicación Hardware Growler. Comprobaremos que está instalada en nuestro sistema (la hemos copiado desde el DMG de instalación de Growl a la carpeta Aplicaciones) y que está habilitada en Growl (enabled) y pulsaremos en Configure. Tras esto nos aparece una pantalla como la siguiente:

Configuración de GrowlPulsando en Notifications (tal y como se muestra antes), basta con seleccionar el sonido deseado en el último cuadro desplegable: Play Sound.

Y casi listo. Nos falta lanzar Hardware Growler para que monitorice todos los eventos anteriores de hardware y, cuando suceda alguno, nos muestre la notificación growl correspondiente. Funciona en Mac OS X 10.6.2 Snow Leopard. Supongo que en el resto también funcionará.

¿Que por qué cuento esto aquí y no en la lista de correo del GUM?. Porque esa lista no permite imágenes adjuntas :-).

j j j

Instalar a mano el plugin Java para Firefox en Linux

Una vez más, me he sentado en un ordenador con Debian instalada y al intentar ejecutar un Applet me ha aparecido la pantalla «te faltan plugins adicionales, etc. etc.». Con mi cerebro pilotando en modo automático, abrí Synaptic desde una consola pero lo cerré inmediatamente. Recordaba que en esa máquina había una máquina virtual de Java instalada en /opt. El JRE incluye los plugins que necesita Firefox y todo se resume en crear un enlace simbólico al fichero correcto en la carpeta adecuada. Lo de siempre, vamos.

 Tras un par de segundos buscando las carpetas y ficheros adecuados con el tabulador desde una consola, la secuencia es la siguiente:

$ cd $HOME/.mozilla/plugin
$ ln -s /opt/jdk1.5.0_07/jre/plugin/i386/ns7/libjavaplugin_oji.so

Suponiendo, claro, que el JRE está instalado en /opt. Si no, cambia adecuadamentela línea y listo.

Me lo apunto aquí, no vaya a ser que se me olvide… otra vez.

j j j

Creando un fichero PDF a partir de varias imágenes

Hoy he tenido que montar un fichero PDF con páginas escaneadas de diferentes fuentes. Muchos programas de escaneo permiten crear directamente un único fichero PDF con las diferentes sesiones y páginas capturadas, pero éste no había sido el caso. Me habían pasado una carpeta con 103 ficheros en formato JPG.

Bueno, al menos el reto estaba claro: convertir uno a uno estos ficheros en PDF y luego unirlos. Bueno, un momento ¿porqué en este orden? Porque yo ya conocía la herramienta para unir varios PDF en uno: pdftk.

El caso es que abrí una terminal en mi Linux y pensé ¿cómo convierto de JPG a PDF?. Una búsqueda rápida en Synaptic me llevó a sam2p, un pequeño programa que convierte cualquier fichero en formato Raster (Bitmap) a PDF. Por ejemplo, convierte GIF, JPG/JPEG, y PNG a PDF y a PS (PostScript). Pero claro, convertir uno a uno…

Para eso se inventaron los bucles for. Un bucle for de la bash nos permite, entre otras cosas, iterar por una lista de ficheros aplicando la misma acción a los diferentes ficheros. Así, que, si vamos al grano bastará con hacer:

 for f in `ls *.jpg`;do  sam2p $f PDF: $f.pdf ; done

Esto recorre todos los ficheros que aparecen como resultado de hacer un ls *.jpg. En cada iteración la variable f toma el valor de uno de los nombres de fichero. Así que llamamos a sam2p, que convierte los JPG en PDF.

pdftk *.pdf cat output resultado.pdf

Y una vez que tenemos múltiples ficheros PDF, pdftk los une en uno llamado resultado.

j j j

Estructura del if en la bash

if list; then list; [ elif list; then list; ] ... [ else list; ] fi

The if list is executed. If its exit status is zero, the then
list is executed. Otherwise, each elif list is executed in
turn, and if its exit status is zero, the corresponding then
list is executed and the command completes. Otherwise, the else
list is executed, if present. The exit status is the exit sta-
tus of the last command executed, or zero if no condition tested
true.

j j j

Error al instalar NFS: invoke-rc.d: initscript nfs-kernel-server, action «restart» failed.

Tras actualizar el servidor NFS nfs-kernel-daemon, nos encontramos con éste error.Este error se debe muchas veces a la prisa con la que se instalan los paquetes. Probablemente hemos dejado los ficheros de configuración que ya teníamos y no los que trae el nuevo paquete. Si no cambiamos nada, el nuevo NFS intenta utilizar el servidor sgss, que si no está configurado hace que no se inicie el servidor nfs.
Para solucionarlo iremos a la carpeta /etc/defaults que es donde nfsd guarda su configuración. Una vez allí, es posible que tengamos un fichero llamado nfs-kernel-server y otro nfs-kernel-server.dpkg-dist. Este último es el que nos ha instalado apt-get, con la configuración del paquete. En el caso que nos ocupa, no vamos a usar gssd, pero no se lo hemos dicho (en el fichero de configuración antiguo no lo teniamos). La solución:
NEED_SVCGSSD=no

j j j

CUPS no imprime en Red

Se puede deber a múltiples causas. El puerto 631 (IPP) no debe estar bloqueado por el firewall. El servicio cupsd debe estar corriendo (/etc/init.d/cupsd start).
En el fichero /etc/cups/cupsd.conf, la sección viene por defecto:

Order Deny,Allow
Deny From All
Allow From 127.0.0.1

Lo cual sólo nos permite imprimir desde la máquina que tiene la impresora conectada. Debemos añadir una línea como:

Allow From 10.1.1.*

si nuestra red privada tiene esta dirección, claro.

j j j

Crear un servicio personalizado

A veces es deseable disponer de un servicio personalizado en /etc/init.dAl crear el nuevo servicio (borra-tmp) aparece en la lista de services-admin

El método más rápido consiste en copiar un script de los que tengamos en /etc/init.d y retocarlo a nuestro gusto. Aparecerá en la herramienta Servicios (menú Sistema, aunque podemos llamarla desde consola con services-admin)

Por ejemplo, un servicio que borre el tmp mediante la orden /etc/init.d/borra-tmp start puede ser:

#!/bin/sh
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
usage () {cat << END$initd options:

start

Borra la carpeta tmp

clear

no usado

END

}
case "$1" instart)rm -r /tmp/*

;;

clear)
;;*)if test "$@"; then

echo "Aborting iptables initd: unknown command(s): \"$@\"."

fi

usage

;;

esac
exit 0
j j j

Crear modelines. X no coge la resolución de mi monitor.

Si con las XFREE-4 tu monitor no se ve a la resolución y con la tasa de refresco que esperabas, deberías hacer:1) comprobar que efectivamente XFREE-4 intenta y no puede poner tu monitor en la resolución esperada. Hay que leerse /var/log/XFree86.0.log

# less /var/log/XFree86.0.log

especialmente las lineas que aparecen como:

(II) SIS(0): Not using default mode "800x600" (vrefresh out of range)
(II) SIS(0): Not using default mode "800x600" (hsync out of range)

Esto son mensajes de información (II): los modos definidos en /etc/X11/XF86Config-4 y de nombre «800×600» no cuadran con la información de sincronización vertical y horizontal que ha detectado para nuestro monitor.
Si miramos en /etc/X11/XF86Config-4 nos encontraremos con unas curiosas líneas en las que se describen los modos que soportan la mayoría de los monitores, líneas llamadas modeline y que tienen esta pinta:
Modeline «800×600» 40.12 800 848 968 1056 600 601 605 628 #60Hz

2) Suponiendo que tras leer /var/log/XFree86.0.log vemos que se detecta nuestra tarjeta de video y que indica que nuestro monitor soporta la resolución que deseamos (o tenemos Windows instalado en otra partición y lo tenemos con esa resolución) podemos:
a) buscar los modelines por Internet
b) generar nuestras propias modelines

3) Para generar los modelines, usa videogen (instala antes el paquete, se usa desde consola) y create un fichero en el directorio donde vayas a ejecutar videogen que se llame .videogen y con un contenido más o menos como:

max_dotclk=60 # the maximum pixel/dot clock supported by my projector
max_hfreq=54; max_vfreq=90 # the max horizontal and vertical frequency
desired_vfreq=60 # the frequency you decided to use
mode 1024x768 # the resolution your HTPC will be running

Es decir, si en tu consola estás en /home/pepe, crea un fichero .videogen mediante un:
dfreniche@tesla:home/pepe $ gedit .videogen

y copias en el editor el contenido mostrado más arriba.
Tras ésto, grabas, cierras gedit y ejecutas videogen. Te imprimirá en la consola una línea Modelines. La copias, editas el fichero de configuración de las X (debes ser root para cambiarlo), grabas y pruebas.
En mi caso, el monitor es un LG StudioWorks 550M. Lo he puesto a 1024×768 y a 60 Hz.

j j j

Configurar hosts virtuales en Apache

Los host virtuales en apache nos permiten tener en una misma máquina diferentes sitios web, cada uno con una URL diferente pero apuntando a la misma IP. De esta forma, podemos tener dos versiones de un mismo portal web, de producción y desarrollo, con URLs: desarrollo.miportal.com y produccion.miportal.com
Para conseguir ésto, hay que tocar tres ficheros:
1. Hay que redirigir las URLs a la IP de la máquina. Hay que editar /etc/hosts para conseguir ésto. Mi /etc/hosts tiene la pinta:

127.0.0.1 tesla localhost
10.1.1.1servidorservidor
127.0.0.1local.freniche.comlocal.freniche.com
127.0.0.1phpmyadminphpmyadmin
127.0.0.1phpphp

para comprobarlo, hay que hacer ping a las direcciones nuevas para ver que «responden». Es decir, ping local.freniche.com, ping php, etc
Todos deben responder desde el 127.0.0.1
2. Una vez hecho esto, hay que editar /etc/apache/httpd.conf y modificar la sección virtual hosts

NameVirtualHost 127.0.0.1
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
#
#
# ServerAdmin webmaster@host.some_domain.com
# DocumentRoot /www/docs/host.some_domain.com
# ServerName host.some_domain.com
# ErrorLog logs/host.some_domain.com-error.log
# CustomLog logs/host.some_domain.com-access.log common
#
#
#

# ServerAdmin webmaster@host.some_domain.com
#Options Indexes Includes FollowSymLinks MultiViews
#DocumentRoot /home/dfreniche/Documents/trabajo/xoops/xoops-2.0.5/html
DirectoryIndex index.php
DocumentRoot /home/dfreniche/xoops/html
ServerName local.freniche.com
# ErrorLog logs/host.some_domain.com-error.log
# CustomLog logs/host.some_domain.com-access.log common

# ServerAdmin webmaster@host.some_domain.com
#Options Indexes Includes FollowSymLinks MultiViews
#DocumentRoot /home/dfreniche/Documents/trabajo/xoops/xoops-2.0.5/html
DirectoryIndex index.php
DocumentRoot /home/dfreniche/phpMyAdmin-2.5.4
ServerName phpmyadmin
# ErrorLog logs/host.some_domain.com-error.log
# CustomLog logs/host.some_domain.com-access.log common

# ServerAdmin webmaster@host.some_domain.com
#Options Indexes Includes FollowSymLinks MultiViews
#DocumentRoot /home/dfreniche/Documents/trabajo/xoops/xoops-2.0.5/html
DirectoryIndex index.php
DocumentRoot /home/dfreniche/php
ServerName php
# ErrorLog logs/host.some_domain.com-error.log
# CustomLog logs/host.some_domain.com-access.log common
  1. No olvidemos cambiar la configuración del proxy del navegador/explorador para que no intente.
j j j