Archivo

Archivo para la categoría ‘kodegeek’

Mis primeras 4 millas: NYRR Gridiron Classic (4M) / Longest Football Throw Competition

Domingo, 5 de febrero de 2012

Just before  the race
La calma antes de la tormenta

Hoy es el domingo del Super Tazón aquí en los Estados Unidos y para celebrarlo me lancé una carrera de 4 millas; En esta ocasión me puse mi franela de la edición del torneo de este año: Giants contra Patriots.

Realmente el foco de esta carrera no es correr rápido sino constante, ya que es parte de mi entrenamiento para el medio maratón de este año. También me sirve como trampolín para el maratón de New York en el 2013 (esta es mi carrera #2 de las 9 que tengo que completar para tener mi entrada asegurada).

Coffee way before the race
Una de las bebidas que siempre consumo antes de correr o levantar pesas es el café. Natural, con buenas propiedades curativas y sobre todo un excelente estimulante para rendir al máximo

El día de la carrera estuvo frio y con mucho viento; Yo decidí ponerme menos capas de ropa para evitar recalentarme (algo que pasa a menudo cuanto entreno). Además de eso he venido probando un par de cosas para mejorar mi rendimiento:

  • Tomo jugo de remolacha antes de mi entrenamiento: Según varios articulos que leí por allí, dicen que ayuda a incrementar el oxido nítrico en la sangre, y demora la fatiga ya que los musculos consumen menos oxigeno. No puedo aseverar que produce resultados asombrosos pero no es tan costoso y cualquier cosa que pueda utilizar para mejorar mi desempeño (mientras que sea natural) sirve
  • Estrené todo el tiempo hasta esta carrera con mis Vibram 5 fingers. No he tenido problemas severos en las pantorillas como el año pasado y poco a poco he ido aumentando mis millas. Estoy siendo cuidadoso, pero hoy fué la prueba definitiva corriendo con ellos en una carrera de 4 millas y me siento super bien :-)

They say that beet juice helps to improve endurance. Is all natural so why not?
Tomando jugo de remolacha, ¿será que me ayudara aunque sea en %1 a mejorar mi desempeño? No pierdo nada con probar

Mi idea de la carrera era tomarme las cosas con calma, sin esforzarme ya que después de todo debía correr hoy 5 millas y no 4 para mi entrenamiento para el medio maratón (ya les contaré que plan estoy siguiendo). Así que lo que hice fué calentar corriendo una milla suave y el resto del recorrido oficial de la carrera.

Tired but happy, did a PR today: AGE % = 58.09 (60% is local competition)
Cansado pero contento al final de la carrera. Tenía el presentimiento de que había hecho un tiempo decente

Al final logré un pequeño récord ya que en mi grupo de edad logré quedar en el renglón de 58% (%60 es competencia local. Tengo que seguir empujando para llegar allí):

Last Name First Name Sex/
Age
Bib Team City State Country Overall
Place
Gender
Place
Age
Place
Net
Time
Pace/
Mile
AG
Time
AG
Gender
Place
AG %
Nunez Zuleta Jose V M39 4631 0 DARIEN CT USA 1173 959 174 0:30:28 07:37 0:29:01 1097 58.09

Vienen más carreras, poco a poco con un clima más cálido :-)

correr, kodegeek, vida sana , , , , , , , ,

¿Cuanto esfuerzo poner al correr? Usando un monitor de pulsaciones

Domingo, 25 de diciembre de 2011

Primero que todo, ¡Feliz navidad!. Hoy me dieron de regalo un monitor de pulsaciones (Polar Link, compatible con Nike GPS awatch), la idea es mantener mis niveles de esfuerzo constantes y en niveles seguros.

Así que hoy me decidí a probarlo con una carrera corta de sólo dos millas, ni tan rápido ni tan lento; La configuración del dispositivo fué trivial y aunque se sintió raro tener una cinta en el pecho durante los primeros 5 minutos luego la sensación se disipó y pude olvidarme por completo que el aparato estaba allí.

La teoría sobre cuales rangos son seguros la pueden encontrar en este enlace, pero si usted es un corcho como yo ya seguro tiene un script para hacer las conversiones:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
# Heart rate range calculator, for both aerobic and anaerobic ranges
# http://kodegeek.com/blog
# http://www.livestrong.com/article/179970-a-healthy-heart-rate-while-running/
def heartRate(age, anaerobic=False):
        maxHearthRate = 220 - age
        bound = []
        if not anaerobic:
                bound.append(0.50 * maxHearthRate)
                bound.append(0.85 * maxHearthRate)
 
        else:
                bound.append(0.80 * maxHearthRate)
                bound.append(0.90 * maxHearthRate)
        return bound
 
if __name__ == "__main__":
        import sys
        args = sys.argv[1:]
        if len(args) == 2:
                res = heartRate(int(args[0]), {'true': True, 'false': False}.get(args[1].lower()))
                print "%s,  %s " % (res[0], res[1])

Por ejemplo, para alguien de mi edad estos deberian ser los rangos aeróbicos y anaeróbicos:

1
2
3
4
5
6
 
