jueves, junio 11, 2009

UML Relaciones, Asociacion, Compocicion, Agregacion II



Aclaración


He tratado de explicar, muy generalmente, cual es la diferencia entre asociación, composición, y agregación, pero creo haber pecado de los mismo que criticaba a los post que leía. No he sido los suficientemente claro, además se me ha solicitado que explique un poco mas.. je.
Debo de destacar que cada modelo diseñado no es prescriptivo, ni intenta ser absoluto hay otras formas de diseñarlo, o por lo menos a mi se me ocurren otras además de estas.
Pero creo que la pricipal, duda viene por lado de la Composición y la Agregación. Cabe destacar, que la composición, surge como un refinamiento de la Agregación, en la búsqueda de implementar la buena practica de programación de hacer a las clases mas "coercitivas", es decir de asignarle responsabilidades.

Explicación del Modelo Representado


Asociacion: Es la relación que existe entre la clase Persona y la Clase Foto, es decir que que existe una variable de instancia (o atributo) en la clase Persona del tipo Foto. Solo un obeto, el cual se setea a partir del método setFoto(), como variable de instancia a la cual se le crea un setter. Este puede ser instanciado (new Foto()) en cualquier otra parte del código.
Agregación: Es la relación que existe entre la clase Persona y la clase Lugar atravez del atributo "lugaresFrecuentes", que es una colección (array, colection, vector, etc) de objetos Lugar. Y que además, la clase Persona cuenta con un método "agregarLugaresFrecuentes(Lugar lugar)" Mediante el cual se agregan un solo objeto del tipo Lugar a la colección "lugaresFrecuentes". Estos objetos, que son pasados como parámetros a dicho metodo, son instanciados fuera de la clase Persona. No debe confundirse con el método setLugaresFrecuentes(Lugar[] lugaresFrecuentes), que tiene solo por ser un propiedad.
Composición: Es la relación que existe entre la clase Persona y la clase Perfil a travez de la propiedad "perfiles" que es una coleccion del tipo Perfil. Además, de ser una relación estructural, es meramente semántica, ya que lo que pretende es darnos la idea de la responsabilidad que tiene la clase Persona sobre el ciclo de vida del objeto de la clase Perfil. Es por ello que también en el ejemplo grafique una Dependencia (esta no se grafica generalmente, con la composición basta. Pero UML sirve para comunicarnos.)
Es idéntica a la agregación pero con la diferencia que la clase Persona se hace responsable de la creacion del objeto Perfil. Es decir que la instancia (new Perfil()) se crea dentro del método agregarPerfil(), y despues de ello, dicho objeto se guarda en la colección "perfiles". El modelo nos esta diciendo, que en ninguna otra parte del código deberíamos escribir un new Perfil() . Ya que coloquialmente, el perfil (sea este psicologico, personal, etc) de una persona solo existe a partir de la persona, muerta la persona el perfil no sirve de nada, y solo a partir de la existencia de la misma se puede crear uno, por lo que este metodo de creacion debe de ser un metodo de instancia.

Es todo una cuestión, de lo que la persona que escribió el modelo (y teniendo en cuenta que la misma sepa utilizar UML, nos quiso transmitir), si existe la duda, hay que preguntarle que quiso decir con lo que graficó.
Espero haber limpiado algunas dudas
Saludos
Ariel Diaz Molina.

lunes, enero 26, 2009

jueves, enero 22, 2009

La isla

Y las aguas del sur se juntaron con las que viajaban desde el norte. Y los vientos que soplaban fríos, silbaron canciones con los que traían calor. Tanto bailaban entre si, y tanta pasión había en aquel tango, que los cielos se agitaban y las nubes se hacían espirales. Nada había de parecido, era casi imposible, solo se dieron las condiciones para una tormenta perfecta.

Allí nació lo nuestro. En aquella exótica isla de lana y resortes. Allí comíamos, dormíamos, saltábamos. Allí vivíamos emociones, nos amábamos por las mañanas, discutíamos por las tardes y sudábamos por las noches. Realmente amé aquellos tiempos, especialmente cuando los primeros rayos de sol se colaban por las rendijas de la ventana para iluminar los paisajes de una geografía de piel y aromas. Rara vez, abandonábamos la isla para adentrarnos en la frialdad de los mosaicos, cumpliendo misiones a la heladera en busca de provisiones que aseguren frescas horas de energía que tanto las necesitábamos por aquellos tiempos. Galopamos sobre prados de 180 hilos, torsabamos nuestras carnes bajo cascadas de bronce cuando el calor agobiaba. Dormíamos profundamente formando las agujas del reloj a las diez y diez, cuando las confesiones acababan y el aire se recuperaba. Hablábamos del pasado, dibujábamos el futuro con ojos en brillo, pero básicamente vivíamos el presente. El día a día era nuestro sustento. Reíamos y corríamos libres de vergüenzas y tejidos como si el tiempo no persiguiese y las obligaciones perdieran su nombre, la gente nos vio amarnos, y los mortales envidiaron aquella inmortalidad.

Así nos devolvimos la fe, así nos perdonamos nuestros pecados. En aquella isla sobre el suelo pero cerca del cielo y lejos de la gente, encontramos nuestra paz.

miércoles, diciembre 03, 2008

Partiendo

Los pasos se tienen que dar, los ciclos se tienen que cerrar. La vida continúa.
Nos subimos a un tren, y de vez en cuando hacemos estación en algún lugar para vivir momentos de tarde y música. Para sacarnos fotos con aquellos personajes que, también, esperan la llegada de su tren. Conocemos personas que nos llenan de azares con historias de vidas, nos enaltecemos con grandes actos de valentía, actos que exaltan al imitarlos, y nos compadecemos de aquellos, cuyas cobardías los rigen.
Aprendemos, nos emocionamos, nos sentimos contenidos y también traicionados. Pero, al final, siempre el pie vuelve al estribo y el vapor hace rulos contra el viento.
Pero en esta partida, la cuadrada ventanilla dejo de ser un lienzo impresionista con paisajes, para convertirse en una pantalla de una película con final triste.
Hace un par de años a tras, me entristecía al pensar que las dirigencias y los mandos medios argentinos, estaban pateando todos sus penales a las tribunas. Que sus miedos los forzaban a tomar decisiones fuera de toda lógica y conciencia. Que la falsa seguridad triunfaba sobre la trascendencia. Que rendían sus prioridades a una boleta de luz antes que al brillo de lograr sus objetivos y visiones.
Hoy mi tristeza continúa. Por que esta miopía sigue emborrachando mentes. Jamás he hablado de idealismos, si no más bien, del más rígido de los pragmatismos. Ocultismo y traición no son religiones edénicas. Desconfiar, presionar, la severidad con aquellos que deben callar, y el silencio con aquellos que hablan gratis, no es valentía ni se le pareces. Pragmatismo no es adular, pragmatismo no es la obsecuencia. Por que a nadie con dos dedos de frente le gustaría tener a su lado un perico de buenos modales, todos preferimos a aquellos cuyo carácter nos evita problemas futuros. No he conocido a nadie, ni en el ambiente de las empresas, ni en el ambiente de la política, ni en ambiente alguno, que tenga éxito callando, ocultando, alejándose de aquellos que lo estiman y protegen.
Pero en fin, nadie enseña mejor que la vida misma, y aconsejar a un amigo más de una vez es terquedad y egoísmo.
Mi tren espera, y mi pie ya está sobre el estribo.

