Just a little bit freak

domingo, 1 de junio de 2014

Consejos para generar código C/C++ de calidad

Navegando por los archivos de mi portátil, hoy encontré un post para desarrolladores de C/C++ que escribí allá por 2004. El post comenzaba de esta manera...

Con los años irás aprendiendo que ser un buen desarrollador de software del lenguaje C/C++ no es solo aprender el lenguaje de programación y escribir lineas de código que compilen y hagan alguna tarea predefinida. Aprender a escribir código compilable es solo el comienzo del camino.


El código fuente de una aplicación debe escribirse siguiendo unos principios de ingeniería que generalmente se aprenden durante la época de estudiante en la Universidad y se asimilan con los años de experiencia. Un código fuente bien escrito es una auténtica obra de ingeniería.

Pero algunos desarrolladores (inexpertos o , incompetentes, da lo mismo), nunca aprenderán a usar los principios básicos de ingeniería, convirtiendo sus códigos fuentes en "obras de arte" caóticas, chapuceras y desordenadas, que solo ellos entienden (y algunos que, sin tener mucha idea, admiran).

Quizás su código funcione, y haga lo esperado. Pero nos olvidamos que su código fuente deberá ser mantenido, probablemente por nuevos desarrolladores que no lo han implementado, y no entienden esa "obra de arte" realizada por sus caóticos predecesores. Pobrecitos desarrolladores, los que vengan por detrás...

De la experiencia adquirida con los años, quiero compartir con vosotros una lista de consejos prácticos que seguro os serán de utilidad para mejorar la calidad de vuestros desarrollos, y facilitarán la vida a los pobrecitos desarrolladores que algún día tendrán que mantener vuestro código. Aunque solo sea por ellos, hagamos bien las cosas...
 
Consejos como analista
  • Exige que tu entrada como analista sea una especificación formal de los requisitos funcionales del sistema.
  • Cualquier diseño es mejor que ninguno.
  • Diferencia con claridad el interfaz publico del interfaz privado
  • Mantén tus clases/módulos desacoplados y usa interfaces públicos bien definidos para comunicarlos.
  • Un buen diseño permite entender la solución propuesta mirando unicamente ficheros de cabecera .h
  • Cuando necesites abrir los ficheros fuentes (.c o .cpp) para entender la solución propuesta, rediseña.
  • La información solo es útil cuando esta bien ordenada.
Consejos como desarrollador
  • Tus principales herramientas como desarrollador son dos: papel y lápiz.
  • El teclado es el medio para codificar tus ideas sobre papel en el código fuente de tu aplicación.
  • Documenta los prototipos de tus funciones en el fichero de cabeceras .h
  • Haz pruebas unitarias de todas tus clases/módulos y mantenlas siempre actualizadas.
  • Haz tu propia guía de estilo y acostúmbrate a usarla.
  • Lee código de otros desarrolladores mejores que tu y actualiza tu guía de estilo con lo que aprendas.
  • Usa alguna herramienta de control de versiones como Subversion o Git.
  • Refactoriza tu código con frecuencia.
  • La mejor solución es siempre la mas sencilla, pero no por ello la mas fácil de encontrar.
  • Los buenos programadores encuentran siempre la mejor solución (lo difícil es hacerlo fácil).
  • Los malos programadores hacen justo lo contrario (lo fácil lo hacen complicado).
... Han pasado 10 años desde que escribí este post.

Tras leerlo, lo primero que me vino a la cabeza es que los años pasan muy rápido (tenía 27 cuando lo escribí, y voy camino de los 38). Lo siguiente que pensé es que sigo pensando exactamente lo mismo que hace 10 años. ¿Desarrolladores que generen código de calidad? Contados con los dedos de una mano.


martes, 11 de marzo de 2014

Endianismo (Little Endian vs Big Endian)

=== Introducción ===

El endianismo es un concepto que hace referencia a como la arquitectura de un procesador mapea un valor escalar en una secuencia de bytes en memoria. Existen dos maneras distintas de mapear un valor escalar en memoria, y se conocen con estos nombres:

    * Big Endian
    * Little Endian

En este post explicamos como funciona cada una de ellas. Pero para poder explicar la diferencia entre Little y Big Endian, primero hay que entender los conceptos LSB y MSB, que paso a explicar a continuación:


=== LSB vs MSB ===

Los valores escalares se agrupan en secuencias de varios bytes. Por ejemplo, en la arquitectura x86, un "short int" ocupa 2 bytes, un "unsigned int" ocupa 4 bytes, un "double" ocupa 8 bytes y un "long double" ocupa 16 bytes.

La secuencia de bytes de un valor escalar se ordena en función del peso de sus bytes dentro del escalar. Dos bytes tienen un significado especial en esa ordenación:

    * LSB o byte menos significativo (Less Significant Byte)
    * MSB o byte mas significativo (Most Significant Byte)

El siguiente gráfico representa la secuencia de 8 bytes de un escalar de tipo "double" y la posición de los bytes LSB y del MSB dentro de dicha secuencia.

          7                           0
        +---+---+---+---+---+---+---+---+
        |MSB|   |   |   |   |   |   |LSB|
        +---+---+---+---+---+---+---+---+

Por ejemplo, si tenemos un escalar de tipo "unsigned int", con valor 0x1a2b3c4d, tendremos que el byte de mayor peso (MSB) es 0x1a, y el byte de menor peso (LSB) es 0x4d. El resto de los bytes se ordenan en función de LSB y MSB.



=== Little Endian vs Big Endian ===

Entendida la diferencia entre MSB y LSB, solo queda explicar la diferencia fundamental entre la representación Little Endian y la representación Big Endian, que ya avanzo en el siguiente gráfico:


= Little Endian =

En little-endian, el byte con la dirección de memoria mas baja se corresponde con el byte LSB. Por ejemplo:

    long int v = 0x0A0B0C0D;

    base_addr     = 0x0D // LSB
    base_addr + 1 = 0x0C
    base_addr + 2 = 0x0B
    base_addr + 3 = 0x0A // MSB

