<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8397660</id><updated>2026-08-23T11:43:24.139+02:00</updated><category term="java"/><category term="mysql"/><category term="tomcat"/><category term="juegos"/><category term="acceso"/><category term="ibatis"/><category term="login"/><category term="realm"/><category term="seguridad"/><category term="0 A.D."/><category term="Android"/><category term="BeanUtils"/><category term="Calendar"/><category term="ConversionException"/><category term="Date"/><category term="Duke Nukem Forever"/><category term="Eclipse paquete error"/><category term="Estrategia"/><category term="FPS"/><category term="JDBCRealm"/><category term="JPA"/><category term="Shooter"/><category term="antipatron"/><category term="base de datos"/><category term="bb.dd."/><category term="calidad software"/><category term="catalina.properties"/><category term="directorio usuario"/><category term="diseño"/><category term="doble"/><category term="double"/><category term="entero"/><category term="error"/><category term="exceeded"/><category term="facebook"/><category term="glassfish"/><category term="innodb"/><category term="instalacion"/><category term="jdbc"/><category term="join"/><category term="linux"/><category term="myisam"/><category term="opencms"/><category term="oracle"/><category term="persistencia"/><category term="redondeo"/><category term="resultmap"/><category term="s:if"/><category term="sql"/><category term="steam"/><category term="struts"/><category term="submit dinamico struts2"/><category term="timeout"/><category term="tomcat6"/><category term="toplink"/><category term="valve"/><category term="windows"/><title type='text'>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='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://finger-in-the-eye.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.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'/><author><name>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8397660.post-5571940656549591378</id><published>2012-12-26T15:54:00.000+01:00</published><updated>2012-12-26T15:54:36.381+01:00</updated><title type='text'>[off-topic] A Madrid en transporte público</title><content type='html'>Vas a volver tú.&lt;br /&gt;
&lt;br /&gt;
Se gastan millones en recomendarnos no coger el coche y usar más transporte público en nuestros desplazamientos y resulta que cuando te decides, lo único que encuentras son trabas y precios prohibitivos.&lt;br /&gt;
&lt;br /&gt;
Aunque para ir al trabajo lo uso a diario, me ha llamado mucho la atención cómo puede cambiar mi impresión si lo usas &quot;en familia&quot;. Os cuento las incidencias en un trayecto, que podríamos llamar corto (de Las Rozas a Madrid no hay más de 18 kms.) cuando viajan dos adultos con tres niños (entre 1 y 6 años), usando dos carritos.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;De Las Rozas a Moncloa en bus&lt;/b&gt;&lt;br /&gt;
Lo primero que me llamó la atención es ver la pegatina que, normalmente, indica el acceso a personas con movilidad reducida, en la puerta de un autobús con tres escalones de unos 15cms. de alto... sin contar la altura del suelo al primer escalón, que es mayor.&lt;br /&gt;
El precio para este trayecto es de 2,60€ por adulto. Además, no te permiten pagar con billetes de más de 10€ (ni intentes pagar dos billetes con uno de 20€).&lt;br /&gt;
El conductor nos hizo plegar un carrito de los dos que llevábamos (según las normas, dijo) aún estando el autobús prácticamente vacío (sin contarnos a nosotros, 4 personas sentadas).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;De Moncloa al centro en metro&lt;/b&gt;&lt;br /&gt;
De nuevo, los accesos. Estaciones sin accesor y/o sin escalera mecánica que nos pudiese facilitar el acceso con carritos. O con ascensores/escaleras fuera de servicio. Y estoy hablando de estaciones como Moncloa (no funcionaba el ascensor) o Manuel Becerra (muchas escaleras sin rampa ni alternativa o escaleras mecánicas paradas).&lt;br /&gt;
El precio en este caso tampoco es mejor, por adulto 2€. Por lo que tuvimos que optar por comprar un bono de 10 viajes (12,20€) del que &quot;ya gastaríamos&quot; los otro 6.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Presupuesto del viaje ida y vuelta&lt;/b&gt;&amp;nbsp; &lt;br /&gt;
Bus 2 adultos &amp;nbsp;2.60€ x 4 viajes (ida y vuelta) 10.40€&lt;br /&gt;
Metro 2 adultos &amp;nbsp;2€ x 4 viajes (ida y vuelta) &amp;nbsp; &amp;nbsp; 8,00€&lt;br /&gt;
Total &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 18,40€&lt;br /&gt;
&lt;br /&gt;
Aquí cabría calcular el precio del metro a 1,2€ (12,2€ del abono de 10 viajes), pero creo que es más real el precio del billete sencillo, ya que de otro modo, estás adelantando el precio de 6 viajes que no usas.&amp;nbsp;

