<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4366106582681431053</id><updated>2012-01-29T13:00:14.928-08:00</updated><category term='Libros'/><category term='WebService'/><category term='Servlets'/><category term='Ing de Software'/><category term='Herramientas'/><category term='JAVA'/><category term='API Weather'/><category term='UML'/><category term='DB4O'/><category term='APEX'/><category term='Oracle'/><category term='Objective C'/><category term='Groovy'/><category term='Selenium IDE'/><category term='Lean Software Development'/><category term='App Engine'/><category term='Matemáticas'/><category term='Historias'/><category term='TDD'/><category term='Agile'/><category term='Java Web'/><category term='Crítica y Humor'/><category term='Scrum'/><category term='Java Mexico'/><category term='Spring'/><category term='Illustrator'/><category term='Pruebas Unitarias'/><title type='text'>Mundo Byte</title><subtitle type='html'>Desarrollo JEE y Metodologías Ágiles</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>32</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-8581776723527798570</id><published>2012-01-29T13:00:00.001-08:00</published><updated>2012-01-29T13:00:14.935-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Objective C'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>Objective-C para desarrolladores Java: Parte 1</title><content type='html'>&lt;p&gt;Como desarrollador Java y claro que no con mucha experiencia en lenguaje C, es importante comenzar conociendo algunas diferencias entre ambos lenguajes. Aprendí cuestiones básicas de lenguaje C desde la preparatoria, pero claro que sin tener ninguna práctica en la Universidad, olvide lo que aprendí, sin embargo no es muy complicado recordar aquellas cuestiones básicas.&lt;/p&gt;&lt;p&gt;En este sencillo tutorial, vamos ver algunos conceptos básicos de Objective-C que hereda del lenguaje C con el fin de perfilarnos más adelante a comenzar con el desarrollo de aplicaciones en MAC OS X y iPhone utilizando Xcode.&lt;/p&gt;&lt;p&gt;Aunque Objective C es más utilizado en el mundo Mac y este ejercicio se desarrolló en una MacBook, es posible hacerlo en Windows, bajar el compilador y cualquier editor, aunque claro esta, no es tarea de este tutorial explicar su instalación. A continuación paso a listar las herramientas utilizadas para este ejercicio.&lt;/p&gt;&lt;h3&gt;NOTA: No es intensión de este tutorial, explicar las diferencias entre lenguaje C puro y Objective C.&lt;/h3&gt;&lt;h2&gt;HERRAMIENTAS.&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;MacBook Pro - OS X Lion&lt;/li&gt;&lt;li&gt;CodeRunner - Puedes utilizar cualquier otro editor de texto.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;h2&gt;CONCEPTOS BÁSICOS&lt;/h2&gt;&lt;p&gt;Al igual que en Java, en Objective C se acostumbra al uso de Interfaces y Clases. Vamos a crear una interfaz llamada Arithmetic&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="NewImage.png" src="http://lh5.ggpht.com/-UWN3I8Ek6n0/TyWyDPjP-QI/AAAAAAAAAN0/5wiWnZkiCcI/NewImage.png?imgmax=800" border="0" alt="NewImage" width="452" height="224" /&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;ul&gt;&lt;li&gt;En Java, la super clase cósmica de la cual deriva toda la jerarquía de clases de la biblioteca de Java, es llamada Object. Pues bien, en Objective C, NSObject es el similar a la clase Object. Aunque en Objective C no es requisito que una clase derive de NSObject. En Java si una clase no especifica extender a otra clase, internamente deriva de Object.&lt;/li&gt;&lt;li&gt;Mientras en Java la herencia de especifica mediante la palabra "extends", en Objective C se indica mediante el símbolo dos puntos (:).&lt;/li&gt;&lt;li&gt;En Java, el cuerpo de una interfaz o de una clase esta definida por la apertura y cierre de llaves {….}, en Objective C se delimita por @interface y @end.&lt;/li&gt;&lt;li&gt;En Objective C las variables de instancia de declaran seguido de la definición de la interfaz y encerradas entre llaves, tal y como se muestra en la imagen. operador1 y operador2 son estas variables.&lt;/li&gt;&lt;li&gt;En Java podemos definir &lt;strong&gt;métodos de instancia&lt;/strong&gt; y &lt;strong&gt;métodos de clase. &lt;/strong&gt;Recordando que los métodos de instancia son aquellos que podemos invocar creando una instancia del objeto, mientras que los métodos de clase son aquellos que podemos invocar sin tener una instancia de un objeto, como por ejemplo, los métodos de la clase Math son un ejemplo claro de los métodos de clase… Math.&lt;strong&gt;pow(…..). En java, los métodos que en su definición agregan la palabra static, se consideran métodos de clase.&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p style="font-size: 13px;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" title="NewImage.png" src="http://lh6.ggpht.com/-hHUVc5razDM/TyWvrBaYjmI/AAAAAAAAANo/VNuwrT0sRJg/NewImage.png?imgmax=800" border="0" alt="NewImage" width="600" height="108" /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;En Objective C, un método de instancia se declara con el símbolo menos (-) y los métodos de clase (como el método pow en Java) se declaran con el símbolo más (+).&lt;/li&gt;&lt;li&gt;El tipo de dato de retorno de un método siempre se especifica entre paréntesis, en este caso, es (void).&lt;/li&gt;&lt;li&gt;Como se observa en la imagen, después del nombre del método, se escribe el caracter dos puntos (:) para posteriormente indicar el tipo de dato del parámetro que es encerrado dentro de paréntesis. En este caso, tenemos dos parámetros llamados op1 y op2. Ámbos son de tipo (NSInteger).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;En la segunda parte vamos a realizar la implementación de la interfaz y veremos como compilar, enlazar y ejecutar este ejercicio desde la línea de comandos para que en la tercer parte podamos desarrollar una sencilla interfaz gráfica mediante Xcode + Interface Builder que utilice esta clase Arithmetic.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-8581776723527798570?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/8581776723527798570/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2012/01/objective-c-para-desarrolladores-java.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8581776723527798570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8581776723527798570'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2012/01/objective-c-para-desarrolladores-java.html' title='Objective-C para desarrolladores Java: Parte 1'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-UWN3I8Ek6n0/TyWyDPjP-QI/AAAAAAAAAN0/5wiWnZkiCcI/s72-c/NewImage.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-2080071536844916519</id><published>2012-01-29T11:48:00.003-08:00</published><updated>2012-01-29T11:48:39.787-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>III. Paso de parámetros en Java: Por Valor</title><content type='html'>&lt;p&gt;Explicábamos en la segunda parte de este artículo que lo que realmente se pasa es una copia de la referencia. La explicación gráfica del ejemplo anterior de lo que sucede en memoria es la siguiente.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image8.png"&gt;&lt;img style="display: inline; margin-left: 0; margin-right: 0; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb8.png" border="0" alt="image" width="480" height="241" align="left" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Recordemos que en nuestra primera entrega explicamos lo que es una “referencia de objeto” y decíamos que una referencia de objeto apunta al Objeto.&lt;/p&gt;&lt;p&gt;Entonces cuando creamos al objeto “ascari”, este es solo una referencia a un objeto Empleado. Cuando invocamos al método &lt;strong&gt;&lt;em&gt;triplicarSueldo&lt;/em&gt;&lt;/strong&gt; y le pasamos como parámetro al objeto ascari, no le estamos pasando la dirección de memoria de “ascari”. Lo que sucede es que se hace una copia de la referencia “ascari” y esta copia se pone en “x”.&lt;/p&gt;&lt;p&gt;Lo anterior es la piedra de tropiezo para muchos, y es lo que les causa confusión. El hecho de que Java maneje el concepto de “referencia de objeto” es lo que hace pensar que Java hace un paso de parámetros por referencia, es decir, que se le pasa la dirección de memoria. Sin embargo, una referencia de objeto es un apuntador a un Objeto ubicado en algún otro lugar de memoria.&lt;/p&gt;&lt;p&gt;Como lo comentábamos, cuando “ascari” es pasado al método triplicarSueldo, no quiere decir que a “x” le sea asignada la dirección de memoria de “ascari”. Como lo ilustra la figura de arriba, se hace una copia de la referencia! Por lo tanto existen dos referencias que apuntan a un objeto Empleado.&lt;/p&gt;&lt;p&gt;Técnicamente esta mal dicho si decimos “modificar x” ó “modificar ascari” ya que en ningún momento estamos modificando a “x” o “ascari” ya que estas son solo referencias a un objeto Empleado, lo que realmente se modifica es el objeto Empleado.&lt;/p&gt;&lt;p&gt;Ahora como seguramente muchos pensaran que todo lo anterior es absurdo, hay que realizar un último ejemplo para demostrar de forma contundente que los objetos no son pasados por valor.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0000a0; font-size: small;"&gt;Tercer Ejemplo.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Hagamos un método llamado intercambiar que reciba dos objetos Empleado y que intente intercambiar a los empleados.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image9.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb9.png" border="0" alt="image" width="462" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image10.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb10.png" border="0" alt="image" width="469" height="179" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Si Java hiciera un paso de parámetros por “referencia” el resultado de este ejemplo es que “a” terminaría refiriéndose a Beto y “b” terminaría refiriéndose a Ascari, sin embargo no es así. ¿Qué esta pasando internamente en memoria? ¿Por qué en el ejemplo anterior si existe un cambio en la variable que hace la llamada y  en este no?&lt;/p&gt;&lt;p&gt;Si el paso de parámetros Si el paso de parámetros fuera por referencia, ocurriría algo como esto.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image11.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb11.png" border="0" alt="image" width="469" height="249" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Si Java hiciera un paso de parámetros por referencia, entonces “x” obtendría la dirección de memoria de “a” y “y” obtendría la dirección de memoria de “b”. Entonces cuando en el método “intercambiar” intentemos hacer que “x” apunte al Empleado Benito y que “b” apunte al Empleado “Ascari”, por ende “a” también apuntaría a “Benito” y “b” apuntaría a “Ascari”. (Figura de abajo).&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image12.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb12.png" border="0" alt="image" width="473" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Sin embargo, podemos comprobar que lo anterior no funciona. a sigue refiriéndose a Ascari y b a Benito. Por lo tanto, Java no acepta un paso de parámetros por referencia sino por copia o valor, pero lo que se copia es la referencia del objeto.&lt;/p&gt;&lt;p&gt;Ahora veamos lo que en realidad esta pasando.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image13.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb13.png" border="0" alt="image" width="474" height="309" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Observamos que existe una &lt;strong&gt;&lt;span style="color: #0000a0;"&gt;copia de las referencias a y b&lt;/span&gt;&lt;/strong&gt;. Estas referencias son copiadas en x e y. Ahora “x” apunta a Ascari y “y” a Benito.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image14.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb14.png" border="0" alt="image" width="452" height="292" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Pero inmediatamente en el método “intercambiar” se realiza el intercambio.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image15.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb15.png" border="0" alt="image" width="471" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ahora vemos como&lt;strong&gt; “x”&lt;/strong&gt; apunta a “Benito” y &lt;strong&gt;“y”&lt;/strong&gt; apunta a “Ascari”.. Sin embargo no perdamos el foco de que tanto “a” como “b” siguen apuntando al mismo objeto!!!!!!!!!&lt;/p&gt;&lt;p&gt;Lo anterior demuestra de forma contundente que Java &lt;strong&gt;NO&lt;/strong&gt; realiza el paso de parámetros por referencia, sino por copia, pero lo que sucede es    &lt;br /&gt;que se hace una copia de las referencias de objeto.&lt;/p&gt;&lt;p&gt;Desafortunadamente autores de libros sostiene que Java realiza paso de parámetros por referencia para los objetos.&lt;/p&gt;&lt;p&gt;Algunos autores son:   &lt;br /&gt;● Francisco Javier Ceballos    &lt;br /&gt;● Agustín Froufre&lt;/p&gt;&lt;p&gt;Afortunadamente hay autores que con toda la autoridad desmienten lo anterior. Algunos de ellos son:&lt;/p&gt;&lt;p&gt;● Gary Cornell   &lt;br /&gt;Autor y coautor de más de una veintena de libros. Posee el    &lt;br /&gt;titulo de Doctor otorgado por la Brown University y ha sido    &lt;br /&gt;científico visitante en IBM.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;● Deitel &amp;amp; Deitel    &lt;br /&gt;Toda una autoridad y sus libros son un clásico    &lt;br /&gt;en lo tocante a Java y C++.&lt;/p&gt;&lt;p&gt;Pero si todavía queremos más referencias para creer, existen libros de preparación para el EXÁMEN DE CERTIFICACIÓN “SUN CERTIFIED JAVA PROGRAMMER” tal es el caso del libro “SCJP Exam for J2SE 5” del Dr. PAUL SANGHERA, donde en la página 124 afirma lo siguiente.&lt;/p&gt;&lt;p&gt;“The key point to remember is that regardless of whether the passed variable is a primitive or a reference variable, &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #008000;"&gt;it is always the copy of the variable&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;, and not the original variable itself. Technically speaking, it is pass-by-value and not pass-by-reference within the same virtual machine.”&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Más adelante, en la página 125 comenta lo siguiente.&lt;/p&gt;&lt;p&gt;“Recall that an object reference variable points to an object, and it is not the object itself. When you pass a reference variable in a method, &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #008000;"&gt;you pass a copy of it and not the original reference variable&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;.”&lt;/p&gt;&lt;p&gt;Ahora bien, para los necios, por si esto fuera poco, el mismo creador de Java, sostiene que Java solo utiliza el paso de parámetros por valor.&lt;/p&gt;&lt;p&gt;““&lt;em&gt;There is exactly one parameter passing mode in Java – pass by value – and that helps keep things simple&lt;/em&gt;.”&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Podemos dar por hecho que hemos desmentido una creencia errónea y a partir de ahora, no seremos engañados por muchas páginas de internet y de personas que dicen que Java acepta el paso de parámetros por valor y por referencia.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Saludos!!&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-2080071536844916519?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/2080071536844916519/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2012/01/iii-paso-de-parametros-en-java-por.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2080071536844916519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2080071536844916519'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2012/01/iii-paso-de-parametros-en-java-por.html' title='III. Paso de parámetros en Java: Por Valor'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-7381179181558398723</id><published>2012-01-29T11:48:00.001-08:00</published><updated>2012-01-29T11:48:11.341-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>II. Paso de parámetros en Java: Por Valor</title><content type='html'>&lt;p&gt;Existe una &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;creencia errónea&lt;/span&gt;&lt;/strong&gt; muy difundida de que en Java el paso de parámetros se realiza de dos formas.&lt;/p&gt;&lt;p&gt;● Los tipos primitivos se pasan por valor.   &lt;br /&gt;● Los objetos se pasan por referencia.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Es necesario aclarar que en Java solo &lt;em&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #008000;"&gt;existe un único modo&lt;/span&gt;&lt;/span&gt;&lt;/em&gt; de paso de parámetros. &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Paso por valor&lt;/span&gt;&lt;/strong&gt;. Y lo anterior, es independiente si se trata de un tipo primitivo o un objeto.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0000a0; font-size: small;"&gt;Primer Ejemplo.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Si tenemos el siguiente método.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image2.png"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb2.png" border="0" alt="image" width="382" height="95" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ahora creamos un objeto Empleado para triplicar el sueldo.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image3.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb3.png" border="0" alt="image" width="484" height="66" /&gt;&lt;/a&gt; Hasta aquí todos concordamos que no se altera el valor de porcentaje.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image4.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb4.png" border="0" alt="image" width="466" height="323" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Definitivamente comprobamos que incluso aquellos que me acusan de ignorante por no tener idea de lo que hablo, tienen razón! Los tipos primitivos son pasados por valor. Ahora, veamos con un segundo ejemplo si tienen razón al decir que los objetos son pasados por referencia.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0000a0; font-size: small;"&gt;Segundo Ejemplo.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Tenemos una clase Empleado. El primer parámetro del constructor es el nombre, el segundo, tercero y cuarto es el día, mes y año respectivamente de su fecha de contrato en la empresa.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image5.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb5.png" border="0" alt="image" width="478" height="171" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Observemos como al empleado en cuestión le asignamos como fecha de contrato el 11 de Junio del 2009.&lt;/p&gt;&lt;p&gt;Al imprimir la fecha de contrato podremos observar que dicha fecha fue alterada ya que obtenemos una fecha del &lt;strong&gt;&lt;em&gt;11 de Junio de 1999!&lt;/em&gt;&lt;/strong&gt; Le hemos quitado 10 años de trabajo al empleado!&lt;/p&gt;&lt;p&gt;Básicamente lo anterior no es un paso de parámetros, pero es un buen ejercicio de calentamiento para prepararnos con lo que sigue.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #0000a0; font-size: small;"&gt;Tercer Ejemplo.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Entremos en materia pues y hagamos un método que reciba como parámetro un Objeto de tipo Empleado.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image6.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb6.png" border="0" alt="image" width="457" height="110" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ahora vamos a crear un objeto Empleado y pasarlo como parámetro al método triplicarSueldo.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image7.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb7.png" border="0" alt="image" width="480" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Upss!!!!!!!!!! El sueldo del empleado ya no es el mismo!!!!!!!!!!!!!! oh nooooo, tenían razón!! Los parámetros en Java se pasan por referencia :( me equivoque! Bueno ni modo, cerrare el blog. Nos vemos……&lt;/p&gt;&lt;p&gt;……………………….&lt;/p&gt;&lt;p&gt;……………………….&lt;/p&gt;&lt;p&gt;Bueno soy malo para fingir pero hice mi mejor esfuerzo. La verdad es que pese a lo anterior, los objetos son pasados por valor, le guste a quien le guste así es y será por los siglos de los siglos. Lo que realmente sucede es que se pasa una &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="color: #0000ff; font-size: x-small;"&gt;copia de la referencia!&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #400040; font-size: x-small;"&gt;¿Copia de la referencia?… Pero que es eso? De que hablo?.. Bueno, esto se explicará en la tercera parte de este artículo.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Nos vemos a la próxima!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-7381179181558398723?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/7381179181558398723/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2012/01/ii-paso-de-parametros-en-java-por-valor.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/7381179181558398723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/7381179181558398723'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2012/01/ii-paso-de-parametros-en-java-por-valor.html' title='II. Paso de parámetros en Java: Por Valor'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-5860906600558847944</id><published>2012-01-29T11:47:00.001-08:00</published><updated>2012-01-29T11:47:54.211-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>I. Paso de parámetros en Java: Por Valor</title><content type='html'>&lt;p&gt;Después de varios meses de no escribir en el Blog, he decidido responder a una serie de cuestionamientos sobre el tema de “Paso de parámetros en Java” donde desafortunadamente existe mucha confusión al respecto y por ende he recibido comentarios en donde dicen que yo no tengo idea de lo que hablo. Pero bueno, aclaremos ahora todo esto y veamos en donde esta el meollo del asunto o el asunto del meollo.&lt;/p&gt;&lt;p&gt;Ocupare material elaborado por mi en un curso que impartí sobre Java. Barreré como a la hojarasca!&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #004080; font-size: small;"&gt;Introducción&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb.png" border="0" alt="image" width="466" height="261" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Variables primitivas. &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Básicamente consisten en variables de alguno de los tipos primitivos.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Variables de Referencia.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;También se les llama variables de objeto. Estas variables no son el objeto mismo, son solo una &lt;strong&gt;&lt;span style="color: #ff0000;"&gt;referencia al objeto. Imaginemos tener una variable de tipo Date.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;private Date fechaLimite;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Al crear el objeto con el operador new, sucede algo como lo mostrado en la imagen de abajo.&lt;/p&gt;&lt;p&gt;&lt;a href="http://mundobyte.files.wordpress.com/2009/06/image1.png"&gt;&lt;img style="display: inline; border: 0;" title="image" src="http://mundobyte.files.wordpress.com/2009/06/image_thumb1.png" border="0" alt="image" width="483" height="162" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;fechaLimite no es el objeto en si, más bien es una referencia al objeto Date.&lt;/p&gt;&lt;p&gt;En Java, el valor de toda variable de objeto es una referencia de un objeto que reside en algún otro lugar. El valor proporcionado por el operador &lt;strong&gt;&lt;em&gt;new&lt;/em&gt; &lt;/strong&gt;también es una referencia.&lt;/p&gt;&lt;p&gt;La expresión &lt;em&gt;&lt;strong&gt;new Date()&lt;/strong&gt;&lt;/em&gt; crea un objeto del tipo Date, y su valor es una referencia del objeto recién creado. Esa referencia se almacena entonces en la variable fechaLimite. Las referencias de objeto son equivalentes a los punteros de C++, sin embargo, en Java no es posible manejar punteros y la administración de memoria es una tarea del Garbage Collector.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Existe Existe en la terminología de las Ciencias Computacionales para el paso de parámetros a los métodos.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;● &lt;strong&gt;&lt;span style="color: #0000a0;"&gt;Paso por valor o copia. &lt;/span&gt;&lt;/strong&gt;Significa que el método obtiene solamente el valor (una    &lt;br /&gt;copia) que proporciona quien hace la llamada.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #0000a0;"&gt;● Paso por Referencia. &lt;/span&gt;&lt;/strong&gt;Significa que el método recibe la ubicación de la variable    &lt;br /&gt;que proporciona quien hace la llamada.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Ahora si, una vez aclarado lo anterior, podemos comenzar a desmentir a esa falsa creencia que tienen algunos de mis lectores del blog y muchísima más gente conocedora de C++ pero no de Java y piensan que todo es igual en Java.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-5860906600558847944?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/5860906600558847944/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2012/01/i-paso-de-parametros-en-java-por-valor.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/5860906600558847944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/5860906600558847944'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2012/01/i-paso-de-parametros-en-java-por-valor.html' title='I. Paso de parámetros en Java: Por Valor'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-4193947987202668121</id><published>2011-07-28T21:12:00.000-07:00</published><updated>2011-07-30T21:46:44.281-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='API Weather'/><title type='text'>Desarrollando un agente de chat que informe el clima</title><content type='html'>En este tutorial desarrollaremos con App Engine un pequeño agente de chat que nos informe sobre el estado del tiempo actual de la ciudad que le indiquemos y lo hará utilizando la red XMPP tal como lo hace GTalk. Si no sabes que es App Engine o no has desarrollado anteriormente, es recomendable que leas este pequeño &lt;a href="http://mundobyte-x.blogspot.com/2011/07/introduccion-al-google-app-engine.html"&gt;tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para obtener la información del estado del tiempo podemos utilizar cualquier servicio público como el de Yahoo, Msn, etc., en mi caso utilizaré&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: x-small; line-height: 16px;"&gt;&lt;em style="font-style: normal; font-weight: bold;"&gt;Google Weather API.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;i&gt;Antes de iniciar...&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Antes de iniciar, dejemos en claro el sencillo ejemplo que deseamos hacer. Si tienes algún servicio compatible con el protocolo XMPP como por ejemplo Gtalk (chat de Google), Pidgin, iChat, etc., agrega la siguiente cuenta a tus contactos,&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;clima-byte@appspot.com&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Una vez agregada la cuenta, abre una ventana de chat con este contacto y&amp;nbsp;escribe el nombre de la ciudad de la cual deseas obtener la información actual del estado del tiempo,&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CgROj6K0nLs/TjIl1nm_G3I/AAAAAAAAAMM/yulChaWbwY8/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-CgROj6K0nLs/TjIl1nm_G3I/AAAAAAAAAMM/yulChaWbwY8/s1600/screenshot" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Como lo puedes ver en la imagen anterior, del otro lado hay un pequeño agente que te responde inmediatamente con el estado del tiempo actual de la ciudad que le especificas... Lo anterior es una sencilla aplicación que hace uso de un Servlet y del protocolo XMPP desde App Engine.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: inherit; font-size: large;"&gt;&lt;i&gt;XMPP&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;El&amp;nbsp;&lt;b style="line-height: 19px;"&gt;Extensible Messaging and Presence Protocol &lt;/b&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;es un protocolo open source basado en XML para la&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;transmisión&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;/recepción de mensajes y es&amp;nbsp;&lt;/span&gt;mejor conocido como XMPP (anteriormente llamado Jabber). La ventaja de utilizar el protocolo XMPP es que no se requiere de un servidor central, cada uno de nosotros puede ser un servidor y/o el cliente. C&lt;/span&gt;ada usuario de la red XMPP, tiene un identificar único conocido como JID (Jabber ID), dicho identificador es del tipo:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;usuario@dominio.com&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;donde el &lt;b&gt;@dominio &lt;/b&gt;es el nombre del dominio del servidor que proporciona este servicio. Google App Engine ofrece soporte para XMPP por lo que al momento de registrarnos para obtener una cuenta y crear una aplicación en &lt;a href="http://code.google.com/intl/es-ES/appengine/"&gt;App Engine&lt;/a&gt;, nuestro JID será:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;i&gt;id-aplicacion@appspot.com&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;El id-aplicación será aquel que indiquemos al momento de crear una aplicación en App Engine.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Para más información sobre el protocolo XMPP puedes consultar la &lt;a href="http://es.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol"&gt;wikipedia&lt;/a&gt;&amp;nbsp;en español o ingles.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; line-height: 16px;"&gt;&lt;em&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: large;"&gt;Google Weather API.&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;em style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;em style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Se trata de un sencillo servicio que basta con invocar la siguiente URL y nos regresará la información del estado del tiempo en formato XML.&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;em style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: inherit;"&gt;&lt;i&gt;   &lt;style type="text/css"&gt;p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #5400ff}&lt;/style&gt;   &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;&lt;em&gt;&lt;span class="Apple-style-span" style="color: #38761d; font-family: inherit;"&gt;http://www.google.com/ig/api?weather=DF&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small; line-height: 16px;"&gt;&lt;em style="font-style: normal; font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="line-height: 16px;"&gt;Peguen la url anterior en un navegador y&amp;nbsp;obtendrán&amp;nbsp;un xml con la información actual y un pronostico del tiempo de los próximos días.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Dado que la información es regresada en formato XML, vamos a necesitar un pequeño y sencillo parser xml que haremos nosotros utilizando SAX.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;i&gt;Desarrollando el agente...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Creamos un Google Web Application Project (recuerda leer este&amp;nbsp;&lt;a href="http://mundobyte-x.blogspot.com/2011/07/introduccion-al-google-app-engine.html"&gt;tutorial&lt;/a&gt;&amp;nbsp;en caso de no haber desarrollado antes con App Engine). Le podemos llamar AgenteTiempo&lt;span class="Apple-style-span" style="color: #5400ff; font-family: Monaco; font-size: 11px;"&gt;.&lt;/span&gt;&lt;style type="text/css"&gt;p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco}&lt;/style&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Al crear el proyecto, se creará un Servlet y aquí será donde obtendremos un servicio XMPP para comunicarnos con algún JID, pero antes de ellos, vamos a desarrollar el pequeño parser.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Creamos una clase llamada EstadoTiempo con los siguientes atributos y sus respectivos setters y getters,&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;private String condition;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;private String humidity;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;private String temp_c;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;private String temp_f;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;private String wind_condition;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Creamos una clase llamada SaxEstadoTiempoHandler que extienda de la clase DefaultHandler. Puedes ver el código &lt;a href="https://docs.google.com/document/d/16gVIcTmQIGNK74Dv_QCYAO8jwFVT4JnKps_Us9pBs3s/edit?hl=en_US"&gt;aquí&lt;/a&gt;. Podemos ver que sobre-escribimos el método startElement(...) y mediante el parámetro localName verificamos si se trata del elemento deseado. Como podemos ver en la siguiente imagen, nos interesan los elementos señalados en la región amarilla, &lt;i&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;condition, temp_f, temp_c, humidity y wind_condition&lt;/span&gt;&lt;/i&gt;, por lo cual en el código Java preguntamos por dichos elementos y obtenemos el valor de su atributo "data" desde el método &lt;i&gt;resolveAttrib&lt;/i&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-PxcVul6Im98/TjIs0NXFVGI/AAAAAAAAAMQ/9C7lLX2u4_s/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="293" src="http://1.bp.blogspot.com/-PxcVul6Im98/TjIs0NXFVGI/AAAAAAAAAMQ/9C7lLX2u4_s/s400/screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Ahora en el Servlet que se generó al crear el proyecto vamos a parsear el XML utilizando el handler creado anteriormente. Como podemos ver en la siguiente imagen, hemos creado un método privado y utilizado un objeto de la clase XMLReader pasandole como handler la clase&amp;nbsp;SaxEstadoTiempoHandler. En el método parse de XMLReader le pasamos un objeto InputStreamReader que contiene un stream de bytes que representa el XML devuelto por la url del API de Google Weather.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-g0WU66LJAqc/TjIumKxeDKI/AAAAAAAAAMU/0CbgvU-TCag/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-g0WU66LJAqc/TjIumKxeDKI/AAAAAAAAAMU/0CbgvU-TCag/s400/screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Es importante indicar una codificación ISO ya que al pasarle a la url el atributo "hl=es" nos devolvera los resultados con acentos y nuestro programa podría arrojar una excepción. Una vez invocado el método parse del objeto XMLReader, construimos en un StringBuilder la respuesta que le devolveremos al usuario.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;El cuerpo del mensaje que el contacto de chat envie a nuestro agente se realiza mediante un POST, por lo cual debemos utilizar el método doPost. &lt;a href="https://docs.google.com/document/d/1Hz_ylKz9UsnpAYM4abedVuT-WKsg6-uA2lIW_acGm1M/edit?hl=en_US"&gt;Ver&lt;/a&gt; código fuente completo del Servlet.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Ya para finalizar, debemos agregar&amp;nbsp;en el appengine-web.xml las siguientes etiquetas,&amp;nbsp;tal y como lo describe la &lt;a href="http://code.google.com/intl/es-ES/appengine/docs/java/xmpp/overview.html#Handling_Incoming_Calls"&gt;documentación&lt;/a&gt; de Google sobre el protocolo XMPP&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0Ub69-innpY/TjIyGlgyoQI/AAAAAAAAAMg/HkauyLJh86I/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://1.bp.blogspot.com/-0Ub69-innpY/TjIyGlgyoQI/AAAAAAAAAMg/HkauyLJh86I/s320/screenshot" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Además de esto, en el archivo web.xml debemos modificar el url-pattern de nuestro servlet y cambiarlo por:&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #009495; font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;   &lt;style type="text/css"&gt;p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco}span.s1 {color: #009495}span.s2 {color: #2a9293}span.s3 {text-decoration: underline}&lt;/style&gt;   &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="color: #009495; font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;url-pattern&gt;/_ah/xmpp/message/chat/&lt;/url-pattern&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="color: #009495; font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="color: #009495; font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;Y listo!!!! Finalmente estamos listos para publicar nuestro proyecto en la nube de App Engine! Como lo mencione al inicio de este tutorial, puedes ver el resultado, agregando al contacto clima-byte@appspot a tus contactos de GTalk o de algún otro servicio que utilice la red XMPP como jabber.org o desde Pidgin.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 18px;"&gt;Se te puede quedar como ejercicio que el agente también proporcione el pronóstico de los próximos días! O incluso hacer algo diferente! Por ejemplo un ejercicio que se conecte al DataStore de Google usando JDO donde se encuentren almacenadas las calificaciones de alumnos y el agente le muestre las calificaciones de todas las materias actuales al alumno, claro esta, mediante alguna clave para evitar que algún curioso vea información que no le corresponde.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #009495; font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="color: #009495; font-family: monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Arial, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;b&gt;Saludos!!&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-4193947987202668121?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/4193947987202668121/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2011/07/desarrollando-un-agente-de-chat-que.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/4193947987202668121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/4193947987202668121'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2011/07/desarrollando-un-agente-de-chat-que.html' title='Desarrollando un agente de chat que informe el clima'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-CgROj6K0nLs/TjIl1nm_G3I/AAAAAAAAAMM/yulChaWbwY8/s72-c/screenshot' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-88417826147297124</id><published>2011-07-26T21:41:00.000-07:00</published><updated>2011-07-26T21:41:41.171-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Leyendo archivos de texto desde Groovy</title><content type='html'>Hoy en el trabajo necesitaba obtener aquellos tiempos altos en funciones de Oracle que se llaman desde una aplicación web en Java. Dicha aplicación utiliza log4j y graba en el log el tiempo que tarda en ejecutar una función.&lt;br /&gt;&lt;br /&gt;Por ejemplo, en dicho log podemos encontrar lineas como esta, siendo la marcada en amarillo la de especial interés,&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Ji7YluwBYrI/Ti-NO5jvXhI/AAAAAAAAAKw/sHAajktafE8/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="81" src="http://2.bp.blogspot.com/-Ji7YluwBYrI/Ti-NO5jvXhI/AAAAAAAAAKw/sHAajktafE8/s640/screenshot" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;De esta forma, requería estar leyendo muchos logs de más de 10000 lineas en busca de funciones cuyo tiempo sobrepasara los 2000 milisegundos.&lt;br /&gt;&lt;br /&gt;La verdad es que no había utilizado antes &lt;a href="http://es.wikipedia.org/wiki/Groovy_(lenguaje_de_programaci%C3%B3n)"&gt;Groovy&lt;/a&gt; y de momento se me&amp;nbsp;ocurrió&amp;nbsp;investigar en como podría hacer lo anterior, llegando a lo siguiente.&lt;br /&gt;&lt;br /&gt;Como seguramente saben, Groovy es un lenguaje dinámico que corre sobre la JVM, por lo que es posible hacer uso de las mismas clases de Java.&lt;br /&gt;&lt;br /&gt;Para leer un archivo basta con crear un objeto de la clase file e invocar al método eachLine que recibe un closure,&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;new File(name).eachLine( aqui closure )&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Un closure es algo como un "método anonimo" y en Groovy se identifica por que esta encerrado entre signos de llaves {.......}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;new File(name).eachLine(){line -&amp;gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; def i = line.indexOf("Time(spring)")&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;En el código anterior, abrimos el archivo de texto y ejecutamos el método eachLine para iterar por cada línea que contenga el archivo. El método eachLine al obtener una línea del archivo la "depositara" en la variable "line" que será de tipo String y entonces será como podremos posteriormente utilizar el método indexOf.&lt;br /&gt;&lt;br /&gt;Para mejores ejemplos sobre un closure, consultar &lt;a href="http://www.dosideas.com/cursos/mod/resource/view.php?id=109"&gt;aqui&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El código completo es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CRtpT82p20U/Ti-VpUOZJQI/AAAAAAAAAK0/4IEl91Em00s/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://2.bp.blogspot.com/-CRtpT82p20U/Ti-VpUOZJQI/AAAAAAAAAK0/4IEl91Em00s/s640/screenshot" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Una vez medio entendiendo los closures el código de arriba es fácil de digerir, aunque realmente como tal es casi mi primer pinino en Groovy pues la verdad no me he metido con él!&lt;br /&gt;&lt;br /&gt;Saludos!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-88417826147297124?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/88417826147297124/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2011/07/leyendo-archivos-de-texto-desde-groovy.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/88417826147297124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/88417826147297124'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2011/07/leyendo-archivos-de-texto-desde-groovy.html' title='Leyendo archivos de texto desde Groovy'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Ji7YluwBYrI/Ti-NO5jvXhI/AAAAAAAAAKw/sHAajktafE8/s72-c/screenshot' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-370599143021327936</id><published>2011-07-23T21:39:00.000-07:00</published><updated>2011-07-23T21:45:49.918-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlets'/><category scheme='http://www.blogger.com/atom/ns#' term='Java Web'/><category scheme='http://www.blogger.com/atom/ns#' term='App Engine'/><title type='text'>Introducción al Google App Engine</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;img alt="Con la tecnología de Google App Engine" src="http://code.google.com/appengine/images/appengine-silver-120x30.gif" /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Google App Engine es un servicio de alojamiento gratuito (1 GB de almacenamiento) de aplicaciones web escritas en Java, Phyton o el propio lenguaje de google llamado "Go". Mediante Google App Engine, google proporciona a los desarrolladores una infraestructura para instalar aplicaciones web en los lenguajes antes descritos.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;En el caso de una aplicación web desarrollada en Java, es posible mediante el App Engine desplegarla en la infraestructura que google proporciona y acceder a ella mediante un dominio gratuito del tipo http://name.appspot.com&lt;/div&gt;&lt;br /&gt;Google App Engine proporciona un soporte para el desarrollo de aplicaciones Java en sus versiones 5 o 6 y de API's y Frameworks tales como:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JavaServlet API 2.4&lt;/li&gt;&lt;li&gt;Java Server Pages&lt;/li&gt;&lt;li&gt;Java Server Faces 1.1-2.0&lt;/li&gt;&lt;li&gt;JPA y JDO&lt;/li&gt;&lt;li&gt;JavaMail&lt;/li&gt;&lt;li&gt;Groovy&lt;/li&gt;&lt;li&gt;BlazeDS&lt;/li&gt;&lt;li&gt;Spring MVC&lt;/li&gt;&lt;li&gt;Spring ORM&lt;/li&gt;&lt;li&gt;Struts 1.0 - 2.0&lt;/li&gt;&lt;li&gt;Tapestry&lt;/li&gt;&lt;li&gt;WebORB&lt;/li&gt;&lt;li&gt;etc...... &lt;a href="http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1"&gt;más información&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Para comenzar a utilizar App Engine, debemos crear una cuenta gratuita entrando al siguiente &lt;a href="https://appengine.google.com/"&gt;link&lt;/a&gt;&amp;nbsp;, se nos pedira un número de celular a donde se nos enviara un código de confirmación, mismo que deberemos introducir. En el caso de México, el número de celular debe ser de la&amp;nbsp;compañía&amp;nbsp;Movistar (telcel, iusacell, etc., no funcionan), antes del número debemos introducir el código del país, por ejemplo, si fueras de&amp;nbsp;México&amp;nbsp;debes introducir algo como:&lt;br /&gt;&lt;br /&gt;+52 xxxxxxxxxx&lt;br /&gt;&lt;br /&gt;donde +52 es el código del país México.&lt;br /&gt;&lt;br /&gt;Una vez creada la cuenta, mediante el&lt;a href="http://code.google.com/intl/es/appengine/docs/java/tools/eclipse.html"&gt; Plugin de Google para Eclipse&lt;/a&gt;, podemos crear aplicaciones Java utilizando el SDK de App Engine, además de poder desarrollar aplicaciones utilizando el conocido GWT. Al instalar el plugin para eclipse, podemos también instalar el SDK de App Engine, por lo que no será necesario descargar el SDK y el Plugin por separado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CDufzfSQ_TE/TiuRIG1WyFI/AAAAAAAAAKA/_ysYCdPLQQc/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://2.bp.blogspot.com/-CDufzfSQ_TE/TiuRIG1WyFI/AAAAAAAAAKA/_ysYCdPLQQc/s400/screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Ya instalado el plugin, podemos inmediatamente crear una aplicación utilizando App Engine y publicarla muy fácilmente. Para crear un proyecto, basta con seleccionar la opción indicada en la imagen.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_yn14Qaaeu4/TiuT_Am1HjI/AAAAAAAAAKM/tXmtooI_GnE/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="76" src="http://1.bp.blogspot.com/-_yn14Qaaeu4/TiuT_Am1HjI/AAAAAAAAAKM/tXmtooI_GnE/s200/screenshot" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;En la&lt;a href="http://code.google.com/intl/es/appengine/docs/java/gettingstarted/creating.html"&gt; Guia de Introducción a App Engine&lt;/a&gt; que ofrece Google en español, se desarrolla en primera instancia parte del siguiente código en un Servlet.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7yGpCsOtbvs/TiuWttpGYdI/AAAAAAAAAKQ/EO3aPFulu3M/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://3.bp.blogspot.com/-7yGpCsOtbvs/TiuWttpGYdI/AAAAAAAAAKQ/EO3aPFulu3M/s400/screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Al crear el servlet con eclipse y escribir el código anterior, es muy fácil probar la aplicación localmente. El SDK de App Engine, incluye un servidor local que simula todos los servicios que ofrece la infraestructura de App Engine, por lo cual podremos simular nuestra aplicación web localmente antes de instalarla en el servidor de Google.&lt;br /&gt;&lt;br /&gt;Para ejecutar la aplicación anterior, basta con ir al menú &lt;b&gt;Run &amp;gt; Debug As &amp;gt; Web Application , &lt;/b&gt;y entonces en el navegador teclear:&lt;br /&gt;&lt;br /&gt;http://localhost:8080 ó http://localhost:8888&lt;br /&gt;&lt;br /&gt;dependiendo del puerto que se inicialice.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0a8FK-whzYA/Tiual0x9qKI/AAAAAAAAAKU/4Adp5OYQAek/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://3.bp.blogspot.com/-0a8FK-whzYA/Tiual0x9qKI/AAAAAAAAAKU/4Adp5OYQAek/s320/screenshot" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Como página principal se muestran los Servlets disponibles, al dar click sobre "Guestbook" se ejecutará el código anterior, el cual presentará una pantalla que pedirá un correo como cuenta de Google para poder autenticar, dado que estamos en el ambiente local, se mostrará una pantalla como la siguiente, pero en caso de que la aplicación ya este publicada en nuestro dominio de App Engine, entonces se mostrará la pantalla de Google donde se pide nuestra cuenta:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KfBASxx4DWs/TiucLmegLpI/AAAAAAAAAKY/vEWPfpn11rI/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="159" src="http://3.bp.blogspot.com/-KfBASxx4DWs/TiucLmegLpI/AAAAAAAAAKY/vEWPfpn11rI/s320/screenshot" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Pantalla en servidor Local&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-LHNCIOcVuhg/Tiuc5JGNZjI/AAAAAAAAAKc/ra3Oh8kyI0Q/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="140" src="http://2.bp.blogspot.com/-LHNCIOcVuhg/Tiuc5JGNZjI/AAAAAAAAAKc/ra3Oh8kyI0Q/s400/screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;Pantalla al instalar la aplicación en dominio de App Engine&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Una vez que nos hemos autenticado, entonces se mostrará el mensaje que pusimos en el Servlet, que en este caso será algo como:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;Hello, molder.itp&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;Para publicar la aplicación, primero debemos dirigirnos al archivo &lt;b&gt;appengine-web.xml&lt;/b&gt; y en las etiquetas &lt;application&gt;&lt;/application&gt; escribir el id de la aplicación que es el mismo que escribimos al crear nuestra cuenta de App Engine, en mi caso fue "mundo-byte" tal como lo podemos ver en nuestra cuenta,&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-WOhcmbi4qHo/Tiuf9l-k7JI/AAAAAAAAAKk/WSeHmbm9wzU/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://2.bp.blogspot.com/-WOhcmbi4qHo/Tiuf9l-k7JI/AAAAAAAAAKk/WSeHmbm9wzU/s400/screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;También debemos indicar el número de versión. Finalmente el archivo de configuración quedará similar al siguiente:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NTQXvrxKP8I/TiugR_osEfI/AAAAAAAAAKo/W9V5JazW04o/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="103" src="http://2.bp.blogspot.com/-NTQXvrxKP8I/TiugR_osEfI/AAAAAAAAAKo/W9V5JazW04o/s400/screenshot" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Hecho lo anterior, ya podemos publicar nuestra pequeña aplicación desde Eclipse dando click al ícono mostrado en la siguiente imagen:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CBc1k92vQ-w/Tiug35zK2_I/AAAAAAAAAKs/Ms3_ExquyWE/s1600/screenshot" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://3.bp.blogspot.com/-CBc1k92vQ-w/Tiug35zK2_I/AAAAAAAAAKs/Ms3_ExquyWE/s320/screenshot" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;Y listo!! el resultado lo podremos visualizar con la url de nuestro dominio, que en mi caso es la siguiente:&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;a href="http://mundo-byte.appspot.com/guestbook"&gt;http://mundo-byte.appspot.com/guestbook&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;Hemos visto lo fácil que resulta publicar una aplicación web Java utilizando el AppEngine, sin duda una buena opción para varios desarrollos! Espero más adelante compartir más cosas acerca del App Engine de Google.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;b&gt;Saludos!!&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-370599143021327936?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/370599143021327936/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2011/07/introduccion-al-google-app-engine.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/370599143021327936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/370599143021327936'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2011/07/introduccion-al-google-app-engine.html' title='Introducción al Google App Engine'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-CDufzfSQ_TE/TiuRIG1WyFI/AAAAAAAAAKA/_ysYCdPLQQc/s72-c/screenshot' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-3153385319883361435</id><published>2011-04-18T18:42:00.000-07:00</published><updated>2011-04-18T18:45:58.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Selenium IDE'/><title type='text'>Pruebas automatizadas en Interfaz de Usuario</title><content type='html'>En una &lt;a href="http://mundobyte-x.blogspot.com/2010/07/pruebas-automatizadas-selenium-ide.html"&gt;entrada anterior&lt;/a&gt;,&amp;nbsp;escribía&amp;nbsp;sobre la existencia de SeleniumIDE, un plugin para Firefox con el cual podemos ejecutar pruebas en la&amp;nbsp;interfaz&amp;nbsp;de usuario de una manera un poco más automatizada.&lt;br /&gt;&lt;br /&gt;En realidad puede ser muy útil, tiene muchos comandos que sirven para simular casi todo lo que un usuario humano podría hacer.&lt;br /&gt;&lt;br /&gt;Por ejemplo, el siguiente video que hice, muestra una prueba muy sencilla pero en un Sistema real implementado en ambiente productivo (claro, la prueba fue hecha en un ambiente de test).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/jAU-fUJjQno/0.jpg" height="366" width="420"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jAU-fUJjQno?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="420" height="366" src="http://www.youtube.com/v/jAU-fUJjQno?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;La prueba es tan sencilla que solo consta de comandos click, doubleClick, select, y un &lt;b style="font-style: italic;"&gt;assertConfirmation &lt;/b&gt;el cual sirve cuando la aplicación lanza un cuadro de confirmación con JavaScript y con este comando Selenium da por hecho que debe aceptar la confirmación.&lt;br /&gt;&lt;br /&gt;En YouTube existen algunos pocos tutoriales que pueden servir de inicio.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-3153385319883361435?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/3153385319883361435/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2011/04/pruebas-automatizadas-en-interfaz-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/3153385319883361435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/3153385319883361435'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2011/04/pruebas-automatizadas-en-interfaz-de.html' title='Pruebas automatizadas en Interfaz de Usuario'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-4468245189941247660</id><published>2011-04-16T22:55:00.000-07:00</published><updated>2011-04-16T22:55:23.470-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APEX'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Desarrollo Rápido de Aplicaciones con Oracle</title><content type='html'>&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: large;"&gt;INTRODUCCIÓN&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Cuando escuchamos Oracle, a la gran mayoría nos viene a la mente esa Base de Datos Relacional que tiene fama de ser la mejor de entre las actuales, sin embargo, hace algunos días conocí&lt;i&gt;&amp;nbsp;"Oracle Application Express" &lt;/i&gt;conocida como APEX, la cual es una Herramienta para el Desarrollo Rápido de Aplicaciones (RAD) que utilizan una Base de Datos Oracle y se basa en una interfaz web, lo mejor de esto es que se puede descargar gratuitamente y utilizarse incluso sobre Oracle DataBase Express Edition. Con APEX podemos crear rápidamente aplicaciones web que hagan uso de una base de datos Oracle, incluso con APEX podemos conectar con servicios web.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Voy a mostrar de una forma muy rápida de como crear un sencillo formulario de registro, por lo que tenemos dos formas de seguir este tutorial,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Descargar e Instalar localmente APEX, lo que incluye también tener instalado Oracle DataBase. Queda fuera de este tutorial los pasos de instalación y configuración.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Crear una cuenta gratuita en&amp;nbsp;&lt;a href="http://apex.oracle.com/"&gt;http://apex.oracle.com&lt;/a&gt;&amp;nbsp;, la cual esta sujeta a una previa aprobación. Al final de los pasos de la creación de la cuenta, se te pedirá una justificación por la que deseas obtener una cuenta demo, basta con poner alguna palabra como "education", que en mi caso, la cuenta fue aprobada casi automáticamente.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: large;"&gt;LA INTERFAZ WEB DE APEX&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-ZdUD6UsxDwg/Tapuq4XvN7I/AAAAAAAAAIE/dKOPncSgLIs/s1600/apex_interfazweb.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://3.bp.blogspot.com/-ZdUD6UsxDwg/Tapuq4XvN7I/AAAAAAAAAIE/dKOPncSgLIs/s400/apex_interfazweb.png" width="400" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Como lo comentamos, APEX esta basado en una interfaz web y con muy pocas líneas de código, podremos tener una aplicación web profesional.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Una vez creada nuestra cuenta, veremos una interfaz similar a la imagen. Podemos crear y administrar aplicaciones web, navegar por las tablas contenidas en nuestro esquema, ejecutar sentencias SQL, administrar usuarios, servicios y monitorear actividad, etc.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;En este momento, nos centraremos en la opción &lt;b&gt;"Application Builder"&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: large;"&gt;&lt;b&gt;CREANDO LA APLICACIÓN&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Seleccionando la opción Application Builder,&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Click en botón &lt;i&gt;Create&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Seleccionar &lt;i&gt;DataBase &lt;/i&gt;en el Application Type&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Crearemos una aplicación desde cero, seleccionando &lt;i&gt;From Scratch&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Tecleamos un nombre para nuestra aplicación y un ID que ya nos da por defecto, así como seleccionamos el nombre del &lt;i&gt;Schema &lt;/i&gt;a utilizar.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Con esto ya tenemos creada una aplicación, sin embargo, una aplicación esta compuesta por Pages, por lo que ahora debemos seleccionar el tipo de página que deseamos. Cabe resaltar dos opciones,&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Fe9482qgV8Y/Tap0fefzYVI/AAAAAAAAAIM/SsRT5ez3JnI/s1600/TipoPagina.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://1.bp.blogspot.com/-Fe9482qgV8Y/Tap0fefzYVI/AAAAAAAAAIM/SsRT5ez3JnI/s400/TipoPagina.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Form: Creará un clásico formulario donde existirán cajas de texto, introducimos los valores y damos click en guardar.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Tabular Form: Creara como su nombre lo indica, un formulario tabular, es decir, nos mostrará los datos existentes en una determinada tabla de base de datos en forma tabular y con la posibilidad de actualizar directamente los datos que deseamos.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Seleccionamos &lt;i&gt;Form &lt;/i&gt;y en la parte de abajo el nombre de la tabla sobre la cual basaremos el formulario. Por el hecho de crear nuestra cuenta demo en APEX, tenemos una serie de tablas ejemplo, dos de ellas son EMP y DEPT, seleccionamos DEPT por ser la más sencilla y click al botón &lt;i&gt;Add Page.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Click en Siguiente.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Seleccionamos &lt;i&gt;No Tabs y&lt;/i&gt; click en Next.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Seleccionamos que NO deseamos copiar componentes compartidos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Una parte importante de las aplicaciones web es un sistema de autenticación de usuarios, APEX nos proporciona ya unos mecanismos muy sencillos de utilizar, seleccionaremos las opciones como lo muestra la imagen,&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2Fxg1KkLh3o/Tap36Rih9yI/AAAAAAAAAIQ/57YeEg4S0PY/s1600/autenticacion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://3.bp.blogspot.com/-2Fxg1KkLh3o/Tap36Rih9yI/AAAAAAAAAIQ/57YeEg4S0PY/s400/autenticacion.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Ahora debemos seleccionar un Theme para nuestra aplicación. Afortunadamente también tenemos posibilidad de crear temas propios. En este caso, yo seleccionaré el &lt;i&gt;Theme 20. &lt;/i&gt;Click en Next&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Finalmente verificamos que la información sea correcta y damos click al botón &lt;i&gt;Create.&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Ya tenemos la aplicación creada y podemos ver que esta compuesta de dos página, una de ellas es la página que creamos en los pasos anteriores y la otra es la página de autenticación que en la imagen aparece como "101 - Conectar" debido a la mala traducción :)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-s8LP1mLbCBs/Tap5WcE1q3I/AAAAAAAAAIU/VwVgKgU5usI/s1600/pagecreada.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://4.bp.blogspot.com/-s8LP1mLbCBs/Tap5WcE1q3I/AAAAAAAAAIU/VwVgKgU5usI/s400/pagecreada.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Damos click sobre el ícono &lt;i&gt;1-Dept&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;En la columna &lt;i&gt;Page Rendering &lt;/i&gt;damos doble click sobre P1_DEPTNO&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Qf3nwwdZwGk/Tap-0BHlxOI/AAAAAAAAAIc/W_31S62ceKk/s1600/PageDefinition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://1.bp.blogspot.com/-Qf3nwwdZwGk/Tap-0BHlxOI/AAAAAAAAAIc/W_31S62ceKk/s320/PageDefinition.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Editamos su propiedad Display As.. y seleccionamos Text Field. Guardamos los cambios.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Regresaremos a la pantalla anterior y solo resta presionar el botón de Run. S&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;e nos mostrará como primer página la autenticación de usuario. Por defecto, el usuario existente es el mismo que el de nuestra cuenta demo de APEX.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Una vez que nos hemos identificado, podremos ver el pequeño formulario de registro de Departamentos, que basamos en la tabla DEPT de la base de datos Oracle que ya existía al momento de crear nuestra cuenta demo.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-DsrEAMSRhlQ/Tap_lGD-9bI/AAAAAAAAAIg/qlqhf_YppOE/s1600/registroDpto.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-DsrEAMSRhlQ/Tap_lGD-9bI/AAAAAAAAAIg/qlqhf_YppOE/s1600/registroDpto.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Podemos especificar que el &lt;i&gt;Deptono &lt;/i&gt;sea una secuencia o un trigger para no tener que insertarlo manualmente.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;En otro tutorial escribiré como hacer otras cosas más interesantes, pero este fue un primer acercamiento a esta buena herramienta de Oracle que nos puede ayudar a realizar ciertas cosas de manera muy fácil.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-4468245189941247660?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/4468245189941247660/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2011/04/desarrollo-rapido-de-aplicaciones-con.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/4468245189941247660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/4468245189941247660'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2011/04/desarrollo-rapido-de-aplicaciones-con.html' title='Desarrollo Rápido de Aplicaciones con Oracle'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ZdUD6UsxDwg/Tapuq4XvN7I/AAAAAAAAAIE/dKOPncSgLIs/s72-c/apex_interfazweb.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-9071847845716437822</id><published>2010-12-12T12:56:00.001-08:00</published><updated>2010-12-12T12:59:45.547-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Illustrator'/><title type='text'>Mi primer texto en Illustrator CS5</title><content type='html'>Bueno, algo que siempre quise aprender desde que comencé en esto del desarrollo de software, fue algún programa de dibujo vectorial como Illustrator. Soy todo menos diseñador, pero creo que con un poco de práctica puedo mejorar significativamente!&lt;br /&gt;&lt;br /&gt;Les comparto este video de Youtube donde muestra como poner nuestro nombre con Illustrator agregando algunos degradados y transparencias. No me quedo como en el video, pero espero ir mejorando!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;object height="350" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/korz1mPSxfM?fs=1&amp;amp;hl=es_ES&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/korz1mPSxfM?fs=1&amp;amp;hl=es_ES&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Y aquí el resultado :(&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_jf3qj62j_jM/TQU2no0pkjI/AAAAAAAAAHk/RTtbV2tBIuU/s1600/Letras.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="126" src="http://2.bp.blogspot.com/_jf3qj62j_jM/TQU2no0pkjI/AAAAAAAAAHk/RTtbV2tBIuU/s400/Letras.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-9071847845716437822?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/9071847845716437822/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/12/mi-primer-texto-en-illustrator-cs5_12.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/9071847845716437822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/9071847845716437822'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/12/mi-primer-texto-en-illustrator-cs5_12.html' title='Mi primer texto en Illustrator CS5'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jf3qj62j_jM/TQU2no0pkjI/AAAAAAAAAHk/RTtbV2tBIuU/s72-c/Letras.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-8398082583626039950</id><published>2010-09-16T21:09:00.000-07:00</published><updated>2010-09-16T21:09:24.165-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Mexico'/><title type='text'>CMS: Java México</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://code.google.com/p/javamexico/logo?cct=1278891433" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://code.google.com/p/javamexico/logo?cct=1278891433" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;javamexico&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;La comunidad de Java México, inicio hace unos meses el &lt;a href="http://www.javamexico.org/foros/comunidad_javamexico_2_0/entendiendo_el_proyecto_javamexico_2_0_un_punto_de_partida"&gt;desarrollo&lt;/a&gt; de un Administrador de Contenidos (Foros, Blogs, Bolsa de Trabajo, etc). El proyecto será OpenSource (GPL v3) y estará desarrollado sobre las tecnologías:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tapestry 5&lt;/li&gt;&lt;li&gt;Spring 3&lt;/li&gt;&lt;li&gt;Hibernate&lt;/li&gt;&lt;/ul&gt;He descargado e instalado el proyecto, y desde luego que la idea es participar como desarrollador. Como acertadamente lo comentan, es una buena opción para hacer crecer el CV. Tapestry es un Framework para el desarrollo MVC, tipo Struts, pero hasta donde puedo ver, es mucho más simple y elegante, así que es una gran oportunidad para aprender. &lt;a href="http://www.javamexico.org/blogs/ezamudio/introduccion_historica_tapestry"&gt;Aquí&lt;/a&gt;, Enrique Zamudio publica un introducción de Tapestry &amp;nbsp;dividida en 5 partes para despertar la curiosidad a muchos desarrolladores que no&amp;nbsp;conocíamos&amp;nbsp;este framework.&lt;br /&gt;&lt;br /&gt;Los invito pues a darse una vuelta por la comunidad Java México y a participar en este proyecto, tanto si eres un desarrollador novato, es una buena oportunidad para crecer en conocimientos y participar de algún modo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-8398082583626039950?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/8398082583626039950/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/09/cms-java-mexico.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8398082583626039950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8398082583626039950'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/09/cms-java-mexico.html' title='CMS: Java México'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-8259653682579239215</id><published>2010-08-30T21:28:00.000-07:00</published><updated>2010-08-30T22:21:38.189-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Ing de Software'/><title type='text'>Aprendiendo Lean Software: Eliminar el Derroche</title><content type='html'>&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;b&gt;ANTECEDENTES&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Cuando estudiaba el 6to Semestre de la carrera, entré a laborar a una pequeña fabrica de software en Pachuca, Hidalgo (México). De 2 años para acá comencé a interesarme en temas más específicos de Ingeniería de Software pasando por la Administración de Proyectos, Casos de Uso, hasta metodologías y procesos como MoProSoft y Personal Software Process. Confieso que desde un inicio nunca pude comprender al 100% estas prácticas de métodos formales, sin embargo las acepte en un inicio. Más adelante la relación entre estas prácticas y yo fue insostenible y las abandone para dar paso a la filosofía ágil de la cual sencillamente estoy encantado.&lt;br /&gt;&lt;br /&gt;A partir de aquí, inicia una serie de comentarios que expresan mi opinión personal (muy posiblemente equivocada) sobre bibliografía y material que voy estudiando con el objetivo de crear notas y compartirlas principalmente con estudiantes de carreras afines.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;¿QUÉ ES LEAN SOFTWARE DEVELOPMENT?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Comparto con ustedes un video-presentación que realizó Emilio Osorio donde explica lo que es Lean Software y sus principios básicos. Debajo de la presentación, comparto mi poca&amp;nbsp;experiencia, opiniones personales y posiblemente no tan acertadas pero que eso es lo que hace tan valioso a la filosofía ágil, que no existe una receta a seguir y que el proceso se debe amoldar según el entorno.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="300" src="http://player.vimeo.com/video/6426070?color=ff9933" width="400"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://vimeo.com/6426070"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;¿Qué es y por qué funciona el Lean Software Development?&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; from &lt;/span&gt;&lt;a href="http://vimeo.com/humanos"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;SG Campus&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; on &lt;/span&gt;&lt;a href="http://vimeo.com/"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Vimeo&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;PARA INICIAR...&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Debo comenzar diciendo lo que digo siempre que hablo de metodologías formales.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Martín Fowler, un Gurú en el mundo de Java comenta en su artículo &lt;a href="http://martinfowler.com/articles/newMethodology.html"&gt;The New Methodology&lt;/a&gt;, que las metodologías formales basan sus principios en otras&amp;nbsp;Ingenierías&amp;nbsp;como la Civil y la Mecánica, en donde la mayoría de sus problemas, son&amp;nbsp;susceptibles&amp;nbsp;de un análisis matemático y modelado previo a la construcción. Los métodos formales y nuestros maestros nos enseñaron que en el Software la mejor forma de hacer las cosas bien, son hacerlas a la primera! El error de la Ingeniería de Software tradicional es tratar al desarrollo de Software como un fenómeno predictivo de otras ingenierías, entendiendo como predictivo aquello que es&amp;nbsp;susceptible&amp;nbsp;de un modelado y de un análisis matemático para predecir el comportamiento de un Sistema al aplicar una fuerza.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Pueden leer este otro artículo que escribí titulado &lt;a href="http://mundobyte-x.blogspot.com/2010/03/ultima-revision-17-de-marzo-2010.html"&gt;¿Por qué fracasan los proyectos de SW?&lt;/a&gt;... Este artículo lo considero bien documentado, y es sencillamente una recopilación de ideas que varios autores a nivel mundial han escrito.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;PRINCIPIO 1: ELIMINAR EL DERROCHE&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;/span&gt;&lt;/b&gt;Como desarrolladores estamos tentados a comenzar por desarrollar aquellos módulos más fáciles o más bonitos ó con más reto personal, aunque éstos no agreguen un valor de negocio al usuario, , peor aún, desarrollamos cosas que el cliente no pide. Por ejemplo si debemos desarrollar un Sistema de Reporte de Ventas, muchas veces como desarrolladores comenzamos desarrollando la funcionalidad que grafique los datos, aunque quizá el cliente solo&amp;nbsp;pidió&amp;nbsp;tabularlos, peor aún, desde la filosofía ágil, nosotros debemos entregar funcionalidad cada 2 o 3 semanas, desde esta perspectiva quizá hemos omitido el desarrollo de la autenticación y autorización al sistema y hemos dado paso a desarrollar funcionalidades que no son prioridad en ese momento.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Alguien podría preguntarse ¿Y el desarrollar la funcionalidad para que grafique datos no es algo bueno?... Seguro que sí, pero si el cliente inicialmente no lo&amp;nbsp;pidió, debemos mejor entregar una pieza de software funcional y usable con el que el cliente/usuario comience a trabajar. El usuario, al ver el sistema en funcionamiento seguramente pedirá los datos graficados y más funcionalidad extra, pero en ese momento, él ya&amp;nbsp;estará&amp;nbsp;sacando provecho al Sistema.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Finalmente en este momento puede venir una pregunta más para el lector, con lo anterior ¿no estamos propiciando a que el cliente pida y pida de forma insaciable nuevos requerimientos?... Desde luego,... Pero entonces el proyecto no será costeable para la empresa!... Bueno, desde la perspectiva tradicional efectivamente el proyecto no será costeable, saldrá de sus límites y no será un buen negocio para la empresa que desarrolla el Software, pero desde la perspectiva ágil sencillamente se pagara justo lo que se desarrolla con el plus de que tendremos a un cliente bastante contento. A diferencia de los métodos formales, los métodos ágiles te impulsan a entregar funcionalidad cada 2 o 3 semanas, de tal forma que el costo del desarrollo no se va sobre el proyecto, sino sobre funcionalidad. El cliente no pagará un Sistema, más bien pagará funcionalidad hasta completar un Sistema, de esta forma, si el cliente posteriormente agrega más requerimientos sobre algo ya desarrollado, podremos justificar más fácilmente un costo extra con el plus que el cliente al estar contento no tendrá tantos inconvenientes en pagar por mejorar o agregar funcionalidad extra de algo que ya esta usando. En el caso de una mejora, incluso la misma empresa que desarrolla, puede pensar en no realizar un cobro extra.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Como lo dice Emilio en su presentación, el derroche será todo aquello que no agrega valor al negocio del cliente. No debemos confundir "Eliminar el derroche" con no desarrollar o proponer requerimientos que tengan un valor agregado al negocio del cliente, por el contrario, siempre es buena idea dar un valor agregado al negocio del cliente, una ventaja competitiva que lo ponga un paso adelante sobre sus competidores. Debemos eliminar documentación innecesaria como Diagramas UML, planeaciones en gantt, decenas o cientos de hojas de Casos de Uso.&lt;br /&gt;&lt;br /&gt;Lo anterior resulta muy delicado dado que el RUP y las herramientas como UML son tan aceptadas en nuestra industria, sería muy&amp;nbsp;difícil&amp;nbsp;de entender y aceptar que el 90% de los diagramas de UML son en su mayoría inútiles. &amp;nbsp;¿Qué tan similares son los diagramas de clases realizados al inicio con las clases que se tienen al término del proyecto? La verdad es que son muy diferentes. Si alguien en este punto esta pensando que el Diagrama de Clases es útil por que nos da una vista rápida de como esta construido el sistema, obviamente que desconoce de las herramientas de Ingeniería inversa que nos ayudan a generar diagramas en base a las clases de un Sistema. Existen numerosos autores que ponen en duda la utilidad de UML, muchos otros autores reconocidos como Craig Larman&amp;nbsp;conscientes&amp;nbsp;de los puntos débiles del RUP pero convencidos de su utilidad defienden su utilización desde un punto de vista ágil. Para efectos de este punto, podemos leer un artículo de Bertrand Meyer (el creador del Lenguaje Eiffel) titulado "&lt;a href="http://archive.eiffel.com/doc/manuals/technology/bmarticles/uml/page.html"&gt;UML: The Positive Spin&lt;/a&gt;" donde verdaderamente se burla de lo absurdo que puede resultar el UML. De igual forma, podemos leer &lt;a href="http://queue.acm.org/detail.cfm?id=984495"&gt;"Death by UML Fever"&lt;/a&gt;&amp;nbsp;donde se explica que verdaderamente tenemos una Fiebre de UML. En conclusión podemos decir que UML puede resultar una buena herramienta de modelado post-development, como base para generar documentación para el mantenimiento del Sistema, pero no resulta tan bueno para generar documentación de requerimientos y análisis.&lt;br /&gt;&lt;br /&gt;Son&amp;nbsp;muchísimas&amp;nbsp;cosas que agregan un derroche a nuestros proyectos, y considero yo que para este punto, solo falta un poco de sentido común para detectarlo.&lt;br /&gt;&lt;br /&gt;Más adelante continuaré con los principios restantes de Lean Software, mientras tanto&amp;nbsp;debí&amp;nbsp;seguir leyendo el libro de Mary Poppendieck que me regalaron.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Saludos!&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-8259653682579239215?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/8259653682579239215/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/08/aprendiendo-lean-software-eliminar-el.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8259653682579239215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8259653682579239215'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/08/aprendiendo-lean-software-eliminar-el.html' title='Aprendiendo Lean Software: Eliminar el Derroche'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-8917802396053765730</id><published>2010-08-29T16:28:00.000-07:00</published><updated>2010-08-29T16:28:30.096-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lean Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Ing de Software'/><title type='text'>Material: Lean Software Development</title><content type='html'>Les comparto algunas presentaciones con audio que realizo el buen Emilio Osorio. Emilio es una de las personas que más fuerte evangeliza los principios ágiles en México, especialmente encantado por los principios de Lean Software Development.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="300" src="http://player.vimeo.com/video/6426070?color=ff9933" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/6426070"&gt;¿Qué es y por qué funciona el Lean Software Development?&lt;/a&gt; from &lt;a href="http://vimeo.com/humanos"&gt;SG Campus&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="300" src="http://player.vimeo.com/video/6547072?color=ff9933" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/6547072"&gt;Las cinco practicas esenciales del Desarrollo Lean-Agile&lt;/a&gt; from &lt;a href="http://vimeo.com/humanos"&gt;SG Campus&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="300" src="http://player.vimeo.com/video/6860853?color=ff9933" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/6860853"&gt;Cómo hacer de tu grupo de desarrolladores un Equipo de Alto Desempeño&lt;/a&gt; from &lt;a href="http://vimeo.com/humanos"&gt;SG Campus&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-8917802396053765730?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/8917802396053765730/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/08/material-lean-software-development.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8917802396053765730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8917802396053765730'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/08/material-lean-software-development.html' title='Material: Lean Software Development'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-365293315526794647</id><published>2010-08-23T22:05:00.000-07:00</published><updated>2010-08-23T22:14:07.615-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ing de Software'/><title type='text'>Requerimientos de SW, ¿Cuántos kilos le damos?</title><content type='html'>El domingo anterior a escribir este post, fui a comer a un mercado de la ciudad de Pachuca, Hidalgo.&amp;nbsp;Todavía iba caminando, aún ni me sentaba cuando ya me estaban preguntando si deseaba sopa o arroz, además de decirme la lista completa de guisados. Luego pues, decidí parar y sentarme a comer. Lo primero que hicieron fue darme como 1/2 kilo de tortillas. Al inicio todo iba bien ya que entre más tortillas me daban, más rápido comia y más pedia. Conforme fui avanzando en la comida, me fui dando cuenta que las muchas tortillas que me dieron en un inicio se acumularon, se estaban enfriando, que sencillamente eran innecesarias tantas en un inicio, pues termine pidiendo que me las cambiaran por otras menos frias.&lt;br /&gt;&lt;br /&gt;Termine por darme cuenta que lo que me estaba pasando, era un ejemplo muy burdo de lo que pasa en el Desarrollo de Software (burdo pero muy cierto).&lt;br /&gt;&lt;br /&gt;Yo era como el cliente/usuario que desea un Sistema de computo, usuario que desde un inicio sabe que necesita de algo que satisfaga sus necesidades, pero al poco tiempo se dejan escuchar miles de voces que te ofrecen una amplia gama de funcionalidades, opciones, mejoras, etc., muchas veces innecesarias. Ya habiendo entrado en el juego, el usuario se sienta a la mesa listo para definir sus requerimientos, sin embargo, los expertos Consultores, Project Managers, PMI, etc., comienzan a invadir al usuario con kilos de requerimientos, decenas y decenas de Casos de Uso, diagramas, diccionarios de datos, Interfaces, etc., requerimientos que con el paso del tiempo se van "enfriando", perdiendo así su valor original y el usuario termina por cambiar dichos requerimientos por algunos más refinados.&lt;br /&gt;&lt;br /&gt;La dinámica del software es cambiante, su ámbito no es del todo predecible, sin embargo esto es algo de lo que aún no entendemos, nos aferramos a utilizar técnicas y&amp;nbsp;metodologías&amp;nbsp;predecibles que basan sus principios en otras ramas de la Ingeniería como la Mecánica y/o&amp;nbsp;Civil&amp;nbsp;en donde la mayoría de sus problemas son&amp;nbsp;susceptibles&amp;nbsp;de un análisis matemático, modelado y simulación, sin embargo, en el desarrollo de Sw no podemos forzar y modelar una Arquitectura detallada del Sistema mediante diagramas UML que en papel se ven bien, pero al momento de implementarlo es donde comienzan los problemas.&lt;br /&gt;&lt;br /&gt;Nosotros como desarrolladores, líderes de proyecto, analistas, etc., debemos entender bien lo anterior y ayudar al usuario en el camino a descubrir que cosas son las que Él realmente desea, en lugar de abrirle un abanico de opciones desde un inicio. Si desde un inicio le ofrecemos kilos y kilos de tortillas, corremos el riesgo de que al paso del tiempo el usuario nos las devuelva y pida algo más reciente!&lt;br /&gt;&lt;br /&gt;Los métodos ágiles nos proporcionan sencillos pero sólidos principios que nos ayudan a tener un cliente/usuario satisfecho pues generalmente tienen lo que realmente quieren, ya que lejos de hacer una toma de requerimientos detallada, la vamos refinando conforme avanzamos en el camino, evitando así trabajar "en valde" o innecesariamente ya que con las constantes reuniones y entregas rápidas de funcionalidad al usuario, éste puede ir descubriendo más fácilmente lo que realmente quiere y necesita.&lt;br /&gt;&lt;br /&gt;¿Y tú cuántos Kilos de Requerimientos le ofreces a tu cliente/usuario?&lt;br /&gt;&lt;br /&gt;Saludos!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-365293315526794647?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/365293315526794647/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/08/requerimientos-de-sw-cuantos-kilos-le.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/365293315526794647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/365293315526794647'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/08/requerimientos-de-sw-cuantos-kilos-le.html' title='Requerimientos de SW, ¿Cuántos kilos le damos?'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-1281720924509644449</id><published>2010-08-19T21:54:00.000-07:00</published><updated>2010-08-19T21:55:45.157-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><category scheme='http://www.blogger.com/atom/ns#' term='WebService'/><title type='text'>Introducción a los WebService I: Práctico y Fácil</title><content type='html'>&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;b&gt;Nivel: Intermedio&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Se requieren conocimientos de programación. Este tutorial es meramente didáctico y se ha desarrollado a modo de ser entendible para usuarios sin experiencia en el tema, de tal modo que se pudieron omitir configuraciones.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;INTRODUCCIÓN&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;¿Alguna vez se han preguntado de que manera los Sistemas de Banca en Línea por Internet pueden ofrecer a sus usuarios servicios tales como, recarga de tiempo aire, pago de tarjeta de crédito, pago de recibos de luz y agua, etc?&lt;br /&gt;&lt;br /&gt;En primera instancia quizá esto sea poco importante, irrelevante, pero si nos detenemos y pensamos un poco en que las diferentes&amp;nbsp;compañías&amp;nbsp;como Telmex, CFE, Bancomer, Sky, Movistar, etc., tienen sus Sistemas desarrollados en diferentes plataformas (.NET y Java generalmente) ¿Como es que podrían comunicarse plataformas diferentes?&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_jf3qj62j_jM/TG35j6SvREI/AAAAAAAAAGc/2ZTAmySrzOY/s1600/servicios_baz.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://2.bp.blogspot.com/_jf3qj62j_jM/TG35j6SvREI/AAAAAAAAAGc/2ZTAmySrzOY/s400/servicios_baz.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Pago de Servicios de la Banca en Línea de Banco Azteca.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;¿Como podrían comunicarse dos personas que hablan un idioma diferente?...&lt;br /&gt;&lt;br /&gt;La respuesta a esto son los WebService! Los WS publican unos descriptores XML llamados WSDL que definen una interfaz de&amp;nbsp;comunicación para que otros WS Cliente puedan hacer uso de ellos e invocarlos. Para entender de mejor forma lo anterior, podemos imaginar a dos personas que hablan idiomas diferentes y sin embargo desean comunicarse entre si de forma efectiva, así que uno de ellos publica una interfaz que la otra persona pueda entender como por ejemplo una serie de dibujos (escritura&amp;nbsp;pictográfica) o de movimientos (mimica) y a esta interfaz es a lo que llamamos el WSDL. De esta forma ambas personas aunque hablen un idioma diferente podrán comunicarse.&lt;br /&gt;&lt;br /&gt;Mediante los WS, por ejemplo, la Banca en Línea de Banco Azteca puede ofrecer a sus clientes el pago de diversos servicios, pues sencillamente hace uso de los WS que otras&amp;nbsp;compañías&amp;nbsp;publican, crea un cliente para consumir esos WS y listo! tendremos a Sistemas desarrollados en diferentes plataformas comunicandose.&lt;br /&gt;&lt;br /&gt;Existen diversos "tipos de WebService", dos de los más comunes son los:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Basados en el protocolo SOAP&lt;/li&gt;&lt;li&gt;Basados en Rest&lt;/li&gt;&lt;/ul&gt;En este tutorial dividido en 2 partes veremos los más clásicos, los que utilizan el protocolo SOAP.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;HERRAMIENTAS UTILIZADAS&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JDK 5&lt;/li&gt;&lt;li&gt;Apache Tomcat 6&lt;/li&gt;&lt;li&gt;&lt;a href="http://ws.apache.org/axis2/download/1_4_1/download.cgi"&gt;Apache Axis 2 WAR&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Eclipse Helios&lt;/li&gt;&lt;li&gt;Mac OS X 10.6.1&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Nota --&amp;gt; La instalación de Tomcat es muy sencilla y funcional siguiendo este &lt;a href="http://www.malisphoto.com/tips/tomcatonosx.html"&gt;tutorial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;DESARROLLO&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para iniciar debemos desplegar el WAR de Axis en Tomcat e invocar la siguiente URL&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_jf3qj62j_jM/TG4DpdZTvUI/AAAAAAAAAGk/m5VSAZUB1S8/s1600/axis-tomat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://1.bp.blogspot.com/_jf3qj62j_jM/TG4DpdZTvUI/AAAAAAAAAGk/m5VSAZUB1S8/s400/axis-tomat.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;Debemos validar que tenemos las&amp;nbsp;librerías&amp;nbsp;esenciales para el correcto funcionamiento de axis, para ello basta con dar click al botón de Validate.&lt;br /&gt;&lt;br /&gt;Ahora mediante Eclipse vamos a crear un proyecto Java común y corriente y una clase llamada Saludo:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_jf3qj62j_jM/TG4GNwo1vlI/AAAAAAAAAGs/CWSFV8Uvw4E/s1600/clase-Saludo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="201" src="http://1.bp.blogspot.com/_jf3qj62j_jM/TG4GNwo1vlI/AAAAAAAAAGs/CWSFV8Uvw4E/s400/clase-Saludo.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Posteriormente crearemos un archivo xml al que llamaremos services.xml en una carpeta a la que llamaremos META-INF y estará en la raíz del proyecto, de tal forma que debe lucir algo así:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_jf3qj62j_jM/TG4HLnxdPiI/AAAAAAAAAG0/c3eCrrBFYI4/s1600/serviceXML.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="137" src="http://4.bp.blogspot.com/_jf3qj62j_jM/TG4HLnxdPiI/AAAAAAAAAG0/c3eCrrBFYI4/s400/serviceXML.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_jf3qj62j_jM/TG4HV__SHEI/AAAAAAAAAG8/HPfjrpC2v_4/s1600/serviceXML2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_jf3qj62j_jM/TG4HV__SHEI/AAAAAAAAAG8/HPfjrpC2v_4/s320/serviceXML2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Así pues, vamos ahora a exportar dicho archivo a un JAR que los WS conocen como AAR. En eclipse damos click derecho sobre el proyecto y damos click a export. Seleccionamos JAR File y escribimos un nombre poniendo la extensión ".aar".&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Finalmente vamos a la consola de Administración de Axis. Nos pedira un Usuario y Password, así que tecleamos "admin" y "axis2" respectivamente. En la parte de Upload Service podremos subir el archivo que generamos.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_jf3qj62j_jM/TG4Ixs8kyTI/AAAAAAAAAHE/O-xtnYr-GwI/s1600/upload-axis.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://3.bp.blogspot.com/_jf3qj62j_jM/TG4Ixs8kyTI/AAAAAAAAAHE/O-xtnYr-GwI/s400/upload-axis.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Si todo sale bien, en Available Service tendremos el WS que hemos subido.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_jf3qj62j_jM/TG4JKcKKPhI/AAAAAAAAAHM/5fp9hlCJ2mY/s1600/availableService.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_jf3qj62j_jM/TG4JKcKKPhI/AAAAAAAAAHM/5fp9hlCJ2mY/s320/availableService.png" width="256" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Si damos click sobre el nombre del WS, nos abrirá una página en blanco, pero si vemos su código fuente, veremos el famoso archivo WSDL que será el que utilizaremos en la segunda parte de este artículo para generar un cliente que consuma este WS.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_jf3qj62j_jM/TG4JvquTShI/AAAAAAAAAHU/cZIliVn2oGo/s1600/codigoWSDL.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://2.bp.blogspot.com/_jf3qj62j_jM/TG4JvquTShI/AAAAAAAAAHU/cZIliVn2oGo/s640/codigoWSDL.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;En esencia, los WS son sencillos de implementar, aunque como toda tecnología, tienen sus puntos complicados.&lt;br /&gt;&lt;br /&gt;Saludos!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-1281720924509644449?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/1281720924509644449/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/08/introduccion-los-webservice-i-practico.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/1281720924509644449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/1281720924509644449'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/08/introduccion-los-webservice-i-practico.html' title='Introducción a los WebService I: Práctico y Fácil'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jf3qj62j_jM/TG35j6SvREI/AAAAAAAAAGc/2ZTAmySrzOY/s72-c/servicios_baz.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-8070872108157396675</id><published>2010-07-24T20:24:00.000-07:00</published><updated>2010-07-24T20:59:28.449-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Selenium IDE'/><title type='text'>Pruebas Automatizadas: Selenium IDE</title><content type='html'>Selenium IDE es una útil herramienta para desarrollar pruebas automatizadas a nivel de Interfaz de Usuario para Aplicaciones Web. Se presenta como plugin para Firefox y puede utilizarse para cualquier otro navegador mediante Selenium RC.&amp;nbsp;Su uso es muy sencillo, sin embargo, la cantidad de comandos y la poca documentación existente puede dificultar su implementación en grandes proyectos.&lt;br /&gt;&lt;br /&gt;Selenium memoriza los comandos ejecutados por nosotros como por ejemplo, escribir palabras en cajas de texto, click a submit y esperar a cargar la página, verificar texto, click a links, entre muchos más. Al memorizar estos comandos, Selenium es capaz de ejecutarlos posteriormente y reproducir fielmente las acciones que previamente realizamos. El resultado es ver como nuestra aplicación es probada como por arte de magia sin intervención nuestra.&lt;br /&gt;&lt;br /&gt;La importancia de las pruebas automatizadas es&amp;nbsp;esencial, pudiendo programarlas para ejecutarse al termino de la codificación de un módulo, ejecutarlas diariamente por las noches, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_jf3qj62j_jM/TEu2fOnFn5I/AAAAAAAAAGU/ytvyCwnpY-o/s1600/SeleniumIDE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_jf3qj62j_jM/TEu2fOnFn5I/AAAAAAAAAGU/ytvyCwnpY-o/s400/SeleniumIDE.png" width="315" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Pueden descargarlo y ver un video tutorial sobre su uso en la &lt;a href="http://seleniumhq.org/"&gt;página oficial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Saludos!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-8070872108157396675?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/8070872108157396675/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/07/pruebas-automatizadas-selenium-ide.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8070872108157396675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8070872108157396675'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/07/pruebas-automatizadas-selenium-ide.html' title='Pruebas Automatizadas: Selenium IDE'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jf3qj62j_jM/TEu2fOnFn5I/AAAAAAAAAGU/ytvyCwnpY-o/s72-c/SeleniumIDE.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-4405677765474751646</id><published>2010-06-25T21:00:00.000-07:00</published><updated>2010-06-25T21:00:47.263-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Historias'/><category scheme='http://www.blogger.com/atom/ns#' term='Pruebas Unitarias'/><title type='text'>Presentando JUnit y Selenium</title><content type='html'>Vengo en el ADO, voy para Pachuca y la&amp;nbsp;película&amp;nbsp;esta aburrida, así que aqui vamos.&lt;br /&gt;&lt;br /&gt;El día de hoy en el trabajo realice una presentación al equipo de desarrollo de la Gerencia para la que trabajo, el tema en cuestión fue "Pruebas Unitarias". Podría decir que al menos desperte una cierta curiosidad entre los desarrolladores, aunque me temo que esa curiosidad les dure muy poco.&lt;br /&gt;&lt;br /&gt;Durante la platica mencione a JUnit y a Selenium IDE como dos grandiosas herramientas. Lo más&amp;nbsp;difícil&amp;nbsp;de explicar y hacer notar su utilidad fue JUnit, lo más fácil fue Selenium. Al final de la presentación se toco el tema de "diseño del sistema" o Arquitectura... Ese era el momento ideal para hablarles de TDD y sus ventajas no como una buena práctica de testing sino como un excelente marco para guiar al equipo por un buen diseño, después de todo su nombre lo dice (Test Driven Development), pero bueno, me detuve en primera x que soy un niño en ese tema y aun continuo un camino de aprendizaje y en segunda por que considero que si el equipo no realiza pruebas unitarias y yo comienzo a decirles que primero hay que programar una prueba para algo que aun no existe, seguramente me hubieran tirado más de a loco.&lt;br /&gt;&lt;br /&gt;No cabe duda que es por demás interesante la implementación de buenas prácticas en un proceso de software y más aún cuando se le da un enfoque agile. No perdi la oportunidad para mencionar de pasada a eXtreme Programming y Scrum, claro que ni siquiera mencione bien para que son ya que no queria parecer ñoño, pero deje plasmadas dichas palabras en las diapositivas.... espero que algún curioso pueda investigar sobre Scrum y XP!!!&lt;br /&gt;&lt;br /&gt;Ya les platicare posteriormente como nos va en este camino que&amp;nbsp;recién&amp;nbsp;inicio... si, la idea es comenzar a implementar prácticas ágiles muy sencillas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Saludos!!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-4405677765474751646?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/4405677765474751646/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/06/presentando-junit-y-selenium.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/4405677765474751646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/4405677765474751646'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/06/presentando-junit-y-selenium.html' title='Presentando JUnit y Selenium'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-3593460815926964669</id><published>2010-06-21T18:08:00.000-07:00</published><updated>2010-06-21T18:08:32.827-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Herramientas'/><title type='text'>2 Herramientas: Monitor de Logs y Screenshot Tool</title><content type='html'>Les voy a presentar 2 sencillas pero muy útiles herramientas que podemos utilizar en nuestro trabajo diario como Desarrollador de Software:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;a href="http://tailforwin32.sourceforge.net/"&gt;Tail for Win32&lt;/a&gt;: &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;Tail es un programa para monitorear los cambios que ocurren en tiempo real en archivos de texto. Con Tail podremos monitorear los archivos de Log del Servidor de Aplicaciones o de nuestra aplicación Java/.NET/etc., que tengan un archivo de Log usando por ejemplo Log4J. Algunas cosas interesantes y bastante sencillas son el hecho de poder definir &lt;i&gt;keywords&lt;/i&gt; y Tail en tiempo real nos mostrará la salida del Log marcando de colores aquellas keywords que hayamos definidio previamente.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_jf3qj62j_jM/TCAIQzhgdyI/AAAAAAAAABQ/SM9ywQQl29E/s1600/plain_full.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://2.bp.blogspot.com/_jf3qj62j_jM/TCAIQzhgdyI/AAAAAAAAABQ/SM9ywQQl29E/s400/plain_full.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_jf3qj62j_jM/TCAIQzhgdyI/AAAAAAAAABQ/SM9ywQQl29E/s1600/plain_full.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;2. &lt;a href="http://greenshot.sourceforge.net/"&gt;&lt;b&gt;GreenShot:&lt;/b&gt;&lt;/a&gt; Cuantas veces como desarrolladores nos vemos en la necesidad de aclarar rápidamente a un usuario algunas opciones del Sistema, incluso imprimiendo capturas de pantalla y poniendo flechas y texto para un mayor entendimiento por parte del usuario. GreenShot es casi un clon de Snagit, a diferencia que GreenShot es Open Source. Su uso es tan sencillo que basta con presionar la tecla "Impr Pant" e inmediatamente podremos seleccionar una sección de pantalla y listo!! Podremos ver la sección que hemos recortado en el editor de GreenShot en caso de que necesitemos agregar flechas, marcar algún texto, etc., o en su defecto omitir dicho editor y pegar la sección de imagen que hemos recortado en nuestro correo electrónico, listo para ser enviado! En menos de 5 segundos tenemos una útil captura de pantalla y ya no será necesario abrir el no tan útil MS Paint.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_jf3qj62j_jM/TCAMfcJA_8I/AAAAAAAAABY/6xPBvlzgenU/s1600/greenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_jf3qj62j_jM/TCAMfcJA_8I/AAAAAAAAABY/6xPBvlzgenU/s400/greenshot.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-3593460815926964669?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/3593460815926964669/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/06/2-herramientas-monitor-de-logs-y.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/3593460815926964669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/3593460815926964669'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/06/2-herramientas-monitor-de-logs-y.html' title='2 Herramientas: Monitor de Logs y Screenshot Tool'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jf3qj62j_jM/TCAIQzhgdyI/AAAAAAAAABQ/SM9ywQQl29E/s72-c/plain_full.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-6690469295172367651</id><published>2010-06-06T20:45:00.000-07:00</published><updated>2010-06-06T20:46:48.381-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Ing de Software'/><title type='text'>¡¡¡El cliente no sabe lo que quiere!!!</title><content type='html'>Cuando usted era un jovenzuelo (como yo al momento de escribir este artículo), cuando comenzaba a realizar su vida propia y comenzó a ganar un poco de dinero, seguramente por su mente paso el comprar un&amp;nbsp;automóvil, cuentas bancarias, etc., y si usted al igual que yo, llego a la ciudad originario de provincia, al inicio muchas cosas le son desconocidas, usted sabía que quería tener un automóvil, pero no tenia muy claro que tipo de auto le convenía ni con que características.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;¿Qué tipo de motor?&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;¿Que tipos de frenos? ¿&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;de disco&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;, de&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;nbsp;tambor&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;antiblockiersystem?&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;¿Que tipo de suspensión?&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;Velocidad máxima, tiempo de aceleración.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;Costo de mantenimiento y refacciones.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;Costo de tenencia (en México).&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;Usted disponía de un presupuesto, y para aclarar todas sus dudas, lo mejor era consultarlo con los expertos de las agencias o incluso con sus mismos amigos... Si usted estaba convencido que quería un Automóvil pero no tenia claro los tipos de características que hacen atractivo a un automóvil según su presupuesto, ¿podríamos concluir que usted no sabia lo que quería?... Pues SÍ, aunque también podría ser NO.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;En el desarrollo de Software estamos muy acostumbrados a gritar la frase &lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;"El cliente no sabe lo que quiere" &lt;/span&gt;&lt;/b&gt;siempre que algo sale mal y desafortunadamente la&amp;nbsp;indecisión&amp;nbsp;en el desarrollo de software es más compleja que el ejemplo del auto. En un inicio el cliente sabe que necesita automatizar sus procesos de negocio y hacerlos más efectivos y dinámicos, que le permita una toma de&amp;nbsp;decisiones&amp;nbsp;más certera, pero pese a lo anterior, tiene muchas dudas de el alcance y hasta donde la tecnología le puede ayudar, y esto es parte de la naturaleza de trabajar con cosas abstractas e intangibles.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;Bajo la mirada de la filosofía ágil, el cambio de requerimientos es algo natural al cual debemos adaptarnos, de ahí que en Scrum se recomiende hacer entregas con valor de negocio mínimo cada 2 semanas hasta 1 mes como máximo, de esta forma el cliente podrá ir validando, refinando &amp;nbsp;y agregando nueva funcionalidad con una idea mucho más clara a lo largo de la duración del proyecto y de ningún modo tendrá que vaciar sus requerimientos en largos e&amp;nbsp;inútiles&amp;nbsp;documentos que inevitablemente cambiaran con el tiempo, además de crear una mala relación entre cliente-consultora.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;Requerimos un cambio de filosofía, dejar de pensar que el cliente es quien comete los errores, el cliente al igual que nosotros no tiene muy claro lo que quiere, dado que no es experto en tecnología y en un principio no esta&amp;nbsp;consciente&amp;nbsp;de todas las cosas que la tecnología le puede ayudar, esto último lo va descubriendo conforme puede ir probando funcionalidad. La comunicación&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt; Equipo de Trabajo - Cliente&lt;/span&gt;&lt;/b&gt; es importante para el éxito de un proyecto,&amp;nbsp;olvidémonos&amp;nbsp;de la vieja comunicación &lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Cliente -&amp;nbsp;Líder/Gerente - Equipo de trabajo&lt;/span&gt;&lt;/b&gt;... En este ámbito, los puentes en la comunicación no sirven, bajo NINGUNA&amp;nbsp;circunstancia, NO HAY EXCUSA para hacerlo.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;Más vale el desarrollo iterativo y adaptarse al cambio, la frase "¡¡¡El cliente no sabe lo que quiere!!!" debe ser cosa del pasado, debemos saber convivir con el cambio, negociar tiempos de entrega, de esta forma tendremos a un cliente más contento que al estar culpándolo por los cambios.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-6690469295172367651?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/6690469295172367651/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/06/el-cliente-no-sabe-lo-que-quiere.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/6690469295172367651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/6690469295172367651'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/06/el-cliente-no-sabe-lo-que-quiere.html' title='¡¡¡El cliente no sabe lo que quiere!!!'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-1599999211442973400</id><published>2010-06-02T20:56:00.000-07:00</published><updated>2010-06-02T21:03:07.150-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DB4O'/><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>DB4O: Una Base de Datos Orientada a Objetos</title><content type='html'>DB4O es una Base de Datos Orientada a Objetos que cumple muy bien su función, persistir datos de aplicaciones de pequeña y mediana escala.&lt;br /&gt;&lt;br /&gt;Los modelos Relacional y Orientado a Objetos son ciertamente &lt;a href="http://es.wikipedia.org/wiki/Mapeo_objeto-relacional"&gt;incompatibles&lt;/a&gt;, en términos simples, al desarrollar una aplicación con Base de Datos no almacenamos objetos, si bien nos va, utilizando un patrón de diseño &lt;a href="http://www.chuidiang.com/chuwiki/index.php?title=Patr%C3%B3n_DAO"&gt;DAO &lt;/a&gt;podemos "abstraer" un poco la complejidad de la persistencia en la capa web y pasarla a una capa de persistencia para que sea otra persona quien la implemente, o mejor aún, de una forma más sofisticada emplear un Framework ORM como Hibernate. Pero en el peor de los casos, al trabajar con una BD Relacional utilizamos variables escalares y enviamos sus valores a la BD.&lt;br /&gt;&lt;br /&gt;Sin entrar en &lt;a href="http://www.javahispano.org/contenidos/es/sigue_teniendo_sentido_almacenar_un_modelo_de_objetos_en_tablas_relacionales_opinion_publicada_en_solo_programadores/"&gt;polémica &lt;/a&gt;sobre la utilización o no utilización de SQL embebido código de un Lenguaje de alto nivel &amp;nbsp;o la utilización de un ORM, es bueno considerar a DB4O como una alternativa real y potente para muchos de los proyectos que podamos desarrollar.&lt;br /&gt;&lt;br /&gt;Su utilización es tan fácil que para abrir una conexión basta hacer algo como:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;ObjectContainer db = Db4o.openFile(DB4OFILENAME);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y para persistir información basta con escribir:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;db.store(usuario);&lt;br /&gt;db.close();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sin mapeos, ni XML, ni SQL, ni concatenación de variables a String que contiene SQL!! Basta con crear el objeto y emplear el método save.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-size: medium; font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;Existe una versión de DB4O para Java y una más para C#, mismas que pueden descargarse de la &lt;a href="http://www.db4o.com/"&gt;página oficial&lt;/a&gt;.Para nuestro ejemplo en Java basta con agregar a nuestro entorno de programación (Eclipse, NetBeans, etc) el archivo&amp;nbsp;db4o-7.4.88.12908-java5.jar.&lt;br /&gt;&lt;br /&gt;Al descargar la librería de la página oficial, nos vendrá con una completa documentación, incluido un muy buen tutorial en ingles y español sobre su utilización.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un sencillo y austero ejemplo en NetBeans se puede descargar de &lt;a href="http://mundobyte.hostjava.net/downloads/Java/DB4OExample.rar"&gt;aquí&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-1599999211442973400?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/1599999211442973400/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/06/db4o-una-base-de-datos-orientada.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/1599999211442973400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/1599999211442973400'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/06/db4o-una-base-de-datos-orientada.html' title='DB4O: Una Base de Datos Orientada a Objetos'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-4260378718275478724</id><published>2010-04-17T22:52:00.000-07:00</published><updated>2010-04-18T20:27:40.560-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Inyección de la Dependencia II: Práctico y Fácil</title><content type='html'>En la &lt;a href="http://mundobyte-x.blogspot.com/2010/04/inyeccion-de-la-dependencia-practico-y_12.html"&gt;primera parte &lt;/a&gt;vimos un ejemplo por demás sencillo, el clásico Hola Mundo! utilizando la Inyección de Dependencia mediante Spring!&lt;br /&gt;&lt;br /&gt;En esta segunda parte, continuaremos con otro ejemplo igual de sencillo, más útil, pero que al final de cuentas nos encontraremos con un problema!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Buscando Archivos!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Vamos a realizar un sencillo buscador de archivos! El API de Java incorpora una interfaz llamada &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/io/FileFilter.html"&gt;FileFilter&lt;/a&gt; que contiene al método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;accept&lt;/b&gt;&lt;/span&gt;, este método deberá contener toda la lógica requerida para filtrar de una lista de archivos, aquellos que cumplan con nuestras características! De tal modo que pasaremos una referencia de FileFilter al método &lt;b&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;listFiles&lt;/span&gt;&lt;/b&gt; de la clase &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html"&gt;File&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para empezar, creamos una clase que implemente a la interfaz FileFilter.&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package archivos;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileFilter;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author windoctor&lt;br /&gt; */&lt;br /&gt;public class FileExtensionFileFilter implements FileFilter{&lt;br /&gt;&lt;br /&gt;    private String extension;&lt;br /&gt;&lt;br /&gt;    public FileExtensionFileFilter(String extension){&lt;br /&gt;        this.extension = extension;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean accept(File pathname) {&lt;br /&gt;        String nameLower = pathname.getName().toLowerCase();&lt;br /&gt;&lt;br /&gt;        return (pathname.isFile() &amp;amp;&amp;amp;&lt;br /&gt;                (nameLower.indexOf(extension) &amp;gt; 0)? true:false);&lt;br /&gt;    }    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Posteriormente, vamos a crear una clase que se encargue de listar todos los archivos que cumplan con nuestro criterio de búsqueda!&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package archivos;&lt;br /&gt;&lt;br /&gt;package archivos;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileFilter;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author windoctor&lt;br /&gt; */&lt;br /&gt;public class BuscadorArchivo {&lt;br /&gt;    private String directorio;&lt;br /&gt;    private String extension;&lt;br /&gt;    private FileFilter filter;&lt;br /&gt;&lt;br /&gt;    public BuscadorArchivo(String directorio, String extension){&lt;br /&gt;        this.directorio = directorio;&lt;br /&gt;        this.extension = extension;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public File[] listar() throws FileNotFoundException{&lt;br /&gt;        File dir = new File(directorio);&lt;br /&gt;        //Si no existe, lanzamos una excepción&lt;br /&gt;        if(!dir.exists())&lt;br /&gt;            throw new FileNotFoundException&lt;br /&gt;                    ("No existe el directorio "+directorio);&lt;br /&gt;&lt;br /&gt;        //Este es nuestro filtro, el cual pasaremos al método listFiles&lt;br /&gt;        filter = new FileExtensionFileFilter(extension);&lt;br /&gt;        File[] files = dir.listFiles(filter);&lt;br /&gt;&lt;br /&gt;        if(files == null || files.length &amp;lt;= 0){&lt;br /&gt;            System.out.println("No existen archivos "+extension);&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;            return files;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Ahora en el applicationContext.xml vamos a agregar la definición de la clase anterior:   &lt;br /&gt;&lt;pre class="xml" name="code"&gt;&amp;lt;bean id="beanArchivo" class="archivos.BuscadorArchivo"&amp;gt;&lt;br /&gt;   &amp;lt;constructor-arg index="0" value="/home/windoctor/Documentos" /&amp;gt;&lt;br /&gt;   &amp;lt;constructor-arg index="1" value=".mp3" /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;Como vemos, la clase&amp;nbsp;BuscadorArchivo&amp;nbsp;tiene un constructor que recibe 2 parámetros de tipo String y que serán inyectados vía Spring. De tal suerte que al ejecutar el siguiente código, obtendremos una lista de archivos:   &lt;br /&gt;&lt;pre class="java" name="code"&gt;package archivos;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import org.springframework.beans.factory.BeanFactory;&lt;br /&gt;import org.springframework.beans.factory.xml.XmlBeanFactory;&lt;br /&gt;import org.springframework.core.io.FileSystemResource;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author windoctor&lt;br /&gt; */&lt;br /&gt;public class ArchivoMain {&lt;br /&gt;    public static void main(String args[]){&lt;br /&gt;        BeanFactory factory = new XmlBeanFactory(&lt;br /&gt;                new FileSystemResource("web/WEB-INF/applicationContext.xml"));&lt;br /&gt;        BuscadorArchivo buscador = (BuscadorArchivo)&lt;br /&gt;                factory.getBean("beanArchivo");&lt;br /&gt;        try {&lt;br /&gt;            File[] files = buscador.listar();&lt;br /&gt;            int size = files.length;&lt;br /&gt;             //Ahora que tenemos todos los archivos filtrados, solo los listamos&lt;br /&gt;            for(int i = 0; i &amp;lt; size; i++){&lt;br /&gt;                File file = files[i];&lt;br /&gt;                String nameFile = file.getName();&lt;br /&gt;                long fileSize = file.length();&lt;br /&gt;                String msg = nameFile + " - Size: "+fileSize;&lt;br /&gt;                System.out.println(msg);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        catch (FileNotFoundException ex) {}&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Si tenemos archivos mp3 en la carpeta, la consola mostrará una salida similar a esta:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Pista5.mp3 - Size: 4877446&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Pista20.mp3 - Size: 3669863&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Pista10.mp3 - Size: 10081612&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt; &lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt; &lt;/span&gt;  Hasta este punto parece que todo ha salido bien y ya tenemos una idea más clara sobre lo que es la inyección de la dependencia, aunque este ejemplo no es mucho mejor que el anterior y aun nos puede parecer algo tonto la DI.  En este punto vamos a realizar una prueba unitaria mediante JUnit! Las pruebas unitarias son algo que muchos no hacemos pese a las enormes ventajas que esto aporta! En NetBeans vamos a agregar a la librería de nuestro proyecto a JUnit 4.5. En la carpeta de "Test Packages" colocaremos la clase de unidad que crearemos a continuación.  &lt;br /&gt;&lt;pre class="java" name="code"&gt;package archivo.test;&lt;br /&gt;&lt;br /&gt;import archivos.BuscadorArchivo;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import org.junit.Assert;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author windoctor&lt;br /&gt; */&lt;br /&gt;public class ArchivoTest {&lt;br /&gt;&lt;br /&gt;    @Test&lt;br /&gt;    public void listarTest(){&lt;br /&gt;        BuscadorArchivo buscador = new &lt;br /&gt;                  BuscadorArchivo("/home/windoctor/Documentos", ".mp3");&lt;br /&gt;        try {&lt;br /&gt;            File[] files = buscador.listar();&lt;br /&gt;            Assert.assertNotNull(files);&lt;br /&gt;        } &lt;br /&gt;        catch (FileNotFoundException ex) {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Al ejecutar el código anterior obtendremos una salida de JUnit como la que muestra la imagen de abajo.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_jf3qj62j_jM/S8u1icVyGmI/AAAAAAAAABA/JLPNfK2TYP8/s1600/ArchivoTest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_jf3qj62j_jM/S8u1icVyGmI/AAAAAAAAABA/JLPNfK2TYP8/s320/ArchivoTest.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Nuestra prueba unitaria ha resultado exitosa! Sin embargo, aún nos falta probar a la clase &lt;b&gt;&lt;i&gt;FileExtensionFileFilter&lt;/i&gt;&lt;/b&gt;, así que debemos hacer lo mismo.... Un momento... Sin darnos cuenta, ya hemos probado a "FileExtensionFileFilter" dado que &lt;b&gt;&lt;i&gt;BuscadorArchivo&lt;/i&gt;&lt;/b&gt; obtiene por si mismo una referencia de ese objeto! &lt;br /&gt;&lt;br /&gt;En la primera parte de este tutorial, mencionamos que una de las características deseables del Software es que tenga un débil acoplamiento! Desafortunadamente en este ejemplo esta característica no se esta cumpliendo del todo!&lt;br /&gt;&lt;br /&gt;Si pensamos un poco más, caeremos en la cuenta que con el ejemplo anterior estamos limitados a filtrar archivos únicamente por su extensión! Pues &lt;b&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;BuscadorArchivo&lt;/span&gt;&lt;/b&gt; recupera por si mismo a un &lt;b&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;FileExtensionFileFilter&lt;/span&gt;&lt;/b&gt;... ¿Y si deseamos filtrar en base a que un archivo de texto contenga cierta palabra?&lt;br /&gt;&lt;br /&gt;El anterior ejemplo es sencillo, pero si lo&amp;nbsp;trasladamos&amp;nbsp;a clases de un Sistema empresarial que es grande y tiene decenas, cientos o miles de clases, las pruebas unitarias se vuelven difíciles de realizar por el fuerte acoplamiento que existe, además que el mantenimiento se complica!&lt;br /&gt;&lt;br /&gt;La solución consiste en inyectar objetos FileFilter en BuscadorArchivo, dado que FileFilter es una interfaz, podemos crear tantos filtros de archivos según nuestras necesidades. Realizaremos una modificación a la clase &lt;i&gt;BuscadorArchivo&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class BuscadorArchivo {&lt;br /&gt;    private String directorio;&lt;br /&gt;    private FileFilter filter;&lt;br /&gt;&lt;br /&gt;    public BuscadorArchivo(String directorio){&lt;br /&gt;        this.directorio = directorio;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //Ahora al Buscador de archivos se le asigna un Filtro en lugar&lt;br /&gt;    //de que Él mismo obtenga un filtro.&lt;br /&gt;    public void setFilter(FileFilter filter){&lt;br /&gt;        this.filter = filter;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public File[] listar() throws FileNotFoundException{&lt;br /&gt;        File dir = new File(directorio);&lt;br /&gt;        //Si no existe, lanzamos una excepción&lt;br /&gt;        if(!dir.exists())&lt;br /&gt;            throw new FileNotFoundException&lt;br /&gt;                    ("No existe el directorio "+directorio);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        File[] files = dir.listFiles(filter);&lt;br /&gt;&lt;br /&gt;        if(files == null || files.length &amp;lt;= 0){&lt;br /&gt;            System.out.println("No existen archivos con el criterio de búsqueda");&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;            return files;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La diferencia ahora es que BuscadorArchivo ya no recupera por si mismo un filtro, por el contrario, el filtro le es inyectado mediante un método setFilter. Para que Spring pueda hacer esta inyección, debemos modificar también el archivo applicationContext.xml:&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&amp;lt;bean id="beanFilter" class="archivos.FileExtensionFileFilter"&amp;gt;&lt;br /&gt;&amp;lt;constructor-arg index="0" value=".mp3" /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="beanAnalizadorXml" class="archivos.BuscadorArchivo"&amp;gt;&lt;br /&gt;&amp;lt;constructor-arg index="0" value="/home/windoctor/Documentos" /&amp;gt;&lt;br /&gt;&amp;lt;property name="filter" ref="beanFilter" /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Podemos observar que ahora hemos definido un nuevo bean FileExtensionFileFilter que es inyectado al beanArchivo. El beanArchivo ahora tiene una etiqueta property que consta de 2 atributos, name y ref.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;name: nombre del atributo de la clase. En este caso, hemos agregado a BuscadorArchivo un atributo llamado filter, este nombre es el que deberá colocarse esta propiedad.&lt;/li&gt;&lt;li&gt;ref: Es la referencia de otro bean que se ha declarado en el applicationContext.xml&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Con la modificación anterior tenemos &amp;nbsp;un código con un menor acoplamiento, ahora es posible asignarle realizar búsquedas de archivos con diferentes filtros y no necesariamente por extensión como originalmente sucedía!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Puedes descargar el proyecto en NetBeans de la primera y segunda parte de este tutorial desde &lt;a href="http://mundobyte.hostjava.net/downloads/Java/SpringDI.tar.gz"&gt;aquí&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cerraremos este tutorial sobre la Inyección de la Dependencia mediante Spring con una tercera y última parte en donde veremos otro ejemplo más que nos permita comprender de mejor manera la DI.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Saludos!!!&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;Cualquier error encontrado en este tutorial, reportarlo como comentario dentro del mismo!&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;La información contenida aquí se utiliza con fines educativos y su utilización en ambientes de producción es únicamente responsabilidad de quien lo hace.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-4260378718275478724?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/4260378718275478724/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/04/inyeccion-de-la-dependencia-ii-practico.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/4260378718275478724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/4260378718275478724'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/04/inyeccion-de-la-dependencia-ii-practico.html' title='Inyección de la Dependencia II: Práctico y Fácil'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jf3qj62j_jM/S8u1icVyGmI/AAAAAAAAABA/JLPNfK2TYP8/s72-c/ArchivoTest.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-2351384081402888380</id><published>2010-04-12T19:28:00.001-07:00</published><updated>2010-04-18T20:28:16.767-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Inyección de la Dependencia I: Práctico y Fácil</title><content type='html'>Spring es un Framework de código abierto, creado originalmente para mitigar la odiosa complejidad de los EJB (La especificación de EJB 3 ha sido considerablemente más ligera y fácil de utilizar). Una de las características más conocidas de Spring es trabajar con la &lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Inyección de la Dependencia&lt;/span&gt;&lt;/b&gt; y la Programación Orientada a Aspectos. Omitiremos un poco la discusión sobre el término Inversión del Control (IoC) que es más general, para otra ocasión!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;Alta Cohesión y Débil Acoplamiento&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se dice que el Software debe tener dos características fundamentales, una alta cohesión y un débil acoplamiento. La &lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;cohesión&lt;/span&gt;&lt;/b&gt; se refiere a la manera en la que agrupamos todos los "artefactos de software" (un término quizá más apropiado es "unidad de software"). Con "agrupar" debe entenderse a la facilidad con la que pueden ensamblarse todos nuestros componentes de software, métodos, clases, paquetes, etc.&lt;br /&gt;&lt;br /&gt;El &lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;débil acoplamiento&lt;/span&gt;&lt;/b&gt; se refiere al grado de dependencia que existe entre las unidades de software, es decir, si tenemos dos clases, A y B, y alguna de ellas depende en gran medida de la otra y no esta presente, la clase o método dependiente no podrá realizar efectivamente su tarea. El acoplamiento a nivel de métodos es más fácil de comprender con el siguiente ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public int multiplicar(int a, int b){&lt;br /&gt;        int c = resta(a,b);&lt;br /&gt;        return 2 * c;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public int resta(int a, int b){&lt;br /&gt;        return a-b;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Vemos pues que existe una fuerte dependencia del método multiplicar con el método restar! El método multiplicar llama al método restar. En gran medida, esto es lo que debemos evitar! Sin embargo, es importante aclarar el término "débil acoplamiento" y "desacoplamiento", este segundo término da a entender algo total y absoluto, mientras que el primero dice que puede haber acoplamiento por que definitivamente no es posible desarrollar Software con cero acoplamiento! Sin embargo, mediante algunas técnicas es posible reducirlo!&lt;br /&gt;&lt;br /&gt;Spring Framework fomenta el débil acoplamiento mediante la Inyección de dependencias que es lo siguiente que veremos.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;Inyección de la Dependencia&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La Inyección de la dependencia sigue un sencillo principio, &lt;b&gt;&lt;span class="Apple-style-span" style="color: #45818e;"&gt;"No me llames, YO te llamo"&lt;/span&gt;&lt;/b&gt;. Lo anterior describe perfectamente la tarea de la &lt;b&gt;DI (Dependency Injection)&lt;/b&gt;, es decir, cuando desarrollamos Software, sabemos de antemano que existen clases relacionadas, cada objeto se hace responsable de llamar y crear a otros objetos que necesita para poder llevar a cabo su tarea. Para aclarar lo anterior vamos a realizar el ya clásico programa del "Hola Mundo!". Utilizaremos NetBeans 6.8 por su sencillez y simplicidad de primera mano (omitiremos su lentitud), desde luego que Eclipse es un mejor IDE, pero en Eclipse debemos instalar un plugin para trabajar más cómodamente con Spring y NetBeans ya lo trae por defecto (por ello utilice el término "de primera mano").&lt;br /&gt;&lt;br /&gt;En NetBeans creamos un proyecto web y llegado a la opción de Frameworks, seleccionamos Spring Web MVC. &lt;br /&gt;&lt;br /&gt;Vamos a crear una interfaz llamada ISaludo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public interface ISaludo {&lt;br /&gt;&lt;br /&gt;    void saludar();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Así como la clase que implemente la interfaz:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class Saludo implements ISaludo{&lt;br /&gt;    public String mensaje;&lt;br /&gt;&lt;br /&gt;    public Saludo(String mensaje){&lt;br /&gt;        this.mensaje = mensaje;&lt;br /&gt;    }&lt;br /&gt;    public void saludar() {&lt;br /&gt;        System.out.println(mensaje);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Vemos que la clase &lt;b&gt;Saludo&lt;/b&gt; recibe una cadena en su constructor, esto podría ser &amp;nbsp;otro tipo de Objeto creado por nosotros mismos. Lo que vamos a hacer aquí es tan sencillo que no se le vera utilidad a nivel de aplicación y en realidad, mucho del poder de Spring puede ser visto con mayor facilidad a nivel de Arquitectura! Vamos a concentrarnos en aplicar la DI.&lt;br /&gt;&lt;br /&gt;Dentro de la carpeta WEB-INF, NetBeans ha creado un archivo XML llamado applicationContext.xml, en el tendremos a las etiquetas &lt;beans&gt;&lt;/beans&gt; y dentro de ellas colocaremos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;bean class="saludo.Saludo" id="beanSaludo"&gt;&lt;br /&gt;     &lt;constructor-arg value="Hola, este es nuestro primer ejemplo DI!!"&gt;&lt;/constructor-arg&gt;&lt;/bean&gt;   &lt;/pre&gt;El pequeño fragmento anterior, tendrá la tarea de instanciar un objeto de tipo Saludo (véase que esta dentro del paquete saludo), a este objeto lo vamos a referenciar por "beanSaludo". Además podemos ver que la clase Saludo recibe en su constructor una cadena de texto, misma que inyectaremos desde Spring mediante el atributo constructor-arg.  Finalmente creamos una clase para ejecutar este ejemplo, el más sencillo de todos los que pueda haber!     &lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class SaludoTest {&lt;br /&gt;&lt;br /&gt;    public static void main(String args[]){&lt;br /&gt;        BeanFactory context=&lt;br /&gt;                new XmlBeanFactory(new &lt;br /&gt;                FileSystemResource("AQUI LA RUTA/applicationContext.xml"));&lt;br /&gt;&lt;br /&gt;        ISaludo saludo = (ISaludo) context.getBean("beanSaludo");&lt;br /&gt;        saludo.saludar();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Al ejecutar la clase anterior, podremos observar en la consola de NetBeans la siguiente salida:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;"Hola, este es nuestro primer ejemplo DI!!"&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Lo primero a resaltar es que dicho mensaje no ha sido establecido! Podría pensarse en primera instancia que hubiera sido lo mismo colocar el mensaje en algún archivo de texto pero en realidad si lo hubiéramos hecho así, en algún lugar del código tendríamos que leer el archivo obtener el valor y "settearlo" al atributo mensaje de la clase Saludo! Sin embargo, nótese que en este sencillo ejemplo, Spring ha &lt;b&gt;INYECTADO&lt;/b&gt; dicho recurso automáticamente por nosotros, es decir, nosotros no hemos hecho nada como esto:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;Saludo saludo = new Saludo("hola mundo!");  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ni tampoco  &lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;saludo.setMensaje("Hola mundo"); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo que se debe notar es que Spring como por arte de magia a inyectado el recurso (la cadena de texto) por nosotros! Sin aplicar la DI, el código del método main quedaria mucho más simple: &lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class SaludoTest {&lt;br /&gt;    public static void main(String args[]){&lt;br /&gt;        Saludo saludo = new &lt;br /&gt;               Saludo("Hola, este es nuestro primer ejemplo DI!!");&lt;br /&gt;        saludo.saludar();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Con el código anterior, obtendriamos el mismo resultado pero sin la utilización de Spring! Este ejemplo es tan sencillo que el poder de la DI no es notoria, al contrario, lo hace ver como algo inútil, sin embargo, este ejemplo es meramete educativo y debe bastar para entender a que se refiere la "Inyección de la Dependencia" (NO me llames, YO te llamo). Más adelante veremos ejemplos más útiles en donde se vera de mejor forma la utilidad de la DI.&lt;br /&gt;&lt;br /&gt;Saludos!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;Cualquier error encontrado en este tutorial, reportarlo como comentario dentro del mismo!&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;La información contenida aquí se utiliza con fines educativos y su utilización en ambientes de producción es únicamente responsabilidad de quien lo hace.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-2351384081402888380?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/2351384081402888380/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/04/inyeccion-de-la-dependencia-practico-y_12.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2351384081402888380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2351384081402888380'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/04/inyeccion-de-la-dependencia-practico-y_12.html' title='Inyección de la Dependencia I: Práctico y Fácil'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-1156568974337293384</id><published>2010-04-04T17:00:00.000-07:00</published><updated>2010-04-04T17:14:27.015-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Crítica y Humor'/><title type='text'>¿Qué es un EJB?... La triste realidad del Sector Académico</title><content type='html'>Este es un vídeo que me ha dejado sin palabras! Incluso es tan vergonzoso que me niego a creer que es verdad, pero si lo es, realmente es solo una muestra de la realidad que vive el sector académico en muchas partes del mundo, principalmente en países latinoamericanos, México desde luego no es la excepción! El video, lo he visto de este &lt;a href="http://blog.smaldone.com.ar/2006/12/10/no-tener-ni-idea/"&gt;blog&lt;/a&gt;. Fueron unos alumnos de la UTN los que grabaron esta clase y la animaron en este video...&lt;br /&gt;&lt;br /&gt;No soy el desarrollador senior pero tampoco soy un desarrollador Junior y aun así no he podido entender en palabras de este profesor lo que es un EJB!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object style="height: 344px; width: 425px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vFlTYRleZpU"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/vFlTYRleZpU" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Pese a ello, la arrogancia de muchos catedráticos es notable! Los "Títulos" de posgrado ("Maestrías", "Doctorados") han originado en el Sector académico una cortina de humo y un lamentable conformismo!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Podría enumerar a cada uno de mis maestros que tuve, pero por respeto a su persona (no como a catedráticos) no lo haré, más sin embargo, muchos de ellos siempre me dieron risa cuando&amp;nbsp;hacían&amp;nbsp;alarde a sus maestrías y a sus doctorados y ellos mismos aceptaban que nunca les&amp;nbsp;había&amp;nbsp;gustado el desarrollo de sw.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Afortunadamente, existen también verdaderos catedráticos (aunque muy pocos) que saben de lo que hablan y se preocupan verdaderamente por la educación! Entre ellos por ejemplo, Raul Oramas, profesor de la Universidad de Occidente el cual tiene un esquema de capacitación gratuito en tecnología Java de muy alto nivel&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.profesorjava.com/"&gt;http://www.profesorjava.com/&lt;/a&gt;&amp;nbsp;... Profesores como Raúl, son los que realmente se necesitan en lugar de tener a catedráticos encerrados como ratas de laboratorio en sus cubículos con el pretexto de ser "investigadores"... ¿Qué investigan? ¿Cuáles han sido sus aportes a la comunidad científica? ¿En realidad han servido o dado frutos sus investigaciones? Y con "frutos" no me refiero a nada palpable, pues la investigación científica puede tardar años en materializar sus investigaciones, más bien me refiero a si las supuestas investigaciones que realizan muchos académicos realmente son ineditas y han servido de base para otras investigaciones teóricas?&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Nunca ocultare mi antipatía por el sector académico! Me bastaron 4 años de carrera y haber conocido a la planta docente de mi "honorable" institución de donde soy egresado para darme cuenta que quizá solo 1 (o siendo menos estricto 2) profesores son verdaderos académicos, los demás... los demás son simplemente... mejor le dejo hasta aquí!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Saludos!!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-1156568974337293384?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/1156568974337293384/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/04/que-es-un-ejb-la-triste-realidad-del.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/1156568974337293384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/1156568974337293384'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/04/que-es-un-ejb-la-triste-realidad-del.html' title='¿Qué es un EJB?... La triste realidad del Sector Académico'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-2644180176536316103</id><published>2010-04-03T22:12:00.000-07:00</published><updated>2010-04-03T22:39:14.193-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML'/><category scheme='http://www.blogger.com/atom/ns#' term='Ing de Software'/><title type='text'>El giro positivo del UML</title><content type='html'>Sencillamente esta es una sátira genial que&amp;nbsp;escribió&amp;nbsp;ya hace algunos años Bertrand Meyer y que tradujo Javier Smaldone en su &lt;a href="http://blog.smaldone.com.ar/2006/11/17/por-que-uml-no-sirve/"&gt;blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En el blog de Javier Smaldone, hubo una discusión entre el y Fernando Pinciroli.&lt;br /&gt;&lt;br /&gt;Es muy importante ser fríos y objetivos, si bien Javier Smaldone comenta puntos muy ciertos sobre el UML, también cae en el exceso de desprestigiar totalmente no solo a UML sino a RUP.&lt;br /&gt;&lt;br /&gt;Como en uno de los artículos que escribí titulado &lt;a href="http://mundobyte-x.blogspot.com/2010/03/ultima-revision-17-de-marzo-2010.html"&gt;El Fracaso de los proyectos de Software&lt;/a&gt;, apoyado en uno de los artículos más interesantes de Martín Fowler, comento que el modelado en UML debe manejarse con cuidado, pues la idea de "primero modela y luego construyes" encaja perfectamente en la Ingeniería Civil y Mecánica donde la naturaleza de sus problemas son suceptibles de un análisis matemático para determinar el comportamiento de una entidad bajos ciertas circunstancias y esto en definitiva obliga casi a un modelado previo.&lt;br /&gt;Desafortunadamente en el Software la idea de realizar primero un "Diagrama de clases" e invertir mucho tiempo en ello para diseñar una Arquitectura es realmente absurda!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es importante aclarar que no estoy del todo de acuerdo con Javier y Bertrand Meyer, por el contrario, pienso que algunos diagramas UML son útiles siempre y cuando se tomen como una ayuda para aclarar cuestiones de diseño y no como documentación &lt;b&gt;base&lt;/b&gt; del proyecto ya que esto último desvía la atención de las organizaciones en lo que es realmente importante... dejar un valor de negocio al cliente!&amp;nbsp;En breve publicaré la traducción de "&lt;a href="http://queue.acm.org/detail.cfm?id=984495"&gt;La Fiebre del UML&lt;/a&gt;" que hace un tiempo leí.&lt;br /&gt;&lt;br /&gt;Sin más que comentar, lean este artículo, disfrútenlo, diviértanse y sobre todo, tómenlo con mesura, más aún si son estudiantes!&lt;br /&gt;&lt;br /&gt;&lt;iframe height="780" src="http://docs.google.com/viewer?url=http%3A%2F%2Fblog.smaldone.com.ar%2Ffiles%2Fuml%2Fuml_giro_positivo.pdf&amp;amp;embedded=true" style="border: none;" width="650"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-2644180176536316103?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/2644180176536316103/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/04/el-giro-positivo-del-uml.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2644180176536316103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2644180176536316103'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/04/el-giro-positivo-del-uml.html' title='El giro positivo del UML'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-260746030293673549</id><published>2010-03-26T23:07:00.000-07:00</published><updated>2010-03-26T23:07:42.837-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Libros'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Libros: Scrum y TDD</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Pese a que las metodologías ágiles ya tienen más de una&amp;nbsp;década, su uso en latinoamerica no ha sido tan profundo. Una de las principales razones, es la existencia de poco material en español!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Afortunadamente con el afán de promover principios ágiles, se han realizado traducciones de artículos y libros, por ejemplo, uno de ellos es "Scrum y XP desde las Trincheras", un libro obligatorio para todos aquellos que deseen aprender las bases de Scrum y XP de manera práctica! El libro es completamente gratuito!&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.infoq.com/resource/minibooks/scrum-xp-from-the-trenches/en/cover/coverlandingpage.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.infoq.com/resource/minibooks/scrum-xp-from-the-trenches/en/cover/coverlandingpage.JPG" width="210" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches"&gt;http://www.infoq.com/minibooks/scrum-xp-from-the-trenches&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;TDD (Test Driven Development) es una práctica ágil cuya filosofía es desarrollar las pruebas unitarias &lt;b&gt;&lt;i&gt;antes&lt;/i&gt;&lt;/b&gt; de codificar cualquier funcionalidad del negocio! Este es un excelente libro gratuito escrito originalmente en español!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img border="0" height="320" src="http://www.dirigidoportests.com/wp-content/portada.jpg" width="216" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.dirigidoportests.com/el-libro"&gt;http://www.dirigidoportests.com/el-libro&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Ambos libros pueden ser comprados en su versión impresa por un módico precio!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-260746030293673549?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/260746030293673549/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/libros-scrum-y-tdd.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/260746030293673549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/260746030293673549'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/libros-scrum-y-tdd.html' title='Libros: Scrum y TDD'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-7475023377687524667</id><published>2010-03-26T22:25:00.001-07:00</published><updated>2010-03-26T22:44:45.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ing de Software'/><title type='text'>¿Problemas?... Ese no es mi problema!!</title><content type='html'>&lt;div&gt;La burocracia es uno de los problemas existentes en muchas organizaciones, principalmente en Gobierno! Desafortunadamente las empresas privadas no&amp;nbsp;están&amp;nbsp;exentas de esto!&lt;br /&gt;&lt;br /&gt;El siguiente vídeo nos ilustra de una forma cómica lo que ocurre en muchas de las organizaciones! En el desarrollo de software por ejemplo, es muy común encontrarse con programadores egoístas que no comparten su conocimiento y cuando un integrante del equipo de trabajo tiene problemas, no faltara quien se niegue a ayudarle!... &lt;b&gt;"Ese no es mi problema!!" &lt;/b&gt;pensamos rápidamente.&lt;br /&gt;&lt;br /&gt;No solo programadores, sino todos los involucrados en el proyecto de desarrollo, nos corroe la envidia y buscamos únicamente que lo que nosotros hagamos este bien hecho, lo que hace el de al lado o el de frente no nos interesa. Se nos olvida que los objetivos requieren de una responsabilidad compartida y solo esta suma de esfuerzos harán que podamos obtener resultados cuantificables, es decir, metas!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object style="clear: left; float: left; height: 344px; width: 425px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JOhDDSJf-OU"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/JOhDDSJf-OU" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-7475023377687524667?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/7475023377687524667/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/problemas-sencillos-soluciones.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/7475023377687524667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/7475023377687524667'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/problemas-sencillos-soluciones.html' title='¿Problemas?... Ese no es mi problema!!'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-8763016413595051775</id><published>2010-03-15T09:28:00.000-07:00</published><updated>2010-03-29T19:48:48.964-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ing de Software'/><title type='text'>El Fracaso en los Proyectos de Software</title><content type='html'>&lt;b&gt;Última revisión: 17 de Marzo 2010&lt;/b&gt;&lt;br /&gt;Antes de comenzar, debo aclarar que yo no tengo nada en contra de las metodologías tradicionales, al contrario, creo que su aplicación es muy eficiente en algunos tipos de proyectos, pero sin duda en la mayoría de proyectos empresariales, han demostrado ser ineficientes. Por esta razón, debemos dar una mirada a una nueva alternativa que lleva utilizándose con éxito en Europa desde hace más de 10 años!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esta serie de articulos bajo el nombre “El fracaso en los proyectos de Software” es simplemente una recopilación de ideas que muchos expertos realmente involucrados en el desarrollo de software han vertido durante los últimos años:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.threeriversinstitute.org/Kent%20Beck.htm"&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;Kent Beck con su eXtreme Programming&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.poppendieck.com/"&gt;Mary Poppendieck con sus principios de Lean Software Development&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.craiglarman.com/wiki/index.php?title=Main_Page"&gt;Craig Larman con la utilización del RUP Ágil&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jeffsutherland.com/"&gt;Jeff Sutherland con su Scrum&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ambysoft.com/scottAmbler.html"&gt;Scott Ambler con su trabajo Ágile en IBM&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://martinfowler.com/"&gt;Martín Fowler por su Analysis Patterns, UML Distilled, Refactoring, and Planning Extreme Programming&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Y a tantas otras personas que directa o indirectamente han influido en la filosofía ágile. (&lt;a href="http://agilemanifesto.org/authors.html"&gt;ver&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Esta primera parte, da solamente un acercamiento del entorno actual en el que se vive en muchas partes del mundo, principalmente, en México. En la segunda parte que comenzaré a escribir en breve, hablaré más especificamente sobre la filosofía de las metodologías ágiles y sus bondades.&lt;br /&gt;Durante mi corta experiencia, he podido ver muchos Sistemas de Software de mediana escala con una calidad increíblemente pobre, con un mantenimiento que resulta un tormento y un tiempo de desarrollo cada vez más corto. Cuando lo anterior no sucede, el proyecto se termina, pero no cumple con las expectativas del cliente y termina siendo muy poco utilizado. Por ejemplo, una de las casas de préstamo de efectivo en México recientemente ha iniciado un nuevo proyecto para migrar su sistema de cobranza en .NET a una plataforma Java! Indudablemente la razón de esta migración no es por que .NET se haya quedado “corto”, más bien habla de una pésima aplicación que a estas alturas ya es inmantenible por su terrible calidad, derivado de una mala administración!&lt;br /&gt;&lt;br /&gt;El fracaso de estos proyectos se atribuye a diferentes perspectivas, desde un nivel meramente técnico (personal mal capacitado), hasta una mala visión de negocio entre los niveles gerenciales. Mi intensión en este artículo no es hablar sobre los errores o aciertos que cometen los niveles gerenciales ya que en estos momentos no tengo injerencia en este campo por mi nula experiencia, así que me enfocaré más al problema derivado de una mala Ingeniería de Software y abrir la pregunta que Tom DeMarco lo plantea en uno de sus artículos…. &lt;a href="http://www2.computer.org/cms/Computer.org/ComputingNow/homepage/2009/0709/rW_SO_Viewpoints.pdf"&gt;&lt;span class="Apple-style-span" style="color: #274e13;"&gt;La Ingeniería del Software es ¿Una idea obsoleta?&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Esta serie de artículos, involucran a estudiantes y académicos y a profesionistas del mundo laboral.&lt;br /&gt;A los estudiantes, para que conozcan lo que se viene trabajando en reino unido y países europeos con éxito desde hace más de 10 años. Además con esto espero que sepan que no todo en la vida de los sistemas es un conjunto de tablas, relaciones, frameworks y lenguajes de programación! Quienes me conocen, saben muy bien que mi formación ha sido eminentemente técnica, así que en definitiva no podrán decir que me intereso en este tipo de proyectos por que “no se programar”.&lt;br /&gt;&lt;br /&gt;Al sector académico es una llamada de atención para que dejen a un lado sus ideas obsoletas sobre la Administración de Proyectos de Software, se haga una revisión a las retículas académicas y se actualice a la planta docente. Es hora de que los catedráticos sepan que hay otras cosas que el modelo en cascada (muchos ni siquiera enseñan algo de RUP) y peor aún ¿Por qué seguimos perdiendo el tiempo en hacer que el alumno domine un Microsoft Project para hacer bonitos pero inútiles diagramas de Gantt? Es hora que el sector académico se pregunte ¿Realmente todas estas prácticas están agregando un valor real al producto?… En México la educación es obsoleta, mientras en otras partes del mundo se enseña PSP/TSP, RUP, Ágile, Testing, etc., en México seguimos encerrados con nuestros diagramas de flujo, diagramas de contexto, y tantas otras prácticas obsoletas. Mi antipatía por el sector académico siempre ha sido notoria para todos aquellos que me conocen en persona y he sido un crítico muy duro con ellos. Yo mismo he vivido la ineptitud de muchos catedráticos, mi asesor de titulación quería diagramas de flujo y de contexto argumentando que los Casos de Uso eran para personas técnicas y no para los usuarios!!! Lo más triste era ver que se encontraba en el departamento de Posgrado pues era un Maestro en Ciencias!&lt;br /&gt;&lt;br /&gt;Finalmente, a los profesionistas de hoy, a los desarrolladores que aún no conocen a los métodos ágiles, es seguro que ustedes estarán con muchas cosas de acuerdo.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Sin más que esperar una mentalidad abierta por parte de ustedes lectores, es hora de ver algunas de las razones por la que los proyectos de Software fracasan y ver bajo una filosofía agile una alternativa, aunque no &amp;nbsp;necesariamente una solución completa a los problemas existentes en el desarrollo de SW, pero Ágile puede influenciar aún más los conceptos de la Ing de Software tradicional!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;SITUACIÓN ACTUAL&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;&lt;br /&gt;&lt;/span&gt;En el año 2006, John Avellanet utilizó un estudio realizado por Accenture para establecer los puntos necesarios que se requieren para alcanzar el éxito de un proyecto. Los datos sobre el entorno en el desarrollo de proyectos de TI era desalentador, desafortunadamente del 2006 a la fecha, las cosas no han cambiado en mucho.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Solo el 27% de los proyectos de TI puede ser considerado un éxito.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Los proyectos de TI sobrepasan su costo en un 56%.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Se estima que los proyectos sobrepasan su calendario en un 84%.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;El 31.1% de los proyectos son cancelados antes de que sean terminados.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;Lo anterior son números rojos alarmantes, que sin embargo, no son nada nuevos , estos números han existido desde un inicio.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Este proyecto es extremadamente importante.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;No hay calendario, ni guias, ni el personal necesario…&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Y su fecha de entrega es mañana!! Así que esta es su oportunidad&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;de impresionar realmente a todos!&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://mundobyte.hostjava.net/imagenes/parodia_proyecto.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://mundobyte.hostjava.net/imagenes/parodia_proyecto.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;CAUSAS DE TAN DESALENTADOR PANORAMA&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;&lt;br /&gt;&lt;/span&gt;Las causas son diversas. El Dr. Daniel Tapia, Profesor Investigador del Centro de Investigación en Tecnologías de la Información (&lt;a href="http://www.uaeh.edu.mx/investigacion/sistemas/"&gt;CITIS&lt;/a&gt;) de la Universidad Autónoma del Estado de Hidalgo, atribuye el fracaso de un proyecto de TI a las siguientes razones;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Se daba mayor atención a las cuestiones operativas que a la planificación.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Planeación deficiente.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Los objetivos del proyecto no estaban alineados con los objetivos de la organización.&amp;nbsp;&lt;/li&gt;&lt;li&gt;El entorno global hace que la planeación tradicional ya no sea suficiente.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Una mera planificación de actividades y recursos no sirve de nada.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Se requiere una gestión estratégica.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Existen puntos interesantes en las presentaciones del Dr. Tapia que recomiendo leer (ver al final de este artículo), aunque en algunas cuestiones, no concuerdo del todo, como por ejemplo donde hace mención que se requieren procesos bien definidos y una documentación extensa. Fuera de esto, el Dr. Tapia concluye que un simple enfoque de Ing. de Software ya no es suficiente, lo cuál es extremadamente cierto, sin embargo, en este artículo nos enfocaremos en dicho aspecto.&lt;br /&gt;A los puntos anteriores, voy a agregar uno que seguramente puede ser causa de polémica por ser tan directo y acusador.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Durante muchos años, el sector académico ha tenido erróneamente mucha injerencia en el desarrollo de software cuando su papel no es precisamente ser el protagonista en este ámbito. Las universidades estan más interesadas en crear pequeñas fábricas de software, que en preparar de forma adecuada a los alumnos. Las empresas por su parte, se están enfocando en capacitar en cuestiones básicas a los alumnos que egresan en lugar de desarrollar software, es decir, los papeles se estan invirtiendo!! Las universidades están desarrollando software y las empresas están capacitando!!.&lt;br /&gt;&lt;br /&gt;Hace poco más de un año, escuche al Director General de &lt;a href="http://www.quarksoft.net/"&gt;QuarkSoft&lt;/a&gt;, Cesar Montes de Oca, decir todo lo anterior! Ellos como empresa tenían que capacitar a los recién egresados sobre temas tan sencillos como realizar una simple conexión a base de datos con Java! Sin duda que algo muy pero muy grave esta fallando con las Universidades, pero bueno, afortunada o desafortunadamente no es tema de análisis en este estudio.&lt;br /&gt;&lt;br /&gt;Grandes universidades que sin duda han hecho grandes aportes a la Ing. del Software, como por ejemplo la &lt;a href="http://www.cmu.edu/index.shtml"&gt;University Carnegie Mellon&lt;/a&gt; (en conjunto con el &lt;a href="http://www.sei.cmu.edu/"&gt;SEI&lt;/a&gt;), han desarrollado varios de los modelos y procesos para el desarrollo de Software como por ejemplo (CMM/CMMI, PSP/TSP., etc., “Avances” mismos que al día de hoy han demostrado ser ineficientes para la mayoría de los casos reales. Aquí en México por ejemplo, se ha creado MoProSoft como un modelo de desarrollo de software para las empresas mexicanas, modelo que ha sido lidereado por la Dra. Hanna Oktaba, académico del IMAS en la UNAM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es importante hacer un pequeño paréntesis y aclarar todo lo anterior para no crear malos entendidos. El sector académico ha hecho no solamente grandes aportes, más bien ha hecho todos los aportes de la actualidad en cuanto a las Ciencias Computacionales [Ver Ing de Software de Ian Somerville para una diferencia entre las Ciencias Computacionales y la Ing de Software]. Debemos agradecer a nuestros maestros de la universidad por enseñarnos aquellas estructuras de datos, por hacernos entender el algoritmo de Dijkstra, por explicarnos la notación O, por aquellos difíciles proyectos en lenguaje ensamblador y por aquellas Series de Fourier, etc., sin embargo, han olvidado que mucho de su trabajo es eminentemente teórico que puede demostrarse y realizarse en laboratorios, pero un proyeto de desarrollo de software no puede ser simulado y demostrado fácilmente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;&lt;b&gt;¿Cuál es el problema de las Metodologías actuales?&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;La filosofía que siguen los métodos formales están basados en procesos aplicados en otras ingenierías como la ingeniería civil y mecánica en donde se requiere una planeación detallada antes de construir! Este es el punto medular de este artículo… “La planeación detallada“… &lt;a href="http://martinfowler.com/articles/newMethodology.html"&gt;Martín Fowler&lt;/a&gt; un verdadero gurú a nivel mundial, escribió un muy interesante y famoso artículo donde habla sobre “La nueva metodología” y da unas pautas generales que describen el error de las metodologías tradicionales y los aciertos que han tenido las metodologías ágiles.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Ha sido un error tomar casi al pie de la letra la filosofía de otras ingenierías y aplicarlas al desarrollo de software. En la ingeniería civil por ejemplo, los problemas importantes son suceptibles de un &lt;b&gt;análisis matemático&lt;/b&gt; que determina por ejemplo, la fuerza a aplicar a ciertos elementos, la resistencia de los materiales, etc. En pocas palabras, los métodos que se utilizan en otras ingenierías son “predictivos” [entiéndase por predictivo que es posible "predecir" el comportamiento de un Sistema bajo ciertas condiciones]y funcionan muy bien en ese ámbito. Sin embargo, en el mundo del desarrollo de software comercial, ¿Como es posible predecir un cambio de requerimientos? ¿Es posible predecir la duración de un proyecto?… Muchas personas podrían argumentar que si es posible predecir lo anterior, quizá sí, pero no bajo modelos matemáticos como en otras ingenierías y por ende esta filosofía debería desecharse.&lt;br /&gt;&lt;br /&gt;Lamentablemente, esta predicibilidad es muy usada en procesos tales como el PSP [Ver Personal Software Process del Dr. Watts Humprhey] , en donde debes ir haciendo todo un registro de tus tiempos, de tus distracciones, e ir sacando promedios de cada actividad a la que te dedicas para que de esta forma, en actividades similares posteriores, puedas predecir el tiempo que llevaras en construir cierto componente de software, aunado a esto, toda una serie de procesos formales intentan mejorar tu productividad y calidad en tus desarrollos. Los principios del PSP pueden ser aun muy discutidos, yo mismo me encuentro aún valorando sus bondades en ciertos tipos de proyectos.&lt;br /&gt;&lt;br /&gt;Las metodologías tradicionales, al ser meramente predictivas, dicen que debemos hacer una toma completa y detallada de requerimientos al iniciar un proyecto, posteriormente asentar en documentos y diagramas UML la arquitectura del sistema a utilizar, después comenzar la construcción del sistema y finalmente una etapa de pruebas. Nótese la gran similitud con la ingeniería civil, en donde primero se diseña y después se construye!&lt;br /&gt;&lt;br /&gt;Cuando se trabaja con metodologías tradicionales, existe una resistencia nativa al cambio. Las personas que trabajan en el proyecto se resisten a cualquier cambio de requerimientos, cosa contraria a lo que pasa con los métodos ágiles, en donde se piensa que los cambios son bienvenidos, se trata sencillamente de convivir con ellos y transformar una debilidad en una fortaleza.&lt;br /&gt;La toma de requerimientos tradicional, indica hacer una detallada documentación y casos de uso donde se plasmen los requerimientos. Hoy en día ya sabemos que un desarrollo iterativo es mejor, en donde al inicio del proyecto se de solo un panorama general de todo lo que el usuario quiere y en cada iteración se desglosen un poco más los requerimientos.&lt;br /&gt;&lt;br /&gt;El diseño de una arquitectura antes de la codificación es otro problema fundamental! Teóricamente lo anterior suena bien e incluso lógico, pues a final de cuentas, esto mismo se hace en otras ingenierías! Pero la práctica nos ha demostrado que el definir una arquitectura anterior a la codificación resulta muy problemática a la hora de codificar. La filosofía agile, nos indica que la mejor arquitectura que podemos definir en un inicio son cuestiones generales como la plataforma de programación, la BD y los frameworks que utilizaremos, pero la arquitectura detallada, ira fluyendo durante la codificación!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La etapa de pruebas es un asunto discutido. Por un lado, los tradicionalistas opinan que debe haber un equipo aparte del equipo de desarrollo que se encargue de probar el sistema, además de esto, nos indica que la etapa de pruebas se realiza al final de la etapa de codificación! En el lado ágil, tenemos que no existe un equipo aparte del equipo de desarrollo, los desarrolladores son y deben ser los mejores testers, además de esto, la práctica de TDD, nos dice que primero debemos crear la prueba unitaria antes de crear el módulo! Es decir, debemos crear primero una prueba unitaria para algo que aun no existe!! Esto es raro al inicio, pero aporta muchas ventajas!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0c343d;"&gt;El error de las personas que practican metodologías tradicionales&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Son muchos los errores que siguen los project manager tradicionales. Desde el hecho de que las empresas gastan o se desviven en piratear licencias de sofisticados programas para elaborar diagramas de Gantt y hacer un detallado calendario de todo el proyecto con fechas de entrega, personas que realizarán cada una de las tareas y/o módulos existentes, plan de trabajo que desarrollo una noche antes el departamento de ventas para poder vender un proyecto de miles de pesos etc., hasta el hecho de designar un equipo especializado en “pruebas de software” que sea diferente al del equipo de desarrollo que realizará las pruebas al software en base a un detallado análisis en casos de uso de 100 páginas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Otro error que cometen frecuentemente los administradores de proyectos es,&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Yo Administrador de Proyectos, soy el único que puede dialogar con el cliente! Tu programador, tienes prohibido hablar con el cliente de cosas relacionadas con el proyecto, cualquier duda que tengas en los requerimientos debes dirigirte a mi, cualquier duda que tenga el cliente en la estimación de tiempo debes indicarle que se dirija conmigo.&lt;/blockquote&gt;Acaso al construir una casa, el maestro de obra habla con nuestros papás en lugar de hablar directamente con nosotros que somos los clientes??&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Algo más irónico es por ejemplo, cuando una vez que el departamento de ventas diseñó nuestro plan de trabajo y decidió que nos llevaríamos 2 días en construir la interfaz que comunicaría nuestro módulo de consultas de proveedores externos con la tabla que existe en DBASE y que la transmición de datos se haría mediante un certificado digital de seguridad web SSL, además claro esta, de tener la opción de enviar un correo electrónico a los directivos cuando el monto de las facturas exceda el monto planeado que se tiene en SAP. Una vez que en la primer reunión que tuvo el depto de ventas con el cliente y entrego dicho plan de trabajo, el cliente quedo asombrado ante la rapidez de desarrollo y le dijo al departamento de ventas que entonces comenzaran ese mismo día con el proyecto! Entonces el departamento de ventas, corre inmediatamente a darle la excelente noticia al equipo de desarrollo que tiene 2 días para mostrar un primer entregable, que de el plan de trabajo y las estimaciones de tiempo, que ya ni se preocupen, que ellos muy amablemente ya lo hicieron por nosotros!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entonces el equipo de desarrollo, manda rápidamente a su analista estrella a la toma de requerimientos. Este llega al siguiente día con unas 30 hojas de las cuales unas 25 contiene información redundante! Entonces el equipo de desarrollo tiene ya solamente 1 día para terminar el primer entregable!!!!&lt;br /&gt;&lt;br /&gt;Lo anterior, obviamente es una descripción subjetiva que no esta muy alejado de la realidad. Por un lado, tenemos a muchosStakeholder como el cliente, el depto de ventas, gerencia, etc., que piensa que hacer software es como manufacturar algo o hacer enchiladas, que en cuestión de horas estará listo para funcionar!!&lt;br /&gt;&lt;br /&gt;Por otro lado, tenemos a métodos formales que nos exigen hacer una detallada toma de requerimientos en extensos casos de uso y más importante aún, estar persiguiendo al cliente para que firme dichos requerimientos y así “asegurar” que estos no cambien en un futuro y si cambian entonces tenemos a un “cliente que no sabe lo que quiere” y nos negaremos a realizar el cambio y si lo realizamos, será con un costo adicional sobre lo planeado. Por si esto fuera poco, se nos ha enseñado que antes de iniciar la etapa de codificación, debemos elaborar una detallada arquitectura del sistema y plasmarla en muchos diagramas UML y documentos que puedan servir como referencia “más adelante”.&lt;br /&gt;&lt;br /&gt;Esta idea de una Arquitectura detallada y modelado UML, funciona bien en la Ingeniería Civil, pero no en el desarrollo de software… Incluso, el hecho de que muchos catedráticos piensen que el UML es la octava maravilla del mundo, es debido a que los diseños en papel o en una herramienta UML son consistentes y se ven bien! De la misma forma en el mundo real y productivo, los diseños UML en un principio parecen ser correctos y el modelo parece ser lo suficientemente bueno para generar una buena arquitectura, pero los problemas surgen a la hora de la codificación, y es cuando vemos que los diagramas UML solo nos han servido para perder el tiempo!! Cuando lo anterior pasa, es entonces que vociferamos a todo mundo que el cliente tiene la culpa por no saber lo que quiere, que nuestro analista no “predijo” como si lo hubiera hecho Walter Mercado lo que el cliente iba a querer más adelante y que nuestro arquitecto de software no supo diseñar una arquitectura escalable y preparada para el cambio!! Y es que aún si suponemos un modelo exitoso con UML, el constante cambio de requerimientos hará que sucedan dos cosas posibles:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Se actualiza toda la documentación existente y además se procede con dicho cambio a nivel de codificación. Al actualizar los cientos de documentos existentes y dejarlos actualizados y acorde a los nuevos requerimientos, hemos perdido tiempo valioso en aquello que realmente aporta un valor o ventaja competitiva a nuestro cliente! Por lo tanto, ya tenemos un retraso de más de un 50% y no entregaremos a tiempo la funcionalidad o si la entregamos, estará llena de errores por la premura del tiempo.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Dejamos de lado la documentación y nos enfocamos a lo que realmente aporta un valor al cliente! Desafortunadamente, a mitad del proyecto, este enfoque resulta triste, ya que hemos perdido la mitad de tiempo en elaborar documentación que, conforme el proyecto fue avanzando y evolucionando ha quedado obsoleta y ya no sirve de “base” para el mantenimiento del sistema, pues lo que comenzó como un simple sistema de facturación, terminó acercándose más a lo que es un ERP. Finalmente, la documentación pasa a ser un bonito recuerdo!&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;No faltara quien a estas alturas pueda argumentar algo a favor del modelado detallado en UML y pueda decir:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;“Uhmm, pero un diagrama de clases o de componentes, nos da una visión general de la estructura del sistema y esto es muy útil para saber como interactuan los componentes del sistema, así que es necesario realizar estos diagramas. Además los diagramas de despliegue por ejemplo son muy útiles cuando tratas con un cliente técnico.”&lt;/blockquote&gt;&lt;br /&gt;Lo anterior, es una idea desesperada por encontrarle un sentido a la existencia del modelado excesivo en UML. Bastaría hacer un refactoring a nuestro código fuente para obtener un diagrama siempre actualizado de clases o de componentes del sistema! Y todo en cuestión de minutos!!… ¿Para que perder el tiempo diseñando y planeando algo de naturaleza intangible que con el tiempo irá cambiando y evolucionando? Ahora bien, no todo en el UML es malo, los diagramas de despliegue por ejemplo son útiles, los diagramas de actividades son una versión más bonita de los diagramas de flujo, en un momento dado podrían ser útiles 2 o 3 diagramas de secuencia, etc. El punto aquí es el “exceso” que se comete con UML.&lt;br /&gt;Aunado a lo anterior, todavía podemos decir mucho más….&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Los líderes y clientes, piensan que el hacer software es tan sencillo y rápido como introducir una fórmula en excel, por esto mismo, obligan a los desarrolladores a trabajar jornadas mayores a las 8 horas!&amp;nbsp;&lt;/li&gt;&lt;li&gt;Los líderes de proyecto no están dispuestos a perder su autoridad! Es común que en los equipos, siempre exista una autoridad que tome todas las decisiones [programadores extrella, líderes absolutos]. Cuando un desarrollador sugiere o habla algo con el cliente, el líder siente perder autoridad, reacciona y entonces prohíbe una comunicación con el cliente!&amp;nbsp;&lt;/li&gt;&lt;li&gt;Los equipos de trabajo siempre están a la espera de recibir órdenes, a que se les asigne una tarea, muchas veces a que se les diga como hacerla, etc. Mientras en la forma tradicional perdemos el tiempo esperando recibir ordenes, en las metodologías ágiles se fomenta a equipos auto-dirigidos!&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0c343d;"&gt;¿Es importante estar certificado en una norma ISO, CMM/CMMI/, MoProSoft, etc?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Muchas empresas no ven lo anterior como una posibilidad para realizar un cambio y mejora en sus procesos, en vez de eso, lo ven como algo superficial del cual pueden alzar el cuello y presumir ante sus clientes que tienen una certificación ISO xxxx-xxxx y que entonces son la mejor opción ya que sus competidores hacen software basura y ellos al tener una ISO, hacen desarrollos de calidad!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Yo mismo he vivido lo anterior. En mi primer trabajo profesional que tuve en el desarrollo de software, yo aún era estudiante y me toco vivir como la empresa para la que trabajaba, se preocupaba más por dar a conocer a los clientes que se contaba con la certificación MoProSoft nivel 1, cuando internamente no se conocía muy bien la forma de aplicar efectivamente dicho modelo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;El presidente de la empresa, siempre aseguraba que no podíamos presumir nuestras miserias al cliente! Ciertamente algo muy cierto, el problema era que nunca se preocupo por hacer un verdadero cambio de fondo. Pero bueno, el asunto original es si realmente es importante estar certificado en alguna de las anteriores normas y procesos formales para tener éxito en el desarrollo de software! Me permito citar nuevamente al Dr. Tapia:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;No existe interés por métodos formales de aseguramiento de la calidad del software. Las empresas mexicanas están más preocupadas por conseguir la certificación de sus procesos con un distintivo de calidad, aunque dicha certificación no garantice la satisfacción de sus clientes.&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;Finalmente&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;…&lt;br /&gt;Para terminar esta primera parte del artículo “El fracaso en los proyectos de Software”, debemos sacar las concluciones más relevantes.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Los métodos tradicionales, siguen un enfoque utilizado en otras ingenierías como la Ingeniería Civil y Mecánica, en donde, sus problemas son susceptibles a un análisis matemático que determinará el comportamiento de un sistema bajo ciertas condiciones. En el desarrollo de software, no es posible determinar con exactitud el comportamiento de los sistemas de software.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Los métodos tradicionales y las personas que trabajan con ellos, siguen un riguroso esquema, en donde se aleja mucho al equipo de desarrollo y al cliente. El desarrollo ágil fomenta la comunicación desarrollador/cliente e invita al cliente a ser parte del equipo, mientras que los tradicionalistas sostienen que el líder de proyecto debe ser el responsable de hablar con el cliente.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Cuando los proyectos fracasan, se cree que todavía debe agregarse una capa más detallada de procesos aún más formales y definidos, de planes aún más detallados, de más documentación, de más juntas de 3 horas, de una mayor vigilancia al equipo de desarrollo y de más horas de trabajo, cuando en realidad los principios deben ser muy sencillos. [ver el artículo de Emilio Osorio]&amp;nbsp;&lt;/li&gt;&lt;li&gt;Las empresas se preocupan más por tapar hoyos superficiales, por presentar un mundo de caramelo en sus desarrollos con el cliente y de obtener certificaciones aunque no entiendan como aplicarlas.&amp;nbsp;&lt;/li&gt;&lt;li&gt;En muchas empresas, la gerencia toma decisiones que no le corresponden y debe dejarlas a los verdaderos expertos. Muchas veces son estos niveles los que fijan el costo de un proyecto de software y la duración del mismo. Cuando menos lo esperamos, ya nos entregan un plan de desarrollo con fechas ya establecidas!.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Durante más de 10 años, los métodos formales no han dado tantos resultados positivos. Lo preocupante de esto, es que al no dar los resultados esperados, día a día se piensa en agregar más formalidad y rigidez a su proceso. Los métodos ágiles tampoco son la solución a todos los problemas, pero si dan unas buenas pautas para reformular las actuales ideas de la Ingeniería de Software.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;En la segunda parte de este artículo, comenzaremos a ver a la filosofía de los métodos ágiles y veremos en ellos una mejor herramienta para tratar de resolver los problemas actuales en la administración y desarrollo de software.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Visita el blog próximamente para leer la segunda parte que será mucho más interesante! No olvides vertir tus comentarios que serán muy útiles para enriquecer este artículo! Tanto si eres un estudiante con o sin experiencia, un académico dando o no dando clases de Ing de Software, o un profesionista desarrollador o líder de proyecto! Todos los comentarios, buenos o malos, pero constructivos, son bienvenidos!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;REFERENCIAS BIBLIOGRÁFICAS&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;span class="Apple-style-span" style="color: black; font-size: medium; font-weight: normal;"&gt;&lt;a href="http://www2.computer.org/cms/Computer.org/ComputingNow/homepage/2009/0709/rW_SO_Viewpoints.pdf"&gt;Software Engineering: An Idea Whose Time Has Come and Gone? – Tom DeMarco&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.articlesnatch.com/Article/Six-Rules-For-Great-It-Project-Success/68293"&gt;Six Rules For Great It Project Success. – John Avellanet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://martinfowler.com/articles/newMethodology.html"&gt;The New Methodology – Martín Fowler&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mundobyte.hostjava.net/downloads/IngSoftware/DPSLectura2.pdf"&gt;Desarrollo y Gestión de Proyectos – Dr. Daniel Tapia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sg.com.mx/sg07/presentaciones/Mejora%20de%20procesos/SG07.P04.AgilMexico.pdf"&gt;Lean Development en México – Emilio Osorio&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tecnonirvana.org/blog/2007/07/15/libera-tus-proyectos-con-lean-software-development/"&gt;Libera tus Proyectos con Lean Software Development – Emilio Osorio&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ivoox.com/podcast-podcasts_sq_f12397_1.html"&gt;PODCAST sobre temas ágiles – Open Knowledge Scrum Manager&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="list-style-type: initial;"&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-8763016413595051775?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/8763016413595051775/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/ultima-revision-17-de-marzo-2010.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8763016413595051775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8763016413595051775'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/ultima-revision-17-de-marzo-2010.html' title='El Fracaso en los Proyectos de Software'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-8927170527248092075</id><published>2010-03-10T21:14:00.000-08:00</published><updated>2010-03-26T21:34:54.176-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>Métodos de Ordenación de forma concurrente</title><content type='html'>&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;En mi blog anterior, publique en el 2008 un&amp;nbsp;&lt;a href="http://mundobyte.wordpress.com/2008/02/18/metodos-de-ordenacion-de-forma-concurrente" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;artículo&amp;nbsp;&lt;/a&gt;sobre la ordenación de un arreglo de números aleatorios mediante 3 métodos: QuickSort, Burbuja e Inserción. Pero estos métodos se ejecutaban de forma concurrente mediante Threads. En ese tiempo, no se la razón por la cual no subi el código fuente y mucha gente lo solicito en los comentarios de dicho artículo!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;&lt;img alt="" class="alignleft" height="277" src="http://mundobyte.files.wordpress.com/2008/02/ordenacion3.png" style="background-color: #eeeeee; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 10px; margin-top: 0px; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px;" width="368" /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;&lt;img alt="" class="alignnone" height="277" src="http://mundobyte.files.wordpress.com/2008/02/ordenacion4.png" style="background-color: #eeeeee; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; margin-left: 0px; margin-right: 10px; margin-top: 0px; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px;" width="368" /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Pongo aquí el código fuente para su&amp;nbsp;&lt;a href="http://mundobyte.hostjava.net/downloads/Java/OrdenamientoConcurrente.rar" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_self"&gt;descarga&lt;/a&gt;!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-8927170527248092075?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/8927170527248092075/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/metodos-de-ordenacion-de-forma.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8927170527248092075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/8927170527248092075'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/metodos-de-ordenacion-de-forma.html' title='Métodos de Ordenación de forma concurrente'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-3827235185091994537</id><published>2010-03-09T21:19:00.000-08:00</published><updated>2010-03-26T21:35:05.867-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Matemáticas'/><title type='text'>Números palindrómicos</title><content type='html'>&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;En&amp;nbsp;&lt;a href="http://projecteuler.net/" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;projecteuler.net&lt;/a&gt;&amp;nbsp;se ofrece el siguiente problema:&lt;/div&gt;&lt;blockquote style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Un número palindrómico se lee de la misma forma en ambos sentidos. El palíndromo más grande a partir del producto de dos números de 2 dígitos es 9009 = 91 x 99.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Encontrar el palíndromo más grande a partir del producto de dos números de 3 dígitos.&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;A continuación les planteo la solución original que yo hice antes de acertar a la respuesta y poder ver la solución que se plantea en la misma página una vez resuelto el problema!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public Set calcularPalindromosNumerico(Integer min, Integer max){&lt;br /&gt;        Set &amp;lt;Integer&amp;gt;listaPalindromos = new HashSet&amp;lt;Integer&amp;gt;();&lt;br /&gt;        for(int i = min; i &amp;lt;= max; i++ ){&lt;br /&gt;            for(int j = min; j &amp;lt;= max; j++){&lt;br /&gt;                Integer res = j*i;&lt;br /&gt;                if(isPalindromo(res))&lt;br /&gt;                    listaPalindromos.add(res);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return listaPalindromos;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Lo primero que cabe resaltar en el método anterior es que utilizamos una clase “&lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Set.html" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;Set&lt;/a&gt;” con el único propósito de no almacenar resultados repetidos (100*110 y 110*100 por ejemplo) [Recordamos que la clase Set no almacena datos duplicados]. Lo segundo que hay que notar es que el método recibe objetos envoltorio&amp;nbsp;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;Integer&lt;/a&gt;. Esto es así ya que la lista que contendrá los números palindrómicos no estará ordenada y usaremos al método estático “sort” de la clase&amp;nbsp;&lt;a href="http://java.sun.com/javase/6/docs/api/java/util/Arrays.html" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;Arrays&amp;nbsp;&lt;/a&gt;para ordenar dicho arreglo, pero para que lo anterior funcione, los elementos a ordenar deben implementar a la Interfaz&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;Comparable&lt;/a&gt;&amp;nbsp;según nos lo indica la documentación de la clase Arrays, así pues, los envoltorios de los tipos primitivos implementan a esta interfaz y es por ello que el método recibe objetos Integer en lugar de int.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Por último, creamos otro método que permita validar si un número es palindrómico.&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public boolean isPalindromo(int numero){&lt;br /&gt;        String palindromo = ReverseString.reverseIt(&lt;br /&gt;                String.valueOf(numero));&lt;br /&gt; &lt;br /&gt;        if(numero == Integer.parseInt(palindromo))&lt;br /&gt;            return true;&lt;br /&gt;        else&lt;br /&gt;            return false;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ReverseString es una clase que podemos encontrar aquí&lt;br /&gt;Lo único que nos resta hacer es crear el método main que nos permita comprobar el resultado:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public static void main(String []args){&lt;br /&gt;        Palindromo palindromo = new Palindromo();&lt;br /&gt;        Object[] listaPalindromos = palindromo.calcularPalindromosNumerico&lt;br /&gt;                                (100,999).toArray();&lt;br /&gt; &lt;br /&gt;        Arrays.sort(listaPalindromos);&lt;br /&gt;        for(Object i : listaPalindromos){&lt;br /&gt;            System.out.println(i);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El 100 y 999 que se pasan como argumentos al método, esta claro que es el primero y último número de 3 cifras que existen!&lt;br /&gt;De esta forma, obtenemos que el palíndromo más grande resultado de la multiplicación de dos números de tres cifras es: 906609&lt;br /&gt;En la misma página de project euler , se proporciona un PDF con el algoritmo que da solución al problema! Pero este PDF solo lo podremos ver una vez que hayamos acertado a la respuesta!&lt;br /&gt;Como complemento, para hallar números palindrómicos, existe el 196-Algorithm que pueden revisar como lectura adicional!&lt;br /&gt;Saludos!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-3827235185091994537?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/3827235185091994537/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/numeros-palindromicos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/3827235185091994537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/3827235185091994537'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/numeros-palindromicos.html' title='Números palindrómicos'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-2599871614844878131</id><published>2010-03-07T21:24:00.000-08:00</published><updated>2010-03-26T21:35:17.816-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Matemáticas'/><title type='text'>Project Euler: Matemáticas y Programación</title><content type='html'>&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;&lt;a href="http://projecteuler.net/" style="color: #0989ae; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;&lt;img alt="" class="alignleft" height="158" src="http://projecteuler.net/images/euler_main.jpg" style="background-color: #eeeeee; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; float: left; margin-bottom: 0px; margin-left: 0px; margin-right: 10px; margin-top: 0px; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px;" title="Euler" width="136" /&gt;&lt;/a&gt;Project Euler es una página que consta de más de 200 problemas matemáticos, que por su dificultad en el número de operaciones y cálculos, no son posibles de resolver sin la ayuda de la programación!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Hace 2 días&amp;nbsp;recién&amp;nbsp;me inscribí, así que al día de escribir esta entrada, solo llevo 5 ejercicios resueltos! Desde luego que he iniciado con los más fáciles!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Lo interesante de esto es que para entrar a un nivel “novice” debes tener entre 100 a 149 problemas resueltos! De lo contrario, estarías en el nivel 1 o 2 los cuales no son tan válidos, ya que si en un lapso de 60 días no resuelves ningún problema, desapareces del record! El nivel 3 es el nivel “novice” y en este nivel es cuando ya puedes quedar inmortalizado en el score sin importar el tiempo que ha pasado desde la última vez que resolviste un problema!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Para muestra del tipo de ejercicios, he aquí el primero que resolví el cual es un verdadero regalo!&lt;/div&gt;&lt;blockquote style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;&lt;strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9.&amp;nbsp;The sum of these multiples is 23.&amp;nbsp;Find the sum of all the multiples of 3 or 5 below 1000.&lt;/strong&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;pre class="java" name="code"&gt;public class Multiplo {&lt;br /&gt;    public int sumarMultiplos(int rango, int numeroUno, int numeroDos){&lt;br /&gt;        int suma = 0;&lt;br /&gt;        for(int i = 1; i&lt;rango (i%numerodos)="=" (i%numerouno)="=" +="" +suma);="" 0){="" 0="" 3,5);="" ;="" []args){="" es:="" i++){="" i;="" if(="" int="" m="new" main(string="" multiplo();="" multiplo="" public="" return="" static="" suma;="" suma="suma" system.out.println("la="" void="" ||="" }=""&gt;&lt;/rango&gt;&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Como ven, se trata de un problema bastante sencillo! Estaré poniendo en este blog todos los problemas que vaya resolviendo! Aunque solo lo hago cuando tengo por ahí un tiempo libre!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;&lt;strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Saludos!!&lt;/strong&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-2599871614844878131?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/2599871614844878131/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/project-euler-matematicas-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2599871614844878131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2599871614844878131'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/project-euler-matematicas-y.html' title='Project Euler: Matemáticas y Programación'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-9128323540659691477</id><published>2010-03-07T21:23:00.000-08:00</published><updated>2010-03-26T21:35:39.408-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DB4O'/><title type='text'>DB4O: El poder de las Bases de Datos Orientadas a Objetos</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px; text-align: center;"&gt;&lt;img alt="DB40" class="aligncenter" height="135" src="http://mundobyte.hostjava.net/blog/wp-content/imagenes/db4o.jpg" style="background-color: #eeeeee; border-bottom-color: rgb(221, 221, 221); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(221, 221, 221); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(221, 221, 221); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(221, 221, 221); border-top-style: solid; border-top-width: 1px; display: block; margin-bottom: 0px; margin-left: auto; margin-right: auto; margin-top: 0px; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px;" title="DB4O" width="494" /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px; text-align: left;"&gt;Hace alrededor de 1 año, conocí a DB40, una Base de Datos Orientada a Objetos Open Source!… ¿Pero qué es DB4O? y sobre todo ¿para que me sirve si ya se utilizar MySQL, SQL Server, Oracle y otro manejador de Base de Datos Relacional?… Estas preguntas son las que trataré de responder a continuación.&lt;/div&gt;&lt;h3 style="color: #0989ae; font-size: 20px; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 15px;"&gt;¿Qué es DB4O?&lt;/h3&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Bien, como ya lo dije arriba, DB40 es una Base de Datos Orientada a Objetos de alto rendimiento. En algunos&amp;nbsp;&lt;a href="http://es.wikipedia.org/wiki/Benchmark" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;Benchmark&lt;/a&gt;&amp;nbsp;realizados, DB4O muestra un rendimiento superior o similar a las Bases de Datos Relacionales, en el caso de Java, utilizando JDBC o algún Framework como&amp;nbsp;&lt;strong style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Hibernate&lt;/strong&gt;! Podemos ver estas pruebas en la página de&amp;nbsp;&lt;a href="http://www.polepos.org/" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;polepos.org&lt;/a&gt;&lt;/div&gt;&lt;h3 style="color: #0989ae; font-size: 20px; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 15px;"&gt;¿Hibernate?… ¿Qué es eso?&lt;/h3&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Bien, si no sabes que es&amp;nbsp;&lt;a href="http://es.wikipedia.org/wiki/Hibernate" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;Hibernate&amp;nbsp;&lt;/a&gt;te lo explicare a continuación!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Hibernate es una “herramienta” para Java (&lt;em style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;NHibernate&amp;nbsp;&lt;/em&gt;es la versión para .NET) que nos permite poder conjuntar sin ningún problema al modelo Orientado a Objetos con el Relacional! Debes de saber que ambos modelos no son compatibles!&lt;/div&gt;&lt;h3 style="color: #0989ae; font-size: 20px; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 15px;"&gt;Pero yo he utilizado Java y MySQL… ¿Como no van a ser compatibles?&lt;/h3&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Es verdad, el paradigma Orientado a Objetos con el Modelo Relacional son incompatibles. No importa que tu hayas trabajado y desarrollado una aplicación que guarde datos en MySQL mediante Java, C# o algún otro lenguaje OO, en realidad lo único que has hecho, es escribir una simple sentencia SQL y enviarla al manejador de BD pero desde Java.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;El hecho de enviar sentencias SQL a algún manejador de BD Relacional, no significa que sean compatibles!… Pero bueno, finalmente ¿A que me refiero cuando digo que son incompatibles?,.. pues bien, veámoslo con un ejemplo.&lt;/div&gt;&lt;pre class="brush: java;" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Persona ximena = new Persona("Ximena", "Rodriguez", 'F');&lt;br /&gt;JDBC.save(ximena);&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Si Java fuera compatible con MySQL/PostgreSQL/etc., el código anterior, indudablemente funcionaria! Es decir, sería posible guardar objetos! En lugar de eso, necesitamos utilizar variables escalares que contienen los valores que deseamos guardar, concatenarlas a otra cadena que tiene la sentencia SQL y finalmente enviarlas al manejador de Base de Datos mediante una alguna interfaz que comunique Java con &amp;nbsp;MySQL/PostgreSQL/etc., como lo es JDBC.&lt;/div&gt;&lt;pre class="java" name="code"&gt;public void guardar(String nombre, String aPaterno, char sexo){&lt;br /&gt;    stmt.executeUpdate(&lt;br /&gt;                "INSERT INTO persona("nombre, paterno, sexo )" +&lt;br /&gt;                    "VALUES(' "+nombre+', ' "+aPaterno+" ', ' "+sexo+" ')");&lt;br /&gt;}&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Y para recuperar datos, es lo mismo, debemos enviar una consulta SELECT * FROM y con el resultado que nos devuelve la BD, ir iterando sobre cada registro para guardar el valor en variables o en Listas.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Finalmente podemos ver el esfuerzo requerido para conectar los dos mundos;&lt;/div&gt;&lt;pre class="java" name="code"&gt;import java.sql.*;&lt;br /&gt;&lt;br /&gt;public class Jdbc10 {&lt;br /&gt;  public static void main(String args[]){&lt;br /&gt;    System.out.println(&lt;br /&gt;                  "Copyright 2004, R.G.Baldwin");&lt;br /&gt;    try {&lt;br /&gt;      Statement stmt;&lt;br /&gt;      ResultSet rs;&lt;br /&gt;&lt;br /&gt;      //Register the JDBC driver for MySQL.&lt;br /&gt;      Class.forName("com.mysql.jdbc.Driver");&lt;br /&gt;&lt;br /&gt;      //Define URL of database server for&lt;br /&gt;      // database named JunkDB on the localhost&lt;br /&gt;      // with the default port number 3306.&lt;br /&gt;      String url =&lt;br /&gt;            "jdbc:mysql://localhost:3306/JunkDB";&lt;br /&gt;&lt;br /&gt;      //Get a connection to the database for a&lt;br /&gt;      // user named auser with the password&lt;br /&gt;      // drowssap, which is password spelled&lt;br /&gt;      // backwards.&lt;br /&gt;      Connection con =&lt;br /&gt;                     DriverManager.getConnection(&lt;br /&gt;                        url,"auser", "drowssap");&lt;br /&gt;&lt;br /&gt;      //Display URL and connection information&lt;br /&gt;      System.out.println("URL: " + url);&lt;br /&gt;      System.out.println("Connection: " + con);&lt;br /&gt;&lt;br /&gt;      //Get a Statement object&lt;br /&gt;      stmt = con.createStatement();&lt;br /&gt;&lt;br /&gt;      //As a precaution, delete myTable if it&lt;br /&gt;      // already exists as residue from a&lt;br /&gt;      // previous run.  Otherwise, if the table&lt;br /&gt;      // already exists and an attempt is made&lt;br /&gt;      // to create it, an exception will be&lt;br /&gt;      // thrown.&lt;br /&gt;      try{&lt;br /&gt;        stmt.executeUpdate("DROP TABLE myTable");&lt;br /&gt;      }catch(Exception e){&lt;br /&gt;        System.out.print(e);&lt;br /&gt;        System.out.println(&lt;br /&gt;                  "No existing table to delete");&lt;br /&gt;      }//end catch&lt;br /&gt;&lt;br /&gt;      //Create a table in the database named&lt;br /&gt;      // myTable.&lt;br /&gt;      stmt.executeUpdate(&lt;br /&gt;            "CREATE TABLE myTable(test_id int," +&lt;br /&gt;                  "test_val char(15) not null)");&lt;br /&gt;&lt;br /&gt;      //Insert some values into the table&lt;br /&gt;      stmt.executeUpdate(&lt;br /&gt;                "INSERT INTO myTable(test_id, " +&lt;br /&gt;                    "test_val) VALUES(1,'One')");&lt;br /&gt;      stmt.executeUpdate(&lt;br /&gt;                "INSERT INTO myTable(test_id, " +&lt;br /&gt;                    "test_val) VALUES(2,'Two')");&lt;br /&gt;      stmt.executeUpdate(&lt;br /&gt;                "INSERT INTO myTable(test_id, " +&lt;br /&gt;                  "test_val) VALUES(3,'Three')");&lt;br /&gt;      stmt.executeUpdate(&lt;br /&gt;                "INSERT INTO myTable(test_id, " +&lt;br /&gt;                   "test_val) VALUES(4,'Four')");&lt;br /&gt;      stmt.executeUpdate(&lt;br /&gt;                "INSERT INTO myTable(test_id, " +&lt;br /&gt;                   "test_val) VALUES(5,'Five')");&lt;br /&gt;&lt;br /&gt;      //Get another statement object initialized&lt;br /&gt;      // as shown.&lt;br /&gt;      stmt = con.createStatement(&lt;br /&gt;               ResultSet.TYPE_SCROLL_INSENSITIVE,&lt;br /&gt;                     ResultSet.CONCUR_READ_ONLY);&lt;br /&gt;&lt;br /&gt;      //Query the database, storing the result&lt;br /&gt;      // in an object of type ResultSet&lt;br /&gt;      rs = stmt.executeQuery("SELECT * " +&lt;br /&gt;                "from myTable ORDER BY test_id");&lt;br /&gt;&lt;br /&gt;      //Use the methods of class ResultSet in a&lt;br /&gt;      // loop to display all of the data in the&lt;br /&gt;      // database.&lt;br /&gt;      System.out.println("Display all results:");&lt;br /&gt;      while(rs.next()){&lt;br /&gt;        int theInt= rs.getInt("test_id");&lt;br /&gt;        String str = rs.getString("test_val");&lt;br /&gt;        System.out.println("\ttest_id= " + theInt&lt;br /&gt;                             + "\tstr = " + str);&lt;br /&gt;      }//end while loop&lt;br /&gt;&lt;br /&gt;      //Display the data in a specific row using&lt;br /&gt;      // the rs.absolute method.&lt;br /&gt;      System.out.println(&lt;br /&gt;                        "Display row number 2:");&lt;br /&gt;      if( rs.absolute(2) ){&lt;br /&gt;        int theInt= rs.getInt("test_id");&lt;br /&gt;        String str = rs.getString("test_val");&lt;br /&gt;        System.out.println("\ttest_id= " + theInt&lt;br /&gt;                             + "\tstr = " + str);&lt;br /&gt;      }//end if&lt;br /&gt;&lt;br /&gt;      //Delete the table and close the connection&lt;br /&gt;      // to the database&lt;br /&gt;      stmt.executeUpdate("DROP TABLE myTable");&lt;br /&gt;      con.close();&lt;br /&gt;    }catch( Exception e ) {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;    }//end catch&lt;br /&gt;  }//end main&lt;br /&gt;}//end class Jdbc10&lt;/pre&gt;&lt;address style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Código fuente:&amp;nbsp;&lt;a href="http://www.developer.com/java/data/article.php/3417381/Using-JDBC-with-MySQL-Getting-Started.htm" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;Using JDBC with MySQL, Getting Started&lt;/a&gt;&lt;/address&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Con DB4O es tan sencillo conectar a la BD como hacer lo siguiente:&lt;/div&gt;&lt;pre class="java" name="code"&gt;// Crear una base si no existe, abrirla si ya existe.&lt;br /&gt;     File file = new File("testDb4o.yap");&lt;br /&gt;     String fullPath = file.getAbsolutePath();&lt;br /&gt;     ObjectContainer db = Db4oFactory.openFile(file);&lt;br /&gt;     try{&lt;br /&gt;           // realizar alguna acción con db4o&lt;br /&gt;           // Ejemplos :&lt;br /&gt;           db.set(obj);  // Almacena un objeto en la base&lt;br /&gt;           db.commit();       // Realizar la transacción (y arrancar otra)&lt;br /&gt;           db.delete(obj);   // Eliminar un objeto en la base&lt;br /&gt;     }&lt;br /&gt;     finally{&lt;br /&gt;           db.close();         // Cerrar la base y liberar los recursos&lt;br /&gt;}&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Existe abundante documentación en ingles y en español sobre el uso de DB4O con Java y C#, al bajar DB4O de la página oficial, encontraremos en dicha carpeta, un completo tutorial en español sobre su uso, además de una guía de referencia! De igual forma, existe un libro&amp;nbsp;&lt;a href="http://www.diazdesantos.es/ebooks/edlich-stefan-the-definitive-guide-to-db4o-E0011669500177.html" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;"&gt;“The definitive guide to db4o”&lt;/a&gt;&amp;nbsp;que aunque no es la versión actual, sin duda es un excelente comienzo para iniciarse en esta fantástica BD.&lt;/div&gt;&lt;h3 style="color: #0989ae; font-size: 20px; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 15px;"&gt;Finalmente… Dijiste que Hibernate conjunta los dos mundos, ¿Como lo hace? y si ya lo hace, ¿Para que usar DB4O?&lt;/h3&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Bueno, Hibernate utiliza archivos XML para “mapear” clases Java con columnas de una Tabla Relacional y mediante este mapeo, es posible hacer algo similar al código que vimos para guardar objetos en DB4O, pero la diferencia es que Hibernate internamente se encargará de hacer dicho “mapeo” por nosotros e insertar en las columnas de la Tabla Relacional! A cambio de esta comodidad de utilizar Java y MYSQL/SQL Server/etc., Hibernate disminuye el rendimiento de la aplicación!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Es causa de mucha polémica decir si DB4O es o no es la opción idónea para aplicaciones empresariales de gran escala, por lo mismo que las Bases de Datos Orientadas a Objetos no tienen un fuerte sustento matemático como si lo tienen las Relacionales, su penetración no ha sido tan fuerte! Por lo anterior, la industria del Software no ha querido experimentar en ambientes reales de gran escala la potencia de DB4O.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Independientemente de lo anterior, DB4O es la mejor opción para aquellos desarrolladores Freelance que desarrollan aplicaciones de escritorio o incluso web que no requieren de almacenar millones de datos!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Algunos recursos sobre el uso de DB4O son:&lt;/div&gt;&lt;ul style="margin-bottom: 20px; margin-left: 20px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://javahispano.org/contenidos/es/db4o/;jsessionid=738B46D4009B0DC9F6CC57331B373751" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;JavaHispano&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a href="http://www.programacion.com/java/articulo/jap_persis_db4o/" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;Programacion.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-9128323540659691477?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/9128323540659691477/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/db4o-el-poder-de-las-bases-de-datos.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/9128323540659691477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/9128323540659691477'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/db4o-el-poder-de-las-bases-de-datos.html' title='DB4O: El poder de las Bases de Datos Orientadas a Objetos'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4366106582681431053.post-2044259988683551631</id><published>2010-02-27T21:26:00.000-08:00</published><updated>2010-03-26T21:35:51.725-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JAVA'/><title type='text'>Serializar objetos Java a XML</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="color: #676767; font-family: Georgia, 'Lucida Grande'; font-size: 12px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Mediante&amp;nbsp;&lt;a href="http://xstream.codehaus.org/" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank" title="XStream"&gt;XStream&lt;/a&gt;&amp;nbsp;podemos crear de manera extremadamente fácil un XML. En este ejemplo, aprenderemos la manera de hacerlo, para ello descarguemos la distribución binaria de la página oficial.&lt;span style="color: white; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;-&lt;/span&gt;&lt;/div&gt;&lt;h3 style="color: #0989ae; font-size: 20px; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 15px;"&gt;&lt;span style="color: navy; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;HERRAMIENTAS&lt;/span&gt;&lt;/h3&gt;&lt;ul style="margin-bottom: 20px; margin-left: 20px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Equipo portatil Acer Aspire, Intel Celeron 1.86 Ghz, 1 GB RAM&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Mandriva 2009, KDE 4&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;XStream 1.3.1&lt;/li&gt;&lt;li style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Eclipse 3.4.2&lt;span style="color: white; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;-&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="color: #0989ae; font-size: 20px; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 15px;"&gt;&lt;span style="color: navy; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;DESARROLLO&lt;/span&gt;&lt;/h3&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Antes que nada, debemos agregar las librerias XStream a nuesro entorno de desarrollo, ya sea Eclipse, NetBeans o cualquier otro. En este&amp;nbsp;&lt;a href="http://tecnologiasjava.blogspot.com/2008/09/eclipse-user-libraries-y-javadoc.html" style="color: #70a529; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank" title="add User Library in eclipse"&gt;enlace&lt;/a&gt;&amp;nbsp;puedes ver como agregar librerias a eclipse. Las librerias que agregaremos para este ejemplo serán “&lt;span style="color: blue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;xstream-1.3.1.jar&lt;/span&gt;”&amp;nbsp; y “&lt;span style="color: blue; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;xpp3_min-1.1.4c.jar&lt;/span&gt;”.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Posteriormente creamos un proyecto Dynamic Web. Creamos una clase Java llamada “Direccion” y posteriormente otra llamada “Persona” dentro del paquete “beans”.&lt;/div&gt;&lt;pre class="java" name="code"&gt;package beans;&lt;br /&gt;&lt;br /&gt;public class Direccion {&lt;br /&gt;&lt;br /&gt; private String calle;&lt;br /&gt; private String colonia;&lt;br /&gt; private String municipio;&lt;br /&gt; private String estado;&lt;br /&gt; private int cp;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;pre class="java" name="code"&gt;package beans;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;&lt;br /&gt;public class Persona {&lt;br /&gt;&lt;br /&gt;private String nombre;&lt;br /&gt;private String apaterno;&lt;br /&gt;private String amaterno;&lt;br /&gt;private ArrayList direccion;&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Finalmente encapsulamos todos atributos en sus métodos setter y getter, seleccionando los atributos y dando click derecho sobre la selección para escoger la opción de “Source–Generate Getters and Setters”.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Ahora crearemos una clase llamada TestXML dentro del paquete test, y copiaremos el siguiente código:&lt;/div&gt;&lt;pre class="java" name="code"&gt;public class TestXML {&lt;br /&gt;&lt;br /&gt;public static void main(String args[])&lt;br /&gt;{&lt;br /&gt;Direccion direccion = new Direccion(&lt;br /&gt;"Aqui la calle","Aqui la colonia","Aqui municipio",&lt;br /&gt;"Aqui el estado", 12345);&lt;br /&gt;&lt;br /&gt;Persona persona = new Persona(&lt;br /&gt;"Ascari", "Romo", "Pedraza", direccion);&lt;br /&gt;&lt;br /&gt;XStream stream = new XStream();&lt;br /&gt;stream.alias("persona", Persona.class);&lt;br /&gt;&lt;br /&gt;String xml = stream.toXML(persona);&lt;br /&gt;System.out.print(xml);&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 5px; padding-left: 0px; padding-right: 0px; padding-top: 5px;"&gt;Como ven es muy fácil, ahora más interesante será obtener los datos de un manejador de BD, crear el XML como ya se explico y enviarlo a la capa de presentación en Flex para su visualización.&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4366106582681431053-2044259988683551631?l=mundobyte-x.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mundobyte-x.blogspot.com/feeds/2044259988683551631/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/serializar-objetos-java-xml.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2044259988683551631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4366106582681431053/posts/default/2044259988683551631'/><link rel='alternate' type='text/html' href='http://mundobyte-x.blogspot.com/2010/03/serializar-objetos-java-xml.html' title='Serializar objetos Java a XML'/><author><name>Ascari Romo</name><uri>http://www.blogger.com/profile/08862148033099830424</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_jf3qj62j_jM/S6mI1LwiCrI/AAAAAAAAAAM/bOfoj4hb0v0/S220/090930-140612.jpg'/></author><thr:total>3</thr:total></entry></feed>