Los procesadores de Intel (los PC's) son sistemas Little Endian.


= Big Endian =

En big-endian, el byte con la dirección de memoria mas baja se corresponde con el MSB. Por ejemplo:

    long int v = 0x0A0B0C0D;

    base_addr     = 0x0A // MSB
    base_addr + 1 = 0x0B
    base_addr + 2 = 0x0C
    base_addr + 3 = 0x0D // LSB

Los procesadores de Motorola (los MAC's) son sistemas Big Endian.


= Middle Endian =

Los procesadores ARM son capaces de usar tanto Big como Little Endian, es un parámetro que se establece durante la configuración de la cross-toolchain. Por ese motivo, los procesadores ARM se conocen como sistemas Middle Endian.


=== Cierre ===

En esta ocasión redacto este breve post de contenido bastante técnico con el único objetivo de usarlo como recordatorio personal, pues se trata de una cuestión que siempre que la reviso creo tener dominada y cuando pasa un tiempo, vuelvo a confundir el orden correcto de los bytes. Espero que esta sea la definitiva!

Y sobre todo, espero que el post le sirva de ayuda a mas gente para que pueda aclarar esta duda en alguna ocasión.

Espero que lo hayáis disfrutado. Hasta la próxima!!


viernes, 7 de febrero de 2014

Baja de Orange por estafa comercial


Soy cliente de Orange desde hace mas de 6 años. Actualmente tenía contratado con ellos el servicio de ADSL + teléfono fijo. Su servicio de Internet por ADSL funciona bastante bien. Los grandes dolores de cabeza que he tenido con esta compañía siempre han sido por los mismos motivos: errores de facturación. Errores que ellos  siempre alegan a despistes, y siempre lo sienten mucho por las molestias ocasionadas.  Sin embargo, tras años como cliente, he aprendido que esos errores no son casuales, se repiten sistemáticamente, y si no estas muy pendiente del contenido de las facturas, de las fechas en las que se aplican los bonos de descuento, de guardar los números de referencia cuando te aplican un bono de descuento, siempre terminan cobrando de mas, (es curioso, porque en 6 años, nunca de menos!).





Reconozco que llamando por teléfono a atención al cliente, siempre me han atendido correctamente, y me han resuelto los problemas. Desde luego no sin antes perder un par de horas colgado del teléfono, tras varias llamadas a diferentes departamentos, hasta que por fin logras que te atienda la persona adecuada. Horas que pierdes de tu tiempo libre, y que desde luego, nadie te devuelve.

Pero esta vez no ha sido así. Esta vez uno de sus comerciales me ha estafado. Literalmente. Espero que mi experiencia os sirva al menos para que no os tomen el pelo a vosotros del mismo modo que me lo han tomado a mi.



= Antecedentes =

04 de Diciembre de 2013. Cumplo permanencia de 12 meses con la compañía. Busco alternativas mas económicas para cambiar de proveedor. Encuentro una oferta de ONO por 30€ + iva a 20Mb que mejora con creces la oferta que tengo contratada con Orange de 40,95€ (25,95€ cuota + 15€ alquiler de linea) + iva a 6Mb. Decido llamar al departamento de bajas para tramitar la baja, y cambiar posteriormente de operador.


= Descuento del 40% =

Tras negociar con el departamento de bajas, me ofrecieron un descuento del 40% sobre el precio de la cuota de 25,95€ durante 12 meses (10,38€ mensuales de ahorro que vienen a ser 124,56€/año). Puesto que con ese descuento, el precio del servicio  me sale poco mas o menos por el mismo precio que la oferta de ONO (aunque es cierto que ONO ofrece un servicio infinitamente mas rápido), opto por aceptar la permanencia de 12 meses para no perder mas tiempo tramitando la baja con Orange y la posterior alta con ONO.


= La estafa comercial =

30 de Diciembre de 2013. 20 días después de aceptar el descuento del 40%. Me llama una comercial ofreciendo un descuento del 10% sobre el importe de la cuota y un bono de 1000 minutos para llamar gratis de fijo a móviles de cualquier operador.

Le informo de que ya dispongo de un descuento del 40% durante 12 meses, y no quiero tener problemas con incompatibilidades de los descuentos. Que el bono de 1000 minutos no me hace ninguna falta.

La comercial me dice que el descuento del 10% es ACUMULABLE al 40% ya existente, y por tanto el descuento total será del 50%. Le pido documentación por escrito de todo lo que me ha ofrecido, para que me la envíe a casa. Me abre una incidencia anotando mi petición, y me da el numero de referencia. Acepto la oferta: un 50% de descuento en el precio de la cuota durante 12 meses... vendría a pagar 33,84€/mes (iva incluido) por un servicio de ADSL+telefono fijo, y llamadas gratis ilimitadas de fijo a móvil. Entiendo que es una buena oferta.



= La sorpresa =

La documentación solicitada nunca llega a mi casa. Pero si la siguiente factura. Veo que me han desactivado el descuento del 40%, y solo viene aplicado el descuento del 10% y el bono de llamadas de 1000 minutos. Llamo al departamento de atención al cliente. Me informan de que por políticas de empresa, solo se puede tener activo un descuento por cliente, que es el último aplicado(el del 10%). Y que por tanto, el descuento anterior del 40%, se ha perdido. (Ahhh, se siente!!) Me dicen que es imposible volver a activar ese descuento del 40%.



= La discusión =

Tengo una discusión con el comercial que me atiende, le pido la grabación del día que acepté el descuento del 10%, en el que me informaron de que el descuento era acumulado al 40% que ya tenía concedido. El comercial que me atiende dice que no disponen de esa grabación, que no existe y por eso no se pudo enviar a mi casa.

Indignado y con la sensación de estafado, le digo que si no existe grabación, como van a demostrar que yo acepte esa oferta del 10%? Me dicen que la oferta quedo registrada porque hay una incidencia anotada en mi expediente del día que la acepté. Genial. Indefension y abuso de poder total y absoluto.

Con un enfado monumental, le digo al comercial si es que cree que soy gilipollas. Si me hubieran informado de que se iba a desactivar el descuento del 40%, jamas en la vida hubiera aceptado ese 10%.

El comercial que me atiende me dice que el poco mas puede hacer. Me reconoce abiertamente que si hubiera sido informado correctamente, parece obvio que no hubiera aceptado ese descuento del 10%.  Afirma que el comercial que me atendió ofreciendo ese descuento del 10% acumulable, actuó de mala fe, probablemente porque iba a comisión por ventas, y que muchos de los comerciales que han actuado de esa manera han sido despedidos, y ni siquiera siguen trabajando ya en la compañía Orange. Entonces, no soy el  único??? Perfecto, y quien me arregla ahora esto???



= Tramitar la baja del servicio ADSL con Orange =

Puesto que no puede hacer nada mas, cabreado y tras mas de 1 hora al teléfono, solicito la baja inmediata del servicio de Orange.

Para mi sorpresa, la tramitación no puede ser inmediata. Para tramitar la baja (por si le sirve a alguien mas de ayuda), me explican que debo enviar una carta a esta dirección antes de 30 días, o la petición de baja se anula!!

    A la atención de Orange Home
    Apartado de correos 35046
    CP 28080
    Madrid

En la carta debo enviar:

    Fotocopia del DNI por las dos caras
    Numero de teléfono fijo dado de baja
    Motivo de la baja: en mi caso, "Mala venta comercial"
    Numero de referencia de la baja
    Firma

Por supuesto, también me informan que voy a tener que pagar 69,95€ + iva por no cumplir la permanencia del 10% durante 12 meses. Además, tengo que devolver el Router Livebox2 o me cobrarán 50€ adicionales. Les digo que el router se lo voy a devolver, pero que eso de pagar la penalización por permanencia, lo vamos a ver!!

Cuelgo la llamada. En ese momento pienso que enviar toda esta documentación por correo ordinario es un riesgo. Seguro que al final alegan que no llegó la carta, que se perdió, y en 30 días me anulan la petición de baja y me restablecen el servicio. Hacer el envío por correo certificado cuesta dinero, mas dinero!!

Así que vuelvo a llamar para que me den un numero de FAX al que poder enviar toda esta documentación, y así poder agilizar la tramitación de la baja. Consigo este numero de FAX para tramitar las bajas. A quien le pueda servir de ayuda:

    FAX BAJAS ORANGE: 918382701



= ¿Solución a la vista? =

El mismo comercial que atiende mi llamada en la que solicito el numero de FAX me explica que en mi historial de cliente ya han dejado una nota para que el próximo Miércoles día 12 de Febrero (dentro de 5 días) me llamen por teléfono para intentar mediar y solucionar el problema!! Pero de que van estos! No se podía solucionar nada hoy?? Clarooo, clarooo que nooo!!



= Divorcio definitivo =

Hoy a las 19:40h he enviado la documentación a través del FAX indicado, solicitando la baja inmediata de mi servicio de ADSL y linea de teléfono fijo. 

Esta vez el divorcio con Orange va a ser definitivo. Voy a darle una oportunidad a otras compañías de telecomunicaciones mas pequeñas, que probablemente no tengan un servicio ni una infraestructura tan grande, pero para que me roben los ricos, sinceramente, prefiero que lo hagan los pobres.


= Alternativa para contratar ADSL=

Esta oferta de PepePhone por 23,60€/mes (iva incluido) tiene MUY buena pinta:

http://adsl.pepephone.com/ppm_adsl/ppm_adsl/1/home/xweb_adsl.home.html


Es la mitad de lo que pagaba con Orange antes de la promoción del 40% (unos 45€/mes), y unos 10€/mes mas barata que la oferta de Orange con el 40% aplicado.

En su web, PepePhone adjunta esta documentación:

Ventajas del ADSL de Pepephone:

Atención al cliente telefónica gratuita 100% desde España (Mallorca) con agentes dedicados en exclusiva y con permisos para hacer casi todo lo que pidas (relacionado con el servicio eso sí :). Cualquier mejora de tarifa que se pueda hacer en un futuro se aplicará primero a los ya clientes, de forma automática, y aunque no se enteren, y , por supuesto, sin necesidad de enviar un mensajito para "apuntarse gratis a la rebaja". Al no disponer de línea de teléfono, el servicio en el hogar se dedica exclusivamente al ADSL, no siendo necesario instalar microfiltros ni cosas raras, y se evitan los problemas de compartir las dos cosas por el mismo cable. También te ahorras los problemas de las facturas de teléfono ya que todos los meses la factura será exactamente igual que el mes anterior, salvo que baje. Te podrás dar de baja del servicio cuando desees. Si es porque vas a otro operador no tendrás que pagar nada. Si necesitas desactivar la línea pagarás el pequeño coste administrativo de hacerlo a Telefónica indicado más arriba. Si el servicio no te funciona, no lo pagarás. [...]


= Cierre del post =

Seguro que a un monstruo como Orange le hace mucha gracia ver como este tipo de operadores virtuales empiezan a hacerles la competencia. Yo desde aquí recomiendo ya mismo el cambio de compañía. Y también os animo a hacer difusión de este post, para que otras personas no caigan en los mismos errores que yo he cometido.

Si conocéis cualquier compañía de ADSL que mejore la oferta comercial de PepePhone, os animo a que pongáis un comentario en el blog, explicándome las virtudes de dicha compañía. A ver si por lo menos Orange pierde algún que otro cliente gracias a este post y a sus malas prácticas comerciales.


martes, 10 de diciembre de 2013

Mi debut en los 42K: Maratón Internacional Ciudad de Castellón 2013

¿Puede un tipo de 37 años que mide 2 metros de altura y pesa 98Kg preparar y correr con éxito una prueba de running tan exigente como lo es el Maratón? En primera persona, os explico el relato de mi experiencia. Conoceréis lo que he vivido durante los últimos 4 meses, desde que decidí que 2013 era el año, y que Castellón (mi ciudad natal), la ciudad elegida para el debut oficial en la prueba atlética de fondo por excelencia.

¿Termine o no termine la prueba? Os dejo la incógnita hasta el final.

Comenzamos esta aventura hace 4 meses, a mitades del mes de Agosto, cuando el tiempo todavía era soleado, los días largos, y tardaba mucho en anochecer...

Hoy 15/08/2013, mi madre, que no deja de preocuparse por mi, insiste con eso de que "estas prim, menja mes!". Pues no se yo si estoy tan prim:



Entrenamientos realizados durante la semana del 12/08/2013 - 18/08/2013

    * Lunes: running asfalto - 13Km - 1h 11m 59s (Fileta - Magdalena - Fileta)
    * Martes: gimnasio pesas - dorsal, triceps, pierna, abdominales
    * Miercoles: trekking montaña - Cerro Calderon (1836m) - 21,7Km / 7h 34m
    * Jueves (mañana): piscina 45m
    * Jueves (tarde): gimnasio pesas - hombro, trapecio, pierna, abdominales,
    * Viernes: piscina - 45m
    * Sabado (mañana): running asfalto - 13,5Km - 1h 14m 47s (Fileta - La Renegà)
    * Sabado (tarde): running asfalto - 13,5Km - 1h 20m 09s (La Renegà - Fileta)

Una semana de vacaciones laborales (que no físicas) en la que he podido aumentar las horas de entrenamiento sin acusar el esfuerzo al que obliga la rutina del día a día. Bien podría ser así todas las semanas!! :))

Hoy 20/08/2013 completo mi mejor marca personal en circuito urbano 12K, D+200m.  Ahora en Agosto, con los horarios intensivos de 8-15h y recién regresado de vacaciones, bien descansado, alimentado y cuidando al máximo mis rutinas deportivas, es cuando llegan los mejores resultados del año. Es la mejor marca que he conseguido en este circuito urbano. Será complicado mantener este estado de forma a partir de Septiembre..



Hoy 29/08/2013 publico los detalles del entrenamiento de pesas realizado en el gimnasio.

    * 7 minutos estiramientos (calentar)

    * 3 ejercicios hombro (peso mancuerna / cada brazo)
        - Press militar sentado con mancuernas (3x12x17.5k)
        - Press tras nuca con barra fija (3x12x30k)
        - Vuelos vertido botella con mancuerna (3x12x10k)

    * 3 ejercicios trapecio
        - Encogimientos hombro con barra delante (3x12x35k)
        - Encogimientos hombro con barra detras (3x12x35k)
        - Remo de pie al cuello con barra (3x12x15k)

    * 3 ejercicios pierna
        - Cuadriceps con prensa (4x15x180k)
        - Gemelo con prensa (4x12x180k)
        - Extensión cuadriceps con maquina sentado (3x15x45k)

    * Abdominales
        - Transverso elevacion rodillas menos (1x20)
        - Transverso elevación rodillas mayor (1x20)
        - Transverso elevacion cabeza palmas manos al frente (1x20)
        - Transverso elevacion cabeza manos presionando abdomen (1x20)
        - Encogimientos gemelos sobre banco espalda al suelo (1x20)
        - Encogimientos invertidos (transverso 1 a 45º) (1x20)
        - Encogimientos (transverso 1 a 0º) (1x20)
        - Sentado bicicleta tocando codo rodilla opuesta (1x30)
        - Acostado laterales piernas al vuelo tocando con mano (2x15)
        - Escoliosis fisio 1 (1x12)
        - Escoliosis fisio 2 (1x12)
        - Escoliosis fisio 3 (1x12)

    * 7 minutos estiramientos (enfriar)

Es importante alimentarse en los 30 minutos posteriores al entrenamiento, ya que es cuando las fibras rotas durante el entrenamiento se regeneran y el cuerpo debe tener alimento listo para poder regenerarlas mas fuertes. Para ello, al llegar a casa he tomado un plátano (fuente natural de potasio e hidratos de carbono), y un batido de proteínas de Nestle con leche desnatada. Mas tarde... a cenar!!

Entrenamientos realizados la semana del 26/08/2013 - 01/09/2013

    * Lunes: gimnasio pesas - dorsal, tríceps, pierna, abdominales
    * Miércoles: 12Km, D+0m / 57m 13s
    * Jueves: gimnasio pesas - hombro, trapecio, pierna, abdominales
    * Sabado: trekking montaña - 10,61Km D+814m - Els empedrats PR-C 125
    * Domingo: fitness - ejercicios varios de mantenimiento

