viernes, 10 de julio de 2009

Estiramientos para calentar y enfriar

Me gustaría dedicar este post a todos los deportistas newbies, que por el motivo que sea deciden cambiar sus habitos de vida sedentarios por otros mas saludables. Esa energia que os animó en su momento a dar el primer paso puede aportaros mucha satisfacción a lo largo de vuestras vidas, pero debeis encauzarla adecuadamente para que no se os acabe pronto la mecha.

Y es que mucha gente abandona en pocas semanas la practica de deporte por falta de motivación, o peor aún, por alguna lesión producida por alguna sobrecarga durante sus primeras semanas de entrenamiento.

No podemos luchar contra la falta de motivación. Es un tema muy personal que depende de los gustos y la capacidad de sacrificio de cada individuo. Pero si podemos dar algunos consejos para reducir la aparición de las temidas lesiones, y evitar así culparlas de un temprano abandono de la actividad fisica.

Antes de iniciar cualquier actividad deportiva, sea del tipo que sea, es necesario realizar un buen calentamiento. Y lo voy a recalcar para que quede bien claro: hay que hacerlo siempre. Se trata de poner en funcionamiento el aparato locomotor, lo que yo llamo "arranque de motores". Lo mismo debe repetirse despues de terminar la actividad física, pero a la inversa, es decir, realizar un buen enfriamiento, o "parada de motores". Es como si cogemos un coche y lo ponemos de 0 a 200Km/h sin hacerle el rodaje. Lo mismo si apagamos el contacto del motor cuando el coche va a 200Km/h. (Bueno, lo dejaré en 120Km/h que no quiero incitaros a sobrepasar los limites de velocidad legales). Como podeis imaginar, el motor sufrirá mucho y correreis el riesgo de griparlo. Nuestro cuerpo funciona como el motor de ese coche. Por tanto debemos tratarlo con el mismo cuidado.

Para la fase de calentamiento os recomiendo realizar un trote suave "borriquero" de 5 minutos y tal como lo termineis, realizar la siguiente tabla de estiramientos (desde la cabeza hasta los pies). Debe llevaros unos 10/12 minutos en total.

- 10rep mirar nuestro hombro izquierdo y despues mirar nuestro hombro derecho.
- 10rep apoyar la oreja sobre el hombro izquierdo y despues sobre el derecho
- 10rep mirar al techo y al suelo
- 10rep elevación hombros con los brazos pegados al cuerpo (hacia arriba)
- 10rep rotación hombros con los brazos pegados al cuerpo (rotación delantera)
- 10rep rotación hombros con los brazos pegados al cuerpo (rotación trasera)
- 10sec con mano izquierda, coger codo derecho y llevarlo al hombro izquierdo
- 10sec con mano derecha, coger codo izquierdo y llevarlo al hombro derecho
- 10sec codo derecho en la nuca estirando hacia la izq. con mano izquierda
- 10sec codo izquierdo en la nuca estirando hacia la der. con mano derecha
- 10sec mano der. por el cuello y izq. por debajo espalda, coger manos y hacer un 8
- 10sec mano izq. por el cuello y der. por debajo espalda, coger manos y hacer un 8
- 10sec mano der. a la cintura y mano izq. por encima de la cabeza, doblar cintura
- 10sec mano izq. a la cintura y mano der. por encima de la cabeza, doblar cintura
- 10sec separar piernas, dejar caer cintura, palmas tocan suelo
- 10sec separar piernas, dejar caer cintura a la izq. manos tocando tobillo izq.
- 10sec separar piernas, dejar caer cintura a la der. manos tocando tobillo der.
- 10sec separar piernas, dejar caer culo sobre tobillo der. y estirada pierna izquierda
- 10sec separar piernas, dejar caer culo sobre tobillo izq. y estirada pierna derecha
- 10sec mirando al frente, estirar pierna izq. hacia delante sin mover la pierna der.
- 10sec mirando al frente, estirar pierna der. hacia delante sin mover la pierna izq.
- 10sec fuerza para tumbar una pared, manteniendo recta pierna izq. sin doblar rodilla
- 10sec fuerza para tumbar una pared, manteniendo recta pierna der. sin doblar rodilla
- 10sec de pie, cruzar pie izq. sobre pie der. y tocar tobillos con las manos
- 10sec de pie, cruzar pie der. sobre pie izq. y tocar tobillos con las manos
- 10sec de pie, subir talon izq. sobre un bordillo y mantener flexionado
- 10sec de pie, subir talon der. sobre un bordillo y mantener flexionado
- 10rep de pie, rotacion tobillo izq. apagando colilla sentido horario
- 10rep de pie, rotacion tobillo izq. apagando colilla sentido antihorario
- 10rep de pie, rotacion tobillo der. apagando colilla sentido horario
- 10rep de pie, rotacion tobillo der. apagando colilla sentido antihorario
- 10rep de pie, flexionar rodillas, rotacion de ambas en sentido horario
- 10rep de pie, flexionar rodillas, rotacion de ambas en sentido antihorario