Macintosh:python josevnz$ python com/kodegeek/fitness/heartrate.py 38 false
91.0,  154.7 
Macintosh:python josevnz$ python com/kodegeek/fitness/heartrate.py 38 true
145.6,  163.8 
Macintosh:python josevnz$

Según el monitor, en promedio mis pulsaciones promedio estuvieron en 165, solamente estuve un %38 del tiempo dentro de mi rango aeróbico. Muy alto, al menos que este leyendo algo mal. Ahora me sale hacer mi tarea :-)

kodegeek, python, vida sana

Corriendo descalzo (Barefoot running): ¿Moda o la mejor forma de correr?

Lunes, 12 de diciembre de 2011

Done running at 6:00 A.M., 32F. My mask froze
Después de correr a cero grados centigrados con mis zapatos mínimos. Ningún problema, excepto la mascara congelada :-)

En mi caso no es la historia de un super atleta sino de un gocho el cual quiere entender porqué no puede correr sin dolor grandes distancias. Aquí les cuento como va:

El drama
Quienes siguen este blog saben que me gusta correr, y también saben que de unos meses para acá he estado sufriendo de ‘shin splints‘ de manera casi constante. Si bien los zapatos y el tratamiento médico que comencé me han ayudado de alguna manera no han podido curar mi aflicción del todo.

¿Soy demasiado atlético para mis pobres pies (no realmente)? Obviamente tengo un problema en la forma en que corro, pero los doctores no me han dado una forma precisa para corregir mi deficiencia. Quien terminó de darme un buen consejo fué el coordinador de las clases de velocidad del NYRR, quien entre otras cosas me pregunto si corría de puntillas (yo le dije que no sólo eso sino que además caminaba así) y si tenía otros problemas como ‘algo’ de pies planos. Sin embargo su recomendación (además de la visita al doctor) fué la misma: Aditamento ortopédico o plantillas para los zapatos, hielo y elevación, aspirina y zapatos con control de movimiento.

Todos paliativos, pero ¿hay alguna forma en la cual yo puedo mejorar la forma en la que corro?

El primer paso hacia el cambio es la negación

En la oficina tengo un compañero de trabajo el cual ya antes me habia mencionado como corría en Central Park con sus Vibran Five Fingers (VFF). Es muy inteligente, algo excéntrico, pero todo lo que hace sigue una linea racional. No corre descalzo pero si con zapatos mínimos ya que según el le ayudaron a corregir su forma de correr.

Como buen crítico dudé de su aviso; No podía creer que las extremidades del hombre estuvieran adaptadas para soportar la tortura de correr sobre pavimento y concreto sin algo de amortiguamiento (ningún hombre de las cavernas vivió más de 20 años en promedio). Para rematar, el doctor que vio mi pierna se refirió a correr descalzo como ‘una moda que va y viene cada 5 años’.

Sin embargo, aún seguía pensando que quizas toda esa gente que corría descalzo habían descubierto algo que yo no sabía.

Pero que carajo, yo tengo un problema al correr y que se la puede hacer, ¿verdad?

Abre los ojos, o mejor aún, aprende a escuchar

La revelación de como correr mejor me vino después de una carrera de 5K que hice mi amigo Ricardo Pravia, el cual había abandonado el correr por varios meses, no por problemas de dolor sino por motivos personales (entre esos jugar Poker en línea :-) ). Sin animo de ofender, el no es precisamente el tipo atlético y sin embargo disfrutaba el correr cuando lo hacia (yo mientras tanto estaba más y más obsesionado por mi falta de éxito al eliminar el dolor constante en mi pierna), además de hacerlo sin dolor alguno.

Yo le pregunté como estaba entrenando; El me respondió más o menos lo habitual pero lo que me llamó la atención fué que en vez de usar unos zapatos con mucho refuerzo como yo el en cambio estaba usando unos zapatos con soporte mínimo, unos Nike free:

Yo: Chamo, ¿esos zapatos de ofrecen protección? Parecen zapatos de gimnasio, te vas a joder las piernas, yo por ejemplo…
El: (sonriendo) Son zapatos ‘barefoot’. Tienen soporte mínimo, son especiales para correr. Nunca he tenido problemas con ellos.
Yo: ¿Y no te duele al pisar el pavimento?
El: Los zapatos te enseñan a correr. Si pisas mal te duele de una vez y a juro tienes que corregir la forma. Corres de manera delicada

Me quedé pensando por varios segundos. Ricardo siempre ha estado un paso adelante que yo en algunas cosas, por ejemplo reemplazando Linux o Windows con OSX, aprendiendo otros lenguajes de programación como Python. En cierta forma el es un alpha geek sin saberlo.

¡Coño!, eso es. Esa era la explicación de porqué había tanta gente corriendo con esos zapatos o sin zapatos. Tu cuerpo se encargaba de bajar el rito, o mejor, de ajustar el ritmo y la forma.

¿Pero y es verdad? ¿Qué pasa si corro descalzo y me clavo un vidrio o me fracturo el pié?

La respuesta vino unos días después de la carrera

El día después

Unos días después de la carrera Ricardo me regaló por Amazon Kindle, el libro ‘Born To Run‘, de Christopher McDougall; El libro básicamente es la historia de la tribu ‘Tarahumara’ de indios Mexicanos los cuales corren grandes distancias sin usar calzado.