Semana en la que he bajado la intensidad de los entrenos y también la carga de trabajo de las pasadas semanas. El objetivo, tratar de asimilar el ejercicio realizado durante este verano sin perder peso por un exceso de cardio, cargando las pilas al máximo para afrontar un mes de Septiembre que va a ser durillo, puesto que ya se han terminado las jornadas intensivas de 8 a 15h de este año 2013... Las voy a echar mucho de menos!!

Hoy 03/09/2013 publico los detalles del entrenamiento de pesas realizado en el gimnasio.

    * 7 minutos estiramientos (calentar)

    * 3 ejercicios pecho (peso mancuerna / cada brazo)
        - Aperturas mancuerna banco plano (3x10x22.5k)
        - Aperturas mancuerna banco declinado (3x10x22.5k)
        - Aperturas contractor (3x10x25k)

    * 3 ejercicios bíceps (peso mancuerna / cada brazo)
        - Curl sentado banco agarre pronación (3x12x12.5k)
        - Curl sentado banco agarre supinación (3x12x10k)
        - Bíceps concentrado de pie alterno (3x12x10k)

    * 3 ejercicios pierna
        - Extensión cuádriceps con maquina sentado (3x15x45k)
        - Sentadillas apoyado contra pared rodilla flexionada (3x60seg)
        - Talonamiento tobillos 4 posiciones ligamentos (8minutos)

    * 1 ejercicio antebrazos
        - Curl agarre pronación (3x20x14k)
        - Curl agarre supinación (3x10x14k)

    * Abdominales
        - Plancha militar horizontal con pirámide (3x12)
        - Abdomen tumbado agrupar codos con rodillas (1x20)
        - Abdomen tumbado tocar codo con rodilla opuesta (2x20)
        - Abdomen tumbado rodillas en alto tocar con los codos (1x20)
        - Abdomen tumbado subir rodillas hacia el pecho (1x20)
        - Inferiores tijeras acostado boca arriba (1x20)
        - Inferiores levantamiento 2 piernas acostado (1x20)
        - Inferiores levantamientos 2 piernas alterno acostado (1x20)
        - Cristo acostado agrupamiento manos tobillos al aire (1x20)

    * 7 minutos estiramientos (enfriar)

Al finalizar, batido de proteínas con leche desnatada.

Esta frase no es mía, pero define muy bien mi filosofía de vida: "Aunque llegues el último de una carrera... siempre tendrás por detrás a los que no se atrevieron a correrla".

Hoy 06/09/2013 fueron 18Km con un desnivel D+270m en 1h 49m 43s. A falta de 3 meses, estamos evaluando las posibilidades reales de afrontar mi primer Maratón con garantías de terminarlo dignamente. Para mi, dignamente significa terminar en menos de 4h.

Ya veis que físicamente no partía de cero. Vengo haciendo deporte de forma regular hace muchos años.  Habitualmente entreno 5 o 6 días por semana, combinando 2 o 3 sesiones de pesas en el gimnasio, con 2 o 3 sesiones de running, y alguna salida por montaña. Pero hablar del Maratón son palabras mayores. Los 18Km han sido duros, no estoy acostumbrado a hacer tiradas tan largas y he llegado a casa algo cansado.

Hoy 07/09/2013 se publica este vídeo para promocionar el Maratón de Castellón:

http://vimeo.com/58438693

Hoy 07/09/2013, a 3 meses vista, decido el plan de entrenamiento a seguir. Se trata de este entrenamiento publicado por Antonio Azpiroz (Ironman de Hawai), en su variante de sub-4h. No lo seguiré al pie de la letra, ya que no quiero dejar de hacer pesas en el gimnasio 2/3 días por semana. Así que veremos como lo combinamos para hacer compatibles los entrenamientos de fondo con los entrenamientos de fuerza de mi tren superior.

http://www.soymaratonista.com/4449/plan-de-entrenamiento-para-correr-42k

Entrenamientos realizados la semana del 02/09/2013 - 08/09/2013

    * Lunes: running asfalto - 12km D+250m / 1h 07m 47s
    * Martes: gimnasio pesas - pecho, biceps, pierna, abdominales
    * Miércoles: series atletismo - 4 x 1600m x 6m 53s
    * Viernes: running asfalto - 18km D+270m / 1h 49m 47s
    * Sabado: gimnasio pesas - dorsal, tríceps, pierna, abdominales
    * Domingo: running asfalto - 10km D+0m / 57m 36s

Semana en la que oficialmente inicio los entrenamientos específicos para preparar mi primer Maratón. Todavía no es seguro que lo corra, ya que es una preparación larga de 3 meses, con entrenamientos muy largos, en una época del año donde empieza a hacer frio, y pronto llegarán las lluvias, bajadas de temperatura, el cambio de hora (los días mas cortos), y las dichosas gripes. De momento voy a pensar que nada de esto va a impedir que pueda completar los entrenamientos planificados, y estrenarme en Castellón corriendo mi primer Maratón. Toca apretar los dientes, hacer buenos entrenamientos, y también, confiar en la suerte!!

Ahi va una buena dosis de motivación para afrontar el entrenamiento del día a tope. GAASSS!!

http://www.goear.com/listen/1a6caff/disturbed-hell

Entrenamientos realizados la semana del 09/09/2013 - 15/09/2013

    * Lunes: running asfalto - 12km D+0m / 58m 52s
    * Martes: gimnasio pesas - mantenimiento general
    * Miercoles: running asfalto - 12km D+0m / 59m 34s
    * Jueves: gimnasio pesas - hombro, trapecio, pierna abdominales
    * Sabado: running asfalto - 22km D+0m / 2h 2m 57s
    * Domingo: series atletismo - 10 x 400m x 1m 42s

Los 50Km de running realizados durante la semana pasada no son mas que el aperitivo de lo que nos espera en las próximas semanas, donde seguiremos un plan de entrenamiento que nos llevará a superar los 80Km de entrenamiento en una sola semana. Supongo que sera por mis 98Kg, pero sufrí mas de la cuenta durante el entrenamiento de 22Km el Sábado por la tarde. No obstante, el Domingo por la mañana, 12 horas mas tarde, ya me encontraba plenamente recuperado del esfuerzo y pude realizar las series de 400m sin problemas musculares. Nos esperan semanas duras, pero los hitos importantes nunca se consiguen sin esfuerzo ni sacrificio. Por eso son los que mas me motivan.

Entrenamientos realizados la semana del 16/09/2013 - 22/09/2013

    * Lunes: running asfalto - 15km D+225m / 1h 29m 28s
    * Martes: gimnasio pesas - pecho, biceps, pierna, abdominales
    * Miercoles: series farlek - 10 x (500m / 1m 53s + 250m / 1m 30s)
    * Jueves: running asfalto - 25km D+275m / 2h 35m 39m
    * Viernes: gimasio pesas - dorsal, triceps, pierna, abdominales
    * Sabado: series atletismo - 3 x 2500m x 9m 48s
    * Domingo: trekking montaña - 11.55km D+580m / 4h 12m

Otra semana en la que continuamos aumentando los Km de running. Ésta fueron mas de 60Km, y la distancia continuará subiendo en las próximas semanas. Hay que acostumbrar al cuerpo a sufrir, es lo que supone hacer un entrenamiento duro para preparar una prueba que no es fácil, ni siquiera para gente como yo cuyo único objetivo es pasar por la linea de meta, dignamente (en menos de 4h). El Jueves terminé los 25Km con temblores en las piernas, y solo me faltaban 17Km para cubrir los 42Km de la Maratón. Pero confío en el plan de entrenamientos que estoy siguiendo, si la salud nos acompaña, lo vamos a dar todo para lograrlo!!

Hoy Sábado 28/09/2013, entrenamiento doble. Por la mañana, sesión de musculación en el gimnasio, y una larga sesión de estiramientos. Por la tarde, 6 series de 1000m en 3m 49s de media, con 2 minutos de recuperación entre cada serie. La serie mas rápida, la última, en 3m 40s. Lo mio son las distancias cortas, aunque esta vez vamos a por la mas larga: los 42Km del Maratón!

Hoy 29/09/2013, durante el entrenamiento matutino de 15Km, me di cuenta que el Maratón es una prueba con tres dificultades. Primero, la física: si el cuerpo no esta bien entrenado, no terminas. Esta dificultad se supera entrenando duro.  Segundo, la mental: por muy entrenado que estés, el cansancio llegará, y en ese momento comienza una lucha constante con tu cabeza, que te pide parar y abandonar. Esta dificultad también se puede entrenar, engañando al cerebro pensando en cosas positivas que incrementen tu motivación. Tercero, la meteorológica. Un día caluroso como el de hoy, a mas de 26º, 15 km suaves de entrenamiento se convierten en un auténtico infierno. Las dos primeras se pueden entrenar, pero la tercera es una lotería. Así que empiezo a pensar que correr un día de lluvia sería mucho mejor que tener un día despejado.

Entrenamientos realizados la semana del 23/09/2013 - 29/09/2013

    * Lunes: running asfalto - 11km D+150m / 1h 0m 09s
    * Martes: gimnasio pesas - hombro, trapecio, pierna, abdominales
    * Miercoles: running asfalto - 22km D+300m / 2h 26m 15s
    * Jueves: running asfalto - 20km D+0m / 1h 54m 33s
    * Sabado (mañana): gimasio pesas - pecho, biceps, pierna, abdominales
    * Sabado (tarde): series atletismo - 6 x 1000m x 3m 49s
    * Domingo: running asfalto - 15km D+180m / 1h 27m 02s

La semana con mas Km acumulados desde que empecé a preparar esta aventura: han sido 74Km en total corriendo, con un solo día de descanso (el Viernes) que aproveché para hacer la compra semanal. Los entrenamientos están siendo duros, y físicamente he empezado a sentirme un poco cansado. Estoy comiendo bien, así que creo que este agotamiento es consecuencia de no querer renunciar a mis 2 sesiones semanales de pesas en el gimnasio, para no perder masa muscular de mi tren superior. Soy consciente que dichas sesiones de pesas no me benefician en absoluto para alcanzar mi objetivo, ya que un cuerpo musculado es un lastre para un corredor de ultrafondo... De hecho, no forman parte del entrenamiento "oficial", y las estoy intercalando los días que me siento demasiado cansado para salir a correr. Estoy convirtiendo esta preparación en un experimento con mi propio organismo, que no se muy bien donde me va a llevar. Pero me siento en total armonía con el deporte, y las ganas de seguir entrenando cada día son las que mantienen intacta mi ilusión. Vamos a por ello, vamos a muerte!!

Hoy 01/10/2013 han sido 14 x 400m x 1m 52s (30s rep.). Estos tiempos superan con holgura los requisitos del planning que garantiza bajar de 3h 45m. Mientras que los días de distancias largas sufro muchísimo para mantener el ritmo del planning que garantiza terminar en 4h 30m. No me quiero obsesionar con el tiempo, solo quiero terminar!! Pero me doy cuenta que mi físico rinde mucho mejor en distancias cortas, y será un auténtico handicap para terminar una carrera tan larga.

Entrenamientos realizados la semana del 30/09/2013 - 06/10/2013

    * Lunes: gimnasio pesas - dorsal, triceps, pierna, abdominales
    * Martes: series atletismo - 14 x 400m x 1m 52s
    * Miercoles: running asfalto - 12km D+0m / 59m 05s
    * Jueves: gimasio pesas - hombro, trapecio, pierna, abdominales
    * Sabado: running asfalto - 29.26km D+0m / 2h 55m 53s

