domingo, 23 de febrero de 2014

Primera versión de MyFartlek en Google Play ¡A correr!

La primera versión de MyFartlek ya esta disponible en Google Play para teléfonos con Android 4.0 o superior.

Con esta app puedes entrenar tus fartleks sin preocuparte de mirar continuamente el crono ni de llevar la cuenta de la ronda en la que estás. Tu teléfono te avisará al inicio de cada fase de la duración de esta y el ritmo que debes llevar.  Además, podrás crear todos los fartleks que quieras y después elegir cuál hacer.

Hace un par de meses empecé a interesarme por los fartleks. Cuando salía a correr de esta manera, tenía que tener en la cabeza toda la sesión y además descubrí que miraba constantemente el crono para ver si me tocaba cambiar el ritmo.

Así fue como decidí hacer una app que me alertara cuando tocase un cambio de ritmo y, de paso, me permitiera despreocuparme de tener todo el plan memorizado.

Características:
  • Creación y edición de Fartleks y sus respectivas fases
  • Avisos por voz al inicio de cada fase del fartlek
  • Generación  automática del comando de voz a escuchar en función del tiempo de duración y ritmo a llevar en el fartlek
  • Disponible en inglés y español 
  • Fondos de pantalla a elegir para cada fartlek. Bueno esto no era indispensable para correr, pero queda chulo :)
MyFartlek es una app que he hecho para mi propio uso así que espero que os guste. 

Descargar MyFartlek 1.0.0

domingo, 16 de febrero de 2014

Are you a runner? Try MyFartlek!




I'm working on a QML app for runners. Some weeks ago I tried to train doing fartlek sessions and I realized I was continuously looking to my watch checking for the next period. So I decided to make an app featuring voice alerts to order when to change my pace.

Yesterday I uploaded a beta to Google Play and is available to test through the linked G+ group.




I hope somebody of you will like it.

Try MyFartlek 0.9.2 Beta

viernes, 7 de febrero de 2014

Calling Android's Text to Speech from QT 5.2. An example of QT Android Extras

I wrote this post (in Spanish) a couple of weeks ago as a reminder just in case I have to do something similar in the future. Sometimes I found QT documentation is not all good  I would desire and with Android Extras I had to spend quite a lot of time to solve some problems. What I wanted to do is to call Adroid's TexToSpeech class from  QT so I used QtAndroidExtras documentation as a reference, this example of notifications and this post of someone else trying to do the same.

At the beginning, it seemed enough to me, in fact, changing a little the notification example with some code from the QT forum should have been a good solution. But the guy on the forum did not have a working code, he asked for help and there was no response. On the other hand, the sample code in QT notification example calls a static method and I wanted to create a Java class that inherited TextToSpeech (something that in the end I did not get).


As I said before, these are a set of notes I want to keep regarding some problems I found and how I solved them. So, the format is something like a personal notes, a FAQ or if you prefer, a conversation with myself.

1. I usually write code in QT but I have no experience as Android programmer.
Well, there is no solution for this. The only thing is to google searching for examples. Anyway, I wrote the resources I used at the beginning of this post.

2. After studying the examples, I see it is required to have access to the activity context so, it is necessary to create an object from a class with an activity context parameter in his constructor.
Your new class should extend QtActivity, it will provide the proper context when you invoke TextToSpeech class.

3. But it is required to implement onListener in my class and it is already inheriting QtActivity!
No problem, you can do both things at the same time:

public class TestAndroidClient extends QtActivity implements TextToSpeech.OnInitListener


4. I've created my class but I don't know the correct location in the file tree, moreover it isn't included in the apk when the project is build.
See the notification example and make a similar structure. At your project's root folder create a directory called android-source and a src one within it. From the last one you should have the rest of the structure for your java files, i.e.  org/qtproject/example/your-app-name/YourClass.java



Be sure to have these two lines in your project's .pro:

QT+=android-extras
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-source

Check the build directory (normally named build-xxxx) for your class file. In linux you can use find:

find . -name YourClass.java





5. When I launch the application it crashes and closes without showing any exception report and the error is previous to my class invocation.
Maybe this is because the class is not found. Check your manifest.xml and look your activity tag, it should point to your class


    
        
   

6. But I want to write a class that inherits TextToSpeech so everything would be more object oriented.
Well... I don't have a solution for this. To tell the truth I failed to do a non static method, furthermore I haven't found an example doing that.

