Puzzle, sumando y restando

Vamos a echar uno rápido:

public class SumarRestar {

	public static void main(String[] args) {

		int i = 0;

		i = --i-i+++i---i+++i-i--;

		System.out.println(i);

	}

}

Quién me dice qué saldrá por pantalla?

ATENCIÓN: si soportas cualquier tipo de ideología/religión a la que el siguiente texto le pueda resultar molesto, reemplaza, a tu gusto, tantos términos como desees hasta que te encuentres ante un contenido coherente con tus principios/creencias. No pretendo molestar a nadie.

RMS fanboys: Java ya no es malo.

AVISO: probablemente lo que voy a contar no lo haya inventado yo. No soy tan listo.

Qué delicado es el mundo de las relaciones. Lewis era un apuesto y joven campeón de Fórmula 1, vivía feliz y enamorado de la que entonces era su novia, Nicole, una no-famosa cantante de un no-famoso grupo pop (algo bastante común entre los campeones de F1 de aquellos años). Lewis tenía un problema: había tres chicas que estaban locamente enamoradas de él, ellas eran Katie, Price y Jordan, unas jóvenes muy atentas: las observadoras se hacían llamar. Tal era su obsesión por el joven inglés, que hicieron lo imposible hasta conseguir el número de teléfono de Lewis para poder llamarle y saber, en todo momento, si su estado con Nicole había cambiado.

Al principio recibía una llamada al día de Katie, Price y Jordan. Pero según pasaba el tiempo la cantidad de llamadas que tenía que contestar diariamente era mayor, aquello no parecía estar bien: su estado seguía siendo el mismo pero como buen caballero inglés que él era no se veía capaz de dejar de contestar a aquellas llamadas. Por otra parte a Nicole no le hacía mucha gracia lo de aquellas tres arpías.

Lewis era un tipo listo, un tipo con cabeza (que no con cabezón). Aquello tenía que cambiar, él no podía despreciar a aquellas maravillosas mujeres, además si el día de mañana su estado cambiaba quería que ellas fuesen las primeras en saberlo, pero por otra parte no podía soportar aquella ingente cantidad de llamadas. Entonces decidió que lo mejor era llegar a un acuerdo con Katie, Price y Jordan para, sin tener que ser ellas las que llamasen continuamente, poder avisarlas cuando su estado cambiase: era tan sencillo como tener su número y mandar un mensaje cuando su estado cambiase. Las ventajas eran claras: las observadoras podrían enterarse, Lewis no tendría que dejar de atender a Nicole para atender a llamadas intranscendentes, llamadas que iban a recibir la misma respuesta.

Katie, Price y Jordan estaban de acuerdo, pero a cambio le impusieron a Lewis una condición: podrían avisarle en cualquier momento para decirle que ya no estaban interesadas en él y que, por tanto, no hacía falta que fuesen notificadas de su cambio de estado. Lewis, chico listo, estaba de acuerdo, pero como no le gustaba desaprovechar ninguna posibilidad decidió que además cualquier chica debería poder suscribirse a su sistema de notificación.

Al principio todas seguían interesadas, Lewis era un sujeto deseado e interesaba conocer sus cambios de estado. Lewis se casó y todas las observadoras fueron avisadas, entonces Jordan decidió que ya no estaba interesada en Lewis y así se lo hizo saber. El grupo de las famosas observadoras ahora sólo estaba formado por Katie y Price.

Y era cuando ella, Nicole, tenía que decirle a Lewis algo así: I don’t need a man to make it happen / I get off being free / I don’t need a man to make me feel good / I get off doing my thing / I don’t need a ring around my finger / To make me feel complete / So let me break it down / I can get off when you ain’t around / Oh!. Su estado había cambiado, nadie le iba a llamar porque así lo había acordado con las observadoras, pero Lewis era un chico listo y como había acordado un método para avisar a las observadoras sólo tenía que ejecutarlo para que Katie y Price supiesen que su estado había cambiado. Katie y Price podían llamar a Lewis para conocer su estado puesto que sabían que este había cambiado.

