JavaCup 2008: demuestra tus habilidades Java

Posted on April 21st, 2008 in Devel, Java by admin (309 lecturas)

¿Sabes programar en Java? No hay que ser ningún experto, basta con que sepas seguir un API para poder participar en el concurso JavaCup 2008, organizado por JavaHispano y SUN Microsystems por 2º año consecutivo. El objetivo: programar una táctica que seguirá tu equipo de fútbol virtual para derrotar al contricante. Incluso hay vídeos explicativos paso a paso de cómo crear un equipo simplón ;-)  El año pasado animé a mis alumnos a participar y no tuve éxito. Veamos si este año encuentro a algún valiente ;-)

Plantilla en Java del patrón Singleton para Eclipse

Posted on April 1st, 2008 in Devel, Eclipse, Java by admin (414 lecturas)

Parafraseando a Groucho Marx: éstos son mis títulos de post. Si a usted no le gustan, tengo otros ;-)

Warning: post muy técnico.

Si programas en un lenguaje orientado a objetos, es probable que te hayas encontrado a menudo con el patrón singleton. Últimamente me he encontrado tecleando las líneas de este patrón en Java una y otra vez, con lo que se me ha encendido la bombilla de la pereza: “y ésto… ¿no lo podré automatizar?” Por supuesto. En Eclipse es sencillo:

Window->Preferences->Java->Editor->Templates. Click en New e insertar el siguiente código. Darle un nombre (”singleton” podría ser una decisión acertada ;-) . Cuando quieras usar el patrón en tus clases Java, escribe “singleton” y pulsa Ctrl+Espacio. ¡Magia!

private static ${enclosing_type} instance;
private ${enclosing_type}(){}
public static ${enclosing_type} getInstance(){
if(null == instance){
instance = new ${enclosing_type}();
}
return instance;
}

Nota: ojito, que esta forma de implementación del patrón parece sufrir una condición de carrera en el bloque if … una posible solución sería inicializar la referencia estática en la propia sección de declaraciones.

TopCoder UML Tool: publicado el código fuente

Posted on March 2nd, 2008 in Devel, Java, OpenSource by admin (404 lecturas)

TopCoder UML ToolTopCoder.com publica semanalmente varios retos relacionados con distintos aspectos de la ingeniería del software. Retan a los ingenieros informáticos de todo el mundo a ofrecer soluciones de diseño de aplicaciones, diseño de componentes, ensamblado de componentes, programación de dichos diseños, programación de algoritmos,… Todos (o casi todos) los retos vienen acompañados de recompensas económicas. Lo más importante, en mi opinión, es que todo el material que se genera en esos retos suele publicarse (a veces sólo durante la fase de revisión pública, como algunos diseños), de tal forma que si te has atascado en algún reto o bien quieres ver cómo han solucionado otros informáticos el problema, puedes hacerlo. Me resulta especialmente interesante ver y estudiar el código de los problemas de algoritmos más duros, así como los diagramas UML de algunos diseños, de los cuales, se aprende todos los días algo jugoso. Una gran web y un gran recurso formativo.

Hecha la presentación de TopCoder me gustaría hablaros ahora de una herramienta que, a pesar de llevar ya algún tiempo publicada, no ha sido hasta hace unas semanas cuando TopCoder ha decidido publicar su código fuente: se trata de la aplicación TopCoder UML Tool, una herramienta que permite generar distintos diagramas UML: diagramas de clase, de secuencia, de casos de uso, …

Hasta la aparición de TopCoder UML, los diseñadores debían de usar Poseidon para generar los diagramas UML solicitados. Gran herramienta, basada originalmente en ArgoUML, ésta última software libre (y que participó el año pasado en el Google Summer Of Code para añadirle algunas funcionalidades que no poseía, como la posibilidad de realizar diagramas de secuencia).

Lo bueno de la ‘liberación’ de TopCoder UML no sólo es que han publicado el código fuente, sino que en el esfuerzo han abierto para la comunidad toda la documentación generada en su proceso de construcción: casos de uso, diagramas de actividad, documento de especificación de requerimientos, prototipos, plan de gestión de la calidad, diagramas de secuencia, diagramas de componentes, diagramas de interfaces, especificación de componentes, … Estudiar esta documentación nos puede servir para hacernos una idea muy concreta de lo que supone construir una aplicación moderna, hoy en día, siguiendo una metodología, es decir, justo lo que interesa a cualquier alumno de ingeniería del software. Eso sí, hay que tomárselo con calma y mucho café al lado, dado que hay mucho material ;-)

