<?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-12620014</id><updated>2012-01-20T03:43:48.464-06:00</updated><category term='refranes'/><category term='hibernate'/><category term='Blogs interesantes'/><category term='Haiku'/><category term='Diseño y CSS'/><category term='xsl'/><category term='MVC'/><category term='trabalenguas'/><category term='personal'/><category term='java'/><category term='Tesis'/><category term='Harry Potter - J.K.Rowling'/><category term='Open Lazslo'/><category term='AJAX'/><category term='XML'/><category term='tomcat'/><category term='CISCI'/><category term='Estimación'/><category term='Ingeniería de Software'/><category term='PHP'/><category term='MS Sql Server'/><category term='SCRUM'/><category term='Programación Juegos'/><category term='blogger'/><category term='Poemas'/><category term='Grails'/><category term='Flex'/><category term='informática'/><category term='project management'/><category term='Plantillas Código'/><category term='Programación ágil'/><category term='Patrones de diseño'/><title type='text'>JORGE BAROUDI'S BLOG</title><subtitle type='html'>Blog principalmente de programación en Java, C#, C# + XNA para juegos y PHP
utilizando Programación Orientada a Objetos</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12620014.post-9121699679295221426</id><published>2011-10-28T10:31:00.002-05:00</published><updated>2011-10-28T10:33:55.171-05:00</updated><title type='text'>Aprender a Aprender</title><content type='html'>Si se sienten estancados y desean aprender algo nuevo, sin importar que, les recomiendo esta página que me ha dado un Head Start en Japonés:&lt;br /&gt;&lt;br /&gt;http://www.learnexperiment.com&lt;br /&gt;&lt;br /&gt;El punto es que este método funciona bien cuando tienes que aprender algo rápido y darle a tu cerebro leña que quemar, para todos aquellos que siempre andan buscando una forma de entretenimiento en el arte de aprender.&lt;br /&gt;&lt;br /&gt;saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-9121699679295221426?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/9121699679295221426/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=9121699679295221426' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/9121699679295221426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/9121699679295221426'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2011/10/aprender-aprender.html' title='Aprender a Aprender'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-6232775414845801792</id><published>2009-11-03T15:13:00.004-06:00</published><updated>2009-11-03T17:20:58.813-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogs interesantes'/><title type='text'>Blog recomendadísimo</title><content type='html'>Nuevo blog de programación, recomendado para los amantes de los chispazos en desarrollo tanto en C#, Java y derivados ( PHP, ASP.NET, GRAILS, RUBY, etc ).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://desarrollo.dsisweb.com/"&gt;http://desarrollo.dsisweb.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Chequenlo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-6232775414845801792?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://desarrollo.dsisweb.com' title='Blog recomendadísimo'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/6232775414845801792/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=6232775414845801792' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/6232775414845801792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/6232775414845801792'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2009/11/blog-recomendadisimo.html' title='Blog recomendadísimo'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-6549414190579284229</id><published>2009-11-03T10:25:00.003-06:00</published><updated>2009-11-03T17:20:27.539-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Estimación'/><category scheme='http://www.blogger.com/atom/ns#' term='Plantillas Código'/><category scheme='http://www.blogger.com/atom/ns#' term='CISCI'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='SCRUM'/><category scheme='http://www.blogger.com/atom/ns#' term='Tesis'/><title type='text'>CISCI 2009</title><content type='html'>Gracias Mario, (director de tesis) y Profesores del ITM por hacer posible que llegaran mis tarbajos al Congreso CISCI 2009.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.iiis.org/CDs2008/CD2009CSC/CISCI2009/index.asp?id=0&amp;amp;area=1"&gt;http://www.iiis.org/CDs2008/CD2009CSC/CISCI2009/index.asp?id=0&amp;amp;area=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Espero que sigamos colaborando para mas trabajos.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-6549414190579284229?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.iiis.org/CDs2008/CD2009CSC/CISCI2009/index.asp' title='CISCI 2009'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/6549414190579284229/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=6549414190579284229' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/6549414190579284229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/6549414190579284229'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2009/11/cisci-2009.html' title='CISCI 2009'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-8489140543977796639</id><published>2009-09-28T17:36:00.002-05:00</published><updated>2009-09-30T17:00:47.471-05:00</updated><title type='text'>HAIKU 0004</title><content type='html'>Sabiduría,&lt;br /&gt;&lt;br /&gt;el perfecto balance:&lt;br /&gt;&lt;br /&gt;crear opuestos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-8489140543977796639?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/8489140543977796639/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=8489140543977796639' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/8489140543977796639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/8489140543977796639'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2009/09/haiku-0004.html' title='HAIKU 0004'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-5149908366313834416</id><published>2009-09-27T08:18:00.002-05:00</published><updated>2009-09-27T08:34:31.663-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Haiku'/><title type='text'>Haiku 0003</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9MqxtAqqjqE/Sr9mgM8cA0I/AAAAAAAAABU/IXrvvkqJYVM/s1600-h/antesdellover.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 135px; height: 100px;" src="http://2.bp.blogspot.com/_9MqxtAqqjqE/Sr9mgM8cA0I/AAAAAAAAABU/IXrvvkqJYVM/s200/antesdellover.PNG" alt="" id="BLOGGER_PHOTO_ID_5386136382774969154" 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/12620014-5149908366313834416?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/5149908366313834416/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=5149908366313834416' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/5149908366313834416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/5149908366313834416'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2009/09/haiku-0003.html' title='Haiku 0003'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9MqxtAqqjqE/Sr9mgM8cA0I/AAAAAAAAABU/IXrvvkqJYVM/s72-c/antesdellover.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-6672306698236317929</id><published>2008-06-19T05:55:00.003-05:00</published><updated>2008-06-19T06:02:47.458-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación Juegos'/><title type='text'>Programación de Juegos MMORPG ( http://www.ramzaengine.com.ar/ )</title><content type='html'>Agradeciendo los comentarios de sir ramza, les dejo este magnifico sitio de entusiastas de la programación de juegos.&lt;br /&gt;&lt;br /&gt;Sitio Web&lt;br /&gt;&lt;a href="http://www.ramzaengine.com.ar/"&gt;http://www.ramzaengine.com.ar/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mini guía de creación de juegos MMORPG&lt;br /&gt;&lt;a href="http://www.ramzaengine.com.ar/readarticle.php?article_id=9"&gt;http://www.ramzaengine.com.ar/readarticle.php?article_id=9&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-6672306698236317929?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ramzaengine.com.ar/' title='Programación de Juegos MMORPG ( http://www.ramzaengine.com.ar/ )'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/6672306698236317929/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=6672306698236317929' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/6672306698236317929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/6672306698236317929'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2008/06/programacin-de-juegos-mmorpg.html' title='Programación de Juegos MMORPG ( http://www.ramzaengine.com.ar/ )'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-90923706748902265</id><published>2008-06-03T15:27:00.000-05:00</published><updated>2008-06-03T15:28:09.871-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Haiku'/><category scheme='http://www.blogger.com/atom/ns#' term='Poemas'/><title type='text'>Haiku 0002</title><content type='html'>"En toda brisa&lt;br /&gt;se distinguen las ideas,&lt;br /&gt;y su futuro"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-90923706748902265?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/90923706748902265/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=90923706748902265' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/90923706748902265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/90923706748902265'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2008/06/haiku-0002.html' title='Haiku 0002'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-1583848737160170416</id><published>2008-06-02T10:18:00.002-05:00</published><updated>2008-06-03T15:27:19.853-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Haiku'/><category scheme='http://www.blogger.com/atom/ns#' term='Poemas'/><title type='text'>Haiku 0001</title><content type='html'>"En un suspiro&lt;br /&gt;vislumbro el día por venir,&lt;br /&gt;y su sonrisa"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-1583848737160170416?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/1583848737160170416/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=1583848737160170416' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/1583848737160170416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/1583848737160170416'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2008/06/haiku-0001.html' title='Haiku 0001'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-4410886843900443228</id><published>2008-05-21T10:53:00.005-05:00</published><updated>2008-05-21T11:04:48.135-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patrones de diseño'/><category scheme='http://www.blogger.com/atom/ns#' term='Ingeniería de Software'/><title type='text'>Patrón de diseño estrategia</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_9MqxtAqqjqE/SDRH4FHvHqI/AAAAAAAAAAo/XCS9_TmkPic/s1600-h/Dibujo1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_9MqxtAqqjqE/SDRH4FHvHqI/AAAAAAAAAAo/XCS9_TmkPic/s320/Dibujo1.gif" alt="" id="BLOGGER_PHOTO_ID_5202862498292637346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;"El patrón Strategy permite mantener un conjunto de algoritmos de los que el objeto cliente puede elegir aquel que le conviene e intercambiarlo según sus necesidades.&lt;br /&gt;&lt;br /&gt;Los distintos algoritmos se encapsulan y el cliente trabaja contra un objeto contexto o Context. Como hemos dicho, el cliente puede elegir el algoritmo que prefiera de entre los disponibles o puede ser el mismo objeto Context el que elija el más apropiado para cada situación.&lt;br /&gt;&lt;br /&gt;Cualquier programa que ofrezca un servicio o función determinada, que pueda ser realizada de varias maneras, es candidato a utilizar el patrón Strategy. Puede haber cualquier número de estrategias y cualquiera de ellas podrá ser intercambiada por otra en cualquier momento, incluso en tiempo de ejecución."&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;En definitiva esta explicación está medio rebuscada así que les paso un diagrama de clases que hice para mi tesis inspirado en el libro Head FirstDesign Patterns.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-4410886843900443228?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://es.wikipedia.org/wiki/Strategy_%28patr%C3%B3n_de_dise%C3%B1o%29' title='Patrón de diseño estrategia'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/4410886843900443228/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=4410886843900443228' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/4410886843900443228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/4410886843900443228'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2008/05/patrn-de-diseo-estrategia.html' title='Patrón de diseño estrategia'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_9MqxtAqqjqE/SDRH4FHvHqI/AAAAAAAAAAo/XCS9_TmkPic/s72-c/Dibujo1.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-1249882528116816387</id><published>2008-05-18T21:57:00.001-05:00</published><updated>2008-05-18T22:00:31.161-05:00</updated><title type='text'>Paginación con SQL Server 2005 (v2.0)</title><content type='html'>Sin mucho preámbulo les dejo un stored procedure generado por las plantillas NetTiers que permite paginar una tabla de las siguientes características:&lt;br /&gt;&lt;br /&gt;|  Tabla        |&lt;br /&gt;-------------&lt;br /&gt;| Id&lt;br /&gt;| Clave&lt;br /&gt;| Descripcion&lt;br /&gt;| Activo&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Create PROCEDURE [dbo].[Catalogo_Simple_Paginar]&lt;br /&gt;(&lt;br /&gt;    @WhereClause varchar (2000)  ,&lt;br /&gt;    @OrderBy varchar (2000)  ,&lt;br /&gt;    @PageIndex int   ,&lt;br /&gt;    @PageSize int  &lt;br /&gt;)&lt;br /&gt;AS&lt;br /&gt;    BEGIN&lt;br /&gt;    DECLARE @PageLowerBound int&lt;br /&gt;    DECLARE @PageUpperBound int&lt;br /&gt;&lt;br /&gt;    -- Set the page bounds&lt;br /&gt;    SET @PageLowerBound = @PageSize * @PageIndex&lt;br /&gt;    SET @PageUpperBound = @PageLowerBound + @PageSize&lt;br /&gt;&lt;br /&gt;    IF (@OrderBy is null or LEN(@OrderBy) &lt; 1)&lt;br /&gt;    BEGIN&lt;br /&gt;        -- default order by to first column&lt;br /&gt;        SET @OrderBy = '[Id]'&lt;br /&gt;    END&lt;br /&gt;&lt;br /&gt;    -- SQL Server 2005 Paging&lt;br /&gt;    declare @SQL as nvarchar(4000)&lt;br /&gt;    SET @SQL = 'WITH PageIndex AS ('&lt;br /&gt;    SET @SQL = @SQL + ' SELECT'&lt;br /&gt;    IF @PageSize &gt; 0&lt;br /&gt;    BEGIN&lt;br /&gt;        SET @SQL = @SQL + ' TOP ' + convert(nvarchar, @PageUpperBound)&lt;br /&gt;    END&lt;br /&gt;    SET @SQL = @SQL + ' ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ') as RowIndex'&lt;br /&gt;    SET @SQL = @SQL + ', [Id]'&lt;br /&gt;    SET @SQL = @SQL + ', [Clave]'&lt;br /&gt;    SET @SQL = @SQL + ', [Descripcion]'&lt;br /&gt;    SET @SQL = @SQL + ', [Activo]'&lt;br /&gt;    SET @SQL = @SQL + ' FROM dbo.[Catalogo_Simple]'&lt;br /&gt;    IF LEN(@WhereClause) &gt; 0&lt;br /&gt;    BEGIN&lt;br /&gt;        SET @SQL = @SQL + ' WHERE ' + @WhereClause&lt;br /&gt;    END&lt;br /&gt;    SET @SQL = @SQL + ' ) SELECT'&lt;br /&gt;    SET @SQL = @SQL + ' [Id],'&lt;br /&gt;    SET @SQL = @SQL + ' [Clave],'&lt;br /&gt;    SET @SQL = @SQL + ' [Descripcion],'&lt;br /&gt;    SET @SQL = @SQL + ' [Activo]'&lt;br /&gt;    SET @SQL = @SQL + ' FROM PageIndex'&lt;br /&gt;    SET @SQL = @SQL + ' WHERE RowIndex &gt; ' + convert(nvarchar, @PageLowerBound)&lt;br /&gt;    IF @PageSize &gt; 0&lt;br /&gt;    BEGIN&lt;br /&gt;        SET @SQL = @SQL + ' AND RowIndex &lt;= ' + convert(nvarchar, @PageUpperBound)&lt;br /&gt;    END&lt;br /&gt;    SET @SQL = @SQL + ' ORDER BY ' + @OrderBy&lt;br /&gt;    exec sp_executesql @SQL&lt;br /&gt;&lt;br /&gt;    -- get row count&lt;br /&gt;    SET @SQL = 'SELECT COUNT(*) as TotalRowCount'&lt;br /&gt;    SET @SQL = @SQL + ' FROM dbo.[Catalogo_Simple]'&lt;br /&gt;    IF LEN(@WhereClause) &gt; 0&lt;br /&gt;    BEGIN&lt;br /&gt;        SET @SQL = @SQL + ' WHERE ' + @WhereClause&lt;br /&gt;    END&lt;br /&gt;    exec sp_executesql @SQL&lt;br /&gt;&lt;br /&gt;END&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-1249882528116816387?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/1249882528116816387/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=1249882528116816387' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/1249882528116816387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/1249882528116816387'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2008/05/paginacin-con-sql-server-2005-v20.html' title='Paginación con SQL Server 2005 (v2.0)'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-3752000768110931171</id><published>2007-06-30T10:24:00.000-05:00</published><updated>2007-06-30T12:15:26.757-05:00</updated><title type='text'>XNA y C# Programación para Juegos de windows y xbox 360</title><content type='html'>&lt;div style="text-align: justify;"&gt; ¿Quién dijo que programar juegos es difícil?&lt;br /&gt;&lt;br /&gt;Ciertamente lo es, hay que aprender a cargar imagenes, interactuar con el teclado y el mouse, cargar sonidos y música (este último todavía no lo he aprendido), definir y programar la secuencia lógica de un juego y si se tiene tiempo, hacer el juego en 3d (pero muuucho tiempo).&lt;br /&gt;&lt;br /&gt;No lo niego, soy un fan de los videojuegos y siempre había querido desarrollar uno desde cero, alguna vez utilicé Java en un juego de memoria, pero a raíz de que se ha liberado por microsoft una herramienta como XNA donde existe la posibilidad para instalar los juegos en la consola de XBOX 360 (hay que pagar pero pues no todo puede ser gratis con microsoft, right?), estoy aprendiendo mucho de la manera más sencilla.&lt;br /&gt;&lt;br /&gt;Ahora bien, no sabía nada de XNA, solo de C# y programación orientada a objetos, pero hacer juegos realmente requiere de 3 cosas. La idea, Ganas de Superar Retos y ser Autodidacta.&lt;br /&gt;&lt;br /&gt;La Idea vino cuando me decidí a hacer un juego y le pregunté a mi hijo que si lo programábamos juntos y me dijo: ¡Vamos a hacer un juego de números y letras!... !y que se quemen!... Ok, la parte de números y letras para que el aprenda a utilizar el teclado me encantó... pero "que se quemen" me imaginé que iba a requerir a un verdadero programador de juegos, sin embargo, dado que a sus 3 años y medio ya maneja el mouse, porque no darle incentivos para que aprenda a utilizar el teclado, y luego que aprenda C# y que trabaje como programador, y que yo me pueda jubilar pronto... perdón, perdón, ya me fui por la tangente...&lt;br /&gt;&lt;br /&gt;Las Ganas de Superar Retos es para empezar con un juego fácil en 2d, de ahí podemos tener la base y pasar a juegos 3d, ya pronto llega mi tarjeta 3d y podré hacer los tutoriales, no intenten hacerl los tutoriales 3d sin una tarjeta 3d porque... bueno mejor no los limito, solo recuerden donde se localiza su botón para reiniciar la PC.&lt;br /&gt;&lt;br /&gt;Por último ser Autodidacta implica pasar un buen rato googleando en Internet o comprar los libros que ya existen para programación de juegos en XNA pero lo más importante es que no se desanimen, ya sea que sean buenos programadores o no, creo que los juegos que vayan a crear aunque estén limitados les permiten experimentar cosas como: Patrones de Diseño, Uso de Interfaces, Diseño Gráfico, Creación de Música y Efectos de Sonido y lo mejor de todo, Diseño 3d con herramientas gratuitas como Bryce 5.5 (el Bryce 6 cuesta unos 20 dolares)&lt;br /&gt;&lt;br /&gt;Bien, después de todo este preámbulo un poquito más para ubicarlos en el juego, ya sea que sean programadores o no, espero que con&lt;br /&gt;este tutorial y el código fuente de la versión 1.0.0.7 de Juego Letras Números que les proporcionaré al final logren por lo menos cambiarle los sonidos y las imagenes que gusten para tropicalizar el juego para sus retoños (hijos).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;El tutorial se divide en los siguientes puntos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Instalación de XNA, Visual Studio Express Edition y DirectX SDK&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Creación del Proyecto y blanco de instalación del juego&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Clase Juego (Game)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Componentes de Juego (Clase GameComponent)&lt;/li&gt;&lt;li&gt;Lógica del Juego de Letras y Números&lt;/li&gt;&lt;li&gt;Update y Draw para lógica de juego y Despliegue de Componentes de Juego&lt;/li&gt;&lt;li&gt;Sonidos&lt;/li&gt;&lt;li&gt;Texturas Animadas (Una Explosión!!! lo logré!!!)&lt;/li&gt;&lt;li&gt;Conclusión y Código Fuente&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Instalación de XNA y Visual Studio Express Edition&lt;/span&gt; &lt;span style="font-weight: bold;"&gt; &lt;/span&gt; &lt;div style="text-align: justify;"&gt; Como son completamente gratuitos (raro en microsoft pero así es) les paso los links a las  herramientas que necesitaremos:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;El VSExpress &lt;a href="http://msdn.microsoft.com/vstudio/express/visualcsharp/"&gt;http://msdn.microsoft.com/vstudio/express/visualcsharp/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El XNA y el DirectX SDK: &lt;a href="http://msdn2.microsoft.com/en-us/xna/bb500976.aspx"&gt;http://msdn2.microsoft.com/en-us/xna/bb500976.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Creación del Proyecto y blanco de instalación del juego&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una vez instaladas Todas las herramientas abran el XNA Game Studio Express&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_9MqxtAqqjqE/RoaI9AMc8WI/AAAAAAAAAAU/PIM-Nwtb6rw/s1600-h/crearProyecto000.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_9MqxtAqqjqE/RoaI9AMc8WI/AAAAAAAAAAU/PIM-Nwtb6rw/s400/crearProyecto000.JPG" alt="" id="BLOGGER_PHOTO_ID_5081899811139809634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusión y Código Fuente&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; Como les platiqué en mi blog post anterior &lt;a href="http://empacarino.blogspot.com/search/label/blogger"&gt;http://empacarino.blogspot.com/search/label/blogger&lt;/a&gt; hay una página que permite subir archivos de manera gratuita:  &lt;a href="http://www.content-type.com/"&gt;http://www.content-type.com/&lt;/a&gt;&lt;br /&gt; Así  que les dejo el link para bajar todo el proyecto que tendrán que recompilar para verlo en acción.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.content-type.com/-858347663/Jorge+Baroudi+-+JuegoLetrasNumeros+v1.0.0.7.rar.htm"&gt; http://www.content-type.com/-858347663/Jorge+Baroudi+-+JuegoLetrasNumeros+v1.0.0.7.rar.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-3752000768110931171?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://creators.xna.com/' title='XNA y C# Programación para Juegos de windows y xbox 360'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/3752000768110931171/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=3752000768110931171' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/3752000768110931171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/3752000768110931171'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2007/06/xna-y-c-programacin-para-juegos-de.html' title='XNA y C# Programación para Juegos de windows y xbox 360'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_9MqxtAqqjqE/RoaI9AMc8WI/AAAAAAAAAAU/PIM-Nwtb6rw/s72-c/crearProyecto000.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-2674028171616191190</id><published>2007-03-21T09:11:00.000-06:00</published><updated>2007-03-21T09:14:22.138-06:00</updated><title type='text'>Paginacion con sql server 2005</title><content type='html'>paginacion sin dolor en sql server 2005&lt;br /&gt;&lt;br /&gt;SELECT * FROM (&lt;br /&gt;  SELECT *, row_number() over (order by campo1, campo2) as rownumber&lt;br /&gt;  WHERE campo1 like 'a%' and campo2 = 'x'&lt;br /&gt;) as tb&lt;br /&gt;WHERE  rownumber between  1  and  9&lt;br /&gt;&lt;br /&gt;estos ultimos valores los vas cambiando por tu inicio y tu fin de numeros de registros, el inicio mas el numero de registros que deseas mostrar  (menos uno) te da el fin del between.&lt;br /&gt;&lt;br /&gt;se volvió mas sencillo paginar en sql server 2005, pero tienes un defecto aunque es casi imperceptible dado el buen rendimiento del sqo server 2005. el problema reside en que de todas maneras, el query de la subconsulta tiene que jalar todos los datos para poder hacer la paginación.&lt;br /&gt;&lt;br /&gt;pruebenlo y me dicen, bajense el sql server 2005 express edition que es gratis y suerte!&lt;br /&gt;&lt;br /&gt;luego les platico de los linked servers, son una maravilla si no los utilizaron en sql server 2000, ahora es mas facil usarlos.&lt;br /&gt;&lt;br /&gt;saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-2674028171616191190?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/2674028171616191190/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=2674028171616191190' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/2674028171616191190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/2674028171616191190'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2007/03/paginacion-con-sql-server-2005.html' title='Paginacion con sql server 2005'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-339357743365983806</id><published>2007-02-28T12:58:00.000-06:00</published><updated>2007-02-28T13:38:33.540-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='refranes'/><category scheme='http://www.blogger.com/atom/ns#' term='informática'/><category scheme='http://www.blogger.com/atom/ns#' term='trabalenguas'/><title type='text'>Trabalenguas y refranes para informáticos</title><content type='html'>- "Más vale un windows a la mano, que un linux regalado"&lt;br /&gt;&lt;br /&gt;- "Tres tristes Triggers, tragaban Threads en una LAN"&lt;br /&gt;&lt;br /&gt;- "Al windows de microsoftirimicuaro, lo quieren desmicrosoftirimicuizar, el que lo desmicrosoftirimicuarize, un buen desmicrosoftirimicuarizador será"&lt;br /&gt;&lt;br /&gt;- "En casa del programador, el que no debuggea, la c...paga"&lt;br /&gt;&lt;br /&gt;- "Software que no has de quemar, bajalo a ISO"&lt;br /&gt;&lt;br /&gt;-------------------------------------------------&lt;br /&gt;Agradecimientos:&lt;br /&gt;Ramón Sosa&lt;br /&gt;Eladio Velazquez&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-339357743365983806?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/339357743365983806/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=339357743365983806' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/339357743365983806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/339357743365983806'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2007/02/trabalenguas-y-refranes-para.html' title='Trabalenguas y refranes para informáticos'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-6611300555023341293</id><published>2007-01-18T00:03:00.000-06:00</published><updated>2007-01-18T00:31:23.075-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='xsl'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails y mas Grails</title><content type='html'>Sigo en la batalla de entender grails, ya pude hacer la mayoría de mis catálogos iniciales de mi tesis de forma directa a traves de un archivo groovy por catálogo. Esto es, los archivos dentro de la carpeta domain. Lo demás ( controladores, vistas y layouts ) no los he tocado, hasta que entienda realmente las cuestiones de las restricciones ( constraints ) que permiten definir como quedarán las tablas generadas por el hibernate.&lt;br /&gt;&lt;br /&gt;Es una maravilla, y ya puedo pensar en el siguiente paso, el cual me lleva directamente a el filtro de los combos o dropdowns de los catálogos mastaer y detail, puedo decirles que mi dominio comprende proyectos que tienen areas de negocios, que a su vez tienen actividades de negocio y estos a su vez características funcionales, etc. lo importante es que después de generar el código puedo realizar las operaciones básicas de altas, bajas, modificaciones, listado y mostrar datos del registro seleccionado de la lista sin mayor esfuerzo que un simple comando grails generate-all&lt;br /&gt;&lt;br /&gt;Ante todo esto, ni siquiera el filtro de los combos es importante para mi tesis pero es algo que quiero dominar para no cometer errores y combinar las areas de negocio de un proyecto con las de otro proyecto cuando esté dando de alta alguna actividad de negocio. Esto quiere decir, los combos no se filtran en el evento onchange, o mejor dicho, la generación de código qeu trae el grails no realiza esta tarea de refrescar la información de los combos anidados en niveles inferiores, hay que hacerlo de manera manual... sinceramente, que flojera, y ni siquiera es importante para la tesis porque tengo que llegar mas a fondo y meterme a los datos del uso de platillas XSL en combinación con metadatos XML a partir de tablas de la base de datos para lo que verdaderamente vale, y hacer pruebas y generar códigos y editarlos o refactorizar y luego comparar código generado con el refactorizado para llevar un seguimiento de los cambios por código y relacionar esta información con la plantilla... asi podemos decir qeu una plantilla nos ofrece muchas mas ventajas que otra de acuerdo al menor número de cambios en diferentes contextos o proyectos.&lt;br /&gt;&lt;br /&gt;Un rollo que se me ocurrió y fui ligando ideas, y ahora, como siempre, me encuentro con proyectos como grails o ruby on rails que generan código y se actualizan inmediatamente y tienen muchas características funcionales interesantes, son prácticos y están orientados a hacernos la vida mas fácil, mientras que yo, la complico, bueno, en realidad, no tanto, por eso quiero llegar al punto de simplificar la administración del proyecto a través de la información basada en experiencia recogida y documentada en forma de plantillas XSL.&lt;br /&gt;&lt;br /&gt;Todo esto, con el afán de lograr una meta, ya tengo la idea completa y creo que lo más dificil será que alguien retroalimente mi proyecto de tesis con los resultados obtenidos. Si logro combinar el grails con una interfaz de java simple por JDBC o el mismo hibernate a los metadatos de una tabla y con esto genero el XML y con la sabia experiencia de los programadores para generar su código a partir de metadatos en formato XML a su lenguaje preferido (utilizando particularmente XSL he logrado generar código c#, php y java), entonces, ya estoy del otro lado.&lt;br /&gt;&lt;br /&gt;Sus comentarios son bienvenidos.&lt;br /&gt;&lt;br /&gt;saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-6611300555023341293?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://grails.codehaus.org' title='Grails y mas Grails'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/6611300555023341293/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=6611300555023341293' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/6611300555023341293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/6611300555023341293'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2007/01/grails-y-mas-grails.html' title='Grails y mas Grails'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-2415309421578821320</id><published>2006-12-19T10:37:00.000-06:00</published><updated>2007-01-18T00:32:16.839-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Lazslo'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Grails y OpenLazslo</title><content type='html'>Sigo con &lt;a href="http://grails.codehaus.org"&gt;grails&lt;/a&gt;, entusiasmado, he logrado hacer mucho en poco tiempo y aunque está en desarrollo todavía le veo muchas posibilidades para convertirse en un lenguaje que nos puede dar en poco tiempo una solución para crear prototipos y hasta proyectos en producción gracias a su interacción con otras herramientas y librerías de Java ( App servers, JVM, etc. ).&lt;br /&gt;&lt;br /&gt;Recientemente leí en el blog del "master" coordinador general del proyecto Grails &lt;a href="http://graemerocher.blogspot.com/"&gt;Graeme Rocher&lt;/a&gt; que se añadió soporte para plugins y con ello se integró OpenLazslo.&lt;br /&gt;&lt;br /&gt;Jamás había oido de OpenLazslo, debo decirles que lo único parecido que había escuchado era Flex de Adobe, ambos generan archivos flash con base en un código con formato XML. Solo es cuestión de tener el IDE FlexBuilder para facilitar el desarollo, y en OpenLazslo, ademas de eclipse que tiene su plugin para Grails y aparte para OpenLazslo lo que me interesaba era probar que genera el Grails de código OpenLazslo, y efectivamente genera lo mismo que antes nada más que en Flash, imaginense!!! las 4 operaciones, CRUD, Create-Read-Update-Delete pero en Flash, y con una facilidad inmensa para crear animaciones interesantes a partir de esa base.&lt;br /&gt;&lt;br /&gt;Creo que es algo que no se dbeen de perder.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-2415309421578821320?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/2415309421578821320/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=2415309421578821320' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/2415309421578821320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/2415309421578821320'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/12/grails-y-openlazslo.html' title='Grails y OpenLazslo'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-8500026933957508670</id><published>2006-11-14T10:57:00.000-06:00</published><updated>2007-01-18T00:33:02.977-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Proyectos web con Groovy on Rails</title><content type='html'>He estado revisando tanto &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; como &lt;a href="http://grails.codehaus.org/"&gt;Groovy on Rails&lt;/a&gt; (ahora Grails) y ambos tienen mucho que ofrecerle (y enseñarle) a la comunidad 'empresarial' de desarrollo web, ya sea los que desarrollamos en .net y java (incluyendo php).&lt;br /&gt;&lt;br /&gt;Lo que yo he aprendido con esto es que todo el modelo MVC es muy importante, así que aprender la separación de responsabilidades en capas conceptuales de clases no deja de ser un &lt;span style="FONT-STYLE: italic"&gt;Must Learn&lt;/span&gt; (necesario aprender), lo digo porque tanto ruby on rails como grails tienen esta separación cada vez que generamos una clase.&lt;br /&gt;&lt;br /&gt;Realmente me agrada mas Grails porque está directamente relacionado con Java, y eso, lo admito, hace que mi decisión esté balanceada hacia este proyecto. Aunque, admito que Ruby on Rails (RoR) ya tiene mas experiencia que Grails. Sin embargo, el uso de hibernate para hacer el OR Mapping (Clases que se definen y se guardan sin codigo especial de conexion ni consulta sql directamente a la base de datos) y dicho proyecto de hibernate está muy muy bien definido y avanzando fuertemente gracias a la nueva especificación de JEE5.&lt;br /&gt;&lt;br /&gt;En fin, un sin número de cosas que desgraciadamente no podré utilizar en mi tesis porque requiere, como todo lo nuevo, un tiempo para aprenderlo, y aunque en 20 minutos &lt;a href="http://grails.codehaus.org/Installation"&gt;instalé Grails&lt;/a&gt;, y probé el tutorial &lt;a href="http://grails.codehaus.org/Quick+Start"&gt;Quick start&lt;/a&gt; y ya tenía mi primera tabla creada automáticamente con 5 líneas definidas para una clase Usuario y dos o tres comandos en windows (interfaz de comandos como el MS-DOS: grails create-app o grails create-domain-class, grails generate-all) y listo!! ya tenía una páginita web con 4 secciones para manejar los datos de Usuarios, list, edit, create y show. así que pensé... que sigue:&lt;br /&gt;&lt;br /&gt;Crear login y manejo de relaciones entre las diferentes clases/tablas y bueno, en eso ando, pero el tiempo me está matando:&lt;br /&gt;&lt;br /&gt;para lo primero parece ser que ACEGI es una buena opción y lo segundo realmente es sencillo con solo agregar el hasMany y el belongsTo dentro de las clases del dominio (carpeta domain del proyecto creado en grails que viene siendo el modelo de la aplicación según MVC)&lt;br /&gt;&lt;br /&gt;Bueno, espero que le dediquen 20 minutos, hacer algo más allá de esto requiere paciencia, pero si tienen una compu (o laptop) como la mía que para correr un netbeans 5.5 con un app server que tarda un minuto en arrancar y ya empiezan a contar el tiempo desperdiciado para hacer algo sencillo, no duden en probar esto que es muy light e interesante... y lo mejor de todo, que ya nadie los puede parar... van con todo y hasta el mismisimo Oracle ya está adoptando al proyecto Grails destinandole recursos fuertes y Java 6 no será la excepción, Sun no se quedará atrás y le dedicará un buen de librerías para integrar los scripts de varias plataformas (PHP, RoR y Grails pro ejemplo) para que interactuen con TODO lo que se desee de un App Server como manejo de transacciones, JNDI y muchas cosas más... claro está, ahorita que estamos en noviembre todavía estamos en el BETA, pero, es la tendencia, no duden que para el proximo año lo más común será escuchar, aparte de AJAX y Web 2.0, más sobre este tipo de lenguajes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-8500026933957508670?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://grails.codehaus.org/' title='Proyectos web con Groovy on Rails'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/8500026933957508670/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=8500026933957508670' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/8500026933957508670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/8500026933957508670'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/11/proyectos-web-con-groovy-on-rails.html' title='Proyectos web con Groovy on Rails'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-5296287914365609209</id><published>2006-11-06T11:24:00.000-06:00</published><updated>2006-11-06T11:28:26.230-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Netbeans herramienta eficaz para crear proyectos java</title><content type='html'>&lt;div style="text-align: justify;"&gt;El &lt;a href="http://www.netbeans.org/"&gt;netbeans&lt;/a&gt; es una herramienta eficaz en el manejo de operaciones que, si hiciéramos manualmente, crear aplicaciones en java sería un verdadero tedio, al menos que seamos maestros del &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para hacer un deployment (instalación) de un proyecto de java que generamos con netbeans nos conviene entender el funcionamiento básico que hace a la hora de compilar el proyecto. Existen varias carpetas donde netbeans guarda nuestro código y librerías para luego integrarlas en 2 tipos de archivos finales de instalación:&lt;br /&gt;&lt;br /&gt;1) Un archivo único de instalación (.jar, .war, .ear) que contiene dentro todo el proyecto&lt;br /&gt;2) Todos los archivos generados (.class, .jar de librerías, etc) por separado&lt;br /&gt;&lt;br /&gt;La primera salida la deja en la carpeta dist dentro de la carpeta del proyecto este archivo nos sirve para instalarlo con solo copiarlo a un servidor que tenga instalado cualquier app server.&lt;br /&gt;&lt;br /&gt;En el caso de que instalemos tomcat, si el tomcat está configurado para hacer autodeploy, copiamos el .war (proyecto web) en webapps y Voila! (Wala! en mexicano)&lt;br /&gt;&lt;br /&gt;La segunda salida la pone en build para uso del tomcat integrado (bundled) para desarrollo.&lt;br /&gt;Cuando se compila codigo, netbeans copia todo lo que tenemos en la carpeta lib y web a la carpeta que se llama build (con su respectiva operación de compilación de clases).&lt;br /&gt;&lt;br /&gt;La carpeta web dentro de un proyecto web guarda la mayoría del código jsp y los documentos xml de configuración que es con lo que interactuamos mientras trabajamos con netbeans.&lt;br /&gt;&lt;br /&gt;Por eso es que, aunque edites la configuración, no afectarías a la instalación de prueba del tomcat bundled. Lo mejor es recompilar y que se haga la copia de los archivos que están en web, lib y source hacia dist y build.&lt;br /&gt;&lt;br /&gt;Saludos&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-5296287914365609209?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/5296287914365609209/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=5296287914365609209' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/5296287914365609209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/5296287914365609209'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/11/el-netbeans-es-una-herramienta-eficaz.html' title='Netbeans herramienta eficaz para crear proyectos java'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-116257431758849749</id><published>2006-11-03T11:13:00.001-06:00</published><updated>2007-01-18T00:35:49.550-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Servidor Tomcat está cayendo. Tomcat server is falling down.</title><content type='html'>En realidad espero que esto sirva solo para propósitos educativos...&lt;br /&gt;&lt;br /&gt;ya que pueden causar una gran destrucción en servidores públicos o comerciales que tal vez no tengan esto resuelto.&lt;br /&gt;&lt;br /&gt;pongan un&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;strong&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:courier new;color:#ffffff;"&gt;System.exit(0);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;a un archivo .jsp y ejecutenlo... verán como mágicamente todas las aplicaciones dejan de funcionar...&lt;br /&gt;&lt;br /&gt;como es posible que de un solo .jsp tire el servidor y por ende a TODAS las aplicaciones.. como es posible que tenga tal nivel de acceso, causandole al servidor de tomcat la inmediata ruina... no lo entiendo...&lt;br /&gt;&lt;br /&gt;saludos.&lt;br /&gt;&lt;br /&gt;-------------------------- English short version --------------------&lt;br /&gt;&lt;br /&gt;Use &lt;strong&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:courier new;color:#ffffff;"&gt;System.exit(0);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;in a .jsp file antd run it in your tomcat server... watch all your web apps fall down... why is this "tthhing" allowed?&lt;br /&gt;&lt;br /&gt;man! i don't get it.&lt;br /&gt;&lt;br /&gt;regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-116257431758849749?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/116257431758849749/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=116257431758849749' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/116257431758849749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/116257431758849749'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/11/servidor-tomcat-est-cayendo-tomcat.html' title='Servidor Tomcat está cayendo. Tomcat server is falling down.'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-116101787841023478</id><published>2006-10-16T11:20:00.000-05:00</published><updated>2006-11-06T12:51:04.708-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><title type='text'>MVC Modelo 2</title><content type='html'>Estimados lectores de este blog:&lt;br /&gt;&lt;br /&gt;Debido a la falta de tiempo no puedo hacer tutoriales como a mi me gustan, paso a paso y con imagenes de todo el proceso que se realiza en el tutorial. Recientemente he recibido muchas peticiones para terminar "Escuelita" pero creo que escuelita será un proyecto interminable dadas las condiciones en que me encuentro de tiempo.&lt;br /&gt;&lt;br /&gt;Sin embargo, para lograr un avance en torno a lo que espero puedan aprender aqui, y aportar mi granito de microarena a nuestra comunidad, tengo código de unos cursos muy simples y sencillos que estoy dando sobre MVC modelo 1 y 2 para entender este tema que puede resultar un enigma  para los que se adentran en la programación con clases, en web, en capas, y muchos otros conceptos que finalmente terminan por toparse con las siglas MVC:&lt;br /&gt;&lt;br /&gt;Empecemos con algo de teoría destilada, eso quiere decir, que yo se las platico con mis propias palabras:&lt;br /&gt;&lt;br /&gt;MVC significa Modelo Vista Controlador, y se refiere a un paradigma o modelo de programación donde acomodamos clases en una serie de "capas", que no significa nada mas que tener una clase con una responsabilidad bien definida, por ejemplo, las clases conocidas como DAO's (Data Access Objects) se encargan normalmente de tener control sobre la conexion a la base de datos y ejecución de query's SQL sobre una tabla especifica (y tablas relacionadas).&lt;br /&gt;&lt;br /&gt;Pero las dudas surgen, para que realizar este grado de separación cuando, con algunas técnicas interesantes, podemos realizar una serie de operaciones directo a tablas, o en algunos casos se nos ofrece, en entornos visuales de programación, componentes conectados directo a las tablas para realizar todas las operaciones CRUD clásicas Create, REad, Update y Delete, lo cual, rompe el esquema de DAO's.&lt;br /&gt;&lt;br /&gt;Cosa que no está mal, y es recomendable para desarrollos de aplicaciones pequeñas, pero chequen los beneficios de la opción en capas para desarrollos un tanto más complicados:&lt;br /&gt;&lt;br /&gt;La separación por capas, como la conceptualizan los modelos de programación como el MVC, permite beneficios como: Trabajo en equipo, el clásico ejemplo de dos programadores donde uno le indica al otro "Tu modifica esta clase y yo esta otra y no nos metemos con el mismo código, solo recuerda no cambiar el nombre del método y los parámetros que ya tenemos diagramado".&lt;br /&gt;&lt;br /&gt;Otro beneficio es que si surge un error en la actualización de los datos de una tabla y tenemos un DAO por tabla entonces podemos llegar rapidamente al punto del código donde se encuentra el error.&lt;br /&gt;&lt;br /&gt;Desventajas: Se necesita mayor comunicación entre los desarrolladores para determinar la secuencia en que se integran las tecnologías y el papel que le tocará a cada uno en el equipo, esto significa, que unos se irán más a la parte de la creación de querys SQL, otros, son mejores para el diseño de ventanas o diseño web, y otros son mejores beta testers de las aplicaciones.&lt;br /&gt;&lt;br /&gt;-Continuaremos con MVC en otros artículos-&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-116101787841023478?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/116101787841023478/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=116101787841023478' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/116101787841023478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/116101787841023478'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/10/mvc-modelo-2.html' title='MVC Modelo 2'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-115142921636077003</id><published>2006-06-27T11:42:00.000-05:00</published><updated>2006-11-03T11:13:30.394-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Disculpas muy atrasadas</title><content type='html'>Una disculpa a todos los que esperaban el codigo de la Escuelita, he estado brincando entre 3 tecnologías y no me he podido dar abasto entre C# y Java, para terminar editando algunas cosas en PHP de proyectos pasados.&lt;br /&gt;&lt;br /&gt; Ando metido con los web services en ambas tecnologías (C# y Java) asi que yo mismo estoy instruyéndome. Por lo tanto siento que regresar a jsp y servlets me ocasionaría un atraso ya que estoy adoptando JSF y utilizando Java Sun Studio Creator para ello, con algunas dificultades pero, son la tendencia dentro de los estandares de SUN, aunque hay muchas otras opciones como Tapestry como MVC framework y JDeveloper como IDE que desarrolló Oracle.&lt;br /&gt;&lt;br /&gt; Creo que tenemos un tiempo muy corto para investigar tantas cosas, tuve que hacer sacrificios y entre ellos está dicho proyectito, espero haber activado alguna fibra en ustedes para continuar, ojala y pudieran depositar alguna experiencia tambien de donde se quedaron y que intentaron realizar a partir de dicha idea.&lt;br /&gt;&lt;br /&gt; Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-115142921636077003?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/115142921636077003/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=115142921636077003' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/115142921636077003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/115142921636077003'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/06/disculpas-muy-atrasadas.html' title='Disculpas muy atrasadas'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-114485258298906283</id><published>2006-04-12T09:24:00.000-05:00</published><updated>2006-11-03T11:13:30.322-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Sql Server'/><title type='text'>Paginación de resultados con MSSQL 2000</title><content type='html'>Bueno, no tengo mucho tiempo pero esto se me hace muy importante:&lt;br /&gt;&lt;br /&gt; La paginación manual de resultados que podemos obtener de un servidor de base de datos MS SQL Server 2000, y no me refiero a solo utilizar TOP, puede llegar a ser un tema de discusión, por diferentes razones, la principal es que no existe algo tan intuitivo como el LIMIT de MySQL, y para implementar esta funcionalidad estuve investigandole sin encontrar una forma sencilla y en otras ocasiones, con muchos altibajos.&lt;br /&gt;&lt;br /&gt; Sin embargo despues de googlear un rato, encontré algo como lo siguiente:&lt;br /&gt;&lt;br /&gt; SELECT TOP 20 t.indice, t.descripcion&lt;br /&gt;&lt;br /&gt; FROM tabla t&lt;br /&gt;&lt;br /&gt; WHERE (&lt;br /&gt;&lt;br /&gt;    SELECT count(*) as total&lt;br /&gt;&lt;br /&gt;    FROM tabla t2&lt;br /&gt;&lt;br /&gt;    WHERE t2.indice &lt;= t t.indice&lt;br /&gt;&lt;br /&gt;    AND t2.descripcion like 'a%'&lt;br /&gt;&lt;br /&gt; ) &gt; (20 - 1) - 20&lt;br /&gt;&lt;br /&gt; AND t.descripcion like 'a%'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Esta es una consulta sencilla, no tiene joins ni nada mas que un simple filtro en el where (el AND t.descripcion like 'a%').&lt;br /&gt;&lt;br /&gt; De los valores númericos qeu aparecen en el query, El número 20 que se observa en el TOP, y antes del ultimo AND, se refiere al número de registros que queremos por cada pagina, y el 1 que está en la expresion con los numeros 20 ( ) &gt; (20 - 1) - 20) se refiere al numero de pagina, asi que este numero irá avanzando poco a poco.&lt;br /&gt;&lt;br /&gt; Cabe mencionar que es necesario hacer una consulta previa para saber el número total de registros con el filtro que apliquen ( AND t.descripcion like 'a%' en este caso) para asi poder calcular el total de paginas.&lt;br /&gt;&lt;br /&gt; Por ahora, espero que esto les ayude en sus consultas, desgraciadamente no tuve time de hacerlo paso a paso, pero, en java ya logré separar todo esto en una clase y esquematizarlo para que cualquier consulta que quiera paginar utilice metodos especificos. Sin embargo, quedará para ustedes algo de diversión, adaptenlo a sus queries para evitar traerse muchos registros.&lt;br /&gt;&lt;br /&gt; Saludos, espero que haya sido útil este artículo.&lt;br /&gt;&lt;br /&gt;PD. Hay otra manera mejor utilizando ORDER BY, espero comentarles sobre esto proximamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-114485258298906283?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/114485258298906283/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=114485258298906283' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/114485258298906283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/114485258298906283'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/04/paginacin-de-resultados-con-mssql-2000.html' title='Paginación de resultados con MSSQL 2000'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-114435447957780401</id><published>2006-04-06T14:19:00.000-05:00</published><updated>2006-11-03T11:13:30.253-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Cargando Crystal Reports 8/8.5 con PHP</title><content type='html'>Bueno, no tengo mucho que decir al respecto, sufrí horrores con este encargo, no nada mas no se puede hacer algo decente con los DLL's de crystal reports, sino que al parecer, para soluciones extra hiper prácticas y ligeras como un frente php con mysql, cargar un reporte en crystal reports dinamico puede ser muy dificil si queremos meter la seguridad de la base de datos ya que no tenemos forma de leer lso metodos del objeto COM, ni con el get_methods ni con las funciones com_, &lt;br /&gt;&lt;br /&gt;Sin embargo, esta parte le quitaría mucha carga a los programadores y pasaríamos la responsabilidad a algunos otros que tal vez ni se enteren de que su reporte se utilice en web.&lt;br /&gt;&lt;br /&gt; Por lo tanto, veamos estos pasos:&lt;br /&gt;&lt;br /&gt; 1) Crear el reporte con una conexion a la base de datos utilizando un usuario sin contraseña.&lt;br /&gt;&lt;br /&gt; - Obvio, un riesgo de seguridad... pero mantenganse conmigo (bare with me), esto es por el placer de aprender y luego resolvemos los pendientes (Agile please)&lt;br /&gt;&lt;br /&gt; 2) Una vez que el reporte funciona de manera local con su conexion y tenemos los campos añadidos, lo copiamos a nuestro servidor web y lo ponemos en cualquier carpeta que queramos, por lo menos donde el usuario IUSR_&lt;nombremaquina&gt; tenga permisos de lectura.&lt;br /&gt;&lt;br /&gt; 3) editen un archivo php o solo copien y peguen este ejemplo:&lt;br /&gt;&lt;br /&gt;--------- INICIA CODIGO PHP -----------&lt;br /&gt;&lt;br /&gt;$crapp = new COM("CrystalRuntime.Application") or die ( "Error on load");&lt;br /&gt;&lt;br /&gt;$creport = $crapp-&gt;OpenReport("c:\\reporte.rpt", 1);&lt;br /&gt;&lt;br /&gt;//fomatType = integer 22=xls, 31=pdf etc&lt;br /&gt;$creport-&gt;ExportOptions-&gt;FormatType = 31;&lt;br /&gt; &lt;br /&gt;//type 1 is to output to a file I think 2 is email&lt;br /&gt;$creport-&gt;ExportOptions-&gt;DestinationType = 1;&lt;br /&gt; &lt;br /&gt;$creport-&gt;ExportOptions-&gt;DiskFileName = "C:\\Inetpub\\wwwroot\\reporte.pdf";&lt;br /&gt; &lt;br /&gt;$creport-&gt;DiscardSavedData();&lt;br /&gt;$creport-&gt;Export(False);&lt;br /&gt;header("Location: http://localhost/reporte.pdf");&lt;br /&gt;exit(0);&lt;br /&gt;&lt;br /&gt;-------- TERMINA CODIGO PHP ----------&lt;br /&gt;&lt;br /&gt;Y bien, esto es todo... pruebenlo y chequen como la salida en php es mas sencillo que utilizar un fPDF o algo por el estilo y tener que programar la salida... obvio, hay que tener los dlls de crystal y en caso de hacer una instlacion hay que llevarlos al servidor web y eso puede estar fuera del spec del deployment, asi que hay que tener cuidado tambien, no vaya a ser que terminemos instalando todo el crystal reports en el servidor, aguas con las versiones de crystal.&lt;br /&gt;&lt;br /&gt;Les agradecería sin embargo que si encuentran como meterle la info de usuario y password, la expongan aqui como comentario... &lt;br /&gt;&lt;br /&gt;Un saludo y espero que esto les evite estar navegando algun tiempo por la red.&lt;br /&gt;&lt;br /&gt;PD. Por cierto, si quieren cargar un reporte del CR 9 o del 10 o incluso del 11 ponganle lo siguiente al principio:&lt;br /&gt;&lt;br /&gt;$crapp = new COM("CrystalRuntime.Application.9") or die ( "Error on load");&lt;br /&gt;$crapp = new COM("CrystalRuntime.Application.10") or die ( "Error on load");&lt;br /&gt;$crapp = new COM("CrystalRuntime.Application.11") or die ( "Error on load");&lt;br /&gt;&lt;br /&gt;y por ahi les dejo la tarea de ver el createObject para las nuevas versiones porque esa parte yo no la utilice, pero pues con esto podemos empezar y ver que sale de mas :)&lt;br /&gt;&lt;br /&gt;Ah si, el ReportFormula mhhm eso lo investigaré y le s platico de vuelta una vez qeu lo tenga dominado porque asi podremos meterle parametros al reporte...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recuerden, solo aquí, y en español!&lt;br /&gt;Jorge Baroudi's Blog&lt;br /&gt;-Como si no tuviera nada que hacer-&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-114435447957780401?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/114435447957780401/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=114435447957780401' title='29 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/114435447957780401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/114435447957780401'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/04/cargando-crystal-reports-885-con-php.html' title='Cargando Crystal Reports 8/8.5 con PHP'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-114435054694841346</id><published>2006-04-06T14:01:00.000-05:00</published><updated>2006-11-03T11:13:30.189-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><title type='text'>Archivos para subir al blogger</title><content type='html'>Para todos aquellos bloggeros que todavia no habian podido subir archivos a su blog, me mandaron un mail de esos que nos llegan a todos los que estamos en este frente donde por primera vez no fue algo para comprar un seguro de vida ni una nueva formula para obetner una cuenta en algun sitio pagado de dudosa procedencia.&lt;br /&gt;&lt;br /&gt; Este amigo escribe en ingles y me da un link en el cual puedo subir archivos gratis... lo pruebo y "wuah-lah"! ya tengo los archivos del ejemplo de php con combos anidados usando ajax. &lt;a href="http://www.content-type.com/1955419801/ajax-php.zip.htm"&gt;http://www.content-type.com/1955419801/ajax-php.zip.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por lo tanto les propongo que hagamos uso de este maravilloso servicio que nos permitirá facilitar la retroalimentación de este sitio, cualquier contribución al código que expongo -u otro que tengan por ahi interesante- suban sus archivos a este sitio &lt;a href="http://www.content-type.com/"&gt;http://www.content-type.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Saludos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-114435054694841346?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.content-type.com/' title='Archivos para subir al blogger'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/114435054694841346/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=114435054694841346' title='12 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/114435054694841346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/114435054694841346'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/04/archivos-para-subir-al-blogger.html' title='Archivos para subir al blogger'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-114185587962549602</id><published>2006-03-08T15:54:00.000-06:00</published><updated>2006-11-03T11:13:30.110-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Acentos y Ñ's: Encoding de los XML devueltos por AJAX</title><content type='html'>Bueno sin mucho preámbulo ni explicación, les paso lo que hay que editar de los archivos para poder mandar Ñ's y acentos por XML.&lt;br /&gt;&lt;br /&gt;El ejemplo se los quiero dar en un zip, base de datos en un archivo .txt con los Sqls, combos.php y modelos.php con todo y los cambios... pero no puedo subirlo al blogger para que lo puedan bajar... cualquier comentario es bienvenido.&lt;br /&gt;&lt;br /&gt;por cierto los cambios fueron los siguientes:&lt;br /&gt;&lt;br /&gt;Agregué el tag meta en el archivo combos.php que especifica el text/html;charset="ISO-8859-1"&lt;br /&gt;&lt;br /&gt;y la línea en modelos.php&lt;br /&gt;echo xml version=\"1.0\" encoding=\"ISO-8859-1\" ?&lt;br /&gt;( borré las comillas y los tags de mayor que y menor que d ela linea de arriba porque si no blogger no me deja publicarla... (?:() )&lt;br /&gt;&lt;br /&gt;con el encoding que permite que veamos las Ñ's y los acentos...&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;Otro tip que les platico aparte que no puse en codigo pero que es buena practica es que utilicen encodingURI() para los valores que pondrán dentro de su query a enviar por AJAX.&lt;br /&gt;&lt;br /&gt;Otro tip aunque no lo quieran es que si quieren enviar un POST en vez de un GET hagan lo siguiente:&lt;br /&gt;&lt;br /&gt;xmlObject = getXMLObject();&lt;br /&gt;query = "id=" + encodeURI( valorID );&lt;br /&gt;xmlObject.open( "POST", "modelos.php", true );&lt;br /&gt;xmlObject.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );&lt;br /&gt;xmlObject.onreadystatechange = funcion;&lt;br /&gt;xmlObject.send( query );&lt;br /&gt;&lt;br /&gt;1) Notese que no hay caracter "?"&lt;br /&gt;2) Que despues del open se hace un setRequestHeader&lt;br /&gt;3) que el send ahora no es null sino le pasamos el query (para que viaje por el payload toda la info, y ahi pueden meter bastante informacion no se preocupen, preguntenle al gmail cuando envien un archivo adjunto... uf, eso si que es AJAX!... un ENCTYPE="multipart/form-data" eso si que cuesta trabajo... bueno, inténtenlo con listeners y todo el asunto para hacer una barrita de progreso... auch!).&lt;br /&gt;&lt;br /&gt;4) Ya me explayé con otra cosa... espero sus comentarios sobre esto, deben de haber otras formas de hacer encoding para evitar que salgan erroes por los acentos y las Ñ's pero esto es facil y rapido de implementar&lt;br /&gt;&lt;br /&gt;Saludos...&lt;br /&gt;&lt;br /&gt;Y happy AJAX coding!&lt;br /&gt;&lt;br /&gt;PD. Aun no puedo hacer el envio de un archivo por AJAX... tal vez pronto lo pongamos aquí paso a paso :) a ver si alguien se anima a contarnos donde está el error.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-114185587962549602?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/114185587962549602/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=114185587962549602' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/114185587962549602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/114185587962549602'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2006/03/acentos-y-s-encoding-de-los-xml.html' title='Acentos y Ñ&apos;s: Encoding de los XML devueltos por AJAX'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-113510527275020875</id><published>2005-12-20T12:53:00.000-06:00</published><updated>2006-11-03T11:13:29.958-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>Combos anidados parte II - PHP y AJAX</title><content type='html'>&lt;span style="font-weight: bold;"&gt;- Intro -&lt;/span&gt;&lt;br /&gt;Después de una sesuda sesión o concentración sin interrupciones pero con muchos errores que fuí corrigiendo y varios google-search por fin (por fin!) pude adaptar nuestro ejemplito de combos anidados a algo un poco mejor (se supone), todavía tenemos que practicar mucho ese DOM porque resulta tener sus triquiñuelas (trucos para hacerlo funcionar), como por ejemplo el codigo XML que devolvemos debe de estar muy bien formado (very well formed no nada más well formed jejeje), si le pusimos un espacio en blanco de más podemos complicarnos la existencia a la hora de hacer el parseo, así que olvídense de darle formato al XML resultante (quitar '\n' de los echos, tabs, etc.).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Cambios a la version 1 -&lt;br /&gt;&lt;/span&gt; &lt;ol&gt;   &lt;li&gt;Se utiliza XML en vez de HTML para devolver un resultado desde el archivo modelos.php&lt;/li&gt;   &lt;li&gt;Se utiliza el DOM para "parsear" el XML con los datos de los modelos por marca y desplegarlos en el control HTML (combo, tag select) que despliega los registros de modelos como opciones del combo (tags option)&lt;/li&gt;    &lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;- Código y cambios por archivo -&lt;br /&gt;&lt;br /&gt;modelos.php&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/PHP-AJAX-CombosAnidados-modelos2.php.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/PHP-AJAX-CombosAnidados-modelos2.php.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figura 1: cambios al archivo modelos.php&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Combos.php&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/PHP-AJAX-CombosAnidados-combos2.php-01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/PHP-AJAX-CombosAnidados-combos2.php-01.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 2: cambios al archivo combos.php (1 de 2)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/PHP-AJAX-CombosAnidados-combos2.php-02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/PHP-AJAX-CombosAnidados-combos2.php-02.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 3: cambios al archivo combos.php (2 de 2)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;  &lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Conclusión -&lt;/span&gt;&lt;br /&gt;Con esto damos por terminada esta serie del tutorial de PHP y AJAX, y podemos concluir que el uso de AJAX tiene como &lt;span style="font-weight: bold;"&gt;ventaja&lt;/span&gt;s minimizar la carga de envío de datos al servidor creando pequeños "servicios" (archivos php con una sola responsabilidad) que responden a algún metodo GET o POST y devuelven el resultado con XML (o HTML si quieres limitar tu despliegue de datos pero facilitarte mucho la codificación).&lt;br /&gt;Otra &lt;span style="font-weight: bold;"&gt;ventaja&lt;/span&gt; de AJAX es la "portabilidad" ya que no solo podemos comunicarnos con  archivos php sino con cualquier otro "servicio" que devuelva  XML (ej. web services en java o ASP.Net, entre otros).&lt;br /&gt;&lt;br /&gt;Las principales &lt;span style="font-weight: bold;"&gt;desventaja&lt;/span&gt;s del AJAX son que el usuario deshabilite JavaScript o que desactive (en el IE) los controles ActiveX firmados pero, realmente, ¿Quién se mete a configurar su internet explorer y la seguridad hasta ese punto?... solo el 0.1% que se hacen llamar geeks pudieran pensar en quitarle la seguridad a un ActiveX firmado por el mismo Microsoft... o para hacer pruebas... en fin... muy poca gente realiza estos desplantes de cambios en la configuración default, pero en ambientes controlados por ustedes, no duden en &lt;span style="font-weight: bold;"&gt;revisar&lt;/span&gt; estas dos opciones, &lt;span style="font-weight: bold;"&gt;y habilitar&lt;/span&gt; el &lt;span style="font-weight: bold;"&gt;JavaScript y los controles ActiveX firmados&lt;/span&gt; (para que funcione el XmlHttpRequest).&lt;br /&gt;&lt;br /&gt;Hasta la próxima y feliz responseXML de su servicio favorito en estas fechas.&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/12620014-113510527275020875?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/113510527275020875/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=113510527275020875' title='7 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113510527275020875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113510527275020875'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/12/combos-anidados-parte-ii-php-y-ajax.html' title='Combos anidados parte II - PHP y AJAX'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-113501678517638985</id><published>2005-12-19T10:07:00.000-06:00</published><updated>2006-11-03T11:13:29.884-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>Llenando combos anidados (tag select de HTML) utilizando PHP y AJAX</title><content type='html'>&lt;span style="font-weight: bold;"&gt; - Intro -&lt;/span&gt;&lt;br /&gt;Interrumpo un momento el tutorial de la escuelita para atender una petición del uso de PHP y AJAX como alternativa para manejar el clásico problema de los combos (select de HTML) que se llenan al seleccionar un combo que le precede, por ejemplo, al seleccionar una marca de un combo de marcas se llena automáticamente un combo de modelos.&lt;br /&gt;&lt;br /&gt;Este tutorial toma en cuenta que ya sabemos configurar MySQl y crear tablas en él, también que tenemos php instalado y que manejamos muy bien conexiones entre ambos para realizar consultas a las tablas creadas.&lt;br /&gt;&lt;br /&gt;Asumimos también que conocemos el método GET del protocolo HTTP como método de envío de datos... cabe mencionar que, aunque solo utilizaremos GET en este caso, es fácil adaptar el AJAX para envío de solicitudes por POST y aprovechar sus ventajas sobre el método GET.&lt;br /&gt;&lt;br /&gt;Finalmente asumimos que se conoce también el manejo de eventos por javascript en combos como es el evento onChange.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Contenido -&lt;/span&gt;&lt;br /&gt;Para este tutorial tendremos primero dos archivos.php uno que tenga el código HTML y Javascript para comunicación con el archivo.php que devuelva todos los modelos de una marca seleccionada. También utilizaremos dos tablas de una base de datos en MySQL como catálogos de marcas y modelos de cada marca, con campos clave y descripción (y en la tabla de modelos otro campo de clave de la marca para la relacion entre las tablas).&lt;br /&gt;&lt;br /&gt;combos.php -&gt; contiene el código AJAX y los combos de marcas y modelos&lt;br /&gt;modelos.php -&gt; contiene la recepción del GET con el id de la marca para buscar los modelos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- 1) Tablas de Mysql -&lt;/span&gt;&lt;br /&gt;Creamos dos tablas Marcas y Modelos con relación por medio de la clave de la marca.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tabla de marcas&lt;/span&gt;&lt;br /&gt;CREATE TABLE `marcas` (&lt;br /&gt;`clave` tinyint(4) NOT NULL auto_increment,&lt;br /&gt;`nombre` varchar(50) default NULL,&lt;br /&gt;PRIMARY KEY  (`clave`)&lt;br /&gt;) TYPE=MyISAM&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tabla de modelos&lt;/span&gt;&lt;br /&gt;CREATE TABLE `modelos` (&lt;br /&gt;`clave` tinyint(4) NOT NULL auto_increment,&lt;br /&gt;`clave_marca` tinyint(4) default NULL,&lt;br /&gt;`descripcion` varchar(100) default NULL,&lt;br /&gt;PRIMARY KEY  (`clave`)&lt;br /&gt;) TYPE=MyISAM&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- 2) Archivo php de extracción de modelos por marca -&lt;br /&gt;&lt;/span&gt;El archivo php que necesitamos crear para extraer los modelos por marca no difiere en lo absoluto de lo que estamos acostumbrados a hacer en php:&lt;br /&gt;1) Verificar que el usuario haya iniciado sesión,&lt;br /&gt;2) Verificar que se nos haya pasado una clave de marca en el metodo GET,&lt;br /&gt;3) Establecer conexion a la base de datos&lt;br /&gt;4) Crear un query para tomar todos los modelos de la marca.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" target="_blank" href="http://photos1.blogger.com/blogger/2124/1078/1600/PHP-AJAX-CombosAnidados-modelos.php.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/PHP-AJAX-CombosAnidados-modelos.php.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figura 1: modelos.php&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt; Sin embargo, la diferencia principal estriba en el resultado, que en este caso lo desplegaremos de la forma más sencilla, el uso clásico de la función echo, y como dijimos anteriormente, no devolveremos XML puro, sino HTML para adaptarse a los selects, por lo tanto, cada registro de modelo será un option del select. Todo esto se ve de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- 3) Archivo php de combos -&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/PHP-AJAX-CombosAnidados-combos.php-01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/PHP-AJAX-CombosAnidados-combos.php-01.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Figura 2: combos.php (1 de 3)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Al principio del archivo de combos.php podemos observar que tomamos las marcas de la base de datos (se omiten los primeros pasos pero son iguales que en el archivo modelos.php ver &lt;a target="_blank" href="http://photos1.blogger.com/blogger/2124/1078/1600/PHP-AJAX-CombosAnidados-combos.php-01.jpg"&gt;Figura 1: modelos.php&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/PHP-AJAX-CombosAnidados-combos.php-02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/PHP-AJAX-CombosAnidados-combos.php-02.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 3: combos.php (2 de 3)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Continuando con las funciones dentro de Javascript que conforman la funcionalidad AJAX tenemos la función getXMLHttpRequest() mostrada en la figura 3, esta devuelve un ActiveX en el caso del Internet Explorer o un XMLHttpRequest en el caso de browsers basados en Mozilla que funcionan de acuerdo a un estándar (no hacemos uso de muchos métodos del activeX para no descubrir que alguna actualización del explorador nos arroja un error en mozilla), estas funciones que les doy ya las probé en IE 6.x y Mozilla 1.0.7.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/PHP-AJAX-CombosAnidados-combos.php-03.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/PHP-AJAX-CombosAnidados-combos.php-03.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Figura 4: combos.php (3 de 3)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &lt;div style="text-align: left;"&gt;Finalmente, en la figura 4 mostramos el código que realiza la asignación al innerHTML y el código HTML para la llamada a la función enviaQuery que hace uso de AJAX&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Despedida -&lt;/span&gt;&lt;br /&gt;Espero lo prueben y les sirva para resolver aquellos molestos codigos spaghetti con varios if de POST o GET. Todavía podemos hacer muchas cosas más a partir de esto, recuerden que solo estamos desplegando el resultado en un select, averiguen sobre DOM y como en vez de asignar directamente el resultado (porque enviamos HTML en modelos.php) enviemos XML y lo "parseemos" con DOM y JavaScript.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NOTA: &lt;/span&gt;Un dato que nos faltó incluir en modelos.php, se me olvidó poner el mysql_select_db pero ustedes que son &lt;a href="http://www.wickedlysmart.com/"&gt;wickedly smart&lt;/a&gt; ya se habrán dado cuenta de mi error :)&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/12620014-113501678517638985?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/113501678517638985/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=113501678517638985' title='7 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113501678517638985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113501678517638985'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/12/llenando-combos-anidados-tag-select-de.html' title='Llenando combos anidados (tag select de HTML) utilizando PHP y AJAX'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-113458521765298231</id><published>2005-12-14T11:42:00.000-06:00</published><updated>2006-11-03T11:13:29.787-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Aplicación Escuelita JSP y Servlets con NetBeans 2005 Beta 2: Parte II</title><content type='html'>&lt;div align="justify"&gt;&lt;strong&gt;- Intro -&lt;br /&gt;&lt;/strong&gt;En el &lt;a href="http://empacarino.blogspot.com/2005/12/ejemplo-sencillo-de-java-jsp-y.html" target="_blank"&gt;anterior Post&lt;/a&gt; de este blog platicamos un poco de una aplicación llamada escuelita que inventamos para poder realizar este tutorial. Como comentábamos, este tutorial se dividirá en 3 partes. En la &lt;a href="http://empacarino.blogspot.com/2005/12/ejemplo-sencillo-de-java-jsp-y.html" target="_blank"&gt;primera parte&lt;/a&gt; definimos la aplicación y los requerimientos (muy sencillos), creamos un diagrama de casos de uso y las clases (Curso y Alumno) que representan el modelo general de la aplicación. Hasta este punto podemos empezar a programar el modelo, aunque aun no hayamos definido nada de servlets y JSP y creo que sería bueno comenzar con NetBeans y tomar decisiones para aterrizar este tutorial en algo concreto, así que iremos paso a paso, y no se asusten si al principio probamos nuestras clases via métodos main, eso es muy bueno, luego pasaremos a los Servlets y sus pruebas de salida con codigo sencillo (un System.out.println o utilizando codigo HTML) para finalmente integrar a los JSP y darle un mejor aspecto visual. El objetivo es mostrarles que este desarrollo por pasos nos permite ver las cosas de manera separada e ir probando cada cosa que hacemos para que el resultado final tenga un mínimo de errores.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- NetBeans -&lt;/strong&gt;&lt;br /&gt;El &lt;a href="http://www.netbeans.org" target="_blank"&gt;NetBeans 2005 Beta 2&lt;/a&gt; es una herramienta poderosa desarrollada completamente en Java para el desarrollo de aplicaciones en Java, utilizando cualquier tecnología que deseemos integrar, desde simples clases hasta servicios web (web services) o aplicaciones para dispositivos móviles (J2ME). La desventaja principal de NetBeans es que necesita unos buenos 512 MB de RAM para ser utilizado sin problema, si tienes solo 256 MB de RAM puedes tener una lentitud exasperante, pero si lo pruebas y te resulta porque hay muchos otros factores que pueden contribuir a incrementar la velocidad de la aplicación como velocidad del procesador, disponibilidad de memoria virtual, etc, pues entonces podremos estar en sintonía con el tutorial, si no gozas de estos elementos, siempre está el &lt;a href="http://www.eclipse.org" target="_blank"&gt;Eclipse&lt;/a&gt; que es excelente para estos casos y realiza las mismas (o incluso otras) funciones que necesitaremos para el tutorial.&lt;br /&gt;&lt;br /&gt;Al ejecutar netbeans nos topamos con una ventana de bienvenida que nos da tiempo para tomarnos un momento reflexivo sobre cosas insustanciales como ¿Cambiará el color de &lt;a href="http://www.macromedia.com" target="_blank"&gt;Macromedia Dreamweaver&lt;/a&gt; porque ya es de Adobe de verde a rojo?, ¿El partido político de &lt;a href="http://huaracheconcostilla.blogspot.com" target="_blank"&gt;huaracheconcostilla.blogspot.com&lt;/a&gt; ganará las elecciones de méxico en el 2006?, ¿Será verdad que &lt;a href="http://www.thefinaltheory.com" target="_blank"&gt;www.thefinaltheory.com&lt;/a&gt; tenga la respuesta que Einstein no encontró sobre algunos aspectos de la física?, entre muchas otras cosas... y aún seguirá cargando... pero una vez que aparezca la aplicación, ésta será nuestra primera pantalla: &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;[Omitida la imagen de la pantalla de bienvenida para evitar que se me duerman esperando a que les indique que ya pueden bajar la página para ver ésta siguiente imagen] &lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Vamos a seleccionar nuevo proyecto de netbeans:&lt;/div&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/2124/1078/1600/newProject.jpg" target="_blank"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px 0px 10px 10px; CURSOR: hand; TEXT-ALIGN: center" alt="Figura 1" src="http://photos1.blogger.com/blogger/2124/1078/320/newProject.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;em&gt;Figura 1&lt;/em&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;y seguiremos el wizard (asistente) para configurar nuestro proyecto como podremos ver en la figura 2, en esta ventana seleccionaremos "Web Application" y presionamos siguiente:&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;a href="http://photos1.blogger.com/blogger/2124/1078/1600/wizardNewProject.jpg" target="_blank"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px 10px 10px 0px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/2124/1078/320/wizardNewProject.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;em&gt;Figura 2&lt;/em&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;En la siguiente pantalla (Figura 3) configuramos la ruta y nombre del directorio de nuestro proyecto. Seleccionamos el tipo de servidor y presionamos el boton next (siguiente)&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;a href="http://photos1.blogger.com/blogger/2124/1078/1600/wizardNewProject02.jpg" target="_blank"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/2124/1078/400/wizardNewProject02.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;em&gt;Figura 3&lt;/em&gt;&lt;/p&gt;&lt;p align="left"&gt;Para finalizar, la siguiente pantalla (omití la imagen porque no haremos nada en ella) nos pide que seleccionemos alguna opción si queremos utilizar algún framework de web (conjunto de librerías para aplicaciones web) que viene integrado con NetBeans. En este tutorial no utilizaremos ninguno, vamos a aprender las bases y luego podremos ver si nos conviene utilizar algún framework existente. Estos frameworks - ya que estamos comentando sobre ellos - nos dan una forma de organizar las tecnologías para separar nuestro código y hacerlo más flexible, incluso integrar algunos frameworks que se encarguen de realizar el mapeo de clases directamente a las tablas de nuestra base de datos (O/R mapping o Object/Relational mapping si no me confundo en el término) que es una forma de evitar codificar los SQL's para manipular las operaciones básicas CRUD (Create, Read, Update y Delete - Crear, Leer, Editar y Borrar) de todo catálogo o registro de nuestra base de datos. Sin embargo, por ahora, omitiremos todas las tecnologías y utilizaremos Java JSP y Servlets Puro... luego sobre este proyecto iremos incluyendo el que nos interese - principalmente estos ultimos porque lo que proponen es manejar las tabals de una base de datos como objetos, muy interesante! - .&lt;/p&gt;&lt;p align="left"&gt;&lt;strong&gt;- Entorno de NetBeans - &lt;a href="http://photos1.blogger.com/blogger/2124/1078/1600/Project01.jpg" target="_blank"&gt;&lt;img style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/2124/1078/320/Project01.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/strong&gt;Una vez creado nuestro proyecto podemos observar que el proyecto tiene una estructura de directorio con carpetas para las paginas web (Web Pages), nuestro modelo de la aplicación (Source Packages) entre otras carpetas.&lt;/p&gt;&lt;p align="left"&gt;Nuestra chamba (trabajo), es incluir primero el modelo de la aplicación, no importa cual sea su proyecto, es el modelo lo que primero vamos a atacar, por lo menos si empezamos con el UML, y es la parte que no importa como la visualicemos, tiene que funcionar porque si no, no tenemos aplicación que funcione, así que, nos olvidamos por un momento del index.jsp y los servlets y crearemos nuestras clases en java comun y corriente y luego integraremos la &lt;a href="http://www.mysql.com"&gt;conexión a MySQL&lt;/a&gt;, que como van a ver es algo muy sencillo, utilizando el JDriver, que mysql nos proporciona y ligándolo al proyecto, cosa que haremos más adelante.&lt;/p&gt;&lt;p align="left"&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-113458521765298231?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/113458521765298231/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=113458521765298231' title='12 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113458521765298231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113458521765298231'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/12/aplicacin-escuelita-jsp-y-servlets-con.html' title='Aplicación Escuelita JSP y Servlets con NetBeans 2005 Beta 2: Parte II'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-113415128602895909</id><published>2005-12-09T11:26:00.000-06:00</published><updated>2006-11-03T11:13:29.709-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Ejemplo sencillo de Java JSP y Servlets con NetBeans 2005 Beta 2</title><content type='html'>&lt;span style="FONT-WEIGHT: bold"&gt;-Intro-&lt;br /&gt;&lt;/span&gt;Una super herramienta para crear páginas utilizando las tecnologías de Java como JSP y Servlets es &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; ya que integra incluso al servidor web Tomcat (o se puede utilizar el AppServer que también trae integrado pero tarda un poco mas en cargar) y no tenemos que realizar tareas de implantación (deployment) de nuestra aplicación de forma manual, solo apretando una sencilla tecla (F6) y nuestra aplicación web estará &lt;span style="FONT-STYLE: italic"&gt;up &amp; running&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Con este tipo de herramientas (también está &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; como editor de estas capacidades) podemos preocuparnos de los detalles inherentes a nuestra aplicación como es la lógica de negocios (modelo), la estructura de nuestros directorios web (donde residen nuestros archivos JSP, html e imágenes por nombrar algunos) y nuestra estructura de las clases de la aplicación que creamos con el &lt;span style="FONT-STYLE: italic"&gt;package.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold"&gt;-División de este tutorial-&lt;br /&gt;&lt;/span&gt;En NetBeans crear un proyecto web es sencillo, vamos a ver unas imágenes, y aunque por tiempo no podré explicarles toda la aplicación quiero dividir este esfuerzo en 3 partes.&lt;br /&gt;La primera parte es platicarles un poco de la idea para crear una aplicación sencilla pero concreta y mostrarles unos pantallazos del netBeans para que puedan crear su primer proyecto web, la segunda parte es meter las manos en codigo JSP y Servlets, y la ultima parte es mostrarles y experimentar un poco con AJAX (la parte de XML principalmente porque requiero practicarlo y esto me servirá a mi también) para estar utilizando la ultima moda en creación de páginas web.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;-La Aplicación-&lt;br /&gt;&lt;/span&gt;Como esto es un ejemplo pequeño pero funcional nuestro primer paso es delimitar nuestro ámbito de trabajo, así que imagínense que nos han contratado en un pueblito pequeño para hacer una aplicación web de una escuelita donde solo existe un salón, (porque solo un salón?, R=Para hacer más sencillo el modelo de la aplicación) y las personas que quieran tomar un curso en ella entrarán a la página y revisarán cuales existen en una fecha determinada y apuntarse para asistir (no hay problema de cupo!, siempre se pueden conseguir mas sillas!).&lt;br /&gt;Otro dato importante es que el administrador de la escuelita es el único maestro!, por lo tanto el registro del curso se hace tomando los datos del mismo maestro, el tema que el vaya a exponer , en la fecha que el seleccione y el tiempo de duración que el determine.&lt;br /&gt;&lt;br /&gt;En conclusión, existe un maestro que da cursos y sus alumnos revisan en la página que temas existen en una fecha determinada para registrarse al curso que seleccionen (Un curso no durá más de un día).&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;-Un poco de UML-&lt;br /&gt;&lt;/span&gt;Ahora que conocemos un poco la aplicación les doy una idea general con un diagrama de casos de uso. En este diagrama podemos ver al maestro que es feliz con nuestra aplicación si puede registrar un curso incluyendo la selección del horario y la duración del mismo.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/CasoUso.0.jpg"&gt;&lt;img style="FLOAT: right; MARGIN: 0pt 0pt 10px 10px; CURSOR: pointer" alt="" src="http://photos1.blogger.com/blogger/2124/1078/400/CasoUso.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Por otro lado los alumnos hacen uso de la aplicación cuando consultan temas y horarios de cursos y finalmente se registran en un curso seleccionado. Vaya Escuelita! no me imagino que más le podemos poner después... una cafetería sería bueno! claro que, para que sigamos con el mismo tipo de aplicación, un solo administrador de la cafetería sería el cocinero, mesero y demás, y que los usuarios pidan por internet lo que van a querer de la cafetería cuando vayan a tomar o comer durante el curso (muy V.I.P. la cosa), solo falta que acepte pagos con tarjeta de crédito y listo, lo vendemos :) .&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;-Diagrama de Clases-&lt;br /&gt;&lt;/span&gt;Las clases candidatas son maestro, alumno, curso, horario, tema, registro. Aunque hay ambigüedad en la mención de curso y tema como clases de nuestra aplicación (cambie la palabra clase por curso para referirme sin aclaraciones de a que estoy haciendo referencia ni complicar los términos) pues según la explicación se pudieran dar varios temas en un día, representando cada uno un curso impartido por el maestro, asi que, es solo cuestion de decisión, de ahora en adelante, le llamaremos curso a la clase de la aplicación y el tema será un atributo de la clase curso (que bueno que le cambie de nombre... la clase Clase no hubiera sonado bien). Por otro lado, el maestro no es necesario y el horario puede ser un atributo más o dividirlo en hora de inicio y duracion, decualquier forma no la haremos una clase, asi que nos quedan las clases Alumno, Curso y Registro, este último puede ser un posible controlador de los procesos.&lt;br /&gt;Cabe mencionar que existen muchas formas de hacer división de las clases, pero, para no confundirnos, voy a mantenerme fiel a las ideas de Programación Orientada a Objetos y encapsular todos los datos del registro en Curso asi que toda la logica de negocio queda en esta clase. Por lo tanto, simplificamos a dos clases Alumno y Curso y estamos listos para nombrar sus atributos y metodos.&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/2124/1078/1600/DiagramaClases.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/2124/1078/320/DiagramaClases.jpg" 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/12620014-113415128602895909?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/113415128602895909/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=113415128602895909' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113415128602895909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113415128602895909'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/12/ejemplo-sencillo-de-java-jsp-y.html' title='Ejemplo sencillo de Java JSP y Servlets con NetBeans 2005 Beta 2'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-113128886800444457</id><published>2005-11-06T08:05:00.003-06:00</published><updated>2006-11-03T11:13:29.619-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Más sobre J2EE - Entity Beans un primer cabezazo -</title><content type='html'>Para todos aquellos que estén iniciando con J2EE y realizando sus primeros programas con los Entity Beans aqui les tengo un sumario de las ideas que he ido tomando para ver esta meta realizada.&lt;br /&gt;&lt;br /&gt; 1) Diseña el modelo de tu empresa&lt;br /&gt;    El primer paso, como siempre es el analisis y diseño de tu modelo que puede realizarse con diagramas de procesos de negocios o de actividades para conocer el proceso, o si entrevistas a usuarios empieza con casos de uso muy generales y avanzar hacia los demas diagramas de analisis como clases y diagrama de objetos, continuando con secuencia, diagrama de actividades y de  colaboracion y de estado. O tambien puedes optar por ser más ágil y si conoces bien el dominio del problema y no es tan complejo, escoge un punto de vista que te guste (cada diagrama son puntos de vista diferentes del mismo modelo) y luego que tengas tu diagrama de clases podemos continuar al siguiente paso.&lt;br /&gt;&lt;br /&gt; 2) La discusion para J2EE es sencilla, dado que los Entity beans realizan mapeos directos a cada campo de tus tablas de la base de datos, esto presupone que estas adecuando tu modelo a un entorno relacional que no es puramente orientado a objetos (hay normalizacion y otros métodos en las bases de datos que no se ven como orientados a objetos), por lo tanto tus clases que implementen la interfaz de EntityBean se verán afectadas por los datos para representar las columnas de tus tablas en una serie de metodos get y set abstractos (public abstract ... get y public abstract void set... ) sin utilizar atributos propios dejando que una cofiguracion en el application server haga el mapeo directamente a la base de datos de tu preferencia.&lt;br /&gt;&lt;br /&gt; 3) Una vez que realizas el mapeo de los Entity Beans, creas un cliente para poder realizar las operaciones que principalmente son: Insertar, Actualizar, Borrar y Seleccionar registros, que, segun la especificacion, podras observar es muy facil si escoges CMP - Container management persistence - 0 Persistencia manejada por el contenedor, que es lo que estamos utilizando al configurar el container del application server con el mapeo de los public abstract getters y setters del Entity Bean hacia cada campo de tu tabla. Dichos clientes pueden ser desde un mensaje Asincrono hasta una interfaz para un movil sin cambiar ningun codigo. A Cada Interfaz del cliente como el caso de los JSP y servlets para web, se recomienda que sean de operaciones pequeñas y que no tengan a su cargo grandes responsabilidades, en este caso, el JSP solo presenta los datos y envia a un servlet los datos de un formulario, mientras que el servlet debe de gestionar el control de las llamadas a los entity beans necesarios para realizar las operaciones sobre las tablas de la base de datos.&lt;br /&gt;&lt;br /&gt;-------&lt;br /&gt;&lt;br /&gt; Para todos aquellos que les guste Java y que aun no han entrado a su parte EE, vamos a develar esta caja misteriosa a manera de receta de cocina.&lt;br /&gt;&lt;br /&gt; Primero, necesitamos bajar el application server de J2EE en su especificacion 1.4 donde integra los EJBs 2.1, dicha especificacion todavia maneja esta forma de mapeo, que aunque es muy interesante, de una vez les adelanto que cambiará en la siguiente especificacion de EJBs 3.0 donde estará más enfocada a objetos que a relaciones de tablas, sin embargo, esto no quiere decir que deje de ser interesante, además hay una amplia gama de tecnologías que j2ee no cambia por el momento, y empezar a aprender sobre esta tecnología empresarial es un verdadero "DVoD" (a must learn) si estas en java y quieres enfocarte a aplicaciones escalables, con manejo de transacciones y concurrencia de usuarios... entre muchas otras cosas.&lt;br /&gt;&lt;br /&gt; El application server se encuentra en &lt;a href="http://java.sun.com/j2ee/1.4/"&gt;http://java.sun.com/j2ee/1.4/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; Ocupa aproximadamente unos 250 MB, poco menos, y ya incluye el nuevo SDK estandar de  Java J2SE 1.5.x.&lt;br /&gt;&lt;br /&gt; Mientras se baja  vamos a hacer unos cuantos diagramas,  si tienen una conexion rapida  tal vez sea mejor utilizar  unos casos de uso generales y pasar a las clases,  si no, pueden utilizar todo el RUP,  o pedirme prestado mi CD de herramientas de Java donde tambien está el IDE NetBeans 5.0 beta que aunque es lento está excelentemente bien integrado con el J2EE.&lt;br /&gt;&lt;br /&gt; Como no estamos en analisis y diseño orientado a objetos, asumo que ustedes ya tienen idea de sus clases en el sentido clásico de los POJOs, Plain Old Java Objects, Viejos y Planos Objetos de Java, que como dijimos se parecerían mucho a sus tablas de la base de datos por cuestiones de mapeo entre los Entity Beans y los campos de las tablas.&lt;br /&gt;&lt;br /&gt; Una vez que ya tienen sus clases empecemos con conocer - MECANICAMENTE por el momento - los cambios para convertir nuestra clase en un Entity Bean de acuerdo a la especificacion de EJB 2.1.&lt;br /&gt;&lt;br /&gt; Tomemos una clase sencilla como un Articulo. nos refereimos a cualquier producto de venta, por lo tanto solo tendremos 2 campos sencillos que son clave y descripcion, por el momento no incluyo los demas datos por cuestiones de espacio, ustedes que son wickedly smart - condenadamente inteligentes - podrán inferir como incluir  más atributos de otros tipos. Nuestra clase Articulo entonces se verá acompañada de otras 2 clases, una clase Home y una clase Component. Estas dos clases permiten integrar un patrón de diseño proxy al Entity Bean, pero, en aras de mantener el performance, la recomendación es que sean locales, ya que existe también la posibilidad de hacer entity beans remotos ( Podriamos acceder a Entity Beans de otros servidores configurando solamente nuestro application server no nuestro codigo !!! ) pero con las claras consecuencias de impacto en el performance - Que es justificable solo en proyectos muy grandes -, por lo tanto, tenemos la opcion de mantener todos nuestros EJB's juntos  en el mismo servidor y por ende podemos pensar en un ambiente local, sin embargo, nuestros clientes de los EJBs pueden ser remotos y aun continuamos cumpliendo con la escabilidad suficiente para hacer grandes aplicaciones. Cabe mencionar que este cambio de local a remoto no implica mas que el agregado de unas cuantas lineas -Gracias Java, Gracias POO!!-.&lt;br /&gt;&lt;br /&gt;Por ahora los dejaré a que reflexionen sobre esto y me comenten sus ideas, pero regresaré para continuar con el codigo para cada uno de los 3 integrantes de este primer condimento.&lt;br /&gt;&lt;br /&gt; Recuerden que nos falta mucho camino por recorrer para dar de alta a un articulo, pero cuando lo vean listo, se van a reir de lo facil que es realizarlo (No tanto entender todo lo que sucede internamente, pero eso es chamba del application server y entrega esta funcionalidad muy bien).&lt;br /&gt;&lt;br /&gt; Nos vemos en el siguiente post :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-113128886800444457?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/113128886800444457/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=113128886800444457' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113128886800444457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113128886800444457'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/11/ms-sobre-j2ee-entity-beans-un-primer.html' title='Más sobre J2EE - Entity Beans un primer cabezazo -'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-113063433137201561</id><published>2005-10-29T19:42:00.000-05:00</published><updated>2006-11-03T11:13:29.264-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Head First EJB Parte III</title><content type='html'>Finalizando la trilogía del primer tutorial de j2ee del libro de Head First EJB les platico lo siguiente, después de 2 semanas y media, he logrado el éxito, hasta le agregué un archivo jsp y pude facilmente llamar al metodo que devolvía una especie de "hola mundo" ( aunque en realidad era una cadena de texto sacada de un array con un indice aleatorio que te daba una especie de consejo aleatorio ).&lt;br /&gt;&lt;br /&gt;Sin embargo, aqui hay algunos puntos que tuve que realizar para llegar a este punto:&lt;br /&gt;&lt;br /&gt;1) Existe un bug en una clase de CORBA del j2ee 1.4 que cuando uno está probando desconectado de la red ( o te conectas a una red diferente de la que estabas cuando se instaló el application server ), sale un error del RMI_IIOP "IOP42..." porque hace referencia al host original, en mi caso que uso infinitum me pone un nombre de host con xxxxxx.2wire.net.&lt;br /&gt;&lt;br /&gt;  Esto se resuelve de la siguiente manera:&lt;br /&gt;Entra a tu carpeta de instalación del application server ( c:\sun\appserver\ ... si lo se, windows, mea culpa mea culpa ). y en la carpeta \domains\domain1\config hay un archivo sun-acc.xml qeu si lo abres y lo editas donde dice target-server para que apunte a localhost quedandote asi:&lt;br /&gt;&lt;br /&gt;&lt;target-server name="localhost" address="localhost" port="3700"&gt;  target-server name="localhost" address="localhost" port="3700"&lt;br /&gt;&lt;br /&gt; Con ello podrás seguir adelante sin problemas de conexion a una red para probar tus ejb's.&lt;br /&gt;&lt;br /&gt;2) Otro problema que me encontré es que si duplicas las referencias a ejb como dice el libro sale un error del java.naming&lt;br /&gt;Ponle un nombre diferente a cada uno y recuerda que cada cliente va a tener uno propio y ese es el que debe de tomar en la parte del initialContext.lookup( "ejb/nombreRecurso" )&lt;br /&gt;&lt;br /&gt;------&lt;br /&gt;&lt;br /&gt;Puedo mencionarles estos dos problemas por ahora, pero en realidad fueron mas, principalmente porque no puse throws java.rmi.RemoteException despues de los metodos y me marcaba warnings, pero no quiero asegurarles nada porque esa parte no venia en el libro, tal vez estoy saliendome de la especificacion del EJB actual (marca un warning que indica que si le pones throws java.rmi.RemoteException te recomienda que mejor sea javax.ejb.EJBExteption o algo por el estilo compatible con la especificacion EJB 1.1 y no la 1.0 )&lt;br /&gt;&lt;br /&gt;En fin, cabe señalar que no podría haber logrado hacer funcionar el ejemplo si no me hubiera dedicado a realizar el primer ejemplo del tutorial oficial de j2ee 1.4&lt;br /&gt;&lt;a href="http://java.sun.com/j2ee/1.4/docs"&gt;http://java.sun.com/j2ee/1.4/docs&lt;/a&gt;&lt;br /&gt;o directo al tutorial en html&lt;br /&gt;&lt;a href="http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html"&gt;http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bien, esto es todo en cuanto a este tema, regresaré con más cuando realice el siguiente tutorial sobre session beans.&lt;br /&gt;&lt;br /&gt;pero voy a tardar un poco... primero tengo que hacer tareas para terminar este semestre de la maestria. deseenme suerte.&lt;br /&gt;&lt;br /&gt;Saludos.!&lt;/target-server&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-113063433137201561?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/113063433137201561/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=113063433137201561' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113063433137201561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/113063433137201561'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/10/head-first-ejb-parte-iii.html' title='Head First EJB Parte III'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112957248855436515</id><published>2005-10-17T12:19:00.000-05:00</published><updated>2006-11-03T11:13:29.204-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Cantando antes de tiempo - Libro Head First EJB Parte II</title><content type='html'>la buena noticia es qeu ya estoy aprendiendo un poco más de J2EE, y me gusta mucho el reto... la mala noticia es que no pude hacer funcionar el ejemplo del AdviceGuy del libro.. así que tomé mis &lt;em&gt;cachivaches &lt;/em&gt;y busqué un tutorial, al fin y a lcabo lo único que necesito es pasar de la primera parte... no es cierto?&lt;br /&gt;&lt;br /&gt; Pues no fue cierto!!!&lt;br /&gt;&lt;br /&gt; En esta parte les platico algo interesante, el deploytool que trae el J2EE me ayudó muchisimo al menos para que pudiera crear un ejb y correrlo desde la interfaz de comandos (Sí ya sé, sigo en windows, mea culpa, mea culpa). Pero el tutorial de J2EE es buenísimo así que haré como que no los escucho y sigo adelante con mi necedad de utilizar algo un poco más complicado para entregar una simple tarea...&lt;br /&gt;&lt;br /&gt; Resumen de la parte 1 y 2 por pasos&lt;br /&gt;&lt;br /&gt; 1) Baja el J2EE&lt;br /&gt; 2) Instala el J2EE, no olvides tu nombre de usuario y contraseña... y otuve que desinstalarlo y volver a instalarlo para poder "acordarme".&lt;br /&gt; 3) Ve a la página &lt;a href="http://java.sun.com/j2ee/1.4/docs/tutorial/doc/"&gt;http://java.sun.com/j2ee/1.4/docs/tutorial/doc/&lt;/a&gt;&lt;br /&gt; 4) Busca en el menú de la izquierda  &lt;a href="http://java.sun.com/j2ee/1.4/docs/tutorial/doc/EJBConcepts.html#wp80377"&gt;Chapter 23:   Enterprise Beans&lt;/a&gt; y lee un poco sobre los tipos de EB's que existen, cuando utilizar EJB's etc.&lt;br /&gt;....&lt;br /&gt; 5) Si estás desesperado como yo y no te importa aprender dando tumbos como podrás haber visto que yo estoy aprendiento entonces: Copia los ejemplos del Capitulo 24 a los archivos correspondientes&lt;br /&gt; 6) Sigue las instrucciones... muchas instrucciones pero muy faciles (si ya tienes los archivos del ejemplo copiados y el deploytool de j2ee que viene al instalarlo)... recuerda que el principal problema es que te saltes algunos pasos...&lt;br /&gt;&lt;br /&gt; 7) package converter;  ... no viene en el ejemplo pero ponselo a todos los archivos copiados para qeu puedas correrlo sin problemas y continuar... no se porque alguien no lo reviso y lo corrio... bueno, al menos no se como hicieron para que funcione... la pagina web con JSP fallaría si no se pone el package y sin embargo no lo pusieron... sin embargo, si hacen referencia a ello diciendote que compiles en build/converter... asi que ahi estuvo donde yo le inclui el package... me imagino que podia haber sido de las dos formas...&lt;br /&gt;&lt;br /&gt; a) con javac -d build/converter (y sin el package)&lt;br /&gt; b) con javac -d build y poniendole package a todos los archivos ( incluyendo al cliente para compilar todo de madrazo... perdon por lo de "todo" ) jejeje.. que dijeron que me disculparía por decir de madrazo?... nah!... por cierto, que eso sería de la siguiente manera:&lt;br /&gt;     javac -d build src/*.java&lt;br /&gt;&lt;br /&gt; Es una bonita herramienta el javac... solo hay que darle -d &lt;directorio&gt; para que no hagamos un mess, por eso siempre utilicen separacion de los .java y los .class&lt;br /&gt; off Topic pero siempre dentro del tema de java, he llegado a pensar recientemente que los .java que ponemos en la carpeta src no tienen porque estar en subfolders (si no es un proyecto muy grande) y leugo solo con darle &lt;em&gt;javac -d build src/*.java &lt;/em&gt;&lt;br /&gt;obtendremos una estructura dentro de la carpeta build descrita por los package... me encanta hablar del package y de ljavac verdad... es que es una bonita herramienta... siempre es mejor aprender con la interfaz de comandos... (Ay!.. perdón!, aprender desde consola!, ya sé ya sé, fuchi windows)... pero esto del J2EE les recomiendo que si lo manejen según el tutorial con el uso de deploytool para lacreación del .ear, del .jar y del .war del ejemplo... pa' no andar creando XML  de cada paquete.&lt;br /&gt;&lt;br /&gt; Bueno, ya me extendí y me fuí por la tangente... pero no tengo mucho que decirles de bueno, compilé el ejemplo, resolví unos problemas de configuración y listo, al menos desde la ocnsola funcionó... La pagina web fue otro... problema...&lt;br /&gt;&lt;br /&gt; Copie el ejemplo y segui los pasos marcados por el tutorial pero hasta ahorita no resuelvo el principal problema... el throw debe de ser capturado en la linea de new InitialContext... mhmhhm.... averigue por ahi y me salieron otros ejemplos que incluyen en el ConverterBean un metodo ejbCreate con throw javax.ejb.CreateException, java.rmi.RemoteException&lt;br /&gt;&lt;br /&gt; Creo que eso se repite en lso demas archivos... pero todavia no logro hacerlo funcionar... en fin... aqui me quedé y aunque me encantan las trilogías no quería hacer estos blogs tan de suspenso... lo siento, se que ya estan hasta la... coronilla de ver películas como L.O.T. Rings, Matrix, Harry Potter, ahora con Narnia igual entre otras 3++logías.&lt;br /&gt;&lt;br /&gt;Yo no me quejo, a veces, es muy dificil poder decir algo en pocas palabras...&lt;br /&gt; He ahi la verdadera sabiduria, por ahorita, si me preguntan, J2EE sigue siendo un misterio, pero creo que es cuestión de tiempo antes de que haga funcionar la parte de web que quiero para hacer mi tarea, bueno, ambas partes, web, y aplicacion de cliente con JSwing, y si tenemos tiempo le ponemos un frente con moviles utilizando J2ME, quien sabe, tal vez lo logremos...&lt;br /&gt;&lt;br /&gt; Saludos !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112957248855436515?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.sun.com/j2ee/1.4/docs/tutorial/doc/' title='Cantando antes de tiempo - Libro Head First EJB Parte II'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112957248855436515/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112957248855436515' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112957248855436515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112957248855436515'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/10/cantando-antes-de-tiempo-libro-head.html' title='Cantando antes de tiempo - Libro Head First EJB Parte II'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112913744747758353</id><published>2005-10-12T11:41:00.000-05:00</published><updated>2006-11-03T11:13:29.115-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>J2EE, Libro Head First EJB Parte I</title><content type='html'>Siguiendo mi fanatismo por los libros de la serie Head First, recientemente adquirí los de Head First EJB y Head First JSP y Servlets, por ahora estoy iniciando con la lectura del libro de EJBs, pero dejenme platicarles mis primeras impresiones.&lt;br /&gt;&lt;br /&gt;El libro que para mi es el segundo que leo de la serie, ya que comence con el de patrones de diseño, resulta justo lo que esperaba en cuanto al formato, pero de entrada me dan a resolver unas cuantas preguntas sobre lo que voy entendiendo y esta vez ya estoy preparado y me fijo en los detalles, contesto confiadamente las preguntas sobre los diferentes tipos de EJB's y cuando llego al codigo que si no es un clásico &lt;span style="font-style: italic;"&gt;Hola Mundo&lt;/span&gt;, se le parece mucho, termino de copiar y entender la forma de interactuar de un EJB y su interfaz Home y Component, y ( muchos y's ) compilo... primera tacha... una espantosa equis! (aprox unos 12 errores)&lt;br /&gt;&lt;br /&gt;Para todos aquellos newbies incluyendome aqui les doy mis 2 centavos de ayuda en esta parte, si el error fue en el import javax.ejb.*; sigan las instrucciones de esta página (http://java.sun.com/developer/onlineTraining/&lt;br /&gt;J2EE/Intro2/servlet/servlet.html).&lt;br /&gt;se pueden dar cuenta que hay que crear en el classpath un J2EE_HOME con la ruta hacia el lib de su aplication server, en mi caso bajé el j2ee 1.4 de http://java.sun.com/j2ee y luego en la opcion de &lt;span style="font-style: italic;"&gt;get the SDK&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La instalacion del J2EE fue mucho antes y ahi no hubo problema, puesto que ya sea en linux o en windows la instalación es cuestión de clicks y una serie de configuraciones muy sencillas (cuenta y password por ejemplo y un puerto por si tenemos ocupado el 80 por algun web server).&lt;br /&gt;&lt;br /&gt;Finalmente, despues de darle el classpath vino el enfrentamiento con la compilación, aqui la recomendación del artículo es hacer lo siguiente javac -d classes headfirst/*.java tomando en cuenta que debemos de estar FUERA de donde está nuestra carpeta con los .java - normalmente creamos una carpeta src (como lo hace netbeans o eclipse) y en ella se encuentran otras dos carpetas, una es la del codigo (que despues de compilar tendra sus .class ahi mismo, en este caso la carpeta headfirst) y otra la de META-INF donde va el archivo XML de descripcion del EJB -.&lt;br /&gt;&lt;br /&gt;Tuve algunos errores de dedo, se me ocurrio cambiarle el paquete al RemoteException del ejemplo de java a javax.... ahi estuvo la espantosa EQUIS!!!... pero en fin, resuelto ese problema, se me olvidó hacer override al método setSessionContext (Niubi error lo sé) y finalmente ponerle el PUNTO a javac -d PUNTO headfirst/*.java, el PUNTO crea los directorios descritos por el package en nuestro codigo de java a partir de la carpeta actual, en este caso, yo puse package headfirst, y compile desde una carpeta arriba llamada src, lo cual significa (adivinaste?) que los .class quedarían en la carpeta headfirst donde estaban los .java...&lt;br /&gt;&lt;br /&gt;Tiempo aprox para llegar a estas conclusiones, 4 horas, ... mi ignorancia vencida, mi orgullo intacto, mi hijo sigue durmiendo, y hoy es un dia sin trabajo... que más puedo pedir en la vida... ah si!!! crear el .jar... todavía no hemos terminado... esto de los EJB's no son enchiladas me cae...&lt;br /&gt;&lt;br /&gt;Continuemos... para todos aquellos que no saben utilizar el jar aqui les paso esta pagina donde vi el ejemplo y pude crear mi ejb.jar del primer ejemplo del libro, conste que el libro no menciona nada de esto, una terrible tacha, pero gustoso tomé el reto, el problema solo es llenar los espacios vacios, pero son muy obvios y solo hay que googlear o guglear un rato para encontrar las respuestas. Asi que, aqui mismo, en tiempo real, voy a crear el .jar del ejb... abriendo interfaz de comandos (si ya se, estoy en windows, mea culpa, mea culpa).&lt;br /&gt;&lt;br /&gt;El articulo de donde tomo este ejemplo es http://openejb.codehaus.org/Hello+World&lt;br /&gt;&lt;br /&gt;jar cvf myHelloEjb.jar org META-INF&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/javacAdviceGuyHeadFirstEJB1.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/javacAdviceGuyHeadFirstEJB1.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;solo cambio org por headfirst no?&lt;br /&gt;&lt;br /&gt;Parece ser justo lo que necesito... asi que jar cvf Advice... mhmh... un problemita... se deben de separar las clases del codigo fuente... es una buena practica... y el libro si hace mencion de ello, escueta pero la hace... asi que asi me queda mi carpeta... la explicacion es mejor si se las doy graficamente:&lt;br /&gt;&lt;br /&gt;bueno ahora mejor paso la carpeta de META-INF arriba de src, para hacer el jar desde la carpeta AdviceGuy...&lt;br /&gt;&lt;br /&gt;jar cvf classes/headfisrt META-INF&lt;br /&gt;&lt;br /&gt;mhmh la salida no se parece a la del ejempo del articulo openejb... es porque estoy haciendo classes/headfirst al darle jar...&lt;br /&gt;&lt;br /&gt;mejor pasamos la carpeta adentro de classes les parece?...&lt;br /&gt;&lt;br /&gt;cd classes&lt;br /&gt;&lt;br /&gt;jar cvf headfirst META-INF&lt;br /&gt;&lt;br /&gt;esto es muy sencillo... y ya tengo mi primer jar creado para un EJB!! (sonidos algarábiosos como yeiy y jurray!)&lt;br /&gt;&lt;br /&gt;ahora viene el DEPLOYMENT!!!.... mhmh nos vemos mejor en la PARTE 2 de este blog... suerte y espero que se hayan diviertido.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112913744747758353?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.sun.com/j2ee' title='J2EE, Libro Head First EJB Parte I'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112913744747758353/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112913744747758353' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112913744747758353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112913744747758353'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/10/j2ee-libro-head-first-ejb-parte-i.html' title='J2EE, Libro Head First EJB Parte I'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112775738626977146</id><published>2005-09-26T12:49:00.000-05:00</published><updated>2006-11-03T11:13:29.049-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>AJAX Javascript y XML asincrono</title><content type='html'>Bueno suena interesante, es un tema candente, google lo utiliza para una respuesta rápida al usuario de sus páginas web y AJAX parece ser la respuesta al problema de que la web parezca lenta ( dicen que la web le tiene envidia a las aplicaciones desktop por responder tan rápido al usuario ).&lt;br /&gt;&lt;br /&gt; Pero no puedo echar mucho rollo sobre el tema, esto mas bien es un recordatorio para mi mismo, y si quiero aprender este tema que se oye interesante, ya que no solo es javascript y xml sino también DOM, CSS, XHTML, los XMLHTTPREQUEST y las llamadas asincronas entre la vista web y los datos.&lt;br /&gt;&lt;br /&gt; *** En fin, una solucion para convertir controles de ASP.NET a controles AJAX para los C#peros:&lt;br /&gt;&lt;br /&gt;http://www.codeproject.com/useritems/MagicAJAX.asp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; *** y una breve introduccion a AJAX:&lt;br /&gt;http://www.adaptivepath.com/publications/essays/archives/000385.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Saludos, espero adentrarme pronto más en este tema.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112775738626977146?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112775738626977146/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112775738626977146' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112775738626977146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112775738626977146'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/09/ajax-javascript-y-xml-asincrono.html' title='AJAX Javascript y XML asincrono'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112761271241236056</id><published>2005-09-24T20:40:00.000-05:00</published><updated>2006-11-03T11:13:28.986-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Quién es Jorge Baroudi Perezmilicua?</title><content type='html'>La mejor forma de platicarles de mí es definiéndoles en una lista algunos trabajos anteriores que he tenido y algunas otras cosas más.&lt;br /&gt;&lt;br /&gt;*Former Starcraft Terran Marine&lt;br /&gt;&lt;br /&gt;*Former Starcraft enhanced Zergling ( crackling )&lt;br /&gt;&lt;br /&gt;*Patriarc Diablo 2 Amazon, and Sorcerer.&lt;br /&gt;&lt;br /&gt;*Champion Diablo 2 all characters ( not with a necromancer )&lt;br /&gt;&lt;br /&gt;*Former Warcraft 3 undead tyran frost&lt;br /&gt;&lt;br /&gt;*Wanna-be Blizzard game beta tester&lt;br /&gt;&lt;br /&gt;*Crazy Unreal Tournament player ( smashing foes with the hammer weapon )&lt;br /&gt;&lt;br /&gt;*Design Pattern fan&lt;br /&gt;&lt;br /&gt;*Java "wanna-be" full time job programmer.&lt;br /&gt;&lt;br /&gt;*An XML specification at w3.com ( yeah right! )&lt;br /&gt;&lt;br /&gt;*Linux newbie ( the die hard fan of games part of me died a few years ago )&lt;br /&gt;&lt;br /&gt;*Php close to MVC but not there yet, still on a n-tier approach to architectural design.&lt;br /&gt;&lt;br /&gt;*Javascript police department&lt;br /&gt;&lt;br /&gt;*Member of the Css consortium for using Css not HTML properties&lt;br /&gt;&lt;br /&gt;*DOM newbie&lt;br /&gt;&lt;br /&gt;*AJAX user without the X part, yet... (Hey!!! i'm a DOM neewbie, so chill, i'm still learning ok!)&lt;br /&gt;&lt;br /&gt;*MSDN 2nd star developer in C# ( waste of time, only for the webservices and the XML part ).&lt;br /&gt;&lt;br /&gt;*Nacido el mismo día y año que el guitarrista de Children Of Bodom ( www.cobch.com )&lt;br /&gt;&lt;br /&gt;*Former owner of an Ibanez RG470BK Made in Japan&lt;br /&gt;&lt;br /&gt;*Owner of a Marshall 60 WATTS RMS Amplificator and a GNX 1 ( Anyone wants to buy? )&lt;br /&gt;&lt;br /&gt;*Feature Driven Development Developer (hoping to be the language guru or the Chief Programmer)&lt;br /&gt;&lt;br /&gt;... Y le iré aumentando.&lt;br /&gt;&lt;br /&gt;( La versión en español pronto :p )&lt;br /&gt;( NOTA: Many are Joke Muchas son broma, Others not otras no )&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/2124/1078/320/Tempshot0002.jpg" alt="" 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/12620014-112761271241236056?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112761271241236056/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112761271241236056' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112761271241236056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112761271241236056'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/09/quin-es-jorge-baroudi-perezmilicua.html' title='Quién es Jorge Baroudi Perezmilicua?'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112681758131440701</id><published>2005-09-15T15:25:00.000-05:00</published><updated>2006-11-03T11:13:28.927-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Manejo de eventos en Java, tarea con MouseListeners</title><content type='html'>Siempre tuve problemas para entender el proposito de listeners y adapters en Java por una simple y llana razón, no sabía bien que estaba haciendo cuando los utilizaba!.&lt;br /&gt;&lt;br /&gt;En serio!, resulta dificil entender tantas opciones que tiene uno para el manejo de los eventos en Java. Pero gracias a los patrones de diseño ahora entiendo un poco mejor... un poco... jejeje.&lt;br /&gt;&lt;br /&gt;Los manejadores de eventos se ven casi siempre acompañados de la palabra Listeners, y están basados en el patrón de diseño Observer, siendo estos los observadores y el sujeto a observar es el evento en cuestión.&lt;br /&gt;&lt;br /&gt;Podemos añadirnos como observadores del evento al utilizar los metodos de los JFrames por ejemplo addMouseListener, addMouseMotionListener etc, e implementar uno o varios suscriptores ( diferentes clases, de preferencia que no sean anonimas ) a la lista de observadores.&lt;br /&gt;&lt;br /&gt;Lo importante sería realizar esta tarea para resolver algún problema en particular, y el problema fué, mi tarea. Por ende les dejo un codigo completo que hice para implementar un dibujo de un rectangulo que se estira mientras movemos el mouse (Mouse Dragged ) , o le quitamos el efecto y solo se dibuja hasta soltar el mouse ( Mouse Released ).&lt;br /&gt;&lt;br /&gt;Este ejemplo tal vez les sirva para alguna tarea que les pidan o mejor aun, tal vez les guste comentar que les pareció la solución de dibujar el rectangulo, ya que en ambos metodos released y dragged se hacen las mismas operaciones con el rectangulo para dibujarlo.&lt;br /&gt;&lt;br /&gt;En fin, sin mayor espera, aqui esta el codigo.&lt;br /&gt;&lt;br /&gt;Espero sus preguntas y comentarios, el codigo está tal y como lo entregué y si alguna parte no entienden con mucho gusto se las explico, si alguien tiene una solución con patrones de diseño será bienvenida! por ejemplo utilizar un strategy o algo por el estilo.&lt;br /&gt;&lt;br /&gt;saludos y happy rubberbanding!&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;/* JRubberband.java*/&lt;br /&gt;import java.awt.Graphics;&lt;br /&gt;import java.awt.Point;&lt;br /&gt;import java.awt.event.ItemEvent;&lt;br /&gt;import java.awt.event.ItemListener;&lt;br /&gt;import java.awt.event.MouseEvent;&lt;br /&gt;import java.awt.event.MouseListener;&lt;br /&gt;import java.awt.event.MouseMotionListener;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author  root&lt;br /&gt; */&lt;br /&gt;public class JRubberband extends javax.swing.JFrame {&lt;br /&gt;   &lt;br /&gt;    private Rectangulo rectangulo;&lt;br /&gt;&lt;br /&gt;    private Point pivoteRectangulo; // cundo se hace mousePressed&lt;br /&gt;    &lt;br /&gt;    private MouseAdapterImplementation mouseAdapterImplementation;&lt;br /&gt;    &lt;br /&gt;    // Variables declaration - do not modify//GEN-BEGIN:variables&lt;br /&gt;    private javax.swing.ButtonGroup btnGroup;&lt;br /&gt;    protected javax.swing.JRadioButton rbConEfectoLiga;&lt;br /&gt;    protected javax.swing.JRadioButton rbSinEfectoLiga;&lt;br /&gt;    // End of variables declaration//GEN-END:variables&lt;br /&gt;&lt;br /&gt;    /** Creates new form PreRubberband */&lt;br /&gt;    public JRubberband( boolean conEfectoLiga ) {&lt;br /&gt;        &lt;br /&gt;        super( "Tarea de Rectangulo dibujado con mouse ( Rubberband )" );&lt;br /&gt;&lt;br /&gt;        rectangulo = new Rectangulo();&lt;br /&gt;&lt;br /&gt;        pivoteRectangulo = new Point();&lt;br /&gt;        &lt;br /&gt;        mouseAdapterImplementation = new MouseAdapterImplementation();&lt;br /&gt;&lt;br /&gt;        // siempre se utiliza para el evento MousePressed&lt;br /&gt;        &lt;br /&gt;        addMouseListener( mouseAdapterImplementation );    &lt;br /&gt;        &lt;br /&gt;        if ( conEfectoLiga )&lt;br /&gt;        {&lt;br /&gt;            addMouseMotionListener( mouseAdapterImplementation );    &lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        initComponents();&lt;br /&gt;        &lt;br /&gt;        this.setSize( 800, 600 );&lt;br /&gt;        &lt;br /&gt;        rbConEfectoLiga.setSelected( conEfectoLiga );&lt;br /&gt;        &lt;br /&gt;        rbSinEfectoLiga.setSelected( !conEfectoLiga );&lt;br /&gt;&lt;br /&gt;        rbConEfectoLiga.addItemListener( new RadioButtonHandler( true ) );&lt;br /&gt;        rbSinEfectoLiga.addItemListener( new RadioButtonHandler( false ) );&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private class MouseAdapterImplementation implements MouseListener, MouseMotionListener&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        public void mousePressed( MouseEvent e )&lt;br /&gt;        {&lt;br /&gt;            // el evento de mousePressed determina el pivote.&lt;br /&gt;            pivoteRectangulo = e.getPoint();&lt;br /&gt;            rectangulo.setLeft( e.getPoint().x );&lt;br /&gt;            rectangulo.setTop( e.getPoint().y );&lt;br /&gt;            rectangulo.setRight( e.getPoint().x );&lt;br /&gt;            rectangulo.setBottom( e.getPoint().y );&lt;br /&gt;        }&lt;br /&gt;      &lt;br /&gt;        public void mouseReleased( MouseEvent e )&lt;br /&gt;        {&lt;br /&gt;            // hay que identificar el sector basandonos en el punto pivote&lt;br /&gt;            // y luego hay que cambiar los valores del rectagulo segun el sector&lt;br /&gt;            // finalmentee hay que mandar a repintar el rectangulo&lt;br /&gt;            intercambiarPuntosRectangulo( e.getPoint() );&lt;br /&gt;            repaint();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void mouseDragged(MouseEvent e) &lt;br /&gt;        {&lt;br /&gt;            intercambiarPuntosRectangulo( e.getPoint() );&lt;br /&gt;            repaint();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void mouseMoved(MouseEvent e) {}&lt;br /&gt;&lt;br /&gt;        public void mouseExited(MouseEvent e) {}&lt;br /&gt;&lt;br /&gt;        public void mouseEntered(MouseEvent e) {}&lt;br /&gt;&lt;br /&gt;        public void mouseClicked(MouseEvent e) {}&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // private inner class to handle radio button events&lt;br /&gt;    private class RadioButtonHandler implements ItemListener {&lt;br /&gt;&lt;br /&gt;        private boolean addTheListener;&lt;br /&gt;        &lt;br /&gt;        public RadioButtonHandler( boolean addTheListener )&lt;br /&gt;        {&lt;br /&gt;            this.addTheListener = addTheListener;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        // handle radio button events&lt;br /&gt;        public void itemStateChanged( ItemEvent event )&lt;br /&gt;        {&lt;br /&gt;            if ( addTheListener &amp;&amp; getMouseMotionListeners().length == 0 )&lt;br /&gt;            {&lt;br /&gt;                addMouseMotionListener( mouseAdapterImplementation );&lt;br /&gt;            }&lt;br /&gt;            else if ( !addTheListener &amp;&amp; getMouseMotionListeners().length == 1 )&lt;br /&gt;            {&lt;br /&gt;                removeMouseMotionListener( mouseAdapterImplementation );&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    } // end private inner class RadioButtonHandler&lt;br /&gt;&lt;br /&gt;   private int identificarSector( Point punto )&lt;br /&gt;    {&lt;br /&gt;        int sector = 0;&lt;br /&gt;        &lt;br /&gt;       // si soltaron el mouse en el cuadrante 1 &lt;br /&gt;        if ( punto.x &lt; pivoteRectangulo.x &amp;&amp; punto.y &lt; pivoteRectangulo.y )&lt;br /&gt;        {&lt;br /&gt;            sector = 1;&lt;br /&gt;        }&lt;br /&gt;        // si soltaron el mouse en el cuadrante 2&lt;br /&gt;        else if ( punto.x &gt; pivoteRectangulo.x &amp;&amp; punto.y &lt; pivoteRectangulo.y )&lt;br /&gt;        {&lt;br /&gt;            sector = 2;&lt;br /&gt;        }&lt;br /&gt;        // si soltaron el mouse en el cuadrante 3&lt;br /&gt;        else if ( punto.x &gt; pivoteRectangulo.x &amp;&amp; punto.y &gt; pivoteRectangulo.y )&lt;br /&gt;        {&lt;br /&gt;            sector = 3;&lt;br /&gt;        }&lt;br /&gt;        // si soltaron el mouse en el cuadrante 4&lt;br /&gt;        else if ( punto.x &lt; pivoteRectangulo.x &amp;&amp; punto.y &gt; pivoteRectangulo.y )&lt;br /&gt;        {&lt;br /&gt;            sector = 4;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return sector;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void intercambiarPuntosRectangulo( Point punto )&lt;br /&gt;    {&lt;br /&gt;        int sector;&lt;br /&gt;        &lt;br /&gt;        sector = identificarSector( punto );&lt;br /&gt;        &lt;br /&gt;        switch ( sector )&lt;br /&gt;        {&lt;br /&gt;            case 1:&lt;br /&gt;                rectangulo.setLeft( punto.x );&lt;br /&gt;                rectangulo.setTop( punto.y );&lt;br /&gt;                break;&lt;br /&gt;            case 2:&lt;br /&gt;                rectangulo.setRight( punto.x );&lt;br /&gt;                rectangulo.setTop( punto.y );&lt;br /&gt;                break;&lt;br /&gt;            case 3:&lt;br /&gt;                rectangulo.setRight( punto.x );&lt;br /&gt;                rectangulo.setBottom( punto.y );&lt;br /&gt;                break;&lt;br /&gt;            case 4:&lt;br /&gt;                rectangulo.setLeft( punto.x );&lt;br /&gt;                rectangulo.setBottom( punto.y );&lt;br /&gt;                break;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /** This method is called from within the constructor to&lt;br /&gt;     * initialize the form.&lt;br /&gt;     * WARNING: Do NOT modify this code. The content of this method is&lt;br /&gt;     * always regenerated by the Form Editor.&lt;br /&gt;     */&lt;br /&gt;    // &lt;editor-fold defaultstate="collapsed" desc=" Generated Code "&gt;//GEN-BEGIN:initComponents&lt;br /&gt;    private void initComponents() {&lt;br /&gt;        btnGroup = new javax.swing.ButtonGroup();&lt;br /&gt;        rbSinEfectoLiga = new javax.swing.JRadioButton();&lt;br /&gt;        rbConEfectoLiga = new javax.swing.JRadioButton();&lt;br /&gt;&lt;br /&gt;        getContentPane().setLayout(new java.awt.FlowLayout());&lt;br /&gt;&lt;br /&gt;        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);&lt;br /&gt;        btnGroup.add(rbSinEfectoLiga);&lt;br /&gt;        rbSinEfectoLiga.setText("Sin efecto de liga Ej. 13.27");&lt;br /&gt;        getContentPane().add(rbSinEfectoLiga);&lt;br /&gt;&lt;br /&gt;        btnGroup.add(rbConEfectoLiga);&lt;br /&gt;        rbConEfectoLiga.setText("Con efecto de liga Ej. 13.28");&lt;br /&gt;        getContentPane().add(rbConEfectoLiga);&lt;br /&gt;&lt;br /&gt;        pack();&lt;br /&gt;    }&lt;br /&gt;    // &lt;/editor-fold&gt;//GEN-END:initComponents&lt;br /&gt;    &lt;br /&gt;    /*Metodo paint*/&lt;br /&gt;    public void paint( Graphics g )&lt;br /&gt;    {&lt;br /&gt;        super.paint( g );&lt;br /&gt;&lt;br /&gt;        if ( rectangulo != null )&lt;br /&gt;        {&lt;br /&gt;            g.drawRect( rectangulo.getLeft(), rectangulo.getTop(), rectangulo.getWidth(), rectangulo.getHeight() );&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * @param args the command line arguments&lt;br /&gt;     */&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        JRubberband jrub = new JRubberband( true );&lt;br /&gt;        jrub.setVisible( true );&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt; Y la clase rectangulo:&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;br /&gt;&lt;br /&gt;/* Rectangulo.java */&lt;br /&gt;import java.awt.Point;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; *&lt;br /&gt; * @author Jorge Baroudi&lt;br /&gt; */&lt;br /&gt;public class Rectangulo {&lt;br /&gt;&lt;br /&gt;    private int top, left, right, bottom;&lt;br /&gt;    private int width, height;&lt;br /&gt;    &lt;br /&gt;    public Rectangulo()&lt;br /&gt;    {&lt;br /&gt;        this( 0, 0, 0, 0 );&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public Rectangulo( int left, int top, int right, int bottom ) {&lt;br /&gt;        this.left = left;&lt;br /&gt;        this.top = top;&lt;br /&gt;        this.right = right;&lt;br /&gt;        this.bottom = bottom;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getTop() { return this.top; }&lt;br /&gt;&lt;br /&gt;    public int getLeft() { return this.left; }&lt;br /&gt;&lt;br /&gt;    public int getRight() { return this.right; }&lt;br /&gt;&lt;br /&gt;    public int getBottom() { return this.bottom; }&lt;br /&gt;    &lt;br /&gt;    public int getWidth() { return this.width; }&lt;br /&gt;&lt;br /&gt;    public int getHeight() { return this.height; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    public void setTop( int top ) { this.top = top; calcularHeight(); }&lt;br /&gt;&lt;br /&gt;    public void setLeft( int left ) { this.left = left; calcularWidth(); }&lt;br /&gt;&lt;br /&gt;    public void setRight( int right ) { this.right = right; calcularWidth(); }&lt;br /&gt;&lt;br /&gt;    public void setBottom( int bottom ) { this.bottom = bottom; calcularHeight(); }&lt;br /&gt;    &lt;br /&gt;    public void setWidth( int width ) { this.width = width; }&lt;br /&gt;&lt;br /&gt;    public void setHeight( int height ) {  this.height = height; }&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    private void calcularWidth() { this.width = Math.abs( this.left - this.right ); }&lt;br /&gt;&lt;br /&gt;    private void calcularHeight() { this.height = Math.abs( this.top - this.bottom ); }&lt;br /&gt;&lt;br /&gt;}&lt;br /&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/12620014-112681758131440701?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112681758131440701/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112681758131440701' title='6 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112681758131440701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112681758131440701'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/09/manejo-de-eventos-en-java-tarea-con.html' title='Manejo de eventos en Java, tarea con MouseListeners'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112619248280294642</id><published>2005-09-08T09:55:00.000-05:00</published><updated>2006-11-03T11:13:28.872-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación ágil'/><title type='text'>Refactoring, ¿Y en español... refactorizando?</title><content type='html'>La refactorización -- &lt;a href="http://www.refactoring.org"&gt;refactoring&lt;/a&gt; -- es un tema interesante con &lt;a href="http://wiki.java.net/bin/view/People/SmellsToRefactorings"&gt;buenas prácticas para todas las modificaciones internas&lt;/a&gt; que se hacen a un sistema, desde un cambio de nombre de campo en una tabla de la base de datos, hasta un cambio de los parametros de un metodo de una clase.&lt;br /&gt;&lt;br /&gt; En cualquiera de estas capas qeu se haga un cambio -- interno -- el comportamiento del sistema no debe de variar. Pero, ¿Porque se hacen estos cambios internos?, muchas veces el dominio que se maneja -- las palabras y elementos para comunicarnos con los usuarios -- difieren y luego terminamos por aplicar palabras para métodos que son ambiguos en el contexto, dicho de otra manera en un ejemplo practico, &lt;em&gt;direccion&lt;/em&gt; puede ser una elemento que indique un domicilio, un nombre de un dirigente, un lugar o un curso hacia un destino -- norte, sur, etc --. En este caso, la selección de palabras debe de estar lo más apegada al contexto y que difiera de de otros términos para evitar la ambiguedad.&lt;br /&gt;&lt;br /&gt; Las buenas prácticas en este sentido se pueden dar desde un principio con un poco de planeación, pero si no se realiza un análisis minucioso en este tipo de problemas entonces es cuando la refactorización entra a escena. No es mi tema de conocimiento amplio pero lo he utilizado en herramientas como Eclipse y Netbeans, donde en vez de un simple reemplazo de palabras -- direccion por domicilio por ejemplo -- identifica el contexto en el que es utilizado y lo relaciona con su uso, de manera tal que si es una variable de una clase o el nombre de un metodo, busque todas las incidencias -- no coincidencias -- de esa variable o metodo en todo un proyecto y luego propone el cambio dandonos la oportunidad de decirle antes si queremos o no refactorizar nuestro código.&lt;br /&gt;&lt;br /&gt; Pruebenlo!, les doy los links para bajar &lt;a href="http://www.netbeans.org"&gt;Netbeans&lt;/a&gt; y &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;, son gratis, estan hechos en Java por lo tanto son un poco pesados para correr, asegurense que tengan 512 MB de RAM o mas para no tener problemas, principalmente con el Netbeans. En fin, estas aplicaciones tienen la opción integrada de refactorización, que si bien no es 100% segura de que cambie las palabras perfectamente en el contexto que estamos trabajando, por lo menos hace un trabajo muy superior al de una simple opción de reemplazar.&lt;br /&gt;&lt;br /&gt; Saludos y happy refactoring!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112619248280294642?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://wiki.java.net/bin/view/People/SmellsToRefactorings' title='Refactoring, ¿Y en español... refactorizando?'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112619248280294642/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112619248280294642' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112619248280294642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112619248280294642'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/09/refactoring-y-en-espaol-refactorizando.html' title='Refactoring, ¿Y en español... refactorizando?'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112595795595926190</id><published>2005-09-05T16:56:00.000-05:00</published><updated>2006-11-03T11:13:28.812-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingeniería de Software'/><title type='text'>Calidad de software - 101</title><content type='html'>&lt;em&gt;Clase 101&lt;/em&gt; se refiere a una clase de introduccion a un tema. Este tema en particular -- interesante pero dificil de digerir -- implica cambiar muchas cosas que suceden a nuestro alrededor dia con dia que reducen la calidad del sotware que producimos. &lt;br /&gt;&lt;br /&gt;Sin embargo, el hacernos conscientes de estos sucesos nos motiva, en cierto modo, a estar alertas y a aprender a manejar las situaciones, que en otras circunstancias, manejariamos con desdén.&lt;br /&gt;&lt;br /&gt;Pero dejemos a un lado las generalizaciones y hablemos sobre algunos aspectos de la calidad de software antes de darles algunos links interesantes:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusiones sobre la calidad de software:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;o&lt;/strong&gt; Que la creación de software es un reto, ya que los humanos cometemos errores, sufrimos de falta de motivación para realizar mejoras y muchas veces perdemos la visión global de lo que estamos haciendo por concentrarnos en aspectos técnicos del proyecto.&lt;br /&gt;&lt;strong&gt;o&lt;/strong&gt; Que la calidad del software está definida por los usuarios del sistema no por el esfuerzo de los programadores para integrar técnicas o componentes que son el estado del arte.&lt;br /&gt;&lt;strong&gt;o&lt;/strong&gt; Que la calidad de software requiere atención constante, si no, el software no se adapta a nuevas necesidades, que en muchas ocasiones, el mismo software crea.&lt;br /&gt;&lt;strong&gt;o&lt;/strong&gt; Que la imposición de tiempo para terminar un software debe de ser determinada con base en un estudio de los elementos a integrar al software a desarrollar, no por cuestiones políticas para conservar al cliente potencial. &lt;br /&gt;&lt;strong&gt;o&lt;/strong&gt; Que la calidad de un software puede ser afectada por los requerimientos de los usuarios que cambian durante el desarrollo, ya que esto afecta nuestra intención como desarrolladores de entregar un producto terminado a tiempo. Para ello se utiliza una fase de análisis de riesgo previo a iniciar el desarrollo de un nuevo prototipo y proponer su tiempo de desarrollo.&lt;br /&gt;&lt;strong&gt;o&lt;/strong&gt; Que calidad no se trata de hacer solo lo que nos piden las especificaciones, ya que estas muchas veces no están definidas a detalle, para ello, se busca realizar lo que resuelva problemas en entregas paulatinas de prototipos. Con esto, gradualmente podremos conformar un producto completo que será más fácil de adaptar a las exigencias del usuario.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Modelos de desarrollo agiles vs robustos&lt;/strong&gt;&lt;br /&gt;Y bien, después de presentarles algunas conclusiones, a las que llegamos mi equipo de la clase de calidad de software y yo, hablemos de métodos ágiles versus métodos robustos. ¿Qué te gusta más o que se te hace mejor? ¿Hacer un análisis extenso de todos los procesos y luego entregar una primera versión o un análisis -- mas corto en tiempo -- de cada proceso con entregas de pequeños módulos funcionales? ¿los ciclos de desarrollo que tienen largos periodos de desarrollo antes de volver al analisis de requerimientos o los pequeños que duran menor tiempo en hacer todos los pasos y regresar al naálisis de requerimientos?.&lt;br /&gt;&lt;br /&gt;Como se imaginarán también hay medias tintas y muchos otros factores que intervienen en la decisión de como llevar a cabo un desarrollo de software.&lt;br /&gt;Los modelos que son &lt;a href="http://www.agilemodeling.com/essays/inclusiveModels.htm" target="_blank"&gt;ágiles ( Agile Model Driven Development )&lt;/a&gt; como el Extreme Programing, o el &lt;a href="http://www.featuredrivendevelopment.org/"&gt;feature driven development&lt;/a&gt; utilizan como tiempo de entrega hasta dos semanas, si no puede hacerse en ese rango de tiempo la entrega de un producto, entonces es partido en actividades mas pequeñas o &lt;em&gt;features&lt;/em&gt; para cumplir con dicho objetivo.&lt;br /&gt;&lt;br /&gt;En ingenieria de software se puede catalogar este tipo de modelos como de prototipo, y queda a discusión si realmente se pueden entregar productos de calidad con este tipo de ciclos de vida del software donde estamos presionados para entregar productos o prototipos en corto tiempo. &lt;br /&gt;&lt;br /&gt;Algunos determinan como un deporte extremo este tipo de programación, pero realmente las otras opciones de ciclos dedicados a un análisis extenso terminan siendo iguales cuando se acercan los &lt;em&gt;deadlines&lt;/em&gt; -- tiempos de entrega -- EMHO.&lt;br /&gt;&lt;br /&gt;Los invito a darse una vuelta por estas páginas, no olviden leer sus manifiestos para que entiendan bien que objetivos, no hay que cerrarnos a los diseños robustos puesto que ya sabemos a medida que experimentamos, que el desarrollo de software depende de habilidades como facilidad de expresión, facilidad de comprensión entre muchas otras habilidades, y no nada más de habilidad para programar.&lt;br /&gt;&lt;br /&gt;Saludos y feliz análisis de requerimientos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112595795595926190?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.robelle.com/library/papers/better/' title='Calidad de software - 101'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112595795595926190/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112595795595926190' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112595795595926190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112595795595926190'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/09/calidad-de-software-101.html' title='Calidad de software - 101'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112595195932109370</id><published>2005-09-05T14:54:00.000-05:00</published><updated>2006-11-03T11:13:28.756-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Diseño y CSS'/><title type='text'>CSS contra tablas y efectos javascript</title><content type='html'>Les puedo mencionar algunas cosas sobre lo importante que es CSS para el mundo de las páginas web. &lt;br /&gt;&lt;br /&gt;-Separa las propiedades del codigo HTML que le dan estilo a cada elemento y las organiza en clases que podemos crear segun nuestras necesidades.&lt;br /&gt;-Decrementa el tiempo de carga de una página ya que no hay formatos de estilo repetidos para cada elemento ( Una clase CSS puede definir el estilo de varios elementos HTML)&lt;br /&gt;-Permite crear muchos efectos que normalmente hacemos con javascript de manera mas sencilla, por ejemplo, menus horizontales y uno de mis favoritos que acabo de ver, image rollovers o cambio de imagen cuando pasamos el mouse encima - efecto conseguido con image slicing -.&lt;br /&gt;&lt;br /&gt;Este ultimo lo encontré en un sitio ( &lt;a href="http://www.alistapart.com/articles/sprites" target="_blank"&gt;alistapart.com&lt;/a&gt; ) que ha pasado a ser uno de mis favoritos por lo claro de sus ejemplos y me tiene pensando en cambiar a CSS lo que sea posible.&lt;br /&gt;&lt;br /&gt;Si siguen navegando por ahi encontrarán otros sitios interesantes, &lt;a href="http://www.sitepoint.com/" target="_blank"&gt;sitepoint.com&lt;/a&gt;, &lt;a href="http://www.thenoodleincident.com/" target="_blank"&gt;thenoodleincident.com&lt;/a&gt; y el &lt;a href="http://www.zeldman.com/" target="_blank"&gt;sitio de Zeldman&lt;/a&gt; por mencionar algunos.&lt;br /&gt;&lt;br /&gt;Cabe mencionar que los diferentes browsers actuales tienen diferencias al implementar especificaciones de w3c. Por ende, no se confien y prueben en cuantos puedan el resultado final. Sin embargo, de esto nos habla muy bien un &lt;a href="http://www.thenoodleincident.com/tutorials/design_rant/" target="_blank"&gt;blog entry&lt;/a&gt; donde dice que no debemos de ver a la web con ojos de 15" o 17" (pulgadas en los monitores mas comunes), sino tambien para browsers de puro texto, de solo audio para ciegos ( chequen la parte Aural de CSS: azimuth, elevation, etc ), PDA's, celulares, etc.&lt;br /&gt;&lt;br /&gt;En fin, en resumidas cuentas, ese blog entry que les menciono dice que veamos una pagina web como una cebolla!. Lo de adentro es lo mas sencillo y para browsers que tienen pocas capacidades como los de texto. &lt;br /&gt;&lt;br /&gt;A medida que nos movemos hacia afuera de la cebolla, capas y capas de extensiones (Por ejemplo mozilla firefox pudiera estar en la parte de mas afuera debido a sus extensiones de estilo con &lt;a href="http://www.xulplanet.com/" target="_blank"&gt;XUL&lt;/a&gt;) dependientes de cada browser se van anidando sin afectar a las capas interiores. Esto es importante si vas a tener una audiencia mayor a la normal -- lease, el 99% de usuarios utilizan Internet Explorer v5.x --, tomando en cuenta que a medida que pasa el tiempo lo anterior es cada vez menos cierto, entonces, ponte las pilas y checate los sitios que te he recomendado.&lt;br /&gt;&lt;br /&gt;No dejes de actualizarte sobre este tema tan en boga para los desarrolladores web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112595195932109370?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.alistapart.com/articles/sprites' title='CSS contra tablas y efectos javascript'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112595195932109370/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112595195932109370' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112595195932109370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112595195932109370'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/09/css-contra-tablas-y-efectos-javascript.html' title='CSS contra tablas y efectos javascript'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112558870219137918</id><published>2005-09-01T10:01:00.000-05:00</published><updated>2006-11-03T11:13:28.699-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Composición de clases en PHP</title><content type='html'>Bueno gente, ya me quejé de la falta de soporte de objetos en PHP y luego de que al hacerlo en PHP 5 están violando sus propios principios de facilidad para codificar paginas web. Ahora, con esta ambiguedad y tomando en cuenta que es tan fácil de manipular y flexible para unos y otros ( los que viven en Objetilandia y los que viven en Estructulandia ) - y tiene su buen mercado ya ganado - vamos a ver unos tips para manejo de datos de una clase como atributo de otra, o mejor conocido como composición de clases. Se puede utilizar para representar una relación entre dos tablas, una &lt;em&gt;master&lt;/em&gt; y la otra &lt;em&gt;detail&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt; Para este ejemplo vamos a hacer algo sencillo, una relacion uno a uno entre dos clases, una contenida en la otra, o también podemos decir "ClaseA tiene una ClaseB como atributo":&lt;br /&gt;&lt;br /&gt; &lt;div class="code"&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;// tabspace=3&lt;br /&gt;class ClaseB {&lt;br /&gt;&lt;br /&gt;&lt;span class="tab" /&gt;var $varb1;&lt;br /&gt;&lt;br /&gt; // constructor&lt;br /&gt;&lt;span class="tab" /&gt;function ClaseB( $varb1 = "" ) {&lt;br /&gt;&lt;span class="tab tab" /&gt;$this-&gt;varb1 = $varb1;&lt;br /&gt;&lt;span class="tab" /&gt;}&lt;br /&gt;&lt;br /&gt; // metodos get y set de var1&lt;br /&gt; function getVarB1()&lt;br /&gt;  { return $this-&gt;varb1; }&lt;br /&gt;&lt;br /&gt; function setVarB1( $valor )&lt;br /&gt;  { return $this-&gt;varb1; }&lt;br /&gt;&lt;br /&gt;} // FIN DE LA CLASE B&lt;br /&gt;&lt;br /&gt;class ClaseA {&lt;br /&gt;&lt;br /&gt; var $var1;&lt;br /&gt; var $var2;&lt;br /&gt; var $claseB;&lt;br /&gt;&lt;br /&gt; // Constructor&lt;br /&gt; function ClaseA( $var1 = "",&lt;br /&gt;  $var2 = "", $claseB = null )&lt;br /&gt; {&lt;br /&gt;  $this-&gt;var1 = $var1;&lt;br /&gt;  $this-&gt;var2 = $var2;&lt;br /&gt;&lt;br /&gt;  // Asignamos el valor&lt;br /&gt;  // de la clase B si no es nulo&lt;br /&gt;  if ( $claseB != null ) {&lt;br /&gt;   $this-&gt;claseB = $claseB;&lt;br /&gt;  }&lt;br /&gt;  else {&lt;br /&gt;   // inicializamos clase B&lt;br /&gt;   $this-&gt;claseB = new ClaseB();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; function getVar1()&lt;br /&gt;  { return $this-&gt;var1; }&lt;br /&gt; function getVar2()&lt;br /&gt;  { return $this-&gt;var2; }&lt;br /&gt; function getClaseB()&lt;br /&gt;  { return $this-&gt;claseB; }&lt;br /&gt;&lt;br /&gt; function setVar1( $valor )&lt;br /&gt;  { return $this-&gt;var1; }&lt;br /&gt; function setVar2( $valor )&lt;br /&gt;  { return $this-&gt;var2; }&lt;br /&gt; function setClaseB( $valor )&lt;br /&gt;  { $this-&gt;claseB = $valor; }&lt;br /&gt;&lt;br /&gt;} // FIN DE LA CLASE A&lt;br /&gt;&lt;br /&gt;// Ahora hacemos uso de la clase A y B&lt;br /&gt;&lt;br /&gt;// inicializamos una instancia de B&lt;br /&gt;$b = new ClaseB( ": var1 en claseB" );&lt;br /&gt;&lt;br /&gt;// la pasamos a una instancia de A&lt;br /&gt;$a = new ClaseA( "Hola", "Mundo", $b );&lt;br /&gt;&lt;br /&gt;// imprimimos desde A&lt;br /&gt;echo $a-&gt;getVar1() . " " . $a-&gt;getVar2()&lt;br /&gt; . " " . $a-&gt;claseB-&gt;getVarB1();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// O podemos declarar B en el&lt;br /&gt;// momento en que utilicemos A&lt;br /&gt;$a2 = new ClaseA( "Hola", "Mundo",&lt;br /&gt; new ClaseB( ": var1 en claseB &lt;br /&gt; creada con new" ) );&lt;br /&gt;&lt;br /&gt;echo "&lt;br&gt;" . $a2-&gt;getVar1() . " "&lt;br /&gt; . $a2-&gt;getVar2() . " "&lt;br /&gt; . $a2-&gt;claseB-&gt;getVarB1();&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Qué sigue por hacer?&lt;/strong&gt;&lt;br /&gt;Bueno ya podrás haber observado que para accesar a la clase B utilice el atributo directo y no pasé por el método. Te debo una mi estimado lector. y la otra parte es por si quieres hacer una relación de uno a muchos y conviertes a array el atributo de clasesB para que acepte varias clasesB contenidas en la claseA. Otra es guardar una referencia de la claseA en la claseB que te permita ir de la claseB a la claseA (así como accesamos de A a B). Entre otras muchas cosas que puedes hacer con composición de clases. &lt;br /&gt;&lt;br /&gt;Una vez que domines este principio básico de la OOP en PHP podrás integrar en una sola clase ( Yo normalmente las utilizo como mapas a mis tablas en la BD ) todas las tablas relacionadas. Finalmente cuando quieras desplegar los datos de cualquier tabla podras accesar a los detalles de cualquier tabla relacionada. Escribiré pronto sobre esto último, mientras tanto, prueba como acceder a la clase contenida directamente en PHP o si puedes con el método dejanos un comentario para retroalimentarnos.&lt;br /&gt;&lt;br /&gt;Saludos y happy coding con PHP!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112558870219137918?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112558870219137918/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112558870219137918' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112558870219137918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112558870219137918'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/09/composicin-de-clases-en-php.html' title='Composición de clases en PHP'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112551631212138213</id><published>2005-08-31T14:01:00.000-05:00</published><updated>2006-11-03T11:13:28.637-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Ponte Serio - PHP 5 está en una encrucijada</title><content type='html'>&lt;strong&gt;Ponte Serio &lt;/strong&gt;te digo, no estoy hablando del juego &lt;a href="http://www.croteam.com/" target="_blank"&gt;Serious Sam&lt;/a&gt; ( get Serious!! ) ni es un metodo get de un &lt;a href="http://java.sun.com/" target="_blank"&gt;Java Bean&lt;/a&gt;. Estoy hablando de que &lt;a href="http://www.php.net/" target="_blank"&gt;PHP 5&lt;/a&gt; tiene una historia que definió su forma de ser y ahora está en una encrucijada con la nueva versión que intenta, en pocas palabras, dejar los tiempos de simple script Procesador de Hipertexto ( PHP Hypertext Preprocessor ) y empezar a subir de nivel enfocándose más a objetos - pareciéndose cada vez más a Java -. &lt;br /&gt;&lt;br /&gt; El problema estriba en que si hay poca decisión sobre el soporte nosotros salimos afectados. Si usas PHP y piensas que es una herramienta sencilla y no tienes porque sufrir con objetos ni los necesitas, hasta PHP 4.0 está perfecto. Si por el contrario buscas la parte de PHP 4 o 5 que tiene soporte para programacion orientada a objetos en el 4 es deplorable, y en el 5 es inutil su utilización dado que tienes que estar serializando los objetos para emular la persistencia, lo cual suena a forzar las capacidades del ambiente web en el que se trabaja normalmente. Ves a donde quiero llegar? PHP 5 ya quiere ser mas que un script, lo cual significa correr como una plataforma, tipo perl o java. En donde quedó la intención de algo sencillo?, &lt;br /&gt;&lt;br /&gt; Un buen comentario sobre esto es que no molesta ya que puedes seguir trabajando normal sin tener que utilizar objetos, pero estamos como al principio, en realidad es deseable romper con una metodología solo porque nos gusta la facilidad con que se puede programar en PHP y en el ambiente Web?.&lt;br /&gt;&lt;br /&gt; Seguir manejando GET y POST a nivel arrays sin poder hacer una especie de encapsulador que nos permita obviar las operaciones del uso de los metodos puede resultar en una programación Spaghetti dentro de una semi-estructuración de los procesos de una pagina con php ( incluyo a ASP para que no se sienta solo entre otros de la generación pasada ). Pero, es la respuesta PHP 5 con su soporte de objetos? o solo es para mantener felices a ... como yo que solo quieren encapsular lo que varía, favorecer composicion sobre herencia, entre otros principios de los patrones de diseño u obedece a un "jaier" plan ( higher plan maléfico ).&lt;br /&gt;&lt;br /&gt; Le hago promoción al siguiente link donde una persona mucho más coherente me ha dejado pensando. Espero que piensen en esto la proxima vez qeu les digan en que pueden programar un proyecto web. No olviden a Java o a .NET, hay muchas cosas que simmplemente son obvias con PHP pero resultan más fáciles de controlar con estos dos, p.e. los metodos y las clases - incluyendo los &lt;a href="http://www.google.com.mx/search?hl=es&amp;q=Patrones+dise%C3%B1o&amp;meta=" target="_blank"&gt;patrones de diseño &lt;/a&gt;-.&lt;br /&gt;&lt;br /&gt; &lt;a href="http://www.kuro5hin.org/story/2004/7/14/232752/474" target="_blank"&gt;http://www.kuro5hin.org/story/2004/7/14/232752/474&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112551631212138213?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.kuro5hin.org/story/2004/7/14/232752/474' title='Ponte Serio - PHP 5 está en una encrucijada'/><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112551631212138213/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112551631212138213' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112551631212138213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112551631212138213'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/08/ponte-serio-php-5-est-en-una.html' title='Ponte Serio - PHP 5 está en una encrucijada'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112500688512876035</id><published>2005-08-25T12:10:00.000-05:00</published><updated>2006-11-03T11:13:28.519-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Harry Potter - J.K.Rowling'/><title type='text'>Harry potter 7 - ¿Cómo va a a estar la trama en el último libro de Harry Potter?</title><content type='html'>&lt;strong&gt;ADVERTENCIA: ANTES DE LEER: &lt;br /&gt;¿Ya leiste Harry Potter 6?&lt;/strong&gt;&lt;br /&gt;Si no has leido el último libro de Harry Potter ( Harry potter y El principe mestizo ), entonces, &lt;strong&gt;NO&lt;/strong&gt; te recomiendo leer lo que escribo a continuación. Aun cuando no doy detalles específicos sobre lo que pasó en el libro 6, no quiero arruinarte tu lectura cuando salga en español.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Harry Potter &lt;em&gt;Gran Finale&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Terminando de leer y después de haber pasado un tiempo con la boca abierta por la maravillosa conclusión de este formidable libro numero 6 de la saga del susodicho niño mago que ya no es tan niño, me puse a pensar en el desenlace de toda esta aventura y sin mas rollo les voy a dar mi opinion sobre como puede estar la trama del libro 7.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Quién va a ser el nuevo director de Hogwarts?&lt;/strong&gt;&lt;br /&gt;Ya que tristemente Dumbledore renunció a su cargo - ¿Ya ven?, así no doy detalles -, Hogwarts tiene que conseguirse un nuevo director, porque dudo mucho que sea la profesora McGonagall. Pienso que la profesora McGonagall no es un candidato para este puesto no por su capacidad, sino mas bien, porque el ministro de magia - sin dar detalles sobre él - está en una posición delicada con este tema. desgraciadamente, puede ser que volvamos a oir sobre Dolores Umbridge. Eso nos daría un rato amargo sobre cual leer cuando hablemos sobre Hogwarts, y peor como directora.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Harry regresa a Hogwarts en la 7?&lt;/strong&gt;&lt;br /&gt;Lo dudo, creo que ha tomado las decisiones que lo han llevado a una guerra abierta y no va a haber cuartel para las acciones que se llevarán a cabo en el libro 7. Pero aquí cabe reiterar sobre el contenido educativo y creo que esto será un problema. Primero, es un libro para niños, no podemos decirles que se vaya y deje la escuela, por lo tanto mi consejo para Harry es que se quede en la escuela si quiere ser Auror, o como dicen los &lt;em&gt;americans&lt;/em&gt; &lt;strong&gt;stay in school&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿El libro 7 será de un año más en hogwarts?&lt;/strong&gt;&lt;br /&gt;Creo que a harry le espera mucho por hacer y vamos a ver menos tareas de escuela y más allá de la escuela, como su carrera como auror y su búsqueda de lo que no puedo mencionar de quien y ase menciona su nombre normalmente. Además, se ha hecho de nuevos enemigos y esto me da pie para platicarles otra cosa sobre sus enemigos.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Voldemort será la batalla final de Harry Potter?&lt;/strong&gt;&lt;br /&gt;No creo, dejenme expresarles brevemente por qué pienso que no, el principe mestizo tiene algo muy importante que hacer, y creo que este personaje será el que enfrente el mayor reto de todo el libro, ya que por su propia cuenta y orgullo necesitará destruir a quien se le ponga enfrente - Espero que sigan conmigo en la lectura y entiendan quien puede ser quien sea -. &lt;br /&gt;&lt;br /&gt;Creo que, lo que llevó al principe mestizo a realizar un &lt;em&gt;kedavra&lt;/em&gt; al final del libro 6 tiene un sentido interesante ya que nos muestra la dualidad del personaje en un momento donde en realidad, la vida de quien esta en peligro es la de él mismo. O tomaba una decisión o él se volvía un blanco.&lt;br /&gt;&lt;br /&gt;El sujeto receptor de tan mortal hechizo tomó una decisión previa para salvar no solo a Harry, sino a otro estudiante que también estaba perdido entre la dualidad de una decisión, pero, el principe mestizo, con frialdad superficial y una mente calculadora entendió - y le hizo entender a su víctima - que la serie de eventos que habían acontecido ya no podían dar marcha atrás, por ende, aunque sea malo matar - pobre víctima -, ya no había salida dados los eventos, y alguien tenía que morir. Dos por el precio de uno.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Que pasará entonces al final de Harry Potter 7?&lt;/strong&gt;&lt;br /&gt;Bueno, por diferentes caminos, Harry y el principe mestizo intentarán ir tras de Voldemort y alguno o los dos terminarán por vencerlo, pero luego arreglarán cuentas pendientes ya que Harry jamás dejará que se quede sin pagar lo que hizo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Harry muere en Harry Potter 7?&lt;/strong&gt;&lt;br /&gt;No me gustaría para nada, ya que sería bueno romper el verdadero maleficio que fue el sobrevivir a toda la serie de eventos que desencadenó tan increible historia. Obviamente si se conserva aquel gusto que tuvo por su amor declarado entonces podemos hablar de un Harry Jr. Lo cual nos lleva a nuestra siguiente lista de historias que surgirán inevitablemente dado el mounstruo mercadotécnico que es Harry Potter.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Harry Jr.?&lt;/strong&gt;&lt;br /&gt;Bueno, suena a un Harry Potter Recargado, en donde en realidad no tendríamos un final feliz en el libro 7, y tomando la idea de star wars o de matrix, el final es violento pero nace una nueva esperanza, y de ahi esa nueva esperanza - lease Harry Potter Jr. - empieza a buscar al principe mestizo o el último hálito de vida de Voldemort, para terminar en una última entrega de la super saga donde Harry Potter Jr. - que muy bien se pudiera llamar James Potter - termine por crear una revolución para derrocar al imperio creado por el ministerio de magos controlado por cualquiera de los dos antes mencionados, o incluso cualquier otro personaje misterioso que aun nos falta por mencionar, como es el caso de R.A.B. que nos deja una nota al final del libro 6.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Y bien, algun comentario sobre el tema?&lt;/strong&gt;&lt;br /&gt;Esta historia del libro 7 de Harry Potter es completa y totalmente inventada por mí, no tiene ningún tipo de información interna de J.K. Rowling, y en nigún momento he tomado opiniones externas, es una idea que tengo de lo que puede pasar apenas he terminado de leer el libro 6. No me hago responsable por cualquier dato que haya podido revelarles sobre la historia - para eso puse una ADVERTENCIA -. &lt;br /&gt;&lt;br /&gt;Apenas acaba de salir el libro en inglés y todos esperan la traducción en nuestro lenguaje favorito. Ojalá hubiera algun medio legal para una traducción no oficial porque es dificil sentir que quieres leer algo y tienes que esperar. Con esto no estoy de acuerdo pero así son las cosas. Por ende tenemos 2 opciones y ambas son difíciles, aprender inglés y leerse todo el libro en otro idioma o cometer actos ilegales traduciendo el libro. Pienso que el segundo es bueno y malo, bueno para compartir la aventura malo slo porque lo prohiben, pero si ya es de conocimiento público, unos arruinan la historia para otros, como yo en este caso, aunque no dí detalles. Digan no a la espera!. Compren el libro y pidan un servicio de traducción... jejeje, es una broma, o aprendan ingles y maten una o dos neuronas tratando de entender que Death Eater es Mortífago, entre otras traducciones - muy bien hechas debo de admitirlo - pero de cualquier manera... alguien tiene algo que perder ¿No creen?.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112500688512876035?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112500688512876035/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112500688512876035' title='55 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112500688512876035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112500688512876035'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/08/harry-potter-7-cmo-va-a-estar-la-trama.html' title='Harry potter 7 - ¿Cómo va a a estar la trama en el último libro de Harry Potter?'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>55</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112490713866282493</id><published>2005-08-24T12:25:00.000-05:00</published><updated>2006-11-03T11:13:28.449-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patrones de diseño'/><title type='text'>Patrones de diseño, después de aprender sobre objetos</title><content type='html'>&lt;strong&gt; ¿Quién debe de leer este post?&lt;/strong&gt; &lt;br /&gt;Programadores en general, especialmente quienes utilizan las técnicas de POO (Programación Orientada a Objetos).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt; Introducción &lt;/strong&gt; &lt;br /&gt;Patrones de diseño es una forma de organizar los principios básicos de la POO para brindar manejabilidad al código sin alterar el código existente. Existen patrones de diseño asociados a diferentes problemas como el ejemplo del patrón de diseño Observador (Observer) que permite a objetos de diferente clase ser notificados cuando un objeto definido como el Sujeto tiene un cambio de estado. Otro patron es el Decorador (Decorator) que agrega en cada clase una liga a otra clase del mismo tipo (composicion) para poder ir decorando un objeto concreto con diferentes "condimentos".&lt;br /&gt;&lt;br /&gt;&lt;strong&gt; Sobre el libro &lt;/strong&gt; &lt;br /&gt;No me pagan por ello, ni siquiera por redirigirlos hasta su página. Esto es lo mejor para los autores, se llama Publicidad de boca en boca... o algo por el estilo.&lt;br /&gt;El objetivo de este post es recomendarles un libro específico para aprender -- a la voz de ya! -- sobre patrones de diseño.&lt;br /&gt;&lt;br /&gt;&lt;a href="www.wickedlysmart.com" target="_blank" title="Se abre en otra pagina. Cuidado con los bloqueadores de paginas emergentes." &gt;Head First Design Patterns&lt;/a&gt;, de Erich Freeman et al. muestra una forma muy innovadora de aprender temas que son realmente complicados para los que tenemos ideas sobre como construir objetos basados en las clasicas bases de encapsulación, herencia, polimorfismo, composición, agregación etc.&lt;br /&gt;&lt;br /&gt;Quiero reiterar sobre la palabra APRENDER. Después de haber realizado los crucigramas, las preguntas, los dibujos y leido cada anotación "a lapiz" que le hacen a cada parte me doy cuenta que en realidad estoy entendiendo el tema y que no nada más lo estoy leyendo para descontar lo que pagué por él. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt; ¿Y que hay con la fiebre de patrones de diseño (Design patterns fever)? &lt;/strong&gt; &lt;br /&gt;No lo puedo negar, después de empezar a leer ya quieres refactorizar -- Refactorizar un método por ejemplo cambia también las llamadas al método dentro del proyecto -- o modificar todo tu código, lo cual es bueno, pero también dicta un principio donde este tipo de soluciones está &lt;em&gt;"abierta para extensiones pero cerrada para modificaciones"&lt;/em&gt;, por lo tanto, nos da ideas pero también nos advierte de ciertos peligros sobre la fiebre que ocasiona. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Cuáles son las consecuencias?&lt;/strong&gt; &lt;br /&gt;Estamos hablando de niveles de abstracción altos por lo tanto puede hacer que el código sea complejo para darle seguimiento si uno no conoce a fondo los principios como composición y polimorfismo. Otro detalle es que el manejo de los principios de patrones de diseño pueden romper los principios básicos de encapsulamiento que conocemos, todo en aras de crear flexibilidad. Si eres un programador que integra todo el código en una sola clase, bueno, tal vez tengas problemas con la idea de patrones de diseño.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt; En Resumen &lt;/strong&gt; &lt;br /&gt;Los Patrones de Diseño representan un paso adelante en la programación orientada a objetos para hacer mejor uso de sus principios. Un libro dedicado a hacernos conscientes de ellos es Head First Design Patterns, el cual resulta divertido leer -- sí!, asi es, divertido! -- porque cuenta con anotaciones "a lapiz", contenido visual lleno de detalles, bromas, ejemplos claros y las soluciones a todos los crucigramas -- gracias a dios! --. &lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt; :) &lt;/strong&gt; &lt;br /&gt;Mucha suerte y feliz lectura, este tema es en verdad un puente para crear un nuevo vocabulario de forma tal que, si alguien menciona un patrón de diseño, ustedes ya sabrán como está organizado internamente y podrán obviar los detalles técnicos de la organización de las clases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112490713866282493?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112490713866282493/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112490713866282493' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112490713866282493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112490713866282493'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/08/patrones-de-diseo-despus-de-aprender.html' title='Patrones de diseño, después de aprender sobre objetos'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-112379786688336533</id><published>2005-08-11T16:33:00.000-05:00</published><updated>2006-11-03T11:13:28.389-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Validación con expresiones regulares y php</title><content type='html'>&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Intro&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;El objetivo de este post es darte pie para que dejes las validaciones de campos a la antigüa y utilices expresiones regulares con php. Queda fuera del &lt;em&gt;scope&lt;/em&gt; de este post el hablar de validación del lado cliente.&lt;br /&gt; &lt;br /&gt;No soy un erudito en la materia, ni en php, pero las expresiones regulares son excelentes para validar del lado servidor cualquier campo que te interese que llegue bien a tu base de datos (o almacén de datos favorito, por aquello de los archivos XML que está muy de moda, aunque estos se pueden validar con un XML schema .xsd o un DTD pero eso está fuera del alcance de este blog).&lt;br /&gt;&lt;br /&gt;Si no te has metido de lleno con la funcion ereg, eregi, entre otras, aqui te van unos tips para que pruebes algunas validaciones con ereg. Puedes ver ejemplos básicos en muchas paginas como por ejemplo www.php.net.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Tips ya que sabes como funciona el ereg&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;- El poderío esencial de las expresiones regulares se puede aumentar si separas tu codigo. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Siempre es buena práctica separar código en cualquier ámbito que trabajes. Para el caso de las validaciones, las expresiones regulares pueden ser generales. Tomemos el mes de una fecha como ejemplo.&lt;br /&gt;&lt;br /&gt;El mes de una fecha donde aparezca con formato de dos caracteres un primer caracter puede ser Cero o Uno, si es Cero, entonces el siguiente caracter solo puede estar en el rango del 1 al 9, si es uno, el siguiente caracter solo puede ser Cero, Uno o Dos.&lt;br /&gt;&lt;br /&gt;Bien, y esto como lo hacemos en expresiones regulares... Tal y como lo he mencionado anteriormente. Vamos a crear la expresion regular para que luego la podamos concatenar a cualquier expresion regular de fecha.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Un primer caracter puede ser Cero o Uno"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;$mes = "(0|1)";&lt;br /&gt;&lt;br /&gt;Los parentesis delimitan la expresion y el | nos sirve como la "o" de la expresion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Si es cero, entonces el siguiente caracter solo puede estar en el rango de 1 a 9"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;$mes = "(0[1-9]{1}|1)";&lt;br /&gt;&lt;br /&gt;Aqui cambia con un rango del 1 al 9 [1-9] y le decimos que solo un numero de ese rango con {1}&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Si es uno, entonces el siguiente caracter solo puede estar en el rango de 0 a 2"&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;$mes = "(0[1-9]{1}|1[012]{1})";&lt;br /&gt;&lt;br /&gt;Aqui aparece [012] donde le decimos que puede ser un cero o un uno o un dos y le decimos con {1} que solo uno de ellos puede estar en el mes como segundo caracter.&lt;br /&gt;&lt;br /&gt;Lo anterior tambien puede representarse como ya habras adivinado de la siguiente manera&lt;br /&gt;&lt;br /&gt;$mes = "(0[1-9]{1}|1[0-2]{1})";&lt;br /&gt;&lt;br /&gt;Aqui cambia con un rango del 0 al 2 [0-2] y le decimos que solo un numero de ese rango con {1}.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En que nos beneficia haber creado la expresion regular de mes aparte, bueno, la podemos concatenar. Imagina que ya tenemos la del dia y del año.&lt;br /&gt;&lt;br /&gt;function esFechaValida( $fecha )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ereg( $anio.$mes.$dia, $fecha );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Obviamente puedes concatenar cualquier caracter que necesites, ejemplo:&lt;br /&gt;&lt;br /&gt;function esFechaValida( $fecha )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ereg( "$anio-$mes-$dia", $fecha );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Nota: Esto es un ejemplo de expresiones regulares, la variable $mes, $anio y $dia tuvieron que haber pasado a la funcion de alguna manera, ya sea utilizando global $mes si lo declaraste afuera de la funcion (que como dijimos lo mejor seria ponerlo en un archivo aparte que incluyas en todos los que validen).&lt;br /&gt; &lt;br /&gt;Saludos y espero que les sirva para iniciar y de una vez pensar en separación de código.&lt;br /&gt;&lt;br /&gt;P.D.&lt;br /&gt;Iba a poner una sección de Preguntas que me hice frecuentemente durante el aprendizaje de las expresiones regulares... pero ya no me dió tiempo, sin embargo, como todo sirve para aprender o para crear, propongo la creación en los blogs de una sección que herede del concepto de FAQ y se extienda llamandose: SMFAQ, Self Made Frequently Asked Questions o Preguntas Que Me Hice Frecuentemente, pero las siglas en español no se oyen muy bien, asi es que se queda como SMFAQ para futuros posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-112379786688336533?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/112379786688336533/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=112379786688336533' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112379786688336533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/112379786688336533'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/08/validacin-con-expresiones-regulares-y.html' title='Validación con expresiones regulares y php'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-111914727965945215</id><published>2005-06-18T21:09:00.000-05:00</published><updated>2006-11-03T11:13:28.332-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Ejemplo y prueba de package en Java</title><content type='html'>En una prueba de la compilacion con javac para que funcione el package le tuve que poner como parametro -d y la ruta a una carpeta.&lt;br /&gt;&lt;br /&gt;Esta opcion del javac permite crear la estructura que deseas para los archivos compilados ( .class ). Lo interesante que discutÃ­a con Noe, un compaÃ±ero de la maestrÃ­a, es que al parecer no te crea la estructura que definas con package.&lt;br /&gt;&lt;br /&gt;Intenten esto:&lt;br /&gt;&lt;br /&gt;// Archivo de prueba Hola.java&lt;br /&gt;// Inicia Codigo Java&lt;br /&gt;&lt;br /&gt;package prueba;&lt;br /&gt;&lt;br /&gt;public class Hola&lt;br /&gt;{&lt;br /&gt;public static void main( String args[] )&lt;br /&gt;{&lt;br /&gt;System.out.println( "Hola Mundo" );&lt;br /&gt;System.exit( 0 );&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Finaliza Codigo&lt;br /&gt;&lt;br /&gt;// Ahora tecleamos en la Interfaz de comandos&lt;br /&gt;javac Hola.java&lt;br /&gt;&lt;br /&gt;// listamos el directorio donde se encuentra nuestro archivo Hola.Java y obtenemos:&lt;br /&gt;&lt;br /&gt;Hola.Java&lt;br /&gt;Hola.class&lt;br /&gt;&lt;br /&gt;// Aqui no nos estÃ¡ creando la carpeta de prueba que definimos&lt;br /&gt;// con package en nuestro codigo de Hola.java...&lt;br /&gt;// Por quÃ©? Esto fuÃ© lo que hicimos para que lo creara:&lt;br /&gt;&lt;br /&gt;// podemos borrar el .class y despues teclear lo siguiente en la interfaz de comandos&lt;br /&gt;javac -d . Hola.java&lt;br /&gt;&lt;br /&gt;// Notese la opcion -d seguida de un punto&lt;br /&gt;// el punto significa la carpeta actual en la que estamos compilando&lt;br /&gt;// donde se guardaran los .class resultantes de la compilacion&lt;br /&gt;// Nos queda entonces lo siguiente&lt;br /&gt;&lt;br /&gt;Hola.Java&lt;br /&gt;prueba // prueba es un directorio&lt;br /&gt;      ---&gt; Hola.class&lt;br /&gt;&lt;br /&gt;// Y la ejecucion del programa puede ser:&lt;br /&gt;&lt;br /&gt;// 1) Si queremos ejecutar desde la carpeta donde&lt;br /&gt;// se encuentra el archivo Hola.java&lt;br /&gt;java prueba.Hola&lt;br /&gt;&lt;br /&gt;// 2) Entramos a la carpeta de prueba y tecleamos&lt;br /&gt;java Hola&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;&lt;br /&gt;Espero que esta breve platica les sirva para enteder un poco mas el package donde lo necesiten&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-111914727965945215?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/111914727965945215/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=111914727965945215' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/111914727965945215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/111914727965945215'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/06/ejemplo-y-prueba-de-package-en-java.html' title='Ejemplo y prueba de package en Java'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-111816979235056524</id><published>2005-06-07T12:28:00.001-05:00</published><updated>2006-11-03T11:13:28.273-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Ruta base de página web en PHP</title><content type='html'>Uno de los módulos que realicé en mi trabajo hace más de un año fue la primera fase para un sistema integral, actualmente se encuentra en desarrollo y se espera que a finales de mes entre en producción.&lt;br /&gt;&lt;br /&gt; Para eliminar el problema de rutas a archivos de clases internas y al Smarty ( ver smarty.php.net ) se configuró la ruta a los directorios respectivos en el "include_path" del php.ini.&lt;br /&gt;&lt;br /&gt; Entre los problemas que surgieron, se deseó crear una instancia separada del mismo proyecto ( creando otra carpeta en el directorio de documentos web pero con otro nombre ), y las clases de la nueva instancia del proyecto empezaron a tener fallas proque el path apuntaba a las clases del primer proyecto.&lt;br /&gt;&lt;br /&gt; Si este es tu problema o tienes una jaqueca similar esta fue la solución atendiendo a los siguientes objetivos:&lt;br /&gt;&lt;br /&gt; * Eliminar rutas del include_path del php.ini.&lt;br /&gt; * Facilitar el cambio de carpeta o de servidor del módulo del sistema.&lt;br /&gt; * Facilitar la instalación del módulo evitando integrar configuración global en módulos de servidores web.&lt;br /&gt;&lt;br /&gt; Ahora bien, el módulo que desarrollé ( en conjunto con Rodolfo Baeza, ya te dí crédito cuate :D ) utiliza el modelo MVC ( Model View Controller ), esto quiere decir que, algunos archivos php contienen clases que realizan funciones de "Reglas de negocio" o sirven como "Entidades" para reflejar la estructura de las tablas en la base de datos.&lt;br /&gt;&lt;br /&gt; Estas clases son llamadas desde diferentes carpetas, lo cual, crea un problema de localización de archivos en llamadas require_once() dentro de las mismas reglas y archivos que no estan en la ruta principal.&lt;br /&gt;&lt;br /&gt; La solución que opté por implementar es incluir, en cada archivo, una variable de la ruta al directorio virtual que se conforma por &lt;rutadocumentosweb&gt;/&lt;rutadirectoriovirtual&gt;&lt;br /&gt;&lt;br /&gt; -- Codigo PHP --&lt;br /&gt;&lt;br /&gt;&lt;em&gt;$ruta = $_SERVER['DOCUMENT_ROOT'] . '/'. strtok ( dirname( $_SERVER['PHP_SELF'] ), '/' );&lt;/em&gt;&lt;br /&gt;&lt;br /&gt; -- Fin Codigo PHP --&lt;br /&gt;&lt;br /&gt; A partir de ahi incluyes en el mismo archivo tus require_once() necesarios para que tu clase opere independientenmente de cualquier llamada previa de la siguiente forma:&lt;br /&gt;&lt;br /&gt; -- Codigo PHP --&lt;br /&gt;&lt;br /&gt;&lt;em&gt; require_once ( $ruta . '/Clases/Reglas/UnaReglaDeNegocio.php' );&lt;br /&gt; require_once ( $ruta . '/Clases/Entidades/UnaEntidad.php' );  &lt;/em&gt;&lt;br /&gt;&lt;em&gt; require_once ( $ruta . '/Clases/Reglas/OtraReglaDeNegocio.php' ); &lt;/em&gt;&lt;br /&gt;&lt;em&gt; require_once ( $ruta . '/Clases/Entidades/OtraEntidad.php' );  &lt;/em&gt;&lt;br /&gt;&lt;br /&gt; -- Fin Codigo PHP --&lt;br /&gt;&lt;br /&gt; Y listo!, no importa donde esté tu archivo, con el &lt;em&gt;require_once&lt;/em&gt; te aseguras que no se vuelva a cargar un archivo que ya fue cargado ( para el caso de las clases ), pero también delegas a cada archivo la seguridad de que sus archivos necesarios para operar están siendo cargados.&lt;br /&gt;&lt;br /&gt; Espero que les sirva de algo y me encantará leer sus comentarios.&lt;br /&gt;&lt;br /&gt; NOTA: No responderé a preguntas del proyecto y sus detalles, pero si puedo platicarles en general de problemas técnicos y las soluciones concretas que me funcionaron.&lt;br /&gt;&lt;br /&gt; Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-111816979235056524?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/111816979235056524/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=111816979235056524' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/111816979235056524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/111816979235056524'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/06/ruta-base-de-pgina-web-en-php.html' title='Ruta base de página web en PHP'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-111695666666328718</id><published>2005-05-24T12:17:00.000-05:00</published><updated>2006-11-03T11:13:28.165-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patrones de diseño'/><title type='text'>Patrones de diseño - Singleton</title><content type='html'>Casualmente, mientras estaba programando una aplicación en C# ( C sharp ) que utiliza una forma MDI "padre" ( el singular "padre", no el adjetivo "padre/cool" ), con multiples formas "hijas", empecé una búsqueda google ( EMHO* Una de las maravillas del mundo moderno ), y había 2 métodos para crear solo una instancia de una forma MDI "hija", en español, si le daban click dos veces a la opción de menú, solo se abriera una vez la forma.&lt;br /&gt;&lt;br /&gt; Ese era el problema y uno de los métodos era el método Singleton, y digo casualmente por que eso es lo que mi grupo de la maestria y yo estamos estudiando... bueno, nos tocaron los otros patrones de diseño, ( ojalá y a mi me hubiera tocado el singleton, ya hubiera terminado la tarea ).&lt;br /&gt;&lt;br /&gt; En fin, como les decía, el método que implementaba el patrón de diseño Singleton era mucho mas sencillo que estar recorriendo el "arreglo" de formas MDI "hijas" que tenia la forma MDI "padre". Así que, este es un buen ejemplo del uso qeu le damos al patrón de diseño Singleton, solo podremos crear una instancia de la clase y aunque queramos inicializarla de nuevo, siempre se nos regresa la misma instancia de la clase inicializada estáticamente... justo lo que necesitaba en el caso mencionado anteriormente.&lt;br /&gt;&lt;br /&gt; Si hasta aquí ya te "cayó el veinte" de para que se utiliza Singleton ya realicé mi chamba altruista de compartir el "know how" y mejor aún, en "spanish". Ahora bien, si te interesa un poco de código lo mejor es que veas el siguiente ejemplo, cualquier duda haz un comentario aquí mismo y lo platicamos:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/csharp/SingletonForms.asp"&gt;http://www.codeproject.com/csharp/SingletonForms.asp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Glosario:&lt;br /&gt; EMHO = En Mi Humilde Opinión&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12620014-111695666666328718?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/111695666666328718/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=111695666666328718' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/111695666666328718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/111695666666328718'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/05/patrones-de-diseo-singleton.html' title='Patrones de diseño - Singleton'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12620014.post-111514299275069882</id><published>2005-05-03T10:38:00.000-05:00</published><updated>2006-11-03T11:13:28.102-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>Primer Post en el blog</title><content type='html'>El principal objetivo de los artículos escritos en un blog son para compartir información y poder dar seguimiento a los avances en cada idea, aunque también he visto por ahí cuentos, poemas etc. En general, es un medio para que puedas publicar lo que tu quieras y que otros puedan leerlo y comentar sobre ello de una manera fácil y rápida.&lt;br /&gt;&lt;br /&gt;A diferencia de un correo no existen post privados, además, google puede realizar búsquedas en los blogs para encontrar información que tu buscas, pero entonces, cual es la diferencia con los foros... bueno, el blog es personal, es Tú blog, tu escribes lo que tu quieras,  solo recuerda, si no escribes información útil o interesante para la comunidad, nadie pondrá comentarios o te retroalimentará en los post que realices. Así que adelante, anímate, haz tu blog y mucha suerte.&lt;br /&gt;&lt;br /&gt; PosData: Claro está, hay que mantenerlo simpre actualizado, si no escribes  en mas de un mes la gente se ovlidará de él.&lt;br /&gt;&lt;br /&gt;:) hasta pronto.&lt;br /&gt;&lt;br /&gt;Otro PostData: ¿Google blogger Acepta tags hmtl pre o code?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class HolaMundo implements IHolaMundo&lt;br /&gt;{&lt;br /&gt;   public static void main( String args[] )&lt;br /&gt;   {&lt;br /&gt;      this.doHola();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // doHola overrides from IHolaMundo&lt;br /&gt;   public void doHola()&lt;br /&gt;   {&lt;br /&gt;      System.out.println( "Hola Mundo" );&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&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/12620014-111514299275069882?l=empacarino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://empacarino.blogspot.com/feeds/111514299275069882/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12620014&amp;postID=111514299275069882' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/111514299275069882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12620014/posts/default/111514299275069882'/><link rel='alternate' type='text/html' href='http://empacarino.blogspot.com/2005/05/primer-post-en-el-blog.html' title='Primer Post en el blog'/><author><name>Apokalipsis</name><uri>http://www.blogger.com/profile/08114886168286674392</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='26' src='http://photos1.blogger.com/blogger/2124/1078/1600/Tempshot0002.jpg'/></author><thr:total>0</thr:total></entry></feed>