Debo admitir que el libro comienza mal; Parece más un relato sensacionalista con ideas robadas de las películas de Indiana Jones (tiene todos los elementos, como tribu perdidas, peligros como el desierto o narcotraficantes y sobre todo personajes muy pero muy excéntricos como Caballo Blanco).

Pero mi opinión del libro cambió rápidamente a medida que me adentraba más y más en el libro: McDougall también es un corredor, el cual tenia dolor constante. Los consejos tradicionales no lo ayudaron para nada y todo eso cambio cuando comenzó a correr descalzo; La historia de otros corredores excepcionales en el libro, también descalzos, además de explicaciones y referencias a trabajos de investigación científica me terminaron por convencer de que quizas esto era algo que debería probar con cautela.

¿Seria posible experimentar una sensación de gozo tan profunda al correr como la que experimentaban todos estos corredores en el libro? Después de todo, en el pasado nosotros cazábamos a nuestras presas de esa manera.

Por cierto, la historia de la carrera en el libro es grandiosa, aún si usted no cree en el movimiento de correr descalzo.

Investigación, investigación: Barefoot Bob y otras cosas

Muy bien, otra gente lo hace pero ¿como lo hacen? Decidí buscar entonces la biblia de los corredores descalzos y me encontré que casi todas las referencias caían en Ken Bob Saxton (uno de los personajes del libro ‘Born to Run’). Me compre su libro ‘Barefoot Running Step By Step’ y allí comenzó mi investigación.

Debo comenzar diciendo que usted deberá suprimir su primera impresión de Bob; Es se ve como el típico hippie de California, con pelo y barba blancas largas además de algo de sobrepeso. No es la típica figura atlética de corredores de largas distancias además de que su libro está cargado de demasiadas referencias a si mismo. Tampoco creo que usted quiera leer sobre ‘barefoot running’ como si este fuera religión (por ejemplo el se refiere a quienes usan VFF como ‘fake barefoot runners’).

Y sin embargo hay mucho de valor en su libro: Técnicas detalladas y anécdotas (de él y otros corredores) sobre como abordar esta nueva forma de correr sin lesionarse y sobre todo disfrutándolo. Si bien Bob es un ‘barefoot runner’ puro (por ejemplo el sostiene que los zapatos mínimos como VFF lo que hacen en más mal que bien), también comparte experiencias sobre corredores que usan modo mixto como por ejemplo zapatos normales, VFF y correr descalzo como parte de su entrenamiento.

Y es esta última parte la que me terminó de convencer: No hace falta correr descalzo todo el tiempo pero si debe ser parte importante del entrenamiento. De esa forma se pueden corregir problemas como dolor al correr, una forma de transición segura.

La única forma de saber era dejar los libros en el sofá y salir a correr. Para ello me compré mi par de VFF en una tienda especializada. Los zapatos se sentían cómodos, pero me tomo 15 minutos ponérmelos la primera vez. Lo otro es que yo lucia como un gorila con mis nuevos zapatos, no podía dejar de pensar lo curioso que me veía con ellos.

Y sin embargo, salí con mis nuevos zapatos puestos y dispuesto a probar mis nuevas teorías sobre como correr mejor.

Mis primeros pasos, mis primeros carajazos y lo que viene

barefoot running
Mis dedos se congelaron después de una carrera de una milla alrededor de un parque, después de llover

Comencé suave, nada de salir a correr con ellos. Por dos semanas me los puse para ir al gimnasio y para correr en la máquina caminadora por no más de una milla. La sensación era distinta, contacto completo con el piso pero sin ninguna incomodidad. En la caminadora me vi obligado a correr distinto, nada de aplastar el frente de mis dedos contra el piso como estaba acostumbrado y con menor velocidad que antes (poco a poco la fui incrementando).

A la tercera semana me decidí a correr una milla en la grama, para ello me busque la cancha de un colegio que queda cerca de donde vivo. Hubo cierta incomodidad al comenzar a correr y al día siguiente me molestaban las pantorrillas y los tobillos, pero no mucho.

Mas caminadora durante la semana y el siguiente sábado corrí una milla en la grama; Ese día la temperatura estaba a -1C y habia llovido el día anterior por lo que la grama estaba mojada. Cuando llevaba dos vueltas alrededor de la cancha me tuve que detener de pronto debido a un intenso dolor en todos los dedos de mis pies, se me habían congelado por el agua ya que estos no son a prueba de agua.

Cojeando hasta la casa tomé la determinación de que la siguiente carrera sería es asfalto, una milla. No más dedos congelados, no señor.

La siguiente vez corrí 2.3 millas en asfalto, sin ninguna novedad. Luego 3 millas. Nada de dolor, con una velocidad comparable a la obtenida usando mis zapatos con ‘stability control’ de Nike, según el GPS.

Pienso seguir mejorando sólo 3 millas a la vez o mientras hago ‘speed work’ mientras entreno para mi primer 10K el año que viene y después de allí voy a incrementar mis millas en los VFF.

¿Que viene ahora?

