<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;A04MRHY_eip7ImA9WhRbEU0.&quot;"><id>tag:blogger.com,1999:blog-8397660</id><updated>2012-02-01T16:26:25.842+01:00</updated><category term="juegos" /><category term="acceso" /><category term="opencms" /><category term="JPA" /><category term="submit dinamico struts2" /><category term="jdbc" /><category term="exceeded" /><category term="directorio usuario" /><category term="Calendar" /><category term="bb.dd." /><category term="seguridad" /><category term="Date" /><category term="glassfish" /><category term="JDBCRealm" /><category term="tomcat" /><category term="calidad software" /><category term="Duke Nukem Forever" /><category term="Shooter" /><category term="tomcat6" /><category term="realm" /><category term="ConversionException" /><category term="entero" /><category term="s:if" /><category term="Estrategia" /><category term="windows" /><category term="valve" /><category term="antipatron" /><category term="diseño" /><category term="Android" /><category term="BeanUtils" /><category term="toplink" /><category term="catalina.properties" /><category term="ibatis" /><category term="linux" /><category term="facebook" /><category term="resultmap" /><category term="java" /><category term="mysql" /><category term="login" /><category term="double" /><category term="Eclipse paquete error" /><category term="join" /><category term="oracle" /><category term="0 A.D." /><category term="myisam" /><category term="redondeo" /><category term="struts" /><category term="FPS" /><category term="sql" /><category term="innodb" /><category term="persistencia" /><category term="steam" /><category term="error" /><category term="timeout" /><category term="base de datos" /><category term="doble" /><title>FiTe. El dedo en el ojo.</title><subtitle type="html">FiTe. Finger in the eye.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Fite" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="fite" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">Fite</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;D0YBSH45fyp7ImA9WhdUE0U.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-1282354369013050200</id><published>2011-09-30T14:19:00.000+02:00</published><updated>2011-09-30T14:19:19.027+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-30T14:19:19.027+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="calidad software" /><title>Review del libro La calidad del software y su medida</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--5_S5kmPOq0/ToWwgxdWXqI/AAAAAAAAB34/mV13C2FtuSQ/s1600/calidadcodigo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="157" src="http://1.bp.blogspot.com/--5_S5kmPOq0/ToWwgxdWXqI/AAAAAAAAB34/mV13C2FtuSQ/s320/calidadcodigo.jpg" width="113" /&gt;&lt;/a&gt;&lt;/div&gt;El &lt;a href="http://www.casadellibro.com/libro-la-calidad-del-software-y-su-medida/932655/2900000951965"&gt;libro&lt;/a&gt; hace un repaso sobre cómo fueron los primeros intentos de medir la calidad en los productos, y se va introduciendo en cómo se comenzó a aplicar los conocimientos adquiridos en los procesos de fabricación tradicionales en el desarrollo del software.&lt;br /&gt;
&lt;br /&gt;
Aunque me parece bien estructurado, no creo que me aporte ningún conocimiento sobre cómo mejorar la calidad de mis desarrollos. Más bien me ha servido para reafirmarme en mis "teorías" sobre cómo cuidar los desarrollos que hago y procurar que estos lleguen a buen puerto en las mejores condiciones posibles.&lt;br /&gt;
&lt;br /&gt;
Me ha reafirmado en que las metodologías ágiles posiblemente no sean ninguna panacea, pero hoy por hoy, son las únicas que mediante su aplicación pueden ofrecer resultados más que satisfactorios.&lt;br /&gt;
&lt;br /&gt;
Se trata mucho en el libro de fórmulas y aplicaciones matemáticas sobre procesos de construcción del software, pero en ningún momento se tiene en cuenta al "engranaje" principal en un desarrollo... el programador.&lt;br /&gt;
&lt;br /&gt;
Resulta que el programador es una persona, y como tal, no se la puede medir ni aplicar fórmulas a base de constantes y número de miles de líneas que, teóricamente, tendrá la aplicación a desarrollar. Las metodologías ágiles saben muy bien que es la persona la que importa realmente en un desarrollo y por eso hacen girar todo en torno a ellas.&lt;br /&gt;
&lt;br /&gt;
En definitiva, creo que está bien para tener un conocimiento histórico sobre la calidad y cómo a lo largo del tiempo se ha intentado medir, pero no creo que, actualmente, aporte soluciones para aplicar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-1282354369013050200?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/QMAKfBUT878" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/1282354369013050200/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=1282354369013050200" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/1282354369013050200?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/1282354369013050200?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/09/review-del-libro-la-calidad-del.html" title="Review del libro La calidad del software y su medida" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/--5_S5kmPOq0/ToWwgxdWXqI/AAAAAAAAB34/mV13C2FtuSQ/s72-c/calidadcodigo.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A08CRXY6eyp7ImA9WhdUE0o.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-362165618221173736</id><published>2011-09-30T12:49:00.001+02:00</published><updated>2011-09-30T12:51:04.813+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-30T12:51:04.813+02:00</app:edited><title>Módulo de login personalizado para Tomcat (II)</title><content type="html">Hola de nuevo a todos.&lt;br /&gt;
&lt;br /&gt;
En una de nuestras entradas del año 2009 (&lt;a href="http://finger-in-the-eye.blogspot.com/2009/11/modulo-de-login-personalizado-para.html"&gt;Módulo de login personalizado para Tomcat&lt;/a&gt;), comentábamos cómo modificar el modo de autenticar y autorizar a nuestros usuarios en aplicaciones para &lt;b&gt;Tomcat&lt;/b&gt;, para adaptarlo a nuestras necesidades concretas.&lt;br /&gt;
&lt;br /&gt;
Si leéis dicha entrada, veréis que lo último que teníamos que hacer es crear un archivo de configuración (&lt;b&gt;jaas.config&lt;/b&gt;) e indicar la ubicación de dicho archivo, pasándola como parámetro a la máquina virtual&lt;br /&gt;
(por ejemplo:&amp;nbsp;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19px;"&gt;-Djava.security.auth.login.config=C:"/jaas.config"&lt;/span&gt;).&lt;br /&gt;
&lt;br /&gt;
Este parámetro se incluiría en el archivo catalina.bat o catalina.sh, dependiendo del sistema operativo.&lt;br /&gt;
&lt;br /&gt;
El problema es que a veces es complicado manejar este archivo de configuración, sobre todo en sistemas en producción, ya que se requieren permisos, reiniciar el servidor, etc...&lt;br /&gt;
&lt;br /&gt;
Bien, pues existe un modo de saltarse estos problemas con el archivo de configuración. Básicamente, lo que tenemos que hacer es:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Añadir un &lt;u&gt;context listener&lt;/u&gt; (o usar uno que ya exista).&lt;/li&gt;
&lt;li&gt;Incluir el archivo "&lt;i&gt;jaas.config&lt;/i&gt;" en el mismo paquete que el &lt;i&gt;context listener&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Obtener la ruta física del archivo en el despliegue de la aplicación. Esto se hace recuperando el archivo empaquetado como un recurso de la clase, y pasando el &lt;b&gt;URI &lt;/b&gt;del recurso al constructor de un objecto &lt;b&gt;File&lt;/b&gt;. Finalmente, la ruta física del archivo se obtiene mediante el método &lt;b&gt;getAbsolutePath()&lt;/b&gt; del objeto &lt;i&gt;File&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Pasar la ruta física del archivo como propiedad del sistema. La propiedad en concreto es "&lt;b&gt;java.security.auth.login.config&lt;/b&gt;".&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Puedo asegurar que lo he probado y funciona. Os pongo un ejemplo sencillo:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Supongamos que creamos un &lt;i&gt;context listener&lt;/i&gt; (&lt;b&gt;MyContextListener&lt;/b&gt;) el el paquete "&lt;i&gt;com.test.listeners&lt;/i&gt;".&lt;/div&gt;&lt;div&gt;Creamos o copiamos el archivo "&lt;i&gt;jaas.config&lt;/i&gt;" también en el paquete "&lt;i&gt;com.test.listeners&lt;/i&gt;".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;La clase &lt;i&gt;MyContextListener&lt;/i&gt; quedaría de esta forma:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;pre&gt;&lt;code&gt;
&lt;div&gt;&lt;div&gt;package com.test.listeners;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;import java.io.File;&lt;/div&gt;&lt;div&gt;import java.util.logging.Level;&lt;/div&gt;&lt;div&gt;import java.util.logging.Logger;&lt;/div&gt;&lt;div&gt;import javax.servlet.ServletContextEvent;&lt;/div&gt;&lt;div&gt;import javax.servlet.ServletContextListener;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;/**&lt;/div&gt;&lt;div&gt;&amp;nbsp;* Web application lifecycle listener.&lt;/div&gt;&lt;div&gt;&amp;nbsp;* @author pedrop&lt;/div&gt;&lt;div&gt;&amp;nbsp;*/&lt;/div&gt;&lt;div&gt;public class MyContextListener implements ServletContextListener {&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; public void contextInitialized(ServletContextEvent sce) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; File jaasConfigFile = null;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; jaasConfigFile = new File(getClass().getResource("jaas.config").toURI());&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.setProperty("java.security.auth.login.config", jaasConfigFile.getAbsolutePath());&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } catch (Exception e) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Logger.getLogger(MyContextListener.class.getName()).log(Level.SEVERE, null, e);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; public void contextDestroyed(ServletContextEvent sce) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;Por si a alguien le interesa, existe otra solución en la que no es necesario usar un archivo "&lt;i&gt;jaas.config&lt;/i&gt;". Para dar alguna pista, os diré que requiere extender el objeto &lt;b&gt;LoginContext&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-362165618221173736?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/klxTLwL0nWo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/362165618221173736/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=362165618221173736" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/362165618221173736?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/362165618221173736?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/09/modulo-de-login-personalizado-para.html" title="Módulo de login personalizado para Tomcat (II)" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CkUBRXY-fip7ImA9WhdQFEQ.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-2314698001071514425</id><published>2011-08-16T12:24:00.000+02:00</published><updated>2011-08-16T12:24:14.856+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T12:24:14.856+02:00</app:edited><title>Cómo eliminar definitivamente una cuenta en facebook (actualización)</title><content type="html">En un post del año 2010 ("&lt;a href="http://finger-in-the-eye.blogspot.com/2010/04/como-eliminar-definitivamente-una.html"&gt;Cómo eliminar definitivamente una cuenta en facebook&lt;/a&gt;") explicábamos como darse de baja en Facebook (no confundir con desactivar la cuenta).&lt;br /&gt;
&lt;br /&gt;
En dicho post se indicaba una url que -previamente logueados en Facebook- nos permitía borrar la cuenta.&lt;br /&gt;
&lt;br /&gt;
Esa url ha cambiado (y probablemente volverá a cambiar). La nueva url es la siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://ssl.facebook.com/help/contact.php?show_form=delete_account"&gt;https://ssl.facebook.com/help/contact.php?show_form=delete_account&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Espero que os sea útil.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-2314698001071514425?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/3ItePCPmo6s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/2314698001071514425/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=2314698001071514425" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/2314698001071514425?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/2314698001071514425?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/08/como-eliminar-definitivamente-una.html" title="Cómo eliminar definitivamente una cuenta en facebook (actualización)" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Dk4MSX44fCp7ImA9WhdRFE0.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-843009447897922828</id><published>2011-08-03T22:56:00.000+02:00</published><updated>2011-08-03T22:56:28.034+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-03T22:56:28.034+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="directorio usuario" /><category scheme="http://www.blogger.com/atom/ns#" term="tomcat" /><title>Directorios de usuario en Tomcat</title><content type="html">Los conozco desde hace ya tiempo, pero nunca tuve la necesidad de usarlos. Estoy hablando de una funcionalidad que los servidores web tienen y consiste en hacer "visible", a través de un navegador Web, el contenido de un directorio de usuario del sistema.&lt;br /&gt;
&lt;br /&gt;
Esta configuración se hace a nivel del elemento &lt;i&gt;host &lt;/i&gt;del fichero &lt;i&gt;server.xml&lt;/i&gt;, por lo que la configuración aplica para todo el servidor. En este fichero se añade una de las siguientes configuraciones:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;Listener className="org.apache.catalina.startup.UserConfig"
    directoryName="public_html"
    userClass="org.apache.catalina.startup.PasswdUserDatabase" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
El atributo &lt;b&gt;className&lt;/b&gt; deber&amp;iacute;a ser &lt;b&gt;org.apache.catalina.startup.UserConfig&lt;/b&gt; y el atributo &lt;b&gt;userClass&lt;/b&gt;, una de las clases que Tomcat tiene de asignación.&lt;br /&gt;
&lt;br /&gt;
Si usamos un sistema Linux y se dispone de un archivo estándar &lt;i&gt;/etc/passwd&lt;/i&gt; legible por la cuenta que ejecuta Tomcat, y ese archivo especifíca el directorio de inicio del usuario, se puede utilizar la clase &lt;b&gt;PasswdUserDatabase&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Se puede cambiar el nombre del directorio (atributo &lt;b&gt;directoryName&lt;/b&gt;) por cualquier otro, pero entonces el nombre del directorio debe ser el mismo para todos los usuarios dentro del mismo servidor.&lt;br /&gt;
&lt;br /&gt;
También podemos establecer un directorio base del que colgarán el resto de directorios de usuario. Esto es muy útil para entornos que usan sistemas operativos Windows (donde seguramente colgar&amp;aacute;n de &lt;i&gt;c:\home&lt;/i&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;Listener className="org.apache.catalina.startup.UserConfig"
    directoryName="public_html"
    homeBase="/home"
    serClass="org.apache.catalina.startup.HomesUserDatabase" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Una vez arrancado el servidor, deberíamos poder acceder al directorio de los usuarios definidos en el sistema a través de la url:&lt;br /&gt;
&lt;br /&gt;
http://nombre_servidor/~nombre_usuario&lt;br /&gt;
&lt;br /&gt;
Más información en el libro&lt;a href="http://www.amazon.com/Tomcat-6-0-definitiva-Definitive-Spanish/dp/8441524319/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1312403514&amp;amp;sr=1-1"&gt; Tomcat 6.0 La guía definitiva&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-843009447897922828?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/6wvhcwk_f4I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/843009447897922828/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=843009447897922828" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/843009447897922828?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/843009447897922828?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/08/directorios-de-usuario-en-tomcat.html" title="Directorios de usuario en Tomcat" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ak4ASH09cCp7ImA9WhdSGEg.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-6204696400569959825</id><published>2011-07-28T15:15:00.000+02:00</published><updated>2011-07-28T15:15:49.368+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-28T15:15:49.368+02:00</app:edited><title>Los cánceres de la profesión de informático</title><content type="html">Llevo trabajando como informático unos 14 años... De hecho, no sólo trabajo de informático, sino que soy informático, cosa que no todos mis compañeros pueden decir.&lt;br /&gt;
&lt;br /&gt;
Durante todo este tiempo he podido darme cuenta que nuestra profesión no está muy bien valorada ahí fuera. Siempre tenemos una mala fama, que por desgracia, en muchos casos está justificada. Sólo tenemos que ver qué aplicaciones (empresariales) usamos y los problemas que estas tienen.&lt;br /&gt;
&lt;br /&gt;
Si me pongo a pensar en los motivos me vienen a la mente una serie de estereotipos que he podido ver cómo se repetían a lo largo de mi experiencia en los clientes por donde he pasado. Y creo que podría enumerarlos:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="font-size: large;"&gt;Gollum&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Es el programador que, muy corto en conocimientos y más aún en ganas de adquirirlos, se aferra a un conocimiento del negocio para hacer que su presencia en el equipo sea imprescindible.&lt;br /&gt;
Son personajes poco sociables y nada dados a trabajar en equipo, ya que esto último provocaría que su conocimiento se repartiese en este, cosa que vaciaría totalmente el sentido de su vida.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Valdanito&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Gente que a base de palabros técnicos mezclados sabiamente con anglicismos bien administrados, es capaz de convencer al jefe que puede hacer funcionar un Windows'95 en su calculadora.&lt;br /&gt;
Son sumamente peligrosos y muy difíciles de evitar, ya que, aunque faltos de conocimientos, los argumentos que dan cuando se les presiona no son descabellados y mezclados estos con sabiduría da la sensación de conocimiento real.&lt;br /&gt;
Suelen estar siempre paciendo junto a otro tipo de elemento también muy peligroso... el Suscriptor de PCWorld.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Suscriptor de PCWorld&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Este figura suele ser alguien con años en la empresa. Un recauchutado de otro puesto al que, no se sabe muy bien porqué, le acabaron asignando un lugar de mando (o semi-mando) en un equipo de desarrollo.&lt;br /&gt;
Esta gente suele ser muy aficionada a llevarse al baño su revista favorita (PCWorld o similar), empaparse de todo lo que allí se suelta y salir de aquel mágico lugar cagando EJBs.&lt;br /&gt;
Sip... suele querer poner en práctica cualquier cosa que haya leído, sin importar lo más mínimo la idoneidad de la idea o los conocimientos del equipo, al que compromete y hace caer en grandes faltas en las entregas del producto.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;El vegetariano&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Este suele ser una consecuencia del anterior. Un personaje que, aunque a veces es un profesional muy válido, le da por alimentarse únicamente de &lt;a href="http://es.wikipedia.org/wiki/Felaci%C3%B3n"&gt;nabos&lt;/a&gt;.&lt;br /&gt;
No importa lo desmedido del trabajo a realizar en el ridículo tiempo asignado, simplemente se limitará a su dieta y a pasar horas en la oficina tratando de llegar en fechas a la entrega del producto. Eso sí, en las tertulias cafelínas pondrá a parir a su jefe y asegurará por la gloria de su madre que no volverá a quedarse más tarde de las 6.&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;El jarrón chino&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Es un personaje que habita en la oficina. Habita porque en realidad, no hace nada más... salvo adornar y dar ambiente. Llega por las mañanas, atiende su correo, su facebook, su twitter... pasa las horas hasta las 17,30.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Es en ese momento cuando parece despertar de su letargo y comienza a mandar correos con disculpas peregrinas o solicitando cosas sin sentido. Todo esto lo adereza con un correo (desde casa) a eso de las 23 horas, en el que pone en copia hasta al portero, diciendo todo lo que (supuestamente) ha hecho.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Los auténticos jarrones chinos tienen gran mérito, ya que no ser descubierto es todo un arte.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Estos son los que yo tengo catalogados... ¿cuáles son los tuyos? &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-6204696400569959825?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/f2u1dfldu-8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/6204696400569959825/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=6204696400569959825" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/6204696400569959825?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/6204696400569959825?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/07/los-canceres-de-la-profesion-de.html" title="Los cánceres de la profesión de informático" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;CkMFRHk4fSp7ImA9WhdSE04.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-7512551520637108362</id><published>2011-07-22T11:51:00.005+02:00</published><updated>2011-07-22T12:26:55.735+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-22T12:26:55.735+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql" /><category scheme="http://www.blogger.com/atom/ns#" term="diseño" /><category scheme="http://www.blogger.com/atom/ns#" term="antipatron" /><category scheme="http://www.blogger.com/atom/ns#" term="error" /><title>Review SQL Antipatterns</title><content type="html">&lt;a href="http://1.bp.blogspot.com/-lgM0-gz-H28/TilMp5s-CcI/AAAAAAAABVg/Nt3ez9v544k/s1600/SQLPatterns.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5632117091751299522" src="http://1.bp.blogspot.com/-lgM0-gz-H28/TilMp5s-CcI/AAAAAAAABVg/Nt3ez9v544k/s320/SQLPatterns.jpg" style="cursor: pointer; float: left; height: 320px; margin: 0pt 10px 10px 0pt; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;
Hace unos días terminé de leer &lt;a href="http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557"&gt;SQL Antipatterns&lt;/a&gt;, un libro que desde ya recomiendo y que considero de imprescindible lectura.&lt;br /&gt;
&lt;br /&gt;
El &lt;a href="http://www.amazon.com/Bill-Karwin/e/B003TTPJAA/ref=ntt_athr_dp_pel_1"&gt;autor &lt;/a&gt;hace un repaso a las picias más comunes a la hora de crear los modelos de datos de las aplicaciones.&lt;br /&gt;
&lt;br /&gt;
El libro está dividido en cuatro grandes secciones: Antipatrones de diseño lógico, físico, antipatrones de consulta y lo que él llama &lt;span style="font-style: italic;"&gt;Application Development Antipatterns&lt;/span&gt; (esto es, higiene general).&lt;br /&gt;
&lt;br /&gt;
Sin duda, la parte más jugosa del libro se encuentra en los antipatrones de deseño lógico. Aquí he de reconocer que, aunque en la actualidad ya no caigo en estos &lt;strike&gt;errores&lt;/strike&gt; antipatrones (mi trabajo me ha costado), sí que en algún momento llegué a usar alguno... como el Jaywalking (evitar los "cruces" de tablas mediante campos que contienen listas de identificadores) y el Entity-Attribute-Value... vamos, el famoso cajón DEsastre. La juventud, que nos hace temerarios.&lt;br /&gt;
&lt;br /&gt;
El libro está escrito en un lenguaje que no usa términos demasiado técnicos que podrían llegar a despistar al lector. Se ha preferido obviar ciertos conceptos (se explican luego, en uno de los apéndices) de bb.dd. para centrar la atención única y exclusivamente en cómo evitar el error.&lt;br /&gt;
&lt;br /&gt;
Los ejemplos están construídos a través de una aplicación de control de bugs. Aunque normalmente no hacen falta para conseguir transmitir el mensaje, están bien enlazados y trabajados. Incluye también una gran cantidad de código SQL.&lt;br /&gt;
&lt;br /&gt;
Lo dicho, esencial para poder construir modelos de datos robustos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-7512551520637108362?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/O6QWgcF1tZU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/7512551520637108362/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=7512551520637108362" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/7512551520637108362?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/7512551520637108362?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/07/review-sql-antipatterns.html" title="Review SQL Antipatterns" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-lgM0-gz-H28/TilMp5s-CcI/AAAAAAAABVg/Nt3ez9v544k/s72-c/SQLPatterns.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08NQXgzfSp7ImA9WhZaE0k.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-1354437770949621103</id><published>2011-06-29T12:55:00.003+02:00</published><updated>2011-06-29T13:11:30.685+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-29T13:11:30.685+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="catalina.properties" /><category scheme="http://www.blogger.com/atom/ns#" term="JDBCRealm" /><category scheme="http://www.blogger.com/atom/ns#" term="tomcat6" /><title>Problemas con JDBCRealm en Tomcat6 sobre Ubuntu</title><content type="html">Me ha llevado unos días el poder desplegar correctamente una aplicación que usaba un realm para la validación de usuarios.&lt;br /&gt;&lt;br /&gt;Una vez configurado los ficheros oportunos en el proyecto (podéis ver una entrada sobre esto &lt;a href="http://finger-in-the-eye.blogspot.com/2009/01/login-de-un-usuario-mediante-realm-en.html"&gt;aquí&lt;/a&gt;), al desplegar la aplicación e intentar acceder a los recursos protegidos por el realm, el servidor me redirigía contínuamente a la página de error del login definida para la aplicación.&lt;br /&gt;&lt;br /&gt;El problema, aunque simple, me costó más de tres días de trabajo. El servidor era una instalación limpia de un Apache+Tomcat6+MySQL en una Ubuntu. Esta versión de Tomcat para Ubuntu (y supongo que para todas las distro Linux), no se instala con el formato tradicional de carpetas, sino que aparece instalada sobre distintos directorios. Tengo la impresión de que está predefinida para el uso de distintas instancias sobre la misma instalación.&lt;br /&gt;&lt;br /&gt;El motivo de que no me validara el usuario cuando accedía a recursos protegidos era que Tomcat no era capaz de encontrar el driver de MySQL. En esta instalación de Tomcat no existe una carpeta TOMCAT_HOME/common/lib (y si la creas, no la tiene en cuenta), y hay que colocar estos en la ruta CATALINA_HOME, que está establecida por defecto en /usr/share/tomcat6 (tomcat6 es el nombre de mi instancia). Ahí hay que dejar los drivers.&lt;br /&gt;&lt;br /&gt;Si se quiere cambiar el valor de CATALINA_HOME, deberemos editar el fichero /etc/default/tomcat6. Este fichero también contiene otras cosas interesantes, merece la pena echarle un vistazo.&lt;br /&gt;&lt;br /&gt;Bueno... espero que ayude.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-1354437770949621103?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/cIVGG4xJF9I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/1354437770949621103/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=1354437770949621103" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/1354437770949621103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/1354437770949621103?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/06/problemas-con-jdbcrealm-en-tomcat6.html" title="Problemas con JDBCRealm en Tomcat6 sobre Ubuntu" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUMCSH0yeSp7ImA9WhZQE04.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-862216041665596337</id><published>2011-04-20T15:44:00.011+02:00</published><updated>2011-04-21T00:11:09.391+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-21T00:11:09.391+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="submit dinamico struts2" /><title>Botones de submit dinámicos con Struts2</title><content type="html">En ocasiones he tenido la necesidad de poder tener más de un botón de submit en un mismo formulario, teniendo estos distintas acciones, claro está. &lt;br /&gt;6&lt;br /&gt;Esto se puede resolver estableciendo el atributo "method" del elemento s:submit con el nombre de un determinado método que se ejecutará en la clase action destino. Tal que así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;form action="unaAccion"&amp;gt;&lt;br /&gt;  &amp;lt;s:submit method="ver" value="Ver"/&amp;gt;&lt;br /&gt;  &amp;lt;s:submit method="cancelar" value="Cancelar"/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y luego, en la clase action, establecer los métodos ver y cancelar así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class UnaAccion {&lt;br /&gt;    public String ver() {&lt;br /&gt;        return Action.SUCCES;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String cancelar() {&lt;br /&gt;        return Action.SUCCES;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pero hay otras ocasiones en las que tenemos más métodos de los que, razonablemente, pordríamo mapear y, además podemos complicarlo con que cada médoto debería recibir un dato del submit pulsado.&lt;br /&gt;&lt;br /&gt;Para eso podemos usar la creación de submit dinámicos, más o menos sería así:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;form action="borrarEntrada.action"&amp;gt;&lt;br /&gt;  &amp;lt;s:iterate value="entradas"&amp;gt;&lt;br /&gt;      &amp;lt;s:property value="titulo"&amp;gt; &lt;br /&gt;      &amp;lt;input type="submit" name="borrar[&amp;lt;s:property value='id'&amp;gt;]" value="borrar"/&amp;gt;&lt;br /&gt;      &amp;lt;br/&amp;gt;&lt;br /&gt;  &amp;lt;/s:iterate&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Luego, el valor del botón pulsado se pordría recoger en la clase action de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class BorrarEntradaAction {&lt;br /&gt;&lt;br /&gt;    private final Map borrar = new HashMap ();&lt;br /&gt;&lt;br /&gt;    public String execute () {&lt;br /&gt;        super.execute ();&lt;br /&gt;&lt;br /&gt;        for (Iterator i = borrar.keySet ().iterator (); i.hasNext ();) {&lt;br /&gt;            String id = (String) i.next ();&lt;br /&gt;            System.out.println (id);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public final Map getBorrar () {&lt;br /&gt;        return borrar;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Evidentemente, en el for solamente tendremos un item cuyo valor será el id que hemos asignado en la JSP.&lt;br /&gt;&lt;br /&gt;Espero que, por lo menos, os ahorre el tiempo que a mí me ha costado encontrarlo :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-862216041665596337?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/uTaf7hyubKw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/862216041665596337/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=862216041665596337" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/862216041665596337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/862216041665596337?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/04/botones-de-submit-dinamicos-con-struts2.html" title="Botones de submit dinámicos con Struts2" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0ADSHw_cCp7ImA9WhZTFEk.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-483663530681218810</id><published>2011-03-18T10:43:00.001+01:00</published><updated>2011-03-18T10:49:39.248+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-18T10:49:39.248+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Shooter" /><category scheme="http://www.blogger.com/atom/ns#" term="Duke Nukem Forever" /><category scheme="http://www.blogger.com/atom/ns#" term="juegos" /><category scheme="http://www.blogger.com/atom/ns#" term="FPS" /><title>Duke Nukem Forever... ¡¡por fin!!</title><content type="html">Más de una década ha pasado. Por fin, cuando nadie lo esperaba, el juego va a ver la luz este mismo año. Podéis ver los detalles en &lt;a href="http://www.dukenukemforever.com/"&gt;la web oficial&lt;/a&gt;. Se prevé que este disponible en mayo y que se distribuya a través de &lt;a href="http://www.steampowered.com/"&gt;Steam&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
No está recomendado para menores de 18 años, ya que aquellos que conozcáis al personaje, sabréis que es aficionado al sexo y a las palabras subidas de tono. En este sentido, el juego no decepciona XD.&lt;br /&gt;
&lt;br /&gt;
Este es el trailer oficial.&lt;br /&gt;
&lt;iframe title="YouTube video player" width="440" height="268" src="http://www.youtube.com/embed/_5svP9Wu0nk" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-483663530681218810?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/1g34mi1UixE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/483663530681218810/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=483663530681218810" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/483663530681218810?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/483663530681218810?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/03/duke-nukem-forever-por-fin.html" title="Duke Nukem Forever... ¡¡por fin!!" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/_5svP9Wu0nk/default.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C08GQnozcCp7ImA9WhZTFEk.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-6319676457594519102</id><published>2011-03-18T10:31:00.002+01:00</published><updated>2011-03-18T10:50:23.488+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-18T10:50:23.488+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="0 A.D." /><category scheme="http://www.blogger.com/atom/ns#" term="juegos" /><category scheme="http://www.blogger.com/atom/ns#" term="Estrategia" /><title>0 A.D. Alpha 4 Daedalus, juego de estrategia open-source</title><content type="html">&lt;a href="http://wildfiregames.com/0ad/"&gt;&lt;b&gt;0 A.D.&lt;/b&gt;&lt;/a&gt; es un juego de estrategia open-source desarrollado por &lt;a href="http://wildfiregames.com/"&gt;wildfire games&lt;/a&gt;. La versión actual se denomina &lt;b&gt;0 A.D. Alpha 4 Daedalus&lt;/b&gt;, indicando su estado de desarrollo.&lt;br /&gt;
&lt;br /&gt;
Es muy similar a otros juegos del mismo estilo a los que ya habréis jugado los aficionados a los juegos de estrategia. El juego está disponible para &lt;b&gt;Windows&lt;/b&gt;, &lt;b&gt;Linux &lt;/b&gt;y &lt;b&gt;Mac OS&lt;/b&gt;. El core está escrito en &lt;b&gt;C++&lt;/b&gt; y como librería gráfica usa &lt;b&gt;OpenGL&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Os muestro a continuación un vídeo sobre el juego para que podáis juzgar si os parece interesante instalarlo.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="268" src="http://www.youtube.com/embed/KTm-h6KFZCM" title="YouTube video player" width="440"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-6319676457594519102?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/B3aRcqYHhaM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/6319676457594519102/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=6319676457594519102" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/6319676457594519102?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/6319676457594519102?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/03/0-ad-alpha-4-daedalus-juego-de.html" title="0 A.D. Alpha 4 Daedalus, juego de estrategia open-source" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/KTm-h6KFZCM/default.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkICSXozcCp7ImA9Wx9WF0w.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-896896245868318353</id><published>2011-01-21T16:09:00.008+01:00</published><updated>2011-01-22T18:49:28.488+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-22T18:49:28.488+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="resultmap" /><category scheme="http://www.blogger.com/atom/ns#" term="ibatis" /><category scheme="http://www.blogger.com/atom/ns#" term="join" /><title>Optimizar consultas con iBatis y Joins</title><content type="html">Se me ha dado un caso en el que tenía que recuperar una lista con objetos complejos de una consulta. La consulta usaba un join con otra tabla que, además de devolver tipos simples (String) también debía completar un tipo complejo (una lista de objetos).&lt;br /&gt;&lt;br /&gt;En concreto, necesitaba conocer las personas activas (con contrato sin finalizar) y los centros de trabajo que estos contratos tenían (1:N persona/contrato y 1:N contrato/centro). Con lo que la consulta me devolvería un registro por cada centro que el contrato tuviera asociado. Es por ello que el bean al que se mapea el resultado contiene objetos simples (Strings con los datos personales) y un objeto complejo (una lista de objetos Centro por cada persona).&lt;br /&gt;&lt;br /&gt;Para resolver este "problema", he usado la siguiente "estrategia" (las consultas así como las relaciones entre tablas, se han simplificado para su mejor entendimiento):&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;resultmap id="selectPersonasContratoActivoResult" class="persona" groupby="idContrato"&amp;gt;&lt;br /&gt;  &amp;lt;result property="idPersona" column="ID_PERSONA"&amp;gt;&lt;br /&gt;  &amp;lt;result property="nombre" column="NOMBRE"&amp;gt;&lt;br /&gt;  &amp;lt;result property="idContrato" column="ID_CONTRATO"&amp;gt;&lt;br /&gt;  &amp;lt;result property="centros" resultmap="selectCentrosContratoResult"&amp;gt;&lt;br /&gt;&amp;lt;/result&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;resultmap id="selectCentrosContratoResult" class="centro"&amp;gt;&lt;br /&gt;  &amp;lt;result property="idCentro" column="ID_CENTRO"&amp;gt;&lt;br /&gt;  &amp;lt;result property="nombre" column="NOMBRE"&amp;gt;&lt;br /&gt;&amp;lt;/result&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;select id="selectPersonasContratoActivo" resultmap="selectPersonasContratoActivoResult"&amp;gt;                                                                                          &amp;lt;/select&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;select id="selectCentrosContrato" parameterclass="int" resultmap="selectCentrosContratoResult"&amp;gt;                                                            &amp;lt;/select&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Lo importante en este código es las siguientes líneas:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;resultmap id="selectPersonasContratoActivoResult" class="persona" &lt;strong&gt;groupby="idContrato"&lt;/strong&gt;&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;... donde indicamos cuál será la clave por la que agrupemos los resultados que se mapearán a la lista "centros", y esta otra línea&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;  &amp;lt;result property="centros" column="ID_CONTRATO" &lt;strong&gt;resultmap="selectCentrosContratoResult"&lt;/strong&gt;&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;... ya que aquí se indica que el objeto complejo (lista) "centros" se rellenará atendiendo al resultMap selectCentrosContratoResult.&lt;br /&gt;&lt;br /&gt;De esta forma, con una sola consulta conseguimos completar un bean que contiene una lista de otro bean.&lt;br /&gt;&lt;br /&gt;Espero haberme sabido explicar bien. Si no es así, siempre se puede consultar esta &lt;a href="http://ibatis.apache.org/docs/dotnet/datamapper/ch03s05.html"&gt;página &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-896896245868318353?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/lXJKvt9gtHY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/896896245868318353/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=896896245868318353" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/896896245868318353?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/896896245868318353?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/01/optimizar-consultas-con-ibatis-y-joins.html" title="Optimizar consultas con iBatis y Joins" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08AQHY5fyp7ImA9Wx9XFko.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-4134150485054709352</id><published>2011-01-10T17:00:00.005+01:00</published><updated>2011-01-10T17:10:41.827+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-10T17:10:41.827+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="double" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="entero" /><category scheme="http://www.blogger.com/atom/ns#" term="doble" /><category scheme="http://www.blogger.com/atom/ns#" term="redondeo" /><title>Convertir a entero un doble redondeando su parte decimal</title><content type="html">Hola,&lt;br /&gt;&lt;br /&gt;Hoy tenía que redondear un número decimal (double) a un entero teniendo en cuenta su parte decimal y si esta era igual o mayor a 0,5, añadir uno a su parte entera.&lt;br /&gt;&lt;br /&gt;Parece simple, pero dar con una solución que se adaptase a mi necesidad me ha llevado un ratín.&lt;br /&gt;&lt;br /&gt;Para ello he usado la clase &lt;a href="http://download.oracle.com/javase/6/docs/api/java/text/NumberFormat.html"&gt;java.text.DecimalFormat&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Esta clase es perfecta para "decorar" nuestra salida de números decimales, pero también funciona muy bien para solucionar el problema de elimiar la parte decimal de un número redondeando su parte entera.&lt;br /&gt;&lt;br /&gt;Es simple. Sólo tenemos que pasar un patrón en el constructor de la clase donde no demos opción a mostrar decimales (esta clase, al igual que SimpleDateFormat, nos convierte nuestros números en cadenas). Y después usar su método "format". Un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;                 DecimalFormat df = new DecimalFormat ("##");&lt;br /&gt;                 int diasVacaciones = Integer.parseInt (df.format ((diasTrabajados) * 30d / 360d));&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El resultado será un número entero redondeado en caso de haber sido necesario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-4134150485054709352?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/gV891O-ID_8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/4134150485054709352/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=4134150485054709352" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/4134150485054709352?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/4134150485054709352?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2011/01/convertir-entero-un-doble-redondeando.html" title="Convertir a entero un doble redondeando su parte decimal" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkMBQXo4fSp7ImA9Wx5VFEU.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-267661839772352459</id><published>2010-10-07T23:44:00.003+02:00</published><updated>2010-10-07T23:54:10.435+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-07T23:54:10.435+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="exceeded" /><category scheme="http://www.blogger.com/atom/ns#" term="timeout" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><title>MySQL: Lock wait timeout exceeded</title><content type="html">Trabajando con MySql e iBatis me topé con un problema que, en principio no tenía muy claro de dónde podía venir.&lt;br /&gt;&lt;br /&gt;El caso es que, aparentemente, de forma aleatoria cuando hacía un insert o un update, la aplicación dejaba de responder y acababa mostrando una traza como esta:&lt;br /&gt;&lt;br /&gt;java.sql.SQLException: Lock wait timeout exceeded...&lt;br /&gt;&lt;br /&gt;Después de mucho mirar y también mucho buscar en Google, caí en la cuenta que el problema lo daba una query que abría una transacción que no se cerraba antes de ser devuelta al pool.&lt;br /&gt;&lt;br /&gt;En un método de la aplicación estaba abriendo una transacción y cerrandola en el catch en lugar de en el finally. Un finally y un endTransaction después, puedo respirar tranquilo... y por supuesto, mil gracias a este &lt;a href="http://forums.mysql.com/read.php?22,37371,39620#msg-39620"&gt;post&lt;/a&gt; sin el cual aún seguiría dando vueltas por los fuentes de la aplicación como alma en pena.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-267661839772352459?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/Udeiy6AkPXc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/267661839772352459/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=267661839772352459" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/267661839772352459?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/267661839772352459?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/10/mysql-lock-wait-timeout-exceeded.html" title="MySQL: Lock wait timeout exceeded" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ak4DSHk9fyp7ImA9Wx5XFUg.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-8867487294338665809</id><published>2010-09-15T15:45:00.007+02:00</published><updated>2010-09-15T15:56:19.767+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-15T15:56:19.767+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ConversionException" /><category scheme="http://www.blogger.com/atom/ns#" term="Date" /><category scheme="http://www.blogger.com/atom/ns#" term="BeanUtils" /><title>Clase BeanUtils de Apache Commons y las fechas</title><content type="html">Hola,&lt;br /&gt;&lt;br /&gt;Usando el API &lt;a href="http://commons.apache.org/beanutils/"&gt;BeanUtils&lt;/a&gt; de Apache, en concreto su (gran) método &lt;code&gt;copyProperties&lt;/code&gt;, me dí cuenta de que cuando el bean a copiar tenía algún campo con fechas y estas estaban a null se obtenía la siguiente traza:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;No value specified for 'Date'&lt;br /&gt;org.apache.commons.beanutils.ConversionException: No value specified for 'Date'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Bien, buscando por ahí encontré una forma de seguir usando BeanUtils aún cuando el bean tiene fechas a nulo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;         Date defaultValue = null;&lt;br /&gt;         DateConverter converter = new DateConverter (defaultValue);&lt;br /&gt;         ConvertUtils.register (converter, java.util.Date.class);&lt;br /&gt;&lt;br /&gt;         BeanUtils.copyProperties (view, nuevo);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simple pero eficaz. Lo encontré en un foro, pero no lo menciono ya que el "descubrimiento" fue hace ya bastante tiempo y no tengo ni idea de dónde lo saqué.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-8867487294338665809?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/sLFGyv1xt9k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/8867487294338665809/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=8867487294338665809" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/8867487294338665809?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/8867487294338665809?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/09/clase-beanutils-de-apache-commons-y-las.html" title="Clase BeanUtils de Apache Commons y las fechas" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUIFQX45eip7ImA9Wx5SEkg.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-1502518848886872203</id><published>2010-08-08T10:50:00.002+02:00</published><updated>2010-08-08T10:51:50.022+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-08T10:51:50.022+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="steam" /><category scheme="http://www.blogger.com/atom/ns#" term="valve" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="juegos" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>¿Un nuevo impulso para Linux?</title><content type="html">Soy usuario habitual de Linux, en concreto de &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;. Si, ya sé que muchos opinarán que hay mejores distribuciones. Particularmente no me interesa esa discusión. Cada usuario de Linux puede elegir la que más le convenza.&lt;br /&gt;
&lt;br /&gt;
También habrá usuarios de otros sistemas que opinarán que dichos sistemas son mejores y expondrán sus razones. Tampoco es una discusión en la que quiera entrar. Ya le he tenido muchas veces.&lt;br /&gt;
&lt;br /&gt;
Bueno, a lo que iba. Hace algún tiempo, en una reunión de amigos conocí a una persona metida en temas políticos en un pequeño pueblo, de izquierdas y fanático del software libre. Yo llevaba mi portátil y la última distribución de Ubuntu por aquel entonces. Había solicitado el CD a &lt;a href="http://www.canonical.com/"&gt;Canonical&lt;/a&gt;, con sus correspondientes pegatinas. Le vi tan entusiasmado, que le regalé las pegatinas.&lt;br /&gt;
&lt;br /&gt;
Después empezamos una charla distendida sobre Linux, software libre y demás. Yo habitualmente tengo instalado un sistema dual (&lt;a href="http://www.microsoft.com/windows/"&gt;Windows&lt;/a&gt;/Linux) y me preguntó por qué, ya que con Linux podía hacer todo lo que necesitaba. Es casi cierto en mi caso, ya que desarrollo en &lt;a href="http://www.java.com/"&gt;Java&lt;/a&gt; y no necesito un Windows para realizar mi trabajo (puedo usar indiferentemente uno u otro sistema).&lt;br /&gt;
&lt;br /&gt;
El caso es que sólo tuve que contestarle con tres palabras para que no siguiera insistiendo en el tema: "me gusta jugar". No dijo nada más.&lt;br /&gt;
&lt;br /&gt;
Llegados a este punto, alguno me recordará que existe algo llamado &lt;a href="http://www.winehq.org/"&gt;Wine&lt;/a&gt;, que me permitirá instalar aplicaciones Windows en mi Linux, pero personalmente, no termina de convencerme. He tenido algunas experiencias con Wine, que no me han dejado buen sabor de boca. En ocasiones hay que remangarse para hacer que las cosas funcionen medianamente bien.&lt;br /&gt;
&lt;br /&gt;
Es cierto que los esfuerzos de Canonical, &lt;a href="http://www.redhat.com/"&gt;Red Hat&lt;/a&gt;, &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; y otros han conseguido darle un impulso al S.O., pero recientemente ha surgido una noticia que creo que podría darle un impulso mucho mayor. Me refiero a la intención de &lt;a href="http://www.valvesoftware.com/"&gt;Valve&lt;/a&gt; de publicar una versión de &lt;a href="http://store.steampowered.com/"&gt;Steam&lt;/a&gt; para Linux.&lt;br /&gt;
&lt;br /&gt;
Según las noticias, es posible que la primera versión esté disponible a finales de verano del 2010 y Valve ya ha confirmado que, aparte de los juegos que ya estaban disponibles para Linux (Unreal Tournament 2004, World of Goo o títulos de &lt;a href="http://www.idsoftware.com/"&gt;id Software&lt;/a&gt; como Enemy Territory: Quake Wars o Doom 3), títulos propios como Half-Life 2, Counter-Strike: Source o Team Fortress 2 y la siguiente versión de Portal también se lanzarán para esta plataforma.&lt;br /&gt;
&lt;br /&gt;
Habrá que esperar a ver cómo se desarrollan los acontecimientos, pero tengo la impresión que este podría ser el mayor "empujón" que haya recibido Linux en los últimos años.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-1502518848886872203?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/yaPdYlu2bGY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/1502518848886872203/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=1502518848886872203" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/1502518848886872203?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/1502518848886872203?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/08/un-nuevo-impulso-para-linux.html" title="¿Un nuevo impulso para Linux?" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CUAFQXw-fyp7ImA9WxFQEE0.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-8991021024883877801</id><published>2010-05-04T22:01:00.002+02:00</published><updated>2010-05-04T22:08:30.257+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-04T22:08:30.257+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Calendar" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Android no muestra todos mis calendarios</title><content type="html">Si tenéis un móvil con Android, quizás también "sufrais" este pequeño contratiempo. Aunque en tu cuenta de Google Calendar dispongas de más de un calendario donde añadir tus citas, Android sólo muestra las citas de uno (o quiźas algunos) de los calendarios.&lt;br /&gt;&lt;br /&gt;Ese "bug" (no creo que se pueda llamar así, pero bueno...) se soluciona de una forma muy sencilla. En "Ajustes" seleccionar "Aplicaciones" y después "Administrar aplicaciones". Nos aparecerá una lista completa de las aplicaciones que tenemos instaladas.&lt;br /&gt;&lt;br /&gt;Nos desplazamos por la lista buscando una llamada "Calendario" (es posible que aparezca también como com.android.calendar o similar). Seleccionamos esta aplicación y a continuación pulsamos el botón "Borrar datos" (con valor) y a después, abajo, "Forzar detención".&lt;br /&gt;&lt;br /&gt;Si ahora abrimos nuestro calendario en Android, veremos cómo comienza a sincronizarse e irán apareciendo las citas de todos nuestros calendarios.&lt;br /&gt;&lt;br /&gt;Espero que os ayude.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-8991021024883877801?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/8pWSiKq7ZMk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/8991021024883877801/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=8991021024883877801" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/8991021024883877801?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/8991021024883877801?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/05/android-no-muestra-todos-mis.html" title="Android no muestra todos mis calendarios" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEYMQ3w8fyp7ImA9WxFRGEU.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-5718471444203288868</id><published>2010-05-03T12:23:00.000+02:00</published><updated>2010-05-03T12:23:02.277+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-03T12:23:02.277+02:00</app:edited><title>Ya está disponible Ubuntu 10.04</title><content type="html">Para todos los fanáticos de Ubuntu, ya se puede descargar la nueva versión 10.04 (Lucid Lynx).&lt;br /&gt;
&lt;br /&gt;
Esta es una versión LTS (Long Term Support). La ánterior LTS fue la 8.04.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.ubuntu.com/products/whatisubuntu/1004features"&gt;Aquí&lt;/a&gt; puedes acceder a un tour con las novedades que se incluyen en la versión de escritorio.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-5718471444203288868?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/FkFwVF_CY7s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/5718471444203288868/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=5718471444203288868" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/5718471444203288868?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/5718471444203288868?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/05/ya-esta-disponible-ubuntu-1004.html" title="Ya está disponible Ubuntu 10.04" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEMHRX89cCp7ImA9WxFRFUk.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-5557057078793548620</id><published>2010-04-29T15:05:00.002+02:00</published><updated>2010-04-29T15:07:14.168+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-29T15:07:14.168+02:00</app:edited><title>ScrumNinja: herramienta para la gestión de equipos con Scrum</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://scrumninja.com/images/main/logo_guest_250x149.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://scrumninja.com/images/main/logo_guest_250x149.png" /&gt;&lt;/a&gt;&lt;/div&gt;Si gestionas tus proyectos con &lt;a href="http://es.wikipedia.org/wiki/Scrum"&gt;Scrum&lt;/a&gt;, aquí tienes una nueva herramienta que promete facilitarte las tareas de mantenimiento de los diferentes artefactos a mantener (Project Backlog, Sprints, User Stories, ...): &lt;a href="http://scrumninja.com/scrum_software"&gt;ScrumNinja&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Disponen de dos diferentes modelos de explotación: hosting o software instalable. En el primer caso, los pagos son mensuales y dependen del numero de usuarios. En el segundo caso, se realiza un único pago en función del número de usuarios. &lt;a href="http://scrumninja.com/pricing"&gt;Los precios son bastante asequibles&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Incluye herramientas visuales, como la pizarra de Scrum.&lt;br /&gt;
&lt;br /&gt;
Puedes probarlo de forma gratuita durante 30 días.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-5557057078793548620?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/ZWsGvnShcig" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/5557057078793548620/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=5557057078793548620" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/5557057078793548620?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/5557057078793548620?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/04/scrumninja-herramienta-para-la-gestion.html" title="ScrumNinja: herramienta para la gestión de equipos con Scrum" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0EDR3Y8cSp7ImA9WxFRFUk.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-4111204722357287188</id><published>2010-04-29T14:53:00.001+02:00</published><updated>2010-04-29T14:54:36.879+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-29T14:54:36.879+02:00</app:edited><title>Netbeans 6.9 Beta ya disponible</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://netbeans.org/images_www/visual-guidelines/NB-logo-single.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://netbeans.org/images_www/visual-guidelines/NB-logo-single.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;La beta del IDE Netbeans 6.9 ya está disponible para su descarga.&lt;br /&gt;
&lt;br /&gt;
Incluye mejoras referentes a &lt;a href="http://www.osgi.org/Main/HomePage"&gt;OSGi&lt;/a&gt;, &lt;a href="http://javafx.com/"&gt;JavaFX&lt;/a&gt; (editor visual similar al de Swing), PHP (soporte para &lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;), soporte para &lt;a href="http://www.rubyonrails.org.es/"&gt;Ruby on Rails 3.0&lt;/a&gt;, soporte para &lt;a href="http://www.springsource.org/"&gt;Spring Framework 3.0&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Esta es la lista de todas las novedades:&lt;br /&gt;
&lt;a href="http://netbeans.org/community/releases/69/"&gt;http://netbeans.org/community/releases/69/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Y el enlace para descargarlo:&lt;br /&gt;
&lt;a href="http://download.netbeans.org/netbeans/6.9/beta/"&gt;http://download.netbeans.org/netbeans/6.9/beta/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-4111204722357287188?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/f4R_usWFGKQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/4111204722357287188/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=4111204722357287188" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/4111204722357287188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/4111204722357287188?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/04/netbeans-69-beta-ya-disponible.html" title="Netbeans 6.9 Beta ya disponible" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkMGR304fyp7ImA9WxFRFEs.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-2635488599570354086</id><published>2010-04-28T17:22:00.002+02:00</published><updated>2010-04-28T17:27:06.337+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-28T17:27:06.337+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="facebook" /><title>Cómo eliminar definitivamente una cuenta en facebook</title><content type="html">Por si en algún momento quieres eliminar completamente tu cuenta de facebook:&lt;br /&gt;&lt;br /&gt;Si entras en tu cuenta, en la configuración de la cuenta podrás ver que existe la posibilidad de desactivarla, pero aparentemente no hay una opción de eliminar tu cuenta definitivamente. Sin embargo esta opción existe. El enlace es el siguiente (tienes que estar logueado en la cuenta que deseas eliminar):&lt;br /&gt;&lt;a href="http://www.blogger.com/%20http://www.facebook.com/help/contact.php?show_form=delete_account"&gt;&lt;br /&gt;http://www.facebook.com/help/contact.php?show_form=delete_account&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El procedimiento es rápido y te informan que tu cuenta pasa a estar desactivada y que se eliminará completamente en unos 14 días. También te informa que durante esos 14 días puedes entrar en cualquier momento y volver a activar tu cuenta, con lo cual se cancelará el proceso de eliminación.&lt;br /&gt;&lt;br /&gt;A continuación te envían un correo a la dirección asociada a la cuenta con el título "&lt;span style="font-weight: bold;"&gt;Cuenta programada para su eliminación&lt;/span&gt;" (esto me suena a &lt;span style="font-style: italic;"&gt;Star Wars, episodio IV&lt;/span&gt;), con el siguiente contenido:&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;Hola, XXXXXXXXXXX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Hemos recibido una petición para eliminar tu cuenta de Facebook permanentemente. Tu cuenta está ya inhabilitada y será eliminada de forma permanente en los próximos 14 días.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Si no deseas eliminar tu cuenta, haz clic en el siguiente enlace para cancelar la petición:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;http://www.facebook.com/account_delete.php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Gracias,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;El equipo de Facebook&lt;/span&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-2635488599570354086?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/UsBsFtVTWJE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/2635488599570354086/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=2635488599570354086" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/2635488599570354086?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/2635488599570354086?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/04/como-eliminar-definitivamente-una.html" title="Cómo eliminar definitivamente una cuenta en facebook" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CU4HQX8-eip7ImA9WxFQEE0.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-7586871135109493321</id><published>2010-04-07T12:30:00.007+02:00</published><updated>2010-05-04T22:12:10.152+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-04T22:12:10.152+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="s:if" /><category scheme="http://www.blogger.com/atom/ns#" term="struts" /><title>¿Por qué no funciona la etiqueta s:if al comparar con cadenas?</title><content type="html">Usando Struts 2 me he encontrado con un problema que, a simple vista, no debería serlo.&lt;br /&gt;&lt;br /&gt;Usando la etiqueta &amp;lt;s:if...&amp;gt;  intentaba comparar el valor de una propiedad de un objeto en el ValueStack (proveniente de un action a través del ModelDriven) y una cadena. En concreto un 'N'.&lt;br /&gt;&lt;br /&gt;Pero nunca llegaba a cumplirse la condición. Me aseguré de que la propiedad tuviera el valor adecuado, pero aún así, nada. El código que usaba era este:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;s:if test="%{nombre_propiedad eq 'N'}"&amp;gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La solución la encontré &lt;a href="http://struts.apache.org/2.x/docs/why-wont-the-if-tag-evaluate-a-one-char-string.html"&gt;aquí&lt;/a&gt;. El problema es que ONGL no interpreta correctamente los char como string. La solución, hacer que compare con cadenas (entre comillas dobles) y no con caracteres (comillas simples):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;s:if test='%{nombre_propiedad eq "N"}'&amp;gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sirva.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-7586871135109493321?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/Th3GOXA7sbY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/7586871135109493321/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=7586871135109493321" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/7586871135109493321?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/7586871135109493321?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/04/por-que-no-funciona-la-etiqueta-sif-al.html" title="¿Por qué no funciona la etiqueta s:if al comparar con cadenas?" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkMMRXY_eCp7ImA9WxFTFUk.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-6628226074404366167</id><published>2010-04-06T10:23:00.006+02:00</published><updated>2010-04-06T11:01:24.840+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-06T11:01:24.840+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="persistencia" /><category scheme="http://www.blogger.com/atom/ns#" term="toplink" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="JPA" /><title>JPA: Modificar unidades de persistencia programáticamente</title><content type="html">Si trabajáis con JPA, nosotros concretamente con Netbeans (aunque en Eclipse funciona de forma similar), durante el desarrollo de las aplicaciones, procedemos a crear un modelo de datos y a desplegar el modelo físico sobre nuestro motor de base de datos.&lt;br /&gt;&lt;br /&gt;En el caso de Netbeans, mediante wizards, creamos nuestra conexión, la unidad de persistencia ("persistence.xml") y podemos generar nuestras entidades a partir del modelo físico.&lt;br /&gt;&lt;br /&gt;¿Y el proceso inverso?. Supongamos que ya tenemos nuestra aplicación y lo que queremos es que al desplegar nuestra aplicación en los servidores de producción, en base a nuestras entidades, se recree la base de datos, sin necesidad de hacer una importación (debe existir el esquema y el usuario, por supuesto, pero no es preciso importar las tablas "manualmente").&lt;br /&gt;&lt;br /&gt;Esto es posible modificando programáticamente una unidad de persistencia existente en el archivo "persistence.xml". Con un poco de trabajo, se puede crear un "wizard" en nuestra aplicación que detecte si la instalación es nueva y que sea capaz de recrear las tablas en base a nuestras entidades ya existentes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Al menos, esta es la forma que hemos encontrado de hacerlo... es posible que haya formas mejores.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Este ejemplo enlaza con el post anterior sobre el motor InnoDB de MySQL. En nuestro caso, las tablas originales eran InnoDB, pero cuando se recreaban las tablas en otro esquema, aparecían como MyISAM.)&lt;br /&gt;&lt;br /&gt;En el ejemplo, uso TopLink Essentials, de Oracle. Las propiedades para Hibernate o EclipseLink, varían.&lt;br /&gt;&lt;br /&gt;Este sería nuestro archivo "persistence.xml". Como véis, no tiene propiedades. Sólamente declaramos el nombre de la unidad, el proveedor y las entidades, pero no las propiedades:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&amp;gt;&lt;br /&gt;  &amp;lt;persistence-unit name="PersistenceUnit" transaction-type="RESOURCE_LOCAL"&amp;gt;&lt;br /&gt;    &amp;lt;provider&amp;gt;oracle.toplink.essentials.PersistenceProvider&amp;lt;/provider&amp;gt;&lt;br /&gt;    &amp;lt;class&amp;gt;test.entities.Entidad2&amp;lt;/class&amp;gt;&lt;br /&gt;    &amp;lt;class&amp;gt;test.entities.Entidad1&amp;lt;/class&amp;gt;&lt;br /&gt;  &amp;lt;/persistence-unit&amp;gt;&lt;br /&gt;&amp;lt;/persistence&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Modificar la unidad de persistencia pasando las propiedades programáticamente, es simple:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Properties props = new Properties();&lt;br /&gt;props.put(TopLinkProperties.JDBC_USER,"user");&lt;br /&gt;props.put(TopLinkProperties.JDBC_PASSWORD,"password");&lt;br /&gt;props.put(TopLinkProperties.JDBC_URL,"jdbc:mysql://hostname:3306/targetddbb?sessionVariables=storage_engine=InnoDB");&lt;br /&gt;props.put("toplink.ddl-generation","create-tables");&lt;br /&gt;props.put(TopLinkProperties.JDBC_DRIVER,"com.mysql.jdbc.Driver");&lt;br /&gt;EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceUnit",props);&lt;br /&gt;EntityManager em = emf.createEntityManager();&lt;br /&gt;em.close();&lt;br /&gt;emf.close();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si os fijáis, hay una propiedad "toplink.ddl-generation", con el valor "create-tables". Esto hace que al instanciar el objeto EntityManager, se regeneren las tablas en la base de datos, en base a las entidades declaradas en "persistence.xml" y asociadas a la unidad "PersistenceUnit". Es decir, sólo con ejecutar este código, se regeneran las tablas.&lt;br /&gt;&lt;br /&gt;Por último insistir en que para realizar las pruebas, hemos usado:&lt;br /&gt;&lt;br /&gt;- Netbeans 6.8&lt;br /&gt;- TopLink Essentials&lt;br /&gt;- MySQL&lt;br /&gt;&lt;br /&gt;Los esquemas de origen y destino de nuestras tablas eran MySQL. No hemos probado a regenerar las tablas en una base de datos distinta...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-6628226074404366167?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/QKdyi8IPcpU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/6628226074404366167/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=6628226074404366167" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/6628226074404366167?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/6628226074404366167?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/04/jpa-modificar-unidades-de-persistencia.html" title="JPA: Modificar unidades de persistencia programáticamente" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DkIFSXc5eyp7ImA9WxFTFUk.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-4551634939718678744</id><published>2010-04-06T09:59:00.007+02:00</published><updated>2010-04-06T11:01:58.923+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-06T11:01:58.923+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="myisam" /><category scheme="http://www.blogger.com/atom/ns#" term="innodb" /><category scheme="http://www.blogger.com/atom/ns#" term="jdbc" /><title>MySQL: forzar la creación de tablas InnoDB</title><content type="html">Hola a todos,&lt;br /&gt;&lt;br /&gt;es posible que en alguna ocasión al crear nuevas tablas en MySQL os encontréis con que por defecto las tablas se crean con el motor MyISAM, en lugar de InnoDB. Esto ocurre porque en la instalación del servidor se ha seleccionado MyISAM como motor por defecto.&lt;br /&gt;&lt;br /&gt;La primera solución que se nos puede ocurrir es modificar la configuración de MySQL para que el motor por defecto sea InnoDB. Esto tiene sus inconvenientes, ya que en un entorno de producción modificar la configuración del servidor puede ser un problema.&lt;br /&gt;&lt;br /&gt;Sin embargo, hay una solución muy simple y que evitará que nos peleemos con el administrador de turno. En la propia cadena de conexión de MySQL, podemos pasar parámetros adicionales que modifican la forma en que el servidor se comporta para dicha conexión. El detalle de estos parámetros se puede consultar aquí (es para la versión 5.5, pero existen para versiones anteriores):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html"&gt;http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El parámetro que nos interesa se llama "sessionVariables". En este parámetro se puede pasar múltiples valores separados por coma que determinan el funcionamiento de la sesión de MySQL.&lt;br /&gt;&lt;br /&gt;En concreto para forzar que el motor por defecto durante nuestra sesión sea InnoDB, deberíamos crear una conexión de este tipo:&lt;br /&gt;&lt;br /&gt;"jdbc:mysql://hostname:3306/ddbbname?&lt;span style="font-weight:bold;"&gt;sessionVariables=storage_engine=InnoDB&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;De esta manera, cualquier sentencia "CREATE TABLE" creará tablas InnoDB aunque el motor por defecto sea otro.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-4551634939718678744?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/oOzGbec9z4U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/4551634939718678744/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=4551634939718678744" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/4551634939718678744?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/4551634939718678744?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2010/04/mysql-forzar-la-creacion-de-tablas.html" title="MySQL: forzar la creación de tablas InnoDB" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkQMQH09fip7ImA9WxNaE08.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-3084918014535145313</id><published>2009-11-27T11:19:00.012+01:00</published><updated>2009-11-27T13:19:41.366+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-27T13:19:41.366+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="login" /><category scheme="http://www.blogger.com/atom/ns#" term="seguridad" /><category scheme="http://www.blogger.com/atom/ns#" term="tomcat" /><category scheme="http://www.blogger.com/atom/ns#" term="realm" /><title>Modulo de login personalizado para Tomcat</title><content type="html">&lt;p&gt;Continuando con el tema abierto por FiTe en su post "&lt;a href="http://finger-in-the-eye.blogspot.com/2009/01/login-de-un-usuario-mediante-realm-en.html"&gt;Login de un usuario mediante Realm en un servidor Java EE&lt;/a&gt;", vamos a hablar a continuación de cómo desarrollar un módulo de login personalizado, mediante el cual podremos controlar de qué manera nuestros usuarios serán autenticados por nuestra aplicación y cómo estableceremos sus diferentes roles.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Este ejemplo lo he desarrollado usando Netbeans 6.7.1 y Tomcat 6.0.20.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Para empezar, necesitaremos definir las clases UserPrincipal y RolePrincipal, implementando el interfaz java.security.Principal. Este interfaz prové un único método llamado getName().&lt;/p&gt;En primer lugar, la clase UserPrincipal. Añadimos un atributo de la clase String, llamado "name" y un constructor que recibe como parámetro un String, el cual asociamos al atributo de la clase.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;package com.aradne.jaas;&lt;br /&gt;&lt;br /&gt;import java.security.Principal;&lt;br /&gt;&lt;br /&gt;public class UserPrincipal implements Principal {&lt;br /&gt;&lt;br /&gt;    private String name;&lt;br /&gt;&lt;br /&gt;    public UserPrincipal(String name) {&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getName() {&lt;br /&gt;        return name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;En el caso de la clase RolePrincipal, hacemos exáctamente lo mismo:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;package com.aradne.jaas;&lt;br /&gt;&lt;br /&gt;import java.security.Principal;&lt;br /&gt;&lt;br /&gt;public class RolePrincipal implements Principal {&lt;br /&gt;&lt;br /&gt;    private String name;&lt;br /&gt;&lt;br /&gt;    public RolePrincipal(String name) {&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getName() {&lt;br /&gt;        return name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Lo siguiente que tenemos que hacer es crear nuestro propio LoginModule, implementando el interfaz javax.security.auth.spi.LoginModule. Este interfaz prové los siguientes métodos:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;initialize&lt;/li&gt;&lt;li&gt;login&lt;/li&gt;&lt;li&gt;commit&lt;/li&gt;&lt;li&gt;abort&lt;/li&gt;&lt;li&gt;logout&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Este sería el código de la clase:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;package com.aradne.jaas;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import javax.security.auth.Subject;&lt;br /&gt;import javax.security.auth.callback.Callback;&lt;br /&gt;import javax.security.auth.callback.CallbackHandler;&lt;br /&gt;import javax.security.auth.callback.NameCallback;&lt;br /&gt;import javax.security.auth.callback.PasswordCallback;&lt;br /&gt;import javax.security.auth.callback.UnsupportedCallbackException;&lt;br /&gt;import javax.security.auth.login.LoginException;&lt;br /&gt;import javax.security.auth.spi.LoginModule;&lt;br /&gt;&lt;br /&gt;public class CustomLoginModule implements LoginModule {&lt;br /&gt;&lt;br /&gt;    private CallbackHandler handler;&lt;br /&gt;    private Subject subject;&lt;br /&gt;    private String login;&lt;br /&gt;&lt;br /&gt;    public void initialize(Subject subject, CallbackHandler callbackHandler, Map&lt;string,&gt; sharedState, Map&lt;string,&gt; options) {&lt;br /&gt;        this.handler = callbackHandler;&lt;br /&gt;        this.subject = subject;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean login() throws LoginException {&lt;br /&gt;        Callback[] callbacks = new Callback[2];&lt;br /&gt;        callbacks[0] = new NameCallback("login");&lt;br /&gt;        callbacks[1] = new PasswordCallback("password", true);&lt;br /&gt;        try {&lt;br /&gt;            handler.handle(callbacks);&lt;br /&gt;            String name = ((NameCallback) callbacks[0]).getName();&lt;br /&gt;            String password = String.valueOf(((PasswordCallback) callbacks[1]).getPassword());&lt;br /&gt;            //Tenemos el nombre y el password, aquí es donde correpondería validar contra una base de datos, LDAP, AD, etc...&lt;br /&gt;            //Para este ejemplo, nos limitamos a comprobar que el nombre y la&lt;br /&gt;            //contraseña son "pepe" y "pepe", pero se puede complicar lo que&lt;br /&gt;            //queramos.&lt;br /&gt;            boolean loginOk = false;&lt;br /&gt;            if (name.equals("pepe") &amp;amp;&amp;amp; password.equals("pepe")) {&lt;br /&gt;                loginOk = true;&lt;br /&gt;            }&lt;br /&gt;            //Si las credenciales no son correctas devolvemos "false"&lt;br /&gt;            if (!loginOk) {&lt;br /&gt;                return false;&lt;br /&gt;            }&lt;br /&gt;            //Si todo ha ido bien, guardamos el nombre del usuario y devolvemos "true"&lt;br /&gt;            login = name;&lt;br /&gt;            return true;&lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;            throw new LoginException(e.getMessage());&lt;br /&gt;        } catch (UnsupportedCallbackException e) {&lt;br /&gt;            throw new LoginException(e.getMessage());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean commit() throws LoginException {&lt;br /&gt;        try {&lt;br /&gt;            //Si llegamos a este método es que el usuario se ha autenticado&lt;br /&gt;            //de forma correcta.&lt;br /&gt;            //Creamos un UserPrincipal con el nombre de usuario y lo almacenamos.&lt;br /&gt;            UserPrincipal user = new UserPrincipal(login);&lt;br /&gt;            subject.getPrincipals().add(user);&lt;br /&gt;&lt;br /&gt;            //Creamos un RolePrincipal y lo almacenamos. En este caso, me limito&lt;br /&gt;            //a guardar el role "admin", pero en un caso real, tendría que usar&lt;br /&gt;            //el nombre del usuario para recuperar una lista de roles. Se pueden&lt;br /&gt;            //añadir múltiples roles.&lt;br /&gt;            RolePrincipal role = new RolePrincipal("admin");&lt;br /&gt;            subject.getPrincipals().add(role);&lt;br /&gt;            return true;&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;            throw new LoginException(e.getMessage());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean abort() throws LoginException {&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean logout() throws LoginException {&lt;br /&gt;        try {&lt;br /&gt;            UserPrincipal user = new UserPrincipal(login);&lt;br /&gt;            RolePrincipal role = new RolePrincipal("admin");&lt;br /&gt;            subject.getPrincipals().remove(user);&lt;br /&gt;            subject.getPrincipals().remove(role);&lt;br /&gt;            return true;&lt;br /&gt;        } catch (Exception e) {&lt;br /&gt;            throw new LoginException(e.getMessage());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;A continuación, modificamos el archivo META-INF/context.xml de nuestra aplicación web para indicarle a Tomcat el Realm que deseamos usar. Al usar un módulo personalizado, debemos indicar la clase org.apache.catalina.realm.JAASRealm.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;El atributo appName es importante, ya que lo usuaremos a posteriori&lt;/p&gt;&lt;br /&gt;&lt;p&gt;También debemos indicar las clase que usaremos como UserPrincipal y RolePrincipal.&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;Realm className="org.apache.catalina.realm.JAASRealm"&lt;br /&gt; appName="CustomLogin"&lt;br /&gt; userClassNames="com.aradne.jaas.UserPrincipal"&lt;br /&gt; roleClassNames="com.aradne.jaas.RolePrincipal"&amp;gt;&lt;br /&gt;&amp;lt;/Realm&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Lo siguiente que debemos hacer es configurar la seguridad en el archivo WEB-INF/web.xml. Utilizaremos una autenticación mediante formulario. Algo que FiTe explicó en el artículo que menciono al principio. Al realm le llamo igual que en el context.xml, en mi caso: "CustomLogin"&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A continuación, al usar un módulo JAAS personalizado, debemos pasar como parámetro al servidor un archivo de configuración en el que le indicamos cual es el LoginModule a usar para el realm que hemos definido (en nuestro ejemplo, al realm lo hemos llamado "CustomLogin") en el context.xml. Debemos usar este mismo nombre. El archivo de configuración, lo podemos almacenar en cualquier directorio. En mi caso, el archivo es "C:\jaas.config":&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;CustomLogin {&lt;br /&gt; com.aradne.jaas.CustomLoginModule sufficient debug=true;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Ahora vamos a indicarle al servidor cual es el archivo de configuración JAAS. Como para esta demo estoy usando el Tomcat que se incluye con la distribución de Netbeans, voy a la pestaña "Services", expando el nodo "Servers" y edito las propiedades del servidor Tomcat.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Dentro de las propiedades del Tomcat, selecciono la pestaña "Platform" y en la caja de texto "VM Options:", incluyo el siguiente parámetro:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;-Djava.security.auth.login.config=C:"/jaas.config"&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Por supuesto, tendréis que haber creado una página con un formulario de login, etc. Ya podéis probar vuestro propio módulo de login.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Un saludo a todos.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-3084918014535145313?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/noGXCqCuYDY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/3084918014535145313/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=3084918014535145313" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/3084918014535145313?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/3084918014535145313?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2009/11/modulo-de-login-personalizado-para.html" title="Modulo de login personalizado para Tomcat" /><author><name>pedrop</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DkMHRX49cSp7ImA9WxNaEk4.&quot;"><id>tag:blogger.com,1999:blog-8397660.post-8231744554492752903</id><published>2009-11-17T12:18:00.003+01:00</published><updated>2009-11-26T12:20:34.069+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-26T12:20:34.069+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse paquete error" /><title>Cuando Eclipse deja mostrar errores en los paquetes</title><content type="html">Hoy he tenido que invertir una considerable cantidad de tiempo en solucionar un problema.&lt;br /&gt;&lt;br /&gt;El problema era que Eclipse, en la vista de paquetes, no me mostraba los paquetes con clases que no compilaban. Lo cual, si lo pensáis, es una gran.... faena.&lt;br /&gt;&lt;br /&gt;Después de, cómo no, preguntárselo a &lt;a href="http://www.google.com/search?q=eclipse+don%27t+shows+package+errors&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=org.mozilla:es-ES:official&amp;amp;client=firefox-a"&gt;Dios&lt;/a&gt; y estar enredando por las opciones (por si algo había desconfigurado mi inconsciente), dí con la solución.&lt;br /&gt;&lt;br /&gt;El problema había comenzado con un checkout del repositorio de fuentes. Por alguna razón, me había desaparecido de las librerías la referencia a JUnit. De hecho, fijándome con más atención en la vista de Problemas, me aparecía uno advirtiéndome que no podía recompilar el proyecto por que le faltaba una referencia.&lt;br /&gt;&lt;br /&gt;Después de añadir JUnit a la lista de librerías, por fin, pude ver de nuevo ese icono redondo, rojo y con un aspa en medio. Nunca antes sentí tanta alegría de verlo. Curioso.&lt;br /&gt;&lt;br /&gt;Actualizaci&amp;oacute;n:&lt;br /&gt;Una divertida variante de este problema es cuando, además de no mostrar errores en los paquetes por faltar alguna librería, es cuando detectas que tras modificar alguna parte del poryecto y lanzar la ejecución del mismo en el servidor (este arranca y despliega la aplicación sin mostrar errores) los cambios no parecen surtir efecto... por más evidentes que los hagas... vuelve a la lista de problemas y tendrás la solución.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8397660-8231744554492752903?l=finger-in-the-eye.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Fite/~4/1cKN8xGZZ0Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://finger-in-the-eye.blogspot.com/feeds/8231744554492752903/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8397660&amp;postID=8231744554492752903" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/8231744554492752903?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8397660/posts/default/8231744554492752903?v=2" /><link rel="alternate" type="text/html" href="http://finger-in-the-eye.blogspot.com/2009/11/cuando-eclipse-deja-mostrar-errores-en.html" title="Cuando Eclipse deja mostrar errores en los paquetes" /><author><name>FiTe</name><uri>http://www.blogger.com/profile/07698203860749375001</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry></feed>

