28 noviembre 2006

Colaboraciones en la Chuwiki

Quiero agradecer un par de colaboraciones interesantes en la Chuwiki.

Por un lado, Pete ha añadido un pequeño tutorial de Hola Mundo con J2EE y JBoss, aunque de momento está sin terminar, lleva buen ritmo.

Por otro, Walter ha añadido la forma de inicializar los gráficos con graphics.h de Borland C++ y un resumen de las funciones gráficas que nos ofrece este compilador.

Así que gracias a ambos, les animo a seguir metiendo más cosas y animo a cualquiera que quiera colaborar a seguir el ejemplo. Cuantas más cosas metamos entre todos, más gente podrá ver resueltas sus dudas y problemas.

25 noviembre 2006

Diseño del software

La verdad es que cada vez estoy más desilusionado con el diseño de software, el uml, metodologías de desarrollo y todo lo demás.

Es cierto que se necesita pensar antes de ponerse a codificar, tener claro que se quiere hacer, pensar posibles soluciones y elegir la mejor. Lo que cada vez me parece perder más el tiempo es escribir todo eso en papel antes de codificar, hacer diagramas uml, de clases, de secuencia, etc.

Ojo, sí es conveniente de vez en cuando hacer un diagrama, pero yo creo que basta con uno informal y con poco nivel de detalle, lo suficiente para que nos entendamos los programadores.

Lo que no veo en absoluto es meterse a un diseño detallado, metiéndose a nivel de clases y métodos. El porqué es sencillo. Vamos a perder mucho tiempo y en cuanto llevemos un par de días tirando código, van a empezar a salir todas las cosas que no pensamos en el diseño y al final el código no se va a parecer en nada al diseño. Hasta que no hacemos el código, es bastante imposible prever todos los detalles, el diseño detallado sirve más bien de poco.

También el cliente en general suele ayudar bastante a que hacer diseño detallado sea una pérdida de tiempo. Habitualmente el cliente no sabe lo que quiere y cambia de opinión sobre la marcha. Bastan un par de cambios de idea elegidos adecuadamente para que el diseño detallado (y el no tan detallado) se vaya a la porra.

Lo que veo más útil con mis compañeros de trabajo es repartirnos el trabajo y dejar claras las interfaces entre nosotros, bien sean métodos de las clases, mensajes de sockets o como sea que se comunique el sofware que hacemos. A veces basta con decir los métodos o mensajes y que se espera que haga la clase cuando recibe el mensaje o la llamada al método. Otras veces es necesario un diagrama de secuencia para definir una interacción en el tiempo algo más compleja. Una vez hecho esto, que nos facilitará la integración, basta con que cada uno programe a su bola su trozo de código.

Cada vez veo más útil el tema de refactorización de código. Al igual que es imposible diseñar con detalle, también es imposible hacer bien el código a la primera. Es importante tomarse con frecuencia pequeños periodos de tiempo para arreglar el código ya hecho, alternando código nuevo con arreglos de código existente. Además, los IDEs actuales, como eclipse, vienen con montones de opciones de refactorización de código. Basta seleccionar un trozo de código para separarlo en un método aparte, para llevarse un atributo o un método de una clase a su clase padre, etc.

En resumen, que la forma que veo más útil de desarrollo de software es pensar un poco y hacer los diagramas justos para que todos los programadores sepamos que se espera de nuestro código y cómo interactua con el de los demás. Luego cada uno piensa su código y se pone a hacerlo. Es importante arreglar el código sobre la marcha según se vaya embarullando.

Me queda un tema que todavía no tengo claro, que es el de cómo conseguir que el código de una persona sea reutilizado por otra. No sirve poner documentación del código accesible ni comentar. La gente simplemente no busca ahí cuando necesita hacer algo, salvo que sea algo realmente complicado. Aunque todavía no hemos llegado a ello, cada vez me estoy conenciendo más de que la forma mejor para conseguir esto va a ser la programación en parejas típica de la programación extrema. Quizás también las reuniones diarias de unos minutos entre varios programadores para contarse qué están haciendo, qué problemas tienen, qué podrían hacer en común para ambos.

23 noviembre 2006

syncback

Como siguiente paso a la compra del disco duro externo USB, me he bajado syncbak. Es un programa de copias de seguridad con un montón de opciones, entre que se incluyen unas opciones interesantes de sincronización de directorios.