Pienso ir con cuidado. La otra vez corriendo en NYC, le camine por completo a un montón de vidrio molido que alguien dejó por allí, en plena tormenta, y si no es por los zapatos bueno…; También está mi anécdota de los dedos congelados y definitivamente no quiero llegar a la historia de las fracturas estructurales.

Así que poco a poco, mejorando la condición y ya les contaré si esta forma de atacar mis entrenamiento mejora o no mi problemas en las piernas.

correr, kodegeek, vida sana

¡Llevo recorridos 200 millas (o 321.8688 kilómetros)!

Sábado, 22 de octubre de 2011

Desde que comencé a correr en 1ero de Mayo de este año hasta la fecha he recorrido 200 millas o 312.8688 kilómetros. Para darles una idea de cuanto es eso:

  • La distancia entre las ciudades de Mérida y Trujillo es de 203 kilómetros
  • La distancia entre las ciudades de Mérida y San Antonio es de 298 kilómetros
  • La distancia entre las ciudades de Caracas y Puerto La Cruz es de 320 kilómetros
  • La distancia entre Darien, CT y Manhattan, New York (Central Park) es de 38 millas (llevo aproximadamente 5 viajes a pié)

Rompí la marca de las 200 millas con una carrera con velocidad 8’20 millas / mi minuto, antes de hacer ejercicio de resistencia. Mañana me toca una carrera un poco más larga (y lenta) de 6 millas, estoy intentando mis primeros 10K :-)

Y ya paré de contar. Actualizaré el blog con una entrada como esta cuando llegue a 500 millas.

–José

kodegeek, vida sana , ,

Hackeando mis datos en NikeRunning.com

Miércoles, 12 de octubre de 2011


Tipos de terreno para todas mis carreras, desde NikeRunning, mostrado con JavaFX

Desde que comencé a correr he utilizado a NikeRunning.com de una u otra manera; Primero comencé con mi Itouch y ahora lo utilizó con el NikeWatch.

Sin embargo, el sitio de Nike es un poco fastidioso; El sitio web está escrito en Flash (lo cual lo hace pesado), tiene gráficos limitados pero lo mas inconveniente es que mis datos están cautivos en el sitio web. Según ellos ya llevan tiempo trabajando en una migración que eliminará Flash:

Hello Everyone,

Thank you all for your feedback.

To let everyone know, we are in the process of revamping our website. We are in transition to move away from flash to HTML. The goal is to be faster and more efficient.

We thank you for your patience as we update our sites. There is not an estimated time of when the transition will be fixed, but I can assure you that I’ve seen parts of the site and it’s looks and feels amazing.

Stay tuned!

Buscando un poco en Google me conseguí conque se puede obtener toda la información de las carreras (siempre y cuando estas esten marcadas como públicas) usando el siguiente URL:

1
http://nikerunning.nike.com/nikeplus/v1/services/widget/get_public_run_list.jsp?userID=IDENTIFICADOR_DE_USUARIO

El archivo resultante está en formato XML.

Pero, ¿y de donde obtenemos el identificador del usuario? Es sencillo, simplemente vaya a nikerunning.nike.com y una vez que entre con su usuario y clave al sitio web haga click sobre una de sus corridas. El URL resultante se verá como esto:

1
http://nikerunning.nike.com/nikeos/p/nikeplus/en_US/plus/#//runs/gps/IDENTIFICADOR_DE_USUARIO/299193444/

En donde IDENTIFICADOR_DE_USUARIO es el número mágico que queremos usar.

Se me ocurrió por ejemplo escribir un pequeño programa en Jython y JavaFX el cual muestra la distribución de tipos de terreno encontrados mientras corrí:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env jython
# Author: Jose Vicente Nunez Zuleta, josevnz@kodegeek.com
# This script parses the user run data and creates a simple distribtion by terrain types
# See: http://nikerunning.nike.com/nikeos/p/nikeplus/en_EMEA/plus/#//dashboard/
# Nike and Nikeplus/Nike+ are trademarks owned by Nike.
# License: BSD
import sys
from javafx.application import Application
from javafx.collections import FXCollections
from javafx.collections import ObservableList
from javafx.scene import Scene
from javafx.stage import Stage
from javafx.scene.chart import PieChart
from javafx.scene import Group
from com.kodegeek.fitness.nikerun.query import CannedQuery
from com.kodegeek.fitness.nikerun.public import PlusPublicService
 
class TerrainTypesChart(Application):
 
    def __getData__(self):
        args = self.getParameters().getRaw()
        pServ = PlusPublicService(args[0])
        data = pServ.getUserData()
        dp = CannedQuery('string', data)
        return dp.getTypesOfTerrain()
 
    def start(self, stage):
        scene = Scene(Group())
        stage.setTitle("Terrain types found in all races")
        stage.setWidth(500)
        stage.setHeight(500)
 
        count = self.__getData__()
        data = [PieChart.Data(key, value) for (key, value) in count.iteritems()]
        pieChartData = FXCollections.observableArrayList(data)
        chart = PieChart(pieChartData)
        chart.setTitle("Terrain types found")
 
        scene.getRoot().getChildren().add(chart)
        stage.setScene(scene)
        stage.show()
 