Para la fase de enfriamiento, nunca pareis de golpe y os senteis en un sofá, debeis andar durante 5 minutos mientras os bajan las pulsaciones. Despues os recomiendo realizar la siguiente tabla de estiramientos en la que todos los ejercicios se hacen en el suelo. En total son 6/8 minutos mas.

- 10sec juntar las plantas de los pies y tirar las rodillas al suelo
- 10sec pierna izq. estirada al frente y tocar punta del pie.
- 10sec pierna der. estirada al frente y tocar punta del pie.
- 10sec abrir piernas y estirar brazos intentando tocar el suelo con el pecho
- 10sec abrir piernas y estirar brazos y coger pie izq. con las dos manos
- 10sec abrir piernas y estirar brazos y coger pie der. con las dos manos
- 10sec acostado boca arriba, llevar rodilla izq. sobre el pecho
- 10sec acostado boca arriba, llevar rodilla der. sobre el pecho
- 10sec acostado boca arriba, llevar rodilla izq. y rodilla der. sobre el pecho
- 10sec acostado boca abajo, presionar talon del pie izq. sobre el culo
- 10sec acostado boca abajo, presionar talon del pie der. sobre el culo
- 10sec acostado boca abajo, presionar talones del pie izq. y der. sobre el culo

Estos ejercicios mejorarán la elasticidad de vuestros musculos. Con ello evitareis lesiones musculares, sobrecargas, contracturas, distensiones. Tambien son buenos como remedio contra las agujetas.

Si haceis bien estos ejercicios podreis practicar deporte por muchísimo tiempo sin tener prácticamente lesiones tontas, y os será mas dificil abandonar el deporte con la excusa de que a vosotros os ha tratado mal, que el deporte es malo para salud, o frases por el estilo que seguro habeis escuchado en mas de una ocasión. Vosotros disponeis de la información necesaria para hacer mejor las cosas y no abandonar a la primera. Es hora de ponerse manos a la obra, chicos. ¡A estirar se ha dicho!

sábado, 25 de abril de 2009

Operación bikini: howto

Llega el veranito y con su cercanía mucha gente empieza a plantearse lo de apuntarse a un gimnasio y ponerse a dieta para perder unos kilitos y lucir un bonito cuerpo en la playa.

No soy experto en la materia. INEF se convirtió en mi vocación frustrada cuando tome la decision de hacerme informático (que por otra parte se trata de mi vocación realizada ;-) De todas formas, creo que conozco lo suficiente del tema como para daros algunos trucos y consejos que seguro os serviran para mejorar vuestro aspecto fisico en general. Y es que son ya 21 años practicando distintos deportes, 7 de los cuales con entrenadores nacionales de baloncesto, y los 14 restantes aplicando por mi cuenta los conocimientos que de ellos aprendí cuando todavía era un adolescente.

Asi que sin mas vacilación, nos ponemos manos a la obra y entramos en materia. ¡Que tiemblen los kilos de mas!

Tres puntos basicos para alcanzar nuestro objetivo:
- Alimentación
- Hidratación
- Deporte

Punto básico 1: Alimentación

La alimentación es básica para mejorar nuestro aspecto físico (y nuestra salud). Se trata de aprender a comer bien, y tener la fuerza de voluntad suficiente para no pecar comiendo cosas que estan muy ricas pero que no le hacen ninguna falta a nuestro organismo. Ya os digo que no vais a pasar hambre, asi que tranquilos que nadie va a tener que preocuparse por eso.

De la alimentacion necesitamos entender tres cosas importantes:
- Reducir la ingestión de grasas
- Aumentar la ingestión de fibras
- Dosificar la ingestion de hidratos y proteinas.

Las grasas sirven de muy poco para nuestro organismo. Se acumulan rapidamente como reservas energeticas y pronto aparecen los malditos michelines. Por ello debemos prescindir por completo del consumo de bolleria (donuts, bollycaos, croissants, etc) y alimentos fritos (patatas fritas, carne frita, huevos fritos, etc.). Tambien hay que eliminar de la dieta los productos lácteos sin descremar y las yemas de huevo, ya que contienen una alta concentración de grasas saturadas y colesterol. Por tanto, cuando compremos yogures, queso o leche, debemos elegir productos desnatados.

No obstante, nuestro organismo necesita el aporte de una cantidad minima de grasas al dia que vamos a ingerir de las carnes blancas (pechugas de pollo y pavo) y del pescado. Tambien os recomiendo tomar una cucharada de aceite de oliva virgen crudo al dia, lo que ayuda a eliminar el colesterol malo de nuestro organismo. Por ultimo, está demostrado que la grasa vegetal de las nueces es muy eficaz para destruir el colesterol malo, asi que también vamos a incluirlas en nuestra dieta diaria.

La fibra nos permitira ir al baño con regularidad. Si queremos perder peso, ¿no es esto lo mas facil? :-) Para ello el truco son los copos de avena, eso si que os va a dar regularidad y no los danones Activia. Hace cosa de 2 años que descubri ésto y desde entonces soy un reloj de cucko :-) Y por supuesto, la verdura (ensaladas) y fruta.