&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
Aunque los tiempos para los viajes (en festivo) son más que aceptables, el hecho de obligar a plegar un carro, que no te permitan pagar un viaje con billetes de más de 10€ o que los accesos sean imposibles (si viaja sólo un adulto un niño y un carro, por ejemplo), hacen que la experiencia sea de todo menos agradable.&lt;br /&gt;
La próxima vez que se nos ocurra ir a Madrid de &quot;turismo&quot; prefiero pagar el precio del aparcamiento y el combustible. Es posible que incluso salga más barato... si no contamos con la factura &quot;ecológica&quot;, claro.


</content><link rel='replies' type='application/atom+xml' href='http://finger-in-the-eye.blogspot.com/feeds/5571940656549591378/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8397660/5571940656549591378' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/5571940656549591378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/5571940656549591378'/><link rel='alternate' type='text/html' href='http://finger-in-the-eye.blogspot.com/2012/12/off-topic-madrid-en-transporte-publico.html' title='[off-topic] A Madrid en transporte público'/><author><name>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8397660.post-5966110214260608504</id><published>2012-10-23T13:28:00.002+02:00</published><updated>2012-10-23T13:28:38.826+02:00</updated><title type='text'>Programadores en rebajas</title><content type='html'>&lt;a href=&quot;http://www.nubelo.com/&quot; target=&quot;_blank&quot;&gt;Nubleo&lt;/a&gt; es un &quot;portal&quot; para poner en contacto a profesionales de la informática, diseño y sistemas con personas/negocios con necesidades en esas áreas.&lt;br /&gt;
&lt;br /&gt;
No recuerdo cómo llegué hasta ellos, pero el caso es que me cree una cuenta para poder ver qué se cocía por ahí dentro.&lt;br /&gt;
&lt;br /&gt;
La mecánica es fácil. Un cliente publica un proyecto donde describe con más o menos detalle sus necesidades. También indica el presupuesto que está dispuesto a destinar en su creación. Por otro lado, los profesionales se dan de alta indicando sus habilidades y conocimientos.&lt;br /&gt;
&lt;br /&gt;
Bien... hasta aquí, parece incluso buena idea. Pero el problema llega con propuestas como &lt;a href=&quot;http://www.nubelo.com/proyecto/programa-gestion-comedor&quot; target=&quot;_blank&quot;&gt;esta&lt;/a&gt;. Como se puede ver, se solicita una aplicación que gestione un comedor escolar. Incluida la gestión de clientes (alumnos), una pequeña contabilidad e incluso funcionalidad específica para un puto de venta.&lt;br /&gt;
&lt;br /&gt;
Y lo mejor... todo esto por la increíble cantidad de &quot;entre 500 y 1000€&quot;. Toma ya. Y no os lo perdáis... tienen 29 ofertas con una media por oferta de 900€. ¿Alguien en su sano juicio piensa que puede obtener una aplicación profesional de ese tipo por ese precio?&lt;br /&gt;
&lt;br /&gt;
Yo calculo que parir esto supondrían unas 200 horas de trabajo. Sin contar &quot;consultoría&quot;, maquetación ni instalación en cliente. O sea que, &amp;nbsp;teniendo en cuenta la oferta media, &amp;nbsp;saldría a 4,5€/hora. Sinceramente, se gana más dinero recogiendo tomates en invernaderos.&lt;br /&gt;
&lt;br /&gt;
Está claro que en estos tiempos hay mucha gente con necesidad, pero tengo muy claro que un trabajo que no se paga (o se hace de forma insuficiente), no puede ser un buen trabajo ni un buen profesional. No era mi intención criticar el negocio de Nubelo, pero quizás si deberían dar un asesoramiento a sus clientes en este sentido.&lt;br /&gt;
&lt;br /&gt;
Hay un &lt;a href=&quot;http://www.bonillaware.com/la-falacia-del-programador-perdido&quot; target=&quot;_blank&quot;&gt;artículo&lt;/a&gt; muy bueno de &lt;a href=&quot;https://twitter.com/david_bonilla&quot; target=&quot;_blank&quot;&gt;David Bonilla&lt;/a&gt; sobre el sueldo de los programadores (y por ende, del precio de las aplicaciones) que yo considero de imprescindible lectura.&lt;br /&gt;
&lt;br /&gt;
En fins...</content><link rel='replies' type='application/atom+xml' href='http://finger-in-the-eye.blogspot.com/feeds/5966110214260608504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8397660/5966110214260608504' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/5966110214260608504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/5966110214260608504'/><link rel='alternate' type='text/html' href='http://finger-in-the-eye.blogspot.com/2012/10/programadores-en-rebajas.html' title='Programadores en rebajas'/><author><name>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8397660.post-1119243001462327504</id><published>2012-10-20T10:55:00.001+02:00</published><updated>2012-10-20T10:55:20.968+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="instalacion"/><category scheme="http://www.blogger.com/atom/ns#" term="tomcat"/><title type='text'>Tomcat, una instalación, varias instancias</title><content type='html'>Existen varias razones por las que se querría tener una única instalación de Tomcat y varias instancias.&lt;br /&gt;
&lt;br /&gt;
Una de ellas puede ser simplemente por higiene... Tener separados los archivos de la distribución de los propios de las Webs que alojan permiten unas actualizaciones mucho más rápidas y sobre todo, seguras.&lt;br /&gt;
&lt;br /&gt;
Otra ventaja es que que puede alojar distintos sitios de forma independiente, esto es, que pueden pararse y arrancarse instancias sin que el resto de sitios alojados sufra esos parones. O también mantener distintas configuraciones para esos mismos sitios.&lt;br /&gt;
&lt;br /&gt;
Pero la que más me gusta a mi, es la de tener la posibilidad de tener a un equipo de desarrollo compartiendo una misma distribución de Tomcat, usando cada miembro del equipo una instancia distinta. &lt;br /&gt;
&lt;br /&gt;
Sea cual sea el motivo, creo que es una muy buena idea tener separada la distribución de Tomcat de sus aplicaciones desplegadas. Veamos cómo hacerlo.&lt;br /&gt;
&lt;br /&gt;
Durante el uso de Tomcat, el servidor lee la configuración de dos directorios (&lt;i&gt;conf&lt;/i&gt; y &lt;i&gt;webapp&lt;/i&gt;) y escribe archivos en otros tres (&lt;i&gt;log&lt;/i&gt;, &lt;i&gt;temp&lt;/i&gt; y &lt;i&gt;work&lt;/i&gt;). Además puede cargar algunos ficheros .jar y .class de otros directorios (&lt;i&gt;shared&lt;/i&gt;, &lt;i&gt;server&lt;/i&gt; y &lt;i&gt;common&lt;/i&gt;) del árbol de instalación.&lt;br /&gt;
&lt;br /&gt;
Para conseguir esta separación, usaremos las variables de entorno &lt;i&gt;CATALINA_HOME&lt;/i&gt;, que apuntará a los binarios de la distribución Tomcat, y &lt;i&gt;CATALINA_BASE&lt;/i&gt;, que apuntarán a los directorios de la instancia.
Lo primero que hay que hacer es crear un lugar para albergar los directorios de la instancia.&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;    cd /opt
    mkdir instancias-tomcat
    cd instancias-tomcat
