<?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-4107350313602582202</id><updated>2011-10-07T04:38:53.806-07:00</updated><category term='SCWCD'/><category term='Grids'/><category term='SQL'/><category term='javascript'/><category term='Email'/><category term='ActiveRecord'/><category term='Analogías'/><category term='DropDown'/><category term='videos 4'/><category term='Instalación'/><category term='SQL Server'/><category term='PickList'/><category term='Security'/><category term='Oracle'/><category term='demo'/><category term='IDE'/><category term='Base de datos'/><category term='Ajax'/><category term='webing'/><category term='Kanban'/><category term='tecnología'/><category term='Manuales / Tutoriales'/><category term='Otros'/><category term='Pragmatic Programmer'/><category term='Spring'/><category term='Ruby on Rails'/><category term='TestCase'/><category term='metodologías ágiles'/><category term='hibernate'/><category term='Lenguajes dinámicos'/><category term='MySQL'/><category term='POO'/><category term='REST'/><category term='jdk'/><category term='Librerías JS'/><category term='Chris'/><category term='scriptaculous'/><category term='PhpPgAdmin'/><category term='de foros'/><category term='NetBeans'/><category term='Java'/><category term='Refactoring'/><category term='ADF'/><category term='LDAP'/><category term='SCRUM'/><category term='Drupal'/><category term='Tomcat'/><category term='Spring MVC'/><category term='Taller'/><category term='Agile'/><category term='Ruby'/><category term='Linux'/><category term='twitter'/><category term='HTML'/><category term='eventos'/><category term='Imágenes'/><category term='ubuntu'/><category term='Reportes'/><category term='prototype'/><category term='Desarrollo Web'/><title type='text'>4 Cuatros</title><subtitle type='html'>Analizando código .....</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>95</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-9003525621311893358</id><published>2011-07-16T06:08:00.000-07:00</published><updated>2011-07-16T06:11:38.208-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='metodologías ágiles'/><title type='text'>Trabajar sin estrés - Kanban</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un video muy básico e interesante posteado por &lt;a href="http://www.fuerzatres.com/"&gt;FuerzaTres&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/I-H-WXAX_oM" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-9003525621311893358?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/9003525621311893358/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=9003525621311893358&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/9003525621311893358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/9003525621311893358'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2011/07/trabajar-sin-estres-kanban.html' title='Trabajar sin estrés - Kanban'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/I-H-WXAX_oM/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6862769364144014291</id><published>2011-04-20T00:51:00.000-07:00</published><updated>2011-04-20T01:36:55.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scriptaculous'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype'/><title type='text'>Demo - Acordiones dependientes (anidados)</title><content type='html'>-&lt;br /&gt;Al realizar la migración de una aplicación en Struts 1.3 a Spring MVC 3, me puse a jugar un poco con acordiones.&lt;br /&gt;En la aplicación anterior se tenían combos dependientes (anidados) con poca información (5 a 10 registros), de los cuales se tenía un texto muy grande como para poder mostrarlo en en combo, el cual al expandirlo, el texto sobresalía del frame.&lt;br /&gt;&lt;br /&gt;Para esto se me ocurrió implementar un par de acordiones dependientes, jugando un poco con las siguientes librerías:&lt;br /&gt;- prototype.js&lt;br /&gt;- scriptaculous.js&lt;br /&gt;- effects.js&lt;br /&gt;- accordion.js&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="430" height="300" class="BLOG_video_class" id="BLOG_video-15f52b844db8b645" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v3.nonxt5.googlevideo.com/videoplayback?id%3D15f52b844db8b645%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331317265%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D5D0C9E9DDEDA3AC8D3025EA01C14F76039E4B402.593BEC7B5C43D707A6881FFC25BDAC9335EBC47B%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D15f52b844db8b645%26offsetms%3D5000%26itag%3Dw160%26sigh%3DrmCqmXkATywxrhiE7YqZ8CtB4pU&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="430" height="300" bgcolor="#FFFFFF"flashvars="flvurl=http://v3.nonxt5.googlevideo.com/videoplayback?id%3D15f52b844db8b645%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331317265%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D5D0C9E9DDEDA3AC8D3025EA01C14F76039E4B402.593BEC7B5C43D707A6881FFC25BDAC9335EBC47B%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D15f52b844db8b645%26offsetms%3D5000%26itag%3Dw160%26sigh%3DrmCqmXkATywxrhiE7YqZ8CtB4pU&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;Los acordiones vienen de la siguiente librería js &lt;a href="http://www.p51labs.com/accordion/"&gt;Accordion v2.0&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/4107350313602582202-6862769364144014291?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6862769364144014291/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6862769364144014291&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6862769364144014291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6862769364144014291'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2011/04/acordiones-dependientes-demo.html' title='Demo - Acordiones dependientes (anidados)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2350109714298409055</id><published>2011-03-10T04:59:00.000-08:00</published><updated>2011-03-10T05:31:11.093-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Base de datos'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='PhpPgAdmin'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Instalación'/><title type='text'>PhpPgAdmin - Ubuntu</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Después de haber utilizado &lt;a href="http://www.phpmyadmin.net/"&gt;phpmyadmin&lt;/a&gt; para base de datos &lt;a href="http://www.mysql.com/"&gt;mysql&lt;/a&gt;, el cual me gustó mucho, especialmente los scripts que genera. Me pregunté si había uno igual para base de datos &lt;a href="http://www.postgresql.org/"&gt;postgres&lt;/a&gt;. Y si hay!!! XD.  Su nombre es &lt;a href="http://phppgadmin.sourceforge.net/"&gt;PhpPgAdmin&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Previamente tener instalado postgreSQL:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', 'Lucida Grande', Helvetica, Arial, Verdana, sans-serif; font-size: 14px; "&gt;&lt;pre&gt;&lt;code&gt; sudo apt-get install postgresql&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En caso no reconozcas el user y password, puedes editar el password del usuario "postgres":&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', 'Lucida Grande', Helvetica, Arial, Verdana, sans-serif; font-size: 14px; "&gt;&lt;pre&gt;&lt;code&gt;sudo -u postgres psql postgres&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Helvetica Neue', 'Lucida Grande', Helvetica, Arial, Verdana, sans-serif; font-size: 14px; "&gt;&lt;pre&gt;&lt;code&gt;\password postgres&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Luego instalamos PhpPgAdmin:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(41, 48, 59); font-family: Georgia, 'Times New Roman', sans-serif; font-size: 13px; "&gt;&lt;pre&gt;&lt;code&gt;apt-get install phppgadmin&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Al loguearme con el usuario se muestra el siguiente mensaje:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: arial, tahoma, verdana, helvetica, sans-serif, serif; font-size: 13px; "&gt;Login disallowed for security reasons&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: arial, tahoma, verdana, helvetica, sans-serif, serif; font-size: 13px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: arial, tahoma, verdana, helvetica, sans-serif, serif; font-size: 13px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); font-family: Georgia, serif; font-size: 16px; -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://3.bp.blogspot.com/-Kb0GLgjgqA0/TXjO6l8emFI/AAAAAAAADOM/cejElz5c7Sw/s320/Screenshot.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5582439244139239506" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 200px; " /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: arial, tahoma, verdana, helvetica, sans-serif, serif; font-size: 13px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); font-family: Georgia, serif; font-size: 16px; -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: arial, tahoma, verdana, helvetica, sans-serif, serif; font-size: 13px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); font-family: Georgia, serif; font-size: 16px; -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: arial, tahoma, verdana, helvetica, sans-serif, serif; font-size: 13px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); font-family: arial, tahoma, verdana, helvetica, sans-serif, serif; font-size: 13px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Para esto editamos el archivo config de phppgadmin en la siguiente ruta:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(41, 48, 59); font-family: Georgia, 'Times New Roman', sans-serif; font-size: 13px; "&gt;/etc/phppgadmin/config.inc.php&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Modificamos la siguiente línea para permitir el acceso al usuario:&lt;/div&gt;&lt;div&gt;$conf['extra_login_security'] = false;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;Con todo esto ya deberías poder acceder al servidor PostgreSQL&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="white-space: normal;" &gt;Fuentes: &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;- &lt;/span&gt;&lt;/span&gt;&lt;a href="https://help.ubuntu.com/community/PostgreSQL"&gt;https://help.ubuntu.com/community/PostgreSQL&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;- &lt;a href="http://programminglinuxblog.blogspot.com/2008/08/phppgadmin-ubuntu.html"&gt;http://programminglinuxblog.blogspot.com/2008/08/phppgadmin-ubuntu.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&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/4107350313602582202-2350109714298409055?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2350109714298409055/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2350109714298409055&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2350109714298409055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2350109714298409055'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2011/03/phppgadmin-ubuntu.html' title='PhpPgAdmin - Ubuntu'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Kb0GLgjgqA0/TXjO6l8emFI/AAAAAAAADOM/cejElz5c7Sw/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1956646293986031213</id><published>2011-01-28T12:35:00.000-08:00</published><updated>2011-01-28T13:09:11.632-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>La clave para un mejor software</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/TUMwFJbM4bI/AAAAAAAADNU/YbtXy98a420/s1600/policias.jpg"&gt;&lt;/a&gt;-&lt;div&gt;&lt;a href="http://www.linkedin.com/in/briantarbox"&gt;Brian Tarbox&lt;/a&gt; está convencido de que el enfoque de la calidad adoptado por la mayoría de empresas, es erróneo y se basa en un modelo defectuoso. Este uso del modelo equivocado explica por qué tantas empresas están teniendo tales problemas para aumentar la calidad del software que ofrecen. &lt;/div&gt;&lt;div&gt;Para explorar los distintos modelos disponibles echemos un vistazo a algunos otros negocios y ver cómo se enfrentan a problemas de calidad.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una ciudad tiene un problema con el mal comportamiento del tráfico, que puede ser visto como una cuestión de calidad, con consecuencias potencialmente peligrosas para la vida. Los métodos disponibles para resolver los problemas de tráfico son básicamente &lt;b&gt;estructurales&lt;/b&gt; y la &lt;b&gt;ejecución&lt;/b&gt;. Soluciones estructurales son cosas tales como la adición de reductores de velocidad o de carriles de giro. La aplicación es la adición de más patrullas de policía o radares. Las soluciones estructurales son atractivos porque trabajan.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://2.bp.blogspot.com/_oo_xdGd7F-k/TUMwFJbM4bI/AAAAAAAADNU/YbtXy98a420/s320/policias.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5567346429347553714" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 206px; " /&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En el mundo del software de soluciones estructurales a la calidad son cosas como la cobertura de código o estilo del código que corre automáticamente como parte de un proceso de construcción. Simplemente no se puede hacer check-in o crear un código que viola la norma estructural. La desventaja de las soluciones estructurales es que no cambian las actitudes subyacentes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Modelos de software de aplicación son cosas como las inspecciones de código después de los hechos o fracasos. Ambos se centran en determinar por qué se produjo un error en lugar de la prevención de que vuelva a ocurrir.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Estructuralmente no se puede evitar que una bailarina dance mal.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entonces que deja la &lt;b&gt;ejecución&lt;/b&gt;,&lt;/div&gt;&lt;div&gt;- Para mejorar el performance de un niño en una liga de fútbol ¿se debería contratar más árbitros?&lt;/div&gt;&lt;div&gt;- Cuando un niño toca piano. ¿debería haber alguien que haga ruido con un silbato cada vez que el niño se equivoca?&lt;/div&gt;&lt;div&gt;Pues definitivamente no, es necesario un maestro o instructor.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esta es una conclusión ridículamente obvia en estos lugares, pero la mayoría de las compañías de software han perdido de vista.&lt;/div&gt;&lt;div&gt;Esperamos que nuestros programadores escriban mejor código, pero por lo general no le damos ningún entrenamiento en cómo hacerlo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La mayoría de los ingenieros no piden la formación y la mayoría de los gerentes no lo sugieren. Pregúntese: ¿Su compañía se incluyen la educación continua en su valoración de su rendimiento? ¿Su empresa ofrece clases de refactorización, Test Driven Development, Metodología Ágil o Inspección Código? Si no lo hacen, entonces están haciendo una declaración que no valoran la calidad del software. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;Fuente:  PragPub 20010-09 &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/4107350313602582202-1956646293986031213?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1956646293986031213/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1956646293986031213&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1956646293986031213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1956646293986031213'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2011/01/la-clave-para-un-mejor-software.html' title='La clave para un mejor software'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/TUMwFJbM4bI/AAAAAAAADNU/YbtXy98a420/s72-c/policias.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3110095682610545608</id><published>2010-08-21T11:45:00.000-07:00</published><updated>2010-08-22T08:33:11.155-07:00</updated><title type='text'>yUML: UML Online</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;u&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Tratándose de UML, uso Rational Rose y también en algunos casos ArgoUML. Sin embargo, siguiendo la costumbre de usar aplicaciones web decidí probar yUML (&lt;a href="http://yuml.me/"&gt;http://yuml.me&lt;/a&gt;), me pareció muy sencillo y divertido para crear diagramas de actividades, casos de uso y de clases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No es tan completo si lo comparamos con Rational, pero me permite expresarme y comunicarme con claridad con desarrolladores, documentadores y analistas.&lt;/div&gt;&lt;div&gt;yUml maneja un intérprete de un lenguaje script sencillo que al compilar genera el gráfico y el url correspondiente&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ejemplos:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Diagrama de clases&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_oo_xdGd7F-k/TG1_XZe7NEI/AAAAAAAAC9w/EYcc3UFWqsk/s1600/activi.png"&gt;&lt;img src="http://4.bp.blogspot.com/_oo_xdGd7F-k/TG1_XZe7NEI/AAAAAAAAC9w/EYcc3UFWqsk/s400/activi.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5507197959298298946" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 283px; height: 400px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Diagrama de actividades&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_oo_xdGd7F-k/TG1_Xm1y_wI/AAAAAAAAC94/4WM0C9ozPfI/s400/activi2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5507197962883890946" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 133px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Diagrama de casos de uso&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/_oo_xdGd7F-k/TG1_YMHJfEI/AAAAAAAAC-A/y3vevxeyGSs/s400/casouso.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5507197972888779842" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 375px; height: 400px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&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/4107350313602582202-3110095682610545608?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3110095682610545608/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3110095682610545608&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3110095682610545608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3110095682610545608'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/08/yuml-uml-online.html' title='yUML: UML Online'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/TG1_XZe7NEI/AAAAAAAAC9w/EYcc3UFWqsk/s72-c/activi.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7251382958457919169</id><published>2010-08-19T12:21:00.000-07:00</published><updated>2010-08-19T08:25:34.304-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>El Método Mikado</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/TDt7ppHxAyI/AAAAAAAAC4Y/dRgJvSCUffY/s1600/mikado.png"&gt;&lt;/a&gt;-&lt;br /&gt;¿Alguna vez te ha pasado que un nuevo cliente solicita un sistema que tiene lógica casi idéntica al software que estamos desarrollando actualmente? &lt;div&gt;- Pues a mí si :S&lt;br /&gt;Básicamente tenemos 2 opciones y ambas significan trabajo extra, pero de maneras muy diferentes.&lt;br /&gt;&lt;br /&gt;Desde siempre hemos aprendido que hay ciertas partes del código que no pueden ser compartido entre nuestros clientes. Bajo ninguna circunstancia puede un cliente ver las partes secretas del otro cliente. Tenemos que separar la lógica de negocio y ser capaz de configurar qué partes deben ser entregadas a cada cliente. Una forma de resolver ese problema era copiar la mayor parte de la base de código a un nuevo proyecto y modificarlo ahí. Eso habría resuelto el problema de inmediato. Sin embargo, un código base duplicado o un código base en parte duplicaba significaría una gran cantidad de trabajo extra.&lt;div&gt;&lt;br /&gt;Por un lado, que sería capaz de entregar muy rápido, ya que no habría que pensar en cómo estructurar el código para minimizar la duplicación.&lt;br /&gt;Por otra parte, que por supuesto significa que habría tenido que mantener casi el doble de mucho código, incluida nuestro mal estructurado código, errores y todo lo demás.&lt;br /&gt;Además, para cada error o cambio en el futuro el sistema, tendríamos que analizar las dos partes para ver si el error estaba en el otro sistema también. Al principio no nos costaría mucho,  pero a la larga, esto habría significado toneladas de trabajo extra, por no mencionar que es un enfoque muy propenso a errores.&lt;br /&gt;&lt;br /&gt;Si en cambio optó por una gran reestructuración, todavía puede servir a ambos clientes y no existen datos sensibles que se repartan entre ellos. Esta ruta de acceso nos ha obligado a pensar un poco, la reestructuración, y hasta trabajo extra frontal antes de poder entregar al nuevo cliente. La cantidad de duplicación puede mantenerse a un mínimo. Sin embargo, el cliente tendría que esperar más tiempo. Y en el trayecto  podrían ocurrir grandes problemas enfrentándonos a una gran refactorización&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;MIKADO&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Mikado es un juego de origen europeo que consisite en recoger palitos. En 1936 fue traído desde Hungría a los EE.UU. y fue llamado en su mayoría "pick up sticks". Probablemente el nombre de "Mikado" no se utilizó porque era el nombre de la marca del productor del juego.&lt;/div&gt;&lt;div&gt;De todos modos, el juego se puso ese nombre por el palo que tiene el mayor puntaje, "el Mikado", llamado así por el emperador de Japón.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/_oo_xdGd7F-k/TDt7ppHxAyI/AAAAAAAAC4Y/dRgJvSCUffY/s400/mikado.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5493120125851730722" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 266px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Usted puede jugar Mikado con dos o más jugadores. Se tiene un montón de palos, al igual que espaguetis secos.  Éstos forman una pila de algún tipo y tienen diferentes colores, el palo de más alta puntuación es el Mikado. El objetivo es coger el palo Mikado. El truco consiste en recoger los palos fáciles, por lo general aquellos que no tienen otros palos encima de ellos. Finalmente, mediante el uso de esa estrategia, se puede recoger el palo Mikado y ganar el juego.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Los cambios en el código con como el juego de Mikado. Raras veces se puede sacar el Mikado a la primera, comúnmente se siguen ciertos pasos, en nuestro caso, extraer clases, refactorizar, etc.&lt;/div&gt;&lt;div&gt;Este proceso mayormente toma tiempo, no tratemos de corregir los errores de inmediato, sinó será como luchar con un software hydra, para cortar cabezas, otras dos crecen :S&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si identificaste el Mikado estás a un gran paso de ahorrarte muchos dolores de cabeza :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;Fuente:  PragPub #12 Junio 2010&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/4107350313602582202-7251382958457919169?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7251382958457919169/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7251382958457919169&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7251382958457919169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7251382958457919169'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/07/el-metodo-mikado.html' title='El Método Mikado'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/TDt7ppHxAyI/AAAAAAAAC4Y/dRgJvSCUffY/s72-c/mikado.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2429265909423343583</id><published>2010-08-04T10:30:00.000-07:00</published><updated>2010-08-04T17:06:42.955-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>CrunchyFrog : Cliente SQL Server para Ubuntu (Linux)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/TFnCB71UVjI/AAAAAAAAC8A/142w3Z4oZR8/s1600/Screenshot-3.png"&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;-&lt;/div&gt;Buscando en google encontré el &lt;b&gt;CrunchyFrog&lt;/b&gt;, que es un cliente que tiene soporte a distintas base de datos (PostgreSQL, SQLLite, SQL Server, Oracle, etc) &lt;a href="http://ubuntulife.wordpress.com/2009/07/24/crunchyfrog-cliente-sql-para-gnome/"&gt;http://ubuntulife.wordpress.com/2009/07/24/crunchyfrog-cliente-sql-para-gnome/&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;1) Instalación&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Para instalarlo puedes usar GetDeb o añadir en Jaunty la siguiente linea a tu fichero /etc/apt/sources.list:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;deb http://ppa.launchpad.net/crunchyfrog/ppa/ubuntu jaunty main&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;deb-src http://ppa.launchpad.net/crunchyfrog/ppa/ubuntu jaunty main&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Añade la siguiente clave:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C7F166D8&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Actualizamos los repositorios e instalamos CrunchyFrog:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;sudo aptitude update&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;sudo aptitude install crunchyfrog crunchyfrog-gnome&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_oo_xdGd7F-k/TFnCBLSU5wI/AAAAAAAAC7o/X3npsZwb2s0/s400/Screenshot.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5501641745275086594" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 250px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;b&gt;2) Configuración&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para poder conectarnos a una BD SQL Server debemos crear un datasource, por defecto tengo ya instalado un conector para SQLLite. Para elegir el conector, entramos a Edit&gt;Data source.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://2.bp.blogspot.com/_oo_xdGd7F-k/TFnCBQCZgUI/AAAAAAAAC7w/gjDR7bsYMJU/s400/Screenshot-1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5501641746550456642" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 250px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Al no tener el conector para SQL Server, se tiene que instalar el pymssql provider.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pero antes de instalar el pymssql, instalamos primero el&lt;b&gt; freetds-dev&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;sudo apt-get install freetds-dev&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si al realizar la instrucción nos muestra el mensaje : &lt;/div&gt;&lt;div&gt;&lt;b&gt;"'Ubuntu-Server 10.04 LTS _Lucid Lynx_ - Release i386 (20100427)'&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;in the drive '/cdrom/' and press enter"&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pues debemos tener a la mano el cd de Ubuntu Server 10.04 ya que tiene las librerias necesarias para instalar&lt;b&gt; freetds-dev&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Después de instalar freetds-dev instalamos pymssql en el siguiente link:&lt;/div&gt;&lt;div&gt;&lt;a href="http://sourceforge.net/projects/pymssql/files/"&gt;http://sourceforge.net/projects/pymssql/files/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Descomprimimos el archivo, entramos a la carpeta e instalamos pymssql con la siguiente instrucción:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;sudo python setup.py install&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finalmente ingresamos al programa CrunchyFrog seleccionamos el conector para SQL Server en Data Source.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_oo_xdGd7F-k/TFnCBj5STiI/AAAAAAAAC74/s_asVx2kuSI/s400/Screenshot-2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5501641751880945186" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 250px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Colocamos los datos correctos para la conexión (host, port, user, pwd)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y listo!!! :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_oo_xdGd7F-k/TFnCB71UVjI/AAAAAAAAC8A/142w3Z4oZR8/s1600/Screenshot-3.png"&gt;&lt;img src="http://3.bp.blogspot.com/_oo_xdGd7F-k/TFnCB71UVjI/AAAAAAAAC8A/142w3Z4oZR8/s400/Screenshot-3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5501641758306752050" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 250px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/4107350313602582202-2429265909423343583?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2429265909423343583/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2429265909423343583&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2429265909423343583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2429265909423343583'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/08/crunchyfrog-cliente-sql-server-para.html' title='CrunchyFrog : Cliente SQL Server para Ubuntu (Linux)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/TFnCBLSU5wI/AAAAAAAAC7o/X3npsZwb2s0/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6766790112896813183</id><published>2010-05-16T13:23:00.000-07:00</published><updated>2010-05-16T13:45:32.611-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>MySQL WorkBench 5.2.21 (Development Release)</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/S_BZF6uY3nI/AAAAAAAACx0/727KvaIyCqk/s1600/dev.png"&gt;&lt;/a&gt;Al no querer prescindir solo de PhpMyAdmin, me bajé el &lt;b&gt;MySQL Query Browser&lt;/b&gt; que trae Ubuntu 10.04 y fue un asco comparado con las últimas versiones. Posteriormente, para realizar modelamientos como se hacen en &lt;b&gt;Erwin&lt;/b&gt;, tuve intentos fallidos al querer instalar &lt;b&gt;DBDesginer4&lt;/b&gt; en Ubuntu 10.04&lt;br /&gt;&lt;br /&gt;La solución a todo esto lo encontré en &lt;b&gt;MySQL Workbench 5.2.21&lt;/b&gt;, y lo encontré también para para Ubuntu 10.04 en &lt;a href="http://mysql.com/"&gt;mysql.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lo puedes descargar en &lt;a href="http://dev.mysql.com/downloads/workbench"&gt;http://dev.mysql.com/downloads/workbench&lt;/a&gt;&lt;br /&gt;yo me bajé la versión MySQL WorkBench 5.2.21 (Development Release) ya que la versión 5.1.18 (GA - Generally Available) solo podía acceder al entorno Model (entorno de diseño de models EER)&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;MySQL WorkBench&lt;/b&gt; es como tener &lt;b&gt;MySql Query Browser&lt;/b&gt;, &lt;b&gt;MySql Administratoir&lt;/b&gt; y &lt;b&gt;DBDesigner&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_oo_xdGd7F-k/S_BZF6uY3nI/AAAAAAAACx0/727KvaIyCqk/s1600/dev.png"&gt;&lt;img src="http://2.bp.blogspot.com/_oo_xdGd7F-k/S_BZF6uY3nI/AAAAAAAACx0/727KvaIyCqk/s400/dev.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5471971505453194866" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 227px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&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/4107350313602582202-6766790112896813183?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6766790112896813183/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6766790112896813183&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6766790112896813183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6766790112896813183'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/05/mysql-workbench-5221-development.html' title='MySQL WorkBench 5.2.21 (Development Release)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/S_BZF6uY3nI/AAAAAAAACx0/727KvaIyCqk/s72-c/dev.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6022104084815283068</id><published>2010-05-12T21:51:00.000-07:00</published><updated>2010-05-13T07:38:21.998-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='jdk'/><title type='text'>sqljdbc4.jar y JdK 5</title><content type='html'>-&lt;div&gt;Como ya muchos saben, la librería para conectarnos a una base de datos SQL Server desde Java es usando el jar sqljdb4 o sqljdbc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Al deployar una aplicación con Struts en un servidor Tomcat 5, se me presentó el siguiente error :&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;javax.servlet.ServletException: Bad version number in .class file&lt;br /&gt;org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:295)&lt;br /&gt;org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)&lt;br /&gt;org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)&lt;br /&gt;org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)&lt;br /&gt;org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)&lt;br /&gt;org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)&lt;br /&gt;javax.servlet.http.HttpServlet.service(HttpServlet.java:710)&lt;br /&gt;javax.servlet.http.HttpServlet.service(HttpServlet.java:803)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Este error nos quiere decir que se el proyecto se compiló con un Jdk de distinta versión que el del servidor&lt;br /&gt;&lt;br /&gt;Realizando seguimiento pude llegar a la siguiente línea:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El jar de conexión a la base de datos que se utilizó fue el sqljdbc4.jar. Para solucionar el problema reemplazé la librería sqljdbc4.jar por sqljdbc.jar que me bajé en la página de microsot.com.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Link : &lt;a href="http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=e22bc83b-32ff-4474-a44a-22b6ae2c4e17&amp;amp;displayLang=en"&gt;http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=e22bc83b-32ff-4474-a44a-22b6ae2c4e17&amp;amp;displayLang=en&lt;/a&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/4107350313602582202-6022104084815283068?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6022104084815283068/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6022104084815283068&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6022104084815283068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6022104084815283068'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/05/sqljdbc4jar-y-jdk-5.html' title='sqljdbc4.jar y JdK 5'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3561957581433560443</id><published>2010-03-31T09:30:00.000-07:00</published><updated>2010-03-31T09:30:00.586-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Instalación'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Haml Plugin en Netbeans</title><content type='html'>&lt;div style="text-align: center;"&gt;-&lt;/div&gt;&lt;div&gt;&lt;div&gt;Casi me desanimo por seguir optando en desarrollar en Netbeans cuando empecé a ver los archivos .haml sin fuente (colores).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Buscando encontré un plugin para poder visualizar de forma amigable los archivos haml.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Descargamos el plugin org-netbeans-modules-haml.nbm en &lt;a href="http://mediacast.sun.com/details.jsp?id=3759"&gt;http://mediacast.sun.com/details.jsp?id=3759&lt;/a&gt; o también en &lt;a href="http://mediacast.sun.com/users/~tor/media/org-netbeans-modules-haml.nbm/details"&gt;http://mediacast.sun.com/users/~tor/media/org-netbeans-modules-haml.nbm/details&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Instalar el plugin.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Abrimos el &lt;b&gt;Netbeans&lt;/b&gt; y elegimos &lt;b&gt;Tools&lt;/b&gt; y luego &lt;b&gt;Plugin&lt;/b&gt;&lt;/li&gt;&lt;li&gt;En la pestaña &lt;b&gt;Downloaded&lt;/b&gt;, click al botón &lt;b&gt;Add Plugin&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_oo_xdGd7F-k/S7Irv_ZwPLI/AAAAAAAAB3k/5KTx9mxhXM8/s400/Screenshot-Plugins-1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5454470202172390578" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 245px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Seleccionamos el plugin (archivo nbm)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://3.bp.blogspot.com/_oo_xdGd7F-k/S7IrwQEZuUI/AAAAAAAAB30/58xfqVkwL04/s400/Screenshot-Plugins.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5454470206646237506" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 246px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://2.bp.blogspot.com/_oo_xdGd7F-k/S7IrwDT5-kI/AAAAAAAAB3s/BY6Xlm3C3tQ/s400/Screenshot-Validation+Warning.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5454470203221604930" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 332px; " /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Click al botón &lt;b&gt;instalar&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y wuaaala, así se debería visualizar:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://2.bp.blogspot.com/_oo_xdGd7F-k/S7IrviincfI/AAAAAAAAB3c/zmVxLtaDcN4/s400/mihaml.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5454470194424934898" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 157px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&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/4107350313602582202-3561957581433560443?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3561957581433560443/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3561957581433560443&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3561957581433560443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3561957581433560443'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/03/haml-plugin-en-netbeans.html' title='Haml Plugin en Netbeans'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/S7Irv_ZwPLI/AAAAAAAAB3k/5KTx9mxhXM8/s72-c/Screenshot-Plugins-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6895508656585374247</id><published>2010-03-29T12:09:00.000-07:00</published><updated>2010-03-29T12:13:42.024-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActiveRecord'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>[Ruby on Rails] Counting records</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;-&lt;div&gt;La función :&lt;span style="font-style: italic;"&gt;count&lt;/span&gt; se utiliza de manera diferente que las funciones :&lt;span style="font-style: italic;"&gt;conditions&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;:joins, :limit, :order:, :having, :select.&lt;/span&gt; La función count puede tener cero, uno o dos parámetros:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Sin parámetros, obtiene el número de filas de la tabla&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;order_count = Order.count&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Con un parámetro. Rails determina si primero si se trata de un hash, sinó trata el primer parámetro como condición para determinar las filas que serán contadas&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;result = Order.count "amount &gt; 10"&lt;br /&gt;result1 = Order.count ["amount &gt; ?" , minimum_purchase]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Con dos parámetros que no son hash. El segundo parámetro es tratado como una condición :&lt;span style="font-style: italic;"&gt;join&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;result = Order.count "amount &gt; 10 and line_items.name like 'rails%'" ,&lt;br /&gt;"left join line_items on order_id = orders.id"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Un hash como parámetro, el hash se interpreta como argumento de la función. Opcionalmente se puede agregar antes del hash el nombre de una columna y se contará solo los valores no nulos de esa columna.&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Order.count :conditions =&gt; "amount &gt; 10" ,&lt;br /&gt;         :group =&gt; "state"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Finalmente, usando el sql nativo con count_by_sql&lt;/li&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;count = LineItem.count_by_sql("select count(*)       " +&lt;br /&gt;          " from line_items, orders               " +&lt;br /&gt;          " where line_items.order_id = orders.id " +&lt;br /&gt;          "   and orders.name = 'Dave Thomas'     ")&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-weight: bold;"&gt;Fuentes&lt;/span&gt;: Agile Web Development with Rails - 3rd Edtition&lt;/span&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/4107350313602582202-6895508656585374247?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6895508656585374247/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6895508656585374247&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6895508656585374247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6895508656585374247'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/03/ruby-on-rails-counting-records.html' title='[Ruby on Rails] Counting records'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2842661641962848609</id><published>2010-03-27T16:00:00.000-07:00</published><updated>2010-03-29T12:26:57.706-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ActiveRecord'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Protegiendo consultas con "?"</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;-&lt;div&gt;Algunas vez has encontrado querys donde existen parámetros con el signo de cierre de interrogación (?)&lt;/div&gt;&lt;div&gt;Como por ejemplo: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;select nombre from personas where estado = ?&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;¿Y no te has preguntado por qué? o la persona que lo hizo te dice: "es otra manera de hacer las cosas solamente"&lt;br /&gt;&lt;br /&gt;Bueno, esto tiene que ver con temas de ataque de &lt;a href="http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL"&gt;inyección SQL&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_oo_xdGd7F-k/S6vzmz7fE6I/AAAAAAAAB20/AQcMBJDxIKg/s320/P57_L_simulador-de-inyeccion-para-los-gluteos.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5452719621962404770" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 306px; height: 320px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Según wikipedia, la inyección SQL es una &lt;a href="http://www.blogger.com/w/index.php?title=Vulnerabilidad_inform%C3%A1tica&amp;amp;action=edit&amp;amp;redlink=1" class="new" title="Vulnerabilidad informática (aún no redactado)" style="text-decoration: none; color: rgb(204, 34, 0); background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; background-repeat: initial initial; "&gt;vulnerabilidad informática&lt;/a&gt; en el nivel de la validación de las entradas a la &lt;a href="http://www.blogger.com/wiki/Base_de_datos" title="Base de datos" style="text-decoration: none; color: rgb(0, 43, 184); background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; background-position: initial initial; background-repeat: initial initial; "&gt;base de datos&lt;/a&gt; de una aplicación&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Para tenerlo más claro:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;cadSQL = "SELECT id FROM usuario WHERE id=$txtUsuario AND contrasenia=$txtContra"&lt;p&gt;&lt;/p&gt;&lt;p align="justify"  style=" ;font-family:Verdana, Helvetica;"&gt;en este caso el atacante probará a introducir el siguiente texto en el campo de usuario y contraseña:&lt;/p&gt;&lt;p class="Estilo2" style=" ;font-family:Verdana, Helvetica;"&gt;' or '1'='1&lt;/p&gt;&lt;p align="justify" face="Verdana, Helvetica" style=" ;"&gt;de esta forma, si la aplicación no hace la comprobación correspondiente, se ejecutará la siguiente consulta SQL:&lt;/p&gt;&lt;p class="Estilo2" style=" ;font-family:Verdana, Helvetica;"&gt;cadSQL = "SELECT id FROM usuario WHERE id='' OR '1' = '1' AND contrasenia=" OR '1' = '1'&lt;/p&gt;&lt;p align="justify" face="Verdana, Helvetica" style=" ;"&gt;y puesto que &lt;em&gt;'1' = '1'&lt;/em&gt; siempre será verdadero el atacante tendrá acceso a la web como si de un usuario registrado se tratara.&lt;/p&gt;&lt;p align="justify" face="Verdana, Helvetica" style=" ;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p align="justify" face="Verdana, Helvetica" style=" ;"&gt;El uso de "?" está presente en varios controladores y frameworks:&lt;/p&gt;&lt;p align="justify" face="Verdana, Helvetica" style=" ;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Ejemplos:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# RAILS&lt;br /&gt;&lt;br /&gt;name = params[:name]&lt;br /&gt;# NO HACER ESTO!&lt;br /&gt;pos = Order.find(:all,&lt;br /&gt;:conditions =&gt; "name = '#{name}' and pay_type = 'po'" )&lt;br /&gt;&lt;br /&gt;# EN VEZ DE ESO:&lt;br /&gt;name = params[:name]&lt;br /&gt;pos = Order.find(:all,&lt;br /&gt;:conditions =&gt; ["name = ? and pay_type = 'po'" , name])&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// Java - JDBC Driver&lt;br /&gt;String selectStatement = "SELECT * FROM User WHERE userId = ? ";&lt;br /&gt;PreparedStatement prepStmt = con.prepareStatement(selectStatement);&lt;br /&gt;prepStmt.setString(1, userId);&lt;br /&gt;ResultSet rs = prepStmt.executeQuery();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;Fuentes&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;: Agile Web Development with Rails, wikipedia, AjpdSoft &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-2842661641962848609?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2842661641962848609/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2842661641962848609&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2842661641962848609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2842661641962848609'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/03/protegiendo-consultas-con.html' title='Protegiendo consultas con &quot;?&quot;'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/S6vzmz7fE6I/AAAAAAAAB20/AQcMBJDxIKg/s72-c/P57_L_simulador-de-inyeccion-para-los-gluteos.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2788825045003018085</id><published>2010-03-25T10:33:00.000-07:00</published><updated>2010-03-25T10:54:33.712-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>[Ruby] Atributos booleanos</title><content type='html'>-&lt;br /&gt;A nivel base de datos, muchos desarrolladores utilizan para valores booleanos un char(1) que contiene la "t" o "f", o sinó en español, "v" o "f". Otros utilizan los valores de tipo entero donde 0 es falso y 1 es verdadero. Incluso si la BD soporta tipo de datos boolenos (como MySQL y su tipo de columna bool) que podría ser almacenado directamente como 0 o 1 internamente.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;El problema es que en Ruby el número 0 y la cadena "f" son interpretados como verdadero en condiciones. Esto significa que si utilizamos el valor de la columna directamente, nuestro código interpretará la columna como verdadero cuando nosotros pensábamos que era falsa:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# NO HACER ESTO!!&lt;br /&gt;user = Users.find_by_name("Dave" )&lt;br /&gt;if user.superuser&lt;br /&gt;grant_privileges&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ruby tiene una simple definición de verdadero. Cualquier valor que no es &lt;i&gt;nil&lt;/i&gt; ni &lt;i&gt;false&lt;/i&gt; es verdadero.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# ES CORRECTO HACER:&lt;br /&gt;user = Users.find_by_name("Dave" )&lt;br /&gt;if user.superuser?&lt;br /&gt;grant_privileges&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Aquí se interpreta como falso sólo si es el número 0, una de las cadenas "0", "f", "false", o "" (cadena vacía), un cero, o la constante &lt;i&gt;false&lt;/i&gt;. De lo contrario, se interpreta como verdadero.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Fuente&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;: &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Agile Web Development with Rails - 3rd Edition&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-2788825045003018085?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2788825045003018085/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2788825045003018085&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2788825045003018085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2788825045003018085'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/03/ruby-atributos-booleanos.html' title='[Ruby] Atributos booleanos'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7685835030748130567</id><published>2010-01-02T16:27:00.000-08:00</published><updated>2010-01-03T22:26:09.932-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Grandes expectativas al usuario</title><content type='html'>-&lt;br /&gt;Una niña abre un regalo de Navidad y empieza a llorar, no era la muñeca barata que la niña estaba esperando. Un equipo del proyecto hace milagros para implementar una fenomenal y complejo aplicación, sólo para que sea rechazado por sus usuarios, ya que no tiene un sistema de ayuda.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/S0AOVZcTv6I/AAAAAAAABwY/Fs59eGDqitA/s1600-h/ni%C3%B1a.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 187px; height: 250px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/S0AOVZcTv6I/AAAAAAAABwY/Fs59eGDqitA/s320/ni%C3%B1a.jpg" alt="" id="BLOGGER_PHOTO_ID_5422349712123740066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En un sentido abstracto, una solicitud tiene éxito si se implementa correctamente sus especificaciones. Es decir, el éxito de un proyecto se mide por lo bien que se cumple con las expectativas de sus usuarios. Un proyecto que cae por debajo de sus expectativas es considerado un fracaso, no importa lo bueno de la realización en términos absolutos.&lt;br /&gt;&lt;br /&gt;Los usuarios llegan a usted con una visión de lo que quieren. Puede ser incompleta, inconsistente o técnicamente imposible, pero es de ellos, y, como la niña en Navidad, que hay algo de emoción invertido en ella. Usted no puede simplemente ignorarla.&lt;br /&gt;&lt;br /&gt;A medida que su comprensión de sus necesidades se desarrolla, encontrará en áreas donde las expectativas no se pueden cumplir, o cuando sus expectativas quizás son demasiado conservadoras. Parte de su papel es el de comunicarlo. Trabaje con los usuarios de modo que su comprensión de lo que va a entregar es exacta. Y hacer esto en todo el proceso de desarrollo. Nunca pierda de vista los problemas de negocio que su aplicación pretende resolver. Algunos consultores llaman a este proceso "gestión de las expectativas", de forma activa controlan lo que los usuarios deben esperar para obtener de sus sistemas. Nuestro papel no es controlar las esperanzas de nuestros usuarios. Sinó, trabajar con ellos para llegar a una común comprensión del proceso de desarrollo. Si el equipo está en comunicación fluida con el mundo exterior, este proceso es casi automático; todos deben entender lo que se espera y cómo se va a contruir.&lt;br /&gt;Existen algunas técnicas importantes que pueden utilizarse para facilitar este proceso. De estas, balas trazadoras, prototipos y Post-it, son las más importante. Ambos permiten al equipo construir algo que el usuario puede ver. Ambas son formas ideales de la comunicación, comprensión y requerimientos.&lt;br /&gt;&lt;br /&gt;Algunas cosas que se pueden añadir con relativa facilidad para lucir bien con el producto:&lt;br /&gt;- Información de herramientas que ayudan.&lt;br /&gt;- shortcuts.&lt;br /&gt;- Una guía de referencia rápida como suplemento del manual de usuario.&lt;br /&gt;- Colorización.&lt;br /&gt;- Analizador de archivo log.&lt;br /&gt;- Instalación automatizada.&lt;br /&gt;- Herramientas para verificar la integridad del sistema.&lt;br /&gt;- Una pantalla de bienvenida personalizado para su organización.&lt;br /&gt;&lt;br /&gt;Todas estas cosas son relativamente superficiales, no sobrecargan el sistema y tampoco altera el alcance de los requerimientos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7685835030748130567?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7685835030748130567/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7685835030748130567&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7685835030748130567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7685835030748130567'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2010/01/grandes-expectativas-al-usuario.html' title='Grandes expectativas al usuario'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/S0AOVZcTv6I/AAAAAAAABwY/Fs59eGDqitA/s72-c/ni%C3%B1a.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1309358280695403007</id><published>2009-12-30T06:01:00.000-08:00</published><updated>2009-12-30T15:26:03.730-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chris'/><title type='text'>Mi Retrospectva 2009</title><content type='html'>-&lt;br /&gt;Esto de la retrospectiva será el último post del año. Esto de retrospectiva personal me parece como jugar al #yoconfieso de twitter.&lt;br /&gt;&lt;br /&gt;El 1 de Enero este sencillo blog cumple 1 año. Los primeros post (Enero y Frebrero 2009) trataba de código y herramientas que había utilizado años atrás,  por esta razón tengo varios posts en los primeros meses.&lt;br /&gt;&lt;br /&gt;Me trazé muchas metas como aprender más lenguajes y tener más certificaciones Java, lo cual no pude llegar por varios motivos personales y laborales. Sin embargo, este 2010 los cumpliré. Me siento muy motivado, con la frente en alto  y olvidando los malos ratos que pasaron en este 2009. El hecho de cometer algunos errores me han servido como experiencia. Como lo escuché en el taller de Scrum Master: "El error es una inversión".&lt;br /&gt;&lt;br /&gt;Este año fue muy complicado para mi ya que tuve que llevar un proyecto largo y difícil que me mantenía muy ocupado, limitado por Jdk 1.4 no pude investigar y aplicar muchas cosas que había leido o escuchado. Y ahora mismo me encuentro finalizando ese proyecto :S&lt;br /&gt;&lt;br /&gt;Una de las cosas más importantes que me pasó este año es haber conocido mucha gente hábil y profesional, los cuales han sido fuente de motivación en el trabajo, en el blog y en la vida diaria.&lt;br /&gt;Después de haber escuchado y aprendido más del mundo del software y redes sociales, combinando mis experiencias y de las demás personas, se me presentan varios proyectos que tengo en mente. Bueno... pero eso ya es otra historia.&lt;br /&gt;&lt;br /&gt;Lo más rescatable del año es haber aprendido el framework Scrum y empezar a programar en RubyOnRails. XD&lt;br /&gt;&lt;br /&gt;Agradezco a muchas personas que me estuvieron apoyando en el transcurso del año entre ellas, los profesionales: &lt;a href="http://twitter.com/joedayz"&gt;@joedayz&lt;/a&gt; y &lt;a href="http://twitter.com/ccastillop"&gt;@ccastillop&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No muy conforme con los posts del blog (ya que no recibí muchos comentarios). En este 2010 me esforzaré mucho más.&lt;br /&gt;&lt;br /&gt;Nos leemos...  Feliz año nuevo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-1309358280695403007?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1309358280695403007/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1309358280695403007&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1309358280695403007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1309358280695403007'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/mi-retrospectva-2009.html' title='Mi Retrospectva 2009'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3500724874987576265</id><published>2009-12-23T17:11:00.000-08:00</published><updated>2009-12-23T18:00:22.651-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Resolviendo rompecabezas imposibles</title><content type='html'>&lt;span style="font-style: italic;"&gt;-&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-KMyjaI/AAAAAAAABtM/E9mvDTzc3iE/s1600-h/Alexander_cuts_the_Gordian_Knot.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 310px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-KMyjaI/AAAAAAAABtM/E9mvDTzc3iE/s400/Alexander_cuts_the_Gordian_Knot.jpg" alt="" id="BLOGGER_PHOTO_ID_5418615371407199650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Gordius, el rey de Frigia, una vez hizo un nudo que nadie podía desatar. Se dijo que el que resuelve el enigma del nudo gordiano podría dominar toda Asia. Así es como viene Alejandro Magno y partió el nudo en pedazos con su espada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Muchas veces el secreto para resolver el rompecabezas es identificar las reales (no imaginadas) limitaciones, y encontrar una solución en las mismas. Algunas restricciones son absolutas, otras son simplemente nociones preconcebidas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-_IN0wI/AAAAAAAABtk/qJVytTcI_d0/s1600-h/thinking-outside-the-box.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 183px; height: 141px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-_IN0wI/AAAAAAAABtk/qJVytTcI_d0/s400/thinking-outside-the-box.jpg" alt="" id="BLOGGER_PHOTO_ID_5418615385615094530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La frase popular "pensar fuera de la caja" nos anima a reconocer las limitaciones que podrían no ser aplicables y hacer caso omiso de ellos.&lt;br /&gt;Pero esta frase no es del todo exacto. Si la "caja" es el límite de las limitaciones y condiciones, el truco es encontrar la caja, que puede ser considerablemente mayor de lo que crees.&lt;br /&gt;La clave para resolver los rompecabezas es reconocer las limitaciones impuestas  y reconocer los grados de libertad que tienen.&lt;br /&gt;&lt;br /&gt;Por ejemplo, ¿se pueden conectar todos los puntos siguientes y volver al punto de partida con sólo tres líneas rectas, sin levantar la pluma del papel o volver sobre sus pasos?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-qKxQdI/AAAAAAAABtc/AHeuaMA-1_E/s1600-h/image-puntos"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 50px; height: 50px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-qKxQdI/AAAAAAAABtc/AHeuaMA-1_E/s400/image-puntos" alt="" id="BLOGGER_PHOTO_ID_5418615379988660690" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="result_box" class="long_text"&gt;No piense si está dentro de la caja o fuera de la caja. &lt;span title="The problem"&gt;El problema &lt;/span&gt;&lt;/span&gt;consiste en encontrar la caja, la identificación de las limitaciones reales.&lt;br /&gt;&lt;br /&gt;Cuando se enfrenta con un problema que crea imposible, enumere todos las posibles caminos que se tienen. No descarte nada, no importa cómo inutilizables o estúpido suenen. Ahora vea a través de la lista y explique por qué un cierto camino no puede ser tomado. ¿Estás seguro? ¿Puedes probarlo?&lt;br /&gt;&lt;br /&gt;Considere el caballo de Troya, una solución a un problema de difícil solución.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/SzLKRIa6_NI/AAAAAAAABts/MZTEVVVBZnY/s1600-h/ulysses_horse.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 126px; height: 169px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/SzLKRIa6_NI/AAAAAAAABts/MZTEVVVBZnY/s320/ulysses_horse.jpg" alt="" id="BLOGGER_PHOTO_ID_5418615697347116242" border="0" /&gt;&lt;/a&gt; ¿Cómo sacar a las tropas en una ciudad amurallada sin ser descubierto? Usted puede apostar: "a través de la puerta de entrada", fue descartado inicialmente como suicidio.&lt;br /&gt;&lt;br /&gt;Categorizar y priorizar sus limitaciones. Cuando los carpinteros inician un proyecto, cortan las piezas más largas en primer lugar, a continuación, cortan las piezas más pequeñas de la madera restante. De la misma manera, queremos identificar las limitaciones más restrictivas en primer lugar, y luego las restricciones que siguen dentro de ellas.&lt;br /&gt;&lt;br /&gt;Siempre hay un camino más fácil!!!!&lt;br /&gt;&lt;br /&gt;Puede ser el caso donde se llega tarde al desarrollo de un programa o incluso la desesperación de tener el sistema trabajando y vemos que el problema en particular es "imposible".&lt;br /&gt;&lt;br /&gt;Ahí es cuando hay que dar un paso atrás y hágacerse estas preguntas:&lt;br /&gt;&lt;br /&gt;• • ¿Existe una manera más fácil?&lt;br /&gt;• • ¿Estás tratando de resolver el problema correcto?   &lt;br /&gt;• • ¿Por qué es esto un problema?&lt;br /&gt;• • ¿Qué es lo que está haciendo tan difícil de resolver?&lt;br /&gt;• • ¿Tiene que hacerse de esta manera?&lt;br /&gt;• • ¿Tiene que hacerse en todos?&lt;br /&gt;&lt;br /&gt;Muchas veces una revelación sorprendente vendrá al tratar de responder una de estas preguntas. Muchas veces, una re-interpretación de los requerimientos de puede hacer desaparecer a un conjunto de problemas al igual que el nudo gordiano.&lt;br /&gt;Todo lo que necesitas son las limitaciones reales, las limitaciones engañosas, y la sabiduría para reconocer la diferencia.&lt;br /&gt;&lt;br /&gt;Ahh.. aquí está la solución de los puntos:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-dNintI/AAAAAAAABtU/H8ze9IPmgRI/s1600-h/puntos222.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 152px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-dNintI/AAAAAAAABtU/H8ze9IPmgRI/s400/puntos222.jpg" alt="" id="BLOGGER_PHOTO_ID_5418615376510623442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Fuente :  The Pragmatic Programmer : From Journeyman to Master&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3500724874987576265?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3500724874987576265/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3500724874987576265&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3500724874987576265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3500724874987576265'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/resolviendo-rompecabezas-imposibles.html' title='Resolviendo rompecabezas imposibles'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/SzLJ-KMyjaI/AAAAAAAABtM/E9mvDTzc3iE/s72-c/Alexander_cuts_the_Gordian_Knot.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1520091274933697392</id><published>2009-12-18T01:00:00.000-08:00</published><updated>2009-12-18T05:10:01.139-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Ejerciciós básicos de Refactorización</title><content type='html'>-&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Ejercicio 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El siguiente código, evidentemente, ha sido actualizado varias veces a lo largo de los años, pero los cambios no han mejorado su estructura. Refactorizar!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if (state == TEXAS) {&lt;br /&gt; rate = TX_RATE;&lt;br /&gt; amt = base * TX_RATE;&lt;br /&gt; calc = 2*basis(amt) + extra(amt)*1.05;&lt;br /&gt;}&lt;br /&gt;else if ((state == OHIO) || (state == MAINE)) {&lt;br /&gt; rate = (state == OHIO) ? OH_RATE : MN_RATE;&lt;br /&gt; amt = base * rate;&lt;br /&gt; calc = 2*basis(amt) + extra(amt)*1.05;&lt;br /&gt; if (state == OHIO)&lt;br /&gt;  points = 2;&lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt;  rate = 1;&lt;br /&gt;  amt = base;&lt;br /&gt;  calc = 2*basis(amt) + extra(amt)*1.05;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solución&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Podríamos sugerir una reestructuración bastante suave aquí: asegúrese de que cada prueba se realiza sólo una vez, y hacer todos los cálculos comunes. Si la expresión 2 * base (...) * 1.05 aparece en otros lugares en el programa, se debe, probablemente hacer una función. En este caso no es necesario.&lt;br /&gt;&lt;br /&gt;Hemos añadido un arreglo rate_lookup, inicializado para que las entradas distintos de Texas, Ohio y Maine tengan un valor de 1. Este enfoque hace que sea fácil de agregar los valores de otros estados a futuro.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;rate = rate_lookup[state];&lt;br /&gt;amt = base * rate;&lt;br /&gt;calc = 2*basis(amt) + extra(amt)*1.05;&lt;br /&gt;if (state == OHIO)&lt;br /&gt;points = 2;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Ejercicio 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Las siguientes clases Java necesitan soportar más "shapes". Refactorize la clase.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Shape {&lt;br /&gt; public static final int SQUARE = 1;&lt;br /&gt; public static final int CIRCLE = 2;&lt;br /&gt; public static final int RIGHT_TRIANGLE = 3;&lt;br /&gt;    &lt;br /&gt; private int shapeType;&lt;br /&gt; private double size;&lt;br /&gt; public Shape(int shapeType, double size) {&lt;br /&gt; this.shapeType = shapeType;&lt;br /&gt; this.size = size;&lt;br /&gt;}&lt;br /&gt;// ... other methods ...&lt;br /&gt;public double area() {&lt;br /&gt; switch (shapeType) {&lt;br /&gt; case SQUARE:     return size*size;&lt;br /&gt; case CIRCLE:     return Math.PI*size*size/4.0;&lt;br /&gt; case RIGHT_TRIANGLE: return size*size/2.0;&lt;br /&gt;}&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solución&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cuando usted ve a alguien usando los tipos enumerados (o sus equivalente en Java) para distinguir entre las variantes de un tipo, a menudo se puede mejorar el código por medio de subclases:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Shape {&lt;br /&gt; private double size;&lt;br /&gt; public Shape(double size) {&lt;br /&gt; this.size = size;&lt;br /&gt;}&lt;br /&gt;public double getSize() { return size; }&lt;br /&gt;}&lt;br /&gt;public class Square extends Shape {&lt;br /&gt; public Square(double size) {&lt;br /&gt; super(size);&lt;br /&gt;}&lt;br /&gt;public double area() {&lt;br /&gt; double size = getSize() ;&lt;br /&gt; return size*size;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;public class Circle extends Shape {&lt;br /&gt;public Circle(double size) {&lt;br /&gt; super(size);&lt;br /&gt;}&lt;br /&gt;public double area() {&lt;br /&gt; double size = getSize();&lt;br /&gt; return Math.PI*size*size/4.0;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;// etc...&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Ejercicio 3&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este código de Java es parte de un framework que se utilizará a través de su proyecto. Refactorizar para ser más general y más fácil de ampliar en el futuro.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Window {&lt;br /&gt;public Window(int width, int height) { ... }&lt;br /&gt;public void setSize(int width, int height) { ... }&lt;br /&gt;public boolean overlaps(Window w) { ... }&lt;br /&gt;public int getArea() { . . . }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solución&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este caso es interesante. A primera vista, parece razonable que un "window" (ventana) deba tener una anchura y una altura. Sin embargo, tenga en cuenta el futuro. Imaginemos que queremos apoyar de manera arbitraria las formas de las ventanas. (que será difícil, si sabe que la clase window conoce todo acerca de los rectángulos y sus propiedades).&lt;br /&gt;&lt;br /&gt;Sugerimos abstraer la forma de la ventanas de la Clase window.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public abstract class Shape {&lt;br /&gt;// ...&lt;br /&gt;public abstract boolean overlaps(Shape s);&lt;br /&gt;public abstract int getArea();&lt;br /&gt;}&lt;br /&gt;public class Window {&lt;br /&gt; private Shape shape;&lt;br /&gt; public Window(Shape shape) {&lt;br /&gt;   this.shape = shape;&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;public void setShape(Shape shape) {&lt;br /&gt; this.shape = shape;&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;public boolean overlaps(Window w) {&lt;br /&gt; return shape.overlaps(w.shape);&lt;br /&gt;}&lt;br /&gt;public int getArea() {&lt;br /&gt; return shape.getArea();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;También se podría haber extendido este ejemplo mediante la introducción de una interface Java, que especifica los métodos de una clase de apoyo que debe ser compatible con las funciones de shape.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Fuente : ThePragmatic Programmer: From Journeyman to Master&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-1520091274933697392?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1520091274933697392/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1520091274933697392&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1520091274933697392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1520091274933697392'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/ejercicios-basicos-de-refactorizacion.html' title='Ejerciciós básicos de Refactorización'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6874006822884840164</id><published>2009-12-15T15:58:00.000-08:00</published><updated>2009-12-16T10:38:20.636-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chris'/><category scheme='http://www.blogger.com/atom/ns#' term='Taller'/><category scheme='http://www.blogger.com/atom/ns#' term='SCRUM'/><category scheme='http://www.blogger.com/atom/ns#' term='metodologías ágiles'/><title type='text'>CSM done!</title><content type='html'>-&lt;br /&gt;Como lo estaba anunciando, asistí el sábado 12 y domingo 13 al primer curso de Certified Scrum Master (CSM) en Lima.&lt;br /&gt;&lt;br /&gt;En esa jornada de 2 días puedo decir que el curso a mi parecer fue excelente se realizaron buenas dinámicas, buenos ejemplos, me gustó mucho la metodología de eneseñanza utilizada por Alan Cyment.&lt;br /&gt;&lt;br /&gt;De los asistentes conocía a mucho por twitter, fue un agrado para mí el poder conocerlos personalmente. Todos los asistentes que fueron 24, trabajan en sistemas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sykfxk7OMDI/AAAAAAAABso/_8Wj3eGFHM8/s1600-h/origami.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 303px; height: 227px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sykfxk7OMDI/AAAAAAAABso/_8Wj3eGFHM8/s400/origami.jpg" alt="" id="BLOGGER_PHOTO_ID_5415894963475853362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Llevo trabajando un año con SCRUM ya que mis jefes conocen el concepto. Sin embargo, siempre me quedaban dudas en los procesos, roles y herramientas. Gracias a este curso despejé estas dudas y me encuentro con la motivación de aplicarlo en el trabajo y en la vida diaria.&lt;br /&gt;&lt;br /&gt;Este curso me a motivado mucho en seguir la corriente ágil, empezaré a asistir a las reuniones que realiza el grupo "Agile - Perú"&lt;br /&gt;&lt;br /&gt;Foto con Alan Cyment (@acyment)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SykUHhTg76I/AAAAAAAABsY/RQsqhkDmEjY/s1600-h/con+alan.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 279px; height: 209px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SykUHhTg76I/AAAAAAAABsY/RQsqhkDmEjY/s400/con+alan.jpg" alt="" id="BLOGGER_PHOTO_ID_5415882146321592226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Foto del grupo del curso&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SykUH5r9MiI/AAAAAAAABsg/ieNUH6xORO4/s1600-h/grupo.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SykUH5r9MiI/AAAAAAAABsg/ieNUH6xORO4/s400/grupo.jpg" alt="" id="BLOGGER_PHOTO_ID_5415882152866558498" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-6874006822884840164?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6874006822884840164/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6874006822884840164&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6874006822884840164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6874006822884840164'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/csm-done.html' title='CSM done!'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/Sykfxk7OMDI/AAAAAAAABso/_8Wj3eGFHM8/s72-c/origami.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-86504614742234531</id><published>2009-12-13T00:01:00.000-08:00</published><updated>2009-12-13T00:01:00.864-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Netbeans 6.8 y GlassFish V3</title><content type='html'>-&lt;br /&gt;Hace unos días me bajé la versión 6.8 de Netbeans para empezar a probarlo ya que tuve un poco de problemas con la versión 6.5 cuando programaba en Ruby y no aparecía bien el guión abajo ("_") ahora ya se ve en esta nueva versión&lt;br /&gt;&lt;br /&gt;Netbeans 6.8 ya viene integrado el servidor GlassFish V3 por defecto&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/SyJ_Po7O98I/AAAAAAAABiM/SHy70KSlkOI/s1600-h/testee.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 38px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/SyJ_Po7O98I/AAAAAAAABiM/SHy70KSlkOI/s320/testee.jpg" alt="" id="BLOGGER_PHOTO_ID_5414029608713385922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Al correr mi aplicación me apareció un error de informando de que no se pudo iniciar GlassFish, esto era porque el puerto 8080 ya estaba siendo utilizado por otro servidor de aplicaciones (tomcat).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SyKBJ1uuBeI/AAAAAAAABiU/9Qx7hbntkII/s1600-h/error.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 285px; height: 133px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SyKBJ1uuBeI/AAAAAAAABiU/9Qx7hbntkII/s320/error.png" alt="" id="BLOGGER_PHOTO_ID_5414031708094596578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;SEVERE: Shutting down v3 due to startup exception : Address already in use: 8080=com.sun.enterprise.v3.services.impl.monitor.MonitorableSelectorHandler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;br /&gt;Cambiar de Puerto&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para saber la ruta del archivo que hay que modificar para cambiar el puerto , entramos a la pestaña de Services, elegimos Server &gt; GlassFish V3 Domain (ese es el nombre que le coloqué).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SyKDPqzRMYI/AAAAAAAABik/rFbcyI-O9qU/s1600-h/glassfish.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 470px; height: 279px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SyKDPqzRMYI/AAAAAAAABik/rFbcyI-O9qU/s400/glassfish.png" alt="" id="BLOGGER_PHOTO_ID_5414034007263359362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Entramos a esa ruta "Domain Folder",  buscamos el "Domain Name" en mi caso es la carpeta "domain1", entramos a la carpeta config y finalmente al archivo "domain.xml". En este archivo modificamos el puerto 8080.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SyKExB7H09I/AAAAAAAABis/v9juym23pQk/s1600-h/8080.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 487px; height: 275px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SyKExB7H09I/AAAAAAAABis/v9juym23pQk/s400/8080.png" alt="" id="BLOGGER_PHOTO_ID_5414035679917626322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Guardamos el archivo y al reiniciar el servidor GlassFish debería levantar la aplicación.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-86504614742234531?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/86504614742234531/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=86504614742234531&amp;isPopup=true' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/86504614742234531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/86504614742234531'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/netbeans-68-y-glassfish-v3.html' title='Netbeans 6.8 y GlassFish V3'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/SyJ_Po7O98I/AAAAAAAABiM/SHy70KSlkOI/s72-c/testee.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1364433541763865167</id><published>2009-12-11T00:00:00.000-08:00</published><updated>2009-12-11T06:49:50.211-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Cómo refactorizar (tips)</title><content type='html'>-&lt;br /&gt;Si procede a arrancar grandes cantidades de código con desenfreno, usted puede encontrarse en una situación peor que cuando comenzó.&lt;br /&gt;&lt;br /&gt;Claramente, la refactorización es una actividad que debe llevarse a cabo lentamente, deliberadamente, y con cuidado. Martin Fowler ofrece los siguientes tips sencillos sobre la forma de refactorizar sin hacer más daño que bien:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.&lt;/span&gt; No trate de refactorizar y añadir funcionalidad al mismo tiempo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2.&lt;/span&gt; Asegúrese de que tenga buenas pruebas antes de comenzar la refactorización. Correr las pruebas con la mayor frecuencia posible. De esta forma usted sabrá rápidamente si sus cambios no han roto nada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.&lt;/span&gt; Tomar pasos cortos y deliberados: mover un campo de una clase a otro, fusione 2 métodos similares en una superclase. Refactorizando a menudo implica hacer muchos cambios que resultan un cambio a gran escala. Si guardas tus pequeños pasos, y pruebas después cada paso, evitarás una depuración prolongada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Fuente: The Pragmatic Programmer: From Journeyman to Master&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-1364433541763865167?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1364433541763865167/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1364433541763865167&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1364433541763865167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1364433541763865167'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/como-refactorizar-tips.html' title='Cómo refactorizar (tips)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-940081304032175471</id><published>2009-12-09T11:21:00.000-08:00</published><updated>2009-12-09T11:46:42.871-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Taller'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='SCRUM'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Primer CSM en Lima</title><content type='html'>-&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/Sx_7LZGfS-I/AAAAAAAABiA/HMAKo8PCEK0/s1600-h/csm_logo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 142px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/Sx_7LZGfS-I/AAAAAAAABiA/HMAKo8PCEK0/s400/csm_logo.gif" alt="" id="BLOGGER_PHOTO_ID_5413321450257861602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Viendo otras alternativas al desarrollo de software me inscribí al curso de Certificación Scrum Master.&lt;br /&gt;&lt;br /&gt;Gracias a &lt;a href="http://openedgetech.com/"&gt;Open Edge Technologies&lt;/a&gt; este fin de semana se llevará a cabo el primer curso de Certificación Scrum Master en Lima.&lt;br /&gt;&lt;br /&gt;Será este sábado 12 y domingo 13 de diciembre.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://openedgetech.com/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 275px; height: 275px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/Sx_7LP2BbUI/AAAAAAAABh4/BndORV6I8sc/s400/logo_96.png" alt="" id="BLOGGER_PHOTO_ID_5413321447772876098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;[De la página de &lt;a href="http://www.openedgetech.com/"&gt;Open Edge&lt;/a&gt;: ]&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://openedgetech.com/"&gt;&lt;span style="border-collapse: collapse; color: rgb(34, 34, 34); line-height: normal;font-family:'Lucida Grande';font-size:100%;" class="Apple-style-span"  &gt;&lt;h2   style="margin: 15px 0px 0px; padding: 0px; font-weight: bold; color: rgb(0, 0, 0);font-family:'Lucida Grande',arial,sans-serif;font-size:16px;"&gt;¿Qué es un ScrumMaster?&lt;/h2&gt;&lt;p  style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;font-size:14px;"&gt;Es un gestor (manager) de un proyecto ágil el cual pone el énfasis en la facilitación, liderazgo y comunicación por sobre las actividades tradicionales de dirigir y controlar. Para el framework Scrum, este rol es denominado “ScrumMaster” como un recordatorio constante de las diferencias entre la gestión de proyectos ágil y la tradicional. El rol del ScrumMaster implica maximizar los esfuerzos del equipo para alcanzar sus objetivos removiendo aquellos impedimentos que se encuentran en su camino.&lt;/p&gt;&lt;br /&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;El curso &lt;span class="caps"&gt;CSM&lt;/span&gt; cubrirá los siguientes conceptos (entre otros) a través de los dos días de ejercicios interactivos, clases y discusión:&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em; font-size: 14px;"&gt;- Introducción a Scrum&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Roles y Responsibilidades en Scrum&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Análisis de Requerimientos Ágil&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Estimación y Priorización del Product Backlog&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Planificación del Sprint, Ejecución, Revisión, y Retrospectiva&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Qué significa “Hecho”?&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Deuda Técnica y otros Errores&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Planificación del Release basada en Mediciones Empiricas&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Scrum en Organizaciones con Multiples equipos&lt;br /&gt;&lt;/p&gt;&lt;p size="14px" style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em;"&gt;- Q &amp;amp; A&lt;/p&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;h2 face="'Lucida Grande',arial,sans-serif" size="16px" style="margin: 15px 0px 0px; padding: 0px; font-weight: bold; color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;Instructor&lt;/span&gt;&lt;/h2&gt;&lt;p style="margin: 3px 0px 10px; padding: 0px; line-height: 1.4em; font-size: 14px;"&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.cyment.com/" target="_blank" title="Alan Cyment"&gt;Alan Cyment&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Más información &lt;a href="http://www.openedgetech.com/detalles.html"&gt;aquí&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-940081304032175471?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/940081304032175471/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=940081304032175471&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/940081304032175471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/940081304032175471'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/primer-csm-en-lima.html' title='Primer CSM en Lima'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/Sx_7LZGfS-I/AAAAAAAABiA/HMAKo8PCEK0/s72-c/csm_logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3167261210644150925</id><published>2009-12-07T00:00:00.000-08:00</published><updated>2009-12-07T10:40:16.355-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Cuando refactorizar</title><content type='html'>-&lt;br /&gt;Cuando te encuentras con un obstáculo, porque el código no encaja o si se notan dos cosas que realmente deberían fusionarse, o cualquier otra cosa que al descubrir se califique como "malo", no dude en cambiarlo.&lt;br /&gt;&lt;br /&gt;No hay momento como el actual. Cualquier número de cosas pueden causar para que el código esté calificado para refactorizar:&lt;br /&gt;&lt;br /&gt;-  &lt;span style="font-weight: bold;"&gt;Duplicación de esfuerzos&lt;/span&gt;. Has descubierto una violación del prinicipio DRY&lt;br /&gt;-  &lt;span style="font-weight: bold;"&gt;El diseño no ortogona&lt;/span&gt;l. Has descubierto algo de código o de diseño que podría ser más ortogonal&lt;br /&gt;-  &lt;span style="font-weight: bold;"&gt;Los conocimientos obsoletos&lt;/span&gt;. Las cosas cambian, los requerimientos se acumulan y el conocimiento del problema aumenta. El código debe mantener el ritmo.&lt;br /&gt;-  &lt;span style="font-weight: bold;"&gt;Rendimiento&lt;/span&gt;. Usted necesita mover la funcionalidad de un área del sistema a otro para mejorar el rendimiento.&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;Fuente : The pragmatic Programmer: From Journeyman to Master&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3167261210644150925?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3167261210644150925/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3167261210644150925&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3167261210644150925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3167261210644150925'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/cuando-refactorizar.html' title='Cuando refactorizar'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7270030866701991977</id><published>2009-12-05T13:23:00.000-08:00</published><updated>2009-12-05T16:17:18.297-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Refactorización - Software como jardín</title><content type='html'>&lt;blockquote style="font-style: italic;"&gt; -&lt;br /&gt;&lt;br /&gt;Cambio y decadencia veo en todas partes ...&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;H. F. Lyte, "Abide With Me"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como un programa que ev oluciona, será necesario replantear las decisiones anteriores y  rehacer porciones de código. Este proceso es perfectamente natural. El código tiene que evolucionar, no es algo estático.&lt;br /&gt;&lt;br /&gt;Por desgracia, la metáfora más común para el desarrollo de software es la construcción de edificios (Bertrand Meyer utiliza el término "Contrucción de Software ").&lt;br /&gt;&lt;br /&gt;Pero la construcción utilizando como metáfora de orientación implica estos pasos:&lt;br /&gt;&lt;br /&gt;1. 1. Un arquitecto elabora los planos.&lt;br /&gt;2. 2. Constructores (albañiles) que se encargan de excavar los cimientos, construir la estructura y aplicar los toques finales.&lt;br /&gt;3. 3. La satisfacción de los inquilino sde vivir felices siempre, llamando a la construcción de mantenimiento para solucionar cualquier problema.&lt;br /&gt;&lt;br /&gt;Bueno, el software no funciona de esa manera. En lugar de la construcción, el software es más como la jardinería (es más ecológico que el concreto).&lt;br /&gt;&lt;br /&gt;Siembras muchas plantas en un jardín de acuerdo con un plan inicial y condiciones.&lt;br /&gt;Algunos prosperan, otros están destinados a terminar como abono.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SxrwqqDRKyI/AAAAAAAABhY/s-21VuiPWx4/s1600-h/podar-plantas.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 174px; height: 260px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SxrwqqDRKyI/AAAAAAAABhY/s-21VuiPWx4/s320/podar-plantas.jpg" alt="" id="BLOGGER_PHOTO_ID_5411902517872241442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Se puede mover las plantaciones de uno respecto al otro para aprovechar la interacción de la luz y la sombra, el viento y la lluvia.&lt;br /&gt;Se puede mantener y separar las plantas podando, como también organizando los colores que se pueden obtener para tenerlo más agradable estéticamente.&lt;br /&gt;Usted tira las malas hierbas y fertiliza las plantaciones que están en necesidad de algunas ayudas extras.&lt;br /&gt;Usted supervisa constantemente la salud del jardín, y hace los ajustes (a la tierra, las plantas, al diseño) como sea necesario.&lt;br /&gt;&lt;br /&gt;La metáfora de la jardinería es mucho más cercano a las realidades de desarrollo de software. Tal vez una cierta rutina se ha vuelto demasiado grande, o está tratando de lograr demasiado, tiene que ser dividido en dos. Las cosas que no funcionan como la necesidad prevista tienen que ser eliminados o podadas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/Sxrw2uyshwI/AAAAAAAABhg/u7ydcq9z-TE/s1600-h/mi-jardin-es-tu-jardin.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/Sxrw2uyshwI/AAAAAAAABhg/u7ydcq9z-TE/s400/mi-jardin-es-tu-jardin.jpg" alt="" id="BLOGGER_PHOTO_ID_5411902725303338754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De reescritura, reelaboración, y re-arquitectura de código se conocen colectivamente como refactorización.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Fuente : The Pragmatic Programmer, From Journeyman to Master&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7270030866701991977?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7270030866701991977/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7270030866701991977&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7270030866701991977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7270030866701991977'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/12/refactorizacion-software-como-jardin.html' title='Refactorización - Software como jardín'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/SxrwqqDRKyI/AAAAAAAABhY/s-21VuiPWx4/s72-c/podar-plantas.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5141693372059586931</id><published>2009-11-22T09:04:00.000-08:00</published><updated>2009-11-22T09:22:17.598-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Manuales / Tutoriales'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Tutorial de Rails y REST</title><content type='html'>-&lt;br /&gt;"Es un hecho olvidado por muchos desarrolladores web de hoy que el protocolo HTTP puede hacer algo más que GETs y POSTs. Sin embargo, esto no resulta tan sorprendente si consideramos que los navegadores tan sólo soportan esas dos peticiones. GET y POST son los tipos de peticiones HTTP que se suelen transmitir del cliente a servidor, pero el protocolo HTTP también define los métodos PUT y DELETE que, en teoría se deberá usar para crear o borrar un recurso en la web."&lt;br /&gt;&lt;br /&gt;Así es como empieza el manual de 41 hojas que encontré de "Rails Y REST" el cual lo puedes descargar &lt;a href="http://www.b-simple.de/download/restful_rails_es.pdf"&gt;aquí&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Es un hecho de que muchos frameworks están migrando a esta arquitectura.&lt;br /&gt;Hace poco buscando información del contenido del libro "Pro Spring 3" encontré que uno de los temas a tratar es "REST in Spring MVC".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5141693372059586931?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5141693372059586931/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5141693372059586931&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5141693372059586931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5141693372059586931'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/11/blog-post.html' title='Tutorial de Rails y REST'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1160678053242173716</id><published>2009-11-19T11:15:00.000-08:00</published><updated>2009-11-19T12:11:12.148-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Programación por coincidencia</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;-&lt;br /&gt;El soldado y las minas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No hay indicios de que se trata de un campo de minas, no hay señales, alambre de púas, o cráteres.&lt;br /&gt;&lt;br /&gt;El soldado se asoma al suelo con su bayoneta y se estremece, esperando una explosión. Y no es explota. Así que procede a avanzar cuidadosamente a través del cam&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SwWhdDQI7-I/AAAAAAAABYQ/kzhT1_vs9Ms/s1600/soldado_minas.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 305px; height: 229px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SwWhdDQI7-I/AAAAAAAABYQ/kzhT1_vs9Ms/s320/soldado_minas.jpg" alt="" id="BLOGGER_PHOTO_ID_5405904448189427682" border="0" /&gt;&lt;/a&gt;po por un tiempo. Finalmente, convencido de que el campo es seguro, se endereza y marcha hacia adelante con orgullo, sólo para ser volado en pedazos.  :(&lt;br /&gt;&lt;br /&gt;La primera mina no reveló nada, solo fue suerte. Fue llevado a una conclusión falsa, con resultados desastrosos.&lt;br /&gt;Como desarrolladores, también trabajamos en los campos de minas. Hay cientos de trampas esperando para sorprendernos cada día. Recuerde el relato del soldado, que debe ser&lt;br /&gt;cuidadoso de sacar conclusiones falsas.&lt;br /&gt;Debemos evitar la programación por coincidencia, confiar en la suerte y éxitos accidentales.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;¿Cómo programar deliberadamente?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;• • Siempre estar consciente de lo que se está haciendo. No dejar que las cosas se nos pase poco a poco de las manos, hasta que terminemos cocidos como la rana hervida.&lt;br /&gt;&lt;br /&gt;• • No codifique con los ojos vendados. El intento de construir una aplicación que no entiende completamente, o para usar una tecnología que no está familiarizado, es una invitación a dejarse engañar por las coincidencias.&lt;br /&gt;&lt;br /&gt;• • Proceda de un plan, ya que el plan está en su cabeza, en la parte de atrás de una servilleta de papel, en una pizarra, en la pared, etc.&lt;br /&gt;&lt;br /&gt;• • Confíe sólo en las cosas confiables. No dependa de accidentes o de supuestos. Si usted no puede decir la diferencia, en particular, o circunstancias. Suponer es lo peor.&lt;br /&gt;&lt;br /&gt;• • Documente sus suposiciones, lo puede ayudar a aclarar sus supuestos en su propia mente, así como ayudar a comunicárselo a los demás.&lt;br /&gt;&lt;br /&gt;• • No se limite a probar el código, sino probar su hipótesis.&lt;br /&gt;No trate de adivinar, si en realidad no lo a intentado.&lt;br /&gt;&lt;br /&gt;• • Dar prioridad a su esfuerzo. Pase más tiempo en los aspectos importantes.&lt;br /&gt;Es muy probable que sean las partes más duras.&lt;br /&gt;&lt;br /&gt;• • No seas un esclavo de la historia. No deje que el código existente dicte el futuro de tu código. Todo el código puede ser reemplazado si ya no es apropiado. Incluso dentro de un programa, no deje que lo que has hecho ya, limite lo que próximamente esté listo para refactorizar.&lt;br /&gt;Estas decisiones pueden influir en la programación del proyecto. El supuesto es que el impacto será menor que el costo de no hacer el cambio.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Fuente :  The Pragmatic Programmer From Journeyman to Master&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-1160678053242173716?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1160678053242173716/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1160678053242173716&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1160678053242173716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1160678053242173716'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/11/programacion-por-coincidencia.html' title='Programación por coincidencia'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/SwWhdDQI7-I/AAAAAAAABYQ/kzhT1_vs9Ms/s72-c/soldado_minas.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7459129749603391160</id><published>2009-11-16T04:50:00.000-08:00</published><updated>2009-11-17T04:15:51.073-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SCWCD'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>[Java] Expurgando sesiones</title><content type='html'>Cuando abrimos una sesión ( request.getSession() ) nosotros la podemos manipular, como por ejemplo para que la sesión no muera y dure más tiempo, por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;session.setTimeout(Integer.MAX_VALUE);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Una de las preguntas del SCWCD es ¿cual es la llamada para asegurar que la sesión nunca será expurgada por el servlet container?&lt;br /&gt;&lt;br /&gt;Rpta&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;session.setMaxInactiveInterval(-1);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Otra de las preguntas es: ¿Cómo puede asegurar que ninnguna de las sesiones asociadas a la aplicación web serán expurgadas por el servlet context?&lt;br /&gt;&lt;br /&gt;Rpta:&lt;br /&gt;En el web.xml :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;web-app&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;session-config&amp;gt;  &lt;br /&gt; &amp;lt;session-timeout&amp;gt;0&amp;lt;/session-timeout&amp;gt;&lt;br /&gt;&amp;lt;/session-config&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El valor del timeout puede ser "0" o "1".&lt;br /&gt;&lt;br /&gt;El setMaxInactiveInterval(-1) solo afecta a la sesión que es llamada.&lt;br /&gt;El &lt;session-config&gt; elemento de web.xml afecta a toda la aplicación web.&lt;/session-config&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7459129749603391160?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7459129749603391160/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7459129749603391160&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7459129749603391160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7459129749603391160'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/11/java-expurgando-sesiones.html' title='[Java] Expurgando sesiones'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4462570825540367129</id><published>2009-11-14T09:36:00.000-08:00</published><updated>2009-11-14T09:36:00.382-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Ley de Demeter para funciones</title><content type='html'>La ley de Demeter intenta minimizar el acoplamiento entre los módulos. Se trata de evitar que se alcanze en un objeto accesos  a métodos de un objeto de terceros.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/Svr5n3ip3-I/AAAAAAAABYI/onudD67DbtM/s1600-h/Ley+de+Demeter.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 287px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/Svr5n3ip3-I/AAAAAAAABYI/onudD67DbtM/s400/Ley+de+Demeter.bmp" alt="" id="BLOGGER_PHOTO_ID_5402905166303846370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En este ejemplo no está permitido de acuerdo a la Ley de Demter&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void showBalance(BankAccount acct) {&lt;br /&gt;  Money amt = acct.getBalance();&lt;br /&gt;  printToScreen(amt.printFormat());&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La variable acct se pasa como un parámetro, por lo que el GetBalance está permitido. Llamadas a amt.printFormat (), sin embargo, no lo es. Podríamos eliminar el acoplamiento de showBalance con algo como esto:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void showBalance(BankAccount b) {&lt;br /&gt;  b.printBalance();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Fuente : The Pragmatic Programmer; From Journeyman to Master&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4462570825540367129?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4462570825540367129/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4462570825540367129&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4462570825540367129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4462570825540367129'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/11/ley-de-demeter-para-funciones.html' title='Ley de Demeter para funciones'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/Svr5n3ip3-I/AAAAAAAABYI/onudD67DbtM/s72-c/Ley+de+Demeter.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2064578844320535800</id><published>2009-11-12T05:56:00.000-08:00</published><updated>2009-12-06T16:25:09.821-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Primer evento Java Day en la UNI - Lima</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/SvlzB8BIlDI/AAAAAAAABX4/eQzX3huHBnQ/s1600-h/dukeuni.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 241px; height: 241px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/SvlzB8BIlDI/AAAAAAAABX4/eQzX3huHBnQ/s400/dukeuni.gif" alt="" id="BLOGGER_PHOTO_ID_5402475705135567922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La Universidad Nacional de Ingeniería invita a todo publico en general al primer evento organizacido gracias &lt;a href="http://osum.sun.com/group/javauni" target="_blank"&gt;OSUM &lt;/a&gt;y SUN.&lt;br /&gt;&lt;p&gt;En la ciudad de Lima, Perú este &lt;strong&gt;26 de Noviembre del 2009&lt;/strong&gt;.&lt;br /&gt;&lt;strong&gt;Lugar:&lt;/strong&gt; Auditorio  CTIC de la Universidad Nacional de Ingeniería.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;Dos de mis compañeros estarán presentes exponiendo José Díaz (&lt;a href="http://twitter.com/joedayz"&gt;@joedayz&lt;/a&gt;) y Juan Carlos Vergara&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Sesiones:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;strong&gt;Presentación de Open Source University Meeting (OSUM) and Sun Academic Initiative (SAI)&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Diseño dirigido por pruebas  – TDD ( &lt;/strong&gt;&lt;strong&gt;Test Driven Development )&lt;/strong&gt; – Juan Carlos Vergara&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Lo Nuevo de JavaEE6 – &lt;/strong&gt;Diego Silva&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Spring ROO&lt;/strong&gt;- José Diaz&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Spring MVC&lt;/strong&gt;- Susan Inga&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Service Oriented Architecture (SOA)&lt;/strong&gt; – &lt;span style="font-size:10;"&gt;&lt;span style="font-size:100%;"&gt;Javier Rosado Carrizo&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Entrega &lt;/strong&gt;&lt;strong&gt;de premios a los asistentes.&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Coffee Break de despedida&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Horario:&lt;/strong&gt; 7 pm a 10:30pm&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Entrada: &lt;/strong&gt;Libre&lt;/p&gt; &lt;strong&gt;Auditorio :&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/SvlzCMxRMAI/AAAAAAAABYA/zusiKOHJhEY/s1600-h/auditorio.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 494px; height: 370px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/SvlzCMxRMAI/AAAAAAAABYA/zusiKOHJhEY/s400/auditorio.jpg" alt="" id="BLOGGER_PHOTO_ID_5402475709632425986" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-2064578844320535800?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2064578844320535800/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2064578844320535800&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2064578844320535800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2064578844320535800'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/11/primer-evento-java-day-en-la-uni-lima.html' title='Primer evento Java Day en la UNI - Lima'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/SvlzB8BIlDI/AAAAAAAABX4/eQzX3huHBnQ/s72-c/dukeuni.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-8672399006852188460</id><published>2009-11-10T04:29:00.000-08:00</published><updated>2009-11-11T10:00:21.933-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Balanceando Recursos</title><content type='html'>Todos administramos nuestros recursos cada vez que codificamos: memoria, operaciones, hilos, temporizadores, todo tipo de cosas con una disponibilidad limitada. La mayoría de las veces usar los recursos siguen un patrón predecible:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Asignar el recurso,&lt;/li&gt;&lt;li&gt;Usarlo&lt;/li&gt;&lt;li&gt;Liberarlo&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Sin embargo muchos desarrolladores no tienen ningún plan coherente para hacer frente a la asignación y cancelación de recursos.&lt;br /&gt;&lt;br /&gt;Tip: "Termina lo que empiezas"&lt;br /&gt;&lt;br /&gt;Este tip es fácil de aplicar en la mayoría de las circunstancias. Simplemente significa que la rutina o el objeto que asigna un recurso debe ser responsable de eliminarlo. Vamos a ver cómo se aplica al mirar un ejemplo de mal código, una aplicación que abre un archivo, lee la información del cliente, actualiza un campo, y escribe el resultado.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void readCustomer(const char *fName, Customer *cRec) {&lt;br /&gt;cFile = fopen(fName, "r+");&lt;br /&gt;fread(cRec, sizeof(*cRec), 1, cFile);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void writeCustomer(Customer *cRec) {&lt;br /&gt;rewind(cFile);&lt;br /&gt;fwrite (cRec, sizeof(*cRec), 1, cFile);&lt;br /&gt;fclose(cFile);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void updateCustomer(const char *fName, double newBalance) {&lt;br /&gt;Customer cRec;&lt;br /&gt;readCustomer(fName, &amp;amp;cRec);&lt;br /&gt;cRec.balance = newBalance;&lt;br /&gt;writeCustomer(&amp;amp;cRec);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A primera vista, el &lt;span style="font-style: italic;"&gt;updateCustomer&lt;/span&gt; rutina se ve muy bien. Parece aplicar la lógica que requiere la lectura de un registro, la actualización del balance y escribir el registro. Sin embargo, esta limpieza se esconde una de los principales problemas. Las rutinas &lt;span style="font-style: italic;"&gt;readCustomer&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;writeCustomer&lt;/span&gt; están fuertemente acoplados. Comparten la variable global &lt;span style="font-style: italic;"&gt;cFile.readCustomer&lt;/span&gt; abre el archivo y&lt;br /&gt;almacena el puntero de archivo en &lt;span style="font-style: italic;"&gt;CFile&lt;/span&gt; y utiliza &lt;span style="font-style: italic;"&gt;writeCustomer&lt;/span&gt; que almacena el puntero para cerrar el archivo cuando termine. Esta variable global ni siquiera aparece en la rutina &lt;span style="font-style: italic;"&gt;updateCustomer&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;¿Por qué esto está mal? Vamos a considerar que el programador de mantenimiento lamentablemente se le dice que las condiciones han cambiado, el proceso debe realizarse solo cuando el nuevo valor no es negativo. En &lt;span style="font-style: italic;"&gt;updateCustomer&lt;/span&gt; el cambio sería algo así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void updateCustomer(const char *fName, double newBalance) {&lt;br /&gt;Customer cRec;&lt;br /&gt;readCustomer(fName, &amp;amp;cRec);&lt;br /&gt;if (newBalance &gt;= 0.0) {&lt;br /&gt;cRec.balance = newBalance;&lt;br /&gt;writeCustomer(&amp;amp;cRec);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Todo parece muy bien durante la prueba. Sin embargo, cuando el código va a producción, se derrumba después de varias horas, porque hay archivos abiertos y el &lt;span style="font-style: italic;"&gt;writeBalance&lt;/span&gt; no está recibiendo llamadas en algunas circunstancias, por lo tanto el archivo no se está cerrando.&lt;br /&gt;Una mala solución para este problema sería el de tratar con el caso especial en el&lt;span style="font-style: italic;"&gt; updateCustomer&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void updateCustomer(const char *fName, double newBalance) {&lt;br /&gt;Customer cRec;&lt;br /&gt;readCustomer(fName, &amp;amp;cRec);&lt;br /&gt;if (newBalance &gt;= 0.0) {&lt;br /&gt;cRec.balance = newBalance;&lt;br /&gt;writeCustomer(&amp;amp;cRec);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;fclose(cFile);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esto solucionará el problema en el archivo para que el archivo se cierre, pero aún está presente el acoplamiento en las rutinas por la variable global &lt;span style="font-style: italic;"&gt;CFile&lt;/span&gt;. Esto es una mala práctica, y las cosas van a empezar a ir derrumbarse rápidamente si seguimos por este camino.&lt;br /&gt;El tip nos dice que, idealmente, la rutina que asigna un recurso también debe liberarlo.&lt;br /&gt;Aplicando el código de refactorización, tenemos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void readCustomer(FILE *cFile, Customer *cRec) {&lt;br /&gt;fread(cRec, sizeof(*cRec), 1, cFile);&lt;br /&gt;}&lt;br /&gt;void writeCustomer(FILE *cFile, Customer *cRec) {&lt;br /&gt;rewind(cFile);&lt;br /&gt;fwrite(cRec, sizeof(*cRec), 1, cFile);&lt;br /&gt;}&lt;br /&gt;void updateCustomer(const char *fName, double newBalance) {&lt;br /&gt;FILE *cFile;&lt;br /&gt;Customer cRec;&lt;br /&gt;cFile = fopen(fName, "r+");      // &gt;---&lt;br /&gt;readCustomer(cFile, &amp;amp;cRec);        //      /&lt;br /&gt;if (newBalance &gt;= 0.0) {           //      /&lt;br /&gt;cRec.balance = newBalance;       //      /&lt;br /&gt;writeCustomer(cFile, &amp;amp;cRec);     //      /&lt;br /&gt;}                                  //      /&lt;br /&gt;fclose(cFile);                     // &lt;--- }  &lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ahora toda la responsabilidad por el archivo está en la rutina &lt;span style="font-style: italic;"&gt;updateCustomer&lt;/span&gt;. Ello abre el archivo y (terminar lo que comienza) lo cierra antes de salir.&lt;br /&gt;La refactorización también elimina una variable horrible variable global XD&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;Fuente: the Pragmatic Programmer: From Journeyman to Master&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-8672399006852188460?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/8672399006852188460/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=8672399006852188460&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8672399006852188460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8672399006852188460'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/11/balanceando-recursos.html' title='Balanceando Recursos'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3821056069722432297</id><published>2009-11-04T09:27:00.000-08:00</published><updated>2009-11-04T13:57:40.939-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Cuando usar Excepciones</title><content type='html'>Primero definamos "Manejo de Excepción" (Wikipedia):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt;El &lt;/span&gt;&lt;b style="font-style: italic; color: rgb(0, 102, 0);"&gt;manejo de excepciones&lt;/b&gt;&lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt; es una &lt;/span&gt;&lt;a style="font-style: italic; color: rgb(0, 102, 0);" href="http://es.wikipedia.org/wiki/Estructura_de_control" title="Estructura de control"&gt;estructura de control&lt;/a&gt;&lt;span style="font-style: italic; color: rgb(0, 102, 0);"&gt; de los &lt;/span&gt;&lt;a style="font-style: italic; color: rgb(0, 102, 0);" href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n" title="Lenguaje de programación"&gt;lenguajes de programación&lt;/a&gt; diseñada para manejar condiciones anormales que pueden ser tratadas por el mismo programa que se desarrolla.&lt;br /&gt;&lt;br /&gt;Dado el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;retcode = OK;&lt;br /&gt;if (socket.read(name) != OK) {&lt;br /&gt;retcode = BAD_READ;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;processName(name);&lt;br /&gt;if (socket.read(address) != OK) {&lt;br /&gt; retcode = BAD_READ;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;  processAddress(address);&lt;br /&gt;  if (socket.read(telNo) != OK) {&lt;br /&gt;  retcode = BAD_READ;&lt;br /&gt;}&lt;br /&gt;else {&lt;br /&gt;// etc, etc...&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return retcode;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Al usar excepciones:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;retcode = OK;&lt;br /&gt;try {&lt;br /&gt;socket.read(name);&lt;br /&gt;process(name);&lt;br /&gt;socket.read(address);&lt;br /&gt;processAddress(address);&lt;br /&gt;socket.read(telNo);&lt;br /&gt;// etc, etc...&lt;br /&gt;}&lt;br /&gt;catch (IOException e) {&lt;br /&gt;retcode = BAD_READ;&lt;br /&gt;Logger.log("Error reading individual: " + e.getMessage());&lt;br /&gt;}&lt;br /&gt;return retcode;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Qué es excepcional?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uno de los problemas con las excepciones consiste en saber cuándo usarlas.&lt;br /&gt;Las excepciones deben ser reservados para eventos inesperados.&lt;br /&gt;Suponga que una excepción no detectada dará terminado su programa y te preguntas "¿El código correrá si quito los manejadores de excepciones?" Si la respuesta es "no", entonces tal vez  está siendo utilizado en cinrcunstancia no excepcional.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si el código intenta abrir un archivo para leerlo y el archivo no existe, debería plantearse una excepción?&lt;br /&gt;Nuestra respuesta es "depende". Si el archivo debería haber estado allí, entonces una excepción es justificada, Por otra parte, si usted no tienen idea de que si el archivo debe existir o no, entonces no parece excepcional si no lo encuentra y retorna un error apropiado.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;El siguiente código abre el archivo / etc / passwd, que debe existir en sistemas Unix. Si falla, pasa a un FileNotFoundException.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public void open_passwd() throws FileNotFoundException {&lt;br /&gt;// This may throw FileNotFoundException...&lt;br /&gt;ipstream = new FileInputStream("/etc/passwd");&lt;br /&gt;// ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, el segundo caso puede implicar la apertura de un archivo especificado por el usuario en la línea de comandos. He aquí una excepción no está justificada, y el aspecto del código diferente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public boolean open_user_file(String name)&lt;br /&gt;                 throws FileNotFoundException {&lt;br /&gt;File f = new File(name);&lt;br /&gt;if (!f.exists()) return false;&lt;br /&gt;ipstream = new FileInputStream(f);&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Tenga en cuenta que la llamada FileInputStream todavía puede generar una excepción. Sin embargo, la excepción se genera únicamente en circunstancias verdaderamente excepcionales; simplemente tratando de abrir un archivo que no existe generará un retorno de error convencional.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tip 34&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Use Exceptions for Exceptional Problems&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Fuente: The Pragmatic Programmer From Journeyman to Master&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3821056069722432297?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3821056069722432297/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3821056069722432297&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3821056069722432297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3821056069722432297'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/11/cuando-usar-excepciones.html' title='Cuando usar Excepciones'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-492396692598345170</id><published>2009-11-02T16:30:00.000-08:00</published><updated>2009-11-02T16:56:06.232-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Diagrama de Efecto</title><content type='html'>Siguiendo con las metodologías ágiles y la identificación de problemas que ocurren en la fabricación de software. Comencé a realizar un &lt;span style="font-weight: bold;"&gt;diagrama de efect&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;o&lt;/span&gt; para una actividad en particular.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El diagrama de efecto&lt;/span&gt; nos permite identificar factores que pueden ocasionar efectos negativos para la actividad a realizar. El diagrama puede trabajarse en grupo o individualmente (reflexión personal).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Su9_mUapXfI/AAAAAAAABXY/S66mjDtor3I/s1600-h/efect.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 298px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Su9_mUapXfI/AAAAAAAABXY/S66mjDtor3I/s400/efect.jpg" alt="" id="BLOGGER_PHOTO_ID_5399674774532742642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pasos a seguir:&lt;br /&gt;&lt;br /&gt;1) Brainstorming, apuntando factores medibles, cada factor en un posit. Utilizar el símbolo de unidades (#). ejemplo: # de horas de aprendizaje&lt;br /&gt;2) Colocar las notas en una pizarra  y buscar las relaciones entre ellas.&lt;br /&gt;3) Mover las notas y relacionarlas con una flecha, seguidamente cologar el signo (+) si influye positivamente o (-) si influye negativamente.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/Su9-RAk3gcI/AAAAAAAABXQ/hbX-LOMRUTs/s1600-h/efecto_diagrama.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/Su9-RAk3gcI/AAAAAAAABXQ/hbX-LOMRUTs/s400/efecto_diagrama.jpg" alt="" id="BLOGGER_PHOTO_ID_5399673308918022594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Más información:&lt;br /&gt;Fuente: Agile Coaching : &lt;a href="http://agilecoach.typepad.com/agile-coaching/2009/10/how-to-create-a-diagram-of-effects.html"&gt;How to Create a Diagram of effects&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-492396692598345170?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/492396692598345170/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=492396692598345170&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/492396692598345170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/492396692598345170'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/11/diagrama-de-efecto.html' title='Diagrama de Efecto'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/Su9_mUapXfI/AAAAAAAABXY/S66mjDtor3I/s72-c/efect.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3460514054364273284</id><published>2009-10-29T19:07:00.000-07:00</published><updated>2009-10-29T19:29:30.598-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>[Ruby on Rails] ¿El Model con mayúscula o con minúscula?</title><content type='html'>Volviendo después de tiempo a programar en Ruby on Rails y repasando el libro con el que me inicié en este lenguaje "Agile Web Development with Ruby on Rails" (3ra edición).&lt;br /&gt;&lt;br /&gt;Estaba revisando la parte del carro de compras y rápidamente empecé a generar las clases. Al ejecutar el proyecto me salió el siguiente error:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; NameError in StoreController#add_to_cart&lt;br /&gt;&lt;br /&gt;uninitialized constant StoreController::Cart &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El error me dice que no está inicializando el objeto Cart.&lt;br /&gt;&lt;br /&gt;El problema que había tenido es porque el archivo de la clase la nombré como Cart.rb en vez de cart.rb&lt;br /&gt;&lt;br /&gt;Puede crear cierta confusión ya que el nombre de la clase internamente se trabaja con mayúscula.&lt;br /&gt;&lt;br /&gt;Se nota que vengo de Java  =S&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3460514054364273284?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3460514054364273284/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3460514054364273284&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3460514054364273284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3460514054364273284'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/10/ruby-on-rails-el-model-con-mayuscula-o.html' title='[Ruby on Rails] ¿El Model con mayúscula o con minúscula?'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4652843970825721946</id><published>2009-10-27T10:28:00.000-07:00</published><updated>2009-10-27T10:28:00.589-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Configuración Tomcat 6 en Netbeans sobre Ubuntu</title><content type='html'>Al crear un proyecto Web en Java sobre Netbeans, me pide configurar el Tomcat, luego de darle la ruta del tomcat me mostraba un error de que no encontraba el server.xml&lt;br /&gt;&lt;br /&gt;(catalina_home)/conf/server.xml is not valid&lt;br /&gt;&lt;br /&gt;Antes de configurar el tomcat, bajamos el Tomcat6 via Synaptic Package Manager.&lt;br /&gt;&lt;br /&gt;Ubuntu instala el server.xml en etc/tomcat6&lt;br /&gt;&lt;br /&gt;por esta razón ejecutamos :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo ln -s /etc/tomcat6 /usr/share/tomcat6/conf &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Luego en el netbeans le damos la nueva ruta del tomcat (usr/share/tomcat6)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4652843970825721946?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4652843970825721946/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4652843970825721946&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4652843970825721946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4652843970825721946'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/10/configuracion-tomcat-6-en-netbeans.html' title='Configuración Tomcat 6 en Netbeans sobre Ubuntu'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-8296430154454855473</id><published>2009-10-25T18:15:00.000-07:00</published><updated>2009-10-25T19:21:39.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Debug Ruby Netbeans 6.5</title><content type='html'>Al querer realizar debug a código Ruby en Netbeans, se muestra el mensaje para instalar &lt;span style="font-weight: bold;"&gt;fast debugger&lt;/span&gt; el cual no me permite instalar.&lt;br /&gt;&lt;br /&gt;Para realizar la instalación se debe bajar la gem ruby-debug-ide:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;gem install --ignore-dependencies -v 0.3.4 ruby-debug-ide&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;al iniciar NetBeans se podrá utilizar la opción de debug&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-8296430154454855473?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/8296430154454855473/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=8296430154454855473&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8296430154454855473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8296430154454855473'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/10/debug-ruby-netbeans-65.html' title='Debug Ruby Netbeans 6.5'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5375627159735315244</id><published>2009-10-22T19:47:00.000-07:00</published><updated>2009-10-22T19:53:32.947-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter List Ruby Programmer</title><content type='html'>Aprovechando la nueva característica de Twitter que es el "listado" que sirve para agrupar usuarios de twitter. He creado una lista de programadores reconocidos en Ruby, entre ellos: David Heinemeier Hansson, Sam Ruby, etc.&lt;br /&gt;&lt;br /&gt;Probablemente me he pasado alguno.. pero lo agregaré en el camino.&lt;br /&gt;&lt;br /&gt;La lista es &lt;a href="http://twitter.com/ckomiya/rubylist#list"&gt;http://twitter.com/ckomiya/rubylist#list&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Follow me!!&lt;br /&gt;&lt;br /&gt;Nos leemos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5375627159735315244?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5375627159735315244/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5375627159735315244&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5375627159735315244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5375627159735315244'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/10/twitter-list-ruby-programmer.html' title='Twitter List Ruby Programmer'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2802173855625058554</id><published>2009-10-11T10:05:00.000-07:00</published><updated>2009-10-11T10:05:00.219-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><title type='text'>Instalación de Drupal 6 en Ubuntu 9.04</title><content type='html'>Con la intención de crear sistemas de gestión de contenido para sitios Web rápidamente y ver las novedades que trae de drupal 6.  Me animé a realizar la instalación:&lt;br /&gt;&lt;br /&gt;1) Debemos tener el servidor apache instalado en nuestro equipo (apache2) y base de datos MySql&lt;br /&gt;&lt;br /&gt;2) Instalar drupal6 vía Synaptic Package Manager.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/StDDQy0Hx0I/AAAAAAAABWQ/DDEcVKgHlII/s1600-h/Screenshot-Synaptic+Package+Manager+.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 226px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/StDDQy0Hx0I/AAAAAAAABWQ/DDEcVKgHlII/s400/Screenshot-Synaptic+Package+Manager+.png" alt="" id="BLOGGER_PHOTO_ID_5391023447248193346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cuando instalemos nos pedirá el password de la BD Mysql&lt;br /&gt;- Con esto se creará una base de datos vacía con nombre "drupal6"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) Por terminal levantamos el servidor apache con el siguiente comando:&lt;br /&gt;sudo /etc/init.d/apache2 start&lt;br /&gt;&lt;br /&gt;Para detener, con :&lt;br /&gt;sudo /etc/init.d/apache2 stop&lt;br /&gt;&lt;br /&gt;4) Si tratamos de ingresar a la página &lt;a href="http://localhost/drupal6/"&gt;http://localhost/drupal6/&lt;/a&gt; nos mostrarán errores señalando que no existen algunas tablas, algo similar a esto:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Table 'drupal6.access' doesn't exist query: SELECT 1 FROM access WHERE&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;type = 'host' AND LOWER('86.31.36.218') LIKE LOWER(mask) AND status = 0 LIMIT&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;0, 1 in /usr/share/drupal6/includes/database.mysql.inc on line 128&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: session_start() [function.session-start]: Cannot send session cookie -&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;headers already sent by (output started at&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/database.mysql.inc:128) in&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/bootstrap.inc on line 995&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: session_start() [function.session-start]: Cannot send session cache&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;limiter - headers already sent (output started at&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/database.mysql.inc:128) in&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/bootstrap.inc on line 995&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Table 'drupal6.cache' doesn't exist query: SELECT data, created,&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;headers, expire, serialized FROM cache WHERE cid = 'variables' in&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/database.mysql.inc on line 128&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Table 'drupal6.variable' doesn't exist query: SELECT * FROM variable&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;in /usr/share/drupal6/includes/database.mysql.inc on line 128&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Table 'drupal6.cache' doesn't exist query: UPDATE cache SET data = '',&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;created = 1239606543, expire = 0, headers = '', serialized = 0 WHERE cid =&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;'variables' in /usr/share/drupal6/includes/database.mysql.inc on line 128&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Table 'drupal6.system' doesn't exist query: SELECT name, filename,&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;throttle FROM system WHERE type = 'module' AND status = 1 AND bootstrap = 1&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;ORDER BY weight ASC, filename ASC in&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/database.mysql.inc on line 128&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Cannot modify header information - headers already sent by (output&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;started at /usr/share/drupal6/includes/database.mysql.inc:128) in&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/bootstrap.inc on line 596&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Cannot modify header information - headers already sent by (output&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;started at /usr/share/drupal6/includes/database.mysql.inc:128) in&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/bootstrap.inc on line 597&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Cannot modify header information - headers already sent by (output&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;started at /usr/share/drupal6/includes/database.mysql.inc:128) in&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/bootstrap.inc on line 598&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Cannot modify header information - headers already sent by (output&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;started at /usr/share/drupal6/includes/database.mysql.inc:128) in&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;/usr/share/drupal6/includes/bootstrap.inc on line 599&lt;/span&gt;  &lt;span style="color: rgb(51, 153, 153);"&gt;Warning: Table 'drupal6.url_alias' doesn't exist query: SELECT COUNT(pid) FROM&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;url_alias in /usr/share/drupal6/includes/database.mysql.inc on line 128&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para evitar estos errores instalamos la BD ingresando a :  http://localhost/drupal6/install.php&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/StDDQAk7_8I/AAAAAAAABWA/lRfxV_ILFsQ/s1600-h/Screenshot-Drupal+installation+complete+%7C+localhost+-+Mozilla+Firefox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 226px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/StDDQAk7_8I/AAAAAAAABWA/lRfxV_ILFsQ/s400/Screenshot-Drupal+installation+complete+%7C+localhost+-+Mozilla+Firefox.png" alt="" id="BLOGGER_PHOTO_ID_5391023433762734018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En esa página nos solicita crear al usuario administrador.&lt;br /&gt;&lt;br /&gt;Verificamos que nuestra BD Drupal 6 ya no esté vacía&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/StDEo0lxHHI/AAAAAAAABWY/8-kIrR9bGZY/s1600-h/Screenshot-127.0.0.1+-+localhost+-+drupal6+%7C+phpMyAdmin+3.1.2deb1ubuntu0.1+-+Mozilla+Firefox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 226px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/StDEo0lxHHI/AAAAAAAABWY/8-kIrR9bGZY/s400/Screenshot-127.0.0.1+-+localhost+-+drupal6+%7C+phpMyAdmin+3.1.2deb1ubuntu0.1+-+Mozilla+Firefox.png" alt="" id="BLOGGER_PHOTO_ID_5391024959553346674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Listo, regresamos a &lt;a href="http://localhost/drupal6/"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;http://localhost/drupal6/&lt;/span&gt; &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/StDDQVCBZWI/AAAAAAAABWI/LqfSd6NwgEc/s1600-h/Screenshot-localhost+-+Mozilla+Firefox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 226px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/StDDQVCBZWI/AAAAAAAABWI/LqfSd6NwgEc/s400/Screenshot-localhost+-+Mozilla+Firefox.png" alt="" id="BLOGGER_PHOTO_ID_5391023439253431650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Bienvenido a DRUPAL :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-2802173855625058554?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2802173855625058554/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2802173855625058554&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2802173855625058554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2802173855625058554'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/10/instalacion-de-drupal-6-en-ubuntu-904.html' title='Instalación de Drupal 6 en Ubuntu 9.04'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/StDDQy0Hx0I/AAAAAAAABWQ/DDEcVKgHlII/s72-c/Screenshot-Synaptic+Package+Manager+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4361720685418287276</id><published>2009-10-09T11:13:00.000-07:00</published><updated>2009-10-09T11:16:27.842-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Spring Community Day 2009 - Lima</title><content type='html'>Aquí está el afiche del evento anual de la comunidad de Spring aquí en Lima&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/Ss991nJ7gLI/AAAAAAAABV4/m2NX3cEE7y0/s1600-h/aficheSpringCommunityDay.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 400px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/Ss991nJ7gLI/AAAAAAAABV4/m2NX3cEE7y0/s400/aficheSpringCommunityDay.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390665638982942898" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4361720685418287276?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4361720685418287276/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4361720685418287276&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4361720685418287276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4361720685418287276'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/10/spring-community-day-2009-lima.html' title='Spring Community Day 2009 - Lima'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/Ss991nJ7gLI/AAAAAAAABV4/m2NX3cEE7y0/s72-c/aficheSpringCommunityDay.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7454452694229475306</id><published>2009-10-05T17:05:00.000-07:00</published><updated>2009-10-05T22:13:59.415-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='videos 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>DDD con Spring</title><content type='html'>Adjunto el video de uno de mi ex-jefes exponiendo de DDD (Domain Driven Design) en el último evento de Spring Live 2009&lt;br /&gt;&lt;br /&gt;Parte 1&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6914534&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6914534&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/6914534"&gt;Presentación de Domain Driven Design - parte 1&lt;/a&gt; from &lt;a href="http://vimeo.com/user1050618"&gt;Jose Diaz&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Parte 2 &lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6919324&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6919324&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/6919324"&gt;Presentacion de Domain Driven Design - Parte 2&lt;/a&gt; from &lt;a href="http://vimeo.com/user1050618"&gt;Jose Diaz&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7454452694229475306?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7454452694229475306/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7454452694229475306&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7454452694229475306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7454452694229475306'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/10/ddd-en-spring-live-2009.html' title='DDD con Spring'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5303988655432608555</id><published>2009-09-24T07:36:00.001-07:00</published><updated>2009-09-24T12:57:55.426-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Acerca de Rails</title><content type='html'>He visto varios posts que describen de muy buena manera el framework RAILS. Pues en este post haré lo mismo.&lt;br /&gt;&lt;br /&gt;Mi curiosidad de utilizar este framework nace del seguimiento a programadores ágiles como Dave Thomas, Sam Ruby y Chad Fowler.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Utiliza Ruby&lt;/span&gt; : Lenguaje corto, legible  y sencillo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rails es MVC&lt;/span&gt; :  Mientras que Java se apoya en MVC con Struts, Tapestry o SpringMVC, Rails maneja MVC y tiene "lugares" para cada pedazo de código. Un  proyecto Rails ya tiene las carpetas "model", "view" y "controller" definidas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fácil integración con AJAX&lt;/span&gt; :  Rails maneja características de AJAX e integra Prototype y Script.aculo.us (estas 2 librerías JS fueron creadas para Rails al principio)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ORM (Object-Relational Mapping):&lt;/span&gt; Tiene su propio ORM que es sencillo y no se apoya de archivos de configuración como sucede en Hibernate.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Migraciones &lt;/span&gt;: Esta es una de las carácterísticas que a mi parecer es muy importante, permite realizar sentencias DML y DLL en un simple scripts, a la vez se guardan como registros históricos que nos permite restaurar las estructuras de las tablas de la base de datos a partir de una versión que elijamos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WebService:&lt;/span&gt;  Enfoque REST.  cool!!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TestCases :&lt;/span&gt; Cuando se crea un proyecto Rails, se crean paquetes y clases para realizar pruebas, Rails maneja una clase maestra para manipular TestCases proporcionando diversos métodos y asserts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5303988655432608555?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5303988655432608555/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5303988655432608555&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5303988655432608555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5303988655432608555'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/09/acerca-de-rails.html' title='Acerca de Rails'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3128410968375074143</id><published>2009-09-19T08:03:00.001-07:00</published><updated>2009-09-19T08:28:23.404-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chris'/><title type='text'>Dejando de enseñar por un tiempo</title><content type='html'>No estuve posteando mucho por la cantidad de trabajo acumulado más algunos libros que he comenzado a leer. Pienso que la propia carrera exige, siempre hay que estar actualizado, diariamente salen cosas interesantes ya sea en desarrollo o en informática general.&lt;br /&gt;&lt;br /&gt;Me he dado cuenta que siempre aparecen proyectos dependiendo del conocimiento de uno y sus relaciones sociales. Ahora me encuentro llevando proyectos Java, Rails y uno nuevo que empezaré de Drupal.&lt;br /&gt;&lt;br /&gt;Por esta razón, dejaré de enseñar cursos por un tiempo para fortalecer mis conocimientos.&lt;br /&gt;&lt;br /&gt;Cuano regrese a dictar clases, trataré de lanzar un taller interesante.&lt;br /&gt;&lt;br /&gt;XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3128410968375074143?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3128410968375074143/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3128410968375074143&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3128410968375074143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3128410968375074143'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/09/dejando-de-ensenar-por-un-tiempo.html' title='Dejando de enseñar por un tiempo'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7180673303550070251</id><published>2009-09-14T16:03:00.000-07:00</published><updated>2009-09-14T16:39:40.460-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Software Freedom Day 2009 - Perú</title><content type='html'>&lt;a href="http://www.sfdperu.org/"&gt;Software Freedom Day 2009&lt;/a&gt; se llevará acabo el 19 de Setiembre en la USMP (Sta. Patricia - La Molina). Se reunirán muchas comunidades de software libre como son: &lt;a href="http://www.ubuntu-pe.org/" target="_blank"&gt;Ubuntu Perú&lt;/a&gt;&lt;a href="http://www.php.org.pe/"&gt;, PHP Perú&lt;/a&gt;&lt;a href="http://groups.drupal.org/peru" target="_blank"&gt;, Drupal Perú&lt;/a&gt;&lt;a href="http://www.debianperu.org/"&gt;, Debian Perú&lt;/a&gt;&lt;a href="http://www.agile-peru.net/" target="_blank"&gt;, Agile Perù, etc.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.agile-peru.net/" target="_blank"&gt;&lt;/a&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/Sq7TWBSWZpI/AAAAAAAABVw/TKonTvBXs9w/s1600-h/softwareFreedom.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 308px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/Sq7TWBSWZpI/AAAAAAAABVw/TKonTvBXs9w/s400/softwareFreedom.jpg" alt="" id="BLOGGER_PHOTO_ID_5381470980010305170" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;inscríbete y siguelo por twitter: &lt;a href="http://twitter.com/sfdperu2009"&gt;@sfdPeru2009&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Trataré de asistir aunque tal vez me sea un poco dificil llegar, ya que estaré apoyando a @joedayz en un taller de Spring.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nos leemos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7180673303550070251?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7180673303550070251/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7180673303550070251&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7180673303550070251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7180673303550070251'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/09/software-freedom-day-2009-peru.html' title='Software Freedom Day 2009 - Perú'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/Sq7TWBSWZpI/AAAAAAAABVw/TKonTvBXs9w/s72-c/softwareFreedom.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3831042927366965207</id><published>2009-09-08T17:13:00.000-07:00</published><updated>2009-09-21T13:18:43.061-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='de foros'/><title type='text'>CAST en HQL</title><content type='html'>Hoy vi una pregunta en un foro (bueno, era un grupo de google) de un HQL que utiliza la función CAST:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;String hql = "SELECT CAST(tp.identificacion) AS decimal) from Tperson tp . . . ."&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Al ejecutar la consulta se muestra el error de "No data type for node"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hibernate también maneja el concepto de CAST (siempre y cuando el motor de base de datos soporte esta función).&lt;br /&gt;El segundo parámetro del CAST debe ser un "Hibernate Type"&lt;br /&gt;&lt;br /&gt;Los "Hibernate Types" son los tipos de datos que se configuran en los archivos .hbm&lt;br /&gt;&lt;property ....  type="big_decimal"&gt;&lt;br /&gt;&lt;br /&gt;En el ejemplo deberíamos reemplazar por el equivalente al decimal, que es big_decimal.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;String hql = "SELECT CAST(tp.identificacion) AS big_decimal) from Tperson tp . . . ."&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hibernate ejecutará por debajo un &lt;span style="font-weight:bold;"&gt;cast(identificacion as number(19,2))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Me doy cuenta que hibernate maneja muchas funciones de SQL, tiene gran soporte para las consultas HQL. Es bueno insistir en esta librería y no rendirse fácilmente buscando utilizar sentencias SQL&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3831042927366965207?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3831042927366965207/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3831042927366965207&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3831042927366965207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3831042927366965207'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/09/cast-en-hql.html' title='CAST en HQL'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3858164013202499541</id><published>2009-09-05T07:40:00.000-07:00</published><updated>2009-09-05T09:12:28.059-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>[Java] Abreviando cadenas ...</title><content type='html'>Existen casos donde queremos cortar la cadena de un texto largo a una cierta cantidad de caracteres y al final agregarle puntos seguidos.&lt;br /&gt;&lt;br /&gt;No es necesario crear un algoritmo para realizar esta función. El paquete org.apache.commons.lang provee el método &lt;span style="font-style: italic;"&gt;abbreviate &lt;/span&gt;en la clase StringUtils&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Hola mundo, Hola Java, esto es un ejemplo de abreviar cadenas"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;queremos obtener : "&lt;span style="font-style: italic;"&gt;Hola mundo, Hola Java, esto es un ejemplo de ..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  String abreviacion = StringUtils.abbreviate(miTexto,48);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3858164013202499541?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3858164013202499541/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3858164013202499541&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3858164013202499541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3858164013202499541'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/09/java-abreviando-cadenas.html' title='[Java] Abreviando cadenas ...'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6741655036703338838</id><published>2009-09-03T16:35:00.000-07:00</published><updated>2009-09-04T08:40:27.500-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>El Poder del Shell</title><content type='html'>Desde el shell se pueden ejecutar aplicaciones, depuradores, navegadores, editores y utilitarios. Y por la programación del shell se pueden construir "comandos de macro" de las actividades que se realizan con frecuencia.&lt;br /&gt;&lt;br /&gt;Para los programadores de GUI y de IDEs, esto le puede parecer una posición extrema. Su simple respuesta es "No". Las GUI's son maravillosas y puede ser más rápido y más cómodo para algunas operaciones simples: mover archivos, leer MIME emails,  escribir mensajes, etc. Pero si hace todo el trabajo utilizando interfaces gráficas de usuario, se está perdiendo todas las capacidades de su entorno. No será capaz automatizar tareas comunes o utilizar el 100% de beneficios que pueden tener sus herramientas. También no será capaz de combinar herramientas para crear herramientas de macro personalizadas.&lt;br /&gt;&lt;br /&gt;Los entornos GUI son normalmente limitados por las capacidades previstas de los diseñadores.&lt;br /&gt;El ámbito de aplicación de una herramienta cualquiera suele ser limitado a las tareas que la herramienta se espera que realice. Por ejemplo, supongamos que se quiera integrar un pre-procesador de código en su IDE. A menos que el diseñador de la IDE que explicitamente había previsto esta capacidad, no pueda hacerlo.  :(  Y pueda solucionarse esta parte apoyándose de alguna otra herramienta o también a través del símbolo de sistema. En este úñtimo recordará que SHELL es su amigo :)&lt;br /&gt;Se dará cuenta que hay operaciones donde la interfaz gráfica no puede apoyar. La línea de comandos es uno de los más adecuados cuando se quiere combinar con rapidez un par de comandos para realizar una consulta o alguna otra tarea. Éstos son algunos ejemplos:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);font-size:130%;" &gt;1) Buscar todos los archivos .c modificados recientemente en la carpeta XXX&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A) SHELL&lt;/span&gt; - find . -name ' *.c' -newer Makefile -print&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;B) GUI&lt;/span&gt; -  Buscar la carpeta XXX click derecho "Buscar", escribir en el criterio de búsqueda "*.c", una vez que se muestren los resultados, click en el tab de "Fecha de Modificación"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);font-size:130%;" &gt;2) ¿Qué archivos de Java no se han cambiado en la última semana?&lt;br /&gt;De esos archivos, ¿cuales utilizan las bibliotecas AWT?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A) SHELL &lt;/span&gt;&lt;br /&gt;find . -name '*.java' -mtime +7 -print |&lt;br /&gt;xargs grep 'java.awt'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;B) GUI &lt;/span&gt;- Buscar la carpeta donde se encuentran los archivos java. Click derecho "Buscar", agregar filtros a la búsqueda, opción "especificar fecha". Luego realizar comparaciones con Fecha de inicio y Fecha de modificación. Luego copiar estos archivos a una nueva carpeta para poder realizar otra búsqueda por contenido "java.awt".&lt;br /&gt;&lt;br /&gt;Juega un poco con los comandos SHELL y se sorprenderá de lo productivo que puedes ser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-6741655036703338838?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6741655036703338838/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6741655036703338838&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6741655036703338838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6741655036703338838'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/09/el-poder-del-shell.html' title='El Poder del Shell'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3780419208289470198</id><published>2009-08-28T17:18:00.000-07:00</published><updated>2009-08-28T18:02:19.740-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Librerías JS'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Usando un agradable ModalBox</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sph95XsAMiI/AAAAAAAABVQ/Dh91T98QvtU/s1600-h/screenshot.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 375px; height: 274px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sph95XsAMiI/AAAAAAAABVQ/Dh91T98QvtU/s400/screenshot.jpg" alt="" id="BLOGGER_PHOTO_ID_5375184579831280162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Programando necesitaba agregar una ventana PopUp en una interfaz, no me encontraba a gusto utilizar el &lt;a href="http://www.java2s.com/Code/JavaScriptReference/Javascript-Methods/showModalDialog.htm"&gt;showModalDialog()&lt;/a&gt; de Javascript.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var returnValue = showModalDialog("zoneLookup.html","",&lt;br /&gt;           "dialogWidth:620px; dialogHeight:500px; center:on");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Investigando un poco encontré este componente &lt;a href="http://okonet.ru/projects/modalbox/"&gt;ModalBox &lt;/a&gt;que me fue fácil de implementar y tiene una agradable visualización.&lt;br /&gt;Solo haré un poco de mención de este componente ya que la instalación y los demos están en la página principal de &lt;a href="http://okonet.ru/projects/modalbox/"&gt;ModalBox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El requerimiento para usar este compenente es tener las librerías js : &lt;a href="http://www.prototypejs.org/"&gt;prototype &lt;/a&gt;y &lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Luego integrar al proyecto los archivos modalbox.js y modalbox.css de la página de &lt;a href="http://okonet.ru/projects/modalbox/"&gt;ModalBox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Y después de realizar una invocación de este tipo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Modalbox.show("pseudocodeSentencia.html", {title: "Editar Sentencia Pseudocódigo", width: 600});&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Solo son 2 parámetros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El primero puede ser la referencia a una página, HTML plano (cadena html) , nodo DOM o objeto Html (javascript)&lt;/li&gt;&lt;li&gt;El segundo son las propiedades del PopUp&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Visualización:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/Sph7gF0oVrI/AAAAAAAABVI/ps_q9_kpCV8/s1600-h/popup.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 226px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/Sph7gF0oVrI/AAAAAAAABVI/ps_q9_kpCV8/s400/popup.bmp" alt="" id="BLOGGER_PHOTO_ID_5375181946515642034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Al principio tuve unos problemas por el estilo, ya que mi aplicación tenía por defecto un estilo predeterminado y configurado con &lt;a href="http://www.opensymphony.com/sitemesh/decorators.html"&gt;SiteMesh Decorators (Opensymphony)&lt;/a&gt; y esto corrompía con el estilo del ModalBox (modalbox.css). Por esta razón tuve que quitarle el estilo solo a esa página.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3780419208289470198?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3780419208289470198/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3780419208289470198&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3780419208289470198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3780419208289470198'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/08/usando-un-agradable-modalbox.html' title='Usando un agradable ModalBox'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/Sph95XsAMiI/AAAAAAAABVQ/Dh91T98QvtU/s72-c/screenshot.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-304455126381005896</id><published>2009-08-21T17:26:00.000-07:00</published><updated>2009-08-21T17:43:09.221-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tecnología'/><category scheme='http://www.blogger.com/atom/ns#' term='videos 4'/><title type='text'>Cloud Computing</title><content type='html'>Con la compra de SpringSource por VMWare me ganó la curiosidad de saber que es "cloud"&lt;br /&gt;&lt;br /&gt;wikipedia:&lt;br /&gt;&lt;blockquote&gt;La &lt;b&gt;computación en nube&lt;/b&gt;, del &lt;a href="http://es.wikipedia.org/wiki/Idioma_ingl%C3%A9s" title="Idioma inglés"&gt;inglés&lt;/a&gt; &lt;i&gt;&lt;b&gt;cloud computing&lt;/b&gt;&lt;/i&gt;, es una tecnología que permite ofrecer &lt;a href="http://es.wikipedia.org/wiki/Servicio_Web" title="Servicio Web" class="mw-redirect"&gt;servicios&lt;/a&gt; de computación a través de &lt;a href="http://es.wikipedia.org/wiki/Internet" title="Internet"&gt;Internet&lt;/a&gt;. La nube es una &lt;a href="http://es.wikipedia.org/wiki/Met%C3%A1fora" title="Metáfora"&gt;metáfora&lt;/a&gt; de Internet.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/So8-_75EmOI/AAAAAAAABVA/khyQ72No3Kw/s1600-h/605px-Cloud_computing.svg.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 278px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/So8-_75EmOI/AAAAAAAABVA/khyQ72No3Kw/s400/605px-Cloud_computing.svg.png" alt="" id="BLOGGER_PHOTO_ID_5372582148606040290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Viendo el &lt;a href="http://msmvps.com/blogs/lopez/default.aspx"&gt;blog &lt;/a&gt;de &lt;a href="http://twitter.com/ajlopez"&gt;@ajlopez&lt;/a&gt;  encontré un video interesante respecto a esto. Realmente es muy interesante el manejo de esta tecnología ya que por lo visto va a ahorrar mucho trabajo y costo en  empresas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ae_DKNwK_ms&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/ae_DKNwK_ms&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-304455126381005896?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/304455126381005896/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=304455126381005896&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/304455126381005896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/304455126381005896'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/08/cloud-computing.html' title='Cloud Computing'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/So8-_75EmOI/AAAAAAAABVA/khyQ72No3Kw/s72-c/605px-Cloud_computing.svg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2606508195349059378</id><published>2009-08-10T18:41:00.000-07:00</published><updated>2009-08-10T18:59:51.353-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='TestCase'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>JUnit + Spring (Services)</title><content type='html'>Antes estuve haciendo test cases con objetos de acceso a datos (DAOs) en los cuales no se me presentó ningún problema. Sin embargo haciendo uso de servicios o managers (comúnmente así los llaman) el desarrollo es distitnto (si está correctamente configurado para que maneje objetos proxy) puesto que en los servicios  es necesario registrar el "scope" por el tema de objetos proxys. Ver &lt;a href="http://static.springsource.org/spring/docs/2.0.x/reference/beans.html"&gt;IoC Container&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ejemplo de un test case:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class TestMotorsillo extends TestCase {&lt;br /&gt;&lt;br /&gt; ApplicationContext acontext; &lt;br /&gt; protected final Log log = LogFactory.getLog(getClass());&lt;br /&gt; &lt;br /&gt; public TestMotorsillo(String method) {&lt;br /&gt;  super(method);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; protected void setUp() throws Exception {&lt;br /&gt;  super.setUp();&lt;br /&gt;  XmlWebApplicationContext wac = new XmlWebApplicationContext();&lt;br /&gt;  wac.setConfigLocations(new String[] { "classpath:applicationContext-hibernate.xml",&lt;br /&gt; "classpath:applicationContext-resources.xml",&lt;br /&gt; "classpath:applicationContext-service.xml"});&lt;br /&gt;&lt;br /&gt;  wac.setServletContext(new MockServletContext("")); &lt;br /&gt;  MockHttpSession session = new MockHttpSession();&lt;br /&gt;  MockHttpServletRequest request = new MockHttpServletRequest();&lt;br /&gt;  request.setSession(session);&lt;br /&gt;  RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));&lt;br /&gt;  wac.refresh();&lt;br /&gt;  wac.getBeanFactory().registerScope("session", new SessionScope());&lt;br /&gt;  wac.registerShutdownHook();&lt;br /&gt;  this.acontext = wac;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void testCalculo(){   &lt;br /&gt;  CalculateManager calculateManager =   &lt;br /&gt;   (CalculateManager)acontext.getBean("calculateManager");&lt;br /&gt;  &lt;br /&gt;  BigDecimal monto = calculateManager.getMontoTotal("XX");&lt;br /&gt;  assertTrue(Constants.MONTO_PROMEDIO_ANUAL &gt; monto.doubleValue());&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-2606508195349059378?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2606508195349059378/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2606508195349059378&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2606508195349059378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2606508195349059378'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/08/junit-spring-services.html' title='JUnit + Spring (Services)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5712253479014111390</id><published>2009-08-05T15:39:00.000-07:00</published><updated>2009-08-05T16:39:07.108-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Frameworks similares</title><content type='html'>Gracias a Spring el desarrollo se vuelve muy común para distintos frameworks como JSF, Struts y Spring MVC ya que siguen con la misma idea "archivos de configuración en XML" o lo que comúnmente llamamos los "application contexts", con esto  Spring maneja la inyección de dependencias como también manipula las referencias de las clases invocadas por una acción y la navegación.&lt;br /&gt;&lt;br /&gt;Tal vez se acordarán de algunos archivos XML, que le ponen en su mayoría estos nombres:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;applicationContext.xml&lt;/li&gt;&lt;li&gt;applicationContext-hibernate.xml&lt;/li&gt;&lt;li&gt;applicationContext-resources.xml&lt;/li&gt;&lt;li&gt;applicationContext-services.xml&lt;/li&gt;&lt;li&gt;applicationContext-security.xml&lt;/li&gt;&lt;li&gt;applicationContext-validation.xml&lt;/li&gt;&lt;li&gt;applicationContext-config.xml&lt;/li&gt;&lt;li&gt;dataAccessContext.xml&lt;/li&gt;&lt;li&gt;faces-config.xml&lt;/li&gt;&lt;li&gt;faces-managed-beans.xml&lt;/li&gt;&lt;li&gt;faces-navigation.xml&lt;/li&gt;&lt;li&gt;struts.xml&lt;br /&gt;&lt;/li&gt;&lt;li&gt;action-servlet.xml&lt;/li&gt;&lt;li&gt;tiles-def.xml&lt;br /&gt;&lt;/li&gt;&lt;li&gt;etc&lt;/li&gt;&lt;/ul&gt;Las funciones de los XMLs siguen siendo las mismas, lo que varía son los nombres.&lt;br /&gt;&lt;br /&gt;Entre los frameworks mencionados, donde existen más diferencias son en sus TAGs que representan componentes en el jsp, como por ejemplo: las cajas de texto, combos, text area, etc.&lt;br /&gt;&lt;br /&gt;Al inicio empecé con JSF y luego con Spring MVC, esté último lo vi más complicado porque tenía que aprenderme los métodos de los controlers que manejaba el framework. Luego cuando pasé a Struts, pude desarrollar sin ayuda de ningún manual, pues la manera de desarrollar era muy similar a los otros frameworks.&lt;br /&gt;&lt;br /&gt;Por lo tanto aprender una tecnología que sigue la misma tendencia como Struts, JSF y SpringMVC no es mucho trabajo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5712253479014111390?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5712253479014111390/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5712253479014111390&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5712253479014111390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5712253479014111390'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/08/frameworks-similares.html' title='Frameworks similares'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-8893469290800228575</id><published>2009-08-02T23:08:00.000-07:00</published><updated>2009-08-03T00:45:56.379-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Mal uso de encapsulamiento (getters y setters)</title><content type='html'>Algo que siempre veo (en los últimos 3 proyectos en donde he participado) es la mala práctica del encapsulamiento, el mal uso de los métodos getters y setters.&lt;br /&gt;&lt;br /&gt;He podido observar un código de este tipo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class MantenimientoUsuario extends Mantenimiento{&lt;br /&gt;&lt;br /&gt;private List roles;&lt;br /&gt;private Usuario filter;&lt;br /&gt;&lt;br /&gt;public String iniciar(){&lt;br /&gt; setRoles(new ArrayList());&lt;br /&gt; setFilter(new Usuario());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public String registrar(){&lt;br /&gt; String codigo = getFilter().getCodigo().&lt;br /&gt;&lt;br /&gt; //  codigo para el metodo registrar&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Metodos Getters y Setters&lt;br /&gt;&lt;br /&gt;public List getRoles(){&lt;br /&gt;return this.roles;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setRoles(List roles){&lt;br /&gt;this.roles = roles;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Usuario getFilter(){&lt;br /&gt;return this.filter;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setFilter(Usuario filter){&lt;br /&gt;this.filter= filter;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En este caso tenemos las variables &lt;span style="font-weight: bold;"&gt;roles &lt;/span&gt;y &lt;span style="font-weight: bold;"&gt;filter &lt;/span&gt;de la clase MantenimientoUsuario. Supongamos de que manejamos algún tipo de framework para la capa View (Struts, JSF, etc.) y en el jsp utilizaremos solamente la variable &lt;span style="font-weight: bold;"&gt;filter&lt;/span&gt;. También tengamos en cuenta que ninguna clase llama a MantenimientoUsuario para utilizar su variable global &lt;span style="font-weight: bold;"&gt;roles&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En este caso, encontramos 2 problemas con el código:&lt;br /&gt;&lt;br /&gt;1) El uso innecesario de los métodos &lt;span style="font-weight: bold;"&gt;getRoles()&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;setRoles()&lt;/span&gt;. Muchos programadores están acostumbrados a siempre generar metodos getters y setters en donde muchas veces no se necesita.&lt;br /&gt;&lt;br /&gt;2) El uso de los métodos de acceso dentro de la misma clase. En el ejemplo se generaron métodos de acceso para que el JSP pueda utilizar la varibale &lt;span style="font-weight: bold;"&gt;filter&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La función de los métodos de acceso es para que otra clase o algún recuros accedan a las variables de clase a través de estos métodos. Pero.. ¿la misma clase está utilizando sus métodos de acceso? WTF.&lt;br /&gt;&lt;br /&gt;Si el objeto MantenimientoUsuario pudiera hablar, dijera algo como esto: " &lt;span style="font-style: italic;"&gt;¿Por qué rayos estoy utilizando los métodos de acceso en "iniciar" y "registrar", no se suponen que esos métodos lo utilizaría alguien externo?. Son mis variables y las puedo utilizar directamente!!!&lt;/span&gt; "&lt;br /&gt;&lt;br /&gt;Cuando vi la invocación del método &lt;span style="font-weight: bold;"&gt;setFilter &lt;/span&gt;dentro del método "iniciar", sinceramente pensé que provenía de su padre  :S&lt;br /&gt;&lt;br /&gt;Si modificamos el código....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class MantenimientoUsuario extends Mantenimiento{&lt;br /&gt;private List roles;&lt;br /&gt;private Usuario filter;&lt;br /&gt;&lt;br /&gt;public String iniciar(){&lt;br /&gt;roles = new ArrayList();&lt;br /&gt;filter = new Usuario();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public String registrar(){&lt;br /&gt; String codigo = filter.getCodigo().&lt;br /&gt;&lt;br /&gt; //  codigo para el metodo registrar&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Metodos Getters y Setters&lt;br /&gt;&lt;br /&gt;public Usuario getFilter(){&lt;br /&gt;return this.filter;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setFilter(Usuario filter){&lt;br /&gt;this.filter= filter;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;:D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-8893469290800228575?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/8893469290800228575/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=8893469290800228575&amp;isPopup=true' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8893469290800228575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8893469290800228575'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/08/fail-mal-uso-de-encapsulamiento-getters.html' title='Mal uso de encapsulamiento (getters y setters)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4009217204008488813</id><published>2009-07-31T22:13:00.000-07:00</published><updated>2009-07-31T22:13:00.476-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>gEdit mismo TextMate</title><content type='html'>Hemos visto que muchos programadores expertos en Ruby On Rails trabajan sobre &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt; en su MacOS. Y para que, tiene un lookAndFeel muy elegante.&lt;br /&gt;&lt;br /&gt;Ubuntu cuenta con un editor simple, que es el gEdit, pues lo que podemos hacer es configurarlo para que tenga la apariencia del TextMate y autoayudas de Ruby.&lt;br /&gt;&lt;br /&gt;Primero nos bajamos los plugins del gEdit vía Synaptic Package Manager:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm6L0qH5AtI/AAAAAAAABSg/81Y1a0JmCcU/s1600-h/Screenshot-Synaptic+Package+Manager+.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 227px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm6L0qH5AtI/AAAAAAAABSg/81Y1a0JmCcU/s400/Screenshot-Synaptic+Package+Manager+.png" alt="" id="BLOGGER_PHOTO_ID_5363377943021683410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El gEdit ya tiene configurado para distinguir el lenguaje Ruby a través de colores, en la opción View &gt; HighLight &gt; Scripts &gt; Ruby.&lt;br /&gt;&lt;br /&gt;Y para que se vea mejor, como el TextMate, cambiamos el background. En Edit &gt; Preferences &gt; Font &amp;amp; Colors&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm6L0u3tH5I/AAAAAAAABSo/ZimqbXj7Q8k/s1600-h/Screenshot-*Unsaved+Document+1+-+gedit.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 308px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm6L0u3tH5I/AAAAAAAABSo/ZimqbXj7Q8k/s400/Screenshot-*Unsaved+Document+1+-+gedit.png" alt="" id="BLOGGER_PHOTO_ID_5363377944295972754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ahora agregamos el plugin. Abrimos el gEdit, entramos a EditX &gt; Preferences. Pestaña "Plugins". Seleccionamos la opción Snippets.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm6L0RWermI/AAAAAAAABSY/aUdXp8hdkqI/s1600-h/Screenshot-gedit+Preferences.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 338px; height: 400px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm6L0RWermI/AAAAAAAABSY/aUdXp8hdkqI/s400/Screenshot-gedit+Preferences.png" alt="" id="BLOGGER_PHOTO_ID_5363377936371986018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si entramos a "Configure Plugin" en la parte de Ruby, veremos plantillas de código (ayudas) que podemos importar al editor.&lt;br /&gt;&lt;br /&gt;Para invocar las autoayudas (de la plantilla) en el editor, tecleamos el shortcut Ctrl + SpaceBar&lt;br /&gt;&lt;br /&gt;Y listo....  TextMate!!!!!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm6L0u3tH5I/AAAAAAAABSo/ZimqbXj7Q8k/s1600-h/Screenshot-*Unsaved+Document+1+-+gedit.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4009217204008488813?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4009217204008488813/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4009217204008488813&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4009217204008488813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4009217204008488813'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/07/gedit-mismo-textmate.html' title='gEdit mismo TextMate'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm6L0qH5AtI/AAAAAAAABSg/81Y1a0JmCcU/s72-c/Screenshot-Synaptic+Package+Manager+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6876335390997124205</id><published>2009-07-29T20:51:00.000-07:00</published><updated>2009-07-29T20:51:00.253-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chris'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Prototipos</title><content type='html'>Hace ya 2 semanas estuve haciendo unos prototipos para un sistema en &lt;a href="http://www.osinerg.gob.pe/newweb/pages/Publico/1.htm"&gt;Osinerg&lt;/a&gt; que me tomaron como 4 días, angustiado de querer programar, me dí cuenta que al diseñar las ventanas pensaba en facilitar la GUI al usuario y los posibles componentes que utilizaría en el desarrollo.&lt;br /&gt;&lt;br /&gt;Con un prototipo, estamos destinados a explorar los aspectos específicos del sistema final. El prototipo lo podemos ver como un marco, un marco que con el tiempo se le va ir agregando funcionalidad, completando rutinas. Pero el marco sigue intacto y sabemos que el sistema seguirá comportándose cuando el primer &lt;a href="http://users.csc.calpoly.edu/%7Edstearns/SeniorProjectsWWW/Rideg/tracer.html"&gt;tracer code&lt;/a&gt; se completó.&lt;br /&gt;&lt;br /&gt;"Pensar en prototipo es como el reconocimiento y recopilación inteligente que se lleva a cabo ante una única &lt;a href="http://4cuatros.blogspot.com/2009/06/balas-trazadoras.html"&gt;bala trazadora&lt;/a&gt;"&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/Sl8v94dMlLI/AAAAAAAABRQ/UcrE2oQ_mo0/s1600-h/bmw_serie_6_8.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 266px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/Sl8v94dMlLI/AAAAAAAABRQ/UcrE2oQ_mo0/s400/bmw_serie_6_8.jpg" alt="" id="BLOGGER_PHOTO_ID_5359054821767550130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Muchas industrias utilizan diferentes prototipos para probar ideas específicas, los prototipos son muchos más baratos que la producción a escala total.&lt;br /&gt;Los fabricantes de automóviles, por ejempo, crean diferentes prototipos de un nuevo diseño de carro.&lt;br /&gt;Cada uno está diseñado para poner a prueba un aspecto concreto del vehículo.&lt;br /&gt;De esta manera los elementos de riesgo e incertidumbre pueden ser probados sin comprometerse a construir el verdadero tema.&lt;br /&gt;Construir prototipos de software es de la misma manera : analizar y exponer el riesgo, y ofrecer posibilidades de correción en un costo reducido.&lt;br /&gt;&lt;br /&gt;Los prototipos han sido diseñados sólo para responder a algunas preguntas, por lo que son mucho&lt;br /&gt;menos costosas y más rápidas de desarrollar aplicaciones que van en la producción. El&lt;br /&gt;código puede ignorar los detalles que no son importantes para nosotros en este momento,&lt;br /&gt;pero probablemente es muy importante para el usuario más adelante. Si realizamos un prototipo de GUI, por ejemplo, puede salirse con resultados incorrectos. En el otro lado, si estamos investigando aspectos de performance, nos puede salir una interfaz gráfica bastante pobre, o tal vez incluso sin GUI  en absoluto.&lt;br /&gt;Pero si nos encontramos en un entorno en el que no se puede renunciar a los detalles, entonces tendremos que preguntarnos si realmente debemos construir un prototipo. Tal vez un estilo de &lt;a href="http://4cuatros.blogspot.com/2009/06/balas-trazadoras.html"&gt;balas trazadoras&lt;/a&gt; sería mejor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Qué podemos prototipear?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;• Arquitectura&lt;br /&gt;• Nueva funcionalidad de un sistema existente&lt;br /&gt;• Estructura y contenido de datos externos&lt;br /&gt;• Herramientas de terceros o de componentes&lt;br /&gt;• Problemas de rendimiento&lt;br /&gt;• Interfaz de usuario de diseño&lt;br /&gt;&lt;br /&gt;En un prototipo de se debe pasar por alto los detalles y centrarse en aspectos concretos del sistema, es posible que se utilize un lenguaje de alto nivel (tal vez un&lt;br /&gt;lenguaje Perl, Phyton, Ruby o Tcl). Un lenguaje scripting de alto nivel permite aplazar muchos detalles.&lt;br /&gt;&lt;br /&gt;Antes de embarcarse en cualquier código basado en prototipos hay que asegurar que todos entiendan el código disponible. Los prototipos pueden ser engañosamente atractivos para las personas que no saben que solo es un prototipo. Hay que dejar en claro que el código disponible se encuentra incompleto  y no podrá ser terminado.&lt;br /&gt;&lt;br /&gt;Es fácil ser e&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm5QQ9K0OLI/AAAAAAAABR4/G9u0LZyavuE/s1600-h/deportivo-madera.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 158px; height: 117px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Sm5QQ9K0OLI/AAAAAAAABR4/G9u0LZyavuE/s400/deportivo-madera.jpg" alt="" id="BLOGGER_PHOTO_ID_5363312458472896690" border="0" /&gt;&lt;/a&gt;ngañado por la aparente integridad de un demostrado prototipo y los sponsors del proyecto o gerentes pueden insistir con el despliegue del prototipo. Recordar que se puede construir un gran prototipo de un coche de madera y cinta adhesiva, pero no tratarlo de conducir en horas punta.&lt;br /&gt;Si se siente que en el ambiente el propósito puede ser mal interpretado, mejor sería utilizar el enfoque de balas trazadoras.&lt;br /&gt;&lt;br /&gt;Cuando se usa correctamente prototipos puede ahorrarse bastante tiempo, dinero y dolor de cabeza al momento de identificar y corregir problemas en el ciclo de desarrollo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-6876335390997124205?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6876335390997124205/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6876335390997124205&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6876335390997124205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6876335390997124205'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/07/prototipos.html' title='Prototipos'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/Sl8v94dMlLI/AAAAAAAABRQ/UcrE2oQ_mo0/s72-c/bmw_serie_6_8.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4174982059226967547</id><published>2009-07-27T18:41:00.000-07:00</published><updated>2009-07-27T19:00:01.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Campus Party 2009 - Valencia</title><content type='html'>Ahora el campus party es en Valencia y hoy fue la inauguración, este evento promete que va a ser igual de bueno como todos los años y como el de hace poco en Colombia.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Presentación área de Desarrolladores&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wx-YaruB5qw&amp;amp;hl=es&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/wx-YaruB5qw&amp;amp;hl=es&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="340" width="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Linkeo la &lt;a href="http://www.campus-party.es/index.php/agenda.html"&gt;agenda&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Transmisión en vivo del cparty:&lt;br /&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" allowfullscreen="true" data="http://www.campus-party.com.co//tl_files/Campus-Colombia/2009/general/campustv/CP_videoplayer2.swf?c=10013&amp;amp;idsite=300011&amp;amp;autoplay=0" height="344" width="425"&gt;&lt;br /&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;br /&gt;&lt;param name="movie" value="http://www.campus-party.com.co//tl_files/Campus-Colombia/2009/general/campustv/CP_videoplayer2.swf?c=10013&amp;amp;idsite=300011&amp;amp;autoplay=0"&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora que estoy de descanso (fiestas patrias) disfrutaré viendo la transmisión vía cpartyTV   :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4174982059226967547?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4174982059226967547/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4174982059226967547&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4174982059226967547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4174982059226967547'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/07/campus-party-2009-valencia.html' title='Campus Party 2009 - Valencia'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5423191363769283891</id><published>2009-07-21T06:00:00.000-07:00</published><updated>2009-07-21T06:11:17.089-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Proyecto  de Ruby on Rails : "Cannot place the project in a project folder that already contains Netbeans project"</title><content type='html'>Después de buscar varios editores para programar en Ruby, decidí utilizar &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; para tener una autoayuda con los métodos de las variables del lenguaje Ruby.&lt;br /&gt;&lt;br /&gt;Al avanzar con un proyecto que había creado días atrás. La IDE NetBeans no re lo reconoció : "Cannot place the project in a project folder that already contains Netbeans project". Es decir, no podía cargarlo con "New Project" ni con "Open Project"  T________T&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SmW-TgKW6AI/AAAAAAAABRY/lw0MlVx34FY/s1600-h/Screenshot-New+Ruby+on+Rails+Application+with+Existing+Sources.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 233px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SmW-TgKW6AI/AAAAAAAABRY/lw0MlVx34FY/s400/Screenshot-New+Ruby+on+Rails+Application+with+Existing+Sources.png" alt="" id="BLOGGER_PHOTO_ID_5360900173714614274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La solución es borrar la carpeta "nbproject" y listo....&lt;br /&gt;&lt;br /&gt;Espero haber ayudado a alguien que haya tenido este problema  XD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5423191363769283891?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5423191363769283891/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5423191363769283891&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5423191363769283891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5423191363769283891'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/07/proyecto-de-ruby-on-rails-cannot-place.html' title='Proyecto  de Ruby on Rails : &quot;Cannot place the project in a project folder that already contains Netbeans project&quot;'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/SmW-TgKW6AI/AAAAAAAABRY/lw0MlVx34FY/s72-c/Screenshot-New+Ruby+on+Rails+Application+with+Existing+Sources.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6147189728187070861</id><published>2009-07-07T20:31:00.000-07:00</published><updated>2009-07-07T22:52:43.713-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Campus Party 2009 - Colombia</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SlQ0AOuvQ0I/AAAAAAAABIc/AjjjS4lExTc/s1600-h/campus_party_2009_header.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 146px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SlQ0AOuvQ0I/AAAAAAAABIc/AjjjS4lExTc/s320/campus_party_2009_header.jpg" alt="" id="BLOGGER_PHOTO_ID_5355963035409138498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;"Campus Party es reconocido como el mayor evento de tecnología, creatividad, ocio y cultura digital en red del mundo. Un encuentro anual realizado desde 1997 que reúne durante siete días a miles de participantes con sus computadores procedentes de toda España y de otras naciones, con el fin de compartir inquietudes, intercambiar experiencias y realizar todo tipo de actividades relacionadas con el computador, las comunicaciones y las nuevas tecnologías."   -- según la web.&lt;br /&gt;&lt;br /&gt;Esta noche entré a ver la &lt;a href="http://www.campus-party.com.co/tl_files/Campus-Colombia/2009/general/campustv/"&gt;transmisión en vivo&lt;/a&gt; por la &lt;a href="http://www.campus-party.com.co/"&gt;página oficial del evento&lt;/a&gt; y estaba exponiendo el famoso hacker &lt;a href="http://es.wikipedia.org/wiki/Kevin_Mitnick"&gt;Kevin Mitnick&lt;/a&gt; acerca de la vulnerabilidad en los equipos móviles y también un poco de su libro &lt;a href="http://books.google.com.pe/books?id=VR_aVP0KKh8C&amp;amp;dq=The+art+kevin+mitnick&amp;amp;printsec=frontcover&amp;amp;source=bn&amp;amp;hl=en&amp;amp;ei=HSRUSqrVD5WJtgfmxeSbCA&amp;amp;sa=X&amp;amp;oi=book_result&amp;amp;ct=result&amp;amp;resnum=6"&gt;The Art of Deception&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SlQ0ATsYjMI/AAAAAAAABIk/ngAg6Mt0kdE/s1600-h/kevin-mitnick%5B43%5D.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SlQ0ATsYjMI/AAAAAAAABIk/ngAg6Mt0kdE/s320/kevin-mitnick%5B43%5D.jpg" alt="" id="BLOGGER_PHOTO_ID_5355963036741438658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El evento termina el sábado y hay muchos temas que he visto en la &lt;a href="http://www.campus-party.com.co/index.php/Agenda.html"&gt;agenda&lt;/a&gt; que me parecen muy interesantes&lt;br /&gt;&lt;br /&gt;Algunos informes en videos:&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hYGGoTO0B1A&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/hYGGoTO0B1A&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Para este evento están proporcionando 6.6 GB de internet!!!&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Xnp2xe_omcs&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Xnp2xe_omcs&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;Algunos links para estar al tanto de este evento:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.campus-party.com.co/index.php/Agenda.html"&gt;-La agenda&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.campus-party.com.co/tl_files/Campus-Colombia/2009/general/campustv/"&gt;-Transmisión en directo  (campus TV) &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O también siguiendo a algunos usuarios twitter como &lt;a href="http://twitter.com/campusparty2009"&gt;@campusparty2009&lt;/a&gt;, &lt;a href="http://twitter.com/mauricioweb"&gt;@mauricioweb&lt;/a&gt; o  &lt;a href="http://twitter.com/pulsosocial"&gt;@pulsosocial&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-6147189728187070861?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6147189728187070861/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6147189728187070861&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6147189728187070861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6147189728187070861'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/07/campus-party-2009-colombia.html' title='Campus Party 2009 - Colombia'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/SlQ0AOuvQ0I/AAAAAAAABIc/AjjjS4lExTc/s72-c/campus_party_2009_header.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4333478333982652042</id><published>2009-07-03T10:04:00.000-07:00</published><updated>2009-07-20T00:12:00.865-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Criteria genérico (Criteria + Example)</title><content type='html'>Este ejemplo es útil para pantallas tipo búsqueda para tablas u objetos maestros (no relacionadas), los filtros de búsqueda deben ser atributos del objeto a buscar.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5354353100282087538" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 172px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/Sk57xrBTSHI/AAAAAAAABHE/pYB_Q_4HT1Y/s320/busqueda.bmp" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;El método en el Dao sería el siguiente:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt; public List getFindResults(Object filter) {&lt;br /&gt;        Criteria criteria = getSession().createCriteria(filter.getClass());&lt;br /&gt;        Example example = Example.create(filter).ignoreCase().enableLike(MatchMode.ANYWHERE);&lt;br /&gt;        criteria.add(example);&lt;br /&gt;        return criteria.list();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como vemos en el código está utilizando LIKE e ignora que sea mayúsculas y minúsculas.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Restricciones:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;a) &lt;strong&gt;El objeto no tiene otro objeto-entidad dentro de él&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;Habría que extender el criteria.&lt;br /&gt;&lt;br /&gt;b) &lt;strong&gt;Solo es LIKE&lt;/strong&gt; % &lt;xxx&gt;%&lt;br /&gt;&lt;br /&gt;Se podría agregar un atributo booleano más al método para determinar si es LIKE o no.&lt;br /&gt;&lt;br /&gt;c) &lt;strong&gt;No hay ordenamiento&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;uhmm.. aqui si depende del programador, podría enviarse un parámetro más que sería un arreglo referenciando los atributos a ordenar.&lt;br /&gt;Puede ser también creando una interface "Ordenable" (por ejemplo) señalando el campo por el que se va a ordenar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4333478333982652042?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4333478333982652042/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4333478333982652042&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4333478333982652042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4333478333982652042'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/07/un-critera-generico-criteria-example.html' title='Criteria genérico (Criteria + Example)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/Sk57xrBTSHI/AAAAAAAABHE/pYB_Q_4HT1Y/s72-c/busqueda.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4372300379264528801</id><published>2009-07-01T12:53:00.000-07:00</published><updated>2009-12-06T16:33:14.626-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Email'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Oracle Stored Procedure para enviar mail</title><content type='html'>Una manera más para enviar correos con el ip del servidor.&lt;br /&gt;&lt;br /&gt;Aquí un breve ejemplo del store:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;CREATE OR REPLACE PROCEDURE "TESTMAIL" ( pivcMailIp IN VARCHAR2&lt;br /&gt;,pinPort IN NUMBER&lt;br /&gt;,pivcFromName IN VARCHAR2&lt;br /&gt;,pivcFromEmail IN VARCHAR2&lt;br /&gt;,pivcToName IN VARCHAR2&lt;br /&gt;,pivcToEmail IN VARCHAR2&lt;br /&gt;,pivcSubject IN VARCHAR2&lt;br /&gt;,pivcBody IN VARCHAR2) IS&lt;br /&gt;objConnection utl_smtp.connection;&lt;br /&gt;vrData RAW(32767);&lt;br /&gt;BEGIN&lt;br /&gt;objConnection := UTL_smtp.open_connection(pivcMailIp,pinPort);&lt;br /&gt;UTL_smtp.ehlo(objConnection, pivcMailIp);&lt;br /&gt;UTL_smtp.mail(objConnection, pivcFromEmail);&lt;br /&gt;UTL_smtp.rcpt(objConnection, pivcToEmail);&lt;br /&gt;UTL_smtp.open_data(objConnection); /* ** Sending the header information */&lt;br /&gt;UTL_smtp.write_data(objConnection, 'From: '  '"'  pivcFromName  '" &amp;lt;'  pivcFromEmail '&amp;gt;'  UTL_tcp.CRLF); UTL_smtp.write_data(objConnection, 'To: '  '"'  pivcToName  '" &amp;lt;'  pivcToEmail '&amp;gt;'  UTL_tcp.CRLF); UTL_smtp.write_data(objConnection, 'Subject: '  pivcSubject  UTL_tcp.CRLF);&lt;br /&gt;UTL_smtp.write_data(objConnection, 'MIME-Version: '  '1.0'  UTL_tcp.CRLF);&lt;br /&gt;UTL_smtp.write_data(objConnection, 'Content-Type: '  'text/html; charset=utf-8'  UTL_tcp.CRLF);&lt;br /&gt;UTL_smtp.write_data(objConnection, 'Content-Transfer-Encoding: '  '8bit'  UTL_tcp.CRLF); /* ** End of header information */&lt;br /&gt;UTL_smtp.write_data(objConnection, UTL_tcp.CRLF); /* ** Actual body is sent here */&lt;br /&gt;vrData := utl_raw.cast_to_raw(pivcbody);&lt;br /&gt;UTL_smtp.write_raw_data(objConnection, vrData); /* ** Connection is closed here */&lt;br /&gt;UTL_smtp.close_data(objConnection); UTL_smtp.quit(objConnection);&lt;br /&gt;EXCEPTION&lt;br /&gt;WHEN UTL_smtp.transient_error OR UTL_smtp.permanent_error THEN&lt;br /&gt;UTL_smtp.quit(objConnection);&lt;br /&gt;dbms_output.put_line(sqlerrm);&lt;br /&gt;WHEN OTHERS THEN&lt;br /&gt;UTL_smtp.quit(objConnection);&lt;br /&gt;dbms_output.put_line(sqlerrm);&lt;br /&gt;END testMail;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4372300379264528801?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4372300379264528801/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4372300379264528801&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4372300379264528801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4372300379264528801'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/07/store-procedure-para-enviar-mail.html' title='Oracle Stored Procedure para enviar mail'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7968685439448752206</id><published>2009-06-26T09:45:00.000-07:00</published><updated>2009-07-01T12:53:24.774-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Email'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Hibernate configuration : Usando mappingDirectoryLocations</title><content type='html'>Realizamos la configuración de hibernate en la propiedad &lt;strong&gt;&lt;em&gt;LocalSessionFactoryBean&lt;/em&gt;&lt;/strong&gt; del contexto. En esa propiedad registramos todos los archivos de hibernate (*.hbm) donde hacemos mapping:&lt;br /&gt;&lt;br /&gt;Algo similar a esto:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&amp;gt;&lt;br /&gt;         &amp;lt;property name="dataSource" ref="dataSourceBase"/&amp;gt;&lt;br /&gt;        &amp;lt;property name="mappingResources"&amp;gt;&lt;br /&gt;            &amp;lt;list&amp;gt;&lt;br /&gt;                &amp;lt;value&amp;gt;com/4cuatros/app/model/hbm/Role.hbm.xml&amp;lt;/value&amp;gt;&lt;br /&gt;                &amp;lt;value&amp;gt;com/4cuatros/app/model/hbm/User.hbm.xml&amp;lt;/value&amp;gt;&lt;br /&gt;  .....&lt;br /&gt;  ....&lt;br /&gt;  ..&lt;br /&gt;  .&lt;br /&gt;  &amp;lt;value&amp;gt;com/4cuatros/app/model/hbm/Product.hbm.xml&amp;lt;/value&amp;gt;&lt;br /&gt;     &amp;lt;/list&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para no estar registrando cada entrada de root para los archivos hbm. Hacemos uso de la propiedad &lt;strong&gt;&lt;em&gt;mappingDirectoryLocations&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&amp;gt;&lt;br /&gt;         &amp;lt;property name="dataSource" ref="dataSourceBase"/&amp;gt;&lt;br /&gt;        &amp;lt;property name="mappingResources"&amp;gt;&lt;br /&gt;            &amp;lt;property name="mappingDirectoryLocations"&amp;gt;&lt;br /&gt;  &amp;lt;list&amp;gt;&lt;br /&gt;                    &amp;lt;value&amp;gt;classpath:com/4cuatros/app/model&amp;lt;/value&amp;gt;&lt;br /&gt;  &amp;lt;/list&amp;gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7968685439448752206?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7968685439448752206/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7968685439448752206&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7968685439448752206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7968685439448752206'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/06/hibernate-configuration-usando.html' title='Hibernate configuration : Usando mappingDirectoryLocations'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7030254106992361623</id><published>2009-06-05T09:42:00.000-07:00</published><updated>2009-06-05T10:33:23.262-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Balas Trazadoras</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SilSnmHox3I/AAAAAAAAA4M/rug-alZgyhI/s1600-h/compensator.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 123px; height: 150px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SilSnmHox3I/AAAAAAAAA4M/rug-alZgyhI/s400/compensator.jpg" alt="" id="BLOGGER_PHOTO_ID_5343893273052759922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Es difícil disparar con una metralladora en la oscuridad. Se tiene que realizar varios cálculos: ubícación del objetivo (rango, elevación), el entorno (temperatura, humedad, viento, etc),  características de los cartuchos y balas que se está usando, etc. Luego de realizar un disparo correctamente, no existe mucha seguridad de poder volver a acertar.&lt;br /&gt;&lt;br /&gt;Para esto se pueden utilizar balas trazadoras.&lt;br /&gt;&lt;br /&gt;Cuando se dispara con balas trazadoras, su fósforo se inflama y deja un rastro pirotécnico. Y al igual también al igual que las balas normales, impactan al objetivo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SilSsPc-JuI/AAAAAAAAA4U/xbxthCaezyA/s1600-h/tracer_archivos_tracer_f.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 368px; height: 136px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SilSsPc-JuI/AAAAAAAAA4U/xbxthCaezyA/s400/tracer_archivos_tracer_f.jpg" alt="" id="BLOGGER_PHOTO_ID_5343893352867571426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Las balas trazadoras son preferibles en la labor del cálculo, porque la retroalimentación es inmediata y operan en el mismo entorno que las municiones normales.&lt;br /&gt;&lt;br /&gt;La analogía puede ser violenta, pero se aplica en proyectos nuevos, en particular cuando se está construyendo algo que no ha sido construido antes.&lt;br /&gt;&lt;br /&gt;Mayormente muchos desarrolladores para realizar un cálculo al principio, disparan para tener suerte. Los programadores pragmáticos utilizan balas trazadoras.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tip :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Si no estás muy seguro de qué algoritmo elegir, de cómo hacer un módulo o de qué camino seguir en tu programa, tira balas trazadoras. Simplemente implementa alguna de las opciones, de forma que funcione lo suficiente como para probarla, pero sin todos los detalles que te llevarían mucho tiempo. Comprueba cómo se comporta y decide si merece la pena terminarla por completo o probar otra opción.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ventajas de un &lt;span style="font-weight: bold;"&gt;tracer code&lt;/span&gt; :&lt;br /&gt;&lt;ul&gt;&lt;li style="font-style: italic;"&gt;Los usuarios llegan a ver algo del trabajo antes de tiempo&lt;/li&gt;&lt;li style="font-style: italic;"&gt;Los desarrolladores construyen bajo una estructura sólida&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Tiene una plataforma de integración&lt;/span&gt;. Como el sistema está conectado  de extremo a extremo, tiene un entorno al que se pueden añadir nuevas  trozos de código y  las pruebas son más rápidos y más precisos.&lt;/li&gt;&lt;li style="font-style: italic;"&gt;Siempre habrá algo que mostrar&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Mejor idea de progreso&lt;/span&gt;. Los desarrolladores abordan casos de uso de uno en uno. El desarrollo es menor y evita la creación de bloques monolíticos de código.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hacer que el código brille en la oscuridad&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tip 15 .-&lt;/span&gt; Use balas trazadoras para encontrar su objetivo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7030254106992361623?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7030254106992361623/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7030254106992361623&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7030254106992361623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7030254106992361623'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/06/balas-trazadoras.html' title='Balas Trazadoras'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/SilSnmHox3I/AAAAAAAAA4M/rug-alZgyhI/s72-c/compensator.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-9197488347156983854</id><published>2009-04-30T07:37:00.000-07:00</published><updated>2009-04-30T07:51:36.269-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eventos'/><title type='text'>Ya se viene... Spring Live 2009 en Lima</title><content type='html'>Este es el afiche del evento Spring Live 2009.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/Sfm4W3I_52I/AAAAAAAAAyA/rUvgI5-3Zew/s1600-h/springLive.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 284px; height: 400px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/Sfm4W3I_52I/AAAAAAAAAyA/rUvgI5-3Zew/s400/springLive.jpg" alt="" id="BLOGGER_PHOTO_ID_5330494336868018018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En este evento los exponentes mostrarán código aplicado para cada tema.&lt;br /&gt;&lt;br /&gt;no se lo pierdan....  16 de Mayo.  8:30 am&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-9197488347156983854?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/9197488347156983854/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=9197488347156983854&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/9197488347156983854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/9197488347156983854'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/04/ya-se-viene-spring-live-2009.html' title='Ya se viene... Spring Live 2009 en Lima'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/Sfm4W3I_52I/AAAAAAAAAyA/rUvgI5-3Zew/s72-c/springLive.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5570966471334156193</id><published>2009-04-21T13:08:00.000-07:00</published><updated>2009-04-21T14:11:18.113-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Querys recursivos :  Jerarquía</title><content type='html'>Tenemos la siguiente tabla :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Se40aUwSb8I/AAAAAAAAAwo/TxGqGVKhxwk/s1600-h/samp1.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 104px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Se40aUwSb8I/AAAAAAAAAwo/TxGqGVKhxwk/s400/samp1.bmp" alt="" id="BLOGGER_PHOTO_ID_5327253036078362562" border="0" /&gt;&lt;/a&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;1° campo&lt;/span&gt; : id de la zona&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;2° campo&lt;/span&gt; : descripción de la zona&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;3° campo&lt;/span&gt; : id de la zona padre&lt;/p&gt;&lt;p&gt;Con este query podemos obtener la jerarquía de una zona (mostrando todos sus sucesores):&lt;/p&gt;&lt;p&gt;En este ejemplo, los sucesores de "Region"&lt;/p&gt;&lt;p style="font-style: italic; color: rgb(0, 0, 153);"&gt;select de_geographical_zone, LEVEL&lt;br /&gt;from geographical_zone&lt;br /&gt;START WHITH co_geographical_zone = 2&lt;br /&gt;CONNECT BY PRIOR co_geographical_zone = co_geog_zone_parent order by level &lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/Se40aYlWP-I/AAAAAAAAAww/5KYDDQNJ1NQ/s1600-h/samp2.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 202px; height: 108px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/Se40aYlWP-I/AAAAAAAAAww/5KYDDQNJ1NQ/s400/samp2.bmp" alt="" id="BLOGGER_PHOTO_ID_5327253037106216930" border="0" /&gt;&lt;/a&gt;&lt;p&gt;El campo level no existe en la tabla, es una variable de oracle. &lt;/p&gt;&lt;p&gt;Lo complicado aquí es obtener los padres o predecesores de una zona :&lt;/p&gt;&lt;p&gt;podemos usar el SYS_CONNECT_BY_PATH :&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;select&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;SYS_CONNECT_BY_PATH(de_geographical_zone, '\') as descripcion, LEVEL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;from geographical_zone&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;where co_geographical_zone = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;CONNECT BY PRIOR co_geographical_zone = co_geog_zone_parent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;order by level&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/Se40anaa7tI/AAAAAAAAAw4/IhkiDDD5VPk/s1600-h/samp3.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 227px; height: 131px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/Se40anaa7tI/AAAAAAAAAw4/IhkiDDD5VPk/s400/samp3.bmp" alt="" id="BLOGGER_PHOTO_ID_5327253041086918354" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Lo malo que vamos a tener un separador que lo divide :(&lt;/p&gt;&lt;p&gt;para este caso agregaríamos los métodos INSTR y SUBSTR&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;select&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;SUBSTR(SYS_CONNECT_BY_PATH(de_geographical_zone_type, '\') || '\',&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;(INSTR(SYS_CONNECT_BY_PATH(de_geographical_zone_type, '\')|| '\','\',1,1)+1),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;(INSTR(SYS_CONNECT_BY_PATH(de_geographical_zone_type, '\')|| '\','\',1,2))-2) as descripcion,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;LEVEL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;from geographical_zone&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;where co_geographical_zone = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;CONNECT BY PRIOR co_geographical_zone = co_geog_zone_parent&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 153);"&gt;order by level&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/Se41ZaPzY5I/AAAAAAAAAxI/4eZYI14aUEY/s1600-h/samp4.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 209px; height: 136px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/Se41ZaPzY5I/AAAAAAAAAxI/4eZYI14aUEY/s400/samp4.bmp" alt="" id="BLOGGER_PHOTO_ID_5327254119884481426" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5570966471334156193?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5570966471334156193/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5570966471334156193&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5570966471334156193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5570966471334156193'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/04/querys-recursivos-jerarquia.html' title='Querys recursivos :  Jerarquía'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/Se40aUwSb8I/AAAAAAAAAwo/TxGqGVKhxwk/s72-c/samp1.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-80312374850609286</id><published>2009-04-14T13:53:00.000-07:00</published><updated>2009-04-14T14:27:47.860-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Usando Back Slash  + Comillas ( \ ")</title><content type='html'>Muchos sabemos el uso del back slash, ya sea para salto de línea (\n), tabulación (\t), etc. Entre ellos también está el uso de las comillas (\")&lt;br /&gt;&lt;br /&gt;Se utiliza en java como en javascript. Pero quizás en javascript podemos tener cierta complicación al mezclar comilla doble (") con comilla simple (')&lt;br /&gt;&lt;br /&gt;Preparaba un método en javascript que me retornaba un hiperlink:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;return "&amp;lt;a href='javascript:editarFila(" + data.codigo + "," + data.descripcion + ")' &amp;gt;Editar&amp;lt;/a&amp;gt;");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;el resultado es:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; editarFila(1,Nueva Política 2009);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo en el FireBug salía el error describiendo que faltaba cerrar con ")". Al parecer está tomando la descripción (Nueva Política 2009) como si fuera un método y no una cadena.&lt;br /&gt;&lt;br /&gt;Por lo cual tuve que utilizar back slash:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SeT_f7d6HAI/AAAAAAAAAvo/AVl9ld_r0zY/s1600-h/backslash.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 358px; height: 49px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SeT_f7d6HAI/AAAAAAAAAvo/AVl9ld_r0zY/s400/backslash.bmp" alt="" id="BLOGGER_PHOTO_ID_5324661583462931458" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;el resultado es:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; editarFila("1","Nueva Política 2009");&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-80312374850609286?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/80312374850609286/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=80312374850609286&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/80312374850609286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/80312374850609286'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/04/usando-back-slash-comillas.html' title='Usando Back Slash  + Comillas ( \ &quot;)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/SeT_f7d6HAI/AAAAAAAAAvo/AVl9ld_r0zY/s72-c/backslash.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7520724809447184522</id><published>2009-04-03T08:37:00.000-07:00</published><updated>2009-04-03T09:08:17.310-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Eclipse: Publish cerca de Stop</title><content type='html'>Eclipse es una IDE que no es mi preferida, pero la tengo que usar para que en el trabajo todos estemos alineados a nivel de software. Lo bueno es que cuenta con muchos plug-ins y hay softwares de desarrollo orientados a éste, como son &lt;a href="http://www.adobe.com/products/flex/features/flex_builder/"&gt;FlexBuilder &lt;/a&gt;,&lt;a href="http://www.aptana.com/"&gt;Aptana&lt;/a&gt;, &lt;a href="http://www.springsource.com/products/sts"&gt;SpringToolSuite&lt;/a&gt; y también vi un eclipse integrado con Weblogic.&lt;br /&gt;&lt;br /&gt;Una de las cosas que me molesta es la ubicación de la opción "&lt;span style="font-weight: bold;"&gt;Publish&lt;/span&gt;" que se encuentra debajo de la opción "&lt;span style="font-weight: bold;"&gt;Stop&lt;/span&gt;" cuando se hace un click derecho al servidor de aplicaciones en el la pestaña de "&lt;span style="font-weight: bold;"&gt;Servers&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SdYzSV7c7OI/AAAAAAAAAcM/mmIK2A8f_Ks/s1600-h/publish.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 195px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SdYzSV7c7OI/AAAAAAAAAcM/mmIK2A8f_Ks/s400/publish.JPG" alt="" id="BLOGGER_PHOTO_ID_5320496400001985762" border="0" /&gt;&lt;/a&gt;Y me molesta porque muchas veces que quiero realizar "Publish"  cuando realizo un cambio en el JSP (puede ser en javascript) y estoy apurado, suelo hacer click en la opción "STOP".   :(&lt;br /&gt;&lt;br /&gt;Supongo que habría que cambiar el orden de las opciones en las fuentes de Eclipse......  o_O&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7520724809447184522?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7520724809447184522/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7520724809447184522&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7520724809447184522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7520724809447184522'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/04/eclipse-publish-cerca-de-stop.html' title='Eclipse: Publish cerca de Stop'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/SdYzSV7c7OI/AAAAAAAAAcM/mmIK2A8f_Ks/s72-c/publish.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5325613995486579110</id><published>2009-03-24T09:30:00.000-07:00</published><updated>2009-03-24T09:49:30.163-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>ACEGI  authz:authentication : Obteniendo los datos del usuario en el jsp</title><content type='html'>Al trabajar con ACEGI podemos acceder a los datos del usuario solo con un tag:&lt;br /&gt;&lt;br /&gt;&amp;lt;authz:authentication  operation=&amp;quot;username&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para eso, debemos implementar de la interface "UserDetail" de ACEGI en nuestra clase que va a manejar el usuario:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Usuario implements UserDetails{&lt;br /&gt;&lt;br /&gt; private String nombreUsuario;&lt;br /&gt; &lt;br /&gt; .....&lt;br /&gt; .....&lt;br /&gt; ...&lt;br /&gt; &lt;br /&gt; public String getUsername() {&lt;br /&gt;    return nombreUsuario;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En este caso estamos implementando el método getUsername() de la interface UserDetails de ACEGI, también podemos implementar los demás métodos de UserDetails como son : getAuthorities(), getPassword(), isAccountNonExpired(), isAccountNonLocked(), isCredentialsNonExpired() y isEnabled().&lt;br /&gt;&lt;br /&gt;Lo que no me agradó es el método getUsername()  :(&lt;br /&gt;¿Por qué ACEGI no lo nombró getUserName()?  (CAMEL CASE)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5325613995486579110?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5325613995486579110/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5325613995486579110&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5325613995486579110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5325613995486579110'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/03/acegi-authzauthentication-obteniendo.html' title='ACEGI  authz:authentication : Obteniendo los datos del usuario en el jsp'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2466270834554460349</id><published>2009-03-22T11:20:00.000-07:00</published><updated>2009-03-22T11:23:44.375-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webing'/><category scheme='http://www.blogger.com/atom/ns#' term='Imágenes'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><title type='text'>Bruce Lee on Rails</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/ScaB-J8yNGI/AAAAAAAAAaE/VtAFIdYIzM0/s1600-h/bruce_on_rails.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 296px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/ScaB-J8yNGI/AAAAAAAAAaE/VtAFIdYIzM0/s400/bruce_on_rails.jpg" alt="" id="BLOGGER_PHOTO_ID_5316079314980189282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Que buena imagen!! lo vi en en el blog &lt;a href="http://rubyonrailsprogrammingguide.com/"&gt;Ruby on Rails Programming guide&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-2466270834554460349?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2466270834554460349/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2466270834554460349&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2466270834554460349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2466270834554460349'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/03/bruce-lee-on-rails.html' title='Bruce Lee on Rails'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/ScaB-J8yNGI/AAAAAAAAAaE/VtAFIdYIzM0/s72-c/bruce_on_rails.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-345303517011992854</id><published>2009-03-20T08:28:00.000-07:00</published><updated>2011-05-04T17:55:59.212-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Librerías JS'/><category scheme='http://www.blogger.com/atom/ns#' term='scriptaculous'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>AutoCompleter con Scriptaculous</title><content type='html'>Adjunto este código que ya es muy conocido para las personas que trabajan con Scriptaculous. Sin embargo lo voy a postear para tener a la mano esta herramienta que varias veces utilizo.  Otra razón del post es porque existen ciertos problemas o límites de usar esta librería JS que postearé más adelante.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_oo_xdGd7F-k/ScO4U7-d_zI/AAAAAAAAAYs/UuI-2ngC63g/s1600-h/autocompleter.JPG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 225px; height: 147px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/ScO4U7-d_zI/AAAAAAAAAYs/UuI-2ngC63g/s400/autocompleter.JPG" alt="" id="BLOGGER_PHOTO_ID_5315294655063916338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;&lt;br /&gt;div.autocompleter {&lt;br /&gt;margin:0px;&lt;br /&gt;padding:0px;&lt;br /&gt;width:250px;&lt;br /&gt;background:#F5F6CE;&lt;br /&gt;border:1px solid #888;&lt;br /&gt;position:absolute;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.autocompleter ul {&lt;br /&gt;margin:0px;&lt;br /&gt;padding:0px;&lt;br /&gt;list-style-type:#F5F6CE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.autocompleter ul li.selected {&lt;br /&gt;background-color:#F7BE81;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;div.autocompleter ul li {&lt;br /&gt;margin:0;&lt;br /&gt;padding:2px;&lt;br /&gt;height:32px;&lt;br /&gt;display:block;&lt;br /&gt;list-style-type:none;&lt;br /&gt;cursor:pointer;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;lt;label for="bands_from_the_70s"&amp;gt;Your favorite rock  band from the 70's:&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;input id="bands_from_the_70s" autocompleter="off" size="40" type="    " value=""&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="band_list01" class="autocompleter" style="display:none"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;var bandsList = [&lt;br /&gt;'ABBA',&lt;br /&gt;'AC/DC',&lt;br /&gt;'Aerosmith',&lt;br /&gt;'America',&lt;br /&gt;'Ramones',&lt;br /&gt;'REO Speedwagon',&lt;br /&gt;'Rhythm Heritage',&lt;br /&gt;'Rush',&lt;br /&gt;'Sex Pistols',&lt;br /&gt;'Slade',&lt;br /&gt;'Steely Dan',&lt;br /&gt;'Stillwater',&lt;br /&gt;'Styx',&lt;br /&gt;'Supertramp',&lt;br /&gt;'Sweet',&lt;br /&gt;'Three Dog Night',&lt;br /&gt;'The Village People',&lt;br /&gt;'Wings (fronted by former Beatle Paul McCartney)',&lt;br /&gt;'Yes'&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;new Autocompleter.Local('bands_from_the_70s', 'band_list01', bandsList, { });&lt;br /&gt;&amp;lt;/script&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Más adelante explicaré del último parámetro del Autocompleter y sus limitaciones&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-345303517011992854?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/345303517011992854/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=345303517011992854&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/345303517011992854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/345303517011992854'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/03/autocompleter-con-scriptaculous.html' title='AutoCompleter con Scriptaculous'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/ScO4U7-d_zI/AAAAAAAAAYs/UuI-2ngC63g/s72-c/autocompleter.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-159844665494473933</id><published>2009-03-17T09:21:00.000-07:00</published><updated>2009-04-03T22:24:48.415-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes dinámicos'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='videos 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Blog hecho en Rails en 15 minutos</title><content type='html'>&lt;span class="description"&gt;&lt;a href="http://es.wikipedia.org/wiki/David_Heinemeier_Hansson"&gt;David Heinemeier Hansson&lt;/a&gt;, el creador del framework de desarrollo web &lt;a href="http://es.wikipedia.org/wiki/Action_Mailer"&gt;Ruby on  Rails&lt;/a&gt; realiza una demostración de cómo crear un blog en 15 minutos.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Gzj723LkRJY&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Gzj723LkRJY&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;El video no se ve muy nítido, lo puedes ver mejor descargándolo de &lt;a href="http://www.adrive.com/public/cab4ccc533f21b5c8c0d169078739e2aef5c06fea6013f6dbd49ecb182b097a6.html"&gt;aquí&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-159844665494473933?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/159844665494473933/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=159844665494473933&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/159844665494473933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/159844665494473933'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/03/blog-hecho-en-rails-en-15-minutos.html' title='Blog hecho en Rails en 15 minutos'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3297048778075466005</id><published>2009-03-14T15:37:00.000-07:00</published><updated>2009-03-14T15:37:00.424-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='POO'/><title type='text'>Las 5 características de Smalltalk</title><content type='html'>Cuando me inicié trabajando en Java, leí un fragmento del libro "Thinking in Java" (TIJ) de Bruce Eckel que me gustó ya que también empezaba a programar con objetos:&lt;br /&gt;&lt;br /&gt;Alan Kay resumió las cinco características básicas de Smalltalk, el primer lenguaje de programación orientado a objetos que tuvo éxito, además de uno de los lenguajes en los que se basa Java. Estas características constituyen un enfoque puro a la programación orientada a objetos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1) Todo es un objeto.&lt;/span&gt; Piense en cualquier objeto como una variable: almacena datos, permite&lt;br /&gt;que se le "hagan peticiones", pidiéndole que desempeñe por sí mismo determinadas operaciones, etc. En teoría, puede acogerse cualquier componente conceptual del problema a resolver (bien sean perros, edificios, servicios, etc.) y representarlos como objetos dentro de un programa.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) Un programa es un cúmulo de objetos que se dicen entre sí lo que tienen que hacer&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; mediante el envío de mensajes&lt;/span&gt;. Para hacer una petición a un objeto, basta con "enviarle un mensaje". Más concretamente, puede considerarse que un mensaje en sí es una petición para solicitar una llamada a una función que pertenece a un objeto en particular.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) Cada objeto tiene su propia memoria, constituida por otros objetos&lt;/span&gt;. Dicho de otra manera, uno crea una nueva clase de objeto construyendo un paquete que contiene objetos ya&lt;br /&gt;existentes. Por consiguiente, uno puede incrementar la complejidad de un programa, ocultándola tras la simplicidad de los propios objetos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4) Todo objeto es de algún tipo.&lt;/span&gt; Cada objeto es un elemento de una clase, entendiendo por "clase" un sinónimo de "tipo". La característica más relevante de una clase la constituyen "el conjunto de mensajes que se le pueden enviar".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5) Todos los objetos de determinado tipo pueden recibir los mismos mensajes.&lt;/span&gt; Ésta es una afirmación de enorme trascendencia como se verá más tarde. Dado que un objeto de tipo "círculo" es también un objeto de tipo "polígono", se garantiza que todos los objetos "círculo" acepten mensajes propios de "polígono". Esto permite la escritura de código que haga referencia a polígonos, y que de manera automática pueda manejar cualquier elemento que encaje con la descripción de "polígono". Esta capacidad de suplantación es uno de los conceptos más potentes de la POO.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, Alan Kay se habrá sentido traicionado por java, ya que una de sus frases dice:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;a style="font-style: italic;" title="Lenguaje de programación Java" href="http://www.blogger.com/wiki/Lenguaje_de_programaci%C3%B3n_Java"&gt;Java&lt;/a&gt;&lt;span style="font-style: italic;"&gt; es lo más penoso que le  ha ocurrido a la informática desde &lt;/span&gt;&lt;a style="font-style: italic;" title="MS-DOS" href="http://www.blogger.com/wiki/MS-DOS"&gt;MS-DOS&lt;/a&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3297048778075466005?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3297048778075466005/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3297048778075466005&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3297048778075466005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3297048778075466005'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/03/las-5-caracteristicas-de-smalltalk.html' title='Las 5 características de Smalltalk'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4385763976413680585</id><published>2009-03-12T12:48:00.000-07:00</published><updated>2009-03-13T08:23:07.815-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chris'/><category scheme='http://www.blogger.com/atom/ns#' term='Taller'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Taller SCJP 5.0</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/Sblrr5DiU8I/AAAAAAAAAXo/LSBcQ2-Qqts/s1600-h/java_cert_prog_cmyk.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 207px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/Sblrr5DiU8I/AAAAAAAAAXo/LSBcQ2-Qqts/s400/java_cert_prog_cmyk.jpg" alt="" id="BLOGGER_PHOTO_ID_5312395637254411202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Este sábado empezaré a dictar el taller de la primera certificación Java (SCJP 5.0) aquí en San Isidro, Lima.&lt;br /&gt;&lt;br /&gt;La información y el syllabus del curso se encuentra en estos links:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/itp_java/browse_thread/thread/5ee8dfbbe735215"&gt;ITP_Java&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.joedayz.org/joeweb/index.php?option=com_content&amp;amp;view=article&amp;amp;id=59:scjp5&amp;amp;catid=44:talleres-sun&amp;amp;Itemid=75"&gt;Sylabus&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4385763976413680585?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4385763976413680585/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4385763976413680585&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4385763976413680585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4385763976413680585'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/03/taller-scjp-50.html' title='Taller SCJP 5.0'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/Sblrr5DiU8I/AAAAAAAAAXo/LSBcQ2-Qqts/s72-c/java_cert_prog_cmyk.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6044970403933363108</id><published>2009-03-10T06:19:00.000-07:00</published><updated>2009-03-10T06:24:47.610-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lenguajes dinámicos'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Yukihiro "Matz" Matsumoto &amp; Ruby</title><content type='html'>Incursionando en el lenguaje de programación &lt;a href="http://es.wikipedia.org/wiki/Ruby"&gt;Ruby&lt;/a&gt; me puse a ver este video interesante de Introducción a Ruby por &lt;a title="Yukihiro Matsumoto" href="http://www.blogger.com/wiki/Yukihiro_Matsumoto"&gt;Yukihiro "Matz"  Matsumoto&lt;/a&gt;, creador de &lt;a href="http://es.wikipedia.org/wiki/Ruby"&gt;Ruby&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/oEkJvvGEtB4&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/oEkJvvGEtB4&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-6044970403933363108?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6044970403933363108/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6044970403933363108&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6044970403933363108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6044970403933363108'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/03/yukihiro-matz-matsumoto-ruby.html' title='Yukihiro &quot;Matz&quot; Matsumoto &amp; Ruby'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1662091902962412821</id><published>2009-03-06T06:38:00.000-08:00</published><updated>2009-03-06T20:31:03.494-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>HQL to bean</title><content type='html'>Después de haber pasado amanecidas de trabajo (hubiera preferido que sean de otras cosas) y no tener tiempo para postear, hoy me desocupé un poco para realizar este post.&lt;br /&gt;&lt;br /&gt;Muchas veces cuando se trabaja con objetos de hibernate tenemos problemas para mostrarlo en la vista, ya sea :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Los objetos son muy cargados&lt;/li&gt;&lt;li&gt;Para obtener el valor que queremos en el registro que se encuentra en la grilla, los buscamos por punto (ejemplo : documento.registro.nuRegistro)&lt;/li&gt;&lt;li&gt;Difícil acceso a los objetos internos de un objeto de Hibernate a traves de Ajax&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Por lo que mejor sería mostrar beans simples en vez de estos objetos, pero sin perder la herramienta que facilita los querys de hibernate (hql)&lt;br /&gt;&lt;br /&gt;Este es un ejemplo de como hacer un hql (hibernate query) y pasarlo a un bean.&lt;br /&gt;&lt;br /&gt;Clase empleado que está mapeado por hibernate:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class Employee {&lt;br /&gt;&lt;br /&gt;private Integer employeeCode;&lt;br /&gt;private String nroTel;&lt;br /&gt;private Adrdress address;&lt;br /&gt;  &lt;br /&gt;       .....&lt;br /&gt;       .....&lt;br /&gt;       ...&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lo vamos a pasar al siguiente bean:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class BeanEmpleado {&lt;br /&gt;&lt;br /&gt;private Integer coEmpleado;&lt;br /&gt;private String nroTelefono;&lt;br /&gt;private String direccion; // descripción de la dirección&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public BeanEmpleado(Integer coEmpleado, String nroTelefono, String direccion) {&lt;br /&gt; super();&lt;br /&gt; this.coEmpleado = coEmpleado;&lt;br /&gt; this.nroTelefono = nroTelefono;&lt;br /&gt; this.direccion = direccion;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Integer getCoEmpleado() {&lt;br /&gt; return coEmpleado;&lt;br /&gt;}&lt;br /&gt;public void setCoEmpleado(Integer coEmpleado) {&lt;br /&gt; this.coEmpleado = coEmpleado;&lt;br /&gt;}&lt;br /&gt;public String getNroTelefono() {&lt;br /&gt; return nroTelefono;&lt;br /&gt;}&lt;br /&gt;public void setNroTelefono(String nroTelefono) {&lt;br /&gt; this.nroTelefono = nroTelefono;&lt;br /&gt;}&lt;br /&gt;public String getDireccion() {&lt;br /&gt; return direccion;&lt;br /&gt;}&lt;br /&gt;public void setDireccion(String direccion) {&lt;br /&gt; this.direccion = direccion;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Es importante definir el constructor, ya que ahí es donde se setteará los valores.&lt;br /&gt;&lt;br /&gt;DAO:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class EmpleadoDaoImpl extends HibernateDaoSupport implements Empleado{&lt;br /&gt;public List obtenerEmpleados() {&lt;br /&gt; StringBuffer hql = new StringBuffer();&lt;br /&gt; hql.append("SELECT new ").append(BeanEmpleado.class.getName());&lt;br /&gt; hql.append(" (employeeCode, nroTel, address.description) ");&lt;br /&gt; hql.append(" FROM ");&lt;br /&gt; hql.append(" Employee ");&lt;br /&gt; return getHibernateTemplate().find(hql.toString());&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En este hql estamos utilizando 3 atributos, por lo tanto el bean realizará el "set" en un constructor de 3 parámetros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-1662091902962412821?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1662091902962412821/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1662091902962412821&amp;isPopup=true' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1662091902962412821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1662091902962412821'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/03/hql-to-bean.html' title='HQL to bean'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-8353416248395789793</id><published>2009-02-28T04:03:00.000-08:00</published><updated>2009-02-28T04:03:00.677-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Reversibilidad</title><content type='html'>&lt;p&gt;Cuando hagas el código con una idea en la cabeza, no lo hagas de forma que  luego no puedas cambiar de idea. Hazlo siempre de forma que si cambias luego de  idea, el cambio sea fácil de realizar también en el código. &lt;/p&gt; &lt;p&gt;Si decides usar una arquitectura cliente/servidor, no hagas el código de  forma que si luego decides usar un único ejecutable no puedas hacerlo. Diseña y  realiza el código de forma que puedas con poco esfuerzo cambiar de un tipo de  arquitectura a otra. &lt;/p&gt; &lt;p&gt;Si decides usar una base de datos de marca A, haz el código de forma que  luego puedas cambiarte fácilmente a una base de datos de marca B, y que luego  puedas cambiarte fácilmente a usar ficheros normales en vez de una base de  datos. &lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El Gato de Schrödinger&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Supongamos que tienes un gato en una caja cerrada, junto a una partícula radioactiva. La partícula tiene exactamente una probabilidad de 50% de fisionarse en dos. Si la partícula fisiona, el gato se muere. Si no lo hace, el gato estará bien. Así que, ¿el gato esta vivo o muerto?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oo_xdGd7F-k/SadrsiwnZYI/AAAAAAAAAWs/EOAEbo73o7s/s1600-h/Schr%25C3%25B6dinger_cat.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/SadrsiwnZYI/AAAAAAAAAWs/EOAEbo73o7s/s400/Schr%25C3%25B6dinger_cat.png" alt="" id="BLOGGER_PHOTO_ID_5307329098868548994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;De acuerdo a Schrödinger, la respuesta correcta es ambos. Cada vez que una reacción sub-atómica ocurre y pueden existir dos alternativas, el universo se clona. En uno, el evento ocurrió y en el otro no. El gato está vivo en un universo, muerto en otro. Sólo cuando abres la caja te das cuenta en qué universo te encuentras.&lt;br /&gt;&lt;br /&gt;No es de extrañar que la codificación a futuro sea muy difícil.&lt;br /&gt;&lt;br /&gt;Sin embargo, piensa en la evolución del código en el mismo sentido que una caja llena de gatos de Schrödinger: cada decisión resulta en una nueva versión del futuro. ¿Cuántos posibles futuros puede soportar tu código? ¿Cuáles son más probables? ¿Qué tan difícil será soportar esos cambios cuando se den?&lt;br /&gt;&lt;br /&gt;¿Te atreves a abrir la caja?&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JC9A_E5kg7Y&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/JC9A_E5kg7Y&amp;amp;hl=es&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-8353416248395789793?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/8353416248395789793/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=8353416248395789793&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8353416248395789793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8353416248395789793'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/reversibilidad.html' title='Reversibilidad'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/SadrsiwnZYI/AAAAAAAAAWs/EOAEbo73o7s/s72-c/Schr%25C3%25B6dinger_cat.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4559944751960638745</id><published>2009-02-26T00:03:00.000-08:00</published><updated>2009-04-03T22:25:11.046-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grids'/><category scheme='http://www.blogger.com/atom/ns#' term='Librerías JS'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Cargando grids con DWR</title><content type='html'>Lo que se quiere hacer en este ejemplo es seleccionar los filtros y dar en "buscar" para que se carge la grilla con Ajax usando DWR&lt;br /&gt;&lt;br /&gt;Si no has visto aún cómo configurar DWR, sugiero revisar el post anterior &lt;a href="http://4cuatros.blogspot.com/2009/01/integracin-dwr-10-con-spring.html"&gt;Integración DWR 1.0 con Spring&lt;/a&gt;. En ese post vimos los métodos "removeAllOptions" y "addOptions" que interactuaban con los combos, esta vez utilizaremos los métodos "removeAllRows" y "addRows".&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SaRcnFn7b1I/AAAAAAAAAWY/aFIl506oJ1k/s1600-h/dwr-table1.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 179px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SaRcnFn7b1I/AAAAAAAAAWY/aFIl506oJ1k/s400/dwr-table1.bmp" alt="" id="BLOGGER_PHOTO_ID_5306468087543590738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En el ejemplo tenemos un combo de "Fuerza de venta" que va a cargar un grid de "políticas".&lt;br /&gt;&lt;br /&gt;En el evento onchange del combobox invocamos la función "cargarPoliticas()"&lt;br /&gt;&lt;br /&gt;Si estás usando DWR 1.0 tu clase dwr será DWRUtil, si estás usando la 2.0 tu clase será dwr.util&lt;br /&gt;&lt;br /&gt;Script:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;script type='text/javascript' src='/app/dwr/interface/PoliticManager.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;function cargarPoliticas() {&lt;br /&gt;// muestra el mensaje de espera&lt;br /&gt;DWRUtil.useLoadingMessage('Loading ...');&lt;br /&gt;// obtenemos el valor del combo seleccionado&lt;br /&gt;var coFuerzaDeVenta = DWRUtil.getValue('coFuerzaDeVenta');&lt;br /&gt;// obtenemos la lista de politicas a través de un manager&lt;br /&gt;PoliticManager.getPoliticas(coFuerzaDeVenta ,function(data) {&lt;br /&gt;// Borramos el grid, en este caso el id del tbody es "politicas"&lt;br /&gt;DWRUtil.removeAllRows("politicas");&lt;br /&gt;// Agregamos filas con los datos obtenidos del manager&lt;br /&gt;DWRUtil.addRows("politicas",data, cellFuncs, { escapeHtml:false });&lt;br /&gt;});&lt;br /&gt;// Declaramos las columnas :&lt;br /&gt;// La primera comlumna tiene un hipervínculo que llevará&lt;br /&gt;// a otra página con el id de la política seleccionada&lt;br /&gt;var cellFuncs = [&lt;br /&gt;function(data) { return "&amp;lt;a href='politicForm.html?politicId=" + data.coPolitic  + "'&amp;gt;" + data.dePolitic +  "&amp;lt;/a&amp;gt;"; },&lt;br /&gt;function(data) { return data.coLineaFuerzaDeVenta;}&lt;br /&gt;];&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mensaje de espera :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SaRcnStEvvI/AAAAAAAAAWg/ZOyD20c1lmg/s1600-h/dwr-table2.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 242px; height: 140px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SaRcnStEvvI/AAAAAAAAAWg/ZOyD20c1lmg/s400/dwr-table2.bmp" alt="" id="BLOGGER_PHOTO_ID_5306468091054833394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aquí les paso el código del jsp completo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;%@ include file="/common/taglibs.jsp"%&amp;gt;&lt;br /&gt;&amp;lt;%@ page language="java" errorPage="/error.jsp" pageEncoding="UTF-8" contentType="text/html; charset=utf-8" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;&amp;lt;fmt:message key="roleList.title"/&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;content tag="heading"&amp;gt;&amp;lt;fmt:message key="politic.heading"/&amp;gt;&amp;lt;/content&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;form:form commandName="command" &amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:set var="buttons"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type="button" style="margin-right: 5px"&lt;br /&gt;onclick="location.href='&amp;lt;c:url value="/politicForm.html"/&amp;gt;'"&lt;br /&gt;value="&amp;lt;fmt:message key="button.add"/&amp;gt;"/&amp;gt;&lt;br /&gt;&amp;lt;input type="button" onclick="location.href='prototipoPseudocodigo.htm'"&lt;br /&gt;value="&amp;lt;fmt:message key="button.done"/&amp;gt;"/&amp;gt;&lt;br /&gt;&amp;lt;/c:set&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div&amp;gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&amp;lt;bscweb:label key="label.salesForce" styleClass="desc" /&amp;gt;&lt;br /&gt;&amp;lt;form:select path="coFuerzaDeVenta"  id="coFuerzaDeVenta"  cssClass="text medium" onchange="cargarPoliticas()"&amp;gt;&lt;br /&gt; &amp;lt;form:options items="${fuerzasDeVenta}" itemValue="coSalesForceConceptType" itemLabel="coSalesForceConceptCode"/&amp;gt;&lt;br /&gt;&amp;lt;/form:select&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;table  class="table" width="200" border="1"&amp;gt;&lt;br /&gt;&amp;lt;thead&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;th scope="col"&amp;gt;Descripción&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;th scope="col"&amp;gt;Linea Fuerza de Venta&amp;lt;/th&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/thead&amp;gt;&lt;br /&gt;&amp;lt;tbody id="politicas"&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;c:out value="${buttons}" escapeXml="false" /&amp;gt;&lt;br /&gt;&amp;lt;/form:form&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type='text/javascript' src='/app/dwr/interface/PoliticManager.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;function cargarPoliticas() {&lt;br /&gt;&lt;br /&gt;DWRUtil.useLoadingMessage('Loading ...');&lt;br /&gt;&lt;br /&gt;var coFuerzaDeVenta = DWRUtil.getValue('coFuerzaDeVenta');&lt;br /&gt;PoliticManager.getPoliticas(coFuerzaDeVenta ,function(data) {&lt;br /&gt;DWRUtil.removeAllRows("politicas");&lt;br /&gt;DWRUtil.addRows("politicas",data, cellFuncs, { escapeHtml:false });&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;var cellFuncs = [&lt;br /&gt;function(data) { return "&amp;lt;a href='politicForm.html?politicId=" + data.coPolitic  + "'&amp;gt;" + data.dePolitic +  "&amp;lt;/a&amp;gt;"; },&lt;br /&gt;function(data) { return data.coLineaFuerzaDeVenta;}&lt;br /&gt;];&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4559944751960638745?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4559944751960638745/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4559944751960638745&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4559944751960638745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4559944751960638745'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/cargando-grids-con-dwr.html' title='Cargando grids con DWR'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/SaRcnFn7b1I/AAAAAAAAAWY/aFIl506oJ1k/s72-c/dwr-table1.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4376411152733506247</id><published>2009-02-24T03:46:00.001-08:00</published><updated>2009-02-25T11:41:19.307-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>DRY</title><content type='html'>&lt;span style="font-weight: bold;"&gt;DRY - Don´t Repeat Yourself : No Te Repitas&lt;/span&gt;&lt;br /&gt;No tener la misma cosa en dos o más lugares.&lt;br /&gt;Si cambia uno, usted tiene que cambiar lo demás. Y es difícil acordarse donde se encuentran las partes para realizar el cambio.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Wikipedia :&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;El principio &lt;/span&gt;&lt;b style="font-style: italic;"&gt;No te repitas&lt;/b&gt;&lt;span style="font-style: italic;"&gt; (en inglés &lt;/span&gt;&lt;b style="font-style: italic;"&gt;Don't Repeat Yourself&lt;/b&gt;&lt;span style="font-style: italic;"&gt; o  &lt;/span&gt;&lt;b style="font-style: italic;"&gt;DRY&lt;/b&gt;&lt;span style="font-style: italic;"&gt;, también conocido como &lt;/span&gt;&lt;b style="font-style: italic;"&gt;Una vez y sólo una&lt;/b&gt;&lt;span style="font-style: italic;"&gt;) es una filosofía de  definición de &lt;/span&gt;&lt;a style="font-style: italic;" title="Proceso" href="http://www.blogger.com/wiki/Proceso"&gt;procesos&lt;/a&gt;&lt;span style="font-style: italic;"&gt; que promueve la  reducción de la &lt;/span&gt;&lt;a style="font-style: italic;" class="mw-redirect" title="Duplicación" href="http://www.blogger.com/wiki/Duplicaci%C3%B3n"&gt;duplicación&lt;/a&gt;&lt;span style="font-style: italic;"&gt; especialmente en &lt;/span&gt;&lt;a style="font-style: italic;" class="mw-redirect" title="Computación" href="http://www.blogger.com/wiki/Computaci%C3%B3n"&gt;computación&lt;/a&gt;&lt;span style="font-style: italic;"&gt;. Según este principio ninguna  pieza de &lt;/span&gt;&lt;a style="font-style: italic;" title="Información" href="http://www.blogger.com/wiki/Informaci%C3%B3n"&gt;información&lt;/a&gt;  debería estar duplicada nunca debido a que la duplicación incrementa la  dificultad en los cambios y evolución posterior, puede perjudicar la claridad y  crea un espacio para posibles &lt;a style="font-style: italic;" title="Consistencia lógica" href="http://www.blogger.com/wiki/Consistencia_l%C3%B3gica"&gt;inconsistencias&lt;/a&gt;&lt;span style="font-style: italic;"&gt;. Por "pieza de  información" podemos, en un sentido amplio, entender desde datos almacenados en  una &lt;/span&gt;&lt;a style="font-style: italic;" title="Base de datos" href="http://www.blogger.com/wiki/Base_de_datos"&gt;base de datos&lt;/a&gt;&lt;span style="font-style: italic;"&gt;  pasando por el &lt;/span&gt;&lt;a style="font-style: italic;" title="Código fuente" href="http://www.blogger.com/wiki/C%C3%B3digo_fuente"&gt;código  fuente&lt;/a&gt;&lt;span style="font-style: italic;"&gt; de un programa de &lt;/span&gt;&lt;a style="font-style: italic;" title="Software" href="http://www.blogger.com/wiki/Software"&gt;software&lt;/a&gt; hasta llegar a información textual o  documentación. &lt;p style="font-style: italic;"&gt;Cuando el principio DRY se aplica de forma eficiente los cambios en cualquier  parte del proceso requieren cambios en un único lugar. Por el contrario, si  algunas partes del proceso están repetidas por varios sitios, los cambios pueden  provocar fallos con mayor facilidad si todos los sitios en los que aparece no se  encuentran &lt;a title="Sincronía" href="http://www.blogger.com/wiki/Sincron%C3%ADa"&gt;sincronizados&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Cómo se presenta la Duplicación?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La mayoría de la duplicación que vemos cae en una de las siguientes categorías:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Duplicación impuesta. &lt;/span&gt;Los desarrolladores sienten que no tienen opción -el entorno parece que requiere duplicación.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Duplicación inadvertida. &lt;/span&gt;Los desarrolladores no se percatan que están duplicando información.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Duplicación impaciente.&lt;/span&gt; A los desarrolladores les da pereza y duplican porque parece más fácil.&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Duplicación entre desarrolladores.&lt;/span&gt; Muchas personas en un equipo (o en diferentes equipos) duplican una pieza de información.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;public class Line {&lt;br /&gt;public Point start;&lt;br /&gt;public Point end;&lt;br /&gt;public double length;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;¿Qué tiene de malo este código? Que la longitud de la línea debe ser modificada cada que cambiamos alguno de los puntos de la misma. Por ello, si se nos olvida actualizar dicho valor incurriremos en un error de lógica bastante difícil de encontrar. Es mucho más fácil eliminar el campo o si forzosamente debemos tenerlo, podemos indicar al objeto que actualice el valor o que lo recalcule cada que se lo pidamos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;public class Line {&lt;br /&gt;private Point start;&lt;br /&gt;public Point end;&lt;br /&gt;public double length() {&lt;br /&gt;return Math.sqrt( Math.pow( ( start.getX() - end.getX() ),2 )&lt;br /&gt;+ Math.pow( ( start.getY() - end.getY() ),2) );&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4376411152733506247?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4376411152733506247/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4376411152733506247&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4376411152733506247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4376411152733506247'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/dry.html' title='DRY'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6047214585504399884</id><published>2009-02-22T22:12:00.000-08:00</published><updated>2009-02-22T22:12:00.542-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Linux 101 Hacks</title><content type='html'>Descarga gratuitamente el libro "Linux 101 Hacks"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SZzmLXVm9qI/AAAAAAAAAWA/uElLdvmTOgk/s1600-h/linux-101-hacks-175.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5304367544053200546" style="margin: 0px auto 10px; display: block; width: 175px; height: 248px; text-align: center;" alt="" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SZzmLXVm9qI/AAAAAAAAAWA/uElLdvmTOgk/s400/linux-101-hacks-175.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Ayudando a promocionar su primer libro de Ramesh Natarajan ya que es uno de los creadores de un blog que sigo &lt;a href="http://www.thegeekstuff.com/"&gt;The Geek Stuff &lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Información y descarga del libro &lt;a href="http://www.thegeekstuff.com/2009/02/linux-101-hacks-download-free-ebook/#comments"&gt;aquí&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/4107350313602582202-6047214585504399884?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6047214585504399884/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6047214585504399884&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6047214585504399884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6047214585504399884'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/linux-101-hacks_22.html' title='Linux 101 Hacks'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/SZzmLXVm9qI/AAAAAAAAAWA/uElLdvmTOgk/s72-c/linux-101-hacks-175.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6330953438774145801</id><published>2009-02-20T19:50:00.000-08:00</published><updated>2009-02-21T07:03:58.273-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><category scheme='http://www.blogger.com/atom/ns#' term='LDAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Búsqueda de usuarios en LDAP</title><content type='html'>En este ejemplo mostraré como obtener los datos de un usuario registrado en el LDAP.&lt;br /&gt;La pantalla podría ser la siguiente :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SZ98KtSYKTI/AAAAAAAAAWQ/d1drjD9HmbU/s1600-h/busquedaUsuario.bmp"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 116px;" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SZ98KtSYKTI/AAAAAAAAAWQ/d1drjD9HmbU/s400/busquedaUsuario.bmp" alt="" id="BLOGGER_PHOTO_ID_5305095409462946098" border="0" /&gt;&lt;/a&gt;Lo que primero necesitamos es conseguirnos la librería que nos permitirá a accesar al LDAP. La librería es &lt;span style="font-weight: bold;"&gt;ldapjdk.jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Declaramos los atributos necesarios para la conexión al LDAP , como también los atributos o keys de los datos del usuario (Por ejemplo: name, e-mail, country)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class LDAPConstants {&lt;br /&gt;  /*PRODUCCION*/&lt;br /&gt; static String HOST = "directory.4cuatros.com";&lt;br /&gt;&lt;br /&gt; /*PUERTO*/&lt;br /&gt; static int PORT = 4444 ;&lt;br /&gt;&lt;br /&gt; /*BASE DN*/&lt;br /&gt; static String BASE_DN = "o=4cuatros.com";&lt;br /&gt;&lt;br /&gt; static String[] attrs = {"name","mail","country"};&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Creamos el bean LDAPUsuario&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class LDAPUsuario {&lt;br /&gt;&lt;br /&gt;private String userId;&lt;br /&gt;private String deNombre;&lt;br /&gt;private String dePais;&lt;br /&gt;private String deMail;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public String getUserId() {&lt;br /&gt;return userId;&lt;br /&gt;}&lt;br /&gt;public void setUserId(String userId) {&lt;br /&gt;this.userId = userId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getDeNombre() {&lt;br /&gt;return deNombre;&lt;br /&gt;}&lt;br /&gt;public void setDeNombre(String deNombre) {&lt;br /&gt;this.deNombre = deNombre;&lt;br /&gt;}&lt;br /&gt;public String getDePais() {&lt;br /&gt;return dePais;&lt;br /&gt;}&lt;br /&gt;public void setDePais(String dePais) {&lt;br /&gt;this.dePais = dePais;&lt;br /&gt;}&lt;br /&gt;public String getDeMail() {&lt;br /&gt;return deMail;&lt;br /&gt;}&lt;br /&gt;public void setDeMail(String deMail) {&lt;br /&gt;this.deMail = deMail;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Realizamos la conexión al LDAP y obtenemos los datos del empleado&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class LDAPProvider {&lt;br /&gt;&lt;br /&gt;public LDAPUsuario getUserLDAP(String userId){&lt;br /&gt;LDAPUsuario userLDAP = null;&lt;br /&gt;LDAPConnection connection = new LDAPConnection();&lt;br /&gt;String userNameLDAP = "uid="+ userId;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;connection.connect(LDAPConstants.HOST,LDAPConstants.PORT);&lt;br /&gt;          String[] filters = LDAPConstants.attrs;&lt;br /&gt;      &lt;br /&gt;LDAPSearchResults results = connection.search(LDAPConstants.BASE_DN,         connection.SCOPE_SUB,userNameLDAP, filters, false );&lt;br /&gt;&lt;br /&gt;if(results.hasMoreElements()){&lt;br /&gt;            LDAPEntry entry = results.next();           &lt;br /&gt;              userLDAP = new LDAPUsuario();&lt;br /&gt;              userLDAP.setUserId(userNameLDAP);&lt;br /&gt;              userLDAP = obtenerDatosUsuario(filters, entry);             &lt;br /&gt;           } &lt;br /&gt;&lt;br /&gt; } catch ( LDAPReferralException e ) {&lt;br /&gt;  // Ignore referrals         &lt;br /&gt;            //throw new JboException(ConstantList.ERROR_LOGIN);&lt;br /&gt;&lt;br /&gt; } catch ( LDAPException e ){&lt;br /&gt;  //throw new JboException(ConstantList.ERROR_LOGIN);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;return userLDAP;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private LDAPUsuario obtenerDatosUsuario(String[] filtros, LDAPEntry entry  ){&lt;br /&gt;if(filtros == null || entry == null || filtros.length&lt;1) usuario =" new" i =" 0;" attr =" entry.getAttribute(" enumvals =" attr.getStringValues();" val =" (String)enumVals.nextElement();"&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Es importante saber el orden de los atributos, en mi caso el primer atributo es el nombre, el segundo el mail y tercero el país.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-6330953438774145801?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6330953438774145801/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6330953438774145801&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6330953438774145801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6330953438774145801'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/busqueda-de-usuarios-en-ldap.html' title='Búsqueda de usuarios en LDAP'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/SZ98KtSYKTI/AAAAAAAAAWQ/d1drjD9HmbU/s72-c/busquedaUsuario.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7042514181072046249</id><published>2009-02-18T20:34:00.000-08:00</published><updated>2009-04-03T22:25:25.339-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Librerías JS'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='videos 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Video Tutorial JQuery</title><content type='html'>Es un buen curso que consta de 15 videos que son de nivel principiante ya que en cada video mezcla temas de JQuery con conceptos básicos de Javascript, DOM y CSS.&lt;br /&gt;&lt;br /&gt;Los videos se encuentran en este &lt;a href="http://illasaron.com/upload/videos?ct=34/"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Les adelanto una clase:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Clase 10: Manipulando el DOM&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/AeL_BgA" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7042514181072046249?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7042514181072046249/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7042514181072046249&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7042514181072046249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7042514181072046249'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/video-tutorial-jquery.html' title='Video Tutorial JQuery'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1938866947106949342</id><published>2009-02-15T21:52:00.000-08:00</published><updated>2009-02-15T22:11:04.439-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='videos 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Otros'/><title type='text'>3 lecciones de Steve Jobs</title><content type='html'>Este es un discurso de Steve Jobs que me hizo ver mi madre el día de ayer, trata de 3 lecciones de su vida&lt;br /&gt;&lt;br /&gt;Lección 1 : Conectar los puntos&lt;br /&gt;Lección 2 : Amor y la pérdida&lt;br /&gt;Lección 3 : La muerte&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lección 1 y 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ykUyVFkizfQ&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/ykUyVFkizfQ&amp;amp;hl=es&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lección 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/X4xO1QUKYxM&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/X4xO1QUKYxM&amp;amp;hl=es&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-1938866947106949342?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1938866947106949342/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1938866947106949342&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1938866947106949342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1938866947106949342'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/3-lecciones-de-steve-jobs.html' title='3 lecciones de Steve Jobs'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5774058463637737694</id><published>2009-02-12T04:16:00.000-08:00</published><updated>2009-02-15T22:13:07.908-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='videos 4'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='SCRUM'/><title type='text'>SCRUM en menos de 10 minutos</title><content type='html'>Aprendiendo la metodología SCRUM en menos de 10 minutos.&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Q5k7a9YEoUI&amp;amp;hl=es&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Q5k7a9YEoUI&amp;amp;hl=es&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5774058463637737694?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5774058463637737694/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5774058463637737694&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5774058463637737694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5774058463637737694'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/scrum-en-menos-de-10-minutos.html' title='SCRUM en menos de 10 minutos'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-4699090933927024395</id><published>2009-02-09T14:43:00.000-08:00</published><updated>2009-02-09T16:00:52.152-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>Ortogonalidad</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oo_xdGd7F-k/SZC1XkUgxTI/AAAAAAAAASg/RxqtuT96kII/s1600-h/ortogonalidad.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 280px; height: 173px;" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/SZC1XkUgxTI/AAAAAAAAASg/RxqtuT96kII/s320/ortogonalidad.JPG" alt="" id="BLOGGER_PHOTO_ID_5300936177906402610" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;blockquote&gt;Dos o más cosas (de software) son ortogonales si los cambios en una de  ellas no afectan a ninguna de las otras. La ortogonalidad, además de eliminar  efectos entre cosas no relacionadas, facilita los desarrollos con equipos  grandes.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-weight: bold;"&gt;Un Sistema No Ortogonal  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Está un helicóptero sobre el Gran Cañón, cuando el piloto, que cometió el error obvio de comer pescado para el almuerzo, repentinamente gime y se desmaya. &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SZC0d9b49oI/AAAAAAAAASY/MgAxgJ8oLRg/s1600-h/controles_helicoptero.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 282px; height: 211px;" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SZC0d9b49oI/AAAAAAAAASY/MgAxgJ8oLRg/s320/controles_helicoptero.jpg" alt="" id="BLOGGER_PHOTO_ID_5300935188215821954" border="0" /&gt;&lt;/a&gt;Afortunadamente, lo deja suspendido a 30 metros sobre el suelo. Usted razona que nivel de inclinación colectiva controla la elevación, así que bajándola un poco empezaría a descender suavemente a tierra. Sin embargo, cuando lo intenta, descubre que la vida no es tan simple. La nariz del helicóptero baja, y usted comienza a hacer una espiral descendente hacia la izquierda. De pronto, descubre que está volando un sistema donde cada entrada de control tiene efectos secundarios. Baja el nivel de la mano izquierda y necesita agregar un movimiento de compensación a la palanca de la mano derecha y presionar el pedal derecho. Pero entonces cada uno de estos cambios afecta todos los otros controles otra vez. De pronto, está haciendo malabares con un sistema increíblemente complejo, donde cada cambio afecta todas las otras entradas. Su carga de trabajo es fenomenal, sus manos y pies están moviéndose constantemente, tratando de balancear todas las fuerzas que interactúan.&lt;br /&gt;&lt;br /&gt;Los controles del helicóptero no son ortogonales, definitivamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Beneficios de la Ortogonalidad&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como ilustra el ejemplo del helicóptero, los sistemas no ortogonales son inherentemente más complicados para cambiar y controlar.&lt;br /&gt;&lt;br /&gt;Queremos diseñar componentes que sean autocontenidos: independientes, y con un propósito singular y bien definido. Cuando los componentes están aislados uno del otro, sabe que puede cambiar uno sin preocuparse del resto. Mientras no cambie las interfaces externas de los componentes, puede estar confiado en que no causará problemas que se propaguen por todo el sistema.&lt;br /&gt;&lt;br /&gt;Escribiendo sistemas ortogonales gana dos grandes beneficios: incrementa la productividad, y reduce el riesgo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-4699090933927024395?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/4699090933927024395/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=4699090933927024395&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4699090933927024395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/4699090933927024395'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/ortogonalidad.html' title='Ortogonalidad'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/SZC1XkUgxTI/AAAAAAAAASg/RxqtuT96kII/s72-c/ortogonalidad.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-6705215737083499883</id><published>2009-02-06T00:01:00.000-08:00</published><updated>2009-02-06T02:56:50.156-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><title type='text'>La fábula del pastor y el jefe de proyectos</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SYWtuebPCmI/AAAAAAAAARg/p9-57Cubg7s/s1600-h/pastor.bmp"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Paseaba un día un jefe de proyectos por el campo. Tras años de rayos catódicos era su primer paseo por el páramo castellano en mucho tiempo. Lo necesitaba. La ocasión merecía los pantalones y las botas que estrenaba, recién compradas en la tienda de Timberland del aeropuerto. Iba pensando en lo bucólico del paisaje y la paz que se respiraba y lo lejos que estaba ahora de las reuniones 'tressesenta' , cuando vio, en la lejanía, para un informático 350 metros son la lejanía, un pastor de ovejas con rebaño de discreto tamaño. No más de cincuenta recursos eran los que el pastor gestionaba.&lt;br /&gt;&lt;br /&gt;En ese preciso instante el modesto pastor vio al 'pimpollo' y pensó… vaya, otro que estrena botas, mañana con ampollas… mientras arrancaba un lasca de queso con su navaja. En esto el 'pinpollo' ya estaba a su lado. El pastor levanto la cabeza, miro a nuestro jefe de proyecto y le tendió un trozo de queso. Ya se sabe, que en la castilla profunda, la hospitalidad se muestra más de gesto que de palabra.&lt;br /&gt;&lt;br /&gt;El jefe de proyecto cogió el queso, sin poder evitar pensar: 'que uñas más negras'. Y se sentó junto al pastor. La botas le estaban matando. Degusto el queso, que le supo como le sabía el queso cuando tenía forma de queso y no forma de triángulo metido en un plástico. Y ya se sabe, un buen queso puede tener efectos tan alucinógenos como el LSD. Sobre todo si no se ha probado en años… y no sale de la máquina de la sala de café después de poner dos euros y pulsar sesenta y siete.&lt;br /&gt;&lt;br /&gt;Así que embriagado por los aromas de aquel queso, el jefe de proyecto no pudo evitar decir: 'señor pastor, lo suyo si que es vida'. El pastor le miro, sin decir nada. 'Todo el día dedicado a usted mismo, con sus fieles recursos que nunca se &lt;a href="http://4.bp.blogspot.com/_oo_xdGd7F-k/SYWukVs3kBI/AAAAAAAAARo/F3QdNHdSRvc/s1600-h/pastor.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297832475995115538" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 214px" alt="" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SYWukVs3kBI/AAAAAAAAARo/F3QdNHdSRvc/s320/pastor.bmp" border="0" /&gt;&lt;/a&gt;oponen a su voluntad, que saben lo que deben hacer sin que nadie se lo diga, que no están todo el día exigiendo y pensando en irse a su hora a casa. Lo que daría yo por estar en su situación… ' continuó el jefe.&lt;br /&gt;El pastor le miró y con la simpleza que solo da la verdadera sabiduría dijo: 'no sabe usted de lo que habla, amigo'. Y tiro un largo trago de bota. El jefe de proyecto no se iba a amilanar, así que espetó: 'Usted si que no sabe nada de lo duro que es mi trabajo, seguro que yo cuidaría mejor de sus ovejas que usted de mi equipo de desarrolladores'. El pastor le miró fijamente y dijo 'hecho, escriba aquí la dirección de su empresa y avise de que voy'. Le tendió la bota al jefe, en un gesto que decía claramente que si bebía, el trato estaba cerrado. Y claro, el jefe bebió mientras pensaba, 'que cojones, aquí el que tiene el MBA soy yo'.&lt;br /&gt;&lt;br /&gt;El pastor se levantó, silbó a su perro y le dijo, 'dentro de unas semana vuelvo, de mientras, obedece a este pinpollo'… El perro le miró con incredulidad y acatamiento. Le dio el petate al 'pipollo' y marcho a conocer a su nuevo rebaño. No se sabe quien estaba más acojonado, si el jefe de proyecto o el pastor.&lt;br /&gt;&lt;br /&gt;Pasado el estupor inicial, el jefe penso: 'bueno se trata de gestionar recursos ¿no? Llevo haciendo eso años. Seguro que las ovejas saben hacer mejor su trabajo que los desarrolladores. Tengo claro el objetivo, que den lana, y solo necesito crear un plan y exigir su cumplimento'. Con un buen plan y mano férrea seguro que lograba cumplir sus objetivos. El jefe respiró tranquilo cuando recordó que llevaba su flamante PDA y que tenia Project y Excel versión requetemini. Todo estaba solucionado. Dedicó esa noche a trazar un plan. Fue una dura noche, lloviendo y tronando. Las ovejas durmieron a la intemperie, pero no pasaba nada, el tenía 'el plan'. 50 recursos de tipo oveja, a 50 kilos de lana por recurso, 2500 kilos de lana. Un proyecto rentable sin duda…&lt;br /&gt;&lt;br /&gt;Al día siguiente el jefe reunió al rebaño. 'Tengo un plan que nos va a llevar a completar el proyecto de manera exitosa. Ya me he comprometido con el señor alcalde, cacique local y comerciante de lana, a entregarle 2500 kilos de la mejor lana en el plazo de dos meses. El alcalde me ha hecho saber su satisfacción y su plena confianza en que conmigo al frente, MBA y gestor de recursos experto, el proyecto va a ser todo un éxito.' Las ovejas no entendían nada. Ellas sabían que el alcalde solía preocuparse más por la leche que por la lana, pero quizás las cosas habían cambiado, que sabían ellas, meros recursos productores de ¿lana? ¿leche?... En cualquier caso, la ovejas, no habían nunca producido tanta lana en tan poco tiempo pero con un buen gestor al mando quizás se obrase el milagro. El project que el jefe tenía era muy bonito… que barritas azules más iguales, oye.&lt;br /&gt;&lt;br /&gt;Pasaron veinte días y el jefe de proyecto reunió de nuevo a las ovejas. 'Queridas ovejas, vamos retrasados respecto mi plan. No dudo de que haréis lo necesario para asegurar que producís la lana al ritmo necesario. Espero que todas arriméis el hombro y que no os vayáis a casa sin cumplir con vuestro trabajo. Ya he hablado con el alcalde y le he dicho que no se preocupe que apretaremos nuestro culo bobino y recuperaremos el tiempo perdido'. Las ovejas no entendían nada, ya se sabe que no es un animal demasiado listo… apretaron su ovino culo y se fueron a pastar. Al fin y al cabo no sabían como hacer crecer la lana más rápido… y parecía que el jefe tampoco.&lt;br /&gt;&lt;br /&gt;Otros veinte días después, el jefe de proyecto reunió de nuevo al rebaño. 'Malditas ovejas. Os pedí un esfuerzo y no habéis hecho nada. Yo hice el plan y vosotras estáis haciendo que fracase. Como no os apliquéis más algunas de vosotras vais a ir a la *** calle. Y ya sabéis la crisis que hay… puedo encontrar cincuenta como vosotras en cualquier ETT'. La ovejas, una vez más, no entendieron nada. Ya le habían dicho al jefe de proyecto que el que no las metiese en el corral por las noches y que no las hubiese cambiado de prado en todo el tiempo no era muy beneficioso para su lana. Habían pensado que a lo mejor si se movían por el campo como hacían con el pastor, la producción de lana mejorase. También sugerían que el jefe las ordeñase, sabían que el alcalde siempre quería leche... 'Estas ovejas, siempre quejándose de chorradas, ya sabía yo que no eran muy diferentes a los desarrolladores. Que sigan el plan y dejen de quejarse y pensar, para eso ya estoy yo. ¡No hay manera de hacer que trabajen!' había pensado el jefe de proyecto.&lt;br /&gt;Otros veinte días después el alcalde llegó y preguntó al jefe por su lana… el jefe solo tenía 1000 kilos, la ovejas resultaron no ser tan expertas como ponía en su curriculum, inaceptable… que podría haber hecho él… 'No pasa nada jefe', dijo el alcalde, 'tendremos mucha leche entonces'. El jefe se puso rojo y dijo 'leche, que leche, en el contrato no decía nada de leche'… El alcalde dijo, 'me la sopla lo que diga el contrato, lo de la leche se da por supuesto, vaya fracaso del proyecto, no vas a ver un *** duro…'.&lt;br /&gt;&lt;br /&gt;En esas llegó el pastor… seguro que el también la habría cagado. 'Mal de muchos, consuelo de tontos, pero consuelo al fin y al cabo' pensó el jefe… '¿Qué tal pastor? ¿Duro el trabajo?' dijo con tonillo de sorna. El pastor contesto, con su simpleza natural: 'Todo ha ido sobre ruedas. Al fin y al cabo los desarrolladores son como ovejas ¿no? Seguro que a ti también te ha ido bien. Los desarrolladores incluso me han regalado un GPS para que marque donde comen mejor mis ovejas… ¡y donde hay setas!. Creo que me han cogido cariño los jodidos, que majetes'. El jefe no salía de su asombro. Los recursos eran agradecidos y todo. ¡Cuéntame que has hecho, por favor!, dijo al pastor.&lt;br /&gt;&lt;br /&gt;'Ha sido fácil. Al fin y al cabo los desarrolladores son mucho más comunicativos que las ovejas y cuesta menos reunirlos. Todas las mañanas, sin perro ni nada, les tenía localizados. Además, pensé, no pueden ser muy diferentes que las ovejas, son individualistas y gregarios a la vez. Seguro que si cuido de ellos como hago con mis ovejas obtendré los resultados esperados y a eso me he dedicado estas semanas.'&lt;br /&gt;&lt;br /&gt;El pastor continuo 'me pidieron que les consiguiese un servidor de 64 bits para no se que pruebas de rendimiento y de compatibilidad. Yo no tenía ni idea de qué es eso, pero parecía importante para ellos, así que lo conseguí. ¿No busco los mejores pastos para mi ovejas? No es tan diferente…' El jefe de proyecto flipaba, ¿desde cuándo se logra algo de los recursos atendiendo a sus caprichos?…&lt;br /&gt;&lt;br /&gt;Luego prosiguió el pastor contando otra situación: 'Un día, los desarrolladores dijeron que no lograban que el rendimiento fuese el adecuado, y que en su opinión lo mejor era tirar de un experto. Así que eso hice busque un experto que les ayudase y les formase. ¿No llevo a mis ovejas al veterinario cuando tienen problemas?'. Ahora sí que el jefe de proyecto no se lo podía creer, ¡formar a los recursos es caro! Y luego se van a la competencia en cuanto saben.&lt;br /&gt;'Me acuerdo de otra cosa curiosa', dijo el pastor: 'Otro día los desarrolladores me contaron que no lograban avanzar. Eso me preocupó. ¿Se supone que los desarrolladores deben avanzar en la funcionalidad, es su lana y su leche, no?. El problema, contaron, es que los comerciales estaban continuamente demandando pequeñas modificaciones, visitas a clientes, que atendiesen llamadas… Parece que los lobos acechan, pensé yo. Así que puse un poco de orden y deje claro que a mi rebaño no se le molesta'.&lt;br /&gt;&lt;br /&gt;El pastor concluyo: 'la verdad es que no he hecho mucho ¿no?. Los desarrolladores son como las ovejas, si dejas que hagan su trabajo y pones las condiciones para que lo hagan, al final puedes recoger los resultados'.&lt;br /&gt;&lt;br /&gt;En estas despertó el jefe de proyecto y pensó: 'joder, como pega el vino del pastor, vaya siesta y vaya sueño más raro', mientras veía al pastor perderse por el horizonte con su rebaño.&lt;br /&gt;&lt;br /&gt;Yo me pregunto: ¿A que se parece más el trabajo de Scrum Master, cuyo principal cometido es eliminar los impedimentos que encuentra el equipo, al de un Jefe de Proyecto clásico o al de un pastor?.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-6705215737083499883?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/6705215737083499883/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=6705215737083499883&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6705215737083499883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/6705215737083499883'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/la-fabula-del-pastor-y-el-jefe-de.html' title='La fábula del pastor y el jefe de proyectos'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/SYWukVs3kBI/AAAAAAAAARo/F3QdNHdSRvc/s72-c/pastor.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5872766044941989013</id><published>2009-02-03T05:40:00.000-08:00</published><updated>2009-02-03T13:21:14.721-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Usando BeanWrapperImpl</title><content type='html'>En el post anterior &lt;a href="http://4cuatros.blogspot.com/2009/01/cargar-combos-con-adf-faces.html"&gt;Cargando combos con ADF-faces&lt;/a&gt; mencioné un poco de esta clase de Spring (org.springframework.beans.BeanWrapperImpl), pues es una herramienta muy buena que permite realizar un "get" o "set" al valor de la propiedad de un bean a través del nombre de la propiedad de éste.&lt;br /&gt;&lt;br /&gt;Supongamos que todos nuestros beans tienen como atributo : "id" y "descripcion" y necesitamos convertir una lista de beans a un map sin usar interfaces, el código sería de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public static Map getMapFromListOfBeans(List beanList){&lt;br /&gt;  Map map = new HashMap();         &lt;br /&gt;  for (Iterator iterator = beanList.iterator(); iterator.hasNext();) {     &lt;br /&gt;    Object bean = (Object) iterator.next();         &lt;br /&gt;    BeanWrapper bw = new BeanWrapperImpl(bean);          &lt;br /&gt;    String codigo = (String)bw.getPropertyValue("id"));      &lt;br /&gt;    String nombre = (String) bw.getPropertyValue("descripcion");     &lt;br /&gt;    map.put(codigo, nombre);     &lt;br /&gt;  }       &lt;br /&gt;  return map;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;Es importante saber donde utilizar el BeanWrapperImpl, podría simplificar y mejorar tu código....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5872766044941989013?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5872766044941989013/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5872766044941989013&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5872766044941989013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5872766044941989013'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/usando-beanwrapperimpl.html' title='Usando BeanWrapperImpl'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2271158589740206002</id><published>2009-02-01T05:43:00.000-08:00</published><updated>2009-02-01T05:50:35.728-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Manuales / Tutoriales'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Ubuntu Pocket Guide and Reference</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_oo_xdGd7F-k/SYWoGcnpnvI/AAAAAAAAARY/SfpNXvopF5Y/s1600-h/ubuntu_pocket_guide.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297825365386436338" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 262px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_oo_xdGd7F-k/SYWoGcnpnvI/AAAAAAAAARY/SfpNXvopF5Y/s400/ubuntu_pocket_guide.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;La corriente Open Source cada vez es más alta y sería bueno que nos vayamos preparando utilizando Ubuntu.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Adjunto este link donde te puedes bajar gratuitamente esta guía interesante : &lt;a href="http://www.ubuntupocketguide.com/"&gt;Ubuntu Pocket Guide and Reference&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/4107350313602582202-2271158589740206002?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2271158589740206002/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2271158589740206002&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2271158589740206002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2271158589740206002'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/02/ubuntu-pocket-guide-and-reference.html' title='Ubuntu Pocket Guide and Reference'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oo_xdGd7F-k/SYWoGcnpnvI/AAAAAAAAARY/SfpNXvopF5Y/s72-c/ubuntu_pocket_guide.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-8282122429278878629</id><published>2009-01-30T09:06:00.000-08:00</published><updated>2009-02-03T14:02:32.194-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reportes'/><title type='text'>Ejemplo de Corda</title><content type='html'>&lt;div&gt;La curiosidad de Apolo, me llevó a postear este ejemplo, se trata de reportes en flash hecho en &lt;a href="http://www.corda.com/"&gt;Corda&lt;/a&gt;.&lt;br /&gt;Primero se diseña una plantilla y se nombran los objetos del gráfico. Como en esta figura:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5297136998908856978" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 336px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SYM2CPqKipI/AAAAAAAAAQY/mVPB9hiHIMY/s400/sampleCorda.JPG" border="0" /&gt;&lt;br /&gt;Analizamos el siguiente &lt;a href="http://www.corda.com/docsource/doc5/combo/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=web_dev_guide&amp;amp;file=webdev_pcscript_pcxml4.html"&gt;PCScript&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;main.ParamDelimiter()&lt;br /&gt;SouthAmerica.setValues(Country;PERU;COLOMBIA)&lt;br /&gt;&lt;br /&gt;SouthAmerica.SetHover(Country;PERU el valor popup para Peru es 25;COLOMBIAel valor popup para colombia es 25)&lt;br /&gt;&lt;br /&gt;main.ParamDelimiter(,)&lt;br /&gt;barra1.setcategories(2007)&lt;br /&gt;barra1.setseries(PERU;43)&lt;br /&gt;barra1.setseries(COLOMBIA;65)&lt;br /&gt;barra1.addHoverText(1,PERU,VALOR PARA PERU 2006 40 \n VALOR PARA PERU 2007 43)&lt;br /&gt;barra1.addHoverText(1,COLOMBIA,VALOR PARA COLOMIA 2006 65 \n VALOR PARA COLOMBIA 2007 43)&lt;br /&gt;barra1.ddEnable(1,PERU,http://www.yahoo.com?VALOR=PERU)&lt;br /&gt;barra1.ddEnable(1,COLOMBIA,http://www.yahoo.com?VALOR=COLOMBIA)&lt;br /&gt;&lt;br /&gt;Peru_pie_pop_mer.setcategories(PERU NORTE)&lt;br /&gt;Peru_pie_pop_mer.setseries(Item 1;80)&lt;br /&gt;Peru_pie_pop_mer.setseries(Item 2;70)&lt;br /&gt;Peru_pie_pop_mer.setseries(Item 3;60)&lt;br /&gt;Peru_pie_pop_mer.setseries(Item 4;50)&lt;br /&gt;Peru_pie_pop_mer.setseries(Item 5;100)&lt;br /&gt;&lt;br /&gt;Peru_pie_pop_bms.setcategories(PERU SUR)&lt;br /&gt;Peru_pie_pop_bms.setseries(Item 1;60)&lt;br /&gt;Peru_pie_pop_bms.setseries(Item 2;70)&lt;br /&gt;Peru_pie_pop_bms.setseries(Item 3;70)&lt;br /&gt;Peru_pie_pop_bms.setseries(Item 4;80)&lt;br /&gt;Peru_pie_pop_bms.setseries(Item 5;30)&lt;br /&gt;&lt;br /&gt;Colombia_pie_pop_mer.setcategories(COLOMBIA NORTE)&lt;br /&gt;Colombia_pie_pop_mer.setseries(Item 1;100)&lt;br /&gt;Colombia_pie_pop_mer.setseries(Item 2;80)&lt;br /&gt;Colombia_pie_pop_mer.setseries(Item 3;30)&lt;br /&gt;Colombia_pie_pop_mer.setseries(Item 4;20)&lt;br /&gt;Colombia_pie_pop_mer.setseries(Item 5;10)&lt;br /&gt;Colombia_pie_pop_bms.setcategories(COLOMBIA SUR)&lt;br /&gt;Colombia_pie_pop_bms.setseries(Item 1;50)&lt;br /&gt;Colombia_pie_pop_bms.setseries(Item 2;70)&lt;br /&gt;Colombia_pie_pop_bms.setseries(Item 3;90)&lt;br /&gt;Colombia_pie_pop_bms.setseries(Item 4;30)&lt;br /&gt;Colombia_pie_pop_bms.setseries(Item 5;50)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;em&gt;Métodos&lt;/em&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;SetHover&lt;/strong&gt; .- Para los tipo de obejto "mapa". Muestra un texto tipo al pasar el mouse sobre el mapa (ToolTipText).&lt;br /&gt;&lt;strong&gt;setcategories&lt;/strong&gt; .- Separa por categoría&lt;br /&gt;&lt;strong&gt;setseries&lt;/strong&gt; .- Se coloca el valor y el concepto &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5297147642180305346" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 286px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/SYM_tw70gcI/AAAAAAAAAQg/dASN-JfQ9dA/s400/corda1.JPG" border="0" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;addHoverText&lt;/strong&gt; .- Para los tipo de objeto "chart" Muestra un texto al pasar el mouse sobre las barras (ToolTipText).&lt;br /&gt;&lt;strong&gt;ddEnable&lt;/strong&gt; .- ("dd" = drillDown) Para los tipo de objeto "chart". Realizar un href. Se coloca una URL.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5297147974634070578" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 286px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_oo_xdGd7F-k/SYNABHa-YjI/AAAAAAAAAQo/1HecgILBeCo/s400/corda2.JPG" border="0" /&gt;&lt;br /&gt;&lt;p&gt;Otro tipo de reporte:&lt;/p&gt;&lt;img id="BLOGGER_PHOTO_ID_5297176110181025762" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 246px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/SYNZm0gGh-I/AAAAAAAAAQw/icy3HZ6KJeQ/s400/demo_corda.JPG" border="0" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-8282122429278878629?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/8282122429278878629/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=8282122429278878629&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8282122429278878629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8282122429278878629'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/ejemplo-de-corda.html' title='Ejemplo de Corda'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oo_xdGd7F-k/SYM2CPqKipI/AAAAAAAAAQY/mVPB9hiHIMY/s72-c/sampleCorda.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1748451217323656314</id><published>2009-01-28T00:01:00.000-08:00</published><updated>2009-01-28T05:25:48.160-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>La sopa de piedras: Ser catalizador de cambios</title><content type='html'>A veces, en un proyecto de desarrollo, nos encontramos ante una situación: tenemos claro cuál es el camino a seguir, por ejemplo, en un tema de diseño. Está ante nuestros ojos la solución al problema que tiene empantanado al equipo. O simplemente, vemos una mejor forma de hacer algo. Pero si comenzamos a discutir el tema, si tratamos de exponer la idea buscando aprobación, entraremos en reuniones, discusiones, comités para buscar el visto bueno para la acción.&lt;br /&gt;&lt;br /&gt;Hay otro camino.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Sopa de piedras&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;em&gt;Tres soldados retornaban de la guerra, volviendo a sus hogares. Iban por el camino, cansados y hambrientos. Ven una villa adelante del camino, y sus espíritus se levantan, seguramente los habitantes de la villa les darán alimento. Pero cuando lleguan, encuentran las puertas y ventanas cerradas. Despues de años de guerra, los habitantes de la villa estaban escasos de comida, y cuidaban lo poco que tenían. &lt;a href="http://3.bp.blogspot.com/_oo_xdGd7F-k/SX6VhEm6lAI/AAAAAAAAAOw/aqSlI505AHo/s1600-h/sopa+de+piedras.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5295834607239468034" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 134px; CURSOR: hand; HEIGHT: 135px" alt="" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/SX6VhEm6lAI/AAAAAAAAAOw/aqSlI505AHo/s320/sopa+de+piedras.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Los soldados, entonces, hierven en una olla agua, y le ponen cuidadosamente tres piedras. Los habitantes de la villa, asombrados, se acercan a mrar.&lt;br /&gt;"Esto es sopa de piedras", explica un soldado. "¿Es todo lo que pusieron en la sopa? ¿Piedras?", preguntan los curiosos. "Absolutamente, sólo piedras, pero debo decir que sabría mejor si tuviéramos una zanahorias...". Uno de los habitantes de la villa, corre a su casa, y retorna con una canasta de zanahorias de su huerta.&lt;br /&gt;Un par de minutos más tarde, los habitantes preguntan de nuevo "¿sólo eso se necesita?".&lt;br /&gt;"Bueno " dice un soldado " un par de papas le darían más cuerpo a la sopa". Otro habitante vuelve a su casa, y trae papas.&lt;br /&gt;Durante una hora, los soldados enumeraron más ingredientes que podrían mejorar la sopa: carne, puerros, sal, hierbas. Cada vez, un habitante distinto iba y traía lo que se necesitaba.&lt;br /&gt;Eventualmente, ellos terminaron con una gran olla de sopa caliente. Los soldados removieron las piedras, se sentaron con el pueblo entero, a disfrutar de la primera comida completa en meses.&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Es tiempo de poner nuestras piedras en la olla. En vez de pedir permiso para la idea completa, haga algo chico, bien desarrollado y expuesto. Una vez lo tenga pulido, muéstrelo a su gente, que vean lo que puede hacerse. Y luego, diga, "claro, podría estar mejor si tuviéramos X...". Pero sin darle mucha importancia. Ahí verá si realmente el germen de la idea prendió o no. Si no, no insista por el momento. Si prendió, seguramente la idea tomará inercia, y conseguirá más apoyo para lo que quiere hacer y cambiar. A veces, mostrar un poco del futuro, hace que la gente se suba al tren que les prepara.&lt;br /&gt;No siempre el cambio se puede lograr con discusión y razonamiento. A veces, hay que maniobrar para vencer la inercia o resistencia al cambio, que tengamos delante.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Los lectores de "The Pragmatic Programmer", de Andrew Hunt y Dave Thomas, reconoceran el "tip 5" que recomiendan: "Be a Catalyst for Change", sea un catalizador del cambio.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-size:78%;"&gt;Extraido del blog de &lt;/span&gt;&lt;a href="http://ajlopez.zoomblog.com/"&gt;&lt;span style="font-size:78%;"&gt;Angel "Java" Lopez&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;a href="http://msmvps.com/blogs/lopez/default.aspx"&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/4107350313602582202-1748451217323656314?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1748451217323656314/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1748451217323656314&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1748451217323656314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1748451217323656314'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/la-sopa-de-piedras-ser-catalizador-de.html' title='La sopa de piedras: Ser catalizador de cambios'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/SX6VhEm6lAI/AAAAAAAAAOw/aqSlI505AHo/s72-c/sopa+de+piedras.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7702122637627393789</id><published>2009-01-26T05:14:00.000-08:00</published><updated>2009-04-03T22:25:50.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='DropDown'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>Cargar combos con ADF-Faces</title><content type='html'>Este es un ejemplo de 2 combos anidados, similar a los demás ejemplos que es un combo de departamentos que carga un combo de distritos.&lt;br /&gt;&lt;br /&gt;En el jsp :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;af:selectOneChoice id="departamento"  label="#{mensajes['pagina.dashboards.departamento.label']}"&lt;br /&gt;valuePassThru="true"&lt;br /&gt;value="#{trendPage.departamentoId}"&lt;br /&gt;autoSubmit="true" &lt;br /&gt;valueChangeListener="#{trendPage.departamentoChangeListener}"&amp;gt;&lt;br /&gt;&amp;lt;f:selectItems value="#{trendPage.departamentos}" /&amp;gt;&lt;br /&gt;&amp;lt;/af:selectOneChoice&amp;gt;&lt;br /&gt;     &lt;br /&gt;     &lt;br /&gt;&amp;lt;af:selectOneChoice id="distrito"  label="#{mensajes['pagina.dashboards.distrito.label']}"&lt;br /&gt;value="#{trendPage.distritoId}"&lt;br /&gt;partialTriggers="departamento"&amp;gt;&lt;br /&gt;&amp;lt;f:selectItems value="#{trendPage.distritos}" /&amp;gt;&lt;br /&gt;&amp;lt;/af:selectOneChoice&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"mensajes" de la propiedad "label" es un properties donde están los valores de las etiquetas de las páginas.&lt;br /&gt;&lt;br /&gt;Para que resulte la parte de Ajax es necesario colocar :&lt;br /&gt;a) En el selectOneChoice de departamentos :&lt;br /&gt;valuePassThru="true"&lt;br /&gt;autoSubmit="true"&lt;br /&gt;valueChangeListener="#{trendPage.departamentoChangeListener}"&gt;&lt;br /&gt;&lt;br /&gt;b) En el selectOneChoice de distritos:&lt;br /&gt;partialTriggers="departamento"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En el controller :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public class TrendPage{&lt;br /&gt;&lt;br /&gt;private Map departamentos;&lt;br /&gt;private Map distritos;&lt;br /&gt;private String departamentoId;&lt;br /&gt;private String distritoId;&lt;br /&gt;private DepartamentoManager departamentoManager;&lt;br /&gt;private DistritoManager distritoManager;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void setDepartamentos(Map departamentos){&lt;br /&gt;  this.departamentos = departamentos;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Map getDepartamentos(){&lt;br /&gt;if(departamentos == null){&lt;br /&gt;List departamentosList = departamentoManager.getDepartamentos();&lt;br /&gt; for (Iterator iterator = distritoList.iterator(); iterator.hasNext();) {&lt;br /&gt;  Departamento departamento = (Departamento) iterator.next();&lt;br /&gt;  departamentos.put(departamento.getNombre(), departamento.getCodigo());&lt;br /&gt; }&lt;br /&gt;return departamentos;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setDistritos(Map distritos){&lt;br /&gt;  this.distritos = distritos;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Map getDistritos(){&lt;br /&gt;return distritos;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void setDepartamentoId(String departamentoId){&lt;br /&gt;this.departamentoId = departamentoId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getDepartamentoId(){&lt;br /&gt;return departamentoId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setDistritoId(String distritoId){&lt;br /&gt;this.distritoId = distritoId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getDistritoId(){&lt;br /&gt;return distritoId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public DistritoManager getDistritoManager(){&lt;br /&gt;return distritoManager;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void setDistritoManager(DistritoManager distritoManager){&lt;br /&gt;this.distritoManager = distritoManager;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public DepartamentoManager getDepartamentoManager(){&lt;br /&gt;return departamentoManager;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void setDepartamentoManager(DepartamentoManager departamentoManager){&lt;br /&gt;this.departamentoManager = departamentoManager;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void departamentoChangeListener(ValueChangeEvent event) {&lt;br /&gt; departamentoId = (String) event.getNewValue(); &lt;br /&gt; List distritoList = distritoManager.getDistritos(departamentoId);&lt;br /&gt; for (Iterator iterator = distritoList.iterator(); iterator.hasNext();) {&lt;br /&gt;  Distrito distrito = (Distrito) iterator.next();&lt;br /&gt;  distritos.put(distrito.getNombre(), distrito.getCodigo());&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Asumir que:&lt;br /&gt;- departamentoManager.getDepartamentos() devuelve una lista de objetos "Departamento"&lt;br /&gt;- distritoManager.getDistritos(departamentoId) devuelve una lista de objetos "Distritos"&lt;br /&gt;&lt;br /&gt;En este caso se están creando Maps para asociarlo a los combos también se podría hacer con el objeto SelectItem[] de ADF-faces.&lt;br /&gt;Si se trabaja con Maps como en el ejemplo se debe colocar :&lt;br /&gt;&lt;br /&gt;key del map = label del combo&lt;br /&gt;value del map = value del combo (id del objeto)&lt;br /&gt;&lt;br /&gt;En este ejemplo se ve cierta redundancia para convertir de Lista de beans a Maps. La idea acá es implementar un método común para realizar esta conversión. Para este ejemplo lo tengo usando BeanWrapperImpl de Spring. Sin embargo, no lo he puesto para no complicar el ejemplo. Después postearé respecto a BeanWrapperImpl.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7702122637627393789?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7702122637627393789/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7702122637627393789&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7702122637627393789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7702122637627393789'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/cargar-combos-con-adf-faces.html' title='Cargar combos con ADF-Faces'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3384054910240035824</id><published>2009-01-21T01:30:00.000-08:00</published><updated>2009-07-01T09:42:04.252-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Envío de E-Mail con Spring</title><content type='html'>Aquí un ejemplo para enviar mails con Spring:&lt;br /&gt;&lt;br /&gt;Requiere spring.jar, mail.jar y activation.jar&lt;br /&gt;Primero agregar los atributos del mail en el contexto de spring:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"&amp;gt;&lt;br /&gt;&amp;lt;property name="host" value="mailhost.4cuatros.com"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage" /&amp;gt;&lt;br /&gt;&amp;lt;bean id="servicioMailUploadFile" class="com.java.4cuatros.servicios.impl.ServicioMailImpl"&amp;gt;&lt;br /&gt;&amp;lt;property name="mailSender" ref="mailSender"/&amp;gt;&lt;br /&gt;&amp;lt;property name="templateMessage" ref="templateMessage"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Colocamos el servidor de correo en "value" donde el name="host".&lt;br /&gt;&lt;br /&gt;Creamos nuestra interface ServicioMail :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public interface ServicioMail{&lt;br /&gt;public void sendMail(String userMail, String subject, String mensaje, String[]  mailUsuariosForCC, String mailUsuariosForTo);&lt;br /&gt;{&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y su implementación ServicioMailImpl.java :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class ServicioMailImpl implements ServicioMail {&lt;br /&gt;  protected final Log log = LogFactory.getLog(getClass());&lt;br /&gt;  private MailSender mailSender;&lt;br /&gt;  private SimpleMailMessage templateMessage;    &lt;br /&gt;&lt;br /&gt;  public MailSender getMailSender() {&lt;br /&gt;    return mailSender;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setMailSender(MailSender mailSender) {&lt;br /&gt;    this.mailSender = mailSender;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public SimpleMailMessage getTemplateMessage() {&lt;br /&gt;    return templateMessage;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setTemplateMessage(SimpleMailMessage templateMessage){&lt;br /&gt;    this.templateMessage = templateMessage;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void sendMail(String userMail, String subject, String mensaje, String[]mailUsuariosForCC, String&lt;br /&gt;mailUsuariosForTo){&lt;br /&gt;&lt;br /&gt;    SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage);&lt;br /&gt;    // mail del usuario que envía&lt;br /&gt;   msg.setFrom(userMail);&lt;br /&gt;   // mails de los destinatarios    &lt;br /&gt;   msg.setTo(mailUsuariosForTo);  &lt;br /&gt;   // mail de los destinatarios CC (con copia)&lt;br /&gt;   msg.setCc(mailUsuariosForCC);     &lt;br /&gt;   // mensaje                        &lt;br /&gt;   msg.setText(mensaje);&lt;br /&gt;   // asunto    &lt;br /&gt;   msg.setSubject(subject);                                &lt;br /&gt;&lt;br /&gt;  try{      &lt;br /&gt;   mailSender.send(msg);   &lt;br /&gt;  }catch(MailException ex) {       &lt;br /&gt;     log.debug("Error al enviar mail : " + ex.getMessage());               &lt;br /&gt;     return;   &lt;br /&gt;   }     &lt;br /&gt;   log.info(" envio de mail exitoso !!");    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y eso es todo.... ¿sencillo no?&lt;br /&gt;&lt;br /&gt;También se puede settear los atributos del SimpleMailMessage como propiedad del bean (otra manera):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;bean id="templateMessage" class="org.springframework.mail.SimpleMailMessage"&amp;gt;&lt;br /&gt;  &amp;lt;property name="from" value="christian.komiya@4cuatros.com"/&amp;gt;&lt;br /&gt;  &amp;lt;property name="subject" value="Hola mundo"/&amp;gt;&lt;br /&gt;   ....&lt;br /&gt;   ...&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3384054910240035824?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3384054910240035824/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3384054910240035824&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3384054910240035824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3384054910240035824'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/envo-de-e-mail-con-spring.html' title='Envío de E-Mail con Spring'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5258363782124648618</id><published>2009-01-19T06:41:00.001-08:00</published><updated>2009-01-19T06:56:56.317-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Primero el ROWNUM y luego el ORDER BY</title><content type='html'>Hace poco realizé una consulta en Oracle para obtener los 10 primeros comprobantes ordenados por mes. Mi consulta fue algo así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SELECT * FROM COMPROBANTE WHERE ROWNUM = 10&lt;br /&gt;ORDER BY MES&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, no me mostraba ordenado por mes.&lt;br /&gt;Resulta que en Oracle primero se realiza el ROWNUM y luego el ORDER BY&lt;br /&gt;Por lo que mi consulta tuvo que cambiar así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SELECT * FROM &lt;br /&gt;       (SELECT * FROM&lt;br /&gt; COMPROBANTE&lt;br /&gt; ORDER BY MES) &lt;br /&gt; WHERE ROWNUM = 10&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Primero ordenar todo y luego cortar hasta el décimo registro. &lt;br /&gt;Curioso....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5258363782124648618?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5258363782124648618/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5258363782124648618&amp;isPopup=true' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5258363782124648618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5258363782124648618'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/primero-el-rownum-y-luego-el-order-by.html' title='Primero el ROWNUM y luego el ORDER BY'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7988458611838429771</id><published>2009-01-15T14:07:00.000-08:00</published><updated>2009-04-03T22:26:07.445-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PickList'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><category scheme='http://www.blogger.com/atom/ns#' term='ADF'/><title type='text'>ADF-faces Pick List</title><content type='html'>Sé que a muchos nos toma tiempo para hacer asociaciones con PickList.&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5291647120192908258" style="margin: 0px auto 10px; display: block; width: 400px; height: 213px; text-align: center;" alt="" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/SW-1BPvRK-I/AAAAAAAAAN0/elvMp0U9sDs/s400/pickList.bmp" border="0" /&gt;&lt;/p&gt;&lt;p&gt;Con ADF-faces tu código en el jsp para generar el pickList sería :  &lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;af:selectManyShuttle&lt;br /&gt;      id="shuttle"&lt;br /&gt;      leadingHeader="Origin" &lt;br /&gt;      trailingHeader="Destination" &lt;br /&gt;value="#{mantenimientoAccesoPaisPage.listaPaisesSeleccionados}"&amp;gt;&lt;br /&gt;                &amp;lt;f:selectItems&lt;br /&gt;value="#{mantenimientoAccesoPaisPage.paises}"/&amp;gt;&lt;br /&gt;               &amp;lt;/af:selectManyShuttle&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Donde "paises" puede ser un map o lista de beans y "listaPaisesSeleccionados" es un String[], ambos deben estar como atributo de la clase asociada a la propiedad "mantenimientoAccesoPaisPage" en el archivo faces-managed-beans.xml&lt;br /&gt;En este caso la clase se llama igual que la propiedad.&lt;br /&gt;&lt;br /&gt;Archivo faces-managed-beans.xml&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;faces-config&amp;gt;&lt;br /&gt;&amp;lt;managed-bean&amp;gt;&lt;br /&gt;&amp;lt;managed-property&amp;gt;&lt;br /&gt;  &amp;lt;property-name&amp;gt;mantenimientoAccesoPaisPage&amp;lt;/property-name&amp;gt;&lt;br /&gt;  &amp;lt;property-class&amp;gt;&lt;br /&gt;   com.bms.dddapp.presentacion.mantenimiento.MantenimientoAccesoPaisPage&lt;br /&gt;  &amp;lt;/property-class&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;#{mantenimientoAccesoPaisPage}&amp;lt;/value&amp;gt;&lt;br /&gt; &amp;lt;/managed-property&amp;gt;&lt;br /&gt;&amp;lt;/managed-bean&amp;gt;&lt;br /&gt;&amp;lt;/faces-config&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7988458611838429771?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7988458611838429771/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7988458611838429771&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7988458611838429771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7988458611838429771'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/adf-faces-pick-list.html' title='ADF-faces Pick List'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/SW-1BPvRK-I/AAAAAAAAAN0/elvMp0U9sDs/s72-c/pickList.bmp' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-8142167112331726746</id><published>2009-01-12T11:29:00.000-08:00</published><updated>2009-04-03T22:26:33.009-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Librerías JS'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='DropDown'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Integración DWR 1.0 con Spring</title><content type='html'>Este ejemplo consta en llenar combos anidados utilizando DWR 1.0 con Spring.&lt;br /&gt;Cargaremos los distritos por el evento onchange del combo de departamento.&lt;br /&gt;&lt;br /&gt;En el archivo web.xml agregar:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;       &amp;lt;servlet-name&amp;gt;dwr-invoker&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;     &amp;lt;servlet-class&amp;gt;uk.ltd.getahead.dwr.DWRServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;          &amp;lt;init-param&amp;gt;&lt;br /&gt;           &amp;lt;param-name&amp;gt;debug&amp;lt;/param-name&amp;gt;&lt;br /&gt;           &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;       &amp;lt;/init-param&amp;gt;&lt;br /&gt;   &amp;lt;/servlet&amp;gt;  &lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;       &amp;lt;servlet-name&amp;gt;dwr-invoker&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;       &amp;lt;url-pattern&amp;gt;/dwr/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;   &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En el archivo dwr.xml configurar:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;!DOCTYPE dwr PUBLIC&lt;br /&gt;"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"&lt;br /&gt;"http://www.getahead.ltd.uk/dwr/dwr10.dtd"&amp;gt;&lt;br /&gt;&amp;lt;dwr&amp;gt;&lt;br /&gt;&amp;lt;allow&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;create creator="spring" javascript="DepartamentoManager"&amp;gt;&lt;br /&gt;&amp;lt;param name="beanName" value="departamentoManager" /&amp;gt;&lt;br /&gt;&amp;lt;/create&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;convert converter="bean" match="com.java.4cuatros.Distrito" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/allow&amp;gt;&lt;br /&gt;&amp;lt;/dwr&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para esto debemos tener la clase DepartamentoManager y su método getDistritos(String coDepartamento) y estar matriculado en el contexto de Spring.&lt;br /&gt;&lt;br /&gt;En el convert="bean", mencionar el objeto que se llenará, en nuestro caso, objetos del tipo "Distrito"&lt;br /&gt;&lt;br /&gt;Luego en tu jsp tus 2 combos : departamento y distrito&lt;br /&gt;&lt;br /&gt;Este es un ejemplo de 2 combos con spring MVC:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;   &amp;lt;li&amp;gt;&lt;br /&gt;   &amp;lt;div&amp;gt;&amp;lt;app:label key="label.departamento" styleClass="desc" /&amp;gt; &amp;lt;form:select&lt;br /&gt;    path="coDepartamento" id="departamento"  onchange="cargarDistritos()"&amp;gt;&lt;br /&gt;    &amp;lt;form:options items="${departamentos}" itemValue="coDepartamento" itemLabel="deDepartamento"/&amp;gt;&lt;br /&gt;   &amp;lt;/form:select&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;   &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;   &amp;lt;li&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&amp;lt;app:label key="label.distrito"  styleClass="desc" /&amp;gt;&lt;br /&gt;    &amp;lt;form:select path="coDistrito"  id="distrito" cssClass="text medium" &amp;gt;&lt;br /&gt;    &amp;lt;form:options items="${distritos}" itemValue="coDistrito" itemLabel="deDistrito"/&amp;gt;&lt;br /&gt;    &amp;lt;/form:select&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;   &amp;lt;/li&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;app -&gt; Nombre de la aplicación&lt;br /&gt;Al final de tu jsp la función javascript&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;script type='text/javascript' src='/app/dwr/engine.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type='text/javascript' src='/app/dwr/util.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type='text/javascript' src='/app/dwr/interface/DepartamentoManager.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;function cargarDistritos() {&lt;br /&gt; var coDepartamento = DWRUtil.getValue('coDepartamento');&lt;br /&gt;   DepartamentoManager.getDistritos(coDepartamento, function(data) {&lt;br /&gt;   DWRUtil.removeAllOptions("distrito");&lt;br /&gt;    DWRUtil.addOptions("distrito", data,"coDistrito","deDistrito");&lt;br /&gt; });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Recomiendo poner las etiquetas :&lt;br /&gt;&amp;lt;script type='text/javascript' src='/app/dwr/engine.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type='text/javascript' src='/app/dwr/util.js'&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;en una página padre o defaultPage&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-8142167112331726746?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/8142167112331726746/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=8142167112331726746&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8142167112331726746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8142167112331726746'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/integracin-dwr-10-con-spring.html' title='Integración DWR 1.0 con Spring'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-8096779740134773092</id><published>2009-01-10T00:02:00.000-08:00</published><updated>2009-01-10T09:17:55.820-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>La ventana rota</title><content type='html'>&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;En el centro de las ciudades algunos edificios están impecables, mientras que otros son armatostes en descomposición. ¿Por qué? Investigadores en el campo del crimen y el desorden urbanístico descubrieron un mecanismo de activación, uno que muy rápidamente convierte a un edificio limpio, intacto, habitado en uno roto y abandonado.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Una ventana rota.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Una ventana rota, olvidada sin reparar por un tiempo substancial, inculca en los &lt;a href="http://www.codinghorror.com/blog/images/broken_windows.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 208px; CURSOR: hand; HEIGHT: 170px" alt="" src="http://www.codinghorror.com/blog/images/broken_windows.jpg" border="0" /&gt;&lt;/a&gt;habitantes del edificio una sensación de abandono, de que no se cuida el edificio. Así que otra ventana se rompe. La gente empieza a descuidar el lugar y a dejar deshechos. Aparecen pintadas. Comienza ha notarse cierto daño estructural. En un espacio relativamente corto del tiempo el edificio empeora más allá de lo que los dueño están dispuestos a asumir y la sensación de abandono se convierte en una realidad.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;La “Teoría de la ventana rota” ha inspirado departamentos de policía en Nueva York y otras grandes ciudades a atacar las pequeñas cosas para mantener las mayores a raya. Funciona: estando encima de ventanas rotas, pintadas y otras pequeñas infracciones ha reducido el nivel de crimen.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;No vivas con ventanas rotas.&lt;/strong&gt;&lt;br /&gt;No vivas con ventanas rotas (mal diseño, malas decisiones o código pobre) sin reparar. Arregla cada una de ellas tan pronto como la descubras. Si no hay tiempo para repararla como es debido márcatelo con un comentario. Haz algo que evite que el daño se extienda y para demostrar que estas en ellos.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Hemos visto sistemas limpios y funcionales deteriorarse rápidamente una vez las ventanas empiezan a romperse.&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-8096779740134773092?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/8096779740134773092/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=8096779740134773092&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8096779740134773092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/8096779740134773092'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/la-ventana-rota.html' title='La ventana rota'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-2121350034176195224</id><published>2009-01-08T01:24:00.000-08:00</published><updated>2009-01-08T01:50:39.603-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='de foros'/><title type='text'>Hibernate : Lazy vs Left Join Fetch</title><content type='html'>Respondiendo en foros, me encontré una pregunta respecto a Hibernate.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Pregunta :&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Tengo dos clases:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;public class A {&lt;br /&gt;private int id;&lt;br /&gt;private String nombre;&lt;br /&gt;private String apellidoP;&lt;br /&gt;private String apellidoM;&lt;br /&gt;private B b;&lt;br /&gt;&lt;br /&gt;//getters y setters........&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class B {&lt;br /&gt;private int id;&lt;br /&gt;private String nombre;&lt;br /&gt;private String apellidoP;&lt;br /&gt;private String apellidoM;&lt;br /&gt;&lt;br /&gt;//getters and setters.......&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;dos tablas&lt;br /&gt;Tabla:&lt;br /&gt;A&lt;br /&gt;Campos:&lt;br /&gt;id, nombre, apellidoP, apellidoM, id_b&lt;br /&gt;&lt;br /&gt;Tabla:&lt;br /&gt;B&lt;br /&gt;Campos:&lt;br /&gt;id, nombre apellidoP, apellidoM&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;cuando hago la consulta de todos los registros de la clase A, me trae una lista de objetos A, pero en la clase A tengo un objeto B, pero este objeto no trae nada, esta en null, y necesito que venga tambien lleno&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Respuesta :&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;1) usando left join fetch :&lt;br /&gt;&lt;br /&gt;tu hql sería:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;String hql = "select claseA from A claseA left join fetch claseA.b claseB"; &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;o&lt;br /&gt;&lt;br /&gt;2) usando lazy="false"&lt;br /&gt;&lt;br /&gt;en el archivo hbm de A donde está el many-to-one, agregar el lazy="false" :&lt;br /&gt;(bueno no se cual será el package por mientras [com.4cuatros.java])&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;many-to-one class="com.4cuatros.java.B" lazy="false" fetch="join" name="b"&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;y tu hql será :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;String hql = " from A ";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;si lo haces de esta forma, Hibernate hará un segundo query por debajo para traer "B" y lo hará cada vez que hagas select a "A".&lt;br /&gt;&lt;br /&gt;¿Cual es mejor? depende de tus necesidades, tal vez no siempre quieres que esté ligado a "B". Notarás que la primera forma es más veloz.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;el link del foro es &lt;a href="http://www.lawebdelprogramador.com/news/mostrar_new.php?id=44&amp;amp;texto=Java&amp;amp;n1=520562&amp;amp;n2=0&amp;amp;n3=0&amp;amp;n4=0&amp;amp;n5=0&amp;amp;n6=0&amp;amp;n7=0&amp;amp;n8=0&amp;amp;n9=0&amp;amp;n0=0"&gt;Consulta HQL&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-2121350034176195224?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/2121350034176195224/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=2121350034176195224&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2121350034176195224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/2121350034176195224'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/hibernate-lazy-vs-fetch.html' title='Hibernate : Lazy vs Left Join Fetch'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-1034735797679609122</id><published>2009-01-06T06:44:00.000-08:00</published><updated>2009-04-03T22:26:50.805-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='DropDown'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Web'/><title type='text'>Cargar combos con Spring MVC (Form controller)</title><content type='html'>Se pueden llenar combos con Maps o con lista de beans. En este ejemplo lo estoy cargando con una lista de beans.&lt;br /&gt;&lt;br /&gt;Asumimos que departamentos es una lista de objetos del tipo Departamento, el cual tiene atributos de código "coDepartamento" y descripción "deDepartamento" (label)&lt;br /&gt;&lt;br /&gt;Desde el controller enviamos la lista de departamentos en el request.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;List departamentos = departamentoDao.getDepartamentos();&lt;br /&gt;request.setAttribute("departamentos",departamentos);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Para esto debemos definir el código del departamento como atributo del command.&lt;br /&gt;&lt;br /&gt;Hay dos maneras de cargar los combos&lt;br /&gt;&lt;br /&gt;1) con form:option&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;form:select path="coDepartamento" id="coDepartemento"&lt;br /&gt;                &amp;lt;c:forEach items="${departamentos}" var="departamento"&amp;gt;&lt;br /&gt;                        &amp;lt;form:option value="${departamento.coDepartamento}" &amp;gt;&lt;br /&gt;                         &amp;lt;c:out value="${departamento.coDepartamento}"/&amp;gt;&lt;br /&gt;&amp;lt;/form:select&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2) con form:options (prefiero usar este, es más entendible)&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;form:select path="coDepartamento" id="coDepartemento"&lt;br /&gt;        &amp;lt;form:options items="${departamentos}"  &lt;br /&gt;             itemValue="coDepartamento"&lt;br /&gt;             itemLabel="deDepartamento"/&amp;gt;&lt;br /&gt;&amp;lt;/form:select&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- El path es el atributo del command&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-1034735797679609122?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/1034735797679609122/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=1034735797679609122&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1034735797679609122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/1034735797679609122'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/cargar-combos-con-spring-mvc-form.html' title='Cargar combos con Spring MVC (Form controller)'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-3025353358051005762</id><published>2009-01-04T20:15:00.000-08:00</published><updated>2009-01-04T20:24:07.433-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analogías'/><category scheme='http://www.blogger.com/atom/ns#' term='Pragmatic Programmer'/><title type='text'>El jardinero del colegio Eton</title><content type='html'>Un turista visitaba el Colegio Eton en Inglaterra y le preguntó al jardinero cómo hacía para mantener el césped tan perfecto. &lt;a href="http://3.bp.blogspot.com/_oo_xdGd7F-k/SWGK_oxJzJI/AAAAAAAAANk/ogKPPGRoiKA/s1600-h/Viejo_jardinero_003.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5287660263389645970" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; WIDTH: 200px; CURSOR: hand; HEIGHT: 150px" alt="" src="http://3.bp.blogspot.com/_oo_xdGd7F-k/SWGK_oxJzJI/AAAAAAAAANk/ogKPPGRoiKA/s200/Viejo_jardinero_003.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;«Es fácil», le respondió, «Sólo tiene que cepillar el rocío cada mañana, recortarlo cada dos días y pasarle el rodillo una vez a la semana.» &lt;/p&gt;&lt;p&gt;¿Eso es todo?, preguntó el turista.&lt;/p&gt;&lt;p&gt;«Seguro», replicó el jardinero. «Haga eso durante 500 años y también tendrá un hermoso césped.» &lt;/p&gt;&lt;p&gt;El césped excelente necesita de pequeños cuidados diarios, y así pasa con los excelentes programadores.&lt;/p&gt;&lt;p&gt;A los consultores de gestión les gusta usar el término kaizen en sus conversaciones. «Kaizen» es un término japonés que captura el concepto de realizar continuamente pequeñas mejoras. Se le consideró una de las razones más importantes para las dramáticas ganancias en productividad y calidad de las fabricaciones japonesas y fue copiado ampliamente a lo largo del mundo. Kaizen se aplica a los individuos también. &lt;/p&gt;&lt;p&gt;Cada día debes trabajar para refinar las habilidades que ya tienes y para agregar nuevas herramientas a tu repertorio. A diferencia del césped de Eton, vas a ver resultados en término de días. A lo largo de los años te vas a maravillar por cómo florece tu experiencia, y crecen tus habilidades. &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;Fuente : "The Pragmatic Programmer: From Journeyman to Master" de Andrew Hunt y David Thomas; Addison-Wesley&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-3025353358051005762?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/3025353358051005762/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=3025353358051005762&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3025353358051005762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/3025353358051005762'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/el-jardinero-del-colegio-eton.html' title='El jardinero del colegio Eton'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oo_xdGd7F-k/SWGK_oxJzJI/AAAAAAAAANk/ogKPPGRoiKA/s72-c/Viejo_jardinero_003.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-7826087424521376512</id><published>2009-01-02T09:20:00.001-08:00</published><updated>2009-01-03T10:07:23.918-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><title type='text'>Simplifica, Refactoriza!</title><content type='html'>&lt;a href="http://es.wikipedia.org/wiki/Refactorizaci%C3%B3n"&gt;Refactoring&lt;/a&gt; .- Mejorar la facilidad de comprensión del código para facilitar el mantenimiento en el futuro.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5286747713904513842" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 295px; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_oo_xdGd7F-k/SV5NCRBjEzI/AAAAAAAAANU/767fe4ru0X8/s400/refactoring.jpg" border="0" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-7826087424521376512?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/7826087424521376512/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=7826087424521376512&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7826087424521376512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/7826087424521376512'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/refactoring.html' title='Simplifica, Refactoriza!'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oo_xdGd7F-k/SV5NCRBjEzI/AAAAAAAAANU/767fe4ru0X8/s72-c/refactoring.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107350313602582202.post-5910734094028178269</id><published>2009-01-01T14:45:00.000-08:00</published><updated>2009-01-01T15:23:51.580-08:00</updated><title type='text'>Intro</title><content type='html'>Al ver blogs con contenido de informática me animé a crear también uno, otra fuente de inspiración fue la instrucción otorgada por mis ex-jefes o maestros. Espero que mis posts sean interesantes y útiles para los programadores y por mi parte aprender de sus comentarios.&lt;br /&gt;&lt;br /&gt;Evitaré de pegar código que se pueda encontrar fácilmente en Internet, porque si no que sentido tiene postear algo que ya fue muy revisado.&lt;br /&gt;&lt;br /&gt;Según uno de mis senseis me djio la primera vez que empecé a trabajar en esto :&lt;br /&gt;&lt;br /&gt;" El código dice mucho del programador , el como es , como piensa, como trabaja. Cuando programes trata de hacerlo lo más elegante posible para que cuando entre una persona a revisarlo diga: ¡Ah, este pata tira! Seamos como artistas y que nuestra obra de arte sea el código"&lt;br /&gt;&lt;br /&gt;Ex-jefes:&lt;br /&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 242px; CURSOR: hand; HEIGHT: 247px; TEXT-ALIGN: center" alt="" src="http://www.geocities.com/djrekz/imposs.gif" border="0" /&gt; ¿Por qué 4 cuatros? &lt;p&gt;Bueno, realmente no sabía que nombre poner, tomé como analogía ALGORITMO con el acto de armar una ecuación para obtener un resultado. Y el problema de los &lt;a href="http://es.wikipedia.org/wiki/Cuatro_cuatros"&gt;cuatro cuatros &lt;/a&gt;se asemeja a está acción. El problema de los 4 cuatros puedes verlo &lt;a href="http://www.librosmaravillosos.com/hombrecalculaba/capitulo07.html"&gt;aquí&lt;/a&gt;,&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107350313602582202-5910734094028178269?l=4cuatros.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://4cuatros.blogspot.com/feeds/5910734094028178269/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4107350313602582202&amp;postID=5910734094028178269&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5910734094028178269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107350313602582202/posts/default/5910734094028178269'/><link rel='alternate' type='text/html' href='http://4cuatros.blogspot.com/2009/01/intro.html' title='Intro'/><author><name>Christian</name><uri>http://www.blogger.com/profile/04763851983279693950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://2.bp.blogspot.com/_oo_xdGd7F-k/SMz8All1knI/AAAAAAAAACs/LT03BtN1DWM/S220/Harima_Kenji_by_saishuu_hinoiri.jpg'/></author><thr:total>0</thr:total></entry></feed>
