A ver si no termino haciendo un juego online de barcos...
sábado, 28 de febrero de 2009
So much to say, So little room.
A ver si no termino haciendo un juego online de barcos...
Bitwize mask flags
Suponiendo que tenemos un barco, éste puede ser pesquero, pirata, naval, mercante o de pasajeros. Estaremos de acuerdo que no puede ser pirata y naval al mismo tiempo, (siempre y cuando naval implique pertenecer al ejército de un país), pero podrá ser mercante y de pasajeros, o ni pirata ni naval.
Usialmente, para manejar todo esto, usaríamos un millón y medio de variables, un private boolean para cada estado diferente y un par de public final static boolean por cada estado para un manejo más descriptivo.
Pero... porqué no usar los bits? Un bit, dentro de un entero para saber cada uno de los estados del barco. De manera meramente lógica resulta un poco complicado, estar haciendo todas las operaciones para saber si un 4 significa que es naval y un 3 significa que es pesquero y pirata. Lo que resulta en demasiados métodos para regrezar un simple true cuando le pregunten si es o no un barco pirata.
Para eso existen los bitwize operators, comandos para hacer operaciones a nivel de bits dentro de un entero (32 bits)
Básicamente, tenemos:
| OR
& AND
^ XOR
~ NOT
También podemos utilizar "<<" y ">>" para mover las combinaciones de bits de un lado a otro dentro del mismo entero, y de esa manera inicializar nuestras variables descriptivas:
public static final int NAVAL = 1 >> 3;
Que en cristiano quiere decir que al entero "NAVAL" le asignamos el valor 1 y lo recorremos 3 lugares ( 0010000 ).
De esa manera, para verificar si es o no NAVAl, usamos & y comprobamos si el resultado es diferente o igual a 0.
110101 & 001000 = 000000
111000 & 001000 = 001000
Bien utilizado, nos sirve para ahorrar mucho código en banderas de estado.
Reference notes and insides of a while
El primero fue que la aplicación se trababa y dejaba de "funcionar" al apretar el botón que permitía escuchar lo que la otra parte (el cliente si estabas en el servidor o el servidor si estabas en el cliente) decía y así, poderle responder.
Durante el debug descubrí que el programa no había dejado de funcionar, seguia corriendo, pero esperaba respuesta de la otra parte. Se había quedado atorado en el ciclo while.
De alguna manera eso era algo que se suponía debía pasar, pues debe escuchar y recibir todo lo que le manden. Pero también debía permitir al usuario emitir las respuestas.
La solución en realidad era sencilla, pero no me fue facil dar con ella, había que sacar el ciclo while de la aplicación que permitía al usuario interactuar, pero permitirle a esa aplicación intervenir en los eventos que generaba el while.
Por lo tanto, el capitán tenía que tener un barco y el barco tenía que tener un capitán, lo que nos llevó al siguiente problema.
Los objetos en java, siempre se pasan como referencia, y los nativos como valor; o eso es lo que yo creía.
Al crear un barco, el constructor pedía especificar un capitá (The ship must allways have a captain) y el constructor del capitán pedía siempre un barco (pues todo capitán es capitán de un barco, no?).
Y entonces surge el problema de las gallinas y los huevos. Mi primer intento de solución fue declarar un capitán y crear un barco, para después crear al capitán, en fin que los objetos se pasan como referencias. Pero no, el compilador me pedía que el capi´tan estuviera inicializado antes de crear el barco.
Al inicializarlo con null, me mandaba NullPointerException cada que quería llamar al capitán del barco... lo que me parecía increíble, pues yo había creado al capitán con el barco anterior.
El debug me mostró que el barco tenía un capitán nulo, aunque yo hubiera creado ese "mismo" capitán.
La solución me tomó más tiempo, pero el resultado fue un valioso pedazo de conocimiento.
Los objetos, como argumento en un método, pasan como referencia y los nativos como valor.
Pero NUNCA en un constructor!!!!!
Creé el barco y el capitán por separado, modificando el constructor, y después los agregué mutuamente.
Constructor from a Class parameter
protected void onTheGo(Class portAttendant) throws Exception {
while(dockOpen.booleanValue()){
(portAttendant.getConstructor(Socket.class,PortManager.class).newInstance(dock.accept(), manager)).start();
}
}
Hermoso, no lo creen?
De esa manera, podemos implementar nuestra propia clase que herede de PortAttendant y utilizar este mismo método, sin tener que implementar además, la clase propietaria de éste método.
sábado, 21 de febrero de 2009
Let the Quest Begin !
La QUEST comienza con una serie de largas batallas contra PEBCAT ("Problem Exists Between Chair and Terminal"), un ser despiadado, de apariencia débil y sumisa, pero que esconde un temible sentimiento de impotencia que transmite a los seres que le rodean.
Los intentos por acabar con la vida de este monstruo eran inútiles, solo hasta que incrustamos las gemas (parche y actualizaciones) de manera ordenada, fue cuando pudimos alzar la frente en alto y proclamar con aire de (humilde) grandeza VICTORIA!!
Dichas gemas nos darían el control total sobre Eclipse y ¿por qué no?, sobre sus más secretos y oscuros tesoros.
Con el corazón lleno de esperanza y codicia decidimos ir por su tesoro, el cual escondía en un repositorio lejano, resguardado por archivos necesarios y actualizaciones pendientes.... lamentablemente no pudimos llegar a él, pues siempre que estábamos a punto de obtenerlo un "error" nos marcaba un alto del cual no pudimos salir.Como este era un extra lo pospusimos para cuando nuestro nivel aumentara y tuviéramos mejores tiradas de suerte que en este mes del dragón.
Dimos el siguiente paso en la QUEST "The MOB Project", el cual es localizar un objeto en el antiguo códice de java, que nos permita castear unas bestias a través del "Ciberespacio" e invocar demonios en un ser de otra dimensión. Una vez concluida esta sencilla tarea el siguiente concilio que se celebre (esperemos el próximo jueves) dará inicio a la parte creativa de la QUEST.
Estamos reponiendo energías después de la desgastante batalla y aunque fuimos afectados por el hechizo de PEBCAT nuestros corazones siguen latiendo con la misma fuerza gracias a la protección de unas alas que nos dieron aliento cuando nos sentíamos derrotados.
lunes, 9 de febrero de 2009
SVN & DB
El jueves pasado, no pudimos reunirnos físicamente, pero gracias a la tecnología y a TeamSpeak pudimos sostener una "reunión" virtual, aunque alguien (ejemplo "C") no se pudo comunicar correctamente porque tuvo problemas de hardware XD
En fin, pudimos subir y bajar archivos a través del SVN y crear proyectos en Eclipse, manejamos los básicos y establecimos un modo de trabajo.
Queda pendiente la elavoración de un minúsculo cliente, con intefaz gráfica y todo, que se comunique con un servidor, utilizando lo más básico de lo básico, para que en un momento dado, al mismo servidor se pueda comunicar un cliente programado en cualquier otro lenguaje.
domingo, 1 de febrero de 2009
MOB desde Venus
Esta experiencia promete ser muy diferente a las que comunmente suelo involucrarme.
El primer día, para variar llegue un poquitillo tarde, jeje,nada que detuviera a mis compañeros para dar vuelo a sus ideas, los cuales estaban súper entrados en la materia.
Inicialmente tenia que ubicarme para saber que era lo que estaban haciendo. Pero sephe y alion bastante pacientes no dudaron en explicarme cada paso que realizaban.
No les daré los detalles técnicos pero sin duda hubo muchos avances.
Conforme pasaba el tiempo empezaron a apilarser las ideas y fueron surgiendo muchas dudas.
Llegando a la conclusión que este era buen momento para detenerse y despejar la mente un rato y más porque ya era muy difícil avanzar cuando se ve tan claro el problema y bastante nublada la solución!!!
La noche paso rápido pero teníamos que descansar. Para volver a nuestra rutina habitual. Sin embargo Sephe decidió tomar una opción alterna.Fue una sorpresa, tener la noticia de que ya todo funcionaba correctamente.Gracias Sephe!!!! Una sorpresa muy efusiva y conmovedora jajajaja(gracias por tus palabras muy alentadoras para el equipo jeje)
En fin chicos ... desde Venus ....
saludos,