Los hidratos de carbono (arroz, pasta y patata) son la gasolina de nuestro organismo: cuanta mas actividad física, mayores necesidades de hidratos tendreis. Las proteínas (carne de pollo y pavo, pescado y claras de huevo) son las que reconstruyen las fibras de vuestros musculos provocadas por el desgaste del día a día. Por dosificar la ingestión de hidratos y proteínas me refiero a que en funcion de la actividad física que tengais cada día, tendreis que aumentar/disminuir la cantidad que tomareis, aumentándola los dias que realiceis ejercicio fisico y disminuyendola el resto de los días. Lo importante es que consumais la energia suficiente para desenvolveros en vuestro día a día con normalidad, pero nunca mas de la necesaria.

Una vez tenemos claros los alimentos que nos convienen, vamos a ver como organizar las comidas del día. Existe la leyenda urbana que dice que haciendo solo 3 comidas al día podremos adelgazar mas que si comemos 4 o 5 veces... Yo no soy partidario de esa teoría y no os lo recomiendo en absoluto. Al hacer menos comidas al día, se tiende a llenar mas el estomago en cada comida para no pasar hambre hasta la siguiente comida, y eso hace que las paredes de vuestro estomago se agranden. Al tener mayor volumen en el estomago, podeis llenarlo con mas cantidad de alimentos, con lo cual va a provocar que cada vez que comais lo lleneis mas y mas, lo cual os llevará a tener un estomago todavia mas grande (...).

Yo os recomiendo hacer 5 comidas al dia, mas o menos una cada 3 horas, en cantidades que no os quedeis con hambre, pero tampoco os hincheis demasiado. Se trata de que entre las comidas no noteis sensación de estar hambrientos. El cuerpo siempre debe tener alimento suficiente para que podais desenvolveros con vuestras tareas cotidianas con normalidad.

Tambien es importante la hora del día a la que tomais cada alimento. Los hidratos de carbono (arroz, pasta, patata...) no los tomeis mas tarde de la comida de mediodia, ya que los quemareis durante la actividad fisica que hagais por la tarde. En cambio, si los tomais en la cena, antes de iros a dormir, vuestro organismo no los consumirá, y los acumulará como reservas energeticas que os haran engordar por la noche.

En concreto, yo os aconsejo estas 5 comidas (prohibido picar entre comidas).
- Desayuno (7/8h)
- Almuerzo (10/11h)
- Comida (13/15h)
- Merienda (17/18h)
- Cena (20/22h)

Para el desayuno, el bol de copos de avena con leche desnatada. Esto es lo basico para que vayais al baño con regularidad. Es increible, pero en 3 semanas estareis notando los resultados.

Para el almuerzo, un bocadillo de atun natural (que podeis acompañar con tomate natural o con unas aceitunas), de pechuga de pavo, o de tortilla francesa sin freir (como si hicierais una creppe).

Para la comida, de primer plato arroz, pasta o hervido. Y de segundo una pechuga de pollo o de pavo a la plancha, o bien una sepia a la plancha o un poco de pescado (sardina, emperador, lenguado). Y de postre una o dos piezas de fruta (kiwis, naranjas, manzanas, peras o piña).

Para la merienda, un platano, un yogourt 0% grasa, unas almendras o avellanas, unos cereales o unas galletas Maria, y podeis incluir un quesito burgo de arias 0% grasa con mermelada o membrillo.

Y para la cena, una crema de verduritas (yo compro cremas Knorr) con una cucharadita de aceite y unas cuantas nueces. O bien una ensalada con tomate, lechuga, pepino, cebolla, maiz, media manzana, dos esparragos, unas nueces y un huevo duro (prescindiendo de la yema). Y que podeis combinar con atun natural o con dos patitas de cangrejo congelado. Y de postre otra pieza de fruta.

Os pongo las fotos de una comida tipica de mi dieta de un dia cualquiera del año:







Como veis, hay variedad. Es una dieta sana, equilibrada y que os permitira perder grasa de vuestro cuerpo con facilidad. Al no ingerir mucha grasa, vuestro organismo ira quemando (poco a poco) las reservas de grasa que teneis acumuladas en las paredes de vuestros músculos, por tanto estareis consiguiendo vuestro objetivo de reducir volumen y perder peso de una forma sana.



Punto básico 2: Hidratación

Es otro de los aspectos básicos para que mejoreis vuestro aspecto fisico (y vuestra salud). El cuerpo humano esta formado en un 65/70% por agua, por tanto debemos depurar esa cantidad de liquido constantemente. Para ello se recomienda beber como mínimo 2l de agua al dia. Para controlar la cantidad consumida, os recomiendo comprar una botella de agua de 2l de plastico, y rellenarla cada dia, teniendo en cuenta que antes de iros a dormir debe estar vacia todos los días. El agua filtrará nuestro organismo, eliminando impurezas, toxinas y tejidos adiposos, asi que ya sabeis que cada vez que orineis estareis mejorando vuestro estado de salud, por tanto cuanto mas agua bebais, mejor.

Otro aspecto importante es cuando debeis beber ese agua. Yo os recomiendo que lo hagais entre comidas y eviteis beber agua durante las comidas. La razón es muy simple: si llenais el estomago de agua cuando estais comiendo, pronto sentireis que estais llenos y que no teneis mas hambre. Una hora mas tarde estareis con la tripa vacia (el agua no alimenta mucho) y desesperados por picar algo antes de la siguiente comida.