Primera tirada larga de casi 30km, a 2 meses vista, en la que terminé con los tendones de mis rodillas muy doloridos. Perdí 3,8Kg por sudoración en las 3 que duró el entrenamiento, y eso que llevaba un botellín de aquarius de 800ml, que me bebí entero, y 2 geles de Isostar. Y empecé a correr a las 7h de la mañana, que todavía era de noche y con el cielo despejado, se podían ver las estrellas.

Llevo ya semanas cuidando mis rodillas con hielo y Criogel Sport, mis tendones estan sufriendo mucho, el dolor por tendinitis esta ahí, sin llegar a ser molesto pero tampoco desaparece. Ahora mismo pienso que hacer esta preparación esta siendo bastante insano. Las ganas de correr siguen intactas, pero mi cuerpo empieza a sufrir las consecuencias de los entrenamientos largos. En estos momentos desearía medir 20cm menos y pesar 20Kg menos. Pero es el cuerpo que tenemos, y es con el que vamos a correr esta Maratón. Habrá que sufrir!!

Hoy 13/10/2013 fueron 24.5km con desnivel de +300m en 2h 36m 02s. He terminado a 120ppm, muy entero. Las sensaciones son muy buenas!! :))


Entrenamientos realizados la semana del 07/10/2013 - 13/10/2013

    * Lunes: running asfalto - 14km D+0m / 1h 06m 55s
    * Martes: gimnasio pesas - pecho, bíceps, pierna, abdominales
    * Miércoles: running asfalto - 10km D+0m / 44m 28s
    * Jueves: running asfalto - 14km D+0m / 1h 10m 09s
    * Viernes: gimnasio pesas - dorsal, tríceps, pierna, abdominales
    * Domingo: running asfalto - 24.5km D+300m / 2h 36m 02s

Seguimos apretando los dientes. Esta semana fueron 62.5km de running en total.  Ya tengo decidida la estrategia para completar la carrera: me hidrataré con 150ml de bebida isotónica cada 20min. Me alimentaré con un gel de corredor cada 60min. Y correré de forma muy conservadora desde el 0 Km. Los 3 factores van a ser claves para mantener un rendimiento constante durante los 42 Km que tiene el recorrido. Tengo muchas ganas de que llegue el 8 de Diciembre!!

Entrenamientos realizados la semana del 14/10/2013 - 20/10/2013

    * Lunes: gimnasio pesas - hombro, trapecio, pierna, abdominales
    * Martes: series atletismo - 21 x 300m x 75s + 21 x 100m x 75s
    * Miercoles: running asfalto - 12,6km D+120m / 1h 13m 16s
    * Jueves: running asfalto - 10km D+0m / 53m 46s
    * Viernes: gimnasio pesas - pecho, biceps, pierna, abdominales
    * Domingo: running asfalto - 24.5km D+300m / 2h 31m 30s

Semana fisicamente muy delicada. Hoy tenía visita con el podólogo, ya que el dolor cada día era mas intenso. Me han diagnosticado inflamación del periostitis tibial en ambas piernas y de la fascia plantar de ambos pies. El segundo me dijo que tiene una cura delicada y de agrabarse me dejaría KO para correr el Maratón. Tengo que hacerme una telemetría con la que me prepararán unas plantillas nuevas, con las esperanza de poder corregir los problemas estructurales de mis pies y con ello controlar todos los dolores provocados por la sobrecarga de entrenamientos acumulados durante los últimos meses. El consejo medico... guardar reposo unos días. Al ver mi cara se ha reído, y es que ya sabía que no le iba a hacer caso. Como alternativa, me propuso preparar unas plantillas auxiliares para entrenar hasta que disponga de los resultados de la telemetría. Me corroe por dentro la rabia de no poder entrenar al ritmo que yo deseo. Espero que se solucionen pronto estos problemas, estoy que me muero de ganas por correr esa maraton!!

Hoy 23/10/2013 recojo las plantillas auxiliares en la clinica del podólogo.


Entrenamientos realizados la semana del 21/10/2013 - 27/10/2013

    * Lunes: running asfalto - 15km D+0m / 1h 23m 05s
    * Martes: gimnasio pesas - dorsal, triceps, pierna, abdominales
    * Miercoles: series atletismo - 21 x 400m x 1m 45s + 21 x reposo x 30s
    * Jueves: running asfalto - 14km D+0m / 1h 15m 17s
    * Viernes: gimnasio pesas - hombro, trapecio, pierna, abdominales
    * Domingo: running asfalto - 12km D+0m / 1h 02m 13s

Esta semana he tenido que aflojar en la intensidad de los entrenamientos, no he hecho ninguna tirada larga, y los tiempos conseguidos fueron bastante discretos. No obstante, estoy contento porque las plantillas auxiliares me han permitido terminar los 3 últimos entrenamientos sin casi dolor en las tibias ni en mis rodillas, lo que pinta bastante mejor para la semana que viene. Mañana por la tarde tengo visita con el radiólogo para hacerme la telemetría. Veremos como sale todo.

Hoy 29/10/2013 visita con el radiólogo para hacerme la telemetría. El medico me diagnostica una "Dismetría de miembros inferiores de 6mm mas elevada cabeza femoral derecha". Vamos, que estoy un poco torcido, pero nada grave. Es lo habitual en gente de mi estatura. La radiografía nos sale por 60€. Comunico el diagnóstico al podólogo para que vaya preparando las plantillas nuevas con los moldes que ya tomó en su día.

Hoy 29/10/2013 acaban de presentar el recorrido oficial de la prueba:


Entrenamientos realizados la semana del 28/10/2013 - 03/11/2013

    * Lunes: running asfalto - 15km D+0m / 1h 27m 41s
    * Martes: gimnasio pesas - pecho, biceps, pierna, abdominales
    * Miercoles: running asfalto - 34km D+0m / 3h 42m 19s
    * Viernes: gimnasio pesas - mantenimiento general
    * Sabado: running asfalto - 14km D+0m / 1h 15m 27s

Malas noticias. El Miércoles era un día clave: entrenamiento de 34Km en el que quise ponerme a prueba, a falta de 5 semanas, para ver mi estado físico real.  Los primeros 25Km corrí muy a gusto, disfrutando de la carrera, animándome a mi mismo con momentos de esos en los que se te pone el bello de punta mientras corres. Estoy fuerte, y estaba disfrutando mucho. Las pulsaciones muy bajas todo el tiempo, y muscularmente iba bien. Todo iba perfecto.

Pero mas allá del 28km mis peores temores empezaron a hacerse realidad. Mis rodillas empezaron a doler mas y mas, y ya en el último tramo antes de llegar a casa incluso tuve que andar cojeando. Incluso andando, el dolor era insoportable. La tarde del Miércoles la pasé cojeando, con fuertes dolores en ambas rodillas. El Jueves descanse, con hielo todo el día para intentar recuperarme. El Viernes hice un entrenamiento muy ligero en casa, sin tocar para nada las piernas, para dejar otro día de descanso para recuperar. El Sábado intenté salir de nuevo, pero los últimos kilómetros volví a sentir mucho dolor, sobre todo el mi rodilla izquierda. Hoy Domingo no ha remitido el dolor, y no me atrevo a entrenar. Siento un pinchazo intenso en mi rodilla izquierda cuando ando, cada vez que levanto la rodilla del suelo, lo que me tiene realmente preocupado. Si no consigo acabar con ese dolor, estoy jodido.

Mañana tengo visita con el podólogo. Con los resultados de la telemetría (tengo una dismetría de 6mm), me ha preparado unas plantillas nuevas, que son mi gran esperanza. Aflojaré unos días para ver si consigo recuperarme, y volveré a probar con plantillas nuevas. Si no mejoro esta semana, la cosa pinta mal, muy mal.

Hoy 05/11/2013, estreno mis nuevas plantillas. Me han costado 140€. El podólogo me ha recomendado que las pruebe, y si no noto mejoría, que renueve las zapatillas, porque tambíen podría influir. Probaremos primero solo con las plantillas, a ver que tal.


Hoy 07/11/2013, entreno de 1km en 6m 20s con las plantillas nuevas, y regreso a casa cojeando. Voy a descansar varios días hasta que remita la tendinitis de mi rodilla izquierda completamente o me voy a quedar cojo. La Maratón sigue siendo factible si me recupero por completo. Reposo a 30 días de la carrera... Esto no estaba en mis planes. A ver como me lo monto para llegar bien...

Entrenamientos realizados la semana del 04/11/2013 - 10/11/2013

    * Lunes: series atletismo - 10 x [ 800m x 4m + 1m recuperación ]
    * Martes: gimnasio pesas - dorsal, triceps, pierna, abdominales
    * Miércoles: running asfalto - 12km D+200m / 1h 18m 16s

El Jueves no podía mas con mi rodilla izquierda, y tras 1Km que hice en mas de 6 minutos, tuve que parar y volver a casa cojeando, con un pinchazo muy fuerte en mi ligamento lateral externo. Tras 4 largos días de reposo, parece que el dolor ha remitido en ambas rodillas. Hoy vamos a rodar un poco a ver como me encuentro. Es una semana clave para tomar decisiones. Faltan menos de 30 días.

Entrenamientos realizados la semana del 11/11/2013 - 17/11/2013

    * Lunes: running asfalto - 10km D+0m / 56m 09s
    * Martes: gimnasio pesas - hombro, trapecio, pierna, abdominales
    * Miércoles: gimnasio pesas - pecho, bíceps, pierna, abdominales
    * Jueves: gimnasio pesas - dorsal, tríceps, pierna, abdominales
    * Sábado: running asfalto - 7.5km D+0m / 38m 21s

El Lunes salí a trotar para comprobar el estado de mis rodillas, sobre todo mi rodilla izquierda que es la que mas me dolía. Salí sin dolor alguno, pero en 3Km volví a sentir un fuerte pinchazo cada vez que flexionaba la rodilla para avanzar metros. Intenté terminar el entrenamiento de 14km con la esperanza de que el dolor se curaría con los cuidados suficientes, pero tuve que cortar el entrenamiento a los 10km. No podía mas, volví a casa cojeando. Dejé de correr durante 5 días, con la esperanza que ese reposo resolvería mis problemas. El Sábado volví a intentarlo. Al primer km, el pinchazo hizo de nuevo acto de presencia, y en el 6km ya era un dolor agudo. Tuve que frenar para no complicar la situación, y regresé a casa con un sabor bastante amargo. Me encuentro bien, pero mi rodilla no me responde.

Estoy a 20 días de la carrera, y los últimos 15 días no he podido entrenar prácticamente nada. Mi corazón me pide que siga, que no tire la toalla, pero mi cabeza me dice que si sigo forzando, podría complicarse el estado de mi rodilla. De momento me doy una semana mas antes de decidir que hago. Quiero pensar que todavía es posible.

Hoy 19/11/2013 acabo de terminar el entreno del día. Han sido 10km, cumpliendo con el objetivo con el que salí a correr. El dolor sigue ahí, desde el km 1, pero ha disminuido la intensidad. Estoy corriendo con unas bambas de trail running Asics Gel-Fuji Sensor que usaba para correr por montaña. Estaban menos usadas que las Brooks Glycerinne, por lo que si fuera problema del calzado, debería seguir mejorando en los próximos días. El simple hecho de pensar que existe alguna posibilidad de correr esta Maratón, me pone tan contento que VUELVO A SONREÍR!!! :))