sábado, septiembre 27, 2008

UML Relaciones, Composicion, Agregacion, Asociacion, Dependencia, Generalizacion, Realizacion



Trabajando con los miembros de mi team de desarrollo me di cuenta que a los programadores le costaba interpretar los Diagramas de Clases que el analista realizaba. O existían interpretaciones ambiguas de lo que el realizaba, perdiendo asi la principal funcionalidad del lenguaje UML. Especialmente en cuanto a las relaciones que existían entre las clases. Por eso me dispuse a realizar este pequeño documento, donde voy a tratar de explicar que significa cada relación, en mis palabras, y como se traduce esto a código.
Asociación:
Es generalmente, una relación estructural entre clases, es decir, que en el ejemplo, existe un atributo de la clase medio de transportes, que es del tipo Conductor. La navegalidad nos muestra donde esta ubicado el atributo. Es decir cual es la clase que tiene contiene el atributo si ésta no lo mostrase. La multiplicidad en una Asociación dice bastante, ya que de eso dependerá si el atributo, es una colección o simplemente una variable de referencia a un objeto.
Agregación:
Es una relación que se derivó de la asociación, por ser igualmente estructural, es decir que contiene un atributo, que en todos los casos, será una colección, es decir un Array, Vector, Collections, etc, y además de ello la clase que contiene la colección debe tener un método que agregue los elementos a la colección. También se puede leer como que un medio de transporte tiene varios pasajeros.
Nos esta diciendo que los objetos pasajero forman parte del objeto medio de transporte. Pero, su ciclo de vida no esta atado al del objeto medio de transporte. Es decir si el Autobus se destruye los pasajeros pueden seguir existiendo independientemente, ( o por lo menos por eso rezaríamos)
Composición
Al igual que en la agregación, es una relación estructural pero se le suma, que tiene un método de destrucción de los objetos. Y a diferencia de la asociación, el ciclo de vida del objeto area está relacionado con el del objeto ruta. Es decir que si la ruta de viaje se levanta, las áreas que surgían a partir de ella desaparecen. También se puede leer como que una ruta tiene varias áreas de cobertura.
Mucho se ha discutido a cerca de las agregaciones y las composiciones, el debate es casi tan caliente como el de los include y extends de los casos de uso. Ya que algunos sostienen que los lenguajes orientados a objetos, tienen garbage collector, por lo que no necesitan métodos de destrucción de los objetos (relacionados a los ciclos de vida en la compocición). Y que la programación es la misma para las composiciones y las agregaciones, y que la diferencia es meramente conceptual entre una y otras. Es mas existen varias interpretaciones, pero la expuesta es a la cual yo adhiero.
Clase de Asociación
Es una Clase que surge de una multiplicidad de muchos a muchos, y fue incorporada en UML para dar soporte a este caso. Se sacan los atributos de las clases involucradas y se los incorpora a una clase a parte. Al igual que las anteriores hace referencia a una relación estructural. En el ejemplo son los objetos viaje y ruta
Realización
Es una relación de contrato con otra clase. Se la utiliza para implementar una interfaz. En lenguajes como java o php utilizamos la palabra reservada “implements”
public class Viaje implements Registrable{…}
Generalmente cuando no estamos seguros si “algo” es una interfaz o una clase abstracta, por que dibujaron los tag que hacen referencias a las interfaces, debemos ver la relación para saber.
Generalización
Es una relación de herencia. Se puede decir que es un relación “es un tipo de” ( IS-A ). En nuestro ejemplo: “un Autobus es un tipo de Medio de transporte”. Es entre una clase hija y su clase madre. En la codificación podemos encontrar la palabra “extends” que hace referencia a esta relación. Además podemos encontrar palabras claves tales como “this” y “super” ( Java ) o "self" y “parent” ( PHP ). Para darnos cuenta que existe una relación de este tipo involucrada.
public class Autobus extends MedioDeTransporte{…}
Dependencia
Es una relación de uso, es decir que una clase utiliza a otra. Y si esta ultima se altera, la anterior se puede ver afectada.
En código se suelen traducir principalmente como las clases donde se hace la instanciación de un objeto. En nuestro ejemplo la clase Viaje realiza los “new” de los distintos objetos. En este momento puede que te preguntes como puede hacer un new de una clase abstracta, jeje. No realiza los new de la clase abstracta, si no de sus hijas. Seria algo así como
MedioDeTransporte medio = new Autobus();
También se sostiene que este tipo de relación hace referencias, a los parámetros que se pasan en un método, bajo este concepto, en java, podría ser algo así como:
public void crearViaje(MedioDeTransporte medio){}
Por ultimo también se sostiene que podemos codificar esta relación realizando un “return” del tipo de dato en algún método.
Bueno espero haber limpiado algunas dudas, hay mucho para discutir sobre el asunto.
Saludos team.
Acá les dejo otro ejemplo, un poco más complejo y con los métodos de cada una de las clases para ser más especifico.
Anl. Ariel Diaz Molina.
Mas información sobre UML en la etiqueta Diseño.

jueves, mayo 29, 2008

Hora de izar velas