Lo más increíble de esta historia no es que esté casi-basada en personajes reales, es el hecho de que todo esto sea un patrón de diseño: observer, en este caso siguiendo un protocolo de pull, sólo se notifica que el estado ha cambiado y los suscriptores se tiene que encargar de obtener el nuevo estado. Si se hubiese escogido un protocolo de push el estado podría haber sido pasado a través del método de aviso.

El acuerdo:

public interface SujetoDeseado {
	public void interesarse(Observadora o);
	public void desinteresarse(Observadora o);
	public void avisarObservadoras();
}
public interface Observadora {
	public void avisar();
}

El bueno y afable de Lewis:

import java.util.ArrayList;

public class Lewis implements SujetoDeseado {

	public enum Estado {
		SOLTERO, ENNOVIADO, CASADO
	};

	private ArrayList<Observadora> observadoras;
	private Estado estado;

	public Lewis() {
		this.observadoras = new ArrayList<Observadora>();
		this.estado = Estado.ENNOVIADO;
	}

	@Override
	public void avisarObservadoras() {
		for (Observadora o : this.observadoras) {
			o.avisar();
		}

	}

	@Override
	public void desinteresarse(Observadora o) {
		this.observadoras.remove(o);
	}

	@Override
	public void interesarse(Observadora o) {
		this.observadoras.add(o);
	}

	public Estado getEstado() {
		return this.estado;
	}

	public void estadoCambiado() {
		this.avisarObservadoras();
	}

	public void setEstado(Lewis.Estado estado) {
		this.estado = estado;
		this.estadoCambiado();
	}

}

Katie:

public class Katie implements Observadora {

	private SujetoDeseado lewis;

	public Katie(SujetoDeseado lewis) {
		this.lewis = lewis;
		lewis.interesarse(this);
	}

	public void loDelAmor() {
		System.out
				.println("Katie: A mi si que me vas a poder quitar todo!");
	}

	@Override
	public void avisar() {
		if (lewis instanceof Lewis) {
			Lewis l = (Lewis) lewis;
			switch (l.getEstado()) {
			case CASADO:
				this.esoNoVaADurar();
				break;
			case ENNOVIADO:
				this.loDeHacerseLaIndiferente();
				break;
			case SOLTERO:
				this.loDelAmor();
			}
		}
	}

	private void loDeHacerseLaIndiferente() {
		System.out.println("Katie: me da igual, sé que me quiere a mi.");
	}

	private void esoNoVaADurar() {
		System.out.println("Katie: esa relación no tiene futuro.");
	}

}

Price:

public class Price implements Observadora {

	private SujetoDeseado lewis;

	public Price(SujetoDeseado lewis) {
		this.lewis = lewis;
		lewis.interesarse(this);
	}

	public void loDelAmor() {
		System.out.println("Price: Lewis que voy sin bragafaja!");
	}

	@Override
	public void avisar() {
		if (lewis instanceof Lewis) {
			Lewis l = (Lewis) lewis;
			switch (l.getEstado()) {
			case CASADO:
				this.mePonenLosCasados();
				break;
			case ENNOVIADO:
				this.loDeTirarLosTrastos();
				break;
			case SOLTERO:
				this.loDelAmor();
			}
		}
	}

	private void mePonenLosCasados() {
		System.out.println("Price: Ains como me ponen los casados!");
	}

	private void loDeTirarLosTrastos() {
		System.out.println("Price: Tu padre podría vivir con nosotros.");
	}

}

Y Jordan:

public class Jordan implements Observadora {

	private SujetoDeseado lewis;

	public Jordan(SujetoDeseado lewis) {
		this.lewis = lewis;
		lewis.interesarse(this);
	}

	public void loDelAmor() {
		System.out.println("Jordan: Vente pacá' y mira que escotazo!");
	}