Los dias que practiqueis algun deporte, al terminar la actividad física debeis beberos un zumo de frutas o una bebida isotónica como el Isostar o el Aquarius para reponer las vitaminas y las sales minerales que hayais perdido de la sudoración durante el ejercicio.

Por ultimo, olvidaros de las bebidas con gases, como la CocaCola, la Fanta, gaseosa o derivados. Os hincharan mucho y no es eso lo que buscamos.

Punto básico 3: Deporte

Mucha gente piensa que con hacer un poco de deporte se puede adelgazar, y eso no es del todo cierto. El 70% del cuerpo de un deportista de élite esta basado en su dieta. Sin una correcta alimentación, el deportista nunca llegaría a tener ese cuerpo. Pero tambien es cierto que no solo se consigue comiendo bien. Por tanto, dieta y deporte se complementan uno al otro.

Ya hemos aprendido a comer y a beber bien. Nos queda por explicar que ejercicios debemos hacer para aprovechar la dieta sana que estamos haciendo y acelerar el metabolismo de nuestro cuerpo para que consuma mas energia de la que ingerimos comiendo.

Esta demostrado que practicar deporte 1 o 2 días a la semana sirve de poco. Imagina que durmieras solo dos días a la semana: el Viernes y el Sabado: el resto de la semana estarías muerto de sueño. Si dormimos todos los días y comemos todos los días, ¿no deberíamos hacer deporte todos los dias?

Los buenos resultados se consiguen practicando ejercicio al menos 3 días a la semana, aunque yo os recomiendo 5 días. Esta claro que necesitais acostumbrar el cuerpo a la carga de trabajo, asi que empezar haciendo 3 días a la semana e ir incrementando el ritmo muy poco a poco, sin ninguna prisa.

Yo planifico mis entrenamientos en 5 días a la semana, repartiendo todos los grupos musculares que entreno entre esos 5 días:

- Piernas (3 días por semana)
- Pecho (1 dia por semana)
- Triceps (1 dia por semana)
- Hombros (1 dia por semana)
- Biceps (1 dia por semana)
- Dorsales (1 dia por semana)
- Abdominales (4 días por semana)

En concreto, organizo mis entrenamientos de esta forma:

Primer día:
5 minutos estiramientos de activación
15 minutos carrera farlek (sprint ritmo 3.30 min/km + recuperacion ritmo 6 min/km)
3 ejercicios de pecho (serie de 3x12)
3 ejercicios de triceps (serie de 3x12)
200 abdominales en series de 20/30
5 minutos estiramientos de parada

Segundo día:
5 minutos estiramientos activación
15 minutos carrera continua (ritmo 5 min/km)
Ejercicios con pesas de los distintos grupos musculares de las piernas.
200 abdominales en series de 20/30
5 minutos estiramientos de parada

Tercer día:
5 minutos estiramientos activación
3 ejercicios de hombro (serie de 3x12)
3 ejercicios de biceps (serie de 3x12)
200 abdominales en series de 20/30
5 minutos estiramientos de parada

Cuarto día:
10 minutos carrera continua (ritmo 5.30 min/km)
5 minutos estiramientos activación
30 minutos de sprints pista atletismo
5 minutos estiramientos de parada

Quinto día:
5 minutos estiramientos activación
5 ejercicios de dorsales (serie de 3x12)
200 abdominales en series de 20/30
5 minutos estiramientos de parada

Si hay alguien muy interesado en conocer mas detalles de este entrenamiento, que se ponga en contacto conmigo y se los daré con mucho gusto. Y como no se puede predicar sin dar ejemplo, los que me conoceis ya sabreis que no me gusta presumir de mi cuerpo, pero si no os enseño una foto no vais a creer en los resultados, asi que ahi va esta instantánea para motivar al personal:



Con esfuerzo estais todos capacitados para conseguirlo. Si lo intentais, pronto obtendreis los primeros resultados. Y con los primeros resultados, la motivación necesaria para seguir adelante aumentará. Espero que me comenteis los resultados si poneis este plan de dieta/entrenamiento en práctica. Tambien agradecería que gente con mas conocimientos en esta materia me corrija si hay algo que pudiera mejorarse. ¡Animo gente! ¡Como vamos a presumir este verano de cuerpo bonito!

sábado, 21 de marzo de 2009

El targetfs de un sistema embedded

Un sistema embedded es un sistema informático de bajo coste, y de propósito general, que corre sobre una plataforma hardware con recursos generalmente escasos. El hecho de que los recursos hardware escaseen en el sistema embedded, plantea problemas nuevos al ingeniero de software generalmente acostumbrado a trabajar con un ordenador de sobremesa. Imagina por un momento que tuvieras que instalar una distribución de Linux de las tipicas (Ubuntu, Fedora, Suse, etc.) en un disco duro de solo 4MB. Una distribucion Debian tipica minima (excluyendo el kernel) ocupa unos 40MB, demasiado para nuestro sistema embedded. Necesitas una alternativa bastante mas ligera.

