domingo, 20 de mayo de 2012

Fabricar una microSD para arrancar el IGEPv2


= Que es el IGEPv2 =

El IGEPv2 board es una placa embebida muy parecida a la conocida Beagle board, pero con 512MB de memoria RAM y 512MB de NAND flash (en lugar de los 256 de la Beagle). Esta placa lleva una CPU muy rápida (un ARM Cortex A8, OMAP 3530 que corre a 720MHz), y una GPU PowerVR SGX530 a 110MHz que permite correr un servidor de X de manera eficiente. Ademas cuenta con puertos de I/O de audio estéreo, salida de video DVI-D usando HDMI (720p HD), ethernet RJ45, microSD, USB host/device y conectividad inalámbrica WiFi y Bluetooth.



Teniendo en cuenta que su tamaño es aproximadamente el mismo que el de una tarjeta de crédito, y que su consumo es de solo 5W, se trata de una placa muy apetecible para montar sistemas embebidos de todo tipo. La limitación aquí ya no viene dada por las capacidades de la placa, sino por la de tu propia imaginación...

Por el reducido consumo, yo lo usaré como servidor en Internet dedicado las 24h. Pero es solo una idea de las muchas que seguro se te ocurren: cámaras de vídeo vigilancia, receptores de GPS, TPV táctiles, lectores de tarjetas, cajeros automáticos, control de domótica, robots inteligentes, señalización de autopistas, videoconsolas, centro de datos multimedia, etc. etc. etc.

Es un hardware diseñado y fabricado íntegramente en Barcelona por la empresa catalana ISEE, que lo vende a un precio de 188€. Tratándose de un producto nacional, de una calidad excelente, y tal como están las cosas en este país con esta maldita crisis, merece la pena destacar a una empresa nacional que continua invirtiendo en I+D, y desarrollando tecnología puntera a nivel internacional.

= Material necesario para trabajar con el IGEPv2 =

Además del IGEPv2, necesitas material adicional para trabajar con la placa: un alimentador de 5V y un cable para el puerto serie de debug con conector plano (que también vende el fabricante). Una tarjeta microSD de al menos 2GB, un lector de tarjetas microSD, y si tu PC no tiene conector de puerto serie DB9 (lo habitual en estos días), un conversor de USB a DB9. También es necesario un conversor NULL MODEM (para cruzar las señales Tx y Rx). Sería ideal que el conversor de USB a DB9 ya fuera NULL MODEM (de esa manera nos evitamos comprar el conversor NULL MODEM), aunque yo no he encontrado ninguno de estos en el mercado.




= El arranque del IGEPv2 =

En general, los procesadores OMAP35xx pueden arrancar desde una microSD.

El IGEPv2 (basado en el OMAP35xx) usa la tarjeta microSD como el dispositivo de arranque de mas alta prioridad, lo que significa que el procesador intenta arrancar desde la microSD antes que intentar arrancar desde cualquier otro dispositivo (desde la NAND flash).

El procesador intenta cargar un archivo llamado MLO, que reside en la primera partición de la tarjeta microSD, y que también se conoce como x-loader. El procesador solamente carga y ejecuta el programa MLO e ignora el resto. El x-loader (MLO) pasa a ejecutarse por el procesador. Ya es responsabilidad del x-loader que el arranque continúe cargando un kernel, un bootloader (u-boot), o cualquier otra cosa.



= Fabricación de la microSD para arrancar el IGEPv2 =

La tarjeta microSD debe reconfigurarse con unas características determinadas para que puedas usarla para arrancar el IGEPv2:
  • Una geometría particular (heads, sectors, cilindros)
  • Dos particiones primarias (una de msdos 'boot' y otra de linux 'rootfs').

= Definir la geometría y las particiones en la microSD =

Mucho cuidado! Usaremos /dev/sde como fichero dispositivo para la microSD, pero ten en cuenta que este nombre de fichero dispositivo lo decide el kernel cuando detecta un nuevo dispositivo conectado al sistema, por lo que asegúrate de confirmar este valor antes de continuar (comando dmesg), o en caso contrario podrías dañar tu equipo completamente. Avisado quedas.

Borra la tabla de particiones:

    $ sudo dd if=/dev/zero of=/dev/sde bs=1024 count=1024

Arranca el fdisk sobre el dispositivo de la microSD con los flag -u=cylinders (para establecer unidades en cilindros) y -c=dos (para establecer el modo de compatibilidad DOS), ya que por defecto es NONDOS y la microSD que genera no funciona correctamente.

    $ sudo fdisk -u=cylinders -c=dos /dev/sde

Borra todas las particiones creadas en esa tarjeta SD:

    Command (m for help): [d]
    Selected partition 1

Printa la geometría actual de la tarjeta microSD:

    Orden (m para obtener ayuda): p
    Disco /dev/sde: 4035 MB, 4035969024 bytes
    125 cabezas, 62 sectores/pista, 1017 cilindros
    Unidades = cilindros de 7750 * 512 = 3968000 bytes
    Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
    Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
    Identificador de disco: 0x000a6737

La geometría de la tarjeta microSD debe ser esta:
  • 255 heads
  • 63 sectors/track
  • CCC cilindros
El numero de cilindros (valor CCC) se calcula de esta manera:

    4035969024 / 255 / 63 / 512 = 490.677734375

En este caso, CCC=490 (es decir, se trunca, no se redondea)

Como vemos en el listado obtenido antes, nuestra tarjeta microSD no tiene estos parámetros de geometría, por lo que tenemos que cambiarlos. Para establecer los valores calculados, entra en el modo extendido:

    Orden (m para obtener ayuda): x
    Orden avanzada (m para obtener ayuda): h
    Número de cabezas (1-256, valor predeterminado 125): 255
 
    Orden avanzada (m para obtener ayuda): s
    Número de sectores (1-63, valor predeterminado 62): 63
    Atención: estableciendo desplazamiento de sector para compatibilidad con DOS

    Orden avanzada (m para obtener ayuda): c
    Número de cilindros (1-1048576, valor predeterminado 1017): 490 (CCC)

Vuelve al modo normal, y printa el trabajo realizado:

    Orden avanzada (m para obtener ayuda): r

    Orden (m para obtener ayuda): p

    Disco /dev/sde: 4035 MB, 4035969024 bytes
    255 cabezas, 63 sectores/pista, 490 cilindros
    Unidades = cilindros de 16065 * 512 = 8225280 bytes
    Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
    Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
    Identificador de disco: 0x000a6737

Crea ahora la partición primaria de 'boot'

    Orden (m para obtener ayuda): n

    Acción de la orden
    e   Partición extendida
       p   Partición primaria (1-4)
    p
    Número de partición (1-4): 1
    Primer cilindro (1-490, valor predeterminado 1):
    Se está utilizando el valor predeterminado 1
    Último cilindro, +cilindros o +tamaño{K,M,G} (1-490, valor predeterminado 490): +8

    Orden (m para obtener ayuda): t
    Se ha seleccionado la partición 1
    Código hexadecimal (escriba L para ver los códigos): c
    Se ha cambiado el tipo de sistema de la partición 1 por c (W95 FAT32 (LBA))

Marca la partición de 'boot' como bootable:

    Orden (m para obtener ayuda): a
    Número de partición (1-4): 1

Ahora crea la partición primaria del 'rootfs':

    Orden (m para obtener ayuda): n
    Acción de la orden
    e   Partición extendida
       p   Partición primaria (1-4)
    p
    Número de partición (1-4): 2
    Primer cilindro (52-490, valor predeterminado 52):
    Se está utilizando el valor predeterminado 52
    Último cilindro, +cilindros o +tamaño{K,M,G} (52-490, valor predeterminado 490):
    Se está utilizando el valor predeterminado 490

El trabajo realizado hasta ahora debe visualizarse de esta manera:

    Orden (m para obtener ayuda): p

    Disco /dev/sde: 4035 MB, 4035969024 bytes
    255 cabezas, 63 sectores/pista, 490 cilindros
    Unidades = cilindros de 16065 * 512 = 8225280 bytes
    Tamaño de sector (lógico / físico): 512 bytes / 512 bytes
    Tamaño E/S (mínimo/óptimo): 512 bytes / 512 bytes
    Identificador de disco: 0x4b4b1fee

    Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
    /dev/sde1   *           1           9       72261    c  W95 FAT32 (LBA)
    /dev/sde2              10         490     3863632+  83  Linux

