New York, New York
September 30th, 2006
Son las ocho y media del veintidós de septiembre. Maciej, un compañero de trabajo de las oficinas de Mountain View, se ha ofrecido amablemente a llevarme al aeropuerto internacional de San José, en California, para, desde allí, tomar mi vuelo rumbo a Nueva York.
Cargo mi maleta, la bolsa de mano y la mochila en su coche, un Toyota poco común, muy espacioso, con un motor híbrido eléctrico y de gasolina, muy silencioso y con cambio automático. Es bastante común que los coches en américa sean automáticos y, la verdad, resulta mucho más cómodo y evidente cuando se tiene que usar el coche tanto como en California. Después de una media de hora de trayecto, nos acercamos a las proximidades del aeropuerto de San José. La señalización es peor aún que la de la Terminal 4 del aeropuerto de Madrid Barajas. Tanto que nos lleva algo más de diez minutos encontrar la Terminal C desde la que sale mi vuelo.
La terminal C es un edificio no muy grande, con distintas puertas que dan acceso a un pasillo diáfano a lo largo del cual se encuentran los mostradores de las distintas compañías de vuelo. Una vez encontramos la puerta correspondiente a Jet Blue, la compañía con la que vuelo, me despido de Maciej y entro en la Terminal C. Nada más introducirme por la puerta y llegar al pasillo, un amable caballero me pregunta si viajo con Jet Blue. Le respondo que sí. Toma mi maleta y me acompaña a un terminal automático de facturación y se ofrece amablemente a tramitar la tarjeta de embarque y facturar mi maleta. La mochila y bolsa de mano las quiero llevar conmigo y, aunque no estoy seguro de si será posible debido al nivel de seguridad actual en los aeropuertos, el amable caballero me dice que no habrá ningún problema.
Una vez facturada la maleta, me dirijo hacia la puerta de embarque. Para acceder a ella, debo pasar el inusual control de vigilancia. Me obligan a descalzarme, a quitarme el cinturón y la chaqueta, introducirlos en bandejas de plástico y, lo más curioso de todo, me indican que saque los dos portátiles de la bolsa de mano y los introduzca, de forma separada al resto de elementos, en dos contenedores de plástico. Todos ellos, en fila de a uno como si de un pelotón de asalto se tratara, desfilan ante mi por una cinta transportadora hacia la máquina de Rayos X. Una vez pasado el detector de metales, y la inspección visual de mi tarjeta de embarque y pasaporte, un hombre de color me indica que puedo continuar. Así pués, llego a la puerta de embarque y busco sitio donde poder sentarme.
Son las nueve y cuarto. Mi vuelo no despega hasta las 10.35 de la noche. Miro a mi alrededor y veo a dos indivíduos mirando asíduamente la pantalla de sus portátiles y asumo que hay conectividad inalámbrica gratuita. Iluso de mí, saco el portátil y cuando activo la tarjeta inalámbrica, me encuentro con dos redes abiertas: una con el nombre del aeropuerto y otra con el nombre de T-Mobile. Desgraciadamente, ambas redes están “abiertas”, pero requieren el pago de una cuota por hora para poder navegar, lo que técnicamente se conoce como un “portal cautivo”. No está entre mis planes pagar cerca de los diez dólares por hora y suministrar mi número de tarjeta, así que hecho mano de uno de mis libros y me pongo a leer. El tiempo pasa lentamente, mientras un devenir de gente se levanta y se marcha, otros que vienen, incansablemente. Poco a poco se va acercando la hora del embarque, pero una voz que apenas puedo distinguir suena por megafonía anunciando que el vuelo se retrasa, aunque no soy capaz de entender los motivos. Entonces pienso para mí que hay cosas que nunca cambian, incluso fuera de España: parece que la puntualidad es una virtud exclusiva de los relojes Suizos.
Después de esperar y esperar, en una interminable y aburrida sesión típica de un aeropuerto cualquiera, embarco en el avión, un Airbus 380, no tan grande como el Boeing 747 que me llevó desde Londres a San Francisco, aunque sí más cómo y con más espacio entre asiento y asiento. Mi sitio da justo al pasillo, tal y como solicité, para así poder estirar las piernas cómodamente durante el viaje. A mi izquierda, una pareja dispar, como ninguna que hubiera visto antes. Ella, una mujer de apariencia oriental, con una niña de unos seis meses en las brazos. Él, un hombre de aspecto inconfudiblemente americano, pero de talla bastante poco habitual, tan grande que apenas cabía en el asiento y me permitía bajar mi apoyabrazos izquierdo donde se encuentran los controles de la televisión. A mi derecha, otra pareja. Ella es una mujer preciosa, de rasgos sudamericanos, quizá de descendencia Venezolana, de piel morena, y pelo teñido. Él… la verdad es que no le presto demasiada atención, sinceramente. Me doy cuenta que no puedo apartar los ojos de ella. Es como un imán, pero me siento avergonzado de repente y retiro la mirada. Creo que ella me sonríe, pero no estoy seguro porque, en ese preciso momento, mis ojos ya están mirando hacia otro lado.
El resto del viaje transcurre sin contratiempos, lenta y pesadamente, como el movimiento del péndulo de un gran reloj antiguo, cansino. Intento mirar la televisión, pero la programación no resulta de mi agrado. Infinidad de canales, cierto, pero es la calidad lo que importa. Al final, después de un buen rato, acabo viendo una película horrible, protagonizada por Christian Bale, sobre guerreros que no tienen sentimientos, una resistencia, sangre y violencia. Una película que, entre mis problemas con el idioma, el bajo nivel del argumento y el cansancio acumulado, no pasará a los anales de la historia.
Acelero en el tiempo, y llego por fin al aeropuerto JFK de Nueva York a las siete y media de la mañana, en el que se me antoja un día gris, lluvioso y poco apacible. Afortunadamente, recojo mi maleta casi al instante de llegar a la cinta transportadora. Me dirijo hacia la salida y un conductor me invita a subirme a su vehículo, un Mercedes de color negro con puertas deslizables. Durante el trayecto, hablamos de mi trabajo en Google, de las comunicaciones y la publicidad, y más cosas intrascendentes. Mientras, observo las calles pasar tras mi ventana, bajo un cielo gris plomizo. Nueva York se me antoja un gigante de cemento, ergido delante de mí, esperando engullirme. Rascacielos por todas partes, calles amplias, una miríada de coches amarillos (los famosos taxis) abarrotan las calles mientras los peatones se amontonan en los semáforos deseando casi compulsivamente que la luz del semáforo se ponga en rojo.
Al conductor le cuesta encontrar el apartamento, pero una vez allí, llave en mano, abro la puerta del portal y, tras un buen rato intentando el que será mi apartamento, me abandona la sensación de estupidez que, durante todo el tiempo que llevo en este país, me aborda constantemente, cuando descubro que las cerraduras se abren en sentido contrario, o cuando no encuentro lavadora en el apartamento y tengo que ir a una lavandería, o cuando no soy capaz de encender la televisión porque, para ello, es preciso encender el equipo de Cable y un aparato que reza TiVo en la parte frontal, teniendo que usar tres mandos a distancia diferentes cuya única diferencia entre ellos es el número de botones.
Una vez dentro del apartamento, el abatimiento se cierne sobre mí. La verdad, no es como yo esperaba. Ante mi, un pasillo con un suelo viejo de madera, largo y oscuro. Detrás de mi, una puerta con cerradura, que resulta ser la habitación de alguien cuya antigüedad le otorga el privilegio de la habitación más grande, a mi izquierda un cuarto de baño y a mi derecha, la puerta de la que intuyo será mi habitación. Me deslizo dentro de ella para encontrar una cama grande, con una colcha azúl y blanca, una silla blanca de plástico a su lado, un armario pequeño y oscuro en un rincón con perchas y algunas toallas, una mesilla diminuta y un mueble grande con cajones. En otra esquina, una ventana estrecha y alargada por la que noto cómo se cuela el frío y el ruido de la calle. Mi primera impresión es algo desoladora, sobre todo tras el recuerdo del precioso y cálido apartamento de California. En comparación, éste se me antoja triste. No puedo evitar que se me encoja el corazón. De camino hacia el salón, me encuentro a la derecha con la cocina, y una habitación tras una puerta de madera llena de utensilios de limpieza a mi izquierda. El salón presenta mejor aspecto, con una televisión grande, un ordenador iMac algo antiguo, un sofá naranja tras una mesa cuadrada, pequeña y de mediana altura, y dos sillones blancos en las esquinas. Encuentro una lámpara, con la pantalla cilíndrica estrecha y muy alargada, de color blanco. No parece funcionar, incluso aunque está correctamente enchufada. Al fondo del pasillo, otra habitación, ya ocupada por alguien que descubro duerme tras abrir la puerta.
Dejo las cosas en mi habitación e intento averiguar cómo conectarme a Internet. Veo un cable azul que recorre el suelo hasta el sofá. También observo que hay un punto de acceso sobre la mesa donde está el iMac. Tras varios intentos fallidos por conectarme a través de la red inalámbrica, casi cometo el error de intentar resetear el punto de acceso para cambiar la contraseña cuando, de pura casualidad, me encuentro con un documento de texto abierto en el iMac donde figuran los datos de conexión. Pruebo a conectarme con el portátil y veo que funciona. Estoy cansado, y los párpados pesan como losas, así que me voy a dormir. Mi habitación es algo oscura y se nota algo de frío, pero enseguida consigo conciliar el sueño, a pesar del ruido exterior. La cama es bastante cómoda a pesar de todo.
Me despierto sobresaltado. Miro el reloj que hay sobre la mesilla y veo que son las dos y media de la tarde. Me levanto y me visto, y salgo a la calle para buscar algún sitio donde comer. Comienzo a caminar, rumbo hacia el sur, por la sexta avenida, pero no veo ningún sitio de mi agrado: algún restaurante de mala muerte, como en las películas, alguna pizzería con comida para llevar, quizá un subway, bastantes Star Bucks, sitios de comida vietnamita, pero nada que me llame la atención. Al cabo de un rato, veo un italiano con un aspecto excelente y terraza para comer sentado en el exterior, pero parece ser ya demasiado tarde, así que me acerco al primer sitio de comida rápida que encuentro. La verdad, esto empieza a recordarme mis últimas vacaciones de verano en París, con Carlos y Alejandro, comiendo casi a diario comida basura.
Me dirigo hacia el oeste, donde transcurre el río Hudson, que recorre la parte más occidental de Manhattan, una avenida larga y llana, con alguna terraza con sillas para sentarse a charlar o leer, zonas verdes donde algunas familias se tumban con los críos a jugar, o por donde los deportistas natos hacen footing mientras escuchan la música que se desliza por los auriculares blancos de sus iPods último modelo.
Entre calles estrechas, edificios antiguos y gigantes de cemento y cristal que reflejan los ténues y tímidos rayos de sol, tomo rumbo hacia el centro de Manhattan, entre la séptima avenida y Broadway. Las calles son un devenir incesante de gente, como un hormiguero de tamaño descomunal. Unos caminan a ritmo desbocado, otros paseando tranquilamente y otros circulan sobre el asfalto, jugándose la vida sobre sus bicicletas, pero todos ellos bajo las luces de neón o los paneles luminosos que anuncian las últimas cotizaciones de la bolsa de Nueva York. Veo tiendas de renombre, con coloridos vestidos de mujer en los escaparates enormes, luminosos, pero caigo en la cuenta de que los grandes desparecidos son los precios. No hace falta que nadie mo lo diga: están fuera del alcance de la mayoría de los mortales. Algunos se conforman con mirar. Otros, como yo, pasamos indiferentes.
Broadway me recuerda mucho a la Gran Vía de Madrid. De hecho, creo que la traducción de Broadway es “Vía Ancha” o, lo que es lo mismo, “Gran Vía”. Muy al estilo de Madrid, puedo notar cómo el suelo vibra bajo mis pies según pasa el metro mientras intento no ser atropellado mientras cruzo, en rojo, un semáforo. Después de un rato caminando, me dirigo rumbo hacia el apartamento. El cansancio sigue haciendo mella en mí, así como la sed. Me voy a dormir. Mañana, será otro día.
Installing rEFIt on the hidden EFI system partition
September 19th, 2006
Install rEFIt on the system partition, instead of using Mac OS X system volume, allows one to manage rEFIt independently from Mac OS X. It is also possible to wipe out Mac OS X entirely while still being able to use rEFIt to boot other operating systems, like GNU/Linux, FreeBSD, Solaris, or even Windows.
To install rEFIt on the hidden EFI system partition, follow this simple steps which I gathered from a post at the personal blog of Lincoln Ramsay.
From a Terminal or command-line prompt, run the following commands:
$ sudo mkdir /efi
This will create the mount point for the EFI system partition
$ sudo mount -t msdos /dev/disk0s1 /efi
This command will mount the EFI system partition (usually hidden from Mac OS X) into /efi. The EFI system partition is basically a 200MB FAT32 partition which is, by default empty.
NOTE: Please, take into consideration that EFI system partition is usually the first partition on the built-in hard disk, which is usually /dev/disk0s1, although it could be different on your system.
open /efi
This will open the /efi folder in Finder.
Now, download rEFIt and copy the contents of the efi folder into /efi.
In the end, you should have the following subdirectories on your machine:
/efi/efi/refit/efi/efi/tools
Now, we will bless the EFI system partition:
sudo bless --mount /efi --setBoot --file /efi/efi/refit/refit.efi --labelfile /efi/efi/refit/refit.vollabel
I think blessing marks the partition mounted on /efi as bootable, uses /efi/efi/refit/refit.efi as the boot loader, then changes some OpenFirmware variables to boot the machine from this partition.
Modifying screen brightness on AC state changes
September 11th, 2006
The acpid daemon listens to the /proc/acpi/event socket. When the Linux kernel any ACPI-related event, like an AC state change, it sends a message to that socket.
When the Linux kernel detects AC power loss, it sends a message to the socket. acpid then runs the /etc/acpi/power.sh script which, in turn, invokes all the scripts under /etc/acpi/battery.d directory, orderly.
When the Linux detects that AC power has been restored, it sends a message to the socket. acpid then runs /etc/acpi/power.sh which, in turn, invokes all the scripts under /etc/acpi/ac.d directory, orderly.
To make the LCD brightness dim when AC power is lost and return the LCD brightness to its previous value once AC power has been restored, we can create two new scripts:
/etc/acpi/ac.d/01-brightness.sh/etc/acpi/battery.d/01-brightness.sh
Both of these scripts use a configuration file, located at /etc/default/brightness. A sample configuration file is shown below:
/etc/default/brightness
# Whether or not enable LCD brightness control depending
# on AC power state.
BRIGHTNESS_CONTROL="yes"
# Binary used to control LCD brightness.
BRIGHTNESS_PROGRAM="/usr/local/bin/bl1"
# Defines the brightness level when running on batteries.
BRIGHTNESS_LEVEL_ON_BATTERY="10"
# Defines the default brightness level for the system when
# running on AC power. This value is superseded by the value
# stored in the ${BRIGHTNESS_LAST_LEVEL_FILE} file.
BRIGHTNESS_LEVEL_ON_AC="15"
# Defines where to store the brightness level used the last
# time the system was running on AC power.
BRIGHTNESS_LAST_LEVEL_FILE="/var/tmp/brightness"
For MacBook Pro, these scripts depend use bl1, which can be found at Basic backlight support for MacBook Pro, for the BRIGHTNESS_PROGRAM, used to control the LCD brightness.
/etc/acpi/ac.d/01-brightness.sh
The following shell script restores the brightness level in use before losing AC power:
#!/bin/bash # Load configuration parameters . /etc/default/brightness exec 2> /dev/null if [ "${BRIGHTNESS_CONTROL}" = "yes" ]; then # Check the value stored in ${BRIGHTNESS_LAST_LEVEL_FILE} # holds a numeric value. OLD=$(cat ${BRIGHTNESS_LAST_LEVEL_FILE}) let NUM=${OLD}+1 let NUM=${NUM}-1 if [ "${OLD}" -eq "${NUM}" ] 2>/dev/null; then # If previously stored value is a number, set the brightness # level to that. VALUE=${OLD} else # If previously stored value is not a number, or undefined # restore the brightness to its default value for AC power. VALUE=${BRIGHTNESS_LEVEL_ON_AC} fi # Sets the new brightness and stores its value /usr/local/bin/bl1 ${VALUE} \ | sed 's/new value: //g' > ${BRIGHTNESS_LAST_LEVEL_FILE} fi
/etc/acpi/battery.d/01-brightness.sh
The following shell script stores the current brightness level in order to restore it once AC power is restored and, since AC power has just been lost, dims the LCD brightness:
#!/bin/bash # Load configuration parameters . /etc/default/brightness if [ "${BRIGHTNESS_CONTROL}" = "yes" ]; then # Gets current brightness level and stores it ${BRIGHTNESS_PROGRAM} \ | sed 's/Current value : //g' > ${BRIGHTNESS_LAST_LEVEL_FILE} # Sets the brightness level used when running on batteries ${BRIGHTNESS_PROGRAM} ${BRIGHTNESS_LEVEL_ON_BATTERY} fi
Basic backlight support for MacBook Pro
September 11th, 2006
I made some modifications to the original bl1.c program from Nicolas Boichat. In summary, this modifications allow:
Specify an absolute brightness value
Let x be the absolute brightness value, such that 0<x<16, that is, the value must between 1 and 15, where 1 is the minimum brightness level before turning off the screen, and 15 is the maximum brightness supported by the LCD screen.
For example:
./bl1 15
./bl1 1
Specify an increment or decrement (delta)
Let d be the delta, and x the current brightness value, then the new brightness value y is y=x+d, and 0<y<16.
y = min(max(1, x + d), 15)
Source code
/*
* Apple Macbook Pro LCD backlight control
*
* Copyright (C) 2006 Nicolas Boichat <nicolas @boichat.ch>
* Copyright (C) 2006 Felipe Alfaro Solana <felipe_alfaro @linuxmail.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <stdio .h>
#include <sys /io.h>
#include <stdlib .h>
void init()
{
if (ioperm(0xB2, 0xB3, 1) < 0)
{
perror("ioperm failed (you should be root).");
exit(2);
}
}
int get_current_value()
{
outb(0x03, 0xB3);
outb(0xBF, 0xB2);
char t = inb(0xB3) >> 4;
return t;
}
int calculate_new_value(const char *arg)
{
int val, new = atoi(arg);
if (arg[0] == '+' || arg[0] == '-')
val = new + get_current_value();
else
val = new;
if (val > 15)
val = 15;
else if (val < 1)
val = 1;
return val;
}
int main(int argc, char** argv)
{
if (argc > 2)
{
printf("Usage:\n");
printf("%s : read current value\n", argv[0]);
printf("%s value : write value [0-15]\n", argv[0]);
exit(1);
}
init();
if (argc < 2)
{
printf("Current value : %d\n", get_current_value());
exit(0);
}
if (argc == 2)
{
int value = calculate_new_value(argv[1]);
outb(0x04 | (value << 4), 0xB3);
outb(0xBF, 0xB2);
printf("new value: %d\n", value);
}
return 0;
}
Encrypted home on Ubuntu using dmcrypt
September 8th, 2006
Install crypsetup and dmsetup:
# apt-get install crypsetup dmsetup
Install pam_mount:
# apt-get install libpam-mount
Configure PAM to use pam_mount for authentication and session management. PAM authentication captures the user login password, while PAM session set ups the dmcrypt device and mounts it during log on, and unmounts the dmcrypt device during log off.
# echo “@include common-pammount” >> /etc/pam.d/common-auth
# echo “@include common-pammount” >> /etc/pam.d/common-session
Sets up some variables used to make the rest of the steps a little bit easier and more generic:
# USER=solana
# KEYSIZE=128
# DEVICE=/dev/whatever
The meaning of the previous variables is:
- USER defines the username.
- KEYSIZE defines the AES keysize used to encrypt the data. Valid keysizes are 128, 192 and 256.
- DEVICE defines the device that will hold the crypted volume. This can be standard partition, a LVM volume, a NBD, etc..
Generate an AES random encryption key, encrypts it with the user log on password and stores it:
# dd if=/dev/urandom bs=1c count=$((${KEYSIZE}/8)) | openssl enc -aes-${KEYSIZE}-ecb > /home/${USER}.key
When prompted for the passphrase, enter the user’s log on password.
Sets up the dmcrypt device:
# openssl enc -d -aes-${KEYSIZE}-ecb -in /home/${USER}.key | cryptsetup -c aes -s ${KEYSIZE} create crypt-${USER} ${DEVICE}
When asked for the passphrase, just enter the user’s log on password.
Make a new ext3 filesystem on top of the cryptoloop device:
# mkfs.ext3 /dev/mapper/crypt-${USER}
Change the owner, so the user will be able to write to this volume:
# mkdir /mnt/crypt-${USER}
# mount /dev/mapper/crypt-${USER} /mnt/crypt-${USER}
# chown ${USER} /mnt/crypt-${USER}
# umount /dev/mapper/crypt-${USER}
# rmdir /mnt/crypt-${USER}
Frees the dmcrypt device:
# dmsetup remove crypt-${USER}
To test whether mount.crypt and mount the encrypted volume:
# openssl enc -d -aes-${KEYSIZE}-ecb -in /home/${USER}.key | mount.crypt ${DEVICE} /home/${USER} -o keysize=${KEYSIZE}
Frees the dmcrypt device after the test:
# dmsetup remove _dev_mapper_${DEVICE}
Configure pam_mount:
# echo “volume ${USER} crypt – ${DEVICE} /home/${USER} keysize=${KEYSIZE} aes-${KEYSIZE}-ecb /home/${USER}.key” >> /etc/security/pam_mount.conf
Ubuntu Edgy, ATI’s fglrx, DRI, 3D acceleration and X.org Composite extension
September 6th, 2006
I think that Ubuntu Edgy Knot 2 is the first Linux distribution that enables the Composite extension by default for X.org. While this is really exciting, unfortunately it seems to negatively affect DRI and 3D acceleration when using ATI’s closed-source drivers, fglrx.
I don’t know exactly the reasons of this, but enabling Composite extensions disables ATI’s driver support for DRI and 3D acceleration. The X.org logs show DRI has been disabled, but they offer no clue on what’s going on, so I eventually found tout he answer while digging on the Ubuntu forums.
To disable Composite extensions, add the following lines to the end of /etc/X11/xorg.conf file:
Section "Extensions"
Option "Composite" "false"
EndSection
This will bring back support for DRI, 3D acceleration and, thus, OpenGL support.
¿Qué tarjeta Wi-Fi me compro?
September 1st, 2006
Interesante artículo que describe las diferentes variantes de 802.11 y qué factores son interesantes considerar a la hora de adquirir una tarjeta inalámbrica.
En mi caso, me gustaría comentar que uno de los chipsets con mejor soporte para GNU/Linux es el Atheros. Los nuevos MacBook Pro de Apple incorporan este un chipset Atheros con soporte de banda dual 802.11a/g que funciona de serie, sin tener que instalar ningún controlador de dispositivo ni firmware.
Particularmente, me decanto por las tarjetas con soporte de banda dual 802.11a/g porque, aunque el estándar 802.11g tiene mayor penetración el mercado, el estándar 802.11a suele ofrecer mayor velocidad, aunque también menor alcance, y, normalmente, la banda de los 5GHz suele presentar menos interferencias que la banda de 2.4GHz.