El objetivo de este post es generar un targetfs para el sistema embedded que tenga disponibles todas las aplicaciones del user-space necesarias para manejar tu dispositivo embedded (target). Para ello usaremos la herramienta busybox.



Su manual (man) lo define como "The Swiss Army Knife of Embedded Linux", algo asi como "la navaja suiza de los Linux embedded". Busybox es un único binario que combina pequeñas versiones de los distintos comandos basicos de un sistema Linux. En terminologia busybox, cada comando basico es un "applet". La lista de los 107 applets incluidos no tiene desperdicio:

addgroup, adduser, adjtimex, ar, arping, ash, awk, basename, bunzip2,
busybox, bzcat, cal, cat, chgrp, chmod, chown, chroot, chvt, clear, cmp,
cp, cpio, crond, crontab, cut, date, dc, dd, deallocvt, delgroup, deluser,
devfsd, df, dirname, dmesg, dos2unix, dpkg, dpkg-deb, du, dumpkmap,
dumpleases, echo, egrep, env, expr, false, fbset, fdflush, fdformat, fdisk,
fgrep, find, fold, free, freeramdisk, fsck.minix, ftpget, ftpput, getopt,
getty, grep, gunzip, gzip, halt, hdparm, head, hexdump, hostid, hostname,
httpd, hush, hwclock, id, ifconfig, ifdown, ifup, inetd, init, insmod,
install, ip, ipaddr, ipcalc, iplink, iproute, iptunnel, kill, killall,
klogd, lash, last, length, linuxrc, ln, loadfont, loadkmap, logger, login,
logname, logread, losetup, ls, lsmod, makedevs, md5sum, mesg, mkdir,
mkfifo, mkfs.minix, mknod, mkswap, mktemp, modprobe, more, mount, msh, mt,
mv, nameif, nc, netstat, nslookup, od, openvt, passwd, patch, pidof, ping,
ping6, pipe_progress, pivot_root, poweroff, printf, ps, pwd, rdate,
readlink, realpath, reboot, renice, reset, rm, rmdir, rmmod, route, rpm,
rpm2cpio, run-parts, rx, sed, seq, setkeycodes, sha1sum, sleep, sort,
start-stop-daemon, strings, stty, su, sulogin, swapoff, swapon, sync,
sysctl, syslogd, tail, tar, tee, telnet, telnetd, test, tftp, time, top,
touch, tr, traceroute, true, tty, udhcpc, udhcpd, umount, uname,
uncompress, uniq, unix2dos, unzip, uptime, usleep, uudecode, uuencode,
vconfig, vi, vlock, watch, watchdog, wc, wget, which, who, whoami, xargs,
yes, zcat

Busybox funciona usando argv[0] para determinar el applet que debe invocar. Al renombrar el binario de busybox con el nombre de un applet determinado, se ejecuta dicho applet. Sin embargo esto no es practico. El truco que usa busybox es tener un único binario llamado "busybox" y tener un enlace (link) simbólico distinto por cada applet apuntando al binario de busybox. Asi por ejemplo:
$ ls -l /bin
-rwxr-xr-x 1 0 0 272800 busybox
lrwxrwxrwx 1 0 0 12 sh -> busybox
lrwxrwxrwx 1 0 0 12 cp -> busybox
lrwxrwxrwx 1 0 0 12 ls -> busybox

Para crear los enlaces simbólicos, se usa el comando ln:
$ ln -fs busybox sh
$ ln -fs busybox cp
$ ln -fs busybox ls

Así por ejemplo, para ejecutar un listado largo usando el applet ls, hacemos:
$ /bin/ls -l

donde /bin/ls es en realidad un link apuntando al binario busybox.

Para compilar busybox, hay que descargar los fuentes, preferiblemente del sitio oficial http://www.busybox.net/downloads/. Para obtener los fuentes de la versión 1.9.0 y extraer su contenido, hacemos esto:
$ cd /usr/src
$ wget http://www.busybox.net/downloads/busybox-1.9.0.tar.gz
$ tar xvfz busybox-1.9.0.tar.gz

Durante el proceso de configuración de la compilación de busybox, el usuario decide los applets que integra el binario resultante una vez compilado. Para ello, busybox emplea un método similar al de la compilación del kernel de Linux (.config), pudiendo usar varias opciones:
$ make allnoconfig
$ make oldconfig
$ make menuconfig

Para realizar la compilación, basta con ejecutar el comando make, igual que se hace con el kernel de Linux, y el binario resultante aparece en la raiz de los fuentes:
$ make

Despues de un buen rato esperando, tendras compilado tu busybox.

Retomando el objetivo inicial de este post, nos interesa generar un targetfs para el dispositivo embedded. Para ello crea una partición de 4MB en un fichero de tu disco duro (por ejemplo targetfs4M.img) y crear un sistema de ficheros en su interior (por ejemplo, formatealo con EXT2).
$ dd if=/dev/zero of=targetfs4M.img bs=1M count=8
$ mkfs.ext2 -F targetfs4M.img

Despues monta la partición de 4MB recien creada (targetfs4M.img) en el sistema de ficheros de tu ordenador de sobremesa, por ejemplo en el directorio /media/removable.
$ mount -o loop targetfs4M.img /media/removable

