lunes, 11 de abril de 2011

PhotoGeolocator supera las 10.000 descargas

PhotoGeolocator ya ha superado las 10.000 descargas!

En estos escasos nueve meses he recibido comentarios y sugerencias desde diversas partes del mundo, que han contribuido a mejorar la aplicación:

Ken Gauger - Mejorada precisión y compatibilidad con números racionales.
Masakazu Kawahara - Compatibilidad con dispositivos japoneses.
Marcello Anselmi - Compatibilidad con dispositivos que no disponen de trackball. Traducción al italiano.
Fritz Endres - Permitir vista satélite.
Brianna Laugher - Permitir la búsqueda por dirección.

¡Gracias a todos!

lunes, 1 de noviembre de 2010

Code Swarm

El año pasado escribí en este cuaderno acerca de Code Swarm

Aquí está la representación orgánica de la actividad CVS desde que montamos el repositorio hace dos años y medio hasta hoy. Un total de 48901 commits resumidos en un vídeo de dos minutos y medio.



Un saludo a todos los commiters que aparecéis en el vídeo, y también a los que os encontrabais "detrás de las cámaras" en el despacho :)

domingo, 8 de agosto de 2010

¿Por qué no iPhone?

Puedo programar mi Android usando únicamente herramientas y librerías de código abierto: Linux, NetBeans o Eclipse y Java.

Además puedo compilar mi aplicación y pasársela a un amigo para que la instale en su dispositivo. Aunque pueda parecer increíble, iPhone OS no permite hacer algo así. Usando la metáfora de Richard Stallman, es como si no pudieses compartir tu propia receta de cocina con un amigo.

Si desarrollas para iPhone, deberás registrar el dispositivo de tu amigo como dispositivo de desarrollo para tu aplicación (creo que puedes registrar un máximo de 100 por aplicación, o por desarrollador...) para poder compartirla con él. Otra opción es publicar tu aplicación en el AppStore, y esperar pacientemente a que te la autoricen!



La otra opción si quieres poder distribuir libremente tu aplicación, es que tus amigos "desenjaulen" su dispositivo, lo que se conoce como jail break.

¿Y para los que ya se hayan comprado un iPhone? Bueno... siempre pueden instalar Android en sus iPhones

sábado, 24 de julio de 2010

PhotoGeolocator ya está en el Market

El Miércoles subí al Market la aplicación que he desarrollado para el PFC de los estudios de informática en la UOC. Hoy Sábado mi consola de administración de aplicaciones publicadas marca 378 instalaciones de las cuales 264 continúan instaladas (69%).

El programa sirve para el geoetiquetado de fotografías (geotagging en idioma inglés). Se puede tomar una foto utilizando la cámara del dispositivo y guardar en ella la información geográfica. Esto ya lo hace la mayoría de dispositivos Android, pero no todos, como mi G1 (HTC Dream en España).

Además el programa permite modificar la información geográfica de una foto existente, cuando no está geoetiquetada o la información no es precisa. La información geográfica se puede obtener mediante GPS o bien puede escogerse manualmente marcando en el mapa. Por último el programa también permite mostrar en el mapa la ubicación de una foto almacenada en nuestro Android.

El desarrollo de esta aplicación para Android ha sido toda una experiencia. He respetado los principios ágiles para el desarrollo de aplicaciones, contando con un equipo de 11 colaboradores voluntarios que desempeñaban el rol de "cliente"... Hemos utilizado Google Groups, Google Talk y el programa se ha probado en HTC Dream, HTC Magic, Motorola Dext, HTC Tatoo, HTC Hero, HTC Legend y Nexus One. Aunque no me han puesto la máxima nota, me han aprobado. Y ya soy ingeniero en informática 8D

Por supuesto, la aplicación no sólo es gratuita sino que es libre, el código fuente está publicado en Google Code bajo licencia GNU GPL v3. Para quien quiera usarla, copiarla, modificarla o simplemente contribuir notificando posibles defectos y/o mejoras.

Quiero dar las gracias a todos los que me habéis apoyado en esta aventura.

