Monthly Archives: December 2008

Feliz Año Nuevo 2.009

En ROTB os deseamos Feliz Año Nuevo 2.009 y un deseo: que no os dejéis los buenos propósitos en el tintero.

Lastfm widget published!

Hi folks, I’m glad to announce that Lastfm-widget plugin, developed by me, has been published by WordPress.Org 🙂 Below you can find the URL.

http://wordpress.org/extend/plugins/lastfm-widget/

Don’t hesitate to post any comment and suggestion!

Thanks and have a happy new year!

Interfaces Comparator y Comparable (II)

Lo prometido es deuda y ahora que tengo un slot libre de tiempo aquí tenéis el ejemplo que ilustra la primera parte de éste artículo. Podréis observar que al implementar el interfaz Comparable mediante la sobrecarga o implementación, del método abstracto (ver comentarios), compareTo(…) se ha utilizado el mismo método que proporciona Integer. De forma similar se hubiera podido implementar cualquier comparación devolviendo los valores indicados, en el “contrato” de la interfaz, según nuestro propio criterio. En este caso se ha modificado el valor devuelto, multiplicándolo por -1, para obtener la ordenación inversa, tal y como lo mencionó ‘jsanca’ en el comentario a la primera parte publicada también el DebugModeOn.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.util.Vector;
import java.util.Iterator;
import java.util.Collections;
 
public class Persona implements Comparable<persona> {
	private String miNombre;
	private Integer miEdad;
	private Float miAltura;
 
	public Persona(String nombre, int edad, double altura) {
		this.miNombre = new String(nombre);
		this.miEdad = new Integer(edad);
		this.miAltura = new Float(altura);
	}
 
	/**
	 * Return a negative integer,
	 * zero, or a positive integer as
	 * this object is less than, equal to,
	 * or greater than the specified object.
	 */
	public int compareTo(Persona per) {
		// Multiplicamos por -1 para obtener la ordenación
		// inversa como apuntó 'jsanca' en su comentario.
		return this.miEdad.compareTo(per.getEdad()) * -1;
	}
 
	public Integer getEdad() {
		return miEdad;
	}
 
	public void setEdad(int edad) {
		this.miEdad = new Integer(edad);
	}
 
	public Float getAltura() {
		return miAltura;
	}
 
	public void setAltura(double altura) {
		this.miAltura = new Float(altura);
	}
 
	public String toString() {
		StringBuffer result = new StringBuffer();
		result.append("Me llamo " + this.miNombre);
		result.append(", tengo " + this.miEdad);
		result.append(" y mi altura es " + this.miAltura);
		return result.toString();
	}
 
	/**
	 * Main para probar la clase.
	 */
	public static void main(String[] args) {
		// Franc
		Persona franc = new Persona("Franc", 38, 1.78);
		// Rosa
		Persona rosa = new Persona("Rosa", 29, 1.67);
		// Maite
		Persona maite = new Persona("Maite", 37, 1.98);
 
		// Creo una comunidad de personas.
		Vector miComunidad = new Vector();
		miComunidad.add(franc);
		miComunidad.add(rosa);
		miComunidad.add(maite);
 
		// Ordeno por edad la comunidad de personas.
		Collections.sort(miComunidad);
 
		// Ya se puede listar la comunidad ordenada.
		Iterator personaIter = miComunidad.iterator();
		System.out.println("Comunidad ordenada por edad.");
		while (personaIter.hasNext())
			System.out.println(personaIter.next());
	}
}

El resultado de la ejecución es el siguiente:
Mi comunidad ordenada por edad.
Me llamo Franc, tengo 38 y mi altura es 1.78
Me llamo Maite, tengo 37 y mi altura es 1.98
Me llamo Rosa, tengo 29 y mi altura es 1.67

Nos vemos en la próxima y última parte donde comentaré el uso de la interfaz Comparator.

Interfaces Comparator y Comparable (I)

Es posible que en ocasiones nos veamos obligados a ordenar o comparar clases que nosotros hemos implementado y que bien no pueden seguir unos criterios de comparación triviales. Por ejemplo al implementar la clase Persona y añadir n instancias en un vector, quizás aparezca la necesidad de ordenar dicho arreglo de personas. Está claro que recorriendo el vector y moviendo los objetos aplicando nuestro propio criterio se lograría el fin. Pero también es interesante conocer otras opciones. Si la elección de la plataforma y el lenguaje es Java, la implementación de la interfaz Comparable en la clase Persona es la forma más limpia, elegante y reusable para poder aplicar posteriormente una comparación entre objetos Persona. Para cumplir con el contrato de la interfaz únicamente estamos obligados a implementar el método:

public int compareTo(Object obj) throws ClassCastException;

dónde se debe devolver un valor negativo (-1) si nuestra instancia es menor que la instancia obtenida por parámetro, cero (0) si ambas instancias son iguales y un valor positivo mayor que cero (1) si nuestra instancia es mayor que la obtenida por parámetro. De igual manera se debería lanzar una excepción si la instancia obtenida por parámetro no es una instancia de la clase implementada.

Al implementar este método a la clase Persona, es posible ordenar y comparar objetos Persona que se encuentren en contenedores como Vector, Stack, TreeSet, etc. o en un vector de Personas (Persona[]). A diferencia de clases como TreeSet que ya ordena al añadir objetos, cuando se quiera obtener un objeto Vector, Stack, etc. o un vector ordenado, utilizaremos el método de clase Collections.sort(..), y volià al contenedor se le aplicará una ordenación siguiendo el método de ordenación implementado para Persona, que bien podría aplicarse a la edad, altura, peso, etc.

En el siguiente post (de ésta serie) y a través de un ejemplo, se mostrará lo explicado y los resultados obtenidos así como una introducción a la interfaz Comparator.

Error al instalar SP1 para Office 2008 (Mac).

Qué sorpresa la mía al encontrarme, después de instalar el SP1 (unos 250MB) para MS Office 2008, que cuando quiero ejecutar una aplicación del paquete de ofimática se ejecuta automáticamente el instalador de Office cerrando la aplicación del paquete que quiero ejecutar (Word, Excel, etc.). Investigando he descubierto que esto sucede cuando el asistente para la instalación de Office detecta una clave incorrecta 🙁 what a hell… así que de nuevo a teclear los 25 caracteres que conforman la clave del producto. Y, además, quedaba otro escollo, cómo resetear la clave que en su día tecleé. Pues vuelta a buscar y voilà… borramos el fichero: Microsoft_Office_2008_settings.plist localizado en /Usuarios/usuario/Librería/Preferences/Microsoft/Office_2008 y a continuación la misma operación con el fichero OfficePID.plist localizado en /Aplicaciones/Microsoft_Office_2008/Office. Y ahora sí ya podemos teclear (repetir) la clave de producto para poder utilizar MS Office 2008. También hay otra opción… bajarnos el OpenOffice 3.0, desde la web de Sun y a correr que funciona igual o mejor, además dispone de diccionario en Catalán, Español, Inglés, etc. y todo ello sin pagar un céntimo.