Cada cierto tiempo, los tambores empiezan a sonar en mi pecho. No se si es la necesidad de mantenerme en movimiento, o cobardía errante de aquel que se fuerza al desarraigo. Pero la verdad es que cuando suenan, es hora de marchar, de sacar mis uñas de aquello a lo cual me aferraba, es hora de armar bolsos, mirar hacia delante, hacia la esperanza, y dar ese paso de pie pasado.
Es por ello que unos días a tras presente mi renuncia en la empresa donde trabajaba. Y a la cual estaré agradecido. Más allá de los defectos que todas las organizaciones tienen, EDS me brindo la oportunidad de dar mis primeros pasos en la industria, de conocer gente muy pero muy interesante, de crecer. Pero no me voy por capricho, abulia, o cobardía. Me voy por que he recibido un reto por parte de la vida, me voy a liderar un proyecto, una gran oportunidad que los informáticos siempre esperamos, a otra empresa, a una más pequeña, más desafiante, mas calida, más arriesgada, más a mi medida.
Me voy para crecer, para aprender, para probarme a mi mismo, o simplemente para izar velas en el mar y marchar directo hacia la tormenta. Mi mano se levantó cuando alguien grito a lo lejos, entre desesperaciones y buscando un milagro.
No va a ser fácil, no tengo experiencia. Pero son estas las situaciones donde los hombres se convierten en bronce.
Tomaré la chancee.

viernes, mayo 16, 2008

¿Cual es nuestro miedo más profundo?

"Nuestro Miedo mas profundo no es el de ser inadecuados. Nuestro miedo más profundo es el de ser poderosos más allá de toda medida. Es nuestra luz, no nuestra oscuridad lo que más nos aterra. Nos preguntamos a nosotros mismos ¿Quien soy yo para brillar, para ser magnifico, talentoso, fabuloso? De hecho, ¿quien eres para no serlo? Tú eres un hijo de dios. El que te consideres menos no ayuda al mundo. No hay nada brillante en empequeñecerse para que otros no se sientan inseguros al lado tuyo. Todos estamos destinados a brillar, como brillan los niños. Nacimos para hacer manifiesta la gloria de dios a través de nosotros mismos. No yace solo en algunos, está en todos nosotros. Y cuando dejamos que nuestra propia luz brille, inconcientemente alentamos a otras personas para que hagan lo mismo. A medida que nos liberamos de nuestro propio miedo, nuestra sola presencia automáticamente libera a otros."

miércoles, marzo 26, 2008

El Campo y el Gobierno

Al igual que en todo conflicto surgen las síntesis superadoras ante las posturas encontradas. Esta es mi visión, no es la búsqueda de un amarillismo, o de una postura cobarde y mediera. Es que en relación al paro que nuestro campo esta llevando a cabo, no puedo darle la derecha total ni a unos ni a otros.
Por un lado el gobierno debería convertir en impuestos coparticipables, las retenciones que extrae de la industria agrícola. Por que sin ser esto, el dinero va a parar a agujeros negros, que solo contribuyen al sostenimiento de pesadas y deficitarias estructuras políticas. Además de ello debería diferenciar entre los pequeños y grandes productores, hablo como hombre que vino de una familia de campo, ya que los primeros trabajan contra el clima y los precios abusivos de una industria absorbida por gigantes. No es lo mismo aquel que tiene 500 o 1000 hectáreas con producciones millonarias, maquinaria de punta y seguro contra las contingencias climáticas, que aquel que produce a sombrero de mimbre y plegarias. Por que no se puede estar en tiempo de crisis asistiendo a los gigantes, y en los tiempos de abundancia, apresando a todos por igual. Es más, el estado debería, asistir al crecimiento de estos últimos para permitirles avanzar a lo largo del proceso productivo, ¡que los gigantes hagan lo que quieran!, que los pequeños se unan y procesen lo producido.
Por otro lado, el campo, a quien nuestra presidenta llamara plena de soberbia el piquete de la abundancia, no debe de olvidar los años malos, donde el estado asistía, y no debe perder de vista, que el resto de las personas, no somos solo rehenes, como siempre se dice a modo de muletilla, si no que estamos a la vanguardia en el campo de batalla. Éste tipo de cambio sojero y agrícola, ha dejado por debajo de la línea de la pobreza a millones de argentinos, y aún en día de hoy se hacen esfuerzos como país para mantenerlo competitivo a las exportaciones. El monocultivo especulativo y coyuntural esta destruyendo tanto los suelos, como las economías, ya que trae aparejado el desabastecimiento y la inflación, al intentar exportar absolutamente todo lo que se produce.
No tengo nada en contra del parque automotor de los piqueteros, ni de sus pañuelos de nostálgica oligarquía, es simplemente que al igual que el gobierno, ellos también son argentinos y su primer deber es con su país, ellos también deben responder, no es una relación de padres represivos he hijos conflictivos, es una relación de pares, de argentinos.
La salida no son políticas del momento, no son políticas de contingencia, no es pretender llenar las arcas de una, y atragantadas, en la abundancia, ni el gobierno, ni el campo. En el tironeo y el entrevero por el fruto, podemos terminar desplumando y matando a la gallina de los huevos de oro. Y allí todos vamos a terminar llorando el deceso.

sábado, marzo 08, 2008

Dias de Paz

Cada cierto tiempo, aquellos que amamos la vida cívica, que transitamos alguna vez los caminos del idealismo político, tenemos la oportunidad de emocionarnos con algún acontecimiento histórico. Hoy fue uno de esos días, hoy la brisa de la paz, triunfó sobre los vientos de la guerra.
Soy conciente que un escenario bélico entre hermanos latinoamericanos no sería posible. En cuestiones militares, Ecuador no podría bajo ninguna circunstancia desatar una guerra contra Colombia, y por otro lado, Chavez sabe que cualquier intento de agresión contra Colombia sería la excusa perfecta para que Estados Unidos ponga sus manos en el asunto. Ninguno de los actores, que hoy vimos mascarar son improvisados. Ninguno de ellos fue a Republica Dominicana a buscar una guerra. Pero existen otros escenarios donde las balas se transforman en palabras, y los generales en hombres cívicos. Donde las sinfonías de los discursos se montan para un gran público, con momentos de tensión, percusión, luego el relax y los violines, para terminar con un cerrado aplauso de un auditorio en pie y emocionado.
Pero la razón debe quedar de costado ante acontecimientos de este tipo, prefiero pensar que hombres de buena voluntar se juntaron para salvar vidas y evitar un derramamiento de sangre latinoamericana. Prefiero pensar que estamos danto los pasos correctos, que en cualquier otra parte del mundo, estas palabras y cruces hubieran llevado a tortuosos años de conflicto, y a todos aquellos pecados que las armas remontan. Que las luchas de egos primarían sobre la razón y los oscuros señores de la guerra sonreirían desde las penumbras cuando vean sus intrigas triunfar.
Hoy me siento orgulloso, hoy siento que América Latina tiene futuro.