&lt;/code&gt;&lt;/pre&gt;
Después creamos un directorio por cada instancia de Tomcat que vayamos a albergar&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;    mkdir misite.com
    cd misite.com
&lt;/code&gt;&lt;/pre&gt;
Copiaremos ahora el directorio config de la distribución Tomcat a este nuevo directorio, y creamos el resto de directorios de la instancia:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;    cp -a $CATALINA_HOME/conf .
    mkdir common logs temp server shared webapps work
&lt;/code&gt;&lt;/pre&gt;
Por último, colocaremos el contenido de la aplicación Web para esta instancia en el subdirectorio de &lt;i&gt;CATALINA_BASE&lt;/i&gt;, como haríamos en cualquier otra configuración de Tomcat.
Ahora necesitamos editar el fichero conf/server.xml de la instancia para asegurarnos que no intentamos abir los mismos puertos que los usados en otras instancias. Cambiaremos el puerto de cierre por un número de puerto diferente para cada instancia de Tomcat:
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;Server port=&quot;&lt;b&gt;8007&lt;/b&gt;&quot; shutdown=&quot;SHUTDOWN&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
Y los puertos del conector HTTP:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;Connector port=&quot;&lt;b&gt;8087&lt;/b&gt;&quot; protocol=&quot;HTTP/1.1&quot; 
               connectionTimeout=&quot;20000&quot; 
               redirectPort=&quot;&lt;b&gt;8743&lt;/b&gt;&quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