	@Override
	public void avisar() {
		if (lewis instanceof Lewis) {
			Lewis l = (Lewis) lewis;
			switch (l.getEstado()) {
			case CASADO:
				this.loDeBuscarseOtro();
				break;
			case ENNOVIADO:
				this.loDeTirarLosTrastos();
				break;
			case SOLTERO:
				this.loDelAmor();
			}

		}
	}

	private void loDeTirarLosTrastos() {
		System.out.println("Jordan: Ains que guapeton es mi Hamilton!");
	}

	private void loDeBuscarseOtro() {
		System.out.println("Jordan: Que le den, yo me voy con Eddie Irvine");
	}

}

La historia de amores y desamores:

public class Main {
	public static void main(String[] args) {
		// Katie, Price y Jordan llegan a un acuerdo para que Lewis
		// pueda mandar un aviso cuando su estado cambie.
		Lewis lewis = new Lewis();
		// Todas decicen suscribirse... Lewis es tan MONO.
		new Katie(lewis);
		new Price(lewis);
		Jordan jordan = new Jordan(lewis);
		// Lo primero que hace Lewis es avisar que está ennoviado con Nicole.
		lewis.setEstado(Lewis.Estado.ENNOVIADO);
		// Luego decide casarse, su estado cambia por tanto avisa.
		// Jordan ya le avisó que el día que su estado fuese el de casado se
		// desinteresaría.
		lewis.setEstado(Lewis.Estado.CASADO);
		// Nicole le canta eso de I don't need a man...
		// Pero ya sólo Katie y Price siguen interesadas en él, así que son las
		// únicas que se enteran de su nuevo estado
		lewis.desinteresarse(jordan);
		lewis.setEstado(Lewis.Estado.SOLTERO);
	}
}

Y el resultado de toda esta historia:

Katie: me da igual, sé que me quiere a mi.
Price: Tu padre podría vivir con nosotros.
Jordan: Ains que guapeton es mi Hamilton!
Katie: esa relación no tiene futuro.
Price: Ains como me ponen los casados!
Jordan: Que le den, yo me voy con Eddie Irvine
Katie: A mi si que me vas a poder quitar todo!
Price: Lewis que voy sin bragafaja!

Te puedes meter con la implementación todo lo que quieras, sobre todo con la visibilidad de algunos de los métodos. O por el hecho de extender java.util.Observable, pero esto ya es más discutible :-).

Y sí, probablemente debería haber aprovechado el tiempo en otra cosa, pero los domingos no suelen ser los mejores días para trabajar.

Puzzles en Java

A raíz de mi irónica entrada sobre PHP el jrande de Diego me recomendó ver Advanced Topics in Programming Languages: Java Puzzlers, un ameno tech talk presentado por Joshua Bloch (os debería sonar del JavaDoc) y William Pugh.

Me gustó Histogram Mystery (43min 40s), así que he preparado una versión simplificada y castellanizada. Dos cervezas para el primero que diga cuál es el resultado y además lo justifique (sin haber visto el vídeo, claro). Y cuidado con las posibles respuestas… por aquello de la rima fácil.

public class AbsolutVodkaPuzzle {
	public static void main(String[] args) {
		String frase = "Al anochecer llamaron al celular";
		String [] palabras = frase.split(" ");
		int i = 0;
		for (String palabra1 : palabras) {
			for (String palabra2 : palabras) {
				String dosPalabras = palabra1 + palabra2;
				int valorAbsolutoHash = Math.abs(dosPalabras.hashCode());
				if (valorAbsolutoHash >= 0) {
					i++;
				}
			}
		}
		System.out.println('1' + i);
	}
}

ExtraLap™: Josh Bloch es autor de Effective Java y coautor de Java Puzzlers y Java Concurrency in Practice (de este último todavía no he podido disfrutar). Y además es una de las personas que consigue que [ames|odies] Java.

I’m working in my final degree project, an interactive web document commenting system that allows people to annotate comments directly onto document elements like words at paragraphs and images.