Cuantos recuerdos en todas estas bambas! Juntos hemos recorrido unos cuantos miles de Km!!



Entrenamientos realizados la semana del 18/11/2013 - 24/11/2013

    * Lunes: gimnasio pesas - hombro, trapecio, pierna, abdominales
    * Martes: running asfalto - 10km D+0m / 57m 00s
    * Miercoles: gimnasio pesas - pecho, biceps, pierna, abdominales
    * Viernes: series atletismo - 7 x ( 1600m / 9m + recuperación 2m)
    * Domingo: running asfalto - 12.5km D+200m / 1h 14m 17s

Sigo con dolor en mi rodilla izquierda durante los entrenamiento de running.  Pero la buena noticia es que cada día me duele menos. Creo que el culpable de mi dolor eran las bambas Brooks Glycerine, que con solo 6 meses han corrido cerca de 1000Km por asfalto. No se recomienda correr con unas bambas que tengan mas de 750Km, porque aparentan tener un buen aspecto por fuera, pero las suelas estan muy desgastadas y con casi 100kg que peso, ya no amortiguan mi pisada lo suficiente. Eh aquí la raíz de mi tendinitis. Este fin de semana, sin falta me voy a comprar unas bambas nuevas. De momento seguiremos entrenando esta semana con las Asics que usaba para correr por montaña, ya que estaban menos usadas y todavía aguantan bien mi peso.

Estoy muy emocionado porque solo quedan 13 días y a pesar de haber perdido muchos entrenamientos en las últimas semanas, sigo manteniendo el fondo, y me siento capaz de terminar, aunque no sea con un tiempazo, al menos si con dignidad. Después de tantas horas de entrenamiento, y del contratiempo de mi rodilla a última hora que me hizo pensar en abandonar hace unos días, cruzar la linea de meta sería un SUPER subidon de emociones que estoy seguro que tardaría en olvidar!

De momento, hoy toca salir a entrenar a 2ºC que estamos ahora mismo en Terrassa. Allá vamos!!

Unos cuantos juanetes, y la uña de mi dedo gordo izquierdo reventada, de recuerdo :)



Hoy 30/11/2013, a 8 días de la carrera, estreno las nuevas ASICS (Alma Sana in Corpore Sano) Gel-Nimbus 15 FluidRide. Nos costaron 149.95€. Vamos con todo!!



Entrenamientos realizados la semana del 25/11/2013 - 01/12/2013

    * Lunes: gimnasio pesas - dorsal, triceps, pierna, abdominales
    * Martes: series atletismo - 12 x (400m x 1m 55s + recuperación 30s)
    * Miercoles: gimnasio pesas - hombro, trapecio, pierna, abdominales
    * Jueves: running asfalto - 10km D+0m / 1h 0m 28s
    * Viernes: gimnasio pesas - pecho, biceps, pierna, abdominales
    * Domingo: running asfalto - 14km D+150m / 1h 24m 14s

Llegó la hora. Hoy Lunes 2 de Diciembre, estamos a 6 días de participar en la cita mas importante del año a nivel deportivo. Llegó el momento de demostrarme a mi mismo si todos estos meses de entrenamiento servirán para completar mi primer Maratón. No será fácil. Si lo logro, será una gran alegría, inmensa. Os la dedicaré a todos vosotros. Pero existe la posibilidad de no lograrlo. Si, en ese caso sería una decepción a nivel personal, pero me quedaré satisfecho con lo mucho que he disfrutado entrenando todos estos meses.

Llevo entrenando a este ritmo toda mi vida, desde que con 13 años entre a formar parte de la cantera del Club Atletic Basket Castelló, en la categoría Cadete B. Desde entonces, y ya van 24 años, no he aflojado. Si es cierto que los últimos meses he incrementado el total de Km semanales de entrenamiento, de los 30Km que corría habitualmente, a mas de 70Km semanales.

Pensaréis que alguien tan entrenado puede terminar una Maratón sin mucha complicación, pero ese no es mi caso. Mis 98Kg son un handicap tremendo. Un corredor de los considerados élite, no pesan mas de 65Kg. Yo peso 35Kg mas.  Tampoco veréis a muchos corredores de 2 metros en carrera. El desgaste físico que sufrirá mi cuerpo durante los 42Km de la carrera, sera importante. Es por eso que mi lucha va a ser estrictamente personal, contra mi mismo, y con el único objetivo de demostrarme que con este cuerpo, yo también soy capaz.

Agradeceros a todos los que habéis seguido mis comentarios durante todos estos meses. Durante la carrera, os llevaré a todos en mi subconsciente, y estaréis animándome a cada paso que de. Espero no defraudar a nadie!!.

El desenlace de esta historia que comenzará el próximo Domingo 8 de Diciembre a las 9h, sobre las 13h de la tarde del mismo día.

Solo queda una cosa... a darlo todo Ivan Castell!!

Hoy 02/12/2013, pago la inscripción de 65€, y ya la tenemos confirmada. No hay marcha atrás!


De esta rodilla depende prácticamente todo!



Hoy 07/12/2013, a las 9:00h, estamos a 24h de empezar!! Los nervios a flor de piel! Nos vamos a rodar 6km para estirar las piernas, y mañana a esta hora... A darlo todo!

Hoy 07/12/2013, después del entrenamiento suave de 6Km, y a 20h de empezar con la carrera, no consigo quitarme del todo las molestias con mi rodilla izquierda.  Siguiendo las indicaciones de mi novia, decido comprar una rodillera ortopédica, y mi padre me aconseja pasar por la Ortopedia Técnica de Castellón, donde compro la rodillera que os pongo en la foto. Según me han explicado, mantendrá mis ligamentos comprimidos para que no sufran tanto durante la carrera. A última hora, sin hacer ninguna prueba con la rodillera.  No me gusta nada dejar las cosas para última hora. ¿Y si después me molesta? No tengo mas remedio, tengo que correr el riesgo. Pero me pongo muy nervioso con tanta incertidumbre.



Hoy 08/12/2013, es el día que estamos esperando hace tantos meses. Me preparo 4 geles, y un botellin con 600ml de Aquarius y una disolución de Long Distance Energy, de Isostar, por si durante la carrera se terminan los geles y las bebidas isotónicas, y los últimos corredores nos quedamos sin. No es la primera vez que me pasa.



Camiseta, dorsal, zapatillas... Estamos listos para empezar!!



Mis padres me acercan hasta el puente del paseo Morella, al lado de la UJI, donde esta la linea de salida. Mi novia me hace la última foto antes de enfrentarnos al reto mas exigente de mi vida a nivel deportivo!



Al empezar la carrera, me pongo a correr en el grupo del globo que marca el ritmo de 4h 30m, ultraconservador. Pero cerca del 5Km me doy cuenta que ese ritmo es mas lento del que yo he entrenado, y no voy comodo. Así que decido salir del grupo y tirar solo, al ritmo que he entrenado todo este tiempo, unos 6m/Km. No necesito ni GPS ni nadie que me marque el ritmo, lo tengo muy automatizado.

Así sigo hasta llegar a la Avd. del Mar, camino del Grao de Castellón. Hacia el 18Km incluso paro un momento a orinar, y continúo corriendo a mi ritmo. Muy comodo a nivel cardíaco, voy hablando con la gente, con la organización...  Chocando la mano a los niños que nos animan... En todo momento siento que voy frenado, que mis piernas dan para mas. Pero esta prueba es muy larga, Ivan no te emociones!

De regreso a Castellón por la Avd. del Mar, pasado el 21Km corro con algunos corredores veteranos, que llevaban el mismo ritmo que yo. Al llegar de nuevo a Castellón, ellos empiezan a hacer paradas para andar, y yo me encuentro bien, así que sigo a mi ritmo, corro prácticamente solo por la Avd. del Lidón.

Ya sobre el 27Km, de nuevo en la ciudad de Castellón, siento los ánimos del publico, y empiezo a acordarme de toda la gente que me habéis animado durante estos meses (familiares, amigos, compañeros de colegio, de carrera, de trabajo).  Mi rodillera ortopédica es una caña, no tengo dolor alguno en mi rodilla izquierda, y con los animos del público que sigue la prueba, y de los organizadores en cada avituallamiento, empiezo a dejarme llevar, acelero poco a poco, y empiezo a correr cada vez mas rápido. Voy adelantando a corredores que me llevaban muchos minutos de ventaja al paso por el medio maratón. Me siento fuerte, las piernas no me duelen, el corazón lo llevo bajo de pulsaciones.  Empiezo a pensar que terminar la prueba es una posibilidad real. Me emociono y suelto alguna lagrima.


Paso por el 30Km. Soy consciente que me acerco al "Muro", ese momento en el que el cuerpo agota todas sus reservas de glucógeno y entra en decadencia. Ese es el momento donde debe empezar el verdadero Maratón. Pero yo sabía como evitarlo, comer y beber desde el 1Km, aunque no tuviera hambre, aunque no tuviera sed, y mi cuerpo responde bien. Avanzo Km tras Km sin tener constancia alguna de la existéncia de ese "Muro". Km 32, 33, 34, 35, 36, corro con todas mis fuerzas, y el cuerpo me responde, me siento muy fuerte. Adelanto a muchisimos corredores, lo que me motiva mas y mas. Los organizadores me animan al paso por los avituallamiento. "Vas muy bien, venga, venga!!"

Me doy cuenta que SI voy a terminar, me saltan las lagrimas, me acuerdo de toda la gente que me ha animado en algún momento, de lo mal que lo he pasado durante el último mes, de toda la gente que ha estado ayudándome estos meses a conseguirlo. Aprieto los dientes, me saltan mas lágrimas, y sigo corriendo con todas mis fuerzas. ¿Podré bajar de 4horas? empiezo a pensar que es posible.

Llegamos al 38Km, y de repente siento un cansancio en las piernas brutal. Mis cuadriceps empiezan a doler, a doler mucho, tengo la sensación de que me van a explotar los dos. Estoy llegando al final de la Avd. Valencia, para girar hacia el Polideportivo Ciutat de Castelló. Aqui es cuando ya me toca bajar el ritmo.  El "Muro" existe Ivan!! Empiezo a correr muy despacio, llego a pensar en parar, y andar hasta la meta.  Pero no lo hago, es el momento para el que he estado entrenando todo este tiempo. Ivan, hay que sufrir, y tu de eso sabes un poco.  Sigue, sigue!!

Al llegar al 40Km, por el Parque Oeste, veo por tercera vez a mi amigo Javi, dándolo todo para animarme. Le doy las gracias. Me tomo dos geles, me bebo el Isostar con Aquarius que llevo en el botellín durante toda la carrera, y parece que resucito. Los últimos 2Km, animado por la gente, por mis padres, por mi novia, todos han hecho un seguimiento de la carrera durante casi 5 horas, toca dar el resto!! En la misma linea de meta, en el Parque Ribalta, consigo adelantar a otros 3 corredores.


El vídeo de mi llegada:

http://www.corriendovoy.com/atletismo/87523/maraton-castellon-2013

Las clasificaciones (tiempo absoluto, tiempo real, 10K, 21K, 30K):



Maratón internacional de Castellón 2013. Tiempo oficial, 4h 8m 55s. Sin haber bajado de las 4h, estoy exultante de alegría!! :) Los problemas físicos que he arrastrado durante el último mes no han impedido que pueda terminar esta prueba que me hacía tanta ilusión. Ahora si, yo también soy un finisher!!!



Especialmente quiero dar las gracias a todos los que me habéis ayudado de alguna manera a conseguir terminar mi primer Maratón, que soys un montón de gente!! Mis amigos del Facebook (compañeros del CP Ejercito, de la UJI, excompañeros y actuales compañeros de trabajo, los amigos del grupo "La Marxal" del Whatsapp, a Antonio Azpiroz por su plan de entrenamiento online, al podólogo Nestor Rodríguez, y su clinica "Las Arenas", al radiólogo Don Aurelio Igual, a la Ortopedia Técnica Castellón, a la tienda Atmosfera Running por el calzado y su acertada recomendación, a los organizadores de la mejor carrera del mundo, a los voluntarios que nos avituallaron durante la prueba, a mi padre, a mi madre, y a mi hermano, por su apoyo incondicional, y sobre todo, a mi novia Bouchra, porque ella ha sufrido mas que nadie mi falta de tiempo libre durante todos estos meses, y a ella le debo haber podido cenar muchos días a las 23h de la noche, hora a la que regresaba a casa después de trabajar, ponerme las zapatillas, y salir a entrenar.

Gracias a todos, hoy ha sido uno de esos días que nunca voy a olvidar. Un abrazo muy fuerte para todos, este resultado os lo debo a vosotros. Sin vuestra ayuda, hubiera sido imposible!!

Ahora toca descansar y recuperarse. En 2014 regresaremos con nuevos objetivos. Felices fiestas!!

sábado, 4 de mayo de 2013

El SDK del IGEPv2


Continuando con el articulo que escribí hace ya un tiempo sobre el IGEPv2, voy a explicar los pasos necesarios para crear tu propio SDK para esta plataforma embedded.


El proyecto Yocto

Generar un SDK desde cero no es una tarea sencilla, en absoluto. Para hacer la tarea de forma sencilla, nos vamos a ayudar de la meta-distribución Yocto Poky distribuida por ISEE y personalizada para su plataforma IGEPv2.




Yocto Poky esta basada en la herramienta bitbake, herramienta que hace uso de unos ficheros de recipes (reglas) preparadas para hacer tareas complejas. Entre sus reglas, podemos encontrar una que nos permite generar el SDK para la plataforma IGEPv2. Veremos que el proceso para generar este SDK es muy sencillo (aunque costoso computacionalmente).


Dependencias previas

Vamos a realizar la compilación del SDK para el IGEPv2 usando un PC host con la distribución Ubuntu 12.04 LTS instalada. Es necesario instalar estos paquetes antes de empezar el proceso:

    $ sudo apt-get install diffstat
    $ sudo apt-get install texi2html
    $ sudo apt-get install texinfo
    $ sudo apt-get install gawk
    $ sudo apt-get install chrpath
    $ sudo apt-get install gnupg
    $ sudo apt-get install libcurl3
    $ sudo apt-get install libcurl3-gnutls
    $ sudo apt-get install python-pycurl


Si usáis otra distribución distinta, puede que falten, o puede que sobren paquetes.


Generación del SDK

El primer paso es clonar Poky del repositorio git de ISEE.

    $ git clone -b denzil git://git.isee.biz/pub/scm/poky.git
    Initialized empty Git repository in /mnt/data/gatchets/IGEPv2/poky/.git/
    remote: Counting objects: 62407, done.
    remote: Compressing objects: 100% (19827/19827), done.
    remote: Total 62407 (delta 41254), reused 61256 (delta 40311)
    Receiving objects: 100% (62407/62407), 38.81 MiB | 318 KiB/s, done.
    Resolving deltas: 100% (41254/41254), done.


El paso anterior debe haber generado dentro de tu directorio local un directorio llamado "poky".

Descargar el layer de ISEE del repositorio git:

    $ cd poky
    $ git clone -b denzil git://git.isee.biz/pub/scm/meta-isee.git

Configura el entorno de bitbake:

    $ source oe-init-build-env

Al hacer un source del fichero anterior, en realidad estas provocando  cambios en la variable de entorno PATH y estableciendo otras variables de entorno que usa la herramienta bitbake para hacer su trabajo. La primera vez que ejecutas este comando "source" se crea un directorio "build" con estos ficheros de configuración en su interior:

    $ find
    .
    ./conf
    ./conf/bblayers.conf
    ./conf/local.conf


A continuación modifica el contenido del fichero conf/bblayers.conf. Debería contener esta información (falta añadir el layer meta-isee)

    $ cat conf/bblayers.conf

    Code: Select all
    # LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
    # changes incompatibly
    LCONF_VERSION = "4"

    BBFILES ?= ""
    BBLAYERS ?= " \
      /path/to/poky/meta \
      /path/to/poky/meta-yocto \
      /path/to/poky/meta-isee \
      "

Editar el fichero conf/local.conf (que ya debe existir, no deberías crearlo a mano) y cambia la variable MACHINE para que ponga esto:

    MACHINE ??= "igep00x0"

Ahora ya puedes lanzar el comando que genera el SDK:

    $ bitbake meta-toolchain-sdk

Y tener mucha paciencia [...] Este proceso tarda unas cuantas horas. En mi PC, un Intel Core i3, con 4GB de RAM, han sido casi 16 horas de compilación.

Cuando el proceso termine, el SDK queda listo en este path:

    poky/build/tmp/deploy/sdk/igep-sdk-yocto-toolchain-1.2.1-2.tar.bz2


Instalación del SDK

Una vez generado el SDK, hay que instalarlo en tu sistema host. Para hacerlo, sigue estos pasos:

    $ cd poky/build/tmp/deploy/sdk
    $ sudo -s
    $ tar xvfj igep-sdk-yocto-toolchain-1.2.1-1.tar.bz2 -C /

El comando anterior desplegará todo el SDK del IGEPv2 dentro del directorio:

    /opt/poky/1.2/

No cambies ese directorio, ya que ese path esta hardcoded dentro de los binarios del SDK, y si cambias a un path diferente, no te funcionará correctamente.


Uso del SDK

Para configurar el entorno para compilar binarios para esta plataforma, basta con ejecutar este script:

    $ . /opt/poky/1.2/environment-setup-armv7a-vfp-neon-poky-linux-gnueabi

Fijate en el punto '.' antes del path, es necesario para que los cambios que se hacen en el entorno queden ahi cuando el script termine de ejecutarse.

Ahora ya tienes disponibles en tu path los compiladores cruzados para tu nueva plataforma ARM:

    $ arm-poky-linux-gnueabi-gcc --version
    arm-poky-linux-gnueabi-gcc (GCC) 4.6.4 20120303 (prerelease)
    Copyright (C) 2011 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    $ arm-poky-linux-gnueabi-g++ --version
    arm-poky-linux-gnueabi-g++ (GCC) 4.6.4 20120303 (prerelease)
    Copyright (C) 2011 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

A partir de este momento ya puedes usar el SDK del ARM de forma análoga a como usarías el SDK de tu PC host nativo.

Además de usar las herramientas cruzadas (cross-compilador, cross-linker, etc.) has de tener en cuenta que debes cambiar el SDK_PREFIX para que apunte al directorio raíz del SDK recién instalado. ¿Que significa esto? Pues que cuando compilas en tu PC host, el SDK_PREFIX siempre es este:

    SDK_PREFIX="/"

En realidad, ni siquiera se define, ya que tus ficheros de header estan en /usr/include y tus librerías en /usr/lib. Sin embargo, cuando usas un SDK cruzado, el SDK_PREFIX ya no es "/", debe cambiar para apuntar al nuevo directorio, en nuestro caso:

    SDK_PREFIX=/opt/poky/1.2.1/sysroots/armv7a-vfp-neon-poky-linux-gnueabi/

Esto es así porque los headers de compilación para tu plataforma ARM no estan en /usr/include, sino que están en $SDK_PREFIX/usr/include. Y las librerías de linkado para tu plataforma ARM no estan en /usr/lib, sino que están en $SDK_PREFIX/usr/lib.

Teniendo esto en cuenta, compilar un proyecto para ARM es tan simple como hacerlo para la máquina nativa.


Trabajo pendiente

Veremos mas adelante como usar el SDK que acabamos de construir para compilar el binario del x-loader (MLO), la imagen del kernel de Linux (zImage), y un target filesystem con el que vamos a arrancar la placa.

miércoles, 20 de febrero de 2013

Diseño de bases de datos relacionales

Hacía ya tiempo que no publicaba nada en este blog. No es por falta de ganas, queridos lectores, os lo aseguro, ni tampoco por falta de ideas (tengo unos cuantos temas pendientes). Es lo de siempre: la falta de tiempo libre. Quien me mandaría a mi emanciparme... ¡¡Con lo bien que estaba yo en casa de mis padres!! :)

Con la llegada del frio invernal, esta semana pasada me decidí a escribir un pequeño articulo para recordar el proceso de normalización del diseño lógico de una base de datos hasta la tercera forma normal (3FN).

Tras publicar una primera versión (quizá alguno de vosotros ya lo leyó, ansiosos, que soys unos ansiosos!! jejeje), en realidad no me gustó mucho el resultado: contenía demasiada información inconexa, y carente del hilo conductor que a mi me gusta seguir para explicar bien las cosas, para que se entiendan.

Así que me puse a revisarlo hasta redactarlo casi por completo. Hoy lo he vuelto a leer y ahora si que está como a mi me gusta. No obstante, el articulo se extendía bastante y he tenido que esquivar distintos temas que han ido apareciendo a lo largo del documento, que darían para escribir bastantes páginas mas sobre esta materia. Quizás para otra ocasión.

Si alguien tiene interés en profundizar en algún tema que dejo apartado, que se ponga en contacto conmigo y así tendremos motivación adicional para escribir el próximo articulo. Espero que os guste.


¿Que es una base de datos?

Una base de datos (BD en adelante) es un almacén de datos de distintos tipos interrelacionados, ordenados adecuadamente, y que generalmente pertenecen a una empresa u organización. Habitualmente se representa con este símbolo

¿Que es un sistema gestor de base de datos?


Cada persona del mundo se podría inventar su propio método para organizar internamente una BD de creación propia: ficheros organizados por registros, una  hoja de cálculo, hojas de papel indexadas alfabéticamente, cuaderno de notas, ... Pero ninguno es lo suficientemente eficiente como para manejar volúmenes de información grandes.

Cuando se habla de manejar miles de millones de registrosinteresa que el acceso a la información se pueda automatizar desde un sistema informático que permita el acceso a la información se realice de manera rápida y eficiente. Para eso se crearon los SISTEMAS GESTORES DE BASES DE DATOS (SGBD).

El SGBD es la pieza de software a través de la cual se realizan todas las operaciones sobre la BD, actuando como un interfaz entre la BD y nuestra aplicación. Las operaciones permitidas son:

  • Consultas para buscar información
  • Inserciones de nuevos datos
  • Borrado de datos
  • Actualizaciones de los datos existentes.