Es buena idea &lt;i&gt;limpiar&lt;/i&gt; este fichero de todo lo que no sea necesario (conectores para los ejemplos que vienen con Tomcat, configuraciones comentadas...) y realizar una búsqueda en el texto por &lt;i&gt;port=&lt;/i&gt; y cambiar el valor del puerto de ese atributo si su elemento no está comentado.&lt;br /&gt;
&lt;br /&gt;
Ahora sólo faltaría crear un script de arranque y otro de parada para cada instancia creada. El de arranque podría ser parecido a esto:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
#!bash/sh/
export CATALINA_HOME=&quot;/opt/instancias-tomcat/misite.com&quot;
export CATALINA_BASE=&quot;/opt/tomcat&quot;
service tomcat start
&lt;/code&gt;&lt;/pre&gt;
Y para la parada:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
#!bash/sh/
export CATALINA_HOME=&quot;/opt/instancias-tomcat/misite.com&quot;
export CATALINA_BASE=&quot;/opt/tomcat&quot;
service tomcat stop
&lt;/code&gt;&lt;/pre&gt;
Con esto, ya tendríamos disponible nuestras nuevas instancias. </content><link rel='replies' type='application/atom+xml' href='http://finger-in-the-eye.blogspot.com/feeds/1119243001462327504/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8397660/1119243001462327504' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/1119243001462327504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/1119243001462327504'/><link rel='alternate' type='text/html' href='http://finger-in-the-eye.blogspot.com/2012/10/tomcat-una-instalacion-varias-instancias.html' title='Tomcat, una instalación, varias instancias'/><author><name>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="calidad software"/><title type='text'>Review del libro La calidad del software y su medida</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/--5_S5kmPOq0/ToWwgxdWXqI/AAAAAAAAB34/mV13C2FtuSQ/s1600/calidadcodigo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;157&quot; src=&quot;http://1.bp.blogspot.com/--5_S5kmPOq0/ToWwgxdWXqI/AAAAAAAAB34/mV13C2FtuSQ/s320/calidadcodigo.jpg&quot; width=&quot;113&quot; /&gt;&lt;/a&gt;&lt;/div&gt;El &lt;a href=&quot;http://www.casadellibro.com/libro-la-calidad-del-software-y-su-medida/932655/2900000951965&quot;&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 &quot;teorías&quot; 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 &quot;engranaje&quot; 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.</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/fullpage/post/8397660/1282354369013050200' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/1282354369013050200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/1282354369013050200'/><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>Anonymous</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='https://img1.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><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><title type='text'>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=&quot;http://finger-in-the-eye.blogspot.com/2009/11/modulo-de-login-personalizado-para.html&quot;&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=&quot;Apple-style-span&quot; style=&quot;color: #333333; font-family: Verdana, sans-serif; font-size: 13px; line-height: 19px;&quot;&gt;-Djava.security.auth.login.config=C:&quot;/jaas.config&quot;&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 &quot;&lt;i&gt;jaas.config&lt;/i&gt;&quot; 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 &quot;&lt;b&gt;java.security.auth.login.config&lt;/b&gt;&quot;.&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 &quot;&lt;i&gt;com.test.listeners&lt;/i&gt;&quot;.&lt;/div&gt;&lt;div&gt;Creamos o copiamos el archivo &quot;&lt;i&gt;jaas.config&lt;/i&gt;&quot; también en el paquete &quot;&lt;i&gt;com.test.listeners&lt;/i&gt;&quot;.&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(&quot;jaas.config&quot;).toURI());&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; System.setProperty(&quot;java.security.auth.login.config&quot;, 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 &quot;&lt;i&gt;jaas.config&lt;/i&gt;&quot;. 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</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/fullpage/post/8397660/362165618221173736' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/362165618221173736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/362165618221173736'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><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><title type='text'>Cómo eliminar definitivamente una cuenta en facebook (actualización)</title><content type='html'>En un post del año 2010 (&quot;&lt;a href=&quot;http://finger-in-the-eye.blogspot.com/2010/04/como-eliminar-definitivamente-una.html&quot;&gt;Cómo eliminar definitivamente una cuenta en facebook&lt;/a&gt;&quot;) 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=&quot;https://ssl.facebook.com/help/contact.php?show_form=delete_account&quot;&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.</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/fullpage/post/8397660/2314698001071514425' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/2314698001071514425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/2314698001071514425'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="directorio usuario"/><category scheme="http://www.blogger.com/atom/ns#" term="tomcat"/><title type='text'>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 &quot;visible&quot;, 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=&quot;org.apache.catalina.startup.UserConfig&quot;
    directoryName=&quot;public_html&quot;
    userClass=&quot;org.apache.catalina.startup.PasswdUserDatabase&quot; /&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=&quot;org.apache.catalina.startup.UserConfig&quot;
    directoryName=&quot;public_html&quot;
    homeBase=&quot;/home&quot;
    serClass=&quot;org.apache.catalina.startup.HomesUserDatabase&quot; /&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=&quot;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&quot;&gt; Tomcat 6.0 La guía definitiva&lt;/a&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/fullpage/post/8397660/843009447897922828' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/843009447897922828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/843009447897922828'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><title type='text'>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=&quot;font-size: large;&quot;&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=&quot;font-size: large;&quot;&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&#39;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=&quot;font-size: large;&quot;&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=&quot;font-size: large;&quot;&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=&quot;http://es.wikipedia.org/wiki/Felaci%C3%B3n&quot;&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=&quot;font-size: large;&quot;&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;El jarrón chino&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&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=&quot;font-size: small;&quot;&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=&quot;font-size: small;&quot;&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=&quot;font-size: small;&quot;&gt;Estos son los que yo tengo catalogados... ¿cuáles son los tuyos? &lt;/span&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/fullpage/post/8397660/6204696400569959825' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/6204696400569959825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/6204696400569959825'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="antipatron"/><category scheme="http://www.blogger.com/atom/ns#" term="diseño"/><category scheme="http://www.blogger.com/atom/ns#" term="error"/><category scheme="http://www.blogger.com/atom/ns#" term="sql"/><title type='text'>Review SQL Antipatterns</title><content type='html'>&lt;a href=&quot;http://1.bp.blogspot.com/-lgM0-gz-H28/TilMp5s-CcI/AAAAAAAABVg/Nt3ez9v544k/s1600/SQLPatterns.jpg&quot; onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5632117091751299522&quot; src=&quot;http://1.bp.blogspot.com/-lgM0-gz-H28/TilMp5s-CcI/AAAAAAAABVg/Nt3ez9v544k/s320/SQLPatterns.jpg&quot; style=&quot;cursor: pointer; float: left; height: 320px; margin: 0pt 10px 10px 0pt; width: 320px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Hace unos días terminé de leer &lt;a href=&quot;http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers/dp/1934356557&quot;&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=&quot;http://www.amazon.com/Bill-Karwin/e/B003TTPJAA/ref=ntt_athr_dp_pel_1&quot;&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=&quot;font-style: italic;&quot;&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 &quot;cruces&quot; 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.</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/fullpage/post/8397660/7512551520637108362' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/7512551520637108362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/7512551520637108362'/><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>Anonymous</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='https://img1.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><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><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 type='text'>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=&quot;http://finger-in-the-eye.blogspot.com/2009/01/login-de-un-usuario-mediante-realm-en.html&quot;&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.</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/fullpage/post/8397660/1354437770949621103' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/1354437770949621103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/1354437770949621103'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="submit dinamico struts2"/><title type='text'>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 &quot;method&quot; 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=&quot;unaAccion&quot;&amp;gt;&lt;br /&gt;  &amp;lt;s:submit method=&quot;ver&quot; value=&quot;Ver&quot;/&amp;gt;&lt;br /&gt;  &amp;lt;s:submit method=&quot;cancelar&quot; value=&quot;Cancelar&quot;/&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=&quot;borrarEntrada.action&quot;&amp;gt;&lt;br /&gt;  &amp;lt;s:iterate value=&quot;entradas&quot;&amp;gt;&lt;br /&gt;      &amp;lt;s:property value=&quot;titulo&quot;&amp;gt; &lt;br /&gt;      &amp;lt;input type=&quot;submit&quot; name=&quot;borrar[&amp;lt;s:property value=&#39;id&#39;&amp;gt;]&quot; value=&quot;borrar&quot;/&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 :)</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/fullpage/post/8397660/862216041665596337' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/862216041665596337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/862216041665596337'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="Duke Nukem Forever"/><category scheme="http://www.blogger.com/atom/ns#" term="FPS"/><category scheme="http://www.blogger.com/atom/ns#" term="juegos"/><category scheme="http://www.blogger.com/atom/ns#" term="Shooter"/><title type='text'>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=&quot;http://www.dukenukemforever.com/&quot;&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=&quot;http://www.steampowered.com/&quot;&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=&quot;YouTube video player&quot; width=&quot;440&quot; height=&quot;268&quot; src=&quot;http://www.youtube.com/embed/_5svP9Wu0nk&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&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/fullpage/post/8397660/483663530681218810' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/483663530681218810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/483663530681218810'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/_5svP9Wu0nk/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="0 A.D."/><category scheme="http://www.blogger.com/atom/ns#" term="Estrategia"/><category scheme="http://www.blogger.com/atom/ns#" term="juegos"/><title type='text'>0 A.D. Alpha 4 Daedalus, juego de estrategia open-source</title><content type='html'>&lt;a href=&quot;http://wildfiregames.com/0ad/&quot;&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=&quot;http://wildfiregames.com/&quot;&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=&quot;&quot; frameborder=&quot;0&quot; height=&quot;268&quot; src=&quot;http://www.youtube.com/embed/KTm-h6KFZCM&quot; title=&quot;YouTube video player&quot; width=&quot;440&quot;&gt;&lt;/iframe&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/fullpage/post/8397660/6319676457594519102' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/6319676457594519102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/6319676457594519102'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/KTm-h6KFZCM/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="ibatis"/><category scheme="http://www.blogger.com/atom/ns#" term="join"/><category scheme="http://www.blogger.com/atom/ns#" term="resultmap"/><title type='text'>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 &quot;problema&quot;, he usado la siguiente &quot;estrategia&quot; (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=&quot;selectPersonasContratoActivoResult&quot; class=&quot;persona&quot; groupby=&quot;idContrato&quot;&amp;gt;&lt;br /&gt;  &amp;lt;result property=&quot;idPersona&quot; column=&quot;ID_PERSONA&quot;&amp;gt;&lt;br /&gt;  &amp;lt;result property=&quot;nombre&quot; column=&quot;NOMBRE&quot;&amp;gt;&lt;br /&gt;  &amp;lt;result property=&quot;idContrato&quot; column=&quot;ID_CONTRATO&quot;&amp;gt;&lt;br /&gt;  &amp;lt;result property=&quot;centros&quot; resultmap=&quot;selectCentrosContratoResult&quot;&amp;gt;&lt;br /&gt;&amp;lt;/result&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;resultmap id=&quot;selectCentrosContratoResult&quot; class=&quot;centro&quot;&amp;gt;&lt;br /&gt;  &amp;lt;result property=&quot;idCentro&quot; column=&quot;ID_CENTRO&quot;&amp;gt;&lt;br /&gt;  &amp;lt;result property=&quot;nombre&quot; column=&quot;NOMBRE&quot;&amp;gt;&lt;br /&gt;&amp;lt;/result&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;select id=&quot;selectPersonasContratoActivo&quot; resultmap=&quot;selectPersonasContratoActivoResult&quot;&amp;gt;                                                                                          &amp;lt;/select&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;select id=&quot;selectCentrosContrato&quot; parameterclass=&quot;int&quot; resultmap=&quot;selectCentrosContratoResult&quot;&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=&quot;selectPersonasContratoActivoResult&quot; class=&quot;persona&quot; &lt;strong&gt;groupby=&quot;idContrato&quot;&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 &quot;centros&quot;, y esta otra línea&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;  &amp;lt;result property=&quot;centros&quot; column=&quot;ID_CONTRATO&quot; &lt;strong&gt;resultmap=&quot;selectCentrosContratoResult&quot;&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) &quot;centros&quot; 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=&quot;http://ibatis.apache.org/docs/dotnet/datamapper/ch03s05.html&quot;&gt;página &lt;/a&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/fullpage/post/8397660/896896245868318353' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/896896245868318353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/896896245868318353'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="doble"/><category scheme="http://www.blogger.com/atom/ns#" term="double"/><category scheme="http://www.blogger.com/atom/ns#" term="entero"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="redondeo"/><title type='text'>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=&quot;http://download.oracle.com/javase/6/docs/api/java/text/NumberFormat.html&quot;&gt;java.text.DecimalFormat&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Esta clase es perfecta para &quot;decorar&quot; 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 &quot;format&quot;. Un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;                 DecimalFormat df = new DecimalFormat (&quot;##&quot;);&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.</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/fullpage/post/8397660/4134150485054709352' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/4134150485054709352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/4134150485054709352'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="exceeded"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="timeout"/><title type='text'>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=&quot;http://forums.mysql.com/read.php?22,37371,39620#msg-39620&quot;&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.</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/fullpage/post/8397660/267661839772352459' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/267661839772352459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/267661839772352459'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="BeanUtils"/><category scheme="http://www.blogger.com/atom/ns#" term="ConversionException"/><category scheme="http://www.blogger.com/atom/ns#" term="Date"/><title type='text'>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=&quot;http://commons.apache.org/beanutils/&quot;&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 &#39;Date&#39;&lt;br /&gt;org.apache.commons.beanutils.ConversionException: No value specified for &#39;Date&#39;&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 &quot;descubrimiento&quot; fue hace ya bastante tiempo y no tengo ni idea de dónde lo saqué.</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/fullpage/post/8397660/8867487294338665809' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/8867487294338665809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/8867487294338665809'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="juegos"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><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="windows"/><title type='text'>¿Un nuevo impulso para Linux?</title><content type='html'>Soy usuario habitual de Linux, en concreto de &lt;a href=&quot;http://www.ubuntu.com/&quot;&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=&quot;http://www.canonical.com/&quot;&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=&quot;http://www.microsoft.com/windows/&quot;&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=&quot;http://www.java.com/&quot;&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: &quot;me gusta jugar&quot;. 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=&quot;http://www.winehq.org/&quot;&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=&quot;http://www.redhat.com/&quot;&gt;Red Hat&lt;/a&gt;, &lt;a href=&quot;http://www.debian.org/&quot;&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=&quot;http://www.valvesoftware.com/&quot;&gt;Valve&lt;/a&gt; de publicar una versión de &lt;a href=&quot;http://store.steampowered.com/&quot;&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=&quot;http://www.idsoftware.com/&quot;&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 &quot;empujón&quot; que haya recibido Linux en los últimos años.</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/fullpage/post/8397660/1502518848886872203' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/1502518848886872203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/1502518848886872203'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Calendar"/><title type='text'>Android no muestra todos mis calendarios</title><content type='html'>Si tenéis un móvil con Android, quizás también &quot;sufrais&quot; 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 &quot;bug&quot; (no creo que se pueda llamar así, pero bueno...) se soluciona de una forma muy sencilla. En &quot;Ajustes&quot; seleccionar &quot;Aplicaciones&quot; y después &quot;Administrar aplicaciones&quot;. 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 &quot;Calendario&quot; (es posible que aparezca también como com.android.calendar o similar). Seleccionamos esta aplicación y a continuación pulsamos el botón &quot;Borrar datos&quot; (con valor) y a después, abajo, &quot;Forzar detención&quot;.&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.</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/fullpage/post/8397660/8991021024883877801' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/8991021024883877801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/8991021024883877801'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><title type='text'>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=&quot;http://www.ubuntu.com/products/whatisubuntu/1004features&quot;&gt;Aquí&lt;/a&gt; puedes acceder a un tour con las novedades que se incluyen en la versión de escritorio.</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/fullpage/post/8397660/5718471444203288868' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/5718471444203288868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/5718471444203288868'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><title type='text'>ScrumNinja: herramienta para la gestión de equipos con Scrum</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://scrumninja.com/images/main/logo_guest_250x149.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://scrumninja.com/images/main/logo_guest_250x149.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Si gestionas tus proyectos con &lt;a href=&quot;http://es.wikipedia.org/wiki/Scrum&quot;&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=&quot;http://scrumninja.com/scrum_software&quot;&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=&quot;http://scrumninja.com/pricing&quot;&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.</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/fullpage/post/8397660/5557057078793548620' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/5557057078793548620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/5557057078793548620'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><title type='text'>Netbeans 6.9 Beta ya disponible</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://netbeans.org/images_www/visual-guidelines/NB-logo-single.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://netbeans.org/images_www/visual-guidelines/NB-logo-single.jpg&quot; /&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=&quot;http://www.osgi.org/Main/HomePage&quot;&gt;OSGi&lt;/a&gt;, &lt;a href=&quot;http://javafx.com/&quot;&gt;JavaFX&lt;/a&gt; (editor visual similar al de Swing), PHP (soporte para &lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt;), soporte para &lt;a href=&quot;http://www.rubyonrails.org.es/&quot;&gt;Ruby on Rails 3.0&lt;/a&gt;, soporte para &lt;a href=&quot;http://www.springsource.org/&quot;&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=&quot;http://netbeans.org/community/releases/69/&quot;&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=&quot;http://download.netbeans.org/netbeans/6.9/beta/&quot;&gt;http://download.netbeans.org/netbeans/6.9/beta/&lt;/a&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/fullpage/post/8397660/4111204722357287188' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/4111204722357287188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/4111204722357287188'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="facebook"/><title type='text'>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=&quot;http://www.blogger.com/%20http://www.facebook.com/help/contact.php?show_form=delete_account&quot;&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 &quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;Cuenta programada para su eliminación&lt;/span&gt;&quot; (esto me suena a &lt;span style=&quot;font-style: italic;&quot;&gt;Star Wars, episodio IV&lt;/span&gt;), con el siguiente contenido:&lt;br /&gt;&lt;br /&gt;&quot;&lt;span style=&quot;font-style: italic;&quot;&gt;Hola, XXXXXXXXXXX:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&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=&quot;font-style: italic;&quot;&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=&quot;font-style: italic;&quot;&gt;http://www.facebook.com/account_delete.php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Gracias,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;El equipo de Facebook&lt;/span&gt;&quot;</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/fullpage/post/8397660/2635488599570354086' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/2635488599570354086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/2635488599570354086'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="s:if"/><category scheme="http://www.blogger.com/atom/ns#" term="struts"/><title type='text'>¿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 &#39;N&#39;.&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=&quot;%{nombre_propiedad eq &#39;N&#39;}&quot;&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=&quot;http://struts.apache.org/2.x/docs/why-wont-the-if-tag-evaluate-a-one-char-string.html&quot;&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=&#39;%{nombre_propiedad eq &quot;N&quot;}&#39;&amp;gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sirva.</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/fullpage/post/8397660/7586871135109493321' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/7586871135109493321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/7586871135109493321'/><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>Anonymous</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='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><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><category scheme="http://www.blogger.com/atom/ns#" term="JPA"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><category scheme="http://www.blogger.com/atom/ns#" term="persistencia"/><category scheme="http://www.blogger.com/atom/ns#" term="toplink"/><title type='text'>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 (&quot;persistence.xml&quot;) 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 &quot;manualmente&quot;).&lt;br /&gt;&lt;br /&gt;Esto es posible modificando programáticamente una unidad de persistencia existente en el archivo &quot;persistence.xml&quot;. Con un poco de trabajo, se puede crear un &quot;wizard&quot; 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=&quot;font-style:italic;&quot;&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 &quot;persistence.xml&quot;. 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=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;persistence version=&quot;1.0&quot; xmlns=&quot;http://java.sun.com/xml/ns/persistence&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd&quot;&amp;gt;&lt;br /&gt;  &amp;lt;persistence-unit name=&quot;PersistenceUnit&quot; transaction-type=&quot;RESOURCE_LOCAL&quot;&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,&quot;user&quot;);&lt;br /&gt;props.put(TopLinkProperties.JDBC_PASSWORD,&quot;password&quot;);&lt;br /&gt;props.put(TopLinkProperties.JDBC_URL,&quot;jdbc:mysql://hostname:3306/targetddbb?sessionVariables=storage_engine=InnoDB&quot;);&lt;br /&gt;props.put(&quot;toplink.ddl-generation&quot;,&quot;create-tables&quot;);&lt;br /&gt;props.put(TopLinkProperties.JDBC_DRIVER,&quot;com.mysql.jdbc.Driver&quot;);&lt;br /&gt;EntityManagerFactory emf = Persistence.createEntityManagerFactory(&quot;PersistenceUnit&quot;,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 &quot;toplink.ddl-generation&quot;, con el valor &quot;create-tables&quot;. Esto hace que al instanciar el objeto EntityManager, se regeneren las tablas en la base de datos, en base a las entidades declaradas en &quot;persistence.xml&quot; y asociadas a la unidad &quot;PersistenceUnit&quot;. 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...</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/fullpage/post/8397660/6628226074404366167' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/6628226074404366167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8397660/posts/default/6628226074404366167'/><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>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry></feed>