viernes, 7 de mayo de 2010

iPod en Ubuntu

Esta semana Ubuntu 10.04 LTS "Lucid Lynx" ha visto la luz, y el primer día mis compañeros David y Seba se lo instalaron en sus puestos de trabajo.

Yo había leído acerca de la integración de una tienda de música on-line en esta nueva versión de Ubuntu... Entonces tuve una corazonada, y conecté mi iPod Touch al ordenador de David. ¡SIIII! ¡El Lince Lúcido reconoció el aparato y mostró todas sus canciones! ¡Y permite sincronizar la música con el dispositivo!

Efectivamente, Ubuntu 10.04 ofrece compatibilidad con iPod y iPhone de forma nativa.

Desde que Mari me regaló el iPod, no he vuelto a comprar un CD de música. Comprar la música en mp3 tiene sus ventajas, y la mejor alternativa para mí era iTunes pese a estar disponible sólo para Windows y MacOS, lo cual mantenía esclavo a mi iPod... hasta ahora. Porque a partir de hoy mi tienda de música es Ubuntu One Music Store.

miércoles, 9 de diciembre de 2009

Editor Visual Java

Hoy un compañero me ha dado el empujoncito que me hacía falta para ponerme a escribir un pequeño tutorial acerca de cómo crear un interfaz gráfico de usuario en Java. Vamos a crear en unos minutos un interfaz gráfico que nos permita acceder a las propiedades de un objeto Java. Usaremos un editor al azar, por ejemplo... NetBeans!

Cierto, he hecho trampa. En realidad he escogido NetBeans porque trae "de serie" el sistema más avanzado para creación visual de interfaces de usuario multiplataforma: Swing powered Matisse :)

Abrimos NetBeans y vamos al menú Archivo, seleccionamos Proyecto Nuevo... En el diálogo seleccionamos la categoría Java y el tipo de proyecto Aplicación Java.



A continuación damos un nombre a la aplicación y pulsamos Terminar.



Aparece en pantalla el proyecto recién creado, con el paquete miinterface y una clase generada automáticamente Main.java.



Ahora crearemos un objeto que encapsule los datos a los cuales accederemos desde nuestro interfaz gráfico. Lo haremos siguiendo el patrón JavaBean. Es un buen momento para explicar qué es un JavaBean :) Un JavaBean es un objeto Java con las siguientes propiedades:

- Tiene un constructor vacío, para que pueda ser instanciado siempre.
- Todas las variables se declaran private (o protected).
- Hay un método accesor de la forma getNombrePropiedad para cada variable que se quiera exponer para lectura.
- Hay un método accesor de la forma setNombrePropiedad(Tipo nuevoValor) para cada variable que se quiera exponer para escritura.

Además, nosotros usaremos el mecanismo de notificación de cambios de propiedades en la implementación de los métodos accesores de escritura para mejorar la integración con Swing.

Hagamos botón derecho en el paquete miinterface y seleccionemos Nuevo -> Clase Java... en el menú emergente. Le damos un nombre a la clase,



y al terminar nos aparece una plantilla con la declaración del paquete y una clase vacía.

Vamos a crear las propiedades del objeto, con sus métodos accesores de lectura/escritura y mecanismo de notificación de cambio de propiedad: Ponemos el cursor dentro del cuerpo de la clase y pulsamos alt-ins para añadir una nueva propiedad al objeto. Seleccionamos Agregar Propiedad...



Especificamos nombre de la propiedad, su tipo (por ejemplo "descripcion" de clase String) y activamos la opción delimitado para poder conectar este objeto a otros JavaBeans, como son por ejemplo los componentes visuales de Swing.



Al aceptar el formulario vemos que NetBeans ha generado el código para la variable, métodos accesores de lectura y escritura para la propiedad, y código boilerplate para la notificación de evento de cambio de propiedad.

Añadimos otra propiedad, por ejemplo "peso" de tipo Number, activando también la opción delimitado en el formulario. Esta vez la opción Generar soporte para cambio de propiedad estará deshabilitada porque ya se ha generado el código para esta compatibilidad.