Internamente, los datos se almacenan en uno o varios  discos, y en uno o varios ficheros. Pero el usuario percibe que todos los datos se encuentran en un mismo lugar, y accede a ellos mediante sentencias específicas que él y el SGBD comprenden.

Los SGBD también se encargan de otras tareas como mantener la seguridad de la información almacenada (tanto por caídas del sistema como por accesos no autorizados), o compartir la información entre varios usuarios,  evitando resultados anómalos debidos a los accesos concurrentes.


¿Que es un sistema de información?

Un sistema de información es un conjunto de elementos hardware, software y humanos, orientados al almacenamiento, tratamiento, y explotación de datos e información, organizados y listos para su uso posterior, generados para cubrir una necesidad u objetivo.

Un sistema de información se compone de varios elementos:
  • Usuarios
  • Telecomunicaciones (redes LAN, WAN)
  • Elementos software (aplicación, BD, SGBD, sistema operativo, ...)
  • Elementos hardware (servidores, routers, terminales, TPV, ...)
Como vemos, la BD y el SGBD son dos de los elementos software que componen un sistema de información.

Para desarrollar un sistema de información completo, se siguen varias fases:
  • Estudio de la viabilidad
  • Recogida y análisis de los requisitos
  • Diseño
  • Creación de prototipos
  • Desarrollo
  • Implantación
  • Validación
  • Prueba
  • Operación
En concreto, la fase de diseño de un sistema de información (la que nos ocupa en este documento), se divide a su vez en:
  • Diseño de la BD
  • Diseño de la aplicación
La BD debe ser independiente de la aplicación que la usa. Por tanto, no se debe diseñar la BD pensando en almacenar los datos en un formato determinado que le venga bien a la aplicación. Este error es bastante típico cuando el diseñador y el programador de la aplicación, son la misma persona, y cuando lo hace, es por comodidad, pero sobre todo por falta de conocimiento.


Diseño de la base de datos

Vamos a profundizar en el diseño de la BD. El diseño de la BD, consta de 3 etapas:
  • Diseño conceptual
  • Diseño lógico
  • Diseño físico
El diseño conceptual de la BD se realiza a partir de los requisitos del cliente, y genera como salida un ESQUEMA CONCEPTUAL, basado en el modelo entidad-relación. Este esquema conceptual es independiente del SGBD seleccionado (por tanto, el mismo para todos ellos). Esta pensado para que sea comprensible para cualquier persona que tenga relación con el proyecto, incluso sin que tenga conocimientos de programación. 

El diseño lógico de la BD se realiza a partir del esquema conceptual, y genera como salida un ESQUEMA LÓGICO. Todos los SGBD de un mismo tipo utilizan el mismo diseño lógico. En este documento vamos a centrarnos en los SGBD relacionales (ver de que se trata esto del modelo relacional, mas adelante). Por tanto, nos sirve para PostgreSQL, MySQL, Oracle, Access, SQLServer, etc.

El diseño físico de la BD se realiza a partir del esquema lógico, y genera como salida un ESQUEMA FISICO. El esquema físico ya es dependiente del SGBD elegido para implementar la DB. Por tanto, un esquema físico de Oracle no es compatible con un esquema físico de PostgreSQL, por poner un ejemplo.

En este documento no hablaremos de diseño conceptual ni tampoco de diseño físico. Ambos escapan del objetivo de este post. Quizás para otra ocasión.


Diseño lógico de la base de datos

Continuamos centrando el objetivo de este documento, entrando en mas detalles del diseño lógico de la BD.

El esquema lógico generado durante la fase de diseño lógico de la BD se representa con un LENGUAJE DE MODELADO. Antes de continuar, vamos a aclarar que es esto de un modelo, y para que sirve.

El mundo real es demasiado complejo, tiene demasiados detalles en los que nos podemos fijar. Para poder representar objetos del mundo real en un modelo, es preciso simplificar la realidad y captar solo aquellos detalles que sean de interés para el modelo en cuestión que deseamos realizar. Es lo que se conoce como modelar la realidad.

Pondremos un símil con el mundo de la especulación inmobiliaria, hoy en día tan de moda y en boca de todos. Un arquitecto hace (en realidad, hacía en la época de bonanza, ya no) varios planos de un edificio antes de que los albañiles empiecen a tirar cemento: plano de las habitaciones de cada vivienda, de los esquemas eléctricos, de los conductos de ventilación, del parking, etc. Cada uno de esos planos es un modelo distinto del edificio construido.

Como diseñadores de la BD, una de las tareas que tendremos que realizar es 
modelar el esquema lógico de la BD. Para hacer esta tarea, existen distintos lenguajes de modelado:
  • Modelo jerárquico: relaciones padre-hijo
  • Modelo en red: los hijos pueden tener varios padres
  • Modelo relacional: utiliza tablas y relaciones entre ellas
  • Modelo orientado a objetos: utiliza objetos y mensajes
  • Modelo semántico: utiliza descripciones semánticas de la información.
  • Modelo deductivo: utiliza axiomas deductivos y reglas de inferencia.
En este documento vamos a hablar exclusivamente del modelo relacional. Como ejemplos de SGBD relacionales tenemos PostgreSQL, Oracle, MySQL, SQLite, SQLServer, Access, etc.

El modelo relacional

El modelo relacional fue definido por un investigador de IBM, el científico informático Ingles, Edgar Frank Codd, en 1970, quien también desarrolló el sistema de normalización que estudiaremos después.



Probablemente, si has leído hasta este punto del documento es porque ya tenías alguna idea sobre el modelo relacional, y te suenan conceptos como relación, tupla, clave o atributo. De todas formas, como el resto del documento esta basado en estos conceptos, los vamos a definir formalmente, para que no quede ninguna duda:

Un modelo de datos relacional esta formada por un conjunto de RELACIONES R1, R2, ..., Rn, que se representan gráficamente como TABLAS.

La relación Ri esta formada por un conjunto de FILAS, TUPLAS o ENTIDADES, que se corresponden con las INSTANCIAS de la relación.

Se define CARDINALIDAD como el numero de instancias (filas) de una relación en un momento dado.

Cada relación R tiene un conjunto de ATRIBUTOS, COLUMNAS o CAMPOS, A1, A2, ..., Am. Se representan como R(A1, A2, ..., Am).

Llamamos NULO al valor de un atributo para el que no tenemos un valor. Indica un valor que no existe, o que es desconocido.

Llamamos GRADO al número de atributos de una relación.

Llamamos DOMINIO de un atributo, al conjunto de valores válidos que puede tomar ese atributo.

Veamos lo anterior con un ejemplo:

    RELACION_ALUMNOS
    Codigo      DNI         Apellido1       Apellido2   Nombre
    21313       26767671X   Martinez        Romero      Ronnie
    3910        26143413V   Lopez           Garcia      Ilsed
    19423       26913493A   Sanchez         Pons        Spyros


La relación alumnos tiene una cardinalidad 3 (3 filas), un grado 5 (5 columnas), y el dominio del atributo Nombre (por poner un ejemplo) son los strings de 32 bytes.


Claves primarias y ajenas

Muchas de las propiedades del modelo relacional se fundamentan en la definición matemática de Conjunto. Un CONJUNTO es una colección desordenada de elementos distintos del mismo tipo. Una relación es por tanto un Conjunto de tuplas. Luego no puede haber dos tuplas iguales, todas las tuplas son por tanto distintas. Además, no se asume ningún orden dentro de un conjunto.

Como las tuplas no están ordenadas, no se puede hacer referencia a una tupla por su posición dentro de la relación. El modo de hacer referencia a las tuplas es a través de las claves primarias. Pero, ¿que es esto de una clave primaria? Veamos algunas definiciones mas:

Llamamos CLAVE de una tupla a aquellos atributos que identifican de forma única a las entidades de una relación. Existen varios tipos de claves:
  • SUPERCLAVE. Cualquier subconjunto de atributos que identifiquen de forma única a las tuplas de una entidad. Por tanto, el conjunto de todos los atributos de una relación es una superclave de esa relación.
  • CLAVE CANDIDATA.Es el menor subconjunto de atributos de una superclave que sigue siendo un identificador único. Si a una clave candidata le quitamos un atributo, deja de ser clave candidata. Notar que en una relación puede haber varias claves candidatas, cada una de ellas con un numero distinto de atributos.
  • CLAVE PRIMARIA (PK). La clave primaria es la clave candidata que el diseñador elige para identificar a las tuplas de una relación.
  • CLAVE AJENA (FK). Es el conjunto de atributos de una relación R2 cuyos valores son completamente NULOS o coinciden completamente con los de la clave primaria de una relación R1. Se dice que la clave ajena de una tupla referencia a la tupla donde se define el valor correspondiente de la clave primaria.
Como las claves son conjuntos de atributos, las vamos a representar con la notación de conjuntos {...}

Diremos que R1 y R2 son dos RELACIONES INTERRELACIONADAS si R1 tiene una clave ajena que apunta a la clave primaria de R2. Por tanto, no confundir el concepto de relación (tabla) con el de interrelación (claves ajena apuntando a clave primaria).


Reglas de integridad

Las claves primarias y ajenas deben cumplir una serie de propiedades que permiten mantener la integridad de la BD, es decir, permiten asegurar que los valores de sus atributos se ajustan a los valores del mundo real modelado.
  • La INTEGRIDAD DE ENTIDAD. Ningún de los atributos que componen una clave primaria puede aceptar valores NULOS, ya que la clave primaria debe identificar a cada tupla de la relación. 
  • La INTEGRIDAD REFERENCIAL. Las claves ajenas no pueden contener valores que no coincidan exactamente con alguna clave primaria, a menos que todos sus atributos sean NULOS.

Los atributos que no pertenecen a las claves, también deben cumplir una serie de propiedades. En este caso, solo deben aceptar valores de su DOMINIO. Esto implica que no todos los posibles valores de un atributo tienen sentido. Por ejemplo, la edad de las personas no puede ser negativa.
 
Las reglas de integridad deben ser propiedad de la BD, no de la aplicación. Por tanto, no se deben controlar estas restricciones desde la propia aplicación. Con esto evitaremos problemas graves con inserciones, actualizaciones o borrados realizados desde fuera de la propia aplicación (inconsistencias, etc.).


Normalización de relaciones

La teoría de normalización, desarrollada por Codd en 1972, se fundamenta en una serie de formas normales (FN)Inicialmente Codd definió 3 formas normales: 1FN, 2FN y 3FN. Aunque mas tarde se han incluido otras (FNBC, 4FN y 5FN). 

Cada una de las distintas FN exige que se cumplan una serie de condiciones distintas sobre todas las relaciones del modelo. Todas las FN se incluyen en una jerarquía, de forma que una relación que esta en iFN, también está en (i-1)FN. Por ejemplo, una relación en 2FN también esta en 1FN. Aunque no se cumple la inversa, por tanto, una relación en 1FN no tiene por que estar en 2FN (aunque podría estarlo).

El proceso de normalización es un proceso mecánico que, siguiendo unas reglas que definiremos a continuación, reemplaza un conjunto inicial de relaciones por otro conjunto final de relaciones, equivalente (mismos atributos, mismas tuplas y mismas dependencias), pero con una estructura mas simple