Cómo borrar la caché de credenciales de Eclipse

Posted on March 1st, 2008 in Devel, Eclipse, Java by admin (395 lecturas)

Si trabajas con Eclipse y Subversion (plugin Subclipse) tal vez te haya pasado: has metido mal el login y/o password en la ventana de autenticación y quieres poner el correcto. O bien, has puesto el correcto pero al día siguiente te comunican que ha cambiado. Eclipse no te dejará cambiarlo, se acordará constantemente del viejo. ¿Cómo arreglarlo? Borrándole la memoria :-) Es decir, borrando el fichero caché de credenciales que en mi PC se guarda aquí:

~/.eclipse/org.eclipse.platform_3.3.0_1543616141/configuration/org.eclipse.core.runtime/.keyring

Espero que al menos os sirva para ahorraros el quebradero de cabeza que he sufrido (y a mí para recordarlo en el futuro…)

HackIt! Nivel 3: solución

Posted on February 28th, 2008 in HackIt, Java, Seguridad by admin (365 lecturas)

El primer paso por tanto, será realizar ingeniería inversa sobre el binario .class. Para ello, tras buscar un buen descompilador de clases Java, nos encontramos con Jad, una aplicación gratuita (no-libre) multiplataforma.

Descargaremos la versión 1.5.8e compilada estáticamente para no tener problemas de dependencias con ninguna librería.
A continuación, descargaremos el fichero secApplet.class en el que se basa el reto 3.

$ wget http://hackit2.diariolinux.com/secApplet.class

Y procedemos a la descompilación:

./jad secApplet.class

Tras algunos warnings, obtendremos el fichero secApplet.jad, que al abrirlo, comprobaremos que se trata del
código fuente Java original de la clase secApplet. También veremos que la calidad del trabajo de descompilación realizado por Jad
es muy buena (probablemente debido también a que el autor del .class original no se preocupó de esconder su código).

Entre las funciones de interés del fichero .jad se encuentra el código del método decrypt()

