Mi primer 10K: Joe Kleinerman 10K

Sábado, 7 de enero de 2012

Before the race
Mi primer 10K, no estuvo nada mal

Hoy corrí mi primer 10K; Decidí probar una estrategia dado que la distancia a batir es el doble de lo que yo estoy acostumbrado a correr; Comencé lento las 2 primeras millas, un poco más rápido las 2 siguiente y las 2 últimas con todo.

Central Park 6.2 mile loop
Recorrido alrededor de Central Park, 6.2 millas

Sin contar con una ida obligatoria al baño en la cual gaste por lo menos 40 segundos (el baño estaba ocupado) creo que salió bien :-)

Los resultados oficiales:

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 M38 5735 0 DARIEN CT USA 2416 1701 316 0:55:05 08:54 0:52:51 1843 50.82
 Resultados oficiales

Esta es una de las carreras del 9+1 para tener una entrada garantizada el maratón de NYC, sólo me faltan 8 más :-)

java , , ,

First Night Danbury 5K, adiós al 2011, ¿que viene para el 2012?

Domingo, 1 de enero de 2012

After the race
¡Vestido para la ocasión!. corrí esta última carrera del 2011, con la mejor compañía posible: Mi Esposa Verónica y mi hijo Sebastian

¡Feliz año nuevo 2012! Con estas palabras arranco un nuevo año en este blog; Comienzo escribiendo sobre la última carrera del 2011, un 5K en Danbury, CT que hice el 31 de Diciembre a las 3:00 P.M: First Night Danbury.


¡La última carrera del 2011 comienza!

La carrera fué sencilla, sin grandes pretensiones. Con niños, ancianos, gente de todas las edades corriendo y disfrutando el momento. Por ser Danbury una comunidad pequeña, pude apreciar como sus miembros se conocen y se aprecian, más de uno felicitaba a los otros (con nombre y apellido) mientras corrían.

Jose llegando a la meta
No fué mi mejor carrera, comencé muy rápido y al final no pude hacer un ‘negative split’. Mala estrategia

No fué mi mejor carrera (aunque no fué la peor). Dos días atrás me lancé con un entrenamiento fuerte de piernas (no estaba completamente recuperado), pero lo que realmente me mató fué que comencé la primera milla muy rápido.

Es una clara indicación de lo mucho que todavía tengo por aprender:

La meta este año es hacer el 9 + 1 para correr en el Maratón de Nueva York en el 2013; Esto implica que deberé correr carreras de distancias más larga como 10K y medio maratones si quiero cumplir los requerimientos.

En pocas palabras, el año pasado fué bueno como introducción pero este año va a marcar la diferencia en cuanto al entrenamiento y fuerza de voluntad; Abajo los números que debo mejorar este año 2012 con respecto al 2011:

  • 165 salidas a correr (incluyendo carreras)
  • 310 millas recorridas
  • Velocidad promedio: 09’15” millas por minuto
  • Calorías quemadas: 36598
  • Tiempo total corriendo: 47:46:34
  • Distancia más larga recorrida: 8.06 millas
  • Milla más rápida: 6’08” minutos / milla
  • 5K más rápido: 22’01” minutos / milla
  • 10K más rápido: 54’15” minutos / milla

Como pueden ver queda mucho por hacer. Pero logré correr sin interrupciones desde Mayo hasta Diciembre (8 meses), así que ahora sólo tengo que ser constante con el entrenamiento y aspirar metas más complicadas.

Asi que, ¡Nos vemos pisando el asfalto este 2012!

–José

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

Clases de velocidad con NYRR

Miércoles, 30 de noviembre de 2011

Same guy after running 5 miles at a pace of 8'10 at Central Park in 40 minutes. Yeah, it was worth it!
Las clases siempre se llevan a cabo, no importa las condiciones del tiempo (5 millas a un ritmo de 8’10 en Central Park en 40 minutos, con fuerte lluvia)

Me inscribí en las clases de velocidad del grupo NYRR en la ciudad de Nueva York; la idea es que con cierto tipo de rutinas al correr y consejos sobre la forma de correr se puede mejorar los tiempos en una carrera, todo eso en Central Park con todas las ventajas que esto ofrece.

Para entrar, sólo hace falta saber la velocidad (pace) de la última carrera de 5 kilómetros ya que te ponen a correr con gente de tu misma velocidad por una hora; Si eres muy rápido o muy lento entonces te obligan a cambiarte de grupo para asegurarse que el entrenamiento de cada banda no se vea afectado. Yo al final terminé en el nivel ‘competitivo, #6′

¿Y funciona el entrenamiento? Bueno, en menos de 10 semanas (yo tomé el curso de una clase por semana) no sólo logre reducir mis mejores tiempos en casi dos minutos, sino que además ahora puedo correr a una velocidad constante por 6 millas, antes simplemente comenzaba rápido para luego terminar muerto en las últimas 2 millas.