Se le dicen los dos directorios, por supuesto en mi caso uno en el disco duro interno y otro en el externo, y se le dan las opciones de copia que se desea. Pueden ser cosas como esta:
  • Lo que está en origen que no está en destino, copiarlo.
  • Lo que está en destino que no está en origen, copiarlo o ignorarlo. Si elegimos copiarlo, cada vez que borremos un fichero en origen y ejecutemos el programa, se nos restaurará.
  • Si el mismo fichero está modificado en ambos lados, quedarse con la versión más moderna.
  • etc
Se pueden crear varias tareas de este estilo con distintos directorios, por ejemplo, mi directorio de fotos de cámara digital, mi directorio con la página web, etc. Estas tareas se pueden lanzar a mano o programarlas para que se hagan a cierta hora.

Resumiendo, una cosa útil para tener copias de seguridad en dos discos, poder restaurar, etc.

21 noviembre 2006

Editor de textos

Estoy haciendo en plan de muestra para la página web un pequeño editor de textos en java. Simplemente una caja de texto para escribir y opciones de menú para salvar fichero, cargar fichero y buscar una cadena de caracteres en el texto escrito.

Recuerdo hace muchos, muchos, muchos años, en los tiempos del basica (o gwbasic) que también hice en varias ocasiones un editor de textos. ¡Vaya diferencia!

Antes, con el basica, me preocupaba yo de todo. Controlar la posicion x,y del cursor, capturar las teclas para escribirlas, capturar las teclas de borrado para borrar, las flechas para moverme, etc, etc. Manejaba arrays y arrays de caracteres y variables con posiciones dentro de esos arrays y me dedicaba a mover arrays de caracteres de un sitio a otro.

Ahora, con java, no hay que preocuparse de cómo hacer las cosas. El problema principal con java es pelearse con la API, para encontrar el método o la clase que hace lo que tú quieres hacer, porque es seguro 100% que hay un método o una clase que hace lo que quieres hacer, pero no sabes cómo se llama. Es más, hay más métodos y clases que hacen más cosas que las que posiblemente quieras hacer o te imagines siquiera que puedes querer hacer en toda tu vida.

Antes querías hacer poca cosa y con eso ya tenías trabajo para varios días, haciéndolo. Ahora quieres hacer muchas cosas y tienes trabajo para varios días, buscando quién lo hace.

20 noviembre 2006

Mis cacharros y yo

Nada, que al final el disco duro externo que me compré un asquito. Seguía fallando, aunque parece que en el otro puerto USB se portaba algo mejor.

Esta tarde fuí al Media Market a cambiarlo y por si acaso, cojí otro de otra marca. El primero era un iomega de 320 Gigas, 120 €. El que he cogido ahora es un LaCie de 250 Gigas, 100 € menos un céntimo. Este parece que va bien, al menos en dos horas dándole caña no ha fallado.

Por cierto, que contándole mis penas con los cacharros a un compañero de trabajo, más o menos le dije: "este fin de semana me he comprado un móvil y un disco duro. El disco duro me falla y voy a cambiarlo esta tarde. El móvil bien, pero es porque no lo he mirado". Se lo paso para que lo vea, le echa un ojo, me mira luego a mi y dice -"Pone error en tarjeta". "No, si ya te dije que no lo había mirado", contesté.

Menos mal que se arregló apagando y encendiendo...

La informática es un asco o yo soy un pupas

Mi historia con los cacharros, informáticos sobre todo, es una verdadera odisea.

El primer ordenador que compré tuve que devolverlo porque no le iba el puerto serie. Me trajeron otro y era una tecla del teclado la que no iba. El siguiente no le funcionaba la toma del micrófono en la parte delantera. En otra ocasión se me fué al garete la placa madre y tuve que cambiarla.

En cuanto a CD/DVD, ya se me han fastidiado un lector de DVD y un grabador de CD. Sé que tienen una vida limitada, pero en ambos casos me ha parecido más bien una escasez de vida.

El nero se me queda colgado a veces cuando quiero grabar un DVD. Por supuesto, se carga el DVD. El Dreamweaver también da fallos de vez en cuando y hay que cerrarlo.

Y lo que más me cabrea en estos momentos, el disco duro que compré ayer me ha dado unos problemas raros, estilo

"Windows no pudo guardar todos los datos para el archivo D:\\$Mft. Se perdieron los datos La posible causa de este error puede ser un error en el hardware de su PC o en la conexión de red. Intente guardar este archivo en otro sitio.

Lo de $Mtf puede cambiar por el fichero que esté intentando copiar en el momento.

Mirando por internet veo que este problema pasa, no queda claro si es del disco duro o de windows, pero tiene pinta que es algún problema de tiempos con el que windows es muy exigente.