domingo, febrero 24, 2008

No se si corresponde

¿Si te extraño?. Sí, lo hago.
¿Si aún te amo?. Esa no es una pregunta. Ya lo sabes.
¿Si se que me amaste? Sí lo sé.
¿Si aún me amas? Tú callaste la última vez.
Me quedo con tus palabras. Me quedo con un… jamás nuestro problema fue falta de amor. Eso existió, con pasión, entrega y sacrificios. Nos amamos hasta el dolor, nos cuidamos aún en el secreto y el silencio. Nos observamos desde la timidez y lo seguimos haciendo. Fuimos privilegiados por que pudimos vivir el amor hasta la última célula de nuestras entrañas. Es difícil ver como mis ojos ya no son los mismos cuando miran. Pero la vida se abre camino.
Jamás entendí por que… por que no salías corriendo y cambiabas tu destino, como tantas veces lo hice yo, por que no juntábamos océanos. A Tu manera me amaste.
Tranquila mi reina, no he renunciado a vos. Te he reservado para mi memoria, para ese millar de lugares y tiempos hermosos, que juntos vivimos, para esas olas que nos sacaban carcajadas, para ese viento que nos vio galopar uno al lado del otro, para esa tierra que nos moldeaba los dedos cuando caminábamos descalzos, para ese fuego que nos teñía de naranja y borraba las líneas que nos hacían dos.
Reina, si lo amas, abrázalo, cuídalo, no lo obligues a elegir entre sueños. Entiéndelo, escúchalo, no permitas que la gente los separe, cree en sus sueños, persíguelo hasta dejar tus uñas.
Reina, si no lo haces. Devuélvele el cariño empeñado con una sonrisa y un abrazo, y corre tan rápido y fuerte que el viento te eleve, busca tu amor, tu propio destino, aquel que haga cerrar tus ojos cuando sus manos recorran tu rostro. Aquel que te haga respirar profundo cuando lo veas de lentes leyendo a tu diestra por las noches.
No cometas el error de creer que te enamoraras tan solo por que tú te lo repitas, o por que otros te lo repitan. Ellos no saben de complejidades, y el amor es complejo.
Reina mía, estoy bien, mis días pasan entre el trabajo y las cuentas pendientes, pero de vez en cuando me tomo tiempo para admirar la vida desde la cima de algún verde. Me quieren y soy bien querido. Siento el amor, en mi sonrisa al mirar el espejo y verme todo un hombre, aquel con el que soñaba convertirme. Solo resta el rostro de un niño con cachetes llenos de helado y las manos tranquilas, pero vendrá cuando dios me sonría.
Nos vemos allá. Donde al amor sea eterno.

domingo, diciembre 09, 2007

domingo, noviembre 25, 2007

La frase de la semana

Los domingos son días de reflexión. Siempre me tomo unos minutos antes de levantarme de la cama para reflexionar sobre lo que paso en la semana. El trabajo casi no me deja tiempo para pensar en otras cosas que no sea el programar. Pero aún así, no puedo evitar mi adictiva introspección.
Generalmente esos momentos que arrancan sonrisas y que me levantan de la cama con un salto, tienen rostro de mujer. Comienzo extrañando a quien el destino se encargo de alejar, y después con el primer cigarrillo del día, me pregunto como transcurrirán sus días, como correrá detrás de sus deberes. Recuerdo las cosas vividas, lo aprendido en el camino. Pero no puedo evitar pensar como rezará para que las cosas sucedan. Después me levanto de un salto y veo que es lo que el domingo trae para mí. Y mientras acomodo un poco mi departamento pienso en la semana.
Esta semana trajo demasiadas emociones, y momentos de decisión, he influenciado y me han influenciado, he enfrentado bifurcaciones. Por momentos siento que me salgo de control, que no puedo encontrar el camino y que la libertad se convierte en libertinaje y el coraje en temeridad. Y me siento mal por ello. Pero un amigo que casi no conozco, esos tipos de lentes y bondades en la piel, candidos, y plenos de la sabiduría que da la sensibilidad de corazón, se atrevió a hablarme al oído y decirme algo que es mas fácil escuchar y meditar cuando proviene de alguien a quien no conoces.
- No busques estar en equilibrio, ¡nunca lo vas a estar! –me dijo gritándome al oído para que lo pueda escuchar a pesar de la música fuerte.
- Siempre vas a vivir en el caos, en la búsqueda infinita, tu naturaleza es esa y debes aceptarla. – y luego se alejo unos pasos para ver como reaccionaba. Mi mirada busco en el suelo la reflexión.
- ¡Te felicito por la decisión que tomaste! A la larga será lo mejor.
Me quedo con sus palabras, me despido de la semana con la esperanza de haber dado un paso hacia mi bienestar y la nostalgia de las puertas cerradas en mi espalda.
Veamos que tiene el lunes para mí.

viernes, noviembre 09, 2007

Pasando Dias