String decrypt(String s)
{
String s1 = "";
StringBuffer stringbuffer = new StringBuffer(s);
for(int i = 0; i < stringbuffer.length(); i++)
switch(stringbuffer.charAt(i))
{
case 65: // 'A'
s1 = s1 + "L";
break;
case 66: // 'B'
s1 = s1 + "M";
break;
...

Si analizamos el flujo del programa veremos que se llama a ese método decrypt pasándole el parámetro basename (del código HTML del applet Java):

String s = getParameter("basename");
if(s != null)
s = decrypt(s);

Bien, preparemos una clase Java a la que daremos el nombre Hack, y que incluirá un método main() de prueba del método decrypt():


public class Hack {
public static void main(String[] args){
System.out.println( decrypt(args[0]) );
}
public static String decrypt(String s)
{
[incluír aquí el código de decrypt]
}
}
Compilamos nuestra clase de prueba:

$ javac Hack.java

Y la ejecutamos, pasándole como parámetro el valor de la variable “basename” que encontramos en el código HTML de la página:

$ java Hack jhtgh.spi
users.dat

Bueno, nos devuelve el nombre users.dat. Leyendo el código Java descompilado anteriormente, vemos que users.dat es el nombre del ficheroque se descarga desde getDocumentBase()+users.dat, es decir, desde http://hackit2.diariolinux.com/users.dat :

URL url = new URL(getDocumentBase(), s);
DataInputStream datainputstream = new DataInputStream(url.openStream());
String s1;
while((s1 = datainputstream.readLine()) != null){

Bien, vamos a ver qué se esconde en ese fichero:

$ wget http://hackit2.diariolinux.com/users.dat

Si hacemos un cat de users.dat vemos que es un string cifrado. Según el código Java descompilado, hay que descifrarlo, usando decrypt() otra vez:

$ java Hack `cat users.dat`
euskal|j4v4t0s|./level4-j4v4t0s.html|_self

Con lo que ya tenemos la clave del nivel 4.

Conclusiones: basar la seguridad de un procedimiento de autenticación en esconder el método de descifrado en un fichero binario es bastante ingenuo. Cualquier atacante con unos mínimos conocimientos de ingeniería inversa podrá saltarse cualquier método de seguridad por ocultación. Le costará más o menos tiempo hacerlo, pero podemos estar seguros de que podrá conseguirlo si se esfuerza lo suficiente…

Ubuntu y Tomcat : silencio en los logs

Posted on February 8th, 2008 in Eclipse, Java by admin (425 lecturas)

Ésta es fácil: has instalado Tomcat 5.5 y el sun-java5-jdk para empezar a desarrollar JSPs y servlets. Parece que todo va bien cuando lanzas Tomcat:

$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun-1.5.0.11/
$ sudo /usr/share/tomcat5.5/bin/startup.sh
Using CATALINA_BASE: /usr/share/tomcat5.5
Using CATALINA_HOME: /usr/share/tomcat5.5
Using CATALINA_TMPDIR: /usr/share/tomcat5.5/temp
Using JRE_HOME: /usr/lib/jvm/java-1.5.0-sun-1.5.0.11/

Pero resulta que por mucho que intentas conectarte a localhost:8180 , no hay conexión con Tomcat. Un análisis con netstat de los puertos a la escucha revela que el 8180 no está por la labor:
$ sudo netstat -plut
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:www *:* LISTEN 3679/apache
tcp6 0 0 *:ssh *:* LISTEN 3602/sshd

¿Dónde está el problema? En un archivo de tipo pipe que se crea en /usr/share/tomcat5.5/logs/catalina.out de forma incorrecta y que de rebote, bloquea Tomcat y no le permite enlazarse con el puerto 8180. La solución, sacada de este blog:

$ cd /usr/share/tomcat5.5/logs
$ sudo mv catalina.out catalina.out.old
$ sudo touch catalina.out
$ sudo chown tomcat55:nogroup catalina.out

Ahora, reiniciamos Tomcat y ¡listo! Ya podemos empezar a desarrollar nuestros servlets en http://localhost:8180

10 Millones de dólares en premios. ¿Participamos?

Posted on November 15th, 2007 in Android, Devel, Java by admin (733 lecturas)

Visual Editor para Eclipse Europa

Posted on July 29th, 2007 in Devel, Eclipse, Java by admin (6900 lecturas)

El editor de interfaces gráficas opensource instalable como plugin oficial de Eclipse es Visual Editor. Para mis clases de Ingeniería del Software y Programación II he utilizado este editor para la creación de GUIs, con éxito. El problema actual es que es incompatible con la versión Europa de Eclipse (la más moderna y estable). Hasta hace bien poco. Ya podemos instalar un parche para Visual Editor, no oficial, que lo hace compatible con Europa, tanto para Linux, MacOSX como para Windows.

Video tutoriales introductorios sobre Eclipse y Java

Posted on July 29th, 2007 in Devel, Java by admin (2846 lecturas)

El proyecto EclipseTutorial alojado en SourceForge.net tiene como objetivo enseñar a aquellos programadores novatos en Java con Eclipse video tutoriales de entre 9 y 14 minutos de duración. La versión de Eclipse que se trata es la 3.3 Europa (es decir, la más moderna, publicada hace un mes) . No se asume experiencia previa ni con Eclipse ni con Java. Disponemos de 16 lecciones, lo que totalizan unas 3 horas y cuarto de video, cada uno de entre 9 y 14 minutos de duración. Las lecciones nos guian paso a paso en el proceso de creación de una simple aplicación de una biblioteca personal. No hay por qué leer las diapositivas que se muestran en el vídeo, pues una voz en off nos lo va contando todo.

Todo el código de las lecciones se teclea en tiempo real. Esto permite poner en funcionamiento y explicar muchas de las características del editor Java de Eclipse que hacen la vida del programador mucho más facil. Además, disponemos de un PDF con todo el código que se va generando en el tutorial, para que no tengamos que picarlo nosotros a mano si no queremos.

Las lecciones siguien un desarrollo Test-driven mediante el uso del framework de pruebas JUnit integrado en Eclipse. Muy interesante para todo aquel que quiera aprender a desenvolverse con Java en Eclipse.