if __name__ == "__main__":
        Application.launch(TerrainTypesChart().class, sys.argv[1:])

La clase ‘PlusPublicService’ no es más que un simple cliente GET el cual se baja los datos del sitio de Nike:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
!/usr/bin/env jython
#
# Author: Jose Vicente Nunez Zuleta, josevnz@kodegeek.com
# See: http://nikerunning.nike.com/nikeos/p/nikeplus/en_EMEA/plus/#//dashboard/
# Nike and Nikeplus/Nike+ are trademarks owned by Nike.
# License: BSD
#
from httplib import HTTPConnection, HTTP_PORT
import sys
 
__URL__ = 'nikerunning.nike.com'
__SERVICE__ = '/nikeplus/v1/services/widget/get_public_run_list.jsp?userID='
 
class PlusPublicService:
 
        def __init__(self, userId, port = HTTP_PORT):
                self.service = __SERVICE__ + userId
                self.userId = userId
                self.port = port
 
        def getUserData(self, debug=0):
                data = None
                con = HTTPConnection(__URL__, self.port)
                con.set_debuglevel(debug)
                con.request('GET', self.service)
                response = con.getresponse()
                if response.status == 200:
                        data = response.read()
                else:
                        raise Exception("Error. Status = %s, reason = %s" % (response.status, response.reason))
                con.close()
                return data
 
if __name__ == "__main__":
        argv = sys.argv[1:]
        if len(argv) > 0:
                pServ = PlusPublicService(argv[0])
                print "%s" % pServ.getUserData(8)
        else:
                print "NikeRunning user id is required!"
                sys.exit(192)

Y para procesar mis datos utilizo un poco de XPATH en la clase ‘CannedQuery’ la cual tiene un método el cual se encarga de crear la distribución para los distintos tipos de terreno:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/usr/bin/env jython
# Author: Jose Vicente Nunez Zuleta, josevnz@kodegeek.com
# See: http://nikerunning.nike.com/nikeos/p/nikeplus/en_EMEA/plus/#//dashboard/
# Nike and Nikeplus/Nike+ are trademarks owned by Nike.
# License: BSD
 
from xml.dom.minidom import parse, parseString
from xml.etree import ElementTree
import sys
 
class DataParser(object):
 
        def __init__(self, type='string'):
                self.type = type
 
        def __parseDomFile__(self, file):
                return parse(open(file, 'r'))
 
        def __parseDomString__(self, string):
                return parseString(string)
 
        def __parseXpathFile__(self, file):
                return ElementTree.parse(file)
 
        def __parseXpathString__(self, string):
                return ElementTree.fromstring(string)
 
        def __getDom__(self, source):
                if self.type == 'string':
                        return self.__parseDomString__(source)
                else:
                        return self.__parseDomFile__(source)
 
        def __getTree__(self, source):
                if self.type == 'string':
                        return self.__parseXpathString__(source)
                else:
                        return self.__parseXpathFile__(source)
 
class CannedQuery(DataParser):
 
        def __init__(self, type, source):
                super(CannedQuery, self).__init__(type)
                self.source = source
                self.terrainMap = { '0': 'Not defined', '1': 'Road', '2': 'Trail', '3': 'Treadmill', '4': 'Track' }
 
        def getTypesOfTerrain(self):
                tree = self.__getTree__(self.source)
                count = {}
                for elem in tree.findall(".//terrain"):
                        key = 'Never collected'
                        if elem.text in self.terrainMap:
                                key = self.terrainMap[elem.text]
                        if key in count:
                                count[key] += 1
                        else:
                                count[key] = 1
                return count
 
if __name__ == "__main__":
        argv = sys.argv[1:]
        if len(argv) > 0:
                dp = CannedQuery('file', argv[0])
                count = dp.getTypesOfTerrain()
                print "%s" % count

Pienso abrir un proyecto con todas estas clases de Python (Jython) en unos pocos días. Quiero agregarle un par de cosas más antes de soltarlas al aire libre :-)

internet, java, javafx, kodegeek, vida sana

Opinión de libros: The Long Run (O como Matt Long nos muestra que si se puede)

Domingo, 2 de octubre de 2011

Normalmente no leo biografías de nadie; No me malentiendan, la historia de individuos que resaltan por haber hecho cosas extraordinarias es algo que debería motivarnos a ser mejores a todos.

Simplemente no es lo mio. Pero la historia del bombero y atleta Matt Long es digna de una película de super heroes.

Este libro es especial dado lo inusual de su personaje; Imagínese que usted es un corredor / atleta que se hizo desde cero, comenzando primero a pujar para poder correr hasta lograr conquistar varias metas: El maratón ING de New York (el más famoso del mundo), el de Chicago Boston (con su fama de invitar sólo a los más rápidos) y luego el triatlón Iron Man (si nadar, montar bicicleta y correr por varias millas no lo intimidan entonces usted seguro no es normal).

Todo va muy bien hasta un fatídico día en el cual en vez de entrenar con sus amigos es atropellado por un autobús el cual casi lo deja muerto, todo gracias a un paro de transporte en la gran manzana y a un conductor descuidado.

Pero Matt no se rindió. Peleó por recuperarse y al final logró volver a correr el maratón de New York y no sólo eso, logró hacer otro Iron Man.