Muchas cosas sucedieron desde la última vez que escribí. Mi mundo se puso de cabezas un par de veces, tal cual me gusta a mí.
Una mañana el trabajo llamo a mi puerta, de la mano de Gonzalo, que incentivado por un plan de remuneraciones, decidió aplicar por mi para el puesto de programador en EDS Córdoba. A las pocas horas me llamaron para una entrevista de trabajo. La verdad es que fue mi primera entrevista. Por que en mis anteriores trabajos jamás me habían entrevistado. De pantaloncito de vestir y camisa blanco ala, me presente para jugar un poco con algunos test de lógica y pensamiento transversal, código Java, y mi ingles algo empolvado. A los pocos días me llamaron con la noticia de que había sido seleccionado y es así como ya estoy cobrando mí primer sueldo y soy un chico EDS con tarjeta de seguridad y todo.
Me levanto todos los días a las siete de la mañana, para seleccionar la ropa que me voy a poner, darme una ducha, y tomar rumbo a la parada de colectivo, que me va a llevar hasta la empresa. Allí me encuentro con Joshua y Melani, mis dos profes de ingles con los cuales paso alrededor de unas cinco horas diarias hablando en ingles. Joshua un yanki sumamente divertido, y que esta empezando a cambiar mi forma de pensar de los mal llamados americanos, con respecto a su nivel cultural. Y Melani, su candida novia, con la cual recorrió medio mundo enseñando ingles. El no habla nada de español, pero sus bromas en ingles me hacen matar de la risa todos los días. Ella tiene un mejor español que yo. Además de ellos, en la parada, esta Lorena, una compañera de trabajo, que siempre llega con puntualidad británica, y a quien se podría decir que estoy debiendo mi permanencia en la empresa, por que es la que me motiva cuando mi humor perro se reniega. Me sirve el café cuando llego a la empresa y todavía tengo las sabanas pegadas en los ojos.
Por otro lado, conocí personas interesantísimas, y que me han enseñado un poco mas, personas como Pablo y su saxo, que en una noche de alcoholes y fiestas me enseño que no todos los jóvenes (yo soy joven, pero el lo es mas) aceptan sin resistirse las cosas cuando están mal. Porteño, policía, pero adoptado por la rioja. Si lo tienen de centinela en la cuadra de su casa lo van a reconocer, rubio y ojos claros, tiéndales una mano por que la verdad que su forma de pensar me sorprendió para la escueta edad que tiene.
Y por supuesto no me puedo olvida de Kari, con la cual nos cruzamos tangencialmente por la vida, pero de la cual saco mis mejores recuerdos, me enseño a que tengo que ser un poco mas ordenado, que tengo que intentar bailar algo, así que me estoy por inscribir en clases de tango para reflotar un viejo sueño que tenia. Me regalo muchas palabras que quedaran retumbando por un tiempo en mi mente, y me levanto en sus brazos para mostrarme el mundo del arte, con noches de luna.
Es así como hoy puedo irme a dormir, con una sonrisa en mis labios. Por que a pesar de que estoy solo, mi corazón esta lleno de toda la gente que me ama, me siento totalmente feliz, puedo decir al mundo que estoy preparado para mostrarle una faena más, la plaza esta llena y el publico aplaude, suelten al toro que van a ver mi mejor media verónica.

jueves, septiembre 06, 2007

Ventanas en Java II, Ventanas Internas, Frames Internos: JInternalFrame, JDesktopPane


Para Nai y Eve


Volvamos a repasar unos conceptos básicos sobre las ventanas en java. Tres son los tipos de ventas mas usadas en Java en lo que a Swing respecta.
Los JFrames comunes y corrientes. Que son esas ventas que se van creando en la barra de tareas si usas Windows.

JDialog que son ventanas, por lo general modales, en las cuales debe responder antes de continuar con las otras ventanas. Son ejemplos de dialogos, aquellas ventanas donde se nos solicita insertar la ubicación donde queremos guardar un archivo.
JInternalFrames
: Esta es una clase particular de ventanas. Las cuales se encuentran inmersas en una ventana padre, que hace las veces de escritorio. Actualmente la mayoría de las aplicaciones de escritorio, siguen este formato. Estas ventanas pueden ser minimizadas y expandidas dentro de los límites de la ventana padre.
En este pequeño tutorial veremos las JInternalFrames.

Creando un JInternalFrame

1er Paso: Crear el Frame Padre

El primer paso que debe realizar a la hora de trabajar con InternalFrames es crear la ventana que contendrá los internalFrames. Esta ventana ser padre de todas las demás es decir que el ciclo de vida de todas las ventanas internas se encontrara atada a esta.
Esta ventana padre, será un frame común y corriente.


public class FramePadre extends JFrame implements ActionListener{
JDesktopPane escritorio = new JDesktopPane();// escritorio de Trabajo
JMenuBar barra =new JMenuBar(); // barra de menu
JMenu menu =new JMenu("Archivo");
JMenuItem itemInterna =new JMenuItem("Internal Frame");
JMenuItem itemSalir =new JMenuItem("Salir");
public FramePadre() {
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
……
}
}

Como vemos extiende a JFrame e implementa la interfaz ActionListener, para captar los eventos de una barra de menú que ingresamos. En este tutorial no desarrollaré como crear una barra de menú, pues mi política es encarar cada cosa por separado, mas adelante lo realizare, pero si mostrare el código para poder realizarlo.
Además de ello podemos ver como declaramos una variable escritorio del tipo JDesktopPane, esto nos permitirá asignar una superficie de trabajo que delimitara a los internalFrames.
Dentro del constructor de la clase podemos llamar un método que creamos para ordenar la creación de la interfaz grafica, o directamente poner el siguiente código.

Dimension tamaño =Toolkit.getDefaultToolkit().getScreenSize();//de la pantalla
this.getContentPane().setLayout( null );
this.setBounds(0,0,tamaño.width,tamaño.height-30);
this.setTitle("Ejemplo Escritorio");
this.itemInterna.addActionListener(this);//para captar el evento en el ítem
this.itemSalir.addActionListener(this);//idem anterior
menu.add(this.itemInterna);//la menu le agregamos el item
menu.add(this.itemSalir);// idem anterior
this.barra.add(menu);// a la barra le agregamos el menu
this.setJMenuBar(barra);// al frame le agregamos la barra.
escritorio.setBackground(new Color(251,255,235));// un colorcito p escritorio
this.setContentPane(escritorio);// agregamos el escritorio al frame

Una vez terminado con esto, solo nos resta crear el método para captar los clic que realizara el usuario sobre cada uno de los ítems del menú. Es así como declaramos el método actionPerformed, impuesto por la interfaz ActionListener, e indicamos que realizar ante cada uno de los eventos de usuario.

public void actionPerformed(ActionEvent e){
if(e.getSource()==this.itemSalir){
this.salir();
}
if(e.getSource()==this.itemInterna){
FrameInterno interno =new FrameInterno("Ejemplo Frame Interno");
escritorio.add(interno);// Agregamos el frame al escritorio
try {
interno.setSelected(true);// Decimos que comience Enfocado
} catch (PropertyVetoException e) {}
}
}

Como vemos en el caso de que el usuario haga clic en el menú itemInterna se instancia un internalFrame y luego se lo agrega al escritorio. Finalmente decimos que se inicialice enfocado y capturamos la excepción.

2do Paso Crear un Internal Frame

Para crear nuestro frame interno, tenemos que crear una clase que herede de javax.swing.JInternalFrame:


public class FrameInterno extends JInternalFrame implements ActionListener{
…//components Swing, botones, label etc
public FrameInterno(String titulo) {
super(titulo,
true, //redimencionar
true, //cerrar
true,//maximizar
true);//minimizar
try{
interfazGrafica();
this.setVisible(true);
}
catch(Exception e){}
}
}
Como vemos podemos definir los botones que contendrá el frame en el ángulo superior derecho. Esto lo definimos pasándole como argumentos a la súper clase valores boléanos si queremos permitir eso.

Luego en el metodo interfazGrafica(), escribimos toda la interfaz que podría ser:


private void interfazGrafica() throws Exception {
this.getContentPane().setLayout(null);
this.setSize(new Dimension(311, 347));
btn_cerrar.setText("Cerrar");
btn_cerrar.setBounds(new Rectangle(180, 270, 110, 30));
jLabel1.setText("Este es Un Frame Interno");
jLabel1.setBounds(new Rectangle(30, 65, 255, 35));
jLabel1.setFont(new Font("Dialog", 1, 20));
jLabel1.setForeground(Color.blue);
this.btn_cerrar.addActionListener(this);
this.getContentPane().add(jLabel1, null);
this.getContentPane().add(btn_cerrar, null);
}

Y finalmente tenemos que hacer visible el frame con setVisible
Por ultimo debemos definir el método al cual nos obliga la interfaz ActionListener

public void actionPerformed(ActionEvent e){
if(e.getSource()==this.btn_cerrar){
this.setVisible(false);
}
}

Con esto ya tenemos un frame básico a partir del cual podemos empezar a jugar y agregarle componentes como botones y label o cualquier otra cosa que se les ocurra.
No dejen de ver que bueno que queda cuando minimizan un internalFrame!!

Saludos

lunes, septiembre 03, 2007

Confirmación y Alertas en Java: JOptioPane, showMessageDialog, showConfirmDialog, showInputDialog , showOptionDialog

La clase JOptionPane es una clase que hereda de JComponent. Ésta clase nos permitirá crear alertas o cuadros de diálogos simples para poder solicitar, o mostrar, información al usuario.
Los métodos que revisaremos en este pequeño tutorías serán:

  1. JOptionPane.showMessageDialog(…)
  2. JOptionPane.showConfirmDialog(….);
  3. JOptionPane.showInputDialog(…);
  4. JOptionPane.showOptionDialog(…);

Cada uno de estos métodos presenta una particularidad distinta pero todos ellos nos muestran una ventanita pop up que nos permitirá captar información del usuario.

  1. showMessageDialog

JOptionPane. showMessageDialog (Component componentePadre, Object mensaje, String titulo, int tipoDeMensaje)

Nos sirve para mostrar información, por ejemplo alguna alerta que queremos hacerle al usuario. Veamos cuales son los principales argumentos del método.
componentePadre: es por el ejemplo el Frame desde el cual lo llamamos. Si queremos lo podemos poner en null, que es mas o menos lo mismo.
Mensaje: es lo que queremos que diga el cuadro de dialogo.
Titulo: el titulo.
tipoDeMensaje: son constantes que le dirán a java que tipo de mensaje queremos mostrar. De acuerdo a esto seran los iconos que se mostraran en el cuadro de dialogo. Las opciones son

  • ERROR_MESSAGE
  • INFORMATION_MESSAGE
  • WARNING_MESSAGE
  • QUESTION_MESSAGE
  • PLAIN_MESSAGE

Si quisiéramos mostrar un icono personalizado, podemos agregarlo al final como un argumento más.
Ejemplo:

JOptionPane.showMessageDialog(null,"Acceso Denegado","Error",
JOptionPane.ERROR_MESSAGE);

  1. showConfirmDialog

Éste método sirve para pedirle al usuario una confirmación. Por ejemplo una confirmación de salida del sistema

Int respuesta =JOptionPane. showMessageDialog (Component componentePadre, Object mensaje, String titulo, int tipoDeOpcion);

El anterior es la versión corta del los argumentos del método. La versión larga incluye el tipo de mensaje y el icono, por si queremos personalizarlo.
Los argumentos son idénticos a los del método anterior. Excepto por el tipo de opción, que es otra constante y los valores pueden ser:

  • DEFAULT_OPTION
  • YES_NO_OPTION
  • YES_NO_CANCEL_OPTION
  • OK_CANCEL_OPTION

Como vemos el método devuelve una un entero que nos permitirá captar cual es la opción elegida por el usuario. Los valores serán 0 para Si, 1 para No, 2 para Cancelar y -1 para el cierre de la ventana. Así podremos preguntar cual es el valor devuelto y realizar la acción que deseamos.
Ejemplo

int i =JOptionPane.showConfirmDialog(this,"¿Realmente Desea Salir de Hola Swing?","Confirmar Salida",JOptionPane.YES_NO_OPTION);
if(i= =0){
System.exit(0);
}

  1. ShowInputDialog

Este método nos muestra una ventana donde podremos insertar una String. Por ejemplo cuando queremos que el usuario inserte su nombre. La versión corta del método es

String respuesta = JOptionPane.showInputDialog(Object mensaje)

Este método devolverá una String para poderla utilizar después. La versión larga de los argumentos del método es similar a los anteriores.
Ejemplo:

String nombre =JOptionPane.showInputDialog("Inserte su Nombre");
this.lbl_nombre.setText(nombre);

También podemos crear un cuadro de dialogo que contenga un combo con las opciones predeterminadas que le queremos dar al usuario.
Ejem:

Object[] valoresPocibles = {"Pedro", "Juan", "Carlos" };
Object jefe = JOptionPane.showInputDialog(null,
"Seleccione cual es su Jefe Inmediato", "Seleccionar Jefe",
JOptionPane. QUESTION_MESSAGE, null,
valoresPocibles,
valoresPocibles[0]);
this.lbl_jefe.setText((String)jefe);

El array de valores posibles nos muestra en un combo cuales serán los jefes que podemos mostrar. El último argumento del método nos muestra cual será la opción seleccionada por defecto

showOptionDialog

Con este método podemos crear cuadros de diálogos con botones personalizados. Esta bueno para darle un toque personal a los cuadros de dialogo
El método tiene la forma:

Int res = JOptionPane.showOptionDialog(Component componentePadre, Object mensaje, String titulo, int tipoDeOpcion, int tipoMensaje, Icon icono, Object[] botones, Object botonDefault)

Aquí lo único que varia con el resto es el array de botones que vamos a tener, debemos destacar que no hace falta que creemos botones, solo tenemos que poner cual será el texto que saldrá en el.