Y para que nuestro nuevo objeto cumpla con las especificaciones del patrón JavaBean, añadimos un constructor vacío: hacemos alt-ins y seleccionamos Constructor... en el menú emergente.



Ya tenemos nuestro JavaBean acabado. Ahora vamos a conectar este objeto a nuestro formulario para poder interactuar con sus propiedades a través de nuestro interfaz gráfico.. Es la parte más divertida :)

Volvamos a hacer botón derecho en el paquete miinterface y seleccionemos esta vez Nuevo -> Formulario JFrame...



Damos un nombre a la clase, por ejemplo MiFrame y al terminar nos aparece el editor visual.



Para poder usar nuestro JavaBean en el formulario, lo primero que tenemos que hacer es compilarlo (F11). Y luego, simplemente arrastrarlo a nuestro formulario. Podemos ver la nueva instancia que ha creado el IDE en la categoría Otros Componentes del Inspector en el editor.



Arrastramos ahora un Campo de texto de la paleta al formulario y le hacemos click con el botón derecho. Seleccionamos enlazar -> text y escogemos miCosa1 como origen y descripcion como expresión.



Repetimos la operación para vincular un segundo componente a la propiedad peso, pero en este caso usaremos un Cuadro formateado (Formatted Field) en lugar de un Campo de texto, ya que se trata de un valor numérico. Estiramos los componentes para que su tamaño no esté limitado al valor inicial del texto. Si los estiramos hasta el ancla que aparece en el borde derecho del formulario, su tamaño se ajustará al del formulario.

Ahora vamos a especificar que el valor del Cuadro formateado es numérico. Seleccionamos el componente en el editor y ajustamos la propiedad formatterFactory.


Por último, arrastramos el componente Botón de la paleta hasta el formulario y le hacemos botón derecho -> Eventos -> Action -> actionPerformed para implementar la acción... por ejemplo mostrar las propiedades de mi cosa en un diálogo:



Será necesario importar la clase JOptionPane, lo hará automáticamente NetBeans si escribimos ayudándonos de ctrl-espacio o bien si hacemos fix imports (mays-alt-f).

Ya está! Botón derecho en MiFrame.java y Ejecutar archivo.



Podemos probar la conexión de nuestro JavaBean con los componentes visuales, y el mecanismo de notificación de cambio de propiedad, conectando otro componente visual a la misma propiedad. Por ejemplo usemos esta vez una Etiqueta.



Al modificar la descripción, la etiqueta se actualiza automáticamente. ¿Y si usamos un Desplazador (JSlider) para establecer el peso?


Está claro que este formulario no ganaría un premio de diseño...

sábado, 24 de octubre de 2009

Corrector ortográfico en OpenOffice

Ahí va una chuletilla para instalar un corrector ortográfico en OpenOffice, para Ubunteros, al menos los que utilizamos la última LTS, 8.04 Hardy cuya versión de OpenOffice apt-compatible es la 2.4.1. Probablemente este procedimiento seguirá funcionando en las próximas versiones LTS de Ubuntu, y también de OpenOffice, pero seguramente no será necesario porque podrá hacerse desde el menú Archivo -> Asistentes -> Instalar nuevos diccionarios, sin problemas (o eso espero :)

El diccionario de OpenOffice está ubicado en el directorio /usr/lib/openoffice/share/dict/ooo. Vemos que esta carpeta es realidad un enlace hacia ../../../../share/myspell/dicts. Así que para editar el archivo que necesitamos modificar podemos hacer:

$ sudo gedit /usr/lib/openoffice/share/dict/ooo/dictionary.lst

o bien:

$ sudo gedit /usr/share/myspell/dicts/dictionary.lst

Y bastará añadir la línea:

DICT yy XX yy_XX

donde yy es el idioma y XX el país. Por ejemplo, para habilitar el diccionario catalán, escribimos:

DICT ca ES ca_ES

