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.