Object[] botones = {"Si dale va a estar bueno", "No?... buuu" };
int i=JOptionPane.showOptionDialog(null, "¿Queres salir a Bailar esta Noche?", "Sita",
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,null, botones, botones[0]);
System.out.println(i);

Después podemos tomar la respuesta como lo hacíamos con el confirmDialog.
Bueno hasta la próxima, esto es lo más importante en los mensajes o alertas.

miércoles, agosto 29, 2007

Ventanas en Java I: JFrame, propiedades, centrar, confirmar al cerrar, eventos


La primera distinción que debemos hacer entre las ventas que vamos a realizar es si las mismas son modales o no. Las modales son aquellas ventas que si o si deben tener una respuesta del usuario antes de continuar, como por ejemplo aquellas ventanas donde se nos pide que confirmemos si queremos guardar un archivo o no. Todas las demás ventanas son no modales.
En estos pequeños tutóriales, voy a desarrollar JFrames, IInternalFrames y JDialog
En el caso de las JFrame las mismas son no modales.

1. JFrame

Para comenzar a crear un JFrame tenemos que crear una ventana que extienda la clase JFrame e implemente la interfaz ActionListener que nos permitirá captar los eventos de los usuarios sobre los componentes Swing que vamos a utilizar (el botón).

public class FrameInicial extends JFrame implements ActionListener{

//variables globales en este caso Irán todos los componentes swing
//Constructor de la case
//Métodos

}

Debemos recordar que siempre que implementemos la interfaz AL deberemos declarar el método actionPerformed(AcrionEvente evento)
El constructor de la clase tendrá la forma:

public FrameInicial() {
try {
metodoSiguiente();
// aquí vamos a poner las propiedades y componentes
this.centrar();
//método mió para centrar
/*confirmacion de salida*/
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
confirmarSalida();
}
});
this.setVisible(true);
//hacemos visible el frame
}
catch (Exception e) {
e.printStackTrace();
}
}

El metodoSiguiente() es un método que cree para ordenar todas las propiedades y los componentes que contendrá nuestra ventana.
Centrar() es un método que nos permitirá centrar la ventana de acuerdo a la resolución que tenga nuestro monitor. Por defecto en java todas las ventanas aparecen en el extremo superior izquierdo.
En cuanto a solicitar una confirmación a la hora de salir lo primero que tenemos que indicar es que la ventana no va a realiza ninguna acción cuando se da el evento de cierre, si esto no se especifica, la ventana sale directamente sin realizar ninguna acción. Esto es en el caso en que tenemos un frame que es el principal de nuestra aplicación y queremos pedirle al usuario que confirme la salida cuando hizo clic en la crucecita del frame.
Lo hacemos con el metodo:

setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE)

confirmarSalida() será el método que pregunte si deseamos salir o no.
Finalmente debemos hacer visible el frame con el método setVisible(true).

1.1 metodoSiguiente()

En este caso vamos a agregarle al frame una label y un botón para cerrar, a medida que vallamos avanzando en los distintos frames voy a ir agregando distintos componentes.
Es una buena costumbre nombrar a los componentes de forma representativa.
Por ejemplo las etiquetas pueden comenzar con lbl_nombre o los botones con btn_nombre, etc. Ya que cuando nuestra aplicación crezca se puede hacer complicado si no tenemos nombre representativos. Otra aclaración es que los componente ya fueron declarados e inicializados globalmente en la case.

private void metodoSiguiente() throws Exception {
this.getContentPane().setLayout( null );//la forma de organizar los componentes
this.setSize(new Dimension(385, 300));
//el tamaño de la ventana
this.setTitle("Hola Swing");
//el titulo
btn_cerrar.setText("Cerrar");
//el boton cerrar
btn_cerrar.setBounds(new Rectangle(250, 220, 120, 25));//tamaño del botón
lbl_hola.setText("Hola Swing");//lo que la etiqueta dirá
lbl_hola.setBounds(new Rectangle(135, 80, 120, 35));//el tamaño de la etiqueta
lbl_hola.setToolTipText("texto emerguente");
//texto mouse por arriba
lbl_hola.setFont(new Font("Dialog", 1, 20));
//la fuente de la etiqueta
lbl_hola.setForeground(Color.red);
//color de la etiqueta
this.btn_cerrar.addActionListener(this);
//para escuchar los eventos.
this.getContentPane().add(lbl_hola, null);//pegar los components en el frame
this.getContentPane().add(btn_cerrar, null);
}


El setLayout es la forma en la que organizamos los componentes dentro del frame, esto nos servirá para cuando el frame cambie de tamaño o se maximice los componentes mantengan un aspecto armónico. Es todo un tema los distintos tipos de layout que existen en java.
El size o tamaño del componente es importante a la hora de centrar el frame en la pantalla, ya que lo utilizaremos para calcular la ubicación en la que debe estar. Se pasa como parámetro un objeto dimensión con los valores del (ancho, alto).
El titulo (setTitle) es el texto que aparecerá en la parte superior del frame, ademas cuando lo minimicemos aparecerá en la barra de herramientas de Windows (o superior)
En el caso del btn_cerrar le diremos cual será el texto con contendrá con setText, el tamaño y la ubicación con el método setBounds que recibe como parámetro un objeto Rectangle con parámetros que indican las coordenadas y tamaño. Los dos primeros son las coordenadas en x e y desde el margen superior izquierdo del frame, y los dos restantes son el tamaño en ancho y alto.
En cuanto a la etiqueta lbl_hola podemos definir que dirá con setText, la ubicación y tamaño con setBounds, y lo que dira cuando pasemos con el Mouse por arriba con setToolTipText, esta misma propiedad puede ser aplicada a otro componentes swing para ir guiando al usuario. Además de ello podemos indicarle cual sera la fuente que la etiqueta tendrá con setFont que recibe como parámetro un objeto del tipo Font que indica (el nombre de la fuente, normal/negrita/itálica, tamaño). Finalmente podemos indicarle el color que tendrá el texto con setForeground que recibirá como parámetro una constante que indique el color o un objeto Color con parámetros (R,G,B).
componente.addActionListener(this) es el método que permite agregar un oyente de eventos a un componente que tendremos dentro del frame. En este caso se lo agregaremos al botón de cerrar por que nos interesa saber cuando el usuario hace un clic en el. Decimos que el parámetro será el frame que creamos por que ya hemos implementado la interfaz ActionListener en el frame si no tendríamos que crearla como lo hicimos en el caso de la ventana.
Bien… ya hemos creado todos los componentes que el frame tendra, ahora tenemos que pegarlos en frame, si no, no serán visibles, esto los haremos con el método add(componete), que tiene como parámetros ya sea el componente solo, o el componente con su correspondiente layout.

