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

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.

Jython + JavaFX: Comienzo duro

Al fin Oracle liberó su versión final de JavFX en JavaOne 2011; También hay una versión beta para OSX la cual me baje de una vez.

Jugando con los ejemplos me dediqué a experimentar con el ejemplo de un gráfico de torta el cual se ve sencillo:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.chart.PieChart;
import javafx.scene.Group;

public class PieChartSample extends Application {

    @Override public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Imported Fruits");
        stage.setWidth(500);
        stage.setHeight(500);

        ObservableList pieChartData =
                FXCollections.observableArrayList(
                new PieChart.Data("Grapefruit", 13),
                new PieChart.Data("Oranges", 25),
                new PieChart.Data("Plums", 10),
                new PieChart.Data("Pears", 22),
                new PieChart.Data("Apples", 30));
        final PieChart chart = new PieChart(pieChartData);
        chart.setTitle("Imported Fruits");

        ((Group) scene.getRoot()).getChildren().add(chart);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Lo compilamos y corremos:

Macintosh:javafx josevnz$ export CLASSPATH=/Users/Shared/javafx-sdk2.0.2-beta//rt/lib/jfxrt.jar:.
Macintosh:javafx josevnz$ javac PieChartSample.java -d .
Macintosh:javafx josevnz$ java PieChartSample

JavaFX Pie chartJavaFX gráfico de torta en acción

Así que traté de convertir este sencillo código a Jython:

#!/usr/bin/env jython
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

class PieChartSample(Application):

    def __init__(self):
        pass

    def start(self, stage):
        scene = Scene(Group())
        stage.setTitle("Imported Fruits")
        stage.setWidth(500)
        stage.setHeight(500)

        pieChartData = FXCollections.observableArrayList(
                PieChart.Data("Grapefruit", 13),
                PieChart.Data("Oranges", 25),
                PieChart.Data("Plums", 10),
                PieChart.Data("Pears", 22),
                PieChart.Data("Apples", 30))
        chart = PieChart(pieChartData)
        chart.setTitle("Imported Fruits")

        scene.getRoot().getChildren().add(chart)
        stage.setScene(scene)
        stage.show()

if __name__ == "__main__":
        PieChartSample().launch(sys.argv[1:])

Pero al correrlo me se queja que no estoy extendiendo bien la clase ‘Aplication’ y por eso falla:

Macintosh:javafx josevnz$ ./piechart.py 
*sys-package-mgr*: can't create package cache dir, '/Users/Shared/jython2.5.2/cachedir/packages'
Traceback (most recent call last):
  File "./piechart.py", line 36, in 
    PieChartSample().launch(sys.argv[1:])
	at javafx.application.Application.launch(Application.java:186)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)

java.lang.RuntimeException: java.lang.RuntimeException: Error: class sun.reflect.NativeMethodAccessorImpl is not a subclass of javafx.application.Application

No tengo ni idea en donde esta el error, ¿alguno de ustedes tiene una pista? De verdad me muero de ganas por usar JavaFX con Jython, ya otros han tenido éxito similar con JRuby y Groovy.

Amanecerá y veremos.

Actualización: De la lista de Jython me llegaron muchas sugerencias, al final Weiqi Gao encontró cual era el verdadero problema y esta es la solución:

# The key to happiness in JavaFX + Jython is this:
if __name__ == "__main__":
    Application.launch(PieChartSample().class, sys.argv[1:])

La explicación detallada a continuación:

The trick is with the last line of code that launches the application, which is accomplished with the javafx.application.Application.launch() method. There are two overloaded versions of this method:

public static void launch(String[] args);

and

public static void launch(Class< ? extends Application> appClass, String[] args);

The first version must be called from a method in a class that extends Application, which is not the case in the above python code. So we have to use the second version.

The idiom for using the first version of launch() in Java is the following:

public class Foo extends Application {
    @Override
    public void start(Stage stage) {
      // build the scene graph and show it
    }

    public static void main(String[] args) {
      Application.launch(args); 
    }
}

The idiom for using the second version of launch() in Java is the following:

public class Foo extends Application {
  @Override
  public void start(Stage stage) {
    // build the scene graph and show it
  }
}

public class Launcher {
  public static void main(String[] args) {
    Application.launch(Foo.class, args);
  }
}