Si nuestro Ubuntu no tenía aún instalado el corrector que queremos utilizar, nos faltará el archvo yy_XX.dic en ese directorio. El archivo estará ahí si por ejemplo hemos instalado la compatibilidad con ese idioma en Firefox. Otra opción es descargar el archivo y copiarlo en esa carpeta. Si buscamos "dicooofull" o "pack_full_20070914" en google seguro que encontramos algún ftp del cual descargar todos los idiomas.

Para comprobar si el corrector ya está operativo en OpenOffice, podemos ir al menú Herramientas -> Opciones -> Configuracion de idioma -> Idioma, y verificar si el idioma que queremos tiene activo el icono "ABC":


miércoles, 16 de septiembre de 2009

Acabar la carrera de informática sabiendo... ¡programar!

No quisiera convertir este blog en "Desahogos de un estudiante de informática", pero ahora al comenzar el siguiente curso después de mi último desahogo me he llevado una nueva decepción, esta vez en la asignatura de Bioinformática (una asignatura interesante donde las haya), para la que tendré que quitar el polvo al compilador de... C. Al menos probaré la compatibilidad de NetBeans IDE con este lenguaje 8)

La decepción no ha sido tanto ver que el lenguaje para implementar los algoritmos es C, de forma obligatoria, sino el motivo de tal decisión: "ningún ingeniero informático puede acabar sus estudios sin dominar los aspectos básicos de este lenguaje".

En mi opinión, C como lenguaje de programación no es más que ensamblador con muchas macros. Creo que ningún ingeniero informático acaba la carrera sin conocer la arquitectura de las máquinas y tampoco creo que ninguno tenga el título actualmente sin haber conocido los aspectos particulares de este mítico lenguaje (su estrecha relación con la máquina en tipos primitivos, direccionamiento y gestión de memoria).

Pero estaría bien, si no hubiese una causa prioritaria en la que quiero insistir: Los informáticos tenemos que dominar "la programación" en al menos un lenguaje. Todos buscamos nuestra piedra filosofal (en lenguajes, IDEs, frameworks...) que nos permita desarrollar aplicaciones de la mejor calidad y en el menor tiempo posible. Pero lejos de permitir consolidar las técnicas y metodologías que hayamos podido encontrar en nuestro camino, nos perdemos en la torre de Babel.

¿No querías caldo? pues toma dos tazas.

miércoles, 5 de agosto de 2009

Infinite Mario Bros AI Competition

Hace un par de semanas supe de esta competición donde el objetivo es programar un agente que supere el mayor número de niveles jugando al videojuego de Super Mario.

Los organizadores del concurso proporcionan el código fuente del juego y un API para programar el agente. Se aceptan tanto agentes programados "a mano" como agentes "enseñados", que se presentarán a concurso con un conjunto de reglas "aprendidas" mediante técnicas de Inteligencia Artificial.

Lo interesante de construir un agente evolutivo para resolver este problema, es que el mismo agente podría ser "entrenado" luego para jugar a otros juegos.

Algunos ya han publicado en YouTube a sus agentes en acción.

...

Vaya, se me quedó en borrador este post! al final me animé a enviar mi experimento y quedé en quinta posición... de nueve presentados 8)

lunes, 20 de abril de 2009

Oracle compra Sun Microsystems

Días después de saber que Sun no se vendía a IBM, y mientras picaba código felizmente en mi NetBeans, mi móvil rugió y leí el SMS de mi colega David: "Oracle ha comprado Sun :-S"

Al final ha sido Oracle, qué cosas. Esto significa que Oracle ha comprado MySQL. Tenía 1 billón de dólares para hacerlo. El pack completo, hardware incluído, le ha salido por 7.4 billones de dólares.

¿Deberíamos cuestionarnos las intenciones de Oracle al comprar Sun? Podríamos pensar que simplemente pretende quitar de enmedio a su mayor competidor en el mercado, al menos en el terreno Open Source.

Oracle ha contribuido anteriormente en proyectos Open Source y los ha integrado en sus soluciones. Es miembro del JCP (Java Community Process), con gran influencia por ejemplo en el desarrollo de especificaciones como JPA, el API de persistencia de Java, que vino a sustituir a los EJB de entidad en EE5. De hecho TopLink ya era de Oracle! Disponer de las otras piezas del puzzle supone para Oracle excelentes ventajas competitivas.