Su lucha no fué fácil, ya que le dieron sólo %5 de posibilidades de éxito; Leer sus dudas y dolor físico es angustiante pero lo que realmente lo que cautiva de este libro es que aún con sus dudas el pudo salir a adelante y cambiar su suerte.

Mucha gente se ríe cuando les digo que me levanto a las 4:00 de la mañana 3 veces a la semana para entrenar en el gimnasio. Yo les digo que eso no es nada, no es un esfuerzo de verdad. Si no lean la historia de Matt Long para que vean que si se puede; Si eso no los inspira a ser mejores entonces no se que pueda :-)

kodegeek, vida sana , , , , , , ,

Es el tiempo de recuperación, idiota

Jueves, 29 de septiembre de 2011

O algo así es como dice el articulo que apareció en la revista del mes de Octubre del 2011 ‘Running Times’, del atleta y escritor Peter Magil;. Allí el nos muestra como calcular cuanto descansar después de un entrenamiento usando las tablas creadas por el científico Tom Schwarts.

Mi implementación en Python a continuación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env python
# Calculate days of recovery after a race. Based on the article appeared on the Running times magazine 
# "It's the Recovery Stupid" by Pete Magill, using Tom Schwartz tables
# author: josevnz@kodegeek.com
# http://kodegeek.com/blog
import sys
 
class Recovery:
 
        def __init__(self):
                self.__ages = { '20':0, '30':1, '40':2, '50':3, '60':4, '70':5, '80':6 }
                self.__fitnessLevel = { 'LOW':0, 'MEDIUM':1, 'HIGH':2 }
                self.__daysBetweenWorkouts = [
                        [ 4.0, 3.0, 2.5 ],
                        [ 5.0, 4.0, 3.0 ],
                        [ 6.0, 4.5, 3.5 ],
                        [ 7.0, 5.0, 4.0 ],
                        [ 7.5, 6.0, 4.5 ],
                        [ 8.0, 6.5, 5.0 ],
                        [ 9.0, 7.0, 5.5 ]
                ]
                self.__races = { '5K':0, '8K':1, '10K':2, '15K':3, '1/2 Mar':4, 'Mar':5 }
                self.__intensityWorkout = { 'EASY':0, 'MEDIUM':1, 'HARD':2 }
                self.__recoveryDaysAfterRace = [
                        [ 2, 3, 5 ],
                        [ 3, 5, 8 ],
                        [ 3.5, 6, 9 ],
                        [ 4, 7, 11 ],
                        [ 5.5, 9, 14 ],
                        [ 9, 17, 26 ]
                ]
                self.__adjustment = { '20':1.0, '30':1.1, '40':1.2 , '50':1.3, '60':1.4, '70':1.5, '80':1.6 }
 
        def getAgeBracket(self, age):
                try:
                        dAge = int(age)
                        if dAge < 0:
                                raise Exception("Invalid age value: %s" % age)
                        for bracket in [ 20, 30, 40, 40, 50, 70, 80 ]:
                                if dAge >= bracket and dAge < = (bracket + 9):
                                        return str(bracket)
                        # > 80 years
                        return 80
                except (Exception), exp:
                        raise Exception("Invalid age: %s" % age)
 
        def getDaysBetweenWorkouts(self, age, level):
                try:
                        bracket = self.getAgeBracket(age)
                        dBracket = self.__ages[bracket]
                        intensity = self.__fitnessLevel[level]
                        return self.__daysBetweenWorkouts[dBracket][intensity] * self.__adjustment[bracket]
                except (Exception), exp:
                        raise Exception("Invalid age or level: age=%s, level=%s" % (age, level))
 
        def getDaysAfterRace(self, age, race, level):
                try:
                        bracket = self.getAgeBracket(age)
                        dBracket = self.__races[race]
                        intensity = self.__intensityWorkout[level]
                        return self.__recoveryDaysAfterRace[dBracket][intensity] * self.__adjustment[bracket]
                except (Exception), exp:
                        raise Exception("Invalid age race type or level: age=%s, race=%s, level=%s" % (age, race, level))
 
if __name__ == "__main__":
        recovery = Recovery()
        arg = sys.argv[1:]
        days = 0
        if len(arg) == 2:
                days = recovery.getDaysBetweenWorkouts(arg[0], arg[1])
                print "Days: %2.2f, for age: '%s' and level: '%s'" % (days, arg[0], arg[1])
        elif len(arg) == 3:
                days = recovery.getDaysAfterRace(arg[0], arg[1], arg[2])
                print "Days: %2.2f, for age: '%s' and level: '%s', race=%s" % (days, arg[0], arg[2], arg[1])
        else:
                sys.exit(192)
 
# "com/kodegeek/fitness/recoveryrun.py" 76L, 2539C written

Así que por ejemplo, si corremos una carrera de 5K con todo y tenemos 35 años de edad:

1
2
3
Macintosh:python josevnz$ ./com/kodegeek/fitness/recoveryrun.py 35 5K HARD
Days: 5.50, for age: '35' and level: 'HARD', race=5K
Macintosh:python josevnz$