7. I'm trying a call my static method from the C++ code and nothing happens.
Take a look to your parameters signature. It is also important to use the right javaobject from C++to being recognised by the Java function. Having the following Java function:

    public static void test(String msg)
    {
        System.out.println(msg );
        tts.speak(msg, TextToSpeech.QUEUE_FLUSH, null);

    }

The appropriate C++ call will be:

    QAndroidJniObject javaMessage = QAndroidJniObject::fromString(msg);
    QAndroidJniObject::callStaticMethod("org/qtproject/example/testandroidextras/TestAndroidClient",
                                              "test",
                                              "(Ljava/lang/String;)V",
                                              javaMessage.object());

8. I need a example!!
Ok, you can grab the source code from GitHub

viernes, 10 de enero de 2014

Un ejemplo de Qt Android Extras: usando el Text To Speech de Android

Escribo esto como recordatorio por si me vuelve a tocar hacerlo otra vez. A veces la documentación de QT no es todo lo extensa que uno querría y con los extras de Android me he tenido que pegar un buen rato. Lo que quería hacer es llamar a la clase TexToSpeech del SDK de Android desde QT y lo que tenía como referencia era la documentación de QtAndroidExtras, el ejemplo de notificaciones que proporcionan y el intento de otra persona de hacer lo mismo que yo en un foro de QT.

Parecía que era suficiente, de hecho, cambiando un poco el ejemplo de las notificaciones por el código del foro debería haber sido más que suficiente. Pero el tipo del foro no tenia un código funcional, el mismo pedía ayuda y no había respuesta. Por otro lado el código de ejemplo de QT no hace más que llamar a un método estático y yo quería crear una clase Java que heredase TextToSpeech (cosa que al final no conseguí).

Pues bien, como decía, a modo de recordatorio dejaré una serie de problemas que me he encontrado y como los he ido sorteando. El formato del siguiente guión es el de notas mentales, o si lo preferís, un diálogo conmigo mismo.

1. Me defiendo en QT pero no tengo ni idea de programar en el SDK de Android.
No  hay mucha solución a esto, o aprendes o te buscas la vida buscando ejemplos. Ya se han citado los ingredientes a utilizar.

2. Se necesita crear un objeto de una clase en cuyo constructor toma como parámetro el contexto de la actividad.
La clase que escribas debe extender QtActivity, esta proporcionará el contexto a la hora de crear la otra, en este caso TextToSpeech.

3. Pero necesito que mi clase implemente onListener y ya hereda QtActivity.
Bueno... una cosa no quita la otra:

public class TestAndroidClient extends QtActivity implements TextToSpeech.OnInitListener


4. He creado la clase java y no se dónde ponerla, de hecho creo que no se instala a través del apk
Fíjate en el ejemplo de las notificaciones y crea una estructura similar. En la raíz de tu proyecto crea un directorio llamado android-source y dentro de este otro con el nombre src. A partir de ahí tendrás los subsiguientes, por ejemplo: org/qtproject/example/nombre-de-tu-app/TuClase.java



Asegúrate de que en el .pro del proyecto están las siguientes líneas:

QT+=android-extras
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-source

En linux, una vez constrido, puedes hacer en el directorio de construcción (build-xxxx) en un terminal:

find . -name TuClase.java

y comprobar que la ruta es la correcta




5. Cuando trato de ejecutar la aplicación se cierra sin mostrar excepción y esto ocurre al llamar a mi clase.
Esto seguramente es porque no la encuentra. Comprueba que tienes creado el manifest.xml y que referencia correctamente a tu clase en un tag activity


    
        
   

6. Pero yo quiero hacer una clase que herede de TextToSpeech y que sea todo más dinámico.
Bueno pues no tengo solución para esto. De hecho, no he conseguido hacer una llamada que no sea estática a la clase Java creada. A decir verdad, tampoco he encontrado un ejemplo que lo haga.

7. Estoy intentando llamar a un método estático desde el código C++ y sigo sin conseguirlo.
Hay que fijarse en la firma de los parámetros de entrada y salida. También es importante usar el javaobject correcto desde C++ para que la función Java lo reconozca. Si tienes la siguiente función en java:

    public static void test(String msg)
    {
        System.out.println(msg );
        tts.speak(msg, TextToSpeech.QUEUE_FLUSH, null);

    }

La correspondiente llamada en C+++ será:

    QAndroidJniObject javaMessage = QAndroidJniObject::fromString(msg);
    QAndroidJniObject::callStaticMethod("org/qtproject/example/testandroidextras/TestAndroidClient",
                                              "test",
                                              "(Ljava/lang/String;)V",
                                              javaMessage.object());


Finalmente, el código fuente lo podéis encontrar en GitHub

