<?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-1763183641342103044</id><updated>2012-01-29T14:08:56.073+01:00</updated><category term='linux'/><category term='sistemas'/><category term='postgresql'/><category term='jsf'/><category term='java'/><category term='jpa'/><category term='glassfish'/><category term='alternativas'/><category term='desarrollo'/><category term='maven'/><category term='eclipse'/><category term='actualidad'/><category term='BRMS'/><category term='jee'/><category term='open source'/><category term='web services'/><category term='astronomia'/><category term='herramientas'/><category term='experiencias'/><title type='text'>Balteus</title><subtitle type='html'>tres estrellas alineadas</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-717958370703738119</id><published>2012-01-18T08:52:00.001+01:00</published><updated>2012-01-18T21:47:31.726+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>Expo NASA: La aventura del espacio</title><content type='html'>&lt;div style="text-align: right;"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://xkcd.com/764/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-yG_wD5RKPAw/TxSlg9okyTI/AAAAAAAABI8/_NwqfcPdaxc/s320/cartel+baja.png" width="265" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: tahoma;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: tahoma;"&gt;&lt;i&gt;Todo lo que una persona puede imaginar, otras podrán hacerlo realidad.&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family: tahoma;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Julio_Verne"&gt;Julio Verne&lt;/a&gt; (1828-1905).&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;La exposición itinerante que la NASA ha traído a Europa está en Madrid desde el pasado Diciembre. Es una visita obligada para curiosos y amantes de la astronáutica y una ocasión excepcional para poder contemplar instrumentos, maquinaria y réplicas de la tecnología actual y la que llevó al hombre a la luna hace casi 43 años.&lt;br /&gt;&lt;br /&gt;Pensaba ir a verla de todos modos, pero he tenido la suerte poder de ahorrarme los 16€ de la entrada entrada por ser &lt;a href="http://amazings.es/2011/12/23/ya-tenemos-ganadores-del-concurso-nasamazings-para-acudir-a-exponasa/"&gt;uno de los ganadores&lt;/a&gt; del concurso promovido por &lt;a href="http://amazings.es/"&gt;amazings.es&lt;/a&gt; y la organización de la exposición, así que fui a verla el pasado domingo.&lt;br /&gt;&lt;br /&gt;Yuri Gagarin afirmó en una ocasión que su decisión hacia la astronáutica se la debía al excepcional Julio Verne. Y no es para menos. Él es uno de los personajes destacados en la primera sala que nos encontramos en la exposición, la de los &lt;i&gt;soñadores&lt;/i&gt;, tras pasar una réplica de la pasarela de acceso a la parte superior del Saturno V y que daba acceso a la nave Apollo.&lt;br /&gt;&lt;br /&gt;No voy a detallar aquí el contenido de la exposición, que podéis encontrar en el propio dossier de prensa y en abundante información en la red, sino más bien mi impresión subjetiva y crítica de la misma.&lt;br /&gt;&lt;br /&gt;Lo más fascinante de la exposición es poder contemplar in situ y a tamaño real muchas de las cosas que me han fascinado y de las que he visto fotos cientos de veces. Constatas que, hasta que no lo ves con tus propios ojos, no te haces una idea del aspecto y tamaños reales de ciertos artefactos. Por ejemplo, el interior del módulo de ascenso del L.M (Módulo Lunar), tan pequeño, tan frágil... con un aspecto más parecido a un batiscafo que a una nave espacial. Una cosa es que sepas que pilotaban de pie y otra cosa es que lo compruebes con tus propios ojos. Llama la atención especialmente el minúsculo tamaño de ciertas cápsulas espaciales, especialmente la Mercury, que cabría en una furgoneta: meterse ahí dentro sobre un misil Redstone modificado era &lt;i&gt;realmente&lt;/i&gt; como estar dentro de la cabeza de un misil balístico. A medida que recorría la exposición reflexionaba sobre el tremendo esfuerzo tecnológico que se realizó en tan pocos años, partiendo totalmente de cero.&lt;br /&gt;&lt;br /&gt;Cuando entras en la exposición, te ofrecen unas audioguías (&lt;a href="http://es.wikipedia.org/wiki/IPod_touch"&gt;iPod touch&lt;/a&gt;) que te presentan varias audiciones/videos por cada sala con información acerca de la misma en una cantidad claramente insuficiente y desproporcionada a las necesidades de información que requieren los objetos expuestos. Y aquí entramos en la parte más inacabada y decepcionante de la exposición: la información. Los objetos expuestos tienen unas etiquetas numéricas que puedes consultar en unos pequeños paneles (sobre los que nos agolpamos los visitantes), cuya brevísima y exigua descripción apenas te satisface y que, por si fuera poco, van apareciendo lentamente en presentación continua (no caben todos en las pantallas) en una desordenada mezcla entre inglés y español. Ya que ofrecen los iPods, la organización podría (por el mismo coste) haber añadido mucha más información multimedia de cada sala e incluso de cada artefacto, evitando así los corros que se forman sobre las pantallitas esperando que aparezca la descripción (que no información) del número que estamos buscando. En definitiva, el problema es que, salvo que sepas lo que estas viendo, me temo que la mayoría de la gente no puede "conocer" lo que está viendo, porque nadie se lo explica.&lt;br /&gt;&lt;br /&gt;Por otro lado, los iPod touch cuentan con una excelente pantalla de 3,5 pulgadas que ni siquiera se ha aprovechado para hacer más accesible la exposición a personas con discapacidad auditiva añadiendo subtítulos a los audios y vídeos que ofrece. Vamos, aquí parece que tras todo el esfuerzo, parece que la parte más importante, la de la información, la hubieran dejado a medias. No hacen falta más carteles, ni más grandes. Hubiera bastado con cargar suficiente material en los iPod's. Por otro lado, si en información están suspensos, tienen un cero absoluto en accesibilidad, y no por falta de medios, sino más bien por pura desidia, cosa que me parece totalmente imperdonable, tratándose de una exposición de este calibre.&lt;br /&gt;&lt;br /&gt;De hecho, la ausencia de información incluso en temas básicos es tan patente que la organización está constantemente respondiendo en twitter a la pregunta &lt;i&gt;"¿Hasta cuándo está la exposición?"&lt;/i&gt;, ya que esa información no está disponible ni siquiera en la web oficial. Por cierto: es hasta el 15 de Junio.&lt;br /&gt;&lt;br /&gt;Para compensar esta falta de información, recomendaría leer algo sobre la carrera espacial y las misiones de la NASA, ver documentales al respecto, o ver la &lt;a href="http://es.wikipedia.org/wiki/De_la_Tierra_a_la_Luna_%28miniserie%29"&gt;mini-serie "De la tierra a la luna"&lt;/a&gt; antes de ver la exposición, si tenéis ocasión, para poder disfrutar la exposición al completo conociendo lo que se está viendo.&lt;br /&gt;&lt;br /&gt;Finalmente, me hubiera gustado llevarme algún recuerdo como alguna serie de maquetas de lanzaderas (titan, atlas, saturno, sts, etc...) oficial. De nuevo, absolutamente decepcionante: apenas algunos carísimos y atroces juguetes de goma, torcidos, que ni siquiera estaban a escala. No había forma de llevarse la famosa serie de lanzaderas o alguna maqueta más o menos decente de un Saturno V o de una lanzadera salvo pequeños pisapapeles metálicos monocolor con poco detalle.&lt;br /&gt;&lt;br /&gt;Una excelente exposición mal rematada y poco cuidada en los detalles. En todo caso, una exposición totalmente recomendable por única y excepcional.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.laaventuradelespacio.com/"&gt;La aventura del espacio&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.laaventuradelespacio.com/sites/default/files/dossier%20prensa%20NASA.pdf"&gt;Dossier de prensa de la exposición&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-717958370703738119?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/717958370703738119/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2012/01/expo-nasa-la-aventura-del-espacio.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/717958370703738119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/717958370703738119'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2012/01/expo-nasa-la-aventura-del-espacio.html' title='Expo NASA: La aventura del espacio'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-yG_wD5RKPAw/TxSlg9okyTI/AAAAAAAABI8/_NwqfcPdaxc/s72-c/cartel+baja.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-7008899173322539897</id><published>2011-12-18T02:27:00.000+01:00</published><updated>2012-01-05T18:43:32.498+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sistemas'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>2011: 50 años en el espacio, 30 "peceando"</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;a href="http://xkcd.com/764/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="144" src="http://1.bp.blogspot.com/-vlCVAzRMJc0/TuzInM2rnnI/AAAAAAAABIU/a1JbPv0TJrY/s200/320px-IBM_PC_5150.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: tahoma;"&gt;&lt;i&gt;640K ought to be enough for anybody.&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;- Bill Gates, 1981 (*)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Una cosa es segura: en tecnología no se deberían realizar aseveraciones del tipo "nunca jamás" porque más tarde o más temprano, el tozudo paso del tiempo te acabará poniendo en el ridículo más espantoso.&lt;br /&gt;&lt;br /&gt;Hace 30 años, se lanzó el IBM PC, predecesor de los actuales ordenadores personales que hay en la mayoría de las casas y oficinas. Curioso nombre el que le pusieron, ya que difícilmente se podría llamar "personal" a algo científico que podía costar hasta casi $20.000, aunque mira tú, ironías del destino, sus equipos sucesores si han acabado siendo "personales".&lt;br /&gt;&lt;br /&gt;Con respecto a los temas de tecnología que vertebran este blog, de este año destacaría otro suceso trascendental aparte de la curiosa efeméride anterior: un fallecimiento. Este año nos dejó una de las personas que más relevancia tiene en prácticamente toda la tecnología que uso diariamente en mi profesión y de la que deriva la esencia de casi todo lo que usamos: Dennis MacAlistair Ritchie, más conocido como &lt;b&gt;Dennis Ritchie&lt;/b&gt;, o simplemente &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;dmr&lt;/span&gt;&lt;/b&gt; (muchas veces escrito así, "dmr", en minúsculas, con un tremendo respeto, y con la solemnidad con la que uno escribe la más valiosa contraseña). El azar ha querido que el año de su muerte sea también el 40 aniversario de la publicación del primer manual de &lt;b&gt;UNIX&lt;/b&gt; "UNIX Programmer’s Manual" que él escribió conjuntamente con &lt;b&gt;Ken Thomson&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Poco puedo añadir yo a lo muchísimo publicado sobre quién fue dmr. La mayor parte de los que visitáis el blog con asiduidad, conocéis su enorme y extensísima contribución al mundo. Tan enorme, como igual de decepcionante la poca repercusión que la noticia ha tenido en la prensa no especializada, que sin embargo ha dado extensa cobertura a otro lamentable fallecimiento contemporáneo, de un personaje más público y notorio, más &lt;i&gt;cool&lt;/i&gt;, aunque su legado no pueda ser comparable en absoluto ni por transcendencia ni por importancia. El tiempo pondrá a cada uno en su sitio.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-tFDWXjnw7OU/Tu0p-zGEI0I/AAAAAAAABIc/DUCZZCVAJp4/s1600/goodbye.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="176" src="http://1.bp.blogspot.com/-tFDWXjnw7OU/Tu0p-zGEI0I/AAAAAAAABIc/DUCZZCVAJp4/s320/goodbye.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;La significación en el mundo de la tecnología de dmr es comparable a la de Marie Curie a la física nuclear o la de Ramón y Cajal a la neurología... y aún así, hay una diferencia extrema: mientras éstos "descubrieron", dmr creó. dmr puso las dos semillas de los llamados entonces Sistemas Abiertos con la creación de UNIX y C. De la misma forma que no podríamos hablar del ADN sin la adenina, guanina, y citosina, tampoco podríamos hablar de Windows, Linux, Mac OS X, Java, Ruby, PHP, o .NET sin C, ya que C ha sido y sigue siendo la base de la creación tecnológica a partir de la cual se han construido tecnologías más complejas.&lt;br /&gt;&lt;br /&gt;Por otro lado, Internet (correo electrónico, facebook, Google, twitter, etc), Android, Mac OS X, iPhone y su iOS, Linux... todos tienen en común su procedencia y su esencia, su corazón: el UNIX que creó dmr. Actualmente, desde los Sistemas Operativos de los más grandes e importantes Data Centers y de los equipos financieros del mundo, hasta los smartphones más pequeños siguen usando algún tipo de UNIX o una derivación de éste. Sobre UNIX y C está construido el mundo tecnológico que conocemos. Este es el enorme legado de dmr.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://apod.nasa.gov/apod/ap110608.html" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="284" src="http://1.bp.blogspot.com/-REsCnBS2keU/Tu0tLTZ2CSI/AAAAAAAABIk/k15dZ5wSXY8/s320/shuttleiss_nasa_900.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Transborador y Estación Espacial Internacional juntas&lt;br /&gt;Fuente:&lt;a href="http://www.nasa.gov/"&gt;NASA&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;En otro orden de cosas, de interés también de este blog, damos repaso al año en lo que a temas de astronomía se refiere: 30 años después del primer vuelo orbital de un transbordador espacial (el &lt;a href="http://es.wikipedia.org/wiki/Transbordador_espacial_Columbia"&gt;Columbia&lt;/a&gt;), este año se ha puesto &lt;a href="http://es.wikinews.org/wiki/El_Atlantis_pone_fin_a_la_era_de_los_transbordadores_espaciales"&gt;fin al programa de transbordadores espaciales&lt;/a&gt;, es decir, al &lt;a href="http://es.wikipedia.org/wiki/Transbordador_STS"&gt;programa STS&lt;/a&gt;. La sobrecogedora foto a la izquierda, es muy especial. Por lo general se toman fotografías de la Estación Espacial Internacional (&lt;a href="http://es.wikipedia.org/wiki/Estaci%C3%B3n_Espacial_Internacional"&gt;ISS&lt;/a&gt;) desde el transbordador, o viceversa, pero no es frecuente que una tercera nave esté acercándose mientras las dos anteriores están unidas. Esta imponente imagen, tomada desde una nave &lt;a href="http://es.wikipedia.org/wiki/Soyuz_TMA-20"&gt;Soyuz TMA-20&lt;/a&gt;, donde se aprecia el enorme tamaño de la Estación Espacial Internacional, es una preciosa foto que no se podrá volver a tomar nunca más. &lt;br /&gt;&lt;br /&gt;Coincide este hecho con la celebración del 50 aniversario del primer vuelo espacial, realizado por &lt;b&gt;Yuri Alexéievich Gagarin&lt;/b&gt;, ciudadano soviético, a bordo de la nave &lt;b&gt;Vostok 1&lt;/b&gt;. En honor a su viaje y su transcendencia, la ONU decidió declarar el 12 de Abril como "Dia del Espacio". Esa misma noche se celebra la "&lt;b&gt;&lt;i&gt;&lt;a href="http://es.wikipedia.org/wiki/La_noche_de_Yuri"&gt;noche de Yuri&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;". Curiosamente, el día del primer vuelo de un transbordador orbital (Columbia) fue también el 12 de Abril.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-1pn_XFVmP_4/TvEY8PtYJfI/AAAAAAAABI0/E9ylmyNIaHQ/s1600/sagan.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="106" src="http://3.bp.blogspot.com/-1pn_XFVmP_4/TvEY8PtYJfI/AAAAAAAABI0/E9ylmyNIaHQ/s200/sagan.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Carl Sagan&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;También el 20 de diciembre de este año se cumplen &lt;a href="http://www.elmundo.es/elmundo/2011/12/19/ciencia/1324316030.html"&gt;15 años sin el divulgador científico más grande de todos los tiempos&lt;/a&gt;. El "astrónomo del pueblo" que ilusionó a todas las mentes inquietas a través de una narración elocuente, precisa, seductora y poética en "&lt;a href="http://es.wikipedia.org/wiki/Cosmos:_Un_viaje_personal"&gt;&lt;i&gt;Cosmos: un viaje personal&lt;/i&gt;&lt;/a&gt;": &lt;a href="http://es.wikipedia.org/wiki/Carl_Sagan"&gt;Carl Sagan&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Termino con un comienzo esperanzador, una emocionante nueva misión con el robot de exploración espacial más sofisticado lanzado hasta ahora: el &lt;a href="http://es.wikipedia.org/wiki/Curiosity"&gt;Curiosity&lt;/a&gt;. Os dejo con una animación de su viaje, su espectacular aterrizaje y operaciones de superficie (ponedlo a pantalla completa en HD porque merece la pena).&lt;br /&gt;&lt;br /&gt;¡ Feliz nuevo año 2012 !&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://0.gvt0.com/vi/P4boyXQuUIw/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/P4boyXQuUIw&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/P4boyXQuUIw&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(*) La frase ha sido atribuida frecuentemente a Bill Gates, aunque &lt;a href="http://imranontech.com/2007/02/20/did-bill-gates-say-the-640k-line/"&gt;él ha negado decir tal cosa&lt;/a&gt; y existe &lt;a href="http://en.wikiquote.org/wiki/Talk:Bill_Gates"&gt;discusión&lt;/a&gt; al respecto ya que no parecen existir evidencias firmes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://es.wikipedia.org/wiki/Dennis_Ritchie"&gt;Dennis Ritchie&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://alt1040.com/2011/10/dennis-ritchie-que-seria-del-mundo-sin-su-legado"&gt;Dennis Ritchie y su legado inmenso&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.enter.co/historia-2/muere-dennis-ritchie-el-creador-del-lenguaje-de-programacion-c/"&gt;Se despide otro titán tecnológico: Dennis Ritchie, padre de C y UNIX&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://es.wikipedia.org/wiki/Yuri_Gagarin"&gt;Yuri Gagarin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.youtube.com/watch?feature=player_detailpage&amp;amp;v=x1gmvOeeL78"&gt;Documental sobre la vida de Carl Sagan&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://danielmarin.blogspot.com/2011/11/curiosity-el-robot-marciano-mas.html"&gt;Curiosity: el robot marciano más complejo de la historia&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-7008899173322539897?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/7008899173322539897/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/12/2011-50-anos-en-el-espacio-30-peceando.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7008899173322539897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7008899173322539897'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/12/2011-50-anos-en-el-espacio-30-peceando.html' title='2011: 50 años en el espacio, 30 &quot;peceando&quot;'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-vlCVAzRMJc0/TuzInM2rnnI/AAAAAAAABIU/a1JbPv0TJrY/s72-c/320px-IBM_PC_5150.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2085013600094974655</id><published>2011-12-14T02:01:00.000+01:00</published><updated>2011-12-14T18:33:51.626+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><title type='text'>Copiar y pegar en applets Java</title><content type='html'>&lt;a href="http:///#" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-OLkk3QpaQtA/TuflFXoTSWI/AAAAAAAABIM/suZ5OoDXsmg/s200/Bubble_Gums__28_.jpeg" width="200" /&gt;&lt;/a&gt;Una de las páginas a las que suelo acceder a menudo es &lt;a href="http://www.cis.upenn.edu/%7Ematuszek/General/RegexTester/regex-tester.html"&gt;ésta&lt;/a&gt;. Se trata de una sencilla página contenedora de un applet para probar expresiones regulares en Java realizada por &lt;b&gt;David Matuszek&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Esta página contiene una de ésas maravillosas utilidades tipo que acaban siendo atemporales (yo diría que hace más de 7 años que lo uso): sencilla, directa, concisa y eficaz. La verdad es que para probar una expresión regular antes de incorporarla en el código no se necesita más de eso... ni menos tampoco, ya que esto permite ahorrar mucho tiempo de depuración. Una pequeña joya muy recomendable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;De un tiempo a esta parte, me di cuenta que ya no podía copiar las expresiones realizadas ni pegar texto de ejemplo. Esto me resultaba tremendamente molesto, pero siempre que usaba la página tenía tanta prisa por resolver el problema que me llevaba a ella que no me permitía detenerme un momento para averiguar la razón del incómodo cambio.&lt;br /&gt;&lt;br /&gt;Bueno, pues resulta que desde el lanzamiento de Java Plug-in 1.6.0_24 en Febrero 2011, copiar y pegar desde o hacia el portapapeles del sistema se consideró un agujero de seguridad y, por tanto, se desactivó. Puedes copiar &lt;i&gt;entre&lt;/i&gt; applets, pero no entre applet y portapapeles del sistema.&lt;br /&gt;&lt;br /&gt;La solución estaría en modificar el fichero java.policy del directorio lib/security del plugin, aunque lo más probable es que este cambio sea sobreescrito de nuevo en la siguiente actualización de la JRE. Así que lo mejor es crear un archivo de usuario java.policy personalizado:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Localiza tu fichero &lt;i&gt;Java Security Policy&lt;/i&gt;. Se llama java.policy y debería estar bajo el directoro lib/security de tu instalación Java JRE. En Linux está en /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security/java.policy.&lt;/li&gt;&lt;li&gt; Copialo a tu home y renómbralo a &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;.java.policy&lt;/span&gt; (fíjate que debe comenzar con un punto).&lt;/li&gt;&lt;li&gt;Edita el fichero y añade la línea que se indica debajo de los comentarios:&lt;/li&gt;&lt;pre class="brush:java; gutter: false;"&gt;// "standard" properties that can be read by anyone&lt;br /&gt;permission java.awt.AWTPermission "accessClipboard";&lt;br /&gt;&lt;/pre&gt;&lt;li&gt;Reinicia el navegador&lt;/li&gt;&lt;/ol&gt;&lt;sun-ejb-jar&gt;&lt;/sun-ejb-jar&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cis.upenn.edu/%7Ematuszek/General/RegexTester/regex-tester.html"&gt;Regular Expression Test Applet&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2085013600094974655?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2085013600094974655/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/12/copiar-y-pegar-en-applets-java.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2085013600094974655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2085013600094974655'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/12/copiar-y-pegar-en-applets-java.html' title='Copiar y pegar en applets Java'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-OLkk3QpaQtA/TuflFXoTSWI/AAAAAAAABIM/suZ5OoDXsmg/s72-c/Bubble_Gums__28_.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-221255291762211172</id><published>2011-11-12T16:30:00.000+01:00</published><updated>2011-11-14T00:17:37.674+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Los niveles de aislamiento en PostgreSQL (no son 4)</title><content type='html'>&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-2pveBRJhPus/Tr0AjeZqh0I/AAAAAAAABFY/IXlFOXLXXmA/s200/n%25C3%25BAmeros.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://4.bp.blogspot.com/-2pveBRJhPus/Tr0AjeZqh0I/AAAAAAAABFY/IXlFOXLXXmA/s200/n%25C3%25BAmeros.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: tahoma;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: tahoma;"&gt;&lt;i&gt;"No. No lo intentes. Hazlo, o no lo hagas, pero no lo intentes."&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div align="right"&gt;- &lt;span style="font-family: tahoma; font-size: x-small;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Yoda"&gt;Maestro Yoda&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Cuando ví el Episodio IV de la Guerra de las Galaxias ("El Imperio Contraataca"), aún era un niño impresionable, y me llamó la atención la reprenda que hizo Yoda a Luke y que cito aquí. Era uno de ésos consejos marciales que se enuncian solemnes como un consejo vital.&lt;br /&gt;&lt;br /&gt;Con el tiempo te das cuenta que como consejo está bien, y puede ser incluso un buen objetivo... pero en ciertas facetas de la vida no es válido. Por ejemplo, en el mundo científico y en nuestro mundo profesional el consejo es justamente el contrario: inténtalo, pruébalo y compruébalo. Y sólo cuando lo hayas hecho y consigas un resultado repetible, ponlo en práctica, esto es, &lt;i&gt;súbelo a producción&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Gracias a no seguir el consejo de Yoda fui consciente de una (grave) carencia de PostgreSQL con respecto a los niveles de aislamiento. Como &lt;a href="http://balteus.blogspot.com/2010/10/control-del-nivel-de-aislamiento.html"&gt;ya hice una introducción al aislamiento en otro artículo&lt;/a&gt;, no voy a extenderme más en el tema y voy al grano. El caso que me ocupaba es que tenía que hacer una importación transaccional de datos masiva en un sistema en OLTP de producción en el que se están modificando constantemente datos relacionados con los que voy a importar. El resultado de la importación es que la transacción gigante bloquea datos e impide que se efectúen modificaciones en datos relacionados paralizando en la práctica buena parte de las operaciones de producción produciéndose un efecto "bola de nieve" al sumarse cada vez más transacciones en cola a la transacción gigante pendiente. Sin embargo, para lo único que quiero la transacción es para tener atomicidad en la operación, es decir, para que no se quede a medias en caso de algún problema, pero no me importa que se puedan producir eventualmente casos de &lt;i&gt;dirty read&lt;/i&gt;, que no afectarían a los usuarios del sistema de producción en su trabajo. Vale, no hay problema. La transacción de inserción la podemos realizar con el nivel de aislamiento más bajo (READ_UNCOMMITED) y problema solucionado. ¿No? No obstante, no hagamos caso a Yoda, y probémoslo en pre-producción. Resultado: exactamente el mismo que si no hubiera especificado nada del nivel de aislamiento.&lt;br /&gt;&lt;br /&gt;¿Qué ha pasado? &lt;br /&gt;&lt;br /&gt;En la &lt;a href="http://www.postgresql.org/docs/9.0/static/sql-set-transaction.html"&gt;documentación de SET TRANSACTION&lt;/a&gt;, en efecto compruebo que PostgreSQL admite los cuatro niveles de aislamiento como la mayoría de las bases de datos (de hecho, la sentencia no dio error)... pero sólo sintácticamente: no están todos implementados. Si contiúas leyendo te das cuenta que no son 4, sino 2 los niveles implementados:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: #f3f3f3; color: blue;"&gt;"The SQL standard defines two additional levels, &lt;tt class="LITERAL"&gt;READ    UNCOMMITTED&lt;/tt&gt; and &lt;tt class="LITERAL"&gt;REPEATABLE READ&lt;/tt&gt;.    In &lt;span class="PRODUCTNAME"&gt;PostgreSQL&lt;/span&gt; &lt;tt class="LITERAL"&gt;READ    UNCOMMITTED&lt;/tt&gt; is treated as    &lt;tt class="LITERAL"&gt;READ COMMITTED&lt;/tt&gt;, while &lt;tt class="LITERAL"&gt;REPEATABLE    READ&lt;/tt&gt; is treated as &lt;tt class="LITERAL"&gt;SERIALIZABLE&lt;/tt&gt;."&lt;/blockquote&gt;Lo que viene a decir: "&lt;i&gt;¿Pensabas que eran cuatro, no? Pues no. Son dos&lt;/i&gt;". De hecho, ahora (con la versión 9.1) ya son 3. Pero sigue sin estar soportada la &lt;i&gt;lectura sucia&lt;/i&gt; (&lt;i&gt;dirty read&lt;/i&gt;). En la &lt;a href="http://www.postgresql.org/docs/9.0/static/transaction-iso.html"&gt;documentación sobre aislamiento&lt;/a&gt; también es bastante claro:&lt;br /&gt;&lt;blockquote class="tr_bq" style="background-color: #f3f3f3; color: blue;"&gt;"In &lt;span class="PRODUCTNAME"&gt;PostgreSQL&lt;/span&gt;, you can request any of the     four standard transaction isolation levels.  But internally,&lt;b&gt; there are     only two distinct isolation levels&lt;/b&gt;, which correspond to the levels Read     Committed and Serializable.  When you select the level Read     Uncommitted you really get Read Committed, and when you select     Repeatable Read you really get Serializable, so the actual     isolation level might be stricter than what you select."&lt;/blockquote&gt;&lt;br /&gt;Un verdadero jarro de agua a mis pretensiones, ya que no puedo conseguir atomicidad sin bloqueo (aunque sea realizando lecturas de transacciones no confirmadas) en PostgreSQL, al menos con la versión actual 9.1.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.postgresql.org/docs/9.0/static/transaction-iso.html"&gt;Transaction Isolation (Documentación de PostgreSQL 9.0) (2 Niveles)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.postgresql.org/docs/9.0/static/sql-set-transaction.html"&gt;SET TRANSACTION (Documentación de PostgreSQL 9.0) (2 Niveles)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.postgresql.org/docs/9.1/static/transaction-iso.html"&gt;Transaction Isolation (Documentación de PostgreSQL 9.1) (3 Niveles)&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.postgresql.org/docs/9.1/static/sql-set-transaction.html"&gt;SET TRANSACTION (Documentación de PostgreSQL 9.1) (3 Niveles)&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-221255291762211172?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/221255291762211172/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/11/los-niveles-de-aislamiento-en.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/221255291762211172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/221255291762211172'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/11/los-niveles-de-aislamiento-en.html' title='Los niveles de aislamiento en PostgreSQL (no son 4)'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-2pveBRJhPus/Tr0AjeZqh0I/AAAAAAAABFY/IXlFOXLXXmA/s72-c/n%25C3%25BAmeros.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-3913259566156345214</id><published>2011-10-27T23:15:00.000+02:00</published><updated>2011-10-27T23:18:47.936+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sistemas'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><title type='text'>Generar certificados autofirmados con OpenSSL</title><content type='html'>&lt;div style="text-align: right;"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://http//www.openssh.com/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Nvs955PQyr4/Tqm4V-ESEfI/AAAAAAAABFM/zj18Ybpdgc8/s1600/openssh_logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: tahoma;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: tahoma;"&gt;&lt;i&gt;Software is like sex: It’s better when it’s free.&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family: tahoma;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;Linus Torvalds.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Tengo la suerte de trabajar en un lugar rodeado de extraordinarios profesionales como compañeros. El artículo que traigo aquí hoy es un resumen de un correo electrónico de uno de ellos que, con su permiso (y sugerencia) he convertido humildemente en otro post más para este blog. Gracias, Josete. Es un placer y un honor trabajar contigo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;span style="color: #7f6000;"&gt;Mini How-To: Generar certificados autofirmados con OpenSSL para Apache HTTP Server&lt;/span&gt;&lt;/h2&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-size: small;"&gt;-por José Morales Mora.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;PASO 1. Generar Clave RSA&lt;/h3&gt;Ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash; gutter: false;"&gt;openssl genrsa -des3 -out server.key 1024&lt;/pre&gt;&lt;br /&gt;Genera una clave CA para realizar la firma del certificado.Nos pide la clave privada para este certificado. Podemos especificar el tamaño de la clave ( 1024, 2048)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PASO 2. Generar CSR ( Petición de Firma de Certificado)&lt;/h3&gt;Ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash; gutter: false;"&gt;openssl req -new -key server.key -out server.csr&lt;/pre&gt;&lt;br /&gt;Realiza una petición para la firma con clave privada especificado. Al realizarlo nos pide datos:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: text; gutter: false;"&gt;Country Name (2 letter code) []:&lt;br /&gt;State or Province Name (full name) []:&lt;br /&gt;Locality Name (eg, city) []:&lt;br /&gt;Organization Name (eg, company) []:&lt;br /&gt;Organizational Unit Name (eg, section) []:&lt;br /&gt;Common Name (eg, your name or your server's hostname) []: &lt;br /&gt;Email Address []:&lt;br /&gt;Please enter the following 'extra' attributes&lt;br /&gt;to be sent with your certificate request&lt;br /&gt;A challenge password []:&lt;br /&gt;An optional company name []:&lt;/pre&gt;&lt;pre class="brush: text; gutter: false;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="brush: text; gutter: false;"&gt;&lt;/pre&gt;&lt;b&gt;IMPORTANTE:&lt;/b&gt; El &lt;i&gt;"Common Name"&lt;/i&gt; debe corresponder con la URL que queremos Securizar. Si la URL a poner por SSL es www.paco.es, este campo debe contener exactamente eso.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PASO 3. Eliminar Clave Privada DES3&lt;/h3&gt;Ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash; gutter: false;"&gt;cp server.key server.key.org&lt;br /&gt;openssl rsa -in server.key.org -out server.key&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esto es necesario porque en estos casos que tenemos un certificado firmado con clave primaria, Apache HTTP Server pide en cada arranque esa clave para utilizar el certificado.La solución es eliminar la encriptación DES3 para la clave.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PASO 4 . Generar Certificado Autofirmado.&lt;/h3&gt;Ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash; gutter: false;"&gt;openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt&lt;/pre&gt;&lt;br /&gt;Con este paso obtenemos el CRT autofirmado preparado para ser utilizado en apache.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PASO 5. Configurar Apache&lt;/h3&gt;Para utilizar estos certificados en apache, lo que tenemos que hacer es añadir al Virtual Host que queramos:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: text; gutter: false;"&gt;SSLEngine on&lt;br /&gt;SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt&lt;br /&gt;SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.openssh.com/"&gt;OpenSSH&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://httpd.apache.org/"&gt;Apache HTTP Server&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-3913259566156345214?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/3913259566156345214/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/10/generar-certificados-autofirmados-con.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/3913259566156345214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/3913259566156345214'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/10/generar-certificados-autofirmados-con.html' title='Generar certificados autofirmados con OpenSSL'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Nvs955PQyr4/Tqm4V-ESEfI/AAAAAAAABFM/zj18Ybpdgc8/s72-c/openssh_logo.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4580756782293244806</id><published>2011-10-09T23:57:00.000+02:00</published><updated>2011-10-10T12:25:14.628+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><title type='text'>Combinando XPath con JAXB</title><content type='html'>&lt;div style="text-align: right;"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=1763183641342103044" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/-pUmQ2UqbtnU/TnSZPyIG-8I/AAAAAAAABEY/zn1kDMynD_Q/s200/lupa400.jpeg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: tahoma;"&gt;&lt;blockquote&gt;&lt;i&gt;El primer 90% del código ocupa el 90% del tiempo de desarrollo. El 10% restante del código ocupa el otro 90% de tiempo de desarrollo.&lt;/i&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Regla_del_noventa-noventa"&gt;Regla del noventa-noventa&lt;/a&gt;, Tom Cargill.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Usar JAXB es tremendamente cómodo si tenemos que procesar datos XML bien definidos y cuya estructura sea bastante estable en el tiempo: nos evitamos toda la fontanería de análisis, verificación y &lt;a href="http://en.wikipedia.org/wiki/Marshalling_%28computer_science%29"&gt;marshalling / unmarshalling&lt;/a&gt;. Por otro lado, nos resuelve de un plumazo convertir los datos XML a objetos &lt;a href="http://en.wikipedia.org/wiki/Data_transfer_object"&gt;DTO/VO&lt;/a&gt; de datos en nuestra aplicación ya que nos permitirá pasarlos directamente a Servicios de negocio o a &lt;i&gt;vista&lt;/i&gt; (si usamos un &lt;a href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador"&gt;MVC&lt;/a&gt;), en lugar de crearlos y mantenerlos manualmente cada vez que se modifican las especificaciones.&lt;br /&gt;&lt;br /&gt;Pero no todo son ventajas. A la hora de acceder a un dato de un elemento, tratar con objetos puede suponer un verdadero engorro de iteraciones anidadas o tener que usar predicados para las colecciones de elementos, cuando con &lt;a href="http://es.wikipedia.org/wiki/XPath"&gt;XPath&lt;/a&gt; podemos realizar un acceso rápido y directo al elemento a través de sencillas expresiones.&lt;br /&gt;&lt;br /&gt;Por ejemplo, supongamos que tenemos el siguiente XML:&lt;br /&gt;&lt;pre class="brush:xml; gutter: false;"&gt;  &lt;empleados&gt;&lt;br /&gt;    &lt;empleado&gt;&lt;br /&gt;      &lt;id&gt;1&lt;/id&gt;&lt;br /&gt;      &lt;direcciones&gt;&lt;br /&gt;        &lt;direccion&gt;&lt;br /&gt;          ...&lt;br /&gt;          &lt;cp&gt;06002&lt;/cp&gt;&lt;br /&gt;        &lt;/direccion&gt;&lt;br /&gt;      &lt;/direcciones&gt;&lt;br /&gt;    &lt;/empleado&gt;&lt;br /&gt;    &lt;empleado&gt;&lt;br /&gt;      &lt;id&gt;2&lt;/id&gt;&lt;br /&gt;      &lt;direcciones&gt;&lt;br /&gt;        &lt;direccion&gt;&lt;br /&gt;          ...&lt;br /&gt;          &lt;cp&gt;28034&lt;/cp&gt;&lt;br /&gt;        &lt;/direccion&gt;&lt;br /&gt;      &lt;/direcciones&gt;&lt;br /&gt;    &lt;/empleado&gt;&lt;br /&gt;    &lt;empleado&gt;&lt;br /&gt;      &lt;id&gt;3&lt;/id&gt;&lt;br /&gt;      &lt;direcciones&gt;&lt;br /&gt;        &lt;direccion&gt;&lt;br /&gt;          ...&lt;br /&gt;          &lt;cp&gt;06002&lt;/cp&gt;&lt;br /&gt;        &lt;/direccion&gt;&lt;br /&gt;      &lt;/direcciones&gt;&lt;br /&gt;    &lt;/empleado&gt;&lt;br /&gt;  &lt;/empleados&gt;&lt;br /&gt;&lt;/pre&gt;Si necesitamos acceder a todos los elementos/objetos &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;empleado&lt;/span&gt; cuyo elemento &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;cp&lt;/span&gt; sea &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;06002&lt;/span&gt;, usando objetos generados por JAXB deberíamos iterar por la colección &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;empleados&lt;/span&gt;, así:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java; gutter: false;"&gt;List&amp;lt;Empleado&amp;gt; empleados06 = new ArrayList&amp;lt;Empleado&amp;gt;();&lt;br /&gt;for ( Empleado empleado : empleados.getEmpleadoList() ) {&lt;br /&gt;  for ( direccion : empleado.getDirecciones().getDireccionList() ) {&lt;br /&gt;    if ( direccion.getCp().equals("06002") ) {&lt;br /&gt;      empleados06.add(empleado);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;con XPath es mucho más simple: podemos obtener una lista usando la expresión&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;//empleado[cp='06002']&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Cuanto más niveles jerárquicos tenga nuestro árbol de información (más grados de anidación), más compleja se hace la recuperación de datos usando JAXB. Sin embargo, con XPath es tan simple como evaluar una expresión.&lt;br /&gt;&lt;br /&gt;Hasta que descubrí JXPath, tenía que elegir entre XPath (y pagar la "penalización" de realizar el marshalling/unmarshalling manualmente) o JAXB (y pagar la penalización de la selección de elementos con código manual). &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;JXPath&lt;/h4&gt;JXPath es otro genial componente de Apache Commons: una librería que evalúa expresiones (basadas en) XPath contra jerarquías de objetos Java, permitiendo hacer complejas consultas e iteraciones sobre estructuras y conjuntos de simples objetos &lt;a href="http://es.wikipedia.org/wiki/Plain_Old_Java_Object"&gt;POJO&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Es decir, te permite usar XPath sobre objetos. Y no sólo sobre objetos serializados vía JAXB, sino cualquier POJO o colección de éstos. Si XPath es al XML lo que el SQL a las bases de datos, JXPath es el equivalente a los objetos Java. Es la solución perfecta para simplificar código que debe evaluar y filtrar conjuntos de objetos o, por ejemplo, cuando debemos seleccionar datos en objetos en tiempo de ejecución, en los que es sencillo construir una expresión XPath dinámica. El artículo &lt;a href="http://today.java.net/pub/a/today/2006/08/03/java-object-querying-using-jxpath.html"&gt;"&lt;i&gt;Java Object Querying Using JXPath&lt;/i&gt;"&lt;/a&gt;, muestra una serie de ejemplos muy ilustrativos.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/jxpath/"&gt;JXPath&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://today.java.net/pub/a/today/2006/08/03/java-object-querying-using-jxpath.html"&gt;Java Object Querying Using JXPath&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tfo-eservices.eu/wb_tutorials/media/JXPathTutorial/PDF/JXpathTutorial.pdf"&gt;JXPath Tutorial (pdf)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-03-2007/jw-03-jxpath.html"&gt;Java object queries using JXPath&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oracle.com/technetwork/articles/javase/index-140168.html"&gt;Java Architecture for XML Binding (JAXB)&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://es.wikipedia.org/wiki/XPath"&gt;XPath&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://balteus.blogspot.com/2009/09/banco-de-experiencias-iv-librerias.html"&gt;Banco de experiencias (IV): librerías imprescindibles en Java&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4580756782293244806?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4580756782293244806/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/10/combinando-xpath-con-jaxb.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4580756782293244806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4580756782293244806'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/10/combinando-xpath-con-jaxb.html' title='Combinando XPath con JAXB'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-pUmQ2UqbtnU/TnSZPyIG-8I/AAAAAAAABEY/zn1kDMynD_Q/s72-c/lupa400.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-90540969528628854</id><published>2011-09-13T11:36:00.001+02:00</published><updated>2011-09-14T10:48:26.050+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><title type='text'>Sincronización de llamadas a Webservices y EJB</title><content type='html'>&lt;div style="text-align: right;"&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://xkcd.com/764/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="190" src="http://4.bp.blogspot.com/-eOzNjXPQk3Q/Tm4LWGf0kjI/AAAAAAAABEU/d7e-6g5a_Kc/s200/one_two.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: tahoma;"&gt;&lt;blockquote&gt;&lt;i&gt;A la vista de suficientes ojos, todos los errores resultan evidentes.&lt;/i&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Ley_de_Linus"&gt;Ley de Linus&lt;/a&gt;, formulada por Linus Torvalds, (1997).&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Los servidores de aplicaciones y la arquitectura J2EE fue diseñada desde el principio con el multithreading en mente. La idea de escalabilidad y procesamiento paralelo de forma segura ha sido en una constante en su desarrollo y evolución para que los desarrolladores pudiéramos construir aplicaciones seguras sin preocuparnos de asuntos como la gestión de memoria o la sincronización de objetos.&lt;br /&gt;&lt;br /&gt;Sin embargo, para las aplicaciones "de la vida real" nos encontramos con que algunas veces tenemos que "&lt;i&gt;serializar&lt;/i&gt;" (en el sentido de alinear poniendo en serie, encolar manteniendo un orden y como contraposición al procesamiento paralelo) llamadas o procesamientos concretos... Algo para lo que J2EE no fue pensado desde el principio. Así, en el diseño y construcción de aplicaciones empresariales se suelen dar una serie de necesidades relacionadas entre si que, hasta hace poco, no han tenido solución directa manejada en el estándar JEE:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;Serialización o sincronización de procesamiento de peticiones de un webservice&lt;/u&gt;. Es decir, poder hacer un WebService como si fuese un Servlet &lt;a href="http://download.oracle.com/javaee/5/api/javax/servlet/SingleThreadModel.html"&gt;SingleThreadModel&lt;/a&gt; (ya obsoleto, por cierto). En definitiva: garantizar que no se atiende otra petición mientras se está atendiendo ya una, evitando la simultaneidad y por tanto evitando también duplicidad de procesamientos realizada por un cliente demasiado &lt;i&gt;impaciente&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;&lt;u&gt;Serialización o proceso ordenado de los mensajes de una cola JMS&lt;/u&gt; o, lo que es lo mismo, mantenimiento del orden de llegada en el procesamiento de los mensajes. Esto, que podría parecer obvio, no lo es tanto, ya que para un MDB (Message Driven Bean), el contenedor crea un pool de objetos que trabajan en paralelo de forma que si se sacan 2 o 4 mensajes simultáneamente, puede ser que un mensaje más reciente se tarde menos en procesar que un mensaje anterior.&lt;/li&gt;&lt;li&gt;Instanciación de un &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;singleton&lt;/a&gt;, patrón en principio no permitido por la especificación J2EE (hasta la reciente EJB 3.1, de la que hablaré más adelante). El patrón singleton es tremendamente necesario para asegurar la instanciación única de motores o manejadores de objetos (conexiones, datos, cachés, clientes, etc) que deben estar perfectamente sincronizados.&lt;/li&gt;&lt;/ul&gt;El que no haya tenido que solucionar este problema podrá pensar que nada más fácil como especificar al servidor que instancie un pool de tamaño 1 para el EJB/MDB que queramos y, &lt;i&gt;voilà&lt;/i&gt;, problema solucionado. La idea es buena. Si aseguramos una y sólo una exclusiva y única instancia de nuestro EJB, podemos resolver las tres necesidades de un sólo plumazo: podríamos publicar dicho EJB como un Webservice, tener un sólo MDB o tener nuestro Singleton.... Por ejemplo, en el caso de Glassfish, podríamos indicarlo en el correspondiente fichero sun-ejb-jar.xml, de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml; gutter: false;"&gt;&lt;sun-ejb-jar&gt;&lt;br /&gt;    &lt;enterprise-beans&gt;&lt;br /&gt;        &lt;ejb&gt;&lt;br /&gt;            &lt;ejb-name&gt;DataProviderService&lt;/ejb-name&gt;&lt;br /&gt;            &lt;bean-pool&gt;&lt;br /&gt;                &lt;steady-pool-size&gt;1&lt;/steady-pool-size&gt;&lt;br /&gt;                &lt;resize-quantity&gt;1&lt;/resize-quantity&gt;&lt;br /&gt;                &lt;max-pool-size&gt;1&lt;/max-pool-size&gt;&lt;br /&gt;                &lt;pool-idle-timeout-in-seconds&gt;0&lt;/pool-idle-timeout-in-seconds&gt;&lt;br /&gt;            &lt;/bean-pool&gt;&lt;br /&gt;        &lt;/ejb&gt;&lt;br /&gt;    &lt;/enterprise-beans&gt;&lt;br /&gt;&lt;/sun-ejb-jar&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pero lamentablemente no es así: &lt;b&gt;no funciona&lt;/b&gt;. Al menos en Weblogic, Glassfish y JBoss. Dudo que eso sea posible en ninguno. La razón es sencilla: el contenedor no está diseñado para eso, sino justamente para lo contrario, con lo que conseguiremos un nivel altísimo de reciclado de instancias, pero no conseguiremos mantener la misma instancia de forma permanente sin que la recicle el servidor. Tampoco haciendo variaciones con esos parámetros. Tras un número suficiente de pruebas comprobaremos que el servidor recicla y mantiene, aunque sea durante pocos instantes, varias instancias del mismo EJB.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Las soluciones&lt;/h3&gt;En principio hay tres soluciones válidas.&lt;br /&gt;&lt;br /&gt;Si estás usando JEE 5 o inferior, es decir, un contenedor EJB 3.0 o inferior, tienes dos soluciones a tu alcance que básicamente pasan por mantener la sincronización &lt;i&gt;fuera&lt;/i&gt; del servidor de aplicaciones: crear un JMX MBean o sincronizar por tu cuenta. Si estás usando JEE 6, estás de enhorabuena. Aquí están mis propuestas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Usar un MBean de &lt;a href="http://es.wikipedia.org/wiki/Java_Management_Extensions"&gt;JMX&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Un MBean es, en definitiva, un singleton accesible vía JMX. No es un objeto manejado por el contenedor de EJB ni un estándar JEE, pero es una solución más elegante que realizar un Singleton por código ya que podemos controlar su ciclo de vida e incluso acceder a su estado de manera remota. Eso si, como decía, la sincronización de los objetos que use (colas JMS, etc) corre por nuestra cuenta. El problema del WebService lo podemos reducir a un problema de JMS, ya que podríamos publicar los mensajes en una cola y extraerlos uno a uno haciendo que nuestro MBean sea un cliente JMS.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Usar un recurso sincronizable&lt;/b&gt;&lt;br /&gt;Un mismo EJB puede ejecutarse en diferentes JVM's. El ciclo de vida de los objetos y su concurrencia es cosa del contenedor. Por tanto, declarar un método de un EJB como "synchronized" es una violación de la especificación y no debería ser una opción. Por tanto, nuestros EJB's deberán usar un objeto manejado que pueda ser sincronizado: bien un Singleton propio (si nos basta con sincronizar para una única JVM), bien usando la transacciones serializables de base de datos (si necesitamos sincronizar entre varias JVM's o queremos hacerlo más escalable).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Crear un Singleton Session Bean&lt;/b&gt;&lt;br /&gt;Si puedes usar un contenedor JEE 6 compatible, puedes implementar un &lt;a href="http://download.oracle.com/javaee/6/tutorial/doc/gipvi.html"&gt;Singleton Session Bean&lt;/a&gt;. Ésta es por fin la solución adecuada dentro del estándar JEE: un singleton manejado con atributos para controlar la sincronización. Con este método se solucionan de un plumazo todas las cuestiones de sincronización o singletons de una forma segura y manejada por parte del contenedor EJB.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/javase/6/docs/technotes/guides/jmx/index.html"&gt;Java Management Extensions (JMX) Technology&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dosideas.com/noticias/java/528-ejb-31-un-paso-importante-hacia-la-madurez.html"&gt;EJB 3.1: un paso importante hacia la madurez&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-dcl/index.html"&gt;Double-checked locking and the Singleton pattern&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/Programming/singletons/"&gt;When is a Singleton not a Singleton?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-90540969528628854?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/90540969528628854/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/09/sincronizacion-de-llamadas-webservices.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/90540969528628854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/90540969528628854'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/09/sincronizacion-de-llamadas-webservices.html' title='Sincronización de llamadas a Webservices y EJB'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-eOzNjXPQk3Q/Tm4LWGf0kjI/AAAAAAAABEU/d7e-6g5a_Kc/s72-c/one_two.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2439454910634663054</id><published>2011-07-28T14:42:00.003+02:00</published><updated>2011-07-29T09:06:35.900+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><title type='text'>Cambiar la URL de conexión y establecer timeout a un Web Service JAX-WS</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-bPoi3Gp5HV4/Til4YkpfqMI/AAAAAAAABEM/S19t_DKmOzI/s1600/aDSCN7158.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-bPoi3Gp5HV4/Til4YkpfqMI/AAAAAAAABEM/S19t_DKmOzI/s200/aDSCN7158.jpg" width="150" /&gt;&lt;/a&gt;&lt;/div&gt;En el &lt;a href="http://balteus.blogspot.com/2011/06/jax-ws-web-services-con-maven.html"&gt;artículo anterior&lt;/a&gt; explicaba cómo realizar un cliente de Web Service JAX-WS con maven. Las herramientas de JAX-WS generan la url de conexión (endpoint) a partir de la url definida en el WSDL. Sin embargo, desplegar nuestro cliente en un entorno de producción final requerirá que realicemos una programación un poco más afinada y parametrizada permitiendo cambiar la url de conexión (típicamente hacia el servicio de producción final) y establecer timeouts.&lt;br /&gt;&lt;br /&gt;Establecer los timeouts es extremadamente recomendable para prevenir que nuestra aplicación se quede "pegada" al servicio y eventualmente pueda bloquearse toda nuestra aplicación al quedarnos sin threads libres, ya que los tiempos máximos de espera suelen estar indefinidos por defecto.&lt;br /&gt;&lt;br /&gt;Para especificar todo esto no es necesario regenerar el cliente. La práctica habitual es parametrizar los valores de URL, timeout de conexión y timeout de lectura (request timeout) usando algún fichero de configuración o similar, recuperarlos y especificarlos en nuestro proxy cliente.&lt;br /&gt;&lt;br /&gt;A continuación dejo un snippet de código típico de ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java; gutter: false;"&gt;import javax.xml.ws.BindingProvider;&lt;br /&gt;import com.sun.xml.ws.client.BindingProviderProperties;&lt;br /&gt;...&lt;br /&gt;int requestTimeout = 5000;&lt;br /&gt;int connectTimeout = 500;&lt;br /&gt;String nuevaUrl = "http://www.cestel.es/jdialer/dataProvider";&lt;br /&gt;&lt;br /&gt;Jdialer jdialer = new Jdialer();&lt;br /&gt;BindingProvider bp = (BindingProvider) jdialer.getDataproviderPort();&lt;br /&gt;bp.getRequestContext().put(BindingProviderProperties.REQUEST_TIMEOUT,&lt;br /&gt;		requestTimeout);&lt;br /&gt;bp.getRequestContext().put(BindingProviderProperties.CONNECT_TIMEOUT,&lt;br /&gt;		connectTimeout);&lt;br /&gt;bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,&lt;br /&gt;				nuevaUrl);&lt;/pre&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2439454910634663054?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2439454910634663054/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/07/cambiar-la-url-de-conexion-y-establecer.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2439454910634663054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2439454910634663054'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/07/cambiar-la-url-de-conexion-y-establecer.html' title='Cambiar la URL de conexión y establecer timeout a un Web Service JAX-WS'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-bPoi3Gp5HV4/Til4YkpfqMI/AAAAAAAABEM/S19t_DKmOzI/s72-c/aDSCN7158.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4935063201517979294</id><published>2011-06-19T18:50:00.004+02:00</published><updated>2011-07-29T09:09:47.744+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>JAX-WS Web Services con Maven</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-DlOZIRRZc0M/Tf4kf3jYTkI/AAAAAAAABDE/1oDa1SUjB24/s1600/http.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/-DlOZIRRZc0M/Tf4kf3jYTkI/AAAAAAAABDE/1oDa1SUjB24/s200/http.jpeg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Como decía en "&lt;a href="http://balteus.blogspot.com/2010/03/generacion-de-codigo-jaxb-con-maven.html"&gt;Generación de código JAXB con Maven&lt;/a&gt;", una de las ventajas que aporta maven es la capacidad de automatizar tareas repetitivas y reproducibles del proyecto de desarrollo en el propio gestor del ciclo de vida del mismo independizándolo de la herramienta de desarrollo.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si necesitamos acceder a un Web Service tenemos que generar los artefactos cliente que permitan "consumirlo" (Service Endpoint Interface -SEI-, clases valor de dependencias, etc...) y cada vez que cambie en algo el servicio tendremos que regenerar nuestros artefactos. Si esta tarea se realiza con un IDE, siempre necesitaremos el mismo IDE para actualizarla y (probablemente) pasar por algún tedioso &lt;i&gt;wizard&lt;/i&gt;. Con maven, basta tener nuestros fuentes y el fichero pom.xml para que nuestro proyecto se construya en un momento sin instalar ni configurar nada.&lt;br /&gt;&lt;br /&gt;El plugin &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;jaxws-maven-plugin&lt;/span&gt; provee los adaptadores para las herramientas &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;wsgen&lt;/span&gt; y &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;wsimport&lt;/span&gt; de JAXWS a través de los goals jaxws:wsgen y jaxws:wsimport para crear web services y clientes de éstos respectivamente. &lt;br /&gt;&lt;br /&gt;Para crear un web service, bastará con indicar el SEI en la sección execution del plugin y  las opciones que queramos (en este caso, generar el fichero WSDL. Por ejemplo:&lt;br /&gt;&lt;pre class="brush:xml; gutter: false;"&gt;&lt;plugin&gt;&lt;br /&gt;    &lt;groupid&gt;org.codehaus.mojo&lt;/groupid&gt;&lt;br /&gt;    &lt;artifactid&gt;jaxws-maven-plugin&lt;/artifactid&gt;&lt;br /&gt;    &lt;version&gt;1.10&lt;/version&gt;&lt;br /&gt;        &lt;executions&gt;&lt;br /&gt;            &lt;execution&gt;&lt;br /&gt;                &lt;id&gt;1&lt;/id&gt;&lt;br /&gt;                &lt;goals&gt;&lt;br /&gt;                    &lt;goal&gt;wsgen&lt;/goal&gt;&lt;br /&gt;                &lt;/goals&gt;&lt;br /&gt;                &lt;configuration&gt;&lt;br /&gt;                     &lt;sei&gt;cestel.jdialer.provider.DataProviderService&lt;/sei&gt;&lt;br /&gt;                     &lt;genwsdl&gt;true&lt;/genwsdl&gt;&lt;br /&gt;                &lt;/configuration&gt;&lt;br /&gt;            &lt;/execution&gt;&lt;br /&gt;        &lt;/executions&gt;&lt;br /&gt;    &lt;/plugin&gt;&lt;/pre&gt;Si queremos crear un cliente para un determinado servicio especificaremos, como habitualmente, el fichero de definición WSDL, el paquete donde queremos que se generen los artefactos y el directorio donde se generarán los ficheros fuente. Por ejemplo:&lt;br /&gt;&lt;pre class="brush:xml; gutter: false;"&gt;&lt;plugin&gt;&lt;br /&gt;    &lt;groupid&gt;org.codehaus.mojo&lt;/groupid&gt;&lt;br /&gt;    &lt;artifactid&gt;jaxws-maven-plugin&lt;/artifactid&gt;&lt;br /&gt;    &lt;version&gt;1.10&lt;/version&gt;&lt;br /&gt;        &lt;executions&gt;&lt;br /&gt;            &lt;execution&gt;&lt;br /&gt;                &lt;id&gt;1&lt;/id&gt;&lt;br /&gt;                &lt;goals&gt;&lt;br /&gt;                    &lt;goal&gt;wsimport&lt;/goal&gt;&lt;br /&gt;                &lt;/goals&gt;&lt;br /&gt;                &lt;configuration&gt;&lt;br /&gt;                    &lt;wsdlurls&gt;&lt;br /&gt;                        &lt;wsdlurl&gt;${project.build.directory}/jaxws/wsgen/wsdl/Jdialer.wsdl&lt;/wsdlurl&gt;&lt;br /&gt;                    &lt;/wsdlurls&gt;&lt;br /&gt;                    &lt;packagename&gt;gesif.sgi.jdialer.dataprovider&lt;/packagename&gt;&lt;br /&gt;                    &lt;sourcedestdir&gt;${basedir}/src/main/java&lt;/sourcedestdir&gt;&lt;br /&gt;                &lt;/configuration&gt;&lt;br /&gt;            &lt;/execution&gt;&lt;br /&gt;        &lt;/executions&gt;&lt;br /&gt;    &lt;/plugin&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.oracle.com/enterprisetechtips/entry/using_jax_ws_with_maven"&gt;Using JAX-WS with maven&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jax-ws-commons.java.net/jaxws-maven-plugin/"&gt;JAX-WS maven plugin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://balteus.blogspot.com/2011/07/cambiar-la-url-de-conexion-y-establecer.html"&gt;Cambiar la url de conexión y establecer timeout a un Web Service JAX-WS&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4935063201517979294?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4935063201517979294/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/06/jax-ws-web-services-con-maven.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4935063201517979294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4935063201517979294'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/06/jax-ws-web-services-con-maven.html' title='JAX-WS Web Services con Maven'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-DlOZIRRZc0M/Tf4kf3jYTkI/AAAAAAAABDE/1oDa1SUjB24/s72-c/http.jpeg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4998921137697010749</id><published>2011-05-19T00:48:00.003+02:00</published><updated>2011-05-20T11:44:43.516+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sistemas'/><category scheme='http://www.blogger.com/atom/ns#' term='herramientas'/><title type='text'>Cerrar una sesión de telnet ordenadamente</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--hESyVMAmEw/TdQsTRQffPI/AAAAAAAABCE/80CBdx1bRls/s1600/instant%25C3%25A1nea10.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/--hESyVMAmEw/TdQsTRQffPI/AAAAAAAABCE/80CBdx1bRls/s1600/instant%25C3%25A1nea10.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;telnet towel.blinkenlights.nl&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Antes de que el ssh se extendiera como la forma de inicio de sesión remota a servidores UNIX y Linux, era frecuente realizar sesiones de telnet para acceso a una consola del servidor. Actualmente, el uso del telnet se limita prácticamente a realizar sesiones 5250 o 3270 hacia AS/400 o Mainframes o se reduce a realizar meras pruebas de conectividad TCP básicas cuando no tenemos el &lt;a href="http://www.hping.org/"&gt;hping&lt;/a&gt; a mano y un tcptraceroute nos resulta teclear demasiado.&lt;br /&gt;&lt;br /&gt;Siempre que realizamos un telnet solemos ver un mensaje "&lt;span style="background-color: white; color: black; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Escape character is '^]'.&lt;/span&gt;" como el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span id="internal-source-marker_0.6677783540181208" style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;zarza@szarza:~$ telnet ftp.es.debian.org 80&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Trying 82.194.78.250...&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Connected to ftp.es.debian.org.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Escape character is '^]'.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;span style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;^]&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;telnet&amp;gt; quit&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;Connection closed.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-size: 10pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"&gt;szarza@szarza:~$&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Hasta ahora, nunca había sabido cancelar las conexiones de telnet que se quedaban pegadas, así que acababa matando la sesión cerrando el proceso padre del telnet (konsole, xterm, cmd.exe, etc) porque no me había preocupado de saber cómo obtener y enviar la famosa secuencia "^]". Sin embargo, es bastante sencillo: &lt;b&gt;se trata de la combinación CTRL+ALT GR+]&lt;/b&gt;, lo cual es lógico: "^" significa CTRL y el carácter ] se obtiene pulsando la tecla "Alt Gr"+]. Una vez en el prompt del telnet, podemos poner "quit" para salir.&lt;br /&gt;&lt;br /&gt;Por otro lado, este artículo me ha servido para comprobar que &lt;a href="http://www.blinkenlights.nl/services.html"&gt;sigue estando disponible&lt;/a&gt; la película Star Wars Episode IV en ASCII vía telnet haciendo "&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;telnet towel.blinkenlights.nl&lt;/span&gt;" gracias a &lt;a href="http://www.asciimation.co.nz/"&gt;Simon Jansen&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4998921137697010749?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4998921137697010749/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/05/cerrar-una-sesion-de-telnet.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4998921137697010749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4998921137697010749'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/05/cerrar-una-sesion-de-telnet.html' title='Cerrar una sesión de telnet ordenadamente'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/--hESyVMAmEw/TdQsTRQffPI/AAAAAAAABCE/80CBdx1bRls/s72-c/instant%25C3%25A1nea10.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-7552476375174916312</id><published>2011-05-07T21:04:00.005+02:00</published><updated>2011-05-07T23:27:58.044+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><title type='text'>Solar System Scope: el sistema solar a tu alcance</title><content type='html'>&lt;blockquote&gt;&lt;div style="text-align: right;"&gt;&lt;small&gt;&lt;span style="font-family: tahoma;"&gt;&lt;big&gt;&lt;i&gt;Lo maravilloso de aprender algo, es que nadie puede arrebatárnoslo.&lt;/i&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;-- B. B, King.&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-z1MLJKNskfE/TcWAw3f5wZI/AAAAAAAABAY/Duhjyt0rzto/s1600/instant%25C3%25A1nea8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="512" src="http://4.bp.blogspot.com/-z1MLJKNskfE/TcWAw3f5wZI/AAAAAAAABAY/Duhjyt0rzto/s640/instant%25C3%25A1nea8.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Hace casi dos años, escribí un &lt;a href="http://balteus.blogspot.com/2009/06/sideralis-un-stellarium-en-tu-movil.html"&gt;artículo&lt;/a&gt; sobre Sideralis, un planetario para móviles gratuito muy práctico. Desde entonces hasta ahora los móviles han cambiado mucho y han aparecido productos software espectaculares para astronomía en todas las plataformas. Por ejemplo, he tenido la ocasión de ver &lt;a href="http://www.gosoftworks.com/GoSoftWorks/Home.html"&gt;GoSkyWatch&lt;/a&gt; funcionando en un iPhone 4 y es realmente impresionante.&lt;br /&gt;&lt;br /&gt;Pero lo que hoy traigo aquí es igualmente impresionante, y no hace falta ni tener un iPhone ni siquiera instalarse nada, tan sólo un navegador y curiosidad.&lt;br /&gt;&lt;a href="http://www.solarsystemscope.com/"&gt;Solar System Scope&lt;/a&gt; es un simulador interactivo 3D del sistema solar online realmente espectacular. A diferencia de otros simuladores 2D estáticos (&lt;a href="http://space.jpl.nasa.gov/"&gt;como el de la NASA&lt;/a&gt;) o dinámicos (&lt;a href="http://gunn.co.nz/astrotour/"&gt;como el de Gunn Interactive&lt;/a&gt;), éste permite movernos a través del sistema solar con total libertad de navegación e incluso de representación, ya que nos permite cambiar la escala del sistema (tanto en distancia como en tamaño de los objetos).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-04-OaA7SVC4/TcWOPNz5EHI/AAAAAAAABAc/hpeWn8T5frg/s1600/instant%25C3%25A1nea9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="512" src="http://2.bp.blogspot.com/-04-OaA7SVC4/TcWOPNz5EHI/AAAAAAAABAc/hpeWn8T5frg/s640/instant%25C3%25A1nea9.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;No sólo es un buen simulador del sistema solar: &lt;b&gt;es el mejor que he visto&lt;/b&gt;. Sus posibilidades de interacción lo hacen tan entretenido, que te puedes pasar un buen rato jugando con múltiples ángulos de observación (desde cada planeta haciendo doble clic) y observando las posiciones y movimientos a través de una representación desproporcionada para que nos quepan todos los planetas en pantalla.&lt;br /&gt;&lt;br /&gt;Como elemento didáctico para los niños, es verdaderamente genial, porque se puede jugar con la escala para enseñarles (al poner el sistema en escala real) las enormes distancias del sistema, cómo Urano gira tumbado con sus anillos prácticamente en vertical con respecto al plano orbital, mostrar las fases de la luna y por qué vemos siempre su misma cara, que no sólo Saturno tiene anillos o el extraño amanecer de Venus por el Oeste.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://2.gvt0.com/vi/_943XB4gcN4/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/_943XB4gcN4&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/_943XB4gcN4&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Aunque aún le faltan funcionalidades por terminar (como la localización de estrellas o planetas), puedes comprobar que tiene una interfaz muy sencilla que te hará pasar un rato ameno y entretenido aprendiendo o visualizando aquello que aprendimos hace años. Prúebalo y me cuentas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.solarsystemscope.com/"&gt;Solar System Scope&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://gunn.co.nz/astrotour/"&gt;Simulador de Gunn Interactive&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://space.jpl.nasa.gov/"&gt;Simulador de la NASA&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-7552476375174916312?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/7552476375174916312/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/05/solar-system-scope-el-sistema-solar-tu.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7552476375174916312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7552476375174916312'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/05/solar-system-scope-el-sistema-solar-tu.html' title='Solar System Scope: el sistema solar a tu alcance'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-z1MLJKNskfE/TcWAw3f5wZI/AAAAAAAABAY/Duhjyt0rzto/s72-c/instant%25C3%25A1nea8.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4167591831828730177</id><published>2011-04-17T00:39:00.001+02:00</published><updated>2011-04-19T12:57:24.327+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='herramientas'/><category scheme='http://www.blogger.com/atom/ns#' term='alternativas'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>PowerDesigner free alternatives... or something close (for PostgreSQL minimum)</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;h2&gt;Herramientas de modelado de datos gratuitas (para PostgreSQL)&lt;/h2&gt;&lt;br /&gt;Las herramientas de modelado de datos son muy útiles a la hora de realizar un diseño de datos nuevo o acercarnos a la comprensión y estudio de un modelo existente (en aquellas con características de ingeniería inversa). La capacidad de realizar un diseño de modelo visualizándolo de forma gráfica, a través de los &lt;a href="http://es.wikipedia.org/wiki/Modelo_entidad-relaci%C3%B3n"&gt;Diagramas E-R&lt;/a&gt;, o de obtener un diagrama y documentación de una base de datos existente aumenta enormemente la eficiencia de nuestro trabajo reduciendo drásticamente el tiempo necesario con respecto a una realización manual de dichas tareas de diseño, análisis y estudio.&lt;br /&gt;&lt;br /&gt;La mejor y más completa herramienta de modelado que conozco es &lt;a href="http://www.sybase.com/products/modelingdevelopment/powerdesigner"&gt;PowerDesigner&lt;/a&gt;&lt;sup&gt;©&lt;/sup&gt;. No es objeto de este artículo describir la enorme cantidad de características que tiene, ni lo perfectamente resuelto que están en ella las tareas de modelado e ingeniería directa e inversa, pero te aseguro que es casi perfecta, contemplando todo el ciclo de modelado (lógico y físico, con multitud de bases de datos) de datos, además de otras tareas de modelado como el de objetos (con generación de código), esquemas xml, etc...&lt;br /&gt;&lt;br /&gt;PowerDesigner tiene, empero, un (grave) inconveniente: sólo está disponible para Windows, y en Sybase/SAP no se han preocupado (al contrario que otras compañías, como por ejemplo &lt;a href="http://www.spotify.com/"&gt;Spotify&lt;/a&gt;) de que pueda ejecutarse con &lt;a href="http://es.wikipedia.org/wiki/Wine"&gt;Wine&lt;/a&gt; perfectamente.&lt;br /&gt;&lt;br /&gt;Vale. Así que tenemos Linux (por ejemplo) y no podemos ejecutar PowerDesigner pero necesitamos una herramienta que nos ayude en nuestro trabajo. ¿Qué alternativas hay?. He buscado en internet &lt;i&gt;"herramientas de modelado de datos"&lt;/i&gt;, &lt;i&gt;"data modelling tools"&lt;/i&gt;, &lt;i&gt;"PowerDesigner alternatives"&lt;/i&gt;... con resultados decepcionantes: apenas listas de herramientas poco comentadas o algún comentario en foros... Así que me puse manos a la obra a buscar por mi cuenta y compartirlo con la comunidad.&lt;br /&gt;&lt;br /&gt;Lo primero que hay que tener en cuenta es que no existe ninguna herramienta gratuita alternativa comparable a PowerDesigner, ni por calidad ni cantidad de características. Pero existen herramientas bastante decentes (para ser gratuitas) que nos pueden servir para la mayor parte de nuestras necesidades. De hecho, hay una &lt;a href="http://www.databaseanswers.org/modelling_tools.htm"&gt;lista&lt;/a&gt; publicada con una cantidad enorme de herramientas diferentes de modelado que me llevaría muchos días probar. Así que, &lt;a href="http://balteus.blogspot.com/2009/05/open-source-brebrms-jsr-94-compliant.html"&gt;como en otras ocasiones&lt;/a&gt;, fijé una serie de características y condicionantes necesarios para mi, con lo que el número de herramientas candidatas se redujo considerablemente. Mi lista de características y condiciones ha sido la siguiente:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Debe estar disponible para Linux, como mínimo. &lt;/li&gt;&lt;li&gt;Debe tener características de modelado de datos (no basta con una herramienta de diagramas o que sea sólo para UML)&lt;/li&gt;&lt;li&gt;Debe tener características de ingeniería directa e inversa.&lt;/li&gt;&lt;li&gt;Debe soportar (para la ingeniería directa e inversa) como mínimo, PostgreSQL. Adicionalmente se valorará otras bases de datos como MySQL, Oracle, SQL Server, DB2, Derby, etc...&lt;/li&gt;&lt;li&gt;Debe tener características de documentación: generar diagramas E-R, y documentación de la base de datos. &lt;/li&gt;&lt;li&gt;Por supuesto, debe ser gratuita y, preferentemente, libre.&lt;/li&gt;&lt;/ul&gt;A continuación, os detallo las herramientas analizadas&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://www.codebydesign.com/"&gt;Open System Architect 4.0.0&lt;/a&gt;&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-JFN5kUITvdQ/TajEqtCaaMI/AAAAAAAAA_M/CONhUt91GfE/s1600/Open+System+Architect+4.0.0.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-JFN5kUITvdQ/TajEqtCaaMI/AAAAAAAAA_M/CONhUt91GfE/s400/Open+System+Architect+4.0.0.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Es Open Source. Frecuencia de actualización: desconocida.&lt;br /&gt;De todas las herramientas, analizadas es la que más se parece (dicho esto con todas las cautelas y salvando mucho, mucho las diferencias) a PowerDesigner, y es la que más características y posibilidades incorpora. Por ejemplo, es la única de las analizadas que integra el modelado lógico. Tiene la mejor organización de proyectos y menús y es rápida. Me han gustado muchos aspectos que aparentemente la podrían convertir en la más completa...sin embargo, también es la que más me ha decepcionado en el resultado final. El acceso a las bases de datos es vía ODBC (es la única de las analizadas que no está hecha en Java), lo cual me ha resultado un poco arcaico y engorroso de configurar, aunque al final ese no ha sido el inconveniente, sino la falta de acabados finales que hacían perder la lucidez de las funcionalidades:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Diagramas&lt;/li&gt;&lt;ul&gt;&lt;li&gt;los diagramas generados son feos (si bien este inconveniente es generalizado en todas las herramientas analizadas)&lt;/li&gt;&lt;li&gt;faltan opciones de presentación gráficas, de reordenado y de diseño de las tablas y sus relaciones&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Ingeniería inversa:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;La importación de tablas no es cómoda y no se sabe muy bien de qué esquemas estás importando. No puedes agregar tablas referenciadas relacionadas (hijas) o que la relacionen (padres) automáticamente.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Documentación:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;No encontré las características de documentación mínimas que buscaba.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;En definitiva, debería ser la mejor... pero al final no me ha gustado. Es como si te montas en un Mercedes, que hace ruido, no tiene aire acondicionado y la dirección y el cambio son muy duros. No me ha resultado cómoda y no la voy a usar. Estaré atento a futuras versiones si es que se producen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://www.sqlpower.ca/page/architect"&gt;SQL Power Architect 1.0.6&lt;/a&gt;&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5n0QrbL1yxo/TajJoYXXtgI/AAAAAAAAA_Q/7DBFBb9aPGk/s1600/SQL+Power+Architect+1.0.6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-5n0QrbL1yxo/TajJoYXXtgI/AAAAAAAAA_Q/7DBFBb9aPGk/s400/SQL+Power+Architect+1.0.6.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Aunque es un producto comercial, la versión community es Open Source y gratuíta.Frecuencia de actualización: alta. &lt;br /&gt;&lt;br /&gt;La versión community gratuita es suficiente para un trabajo de modelado básico. Soporta ingeniería directa e&amp;nbsp; inversa de forma cómoda (se pueden agregar fácilmente las tablas hijas) con bastantes opciones gráficas de presentación. Es rápido, amigable y con él se puede generar una documentación mínima decente. De todos los analizados es el que menos opciones de modelado y documentación tiene, aunque cumple su cometido muy dignamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://www.squirrelsql.org/"&gt;SQuirreL SQL 3.2.1&lt;/a&gt;&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RWIt7CXvLQU/TajUh6oMhVI/AAAAAAAAA_U/l6Z81CRhHA0/s1600/SQuirrel+3.2.1.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-RWIt7CXvLQU/TajUh6oMhVI/AAAAAAAAA_U/l6Z81CRhHA0/s400/SQuirrel+3.2.1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Open Source. Alta actualización. Esta herramienta es en realidad un cliente SQL multi-bases-de-datos (bastante bueno, la verdad) con capacidades de modelado e ingeniería directa e inversa.&lt;br /&gt;&lt;br /&gt;SQuirrel no destaca por sus capacidades gráficas de diagramas E-R. La organización de las tablas en una importación vía ingeniería inversa deja bastante que desear (como se puede observar) aunque salvando el detalle de tener que organizar y posicionar las tablas a mano, tenemos suficientes opciones para añadir tablas referenciadas o elegir la presentación de las tablas. Sin embargo, como he comentado, SQuirrel es un cliente multipropósito y multibase bastante completo, con muchos plugins y potentes editores de datos, SQL, DML y esquemas. Este es probablemente el más completo multi-propósito de todos los analizados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://druid.sourceforge.net/"&gt;Druid III (3.11)&lt;/a&gt;&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2h5VJVId9t8/TajZRIUngpI/AAAAAAAAA_Y/Cp7x9KA1klU/s1600/Druid+3.11.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-2h5VJVId9t8/TajZRIUngpI/AAAAAAAAA_Y/Cp7x9KA1klU/s400/Druid+3.11.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Open Source. Frecuencia actualización: Alta &lt;br /&gt;&lt;br /&gt;Druid es fundamentalmente una herramienta pensada para crear bases de datos de forma gráfica y documentarlas. Su capacidad de documentación de bases de datos supera a todas las del análisis: es capaz de generar documentación tipo javadoc de una base de datos con los diagramas E-R y sus tablas de forma detallada, como se puede comprobar en la siguiente ilustración.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9ygzxak-wU4/TaoMo5ZNg6I/AAAAAAAAA_c/eR61-0_4U4c/s1600/Druid+3.11_htmldoc.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="282" src="http://3.bp.blogspot.com/-9ygzxak-wU4/TaoMo5ZNg6I/AAAAAAAAA_c/eR61-0_4U4c/s400/Druid+3.11_htmldoc.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;La interfaz es un poco "extraña" (por llamarla de alguna manera) y muy poco intuitiva (probablemente la peor interfaz de todas). Sin embargo, si quieres documentar una base de datos, ésta es tu heramienta. Permite documentar una base de datos existente vía ingeniería inversa, realizando diagramas temáticos y realizando documentación adicional, de forma muy sencilla, añadiendo tablas relacionadas, y presentando la información que deseemos. En todo caso, a pesar de que le faltan opciones gráficas de zooming y layout y de tener una interfaz difícil, para documentar una base de datos vía ingeniería inversa, es la que más me ha gustado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Resumen:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Todos tienen carencias en la presentación de los diagramas E-R: faltan opciones de "layout" y los diagramas son poco vistosos.&lt;/li&gt;&lt;li&gt;Todos son multiplataforma (todos salvo Open Systems Architect están hechos en Java).&lt;/li&gt;&lt;li&gt;Todas las herramientas son válidas. Y deberías probarlas todas. Ahora bien, cada una tiene un punto fuerte&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Documentación: Druid&lt;/li&gt;&lt;li&gt;Algo para empezar, sencillo: SQL Power Architect.&lt;/li&gt;&lt;li&gt;Cliente completo, todo en uno: SQuirrel&lt;/li&gt;&lt;li&gt;OSA no me ha gustado, a pesar de ser la única que incorpora modelado lógico de forma explícita. &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;Todo esto, como siempre, es cuestión de gustos y de necesidades concretas. Así que, &lt;a href="http://balteus.blogspot.com/2009/07/alternativas-gratuitas-ms-project.html"&gt;como en otras ocasiones&lt;/a&gt;, recomiendo probar y sacar conclusiones... y si las compartes conmigo comentando, te lo agradezco.&lt;br /&gt;&lt;br /&gt;¿Conoces alguna otra herramienta que cumpla las condiciones iniciales?&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.databaseanswers.org/modelling_tools.htm"&gt;Modelling tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools"&gt;PostgreSQL GUI Tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sqlpower.ca/page/architect"&gt;SQL Power Architect&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.squirrelsql.org/"&gt;SQuirrel SQL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://druid.sourceforge.net/"&gt;Druid&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codebydesign.com/"&gt;Open Systems Architect&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4167591831828730177?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4167591831828730177/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/04/powerdesigner-free-alternatives-or.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4167591831828730177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4167591831828730177'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/04/powerdesigner-free-alternatives-or.html' title='PowerDesigner free alternatives... or something close (for PostgreSQL minimum)'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-JFN5kUITvdQ/TajEqtCaaMI/AAAAAAAAA_M/CONhUt91GfE/s72-c/Open+System+Architect+4.0.0.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-8616554641680821376</id><published>2011-03-21T00:01:00.002+01:00</published><updated>2011-03-22T00:24:48.676+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><title type='text'>java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://lh3.googleusercontent.com/-r5IksLZAot8/TYKJseFf5xI/AAAAAAAAA-k/9zWEujnrxCc/s1600/glazik1step600.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="https://lh3.googleusercontent.com/-r5IksLZAot8/TYKJseFf5xI/AAAAAAAAA-k/9zWEujnrxCc/s200/glazik1step600.jpeg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: right;"&gt;&lt;small&gt;&lt;span style="font-family: tahoma;"&gt;&lt;big&gt;&lt;i&gt;Ver lo que tenemos delante de nuestras narices requiere una lucha constante.&lt;/i&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;-- George Orwell (1903-1950) Escritor británico.&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;Un error en tiempo de ejecución como éste: &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;java.lang.ClassCastException: [L&lt;i&gt;FQN_ClassName&lt;/i&gt;; cannot be cast to &lt;i&gt;FQN_ClassName&lt;/i&gt;&lt;/b&gt;, puede dejarte con cara de perplejidad durante algunos minutos. A mi me pasó. Y reconozco cierta vergüenza al admitir que fueron unos cuantos largos minutos en los que no daba crédito. Estaba tan concentrado en que el casting era correcto que no podía entender cómo la JVM me decía que no podía adaptar un tipo de dato a otro exactamente igual... Al cabo de unos minutos me di cuenta que la clave está en el corchete ("["). No se trata del mismo tipo: la máquina virtual me está diciendo que no puede convertir un &lt;b&gt;array&lt;/b&gt; de ese tipo a ese mismo tipo (directo).&lt;br /&gt;&lt;br /&gt;En efecto, &lt;a href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html"&gt;el capítulo 4.3 de la especificación de la máquina virtual referente al fichero class&lt;/a&gt;, lo explica bien claro: estamos intentando convertir una instancia de String[] a String. En fin, es de estas veces que tienes la solución delante pero no la estás buscando: estás en otra cosa.... Hay que confiar más en los mensajes de error.&lt;br /&gt;&lt;br /&gt;Por cierto que no veo sustituto de ésta url en el dominio oracle.com... así que &lt;a href="http://blogs.sun.com/OTNGarage/entry/sun_com_will_disappear_after"&gt;puede que no esté disponible a partir del 1 de junio&lt;/a&gt;. Así es, amigos, &lt;a href="http://balteus.blogspot.com/2010/12/2010-el-fin-de-una-etapa.html"&gt;uno de los primeros dominios que se registraron&lt;/a&gt; y más antiguos, dejará de existir (&lt;i&gt;desaparecerá&lt;/i&gt;, en palabras de Oracle).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html"&gt;Class File Format (VM Spec)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-8616554641680821376?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/8616554641680821376/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/03/javalangclasscastexception.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8616554641680821376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8616554641680821376'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/03/javalangclasscastexception.html' title='java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-r5IksLZAot8/TYKJseFf5xI/AAAAAAAAA-k/9zWEujnrxCc/s72-c/glazik1step600.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4776474605511185078</id><published>2011-03-09T21:49:00.004+01:00</published><updated>2011-04-19T01:06:00.583+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>Balteus cumple 10 años (en binario)</title><content type='html'>&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-KujM9cOc5Ic/TXd3c6J0D5I/AAAAAAAAA-g/zkPxYGEzeZM/s1600/BalteusCumpleDos.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="https://lh3.googleusercontent.com/-KujM9cOc5Ic/TXd3c6J0D5I/AAAAAAAAA-g/zkPxYGEzeZM/s400/BalteusCumpleDos.jpg" width="381" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;(Ilustración: Fran Barquero)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;- &lt;i&gt;"¿Le gusta nuestro búho?"&lt;/i&gt; -Rachael&lt;/blockquote&gt;&lt;blockquote&gt;- &lt;i&gt;"¿Es artificial?"&lt;/i&gt; - Rick Deckard&lt;/blockquote&gt;&lt;blockquote&gt;- &lt;i&gt;"Naturalmente."&lt;/i&gt; - Rachael&lt;/blockquote&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma;"&gt;--Blade Runner&lt;/span&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El pasado domingo 6 de Marzo, este blog cumplió su segundo año de vida. Y he aprovechado la ocasión para hacerle un sutil cambio en el diseño, en la línea del anterior: sobrio y sencillo. Espero que os guste.&lt;br /&gt;&lt;br /&gt;Este año me han ocurrido algunas situaciones anecdóticas y relevantes para mi, teniendo en cuenta que soy un escritor de un blog muy especializado y con pocos lectores asiduos. La primera me ocurrió con mi post "&lt;a href="http://balteus.blogspot.com/2010/04/la-galaxia-en-un-campo-de-futbol.html"&gt;La galaxia en un campo de fútbol&lt;/a&gt;", en el que comenté el libro de Juan Fernández Macarrón y el propio Juan me dejó un afectuoso comentario (también me pasó en el artículo sobre &lt;a href="http://balteus.blogspot.com/2009/05/banco-de-experiencias-ii-logback-la.html"&gt;Logback&lt;/a&gt;: también el autor comentó en mi web).&amp;nbsp; La segunda es que enlazaron mi artículo sobre el &lt;a href="http://balteus.blogspot.com/2010/10/control-del-nivel-de-aislamiento.html"&gt;control del nivel de aislamiento transaccional con JPA&lt;/a&gt; en &lt;a href="http://blogs.sun.com/theaquarium/entry/glassfish_tips_and_links_12"&gt;"The Aquarium"&lt;/a&gt;, el blog de referencia sobre Java EE y Glassfish. Fue una grata sorpresa, la verdad.&lt;br /&gt;&lt;br /&gt;Por otro lado, este año he sido menos prolífico que el primero, y no por falta de temas, sino por falta de tiempo. También he encontrado que los lectores habituales son "silenciosos" y no tienen tiempo y/o ganas de comentar mis artículos (en fin, sois así, ¿qué le vamos a hacer?).&lt;br /&gt;&lt;br /&gt;También he contado con un regalo-ilustración realizado especialmente para la ocasión. Gracias, Fran, por la ilustración. Me ha hecho mucha ilusión.&lt;br /&gt;&lt;br /&gt;A mis lectores frecuentes: gracias por seguir por ahí... y dejad algún comentario, por favor!. Me gusta saber que hay alguien ahí leyendo.&lt;br /&gt;&lt;br /&gt;P.D.: Si veis algo que ha quedado "raro" con el cambio de diseño, por favor, decídmelo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4776474605511185078?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4776474605511185078/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/03/balteus-cumple-10-anos-en-binario.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4776474605511185078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4776474605511185078'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/03/balteus-cumple-10-anos-en-binario.html' title='Balteus cumple 10 años (en binario)'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-KujM9cOc5Ic/TXd3c6J0D5I/AAAAAAAAA-g/zkPxYGEzeZM/s72-c/BalteusCumpleDos.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-5421063940928714688</id><published>2011-02-28T00:36:00.008+01:00</published><updated>2011-02-28T23:22:21.745+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Documentación de código con Doxygen y Maven</title><content type='html'>&lt;div align="left" style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;a href="http://2.bp.blogspot.com/-kMzOMPtW4o0/TWGu8aAez5I/AAAAAAAAA-E/q7ODb2X2voY/s1600/cohdra_100_5342bw.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://2.bp.blogspot.com/-kMzOMPtW4o0/TWGu8aAez5I/AAAAAAAAA-E/q7ODb2X2voY/s200/cohdra_100_5342bw.JPG" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div style="text-align: right;"&gt;&lt;small&gt;&lt;span style="font-family: tahoma;"&gt;&lt;big&gt;&lt;i&gt;Voluminous documentation is part of the problem, not part of the solution.&lt;/i&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;-- Tom DeMarco, software development consultant&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="text-align: right;"&gt;&lt;small&gt;&lt;span style="font-family: tahoma;"&gt;&lt;big&gt;&lt;i&gt;Documentation is like sex: when it is good, it is very, very good; and when it is bad, it is better than nothing.&lt;/i&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma; font-size: x-small;"&gt;--  Dick Brandon&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;La documentación de proyectos software siempre ha sido un tema controvertido. Aspectos como la estructura, enfoque, perspectiva, y metodología han generado decenas de tratados y "estándares" (como sinónimo de modelo, patrón o referencia) tan voluminosos como imprácticos e irrealistas. Sin embargo, ya comenté en &lt;i&gt;"&lt;a href="http://balteus.blogspot.com/2009/10/la-falacia-de-la-ingenieria-del.html"&gt;La falacia de la Ingeniería del Software&lt;/a&gt;"&lt;/i&gt; mi poca confianza en la aplicación realista de muchas metodologías y estándares que comparten entre sí la escasez de referencias reales profesionales.&lt;br /&gt;&lt;br /&gt;Mi experiencia a la hora de documentar un proyecto para la cesión de&amp;nbsp; administración y mantenimiento a terceros me ha enseñado que la documentación sólo sirve si:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;está contínuamente actualizada y sincronizada con lo que documenta (el adverbio &lt;i&gt;continuamente&lt;/i&gt; aquí, es clave)&lt;/li&gt;&lt;li&gt;la documentación y &lt;i&gt;lo documentado&lt;/i&gt; están mutuamente accesibles&lt;/li&gt;&lt;li&gt;tiene estructura y formato ágil para la consulta&lt;/li&gt;&lt;/ul&gt;Por supuesto, creo que los aforismos "cuanta más documentación mejor" o "toda documentación que se haga es poca" son del todo erróneos. El objetivo es la calidad, y creo honestamente que la cantidad participa de forma inversamente proporcional en una ecuación de calidad.&lt;br /&gt;&lt;br /&gt;En lo que a &lt;b&gt;documentación de código&lt;/b&gt; se refiere, los objetivos anteriores se obtienen con creces con &lt;b&gt;sistemas de generación de documentación automatica&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La documentación está &lt;i&gt;junto a&lt;/i&gt; lo documentado favoreciendo la contínua actualización&lt;/li&gt;&lt;li&gt;Están mutuamente accesibles&lt;/li&gt;&lt;li&gt;La estructura es la idónea para facilitar el acceso a la documentación precisa fácilmente ya que suelen generar HTML&lt;/li&gt;&lt;/ul&gt;En este aspecto, la mejor herramienta que he probado hasta ahora es, sin duda y con diferencia, &lt;b&gt;Doxygen&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Doxygen es un generador de documentación gratuito para&amp;nbsp; C++, C, Java, Objective-C, Python, IDL, Fortran, VHDL, PHP, C# y D. Su licencia es GPL y sus resultados son comparables (e incluso mejores en algunos aspectos) a documentadores comerciales.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-cUBEZbwi0B4/TWNpHBEyorI/AAAAAAAAA-I/gLYZbjxBS8U/s1600/ejemplo_doxygen.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/-cUBEZbwi0B4/TWNpHBEyorI/AAAAAAAAA-I/gLYZbjxBS8U/s400/ejemplo_doxygen.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Los desarrolladores de Java, que ya conocen Javadoc, cuya generación está perfectamente integrada con Maven, se preguntarán para qué diablos necesitarían &lt;i&gt;otro&lt;/i&gt; documentador. Como se comenta en la segunda cita introductoria de este artículo, Javadoc está bien: es mejor que nada. Pero comparar Doxygen con Javadoc es equivalente a comparar maven con "make".&lt;br /&gt;&lt;br /&gt;Las características más destacables, frente a Javadoc, desde mi punto de vista:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Genera automáticamente diagramas de clase y colaboración. Opcionalmente, diagramas de dependencia, llamada, etc...&amp;nbsp;&lt;/li&gt;&lt;li&gt;Permite incluir el código fuente resaltado en la propia documentación &lt;/li&gt;&lt;li&gt;Formatos: HTML,CHM, PDF, XML, etc..&lt;/li&gt;&lt;/ul&gt;Doxygen es una utilidad basada en línea de comando, como Javadoc, con más 100 opciones configurables que permiten ajustar la documentación final. Aunque la mayoría de las opciones interesantes ya están configuradas por defecto, Doxygen cuenta con un frontal gŕafico (&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;doxywizard&lt;/span&gt;&lt;/i&gt;) muy util para gestionar las opciones y los ficheros de configuración. Se instala fácilmente ("&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo apt-get install doxgen-gui&lt;/span&gt;&lt;/i&gt;", en *ubuntu) existiendo distribuciones en código fuente y binarios para Mac OS y Windows... y, he aquí lo mejor: existe un plugin para maven.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Usando Doxygen con Maven&lt;/b&gt;&lt;br /&gt;De la misma forma que podemos automatizar la generación de documentación javadoc en nuestras construcciones con maven, podemos hacerlo con Doxygen. Para ello, tan sólo debemos seguir los siguientes pasos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Instalar Doxygen y hacerlo disponible en el path (para *ubuntu esto es automático con la instalación)&lt;/li&gt;&lt;li&gt;Añadir el plugin a nuestro pom.xml. A continuación muestro las opciones de configuración que yo suelo usar&lt;/li&gt;&lt;/ol&gt;&lt;pre class="brush:xml; gutter: false;"&gt;&lt;project&gt;&lt;br /&gt;    ...&lt;br /&gt;    &lt;build&gt;&lt;br /&gt;        &lt;plugins&gt;&lt;br /&gt;            &lt;plugin&gt;&lt;br /&gt;                &lt;groupid&gt;com.soebes.maven.plugins.dmg&lt;/groupid&gt;&lt;br /&gt;                &lt;artifactid&gt;doxygen-maven-plugin&lt;/artifactid&gt;&lt;br /&gt;                &lt;version&gt;1.0.1&lt;/version&gt;&lt;br /&gt;            &lt;/plugin&gt;&lt;br /&gt;        &lt;/plugins&gt;&lt;br /&gt;    &lt;/build&gt;&lt;br /&gt;    ....&lt;br /&gt;    &lt;reporting&gt;&lt;br /&gt;        &lt;plugins&gt;&lt;br /&gt;            &lt;plugin&gt;&lt;br /&gt;                &lt;groupid&gt;com.soebes.maven.plugins.dmg&lt;/groupid&gt;&lt;br /&gt;                &lt;artifactid&gt;doxygen-maven-plugin&lt;/artifactid&gt;&lt;br /&gt;                &lt;version&gt;1.0.1&lt;/version&gt;&lt;br /&gt;                &lt;configuration&gt;&lt;br /&gt;                    &lt;quiet&gt;false&lt;/quiet&gt;&lt;br /&gt;                    &lt;projectname&gt;es.cestel.szarza.balteus&lt;/projectname&gt;&lt;br /&gt;                    &lt;projectnumber&gt;1.0&lt;/projectnumber&gt;&lt;br /&gt;                    &lt;outputlanguage&gt;spanish&lt;/outputlanguage&gt;&lt;br /&gt;                    &lt;optimizeoutputjava&gt;true&lt;/optimizeoutputjava&gt;&lt;br /&gt;                    &lt;extractall&gt;true&lt;/extractall&gt;&lt;br /&gt;                    &lt;extractprivate&gt;true&lt;/extractprivate&gt;&lt;br /&gt;                    &lt;referencesrelation&gt;true&lt;/referencesrelation&gt;&lt;br /&gt;                    &lt;input /&gt;src/main&lt;br /&gt;                    &lt;recursive&gt;true&lt;/recursive&gt;&lt;br /&gt;                &lt;/configuration&gt;&lt;br /&gt;            &lt;/plugin&gt;&lt;br /&gt;        &lt;/plugins&gt;&lt;br /&gt;    &lt;/reporting&gt;&lt;br /&gt;    ....&lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;Recomiendo probar con las opciones de generación de diagramas. Especialmente los diagramas de colaboración pueden ser muy útiles para ciertos módulos de proyecto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.doxygen.org/"&gt;Doxygen&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://site.supose.org/doxygen-maven-plugin/index.html"&gt;Doxygen Maven Plugin&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-5421063940928714688?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/5421063940928714688/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/02/documentacion-de-codigo-con-doxygen-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/5421063940928714688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/5421063940928714688'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/02/documentacion-de-codigo-con-doxygen-y.html' title='Documentación de código con Doxygen y Maven'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-kMzOMPtW4o0/TWGu8aAez5I/AAAAAAAAA-E/q7ODb2X2voY/s72-c/cohdra_100_5342bw.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4724310617492071764</id><published>2011-01-31T11:58:00.004+01:00</published><updated>2011-03-09T21:42:36.598+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>StatementTimeout / QueryTimeout con PostgreSQL</title><content type='html'>&lt;div align="left" style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;blockquote&gt;&lt;div style="text-align: right;"&gt;&lt;small&gt;&lt;span style="font-family: tahoma;"&gt;&lt;big&gt;&lt;i&gt;Si no esperas lo inesperado no lo reconocerás cuando llegue.&lt;/i&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma;"&gt;- Heráclito de Efeso (540 AC-470 AC) Filósofo griego&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_U3R9awMQHdw/TURm1a90z0I/AAAAAAAAA9E/4t7AACtaNh4/s1600/timers3.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TURm1a90z0I/AAAAAAAAA9E/4t7AACtaNh4/s200/timers3.JPG" width="125" /&gt;&lt;/a&gt;&lt;/div&gt;Como comentaba en &lt;a href="http://balteus.blogspot.com/2010/12/las-8-falacias-de-la-informatica.html"&gt;&lt;i&gt;"las 8 falacias de los sistemas distribuídos&lt;/i&gt;&lt;/a&gt;", en los entornos de producción debemos tener en cuenta que pueden suceder hechos que no se producen en nuestros entornos de desarrollo, integración o preproducción... y ciertamente ocurren. En estos entornos son necesarios procesos y tareas concurrentes inherentes a su propia naturaleza y ambiente de "explotación" (tareas de mantenimiento tanto programados -backups-, como no programados -recuperaciones de datos-, arranque eventual de otras -nuevas- aplicaciones, procesos de datawarehousing, etc).&lt;br /&gt;&lt;br /&gt;Uno de estos sucesos típicos suele ser el inexplicable y aleatorio bloqueo de una sesión o de toda una aplicación entera. Tras el correspondiente susto y examen exhaustivo, detectamos la causa en una consulta de base de datos que, eventualmente, tarda demasiado. En algunas ocasiones las causas son muy poco evidentes y muy difíciles de detectar, ya que sólo se producen por la coincidencia de determinados eventos (periódicos o no), e incluso en un determinado orden.&lt;br /&gt;&lt;br /&gt;¿Y por qué tarda tanto una consulta que en nuestro entorno de preproducción se lleva apenas unas pocas decenas de milisegundos? Pues típicamente porque ocurre un bloqueo en la base de datos debido a una transacción de larga duración. Si las cosas se complican, puede existir incluso un deadlock (bloqueo mutuo) que deje nuestro sistema completamente bloqueado y produzca un efecto dominó en otras aplicaciones dependientes de la misma base de datos.&lt;br /&gt;&lt;br /&gt;Obviamente, la solución pasa por detectar la casuística concreta y evitarla, pero mientras buscamos la causa o la solución, necesitamos mantener nuestro sistema funcionando con normalidad. Para protegernos a este tipo de eventualidades, se debe &lt;a href="http://download.oracle.com/javase/6/docs/api/java/sql/Statement.html#setQueryTimeout%28int%29"&gt;establecer un valor de timeout&lt;/a&gt; en nuestras consultas y transacciones a bases de datos que impida que una consulta se quede indefinidamente esperando el resultado y, por tanto, todas las sesiones de la aplicación que llegan a ese punto. En los entornos JEE, donde se configuran pools de conexiones a bases de datos que permiten un uso eficiente de recursos y conexiones de bases de datos, la ausencia de estos timeouts en esas condiciones pueden suponer el agotamiento de las conexiones del pool, debido a que no se liberan las conexiones y, por tanto, la imposibilidad de que nuevas sesiones de la aplicación puedan funcionar.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_U3R9awMQHdw/TP33alBDHgI/AAAAAAAAA78/kHsWg9dw8Ys/s1600/snapshot03.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="352" src="http://1.bp.blogspot.com/_U3R9awMQHdw/TP33alBDHgI/AAAAAAAAA78/kHsWg9dw8Ys/s640/snapshot03.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Configuración de &lt;i&gt;Statement Timeout&lt;/i&gt; en Glassfish&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;En la mayoría de los servidores de aplicaciones y contenedores web JEE, existe una forma de indicar este parámetro para cada uno de nuestros pools, permitiendo especificar distintos parámetros en función de las características de las aplicaciones o de la duración de las transacciones. En el caso de Glassfish, por ejemplo, es a través del atributo StatementTimeout del pool (que internamente realiza las llamadas a setQueryTimeout() del driver.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Usando PostgreSQL, este atributo sin embargo nos ha dado una desagradable sorpresa:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java; gutter: false;"&gt;Caused by: org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4PreparedStatement.setQueryTimeout(int) is not yet implemented.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.postgresql.Driver.notImplemented(Driver.java:753)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.postgresql.jdbc2.AbstractJdbc2Statement.setQueryTimeout(AbstractJdbc2Statement.java:635)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at com.sun.gjc.spi.base.ConnectionHolder.prepareStatement(ConnectionHolder.java:477)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.prepareStatement(DatabaseAccessor.java:1162)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at oracle.toplink.essentials.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:612)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:485)&lt;/pre&gt;&lt;br /&gt;Pues si, aunque parezca increíble, el driver jdbc de Postgresql no implementa aún setQueryTimeout(), al menos hasta la versión disponible en el momento de escribir este artículo (versión Version 9.0-801 de 2010-09-20).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_U3R9awMQHdw/TUaUKmaRgbI/AAAAAAAAA9o/6s4fFxTUax8/s1600/snapshot04.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="336" src="http://4.bp.blogspot.com/_U3R9awMQHdw/TUaUKmaRgbI/AAAAAAAAA9o/6s4fFxTUax8/s640/snapshot04.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Establecimiento de propiedades de la conexión en el pool de conexiones de Glassfish&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;La solución es establecer el parámetro de conexión &lt;a href="http://jdbc.postgresql.org/documentation/head/connect.html#connection-parameters"&gt;&lt;i style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;SocketTimeout&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;, que especifica en segundos el tiempo máximo que se espera respuestas del servidor antes de cerrar la conexión. Este parámetro tiene el mismo efecto que el atributo StatementTimeout / QueryTimeout que comentaba anteriormente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para nuestros scripts PL/pgSQL, podemos establecer directamente el parámetro statement_timeout al inicio:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SET statement_timeout TO 5000; -- para 5 segundos&lt;br /&gt;&lt;br /&gt; &amp;lt;...resto del PL&amp;gt;&lt;br /&gt;&lt;br /&gt;RESET statement_timeout; -- reset&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En general, establecer un valor de timeout en operaciones síncronas es una buena práctica para evitar sorpresas desagradables.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4724310617492071764?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4724310617492071764/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2011/01/statementtimeout-querytimeout-con.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4724310617492071764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4724310617492071764'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2011/01/statementtimeout-querytimeout-con.html' title='StatementTimeout / QueryTimeout con PostgreSQL'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U3R9awMQHdw/TURm1a90z0I/AAAAAAAAA9E/4t7AACtaNh4/s72-c/timers3.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-8065083531770717220</id><published>2010-12-27T00:00:00.046+01:00</published><updated>2011-01-02T22:37:37.386+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>2010: El fin de una etapa</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_U3R9awMQHdw/TP0wEQE1MlI/AAAAAAAAA7o/ZW7uRxrO9KQ/s1600/sun006.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TP0wEQE1MlI/AAAAAAAAA7o/ZW7uRxrO9KQ/s320/sun006.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Este año que ha terminado ha sido extraño y agridulce en lo que a acontecimientos y efemérides se refiere.&lt;br /&gt;&lt;br /&gt;En el pasado 2010 se han cumplido 25 años desde que se registró el primer dominio &lt;i&gt;.com&lt;/i&gt; (&lt;i&gt;symbolics.com&lt;/i&gt;). Aquél año de 1985 se registraron 7 dominios. Hoy hay registrados más de 80 millones.En cuanto a los dominios &lt;i&gt;.es&lt;/i&gt;, comenzaron a registrarse en el año 1997 y hoy, dominios.es (anterior ES-NIC) cuenta con &lt;a href="http://www.dominios.es/estadisticas/article/293"&gt;más de 1.200.000 dominios registrados&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;También ha sido el cumpleaños de Java, ya que según su &lt;a href="http://nighthacks.com/roller/jag/resource/bio.html"&gt;creador&lt;/a&gt;, &lt;a href="http://nighthacks.com/roller/jag/resource/bio.html"&gt;fue hace 15 años&lt;/a&gt; cuando nació Java, si bien la primera versión se publicó en 1996. &lt;br /&gt;&lt;br /&gt;Decía Unamuno que el progreso consiste en renovarse. Sea ésa la última causa o sea por causas pecuniarias más prosaicas, el caso es que este año 2010 ha sido el fin de Sun Microsystems, tras la &lt;a href="http://balteus.blogspot.com/2009/12/la-ue-aprueba-finalmente-la-adquisicion.html"&gt;confirmación&lt;/a&gt; de compra que se produjo finalmente por estas fechas el año pasado. Esta compra ha producido una preocupante desbandada de personas de esencial relevancia en las filas del antiguo Sun, ahora Oracle. Desde el propio CEO de Sun, Jonathan Schwartz, pasando por Tim Bray (coinventor del XML) hasta incluso el mismísimo &lt;a href="http://nighthacks.com/roller/jag/entry/time_to_move_on"&gt;James Gosling&lt;/a&gt; (creador de Java), la lista no ha cesado: Eduardo Pelegri (lider de la especificacioń Java EE, padre de JSP, y responsable de Glassfish), Simon Phipps (&lt;i&gt;Sun's Chief Open Source Officer&lt;/i&gt;), casi todo el equipo de OpenOffice.... &lt;strike&gt;Sun&lt;/strike&gt;Oracle ha perdido un enorme valor humano. Se diría que Oracle tiene una filosofía con un enfoque totalmente diferente, en lo que a su postura con el &lt;a href="http://es.wikipedia.org/wiki/Software_libre_y_de_c%C3%B3digo_abierto"&gt;FOSS&lt;/a&gt; e innovación se refiere... ejem.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_U3R9awMQHdw/TQAbX8NhI3I/AAAAAAAAA8A/ebuWI-LzXJc/s1600/SunRIPsmall.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="249" src="http://4.bp.blogspot.com/_U3R9awMQHdw/TQAbX8NhI3I/AAAAAAAAA8A/ebuWI-LzXJc/s320/SunRIPsmall.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;En sus 28 años de vida como empresa independiente (de momento Oracle mantiene la marca) Sun ha sido sinónimo de innovación, seriedad, escalabilidad y grandes sistemas. El procesador SPARC (la primera arquitectura RISC-II implementada comercialmente), el sistema de ficheros NFS, el Sistema Operativo Solaris (con ZFS, en su versión 10), Java (JSE, JEE, y resto de estándares asociados) han sido innovación directa de Sun Microsystems y legado tecnológico sobre el cual se han basado decenas de avances actuales hoy día.&lt;br /&gt;&lt;br /&gt;Tras la absorción de Sun por parte de Oracle, el futuro de productos de código abierto como Glassfish, MySQL, Java, etc, es una incógnita, como ya comenté en un anterior &lt;a href="http://balteus.blogspot.com/2009/04/oracle-el-nuevo-gigante-rojo.html"&gt;artículo&lt;/a&gt;. Comienza a partir de aquí una nueva etapa para las tecnologías Java.&lt;br /&gt;&lt;br /&gt;Veremos qué nos depara 2011.&lt;br /&gt;&lt;br /&gt;¡Feliz año nuevo a todos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-8065083531770717220?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/8065083531770717220/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/12/2010-el-fin-de-una-etapa.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8065083531770717220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8065083531770717220'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/12/2010-el-fin-de-una-etapa.html' title='2010: El fin de una etapa'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U3R9awMQHdw/TP0wEQE1MlI/AAAAAAAAA7o/ZW7uRxrO9KQ/s72-c/sun006.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2899306497482678429</id><published>2010-12-09T01:10:00.001+01:00</published><updated>2010-12-09T10:29:01.714+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><title type='text'>Las 8 falacias de la informática distribuída</title><content type='html'>En 1994, Peter Deutsch, uno de los miembros originales de Sun Microsystems, afirmó que arquitectos, diseñadores, y programadores de aplicaciones distribuidas a menudo solían asumir 7 supuestos que, en última instancia, resultaban falsos, poniéndose de manifiesto en forma de fallos del sistema, reducción sustancial en el ámbito de aplicación del sistema, o en grandes gastos imprevistos necesarios para rediseñar el sistema de forma que pueda cumplir con sus objetivos originales. En 1997, James Gosling (creador de Java) añadió un octavo supuesto.&lt;br /&gt;&lt;br /&gt;Esas hipótesis son conocidas conjuntamente como &lt;i&gt;Las 8 falacias de la informática distribuída&lt;/i&gt; o &lt;i&gt;las 8 falacias de los sistemas distribuídos&lt;/i&gt; (&lt;i&gt;8 fallacies of distributed computing&lt;/i&gt;):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_U3R9awMQHdw/TQAc8P9ScKI/AAAAAAAAA8E/Nmsg518Zm5g/s1600/PA192136.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_U3R9awMQHdw/TQAc8P9ScKI/AAAAAAAAA8E/Nmsg518Zm5g/s320/PA192136.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ol&gt;&lt;li style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;La red es confiable&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt; La latencia es cero&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;&lt;span class="" id="result_box" lang="es"&gt;&lt;span title=""&gt;El ancho de banda es infinito&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;&lt;span class="" id="result_box" lang="es"&gt;&lt;span title=""&gt;La red es segura&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;&lt;span class="" id="result_box" lang="es"&gt;&lt;span title=""&gt;La topología no cambia&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;&lt;span class="" id="result_box" lang="es"&gt;&lt;span title=""&gt;Hay un administrador&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: Verdana,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&lt;b&gt;&lt;span class="" id="result_box" lang="es"&gt;&lt;span title=""&gt;El costo del transporte es cero&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: &amp;quot;Helvetica Neue&amp;quot;,Arial,Helvetica,sans-serif;"&gt;&lt;i&gt;&lt;b&gt;&lt;span class="" id="result_box" lang="es" style="font-family: Verdana,sans-serif; font-size: small;"&gt;&lt;span title=""&gt;La red es homogénea&lt;/span&gt;&lt;/span&gt;&lt;span class="" id="result_box" lang="es"&gt;&lt;span title=""&gt; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Explicar cada una de las falacias (explicar por qué lo son) es bastante obvio. De hecho, llama la atención la adición de la falacia nº 8 en 1997 cuando realmente la heterogeneidad no era ni la centésima parte de lo que es ahora, con decenas de tipos de redes y dispositivos de distintas características accediendo simultáneamente a los mismos sistemas.&lt;br /&gt;&lt;br /&gt;15 años después, las características y problemas subyacentes de los sistemas distribuídos siguen siendo más o menos los mismos. Cualquiera que haya puesto en producción sistemas distribuídos (qué sistema empresarial actual no lo es) ha sufrido la mayoría (si no todas) de estas realidades.&lt;br /&gt;&lt;br /&gt;Definitivamente, lo que hay que tener claro es que no es posible proteger un sistema frente a todas estas eventualidades de forma indefinida ni es simplemente una cuestión de tecnología. Preservar a un sistema de las consecuencias de estos hechos &lt;i&gt;ahora&lt;/i&gt; (es decir, para un momento concreto en el tiempo) es muy caro, así que se tiene que llegar a un compromiso entre el coste y riesgo que se quiere asumir. Incluso aún cuando se proteja de forma razonablemente un sistema, habremos de tener en cuenta que los sistemas crecen y evolucionan. Si no se presta atención a las cuestiones abarcadas por las falacias, llegará un momento en que la situación haya cambiado de forma sustancial y quede nuevamente expuesto.&lt;br /&gt;&lt;br /&gt;Por tanto, estas falacias no solamente deben tenerse en cuenta en las etapas de diseño y construcción de un sistema, sino también (e incluso de forma especial) en la de mantenimiento, porque llegará un momento en que se mostrarán sus consecuencias... y no será tan tarde como imaginamos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/L._Peter_Deutsch"&gt;L Peter Deutsch&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://es.wikipedia.org/wiki/James_Gosling"&gt;James Gosling&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2899306497482678429?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2899306497482678429/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/12/las-8-falacias-de-la-informatica.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2899306497482678429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2899306497482678429'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/12/las-8-falacias-de-la-informatica.html' title='Las 8 falacias de la informática distribuída'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_U3R9awMQHdw/TQAc8P9ScKI/AAAAAAAAA8E/Nmsg518Zm5g/s72-c/PA192136.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-8744377867553269303</id><published>2010-11-29T16:06:00.000+01:00</published><updated>2010-11-29T16:06:03.374+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>"Run As -&gt; m2 Maven build" no funciona en Eclipse Helios</title><content type='html'>Puede que hayas llegado hasta aquí buscando alguna de las siguientes expresiones en un buscador:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No puedo ejecutar Maven en Eclipse Helios&lt;/li&gt;&lt;li&gt;No funciona maven en Eclipse Helios&lt;/li&gt;&lt;li&gt;Maven no hace nada en Eclipse Helios&lt;/li&gt;&lt;li&gt;Unable to start any of the Maven goals from Eclipse Helios &lt;/li&gt;&lt;li&gt;org.eclipse.core.runtime.CoreException: Local configuration cannot be nested in a directory&lt;/li&gt;&lt;/ul&gt;En efecto, el síntoma es que no se ejecuta "Maven build", "Maven package", "Maven clean" ni ningún otro goal del menú contextual "Run As" de m2e. Tras seleccionar la opción, no sucede nada ni se ve nada por consola. La ventana &lt;i&gt;"Error Log"&lt;/i&gt; muestra: &lt;i style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;org.eclipse.core.runtime.CoreException: Local configuration cannot be nested in a directory&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Es un bug conocido de m2eclipse: &lt;a href="https://issues.sonatype.org/browse/MNGECLIPSE-2191"&gt;https://issues.sonatype.org/browse/MNGECLIPSE-2191&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La única solución que he encontrado hasta el momento es crear una configuración específica para cada proyecto y operación que quiero hacer. Estas configuraciones se pueden llamar desde el icono "Run As" de la barra de herramientas (el símbolo "play")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_U3R9awMQHdw/TPO0bkVP-SI/AAAAAAAAA7U/2N-DGy0RLoI/s1600/snapshot01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="402" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TPO0bkVP-SI/AAAAAAAAA7U/2N-DGy0RLoI/s640/snapshot01.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-8744377867553269303?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/8744377867553269303/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/11/run-as-m2-maven-build-no-funciona-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8744377867553269303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8744377867553269303'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/11/run-as-m2-maven-build-no-funciona-en.html' title='&quot;Run As -&gt; m2 Maven build&quot; no funciona en Eclipse Helios'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U3R9awMQHdw/TPO0bkVP-SI/AAAAAAAAA7U/2N-DGy0RLoI/s72-c/snapshot01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2043477340012449483</id><published>2010-11-09T23:48:00.004+01:00</published><updated>2010-11-10T07:39:22.295+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>Firefox cumple seis años</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.mozilla-europe.org/es/firefox/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_U3R9awMQHdw/TNo9xKlAZ1I/AAAAAAAAA7A/XYdfdZhKHKA/s320/logo-wordmark-vertical.png" width="219" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Hoy, 9 de Noviembre, &lt;a href="http://www.mozilla-europe.org/es/firefox/"&gt;Firefox&lt;/a&gt;, &lt;a href="http://gs.statcounter.com/"&gt;el segundo navegador más usado&lt;/a&gt;, cumple seis años. Con una importante lista de &lt;a href="http://www.mozilla-europe.org/es/pressroom/awards/"&gt;premios&lt;/a&gt; a la espalda, es sin duda el navegador más &lt;a href="http://www.mozilla-europe.org/es/firefox/features/#personalization"&gt;personalizable&lt;/a&gt; que existe, el más &lt;a href="http://www.hispasec.com/unaaldia/4360/firefox-navegador-mas-seguro-contra-fraude"&gt;seguro&lt;/a&gt;, y el menos "contaminado" por intereses comerciales, ya que detrás del mismo está la &lt;a href="http://es.wikipedia.org/wiki/Fundaci%C3%B3n_Mozilla"&gt;Fundación Mozilla&lt;/a&gt;, una fundación sin ánimo de lucro dedicada al software libre e innovación en internet.&lt;br /&gt;&lt;br /&gt;El año que viene, veremos en su próxima versión (nº 4), importantes mejoras. Y además, ya está disponible (en versión beta) una versión para &lt;a href="http://www.mozilla.com/es-ES/m/beta"&gt;ciertos móviles&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Si no conoces la &lt;a href="http://www.mozilla.org/projects/"&gt;familia de productos Mozilla&lt;/a&gt;, te invito desde aquí a probar alguno de sus productos (todos gratuitos), especialmente &lt;a href="http://www.mozillamessaging.com/es-ES/thunderbird/"&gt;Thunderbird&lt;/a&gt; con &lt;a href="http://www.mozilla.org/projects/calendar/lightning/"&gt;Lightning&lt;/a&gt;, la combinación de cliente de correo con calendario mejor que existe, con todas las ventajas de firefox: rapidez, seguridad, &lt;a href="http://www.mozillamessaging.com/es-ES/thunderbird/#feature-customize"&gt;personalización&lt;/a&gt; (extremo a destacar especialmente)... y por supuesto, también gratis.&lt;br /&gt;&lt;br /&gt;Firefox está disponible en más de 70 idiomas para Linux, Mac OS, y Windows. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mozilla-europe.org/es/firefox/"&gt;Firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mozillamessaging.com/es-ES/thunderbird/"&gt;Thunderbird&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2043477340012449483?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2043477340012449483/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/11/firefox-cumple-seis-anos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2043477340012449483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2043477340012449483'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/11/firefox-cumple-seis-anos.html' title='Firefox cumple seis años'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_U3R9awMQHdw/TNo9xKlAZ1I/AAAAAAAAA7A/XYdfdZhKHKA/s72-c/logo-wordmark-vertical.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-8782459727976948087</id><published>2010-10-16T13:45:00.003+02:00</published><updated>2010-11-05T11:49:49.602+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><title type='text'>Control del nivel de aislamiento transaccional en JPA</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div align="left" style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;blockquote&gt;&lt;small&gt;&lt;span style="font-family: tahoma;"&gt;&lt;big&gt;&lt;i&gt;La única ventaja de jugar con fuego es que aprende uno a no quemarse.&lt;/i&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma;"&gt;- Oscar Wilde (1854-1900)&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4&gt;&lt;span style="color: #cc6600;"&gt;Breve introducción al aislamiento&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_U3R9awMQHdw/TNPhH86NEEI/AAAAAAAAA6o/MGobXruL19E/s1600/Train_Pataskala_005.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="228" src="http://1.bp.blogspot.com/_U3R9awMQHdw/TNPhH86NEEI/AAAAAAAAA6o/MGobXruL19E/s320/Train_Pataskala_005.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;El &lt;i&gt;aislamiento&lt;/i&gt; es una de las propiedades fundamentales &lt;a href="http://es.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt; que definen las transacciones como tales en sistemas de gestión de bases de datos. El &lt;i&gt;aislamiento&lt;/i&gt; define cómo y cuándo se ven los cambios realizados por una determinada operación por otras operaciones concurrentes.&lt;br /&gt;&lt;br /&gt;El estándar &lt;span class="ACRONYM"&gt;ANSI&lt;/span&gt;/&lt;span class="ACRONYM"&gt;ISO&lt;/span&gt; &lt;span class="ACRONYM"&gt;SQL&lt;/span&gt;     define cuatro niveles de aislamiento transaccional     en función de tres hechos problemáticos que deben ser tenidos en cuenta     entre transacciones concurrentes.     Estos hechos no deseados son:      &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;dl&gt;&lt;dt&gt;&lt;i&gt;&lt;b&gt;lectura "sucia"&lt;/b&gt;&lt;/i&gt;&lt;/dt&gt;&lt;dd&gt;Una transacción lee datos escritos por una transacción no confirmada [1]. Es decir, se leen datos temporales que no existirán finalmente porque la transacción que los creó se canceló finalmente tras la lectura.&lt;/dd&gt;&lt;dt&gt;&lt;i&gt;&lt;b&gt;lectura no repetible&lt;/b&gt;&lt;/i&gt;&lt;/dt&gt;&lt;dd&gt;Una transacción vuelve a leer datos que previamente había leído y encuentra que han sido  modificados por una transacción confirmada.        &lt;/dd&gt;&lt;dt&gt;&lt;i&gt;&lt;b&gt;lectura "fantasma"&lt;/b&gt;&lt;/i&gt;&lt;/dt&gt;&lt;dd&gt;Una transacción vuelve a ejecutar una consulta, devolviendo un conjunto de filas que satisfacen  una condición de búsqueda y encuentra que otras filas que satisfacen la condición  han sido insertadas o borradas por otra transacción cursada. La inconsistencia ocurre cuando una segunda transacción accede repetidas veces a una fila y lee datos diferentes cada vez.&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;br /&gt;Como comentaba, los niveles de aislamiento se definen en función de los efectos no deseados que evita. Así, el estándar ANSI/SQL define los siguientes cuatro niveles de aislamiento, de menor aislamiento a mayor:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="2" style="text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;lectura sucia&lt;br /&gt;(dirty reads)&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;lectura no repetible / doble actualización&lt;br /&gt;(non-repeatable reads / lost-update)&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;lectura fantasma&lt;br /&gt;(phantom reads)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;lectura no confirmada&lt;br /&gt;READ_UNCOMMITTED&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="Se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLIxgV9bI/AAAAAAAAA58/WSFBtUhXsyM/s1600/button-cancel.png" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="Se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLIxgV9bI/AAAAAAAAA58/WSFBtUhXsyM/s1600/button-cancel.png" /&gt;&lt;span id="goog_1409087684"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span id="goog_1409087603"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="Se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLIxgV9bI/AAAAAAAAA58/WSFBtUhXsyM/s1600/button-cancel.png" /&gt;&lt;/div&gt;&lt;span id="goog_1409087606"&gt;&lt;/span&gt;&lt;span id="goog_1409087607"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;lectura confirmada&lt;br /&gt;READ_COMMITTED&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="No se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLJJ9haQI/AAAAAAAAA6A/FfGzoC80QbE/s1600/button-ok.png" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="Se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLIxgV9bI/AAAAAAAAA58/WSFBtUhXsyM/s1600/button-cancel.png" /&gt;&lt;span id="goog_1409087693"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span id="goog_1409087609"&gt;&lt;/span&gt;&lt;span id="goog_1409087610"&gt;&lt;/span&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="Se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLIxgV9bI/AAAAAAAAA58/WSFBtUhXsyM/s1600/button-cancel.png" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span id="goog_1409087612"&gt;&lt;/span&gt;&lt;span id="goog_1409087613"&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;Iectura repetible&lt;br /&gt;REPEATABLE_READ&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="No se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLJJ9haQI/AAAAAAAAA6A/FfGzoC80QbE/s1600/button-ok.png" /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="No se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLJJ9haQI/AAAAAAAAA6A/FfGzoC80QbE/s1600/button-ok.png" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="Se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLIxgV9bI/AAAAAAAAA58/WSFBtUhXsyM/s1600/button-cancel.png" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;secuenciable&lt;br /&gt;SERIALIZABLE&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="No se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLJJ9haQI/AAAAAAAAA6A/FfGzoC80QbE/s1600/button-ok.png" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="No se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLJJ9haQI/AAAAAAAAA6A/FfGzoC80QbE/s1600/button-ok.png" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style="background-color: #ffffcc; font-family: Helvetica,Arial,sans-serif; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img alt="No se produce efecto" border="0" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TLdLJJ9haQI/AAAAAAAAA6A/FfGzoC80QbE/s1600/button-ok.png" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Las transacciones tienen aislamiento cuando no interfieren entre sí, especialmente aquellas que aún no han concluído y están incompletas. El nivel de aislamiento es inversamente proporcional al rendimiento final en la medida en que que cuanto mayor es el aislamiento mayores son los recursos del sistema utilizados para garantizarlo. Esto se hace patente con un alto grado de concurrencia: a un nivel de aislamiento mayor, menor rendimiento. &lt;br /&gt;&lt;br /&gt;La mayoría de las bases de datos usan un el nivel de aislamiento READ_COMMITED por defecto. Para accesos clásicos a la base de datos usando un &lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html" target="_blank"&gt;patrón DAO&lt;/a&gt; y gestionando las conexiones directamente (sin usar JPA) esto es prácticamente lo único que necesitamos, ya que podemos seleccionar un nivel de aislamiento mayor en caso que lo necesitemos en la conexión usando&lt;span style="font-family: Courier New;"&gt; &lt;/span&gt;&lt;big&gt;&lt;span style="font-family: Courier New;"&gt;&lt;a href="http://download.oracle.com/javase/6/docs/api/java/sql/Connection.html#setTransactionIsolation%28int%29" target="_blank"&gt;setTransactionIsolation()&lt;/a&gt;&lt;/span&gt;&lt;/big&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;span style="color: #cc6600;"&gt;Con JPA las cosas son bastante diferentes&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;Hay que tener en cuenta que las implementaciones de JPA incluyen una caché de objetos que introduce elementos nuevos y desconcertantes frente las aplicaciones clásicas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Otras aplicaciones acceden a los datos&lt;/b&gt;&lt;br /&gt;Nuestra aplicación puede convivir con otras aplicaciones JPA que no usen la misma Unidad o Contexto de Persistencia (otro módulo, otro servidor) o que accedan a los datos directamente sin un framework JPA de por medio. Esto causará lecturas no repetibles, es decir, que ambas aplicaciones sobreescriban los mismos datos simultáneamente. En definitiva, el framework no realiza un refresco automático de un objeto antes de realizar un merge() (si lo hiciese, sería costoso ya que ejecutaría una sentencia SELECT anterior a cualquier otra). El tema del "refresco" de la caché es un tema aparte que merecerá un articulo aparte, en su momento.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Objetos caducados&lt;/b&gt;&lt;br /&gt;Incluso aunque todas las aplicaciones usen el mismo contexto de persistencia y la misma caché de objetos, es frecuente que dos threads modifiquen el mismo objeto (incluso aunque sean propiedades diferentes) y realicen una transacción simultánea sobreescribiendo los cambios de otra, con lo que podemos tener que "se pierden" cambios de una propiedad. Por ejemplo:&lt;br /&gt;&lt;dl&gt;&lt;dd&gt;&lt;ol&gt;&lt;li&gt;La transacción A lee la fila x.&lt;/li&gt;&lt;li&gt;La transacción B lee la misma fila x.&lt;/li&gt;&lt;li&gt;La transacción A escribe la fila x.&lt;/li&gt;&lt;li&gt;La transacción B escribe la fila x (y sobreescribe los cambios realizados por A).&lt;/li&gt;&lt;li&gt;Ambos confirman la transacción con éxito.&lt;/li&gt;&lt;/ol&gt;&lt;/dd&gt;&lt;/dl&gt;Este efecto se conoce típicamente como actualización perdida (Lost update). Con un nivel de aislamiento SERIALIZABLE esto no ocurriría, ya que la transacción B se quedaría bloqueada esperando hasta que la transacción A realizara la confirmación (commit) o no esperaría y simplemente fallaría (dependiendo de si se emplea un NO_WAIT en el tipo de lock). Sin embargo, en una aplicación web típica, esto seguiría generando un conflicto aún con un nivel SERIALIZABLE, ya que una aplicación web leería (y presentaría) primero los datos en una transacción y los actualizaría en otra).&lt;br /&gt;&lt;br /&gt;Otro casos parecidos a éste y con consecuencias similares son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un thread borra un objeto (delete()) y otro realiza un persist() sobre él. En ambos casos tendremos información inconsistente: o no se ha borrado, y tenemos dos, o no se ha grabado y no tenemos ninguno.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;un objeto tiene relaciones con otros objetos hijos. Las modificaciones en las listas de sus hijos relacionados puede causar igualmente información inconsistente con respecto a los hijos.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Mecanismos de control de concurrencia&lt;/b&gt;&lt;br /&gt;Para evitar estos problemas existen los mecanismos de control de concurrencia, que se encargan de mantener el aislamiento transaccional. Existen múltiples métodos de control de concurrencia que se pueden agrupar en tres categorías:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Optimistic&lt;/b&gt;. No realiza bloqueos, cancelando la confirmación y revertiendo los cambios (rollback) en caso de que se detecte un conflicto con otras transacciones. Como su propio nombre indica, asume que las transacciones pueden avanzar y realiza las comprobaciones de modificación al final, justo antes de realizar la confirmación de la transacción, asegurándose que los datos no han cambiado desde que se leyeron. Previene &lt;i&gt;"lost updates"&lt;/i&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Pessimistic&lt;/b&gt;. Se adquieren bloqueos sobre los objetos que se van a editar (típicamente las implementaciones lo realizan meidante sentencias &lt;i&gt;SELECT ... FOR UPDATE&lt;/i&gt;). Este enfoque equivale a un nivel de aislamiento SERIALIZABLE.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Semi-optimistic&lt;/b&gt;. Es una mezcla de ambos realizando bloqueos sólo en determinadas situaciones.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;&lt;span style="color: #cc6600;"&gt;Mecanismos de control de concurrencia en JPA&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;Por defecto, las implementaciones (&lt;i&gt;persistence provider&lt;/i&gt;) de JPA  asumen que la aplicación es responsable de la consistencia de datos y,  por tanto, no realizan ningún comportamiento por defecto relativo a  bloqueos. Como he comentado, trabajando directamente con la conexión de base de datos, podemos establecer un nivel de aislamiento y controlar la concurrencia, pero en JPA no manejamos directamente la conexión, sino que trabajamos con un gestor de entidades (&lt;a href="http://download.oracle.com/javaee/5/api/javax/persistence/EntityManager.html" target="_blank"&gt;EntityManager&lt;/a&gt;). Entonces, ¿cómo hacemos para gestionar la concurrencia si no podemos establecer un nivel de aislamiento?. Y aunque pudiéramos, ¿como resolvemos los problemas añadidos inherentes a JPA como los objetos caducados?. Vamos a ello.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Optimistic locking&lt;/b&gt;&lt;br /&gt;JPA soporta optimistic locking mediante un campo versionado de bloqueo, definido por la anotación &lt;a href="http://download.oracle.com/javaee/5/api/javax/persistence/Version.html" target="_blank"&gt;@Version&lt;/a&gt;. Dicho campo se actualiza automáticamente por la implementación JPA en cada actualización y debe ser conservado tal cual por la aplicación. En el momento de la realización del &lt;span style="font-family: Courier New;"&gt;merge()&lt;/span&gt;, si se detecta un bloqueo o cambio, se lanza una excepción &lt;a href="https://java.sun.com/javaee/5/docs/api/javax/persistence/OptimisticLockException.html" target="_blank"&gt;OptimisticLockException&lt;/a&gt;. &lt;br /&gt;&lt;pre class="brush: java; gutter: false;"&gt;@Entity&lt;br /&gt;public class Debt {&lt;br /&gt;    @Id&lt;br /&gt;    private long id;&lt;br /&gt;    @Version&lt;br /&gt;    private long version;&lt;br /&gt;    //...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Bloqueos específicos de lectura y escritura&lt;/b&gt;&lt;br /&gt;Algunas veces es deseable bloquear algo que no vas a cambiar. Normalmente se hace cuando vas a realizar un cambio sobre un objeto que se base en el estado de otro, y deseas asegurar que éste último no cambia mientras dura la transacción. JPA soporta bloqueos de lectura y escritura a través del método &lt;span style="font-family: Courier New;"&gt;&lt;a href="http://download.oracle.com/javaee/5/api/javax/persistence/EntityManager.html#lock%28java.lang.Object,%20javax.persistence.LockModeType%29"&gt;EntityManager.lock(entity, lockMode)&lt;/a&gt;.&lt;/span&gt; El argumento &lt;a href="http://download.oracle.com/javaee/5/api/javax/persistence/LockModeType.html" target="_blank"&gt;&lt;span style="font-family: Courier New;"&gt;&lt;i&gt;lockMode&lt;/i&gt;&lt;/span&gt;&lt;/a&gt; puede ser &lt;span style="font-family: Courier New;"&gt;READ&lt;/span&gt; o &lt;span style="font-family: Courier New;"&gt;WRITE&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Si una transacción llama a lock(entity,LockModeType.READ) sobre un objeto versionado nos aseguraremos de que no se realizará ninguna&lt;i&gt; lectura sucia&lt;/i&gt; ni &lt;i&gt;lectura no repetible&lt;/i&gt;. Es decir, se asegura de que el objeto no ha cambiado antes de hacer el commit. En caso contrario, se lanzará una &lt;span style="font-family: Courier New;"&gt;OptimisticLockException&lt;/span&gt;. Por ejemplo, en un método evaluamos en una condición un atributo de un &lt;br /&gt;objeto y, en función del valor, realizamos una modificación de otro objeto.&lt;br /&gt;&lt;pre class="brush: java; gutter: false;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ut.begin();&lt;br /&gt;    Debt d = em.find(Debt.class,5);&lt;br /&gt;    em.lock(d,LockModeType.READ);&lt;br /&gt;    if ( d.getAmount() &amp;lt; 10 ) &lt;br /&gt;        throw new MinAmountExceedException();&lt;br /&gt;    ut.commit();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si una transacción llama a lock(entity,LockModeType.WRITE) nos aseguraremos de que no se realizará ninguna&lt;i&gt; lectura sucia&lt;/i&gt; ni &lt;i&gt;lectura no repetible&lt;/i&gt;, ni otro objeto está realizando un lock. En caso contrario, se lanzará una OptimisticLockException. El bloqueo WRITE puede usarse también para proporcionar bloqueos a nivel de objeto y sus objetos dependientes, es decir, bloquear (aunque deberíamos decir "detectar") cambios en relaciones, de forma que un cambio en una lista de objetos hijos fuerce el incremento del número de versión del objeto padre.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En definitiva, el bloqueo READ comprueba el &lt;i&gt;optimistic version field&lt;/i&gt; (campo de versionado), y el bloqueo WRITE lo comprueba y lo incrementa. Este tipo de bloqueos es justo lo que se obtiene con un nivel de aislamiento serializable pero de forma &lt;i&gt;optimista&lt;/i&gt;, es decir, sin riesgos de deadlock o bloqueos abiertos, ya que estamos hablando de comprobaciones" no de bloqueos efectivos como tales.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pessimistic locking&lt;/b&gt;&lt;br /&gt;Pessimistic locking significa adquirir un bloqueo sobre el objeto antes de comenzar a editarlo y equivale a un nivel de aislamiento SERIALIZABLE. Es realmente bloquear, no es una simple comprobación como en el bloqueo optimista. Se implementa típicamente con una sentencia &lt;span style="font-family: Courier New;"&gt;SELECT ... FOR UPDATE&lt;/span&gt;. El bloqueo pesimista no está incluido en JPA 1.0, aunque algunas implementaciones sí lo hacen. Si usamos JPA 1.0 (por ejemplo usando la implementación por defecto de Glassfish 2.x), las alternativas para realizar este bloqueo serían las siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Si se usa Toplink / Toplink Essentials, usar el hint &lt;a href="http://sqltech.cl/doc/oas10gR31/web.1013/b28221/ent30qry003.htm" target="_blank"&gt;&lt;span style="font-family: Courier New;"&gt;toplink.pessimistic-lock&lt;/span&gt;&lt;/a&gt; en la consulta.&lt;/li&gt;&lt;li&gt;Si se usa Eclipse link (versión &amp;lt; 1.2), usar el hint &lt;a href="http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Query_Hints#Pessimistic_Lock" target="_blank"&gt;&lt;span style="font-family: Courier New;"&gt;eclipselink.pessimistic-lock&lt;/span&gt;&lt;/a&gt; en la consulta (o también ver &lt;a href="http://wiki.eclipse.org/EclipseLink/Examples/JPA/PessimisticLocking" target="_blank"&gt;http://wiki.eclipse.org/EclipseLink/Examples/JPA/PessimisticLocking&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Usar JPA 2.0 (por ejemplo &lt;a href="http://wiki.eclipse.org/EclipseLink" target="_blank"&gt;EclipseLink&lt;/a&gt;), que sí incluye este tipo de bloqueo, como mostraré más adelante.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Usar consultas nativas (native queries) &lt;span style="font-family: Courier New;"&gt;SELECT ... FOR UPDATE&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;Por ejemplo:&lt;br /&gt;&lt;pre class="brush: java; gutter: false"&gt;@Entity&lt;br /&gt;@Table(name="mailing_package")&lt;br /&gt;@NamedQueries( {&lt;br /&gt;    @NamedQuery(name = "MailingPackage.findByIdLocked",&lt;br /&gt;        query = "SELECT s FROM MailingPackage s WHERE s.id = :id",&lt;br /&gt;        hints={ @QueryHint(name = "toplink.pessimistic-lock", value = "LockNoWait")} })&lt;br /&gt;public class MailingPackage implements Serializable {&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;El bloqueo pesimista hay que manejarlo con cuidado porque puede causar problemas de concurrencia, rendimiento o bloqueos de la aplicación por &lt;i&gt;deadlocks&lt;/i&gt;. Típicamente no es deseable para aplicaciones web interactivas, ya que requiere mantener la transacción (y por tanto la conexión) activa durante la edición. El uso típico es cuando se quiere que la edición tendrá éxito en un momento que sabemos que la transacción durará lo menos posible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bloqueos en JPA 2.0&lt;/b&gt;&lt;br /&gt;JPA 2.0 añade soporte específico para bloqueo pesimista además de otras opciones de bloqueo en el propio API. Un bloqueo se puede adquirir usando adquiere usando el método &lt;span style="font-family: Courier New;"&gt;&lt;a href="http://download.oracle.com/javaee/5/api/javax/persistence/EntityManager.html#lock%28java.lang.Object,%20javax.persistence.LockModeType%29"&gt;EntityManager.lock(entity, lockMode)&lt;/a&gt;&lt;/span&gt;, pasando un argumento LockModeType a los nuevos métodos sobrecargados &lt;span style="font-family: Courier New;"&gt;&lt;a href="http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#find%28java.lang.Class,%20java.lang.Object,%20javax.persistence.LockModeType%29" target="_blank"&gt;find()&lt;/a&gt;&lt;/span&gt; y &lt;span style="font-family: Courier New;"&gt;&lt;a href="http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#refresh%28java.lang.Object,%20javax.persistence.LockModeType%29" target="_blank"&gt;refresh()&lt;/a&gt;&lt;/span&gt;, o estableciendo un lockMode en una &lt;span style="font-family: Courier New;"&gt;Query&lt;/span&gt; ( &lt;a href="http://download.oracle.com/javaee/6/api/javax/persistence/Query.html#setLockMode%28javax.persistence.LockModeType%29" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" target="_blank"&gt;setLockMode()&lt;/a&gt; ) o &lt;span style="font-family: Courier New;"&gt;NamedQuery&lt;/span&gt; (&lt;span style="font-family: Courier New;"&gt;&lt;a href="http://download.oracle.com/javaee/6/api/javax/persistence/NamedQuery.html#lockMode%28%29" target="_blank"&gt;lockMode&lt;/a&gt;&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;JPA 2.0 amplia/redefine los modos de bloqueo de JPA 1.0 en el enum &lt;span style="font-family: Courier New;"&gt;LockModeType&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;OPTIMISTIC&lt;/span&gt;: Es el READ de JPA 1.0&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;OPTIMISTIC_FORCE_INCREMENT&lt;/span&gt;: Es el WRITE de JPA 1.0&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;PESSIMISTIC_READ&lt;/span&gt;: Bloquea y evita que otra transacción adquiera un bloqueo &lt;span style="font-family: Courier New;"&gt;PESSIMISTIC_WRITE&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;PESSIMISTIC_WRITE&lt;/span&gt;: Bloquea y evita que otra transacción adquiera bloqueos &lt;span style="font-family: Courier New;"&gt;PESSIMISTIC_READ&lt;/span&gt; o &lt;span style="font-family: Courier New;"&gt;PESSIMISTIC_WRITE&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;PESSIMISTIC_FORCE_INCREMENT&lt;/span&gt;: es una suma de &lt;span style="font-family: Courier New;"&gt;PESSIMISTIC_WRITE&lt;/span&gt; y &lt;span style="font-family: Courier New;"&gt;OPTIMISTIC_FORCE_INCREMENT&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;NONE&lt;/span&gt;: No hay bloqueo ni comprobación. Equivalente a omitir cualquier &lt;span style="font-family: Courier New;"&gt;lockMode&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Adicionalmente, JPA 2.0 añade dos hits estándar que pueden pasarse a qualquier Query o NamedQuery y a qualquier operación find(), lock() o refresh():&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;"javax.persistence.lock.timeout"&lt;/span&gt;: Número de milisegundos a esperar la liberación del bloqueo antes de lanzar una &lt;span style="font-family: Courier New;"&gt;PessimisticLockException&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Courier New;"&gt;"javax.persistence.lock.scope"&lt;/span&gt;: Los alcances válidos se definen en &lt;span style="font-family: Courier New;"&gt;&lt;a href="http://download.oracle.com/javaee/6/api/javax/persistence/PessimisticLockScope.html" target="_blank"&gt;PessimisticLockScope&lt;/a&gt;&lt;/span&gt; (NORMAL or EXTENDED).&amp;nbsp; EXTENDED bloqueará adicionalmente las tablas relacionadas.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;&lt;span style="color: #cc6600;"&gt;Conclusiones&lt;/span&gt;&lt;/h4&gt;Con el nivel por defecto de la base de datos en READ_COMMITED y usando un bloqueo optimista para detectar &lt;i&gt;lost-updates&lt;/i&gt;, sólo necesitaríamos realizar un bloqueo pesimista en muy pocos casos. No obstante, estos casos existen: casos como un objeto que deba tener una numeración "sin huecos" (como el clásico ejemplo de los números de factura) o un repartidor de objetos que no deba dar el mismo objeto a dos threads para su proceso, podría requierir un bloqueo pesimista o secuenciable que impida de dos threads lean simultáneamente el mismo valor y lo incrementen.&lt;br /&gt;&lt;br /&gt;Recomiendo echar un vistazo a las referencias al final del artículo para profundizar más en el tema. Aprovecho la ocasión para felicitar aquí a los autores de "Java Persistence", de &lt;a href="http://en.wikibooks.org/"&gt;en.wikibooks.org&lt;/a&gt;, que han hecho un trabajo impecable el cual me ha sido de enorme ayuda para comprender el complejo mundo de JPA.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;NOTAS:&lt;br /&gt;[1] Creo que la traducción de "commited" como "cursado" o "confirmado" es más correcta en este contexto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Isolation_level" target="_blank"&gt;Isolation level&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Concurrency_control" target="_blank"&gt;Concurrency control&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikibooks.org/wiki/Java_Persistence" target="_blank"&gt;Java Persistence&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.dzone.com/articles/dont-break-optimistic-locking"&gt;Don't break the optimistic locking&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.eclipse.org/EclipseLink/Development/JPA_2.0/pessimistic_locking" target="_blank"&gt;Lock Modes / Pessimistic Locking (JPA 2.0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.java.net/blog/caroljmcdonald/archive/2009/07/jpa_20_concurre.html" target="_blank"&gt;JPA 2.0 Concurrency and locking&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-8782459727976948087?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/8782459727976948087/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/10/control-del-nivel-de-aislamiento.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8782459727976948087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8782459727976948087'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/10/control-del-nivel-de-aislamiento.html' title='Control del nivel de aislamiento transaccional en JPA'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_U3R9awMQHdw/TNPhH86NEEI/AAAAAAAAA6o/MGobXruL19E/s72-c/Train_Pataskala_005.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2899366910175399530</id><published>2010-09-09T09:17:00.001+02:00</published><updated>2010-09-10T17:17:33.089+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Eclipse Helios e integración con SVN, Maven y Glassfish</title><content type='html'>&lt;a href="http://wiki.eclipse.org/Simultaneous_Release"&gt;Desde el año 2006&lt;/a&gt;, la fundación Eclipse produce a finales de Junio una versión coordinada simultánea de decenas de proyectos de código abierto consolidados en una herramienta de desarrollo conocida comúnmente como Eclipse IDE, de la que se ponen disponibles &lt;a href="http://www.eclipse.org/downloads/index-helios.php"&gt;12 empaquetados&lt;/a&gt; distintos según el propósito de desarrollo, plataforma tecnológica y necesidades del desarrollador. Desde el 23 de Junio de este año está disponible la versión 3.6 denominada &lt;a href="http://www.eclipse.org/helios/"&gt;Eclipse Helios&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El modo de distribución de Eclipse es análogo al de una distribución de Linux como Ubuntu y, por tanto, con la misma potencia, comodidad y efectividad. Los distintos paquetes son, en definitiva, distintas combinaciones de proyectos con sus dependencias debidamente resueltas contra los repositorios de Eclipse. Las actualizaciones, en línea, también son similares a las que se realizan con Ubuntu, con lo que la integridad de dependencias está asegurada. En definitiva, una buena idea extendida a las herramientas de desarrollo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_U3R9awMQHdw/TIgISGuN6yI/AAAAAAAAA4M/FX4x-Od2M3k/s1600/mpc.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="341" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TIgISGuN6yI/AAAAAAAAA4M/FX4x-Od2M3k/s400/mpc.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;La comunidad de Eclipse tiene cientos de plugins, tanto de código abierto como comerciales, no todos hospedados eclipse.org, que pueden ser de interés. El sistema de repositorios de Eclipse, si bien resuelve correctamente dependencias, requiere que añadamos manualmente las url's de las fuentes de software que queremos instalar. Una de las novedades de Eclipse Helios se acerca aún más a la analogía comentada añadiendo al sistema de repositorios de Eclipse una herramienta de alto nivel llamada &lt;a href="http://www.eclipse.org/mpc/"&gt;Eclipse Marketplace Client (MPC)&lt;/a&gt;. MPC funciona como un almacén de aplicaciones y plugins (&lt;i&gt;app store&lt;/i&gt;) centralizado permitiendo la descarga e instalación de forma cómoda, automática e integrada en nuestro Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para trabajar con un proyecto JEE me gusta que mi Eclipse tenga los plugins de integración con Subversion (SVN), Maven y Glassfish (o el servidor de aplicaciones con el que vaya a trabajar). Por alguna razón que desconozco, Helios aún no trae "de serie" la integración con Maven y SVN. Es posible que sea por mantener escrupulosamente la libertad del desarrollador ya que existen varios plugins disponibles, de los cuales, los más conocidos son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maven&lt;/li&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.eclipse.org/m2e/"&gt;m2eclipse (m2e)&lt;/a&gt;, el "&lt;i&gt;oficial&lt;/i&gt;" de los chicos de Maven (Sonatype) y que, por cierto, se está trasladando de codehaus.org a eclipse.org&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/iam/"&gt;Eclipse IAM&lt;/a&gt;, antiguo &lt;a href="http://code.google.com/p/q4e/"&gt;q4e&lt;/a&gt; de los chicos de Apache&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;SVN&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://subclipse.tigris.org/"&gt;subclipse&lt;/a&gt;, el &lt;i&gt;"oficial"&lt;/i&gt; de los chicos de SVN&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/subversive/"&gt;subversion&lt;/a&gt;, el &lt;i&gt;"oficial"&lt;/i&gt; de los chicos de Eclipse&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;En mi caso, yo instalo "&lt;i&gt;Maven Integration for Eclipse&lt;/i&gt;" (m2eclipse), "&lt;i&gt;Subversive - SVN Team provider&lt;/i&gt;" para SVN y "&lt;i&gt;Glassfish Java EE Application Server Plugin for Eclipse&lt;/i&gt;".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/helios/"&gt;Eclipse Helios&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.codehaus.org/display/MAVENUSER/Eclipse+Integration%2C+Eclipse+Integration"&gt;Tabla comparativa&lt;/a&gt; entre m2eclipse e IAM, aunque realizada por los chicos de m2eclipse...ejem... ;-)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sonatype.com/people/2010/07/installing-m2eclipse-with-the-eclipse-marketplace/"&gt;Guía de instalación de m2eclipse usando MPC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=eclipseHelios#4.%20Instalando%20Subversive,%20plugin%20para%20Subversion%7Coutline"&gt;Otra guía de instalación usando MPC&lt;/a&gt;, aunque en esta, el autor instala IAM en lugar de m2eclipse&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2899366910175399530?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2899366910175399530/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/09/eclipse-helios-e-integracion-con-svn.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2899366910175399530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2899366910175399530'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/09/eclipse-helios-e-integracion-con-svn.html' title='Eclipse Helios e integración con SVN, Maven y Glassfish'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U3R9awMQHdw/TIgISGuN6yI/AAAAAAAAA4M/FX4x-Od2M3k/s72-c/mpc.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-949752243757546379</id><published>2010-07-05T16:34:00.003+02:00</published><updated>2010-10-21T21:27:36.957+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='alternativas'/><title type='text'>Actualizar el firmware de la BIOS vía USB con linux</title><content type='html'>&lt;div align="left" style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;blockquote&gt;&lt;small&gt;&lt;span style="font-family: tahoma;"&gt;&lt;big&gt;&lt;i&gt;Denme un punto de apoyo y moveré el mundo.&lt;/i&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma;"&gt;- Arquímedes de Siracusa. (c. 287 a. C. – c. 212 a. C.)&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Recientemente tuve que actualizar el firmware de la BIOS de mi placa base y me encontré con la desagradable sorpresa de que las opciones del fabricante eran exclusivamente para Windows y DOS. Para los que usamos linux esto es un grave inconveniente, porque no tenemos ni lo uno ni lo otro, ni mucho menos ganas de adquirir una licencia sólo para esa simpleza. Incluso en el caso que pudiese adquirir una licencia, está el problema de no disponer de disquetera, de la cual carecen todos los equipos recientes.&lt;br /&gt;&lt;br /&gt;Afortunadamente, el disgusto no me duró mucho porque el mundo del software libre ofrece &lt;a href="http://wiki.fdos.org/Installation/BootDiskCreateUSB"&gt;muchas y variadas&lt;/a&gt; soluciones para esta tarea. Durante la búsqueda de soluciones para este problema me reencontré con algunos viejos proyectos que siguen felizmente muy activos y están actualmente en un estado muy interesante, como &lt;a href="http://www.freedos.org/"&gt;FreeDOS&lt;/a&gt; (un sistema operativo libre compatible con MS-DOS) y &lt;a href="http://www.reactos.org/es/index.html"&gt;ReactOS&lt;/a&gt; (el renacimiento de aquel digno pero malogrado &lt;i&gt;Freewin95&lt;/i&gt;)... ufff... uno ya va teniendo una edad...&lt;br /&gt;&lt;br /&gt;De todas las soluciones posibles, traigo a este artículo la que más me gustó y me pareció más sencilla y sólida: &lt;a href="http://unetbootin.sourceforge.net/"&gt;UNetbootin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_U3R9awMQHdw/TCujib0_AgI/AAAAAAAAA3A/GQtnUvFPpzM/s1600/shoot006.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://3.bp.blogspot.com/_U3R9awMQHdw/TCujib0_AgI/AAAAAAAAA3A/GQtnUvFPpzM/s400/shoot006.png" width="400" /&gt;&lt;/a&gt;&lt;i&gt;UNetbootin&lt;/i&gt; te permite crear unidades de arranque USB de forma automática y transparente de numerosas distribuciones de Linux, utilidades diversas (reparación, recuperación, bootloaders, etc) y FreeDOS.&lt;br /&gt;&lt;br /&gt;Adicionalmente, es capaz de crear un disco de arranque a partir de cualquier imagen ISO (o disquete) de arranque, kernel o ficheros intrd, que queramos, con lo que las posibilidades se multiplican.&lt;br /&gt;&lt;br /&gt;El software están disponible también, a su vez, en los repositorios y/o paquetes de para las distribuciones de Linux más conocidas, y también para Windows. Por supuesto, como software libre que es, está disponible el código para cualquier otro caso raro no contemplado.&lt;br /&gt;&lt;br /&gt;En el caso que nos ocupa, en apenas unos minutos pude descargar del repositorio el software (&lt;span style="font-size: x-small;"&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;sudo apt-get install unetbootin&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;) crear una unidad de arranque en un lápiz USB con FreeDOS y ejecutar la utilidad DOS para actualizar la flash de la BIOS de mi sistema. Todo con software libre (¡y gratuito!).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://unetbootin.sourceforge.net/"&gt;UNetbootin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.freedos.org/"&gt;FreeDOS&lt;/a&gt; (Wikipedia: &lt;a href="http://es.wikipedia.org/wiki/FreeDOS"&gt;FreeDOS&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.reactos.org/es/index.html"&gt;ReactOS&lt;/a&gt; (Wikipedia: &lt;a href="http://es.wikipedia.org/wiki/ReactOS"&gt;ReactOS&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://manual.sidux.com/es/bios-freedos-es.htm"&gt;Una forma más manual de hacerlo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Otros: &lt;a href="http://www.plop.at/en/bootmanager.html"&gt;PLoP Boot Manager&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-949752243757546379?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/949752243757546379/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/07/actualizar-el-firmware-de-la-bios-via.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/949752243757546379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/949752243757546379'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/07/actualizar-el-firmware-de-la-bios-via.html' title='Actualizar el firmware de la BIOS vía USB con linux'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_U3R9awMQHdw/TCujib0_AgI/AAAAAAAAA3A/GQtnUvFPpzM/s72-c/shoot006.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-7554919293700646341</id><published>2010-06-24T18:01:00.016+02:00</published><updated>2010-10-13T17:01:32.456+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>XML con PostgreSQL</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;En el artículo &lt;a href="http://balteus.blogspot.com/2009/05/alternativas-eav-con-xml-en-postgresql.html"&gt;Alternativas EAV con XML&lt;/a&gt; expliqué cómo se podía implementar una  mejora del modelo Entity Attribute Value (Entidad-Atributo-Valor) usando XML. Este artículo es, en alguna medida, una continuación de aquél,  cubriendo ciertos aspectos importantes sobre la consulta a éstos campos o cualquier otro campo que contenga xml. El uso de las características de este artículo requiere que la instalación de postgresql se haya  realizado con el soporte xml (configure --with-libxml).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Serialización/deserialización XML de campos varchar&lt;/b&gt;&lt;br /&gt;Hay ocasiones en que necesitamos que los campos que  contienen XML sean de &lt;a href="http://www.postgresql.org/docs/8.4/static/datatype-character.html" id="zsuu" title="tipo caracter"&gt;tipo caracter&lt;/a&gt; y no de tipo xml  nativo. Una razón para hacer eso, por ejemplo, es que estemos usando un &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping" id="v.0a" title="ORM"&gt;ORM&lt;/a&gt;. En algunos casos, pongamos por ejemplo PostgreSQL  con Toplink Essentials (incluído de serie en Glassfish 2.1), no hay  forma (al menos yo no la he encontrado) de que el ORM haga mapping de  campos de tipo xml. Para estos casos, en primer lugar, debemos producir  un valor de tipo xml a partir de datos carácter, para lo que podemos usar la función &lt;i&gt;&lt;span style="font-family: courier new;"&gt;xmlparse&lt;/span&gt;&lt;/i&gt; o realizar un &lt;i&gt;&lt;a href="http://www.postgresql.org/docs/8.3/interactive/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS" id="stc0" title="type cast"&gt;type cast&lt;/a&gt;&lt;/i&gt; a xml usando la  sintaxis tradicional de PostgreSQL &lt;span style="font-family: Courier New;"&gt;&lt;i&gt;expression&lt;/i&gt;::&lt;i&gt;type&lt;/i&gt;&lt;/span&gt; o bien usando la sintaxis SQL-92 estándar &lt;span style="font-family: Courier New;"&gt;CAST ( &lt;i&gt;expression&lt;/i&gt; AS &lt;i&gt;type&lt;/i&gt; )&lt;/span&gt;, así:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" height="51" id="oclr"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SELECT XMLPARSE( DOCUMENT campo)&lt;br /&gt;FROM tabla&lt;br /&gt;WHERE campo  is not null&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&amp;lt;=&amp;gt;&lt;/td&gt;&lt;td&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SELECT cast(campo as xml)&lt;br /&gt;FROM tabla&lt;br /&gt;WHERE campo is not null&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&amp;lt;=&amp;gt;&lt;/td&gt;&lt;td&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SELECT campo::xml&lt;br /&gt;FROM tabla&lt;br /&gt;WHERE campo is not null&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Consultas: la función xpath&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para procesar valores de tipo xml, PostgreSQL  ofrece la función &lt;span style="font-family: Courier New;"&gt;xpath&lt;/span&gt;, que evalúa  expresiones &lt;a href="http://www.w3.org/TR/xpath/"&gt;XPath 1.0&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&lt;span style="font-family: Courier New;"&gt;xpath&lt;/span&gt;(&lt;i&gt;xpath_expr&lt;/i&gt;, &lt;i&gt;xml&lt;/i&gt;_value[&lt;span class="OPTIONAL"&gt;, &lt;i&gt;nsarray&lt;/i&gt;&lt;/span&gt;])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La función &lt;span style="font-family: Courier New;"&gt;xpath&lt;/span&gt; evalúa la expresión XPath &lt;i&gt;xpath_expr&lt;/i&gt; contra el valor XML &lt;i&gt;xml_value&lt;/i&gt; (debe ser un documento XML bien  formado), devolviendo un array de valores XML correspondiente al  conjunto de nodos producidos por la expresión XPath. El tercer  argumento, opcional, es el array bidimensional de espacios de nombress  (nombre espacio de nombres,URI espacio de nombres) que use el documento  XML &lt;i&gt;xml_value&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Por ejemplo, dado un campo &lt;i&gt;campo&lt;/i&gt; de la tabla &lt;i&gt;tabla&lt;/i&gt;, de tipo varchar(2048), podríamos consultar el contenido así (a partir de este momento usaremos la  sintaxis del último ejemplo, la tradicional de PostgreSQL, por ser la  más sencilla):&lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#000000" cellpadding="3" cellspacing="0" id="xj-_"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Consulta&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Resultado&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SELECT campo::xml&lt;br /&gt;FROM tabla&lt;br /&gt;where campo is not null&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;campo&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;&amp;lt;xmlData&amp;gt;&amp;lt;data name="incidencia"&amp;gt;&lt;br /&gt;&amp;lt;data  value="tiempo"  name="motivo"/&amp;gt;&amp;lt;/data&amp;gt;&amp;lt;/xmlData&amp;gt;&lt;br /&gt;&amp;lt;xmlData&amp;gt;&amp;lt;data name="incidencia"&amp;gt;&lt;br /&gt;&amp;lt;data value="hardware"  name="motivo"/&amp;gt;&amp;lt;/data&amp;gt;&amp;lt;/xmlData&amp;gt;&lt;br /&gt;&amp;lt;xmlData&amp;gt;&amp;lt;data name="incidencia"&amp;gt;&lt;br /&gt;&amp;lt;data value="hardware"  name="motivo"/&amp;gt;&amp;lt;/data&amp;gt;&amp;lt;/xmlData&amp;gt;&lt;br /&gt;&amp;lt;xmlData&amp;gt;&amp;lt;data name="cantidad" value="2"&amp;gt;&amp;lt;/xmlData&amp;gt;&lt;br /&gt;&amp;lt;xmlData&amp;gt;&amp;lt;data name="cantidad" value="3"&amp;gt;&amp;lt;/xmlData&amp;gt; &lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Es importante recordar que la función xpath devuelve un array de valores  XML. Por ejemplo, si deseamos consultar sólo el contenido de aquellos  valores de elementos data cuyo name es "motivo", por eso la siguiente  consulta nos devuelve 4 filas. Es decir, de las cuatro filas en las que  campo tiene valores, sólo dos de ellas tiene un elemento data con name  igual a 'motivo', pero como xpath devuelve un array de valores, en las  los dos últimas filas se devuelve un array vacio. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#000000" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Consulta&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Resultado&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SELECT  xpath('//data[@name=''motivo'']/@value',campo::xml) as motivos&lt;br /&gt;FROM  tabla&lt;br /&gt;where campo is not null&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;motivos&lt;br /&gt;----------&lt;br /&gt;{tiempo} &lt;br /&gt;{hardware}&lt;br /&gt;{}&lt;br /&gt;{}&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Para evitar lo anterior, podemos hacer:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#000000" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Consulta&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Resultado&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SELECT  xpath('//data[@name=''motivo'']/@value',campo::xml) as motivos&lt;br /&gt;FROM tabla&lt;br /&gt;where campo is not null&lt;br /&gt;and  array_upper(xpath('//data[@name=''motivo'']',campo::xml),1) is not null&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;motivos&lt;br /&gt;------------&lt;br /&gt;{tiempo}&lt;br /&gt;{hardware}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La consulta anterior elimina aquellas filas con array vacío. No obstante, &lt;i&gt; xpath()&lt;/i&gt; nos sigue devolviendo un array que tendremos que procesar  posteriormente. Para que nos devuelva valores de tipo xml (u no un array) tendremos que  tratar la respuesta de xpath como array y pedir el primer elemento del  mismo. Así:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#000000" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Consulta&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Resultado&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SELECT  (xpath('//data[@name=''motivo'']/@value',campo::xml))[1] as motivos&lt;br /&gt;FROM tabla&lt;br /&gt;where campo is not null&lt;br /&gt;and  array_upper(xpath('//data[@name=''motivo'']',campo::xml),1) is not null&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;motivos&lt;br /&gt;-----------&lt;br /&gt;tiempo&lt;br /&gt;hardware&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Obviamente, podemos usar la función xpath no sólo para seleccionar valores (uso en la &lt;i&gt;select list&lt;/i&gt; de la sentencia &lt;i style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SELECT&lt;/i&gt;) sino también en la cláusula &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WHERE&lt;/span&gt;, para filtrar filas. En este último caso, tendremos que realizar una conversión de tipo para poder realizar ciertas comparaciones (comparación de valores enteros, de fechas, etc...). La conversión a realizar debe ser un poco especial, ya que deberemos convertir de xml a varchar y de éste al tipo deseado. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql; gutter: false;"&gt;SELECT (xpath('//data[@name=''cantidad'']/@value',campo::xml))[1]::varchar::int4&lt;br /&gt;FROM step&lt;br /&gt;where campo is not null&lt;br /&gt;and array_upper(xpath('//data[@name=''cantidad'']',campo::xml),1) is not null&lt;br /&gt;and (xpath('//data[@name=''cantidad'']/@value',campo::xml))[1]::varchar::int4 &gt; 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Con lo que conseguiríamos todas aquellas filas con xml que tengan un elemento data con nombre "cantidad" cuyo valor sea superior a 2.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Con esto, podemos usar un modelo más flexible (especialmente para valores de poca densidad) al modelo EAV y con consultas más asequibles.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.postgresql.org/docs/current/static/datatype-xml.html"&gt;http://www.postgresql.org/docs/current/static/datatype-xml.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.postgresql.org/docs/8.4/static/functions-xml.html#FUNCTIONS-XML-PROCESSING"&gt;http://www.postgresql.org/docs/8.4/static/functions-xml.html#FUNCTIONS-XML-PROCESSING&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.w3.org/TR/xpath/"&gt;XPath 1.0&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-7554919293700646341?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/7554919293700646341/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/06/xml-con-postgresql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7554919293700646341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7554919293700646341'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/06/xml-con-postgresql.html' title='XML con PostgreSQL'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4162629548905968401</id><published>2010-05-19T23:47:00.005+02:00</published><updated>2011-07-28T14:42:32.513+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><title type='text'>WSTX-SERVICE-5002: A JTA Transaction MUST NOT exist entering WS-TX Service Pipe procesing for binding... SOLUCIONADO</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;JAX-WS representó una revolución en la implementación de SOAP Web Services en JEE. Su aparición en JEE 5 nos permitió publicar como Web Service un Stateless Session EJB automáticamente, de forma declarativa, añadiendo simplemente la anotación @WebService. Sin embargo, bajo determinadas condiciones, nuestro cliente se puede encontrar con un error que, a priori, nos puede resultar desconcertante:&lt;br /&gt;&lt;br /&gt;&lt;textarea cols="110" rows="3"&gt;WSTX-SERVICE-5002: A JTA Transaction MUST NOT exist entering WS-TX Service Pipe procesing for binding '{http://jdialer.sgi.gesif/}dataproviderPortBinding' and operation 'getContacts'. JTA Transaction is  J2EETransaction: txId=51 nonXAResource=null jtsTx=com.sun.jts.jta.TransactionImpl@d419b987 localTxStatus=0 syncs=[]....&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;Tras este error suelen producirse otros dos igualmente desconcertantes: &lt;span style="font-family: Courier New;"&gt;&lt;i&gt;"HTTP transport error: java.net.UnknownHostException: host_cliente&lt;/i&gt;&lt;/span&gt;" o el clásico SSL Handshake &lt;span style="font-family: Courier New;"&gt;&lt;i&gt;"HTTP transport error: javax.net.ssl.SSLHandshakeException:  sun.security.validator.ValidatorException: PKIX path building failed:  sun.security.provider.certpath.SunCertPathBuilderException: unable to  find valid certification path to requested target"&lt;/i&gt;&lt;/span&gt;. Es decir, es como si nuestro servidor estuviese intentando contactar con nuestro cliente por HTTPS. ¿Por qué lo hace?&lt;br /&gt;&lt;br /&gt;Una pista: las condiciones en las que se da este error es si el cliente es un EJB. Sólamente en ese caso. Si es un servlet, o una aplicación standalone, funciona perfectamente. ¿Esto te da una idea o aún te confunde más?&lt;br /&gt;&lt;br /&gt;La explicación es, en realidad, muy sencilla: los EJB's tienen el atributo de transacción establecido por defecto a REQUIRED (&lt;span style="font-family: Courier New;"&gt;@TransactionAttribute(TransactionAttributeType.REQUIRED)&lt;/span&gt;). El código cliente del Web Service lo tiene en cuenta y añade un contexto transaccional al mensaje SOAP. Si EJB "servidor" ha declarado que no necesita transacciones (&lt;span style="font-family: Courier New;"&gt;@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)&lt;/span&gt;), ya tenemos el problema servido. &lt;b&gt;La solución&lt;/b&gt; en estos casos &lt;b&gt;es&lt;/b&gt; también sencilla, debemos&lt;b&gt; indicar a nuestro cliente&lt;/b&gt; que no use un contexto transaccional en la petición, anotándolo con &lt;b&gt;&lt;span style="font-family: Courier New;"&gt;@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)&lt;/span&gt;&lt;/b&gt;, y así el servidor no usará el coordinador WSTX (Web Service Transactions).&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/1763183641342103044-4162629548905968401?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4162629548905968401/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/05/wstx-service-5002-jta-transaction-must.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4162629548905968401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4162629548905968401'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/05/wstx-service-5002-jta-transaction-must.html' title='WSTX-SERVICE-5002: A JTA Transaction MUST NOT exist entering WS-TX Service Pipe procesing for binding... SOLUCIONADO'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2671175114232479829</id><published>2010-04-14T01:40:00.009+02:00</published><updated>2011-06-13T23:11:51.686+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><title type='text'>La galaxia en un campo de fútbol</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div align="left" style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;blockquote&gt;&lt;small&gt;&lt;span style="font-family: tahoma;"&gt;&lt;big&gt;&lt;i&gt;Cuando veas un gigante, examina antes la posición del sol; no vaya a ser la sombra de un pigmeo.&lt;/i&gt;&lt;br /&gt;&lt;/big&gt;&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma;"&gt;- Novalis (1772-1801) Friedrich von Hardenberg. Poeta y filósofo alemán.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_U3R9awMQHdw/S8TDB8aDWrI/AAAAAAAAA0Q/PRJ_btGALDM/s200/La+galaxia+en+un+campo+de+f%C3%BAtbol.jpg" style="float: left; margin-bottom: 10px; margin-right: 10px; margin-top: 10px; max-width: 800px;" /&gt;En el artículo &lt;i&gt;&lt;a href="http://balteus.blogspot.com/2009/11/magnitudes-astronomicas.html" target="_blank"&gt;Magnitudes astronómicas&lt;/a&gt;&lt;/i&gt; describía mi fascinación por los enormes tamaños de algunos cuerpos astronómicos. La mejor forma de "entender" realmente cómo eran de grandes era, obviamente, ubicándolos en nuestro mundo cotidiano, es decir, comparándolos con objetos conocidos. &lt;br /&gt;Como prometí en dicho artículo, hoy voy a comentar el libro &lt;i&gt;"La Galaxia en un campo de fútbol"&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;En mi artículo me limité al tamaño de algunos cuerpos de forma singular. &lt;i&gt;"La Galaxia en un campo de fútbol"&lt;/i&gt;, en cambio, es una exposición sistemática, pero al mismo tiempo muy amena, en la que se nos plantea un método que nos permite imaginar las distancias astronómicas para comprender (e imaginar también, en definitiva) el universo. Desde nuestro "entorno" más cercano, la tierra y sus satélites (artificiales y naturales), donde las distancias se miden en miles de Km, hasta abarcar la visión global del Universo conocido, donde las distancias se miden en millones de años luz, la obra desarrolla el método de forma muy ilustrativa y con ejemplos, de forma que nos permite por primera vez "imaginar" realmente dichas distancias. Así, los que nos hemos leído el texto, podemos entender realmente noticias como las del pasado 8 de Abril sobre &lt;a href="http://www.google.es/search?hl=es&amp;amp;safe=off&amp;amp;client=firefox-a&amp;amp;hs=IPp&amp;amp;rls=com.ubuntu%3Aes-ES%3Aofficial&amp;amp;q=2010+ga6+rozando+la+tierrra&amp;amp;meta=&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=&amp;amp;gs_rfai=" target="_blank"&gt;un asteroide que pasó &lt;i&gt;rozando&lt;/i&gt; la tierra&lt;/a&gt;, comprendiendo realmente las distancias que se indican y realizando cada uno nuestra propia valoración sobre lo "cerca" o "lejos" que está algo según el sistema de referencia y dependiendo con qué distancias comparemos (desde luego, un objeto como el &lt;a href="http://neo.jpl.nasa.gov/news/news166.html" target="_blank"&gt;2009 VA&lt;/a&gt; del pasado Noviembre sí que pasó "cerca"... cualquier día de éstos se llevan un satélite geoestacionario por delante).&lt;br /&gt;&lt;br /&gt;El libro está escrito pensando en lectores interesados por el tema, pero no presupone conocimiento alguno sobre astronomía, de forma que un lector curioso y lego en la materia podrá disfrutar tanto o más que un aficionado. De hecho, el autor, en un esfuerzo (supongo) por mantener un lenguaje cercano y ameno, dota el libro de un estilo de redacción en la que entabla un diálogo con el lector, consiguiendo un resultado entretenido y accesible aunque quizá de forma desmedida, resultando al final  (en mi modesta opinión y por poner alguna pega) un poco pueril e ingenuo (eso de pedir al lector que haga algo y luego felicitarlo por hacerlo me parece un poco excesivo).&lt;br /&gt;&lt;br /&gt;Por lo demás, el ejemplar está editado en un tamaño muy cómodo e impreso en un papel excelente, permitiéndonos disfrutar de las maravillosas fotografías astronómicas que incluye.&lt;br /&gt;&lt;br /&gt;En definitiva, una obra muy atractiva que volveré a releer y disfrutar para asimilar bien "el método" y continuar "imaginando" el universo. Os la recomiendo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://juanmacarron.com/metodo_macarron.html"&gt;Juan Fernández Macarrón (método)&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;a href="http://www.juanmacarron.com/galaxia_campo_futbol.html"&gt;La galaxia en un campo de fútbol&lt;/a&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2671175114232479829?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2671175114232479829/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/04/la-galaxia-en-un-campo-de-futbol.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2671175114232479829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2671175114232479829'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/04/la-galaxia-en-un-campo-de-futbol.html' title='La galaxia en un campo de fútbol'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_U3R9awMQHdw/S8TDB8aDWrI/AAAAAAAAA0Q/PRJ_btGALDM/s72-c/La+galaxia+en+un+campo+de+f%C3%BAtbol.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-3141746424633875137</id><published>2010-03-25T23:03:00.002+01:00</published><updated>2010-03-25T23:12:14.134+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Generación de código JAXB con Maven</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;div align='left' style='font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;'&gt;&lt;blockquote&gt;&lt;small&gt;&lt;font face='tahoma'&gt;&lt;big&gt;&lt;i&gt;Si tu intención es describir la verdad, hazlo con sencillez y la elegancia déjasela al sastre.&lt;/i&gt;&lt;br/&gt;&lt;/big&gt;&lt;/font&gt;&lt;/small&gt;&lt;div align='right'&gt;&lt;small&gt;&lt;font face='tahoma'&gt;&lt;big&gt;- Albert Einstein.&lt;/big&gt;&lt;/font&gt;&lt;/small&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br/&gt;Al hilo de lo que comentaba en el artículo &lt;a href='http://balteus.blogspot.com/2010/02/desarrollo-en-equipo-con-svn-maven-y.html' target='_blank'&gt;&lt;i&gt;"Desarrollo en equipo con SVN, Maven y Nexus"&lt;/i&gt;&lt;/a&gt;, una de las maravillas de usar Maven es que te facilita la reproducibilidad, por ejemplo, de la gestión de la configuración de un proyecto. El caso que voy a exponer es un estupendo ejemplo: la generación de código JAXB a partir de esquemas XML (XSD).&lt;br/&gt;&lt;br/&gt;La generación de código JAXB se ha venido haciendo típicamente de dos formas: a través de una herramienta o utilidad (wizard, plugin, etc...) de nuestro IDE, o "manualmente" usando la &lt;a href='https://jaxb.dev.java.net/nonav/2.0.2/docs/xjcTask.html' target='_blank'&gt;tarea xjc de ant&lt;/a&gt;, o el compilador xjc por línea de comando directamente. Personalmente, nunca me ha gustado usar las herramientas automáticas de los IDE, porque ocultan la configuración del proyecto: los &lt;i&gt;settings&lt;/i&gt; que se configuran en un &lt;i&gt;wizard&lt;/i&gt; del IDE se acaban perdiendo porque no se suben al repositorio de código o si se hace, atas el proyecto a una herramienta que puede que no uses (tú u otro compañero a quien le toque modificarlo) varios meses después cuando te encuentras con el mantenimiento de un proyecto cuya configuración no es reproducible. Además, esa tarea suele ser repetitiva y necesita ser ejecutada a menudo, especialmente en las fases iniciales donde se va ajustando nuestro esquema XML a los tipos de dato que vamos necesitando, de modo que acabo haciendo "a mano" una tarea ant que realice la generación o un shell script que realice la llamada al compilador xjc con los parámetros que quiero.&lt;br/&gt;&lt;br/&gt;Afortunadamente, podemos hacer que Maven realice esta tarea automáticamente como parte de sus labores de construcción, y como tenemos nuestro pom.xml subido a svn, todas nuestras preferencias de generación permanecen autocontenidas en el proyecto: simple, sencillo y sin ataduras a ningún IDE.&lt;br/&gt;&lt;br/&gt;Iba a poner aquí los trozos necesarios a incluir en el pom.xml extraído de uno de los módulos del proyecto en el que estoy trabajando pero, la verdad, sería redundante porque &lt;b&gt;está perfectamente explicado en el &lt;a href='https://jaxb.dev.java.net/jaxb-maven2-plugin/' target='_blank'&gt;sitio del plugin JAXB XJC de Maven&lt;/a&gt;&lt;/b&gt;.&lt;br/&gt;&lt;br/&gt;En mi caso, que uso Eclipse con m2eclipse (plugin de maven para eclipse), la integración con Maven es tal, que basta con realizar una modificación el XSD y salvarlo para que se regenere y recompile la clase automáticamente y tenga disponibles los nuevos métodos en mis clases "cliente" de forma instantánea (m2eclipse ejecuta el &lt;i&gt;"generate"&lt;/i&gt; de Maven integrado con el propio build de Eclipse).&lt;br/&gt;&lt;br/&gt;Otra razón más para continuar recomendando usar Maven.&lt;br/&gt;&lt;br/&gt;&lt;span style='color: rgb(153, 0, 0);'&gt;&lt;b&gt;Referencias:&lt;/b&gt;&lt;/span&gt;&lt;br/&gt;&lt;ul&gt;&lt;li&gt;&lt;a href='https://jaxb.dev.java.net/jaxb-maven2-plugin/' target='_blank'&gt;JAXB XJC Maven 2 Plugin&lt;/a&gt;&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-3141746424633875137?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/3141746424633875137/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/03/generacion-de-codigo-jaxb-con-maven.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/3141746424633875137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/3141746424633875137'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/03/generacion-de-codigo-jaxb-con-maven.html' title='Generación de código JAXB con Maven'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-3325249529142354771</id><published>2010-03-07T12:09:00.002+01:00</published><updated>2011-03-09T14:24:26.848+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>Balteus cumple un año</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;blockquote&gt;&lt;i&gt;&lt;span style="font-family: tahoma;"&gt;“Yo…he visto cosas que vosotros no creeríais. Naves de guerra ardiendo más allá de Orión. He visto rayos-c resplandecer en la oscuridad, cerca de la puerta de Tanhäuser. Todos esos…momentos se perderán…en el tiempo. Como…lágrimas…en la lluvia. Es hora…de morir”&lt;/span&gt;&lt;/i&gt;.&lt;span style="font-family: tahoma;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;span style="font-family: tahoma;"&gt;--Roy Batty, Blade Runner&lt;/span&gt;.&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;Ya ha pasado un año desde mi primer artículo. Una primera entrada impetuosa que escribí sin presentación, casi por rabia, tras perder demasiado tiempo en un error absurdo, de ésos que te vuelven loco, y de los que sólo te sirven para aprender que debes cuestionarlo todo y no dar nada por sentado. Fue en ese estado de rabia contenida y aliviada, tras solucionar el error, cuando decidí que debía compartir estas experiencias con otros desarrolladores, tal y como hacen miles de compañeros alrededor del mundo, de cuyos trabajos y generosidad me he ido aprovechando durante años, ahorrándome muchas horas y disgustos. Tras ése primer post, escribí realmente &lt;a href="http://balteus.blogspot.com/2009/03/banco-de-experiencias-introduccion.html" target="_blank"&gt;la presentación del blog&lt;/a&gt; con mis motivos y objetivos.&lt;br /&gt;&lt;br /&gt;He querido comenzar este post con la que es, probablemente, la cita más conocida de todos los locos entusiastas del cine de ciencia ficción... Parece una entrada melancólica, pero nada de eso en absoluto: simplemente es un homenaje a Ridley Scott y a la película. Yo creo que no hay desarrollador que no haya dicho o pensado algo así tras una &lt;i&gt;puesta en producción&lt;/i&gt;... ¿eh? ;-)&lt;br /&gt;&lt;br /&gt;1 año. 25 Entradas. 2 entradas al mes, de media. Menos de lo que me gustaría... pero no encuentro tiempo para mucho más. &lt;a href="http://balteus.blogspot.com/2009/10/la-falacia-de-la-ingenieria-del.html" target="_blank"&gt;&lt;i&gt;"La falacia de la Ingeniería del Software"&lt;/i&gt;&lt;/a&gt; y los artículos de &lt;a href="http://balteus.blogspot.com/search/label/experiencias" target="_blank"&gt;la serie &lt;i&gt;"Banco de experiencias"&lt;/i&gt;&lt;/a&gt; son probablemente las entradas de las que me siento más satisfecho (aunque, curiosamente, no son las que más interés despiertan). De los datos y números que aporta Google Analytics, destacaría dos cosas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La gente busca soluciones. Las entradas más consultadas son aquellas en las que comento cómo he solucionado un error o problema. Lo cual es lógico. En mi caso también ha sido así. Muchos de los blogs en los que he aterrizado ha sido vía google, buscando una determinada solución. En definitiva, cuando tenemos un problema, buscamos si a otra persona le ha pasado lo mismo antes de perder más tiempo. Como digo, constato una evidencia que ya suponía.&lt;/li&gt;&lt;li&gt;Realmente el blog tiene visibilidad en todas partes del mundo. Internet hace que todo el mundo sean un montón de ordenadores conectados sin importar localización, idioma o frontera. Parece evidente. Es evidente. Sin embargo, cuando lo confirmas con datos concretos da cierto vértigo. Asumes las lógicas visitas de España y países de habla hispana (al fin y al cabo escribo en español)... pero llaman la atención visitas de Estados Unidos, Alemania, Suiza, Rusia, Brasil, Polonia, India, Finlandia, Corea... ¿Hispanohablantes por el mundo? ¿O simplemente hay gente que busca su respuesta esté en el idioma que esté? (yo lo hago... quizá los angloparlantes, germanoparlantes, etc... también).&lt;/li&gt;&lt;/ul&gt;En fin, son un par de obviedades con las que todo el mundo cuenta... pero que nunca dejan de sorprender. Al fin y al cabo tenemos una dimensión local y finita... Que lo que escribes pueda ser de interés para alguien tan lejano, impresiona, la verdad.&lt;br /&gt;&lt;br /&gt;En todo caso tendré en cuenta estas reflexiones para mis próximas entradas. Es posible que los localismos comentados en &lt;a href="http://balteus.blogspot.com/2009/11/magnitudes-astronomicas.html" target="_blank"&gt;"Magnitudes astronómicas"&lt;/a&gt; no sean tan claros para gente que no conoce Madrid. Por otro lado, es difícil no hacer referencias al mundo que te rodea. Con respecto a la temática, mi trabajo diario suele darme material de sobra para seguir compartiendo "soluciones" y "experiencias". Así que seguiré en ello.&lt;br /&gt;&lt;br /&gt;Gracias a los que visitáis el blog, seáis de donde seáis. Un afectuoso saludo.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-3325249529142354771?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/3325249529142354771/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/03/balteus-cumple-un-ano.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/3325249529142354771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/3325249529142354771'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/03/balteus-cumple-un-ano.html' title='Balteus cumple un año'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-7486319947001575108</id><published>2010-02-22T20:54:00.008+01:00</published><updated>2011-06-20T17:27:58.005+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Desarrollo en equipo con SVN, Maven y Nexus (parte II)</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;h2&gt;Banco de experiencias (V)&lt;/h2&gt;En la &lt;a href="http://balteus.blogspot.com/2010/02/desarrollo-en-equipo-con-svn-maven-y.html" target="_blank"&gt;primera parte&lt;/a&gt; de este artículo, enumeraba los problemas de coordinación a los que se enfrenta un equipo de desarrollo diariamente y cómo la utilización de Maven los soluciona de un plumazo por el simple hecho de utilizarlo. Hay un problema sin embargo, inherente al desarrollo en equipo, para el cual se necesita una herramienta más: un gestor de repositorios.&lt;br /&gt;&lt;br /&gt;Imaginemos el siguiente escenario de proyecto: un equipo está desarrollando una aplicación empresarial (ear) formada por un par de módulos web, otro par de módulos ejb (ejb-jar), un conector JCA (rar) y tres módulos de librerías comunes (jar). &lt;br /&gt;&lt;br /&gt;En un proyecto de éstas características (proyecto con varios módulos) cada desarrollador trabaja en uno o varios módulos (en función de la funcionalidad, de su perfil, habilidades o experiencia...), pero no suele participar en todos... Al menos, eso es lo habitual. Sin embargo necesita tener las actualizaciones y los progresos de todos (o la mayoría) de los módulos, debido a las dependencias entre ellos. Estas dependencias inter-proyecto o inter-módulo son las que denominé como dependencias internas en la primera parte de este artículo. Pero ¿ćomo estar actualizados y poder tener las nuevas funcionalidades y servicios que han desarrollado nuestros compañeros para poderlos usar en los módulos que estamos desarrollando? Típicamente esto se hace de dos formas:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Todos los desarrolladores tienen todos los proyectos creados en su IDE y vinculados con SVN o, al menos, los proyectos en los que está trabajando, los proyectos dependientes, y los dependientes de los dependientes (dependencias transitivas), y así sucesivamente... es decir, típicamente todos. Esto es lógicamente un engorro, porque cada vez que alguien realice una refactorización que suponga la creación de un nuevo proyecto, afectará a todo el equipo de desarrollo. Todos los cambios impactan a todos (cambios en la configuración, dependencias, nuevos proyectos, etc...), favoreciendo, además, la incidencia de errores dada la exposición de todos los fuentes a todo el equipo.&lt;/li&gt;&lt;li&gt;Los desarrolladores que trabajan en proyectos que son requeridos por el resto "publican" sus artefactos en SVN o un repositorio común en red. Esta segunda opción introduce complejidad de configuración y coordinación en el equipo y scripts adicionales que realicen esas tareas, ya que hay que "avisar" de cuando hay que actualizar las dependencias... en todo caso: la gestión de las dependencias (en este caso internas) se manejan manualmente vía scripts (típicamente de ant).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h4&gt;Software de gestión de repositorios Maven&lt;/h4&gt;El software para de gestión de repositorios Maven sirve precísamente para eso: para crear y gestionar nuestros propios repositorios de Maven. De esta forma tendremos la gestión de dependencias solucionada:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;las dependencias externas, a través del mismo Maven, usando el repositorio Central. También podemos crear nuestros propios repositorios proxies de otros, reduciendo el tráfico de red.&lt;/li&gt;&lt;li&gt;las dependencias internas (o inter-proyecto) con nuestro repositorio.&lt;/li&gt;&lt;/ul&gt;Veamos el siguiente ejemplo: tenemos un equipo de tres desarrolladores que está desarrollando una aplicación que tiene un módulo JAR, que a su vez es usado por un módulo EJB y otro módulo WAR que usa (necesita) los dos anteriores.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El desarrollador &lt;i&gt;A&lt;/i&gt; participa en el desarrollo del módulo EJB, y es el único que desarrolla el módulo JAR. Este desarrollador no tiene que resolver dependencias internas, digamos que es un "productor" y debe "publicar" su trabajo para los demás.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;El desarrollador &lt;i&gt;B&lt;/i&gt; sólo trabaja en el módulo WAR: por tanto debe disponer de los otros proyectos. Sería el caso del "consumidor" exclusivo.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;El desarrollador &lt;i&gt;C&lt;/i&gt; trabaja en los módulos WAR y EJB: es decir, es consumidor y productor a la vez. Debe publicar su trabajo, pero también requiere del trabajo del desarrollador &lt;i&gt;A&lt;/i&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;img border="0" src="http://lh5.ggpht.com/_U3R9awMQHdw/S4LreAEOSYI/AAAAAAAAAy0/gTKC1PZdX6Y/%5BUNSET%5D.png?imgmax=800" /&gt;&lt;br /&gt;&lt;br /&gt;En el caso anterior, usando un repositorio remoto con un software de gestión de repositorios, Maven realizará todos los trabajos de sincronización de forma transparente, realizando la publicación de artefactos al repositorio (&lt;i&gt;mvn deploy&lt;/i&gt;) para los desarrolladores &lt;i&gt;A&lt;/i&gt; y &lt;i&gt;C&lt;/i&gt;, y la actualización automática para todos. Lo único que hay que hacer es especificarle la URL del repositorio en los pom.xml de los proyectos, simplificando enormemente la coordinación en proyectos reales típicos (más grandes, complejos y con más desarrolladores).&lt;br /&gt;&lt;br /&gt;El software repositorio que yo conozco es &lt;a href="http://nexus.sonatype.org/" target="_blank"&gt;Nexus&lt;/a&gt;, de la compañía que creó Maven (Sonatype), y la verdad, estoy muy satisfecho con su funcionamiento. No obstante, hay otros también bastante usados como &lt;a href="http://archiva.apache.org/" target="_blank"&gt;Apache Archiva&lt;/a&gt;, o &lt;a href="http://www.jfrog.org/products.php" target="_blank"&gt;Artifactory&lt;/a&gt;. En general, todos parecen cumplir correctamente su misión principal y tienen una instalación sencilla. Al final del artículo puedes encontrar algunas referencias útiles con datos y opiniones sobre Archiva y Nexus. Con independencia de la elección, el objetivo del artículo es dejar claro para qué sirve y por qué nos es tan útil un software de gestión de repositorios. En nuestro caso particular, nos decidimos por Nexus porque usamos eclipse y pensábamos que tendríamos menos problemas si todas las herramientas estaban bien integradas por ser de la misma compañía: Maven, Nexus y &lt;a href="http://m2eclipse.sonatype.org/" target="_blank"&gt;m2eclipse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La verdad, he de decir, que m2eclipse nos ha dado algún problema que otro, especialmente alguno&amp;nbsp; bastante gordo que nos retrasó en el conocimiento del plugin y cómo funcionaba (p.e.: la opción "Enable Workspace resolution" ha dado problemas en sucesivas versiones del plugin), pero nada que decir sobre Nexus: hasta el momento, perfecto.&lt;br /&gt;&lt;br /&gt;Finalmente, SVN, Maven y Nexus conforman una tríada perfecta para empezar cualquier proyecto pequeño adoptando buenas prácticas y un mínimo de coordinación automatizada, permitiéndonos poder escalar a proyectos y grupos más grandes afinando más hacia la integración continua con una buena base.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://tratandodeentenderlo.blogspot.com/2009/09/crea-tu-propio-repositorio-maven-con.html" target="_blank"&gt;Introducción a Apache Archiva&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mikiorbe.wordpress.com/2009/01/20/repositorios-maven-nexus/"&gt;Introducción a Nexus&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.chuidiang.com/2009/11/25/archiva-vs-nexus/" target="_blank"&gt;Archiva vs Nexus&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.codehaus.org/display/MAVENUSER/Maven+Repository+Manager+Feature+Matrix" target="_blank"&gt;Comparativa: Archiva / Artifactory / Nexus&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tratandodeentenderlo.blogspot.com/2009/09/integracion-continua.html" target="_blank"&gt;Excelente artículo de introducción a la Integración contínua&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=90e4fcd6-25d9-8871-af75-fbbb8f0b8d8a" /&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/1763183641342103044-7486319947001575108?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/7486319947001575108/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/02/desarrollo-en-equipo-con-svn-maven-y_22.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7486319947001575108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7486319947001575108'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/02/desarrollo-en-equipo-con-svn-maven-y_22.html' title='Desarrollo en equipo con SVN, Maven y Nexus (parte II)'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_U3R9awMQHdw/S4LreAEOSYI/AAAAAAAAAy0/gTKC1PZdX6Y/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-8317922876180812418</id><published>2010-02-09T00:42:00.008+01:00</published><updated>2011-06-20T17:30:00.835+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Desarrollo en equipo con SVN, Maven y Nexus (parte I)</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;h2&gt;Banco de experiencias (V)&lt;/h2&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;El orden es el placer de la razón pero el desorden es la delicia de la imaginación.&lt;/i&gt;&lt;br /&gt;-Paul Claudel.&lt;/blockquote&gt;&lt;br /&gt;El desarrollo de software aúna una fascinante mezcla de pensamiento divergente (o creativo) con conceptos técnicos y prácticas metódicas. Para que un desarrollador (y especialmente un equipo de desarrollo) alcance los mayores niveles de eficiencia y productividad, las herramientas utilizadas deben garantizar la seguridad del proceso, pero siempre de forma proporcional a la envergadura del proyecto y manteniendo compatibilidad con el proceso creativo sin ahogarlo. Hay herramientas libres que nos ayudan a mantener este este delicado equilibrio entre orden y libertad para todo tipo de proyectos de forma sencilla e impecable.&lt;br /&gt;&lt;br /&gt;Éste, como el resto de los artículos de la serie &lt;i&gt;"&lt;a href="http://balteus.blogspot.com/2009/03/banco-de-experiencias-introduccion.html" target="_blank"&gt;banco de experiencias&lt;/a&gt;"&lt;/i&gt;, no pretende ser un artículo más de documentación sobre las herramientas aquí comentadas ni encontrarás tampoco el enésimo tutorial sobre el asunto. Hay mucha documentación en la red y a lo largo del artículo suelo ofrecer información y referencias suficientes para que puedas profundizar en el tema. La idea de estos artículos es exponer buenas prácticas y comentar mi punto de vista, basado en mi propia experiencia profesional, sobre la utilidad real y pragmática de los temas abordados. Sin demagogia rimbombante ni publicidad interesada. Simplemente la síntesis de mi experiencia subjetiva.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt;&lt;/h4&gt;Subversion (también conocido simplemente como &lt;i&gt;svn&lt;/i&gt;) es probablemente el mejor sistema de control de versiones centralizado que existe. Sin entrar en la discusión Centralizado vs Distribuido (&lt;a href="http://en.wikipedia.org/wiki/Distributed_Version_Control_System" target="_blank"&gt;DVCS&lt;/a&gt;), lo que si está claro es que el control de versionado es un aspecto crítico de cualquier proyecto de software. &lt;br /&gt;&lt;br /&gt;En todo caso, si has llegado hasta aquí y no has usado nunca un software de control de versionado (&lt;a href="http://en.wikipedia.org/wiki/Revision_control" target="_blank"&gt;VCS&lt;/a&gt;) la recomendación es clara: úsalo. Debes usarlo. Aunque tu proyecto sea muy pequeño. Aunque sólo exista un desarrollador. Has de asumir que, de la misma forma y con la misma naturalidad que usas un IDE o un compilador, deberás usar un VCS. Es absolutamente esencial. Si ya tienes claro que hay que usar uno y has decidido usar uno centralizado (o simplemente sueles usar otro, como CVS, por ejemplo), la recomendación también es clara: usa svn. En la &lt;a href="http://es.wikipedia.org/wiki/Subversion" target="_blank"&gt;wikipedia&lt;/a&gt; puedes consultar por qué SourceForge.net, Apache o Google Code lo eligieron, así como la documentación y herramientas disponibles.&lt;br /&gt;&lt;br /&gt;Como decía, un software de control de versiones es necesario aunque el proyecto sea pequeño ya que te garantiza un seguimiento de cambios que te puede ahorrar muchas horas de trabajo. Si tienes clara la diferencia entre un editor de texto y un procesador de texto, entenderás enseguida la diferencia de usar backups de tu directorio de código y usar un VCS. No obstante, hay otro aspecto importante de los VCS que no suele ser tan comentado (quizá por obvio) y es su dimensión como herramienta colaborativa. Si de forma individual es extremadamente importante, para un equipo es absolutamente imprescindible. Un equipo no puede trabajar de forma "decente" sin Subversion. La idea de no usar un VCS o de usar uno bloqueante (tipo Visual SourceSafe) es una pesadilla para no dormir: "¡eh, cuidado!, no toquéis que voy a tocar yo" "¡Oh, mierda!, ya ha tocado alguien. ¡A ver ahora cómo lo arreglamos!"... o "¡fulanito, desbloquea el fichero que necesito añadir un método de la clase!" "¡No, espera que termine!"... Qué pesadilla. Me recuerda a aquellas herencias arcaicas de los programas COBOL de no pasarte de la columna 73 y poner los asteriscos en la columna nº 7... Bufff.&lt;br /&gt;&lt;br /&gt;Trabajar con svn en equipo es lo más parecido a hacerlo como si estuvieses tú sólo. Si las tareas están repartidas, los conflictos son muy poco frecuentes (para que existan, dos desarrolladores deben haber modificado la misma línea simultáneamente antes del último commit) y cuando los hay, se suelen solucionar en pocos segundos. Es muy gratificante comprobar cómo un equipo numeroso puede trabajar en una aplicacion Web (un tipo de proyecto con un alto grado de colisión y concentración de trabajo) de forma cómoda y fluida sin problemas.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://maven.apache.org/" target="_blank"&gt;Maven&lt;/a&gt;&lt;/h4&gt;Aunque llevamos oyendo hablar de Maven desde hace varios años (Maven tiene ya 8 años), la adopción hasta hace cuatro o cinco años ha sido puntual y conceptual. Es desde la aparición de Maven2 (con su nueva arquitectura revisada) cuando realmente empieza a incorporarse (aunque también de forma muy lenta) a los distintos proyectos open source y esto ha hecho que en la comunidad de desarrollo comencemos a interesarnos y a integrarlo en nuestros proyectos. A mucha gente le ocurre que, tras leer sobre Maven y Ant, entiende las diferencias entre ellas, pero no alcanza a concretar por qué es tan importante y para qué le sirve realmente (qué le aporta que no tenga ya). Para aclarar definitivamente este punto simplemente hay que preguntarse cómo realizamos el proceso de construcción (generación de empaquetados y otros artefactos) en nuestros proyectos, y esto nos dará la respuesta. Veamos las opciones:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Construimos con nuestra herramienta de desarrollo (Eclipse, Netbeans, etc...).&lt;/li&gt;&lt;li&gt;Construimos con un fichero (build.xml) ant que nos hemos hecho nosotros.&lt;/li&gt;&lt;/ol&gt;Si se trata de un pequeño proyecto de un sólo módulo (un war, un jar, etc...) y/o el ciclo de vida de la aplicación es muy reducido (es una pruebecilla nuestra, una pequeña aplicación de las que se hacen en casa en zapatillas, etc) no importa, claro. ¿Qué más da? La he hecho yo y podré volverla a construir con mi IDE favorito o con mi Ant dentro de un año cuando tenga que hacer un cambio. Incluso aunque cambie el IDE o cambie mi entorno, podré adaptarme a la situación sin más problemas, hacer las correcciones y volver a generar el empaquetado. &lt;br /&gt;&lt;br /&gt;Ahora bien, si nos situamos ahora un escenario profesional, el tema cambia mucho. A continuación expondré los problemas que nos encontramos con esas formas de construir aplicaciones. Seguramente ya te habrás encontrado con ellos, y si no, es porque el proyecto no era lo suficientemente grande o, simplemente, es una cuestión de tiempo que te los encuentres.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Homogeneidad.&lt;/b&gt; Cada desarrollador tiene sus costumbres y sus ubicaciones (paths) para sus proyectos, librerías, ubicación del JDK, etc. Es difícil e incómodo homologar a todo un equipo de desarrollo en una única estructura de ficheros. Aunque Sun hiciese su propuesta de &lt;a href="http://java.sun.com/blueprints/code/projectconventions.html" target="_blank"&gt;convenciones para proyectos&lt;/a&gt; (estructura y nombrado) hace mucho tiempo, casi ningún IDE lo respeta al 100%. Además, la heterogeneidad de los distintos Sistemas Operativos no hacen más que complicar la posibilidad de tener una estructura y ubicación homogénea para todo el mundo. Eso hace que los ficheros de proyecto (.nbproject, .project, etc) no puedan ser portados de unos desarrolladores a otros ni compartidos entre distintas máquinas. Esta estructura acaba teniendose que modificar manualmente en los distintos IDE's o en el fichero build.xml de ant. En el caso de los IDE's es particularmente grave, ya que la información de librerías, por ejemplo, descansa en la configuración local del IDE de cada desarrollador, que suele ser distinta para cada uno, con lo cual la construcción se torna algo tremendamente frágil y poco transparente.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Reproducibilidad.&lt;/b&gt; Necesitamos realizar tareas forma constante y estable nuestro proyecto: construccion, pruebas unitarias, informes, etc... Repetibles en el tiempo (hoy y dentro de un año) y en el espacio (en mi máquina de desarrollo, en integración, en preproducción...). Necesitamos fijar parámetros que no están implícitos en el proyecto en si y que acaban también fijados en los IDE's o en el script ant: versión de Java, versiones de librerías, destino de cada librería (sólo para compilar, sólo para desplegar con la aplicación, para compilar y desplegar...), ficheros de configuración, etc... Esto dificulta el mantenimiento y oculta información esencial del proyecto. Si el proyecto se sube a SVN y no lo volvemos a tocar en un año, a menudo nos encontramos con que las partes esenciales del proyecto han quedado ocultas en IDE's (o lo que es peor, se han perdido porque eran parte de la configuración local de un miembro del equipo) o permanecen en un script de ant poco amigable para modificar.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Gestión del cambio.&lt;/b&gt; Algo tan común como añadir una nueva librería al proyecto o realizar una actualización de una existente tiene demasiado impacto en el equipo hasta resultar ligeramente traumático: todos deben realizar las tareas de la descarga y localización de las librerías, la configuración de su IDE y de su proyecto y/o la adaptación de sus ficheros ant. Incluso un equipo de desarrollo con normas rígidas y paths homologados, además de sufrir esta falta de libertad, sigue estando expuesto a este tipo de problemas.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Gestión de dependencias (externas).&lt;/b&gt; Este es sin duda el aspecto más importante, por delicado, y por el impacto de sus consecuencias. Imagina el siguiente proyecto: un EAR compuesto por dos módulos WAR, tres módulos EJB y un par de módulos de de librerías comunes (jar). Uno de los desarrolladores añade al EAR una librería "A" que necesita uno de los módulos EJB y otro desarrollador añade otra librería "B" que necesita uno de los módulos JAR. Ambas librerías tienen sus propias dependencias: la librería "A" requiere de xxx-commons-2.3 y de asm-2.1, la librería "B" de yyy-commons (que a su vez depende de xxx-commons-1.5) y asm-3.0. Ya tenemos el problema servido. Como ya comenté en el artículo &lt;a href="http://balteus.blogspot.com/2009/07/banco-de-experiencias-iii-errores.html" target="_blank"&gt;"Errores comunes de despliegue JEE"&lt;/a&gt;, este tipo de problemas algunas veces sólo se presentan aleatoriamente, ya que el problema puede presentarse o no en función de la secuencia de carga del ClassLoader de la máquina de turno. Esto ocurre muchas más veces de lo que nos pueda parecer a simple vista, si bien en la mayoría de los casos los conflictos no plantean problemas porque muchas librerías mantienen una compatibilidad perfecta hacia atrás. En mi experiencia, es habitual que ocurra sin embargo con grandes frameworks tipo Hibernate, Spring, Struts, etc, con consecuencias muy desagradables. Sin Maven, la gestión de dependencias no la hace nadie, o lo que es lo mismo, se hace manualmente si el equipo de desarrollo es muy cuidadoso y está muy bien coordinado.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Gestión de dependencias (internas)&lt;/b&gt;. Otro aspecto de los proyectos medianos con varios módulos interdependientes entre si es que, además de tener que realizar gestión de dependencias de librerías de terceros tenemos que gestionar nuestras propias dependencias. Por ejemplo, para el caso anterior, si ambos WAR necesitan de los proyectos JAR de librerías comunes, todos los desarrolladores de los WAR deberán tener también que tener los proyectos (código fuente incluído) de dichos JAR, para estar debidamente actualizados... O bien buscar otra forma de distribución manual de empaquetados que también exigirá un esfuerzo adicional de coordinación.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Como puedes suponer a estas alturas, Maven es una solución perfecta a todos los problemas comentados anteriormente (salvo para el último punto, para el que se requiere un colaborador, pero eso lo comentaré en la segunda parte). Maven es y sirve para muchas cosas (compilación, paso de pruebas unitarias, control de calidad, etc) pero, fundamentalmente, es la mejor herramienta de construcción posible. Hasta ahora, para una construcción lo más homogénea y reproducible posible necesitábamos unas normas (o convenciones) y ant. Pero ant es un &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_language" target="_blank"&gt;lenguaje específico de dominio&lt;/a&gt; para la construcción de proyectos: te tienes que crear tus propios scripts basado en tus convenciones y el esfuerzo de mantenimiento es exponencial a la envergadura del proyecto. Maven ya te aporta ambas cosas: convenciones (sobre &lt;a href="http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html" target="_blank"&gt;disposición de directorios de proyecto&lt;/a&gt;, por ejemplo) y todo el trabajo listo para usar sin tener que configurar nada. Con Maven puedes realmente bajarte unos fuentes y ejecutar un "mvn build" sobre el directorio que contiene el &lt;i&gt;"pom.xml"&lt;/i&gt;. Y tener en poco tiempo todos los empaquetados, un informe de construcción, pruebas unitarias realizadas, etc, etc.. con &lt;i&gt;configuración cero&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;No obstante, el punto fuerte (e incluso espectacular) de Maven es la gestión de dependencias: sólo por la gestión de dependencias transitivas que realiza de forma automática, ya merece la pena con creces. En este tema me recuerda a los repositorios de Ubuntu. Cuando quieres una librería, añades la dependencia y la versión que quieres de las disponibles y él se encargará de aprovisionarse de todas las dependencias transitivas adicionales. &lt;br /&gt;&lt;br /&gt;Incluso aún respetando las convenciones de Maven (te las puedes saltar si especificas en el pom.xml cuáles son tus directorios) Maven te ofrece toda la libertad posible: permite que un equipo trabaje con IDE's heterogéneos: cada desarrollador con su IDE favorito. Lo único que debes subir a SVN son los fuentes y el pom.xml. Podrás construir el proyecto de forma repetible, independiente del IDE, ejecutar las pruebas unitarias y olvidarte de problemas de librerías.&lt;br /&gt;&lt;br /&gt;Obviamente no te vas a olvidar de tu IDE o de ant. Toda esta maravilla de Maven tiene un precio: el rendimiento. Un build con Maven te lleva más segundos de los que estás dispuesto a considerar como aceptables para tu trabajo de desarrollo habitual. No es aceptable desarrollar realizando builds con Maven. Por lo menos para mi. Por eso yo continúo realizando los ciclos de iteración compilación-despliegue-pruebas con mi IDE. Maven lo dejo para realizar las construcciones, para subir a svn proyectos autónomos y autogenerables y para poder realizar las integraciones y las puestas a preproducción de una forma segura y repetible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En esta primera parte he expuesto 2 de 3 de las herramientas más esenciales para el desarrollo en equipo de proyectos Java (especialmente JEE). En el siguiente artículo cerraré el círculo con la herramienta que falta: un gestor de repositorios de Maven. Y explicaré cómo, con tan sólo esas tres herramientas, tenemos un entorno de trabajo potente y seguro para equipos de tamaño mediano sin rígidas normativas ni procedimiento burocráticos.&lt;br /&gt;&lt;br /&gt;Referencias:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.tecsisa.com/index.igw?item=1651&amp;amp;lang=es_ES&amp;amp;site=1"&gt;Buenas prácticas de gestión de versiones con Subversion&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://subversion.apache.org/"&gt;Subversion ya forma parte de Apache&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sonatype.com/products/maven/documentation/book-defguide"&gt;Libros gratuitos sobre Maven&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://es.wikipedia.org/wiki/Maven"&gt;Maven en la wikipedia&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;i&gt;(continuación: &lt;a href="http://balteus.blogspot.com/2010/02/desarrollo-en-equipo-con-svn-maven-y_22.html"&gt;Parte II&lt;/a&gt;)&lt;/i&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=e939d492-7ad0-8438-9cf8-46cb09311645" /&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/1763183641342103044-8317922876180812418?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/8317922876180812418/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2010/02/desarrollo-en-equipo-con-svn-maven-y.html#comment-form' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8317922876180812418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8317922876180812418'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2010/02/desarrollo-en-equipo-con-svn-maven-y.html' title='Desarrollo en equipo con SVN, Maven y Nexus (parte I)'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2080459078563850252</id><published>2010-01-12T00:51:00.001+01:00</published><updated>2010-01-12T00:59:22.683+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='herramientas'/><category scheme='http://www.blogger.com/atom/ns#' term='alternativas'/><title type='text'>Alternativas gratuitas a MS Project</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;blockquote&gt;“Como nada es más hermoso que conocer la verdad, nada es más vergonzoso que aprobar la mentira y tomarla por verdad”. -Cicerón.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://es.wikipedia.org/wiki/Microsoft_Project" target="_blank"&gt;MS Project&lt;/a&gt; es un software de administración de proyectos para asistir a administradores de proyectos en el desarrollo de planes, asignación de recursos a tareas, dar seguimiento al progreso, administrar presupuesto y analizar cargas de trabajo, aunque la verdad es que el uso mayoritario se centra (y de forma generalizada también acaba) en una planificación/cronograma acompañada de un diagrama de Gantt que nunca cabe en el documento de "Plan de Proyecto" y acaba tan reducido que es difícil de apreciar.&lt;br /&gt;&lt;br /&gt;El uso de este software y sus artefactos (especialmente los diagramas Gantt) materializan la ficción extendida de las métricas del software a la que me referí en un &lt;a href="http://balteus.blogspot.com/2009/10/la-falacia-de-la-ingenieria-del.html" target="_blank"&gt;artículo anterior&lt;/a&gt;. Y es que el mundo empresarial, inmerso en sus propios vicios adquiridos autojustificativos, requiere de éste tipo de "justificantes" falsificados, de la misma manera que se recoge un justificante por visita médica: es probablemente inútil, de redacción incomprensible y caligrafía críptica, puede que hasta falso o adulterado... pero se ha hecho necesario para que continúe la cadena de responsabilidad indirecta.&lt;br /&gt;&lt;br /&gt;El software en realidad es bastante útil, el problema es que, como explicaba en el artículo comentado, los artefactos generados con el mismo se presentan como una verdad inmutable, como un producto exacto y preciso fruto de la ciencia y la ingeniería cuando en realidad, en el mejor de los casos, son producto de unas buenas prácticas, una experiencia dilatada, un buen equipo, unas acertadas predicciones y una ración de buena suerte. ¿Por qué? Pues sencillamente porque estamos &lt;i&gt;estimando&lt;/i&gt;, estamos realizando diversas predicciones del tiempo que tardan varias personas cualificadas en realizar tareas moderadamente complejas y débilmente definidas, teniendo en cuenta una enorme sucesión de suposiciones relacionadas e interdependientes entre sí, y entre esas suposiciones, unos requisitos de proyecto inmutables o congelados en el tiempo: es decir, una conjetura como la copa de un pino, aunque más o menos razonable y convenientemente adornada.&lt;br /&gt;&lt;br /&gt;No obstante lo anterior, el software tiene su utilidad para ayudarnos a realizar y gestionar esas conjeturas y tener pronósticos lo más acertados posibles: podemos desglosar las tareas, conocer sus relaciones y dependencias, realizar asignaciones aproximadas, conocer el camino crítico, detectar riesgos, etc... Si esos cronogramas fuesen algo &lt;i&gt;vivo&lt;/i&gt;, como lo son los requisitos y el resto de los factores durante el ciclo de vida del proyecto, y se actualizasen y ajustasen periódicamente, podríamos tener una buena herramienta para gestionar nuestras hipót... perdón, quiero decir, tareas.&lt;br /&gt;&lt;br /&gt;Dicho esto, vamos al tema que nos ocupa: en muchos casos, el coste de adquisición de este software es desproporcionado con una utilización parcial (digamos al 30% como mucho)  y eventual (¿menos de 2 o 3 veces al año?), así que, ¿hay alternativas gratuitas?. Vamos a ello.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://openproj.org/" target="_blank"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://openproj.org/" target="_blank"&gt;OpenProj&lt;/a&gt;&lt;/h4&gt;&lt;small&gt;&lt;img height="206" src="http://lh5.ggpht.com/_U3R9awMQHdw/S0jJ5ecPirI/AAAAAAAAAx4/YLf877APKxE/%5BUNSET%5D.jpg?imgmax=800" style="float: right; margin-bottom: 10px; margin-left: 10px; margin-top: 10px; max-width: 800px;" width="276" /&gt;&lt;/small&gt;Probablemente el más parecido funcionalmente a MS Project y una de sus mejores alternativas. Está disponible para Linux, Unix, Mac y Windows (hecho en Java). Es gratuito, multilenguaje y distribuido bajo &lt;a href="http://projity.com/license/index.html" target="_blank"&gt;licencia CPAL&lt;/a&gt;, ha sido elegido para su inclusión en la suite Star Office para Europa.&lt;br /&gt;&lt;br /&gt;Como herramienta de trabajo es perfecto. Sólo un inconveniente con respecto a la generación de artefactos: la impresión/exportación del diagrama Gantt y otros informes es sólo personalizable en la versión que se distribuye como Software as a Service (&lt;a href="http://es.wikipedia.org/wiki/Software_como_servicio" target="_blank"&gt;SaaS&lt;/a&gt;): &lt;i&gt;&lt;a href="http://openproj.org/pod" target="_blank"&gt;Projects On Demand&lt;/a&gt;&lt;/i&gt;. La buena noticia es que el coste de esta versión es apenas de unos unos pocos 15€ al mes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ganttproject.biz/" target="_blank"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://www.ganttproject.biz/" target="_blank"&gt;Ganntt Project&lt;/a&gt;&lt;/h4&gt;&lt;img height="197" src="http://lh4.ggpht.com/_U3R9awMQHdw/S0kmhZCRDmI/AAAAAAAAAyA/OKDwZOgNYUs/%5BUNSET%5D.png?imgmax=800" style="float: left; margin-bottom: 10px; margin-right: 10px; margin-top: 10px; max-width: 800px;" width="250" /&gt;Esta herramienta cumple con el famoso &lt;a href="http://es.wikipedia.org/wiki/Principio_de_Pareto" target="_blank"&gt;Principio de Pareto&lt;/a&gt; (o "&lt;i&gt;regla del 80-20&lt;/i&gt;") en cuanto a la funcionalidad esperada: la mayoría de los usuarios de MS Project (yo diría que mucho más del 80%) apenas utiliza un 20% de su funcionalidad. Esta funcionalidad mínima es la que nos ofrece este software.&lt;br /&gt;&lt;br /&gt;Sus capacidades de importación/exportación, así como la generación de artefactos (diagramas e informes) cubren los mínimos necesarios como para que esta herramienta sea suficiente para realizar cronogramas de proyectos pequeños y medianos.&lt;br /&gt;&lt;br /&gt;Es totalmente gratuito, multilenguaje, y distribuido bajo licencia &lt;a href="http://www.opensource.org/licenses/gpl-2.0.php" target="_blank"&gt;GPL 2.0&lt;/a&gt;. Como también está desarrollado en Java, está disponible para Linux, Unix, Mac y Windows.&lt;br /&gt;&lt;br /&gt;He ido probando cada actualización que hacen al producto y desgraciadamente siempre me he encontrado con ciertas carencias y deficiencias típicas de un producto aún falto de madurez. Ligeramente "tosco" y sin apenas &lt;i&gt;hot-keys&lt;/i&gt;, tenía deficiencias editando tareas en proyectos no demasiado grandes, pero con muchas relaciones y tareas jerarquizadas (a la hora de mover tareas dependientes en el tiempo, gestionaba mal las dependencias "fuertes" o "rígidas" dejándolas sin desplazar). Tampoco nunca encontré una forma de realizar una re-distribución de recursos en casos de reasignación. &lt;br /&gt;&lt;br /&gt;No obstante, seguiré probando hasta poder disfrutar su madurez definitiva.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://www.openworkbench.org/" target="_blank"&gt;OpenWorkbench&lt;img height="215" src="http://lh5.ggpht.com/_U3R9awMQHdw/S0uo7p4zJ_I/AAAAAAAAAyE/Yr_jP5qB9yM/%5BUNSET%5D.gif?imgmax=800" style="float: right; margin-bottom: 10px; margin-left: 10px; margin-top: 10px; max-width: 800px;" width="268" /&gt;&lt;/a&gt;&lt;/h4&gt;Probé la versión 1.1.6 cuando salió, allá por 2006. Realmente quedé impresionado porque era realmente una excelente alternativa a MS Proyect. Especialmente me gustó la facilidad para presentar distintas vistas a modo de hojas de cálculo que permitían obtener costes y realizar cálculos en base a estimaciones con bastante facilidad. &lt;br /&gt;&lt;br /&gt;El producto es gratuito y open source (aunque no he encontrado el tipo de licencia exacto) no obstante, no es un proyecto muy activo: no parece haber evolucionado en estos últimos 4 años. Lamentablemente sólo está disponible para para plataformas Windows y yo no uso ese tipo de plataformas desde hace varios años, así que no lo volví a probar desde aquella vez. No obstante, si usas Windows, te animo a probarlo (y sobre todo, a cambiar a Kubuntu, claro ;-).&lt;br /&gt;&lt;br /&gt;Nota: es bastante posible que funcione con Wine, pero me seducen más otras opciones... ;-)&lt;br /&gt;&lt;h4&gt;&lt;a href="http://www.koffice.org/kplato/" target="_blank"&gt;KPlato&lt;/a&gt;&lt;/h4&gt;&lt;h4&gt;&lt;a href="http://www.koffice.org/kplato/" target="_blank"&gt;&lt;img height="193" src="http://lh4.ggpht.com/_U3R9awMQHdw/S0uvysLetzI/AAAAAAAAAyI/ABNtfueARfI/%5BUNSET%5D.png?imgmax=800" style="float: left; margin-bottom: 10px; margin-right: 10px; margin-top: 10px; max-width: 800px;" width="252" /&gt;&lt;/a&gt;&lt;/h4&gt;KPlato es la aplicación para gestión de proyectos de la suite &lt;a href="http://es.wikipedia.org/wiki/KOffice"&gt;KOffice&lt;/a&gt;. Es el más ágil, ligero y fluido de todos los comentados hasta ahora, y tiene el aspecto elegante y sencillo propio de la suite de Office para KDE.&lt;br /&gt;&lt;br /&gt;Al igual que comenté &lt;a href="http://balteus.blogspot.com/2009/08/alternativas-gratuitas-de-codigo.html" target="_blank"&gt;en otro post sobre alternativas a MS Visio&lt;/a&gt;, se nota que si bien aún no ha alcanzado un nivel de madurez equivalente al OpenProj (en la redacción de este artículo he probado la versión 0.6.3), es equivalente o superior a &lt;i&gt;Ganntt Project&lt;/i&gt; en cuanto a funcionalidad y muy superior a todos los demás en cuanto a usabilidad y agilidad. Al igual que con el resto de paquetes de la Suite, KPlato tiene un futuro muy prometedor ya que el &lt;i&gt;roadmap&lt;/i&gt; evolutivo del producto nos depara probablemente la mejor alternativa a MS Project completamente gratuita. &lt;br /&gt;Con licencia GPL, y originariamente para Linux, está disponible para &lt;a href="http://www.koffice.org/download/" target="_blank"&gt;muchas plataformas&lt;/a&gt; actualmente, incluído Windows.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como siempre, recomiendo probarlos todos (lo que vale para mi, no necesariamente tiene que valer para ti ;-), aunque yo me estoy apañando perfectamente con los tres. Incluso he llegado a importar un .mpp de MS Project, modificarlo y volverlo a exportar para generar un mini-site HTML con Ganntt Project (del cual podía extraer perfectamente las imágenes de Cronograma Gantt que necesitaba).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=1d837829-92e3-8692-bd93-6ab07c331650" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2080459078563850252?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2080459078563850252/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/07/alternativas-gratuitas-ms-project.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2080459078563850252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2080459078563850252'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/07/alternativas-gratuitas-ms-project.html' title='Alternativas gratuitas a MS Project'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_U3R9awMQHdw/S0jJ5ecPirI/AAAAAAAAAx4/YLf877APKxE/s72-c/%5BUNSET%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-8841474986965787069</id><published>2009-12-23T07:07:00.004+01:00</published><updated>2009-12-23T19:57:51.901+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>La UE aprueba finalmente la adquisición de Sun</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Larry Ellison &lt;a href="http://www.nypost.com/p/news/business/oracle_sun_day_8JM3CjHrKVL20vtVAMmn4K%20"&gt;ha conseguido salvar el último obstáculo&lt;/a&gt; para hacerse con la totalidad de Sun sin renunciar a MySQL, que era el punto conflictivo tras las objeciones de la UE a la adquisición por la posible vulneración de la libre competencia en Europa en el sector de las bases de datos.&lt;br /&gt;&lt;br /&gt;La Comisión Europea ha obligado a Oracle a realizar &lt;a href="http://www.marketwire.com/press-release/Oracle-Corporation-NASDAQ-ORCL-1090000.html"&gt;10 concesiones&lt;/a&gt; y seguir invirtiendo en MySQL durante un tiempo. Este tema relativo a MySQL, aunque muy importante, no ha sido nunca mi mayor preocupación en torno a este tema de la adquisición (como comenté &lt;a href="http://balteus.blogspot.com/2009/04/oracle-el-nuevo-gigante-rojo.html"&gt;en un artículo anterior&lt;/a&gt;) sino, obviamente, aquellos activos de Sun (ahora de Oracle) que me afectan directamente: Java y Glassfish (y en ese orden).&lt;br /&gt;&lt;br /&gt;Entiendo que Oracle tiene mucho interés en mantener la tecnología, ya que lleva años basando sus productos en ella. Otro tema serán cómo se afrontará el Java Community Process y los distintos comités por un lado y la gestión de un Servidor de Aplicaciones de código abierto y comercial compitiendo directamente con sus dos actuales: no creo que se vaya a quedar con tres productos equivalentes y en el mismo segmento de mercado.&lt;br /&gt;&lt;br /&gt;Y todo esto, de forma contemporánea con la aprobación de la &lt;a href="http://jcp.org/en/jsr/detail?id=316"&gt;JSR 316&lt;/a&gt;, o más conocida como la especificación &lt;i&gt;JEE 6&lt;/i&gt;, tras tres largos años de trabajo. Una de las especificaciones más esperadas y con grandes avances en muchos campos que sin duda nos facilitarán las cosas como por ejemplo un tipo específico de EJB para realizar singleton o las invocaciones asíncronas a EJB's.&lt;br /&gt;&lt;br /&gt;La implementación de referencia (Glassfish v3) está disponible desde el 10 de Diciembre.&lt;br /&gt;&lt;br /&gt;El próximo 2010 será el primer año de Java y Glassfish bajo el control de Oracle, con todas sus interesantes novedades (especialmente en lo que a JEE se refiere). Veremos cómo evoluciona la adopción de estas nuevas especificaciones.&lt;br /&gt;&lt;br /&gt;Feliz año 2010. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si queréis ir echando un vistazo a las novedades de JEE 6:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;General&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview.html"&gt;http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=JavaEE6Overview"&gt;http://www.theserverside.com/tt/articles/article.tss?l=JavaEE6Overview&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;EJB 3.1&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.dosideas.com/java/528-ejb-31-un-paso-importante-hacia-la-madurez.html"&gt;http://www.dosideas.com/java/528-ejb-31-un-paso-importante-hacia-la-madurez.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB3-1"&gt;New Features in EJB 3.1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31"&gt;New Features in EJB 3.1 - Part 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesEJB31-3"&gt;New Features in EJB 3.1 - Part 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB3-Part4"&gt;New Features in EJB 3.1 – Part 4&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=NewFeaturesinEJB31-Part5"&gt;New Features in EJB 3.1 – Part 5&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;b&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=954d46ef-afe9-8f1a-b9b3-c925f8514801" /&gt;Servlet 3.0&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.dzone.com/articles/an-overview-servlet-30"&gt;An Overview of Servlet 3.0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&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/1763183641342103044-8841474986965787069?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/8841474986965787069/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/12/la-ue-aprueba-finalmente-la-adquisicion.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8841474986965787069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8841474986965787069'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/12/la-ue-aprueba-finalmente-la-adquisicion.html' title='La UE aprueba finalmente la adquisición de Sun'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2592619725856770499</id><published>2009-12-03T19:15:00.000+01:00</published><updated>2009-12-03T19:15:26.743+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>Manifiesto en defensa de los derechos fundamentales en internet</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div class="main"&gt;&lt;div class="snap_preview"&gt;&lt;br /&gt;Ante la inclusión en el Anteproyecto de Ley de Economía sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresión, información y el derecho de acceso a la cultura a través de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de internet manifestamos nuestra firme oposición al proyecto, y declaramos que…&lt;br /&gt;&lt;br /&gt;1.- &lt;b&gt;Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos&lt;/b&gt;, como el derecho a la privacidad, a la seguridad, a la presunción de inocencia, a la tutela judicial efectiva y a la libertad de expresión.&lt;br /&gt;&lt;br /&gt;2.- &lt;b&gt;La suspensión de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial&lt;/b&gt;. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el artículo 20.5 de la Constitución, pone en manos de un órgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos españoles el acceso a cualquier página web.&lt;br /&gt;&lt;br /&gt;3.- &lt;b&gt;La nueva legislación creará inseguridad jurídica en todo el sector tecnológico español&lt;/b&gt;, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra economía, entorpeciendo la creación de empresas, introduciendo trabas a la libre competencia y ralentizando su proyección internacional.&lt;br /&gt;&lt;br /&gt;4.- &lt;b&gt;La nueva legislación propuesta amenaza a los nuevos creadores y entorpece la creación cultural&lt;/b&gt;. Con Internet y los sucesivos avances tecnológicos se ha democratizado extraordinariamente la creación y emisión de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes.&lt;br /&gt;&lt;br /&gt;5.- &lt;b&gt;Los autores&lt;/b&gt;, como todos los trabajadores,&lt;b&gt; tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades&lt;/b&gt; asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deberían buscar otro modelo.&lt;br /&gt;&lt;br /&gt;6.- Consideramos que &lt;b&gt;las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, creíbles y asequibles y que se adecuen a los nuevos usos sociales&lt;/b&gt;, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir.&lt;br /&gt;&lt;br /&gt;7.- &lt;b&gt;Internet debe funcionar de forma libre y sin interferencias políticas&lt;/b&gt; auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre.&lt;br /&gt;&lt;br /&gt;8.- &lt;b&gt;Exigimos que el Gobierno garantice por ley la neutralidad de la Red en España&lt;/b&gt;, ante cualquier presión que pueda producirse, como marco para el desarrollo de una economía sostenible y realista de cara al futuro.&lt;br /&gt;&lt;br /&gt;9.- &lt;b&gt;Proponemos una verdadera reforma del derecho de propiedad intelectual&lt;/b&gt; orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio público y limitar los abusos de las entidades gestoras.&lt;br /&gt;&lt;br /&gt;10.- &lt;b&gt;En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate público&lt;/b&gt; y habiendo consultado previamente a todas las partes implicadas. &lt;b&gt;No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no orgánica y que versa sobre otra materia&lt;/b&gt;.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=d176ca0b-5b8c-8e2d-b73f-bc2cd42878b1" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2592619725856770499?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2592619725856770499/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/12/manifiesto-en-defensa-de-los-derechos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2592619725856770499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2592619725856770499'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/12/manifiesto-en-defensa-de-los-derechos.html' title='Manifiesto en defensa de los derechos fundamentales en internet'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-999098983812749627</id><published>2009-11-22T19:19:00.007+01:00</published><updated>2009-11-27T01:06:35.316+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><title type='text'>Magnitudes astronómicas</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;blockquote&gt;"El hombre es la medida de todas las cosas" -Protágoras de Abdera, s V a.C.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;El hombre siempre ha tenido la necesidad de medir el mundo que le rodea: para explorarlo y comprenderlo, para relacionarse con los demás e intercambiar, para prevenir sucesos, pronosticar su devenir y desarrollarse. Como patrones, el ser humano ha utilizado todo tipo de elementos conocidos a su alrededor: su propio cuerpo, elementos de su entorno, fabricados &lt;i&gt;ad-hoc&lt;/i&gt; para permitir su duplicación, etc. &lt;br /&gt;&lt;br /&gt;Hace casi 2.300 años, Erastótenes determinó el tamaño de la tierra en &lt;i&gt;"estadios"&lt;/i&gt; que, como su nombre indica, era una unidad de longitud equivalente a la longitud del estadio de Olimpia [1]. Ya no usamos científicamente unidades antropométricas, pero seguimos necesitando unidades de medida relacionadas con el mundo habitual que vivimos que nos ayuden a comprenderlo y materializarlo comparando con elementos conocidos. Todos podemos representar en nuestra mente o imaginar 1 Kilómetro, porque lo comparamos con distancias conocidas. Podemos también imaginar cientos e incluso miles de kilómetros porque conocemos mapas y el tiempo que se tarda en recorrer esas distancias en diferentes medios de transporte... Pero en lo que respecta a las distancias, nos quedamos ahí. Cifras como millones de kilómetros o años luz escapan de nuestra imaginación porque somos incapaces de compararlas con nada que conozcamos.&lt;br /&gt;&lt;br /&gt;Recientemente ví el vídeo a continuación y quedé impresionado por los descomunales tamaños de los distintos cuerpos celestes y cómo unos cuerpos gigantescos se hacen ínfimos con respecto a otros.&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;div class="youtube-video"&gt;&lt;object height="344" width="425"&gt;&lt;param name='movie' value='http://www.youtube.com/v/jyhT2v5DMwU&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;'&gt;&lt;/param&gt;&lt;param name='allowFullScreen' value='true'&gt;&lt;/param&gt;&lt;param name='allowscriptaccess' value='always'&gt;&lt;/param&gt;&lt;embed width='425' height='344' src='http://www.youtube.com/v/jyhT2v5DMwU&amp;amp;hl=es_ES&amp;amp;fs=1&amp;amp;' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true'&gt; &lt;/embed&gt;    &lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;Tras ver esto, me puse manos a la obra a intentar "imaginar" esos tamaños comparándolos con elementos conocidos, así que convertí el universo en una diezmilmillonésima de lo que es ahora. Lo que viene a continuación es un nano universo con objetos conocidos (disculpad las imprecisiones y redondeos, pero he primado la visualización de objetos en nuestra imaginación a la exactitud).&lt;br /&gt;&lt;br /&gt;En este mundo, la tierra es como una canica grande (de 1,3 cm). La luna, del tamaño de una lenteja pequeña girando a su alrededor a un par de cuartas (casi 40 cm) de distancia. Una &lt;a href="http://es.wikipedia.org/wiki/Unidad_astron%C3%B3mica" target="_blank"&gt;unidad astronómica (UA)&lt;/a&gt; es, en este mundo, la longitud de tres piscinas olímpicas, así que tenemos a nuestra canica girando alrededor de un sol del tamaño de un &lt;i&gt;Smart&lt;/i&gt; (visto por detrás, ya que es más largo que ancho) a unos 150m de distancia. Girando también alrededor de esta esfera de metro y medio hay un guisante llamado Marte a 230m. de distancia y un balón de balonmano llamado Júpiter a unos 780m. Es decir, que si nuestro sol estuviese en la estación de Atocha de Madrid, Júpiter estaría girando a su alrededor al final del Paseo del Prado, por la fuente de Neptuno.&lt;br /&gt;&lt;br /&gt;Otras estrellas son gigantescas incluso en este mundo enano. &lt;a href="http://es.wikipedia.org/wiki/Betelgeuse" target="_blank"&gt;Betelgueuse&lt;/a&gt;, la supergigante roja de la constelación de Orion es del tamaño de un monte (480m.). Imaginaos una canica al lado de un monte. Pues eso no es nada, &lt;a href="http://es.wikipedia.org/wiki/VV_Cephei" target="_blank"&gt;VV Cephei&lt;/a&gt; y &lt;a href="http://es.wikipedia.org/wiki/VY_Canis_Majoris" target="_blank"&gt;VY Canis Majoris&lt;/a&gt; son esferas inimaginables de 1,5km y 2Km de diámetro respectivamente. Para intentar imaginar esas enormes hipergigantes rojas, deberíamos cambiar de escala, imaginando ahora que nuestro sol es del tamaño de un balón de balonmano y nuestra tierra de un grano de arena: en este caso, VV Cephei es como el Palacio de Comunicaciones  de Madrid (en la plaza de Cibeles) y VY Canis Majoris es como el estadio Santiago Bernabéu. Impresionante, ¿no? Al final, como Erastótenes, he acabado también midiendo en estadios.&lt;br /&gt;&lt;br /&gt;En fin, mientas pensaba en todo esto y hacía mis cálculos, me entero de la publicación del libro "La Galaxia en un campo de fútbol" [2]. Libro que, por supuesto, ya tengo nuevecito y reluciente a mi lado (muchísimas gracias, Eva, por el regalo). El libro trata de ésto mismo, proponiendo un método y nuevas unidades de medida para comprender el Universo. Os contaré cuando acabe sus páginas en una nueva entrada del blog... pero ya os avanzo que tiene una pinta estupenda. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1]: Afortunadamente, Cristóbal Colón justificó la viabilidad de su viaje a las Indias por occidente con los datos erróneos de Ptolomeo. Posiblemente, con las mediciones de Erastótenes, el viaje no se habría realizado en aquella época. Seguramente éste sea el error más influyente en la historia de la humanidad y una de las pruebas de que los errores también nos conducen a fantásticos descubrimientos.&lt;br /&gt;[2]: "La galaxia en un campo de fútbol", de Juan Fernández Macarrón, Edita: &lt;i&gt;Equipo Sirius&lt;/i&gt; (2009)&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=ec380f64-22e3-86ea-89cd-81c60b18776f" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-999098983812749627?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/999098983812749627/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/11/magnitudes-astronomicas.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/999098983812749627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/999098983812749627'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/11/magnitudes-astronomicas.html' title='Magnitudes astronómicas'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-1289815387770893174</id><published>2009-10-01T01:34:00.006+02:00</published><updated>2011-09-23T11:55:08.073+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><title type='text'>La falacia de la Ingeniería del Software</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gg2ZaiNJuO0/TnxXccKK2nI/AAAAAAAABEg/W6fIc-Sx0k4/s1600/cohdra_100_400.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://2.bp.blogspot.com/-gg2ZaiNJuO0/TnxXccKK2nI/AAAAAAAABEg/W6fIc-Sx0k4/s200/cohdra_100_400.jpeg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;A partir de los años 70 comenzó a desarrollarse lo que, según mi opinión, es la falacia de la Ingeniería del Software y sus métricas para la cuantificación y planificación de proyectos de software. Desde las simplistas &lt;a href="http://en.wikipedia.org/wiki/Source_lines_of_code" target="_blank"&gt;LOC&lt;/a&gt; (Lines Of Code), hasta la &lt;a href="http://es.wikipedia.org/wiki/Complejidad_ciclom%C3%A1tica" target="_blank"&gt;Complejidad Ciclomática&lt;/a&gt;, las métricas de producto han ido cambiando desde enfoques tan extremadamente matemáticos como inútiles, hasta enfoques de pesadas y burocráticas metodologías y análisis de negocio para los cuales hay que documentar durante cuatro meses para un proyecto de dos.&lt;br /&gt;&lt;br /&gt;Es ahora, en el reciente 40 cumpleaños de la denominación de "Ingeniería del Software" como disciplina, cuando por primera vez uno de los padres del &lt;a href="http://en.wikipedia.org/wiki/Structured_analysis"&gt;Análisis Estructurado&lt;/a&gt;, Tom DeMarco, en un &lt;a href="http://go2.wordpress.com/?id=725X1342&amp;amp;site=gallir.wordpress.com&amp;amp;url=http%3A%2F%2Fwww2.computer.org%2Fcms%2FComputer.org%2FComputingNow%2Fhomepage%2F2009%2F0709%2FrW_SO_Viewpoints.pdf"&gt;artículo&lt;/a&gt; autocrítico realmente sorprendente (tratándose de él) reconoce con honestidad que la &lt;i&gt;Ingeniería del Software&lt;/i&gt; es una idea obsoleta y que el Desarrollo de software es algo experimental, al menos en su concepción.&lt;br /&gt;&lt;br /&gt;Durante este tiempo, la mayor parte del &lt;i&gt;stablishment&lt;/i&gt; académico ha insistido de forma machacona a los sufridos universitarios de informática con la última metodología que aprendió (pero que jamás aplicó en ningún proyecto empresarial) el profesor de turno cuando tomó su plaza titular y en la que se anclaría de por vida, mientras se sucedían las promociones de informáticos que quedaban frustrados en su primer proyecto laboral por dos razones: la primera, porque la metodología en uso ya estaba "desfasada"; la segunda porque obviamente, resultaba impracticable para la mayor parte de los proyectos del mundo "real".&lt;br /&gt;&lt;br /&gt;En efecto, es una trampa porque se trata de una falacia que persiste una y otra vez en un mundo endógeno. Los creadores de las métricas y de las metodologías vienen de monstruosos proyectos militares o gubernamentales, o del mundo académico. Mientras en el mundo académico éstas se toman como una "ciencia", como una verdad absoluta y dogmática, aunque jamás la hayan aplicado o la hayan visto aplicar, los casos de éxito en los grandes proyectos son nulos... ni que decir tiene del 99% restante de proyectos medianos para los que no fue ni imaginado. Y así, se suceden nuevas metodologías cada cinco años, una tras otra, que se van "enseñando", en la confortable ilusión de que algún día servirá a alguien, o de que esta sí es la "bala de plata" definitiva, aunque su uso/éxito real sea casi anecdótico o nulo.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;La falsa ilusión del &lt;i&gt;control&lt;/i&gt;&lt;/h4&gt;La ingeniería del software es una falacia porque es una aserción que podría estar compuesta por verdades parciales, pero que es falsa en su conjunto. Durante mucho tiempo se ha transmitido la idea del desarrollo del software como algo medible con exactitud, con el rigor científico aplicable a elementos físicos cuyos precisos procesos de fabricación son conocidos y estandarizados desde hace años... como comentó Dijkstra en un interesante ensayo: "...&lt;i&gt;que los programas son simplemente dispositivos como cualquier otro, la única diferencia que se admite es que su fabricación pueden requerir un nuevo tipo de expertos, a saber: programadores"&lt;/i&gt; ([1]).&lt;br /&gt;&lt;br /&gt;Todo esto para lograr prácticas consistentes y predictibilidad. Y en parte, en efecto, es así. Las sucesivas metodologías han ido aportando buenas prácticas que han servido, en los proyectos en los que es posible, un análisis más exhaustivo y pormenorizado de los requisitos, trazabilidad, control de cambios, control de calidad, etc... El problema es que han transmitido y calado en la conciencia colectiva empresarial una falsa ilusión de control del proceso. Esta ilusión también ha calado en el mundo académico, (demasiado separado, por cierto, del mundo profesional) donde parece que preocupa más la lírica teórica que la formación de profesionales prosaicos, que es lo que el mundo necesita, en definitiva. Pero también ha calado incluso en los mismos profesionales, que pinchan en hueso constantemente intentando aplicar aquellas prácticas y métricas aprendidas que teóricamente les alejan y diferencian de la "artesanía" de los sistemas de información de antaño, porque han recibido una formación en la que les han asegurado que "esto" nuevo, es "ciencia".&lt;br /&gt;&lt;br /&gt;Pero la verdad es que la mayor parte de las decenas metodologías y métricas de estos últimos 40 años no son más que un conjunto de buenas prácticas adornado con estadísticas desplegadas con un imponente soporte matemático. Decenas de metodologías con una relación de casos de éxito tan exigua, que en cualquier otra disciplina científica no serían consideradas. Y hoy día, ninguna de ellas se aplica con éxito de forma generalizada ni se ha convertido en estándar, ni garantiza el éxito de la "fabricación"... y aun así se sigue llamando "ingeniería". Imaginen, por ejemplo, metodologías quirúrgicas con anecdóticos casos de éxito... ¿Se enseñarían en las facultades de medicina como "metodologías a aplicar"?. &lt;br /&gt;&lt;br /&gt;El objetivo de las metodologías ha sido siempre la de aumentar la productividad y la calidad del desarrollo del software permitiendo que éstos sean sistemáticos, predecibles y repetibles. Hoy sabemos que las métricas y el control de calidad cuestan mucho tiempo y dinero... ya hace más de 20 años que sabemos que "el testing de programas puede convincentemente demostrar la presencia de errores, pero nunca puede demostrar su ausencia" ([1]). Aun así se sigue manejando el término control de calidad como si &lt;i&gt;realmente&lt;/i&gt; pudiéramos controlar &lt;i&gt;de verdad&lt;/i&gt; la calidad del software. Se habla de las metodologías como si realmente hubiesen conseguido el objetivo para las que fueron creadas. Ésta es la falacia.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Los &lt;i&gt;ladrillos &lt;/i&gt;de código&lt;/h4&gt;Yourdon/DeMacro, Merisse, SSADM, &lt;a href="http://es.wikipedia.org/wiki/M%C3%89TRICA"&gt;Métrica&lt;/a&gt; (nuestro particular &lt;i&gt;"me too"&lt;/i&gt; a modo de refrito de modelo de procesos y formas de llevarlo a cabo: dos por uno, oiga)... todas las metodologías a las que me he acercado están orientadas correctamente al proceso y a la funcionalidad, pero ignorando o trivializando unos de los aspectos fundamentales, que es tratado a menudo como un &lt;i&gt;"recurso"&lt;/i&gt; de un determinado &lt;i&gt;"perfil"&lt;/i&gt;: los programadores, los hacedores del proceso mismo. En todos ellos, los &lt;i&gt;recursos&lt;/i&gt; se mueven entre tareas o a lo largo de proyectos al más puro estilo de las obras civiles como si fuesen elementos pre-formados, estáticos, constantes, clónicos, sustituibles e inalterables. De la misma forma que las máquinas excavadoras ("Máquina A:&amp;nbsp; X metros cúbicos por hora"), los programadores son capaces de realizar "una funcionalidad X en una unidad de tiempo Y". Ja, ja.&lt;br /&gt;&lt;br /&gt;Y nos lo creemos. Nos han hecho creérnoslo, y seguimos &lt;i&gt;haciendo como si fuese verdad&lt;/i&gt;. En el mantenimiento de esta mentira participamos todos (unos más que otros, eso si) pero especialmente es una cadena de mentiras necesarias. El cliente necesita creerlo y necesita que le digamos que estará en determinada fecha, y le enseñamos complejos cronogramas llenos de hitos y gantts que terminan, qué casualidad, justo en la fecha que él desea. El comercial también lo necesita porque hay que vender el proyecto. El gerente tiene dos opciones: el cinismo de créerselo o la resignación... normalmente acaba en la primera. Y asi una y otra vez. Clientes descontentos, equipos quemados buscando otra empresa, proyectos desastres inmantenibles, etc...&lt;br /&gt;&lt;br /&gt;La cultura corporativa nos exige y nos sugiere permanentemente algo que sabemos positivamente que es falso, pero en lo que se insiste una y otra vez: la semejanza entre los proyectos de desarrollo de software con los proyectos de edificación u obras. ¡Como si fueran comparables!. En los primeros hay procesos de fabricación fiables, comprobables, y certificados. Hay procesos de construcción definidos desde la ciencia y la experiencia de cientos&amp;nbsp; de años. Hay materiales probados, con tolerancias comprobadas y medidas. En definitiva, en los primeros se hace "ingeniería", en los segundos no. Es así de sencillo. Y las titulaciones adquiridas no tienen menos valor por lo que estoy diciendo. Tampoco diagnosticar una enfermedad u operar un corazón es ingeniería y no tienen menos valor los títulos en medicina por eso.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;i&gt;Adivina quién viene a cenar o e&lt;/i&gt;l factor humano.&lt;br /&gt;&lt;/h4&gt;Lo curioso de todo esto es que "&lt;i&gt;el método&lt;/i&gt;" falla en lo más importante. Y es que al final, tras las buenas prácticas, la toma de requisitos, el análisis, el diseño, el control de calidad y la documentación, el cliente está esperando los únicos dos parámetros que le interesa: tiempo y dinero. Aquí es donde "&lt;i&gt;el método&lt;/i&gt;" se viene abajo o, simplemente, no sabe/no contesta. ¿Por qué? Muy sencillo. Porque ahora es donde entra en juego la estimación, es decir, la predicción, la pronosticación. Y esto no parece muy científico que digamos. Y aquí no contamos con buenas estadísticas de trabajos mecánicos y repetitivos como en obras de edificación. Aquí no hay paredes estandarizadas, ni obreros equivalentes... Aquí nos encontramos con equipos de distinta experiencia en distintas áreas tecnológicas, con equipos con su propio ciclo de vida y sus modus operandi distintos. Personas muy distintas con experiencias y destrezas muy diferenciadas. Y dichas diferencias tienen un impacto brutal en el resultado (rendimiento, mantenibilidad, &lt;i&gt;limpieza&lt;/i&gt;, etc...).&lt;br /&gt;&lt;br /&gt;Sinceramente, nunca me he encontrado a nadie que aplique métricas tipo &lt;a href="http://es.wikipedia.org/wiki/COCOMO"&gt;COCOMO&lt;/a&gt; (¿de verdad alguien se cree que ése tipo de técnicas es precisa?). Al final, todas las técnicas predictivas utilizadas se basan en la experiencia de una forma u otra: bien por analogía con otros proyectos, bien por experiencia personal individual o en grupo (&lt;a href="http://en.wikipedia.org/wiki/Wideband_delphi"&gt;Wideband delphi&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;Además, hay dos aspectos fundamentales del factor humano a tener en cuenta:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Especialización&lt;/b&gt;. En el desarrollo hay una tremenda especialización. Las distintas tecnologías forman a expertos no intercambiables y, por supuesto, nada tiene que ver un proyecto de una aplicación empresarial con un proyecto de un software de desktop o un videojuego, por ejemplo. Esta especialización hace que cierto programador pueda ser tremendamente eficiente en un proyecto y nada eficiente en otro.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Formación&lt;/b&gt;. Todo proceso de programación lleva implícita una parte más o menos grande de formación, que puede ser un porcentaje alto del tiempo dependiendo de la experiencia del desarrollador en la tecnología.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Sin duda, la variable más compleja de manejar es la del factor humano, ya que las estimaciones se pueden ir al traste con mucha facilidad. Los proyectos medianos con equipos medianos son especialmente sensibles, ya que la dependencia del equipo humano es el factor importante: no es lo mismo repetir con un equipo que ya ha trabajado junto que con un equipo nuevo... no es lo mismo poner a doce programadores inexpertos que a seis expertos. Y ya sabemos que, en muchos casos, incorporar al señor XY en el proyecto es una buena razón para tener ocupado a XY, no para que el proyecto termine antes o lo haga con más calidad.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;i&gt;Tell me sweet little lies&lt;/i&gt;&lt;/h4&gt;Parafraseando la famosa canción de Fleetwood Mac (Little lies), ha sido la industria del software la que se ha fijado mantener la mentira y encargarse de que se cuente mil veces (especialmente en la universidad, donde parece que se dan menos cuenta) para que, así, a fuerza de repetirla, acabe en algo cierto. Pero los los procesos de desarrollo aún distan mucho de ser medibles, predecibles, estables y repetibles. Lo que se ha venido en llamar (y es posible que desde ahora empiece a dejar de hacerlo) &lt;i&gt;"ingeniería"&lt;/i&gt; del software aún está en pañales y le queda muchísimo camino por recorrer. Es posible que algún día, se parta de unidades básicas estándares (procesadores estándares, sistemas operativos estándares, lenguajes estándares, procesos estándares...) pero supongo que yo no estaré aquí para verlo. &lt;br /&gt;&lt;br /&gt;Como comentaba en mi &lt;a href="http://balteus.blogspot.com/2009/03/banco-de-experiencias-introduccion.html" target="_blank"&gt;primer post&lt;/a&gt;, no todos los desarrolladores experimentados son expertos. El factor humano es la columna vertebral de los desarrollos y se requiere que los proyectos tengan una orientación al equipo tanto como lo hacen al proceso. Es fundamental. Es más, se precisa que sean los proyectos los que se asignen a los equipos y no al revés. Hoy por hoy, la experiencia sigue siendo la forma generalizada e imprecisa de realizar las estimaciones.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y otra información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://tratandodeentenderlo.blogspot.com/2010/03/los-metodos-agiles.html"&gt;Excelente artículo sobre las metodologías ágiles&lt;/a&gt; y su diferenciación con respecto a las metodologías clásicas basadas en la métrica y la predictibilidad.&lt;/li&gt;&lt;li&gt;&lt;a href="http://tratandodeentenderlo.blogspot.com/2011/03/mythical-man-month.html"&gt;The Mythical Man-Month&lt;/a&gt;:&amp;nbsp; otro extraordinario resumen del libro del mismo nombre con reflexiones tangenciales a la mías (en mi modesta opinión, por supuesto)&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;i&gt;[1] El &lt;a href="http://www.cs.utexas.edu/users/EWD/ewd10xx/EWD1036.PDF" target="_blank"&gt;ensayo&lt;/a&gt; comprometido y crítico de Dijkstra es demoledor. En castellano, &lt;a href="http://www.smaldone.com.ar/documentos/ewd/sobre_la_crueldad.html"&gt;aquí&lt;/a&gt;.&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=9d35dc70-8567-832f-9b56-4b3e352e22c4" /&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/1763183641342103044-1289815387770893174?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/1289815387770893174/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/10/la-falacia-de-la-ingenieria-del.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/1289815387770893174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/1289815387770893174'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/10/la-falacia-de-la-ingenieria-del.html' title='La falacia de la Ingeniería del Software'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-gg2ZaiNJuO0/TnxXccKK2nI/AAAAAAAABEg/W6fIc-Sx0k4/s72-c/cohdra_100_400.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4086073605312380324</id><published>2009-09-08T01:00:00.007+02:00</published><updated>2009-12-06T10:22:59.505+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>Banco de experiencias (IV): librerías imprescindibles en Java</title><content type='html'>La máxima de &lt;i&gt;Albert Einstein&lt;/i&gt;&lt;br /&gt;&lt;blockquote&gt;"&lt;i&gt;Everything should be made as simple as possible&lt;/i&gt;, &lt;i&gt;but no simpler"&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;o la de &lt;i&gt;Leonardo Da Vinci&lt;i&gt;&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"La simplicidad es la máxima sofisticación"&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;junto con el &lt;i&gt;&lt;a href="http://es.wikipedia.org/wiki/Principio_KISS"&gt;Principio KISS&lt;/a&gt;&lt;/i&gt; (que no es otra cosa que una aplicación del concepto de &lt;a href="http://es.wikipedia.org/wiki/Navaja_de_Occam"&gt;&lt;i&gt;La Navaja de Occam&lt;/i&gt;&lt;/a&gt; a la informática) y el &lt;i&gt;&lt;a href="http://es.wikipedia.org/wiki/No_te_repitas"&gt;Principio DRY&lt;/a&gt;&lt;/i&gt;, forman parte de los principios básicos que todo desarrollador debería tener presente siempre, ya que, parece ser que el "sentido común" es menos común de lo que debería... o en todo caso, un concepto demasiado genérico.Una de las consecuencias directas de estos principios es la utilización de componentes &lt;b&gt;probados&lt;/b&gt; &lt;b&gt;reutilizables&lt;/b&gt; en nuestros proyectos, que nos facilitan el trabajo de manera incalculable, no sólo de desarrollo, sino también y sobre todo, de depuración y estabilización. Dentro de los miles de juegos de componentes en forma de API's, librerías y frameworks hay una reducida selección de joyas que he ido recopilando con el paso del tiempo y uso en casi todos los proyectos. Incluso en tecnologías de desarrollo, donde la transitoriedad y fugacidad de las mismas es tan enorme, algunos &lt;i&gt;imprescindibles&lt;/i&gt; han ido perpetuándose y creciendo o evolucionando en el tiempo, convirtiéndose en estándares de facto y haciéndose completamente indispensables. Esta es mi lista de imprescindibles:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://logback.qos.ch/"&gt;&lt;b&gt;logback&lt;/b&gt;&lt;/a&gt;: Está en el primer puesto por algo. Absolutamente indispensable y de incorporación obligada en cualquier proyecto. &lt;a href="http://balteus.blogspot.com/2009/05/banco-de-experiencias-ii-logback-la.html"&gt;Es la evolución de log4j&lt;/a&gt;, asi que supongo que no hay nada más que añadir.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.junit.org/"&gt;&lt;b&gt;JUnit&lt;/b&gt;&lt;/a&gt;: Otra indispensable. Cualquiera que piense que esto de las pruebas unitarias es un rollo para "cuando tenga tiempo" está muy equivocado. Al igual que usar logback es tan fácil como sustituir los cutres &lt;span style="font-family: &amp;quot;&amp;quot;;"&gt;System.out.println()&lt;/span&gt;, usar JUnit es tan fácil como sustuir los cutres "&lt;span style="font-family: &amp;quot;&amp;quot;;"&gt;main()&lt;/span&gt;" en las clases para probar métodos (...lo que vienen siendo pruebas unitarias, vamos...). Para probar métodos muy usados en un proyecto o muy específicos no hay nada mejor... tampoco se trata de crear unitarias para todas las clases!.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://commons.apache.org/"&gt;Apache Commons&lt;/a&gt;&lt;/b&gt;: Hay algunos que cuando entran en el enlace por primera vez ignoran la mayor parte del contenido, aturdidos por su enorme extensión o simplemente por desconocimiento. Sin embargo sugiero dedicar unos segundos simplemente a ojear las &lt;a href="http://commons.apache.org/components.html"&gt;librerías existentes&lt;/a&gt;. Es impresionante. Tras unos instantes uno comprueba la cantidad de veces que habremos "reinventado la rueda" en algunos proyectos antes de conocer estas librerías. Aunque todas son susceptibles de ser útiles, voy a destacar las que considero imprescindibles y cuyo uso me ha reportado enormes satisfacciones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/io/"&gt;IO&lt;/a&gt;: Un vistazo rápido a la &lt;a href="http://commons.apache.org/io/description.html"&gt;guia de usuario&lt;/a&gt; te dará una idea de su potencial. Especialmente para aquellos casos de aplicaciones que tratan con &lt;a href="http://commons.apache.org/io/api-release/index.html?org/apache/commons/io/FilenameUtils.html"&gt;nombres de fichero&lt;/a&gt; u operar con &lt;a href="http://commons.apache.org/io/api-release/index.html?org/apache/commons/io/FileUtils.html"&gt;ficheros y directorios&lt;/a&gt; de forma compatible para distintos sistemas operativos.&lt;/li&gt;&lt;li&gt; &lt;a href="http://commons.apache.org/lang/"&gt;Lang&lt;/a&gt;: Hay un &lt;a href="http://www.dosideas.com/java/432-a-no-repetirse-con-apache-commons-lang.html"&gt;excelente artículo&lt;/a&gt; de cómoda y atractiva lectura que te dejará claro por qué es absolutamente indispensable.&lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/configuration/"&gt;Configuration&lt;/a&gt;: Igualmente, hay otro &lt;a href="http://www.desarrolloweb.com/articulos/apache-commons-configuration.html"&gt;buen artículo&lt;/a&gt; en el que encontrarás los ejemplos necesarios. Especialmente interesante es usarlo con el wrapper &lt;a href="http://www.ibstaff.net/fmartinez/?p=52"&gt;EAC4J&lt;/a&gt; para usar la configuración vía JNDI.&lt;/li&gt;&lt;li&gt;&lt;a href="http://commons.apache.org/vfs/"&gt;VFS&lt;/a&gt;: Cuando tengas que hacer un acceso a ficheros cuya ubicación es indeterminada, usa VFS. Es una capa de abstracción que te permite acceder a &lt;a href="http://commons.apache.org/vfs/filesystems.html"&gt;múltiples&lt;/a&gt; sistemas de ficheros (SMB, FTP, SFTP, HTTP, etc...). Por ejemplo, es ideal si tienes que acceder a ficheros que hoy son locales pero igual mañana están en un recurso compartido de un servidor Windows con autenticación, o una cabina de discos NAS...&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&lt;a href="http://hc.apache.org/httpclient-3.x/"&gt;HttpClient&lt;/a&gt;&lt;/b&gt;: Si necesitas hacer algo &lt;a href="http://hc.apache.org/httpclient-3.x/features.html"&gt;más allá&lt;/a&gt; de HTPP GET o POST, como usar HTTPS, proxies, cookies, etc... necesitarás HttpClient. Incluso en el caso más sencillo: es más cómodo, rápido y seguro que usar java.net.&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;h4&gt;Específicas para JSF&lt;/h4&gt;Para los desarrollos de JSF, tengo también mis imprescindibles específicos. Son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://facelets.dev.java.net/"&gt;facelets&lt;/a&gt;: Algunos kits o implementaciones ya lo incluyen, como &lt;a href="http://www.icefaces.org/"&gt;ICEfaces&lt;/a&gt;. Si no lo usas, estás complicándote la vida: &lt;a href="http://balteus.blogspot.com/2009/03/facelets-el-fin-de-la-crisis.html"&gt;facelets simplifica&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsf-comp.sourceforge.net/components/on-load/index.html"&gt;on-load&lt;/a&gt;: La solución para ejecutar código cuando se carga una determinada página.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsf-comp.sourceforge.net/components/easysi/index.html"&gt;EasySI&lt;/a&gt;: ¿Harto de realizar conversiones manuales para cargar colecciones de SelectItem para publicar combos? Usa EasySI o &lt;a href="http://myfaces.apache.org/tomahawk-project/tomahawk12/tagdoc/t_selectItems.html"&gt;&amp;lt;t:selectItems&amp;gt;&lt;/a&gt; de Apache MyFaces &lt;a href="http://myfaces.apache.org/tomahawk/index.html"&gt;Tomahawk&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Son todas las que están... pero posiblemente no estén todas las que son... ¿Hay alguna que uses frecuentemente que no esté en la lista?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4086073605312380324?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4086073605312380324/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/09/banco-de-experiencias-iv-librerias.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4086073605312380324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4086073605312380324'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/09/banco-de-experiencias-iv-librerias.html' title='Banco de experiencias (IV): librerías imprescindibles en Java'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-5047357504448549516</id><published>2009-08-27T15:38:00.003+02:00</published><updated>2011-04-19T13:14:44.632+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='herramientas'/><category scheme='http://www.blogger.com/atom/ns#' term='alternativas'/><title type='text'>Alternativas gratuitas de código abierto a MS Visio para Linux</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Este es uno de los temas más recurrentes de los usuarios de Linux: encontrar una una aplicación clon de MS Visio para Linux.&lt;br /&gt;&lt;br /&gt;Hay varias aplicaciones muy parecidas y con funcionalidades equivalentes, pero los resultados que se obtienen son muy diferentes a Visio. ¿Por qué? Pues fundamentalmente por la galería de objetos, formas y cliparts, que en Visio están muy bien realizados y cuenta con un catálogo de formas realmente enorme, no sólo por los que vienen "de serie", sino también por la amplia oferta de descarga adicional.&lt;br /&gt;&lt;br /&gt;Una vez puestas las expectativas en su sitio, está claro que podemos hacer diagramas en Linux. Especialmente para una gran mayoría de usuarios cuyas exigencias tampoco son precísamente muy sofisticadas. Estas son las alternativas:&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://www.openoffice.org/product/draw.html"&gt;OpenOffice Draw&lt;/a&gt;&lt;/h4&gt;&lt;div class="separator" style="clear: both;"&gt;Draw es un editor de gŕaficos vectoriales que se parece más a CorelDraw que a MS Visio, pero se puede instalar la &lt;a href="http://es.wikipedia.org/wiki/Open_Clip_Art_Library" title="Open Clip Art Library"&gt;Open Clip Art Library&lt;/a&gt; (Biblioteca Abierta de Clip Art), que &lt;a href="http://www.openclipart.org/wiki/OpenOffice"&gt;permite agregar&lt;/a&gt; una enorme galería de banderas, logotipos, iconos y estandartes y pancartas para presentaciones generales y proyectos de dibujo.&lt;/div&gt;&lt;br /&gt;&lt;img height="323" src="http://upload.wikimedia.org/wikipedia/commons/5/57/OOo-Draw-2.0.png" style="float: none; max-width: 800px;" width="455" /&gt;&lt;br /&gt;&lt;br /&gt;También puedes descargar ClipArts adicionales desde &lt;a href="http://extensions.services.openoffice.org/project/oxygenoffice-gallery"&gt;http://extensions.services.openoffice.org/project/oxygenoffice-gallery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Esta aplicación cumple perfectamente si el objetivo es crear diagramas varios para presentaciones o documentos. Si no tienes nada más a mano, es una solución rápida, gratuita y legal. Es la que uso más frecuentemente.&lt;br /&gt;&lt;br /&gt;OpenOffice está también disponible para OSX, FreeBSD y Windows.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://es.wikipedia.org/wiki/Kivio"&gt;Kivio&lt;/a&gt;&lt;/h4&gt;Kivio es la aplicación para diagramas de la suite &lt;a href="http://es.wikipedia.org/wiki/KOffice"&gt;KOffice&lt;/a&gt;. La verdad es que esta suite promete bastante, especialmente por la enorme cantidad de aplicaciones que incluye:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;productividad (típico de cualquier paquete &lt;i&gt;Office&lt;/i&gt;): procesador de textos, hoja de cálculo, presentaciones y base de datos (compatible MS Access, por cierto)&lt;/li&gt;&lt;li&gt;creatividad: diagramas de flujo, dibujo vectorial y imágenes de mapa de bits&lt;/li&gt;&lt;li&gt;gestión de proyectos (tipo MS Project)&lt;/li&gt;&lt;li&gt;y otras, como un generador de informes, así como herramientas para gráficos empresariales y editor de fórmulas.&lt;/li&gt;&lt;/ul&gt;Me he instalado varias aplicaciones (Kivio, Kexi y KPlato) con el clásico "&lt;span style="font-family: &amp;quot;;"&gt;sudo aptitude install xxxx&lt;/span&gt;" y me han dado muy buenas sensaciones: aplicaciones de aspecto limpio y sencillo y muy ligeras y fluidas.&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;img height="358" src="http://upload.wikimedia.org/wikipedia/commons/b/ba/Kivio.png" style="float: none; max-width: 800px;" width="510" /&gt;&lt;br /&gt;&lt;br /&gt;En general el desarrollo de la suite, aunque está ya en su versión 2, sigue en su fase temprana y faltan aún temas por acabar pero, como decía, auguro un interesante futuro para esta suite.&lt;img height="323" src="http://lh4.ggpht.com/_U3R9awMQHdw/SpZN0c9wZgI/AAAAAAAAAvI/pP8QNUZZca8/%5BUNSET%5D.png?imgmax=800" style="float: right; margin-bottom: 10px; margin-left: 10px; margin-top: 10px; max-width: 800px;" width="517" /&gt;&lt;/div&gt;&lt;br /&gt;Kivio, en concreto, se parece enormemente a MS Visio y, probablemente sea su clon más exacto cuando esté definitivamente acabada. Los usuarios de Linux po  drán empezar a probarla desde ya mismo. Los usuarios de Windows aún tendrán que esperar un poco más... pero estará disponible en breve.&lt;br /&gt;&lt;br /&gt;Supongo que Kivio acabará siendo al proyecto KDE lo que ha sido Dia a GNOME.&lt;br /&gt;&lt;br /&gt;Hoy por hoy es una opción a tener en cuenta, aunque la biblioteca de cliparts disponible es reducida.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://live.gnome.org/Dia"&gt;Dia&lt;/a&gt;&lt;/h4&gt;Cuando comenzaba el artículo, comentaba que ésta solía ser una pregunta recurrente de los usuarios de Linux... y la respuesta recurrente en Internet siempre es ésta: Dia.&lt;br /&gt;&lt;br /&gt;Desarrollada en gtk+ (como parte del proyecto GNOME), es una aplicación diseñada como sustituto de Visio... pero supongo que inspirada en éste antes de que Microsoft adquiriese la compañía Visio, en el año 2000. La aplicación cumple su misión bastante bien, pero a mi particulamente se me antoja que tiene un diseño obsoleto (las aplicaciones multiventana no me gustan nada), no ha tenido últimamente mucha evolución (se ha actualizado recientemente, pero no lo hacía desde el 2007) y no me resulta cómoda.&lt;br /&gt;&lt;br /&gt;Debo reconocer, que siempre que me he propuesto usar Dia he acabado usando OpenOffice Draw. No obstante, recomiendo instalarlo y probarlo: puede ser que sea esto justo lo que estás buscando o que te guste a tí.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En definitiva, por mi parte seguiré muy de cerca la evolución de Kivio, que me ha parecido realmente lo que yo busco. Mientras tanto, continuaré con Draw.&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=07df6379-7b20-8cac-aa9f-06c9ccd7a4fd" /&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/1763183641342103044-5047357504448549516?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/5047357504448549516/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/08/alternativas-gratuitas-de-codigo.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/5047357504448549516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/5047357504448549516'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/08/alternativas-gratuitas-de-codigo.html' title='Alternativas gratuitas de código abierto a MS Visio para Linux'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_U3R9awMQHdw/SpZN0c9wZgI/AAAAAAAAAvI/pP8QNUZZca8/s72-c/%5BUNSET%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-6450004225524139802</id><published>2009-07-27T18:00:00.007+02:00</published><updated>2011-09-23T15:46:22.585+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><title type='text'>Banco de experiencias (III): errores comunes de despliegue en JEE</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;a href="http://www.flickr.com/photos/nickwheeleroz/2475011402/in/photostream/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img alt="http://www.flickr.com/photos/nickwheeleroz/2475011402/in/photostream/" border="0" height="157" src="http://2.bp.blogspot.com/-p-9aDngAnrM/TnxRSWcpvMI/AAAAAAAABEc/T2pyj5kNmR0/s200/huevo_roto.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h4 style="color: #3d85c6;"&gt;El problema&lt;/h4&gt;En JEE, además de la compilación y empaquetado, comunes en otras disciplinas java, existe un proceso imprescindible y no poco problemático: el despliegue.&lt;br /&gt;&lt;br /&gt;Los errores de programación suelen ser detectados por el propio compilador y &lt;a href="http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis"&gt;otras herramientas&lt;/a&gt; que ayudan a la detección de potenciales errores de ejecución. Sin embargo, hay ciertos &lt;b&gt;errores de despliegue&lt;/b&gt; (es decir, errores que se producen en tiempo de despliegue y que te impiden incluso iniciar la aplicación para probarla) que no son fácilmente detectados por ninguna herramienta y que son un verdadero dolor de cabeza para los programadores por sus incomprensibles síntomas y difícil detección.&lt;br /&gt;&lt;br /&gt;Existen también otros problemas, no dependientes directamente de nuestro código que se presentan durante el inicio o durante la ejecución de la aplicación. Este tipo de problemas son aún más difíciles de detectar, ya que los síntomas que encontramos no suelen tener ninguna relación con el código asociado al momento/lugar del código donde se producen o donde el servidor señala el error. Este tipo de problemas acostumbra a estar asociado también al despliegue o a algún bug del contenedor.&lt;br /&gt;&lt;br /&gt;En este artículo ofrezco una checklist para cuando nos encontremos esas apuradas situaciones, en las que se nos han agotan las posibilidades y no sabemos dónde más mirar o qué más hacer.&lt;br /&gt;&lt;br /&gt;&lt;h4 style="color: #3d85c6;"&gt;Los síntomas&lt;/h4&gt;Los síntomas que nos encontramos en este tipo de errores son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Un artefacto o componente JEE no se comporta como debe o simplemente no funciona en absoluto, sin embargo, el contenedor o servidor no reporta errores. Por ejemplo, un servlet correctamente declarado y desplegado no funciona y no hay errores en los logs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;El sistema reporta errores que aparentemente no tienen sentido. Por ejemplo, una clase o método que no se encuentra cuando comprobamos que está correctamente desplegado y accesible en el classpath.&lt;/li&gt;&lt;li&gt;Un segmento determinado de nuestro código no se ejecuta o termina de forma abrupta, y tampoco tenemos errores en los logs. Por ejemplo, un método de una clase implicada en un Resource Adaptor (conector JCA).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4 style="color: #3d85c6;"&gt;El diagnóstico&lt;/h4&gt;Se supone que ante los síntomas anteriores, ya hemos agotado todas las posibles opciones y orígenes &lt;i&gt;típicos&lt;/i&gt; o &lt;i&gt;supuestos&lt;/i&gt; que se nos ocurren, y especialmente, ya hemos descartado del todo (o casi del todo) que la causa sea nuestro propio código. Ante esto, ¿qué hacemos? ¿dónde está el problema? ¿dónde buscar?&lt;br /&gt;&lt;br /&gt;Pues para esos casos y otros similares, aquí va una checklist que os será de utilidad:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Revisar nuestro código otra vez, o lo que es mejor, que lo haga otra persona.&lt;/b&gt; Incluso en esos casos, lo normal es que el problema siga estando en nuestro código, así que, si lo has revisado dos veces: hazlo una tercera y que la cuarta lo haga otra persona.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Comprobar que el path de despliegue no tiene caracteres multibyte.&lt;/b&gt; Algunas librerías que usan reflection, no están preparadas para cargar clases en paths con espacios o caracteres multibyte (eñes, acentos, etc...). Especialmente en sistemas operativos raros de ésos que algunos usan para desarrollar (como &lt;a href="http://es.wiktionary.org/wiki/Haselfroch"&gt;Haselfroch&lt;/a&gt;, por ejemplo). Ejemplo: &lt;a href="http://balteus.blogspot.com/2009/03/javaxpersistencepersistenceexception-no.html"&gt;toplink-essentials no funciona desplegado en un path con espacios&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cuidado con los despliegues "&lt;i&gt;exploded&lt;/i&gt;".&lt;/b&gt; En algunas ocasiones nos interesa hacer despliegues desemplaquetados o descomprimidos. Si el directorio del módulo ha sido descomprimido fuera del sistema donde lo vamos a desplegar, puede haberse corrompido durante la copia o transferencia. Hay dos tipos de &lt;i&gt;adulteración&lt;/i&gt; que pueden sufrir los ficheros:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Corrupción binaria&lt;/b&gt;. En algunas ocasiones es posible que un fichero .jar (por ejemplo, de nuestras librerías) se corrompa al copiarlo y la aplicación no despliegue por esa causa.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Alteración de nombres&lt;/b&gt;. Es posible, por ejemplo, que si se han copiado de un medio con un filesystem antiguo como FAT32 (&lt;i&gt;case insensitive&lt;/i&gt;) acabemos con un directorio META-INF en minúsculas. Este tipo de errores es difícil de encontrar, pero nos crea problemas increíbles. Por ejemplo: la JVM no encontrará las dependencias declaradas en ficheros MANIFEST.MF en directorios meta-inf (así, en minúsculas).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;&lt;b&gt;Revisa los descriptores.&lt;/b&gt; Este es uno de esos males provocados por el famoso "copiar y pegar" que tanto daño hace al desarrollo. Por ejemplo, para que funcione el maravilloso mecanismo &lt;a href="http://java.sun.com/developer/technicalArticles/J2EE/injection/"&gt;&lt;i&gt;Dependency Injection&lt;/i&gt;&lt;/a&gt; de JEE 5 en una aplicación web, es preciso que el descriptor del web.xml especifique expresamente la especificación Servlet 2.5. En definitiva, hay que revisar las cabeceras de nuestros ficheros descriptores y comprobar que ninguno es "heredado" de un proyecto anterior.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cuidado con los empaquetados automáticos de los IDE: revisa tus librerías. &lt;/b&gt;Cuando utilizamos librerías externas en varios proyectos, éstas suelen tener, además, sus propias dependencias que debemos incluir. Si nuestro empaquetado es automático vía algún IDE puede ocurrir que incluyamos varias veces una misma librería o distintas versiones de las mismas librerías sin darnos cuenta. Si además las librerías se cargan en ClassLoaders distintos, el caos está garantizado. Por ejemplo: este tipo de problemas suele provocar desconcertantes errores con "IllegalArgumentException" o "NoSuchMethodException" ya que el ClassLoader encuentra una versión más antigua de la librería que creemos que está usando.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Traza, traza, traza.&lt;/b&gt; Y hazlo bien:&amp;nbsp; usa log4j o incluso mejor, usa &lt;a href="http://balteus.blogspot.com/2009/05/banco-de-experiencias-ii-logback-la.html"&gt;su revisión: logback&lt;/a&gt;. Es importante saber en qué punto exactamente el sistema deja de hacer lo esperado. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Revisa las secciones estáticas de tus clases.&lt;/b&gt; Las declaraciones de miembros estáticos o secciones estáticas (&lt;i style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;static {}&lt;/i&gt;) de una clase incluyen muchas veces constructores o llamadas a métodos que pueden, a su vez, generar un NPE (&lt;i&gt;NullPointerException&lt;/i&gt;) indeseado. Cuando esto ocurre en una sección estática de una clase, la clase no puede ser inicializada y muchas veces obtenemos mensajes confusos tipo &lt;i&gt;NoCassDefFoundError&lt;/i&gt; que nos despistan y no caemos en que todo se debe a un NPE nuestro. En las secciones estáticas, mantén el &lt;a href="http://es.wikipedia.org/wiki/Principio_KISS"&gt;principio KISS&lt;/a&gt;. Por ejemplo, si declaras el típico &lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;private static final Pattern pRe = Pattern.compile("\\s*");&lt;/span&gt;&lt;/i&gt;, asegurate de que la expresión regular es válida o toda la clase entera no podrá usarse en tiempo de ejecución.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Observa con detalles los logs del servidor&lt;/b&gt; y aumenta los niveles de trazado. Es frecuente que no hagamos caso al StackTrace que vuelcan los servidores en sus logs y simplemente nos fijemos en los más bajos de la pila (los últimos en listar). Mira con mayor detalle. Muchas veces te darán pistas sobre dónde buscar. Por ejemplo, me ha pasado escribiendo un Resource Adapter que un método ManagedConnection no se ejecutaba a partir de una determinada línea porque un bug del servidor "mataba" el thread cuando el contenedor llamaba a un método de limpieza. Al aumentar las trazas del contenedor de JCA me dí cuenta del problema (un NPE del contenedor en el &lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;dispose()&lt;/span&gt;&lt;/i&gt; de las conexiones).&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Cuando tengas un problema de despliegue y empieces a quedarte sin opciones, vuelve a esta entrada y repasa esta lista de comprobaciones, es posible que te ayude... A mi me sirvió.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-6450004225524139802?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/6450004225524139802/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/07/banco-de-experiencias-iii-errores.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/6450004225524139802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/6450004225524139802'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/07/banco-de-experiencias-iii-errores.html' title='Banco de experiencias (III): errores comunes de despliegue en JEE'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-p-9aDngAnrM/TnxRSWcpvMI/AAAAAAAABEc/T2pyj5kNmR0/s72-c/huevo_roto.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-7398926486611296263</id><published>2009-07-16T16:57:00.002+02:00</published><updated>2009-07-27T14:04:41.879+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='glassfish'/><title type='text'>Eclipse 3.5 Galileo + Glassfish: error instalando el plugin de Glassfish</title><content type='html'>&lt;div style="text-align: left;"&gt;Hace ya más de tres semanas que &lt;a href="http://www.eclipse.org/galileo/"&gt;está disponible&lt;/a&gt;, o &lt;i&gt;liberada&lt;/i&gt;, como dicen algunos (como si hubiera estado "presa" alguna vez..., en fin, esto de las traducciones libres...) la nueva versión de Eclipse, versión 3.5 y denominada "Eclipse &lt;i&gt;Galileo&lt;/i&gt;", tras "Calisto", "Europa" y "Ganymede"... (va a pasar mucho tiempo hasta que se queden sin &lt;a href="http://es.wikipedia.org/wiki/Sat%C3%A9lites_de_J%C3%BApiter"&gt;nombres&lt;/a&gt;).&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Pues bien, mi estreno con esta nueva versión ha sido un poco decepcionante, ya que, tras desactivar el "spelling" (que sigue estando activado por defecto, &lt;a href="http://kohlerm.blogspot.com/2008/05/analyzing-memory-consumption-of-eclipse.html"&gt;usando 5,6Mb para nada&lt;/a&gt;), lo segundo que hago es instalar el plugin de Glassfish... y me encuentro con mi primera desilusión:&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;An error occurred while collecting items to be installed&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&lt;b&gt;No repository found containing: org.eclipse.update.feature,com.sun.enterprise.jst.server.sunappsrv.feature,1.0.29&lt;br /&gt;No repository found containing: osgi.bundle,com.sun.enterprise.jst.server.sunappsrv,1.0.29&lt;br /&gt;session context was:(profile=epp.package.jee, phase=org.eclipse.equinox.internal.provisional.p2.engine.phases.Collect, operand=, action=).&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En efecto, es imposible instalar el plugin de eclipse según el modo tradicional, es decir, vía "download additional server adapter". Debe tratarse de algún bug circunstancial que solucionarán en breve (espero).&lt;br /&gt;&lt;br /&gt;Mientras tanto, &lt;b&gt;la solución es instalarlo vía Update URL a través de la URL: &lt;a href="http://ajax.dev.java.net/eclipse"&gt;http://ajax.dev.java.net/eclipse&lt;/a&gt;&lt;/b&gt;. Ya sólo me queda instalar Subversive plugin para usar SVN y todo vuelve a ser como antes...&lt;br /&gt;&lt;br /&gt;Que la disfrutéis.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[20/07/09] ACTUALIZACION:&lt;/b&gt; &lt;a href="http://balteus.blogspot.com/2009/07/eclipse-35-galileo-glassfish-error.html#comments"&gt;El comentario de un lector&lt;/a&gt; me informa de que es un bug conocido: https://bugs.eclipse.org/bugs/show_bug.cgi?id=280365. Thank you, &lt;i&gt;finsterwalder.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-7398926486611296263?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/7398926486611296263/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/07/eclipse-35-galileo-glassfish-error.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7398926486611296263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/7398926486611296263'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/07/eclipse-35-galileo-glassfish-error.html' title='Eclipse 3.5 Galileo + Glassfish: error instalando el plugin de Glassfish'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2766631629271115785</id><published>2009-07-14T08:46:00.000+02:00</published><updated>2009-07-14T08:46:03.940+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>Líala parda</title><content type='html'>Algunos recordaréis la expresión "la he &lt;i&gt;liao&lt;/i&gt; &lt;i&gt;parda&lt;/i&gt;" que &lt;a href="http://www.adn.es/ciudadanos/20080814/VID-0074-parda-liado-he.html"&gt;una chica socorrista&lt;/a&gt; hizo famosa. Como afortunadamente todo quedó en un susto y no hubo consecuencias graves, pudimos reírnos de la anécdota, especialmente por la forma tan natural y sincera con la que se expresaba la chica al pedir disculpas. El &lt;a href="http://www.youtube.com/watch?v=bhrwMYVOJqM"&gt;vídeo en YouTube&lt;/a&gt;, (junto con otras copias) lo ha visto más de medio millón de personas, así que la expresión ha pasado a formar parte de las expresiones de moda colectivas, como consiguió &lt;a href="http://es.wikipedia.org/wiki/Chiquito_de_la_Calzada"&gt;Chiquito de la Calzada&lt;/a&gt; en su momento.&lt;br /&gt;&lt;br /&gt;En fin, esta introducción viene a cuento del sitio &lt;a href="http://www.lialaparda.com/"&gt;www.lialaparda.com&lt;/a&gt;, desde el que puedes gastar una simpática broma y reírte un rato.&lt;br /&gt;&lt;br /&gt;Os puedo garantizar que el sitio es de absoluta confianza... Probadlo y veréis ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.D.: sólo funciona con móviles de España.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2766631629271115785?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2766631629271115785/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/07/liala-parda.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2766631629271115785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2766631629271115785'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/07/liala-parda.html' title='Líala parda'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-6064158329932712871</id><published>2009-06-17T19:28:00.004+02:00</published><updated>2009-06-17T23:21:47.556+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><title type='text'>XLS Office 2007 y anteriores con Java (SpreadsheetML incluído)</title><content type='html'>&lt;a href="http://poi.apache.org/"&gt;Apache POI&lt;/a&gt; es el framework de referencia y casi un estándar de facto para acceder a los formatos Microsoft usando un API Java Nativo. &lt;a href="http://poi.apache.org/spreadsheet/index.html"&gt;El subproyecto HSSF+XSSF&lt;/a&gt; de la versión 3.5 (aún en beta, pero totalmente funcional para el 90% de las operaciones) admite los nuevos formatos &lt;a href="http://en.wikipedia.org/wiki/Office_Open_XML"&gt;Open XML&lt;/a&gt; (como por ejemplo xlsx, introducidos en Office 2007).Y hasta aquí, aparentemente, todo solucionado. Si sólo pretendes importar/exportar datos, y no vas a usar funciones muy avanzadas, la Beta 5 de la versión 3.5 te va a funcionar perfectamente.No obstante, te puedes encontrar con alguna sorpresa desagradable en el lío de formatos de Office de MS. Concretamente la que se me ha dado a mí recientemente con un fichero Excel (xls) ha sido la siguiente:&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Exception in thread "main" cestel.tk.uf.dao.file.DAOImportException: java.lang.IllegalArgumentException: Your InputStream was neither an OLE2 stream, nor an OOXML stream at cestel.tk.uf.dao.file.DAOHssf.loadAgenda(DAOHssf.java:79)&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;/pre&gt;Obviamente se trataba de un fichero que se podía abrir en Excel normalmente, aunque me llamó la atención el hecho de que OpenOffice (al menos la 2.4) no era capaz de abrirlo como hoja de cálculo y en su lugar, presentaba el diálogo de importación. Abriendo el fichero con un editor de texto, me encuentro con que resulta que es un fichero XML con un contenido así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=1763183641342103044&amp;amp;postID=6064158329932712871" name="line1"&gt;1&lt;/a&gt; &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;?xml&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;version=&lt;/span&gt;&lt;span style="color: green;"&gt;"1.0"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;encoding=&lt;/span&gt;&lt;span style="color: green;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;?&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=1763183641342103044&amp;amp;postID=6064158329932712871" name="line2"&gt;2&lt;/a&gt; &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;?mso-application&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;progid=&lt;/span&gt;&lt;span style="color: green;"&gt;"Excel.Sheet"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;?&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://draft.blogger.com/post-edit.g?blogID=1763183641342103044&amp;amp;postID=6064158329932712871" name="line3"&gt;3&lt;/a&gt; &lt;a href="http://draft.blogger.com/post-edit.g?blogID=1763183641342103044&amp;amp;postID=6064158329932712871" name="line4"&gt;&lt;/a&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;Workbook&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;xmlns=&lt;/span&gt;&lt;span style="color: green;"&gt;"urn:schemas-microsoft-com:office:spreadsheet"&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #2040a0;"&gt;   xmlns:o=&lt;/span&gt;&lt;span style="color: green;"&gt;"urn:schemas-microsoft-com:office:office"&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #2040a0;"&gt;   xmlns:x=&lt;/span&gt;&lt;span style="color: green;"&gt;"urn:schemas-microsoft-com:office:excel"&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #2040a0;"&gt;   xmlns:ss=&lt;/span&gt;&lt;span style="color: green;"&gt;"urn:schemas-microsoft-com:office:spreadsheet"&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #2040a0;"&gt;   xmlns:html=&lt;/span&gt;&lt;span style="color: green;"&gt;"http://www.w3.org/TR/REC-html40"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;...&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;¿Y qué demonios es esto? Pues eso es, concretamente, &lt;a href="http://en.wikipedia.org/wiki/SpreadsheetML"&gt;SpreadsheetML&lt;/a&gt;, uno de los formatos de &lt;a href="http://es.wikipedia.org/wiki/Microsoft_Office_XML"&gt;Microsoft Office XML&lt;/a&gt;, creados con anterioridad al Office 2007 y ya obsoletos, siendo sustituídos por los formatos &lt;a href="http://es.wikipedia.org/wiki/Office_Open_XML"&gt;Office Open XML&lt;/a&gt; (también llamados &lt;i&gt;OOXML&lt;/i&gt; u &lt;i&gt;Open XML&lt;/i&gt;)... &lt;b&gt;y el problema está en que estos formatos no están soportados por Apache POI&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Afortunadamente, para estos casos, existe &lt;a href="http://xelem.sourceforge.net/"&gt;Xelem&lt;/a&gt;, una librería que te permite leer y escribir ficheros SpreadsheetML, con los que pude resolver el problema de la importación de datos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-6064158329932712871?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/6064158329932712871/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/06/xls-office-2007-y-anteriores-con-java.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/6064158329932712871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/6064158329932712871'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/06/xls-office-2007-y-anteriores-con-java.html' title='XLS Office 2007 y anteriores con Java (SpreadsheetML incluído)'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-939942361087307737</id><published>2009-06-05T01:48:00.007+02:00</published><updated>2009-06-16T10:20:34.073+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>Sideralis: un Stellarium en tu móvil</title><content type='html'>&lt;a href="http://www.astronomia2009.es/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_U3R9awMQHdw/SihOziav24I/AAAAAAAAAss/HIAEm472PBw/s320/iya_logo_SP.jpg" /&gt;&lt;/a&gt;Este año 2009 se celebra el Año Internacional de la Astronomía (declaración de la UNESCO ratificada por la &lt;a href="http://www.iaa.es/IYA09/files/N0747580-1.pdf"&gt;resolución&lt;/a&gt; de la ONU en 2007). El &lt;a href="http://es.wikipedia.org/wiki/A%C3%B1o_Internacional_de_la_Astronom%C3%ADa"&gt;AIA 2009&lt;/a&gt; es la excusa perfecta para publicar una entrada a propósito de uno de los temas que más me han fascinado: la astronomía. Quizá este post debería haber sido el primero de todos, ya que el nombre de este blog se debe a mi atracción por la astronomía. &lt;i&gt;Balteus&lt;/i&gt; es nombre que se le daba al cinturón que llevaban los legionarios romanos, también llamado &lt;i&gt;cingulum&lt;/i&gt;, y que portaba la espada. También se ha llamado así al famoso trío de estrellas &lt;span style="font-family: Verdana;"&gt;&lt;span style="color: maroon;"&gt;&lt;i&gt;Alnitak&lt;/i&gt;, &lt;i&gt;Alnilam&lt;/i&gt; y &lt;i&gt;Mintaka&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;, de la constelación Orión, una de las más conocidas de nuestro cielo. Este trío conforma el cinturón que porta la espada de Orion, típicamente conocido como "el cinturón de Orion" y también conocido como Al-Nijad (el cinturón), Al-Nasak (la línea), Balteus (el cinturón), "Los tres reyes", "Las tres marías", etc, etc... Siempre me han atraído esas tres estrellas alineadas.&lt;br /&gt;&lt;br /&gt;Cuando miramos al cielo a simple vista nos puede parecer que estamos viendo millones de estrellas... pero nada más lejos de la realidad: raras veces llegamos a ver más de 300 (magnitud 4).. ¡y eso en el campo y en circunstancias perfectas!. Lo máximo que podríamos llegar a ver, en el mejor de los casos (a 4.000 metros de altura, sin luna, con cielo despejado y con una vista envidiable) serían 1.500, como mucho. Con este panorama, y teniendo en cuenta contaminación lumínica, cielos poco despejados y nuestra limitada vista, en la mayoría de los casos normalmente sólo alcanzamos a ver entre 30 (magnitud 2) y 100 (magnitud 3). Además, todas son del vecindario: de la Vía Láctea. De 200.000 millones de estrellas repartidas en un radio de 100.000 años luz de nuestra propia galaxia, apenas alcanzamos a ver unas decenas de estrellas... Aquí, en la ciudad de Madrid, en buenas condiciones, apenas se perciben, a simple vista, menos de una docena (sin contar Venus, que se ve perfectamente, pero no es una estrella). Ya que vemos tan pocas estrellas, ¿no os gustaría saber cuáles son? ¿cómo se llaman? En mi caso, sin referencias, y siendo un simple curioso/seguidor "de documentales" (ni siquiera me puedo considerar un aficionado a la astronomía), es prácticamente imposible saber qué estoy viendo... hasta ahora.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_U3R9awMQHdw/SihW0KSCqAI/AAAAAAAAAs0/fxYuogx2Dxw/s1600-h/0.10-planets.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_U3R9awMQHdw/SihW0KSCqAI/AAAAAAAAAs0/fxYuogx2Dxw/s320/0.10-planets.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Los curiosos de la astronomía conocerán casi seguro &lt;a href="http://es.wikipedia.org/wiki/Stellarium"&gt;Stellarium&lt;/a&gt; (el sitio web en español es &lt;a href="http://www.stellarium.org/es/"&gt;éste&lt;/a&gt;). Probablemente uno de los mejores mapas de cielo (o mapa estelar, o planetario, como queráis llamarlo) para ordenador. Si no lo conoces, bájatelo y pruébalo. Aunque sea sólo por curiosidad. Es espectacular. Está disponible para varios sistemas operativos (e incluso para Windows). Probarlo es muy sencillo y, comprobar que lo que estás mirando por la ventana es lo que te aparece en la pantalla, es cuestion de unos pocos minutos. Es una forma muy divertida y agradable de introducirse en el fantástico mundo de la observación del cielo.&lt;br /&gt;&lt;br /&gt;Cuando Galileo apuntó por primera vez al cielo con un telescopio, 400años atrás, no creo que se imaginara que llegaríamos a tener un planisferioluminoso en un aparato minúsculo que, además (mira tú qué cosas), sirve también para llamar por teléfono y decirte la hora. ¡Por fin un móvil sirve para algo interesante!.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sideralis.free.fr/screenshots.html" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_U3R9awMQHdw/SihcAl-FYNI/AAAAAAAAAs8/hZtAK6bkZUM/s320/Horizon+view+with+cursor.png" /&gt;&lt;/a&gt;&lt;b&gt;&lt;a href="http://sideralis.free.fr/"&gt;Sideralis&lt;/a&gt; es un equivalente a Stellarium, pero en tu móvil&lt;/b&gt;. Funciona perfectamente en mi N82 y, en principio, en prácticamente cualquier móvil más o menos reciente que soporte MIDP 2.0. La aplicación es muy completa: vistas horizonal y cénit, e información de más planetas, estrellas (más de 800) y objetos Messier de los que podamos ver incluso aunque tengamos unos prismáticos a mano.&lt;br /&gt;&lt;br /&gt;La ventaja del programa es evidente. Si estás por la noche en un lugar despejado (o en cualquier sitio que puedas observar al cielo) sin haberlo podido planificar, es difícil que lleves un planisferio, una PDA o un PC encima... ¿pero el móvil? casi seguro que lo tienes a mano para arrancar esta maravilla y empezar a ponerle nombre a lo que ves.&lt;br /&gt;&lt;br /&gt;Está disponible en español y además es gratuito. Sólo le falta (puestos a pedir) que tome la localización automáticamente del GPS integrado de los móviles que lo tengan. Desde aquí, le doy las gracias al autor por brindarnos gratuitamente esta joya&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ah!... y está hecha en Java, claro.&lt;br /&gt;&lt;br /&gt;P.D.: por cierto, hay un post muy bueno sobre planetarios para Linux &lt;a href="http://www.trebol-a.com/2007/08/04/planetarios-gpl-para-linux/"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;ACTUALIZACIÓN [16/06/09]&lt;/b&gt;&lt;/i&gt;: La versión 1.2.7 (etiquetada internamente como 1.02(7)) ya incluye tres formas de posicionamiento: manual (introduciendo longitud y latitud), seleccionando tu ciudad, o vía GPS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-939942361087307737?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/939942361087307737/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/06/sideralis-un-stellarium-en-tu-movil.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/939942361087307737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/939942361087307737'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/06/sideralis-un-stellarium-en-tu-movil.html' title='Sideralis: un Stellarium en tu móvil'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_U3R9awMQHdw/SihOziav24I/AAAAAAAAAss/HIAEm472PBw/s72-c/iya_logo_SP.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-992974690805736474</id><published>2009-05-20T09:43:00.010+02:00</published><updated>2011-04-15T23:50:58.328+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='alternativas'/><category scheme='http://www.blogger.com/atom/ns#' term='BRMS'/><title type='text'>Open Source BRE/BRMS JSR-94 compliant</title><content type='html'>El título está en inglés, pero es que &lt;i&gt;"Motores de Reglas de Negocio o Sistemas de Gestión de Reglas de Negocio compatibles JSR-94 de código abierto"&lt;/i&gt; es un título muy largo y, cuando buscamos información, se suele buscar más usando los términos en inglés.&lt;br /&gt;&lt;br /&gt;Recientemente he tenido sondear el &lt;i&gt;estado del arte&lt;/i&gt; de los BRE/BRMS de código abierto y lo primero que encontré es que hay decenas (concretamente hay 30 en &lt;a href="http://www.manageability.org/blog/stuff/rule_engines/view"&gt;esta lista&lt;/a&gt; de noviembre de 2007). Obviamente, no tengo tiempo de evaluar tantos proyectos, así que establecí una serie de criterios de búsqueda que me redujesen la lista de resultados a una cantidad aceptable para evaluar o, al menos, leer y recopilar información para una posterior evaluación.&lt;br /&gt;&lt;br /&gt;Los criterios de búsqueda que establecí son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BRE mínimo (se excluyen "compiladores" de reglas)&lt;/li&gt;&lt;li&gt; Conformidad con la &lt;a href="http://jcp.org/en/jsr/detail?id=94"&gt;JSR-94&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Proyecto activo (considero "activo" un proyecto con actividad reciente inferior a 2 años)&lt;/li&gt;&lt;li&gt;Ligero, con persistencia y repositorio autónomo (es decir, que aunque &lt;i&gt;pueda&lt;/i&gt; usar una base de datos no la necesite necesariamente)&lt;/li&gt;&lt;li&gt;Documentación suficiente o aceptable.&lt;/li&gt;&lt;/ul&gt;El resultado de la recopilación es:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Drools / JBoss Drools / Jboss Rules&lt;/li&gt;&lt;li&gt;OpenRules &lt;/li&gt;&lt;li&gt;Hammurapi Rules&lt;/li&gt;&lt;li&gt;SweetRules&lt;/li&gt;&lt;li&gt;JRuleEngine&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Aunque muchos &lt;a href="http://en.wikipedia.org/wiki/Rule_engine"&gt;BRE&lt;/a&gt; evolucionan a un &lt;a href="http://en.wikipedia.org/wiki/BRMS"&gt;BRMS&lt;/a&gt;, lo cierto es que BRMS no hay muchos, con lo que la recopilación se queda en un número más pequeño del que me imaginaba. Además, el criterio de conformidad a la JSR-94 ha sido suficientemente restrictivo, ya que excluye todos los que no son Java y además, son muy pocos los que cumplimentan la especificación.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a href="http://www.jboss.org/drools/"&gt;Drools (JBoss Drools / JBoss Rules)&lt;/a&gt;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;Probablemente el más conocido, y también el más gigantesco de los proyectos. Se puede considerar un BRMS en toda regla ya que tiene herramientas típicas de los BRMS propietarios (repositorio, editor de reglas &lt;a href="http://en.wikipedia.org/wiki/User_interface"&gt;WUI&lt;/a&gt;,etc)&lt;br /&gt;Las reglas pueden escribirse en DRL (el típico), Java, Groovy... incluso puede extenderse con &lt;a href="http://en.wikipedia.org/wiki/Domain_Specific_Language"&gt;DSL&lt;/a&gt;'s vía XML.&lt;br /&gt;Para mi, quizá uno de los puntos fuertes de Drools sea la integración con el resto de &lt;a href="http://www.redhat.es/products/jboss/JEM/index.php"&gt;servicios de middleware de jBoss&lt;/a&gt;, especialmente con jBPM. La &lt;a href="http://blog.athico.com/2008/07/drools-50-m1-new-and-noteworthy.html"&gt;versión 5&lt;/a&gt;, se espande en un elenco de servicios realmente impresionante, que promete bastante.&lt;br /&gt;Curiosamente, tiene&amp;nbsp; un &lt;a href="http://droolsdotnet.codehaus.org/"&gt;porting a .NET&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a href="http://openrules.com/"&gt;OpenRules&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Este es el proyecto que más me ha llamado la atención por novedoso, curioso y de aplicación práctica inmediata. Desdel el punto de vista de la existencia (y variedad) de repositorios y herramientas, estamos ante un BRMS (Drools y éste son los únicos de la lista). La característica más destacada de OpenRules es la versatiliidad y adaptabilidad, ya que:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;tiene una &lt;a href="http://openrules.com/architecture.htm"&gt;arquitectura&lt;/a&gt; enormemente flexible y adaptativa a distintas estrategias de despliegue. &lt;/li&gt;&lt;li&gt;definición de &lt;a href="http://openrules.com/overview.htm#Excel%20+%20Java%20+%20Eclipse"&gt;reglas en ficheros Excel&lt;/a&gt;, aunque se pueden definir &lt;a href="http://openrules.com/ExternalRules.htm"&gt;también&lt;/a&gt; en tablas de base de datos, objetos java, xml,...&lt;/li&gt;&lt;li&gt;permite utilizar &lt;a href="http://openrules.com/RulesRepository.htm"&gt;múltiples tipos de accesos a repositorios&lt;/a&gt; jerarquizados: ficheros, svn, cvs, base de datos, http, ftp, etc...&lt;/li&gt;&lt;/ul&gt;El sitio web está muy bien organizado, tiene muchos &lt;a href="http://openrules.com/FunLab.htm"&gt;ejemplos&lt;/a&gt;, y la documentación es bastante buena. Me ha impresionado, realmente.&lt;br /&gt;&lt;br /&gt;Como curiosidad, está votado como &lt;a href="http://javarules.org/index.php?name=Web_Links&amp;amp;req=MostPopular"&gt;el más popular&lt;/a&gt; en &lt;a href="http://javarules.org/"&gt;javarules.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://www.hammurapi.biz/hammurapi-biz/ef/xmenu/hammurapi-group/products/hammurapi-rules/index.html"&gt;&lt;b&gt;Hammurapi Rules&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;Es&lt;b&gt; &lt;/b&gt;más un BRE que un BRMS, aunque tiene una &lt;a href="http://wiki.hammurapi.biz/index.php?title=Hammurapi_rules#Runtime_components"&gt;arquitectura&lt;/a&gt; multithread muy bien diseñada. Una ventaja interesante es que el lenguaje elegido para las reglas es el propio Java, con lo que la curva de aprendizaje es muy pequeña. Además, siendo realistas, pocas situaciones hay en las que existe el famoso "analista de negocio" que es capaz (y además quiere hacerlo) de definir las reglas de negocio en un lenguaje "informático" (y eso suponiendo que los objetos de negocio no cambien mucho).&lt;br /&gt;&lt;br /&gt;Me parece una buena opción para casos en lo que nos biene especialmente bien escribir las reglas en Java y queremos "empotrar" un BRE en nuestra aplicación fácilmente. Por ejemplo, para migrar a una aplicación con muchas reglas &lt;i&gt;hard-coded&lt;/i&gt; a reglas modificables en caliente sin demasiado impacto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://sweetrules.projects.semwebcentral.org/"&gt;&lt;b&gt;SweetRules&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;Aunque no es conforme a la JSR-94, me llamó la atención que es el único que implementa &lt;a href="http://en.wikipedia.org/wiki/RuleML"&gt;RuleML&lt;/a&gt;, el que se propone como lenguaje de reglas estándar. No obstante, la web es caótica, y la documentación deja mucho que desear. La implementación de RuleML es la única curiosidad.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;a href="http://jruleengine.sourceforge.net/"&gt;&lt;b&gt;JRuleEngine&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;Probablemente es el BRE más ligero de los 5. Las reglas se escriben en XML y no he visto que implemente &lt;a href="http://es.wikipedia.org/wiki/Algoritmo_Rete"&gt;Rete&lt;/a&gt;. No obstante, parece cumplir con los mínimos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Al final, junto con Drools (¿cómo no?) el proyecto que más me ha gustado es OpenRules. Hammurapi Rules también es bastante interesante. ¿Crees que he omitido alguno que debería estar? ¿hay alguno que te parezca especialmente interesante? Agradeceré comentarios al respecto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-992974690805736474?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/992974690805736474/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/05/open-source-brebrms-jsr-94-compliant.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/992974690805736474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/992974690805736474'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/05/open-source-brebrms-jsr-94-compliant.html' title='Open Source BRE/BRMS JSR-94 compliant'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4151667638100525658</id><published>2009-05-18T01:45:00.006+02:00</published><updated>2011-11-01T21:14:15.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Alternativas EAV con XML (en PostgreSQL 8.3)</title><content type='html'>&lt;b&gt;El modelo EAV&lt;/b&gt;&lt;br /&gt;El modelo &lt;i&gt;Entidad-Atributo-Valor&lt;/i&gt; (&lt;a href="http://en.wikipedia.org/wiki/Entity-Attribute-Value_model"&gt;EAV&lt;/a&gt;, Entity-Attribute-Value), también conocido como &lt;i&gt;Objeto-Atributo-Valor&lt;/i&gt; o Esquema Abierto, se usa en casos donde el número de atributos (propiedades, parámetros) usados para describir una entidad u objeto es potencialmente grande, pero que aplicados individualmente a una entidad concreta es pequeño. Las circunstancias donde se suelen aplicar son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Entidades con atributos heterogéneos:&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Entidades dinámicas en el tiempo, donde los atributos de una entidad son fijos, pero durante un período de tiempo variable. Es decir, son cambiantes (pueden crecer o decrecer) en el tiempo.&lt;/li&gt;&lt;li&gt;Entidades conceptualmente dinámicas, dependiendo de la interpretación del sistema en un determinado momento. Es decir, entidades cuyo número de atributos cambia según el contexto (p.e.: atributos definidos por el usuario)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Entidades con atributos homogéneos &lt;a href="http://en.wikipedia.org/wiki/Sparse_matrix"&gt;muy poco densos&lt;/a&gt;. Es decir, entidades con una desproporción muy grande entre el número de atributos posibles y el número de atributos con valor (no nulos).&lt;/li&gt;&lt;/ul&gt;Entidades en escenarios típicos de este tipo de modelos son, por ejemplo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;documentos (en una base de datos documental) cuyos atributos asignados a cada documento depende de la empresa, departamento, tipo de documento, etc...&lt;/li&gt;&lt;li&gt;información cuya catalogación adicional depende de parámetros definidos por el usuario&lt;/li&gt;&lt;li&gt;conceptos de negocio o abstractos cuyos atributos dependen de varios factores y varían en el tiempo: &lt;i&gt;"expediente"&lt;/i&gt;, &lt;i&gt;"valoración"&lt;/i&gt;, &lt;i&gt;"indicencia"&lt;/i&gt;, etc...&lt;/li&gt;&lt;/ul&gt;Este modelo se suele resolver sobre el modelo relacional con tres tablas: la de entidad, la de atributos posibles de dicha entidad y la de valores. La información se registra conceptualmente en la tabla de valores, que relaciona la información a través de tres columnas: clave ajena de entidad, clave ajena de atributo y valor.&lt;br /&gt;&lt;br /&gt;&lt;table border="0" cellpadding="2" cellspacing="2" style="text-align: left; width: 100px;"&gt;  &lt;tbody&gt;&lt;tr valign="top"&gt;      &lt;td&gt;&lt;table border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" height="107" style="page-break-after: auto; page-break-before: auto; page-break-inside: auto; width: 194px;"&gt;        &lt;colgroup&gt;&lt;col width="19"&gt;&lt;/col&gt; &lt;col width="135"&gt;&lt;/col&gt; &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr valign="top"&gt;            &lt;td bgcolor="#9999ff" colspan="2" valign="top" width="162"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Incidencia&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td bgcolor="#9999ff" width="19"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Id&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;            &lt;td bgcolor="#9999ff" width="135"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Fecha&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="19"&gt;&lt;i&gt;1&lt;/i&gt;            &lt;/td&gt;            &lt;td width="135"&gt;17/05/1922:10            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="19"&gt;&lt;i&gt;2&lt;/i&gt;            &lt;/td&gt;            &lt;td width="135"&gt;18/05/1910:13            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="19"&gt;&lt;i&gt;3&lt;/i&gt;            &lt;/td&gt;            &lt;td width="135"&gt;18/05/1917:05            &lt;/td&gt;          &lt;/tr&gt;&lt;/tbody&gt;      &lt;/table&gt;&lt;/td&gt;      &lt;td&gt;&lt;table border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" height="135" style="page-break-after: auto; page-break-before: auto; page-break-inside: auto; width: 182px;"&gt;        &lt;colgroup&gt;&lt;col width="19"&gt;&lt;/col&gt; &lt;col width="136"&gt;&lt;/col&gt; &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;            &lt;td bgcolor="#9999ff" colspan="2" valign="top" width="163"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Datos&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td bgcolor="#9999ff" width="19"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Id&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;            &lt;td bgcolor="#9999ff" width="136"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;NombreAtributo&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="19"&gt;&lt;i&gt;1&lt;/i&gt;            &lt;/td&gt;            &lt;td width="136"&gt;Longitud            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="19"&gt;&lt;i&gt;2&lt;/i&gt;            &lt;/td&gt;            &lt;td width="136"&gt;Temperatura            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="19"&gt;&lt;i&gt;3&lt;/i&gt;            &lt;/td&gt;            &lt;td width="136"&gt;Volumen            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="19"&gt;&lt;i&gt;4&lt;/i&gt;            &lt;/td&gt;            &lt;td width="136"&gt;Sector            &lt;/td&gt;          &lt;/tr&gt;&lt;/tbody&gt;      &lt;/table&gt;&lt;/td&gt;      &lt;td&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;table border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" height="159" style="page-break-after: auto; page-break-before: auto; page-break-inside: auto; width: 180px;"&gt;        &lt;colgroup&gt;&lt;col width="48"&gt;&lt;/col&gt; &lt;col width="59"&gt;&lt;/col&gt; &lt;col width="48"&gt;&lt;/col&gt; &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;            &lt;td bgcolor="#9999ff" colspan="3" valign="top" width="170"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;DatosIncidencia&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td bgcolor="#9999ff" width="48"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;IdInc&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;            &lt;td bgcolor="#9999ff" width="59"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;IdDato&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;            &lt;td bgcolor="#9999ff" width="48"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Valor&lt;/b&gt;&lt;/span&gt;            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="48"&gt;&lt;i&gt;1&lt;/i&gt;            &lt;/td&gt;            &lt;td width="59"&gt;&lt;i&gt;1&lt;/i&gt;            &lt;/td&gt;            &lt;td width="48"&gt;5            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="48"&gt;&lt;i&gt;1&lt;/i&gt;            &lt;/td&gt;            &lt;td width="59"&gt;&lt;i&gt;4&lt;/i&gt;            &lt;/td&gt;            &lt;td width="48"&gt;A            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="48"&gt;&lt;i&gt;2&lt;/i&gt;            &lt;/td&gt;            &lt;td width="59"&gt;&lt;i&gt;2&lt;/i&gt;            &lt;/td&gt;            &lt;td width="48"&gt;6            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="48"&gt;&lt;i&gt;2&lt;/i&gt;            &lt;/td&gt;            &lt;td width="59"&gt;&lt;i&gt;3&lt;/i&gt;            &lt;/td&gt;            &lt;td width="48"&gt;4            &lt;/td&gt;          &lt;/tr&gt;&lt;tr valign="top"&gt;            &lt;td width="48"&gt;&lt;i&gt;2&lt;/i&gt;            &lt;/td&gt;            &lt;td width="59"&gt;&lt;i&gt;4&lt;/i&gt;            &lt;/td&gt;            &lt;td width="48"&gt;A            &lt;/td&gt;          &lt;/tr&gt;&lt;/tbody&gt;      &lt;/table&gt;&lt;/td&gt;    &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Los problemas que aporta este modelo son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Consultas SQL complejas (muchos "&lt;i&gt;CASE")&lt;/i&gt;, que en algunos casos deben usar herramientas típicas de datawarehouse (PIVOT, &lt;a href="http://www.postgresql.org/docs/8.3/static/tablefunc.html"&gt;crosstab&lt;/a&gt;, etc), para convertir en columnas lo que, en realidad, son filas.&lt;/li&gt;&lt;li&gt;Tipo de dato único para todos los atributos, sean numéricos, fechas o cadenas, que luego deberán convertirse, o complicar el modelo con distintas tablas de atributos en función del tipo de dato.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;XML y Xpath al rescate&lt;/b&gt;&lt;br /&gt;Una buena alternativa a este tipo de problemas es implementar un campo con XML y procesarlo con herramientas XPath. Lamentablemente, &lt;a href="http://www.postgresql.org/docs/8.3/interactive/datatype-xml.html"&gt;el tipo de dato XML&lt;/a&gt; de PostgreSQL 8.3 aún no tiene operadores de comparación ni se pueden crear índices sobre este tipo de dato, pero se puede tratar como String y indexar expresiones XPath como veremos a continuación.&lt;br /&gt;&lt;br /&gt;La ventaja de usar XML es que podemos contar con un número de atributos variable &lt;i&gt;encapsulados&lt;/i&gt; en un documento XML en un sólo campo y evitar tener que usar el modelo EAV, por ejemplo:&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;table border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" height="116" style="page-break-after: auto; page-break-before: auto; page-break-inside: auto; width: 630px;"&gt; &lt;colgroup&gt;&lt;col width="24"&gt;&lt;/col&gt; &lt;col width="140"&gt;&lt;/col&gt; &lt;col width="440"&gt;&lt;/col&gt; &lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;  &lt;td bgcolor="#9999ff" colspan="3" valign="top" width="620"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Incidencia&lt;/b&gt;&lt;/span&gt;      &lt;/td&gt; &lt;/tr&gt;&lt;tr valign="top"&gt;  &lt;td bgcolor="#9999ff" width="24"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Id&lt;/b&gt;&lt;/span&gt;      &lt;/td&gt;  &lt;td bgcolor="#9999ff" width="140"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;Fecha&lt;/b&gt;&lt;/span&gt;      &lt;/td&gt;  &lt;td bgcolor="#9999ff" width="440"&gt;&lt;span style="color: #ffff66;"&gt;&lt;b&gt;DatosIncidencia&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr valign="top"&gt;  &lt;td width="24"&gt;&lt;i&gt;1&lt;/i&gt;    &lt;/td&gt;  &lt;td width="140"&gt;17/05/19 22:10    &lt;/td&gt;  &lt;td width="440"&gt;&lt;span style="color: black;"&gt;&amp;lt;data&amp;gt;&amp;lt;longitud&amp;gt;5&amp;lt;/longitud&amp;gt;&amp;lt;sector&amp;gt;A&amp;lt;/sector&amp;gt;&amp;lt;/data&amp;gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr valign="top"&gt;  &lt;td width="24"&gt;&lt;i&gt;2&lt;/i&gt;    &lt;/td&gt;  &lt;td width="140"&gt;18/05/19 10:13    &lt;/td&gt;  &lt;td width="440"&gt;&lt;span style="color: black;"&gt;&amp;lt;data&amp;gt;&amp;lt;temperatura&amp;gt;5&amp;lt;/temperatura&amp;gt;&amp;lt;volumen&amp;gt;4&amp;lt;/volumen&amp;gt;&amp;lt;sector&amp;gt;A&amp;lt;/sector&amp;gt;&amp;lt;/data&amp;gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&amp;nbsp;&lt;br /&gt;Con una tabla como la anterior, podemos realizar consultas sencillas con XPath, tipo&lt;br /&gt;&lt;pre class="SCREEN"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;SELECT xpath('/data/temperatura/text()', DatosIncidencia)&lt;br /&gt;FROM incidencia&lt;/b&gt;&lt;/span&gt;&lt;/pre&gt;que nos permite un control total en la consulta de atributos sin complicadas consultas. Puede haber quien le parezca que XPath es complicado y que no se gana tanto, pero en mi opinión, es más sencillo tratar con un único campo y una única tabla aunque tengamos que realizar un pequeño aprendizaje de XPath. A la larga, todo es más simple: tanto las consultas como el mantenimiento.&lt;br /&gt;&lt;br /&gt;También se pueden optimizar ciertas consultas comunes creando índices, aunque usando &lt;a href="http://www.postgres.cz/index.php/PostgreSQL_SQL_Tricks#xpath_function_indexing"&gt;algún truco&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El soporte de XML "de serie" en PostgreSQL no ha hecho más que empezar, y le queda un gran camino por recorrer, pero ya estamos en disposición de empezar a aprovecharlo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #990000;"&gt;&lt;b&gt;Referencias y más información:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://balteus.blogspot.com/2010/06/xml-con-postgresql.html"&gt;XML con PostgreSQL&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4151667638100525658?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4151667638100525658/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/05/alternativas-eav-con-xml-en-postgresql.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4151667638100525658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4151667638100525658'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/05/alternativas-eav-con-xml-en-postgresql.html' title='Alternativas EAV con XML (en PostgreSQL 8.3)'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-538546114413769965</id><published>2009-05-08T19:38:00.013+02:00</published><updated>2010-02-17T16:42:06.230+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><title type='text'>Banco de experiencias (II): Logback, la evolución de log4j</title><content type='html'>&lt;a href="http://logging.apache.org/"&gt;Log4j&lt;/a&gt; se ha convertido en el estandar &lt;i&gt;de facto&lt;/i&gt; para la información de trazado de cualquier proyecto Java. Es una de esas librerías que se añaden a un proyecto prácticamente en el propio proceso de creación del mismo, antes de añadir ninguna clase. Pertenece a ese pequeño y selecto grupo de librerías/frameworks imprescindibles (me lo apunto para una próxima entrada) en cualquier proyecto. Y cuando digo cualquier proyecto, no sólo me refiero a Java. El diseño de la librería y de su estructura es tan bueno, que ha sido portada a multitud de plataformas: el &lt;a href="http://logging.apache.org/log4net/index.html"&gt;porting de .NET&lt;/a&gt; es excelente, y tiene &lt;a href="http://en.wikipedia.org/wiki/Log4J#Ports"&gt;otros muchos más&lt;/a&gt; a diversas plataformas.&lt;br /&gt;&lt;br /&gt;Sin embargo, a pesar de parecer perfecta y casi inmejorable, tiene un sucesor muy superior: &lt;a href="http://logback.qos.ch/"&gt;logback&lt;/a&gt;. Lo primero que uno percibe al examinar logback es que su diseño y realización está basado en la experiencia con log4j, mejorando algunos pequeños inconvenientes que habían surgido durante su evolución y, sobre todo, respondiendo a las necesidades que han ido surgiendo durante estos casi 10 años de vida, como demuestra Ceki Gülcü, su diseñador, que fue también el fundador de log4j.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Simple Logging Facade for Java&lt;/b&gt;&lt;br /&gt;Logback es una implementación de &lt;a href="http://www.slf4j.org/"&gt;SLF4J&lt;/a&gt; (Simple Logging Facade for Java): una capa de abstracción (un façade, como su propio nombre indica) para varios frameworks distintos de logging. SLF4J es el sucesor de &lt;a href="http://commons.apache.org/logging/"&gt;Jakarta Commons Logging (JCL)&lt;/a&gt;, pero mejorado en muchos aspectos. Sin entrar en demasiados detalles, para cualquiera que realice una migración a SLF4J disfrutará, de entrada con 3 mejoras inmediatas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Se acabaron los problemas con los &lt;a href="http://www.qos.ch/logging/classloader.jsp"&gt;class loaders&lt;/a&gt;, dada su vinculación (binding) estática con la implementación subyacente (con JCL es dinámica en tiempo de ejecución).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://logback.qos.ch/manual/architecture.html#ParametrizedLogging"&gt;Trazado con parámetros mucho más sencillo&lt;/a&gt; y eficiente.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.slf4j.org/manual.html#binding"&gt;Independencia&lt;/a&gt;, dado que puedes usar múltiples vinculaciones con sólo añadir otro ".jar" (p.e.: desde "&lt;i&gt;slf4j-simple-x.x.x.jar&lt;/i&gt;", para pequeñas aplicaciones que usen System.err hasta "&lt;i&gt;slf4j-log4j12-x.x.x.jar&lt;/i&gt;", para servir de puente a log4j.)&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Logback&lt;/b&gt;&lt;br /&gt;Logback, al ser una implementación sofisticada de SLF4J, disfruta de todas las ventajas de éste y, también sin entrar en sofisticaciones y sólo tocando temas comunes que cualquier usuario habitual de log4j podrá valorar, yo destacaría las siguientes: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://logback.qos.ch/manual/jmxConfig.html"&gt;Cambios en caliente vía JMX&lt;/a&gt; (una maravilla esperada desde hace tiempo). Cuando lo probé casi se me saltan las lágrimas.&lt;/li&gt;&lt;li&gt;&lt;a href="http://logback.qos.ch/manual/configuration.html#autoScan"&gt;Autorecarga&lt;/a&gt; en caliente del fichero de configuración. ([ACTUALIZACIÓN 25/08/09]: &lt;a href="http://balteus.blogspot.com/2009/05/banco-de-experiencias-ii-logback-la.html?showComment=1250061639435#c2510047048418964281"&gt;Apunte realizado por el mismísimo Ceki&lt;/a&gt;. &lt;i&gt;Thank you, Ceki. Your visit and comment was an honour&lt;/i&gt;).&lt;/li&gt;&lt;li&gt;&lt;a href="http://logback.qos.ch/manual/configuration.html#variableSubstitution"&gt;Uso de variables sustituíbles&lt;/a&gt;. Adiós rutas absolutas de ficheros.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://logback.qos.ch/manual/filters.html"&gt;Filtros&lt;/a&gt;. Aunque lo parezca, no es una funcionalidad sofisticada, se le saca mucha ventaja cuando tienes una aplicación grande y modularizada.&lt;/li&gt;&lt;li&gt;&lt;a href="http://logback.qos.ch/manual/appenders.html#RollingFileAppender"&gt;RollingFileAppender&lt;/a&gt; tal y como siempre lo hemos querido, con una configuración flexible usando &lt;a href="http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy"&gt;RollingPolicy&lt;/a&gt;. ¿No estabas deseando tener un "MaxBackup" en el DailyRollingFileAppender de log4j? Pues ahora tienes MaxHistory en el &lt;a href="http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy"&gt;TimeBasedRollingPolicy&lt;/a&gt;... impresionante (¡¡por fin!!)&lt;/li&gt;&lt;li&gt;&lt;a href="http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout"&gt;Layout mejorados&lt;/a&gt;, como por ejemplo, que te permiten limitar el tamaño del stack trace en las excepciones de INFO.&lt;/li&gt;&lt;li&gt;De momento no hay un &lt;a href="http://logging.apache.org/chainsaw/index.html"&gt;Chainsaw&lt;/a&gt; equivalente, pero hay un &lt;a href="http://logback.qos.ch/consolePlugin.html"&gt;plugin para eclipse&lt;/a&gt; fantástico.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://logback.qos.ch/manual/architecture.html#Performance"&gt;Rendimiento&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Migrando desde log4j&lt;/b&gt; &lt;br /&gt;Los impacientes que quieran empezar a usarlo migrando un proyecto existente, pueden considerar usar el &lt;a href="http://www.slf4j.org/migrator.html"&gt;SLF4J Migrator&lt;/a&gt;, muy útil para hacer los cambios en pocos minutos.&lt;br /&gt;&lt;br /&gt;Los que hayan usado log4j sin seguir las normas de estilo, como trazar sin mensaje (p.e. &lt;i&gt;log.trace(a)&lt;/i&gt;, siendo &lt;i&gt;"a"&lt;/i&gt; un &lt;i&gt;int&lt;/i&gt;, &lt;i&gt;boolean&lt;/i&gt;, &lt;i&gt;Exception&lt;/i&gt; o cualquier otro objeto) deberán resolver los errores de compilación, ya que SLF4J no soporta esto: deberán poner un mensaje siempre (al fin y al cabo, si no se pone, la traza queda poco legible).&lt;br /&gt;&lt;br /&gt;En todo caso, por experiencia, os garantizo que la migración es bastante suave y se puede cambiar un proyecto en pocos minutos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fichero de configuración&lt;/b&gt;&lt;br /&gt;En log4j me había realizado un fichero de configuración más o menos estándar para entornos de producción que me generaba 3 ficheros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Uno de nivel INFO. Uno por día, sin borrado automático (lamentablemente no era posible con el DailyRollingFileAppender)&lt;/li&gt;&lt;li&gt;Uno de nivel DEBUG. Fijo por tamaño y con máximo de ficheros&lt;/li&gt;&lt;li&gt;Uno de nivel TRACE. Fijo por tamaño y con máximo de ficheros.&lt;/li&gt;&lt;/ul&gt;Esta configuración me resultaba muy útil, ya que en caso de incidencia reciente, tenía logs de niveles TRACE y DEBUG de las últimas horas del sistema. El problema es que tienes que ser muy prudente con los tamaños y había que navegar entre varios ficheros para encontrar el momento que buscabas.&lt;br /&gt;&lt;br /&gt;He migrado el fichero a logback pero pudiendo disfrutar de las características nuevas: excepciones más cortas en INFO, uno por día en todos los niveles (aunque con menos historia en los niveles más verbosos).&lt;br /&gt;&lt;br /&gt;Os dejo el fichero a continuación para que podáis echar un vistazo y adaptarlo a vuestras necesidades.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;logback.xml&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;1 &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;?xml&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;version=&lt;/span&gt;&lt;span style="color: green;"&gt;"1.0"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;encoding=&lt;/span&gt;&lt;span style="color: green;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;?&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt; 2 &lt;br /&gt; 3 &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;configuration&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt; 4   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;jmxConfigurator&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;contextName=&lt;/span&gt;&lt;span style="color: green;"&gt;"tkuf2"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt; 5   &lt;span style="color: #444444;"&gt;&amp;lt;!-- Se puede establecer el directorio "a mano" o usar el del usuario  --&amp;gt;&lt;/span&gt;&lt;br /&gt; 6   &lt;span style="color: #444444;"&gt;&amp;lt;!-- &amp;lt;property name="USER_HOME" value="/home/szarza" /&amp;gt;  --&amp;gt;&lt;/span&gt;&lt;br /&gt; 7   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;property&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;name=&lt;/span&gt;&lt;span style="color: green;"&gt;"USER_HOME"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;value=&lt;/span&gt;&lt;span style="color: green;"&gt;"${user.home}"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt; 8   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;property&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;name=&lt;/span&gt;&lt;span style="color: green;"&gt;"appName"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;value=&lt;/span&gt;&lt;span style="color: green;"&gt;"tk.uf"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;9 &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;  &amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;property&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;name=&lt;/span&gt;&lt;span style="color: green;"&gt;"logPath"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;value=&lt;/span&gt;&lt;span style="color: green;"&gt;"${USER_HOME}/tk2/logs"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;10   &lt;span style="color: #444444;"&gt;&amp;lt;!--&lt;br /&gt;11     1 por día. Nivel INFO. 300 días de historia &lt;br /&gt;12    --&amp;gt;&lt;/span&gt;&lt;br /&gt;13   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;appender&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;name=&lt;/span&gt;&lt;span style="color: green;"&gt;"INFO"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.core.rolling.RollingFileAppender"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;14     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;filter&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.classic.filter.ThresholdFilter"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;15       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;level&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;INFO&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/level&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;16     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/filter&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;17     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;File&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;${logPath}/${appName}.log&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/File&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;18     &lt;br /&gt;19     &lt;span style="color: #444444;"&gt;&amp;lt;!-- 5 líneas de stacktrace para las excepciones --&amp;gt;&lt;/span&gt;&lt;br /&gt;20     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;layout&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.classic.PatternLayout"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;21       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;Pattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;%date %-5level %logger{20} - %message%n %exception{5}&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/Pattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;22     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/layout&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;23     &lt;br /&gt;24     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;rollingPolicy&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;25       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FileNamePattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;${logPath}/${appName}.%d{yyyy-MM-dd}.log&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/FileNamePattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;  &lt;br /&gt;26       &lt;span style="color: #444444;"&gt;&amp;lt;!-- mantener 300 días de historia --&amp;gt;&lt;/span&gt;  &lt;br /&gt;27       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;MaxHistory&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;300&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/MaxHistory&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;28     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/rollingPolicy&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;29   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/appender&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;30   &lt;br /&gt;31   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;appender&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;name=&lt;/span&gt;&lt;span style="color: green;"&gt;"DEBUG"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.core.rolling.RollingFileAppender"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;32     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;filter&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.classic.filter.ThresholdFilter"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;33       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;level&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;DEBUG&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/level&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;34     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/filter&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;35     &lt;br /&gt;36     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;File&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;${logPath}/${appName}.d.log&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/File&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;37     &lt;br /&gt;38     &lt;span style="color: #444444;"&gt;&amp;lt;!-- 10 líneas de stacktrace para las excepciones --&amp;gt;&lt;/span&gt;&lt;br /&gt;39     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;layout&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.classic.PatternLayout"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;40       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;Pattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;%date %-5level %logger{20} - %message%n %exception{10}&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/Pattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;41     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/layout&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;42     &lt;br /&gt;43     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;rollingPolicy&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;44       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FileNamePattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;${logPath}/${appName}.d.%d{yyyy-MM-dd}.log&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/FileNamePattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;45       &lt;span style="color: #444444;"&gt;&amp;lt;!-- mantener 10 días de historia --&amp;gt;&lt;/span&gt;  &lt;br /&gt;46       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;MaxHistory&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;10&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/MaxHistory&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;47     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/rollingPolicy&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;48   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/appender&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;49 &lt;br /&gt;50   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;appender&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;name=&lt;/span&gt;&lt;span style="color: green;"&gt;"TRACE"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.core.rolling.RollingFileAppender"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;51     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;filter&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.classic.filter.ThresholdFilter"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;52       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;level&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;TRACE&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/level&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;53     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/filter&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;54     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;File&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;${logPath}/${appName}.t.log&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/File&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;55     &lt;br /&gt;56     &lt;span style="color: #444444;"&gt;&amp;lt;!-- full stacktrace para las excepciones --&amp;gt;&lt;/span&gt;&lt;br /&gt;57     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;layout&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.classic.PatternLayout"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;58       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;Pattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;%date %-5level %logger{20} - %message%n&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/Pattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;59     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/layout&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;60     &lt;br /&gt;61     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;rollingPolicy&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;62       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;FileNamePattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;${logPath}/${appName}.t.%d{yyyy-MM-dd}.log&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/FileNamePattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;  &lt;br /&gt;63       &lt;span style="color: #444444;"&gt;&amp;lt;!-- mantener 5 días de historia --&amp;gt;&lt;/span&gt;  &lt;br /&gt;64       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;MaxHistory&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;5&lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/MaxHistory&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;65     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/rollingPolicy&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;66   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/appender&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;67 &lt;br /&gt;68   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;appender&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;name=&lt;/span&gt;&lt;span style="color: green;"&gt;"STDOUT"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.core.ConsoleAppender"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;69    &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;layout&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;class=&lt;/span&gt;&lt;span style="color: green;"&gt;"ch.qos.logback.classic.PatternLayout"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;70      &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;Pattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;71         %date{HH:mm:ss.SSS} %-5level %logger{10} - %message%n&lt;br /&gt;72       &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/Pattern&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;73     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/layout&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;74   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/appender&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;75   &lt;br /&gt;76   &lt;br /&gt;77   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;logger&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;name=&lt;/span&gt;&lt;span style="color: green;"&gt;"cestel.tk.uf"&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;level=&lt;/span&gt;&lt;span style="color: green;"&gt;"TRACE"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;78     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;appender-ref&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;ref=&lt;/span&gt;&lt;span style="color: green;"&gt;"INFO"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;79     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;appender-ref&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;ref=&lt;/span&gt;&lt;span style="color: green;"&gt;"DEBUG"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;80     &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;appender-ref&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;ref=&lt;/span&gt;&lt;span style="color: green;"&gt;"TRACE"&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;81   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/logger&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;82   &lt;br /&gt;83   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;root&lt;/span&gt; &lt;span style="color: #2040a0;"&gt;level=&lt;/span&gt;&lt;span style="color: green;"&gt;"OFF"&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;84     &lt;span style="color: #444444;"&gt;&amp;lt;!-- &lt;br /&gt;85     &amp;lt;appender-ref ref="STDOUT" /&amp;gt;&lt;br /&gt;86      --&amp;gt;&lt;/span&gt;&lt;br /&gt;87   &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/root&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;88   &lt;br /&gt;89 &lt;span style="color: #2040a0;"&gt;&lt;b&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #2040a0;"&gt;/configuration&lt;/span&gt;&lt;span style="color: #4444ff;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&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/1763183641342103044-538546114413769965?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/538546114413769965/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/05/banco-de-experiencias-ii-logback-la.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/538546114413769965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/538546114413769965'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/05/banco-de-experiencias-ii-logback-la.html' title='Banco de experiencias (II): Logback, la evolución de log4j'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-2241023661172809315</id><published>2009-04-20T20:30:00.000+02:00</published><updated>2009-04-20T20:30:30.614+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>Oracle: el nuevo gigante rojo</title><content type='html'>Aún estoy tratando de asimilar &lt;a href="http://www.sun.com/third-party/global/oracle/index.jsp"&gt;la noticia sorpresa de hoy&lt;/a&gt; en la que se anuncia la compra de Sun por parte de Oracle. Debo confesar que estoy sorprendido y no soy de ésos que pueda decir: "me lo esperaba". Desde hace ya mucho tiempo la asociación de ideas que hago con la compañía Sun no es &lt;i&gt;"SPARC"&lt;/i&gt;, ni &lt;i&gt;"Enterprise 10.000"&lt;/i&gt;, ni hardware en general... ni siquiera &lt;i&gt;"Solaris&lt;/i&gt;". Hace ya mucho, mucho tiempo que asocio Sun a Java, a Glassfish, a JEE, a software empresarial.&lt;br /&gt;&lt;br /&gt;Dice McNealy que es la"evolución natural de la relación entre Sun y Oracle". Desde luego lo es en lo que se refiere a hardware. Esta compra de tecnología y cartera de clientes permite a Oracle posicionarse frente a IBM como un nuevo gigante que vende "su software en sus propias máquinas". Justo lo que le faltaba al nuevo gigante rojo (ea, ya tenemos dos gigantes de colores), una perfecta división de hardware para tenerlo (casi) todo: hardware, sistema operativo, software de gestión y almacenamiento en red, bases de datos, servidores de aplicaciones, lenguaje propio, herramientas de desarrollo, etc, etc, etc...&amp;nbsp; &lt;br /&gt;&lt;br /&gt;No obstante produce un tremendo vértigo (como comenté en el &lt;a href="http://balteus.blogspot.com/2009/04/las-maquinas-de-negocios-se-comen-al.html"&gt;anterior post&lt;/a&gt;) pensar en la tremenda e importantísima cartera de softrware de Sun. Con la adquisición de BEA, Oracle adquirió enorme cantidad de software empresarial asociado a JEE, apoderándose del clásico Rolls Royce de los servidores de aplicaciones (sobretodo por su coste): Weblogic. Y con él, decenas de productos relacionados que son referente en su campo.&lt;br /&gt;&lt;br /&gt;Ahora, Sun tiene decenas de productos que colisionan entre sí, en funcionalidad y &lt;i&gt;target&lt;/i&gt; de mercado: servidores de aplicaciones, JVM (2), bases de datos, software de virtualización, etc... En la parte que me interesa, es preocupante el destino de productos como Glassfish o Java.&lt;br /&gt;&lt;br /&gt;En el caso de Java, supongo que se dará continuidad, ya que Oracle tiene tanto invertido en Java como IBM... El problema es si no arrimará el ascua a su sardina arrinconando la comunidad y haciendo de la tecnología un siervo de su feudo.&lt;br /&gt;&lt;br /&gt; El caso de Glassfish es más grave, porque podría estar en peligro realmente. Glassfish es el servidor JEE de referencia, y además es Open Source. Glassfish, además, era EL competidor natural de Weblogic por su calidad, documentación, rendimiento, etc... (desafío a cualquiera a que participe en los comentarios defendiendo a Websphere o JBoss... je,je....). Así que, prácticamente Oracle se queda con el mercado de los servidores de aplicaciones. Oracle se tendrá que enfrentar a mantener dos líneas de producto separadas (¿?) o eliminar una de ellas. &lt;br /&gt;¿Eliminará la que le puede reportar beneficios por licencias? ¿O se quedará con un servidor Open Source con y sin soporte, como tenía Sun?...&lt;br /&gt;&lt;br /&gt;En fin, pensando en estas cosas me acordaba de la canción de "No me pises que llevo chanclas" "¿Y tú de quien eres?", que me traía recuerdos de cómo nos identificaban a los chavales en el pueblo. Me acuerdo de eso porque la gente que nos movemos en el mundo del Open Source y de la tecnología Java estamos acostumbrados a &lt;b&gt;elegir&lt;/b&gt;. Estamos acostumbrados a la libertad de usar el software que queramos porque hay diversas implementaciones del estandar. Estamos acostumbrados a alinearnos con uno o con otro e incluso de tener ciertos "piques" técnicos entre distintas distribuciones de Linux, herramientas de desarrollo o servidores de aplicaciones. Es natural preguntarnos unos a otros "¿y tú? ¿de quién eres?" sobre nuestra alineación a nuestras preferencias (Netbeans/Eclipse, JBoss/Glassfish/Geronimo, etc...). Esta presunta rivalidad, esta competencia, genera innovación y desarrollo.&lt;br /&gt;&lt;br /&gt;La gente que trabaja con la tecnología de Microsoft no tiene estas preocupaciones. Como no las tenían los que vivían resignados en las dictaduras. Sólo hay un fabricante. Sólo una implementación. Son lentejas. No hay participación. No hay competencia. El dictador presenta el producto. El único. Sobre su único sistema operativo. Sobre su única herramienta de desarrollo. Es lo que hay. Te aguantas. El dictador decide la vida del producto y su muerte. Como la monarquía: sólo te resta esperar que el producto heredado mejore, porque nadie puede hacer otro igual: todo viene del mismo sitio y es secreto, oculto, cerrado.&lt;br /&gt;&lt;br /&gt;Yo me quedo con mi desazón, como los ateos, con mi mente libre, mi libre albedrío y mi permanente estado de analisis y decisión, con mis sobresaltos, con mis dudas y mis riesgos, emocionantes y vertiginosos, con mi libertad, preguntándome &lt;a href="http://es.wikipedia.org/wiki/%C2%BFQui%C3%A9n_se_ha_llevado_mi_queso%3F"&gt;¿quién se ha llevado mi queso?&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-2241023661172809315?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/2241023661172809315/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/04/oracle-el-nuevo-gigante-rojo.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2241023661172809315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/2241023661172809315'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/04/oracle-el-nuevo-gigante-rojo.html' title='Oracle: el nuevo gigante rojo'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4296596200611125743</id><published>2009-04-19T23:00:00.007+02:00</published><updated>2009-04-20T09:14:23.250+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='actualidad'/><title type='text'>La puesta del sol: Sun en venta</title><content type='html'>Marzo ha sido un mes revuelto en lo que a noticias alrededor de Sun se refiere. Primero &lt;a href="http://www.nytimes.com/2009/04/03/technology/business-computing/03blue.htm?_r=1"&gt;la oferta de compra por parte de IBM&lt;/a&gt;, y días más tarde &lt;a href="http://www.nytimes.com/2009/04/06/technology/business-computing/06blue.html"&gt;su retirada&lt;/a&gt;, ha puesto al descubierto (para mayor desgracia de Sun) que los problemas financieros de Sun son más graves de lo que parecían. El valor de Sun (que no ha levantado cabeza desde el fin de la burbuja de las puntocom) y su déficit financiero, no pueden hacer frente a la actual recesión sin una salida digna a través de una adquisición. Para IBM, esta operación hubiera mejorado su posición en la competencia con su gran rival HP. Ahora, tras la retirada de IBM, Sun tendrá problemas para encontrar a otro comprador.&lt;br /&gt;&lt;br /&gt;Dejando aparte los temas púramente financieros, en estos movimientos hay elementos muy interesantes a analizar y sobre los que reflexionar en lo que a tendencias sobre tecnología y el negocio TIC.&lt;br /&gt;&lt;br /&gt;En primer lugar, &lt;b&gt;la cacharrería ya no es (suficiente) negocio.&lt;/b&gt; El mercado de hardware de servidores, estaba ya bastante concentrado incluso antes de esta operación, básicamente copado por IBM, Sun (la suma de ambos hubiese superado el 40%), HP y Dell, que últimamente estan centrando su estrategia de expansión en áreas más beneficiosas como la consultoría y servicios (que ofrecen márgenes más amplios).&lt;br /&gt;&lt;br /&gt;En segundo lugar, está claro que el negocio de gestión de datos está cambiando a un &lt;b&gt;nuevo concepto de Data Centers&lt;/b&gt;. La solución de poner un servidor físico por aplicación o servicio es extremadametnte cara: mantenimiento, soporte, administración, energía... Los servidores rígidos no son una solución rentable. Sería como tener un coche para ir al trabajo, otro para comprar y otro para ir al cine. La tecnología aporta ahora dos soluciones novedosas en este sentido: &lt;b&gt;&lt;a href="http://es.wikipedia.org/wiki/Virtualizaci%C3%B3n"&gt;virtualización&lt;/a&gt;&lt;/b&gt; y &lt;b&gt;&lt;a href="http://es.wikipedia.org/wiki/Virtualizaci%C3%B3n"&gt;cloud computing&lt;/a&gt;&lt;/b&gt;. El cloud computing eleva el hardware a la categoría de servicio, o lo que es lo mismo, el modelo &lt;a href="http://es.wikipedia.org/wiki/SaaS"&gt;SaaS&lt;/a&gt; o &lt;a href="http://es.wikipedia.org/wiki/Application_Service_Provider"&gt;ASP&lt;/a&gt; del software, aplicado al hardware. A la fabricación de máquinas le esta pasando lo que a los reproductores de deuvedés: llegado el momento, es más barato comprarte otro. Parece que los movimientos de Cisco con el &lt;a href="http://www.idg.es/dealer/actualidad.asp?id=78195"&gt;UCS&lt;/a&gt;, y de IBM con esta operación fuesen en ese sentido: buscar la rentabilidad en servicios. Sun tiene ya bastante avanzado en ese sentido: elementos clave del cloud computing como herramientas de red para datacenter y software de virtualización, que podrían ser de interés para IBM. En el software, esta fórmula se lleva ya aplicando mucho tiempo. Y más, en estos últimos tiempos, en los que se crea negocio de servicios alrededor del Open Source.&lt;br /&gt;&lt;br /&gt;Hay también otra reflexión más importante (para mí al menos) en lo que respecta al futuro de la cartera del software de Sun. El que la continuidad de productos como MySQL o VirtualBox pueda estar en entredicho por el cambio de dueño no tiene parangón si hablamos de la tecnología Java y todo el negocio a su alrededor. Ciertamente da cierto vértigo pensar que productos y tecnologías como Java, o Glassfish tengan un futuro incierto....menos mal que ya hace tiempo que son Open Source!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4296596200611125743?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4296596200611125743/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/04/las-maquinas-de-negocios-se-comen-al.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4296596200611125743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4296596200611125743'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/04/las-maquinas-de-negocios-se-comen-al.html' title='La puesta del sol: Sun en venta'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-8120733252419173202</id><published>2009-03-22T22:06:00.004+01:00</published><updated>2009-07-27T14:04:41.879+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><title type='text'>javax.persistence.PersistenceException: No Persistence provider for EntityManager.... SOLUCIONADO</title><content type='html'>El otro día tuve que montar a un compañero un entorno para trabajar con un proyecto. El procedimiento, el de siempre: bajar glassfish, bajar eclipse (Ganymede) y hacer el (SVN) checkout oportuno del proyecto. A los pocos minutos ya estaba todo montado... pero me encontré con un problema incomprensible:&lt;br /&gt;&lt;br /&gt;&lt;textarea cols="100" rows="4"&gt;javax.persistence.PersistenceException: No Persistence provider for EntityManager named XXXXXXXXX. The following providers:oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvideroracle.toplink.essentials.PersistenceProviderReturned null to createEntityManagerFactory.&amp;nbsp;&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Este mismo proyecto (con el mismo código y librerías) estaba funcionando correctamente en dos máquinas, así que era incomprensible. ¡PersistenceManager informa de que no encuentra alguna de sus propias clases!Obviamente no tenía nada que ver con el código, así que, &lt;a href="http://balteus.blogspot.com/2009/03/banco-de-experiencias-introduccion.html"&gt;como uno es perro viejo&lt;/a&gt;, pensé que tenía que ser de otros factores diferenciadores. Igualé las versiones de Glasfish: nada. Actualizé el JDK: nada.... La única diferencia era que las otras máquinas donde funcionaba correctamente sin problemas (una de ellas, la mía) eran Linux (Kubuntu, para más señas) y ésta era un &lt;a href="http://es.wiktionary.org/wiki/Haselfroch"&gt;Haselfroch&lt;/a&gt;. Miré en un foro un post que hablaba algo sobre un directorio con acentos, pero no era el caso. Afortunadamente, uno tiene la suerte de trabajar junto a amables compañeros y buenos profesionales que me ayudaron a echar un vistazo, y comenzó eso que viene a llamarse &lt;i&gt;brainstorming&lt;/i&gt;, donde cada uno empieza a decir en alto las cosas que observa o se le pasan por la cabeza. Es un metodo infalible: al poco rato ya teníamos una pista. Mirando en la consola de Glassfish aparecían caraceres multibyte en la ruta donde desplegaba la aplicación debido a que había espacios en dicha ruta.&lt;br /&gt;&lt;br /&gt;En resumen: la aplicación se había desplegado usando la integración de Glassfish con eclipse (muy buena por cierto), ya que se comporta como si tuviesemos el tomcat embebido: rápida y cómoda. En una instalación por defecto, el eclipse pone el Workspace en el directorio de usuario, que en Haselfroch es&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; C:\Documents and Settings\&lt;/span&gt;&lt;i style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;usuario&lt;/i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;\...&lt;/span&gt;&lt;/span&gt; y las aplicaciones se despliegan en dicho &lt;i&gt;workspace&lt;/i&gt;. En definitiva, por algún bug extraño de la implementación en Toplink Essentials, el PersistenceManager no encuentra los persistence providers de marras si hay caracteres mutibyte en el path.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Solución:&lt;/b&gt; &lt;b&gt;asegurate que tu aplicación (que usa EntityManager) se despliegue en un directorio sin espacios, acentos o caracteres no ASCII&lt;/b&gt;. Si estás usando Eclipse y usas Windoze, cambia el &lt;i&gt;workspace&lt;/i&gt; de Eclipse a un directorio sin espacios... o mejor, usa Linux (nunca hay que perder la oportunidad de &lt;i&gt;"evangelizar"&lt;/i&gt; ;-). &lt;br /&gt;&lt;br /&gt;P.D.: Por cierto que Microsoft debería plantearse de una vez por todas dejar de poner por defecto los datos de usuario en una partición por defecto que se suele formatear una vez al año como mínimo y que además, todo el mundo desaconseja usar y así, tomar ejemplo de sus propios usuarios y crear un sencillo "home" (en lugar de "Documents and Settings") en otra partición... fórmula de eficacia demostrada desde hace decenas de años... pero en fin, sería pedir cosas "razonables", que no se yo....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-8120733252419173202?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/8120733252419173202/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/03/javaxpersistencepersistenceexception-no.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8120733252419173202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8120733252419173202'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/03/javaxpersistencepersistenceexception-no.html' title='javax.persistence.PersistenceException: No Persistence provider for EntityManager.... SOLUCIONADO'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-8639068361415009090</id><published>2009-03-17T22:30:00.291+01:00</published><updated>2009-07-27T14:04:41.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>Facelets: el fin de la crisis diseño/desarrollo provocada por JSF</title><content type='html'>Típicamente se define &lt;a href="https://facelets.dev.java.net/"&gt;Facelets&lt;/a&gt; como un sistema de plantillas para JSF al estilo de Tapestry para Struts, pero en realidad la definición se queda pobre y, desde mi punto de vista, no es representativa de sus características más importantes. En este artículo expondré por qué es tan importante y daré las suficientes razones como para que nadie que desarrolle JSF se resista a usarlo.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;JSF: La crisis diseño/desarrollo&lt;/h4&gt;JSF tiene muchas ventajas para el desarrollo de aplicaciones web, especialmente para las aplicaciones ricas tipo RIA que tengan necesidades de presentación de datos de forma interactivas, ya que nos permite ver las aplicaciones como "formularios" y "componentes" al estilo de las aplicaciones de escritorio y nos oculta todo el engorro de bajo nivel web (POST, GET, trabajo con objetos del contenedor de Servlet directamente, etc,..). Sin embargo, el modelo de desarrollo de JSF requiere un cambio conceptual en los equipos de desarrollo que en algunas ocasiones es duro:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Los desarrolladores que están acostumbrados a una programación lineal tipo scripting (JSP/JSTL, PHP, ASP, etc...) se encuentran ahora con un modelo de componentes con su "ciclo de vida" específico: un elemento &lt;i&gt;bajo&lt;/i&gt; otro no necesariamente se interpreta/ejecuta &lt;i&gt;después&lt;/i&gt; de otro.&lt;/li&gt;&lt;li&gt;La forma de trabajar clásica era partir de un diseño realizado y "hacerlo dinámico" o al revés, el equipo de diseño/desarrollo toma la aplicación "fea" de desarrolladores y le aplica el diseño. Con JSF esta forma de trabajar es muy complicada y frustrante:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Para aplicar diseño a los componentes hay que &lt;i&gt;conocer&lt;/i&gt; los componentes y el modelo de trabajo, así que los diseñadores/maquetadores se encuentran con su pequeño infierno teniendo que pegarse con "cosas de los desarrolladores" que desconocen.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Partir de un diseño y aplicar componentes es igual de frustrante y de poco exitoso. Y justo al igual que en el otro caso, la mayoría de los desarrolladores pierden mucho tiempo en intentar "pegarse" con CSS y "cosas de los maquetadores" que desconocen. Mantener la maquetación y composición que han realizado los diseñadores se convierte en un infierno.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Los controles de layout (panels, tabs, boxes, etc...) son un dolor de cabeza para los maquetadores/diseñadores que se ven obligados a aprender las técnicas de skinning de cada librería de componentes y se encuentran con que es imposible aplicar sus diseños correctamente&lt;/li&gt;&lt;li&gt;Con JSP/JSTL se puede utilizar la reutilización de presentación vía Custom Tag Files y/o includes... pero hacer componentes con JSF es es un verdadero engorro y los f:subviews son imprácticos en la mayoría de los casos.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;En definitiva, el ahorro de tiempo en y las ventajas en robustez y legibilidad de la aplicación no acaban de compensar el mayor coste de desarrollo y la inconveniencia de dos equipos de trabajo que han empezado a trabajar incómodos y descoordinados. Así que el uso de JSF parece que se relega a aplicaciones donde el diseño tenga poco peso e importancia, o al menos en favor de la interactividad y la riqueza de la experiencia de usuario, es decir: intranets o aplicaciones de gestión/administración de sistemas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Facelets al rescate&lt;br /&gt;&lt;/h4&gt;Desde luego, las aplicaciones donde JSF presta todas sus ventajas son aquellas en las que no es necesario un diseño previo. Para este tipo de aplicaciones el desarrollador puede usar las librerías de componentes existentes para crear interfaces muy usables, funcionales y con un aspecto realmente espectacular para un en entorno web, sin tareas de maquetación y/o diseño adicionales.&lt;br /&gt;&lt;br /&gt;Sin embargo hay proyectos en los que se opta por una tecnología más tradicional, como JSTL, para que los desarrolladores, pero especialmente los diseñadores/maquetadores tengan total libertad en el aspecto final de la interfaz, sacrificando las ventajas de la programación con JSF y sus útiles componentes.&lt;br /&gt;&lt;br /&gt;Sin embargo, Facelets puede ofrecernos esa libertad sin renunciar a trabajar con un modelo MVC como JSF:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Las páginas con facelets son XHTML, tal cual. Los diseñadores/maquetadores se sentirán tan cómodos como con una página JSTL/JSP, y las herramientas de diseño podrán interpretarlas como HTML que son.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Se puede poner texto, tags HTML y expresiones EL en cualquier parte de la página y Facelets las evaluará correctamente: se acabó tener que usar los engorrosos &lt;code&gt;h:outputText&lt;/code&gt; o &lt;code&gt;f:verbatim&lt;/code&gt; sólo para poner una propiedad de un bean o un tag HTML. Esto te permite, por ejemplo, que sean los diseñadores/maquetadores los que establezcan el layout de los componentes y su aspecto, y así evitar tener que usar componentes para alinear dos campos o centrar un texto.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Te permite trabajar "al estilo JSTL", es decir, como usando JSP con tags: lo que&amp;nbsp; ponemos&lt;i&gt; "debajo de"&lt;/i&gt; se interpretará &lt;i&gt;"después de"&lt;/i&gt;. Esto es así porque aunque con Facelets se produce un árbol de componentes (no un servlet como con JSP), el árbol de componentes es coherente con el ciclo de vida de JSF. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;En definitiva, Facelets te permite trabajar con JSF de una forma más natural, y la curva de aprendizaje para desarrolladores que no hayan trabajado con JSF es mucho más liviana. Con Facelets podemos volver a conciliar la crisis de los equipos de trabajo en los proyectos web, ya que la forma de trabajo vuelve a ser más amistosa con los diseñadores y el modelo de componentes "encaja" de nuevo con una visión orientada a documentos desde el punto de vista del diseño.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Aún hay más&lt;br /&gt;&lt;/h4&gt;Desde mi punto de vista y en el mundo de desarrollo en el que me muevo, las características comentadas son las más importantes de Facelets, y sólo por ello, ya merecería la pena usarlo. No obstante, Facelets es una tecnología de &lt;i&gt;"Vista"&lt;/i&gt; específicamente diseñada para JSF, así que nos depara muchas gratas sorpresas funcionales extremadamente interesantes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Plantillas. &lt;/b&gt;Facelets es un sistema de plantillas con JSF en mente, lo que nos permite acelerar el desarrollo enormemente con la misma facilidad y enfoque con el que se puede considerar a JSP un sistema de plantillas para servlets (el cuerpo de una JSP acaba siendo el método  &lt;code&gt;jspService()&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Desarrollo cero para componentes&lt;/b&gt;. Hacer un componente JSF (o "componentizar" un trozo de una página) es tan simple como extraerlo en un fichero aparte. Facelets es a los componentes JSF lo que fueron los Custom Tag Files a JSP 2.0. Una maravilla.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Informes de errores precisos&lt;/b&gt;. El tiempo que tarda un desarrollador JSF en interpretar los ininteligibles mensajes de error es indirectamente proporcional a sus "horas de vuelo". Los mensajes de error nunca indican en qué componente, y menos aún en qué línea se ha producido. Es un proceso de &lt;i&gt;adivinación&lt;/i&gt; a base de leer las decenas de líneas del Stack trace. Con Facelets tenemos por fin errores precisos sobre la línea, tag y atributo donde se ha producido. Otra de ésas razones por las que merecería la pena usarlo, aunque fuese la única.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;Conclusiones&lt;/h4&gt;Facelets se debe añadir por defecto a cualquier proyecto JSF, aunque no se vayan a hacer componentes ni plantillas. Usar HTML y tener errores informados son razones suficientes para incorporarlo siempre. De hecho se añadirá al estándar en &lt;a href="http://jcp.org/aboutJava/communityprocess/edr/jsr314/index.html"&gt;JSF 2.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Más información:&lt;br /&gt;&lt;a href="https://facelets.dev.java.net/"&gt;https://facelets.dev.java.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.java.net/bin/view/Projects/Facelets"&gt;http://wiki.java.net/bin/view/Projects/Facelets&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-facelets/"&gt;http://www.ibm.com/developerworks/java/library/j-facelets/&lt;/a&gt;&lt;br /&gt;&lt;a href="https://facelets.dev.java.net/nonav/docs/dev/docbook.html"&gt;https://facelets.dev.java.net/nonav/docs/dev/docbook.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-8639068361415009090?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/8639068361415009090/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/03/facelets-el-fin-de-la-crisis.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8639068361415009090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/8639068361415009090'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/03/facelets-el-fin-de-la-crisis.html' title='Facelets: el fin de la crisis diseño/desarrollo provocada por JSF'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-1721335563238590848</id><published>2009-03-17T22:04:00.003+01:00</published><updated>2009-07-27T14:04:41.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>Banco de experiencias (I): JSF con Apache Myfaces Trinidad</title><content type='html'>&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;a href="http://myfaces.apache.org/trinidad/index.html"&gt;Apache Myfaces Trinidad&lt;/a&gt;&lt;/b&gt;&lt;/span&gt; es uno de los frameworks JSF open source más completos y&amp;nbsp; sólidos actualmente. Son el resultado y la evolución de la donación de Oracle ADF Faces por parte de Oracle a la &lt;a href="http://www.apache.org/"&gt;ASF&lt;/a&gt;. Es el más completo, estable y probado de &lt;a href="http://myfaces.apache.org/"&gt;los 3 de Apache&lt;/a&gt;, con una solidez demostrada con el paso de los años (es tan antiguo que usaba Ajax antes de lo llamaran Ajax, sino &lt;a href="http://myfaces.apache.org/trinidad/devguide/ppr.html"&gt;PPR -Partial Page Rendering-&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Por su envergadura y características, está en el grupo de "los grandes": frameworks multipropósito con enorme catálogo de componentes y características avanzadas (Ajax, templating, skinning, etc...). Otras compañeras de grupo de élite de frameworks/librería de componentes JSF son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strike&gt;&lt;a href="https://woodstock.dev.java.net/index.html"&gt;Woodstock&lt;/a&gt;&lt;/strike&gt; (abandonado por Sun en favor de ICEfaces... uno menos)&lt;/li&gt;&lt;li&gt; &lt;b&gt;&lt;a href="http://www.icefaces.org/"&gt;ICEfaces&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.oracle.com/technology/products/adf/adffaces/index.html"&gt;Oracle ADF Faces RC&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.jboss.org/jbossrichfaces/"&gt;JBoss RichFaces&lt;/a&gt;&lt;/b&gt; (ex ajax4jsf)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Como ventajas importantes de Trinidad destacaría:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Es compatible con otras librerías de componentes, como &lt;a href="http://myfaces.apache.org/tomahawk/index.html"&gt;Tomahawk&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Se integra perfectamente con &lt;b&gt;&lt;a href="https://facelets.dev.java.net/"&gt;Facelets&lt;/a&gt;&lt;/b&gt; (de hecho, no sólo son un tándem perfecto, sino que no concibo JSF sin Facelets)&lt;/li&gt;&lt;li&gt;Tiene decenas de componentes y te permite hacer una aplicación "rica" de una forma cómoda. A destacar el &lt;a href="http://myfaces.apache.org/trinidad/trinidad-api/tagdoc/tr_table.html"&gt;tr:table&lt;/a&gt;. Sólo por ese componente merece la pena usarlo. Si tienes que presentar tablas de información interactivas, es la mejor forma.&lt;/li&gt;&lt;li&gt;Ha demostrado funcionar razonablemente bien en aplicaciones de producción y tiene un desarrollo y evolución constante.&lt;/li&gt;&lt;/ul&gt;Eso sí, Trinidad adolece de inconvenientes propios además de los comunes a este tipo de frameworks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La documentación deja bastante que desear&lt;/li&gt;&lt;li&gt;Para que tenga un aspecto decente hay que prepararle un skin o, directamente usar los componentes de Oracle ADF Faces, que ya traen uno impecable.&lt;/li&gt;&lt;/ul&gt;En definitiva, a falta de probar en condiciones ICEfaces, es una estupenda alternativa en los siguientes casos: &lt;br /&gt;&lt;ol&gt;&lt;li&gt;Aplicación extranet tipo RIA (o al menos necesidad de "rich controls") y pilotamos de CSS o tenemos alguien en el equipo que pilota. En cualquier caso procura evitar los controles de layout (panels, tablas, etc...)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Aplicación intranet RIA. Si no tenemos a maquetadores web en el equipo y te gusta el skin por defecto de Oracle, puedes usar directamente la implementación de Oracle.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Hay una interesante tabla comparativa de las distintas liberías de componentes en &lt;a href="http://www.jsfmatrix.net/"&gt;http://www.jsfmatrix.net&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-1721335563238590848?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/1721335563238590848/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/03/banco-de-experiencias-i-apache-myfaces.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/1721335563238590848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/1721335563238590848'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/03/banco-de-experiencias-i-apache-myfaces.html' title='Banco de experiencias (I): JSF con Apache Myfaces Trinidad'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-4664583647979209047</id><published>2009-03-16T00:42:00.003+01:00</published><updated>2010-10-21T21:31:54.741+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desarrollo'/><category scheme='http://www.blogger.com/atom/ns#' term='experiencias'/><title type='text'>Banco de experiencias (introducción)</title><content type='html'>Con este título, "Banco de experiencias", iré realizando (eso intentaré al menos, aunque aún no sé con qué frecuencia) aportaciones de mis experiencias en situaciones reales (no en laboratorio) y/o de sistemas en producción, probados en el mundo real.&lt;br /&gt;&lt;br /&gt;Uso "banco de experiencias" como paráfrasis contrapuesta a "banco de pruebas", ya que ésto último, las pruebas, son el pan de cada día y sufrimiento diario de todos los arquitectos y desarrolladores de software. Y es que, a pesar de la cantidad de horas de desarrollo y buenas prácticas que tengamos encima, siempre tenemos la sensación de estar frente a algo nuevo. Y en realidad no es una sensación. Es la realidad. No hay dos sistemas iguales: siempre tienes que integrar con algo nuevo, siempre te encuentras que, cuando vas a hacer la instalación en producción resulta que el cliente no te había contado algo o que, simplemente, ni se te pasó por la cabeza y aparece algún elemento "metiendo ruido" como sacado de una chistera de repente.&lt;br /&gt;&lt;br /&gt;El problema de la ingeniería del software, y del desarrollo, es que no se trabaja con &lt;i&gt;materiales&lt;/i&gt; precisos, ni tenemos formas de medir objetivamente parámetros y tolerancias de los sistemas que nos permitan asegurar un mínimo de calidad. Además, contruimos sistemas "&lt;i&gt;sobre&lt;/i&gt;" y/o "&lt;i&gt;cooperativos&lt;/i&gt;" (sic) con otros (sean hardware o software) de los que no podemos tener mínimas garantías (y así lo podemos encontrar de forma expresa en las licencias de software privativo), con lo que no podemos garantizar tampoco el que construimos nosotros (suponiendo que pudiésemos).&lt;br /&gt;&lt;br /&gt;Así, la "alta disponibilidad" se consigue, no garantizando sistemas que no fallen, sino garantizando que, cuando fallen (que lo harán) habrá otro sistema para ocupar su lugar. Un concepto éste, el de la "redundancia", ampliamente usado por los distintos generales de infantería de todos los ejércitos durante la historia. Ojalá pudiésemos implementar "alta disponibilidad" en el cuerpo humano a base de redundar el corazón, el cerebro...&lt;br /&gt;&lt;br /&gt;En el mundo JEE, por ejemplo, me he encontrado muchas veces que una aplicación construida por nosotros tiene una falla inexplicable. Tras muchas pruebas y averiguaciones nos encontramos con un bug del servidor de aplicaciones o de la JVM...Los indicadores de ese tipo de fallos, así como los de los nuestros propios, y las soluciones aportadas nos van generando un conocimiento empírico, procedimental, que sedimenta formando lo que algunos llaman &lt;i&gt;"expertise"&lt;/i&gt; o sabiduría. &lt;span id="comment-4"&gt;&lt;span id="cid-875903"&gt;Por eso, los fallos que suele tener un programador novato no suelen ser los mismos que un programador experimentado. Los desarrolladores experimentados, como decía unamuno, comienzan a dar en el clavo porque han dado ya muchas veces en la herradura. Y digo bien: "experimentado". No todos los desarrolladores experimentados son expertos.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Dijo Aldous Huxley, que &lt;i&gt;"La experiencia no es lo que te sucede, sino lo que haces con lo que te sucede"&lt;/i&gt;. Y es cierto que hay unos pocos experimentados que &lt;span id="comment-4"&gt;&lt;span id="cid-875903"&gt;acaban convirtiendo el error en experiencia, y son capaces de mezclar la experiencia propia y la ajena con su propia intuición creativa: ésos son los expertos (algún día tendré que hablar largo y tendido sobre el tremendo componente creativo que tiene el desarrollo de software, a pesar de lo que muchos puedan pensar).&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span id="comment-4"&gt;&lt;span id="cid-875903"&gt;La ventaja del mundo del software frente a nuestra vida cotidiana es que en lo que respecta al primero sí podemos aprovecharnos y aprender de la experiencia ajena: no hace falta que suframos el mismo problema que otro durante 20h hasta encontrar la solución, podemos ahorrarnos 19,5h si el otro nos cuenta su experiencia y nosotros la recordamos en ese momento. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="comment-4"&gt;&lt;span id="cid-875903"&gt;De hecho, los &lt;a href="http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o"&gt;patrones de diseño&lt;/a&gt; (una de las herramientas imprescindibles de cualquier desarrollador) no son más que un catálogo de experiencias resumidas: los problemas y sus soluciones aplicadas y comprobadas.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hasta ahora he sido un usuario "pasivo" de esto de la blogocosa.... Pero creo que me toca ahora agradecer la generosidad de otros uniéndome a ellos, participando, compartiendo y aportando &lt;i&gt;"my two cents"&lt;/i&gt; al acceso del conocimiento común y de la experiencia colectiva a través de mis propias experiencias y así, asumir mis propias disfunciones metacognitivas (gracias, Sr. Galli, por el magnífico &lt;a href="http://mnm.uib.es/gallir/posts/2005/09/28/444/"&gt;artículo&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class="q"&gt;&lt;div class="a"&gt;&lt;i&gt;"Sólo una cosa es más dolorosa que aprender de la experiencia, y es, no aprender de la experiencia"&lt;/i&gt;&lt;span style="font-size: x-small;"&gt; (Laurence Johnston Peter, 1919-1990, Profesor y escritor canadiense)&lt;/span&gt;.  &lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-4664583647979209047?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/4664583647979209047/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/03/banco-de-experiencias-introduccion.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4664583647979209047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/4664583647979209047'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/03/banco-de-experiencias-introduccion.html' title='Banco de experiencias (introducción)'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1763183641342103044.post-5008518818476351868</id><published>2009-03-06T14:30:00.029+01:00</published><updated>2009-07-27T14:04:41.880+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='jsf'/><title type='text'>UIXCollection$Transient cannot be cast to [Ljava.lang.Object; SOLUCIONADO</title><content type='html'>Llevo dos días perdidos con ese error. Al final he conseguido resolver el enigma. El contexto es el siguiente:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Aplicación JSF usando MyFaces Trinidad (ocurre tanto con trinidad 1.2.10 como con 1.2.11)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Servidor Glassfish v2.1&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Una página (jspx) con una tabla (&lt;code&gt;tr:table&lt;/code&gt;) presentando datos. Desde esa página (la primera petición funciona) realizo lo siguiente:&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;pulso en cualquier &lt;span style="font-style: italic;"&gt;command&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;link&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;pulsar botón atrás del navegador (volvemos a la página con la tabla)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;pulso en cualquier otro &lt;span style="font-style: italic;"&gt;command &lt;/span&gt;o &lt;span style="font-style: italic;"&gt;link&lt;/span&gt; de la página ==&amp;gt; crash&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;El log del servidor es inservible a efectos de descubrir la razón del problema:&lt;br /&gt;&lt;br /&gt;&lt;textarea cols="100" name="error" readonly="readonly" rows="15" style="font-family: monospace;" wrap="hard"&gt;GRAVE: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception java.lang.ClassCastException: org.apache.myfaces.trinidad.component.UIXCollection$Transient cannot be cast to [Ljava.lang.Object; at org.apache.myfaces.trinidad.component.StampState.restoreChildStampState(StampState.java:204) at org.apache.myfaces.trinidad.component.UIXTable.restoreStampState(UIXTable.java:426)&amp;lt;br /&amp;gt; at org.apache.myfaces.trinidad.component.UIXCollection._restoreStampState(UIXCollection.java:1336) at org.apache.myfaces.trinidad.component.UIXCollection.postRowDataChange(UIXCollection.java:745) at org.apache.myfaces.trinidad.component.UIXCollection.setRowIndex(UIXCollection.java:441) at org.apache.myfaces.trinidad.component.UIXTable._processStamps(UIXTable.java:517) at org.apache.myfaces.trinidad.component.UIXTable.processFacetsAndChildren(UIXTable.java:374) at org.apache.myfaces.trinidad.component.UIXCollection.decodeChildrenImpl(UIXCollection.java:196) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXCollection.processDecodes(UIXCollection.java:190) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildrenImpl(UIXComponentBase.java:988) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXComponentBase.processDecodes(UIXComponentBase.java:799) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildrenImpl(UIXComponentBase.java:988) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXComponentBase.processDecodes(UIXComponentBase.java:799) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildrenImpl(UIXComponentBase.java:988) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXComponentBase.processDecodes(UIXComponentBase.java:799) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildrenImpl(UIXComponentBase.java:988) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXComponentBase.processDecodes(UIXComponentBase.java:799) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildrenImpl(UIXComponentBase.java:988) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXComponentBase.processDecodes(UIXComponentBase.java:799) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildrenImpl(UIXComponentBase.java:988) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXComponentBase.processDecodes(UIXComponentBase.java:799) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildrenImpl(UIXComponentBase.java:988) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXForm.processDecodes(UIXForm.java:75) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildrenImpl(UIXComponentBase.java:988) at org.apache.myfaces.trinidad.component.UIXComponentBase.decodeChildren(UIXComponentBase.java:974) at org.apache.myfaces.trinidad.component.UIXComponentBase.processDecodes(UIXComponentBase.java:799) at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1001) at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:493) at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at cestel.tk.uf.filter.SessionExpireFilter.doFilter(SessionExpireFilter.java:99) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:271) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Buscando en google encontré &lt;a href="https://issues.apache.org/jira/browse/TRINIDAD-1025?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&amp;amp;focusedCommentId=12587140#action_12587140" target="_blank"&gt;esto&lt;/a&gt; que me dió la pista y probé a borrar el comentario  que tenía inmediatamente después del &lt;span style="font-family: monospace;"&gt;&amp;lt;&lt;/span&gt;&lt;samp&gt;tr:table&amp;gt;&lt;/samp&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;y... ¡ bingo !.&lt;br /&gt;Era eso. El error sigue estando en páginas jspx incluso en versiones muy posteriores a las comentadas, así que se ve que no está solucionado (aún).&lt;br /&gt;&lt;br /&gt;En definitiva: &lt;span style="font-weight: bold;"&gt;no pongas comentarios dentro de un &lt;code&gt;tr:table&lt;/code&gt;&lt;/span&gt;.&lt;br /&gt;Espero que este post sirva para ahorrar tiempo a algún otro sufridor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1763183641342103044-5008518818476351868?l=balteus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://balteus.blogspot.com/feeds/5008518818476351868/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://balteus.blogspot.com/2009/03/javaxservletservletexception.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/5008518818476351868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1763183641342103044/posts/default/5008518818476351868'/><link rel='alternate' type='text/html' href='http://balteus.blogspot.com/2009/03/javaxservletservletexception.html' title='UIXCollection$Transient cannot be cast to [Ljava.lang.Object; SOLUCIONADO'/><author><name>Samuel Zarza Fernández</name><uri>https://profiles.google.com/100086431194214967216</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-Jyqrqsz2JMs/AAAAAAAAAAI/AAAAAAAABHc/kfWtLxyEU3w/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