¿Y si no es una carrera, pero un entrenamiento fuerte y soy medianamente resistente?

1
2
3
Macintosh:python josevnz$ ./com/kodegeek/fitness/recoveryrun.py 35 MEDIUM
Days: 4.40, for age: '35' and level: 'MEDIUM'
Macintosh:python josevnz$

Por cierto, hoy es mi día de descanso entre entrenamientos. Así que es hora de ejercitar el lado Geek un poquito. Estoy pensando en abrir un nuevo proyecto de código abierto para ir dejando estos pedazos de código relacionados con correr y ejercicios de resistencia. ¿Les suena buena idea?

Bueno, hasta la próxima entrega.

–José

kodegeek, python, vida sana

Race for the cure Susan Komen Greater NYC: ¡Toda una sorpresa!

Domingo, 18 de septiembre de 2011

El comienzo

Race for the cure map
Hice el recorrido en 25:10

Después de ir al doctor y comenzar a recuperarme, decidí hacer esta carrera; La idea es celebrar el esfuerzo de las mujeres y hombres que han sobrevivido a un cáncer de seno, a la vez que se recaudan fondos para pelear contra esta variedad de la enfermedad.

Ya mi amigo Hengel (otro corredor Venezolano amigo mio) se habia inscrito, así que yo no tenia ninguna excusa para no correr. Además, después de eso el plan era hacer un almuerzo al aire libre en Central Park, al comienzo de Otoño cuando aún no es muy frío.

Nunca puedo dormir antes de una carrera; Esta no fué la excepción y después de comer mi desayuno (una buena mezcla de proteína y carbohidratos lentos) escribí lo siguiente en Facebook y Google+:

Race for the cure schedule so far:

- 5:00 AM: Breakfast and prepare race items
- 6:30 AM: Wake up Veronica and Sebastian
- Registration will open at 7:00 Am at 71 Street West in Central park. We will be there around 8:30 AM, no rush (I already got by BIB# 16539. How many people is in there?)
- 9:20 AM: Race starts for elite female runners and survivors only (yeah, males like me will have to suck it until 9:25 AM).
- 10:30 Runners award ceremony begins in Bandshell. Based on my previous two races I should not take more than 30 minutes to complete this one.

This year I’ll record some video (wait for the Flickr invite) and some photos as things develop. This race doesn’t have an official time, so unless I win (JAJAJA) I will have no way to know on which position I finish (so my new GPS time will have to be enough for my poor ego).

I’ll keep you guys posted!

Hengel Zambrano: I’ll call you to see where are we meeting before the race.

–José

Nada sabia yo que esta carrera iba a tener sorpresas preparadas.

Antes de la carrera

Llegamos a las 8:40 A.M. a Central Park, calle 71 oeste; Una ves entrados allí recordamos que había que estar a esa altura en el lado Este.

Había que atravesar un pedazo completo del parque para llegar allí.

¿Qué tan lejos puede ser? No es lo lejos sino lo complicado cuando tu hijo de 4 años está disfrutando del parque, jugando con los perros, recogiendo hojas; Después de hacer una parada obligatoria en el baño (más nervios que otra cosa) y de tomarnos un café caminamos a la salida.

Allí la realidad se encargo de recordarme lo descuidado que había sido, la salida de los corredores acababa de comenzar a las 9:20 A.M. y la mia era la siguiente en 5 minutos.

El problema era pasarle por encima a las 500 personas que tenia por delante de mi para llegar a la salida de la carrera, nunca habia visto tanta gente (vestida de rosado) en mi vida.

Inicio de la carrera

16539
Nunca subestime los imprevistos de una carrera

Comencé a trotar hacia la salida, luego a correr para luego detenerme abruptamente porque no se podía avanzar. Luego entro el pánico cuando el anunciador dijo lo siguiente:

Siento una lastima por los corredores que no salieron a tiempo ya que ahora ahora van a tener que lanzarse entre los que sólo vienen a caminar los 5 kilómetros

Coño, ¡Coño!, ¡están hablando de mi!.

Mi carrera anterior en el Yankee Stadium había sido un desastre y ahora esta estaba a punto de ser algo peor. Sin tiempo oficial y comenzando tarde con obstáculos, mi tiempo prometía ser el peor de todos.

Sin exagerar, me paralice por 5 segundos pensando que hacer después…

Mis piernas decidieron por mí; Comencé a correr lo más rápido que podía, empujando a quienes estaban adelante, rozándome de manera incomoda mientras trataba de buscar un espacio por donde pasar, pidiendo disculpas entre empujón y empujón mientras le rogaba a Dios que no me volaran la cara de un merecido golpe por no haber estado donde tenía que haber estado 10 minutos atrás.

Cuando ya llevaba apenas 0.80 millas (ni siquiera una milla) ya estaba jadeando del cansancio y mis cuádriceps me pedían a gritos que parara el abuso de correr – parar de golpe – correr. Estaba empapado de sudor y aún tenia un mar de gente por delante (viendo el gráfico en NikePlus se puede ver me mi ritmo era de 4:40 minutos por milla a la milla 0:84, muy rápido).

No estaba viendo el recorrido sino a quien tenia al frente, buscando huecos para poder pasar.

¿Como me las había arreglado para dañar mi carrera de ese modo?

La pelea sólo se hace peleando

No me detuve a descansar ni un momento; Ya sabía que la carrera iba a ser difícil por lo tarde de mi salida y la cantidad de gente en el recorrido tan estrecho, así que sólo me concentré en seguir pujando.

Después de la primera milla y media me dí cuenta que tenia que estabilizar el ritmo, de lo contrario no iba a llegar a la meta en buen estado; Mirando alrededor me conseguí con un muchachito de 25 años (o algo así) que tenia buen ritmo y pasaba a la gente cuando tenia una oportunidad.

Esa era nueva meta, pegarmele atrás y seguirlo. El me iba a abrir el paso por la siguiente milla o más.

El plan funcionó ya que cuando ibamos por la milla 2.60 me sentía con más energía que al principio y aún seguía pasando gente por delante; Cuando llegamos a la milla 2.80 llegó el momento de desprenderme e iniciar la carrera con todo.

Mira de nuevo mi reloj y me dí cuenta que mi tiempo no era fatal, por lo que aprete el pedal y corrí con todo, tan rápido que pase a muchos corredores que ya estaban en pleno ‘surge’. Cuando llegué a la meta, lo hice volando y estrellandome contra los corredores que ya habían bajado la velocidad al cruzar la meta antes que yo.

Mi tiempo ‘no oficial’: 25:20, Mejor que en el Yankee Stadium pero peor que la carrera de Yai.

Después de la tormenta viene la calma

IMG_9567
La pasamos muy bien durante y después de la carrera

La carrera fué interesante; En particular celebro el coraje de quienes nunca se rindieron cuando la enfermedad los atacó y lograron salir adelante.

Lo único negativo: Para mi fué decepcionante el hecho de que no se midan los tiempos oficiales, aunque los organizadores de la carrera son MUY claros diciendo que es una carrera por diversión no competitiva, no creo que tomar los tiempos afecte el espíritu de camaradería que caracterizo al evento.

De cualquier forma la pasé genial, en especial con la comida al aire libre con Verónica y Sebastian. Esta es una excelente excusa para hacer más carreras :-D

¿Queda alguna carrera interesante para el 2011? Hay un par que me llaman la atención, queda ver como me va adaptándome a correr en el frio de Noviembre / Diciembre.

NOTA: Hay fotos que me faltan por subir, en especial las del día de la carrera. Cuando salgan las pongo en este artículo.

–José

kodegeek, vida sana

Te invito a usar Google Plus

Domingo, 14 de agosto de 2011

Aqui van mis 150 invitaciones, por si aún no has entrado en G+.

internet, kodegeek ,

Corriendo con dolor: Recuperación y cambio de tácticas

Miércoles, 10 de agosto de 2011

Not a stress fracture
Las buenas noticias es que no tengo ninguna fractura

Por lo visto mi pobre blog se está convirtiendo más bien en el blog del corredor; Sin embargo creo que es importante compartir esta experiencia y como de nuevo con un poco de tecnología se puede solucionar un problema (si, al estilo Geek :-) )