Nota: a estas alturas, los que recién comienzan dirán es un kilombo total crear interfaces graficas en Java, pero no se asusten, los entornos de desarrollo tienen sus propias herramientas para crear esto arrastrando y soltando. ¡Es más! este ejemplo fue creado de esa forma. La finalidad es que sepamos que hace cada cosa.

1.2 El método Centrar()

Al igual que el método anterior, éste es un método creado por mí para centrar las ventanas. Como idea se puede crear una clase con el método implementado y después heredarla en otras clases, en fin… son solo idas.

private void centrar(){
Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frame =this.getSize();
setLocation((pantalla.width/2-(frame.width/2)),pantalla.height/2-(frame.height/2));
}

Lo primero que realiza el método es tomar la resolución de la pantalla, primero obtiene el toolkit por defecto y después el resolución de la pantalla.
Después el tamaño que le dimo al frame con getSize()
Y finalmente le indicamos la localización del frame en la pantalla con el método setLocation(int x, int y)

1.3 El método confirmarSalida()

A este método lo podremos llamar tanto desde el botón cerrar de la ventana misma como de un botón creado por nosotros mismos. La llamada al método se realizará en los métodos que las interfaces que escuchan los eventos de usuario, en el caso de la ventana es windowClosing(WindowEvent e), y en el caso del botón es actionPerformed(ActionEvent e).

private void confirmarSalida(){
int i =JOptionPane.showConfirmDialog(this,"¿Realmente Desea Salir de Hola Swing?","Confirmar Salida",JOptionPane.YES_NO_OPTION);
if(i==0){
System.exit(0);
}
}

Bien acá hay algo interesante relacionado a las ventanas. JOptionPane es una clase que nos permite hacer cuadros de diálogos. En el caso del método showConfirmDialog nos devolverá un entero con el valor de la elección del usuario. (En este caso 0 para si, 1 para no). Veremos más opciones cuando trate diálogos en Java.
El método exit(int status) de la clase System nos permitirá cerrar nuestra aplicación.
Debemos distinguirlos del método JFrame.setVisible(boolean visibilidad) del frame que nos permite cerrar la ventana sin salir de la aplicación.

1.1 El método actionPerformed(ActionEvent evento)

Este método nos permitirá captar los eventos realizados por el usuario sobre algún componente swing, en nuestro caso será el botón.

public void actionPerformed(ActionEvent e){
if(e.getSource()==this.btn_cerrar){
confirmarSalida();
}
}

Lo primero que realizamos dentro del método es preguntar cual es la fuente del evento, esto lo hacemos en caso de que tengamos varios botones a los cuales le asignamos el oyente de eventos. Si la fuente del evento es el botón cerrar, llamamos el método confirmar salida.

1.2 La clase Principal

Es una buena costumbre tener una clase que contenga el método main y desde la cual llamar al formulario de entrada a la aplicación.

public class Principal {
public Principal() {
FrameInicial f =new FrameInicial();
}
public static void main(String[] args) {
Principal principal = new Principal();
}
}

martes, agosto 28, 2007

Iniciando Java

Hablando con amigos que recién se estaban iniciando en java me preguntaban como podían hacer interfaces graficas en Java, como podían bajar lo que habían teorizado en las aulas a la programación neta.
Un buen comienzo, es empezar en las UI tipo Swing o AWT, algunos pensaban que este tipo de paradigmas se estaban olvidando frente a las interfaces WEB, pero JSF nos vuelve a remontar a la captación de los eventos realizados por el usuario.
La estructura de estos post vendrán dados como si construyéramos una aplicación, no me animaría a decir que seguiré el modelo MVC (modelo-Vista-Control) pero si a que definiré los aspectos mas importantes.
Otro aspecto a tener en cuenta el IDE o entorno de desarrollo que vamos a utilizar, ya que éste nos permitirá ahorrarnos un buen trabajo. En mi caso, pero no quiero decir que sea el mejor, utilizaré JDeveloper.

miércoles, agosto 22, 2007

I say a little prayer for you

Gracias princesa, estuve escuchando la canción que me dedicaste. Y quiero decirte que yo también en cada momento del día elevo un plagaría por ti. Que siempre me pregunto como marchara tu vida, como caminaran tus sueños y cuanto estarás creciendo.
Un beso eterno.

sábado, agosto 11, 2007

Gracias

Muchas veces me pregunte el por que. Por que dejaba todo lo que amaba, por que cambiaba una vida perfecta, por que me tenia que sentir solo, por que la resignación de todo lo que me hacía feliz. Me preguntaba por que levantarme cuando estaba enfermo, por que el frió cuando estas en medio del calido amor de unos brazos. Por que acostarse temprano, por que no dormir cuando tus parpados ya se durmieron. Por que volver sin mirar a tras. Por que quedarse cuando todo el mundo sale, por que la ausencia en fechas importantes. ¿Por que?
Por que soy un cazador de mariposas. Por que vivo transitando sueños. No es el destino, es el viaje, es el transitar, es el motor que me impulsa, es la meca de un sueño que me guía y que nace en lo más profundo de mi alma.
Hoy me doy cuenta, que nada de esto hubiera sido posible en soledad. Y agradezco a todas aquellas personas, compañeras de camino, que me encontraban sentado y llorando contra un árbol, rendido. A aquellos seres de luz que con su concejo y amor, me levantaban, me daban fuerza y me recordaban por que debía seguir caminando. Todos ustedes representan mi pequeño mundo, mis sueños, mis amores, mis afectos. Representan ese bocado dulce de mi vida.
Gracias por haber creído en mí cuando era difícil, gracias por su concejo, ánimo, e infinito amor.
Ariel Díaz Molina
Analista Universitario de Sistemas

martes, julio 31, 2007

Simpsonizate


En el noticiero escuche de una pagina en la cual podes subir tu foto para transoformarte en un personaje de los Simpson, asi que subi la mía y algo asi quedo (yo le agregue el fondo).
Si queres hacer la prueba con una tuya la pagina es www.simpsonizeme.com