My mentor forced me to use Java as the primary language for the project. In these days choosing a J2EE Framework sucks. If you’re a fashion-victim/fancy-boy, you know, you’ll end using a combination of Struts + Spring + Hibernate + AnyFlavourOfYourFavoriteJavaTrendyWebTechnology and obviously a gazillion of XML config files. Do you really need all of this stuff for little projects with just two SQL queries and three templates? It was driving me crazy for about two weeks. I’m not underestimating Structs or Hibernate or whatever, I’m saying it doesn’t fit for small projects.

You must be thinking I’m using a single approach with some Servlets and JSP files, and also you can be wrong. I don’t like how huge struts framework is, but I’m a fan of trendy-best-practices ;-). I love the way Google’s App Engine, Ruby on Rails and Django enforce you to get things done. I’ve been hacking with the Java Reflection API, Tomcat and other stuff for a while, now I can tell you I have a little alpha-baby called Wazooka.

Wazooka is a high-level convention-over-configuration J2EE Web framework that encourages rapid development and clean, pragmatic design. (Is it possible in Java World?)

Currently Wazooka is under development, in its 0.2614972128 version (aka Meissel-Mertens [1]) it features:

  • MVC paradigm
  • RESTful
  • Ehcache support
  • ActiveObjects ORM (à la ActiveRecord). It supports Derby, HSQLDB, SQL Server, MySQL, Oracle and PostgreSQL.
  • Pure Java HTML Forms (with validation…)
  • Templates with layouts (allowing you to include a view into a general layout)
  • Authentication and user-role helpers
  • JUnit and log4j integration
  • A simple app admin console to manage database migrations and cache status.
  • NO XML configuration files!

For now I’m the solo user-developer, but I plan to release it under a free software license. When? I don’t know, but keep checking this blog. In the next blog-post I’ll show you how easy is to develop a simple web application with my little Wazooka baby }:-).

[1] One day I’ll explain how I assign version numbers.

Hace unos días me aburría, decidí que tener 23 podría ser más divertido que seguir con 22, sobre todo porque hasta los 29 no volveré a disfrutar de un número primo. Sí, hablaba de [cumple]años. Y es que el número 23 es uno de esos números que te cautivan, por ejemplo su representación en binario, 10111, también es un número primo.

Google Open Pizza Night:
También estuve en la Open Pizza Night que brillantemente organizó Google España en sus oficinas de Madrid. Raúl Benito (qué difícil es encontrar su blog!) iba a presentar el nuevo API de Youtube, primero una pequeña introducción seguida de un workshop en el que Raúl presentó su revolucionario método de desarrollo SDD, estamos a la espera del RFC }:-).

Fue una noche de reencuentros, estuve con los Lamb Brothers (que me tienen engañado para hacer una pequeña aplicación), con Javi (está vez acompañado por otro Raúl) y A1berto, todos viejos conocidos de la Campus Party. También coincidí con Miguel que le tuve como compañero en un workshop del GDD del año pasado. Pude estar, por ejemplo, con Manu, de tufuncion.com, al que, por cierto, le debo una disculpa por no haberme pasado a dejar el comentario que le prometí O:-) y con Igor de Txurdi. También charlé con Dani y Rupert de Tuenti. Seguro que me olvido a más de uno, así que… lo siento! 

Además, y por fin, pude conocer a Rubén Díaz (aka outime), todo un crack que está desarrollando Jisko, y aunque no me guste explicarlo así, un clon libre de Twitter con funcionalidades extras, me llamó poderosamente la atención lo involucrado que está en el proyecto, este sí que sigue aquello de eating his own dog food, proyecto que, por cierto, pudo presentar durante 10 minutos.