Como resultado de aplicar el proceso de normalización, se obtiene una BD equivalente y con numerosas ventajas:
  • optimiza el espacio de almacenamiento
  • elimina las redundancias de datos 
  • al eliminar redundancias, se evitan inconsistencias
  • mejora la independencia de los datos
  • elimina problemas en operaciones de inserción, actualización y borrado
La redundancia de datos es mala porque nos hace desperdiciar espacio en disco, lo que influye en un mayor coste (€/byte), y en un incremento del tiempo de acceso (seg/byte). Ademas, la redundancia crea problemas de mantenimiento. La operación de actualización de los datos redundantes se debe hacer de la misma forma exactamente en todas las ubicaciones del dato redundante, o pronto aparecerán las primeras inconsistencias de datos.

Y llegados a este punto,
por fin encontramos el objetivo con el que inicié la escritura de este post: explicar los pasos que debes realizar para normalizar un diseño lógico hasta su tercera forma normal (3FN). Todo lo que hemos explicado hasta este momento era necesario para centrar el objetivo de este post.


La primera forma normal 1FN

Una relación esta en 1FN si y solo si todos sus atributos son atómicos.

Se habla de atomicidad en el sentido de "indivisible". Cada atributo debe contener un único valor de su dominio, en el sentido semántico, de modo que la descomposición de un dato atómico produce una pérdida de significado.

Un ejemplo tipico que incumple la primera forma normal 1FN es cuando en un campo de texto metemos varios valores del mismo dominio, como por ejemplo 3 números de teléfono.

    TABLA CLIENTES
    IDCliente       Nombre      Telefono
    45              Francisco   444444444
    275             Miguel      555555555,666666666,777777777


Una variante del caso anterior, también incorrecta, consiste en separar los campos de la lista de teléfonos en varias columnas. En el ejemplo anterior, sería tener el campo telefono1, telefono2, .... y asi. Este fallo de diseño es incluso peor que el anterior, pues habrá muchos campos nulos y en el caso de necesitar mas, tendríamos que redimensionar la tabla con un nuevo campo (telefono3).

    TABLA_CLIENTES
    IDCliente       Nombre      Telefono1       Telefono2       Telefono3
    45              Francisco   444444444       NULL            NULL
    275             Miguel      555555555       666666666       777777777


¿Como se resuelve? La regla dice lo siguiente:

    R(A,B,C,V) tal que PK(A,B) y el atributo V viola 1FN

Se obtienen dos relaciones:

    R1(A,B,C), PK(A,B)
    R2(A,B,V), PK(A,B), FK(A,B) references R1


Aplicando la regla anterior, se obtienen dos relaciones:

    TABLA_CLIENTES
    IDCliente       Nombre
    45              Francisco
    275             Miguel


    TABLA_TELEFONOS_CLIENTE
    IDCliente       Telefono
    45              444444444
    275             555555555
    275             666666666



Dependencia funcional entre atributos

Antes de continuar con 2FN y 3FN necesitamos introducir el concepto de DEPENDENCIA FUNCIONAL entre los atributos de una relación.

Los atributos de una relación los elegimos nosotros como diseñadores de la BD. Pero las dependencias entre atributos no es sencillo identificarlas, ya que requiere un analisis de las interrelaciones entre atributos, y la intuición a veces no es suficiente para encontrar y clasificar todas las dependencias (en ocasiones la BD modela conocimiento que escapa a nuestra inteligencia, o incluso peor, al sentido común).

Estas dependencias son consecuencia de los objetos del mundo real que describen las relaciones, y no de los valores actualmente almacenados en la relación. Por tanto, si tenemos una relación de vehiculos como la siguiente:

    TABLA_VEHICULOS
    Modelo          Cilindrada   Color
    Seat Leon       1900         Rojo
    Citroen XZ      1900         Rojo
    Suzuki Vitara   1900         Rojo


y en un momento dado, todos los coches de 1900cc son de color rojo, no podemos afirmar que existe una dependencia entre los atributos Color y Cilindrada, ya que se trata de un hecho casual. Por tanto, para buscar dependencias funcionales, no se deben analizar los datos de la relación, sino las entidades abstractas a los que se refieren esos datos.

Las dependencias funcionales se pueden dar entre atributos o entre subconjuntos de atributos. De forma genérica, siendo {X} e {Y} dos subconjuntos de atributos de una relación, diremos que {Y} tiene una dependencia funcional de {X}, o que {X} determina a {Y}, si cada valor de {X} siempre tiene asociado el mismo valor de {Y}.

La dependencia funcional se representa como {X} ---> {Y}

El hecho de que {X} determine a {Y} no quiere decir que conociendo {X} sabemos el valor de {Y}, sino que en la relación indicada, cada vez que {X} tome un valor determinado, {Y} en la misma fila tomara siempre el mismo valor.

Por ejemplo, si tenemos una relación clientes como la siguiente:

    TABLA_CLIENTES
    Dni                 Nombre              Edad
    40145496H           Sergio Garcia       26
    18817495B           Ania Rodriguez      48
    33133473H           Hulk Hogan          48


podemos afirmar que {Dni} determina a {Nombre}, puesto que cada vez que {Dni} tome un valor determinado, el {Nombre} en la misma fila tomara siempre el mismo valor. Sin embargo, no podemos decir que {Edad} determine a {Dni}, puesto que para un mismo valor de {Edad}, (48 años), dos {Dni} diferentes.

Diremos que la dependencia funcional {X} ---> {Y} es completa si {Y} depente de todos los atributos de {X}, no de ningún subconjunto de {X}.

Las dependencias funcionales son restricciones de integridad sobre los datos. Conocer las dependencias funcionales en el momento del diseño de la base de datos permite crear mecanismos para evitar la redundancia (y los potenciales problemas de integridad que eso conlleva) y mejorar la eficiencia.


La segunda forma normal 2FN

Una relación esta en 2FN si esta en 1FN y todos los atributos que no forman parte de la clave candidata dependen completamente de la clave candidata (y no de un subconjunto de esta). Dicho de forma simple, los atributos que no aporten información directa sobre la clave primaria, deben almacenarse en una relación separada. 

Veamos un ejemplo que no está en 2FN:

    TABLA_LINEAS_PEDIDO
    IDCliente   IDProducto      Cantidad        Nombre_producto
    29          42              1               Zapatillas deportivas de tenis
    29          10              2               Zapatillas deportivas de rubgy
    46          9               5               Balón reglamentario de baloncesto
    204         42              1               Zapatillas deportivas de tenis
    144         10              1               Zapatillas deportivas de rugby


En la tabla de lineas de pedido, la única clave candidata es la formada por los atributos [IDCliente,IDProducto].

El campo Cantidad es totalmente dependiente de la clave candidata, puesto que cada cliente compra de un producto una cantidad dada. Por tanto:

    {IDCliente,IDProducto} ---> {Cantidad}

En cambio, el campo Nombre_producto NO es totalmente dependiente de la clave candidata, puesto que el Nombre_producto solo depende del IDProducto, pero no
del IDCliente.

    {IDProducto} ---> {Nombre_producto}

Puesto que NO todos los atributos que no forman parte de la clave candidata dependen completamente de la clave candidata (Nombre_producto solo depende de un subconjunto de la clave candidata), la tabla TABLA_LINEAS_PEDIDO no esta en segunda forma normal 2FN.

Si dejaramos esta tabla tal y como esta, tendriamos una redundancia de datos innecesaria en el atributo Nombre_producto. Y ademas, podríamos crear inconsistencias de datos si cambiamos el campo Nombre_producto de un registro de la tabla. ¿Cual sería el Nombre_producto del IDProducto=42, si ese nombre es distinto en varios registros de la tabla?

¿Como se resuelve? La regla dice lo siguiente:

    R(A,B,C,D) tal que PK(A,B) y {R.A} ---> {R.D}

es decir, un atributo R.D de la tabla R no depende totalmente de la clave primaria PK(A,B), solo de una parte de esa clave primaria.

Se obtienen dos relaciones:

    R1(A,D), PK(A)
    R2(A,B,C), PK(A,B), FK(A) references R1


Aplicando la regla anterior, se obtienen dos relaciones:

    TABLA_PRODUCTOS
    IDProducto  Nombre_producto
    9           Balón reglamentario de baloncesto
    10          Zapatillas deportivas de rugby
    42          Zapatillas deportivas de tenis


    TABLA_LINEAS_PEDIDO
    IDCliente   IDProducto      Cantidad
    29          42              1
    46          9               5
    204         42              1
    144         10              1


Estas dos tablas si estan en 2FN.


La tercera forma normal 3FN.

Una tabla esta en 3FN si esta en 2FN y todos los atributos que no forman parte de la clave candidata dependen únicamente de la clave candidata. Dicho de otro modo mas facil de entender, no existen dependencias funcionales entre los atributos que no forman parte de la clave candidata.

Imagina una tabla que registra ciudades y datos sobre esas ciudades:

    TABLA_CIUDADES
    IDCiudad   Nombre    País      Continente
    1          Paris     Francia   Europa
    2          Lion      Francia   Europa
    3          Berlin    Alemania  Europa
    4          Pekin     China     Asia
    5          Bonn      Alemania  Europa


En el ejemplo anterior, la clave candidata es IDCiudad. Podemos ver que existe una dependencia funcional entre los atributos Pais y Continente, ya que cada Pais pertenece siempre al mismo Continente. Y puesto que ni Pais ni Continente forman parte de la clave candidata (IDCiudad), la tabla no esta en 3FN.

¿Como se resuelve? La regla dice lo siguiente:

    R(A,B,C) tal que PK(A) y {R.B} ---> {R.C}

es decir, un atributo R.C depende funcionalmente de R.B, y ninguno de ellos forma parte de la clave primaria PK(A).

Se obtienen dos relaciones:

    R1(B,C), PK(B)
    R2(A,B), PK(A), FK(B) references R1


Aplicando la regla anterior, se obtienen 2 relaciones:

    TABLA_PAISES
    Pais        Continente
    Francia     Europa
    Alemania    Europa
    China       Asia


    TABLA_CIUDADES
    IDCiudad   Nombre    País
    1          Paris     Francia
    2          Lion      Francia
    3          Berlin    Alemania
    4          Pekin     China
    5          Bonn      Alemania


Si no hubiéramos normalizado, tendríamos que en una fila de la tabla, el Continente de Francia es Europa, pero por error podríamos tener en otra fila de la tabla que el Continente de Francia es Asia (nos cargamos la integridad de los datos). Además, si la tabla mantuviera centenares de miles de registros, tendríamos información duplicada muchisimas veces (redundancia).


El lenguaje estructurado de consultas

El lenguaje que entienden los SGBD relacionales y desde el que se comunica nuestra aplicación con la BD se llama SQL (Structured Query Language). Este lenguaje permite realizar todas las operaciones de consulta, inserción, actualización, borrado y administración de una BD relacional.

Mediante el API adecuado, podremos usar el lenguaje SQL desde nuestra aplicación escrita en C/C++ para acceder a la BD.

No hablaremos mas sobre SQL en este documento. Quizás en otro post me anime a hablar sobre este lenguaje.

Seguidores