En el articulo anterior, les comentaba como me había lesionado mientras me preparaba para correr en el Yankee Stadium; Mi mayor frustración era no saber exactamente que era lo que había hecho mal ya que:

  • No estaba corriendo más de %10 de la distancia adicional según mi plan de entrenamiento
  • No estaba corriendo mucho más rápido o sólo en colinas (las pocas que tiene mi recorrido habitual no cuentan mucho)
  • Mis zapatos eran de corredor

Un poquitico de pie plano
Pisada normal, un poquito de pié plano quizas. Me sale un zapato con control de estabilidad

Así que después de armarme de valor me decidí ir a un médico especializado, un doctor ortopedista con conocimiento de medicina deportiva. Después de hacerme rayos X, revisar mi molestia con los síntomas y de ver mi tipo de pisada (la cual es un poquito de pie plano según aprendí hoy)  diagnostico lo siguiente:

  • No tengo un ‘stress fracture‘. Menos mal
  • Pero si tengo un ‘shin splint‘ (termino muy genérico para un grupo de problemas, el mio es una inflamación muscular)

Así que nada de entrenamiento por dos semanas más y un gel para la inflamación 4 veces al día, seguido de una visita de seguimiento al doctor dentro de 6; Eso significa que tengo 4 semanas para entrenar y mostrarle mis resultados al doctor.

Victory lap!
Hora de volver a plantear las herramientas y el entrenamiento. Vale la pena, ¿no es así?

¿Pero, y que cambios tengo que hacer en mi entrenamiento, si todo esta ‘bien’? Ese es el asunto, mis zapatos no son los adecuados y el doctor me dijo que dada la forma de mi pié yo tenia que buscar un zapato para darme mayor estabilidad (la otra opción es control de movimiento, pero dado que yo peso menos de 180 libras y no tengo pié plano esta opción no es la adecuada para mi)

Así que ahora tengo la tarea de buscar mis nuevas armas, un par de zapatos que me queden a la medida. En una próxima entrega les voy a describir como fué el proceso de selección.

 

 

kodegeek, vida sana , , , ,