De momento parece que se ha solucionado metiendo el disco en otro puerto USB, pero desde luego ya no lo uso tranquilo. Además ese aviso de "se perdieron los datos" no es como para dejar tranquilo a nadie.

Hay ocasiones que me apetece tirar el ordenador por la ventana y dedicarme al pastoreo de ovejas. Aunque quizás tampoco sea buena idea, seguro que los pastores de ahora tienen móvil y palm contador de ovejas ...

18 noviembre 2006

La casa por la ventana

Esta mañana, de compras, la casa por la ventana. Un móvil entero para reemplazar la batería estropeada del móvil viejo. Un disco duro externo de 320 Gigas para hacer copias de mis fotos y videos del disco.

En realidad el disco duro externo tenía ganas de él precisamente para copias de las fotos de la camara digital y de los vídeos VHS de los niños que estoy pasando a DVD. Me daba "cosa" tener una única copia en un disco duro. Las fotos no me dan para un DVD y los videos me ocuparían varios DVD. En fin, un pequeño rollo.

Al instalar ubuntú, vi que iba bastante bien, aunque un pelín lento. Tenía una partición antigua de 2 Gigas en la que hace mucho instalé un linux antiguo. Al instalar ubuntú ese espacio se le queda chico y 256 megas de swat teniendo 256 megas de memoria también se me antoja poco.

Ahora, con el disco externo y el principal en varias particiones, a ver si soy capaz de vaciar una de ellas, de 80 Gigas, para dejársela totalmente a ubuntú. Como dije en otra ocasión, soy nostálgico de unix y voy a intentar pasarme a él. Posiblemente tenga de dejar windows para ciertas cosas, pero trataré de usar linux y software gratuito lo más que pueda.

Foro java de eMagister

Los de eMagister han contactado conmigo para hacerme "experto" de java en su foro de java.

En principio yo no me comprometía a nada, simplemente a visitar y contetar en el foro cuando tuviera tiempo. Como eso es algo que hago habitualmente, no ese foro, pero sí en otros, pues no había problema por mi parte y dije que por mi parte.

Serpiente Chuidiang La primera pega se presenta cuando me piden una foto mía para poner allí. Les propuso poner un logo, este de la izquierda en concreto, pero me dijeron que no, que podían superponerlo encima de la foto, pero que mejor la foto.

Como de todos es sabido que soy un poco feo, pues dije que no quería enviar foto. No pasó nada. Me hicieron experto igualmente y me pusieron en su lugar una silueta genérica.


careto chuidiangVaya, eso es el segundo problema. Antes estaba dado de alta en ese foro como usuario normal y tenía puesto mi careto, el de la izquierda, que es parece más a mí que la silueta que ellos me han puesto. Al menos tengo ojos. Ahora tengo la silueta de ellos y no puedo cambiarla otra vez por esto (el enlace de "Datos personales" no funciona).

Así que sigo visitando el foro y contestando, pero al ser "experto" no puedo poner la imagen que yo quiera mientras que los afortunados usuarios no expertos del foro sí pueden.

16 noviembre 2006

Curiosidades de java

No hace mucho, viendo código java por internet, me encontré con una expresión como esta:

if ( "".equals(variableString) )
...

Lo primero me llamó la atención lo curioso de ella. Se puede poner una cadena entre comillas... y llamar a métodos de la clase String con ella.

Luego, puestos a mirar el porqué se hace esa curiosa llamada cuando la forma aparentemente habitual es esta otra

if ( variableString.equals("") )
...

se me ocurrió el posible motivo. Muchas veces esa variableString nos viene como parámetro de un método o vete tú a saber de dónde, por lo que puede ser null. La llamada a equals() dará una excepción en ese caso. Para evitarlo, el if se hace más complejo

if ( (variableString != null) && (variableString.equals("")) )
...

debiendo, además, fiarnos de que el compilador va a ser listo y cuando comprueba que la primera condición no se cumple no se molesta en comprobar la segunda. Normalmente el compilador es listo y lo hace así. De todas formas, para no tener que fiarse, el if todavía es más peor

if (variableString != null)
if (variableString.equals(""))
...

Sin embargo, haciéndolo con el "".equals(variableString), se evita esa comprobación adicional de que no sea null y esa confianza ciega en el compilador.

El bazar de java

En el trabajo, en una parte de la aplicación, construimos un árbol (un JTree de java) de cosas muy serias e importantes consultando una base de datos y lo mostramos en pantalla.

Hace poco hicimos unas pequeñas modificaciones y en unas pruebas construimos un árbol grande, con muchos elementos. Las modificaciones hacían además que las consultas a base de datos fueran más lentas de lo normal. El caso es que el árbol tardaba unos quince segundos en cargarse.