Por ultimo instala el binario de busybox en el targetfs de tu sistema embedded:
$ make install CONFIG_PREFIX=/media/removable

La instalación copia el binario del busybox en /media/removable (en la partición de 4MB montada en ese directorio) y crea en su interior todos los enlaces simbólicos a los applets configurados y compilados dentro del directorio de compilación.

Con esto ya tienes un targetfs básico para tu sistema embedded. No estará completo porque deberás añadir la aplicación que deba correr tu sistema embedded, pero ya dispones de un buen punto de partida para empezar a jugar con tu sistema. Ah! Y no olvides hacer un sync y desmontar /media/removable antes de hacer nada mas con esa partición!

viernes, 27 de febrero de 2009

Ya no me gustas GNOME: bienvenido XFCE

He sido usuario de GNOME durante los últimos 5 años. No tenía nada en contra de KDE (de hecho desarrollo habitualmente con la libreria Qt), pero una vez me acostumbré a sus atajos de teclado, llegó el momento que sin ellos mi vida ya no tenia sentido. ¡Que sería de mi si no pudiera abrir un nuevo tag del terminal con Mays+Ctrl+t [...]!

GNOME y KDE son dos de los escritorios de Linux mas extendidos en la actualidad. Los dos cumplen su función de manera extraordinaria, facilitando las tareas a los usuarios, sobre todo a aquellos usuarios que yo llamo "de la generación ventana", poco o nada acostumbrados al uso del terminal. (A todos vosotros, no sabeis lo que os perdeis. Bueno, este será tema de otro debate).

Sin embargo, ambos escritorios comparten un serio problema que me disgusta bastante, acentuado sobre todo en sus últimas versiones: un consumo de recursos exagerado, que causa una caida notable del rendimiento del PC. Esta perdida de rendimiento se nota mucho mas en los PCs con menos cantidad de memoria RAM. ¿No era ese uno de los motivos por los que yo no gustaba de usar Windows [...]?

En el caso de GNOME corriendo en mi PC con 1GB de memoria RAM, mas de 500MB los consumía GNOME, el solito. Y claro, cuando los recursos de tu PC escasean y la economía no está para muchos extras tecnológicos (esperaremos tiempos mejores), uno tiene que mirar alternativas que satisfagan sus necesidades de la mejor manera posible.

Y buscando por google encontré una alternativa que me gustó, y me gustó mucho. Tanto que desde entonces ha pasado a ser el nuevo escritorio de mi PC. Se trata del escritorio XFCE (version 4) que viene de serie en la distribución XUbuntu.

Como podeis ver en este pantallazo, a primera vista se trata de un escritorio similar a cualquier otro que ya esteis acostumbrados a usar:



Si seguis mirando capturas de pantalla vereis que pese a su sencillez, es bastante completo: un panel con multitud de opciones para su configuración, escritorios virtuales, transparencias en las ventanas, en los marcos, applets para la barra de tareas. Y por lo que he podido probar hasta ahora, muy estable.







Estamos de acuerdo en que no es un GNOME+compiz con escritorios virtuales rotando en 3D con efectos de aguas al mover la ventanas, iconos animados y tal. Pero, ¿y que me aporta a mi toda esa parafernalia? Pues en realidad muy poco. Esas características las usamos mas para presumir de escritorio bonito que para aumentar nuestra productividad.

En cambio, ¿que gano yo usando XFCE? Un escritorio que consume 14MBytes en memoria RAM, y deja libre casi 1GByte de memoria RAM para que se ejecuten las aplicaciones de mi PC. Desde que lo he instalado, mis aplicaciones estan radiantes de felicidad, dando saltos de alegría por los bits de mi memoria RAM. Todas han abandonado el cuarto oscuro llamado "la partición de swap" por completo. Y me lo agradecen todos los días dandome unos tiempos de respuesta inauditos desde hacía mucho tiempo. Y ese placer espiritual que produce poder abrir un nuevo tag del xfce4-terminal con Mays+Ctrl+t [...]

¿Que mas se le puede pedir a un escritorio? Sin duda alguna... ¡Me gustas XFCE, bienvenido a mi PC!

sábado, 31 de enero de 2009

Usando valgrind + memcheck como debugger

Linus Torvalds declaró en este post su postura contraria al uso de debuggers en el kernel, argumentando que son herramientas usadas por los malos desarrolladores que, lejos de aprender de sus errores, se concentran en resolver el problema sin profundizar en la causa real del error. Y por tanto, prefiere mantenerlos lejos del desarrollo del kernel. Desde luego que tiene mucha razón (palabra de Linus).

Mi postura, no tan radical, aunque totalmente de acuerdo con sus argumentos. Es deseable desarrollar con sumo cuidado e intentar evitar todos los fallos durante la codificación, pues detectarlos a posteriori en ocasiones puede ser complicado. Sin embargo, puede que tengamos que analizar algun core de código que no hemos escrito nosotros. Y en una línea que nunca en la vida debería fallar. ¿Que esta ocurriendo?. ¿Que hacemos ahora? Es en estos casos cuando necesitamos ayuda de lo que yo llamo "las fuerzas especiales".