Por último, graba y sal:

    Orden (m para obtener ayuda): w
    ¡Se ha modificado la tabla de particiones!
    Llamando a ioctl() para volver a leer la tabla de particiones.
    ATENCIÓN: Si ha creado o modificado alguna de las
    particiones DOS 6.x, consulte la página man de fdisk
    para ver información adicional.
    Se están sincronizando los discos.


= Formatear las particiones =

Antes de continuar, asegúrate de desmontar las dos particiones recién creadas, ya que a veces el auto montado las monta automáticamente, y ahora mismo no es lo que deseamos (comando umount). Después haz lo siguiente:

Formatea la partición de boot (label 'boot'):

    $ sudo mkfs.msdos -F 32 /dev/sde1 -n boot
    mkfs.msdos 3.0.7 (24 Dec 2009)

Formatea la partición del rootfs (label 'rootfs'):

    $ sudo mkfs.ext4 -L rootfs /dev/sde2
    mke2fs 1.41.11 (14-Mar-2010)
    Etiqueta del sistema de ficheros=rootfs
    Tipo de SO: Linux
    Tamaño del bloque=4096 (bitácora=2)
    Tamaño del fragmento=4096 (bitácora=2)
    Stride=0 blocks, Stripe width=0 blocks
    241920 nodos-i, 965908 bloques
    48295 bloques (5.00%) reservados para el superusuario
    Primer bloque de datos=0
    Número máximo de bloques del sistema de ficheros=989855744
    30 bloque de grupos
    32768 bloques por grupo, 32768 fragmentos por grupo
    8064 nodos-i por grupo
    Respaldo del superbloque guardado en los bloques:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

    Escribiendo las tablas de nodos-i: hecho
    Creating journal (16384 blocks): hecho
    Escribiendo superbloques y la información contable del sistema de ficheros: hecho

    Este sistema de ficheros se revisará automáticamente cada 37 montajes o
    180 días, lo que suceda primero.  Utilice tune2fs -c o -i para cambiarlo.

Con esto ya tienes lista la tarjeta microSD para arrancar el IGEPv2.


= Trabajo pendiente =

En la partición 'boot' hay que copiar 3 ficheros:
  • MLO: el binario del x-loader
  • igep.ini: un fichero de configuración proporcionado por ISEE
  • zImage: la imagen del kernel que deseamos arrancar.
Y en la particion 'rootfs' hay que meter:
  • El rootfs descomprimido (aplicaciones del userspace).
De momento dejaremos estas tareas pendientes para el próximo articulo del blog. Si te ha gustado lo que has aprendido en este articulo, continua atento en los próximos días!

sábado, 10 de marzo de 2012

Esta vida me matará a disgustos

Esta gente que viven de los impuestos que pagamos todos, se dedican a estropearme las pocas horas libres que tengo a la semana... Otro jaleo legal mas, y ya van demasiados durante este año 2012, creo que ya he perdido la cuenta. No doy abasto, estoy hecho polvo, van a acabar con mi salud. Yo solo quería dedicar mi fin de semana a estudiar y descansar, después de una semana de lo mas movida, y es que no hay manera, todos los fines de semana me tiene que pasar algo.



Resulta que ahora me han enviado una multa grave, ni mas ni menos que de 200€, supuestamente por haber infringido el articulo 12.4 del Reglamento General de Conductores: conducir con el permiso de circulación caducado. Pero es que mi permiso de circulación B esta en regla hasta el año 2014. ¿A caso desde la administración pública no tienen acceso a la base de datos para contrastar ese dato?

Así que me he pasado medio fin de semana preparando el escrito de alegaciones y toda la documentación para poner el recurso, que tendré que entregar por vía Administrativa en una oficina de Correos para que me compulsen toda la documentación, que por supuesto, primero tendré que encargarme de recopilar. Esta claro que mi tiempo libre no vale nada para esta gente. ¡¡Es que no me dejan vivir tranquilo!! Os juro que ¡¡ESTOY HARTO!!


Generalitat de Catalunya
Servei Territorial de Transit de Barcelona
Plaza de España, nº 1
08015, Barcelona


Antecedentes:

El Domingo 18 de Diciembre de 2011 circulaba por Terrassa con mi vehículo matricula XXX. Bajaba por la Avenida de Barcelona, dirección hacia el Parc Valles. Tras ponerse en verde el semáforo que da acceso a la carretera de Montcada, siempre por mi carril de la derecha y a no mas de 20Km/h, cuando iba a girar hacia la derecha para incorporarme a la Avinguda de les Glories Catalanes (justo enfrente del edificio de la policía municipal de Terrassa), escuché un fuerte derrape detrás de mi coche, tras el cual noté un golpe seco en la parte trasera izquierda de mi vehículo que me lanzó varios metros hacia delante.

El conductor del vehículo que golpeó a mi coche, salió de su coche muy agitado, gritándo, y encarándose conmigo, sin dejarme hablar, afirmando que la culpa era mia, cuando yo iba delante por mi carril de la derecha, y él fue quien golpeó a mi coche por detrás, a una velocidad desproporcionada para lo que es ese tramo de carretera (derrapó y por la inercia, me golpeó).

Considerando que era imposible hacer un parte amistoso con este conductor, llamé desde mi teléfono móvil XXXXXXXXX a la policía local de Terrassa, a las 20:40h (adjunto la factura de teléfono con los datos de la llamada), para que vinieran a hacer el atestado del accidente. Los dos agentes de la policía local llegaron en pocos minutos.

Solicité personalmente que practicaran la prueba de alcoholemia a este conductor, puesto que no veía coherente su estado de animo tan alterado. Éste incluso llegó a encararse con los policías locales. Yo también hice la prueba de alcoholemia, con resultado negativo.

Toda la documentación de mi vehículo (ficha técnica, carnet de conducir, permiso de circulación y justificante de pago del seguro en vigor) le fue entregada al policía local cuando me la requirió. Pueden comprobar en la documentación adjunta, que toda la documentación solicitada estaba en regla.


Denuncia reclamada:

En fecha 09/03/2012 he recogido una notificación de Correos procedente de Servei Territorial de Trànsit de Barcelona, por una denuncia “GREU” del día 18 de Diciembre del 2011 a las 21:26h, en la avenida de les Glories Catalanes, en Terrassa (el día del accidente en el lugar de los hechos anteriormente descritos), por un importe de 200€. El hecho denunciado, “CONDUIR EL VEHICLE AMB L'AUTORITZACIÓ ADMINISTRATIVA CADUCADA, SUSCEPTIBLE D'ESSER PRORROGADA”, artículo y norma infringida el Reglamento general de conductores, 12.4.


Alegaciones:

Tal y como pueden comprobar en la documentación adjunta, mi permiso de circulación B esta en vigor hasta el XX.XX.2014, así como el resto de la documentación presentada al policía local cuando me la requirió el día de los antecedentes descritos anteriormente. Por lo que no entiendo los motivos de esta sanción, y seguramente se trate de algún error.

Mi sorpresa al recibir la notificación de esta sanción ha sido mayúscula, puesto que tras hablar durante varios minutos con el policía local mientras le describía personalmente los hechos del accidente y él redactaba el atestado, en ningún momento me dijo nada sobre el hecho denunciado. De haberme avisado en el momento, lo hubiéramos aclarado todo inmediatamente. Ahora, gestionar esta reclamación casi 3 meses después del accidente a mi me ha supuesto, y supongo que a ustedes también, una perdida de tiempo considerable que todos nos hubiéramos ahorrado si se hubiera notificado esta sanción en el momento.


Solicito:

A raíz de los antecedentes descritos, de las alegaciones planteadas, y de las pruebas presentadas, solicito que se admita a trámite este escrito de alegaciones, procedan a retirar esta denuncia, y revisen de nuevo los datos del atestado del accidente para comprobar si se ha cometido algún error administrativo con los datos de la persona denunciada.


Documentación adjunta:

1.- Copia de la denuncia recurrida
2.- Copia del atestado del accidente descrito
3.- Documento nacional de identidad
4.- Permiso de circulación B
5.- Ficha técnica del vehículo
6.- Justificante de pago del seguro obligatorio
7.- El permiso de circulación para el año 2011
8.- Factura de teléfono con los datos de la llamada a la policía local de Terrassa


Terrassa, a 10 de Marzo de 2012