¡Sorpresa!. Mientras se carga el árbol de base de datos, el JTree en vez de vacío, mostraba esto

JTree por defecto de java
Resulta que ese "hipermercado" de cosas es lo que muestran los JTree de java por defecto mientras nadie les diga lo contrario. En nuestras pruebas de la aplicación se mostraba eso durante unos quince segundos, hasta que era reemplazado por las cosas serias e interesantes de los jefes y clientes serios (con bigote).

Por supuesto, el cabreo-cachondeo de los mismos fué mayúsculo.

11 noviembre 2006

Linux Ubuntu

Como siempre he trabajado en unix (solaris por más señas) y lo de windows es algo relativamente nuevo (ya unos años, pero no tantos como en solaris), soy un nostálgico de los sistemas unix.

Siempre he tenido en casa instalada alguna versión de linux: red hat primero, mandrake después y finalmente suse. Sin embargo, nunca me habían satisfecho del todo. El "feeling" (que diria los ingleses) nunca era bueno del todo. El sistema de ventanas no era tan elaborado como windows o el de solaris. El movimiento de ratón no me convencía. La instalación de algo nuevo siempre me daba quebraderos de cabeza, siempre he sido programador, nunca administrador. A pesar de toda la fama de linux, tanto red hat, como madrake como suse se me quedaban colgados en ocasiones, posiblemente por culpa de algo de mi hardware.

Sin embargo, sigo siendo nostálgico de los sistema unix y, fiel a mi nostalgia, acabo de instalar ubuntu. Lo primero que me ha maravillado es la facilidad de instalación. No me ha preguntado nada, salvo cuatro tonterías, como idioma, ciudad en la que estoy por aquello de la hora .... y las particiones del disco duro. Bueno, eso de las particiones no es ninguna tontería. O sabes lo que haces o puedes montar un buen estropicio. Afortunadamente, eso de las particiones es de lo poco que controlo en linux. Por no preguntar, no pregunta ni qué usuario quieres para root. Bueno, sí pregunta que usuario quieres y supongo que ese es el root, porque no hay otro.

Listo, funciona todo a la primera y sin hacer nada: sonido, internet, los discos de windows ya montados, etc, etc. Además, el ratón y las fuentes de letras me parecen correctas.


Seguiré una temporada con él a ver como va la cosa.

09 noviembre 2006

MiArroba

Navegando, he descubierto http://miarroba.com/

Es este sitio te das de alta y te dan un montón de cosas: página web con 500 megas, transferencia ilimitada, php y mysql, blogs, foros para que crees y administres tú mismo, etc, etc.

Eso es lo bueno. Lo malo es que va algo lento, tiene demasiada propaganda, aunque en tu foro y tu blog no meten más que un banner arriba del todo. La otra pega es que el firewall me avisa de vez en cuando que "ha prohibido acceder a mi ordenador desde el sitio miarroba.com". También te dan muchas cosas de publicidad, para que recogas direcciones de correo y se las mandes, etc, etc.

En fin, dan mucho a cambio de publicidad. De todas formas y para probar qué tal he abierto un blog, por supuesto también de programaión y un foro de java, C++ y php.

El blog no creo que crezca mucho, puesto que prefiero seguir escribiendo en este. En cuanto al foro, lo visitaré de vez en cuando para ver cómo va, pero tampoco pienso hacerle demasiada propaganda.

08 noviembre 2006

Continuum

Continuum es otra herramienta de gratis similar al CruiseControl, de esas que están pendientes en un proyecto de si alguien mete algo en CVS (o subversion o lo que tengamos) y lo saca, lo compila y envía un correo avisando automáticamente.

Aunque no he hecho demasiadas pruebas, la he instalado para ver qué pinta tiene. Desde luego de aspecto me gusta más que CruiseControl.

En primer lugar la instalación es mucho más sencilla. En CruiseControl tienes que andar copiando y creando directorios a mano, con lo que te lees el manual para ver qué es lo que tienes que hacer, o no hace nada. Continuum es simplemente desempaquetar en un sitio y ejecutar.

Continuum crea un usuario administrador que desde el mismo navegador puede añadir nuevos proyectos, eliminarlos y demás. Los demás usuarios pueden ver los resultados de la compilación y hacer compilaciones. En CruiseControl toda la administración se hace desde un fichero .xml, en el que ahora tengo varios proyectos y en el que tengo varios bloques muy similares repetidos (una vez por proyecto). Unicamente cambia el directorio, el nombre del proyecto y poco más.