Mark Shuttleworth, fundador de Ubuntu, relaciona esta acción por parte de Oracle con la influencia que está ejerciendo el open source en la industria del software.

No sabemos hasta dónde llevará Oracle a Java. En cualquier caso no tendremos Eclipse de Sol, y NetBeans tendrá que seguir compitiendo para mantenerse como mejor IDE Open Source 8) ¡Y eso es bueno para todos!

viernes, 17 de abril de 2009

Code swarm

NetBeans.org anuncia hoy un interesante vídeo: NetBeans Code Swarm.

¿Qué es un 'code swarm'? San Gúgol me dice que es "an 'organic software visualization' that shows the history of commits in a software project", que traduciría como "Una 'visualización de software orgánico' que muestra la historia de commits en un proyecto de software". No me atrevería a traducir 'code swarm' (ni tampoco 'software', ni de paso 'commit' :).

Un commit es una operación atómica que un desarrollador hace en el repositorio o contenedor de archivos el cual produce nuevos archivos o nuevas versiones de los archivos que contiene. Un sistema de versionado se encarga de almacenar estos cambios en el repositorio mediante 'deltas', es decir, diferencias en los archivos, que además quedan asociadas a la fecha, hora y su autor.

Pero la definición que he citado se refiere, si no me equivoco, a 'software orgánico'. Según nuestro diccionario, un cuerpo orgánico es aquél "que está con disposición o aptitud para vivir". También "que tiene armonía y consonancia". O "que atañe a la constitución de corporaciones o entidades colectivas o a sus funciones o ejercicios".

En este code swarm podremos ver la evolución del código (y web, tests, builds...) de NetBeans en el tiempo, así como los nombres (o nicks) de los desarrolladores que han participado. Yo he reconocido a masaki, del equipo de traducción! :)

Éste es el vídeo en netbeans.tv, y lo podéis descargar también en formato .mov.

sábado, 7 de marzo de 2009

Metodología y Gestión de Proyectos Informáticos

Este cuatrimestre me he matriculado de Metodología y Gestión de Proyectos Informáticos. Intuyo que me servirá poco para lo que yo hubiese esperado. Como es la última asignatura troncal que me queda, muy posiblemente haya agotado todas las posibilidades de recibir más pistas en la carrera.

¿Y qué hubiese esperado? Una solución a los problemas que mantiene a muchos programadores en esta crisis. Esta asignatura trata el proceso de desarrollo de software como una actividad de la fase de ejecución de un proyecto TIC. Las asignaturas que tratan el proceso de desarrollo de nuevo software aplican siempre el ciclo de vida clásico de "análisis - diseño - implementación - pruebas - mantenimiento" que todos ya sabemos que sólo funciona en casos muy concretos. En otras palabras, no es realista.

En los materiales de estudio de la asignatura Ingeniería del Software Orientado a Objetos leí acerca de las metodologías ágiles, aunque no tuvieron demasiada importancia en el curso de la asignatura. Sin embargo yo he experimentado muy buenos resultados al adoptar ciertas prácticas de la programación extrema (XP) en el proceso de desarrollo.

Así que hoy he firmado el manifiesto ágil.

lunes, 29 de diciembre de 2008

NetBeans en Ubuntu

Esta pequeña guía se divide en tres partes: instalar Java, instalar NetBeans y finalmente algunos apuntes acerca de cómo afinar la versión del JDK que queremos utilizar tanto en NetBeans como de forma predeterminada en el sistema.

Instalar Java

Una forma rápida de tener Java instalado en Ubuntu es instalar los paquetes debian que nos proporciona la distribución. Encontramos los siguientes paquetes:

sun-javaX-plugin Para instalar la compatibilidad con Java en el navegador web
sun-javaX-jre Si queremos ejecutar programas hechos en Java
sun-javaX-jdk Si vamos a desarrollar programas en Java. Incluye jre y fuentes.
sun-javaX-doc " y necesitamos javadoc en local