There is an inefficiency in my python code in that I instantiated PieChartSample once only to get its class. I think there is a better way of doing it but can’t think of how at the moment.

El placer de correr temprano en la mañana

Park near the pond, Darien CT
Un nuevo sitio para correr, ¡cerca de la casa!

En una de esas cosas del destino conseguí un parque con una pista de asfalto a no más de 2 millas de mi casa; El parque abre de 5:30 de la mañana hasta las 10:00 de la noche y aunque no se compara con Central Park con sus subidas y bajadas esta bien cuidado y tiene un lazo de casi una milla, ideal para correr.

Hoy manejé hasta allá a las 5:30 AM y después de quitarme la ropa que no necesitaba para correr comencé a darle vueltas al circuito; En un principio el frio de otoño me carcomía todo el cuerpo mientras un hilo nada modesto de mocos me corría por la nariz. Lo otro es que el recorrido no me era familiar, así que tenia que ir con cuidado especialmente en los pedazos que estaban totalmente a oscuras (se puede correr sin ver muy bien con poca luz, se sorprenderían de ver como se acostumbran los ojos).

Pero el cuerpo se adaptó rápido; El frio en las manos y cuerpo cedió a la euforia de correr para ir acelerando el paso hasta alcanzar la velocidad requerida.

Lo mejor es que el parque era prácticamente mio; Sólo unas pocas personas con linternas paseando sus perros pero nadie corriendo, nadie más rápido que yo.

Mi ego se inflama y poco a poco le pierdo respeto a las curvas y huecos del parque, ahora estoy corriendo. Ya no hay mocos en la nariz sino sudor por todo el cuerpo. No estoy llevando cuenta del tiempo ni las millas, sólo disfruto el sonido del agua que choca contra la orilla (el parque queda cerca del mar), mientras veo que ya hay más gente en el parque y ahora si, algunos corredores.

El reloj me recuerda que mis 5 kilómetros ya están listos; Mis manos me recuerdan que me ponga guantes la próxima vez, porque seguro va a haber una próxima vez.

Ah si, y una lampara para ver el camino mejor en la oscuridad 🙂

2011 Komen Greater NYC Race for The Cure

Bueno, ya dejando atrás la carrera del Yankee Stadium ahora me lanzo con quizas la última carrera de 5 kilómetros de este año para mi.

El recorrido está aquí, es una carrera sin tiempo oficial y por diversión. La idea es colaborar contra el cáncer de seno.

Me estoy recuperando aún de la lesión de la carrera anterior. Sin embargo las medicinas y el calzado han hecho una gran diferencia. No creo que mejore los tiempos (poco tiempo para entrenar, más recuperación), pero al menos espero mantener lo que hice la última carrera.

Recolectando dinero para la investigación contra el Cancer. ¡Tu puedes ayudar!

A todos mis buenos amigos: Estoy recaudando dinero para la búsqueda de la cura del Cáncer. En vez de escribir necedades en el muro como “que bonito seria que el cáncer se fuera del mundo”, ¿porqué no donar aunque sea $1 por esta causa? (entre más mejor).

El enlace está aquí, donar es muy sencillo.

Así que pónganse las pilas y demuestren su interés con hechos y no palabras 🙂

Nueva carrera de 5 kilómetros, ¡esta vez en el Yankee Stadium!

Amigos y lectores del blog, este 7 de Agosto voy a correr la carrera de 5K en el Yankee Stadium en el estado de New York; Los fondos recolectados van a ser utilizados para estudios de cura contra el Cancer.

Yo estoy recaudando fondos como parte de la carrera, los invito a que donen cualquier cantidad ya que es para una buena causa.

Un abrazo y gracias de antemano,

–José

¿Como saber el tipo de un archivo? (I)

Por alguna razón, este articulo viejo ha tenido algo de tráfico en los últimos días. Me dí cuenta que la idea de usar Java y JNI nunca se materializó, sólo dí unas pistas.

Una forma de hacer esto es llamando a la librería ‘magic’. Magic viene prácticamente en cualquier sistema operativo que se parezca a UNIX que se respete, como BSD, OSX y por supuesto Linux.