En este post os voy a explicar como usar el debugger valgrind con la herramienta memcheck para detectar 5 errores comunes en la programación de C/C++. Lo vemos en estos 5 test:

Test 1: Detección de una perdida de memoria:

03 int main()
04 {
05 char *x = malloc(100); /* memory leak */
06 return 0;
07 }
$ gcc -g test1.c -o test1
$ valgrind --tool=memcheck --leak-check=yes ./test1
==8458== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1
==8458== at 0x4C265AE: malloc (vg_replace_malloc.c:207)
==8458== by 0x40051D: main (test1.c:5)


Test 2: Detectar escrituras fuera de los limites de la memoria reservada:

03 int main()
04 {
05 char *x = malloc(10);
06 x[10] = 'a'; /* write out of bounds */
07 return 0;
08 }
$ gcc -g test2.c -o test2
$ valgrind --tool=memcheck --leak-check=yes ./test2
==17039== Invalid write of size 1
==17039== at 0x40052A: main (test2.c:6)
==17039== Address 0x519d03a is 0 bytes after a block of size 10 alloc'd
==17039== at 0x4C265AE: malloc (vg_replace_malloc.c:207)
==17039== by 0x40051D: main (test2.c:5)


Test 3: Detectar el uso de variables sin inicializar:

03 int main()
04 {
05 int x;
06 if (x == 0) /* uninitialised variable */
07 printf("x is zero");
08 return 0;
09 }
$ gcc -g test3.c -o test3
$ valgrind --tool=memcheck --leak-check=yes ./test3
==17070== Conditional jump or move depends on uninitialised value(s)
==17070== at 0x400518: main (test3.c:6)


Test 4: Intentar liberar una zona de memoria que no ha sido reservada:

03 int main(void)
04 {
05 char * str;
06 free(str); /* free not allocated */
07 return 0;
08 }
$ gcc -g test4.c -o test4
$ valgrind --tool=memcheck --leak-check=yes ./test4
==17092== Conditional jump or move depends on uninitialised value(s)
==17092== at 0x4C25265: free (vg_replace_malloc.c:323)
==17092== by 0x40051C: main (test4.c:6)


Test 5: delete en C++ mal hecho:

01 int main(void)
02 {
03 char * str = new char[10];
04 delete str; // instead of: delete [] v;
05 return 0;
06 }
$ g++ -g test5.c -o test5
$ valgrind --tool=memcheck --leak-check=yes ./test5
==17116== Mismatched free() / delete / delete []
==17116== at 0x4C24DAD: operator delete(void*) (vg_replace_malloc.c:342)
==17116== by 0x40067A: main (test5.cpp:4)


Hemos visto que valgrind es una herramienta de mucha ayuda para un desarrollador de C/C++ que sin duda nos ayudará a resolver muchos bugs. No obstante, tambien tiene sus limitaciones, por ejemplo que memcheck no comprueba los limites en los arrays estaticos, y por tanto no detecta este error:

01 int main()
02 {
03 char x[10];
04 x[11] = 'a'; /* not detected! */
05 return 0;
06 }


No obstante, debemos recordar las palabras de Linus. Los debugger son para los malos programadores. Y nosotros queremos ser buenos programadores. Asi que debemos aprender de nuestros errores e intentar que no vuelvan a repetirse en el futuro. Si seguis estos consejos, los debuggers tienen los días contados :-) En todo caso, para mi, el mejor debugger que ha existido y que siempre existirá es el printf (en C) o el cout (en C++).

viernes, 23 de enero de 2009

Controla tu tarifa plana de Orange

Todos debemos (deberíamos) llevar un control exhaustivo del gasto mensual que hacemos en la factura de nuestro teléfono movil, y mas en plena época de crisis en la que siempre viene tan bien ahorrarse unas pelillas. Lo primero sin duda es elegir una tarifa que se adapte a vuestras necesidades.

En mi caso, tengo la tarifa plana de Orange: pago 22 euros al mes y hablo 1000 minutos gratis. Eso siempre que las llamadas sean dentro de la franja horaria de 18-08h. Los SMS y las llamadas fuera de la franja horaria se pagan aparte. El problema de la tarifa plana es que Orange no proporciona ningún servicio para controlar los minutos consumidos (ya me informé en su momento, muy mal hecho señores de Orange) y cuando (como en mi caso) apuras el consumo mensual hasta el último suspiro, a veces puedes llevarte sorpresas desagradables si no controlas el tiempo.

Este post explica como controlar los minutos que todavía os quedan disponibles para seguir llamando, y así poder apurar al máximo los minutos gratuitos. Para ello necesitas dos cosas: el listado de llamadas del periodo de facturación actual (en formato .txt) y un bash shell script en Linux que desarrollé hace algun tiempo y que extrae la información de esa factura.

El bash shell script lo teneis disponible aqui.

http://socios.aditel.org/~icastell/develex/bash/orangeTarifaPlanaActual.sh

Esta licenciado bajo GPL, asi que podeis usarlo y modificarlo a vuestro antojo, siempre que respeteis la licencia.