donde X es una versión de Java disponible para nuestra distribución. La última versión de Java en este momento es la 6. Para usar NetBeans 6 y programar en Java bastará instalar el paquete sun-java6-jdk, que ya incluye jre y está disponible al menos en Ubuntu 7.10 (gutsy). Si no estuviese disponible en nuestra distribución, también nos servirá sun-java5-jdk (el Tigre).

Para instalar un paquete podemos hacer:

sudo apt-get install nombre_del_paquete

o bien abrir el gestor de paquetes Synaptics que se encuentra en el menú Sistema -> Administración, buscar y seleccionar para instalar el paquete o los paquetes que necesitemos.

Java quedará instalado en /usr/lib/jvm/java-6-sun (o java-5-sun si instalamos el Tigre) . Nos interesará saber esto si por lo que fuese el instalador de NetBeans no encuentra el jdk o propone uno diferente que haya instalado en el sistema.

Instalar NetBeans

Puedes instalar la versión de NetBeans que trae tu distribución de Ubuntu, busca "netbeans" en el menú Aplicaciones->Añadir y quitar. Una vez instalado NetBeans, podrás acceder a través del menú Aplicaciones->Programación.

Pero si quieres tener la última versión de NetBeans, puedes seguir estos pasos:

1.- Descarga NetBeans
2.- Haz botón derecho sobre el archivo descargado, selecciona Propiedades del menú emergente y accede a la pestaña Permisos.
3.- Activa la opción "Permitir ejecutar el archivo como un programa".
4.- Haz doble click sobre el archivo descargado y selecciona "Ejecutar en un terminal".

Otras versiones de Java

Puede que queramos instalar manualmente Java para tener la última versión (actualmente por ejemplo para utilizar Nimbus del update 10). Los pasos son los mismos que para NetBeans:

1.- Descarga el jdk de Sun. En este momento la última versión es Java SE Development Kit (JDK) 6 Update 11.
2.- Haz botón derecho sobre el archivo descargado, selecciona Propiedades del menú emergente y accede a la pestaña Permisos.
3.- Activa la opción "Permitir ejecutar el archivo como un programa".
4.- Haz doble click sobre el archivo descargado y selecciona "Ejecutar en un terminal".

Con esto tendremos un jdk instalado en el directorio donde lo descargamos y ejecutamos. Podemos mover la carpeta a otro sitio, pero no es necesario para nuestros propósitos. Si quisiéramos hacer accesible el jdk a otros usuarios podríamos mover la carpeta a un lugar como /usr/local.

Podemos instalar ahora NetBeans indicándole la ruta del jdk, o bien añadir el nuevo jdk en una versión de NetBeans ya instalada, a través del menú Herramientas -> Plataformas Java.

Si queremos especificar el JDK que usará NetBeans al ejecutarse, podemos editar el siguiente archivo:

/etc/netbeans.conf

donde es el directorio donde está instalado NetBeans, como c:\archivos de programa\netbeans en Windows por ejemplo. Especificaremos la ruta al JDK que queramos establecer aquí:

# Default location of JDK, can be overridden by using --jdkhome [dir]:
netbeans_jdkhome="/home/mperezma/running/jdk1.6.0_10"


Si además quieres que Ubuntu utilice el nuevo jdk de forma predeterminada,

sudo update-alternatives --install "/usr/bin/java" "java" "/foo/jdk1.X.U/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/foo/jdk1.X.U/bin/javac" 1


donde foo es la ruta hasta el jdk y X.U dependerá de la versión que hayas instalado
Finalmente, cambiamos los enlaces simbólicos para java en el sistema:

sudo update-alternatives --config java

y para el compilador:

sudo update-alternatives --config javac

martes, 21 de octubre de 2008

10º Cumpleaños de NetBeans!

De acuerdo, si no blogueas, no existes. Hay que bloguear. Y además hoy tengo un buen motivo: necesito bloguear para conseguir una camiseta de NetBeans. Y muchos saben lo que se es capaz de hacer para ganar una camiseta, sobre todo si es de tu IDE favorito.

Felicidades en tu décimo aniversario NetBeans!!!