Si usted llama a la página man (man 3 libmagic) allí encontrará suficiente información. Por ejemplo, aquí les muestro un pequeño programa que hice en C el cual detecta el tipo de archivo que usted le pase por la línea de comandos:

#include 
#include 

/*
 * Program that shows how to use the magic library to figure out the type of a file
 * @author Jose V Nunez (josevnz@kodegeek.com)
 * License: BSD
 */
int main(int argc, char ** argv) {

        if (argc == 1) {
                printf("[ERROR]: Please provide the file name to check and try again!\n");
                return 1;
        }

        // See manpage libmagic for details on what this flags mean
        int flags = MAGIC_SYMLINK|MAGIC_COMPRESS|MAGIC_CONTINUE|MAGIC_PRESERVE_ATIME|MAGIC_ERROR;

        magic_t cookie = magic_open(flags);
        if (cookie == NULL) {
                printf("There was a problem opening the magic library!\n");
                return 1;
        }
        int status = magic_load(cookie, NULL);
        if (status != 0) {
                printf("Unable to load magic default database!, %s\n", magic_error(cookie));
                magic_close(cookie);
                return 1;
        }

        const char * file_details =  magic_file(cookie, argv[1]);
        printf("Type for file: %s is %s\n", argv[1], file_details);

        magic_close(cookie);
        return 0;
}

Para compilarlo les dejo un archivo Makefile:

CPPFLAGS += -O2 -L/Users/Shared/lib -I/Users/Shared/include -lmagic
all: magic.c
        $(CC) $(CPPFLAGS) magic.c -o magic

Y finalmente como se corre:

auyan:c josevnz$ make
cc -O2 -L/Users/Shared/lib -I/Users/Shared/include -lmagic magic.c -o magic
auyan:c josevnz$ ./magic /Users/josevnz/CTX.DAT
Mime type for file: /Users/josevnz/CTX.DAT is Java serialization data, version 5
auyan:c josevnz$ 

En la siguiente entrada las prometo como hacer esto desde Java (pista, vamos a utilizar JNI).

–José

JavaFX Script ha muerto, Swing aún sigue en pie

Bueno, es un cambio de tono que no esperaba. En JavaOne de este año anunciaron que JavaFX Script está muerto y en va a tener integración desde Swing y otros lenguajes dinámicos.

Las mentadas de madre no se hicieron esperar en Twitter y otros lados el día de hoy. Después de todo son 3 años en los cuales un producto se vuelve a reiniciar (yo me cuento entre quienes perdieron el tiempo leyendo sobre JavaFX). Por otro lado, Java Swing necesita mejoras pronto y quizas esta es la mejor decisión.

Como que alguien en Oracle se dio cuenta que la inversión en Swing de tantos años no se puede botar a la basura, sin embargo queda por verse si vale la pena invertir el tiempo en JavaFX antes de la versión 2.0 (apenas estamos en 1.3, la cual tiene todavía muchos huecos).

¿Quiere más detalles (código)? Aquí tienen una muestra de lo que viene…

¿Como mostrar la información del hardware en OSX?

Aquí les tengo una cortita 🙂

En Linux es hay varios sitios, como /proc. Usando ‘dmesg‘ obtenemos un buen resumen en Linux y OSX. ¿Pero, hay algo más completo, en particular para OSX?

Bien escondido tenemos a ‘System Profiler‘. Puedes buscar el icono e la carpeta ‘Utilities’ o lo puedes llamar desde la línea de comandos:

/Applications/Utilities/System\ Profiler.app/Contents/MacOS/System\ Profiler

¿Como ver que localizaciones están disponibles en Java?

Un programa realmente tonto, pero que a veces me encuentro escribiendo más de una vez:

import java.util.Locale;

public class ShowLocale {
        public static void main(String [] args) {
                for (Locale locale: Locale.getAvailableLocales()) {
                        // Get the 2-letter language code
                        String language = locale.getLanguage();
                        // Get the 2-letter country code; may be equal to ""
                        String country = locale.getCountry();
                        // Get localized name suitable for display to the user
                        String locName = locale.getDisplayName();
                        System.out.println(String.format("%s %s %s", language, country, locName));
                }
        }
}
auyan:~ josevnz$ java -cp . ShowLocale|grep -i vene
es VE Spanish (Venezuela)

Que lo disfruten 😉