Sin embargo hay una cosa que no me ha gustado de Continuum. Si el proyecto es maven, Continuum pide que en el pom.xml esté la información necesaria para extraer el proyecto de CVS. Eso quiere decir que en el pom.xml hay que meter un CVSROOT válido, con usuario y todo. ¿Por qué el pom.xml que está en CVS y supuestamente es compartido por todos los programadores del proyecto debe llevar un usuario de uno de ellos dentro?.

Tampoco me ha funcionado a la primera el meter un proyecto maven con subproyectos. Como de momento tengo CruiseControl funcionando, tampoco me he preocupado de investigar cómo hacerlo y ese es el momento en que dejé las pruebas con Continuum.

Sin embargo, la buena pinta que tiene, me hace pensar que en cualquier momento volveré a él para probar.

05 noviembre 2006

Maven otra vez

Como últimamente ando muy metido en maven, qué menos que hacer un pequeño tutorial para iniciarse en maven.

He puesto lo mínimo para hacerse una idea y empezar con un pequeño proyecto java, pero se me han quedado muchas cosas en el tintero. La verdad es que cuanto más me meto en maven, más cosas descubro y más me gusta el que todos los proyetos se hagan igual, que el script de compilado no sea distinto en cada sitio, no tener que revisar los antiguos scripts de otros proyectos para que el script del nuevo proyecto se parezca.

Sin embargo, contar todo lo de maven, aparte de que yo no me lo sé, iba a ser demasiado extenso y rollo. Por eso prefiero un pequeño tutorial para enterarse de qué va y dar los primeros pasos, de forma que el que tenga interés tenga una base mínima para empezar a investigar.

BorderLayout, FlowLayout y BoxLayout

Acabo de hacer un pequeño ejemplo de cómo usar el BorderLayout, FlowLayout y BoxLayout. Estos Layouts de java se complementan bien para hacer la típica ventana principal de una aplicación, en la que hay una zona central grande y luego una serie de botonería en la parte superior y en el lado derecho o izquierdo.

A ver si para la siguiente pongo un pequeño ejemplo de un JFrame en el que se use su zona de menús, una barra de herramientas y un JDesktopPane, para meter dentro JInternalFrame. Quizás también un hueco para poner en el lado derecho un pequeño menú/botonería.

Por cierto, para este ejemplo tonto de una clase, pero para el que tenía que generar el jar para poner en el Applet de la página, me he creado un mini-proyecto con maven. Esta herramienta, una vez que se conoce, es tan simple y eficiente para estas tareas básicas que me la he instalado en casa y la estoy usando para mis pequeños programitas.

02 noviembre 2006

Validar la entrada de un JTextField

Cuando queremos que un JTextField sólo se puedan admitir dígitos, o una longitud determinada o cualquier otra restricción, hay muchas posibles soluciones.

He tratado o probado muchas de ellas. En este blog, en mi página de Tutoriales de Java y en varios foros he ido poniendo algunas de ellas.

Al final, me he decidido a poner en la Chuwiki un artículo en que se recopilan todas ellas, con un pequeño ejemplo. Allí tienes un pequeño listado con ejemplos de cómo conseguir que un JTextField sólo admita núemeros.

Para el caso concreto de números, a mi me gusta más la opción del JFormattedTextField, ya que es bastante tonta y nos ahorra convertir luego el String a un número y viceversa.

En cuanto a limitar la longitud total, a mi me gusta más la de reemplazar el Document.

01 noviembre 2006

Plugins de Maven

Sigo investigando con maven.

En FreeHep he encontrado un pequeño "filón" de plugins para maven.

Un tema que me preocupaba eran los objetos remotos de rmi en java. Para que funcionen, una vez compilados, hay que pasarles el compilador rmic. No tenía muy claro cómo se hacía esto con maven y creo que lo he encontrado. Hay un plugin de forma que poniendo en el pom.xml qué clases son las que necesitan pasar rmic, lo pasa. En la Chuwiki puedes ver qué es lo que hay que añadir al pom.xml para que maven pase el rmic a las clases que lo necesitan.

También había oido hablar de él, pero aquí lo he encontrado. Otro plugin de maven que desempaqueta las librerías externas que necesitamos (log4j.jar, ojdbc14.jar, etc) y empaqueta sus class junto con los nuestros en un único jar. De esta forma evitamos tener que distribuir nuestra aplicación con varios jars. En la Chuwiki puedes ver la configuración del plugin jarjar en el pom.xml.

Además de plugins, en FreeHep hay otras librerías java que pueden ser interesantes.