El precio me parece bueno por la calidad de las clases, lo preparado de los instructores y sobre todo porque los resultados si se aprecian en corto plazo. Además de eso, conocí mucha gente amigable y el espíritu de sana competencia del grupo hizo que la experiencia fuera muy agradable ya que todo el mundo estaba haciendo un esfuerzo (mi grupo era muy variado entre edades y mezcla de mujeres y hombres).

Estoy seguro que lo repetiré el año que viene en preparación a las nuevas carreras.

vida sana

Euforia antes del maratón de NYC, ‘Dash to the Finish Line’

Sábado, 5 de noviembre de 2011

BIB3215
Escribo estas lineas antes de que mi memoria me falle y olvide detalles importantes.

Hoy fué un día super especial; Tuve la oportunidad de correr la primera carrera de 5 kilómetros del club NYRR (‘Dashto the Finish Line’), un día antes del famoso maratón de la ciudad de Nueva York. Lo mejor fué que lo hice con mis amigos, uno de ellos el cual estaba celebrando su cumpleaños justo el día de hoy mientras que el otro corría su primera carrera.

"NYRR Dash to the Finish line - Map
¿Como fué el recorrido de esta carrera?

Todo esto compartiendo con mi familia, ¿qué más se puede pedir?

El tramo inicial de la carrera, cerca del edificio de las naciones unidas y luego pasando al frente de la estación de trenes de Grand Central, fué lento y tortuoso; con todo y que mi posición inicial no era de las últimas me tocó maniobrar mucho para esquivar a los corredores lentos en la primera milla. Sin embargo en la segunda milla, subiendo por la sexta avenida, paralela a Times Square, comencé a moverme más rápido e hice el mejor tramo de la carrera.

Lo que más me llamó la atención de la segunda milla fué la ausencia de ruido de los espectadores; en vez de eso, el único sonido que se escuchaba era las pisadas constante de los corredores, muchos tratando de mantener el paso, otros acelerando la marcha.

Al llegar a Central Park, comenzó el último pedazo rumbo a la milla # 3. El terreno se hizo mas irregular con algunas pendientes suaves y curvas en el camino, además de que habia algunos corredores ¡viniendo en sentido contrario por donde corríamos nosotros!. El cansancio comenzó a hacerse latente pero al mirar el reloj pude ver que venia haciendo buen tiempo, al menos para mis capacidades.

Junto a la bandera de Venezuela
Junto a la bandera de Venezuela, después de darme cuenta que allí estaba

Los letreros del marcaje de las millas comenzaron a aparecer más seguido: 3 millas, 800 metros, 400 metros. Al llegar al letrero de los 200 metros ni me fijé en la bandera de Venezuela que allí estaba. Sólo seguía empujando.

No pude correr más rápido al final pero si logré mantener un buen paso, para así obtener una pequeña victoria personal de 23 minutos con 36 segundos. Mis sueños de hacer 20 minutos vendrán en otra carrera:


Race Name, Date
Finisher
Name
Gender/
Age
Gun
Time
Net
Time
Pace/
Mile
Overall
Place
Gender
Place
Age
Place
Age-
Graded %
NYRR Dash to the Finish Line (5K)
November 5, 2011
Nunez, Jose V M38 03.1 0:23:36 07:37 578 459 90 56.99

Una vez llegado a la meta comenzó la tarea de buscar a la familia y de esperar por mis amigos, los cuales tuvieron una muy buena carrera también (sin lugar a duda vamos a repetir la aventura, así que tomen nota :-) )

Venezuela representada en el 5K
Venezuela representada en el 5K

Muchos Venezolanos en la carrera; Momentos muy amenos con la familia y amigos, sobre todo con el inmenso apoyo de estos. ¡No veo la hora de que repitamos esta experiencia!

¿Que viene para el futuro? No estoy seguro, pero les dejo una pista de lo que en algún momento me propongo a lograr:

Milla 26
¿Algún día no muy lejano?

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 , ,

¿Como configurar Netbeans 7.10 beta y JavaFX 2.0 beta en OSX?

Sábado, 15 de octubre de 2011

Es un poco fastidioso, pero una vez que se bajen los binarios y siguiendo las instrucciones (no muy precisas de Oracle) terminé haciendo esto:

Netbeans 1.7.1 (beta) + JavaFX 2.0 (beta)

¡Ahora a jugar! :-)

java, javafx

Opinión de libro: The Great Grete Waitz: Inspiration, Hero, Champion–The Woman Who Transformed Running

Viernes, 14 de octubre de 2011

Great Grete Waitz Inspiration, Hero, Champion–The Woman Who Transformed Running, el libro presentado por Runner’s World, es una recolección de historias cortas sobre esta atleta. Su participación casi accidental en el maratón de Nueva York y como lo ganó por 9 veces seguidas, además de establecer marcas mundiales y mostrar a las mujeres como una fuerza a ser reconocida en el mundo de las carreras de distancia es algo que no tiene nombre.

Grete Waitz murió este año, después de combatir Cáncer. Este año hemos perdido a grandes figuras y Grete es una de ellas, le recomiendo este libro para que aprenda un poco sobre verdadera dedicación que sólo una atleta de este calibre pudo ofrecer.

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