Para conseguir el listado de llamadas del periodo de facturación actual, hay que darse de alta en la página de Orange, enviando un SMS (gratuito) desde vuestro movil Orange al 222, con el texto CLAVE seguido de un espacio y la clave entre 6 y 8 dígitos, por ejemplo: CLAVE 12345678. Después os autentificais en el área de clientes de su página web http://www.orange.es, introduciendo vuestro número de teléfono y el password que hayais elegido en el SMS:
En el menú que aparece a la izquierda, hay que seleccionar dentro del apartado "mi factura y consumo", la opción "listado de llamadas" e insertar en el calendario el periodo de facturación en el que estais interesados:
En pantalla aparece un listado de todas las llamadas realizadas en el periodo de facturación indicado en el paso anterior. Lo siguiente es pulsar el boton que aparece al pie de la pagina "Imprimir todas las paginas", tal y como muestra la siguiente imagen:
Al pulsar ese boton aparece una ventana emergente para iniciar la impresión. Esa ventana no será necesaria, debes cerrarla. En pantalla tendrás el listado de todas las llamadas realizadas. Debes seleccionarlo al completo desde la primera llamada hasta la última, y usar la función de copiar/pegar para guardarlo en un fichero de texto llamado factura.txt (en realidad el nombre es irrelevante).

Ya tienes el listado de llamadas. Ese listado lo vas a usar como input del script que ya debes haber descargado. Para probarlo, basta con que ejecutes esto en linea de comandos del bash:

$ orangeTarifaPlanaActual.sh factura.txt

Los resultados del script son concluyentes:

Gasto en llamadas sin descuentos = 234.1776 (euros)
Gasto en llamadas con descuentos = 6.5448 (euros)
Minutos gratis consumidos = 994.26666666666666666666
Minutos gratis restantes = 5.73333333333333333334
Total factura a pagar este mes = 33.111968 (euros)

Este mes nos han sobrado poco mas de 5 minutos. Podríamos haber hecho una llamadita mas. Pero mas de 200 euros de ahorro en llamadas, ¡no estan nada mal!

domingo, 4 de enero de 2009

El cubo de Rubik

Papa Noel me trajo estas Navidades un juguete nuevo muy chulo: un cubo de Rubik de 3x3. De pequeño ya tuve uno, pero me causó una gran frustración no poder resolverlo nunca y finalmente opté por despegar todas las pegatinas y pegarlas en su posición correcta. ¿Lo resolví o no? jeje. Pues si, pero a partir de entonces el cubo quedo algo dañádo, por decirlo de alguna manera, y algunas pegatinas se caian de cuando en cuando... Aquella azaña no me dejó un buen sabor de boca. Asi que estas vacaciones me puse manos a la obra, leyendo algunos manuales de Internet, para sacarme la espinita.

El cubo viene resuelto de fábrica, asi que lo primero que hay que hacer es enredarlo todo lo que podais. De eso se encargó mi hermano antes de regalarmelo... ¡ya te apañaras! me dijo. ¡Que cabron! jeje Pense yo. Pero no os preocupeis porque puede resolverse desde cualquier posición. Nuestra posicion de partida del cubo es la siguiente:


Para empezar hay que tomar una cara de referencia como cara superior del cubo. Sirve cualquiera, asi que vamos a tomar la blanca que me gusta mas. Debes hacer una cruz en la cara blanca. Ademas, todas sus caras laterales deben tener el color de su celda central del mismo color que la celda que hay por encima:


Una vez has conseguido esto, debes completar toda la primera fila de cada lateral de su color, lo que a su vez completará la cara superior de color blanco:


Ahora debes completar la segunda fila de cada lado:


En este punto, debes girar el cubo, tomando como base la cara blanca y como cara superior la cara amarilla (todavia sin completar):


Igual que hiciste con la cara blanca, debes hacer una cruz en la cara amarilla, por supuesto sin estropear la cara blanca ni las dos filas inferiores que ya tenemos en su posición correcta:


Ahora todas las caras laterales deben tener el color de su celda central del mismo color que la celda que hay por encima, por supuesto respetando la cruz de color amarillo:


En el siguiente paso debes situar las fichas de las 4 esquinas que todavía faltan por completar en su posicion, aunque sus colores no esten bien encarados:


Por útimo solo queda encarar con sus colores las fichas que todavia no lo esten. Y por fin, el cubo queda resuelto:


¡Objetivo cumplido!

Los algoritmos necesarios para conseguir la secuencia descrita no los he incluido aqui porque es bastante mas complicado de explicar que de entender. Hay multitud de manuales en Internet y por supuesto, podeis preguntarme aqui si teneis cualquier duda.

Ha sido muy divertido aprender a resolverlo y me lo he pasado muy bien. Pero en realidad no es trivial, y desde luego no es un juguete pensado para un niño de 8 años que no reciba ninguna ayuda para resolverlo. El cubo 3x3 tiene 43 trillones de posiciones y sin una guia que te explique los pasos es prácticamente impensable que alguien pueda resolverlo por su cuenta.

No obstante, en este mundo hay gente para todo, y el estadounidense Shotaro Makisumi ostenta el record mundial de velocidad en 12,11 segundos, y a ciegas en 3 minutos y 37 segundos. Desde luego que no voy a ser yo quien se lo quite...

Visitas:

Seguidores