Por lo demás, decir que las pizzas estaban mejor que buenas, la cerveza también, pero nada como las patatas fritas de colores, lo siento, eran mi debilidad, y la de todos mis compañeros de mesa! Ahora dar las gracias a todos l@s chic@s de Google, que una vez más nos trataron fenomenal, y sobre todo a Clara por invitarnos a un evento que espero no sea el último de este tipo. Para enterarte de eventos como este y de todas las novedades de Google no dejes de leer y suscribirte al blog de oficial de Google para desarrolladores en español: Programa con Google.

Yo también tuve 10 minutos para presentar una pequeña prueba de concepto que pretendía mostrar algunas de las nuevas capacidades del API de Youtube. Todo lo había programado en tres tardes y una larga noche, una aplicación a medio camino entre Twitter y Seesmic. Un servicio de microvideoblogging que permite grabar vídeos directamente a través de la página web, y que posteriormente son almacenados en Youtube, en los que se permite, por ejemplo, añadir videorespuestas. Podría dedicarle algo más de tiempo y publicar la aplicación (aunque todavía no tenga modelo de financiación :-P). Aplicación que estaba escrita en Java, por una vez creo que escribir en Java una aplicación web me supuso ahorrar tiempo, ya que pude usar el GData API Client de Java.

Mi Proyecto Fin de Carrera:
La aplicación que presenté en la Open Pizza Night usaba una de las primeras versiones de un pequeño framework J2EE que estoy preparando para mi Proyecto Fin de Carrera. Framework que sigue el patrón MVC con un front controller que procesa todas las peticiones y usa el API de reflexión de Java para cargar clases y llamar a métodos dinámicamente en función de la URL, también usa annotations para, por ejemplo, poder especificar que métodos necesitan autentificación por parte del usuario. Y lo mejor, no hace falta escribir ni una línea de XML! El próximo día hablaré sobre mi PFC, porque lo mejor de Java es que puedes odiarlo, pero nunca lo odiarás tanto como documentar.

Arpia49 (the distroman):
Por otra parte pasé dos días geniales en casa de Adal (aka arpia49), sin el que no hubiese podido aprender a usar mi nueva powerball, y sin el que tampoco podía haber saboreado la primera sandía del mundo que en realidad sabía a melón (priceless).

Optimización de Aplicaciones LAMP:
Ayer estuve en una magnífica charla, impartida por Fernando Arconada, sobre optimización (y un poquito de escalabilidad) de aplicaciones LAMP. La charla estaba enmarcada dentro de las jornadas técnicas que se imparten en mi universidad con motivo de la celebración de la RiojaParty de este año.

Sobre el PyWebDj:
Como casi siempre me termina pasando, una vez más, no tengo tiempo para mantener la aplicación, y menos si quiero que funcione en GNU/Linux, Windows y Mac OS X. Parece que la versión actual ha dejado de funcionar, seguramente hayan cambiado los tokens asociados a los archivos, pero no quiero ni pararme a mirarlo. Además han aparecido varias herramientas similares (seguro que incluso son mejores), so… google for it.

Extra Lap (parafraseando a delarosa):
Seguramente me olvide de contar algunas cosas. Como que me rompí rompieron un ligamento jugando al fútbol y llevo casi dos meses sin jugar. O que el número de cervezas consumidas durante el transcurso de todas estas historias es superior a dos. O todo lo que me gusta el nuevo App Engine de Google, pero de esto ya hablaremos en otro momento. En definitiva, lo que venía a decir es: sigo vivo.

Disculpas:
Siento que este post tenga casi el mismo número de saltos en el tiempo que el peliculón Primer, pero después de tres meses sin escribir casi se me había olvidado. Intentaré que el próximo post se publique antes de mi siguiente cumpleaños primo.
Lo del título del post, no voy a intentar ni explicarlo, si no lo entiendes pasa al siguiente, siguiente, siguiente. Y hasta la vista, Vista.

 



About Raúl

Raúl Ochoa, a spaniard working for Tuenti in Madrid, Spain. More about me.

Subscribe to the feed

If you want to receive a notification when I update the website, you only have to add the feed to your reader, or submit your email address and I'll let you know.

Categories