lunes, 30 de diciembre de 2013

Un par de horas con las Google Glasses

Resulta que ha llegado a la oficina un prototipo de las famosas gafas de Google, así que me he puesto a jugar con ellas. Tengo que decir por una lado que me lo he pasado bien, como con cualquier trasto tecnológico que pasa por mis manos, pero también aviso que soy mas bien un detractor de las mismas desde antes de probarlas.

Guille Glasses vs Google Glasses

El prisma

Siempre que he visto a alguien haciendo uso de las gafas, me ha dado la impresión de que no debe ser muy cómodo sostener la mirada continuadamente sobre el prisma y ciertamente no lo es, te cansas. En su favor puedo decir que mirando durante unos pocos segundos la imagen es lo suficientemente nítida y no tienes la sensación de estar mirando un punto excesivamente cercano. Pero repito, por encima de unos 20-30 segundos empiezas a tener sensación de cansancio.

No te esperes una gran resolución ni un gran contraste. El prisma no da para más y, aunque puedes ver fotos de forma aceptable, salta a la vista que las apps de Google eligen cuidadosamente los colores a utilizar. Por ejemplo, en la aplicación de navegación veremos fondos negros, letras blancas y lineas azules para orientarnos.

Hablando con las gafas

Llegado el momento de interaccionar con ellas, habrá que hacerlo en inglés (de momento) y con un acento mínimamente aceptable. El problema se acrecienta cuando intentas una llamada o vídeo llamada y tienes que interpretar como se pronuncia en inglés el nombre de la otra persona. Por ejemplo:

- "Ok Glass"
- "Make a video call"
- "Guillermo Amat"

Pues tendrás que imaginarte como diría un estadounidense el nombre Guillermo Amat. Como comprenderás haciendo este tipo de pruebas uno se siente un poco inútil, así que me he encerrado en un despacho para no dar un espectáculo a los compañeros. Tras unas cuantas pruebas consigues decir el nombre de fulanito como si fueses guiri, aunque seguirá siendo difícil repetirlo.

Pero lo más frustrante (y divertido de paso) ha sido descubrir que no sé decir "Google", debo haberlo intentado unas cincuenta veces y lo he logrado decir bien una. No he tenido problemas con el resto de las opciones: "make a call", "get directions", "take a picture", "record a video", etc. ¡Pero no sé decir Google! ¡Es el colmo! Así que he tenido que acceder al buscador mediante el touchpad para probar a buscar cosas, y entonces la diversión ha seguido ¡No se pronunciar Sean Penn!

- "Who is Sean Penn"
Google: Who is something

- "Who is Sean Penn"
Google: Who is some pain

- "Who is Sean Penn"
Google: Who is same song

Y unos cuantos intentos más que no recuerdo. Así que cambié de actor:

- "How old is Tom Cruise"
Google: How tall is Tom Cruise. Y a continuación mostraba un listado de imágenes de Tom Cruise en las que siempre estaba al lado de alguien ¿Recochineo? Al menos esto me funcionó al siguiente intento.

De acuerdo, esto no es un punto en contra del dispositivo, ya que cuando se comercialicen en nuestro país estarán preparadas para nuestro idioma. Realmente la interacción por voz es bastante buena y si no te aclaras puedes usar el área táctil de la patilla.

El Touchpad

No hay mucho que decir aquí, en la patilla tenemos un touchpad con el que podremos navegar por todas las opciones, simplemente hay que aprenderse los gestos a utilizar.

Tal vez pienses que no es obligatorio usarlo, que realmente puedes usar el dispositivo realizando todas las acciones mediante voz, pues no es así. Te hará falta darle un toque al pad para colgar una llamada o detener un vídeo, por ejemplo. Otras acciones también lo requerirán, como la navegación por ciertos menús.

El "auricular"

Técnicamente el auricular no existe, hay un elemento que vibra en contacto con tu cabeza, aunque de todos modos si no las llevas puestas algo se oye. Al principio he tenido la sensación de que las vibraciones se me introducían por la sien pero al rato se me ha olvidado por completo. De nuevo es cuestión de adaptarse. En la práctica, cuando estés en una llamada, el sonido que percibirás será de una calidad aproximadamente similar a la de un teléfono.

La cámara 

Bueno, no es nada del otro mundo. Cumple su cometido pero si quieres sacar una buena foto no uses las gafas. Además si quieres enfocar a algo cercano tendrás que practicar un poco, la idea en la foto de abajo era sacar el portalápices y el vaso completamente centrados. En cuanto a la grabación de vídeo puede ser divertido grabar un descenso en bicicleta de montaña (por decir algo) pero deberías tener en cuenta que si te la pegas llevas 1500$ sobre las orejas.