Firmado:
Angel Ivan Castell Rovira.


Actualización del 17 de Abril de 2012. El recurso ha sido aceptado y la multa retirada. Si es que no podía ser de otra manera... ¡menos mal! :-)

miércoles, 25 de enero de 2012

El mecanismo de conexiones, señales y slots en Qt

Este post asume que el lector tiene ciertos conocimientos en programación C++ y en la librería Qt. Si no sabes de que te estoy hablando, es mejor que dediques tu tiempo a leer otro sitio, porque te vas a aburrir de lo lindo. Avisado quedas.



=== La base teórica ===

El mecanismo de señales y slots es una de las características mas importantes de la librería Qt, probablemente la que le diferencia de otros framework para desarrollar interfaces de usuario.

Las señales y los slots se usan para las comunicaciones entre los objetos del interfaz. En general, la señal (signal) parte de un objeto "emisor" y llega a un objeto "receptor". El objeto receptor decide si ejecuta un slot y finaliza el proceso, o emite una nueva señal que propaga el evento hacia otro objeto receptor. El proceso se puede repetir.

Como ejemplo sencillo, imagina un botón de "Apagar". Cuando el usuario lo pulsa, el boton genera la señal clicked(). Y en respuesta a esa señal, el sistema ejecuta un slot que hace un apagado ordenado de todo el sistema.

Para establecer una conexión entre la señal emitida por un objeto "emisor" y un slot que ejecuta el objeto "receptor", se usa el metodo connect() y las macros SIGNAL() y SLOT(). La sintaxis es esta:

    connect(emisor, SIGNAL(signal_emitida()), receptor, SLOT(slot_doaction()));


Cuando el widget "emisor" genera la señal "signal_emitida", el widget "receptor" ejecuta el código del slot "slot_doaction". La llamada connect, y las macros SIGNAL() y SLOT() forman parte de la sintaxis de Qt, y no son parte del estandar C++. Para compilarlas, se usa un meta-object compiler (moc) que traduce estas macros en C++ estándar. Esta parte escapa del propósito de este post , aunque si sientes interés, no dudes en preguntarme.

Algunas consideraciones a tener en cuenta:

* Una misma señal puede conectarse a distintos slots
* Distintas señales pueden conectarse a un mismo slot
* Una señal puede conectarse a otra señal, lo que emite una segunda signal en el widget receptor inmediatamente después de recibir la primera.

La lista de parámetros de la señal signal_emitida(signature) debe coincidir con la lista de parámetros del slot_doaction(signature). Pero el slot slot_doaction(signature) puede tener menos parámetros que los que tiene la señal signal_emitida(signature), en cuyo caso los parámetros adicionales son simplemente ignorados. Aunque parezca un poco extraño, fíjate que tiene sentido, ya que Qt es capaz de ignorar argumentos sobrantes, pero en ningún caso puede inventar argumentos de la nada. Algunos ejemplos para aclarar este punto:

                   Signals      Slots                   ¿isOK?
rangeChanged(int, int) setRange(int, int) OK
valueChanged(int) setValue() OK
clicked() setValue(int) NOK


Todas las clases que heredan de QObject (o alguna de sus subclases como QWidget), pueden contener señales, slots y conexiones. Pero para que sea posible definirlas, es necesario que la clase mencione la macro Q_OBJECT al comienzo de su declaración.


=== Sintaxis en la práctica ===

Veamos un ejemplo de como se realiza una conexión. Para ello, necesitamos dos clases ("Emisor" y "Receptor") que sean agregaciones de una clase contenedora W (dos partes componentes, o si lo prefieres, dos variables de W). Para enviar un mensaje desde "Emisor" hasta "Receptor" haríamos la siguiente conexión en W (pongo pseudocódigo para que te quedes con la idea):

    class W: public QObject
{
Q_OBJECT
...
Emisor e;
Receptor r;
connect(e, SIGNAL(signalChangePos()), r, SLOT(slotChangePosition()));
};

class Emisor: public QObject
{
Q_OBJECT
...
signal signalChangePos();
...
emit signalChangePos();
};

class Receptor: public QObject
{
Q_OBJECT
...
slot slotChangePosition();
};


Veamos ahora la declaración de una clase MiWidget que maneja señales y slots. MiWidget hereda de QWidget, y a su vez QWidget hereda de QObject:

    class MiWidget : public QWidget
{
Q_OBJECT // Macro es necesaria cuando la clase define sus propias señales o slots

public:
MiWidget(QWidget *parent = 0);
void foo(QString &text);

signals: // señales emitidas por esta clase
void findnext(const QString &str);
void findprev(const QString &str);

private slots: // slots de esta clase
void enableFindButton(const QString &text);
};


Supongamos que el metodo foo emite una signal, veamos como se realiza la implementación:

    void MiWidget::foo(QString &text)
{
emit findprev(text); // se emite la señal findprev con el texto "text"
}



=== Un ejemplo práctico ===

Un escenario común ocurre cuando quieres pasar valores constantes en la sentencia connect. Esto ocurre por ejemplo cuando quieres implementar un teclado QWERTY usando QPushButtons como teclas. Podrías pensar que lo lógico es implementar algo como esto:

    connect(key_q, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('q')));
connect(key_w, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('w')));
connect(key_e, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('e')));
connect(key_r, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('r')));
connect(key_t, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('t')));
...


Pero esto no es valido en Qt, y no te funcionaría. Para implementar un teclado, la opción fácil sería usar un montón de QPushButton, y asignar a cada uno un slot diferente. La implementación sería como esto:

    connect(key_q, SIGNAL(pressed()), panelTexto, SLOT(press_q()));
connect(key_w, SIGNAL(pressed()), panelTexto, SLOT(press_w()));
connect(key_e, SIGNAL(pressed()), panelTexto, SLOT(press_e()));
connect(key_r, SIGNAL(pressed()), panelTexto, SLOT(press_r()));
connect(key_t, SIGNAL(pressed()), panelTexto, SLOT(press_t()));
...


Y la lista de slots:

    private slots:
void press_q();
void press_w();
void press_e();
void press_r();
void press_t();
...


Parece una exageración tener 102 slots, todos prácticamente con el mismo código. Pero, ¿a caso se te ocurre alguna alternativa mejor? Para hacer esto de una forma mas eficiente y sencilla de mantener, con un único slot, se usa la clase QSignalMapper. Con su ayuda, podríamos hacer esto:

    signalMapper = new QSignalMapper;

signalMapper->setMapping(key_q, QChar('q'));
signalMapper->setMapping(key_w, QChar('w'));
signalMapper->setMapping(key_e, QChar('e'));
signalMapper->setMapping(key_r, QChar('r'));
signalMapper->setMapping(key_t, QChar('t'));
...