Fotografía cortesía de las Google Glasses


Usos y aplicaciones

Hay unas cuantas aplicaciones disponibles en un app store dedicado a las gafas, todavía no muchas, pero hay para entretenerse un rato. Además, por supuesto, están preinstaladas las más importantes de Google.

Entre los usos básicos, podemos hacer fotos mediante nuestra voz ("take a picture") o guiñando el ojo derecho, grabar un vídeo, hacer una llamada, pedir indicaciones para llegar a una dirección, buscar en Google... aunque de nuevo insisto en que de momento en inglés.

Más interesante puede ser hacer una vídeo llamada, usando Hangouts, con lo que el receptor verá lo que tú estas mirando. Por otro lado tu verás la cara de esa persona en el prisma.

Desde el store podremos descargar aplicaciones deportivas (Strava), de recetas de cocina, meteorología, etc. A mi me ha parecido interesante probar World Lens porque en un móvil ya me parecía fantástica y en las gafas tendría que ser aún mejor... lamentablemente no he conseguido que me tradujera un texto en ingles. Detectaba el párrafo y hacía zoom sobre el pero no me ha salido la traducción.

Entonces, ¿por qué no soy un fan de este cacharro?

A ver... repito que me lo estoy pasando bomba con ellas pero hay una serie de aspectos que me hacen pensar que este dispositivo tiene que mejorar bastante. En realidad la mayoría ya las pensaba de antemano y el hecho de probarlas no me ha cambiado la opinión:
  1. Para empezar soy un cuatro ojos y no puedo usar mis gafas con las Google Glasses
  2. Mirar la imagen del prisma de forma continua es cansino. Hay tecnologías parecidas desde hace tiempo, por ejemplo el casco del Eurofighter. En su día estuve buscando alguna referencia sobre esto y encontré que algunos pilotos de combate desarrollan problemas en la vista por el uso continuado de este tipo de visores. Ahora este posible problema nos lo podremos encontrar todos.
  3. Requieren bastante atención, sobre todo mirando la pantalla. Para que se entienda: si vas en tu coche mirando un GPS montado en el parabrisas tendrás más información de lo que pasa delante tuyo que si miras el prisma de estas gafas. La vista tiene que centrarse en un punto muy cercano y extremo. En mi opinión no es como para andar con ellas por la calle, pero tampoco creo que lo sean los auriculares y la gente lo hace: es normal ver personas cruzar calles sin miedo a la muerte mientras escuchan su música preferida encerradas en su mundo, en fin...
  4. Tampoco iría con ellas por la calle, hoy por hoy, por razones de estética. Me sentiría raro y me daría vergüenza , pero vuelvo a poner el caso de antes: no andaría por la calle con unos auriculares que me tapasen las orejas y parte de la cara... pero la gente lo hace. Si crees que exagero, prueba lo siguiente en presencia de gente: ponte una gafas, preferiblemente sin  cristales o con unos transparentes, di "hola gafas", después di "haz una foto", ahora comienza a acariciar la patilla derecha con cariño, dale un toque seco, luego mas caricias hacia abajo, luego hacia un lado, al otro o aleatoriamente, guiña el ojo derecho, sigue acariciando con amor la patilla... Si puedes hacer esto en público (por ejemplo en un vagón del metro), entonces podrás llevar unas Google Glasses
  5. Duración de la batería (unas cuantas horas como mucho)
  6. Precio prohibitivo, si no cambia claro.
  7. Básicamente hacen lo mimo que tu teléfono. Por cierto, necesitarás enlazarlas con tu teléfono para poder hacer llamadas, o sea, no están pensadas como una alternativa real al móvil.
En resumen, no estoy afirmando rotundamente que no tengan futuro o que nunca vaya a usar algo parecido. Yo desde luego no me gastaría 1500$ en estas en particular. Lo que es innegable es que la wearable technology, o mejor dicho ropa tecnológica, está llegando para quedarse y si no es este dispositivo será otro el que se masifique.

Las gafas Recon Jet para ciclistas


En cuanto a las gafas, hay unas cuantas más de otros fabricantes, similares. Creo que vamos a ver pronto alguna de ellas especializadas en ciertas actividades, como las Recon Jet. Sí que me parece útil para un corredor visualizar su pulso, tiempo, diferencia con un oponente, velocidad, etc. y apuesto a que veremos algunas en el próximo Tour de Francia.