// Conexiones de los button con el signal mapper
connect(key_q, SIGNAL(pressed()), signalMapper, SLOT(map());
connect(key_w, SIGNAL(pressed()), signalMapper, SLOT(map());
connect(key_e, SIGNAL(pressed()), signalMapper, SLOT(map());
connect(key_r, SIGNAL(pressed()), signalMapper, SLOT(map());
connect(key_t, SIGNAL(pressed()), signalMapper, SLOT(map());

// Y conexion del signal mapper con el slot genérico
connect(signalMapper, SIGNAL(mapped(QChar)), panelTexto, SLOT(setText(QChar)));


Y en el slot setText() irias pintando los distintos caracteres en el objeto "panelTexto", según la tecla pulsada por el usuario.

viernes, 25 de marzo de 2011

Mens sana in corpore sano

El deporte ha formado parte de mi vida desde que tengo uso de razón, y probablemente así siga siendo hasta el día que me falle la salud. Empecé a practicarlo con 11 años, y desde entonces hasta hoy, 32 años después, ahí seguimos.



Nunca destaqué por tener unas cualidades atléticas sobresalientes. No obstante, cuando el deporte se convierte en uno de tus principales hobbies, sin querer terminas por labrar un largo historial deportivo. Y precisamente de ese historial deportivo os quiero hablar en este post:



== Futbol ==

¿Quien no ha pretendido ser un gran futbolista de pequeño? Yo no fui una excepción y mis padres me apuntaron a una escuela de futbol infantil con la intención de que empezara a hacer algo de deporte. Tenía 11 añitos por aquel entonces. Solo disputé un partido con mi equipo y quedó claro que no tenía grandes cualidades para este deporte (LoL).

[1987-1988]
Escuela infantil de futbol Selma Junior (Castellón)



== Baloncesto ==

Operación altura en el Taugres Castellón, con mis 185cm con tan solo 13 años parecía evidente que era la decisión adecuada. Empecé con la práctica del baloncesto. Recuerdo aquellos años de mi vida con muchísima nostalgia. Con los años he perdido contacto con demasiada gente, decenas de compañeros de equipo, entrenadores, fisioterapeutas... De todos vosotros guardo muy buenos recuerdos. Aquella remontada ganando "in extremis" al equipo valenciano de "La Salle", uno de los mejores de toda la Comunidad Valenciana, después de perder la primera parte por mas de 25 puntos, y el pabellón de Grapa repleto de gente rugiendo y aplaudiendo... Todavía se me pone la piel de gallina. Me acuerdo muchas veces de todos vosotros. Un abrazo compañeros!!

[1987-1988]
Escuela infantil de baloncesto Taugres Castellón

[1988-1989]
Escuela infantil de baloncesto Taugres Castellón
Seleccionado para formar parte de la cantera del club en la "Operación Altura '89"

[1989-1990]
Cadete B en el club de baloncesto Taugres Castellón

[1990-1991]
Cadete A en el club de baloncesto Taugres Castellón

[1991-1992]
Juvenil A en el club de baloncesto Atletic Basquet Castelló (ABC)
Doblo entrenos con el juvenil B del mismo club

[1992-1993]
Juvenil A club de baloncesto Cerámicas Gaya

[1993-1994]
Senior en el club de baloncesto Cerámicas Gaya (Pretemporada y partidos hasta Navidad)



== Ciclismo ==

Desde muy pequeño soy un enamorado del ciclismo de carretera. Con 9 años a punto de tomar la comunión ya les insistí a mis padres para que me compraran mi primera bicicleta de carretera pero ellos consideraron que no era el momento adecuado. Fue al cumplir 13 años, después de terminar el EGB cuando me regalaron mi primera bicicleta de carretera de la que sigo guardando un grato recuerdo. Sin embargo, en el Desierto de las Palmas tuve un accidente con la bicicleta con 14 años. Me rompí dos dedos de la mano contra un coche en un accidente que me podría haber costado la vida. En aquel momento le cogí miedo a la bici y la dejé aparcada durante muchos años. Aunque en 2012, 18 años después del accidente, ya superado el trauma, recuperé mi afición comprando una BTT de montaña y tiempo despues una BCC de carretera, retomando mis entrenos en bicicleta.

Las fechas indican la primera vez que he hecho la ruta. Aunque todas ellas son rutas de entrenamiento habituales:

[1991]
BCC - Castellon - San Juan de Moro - Castellon (36Km)
BCC - Castellon - Onda - Castellon (48Km)

[1992]
BCC - Castellon - San Juan de Moro - Villafames - Borriol - Castellon (56Km)
BCC - Castellon - Borriol - Cabanes - Castellon (56Km)
BCC - Castellon - Magdalena - Desert de les Palmes - Castellon (30Km)

[1993]
BCC - Castellon - San Juan de Moro - Alcora - Castellon (42Km)
BCC - Grao de Castellon - Oropesa - Grao de Castellon (36Km)
BCC - Castellon - Borriol - Atzaneta - Benafigos (58km)

[1994]
BCC - Grao de Castellon - Magdalena - Desert de les Palmes - Grao de Castellón (25Km)
BCC - Grao de Castellon - Pico del Bartolo - Grao de Castellon (29Km)
BCC - Castellon - Villafames - Costur - Castellon (60km)
BCC - Grao de Castellon - Oropesa (por la costa) - Grao de Castellon (36Km)

[2012]
BTT - Terrassa - Casa nova del Obac - Terrassa (35Km)
BTT - Terrassa - Sabadell - Castell Bisbal - Sabadell Terrassa (40Km)

[2014]
BTT - Grao - Desierto - Benicasssim - Desierto - Grao (40Km)
BTT - Benafigos - Vistabella - Adzeneta -Benafigos (50Km)
BTT - Carretera club golf el Prat (entre Terrassa y Sabadell) (32Km)

[2015]
BTT - Grao - Magdalena - Benicasssim - Magdalena - Grao (40Km)
BTT - Grao - Oropesa - Grao (36Km)
BTT - Terrassa - Tibidabo - Terrassa (52Km)
BTT - Terrassa - Castellar - Sant Llorens Savall - Castellar - Terrassa (42Km)
BTT - Grao - Peñiscola - Grao (117Km)
BTT - Grao - Benafigos (60Km)
BTT - Benafigos - Vistabella - Adzaneta - Benafigos (40Km)

[2016]
BTT - Terrassa - Castellar - Sant Llorens Savall - Castellar - Terrassa (42Km)
BTT - Grao - Oropesa - Grao (36Km)
BCC - Grao - Benicassim - Desierto - Magdalena - Desierto - Benicassim - Grao (53Km)
BTT - Grao - Oropesa - Cabanes - Bartolo - Grao (60Km)

[2017]
BTT - Grao - Oropesa - Torrelasal - Cabanes - Borriol - Grao (70Km)
BTT - Grao - Almazora - Burriana - Vall Duxo - Soneja - Grao (118Km)
BTT - Grao - Santiago de Compostela (1020Km) - Relato y video [New!!]
BCC - Grao - Castellón - Alcora - Costur - Atzeneta - Vall d'Alba - Borriol - Castellon (105Km)

[2018]
BCC - Grao - Costur - Benafigos - Borriol - Grao (129km)
BCC - Grao - Onda - Llucena - Alcora - Grao (120km)

[2019]
BTT - Terrassa - Montserrat - Terrassa (75Km)
BTT - Terrassa - Tibidabo - Terrassa (60Km)
BTT - Terrassa - Calders - Talamanca - Mura - Terrassa (85Km)
BTT - Terrassa - Castellar - Sant Llorens - Caldes de Montbui - Terrassa (70Km)
BTT - Transpirenáica - Roses (Girona) - Hondarribia (Irún) (850Km d+20.000m)


== Gimnasio ==

El gimnasio forma parte del deporte que practico habitualmente 1 o 2 días por semana. Es básico para evitar o recuperar lesiones cuando las hay. Este es el listado de los centros deportivos en los que he entrenado en algún momento.

[01/1995 - 01/2004]
Gimnasio en mi casa

[02/2004 - 07/2004]
Gimnasio Amstelpark, Amsterdam (Holanda)

[08/2004 - 11/2004]
Gimnasio en mi casa

[12/2004 - 02/2005]
Gimnasio Club Estudio Praga, (Madrid)

[02/2005 - 06/2006]
[Gimnasio Muscle Gracia, Bilbao (Vizcaya)

[07/2006 - 06/2016]
Gimnasio Shen Dragon, Terrassa (Barcelona)

[06/2016 - 12/2016]
Gimnasio en mi casa

[01/2017 - 11/2018]
DreamFit (Castellón)

[01/2019 - Actualmente]
Terrassasport, Terrassa (Barcelona)



== Montañismo ==

Aunque empecé mi afición en esto de subir montañas pasados los 30 años, en los últimos años esta actividad se ha convertido en una de mis favoritas. He realizado rutas de montaña tanto en solitario como en grupo. Tengo la costumbre de grabarlas en vídeo para publicarlas en YouTube. Esta es la lista de montañas por las que he realizado alguna ruta:

[5/2009]
Pico de San Jerónimo (1224m)
Parque natural de la muntanya de Montserrat (Barcelona)
http://es.wikiloc.com/wikiloc/view.do?id=1998089

[7/2009]
Pico La Mola (1104m)
Parque Natural Sant Llorenç del Munt (Barcelona)
Ruta de trekking partiendo desde Sant Feliu del Raco.

[4/2011]
Pico del Collbaix (547m)
Parque natural Sant Llorenç del Munt (Manresa, Barcelona)
Ruta de trekking partiendo desde San Joan de Vilatorrada.

[4/2011]
Pico del Penyagolosa (1814m)
Parque natural del Penyagolosa (Castellón)
http://es.wikiloc.com/wikiloc/view.do?id=762341

[07/2011]
Pico del Montcau (1066m)
Parque natural de Sant Llorenç del Munt i l'Obac (Barcelona)
Ruta de trekking partiendo desde el Coll d'Estenalles y pasando por la Mola.

[07/2011]
Pico superior del Pedraforca (2497m)
Parque Natural del Cadí-Moixeró (Barcelona)
Ruta desde el mirador del Gresolet
http://es.wikiloc.com/wikiloc/view.do?id=2001713

[08/2011]
Ruta circular desde Benafigos por el Rio Montlleo
Parque natural del Penyagolosa (Castellón)
http://es.wikiloc.com/wikiloc/view.do?id=995398
Video 1/2 y 2/2 en YouTube.

[08/2011]
Ronda Vallesana Terrassa
Parque natural de Sant Llorenç del Munt i l'Obac
http://es.wikiloc.com/wikiloc/view.do?id=1261016

[03/2012]
Ruta circular por Sant Joan de Penyagolosa el Burguillar
Parque natural del Penyagolosa (Castellón)
http://es.wikiloc.com/wikiloc/view.do?id=113557
Video 1/1 en YouTube

[04/2012]
Magdalena - Pico del Bartolo (724m) - Magdalena
Parque natural del Desert de les Palmes (Castellón)
http://es.wikiloc.com/wikiloc/view.do?id=2181053

[06/2012]
Pico superior del Pedraforca (2497m)
Parque Natural del Cadí-Moixeró (Barcelona)
Ruta desde el pueblo de Gósol
http://es.wikiloc.com/wikiloc/view.do?id=953231
Video 1/2 y 2/2 en YouTube

[07/2012]
Ruta circular desde Navajas, embalse del Regajo y salto de la novia
Parque natural de la Sierra de Espadá (Castellón)
http://es.wikiloc.com/wikiloc/view.do?id=2635251
Video en YouTube asap...

[07/2012]
Ruta circular Terrassa - Casanova de l'Obac - Matadepera - Terrassa
Parque natural de Sant Llorenç del Munt i l'Obac (Barcelona)
http://es.wikiloc.com/wikiloc/view.do?id=2447046

[08/2012]
Pico superior del Pedraforca (2497m)
Parque Natural del Cadí-Moixeró (Barcelona)
Ruta desde el mirador del Gresolet
http://es.wikiloc.com/wikiloc/view.do?id=2001713

[08/2012]
Pica d'Estats (3143m) y Pic Verdaguer (3133m)
Parque Natural del Alto Pirineo
Ruta desde el refugio de Vallferrera
http://es.wikiloc.com/wikiloc/view.do?id=3023152
Video 1/2 y 2/2 en YouTube

[08/2012]
Vuelta al Desert de les Palmes
Parque natural del Desert de les Palmes (Castellón)
Ruta desde el puente de la autopista
http://es.wikiloc.com/wikiloc/view.do?id=353937
Video en Youtube asap...

[08/2012]
Villafranca - La Estrella - Pico del Picayo (1304m) - Villafranca
Ruta desde Villafranca del Cid
http://es.wikiloc.com/wikiloc/view.do?id=1339571
Video 1/1 en Youtube

[09/2012]
Terrassa - Matadepera - La Mola - Montcau - Terrassa
Parque natural de Sant Llorenç del Munt i l'Obac (Barcelona)
Ruta desde Terrassa
http://es.wikiloc.com/wikiloc/view.do?id=2281875

[09/2012]
Benafigos - Mas de la Cormana - Benafigos
Parque natural del Penyagolosa (Castellón)
Ruta desde Benafigos
http://es.wikiloc.com/wikiloc/view.do?id=1933351

[09/2012]
Sant Joan de Penyagolosa - Nacimiento rio Carbo - Pic Penyagolosa (1813m)
Parque natural del Penyagolosa (Castellón)
Ruta desde Ermitorio Sant Joan de Penyagolosa
http://es.wikiloc.com/wikiloc/view.do?id=1537350
Video 1/1 en YouTube

[03/2013]
GR33 desde el Grao de Castellón hasta Sant Joan de Penyagolosa (65km, D+2640m)
Grao, Castellón, Borriol, Villafames, Les Useres, Xodos y Vistabella (Castellón).
http://es.wikiloc.com/wikiloc/view.do?id=834053
Video 1/1 en YouTube

[05/2013]
Circular desde el Torrent de l'Angel, Coll d'Estenalles, i la Mola
Parque natural de Sant Llorenç del Munt i l'Obac (Barcelona)
http://es.wikiloc.com/wikiloc/view.do?id=3234868

[06/2013]
Coll de estenalles - La Mola - Coll de estenalles
Parque natural de Sant Llorenç del Munt i l'Obac (Barcelona)
http://es.wikiloc.com/wikiloc/view.do?id=4093595

[07/2013]
Pico superior del Pedraforca (2497m)
Parque Natural del Cadí-Moixeró (Barcelona)
Ruta desde el mirador del Gresolet
http://es.wikiloc.com/wikiloc/view.do?id=2001713
Video 1/1 en YouTube

[07/2013]
Terrassa - Can Colomer - Font del Tronco - Torrent de Gaia - Font de la Cirera - Terrassa
Parque natural de Sant Llorenç del Munt i l'Obac (Barcelona)
http://es.wikiloc.com/wikiloc/view.do?id=386607

[07/2013]
Terrassa - Sabadell - Terrassa
Parque natural de Sant Llorenç del Munt i l'Obac (Barcelona)
http://br.wikiloc.com/wikiloc/view.do?id=1036990

[07/2013]
Pic de Comabona (2548m) y aproximación al Costa Cabirolera
Parque Natural del Cadí-Moixeró (Barcelona)
Ruta desde el Collell
http://es.wikiloc.com/wikiloc/view.do?id=598152
Video 1/1 en YouTube

[08/2013]
Tosseta de l'Esquella (2863m), Pic d'Engorgs (2818m), Portella de Meranges (2632m), Pic Puigpedros (2911m) i Pic de les Molleres (2752m)
Parque Natural del Alto Pirineo (Girona)
Ruta desde el refugio de Malniu
http://ca.wikiloc.com/wikiloc/view.do?id=3241311
Video 1/1 en YouTube

[08/2013]
Cerro Calderón (1838m)
Parque Natural de la Puebla de San Miguel
Ruta desde la Puebla de San Miguel
http://es.wikiloc.com/wikiloc/view.do?id=715723
Video en YouTube asap...

[08/2013]
Circular Ruta els Empedrats PR-C 125
Parque Natural del Cadí-Moixeró (Barcelona)
http://es.wikiloc.com/wikiloc/view.do?id=3221803
Video 1/1 en YouTube

[04/2014]
GR33 desde Castellón hasta Sant Joan de Penyagolosa (62km, D+2640m)
Castellón, Borriol, Villafames, Les Useres, Xodos y Vistabella (Castellón).
http://es.wikiloc.com/wikiloc/view.do?id=834053
Video 1/1 en YouTube

[07/2014]
Terrassa - Sabadell - Terrassa
Parque natural de Sant Llorenç del Munt i l'Obac (Barcelona)
http://br.wikiloc.com/wikiloc/view.do?id=1036990
Video 1/1 en YouTube 

[07/2014]
Pic del Costa Cabirolera (2604m)
Parque Natural del Cadí-Moixeró (Barcelona)
Ruta desde el Mirador del Gresolet, 20km, D+2028m
http://es.wikiloc.com/wikiloc/view.do?id=5600066
Video en YouTube asap...

[08/2014]
Sant Joan de Penyagolosa - Pic Penyagolosa (1813m)
Parque natural del Penyagolosa (Castellón)
Ruta desde Ermitorio Sant Joan de Penyagolosa
http://es.wikiloc.com/wikiloc/view.do?id=512467

[03/2015]
Ruta III Marxa al terme de Villafames
http://es.wikiloc.com/wikiloc/view.do?id=1438703

[04/2015]
GR33 desde Castellón hasta Sant Joan de Penyagolosa (62km, D+2640m)
Castellón, Borriol, Villafames, Les Useres, Xodos y Vistabella (Castellón).
http://es.wikiloc.com/wikiloc/view.do?id=834053
Video 1/1 en YouTube

[05/2015]
Pic del Puigmal (2907m)
Ruta desde Fontalba, Nuria, Puigmal, y Fontalba.
Valle de Nuria, Girona
http://es.wikiloc.com/wikiloc/view.do?id=3269945
Video 1/1 en YouTube

[12/2015]
Pic del Aitana (1558m)
Ruta desde font de Partagat
Sierra de Aitana, Alicante
http://es.wikiloc.com/wikiloc/view.do?id=6069815
Video en YouTube asap...

[09/2016]
Picos del Infierno Occidental (3073m), Central (3081m) y Oriental (3076m)
Ruta desde el balneario de Panticosa
Pirineo aragonés (Huesca).
http://es.wikiloc.com/wikiloc/view.do?id=3452428
Video 1/1 en YouTube

[6/2018]
Pico del Penyagolosa (1814m)
Parque natural del Penyagolosa (Castellón)
Video 1/1 en YouTube [New!!]

[7/2018]
Picos del Vallibierna (3067m) y Tuca de Culebras (3062m)
Macizo de la Madaleta (Huesca)
https://es.wikiloc.com/rutas-alpinismo/vallibierna-y-culebras-14032344
Video 1/1 en YouTube [New!!]




== Running ==

Soy corredor habitual desde que dejé el baloncesto con 18 años. Hace años entrenaba 4 y 5 veces por semana. Hoy en día mis rodillas no me permiten excesos y actualmente solo entreno running una o dos veces por semana, distancias comprendidas entre los 12 km y los 17 km por entrenamiento. Ocasionalmente hago alguna tirada larga de unos 20km d+800m para subir/bajar al Bartolo. En todo este tiempo calculo que mis piernas deben haber recorrido mas de 27.000km.

A pesar de correr desde los 18 años no me aficioné a competir en carreras populares hasta los 30 años. Me estrené en una carrera popular de montaña desde Viladecavalls hasta Montserrat, 23km D+1200m. Un estreno inolvidable! Desde entonces hasta ahora, este es el listado de carreras populares en las que he participado:



09/2007
I Travessa Circutor - Monasterio Montserrat (23km, 1200m D+: 4h 30m)

10/2007
II Gran premio 42 y pico Castellón (10km: 49m 47s)

04/2008
Mullat i Corre circuit de Montmelo (10km: 47m 27s)

09/2008
Cursa festa major Matadepera (10km: 51m 49s)

09/2008
II travessa Circutor - Monasterio Montserrat (23km, 1200m D+: 4h 05m)

10/2008
Cursa de fons a Sant Muç, Rubi (10Km: 48m 56s)

10/2008
III Gran premio 42 y pico Castellón (10km: 46m 52s)

01/2009
IX mitja marató de Terrassa (21Km: 2h 0m 45s)

07/2009
XXX Cursa Festa Major Terrassa (8.15km: 37m 35s)

07/2009
XXVII Cursa atlètica popular Ca n'Anglada (6km: 25m 02s)

09/2009
Cursa festa major Matadepera (10km: 52m 44s)

10/2009
III travessa Circutor - Monasterio Montserrat (23km, 1200m D+: 3h 52m)

07/2010
XXXI Cursa Festa Major Terrassa (8.15km: 39m 53s)

09/2010
Cursa festa major Matadepera (10km: 49m 44s)

09/2010
Cursa Mercè en Barcelona (10km: 44m 44s)

01/2011
Cursa Santi Centelles de Terrassa (5Km: 22m 35s)

04/2011
IV Carrera a pie costa Azahar (10km: 45m 59s)

05/2011
XI Cursa de Muntanya de Rubí (11km: 1h 10m 16s)

06/2011
XXVII Cursa atlètica popular Pla de Bonaire (7km: 32m 22s)

06/2011
XXIX Cursa atlètica popular Sant Llorenç (5.5km: 22m 30s)

06/2011
I Volta a Peu Grau de Castellò (5km: 21m 31s)

07/2011
XXXII Cursa Festa Major Terrassa (8.15km: 37m 59s)

07/2011
XXIX Cursa atlètica popular Ca n'Anglada (6km: 23m 24s)

09/2011
Cursa festa major Matadepera (10km: 46m 39s)

09/2011
Cursa Mercè en Barcelona (10km: 44m 41s)

10/2011
V travessa Circutor - Monasterio Montserrat (23km, 1200m D+: 3h 54m)

01/2012
XIII mitja marató de Terrassa (21km: 1h 56m 17s)

05/2012
I cursa de Vallparadis (7.5km: 33m 21s)

06/2012
XXIV pujada al Desert de les Palmes - Castellò (7.8km, 400m D+: 44m 26s)

06/2012
XXXIII Cursa Festa Major Terrassa (8.15km: 43m 25s) (liebre de otro corredor)

09/2012
III Ruta de les X Ermites, Begues (52km, 2500m D+: 10h 42m 13s)

10/2012
VI travessa Circutor - Monasterio Montserrat (23km, 1200m D+: 3h 43m 00s)

11/2012
XXIX Mitja Marató de Castellò (21km: 1h 44m 14s)

12/2013
IV Maratón Internacional Ciudad de Castellón (42km: 4h 08m 55s)

01/2014
Cursa Santi Centelles de Terrassa (5Km: 20m 10s)

05/2014
III Cursa Vallparadis (10km: 48m 15s)

06/2014
IV Volta a Peu Grau de Castellò (5km: 20m 40s)

07/2014
XXXV Cursa Festa Major Terrassa (8.15km: 36m 01s)

07/2014
I Cursa Night Running Series Terrassa (10km: 43m 59s)

10/2014
I Repte Drac Valles Race (Trail) (50km 2000 D+: 9h 43m 09s)

10/2014
IX Gran premio 42 y pico Castellón (10Km: 45m 15s)

12/2014
XXIV Cursa popular de San Silvestre Castellò (4.15Km: sin tiempo oficial)

12/2015
XXV Cursa popular de San Silvestre Castellò (4.15Km: sin tiempo oficial)



== Natación ==

Mi afición por la natación llegó bastante tarde, a los 38 años recién cumplidos. Empecé a nadar porque hice una apuesta con un amigo y decidí participar en un triathlon olimpico. No tenía ni idea de nadar, así que para aprender bien la técnica de croll hice 2 cursos de perfeccionamiento en las piscinas del Club Natació de Terrassa (CNT) y otros dos cursos de 1 mes en la piscina Emilio Fabregat del Grao de Castellón.

Actualmente entreno dos veces por semana en las piscinas del TerrassaSport en Barcelona. Es un deporte que cada día me gusta mas, ya que cuida mucho mis articulaciones, me permite mantener mi estado de forma, y me relaja. Aunque mi técnica ha mejorado mucho desde el día que empecé sigo obsesionado con seguir mejorandola.

He participado en una sola travesia de nado, aunque estoy seguro que no será la última:

07/2018
Travesia del Gurugú (2300m, 55m 47s)


== Triathlon ==

Afición que me ha llegado bastante tarde. He sido finisher de 4 triathlones Olimpicos y un Half Ironman. Nunca he participado en distancias menores a la Olímpica (Sprint o Super Sprint). En 2018, un mes antes de competir en el que hubiera sido mi quinto Olímpico tuve que cancelar mi participación por una fisura en dos de mis tendones del hombro derecho que me hice entrenando con palas en la piscina. Un mes de fisio y los tendones en su sitio, pero la preparación de todo un año al garete. Como diría Zugasti, "Nos fuimos al palco!". Desde la lesión de 2018, cada día sonaba con mas fuerza en mi cabeza la palabra IRONMAN. En Septiembre 2019 completé mi primer HALF-IRONMAN en lo que fue el año mas exigente de toda mi vida deportiva. A pesar de haberlo conseguido en el primer intento con un tiempo del que estoy muy orgulloso, le sigo teniendo un respeto infinito a esta prueba cuya preparación ha sido lo mas duro que he hecho nunca a nivel deportivo.

07/2015
Triathlon Skoda Castellón 2015 (3h 01m 14s)

07/2016
Triathlon Santander Castellón 2016 (2h 47m 20s)

07/2017
Triathlon Santander Castellón 2017 (2h 36m 04s)

07/2019
Mediterranean Triathlon Castellón 2019 (2h 30m 43s)

09/2019
III Infinitry Half Ironman Almazora 2019 (5h 23m 29s)


== Redes sociales ==

Actualmente soy miembro de la red social Strava, donde puedes encontrarme con el nombre del usuario aicastell y seguir al día todos mis entrenos. Nos vemos! 


sábado, 5 de febrero de 2011

Contraseñas seguras y faciles de recordar

Es el momento de elegir una contraseña para un nuevo servicio online que estamos dando de alta. Dicha decisión, aunque todavía hay gente que no se lo plantea, es trascendental para proteger la privacidad de los datos confidenciales de carácter personal que vamos a proporcionar al proveedor de dicho servicio: cuentas bancarias, tarjetas de crédito. CV, ofertas de trabajo, y un largo sin fin de datos personales privados.

Finalizado el proceso de alta, la única barrera que protege a nuestros datos confidenciales de la curiosidad ajena es dicha contraseña. Por ello, dicha contraseña debería ser elegida con toda la cautela y el máximo recelo posible, puesto que todos conocemos las consecuencias de exponer información sensible y los peligros que eso conlleva.



Para elegir una contraseña segura, hay que tener en cuenta algunas recomendaciones de lo mas básicas:

- Debe ser fácil de recordar pero difícil de adivinar
- Es obligatorio usar un mínimo de 8 caracteres
- Debe combinar letras con dígitos numéricos
- No debe utilizarse la misma contraseña para acceder a distintos servicios online
- No deben utilizarse palabras que aparezcan en un diccionario

La gente acumula cuentas de usuario en distintos servicios online. Con el paso del tiempo tienden a olvidar las contraseñas elegidas. Para evitar ese olvido, muchos optan por elegir contraseñas fáciles de adivinar, basadas en su propio nombre, edad, fecha de nacimiento, dni, matricula de tu coche, profesión, comida favorita, el nombre de tu perro o de tu gato, etc. Y muchas veces esa misma contraseña fácil de recordar, se utiliza en todos y cada uno de los servicios online registrados. Podéis imaginaros la dimensión del problema.

En este post se propone un método para resolver este problema.

La solución propuesta se basa en dos inputs que combinados adecuadamente mediante un algoritmo que definiremos nosotros mismos, generan como output la contraseña segura.

    f_algoritmo_secreto(servicio_online, semilla) = contraseña


Como inputs tendremos el nombre identificativo del servicio online donde estamos registrando la cuenta, y una semilla secreta única para todas nuestras contraseñas. El algoritmo combina los dos inputs para obtener como output la contraseña segura.

Vamos a explicar todo esto con un ejemplo sencillo para que se entienda mejor. Sea f_algoritmo_secreto una función que concatena las cadenas semilla y servicio_online, aplicando la función de hash md5 sobre el resultado de su concatenación, y del md5 resultante extrae los 10 primeros caracteres como contraseña de salida. Sea "supersecreto" la cadena semilla. Veamos algunos ejemplos de aplicación con distintos servicios online:

    Portal gmail --> md5sum[ "gmailsupersecreto" ] = 6037becb2f
Portal facebook --> md5sum[ "facebooksupersecreto" ] = ca713f6ce3
Maquina amd64 --> md5sum[ "amd64supersecreto" ] = ea816a9399


Por tanto, el password para la cuenta de gmail sería "6037becb2f", para la cuenta de facebook sería "ca713f6ce3" y para la cuenta en la maquina amd64 sería "ea816a9399". Como veis se trata de passwords dificiles de memorizar incluso para aquellos que estuvieran mirando vuestro teclado mientras pulsais las teclas.

Aqui teneis un sencillo bash shell script que os resuelve el problema sin mayor complicación:

  #! /bin/bash

echo -ne "Online service: "
read READ

stty -echo
read -p "Supersecret seed: " SEED
echo -ne "\n"
stty echo

echo -ne "$READ$SEED" | md5sum | cut -b 1-10


El secreto del método reside tanto en el algoritmo_secreto como en la cadena semilla.

Aunque el algoritmo_secreto cayera en manos ajenas, el método continúa protegido por la semilla. Esta semilla deberíais interiorizarla como si fuera vuestro propio nombre, tendrían que torturaros para obtenerla (aunque ojito por donde viajais :-) Pero obviamente es mas fácil recordar esa semilla que todas y cada una de las distintas contraseñas de los distintos servicios online en los que tenemos alguna cuenta registrada.

Este método (y cualquier variante basada en el mismo principio) cumple todas y cada una de las recomendaciones básicas que se han enumerado al comienzo de este post para garantizar la elección de una contraseña segura.

Quede claro que se trata de una propuesta concreta para explicar el método con un ejemplo. No os recomiendo en absoluto que uséis este mismo método tal y como esta publicado. Así que ¡aya vosotros! que este mismo método ya lo conocen todos los lectores de este blog! ;) Aunque con pequeñas modificaciones debería ser sencillo adaptarlo a vuestras propias necesidades personales.

sábado, 15 de enero de 2011

Cuestionario open source

Hoy me apetece plantearos una serie de preguntitas relacionadas con sistemas Linux para que mantengáis vuestras mentes en forma. Veamos quien es el primero en contestar todas las preguntas correctamente. Los recursos de los que dispongo para premiar al ganador son mas bien escasos, así que el ganador tendrá que conformarse con la satisfacción de ser el primero en lograrlo. ¡Que no es poco! Cualquier día os llaman desde alguna empresa internacional cañera planteando preguntas de este estilo y entonces, ..., ¡entonces tendréis vuestro merecido premio! :-)




Redes

¿Como contacta un cliente DHCP con el servidor DHCP para pedirle una IP cuando el cliente DHCP todavía no tiene ninguna dirección IP asignada?

¿Que comando se usa para cambiar el ESSID de un interfaz wifi? ¿Y para habilitar/deshabilitar el modo promiscuo del interfaz?

¿Que protocolo de red utiliza el mecanismo de ventana deslizante? ¿Podríais explicarme brevemente en qué consiste?

¿De cuantas direcciones de host efectivas dispones en una subred con una mascara de red con 27 bits habilitados a 1?

¿Cuantos enteros necesitas en una plataforma x86 para almacenar una dirección IPv4?


Sistema:

¿Cual es el uso de los runlevels en un sistema Linux?

¿Cual es la diferencia entre los ficheros fstab y mtab situados en el directorio /etc?

¿Para que se usa el comando modprobe y en qué se diferencia del comando insmod?

Dime el comando opuesto a 'cat'.

¿Cual es la diferencia entre los números "major" y "minor" de todos los ficheros dispositivo situados en /dev?. ¿Que llamada al sistema se usa para generar dichos ficheros dispositivo?


Desarrollo:

¿Cual es la llamada al sistema usada para crear un proceso? Explícame también el significado de los posibles valores de retorno de esta llamada.

¿Cual es el uso del modificador 'friend' en un método de C++?. Los métodos friend, deben ser, ¿public, protected, o private?

¿Cual es el significado del Set User ID SUID bit cuando se aplica sobre binarios? ¿Tiene alguna utilidad aplicado sobre directorios?

¿Para que se usa el comando built-in 'export' del bash shell script?

¿Que comando se usa para eliminar la información de debug de un binario compilado con gcc/g++?

sábado, 20 de noviembre de 2010

Retos para desarrolladores

Entre crisis, abogados, hipotecas, y tareas del hogar (aunque éstas últimas no terminen nunca para mi frustración), últimamente he tenido poco tiempo libre para disfrutar de mi afición como programador, que aunque también sea mi profesión, no deja de ser un hobbie con el disfruto de mi tiempo libre.

"Busca un trabajo que te guste y no tendrás que trabajar un sólo día de tu vida". 
Cita sabia del filosofo chino Confucio.


Cansado ya de dedicar mi tiempo libre a resolver problemas de mi vida cotidiana que me divierten mas bien poco, me aportan mas bien nada, y me limitan mi capacidad de aprendizaje y mejora continua de mis aptitudes profesionales, hoy por fin encontré el día perfecto para pasar un buen rato con mi buen amigo 'Dellone' (así es como bauticé este verano a mi primer portátil Dell)

Era una tarde de Sábado gris, lluviosa y fría. Otro de esos días perfectos en los que no se me ocurría nada mejor que sentarte delante del portátil y disfrutar junto al calor de sus ventiladores resolviendo alguna de las muchas tareas que tenia pendientes en mi lista de TODOs personales.



La tarea elegida hoy fue resolver el reto para desarrolladores publicados en el portal The Greplin Programming Challenge. Conocí estos retos gracias a un compañero de trabajo, a quien desde aquí le agradezco la información porque he pasado una tarde muy entretenida. Gracias Dani! ;)

Sobre el nivel del reto, comentar que son tres problemas que exigen unos conocimientos en algorítmica de lo mas básicos. En todo caso, es el tercer reto el que exige un poquito de imaginación para dar con la solución. Pero poco mas. Todo aquel con experiencia 'picando código' debería poder resolverlos sin mayores problemas.

Las soluciones que publico han sido desarrolladas en C, que a mi es el lenguaje que más me gusta. Pero el lenguaje usado para resolverlos es indiferente, podéis usar el que mas os guste (o el que mas os disguste, hay mucho masoca suelto por ahí...)

El primer reto se introduce con esta explicación:
 The Greplin Programming Challenge

Level 1

----------------------------------------

Embedded in this block of text is the password for level 2.
The password is the longest substring that is the same in reverse.

As an example, if the input was "I like racecars that go fast"
the password would be "racecar".


La solución que propongo al primer reto es esta:

#include stdio.h
#include string.h

const char g_cad[] =
"Fourscoreandsevenyearsagoourfaathersbroughtforthonthiscontainentanewnationconceivedinz"
"LibertyanddedicatedtothepropositionthatallmenarecreatedequalNowweareengagedinagreahtci"
"vilwartestingwhetherthatnaptionoranynartionsoconceivedandsodedicatedcanlongendureWeare"
"qmetonagreatbattlefiemldoftzhatwarWehavecometodedicpateaportionofthatfieldasafinalrest"
"ingplaceforthosewhoheregavetheirlivesthatthatnationmightliveItisaltogetherfangandprope"
"rthatweshoulddothisButinalargersensewecannotdedicatewecannotconsecratewecannothallowth"
"isgroundThebravelmenlivinganddeadwhostruggledherehaveconsecrateditfaraboveourpoorponwe"
"rtoaddordetractTgheworldadswfilllittlenotlenorlongrememberwhatwesayherebutitcanneverfo"
"rgetwhattheydidhereItisforusthelivingrathertobededicatedheretotheulnfinishedworkwhicht"
"heywhofoughtherehavethusfarsonoblyadvancedItisratherforustobeherededicatedtothegreattd"
"afskremainingbeforeusthatfromthesehonoreddeadwetakeincreaseddevotiontothatcauseforwhic"
"htheygavethelastpfullmeasureofdevotionthatweherehighlyresolvethatthesedeadshallnothave"
"diedinvainthatthisnationunsderGodshallhaveanewbirthoffreedomandthatgovernmentofthepeop"
"lebythepeopleforthepeopleshallnotperishfromtheearth";

int is_str_palindrome(const char * init, const char * end)
{
while ((*init == *end) && (init <= end)) {
init++;
end--;
}

return (init >= end);
}

int main(void)
{
int l = strlen(g_cad);
int i, j, ibest, lbest;

ibest = lbest = 0;

for (j = l - 1; j > 0; j--) {
for (i = 0; i < j; i++) {
if (is_str_palindrome(g_cad+i, g_cad+j))
if (j-i > lbest) {
ibest = i;
lbest = j-i+1;
}
}
}

printf("Solution to challenge 1 is '%.*s'\n", lbest, g_cad+ibest);
}


El segundo reto se introduce con esta explicación:
 The Greplin Programming Challenge

Level 2

----------------------------------------

Congratulations. You have reached level 2.

To get the password for level 3, write code to find the first prime
fibonacci number larger than a given minimum. For example, the first
prime fibonacci number larger than 10 is 13.

When you are ready, go here or call this automated
number (415) 799-9454.

You will receive additional instructions at that time. For the second portion
of this task, note that for the number 12 we consider the sum of the prime divisors
to be 2 + 3 = 5. We do not include 2 twice even though it divides 12 twice.


La solución que propongo al segundo reto es esta:

#include stdio.h

unsigned long next_fibonacci()
{
static unsigned long a = 0;
static unsigned long b = 1;
unsigned long nf = a + b;

a = b;
b = nf;

return nf;
}

unsigned long next_prime()
{
static unsigned long prime = 0;
unsigned long tested = prime + 1;

while (1) {
if (is_prime(tested)) {
prime = tested;
return prime;
} else {
tested++;
}
}
}

int is_prime(unsigned long tested)
{
unsigned long divisor;

for (divisor = (tested / 2); divisor > 1; divisor--)
if ((tested % divisor) == 0)
return 0;

return 1;
}

int main(void)
{
unsigned long given_minimum = 227000;
unsigned long X;

while ((X = next_fibonacci()) < given_minimum)
;

while (!is_prime(X))
X = next_fibonacci();

X += 1;

int np = next_prime(); // 1

int challenge2 = 0;

while (X != 1) {
np = next_prime();

if ((X % np) == 0) {
while ((X % np) == 0)
X = X / np;
challenge2 += np;
}
}

printf("Solution to challenge 2 is %d\n", challenge2);
}


Y por ultimo, el tercer reto se introduce con esta explicación:
 The Greplin Programming Challenge

Level 3

----------------------------------------

Congratulations. You have reached the final level.

For the final task, you must find all subsets of an array
where the largest number is the sum of the remaining numbers.
For example, for an input of:

(1, 2, 3, 4, 6)

the subsets would be

1 + 2 = 3
1 + 3 = 4
2 + 4 = 6
1 + 2 + 3 = 6

Here is the list of numbers you should run your code on.
The password is the number of subsets. In the above case the
answer would be 4.


Y la solución que propongo al tercer reto, es esta:

#include stdio.h
#include math.h

/* Input param */
int g_set[] = { 3, 4, 9, 14, 15, 19, 28, 37, 47, 50, 54, 56, 59, 61, 70, 73, 78, 81, 92, 95, 97, 99 };

int g_setlen = sizeof(g_set) / sizeof(int);

int is_membership(int v)
{
int i;

for (i = 0; i < g_setlen; i++)
if (g_set[i] == v) {
return 1;
}

return 0;
}

int is_onebit(int v)
{
int i;
for (i = 0; i < g_setlen; i++)
if (v == (pow(2, i)))
return 1;
return 0;
}

int main(void)
{
int mask;
int m;
int aux;
int pos;
unsigned int N = pow(2, g_setlen);
int challenge3 = 0;

for (mask = 1; mask < N; mask++)
{
if (is_onebit(mask))
continue;

aux = mask;
pos = 0;
m = 0;
while (aux != 0) {
if (aux & 0x01)
m += g_set[pos];
aux = aux >> 1;
pos++;
}

if (is_membership(m))
challenge3++;
}

printf("Solution to challenge 3 is %d\n", challenge3);
}


Todos los desarrolladores que estáis leyendo esto conocéis la sensación de satisfacción inmensa que produce dar con la solución al problema y "avanzar al siguiente nivel". Pienso que esa es la droga que nos metemos los que trabajamos en esto y nos mantiene tan enganchados a esta entretenida profesión (si, somos unos jonkies!! :) Y este es el premio que obtendréis al terminar el reto:
 The Greplin Programming Challenge

The End

----------------------------------------

Congratulations. You completed the challenge. Your completion code is 118-170-234969.

We'd love to talk to you - send your completion code, the code you wrote
during the challenge, and your resume to

USER at SUBDOMAIN dot DOMAIN

Even if you're not looking for a job, we'd love to hear what you thought
about the challenge.


La dirección de correo la protejo para evitar spam innecesario a los organizadores. Eso si, si alguno de los lectores esta en paro, y tiene en mente trabajar en Estados Unidos, igual es ésta vuestra oportunidad. !Al menos intentadlo! :)

Para los que sigáis con el gusanillo de resolver mas problemas de este estilo, os dejo aqui otro enlace a un reto para desarrolladores bastante famosillo, The Euler Project, con mas de 300 problemas que resolver, un gran número de participantes registrados repartidos por los cinco continentes, y un ranking en el que estareis compitiendo contra todos ellos. Si alguien se aburre con este reto, que hable conmigo que está contratado! :P



Como veis en la imagen adjunta, solo he podido terminar los 7 primeros. La falta de tiempo libre me obliga a mantener abandonadas algunas tareas que me gustaría continuar a medida que recupere el control de mi tiempo libre. Animo a todos los lectores que compartan mi afición a que lo intenten, pregunten dudas, compartan las soluciones, y así poder comentarlas y buscar entre todos la solución óptima en cuanto a coste computacional, etc. Espero que lo disfrutéis. Y ya sobran mas explicaciones. ¡A programar se ha dicho!

Visitas:

Seguidores