<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkYNRH85eyp7ImA9WhRXF0s.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113</id><updated>2011-12-24T21:56:35.123+01:00</updated><category term="GIS" /><category term="logging" /><category term="geodatabase" /><category term="enlaces" /><category term="sonar" /><category term="curro" /><category term="yahoo" /><category term="postgres" /><category term="Microsoft" /><category term="javascript" /><category term="html5" /><category term="cache" /><category term="web" /><category term="swing" /><category term="playa" /><category term="Geoserver" /><category term="junit" /><category term="gwt" /><category term="chorrada" /><category term="maven" /><category term="tomcat" /><category term="struts2" /><category term="analytics" /><category term="comparativa" /><category term="curiosidades" /><category term="C++" /><category term="firefox" /><category term="test" /><category term="liferay" /><category term="python" /><category term="postGis" /><category term="utilidad" /><category term="salarios" /><category term="iconv" /><category term="windows" /><category term="estadisticas" /><category term="eclipse" /><category term="impresiones" /><category term="validacion" /><category term="errores" /><category term="OpenLayers" /><category term="consultorias" /><category term="civinova.org" /><category term="codigo" /><category term="musica" /><category term="javafx" /><category term="hibernate" /><category term="jsr-286" /><category term="shapefile" /><category term="ant" /><category term="java vs C++" /><category term="java" /><category term="personal" /><category term="organizar" /><category term="fecha" /><category term="viernes" /><category term="disculpas" /><category term="videos" /><category term="multicore" /><category term="documentacion" /><category term="hudson" /><category term="blog" /><category term="PFC" /><category term="herramientas" /><category term="thread" /><category term="ie" /><category term="lenguajes" /><category term="netbeans" /><category term="cambios" /><category term="portlet" /><category term="SIG" /><category term="Sun" /><category term="shp2pgsql" /><category term="struts" /><category term="opinion" /><category term="buscadores" /><category term="postgreSql" /><category term="qtjambi" /><category term="patrones" /><category term="auto build" /><category term="j2ee" /><category term="SVN" /><category term="Google Spherical Mercator" /><category term="videojuegos" /><category term="base de datos" /><category term="google apps" /><category term="master" /><category term=".NET" /><category term="trabajo" /><title>Güevoneando en Java</title><subtitle type="html">Cosillas sobre Java y cosillas del programar, algunas noticias de este mundo de la informática y opiniones sobre este mundo en general.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://guevoneandojava.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>91</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/GuevoneandoEnJava" /><feedburner:info uri="guevoneandoenjava" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>36.7121</geo:lat><geo:long>-4.41916</geo:long><entry gd:etag="W/&quot;DkQASHg6eSp7ImA9WhZSGU0.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-7737304105140481567</id><published>2011-04-04T09:56:00.004+02:00</published><updated>2011-04-04T10:05:49.611+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-04T10:05:49.611+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="personal" /><title>Nuevo proyecto</title><content type="html">&lt;p&gt; He comenzado un nuevo proyecto con unos compañeros de trabajo, en una de nuestras conversaciones de comida hablábamos de que existe una gran cantidad de recursos en la web que hablan sobre programación, sin embargo son menos los que lo hacen en castellano. Así que nos hemos puesto de acuerdo para crear un &lt;a href="http://www.sobreprogramacion.com"&gt;blog&lt;/a&gt; que se pretende ser un centro de divulgación de los diferentes aspectos que hay alrededor de la ingeniería del software. La idea es que haya artículos de diferente naturaleza, siendo algunos de ellos más prácticos y otros más teóricos, algunos más subjetivos y otros más objetivos. Cualquier colaboración o propuesta acerca de los contenidos que os interesaría ver en este blog, serán bienvenidos. &lt;/p&gt;
&lt;p&gt; Mi intención no es abandonar este blog en favor del otro, si no más bien publicar en ambos sitios los mismos artículos, pero con la ventaja de tener dos "ventanas" al mundo.&lt;/p&gt;
&lt;p&gt; Ahora mismo estamos buscando colaboradores, si te sientes con ganas de aportar algo interesante, hazlo saber, entra en &lt;a href="http://www.sobreprogramacion.com"&gt;http://www.sobreprogramacion.com&lt;/a&gt; y opina, pregunta o aporta lo que consideres oportuno sobre programación e ingeniería del software.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-7737304105140481567?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wZaUfojWxUxVsRvU_5H6EP1-_PA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wZaUfojWxUxVsRvU_5H6EP1-_PA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wZaUfojWxUxVsRvU_5H6EP1-_PA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wZaUfojWxUxVsRvU_5H6EP1-_PA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/QZ6nLCyg1jM" height="1" width="1"/&gt;</content><link rel="related" href="http://www.sobreprogramacion.com" title="Nuevo proyecto" /><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/7737304105140481567/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=7737304105140481567" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7737304105140481567?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7737304105140481567?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/QZ6nLCyg1jM/nuevo-proyecto.html" title="Nuevo proyecto" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2011/04/nuevo-proyecto.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMFSH07eyp7ImA9Wx5XE04.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-8286689680206319760</id><published>2010-09-13T01:42:00.008+02:00</published><updated>2010-09-13T02:06:59.303+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-13T02:06:59.303+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="html5" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>HTML5</title><content type="html">&lt;p&gt; Esta es una entrada breve. Llevo tiempo intentando prepararme para la entrada inminente del HTML5, el futuro de internet (espero) que tiene cosas muy interesantes como el canvas y tags de video y audio. Una web multimedia sin complicados scripts ni plugin adicionales. &lt;/p&gt;

&lt;p&gt; Bueno, pues hoy he descubierto &lt;a href="http://www.html5test.com/"&gt;http://www.html5test.com/&lt;/a&gt; una web que realiza un test de compatibilidad de tu navegador con HTML5. Bueno, como no, aqui el resultado : &lt;/p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JPDq88g-ZiE/TI1mdozsphI/AAAAAAAADnI/sv3GW3xS1nE/s1600/screen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 310px;" src="http://2.bp.blogspot.com/_JPDq88g-ZiE/TI1mdozsphI/AAAAAAAADnI/sv3GW3xS1nE/s400/screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5516177777955218962" /&gt;&lt;/a&gt;
&lt;p&gt; El orden de los navegadores es (de izquierda a derecha, primera fila primero): 
 Chrome 6.0 (217), Firefox 3.6.9(139), Opera 10.62 ( 159) y Explorer 8.0 (27).
&lt;/p&gt;&lt;p&gt;
No se como de fiable es este test, pero me lo creo bastante. Conclusion: olvidarse por completo de explorer, no merece la pena, acabará por ceder... &lt;/p&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Actualizado&lt;/span&gt; : Añado el resultado hecho con Safari 5.0.2 para Windows (207)&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JPDq88g-ZiE/TI1rAR0caTI/AAAAAAAADnU/5zqC72uhW-Q/s1600/screen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 209px;" src="http://1.bp.blogspot.com/_JPDq88g-ZiE/TI1rAR0caTI/AAAAAAAADnU/5zqC72uhW-Q/s400/screen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5516182771126266162" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-8286689680206319760?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ggwHp_WZjkzrjjxZ5HBQO2gEBTo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ggwHp_WZjkzrjjxZ5HBQO2gEBTo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ggwHp_WZjkzrjjxZ5HBQO2gEBTo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ggwHp_WZjkzrjjxZ5HBQO2gEBTo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/NYDJ6xUsHeY" height="1" width="1"/&gt;</content><link rel="enclosure" type="text/html" href="http://www.html5test.com/" length="0" /><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/8286689680206319760/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=8286689680206319760" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/8286689680206319760?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/8286689680206319760?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/NYDJ6xUsHeY/html5.html" title="HTML5" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_JPDq88g-ZiE/TI1mdozsphI/AAAAAAAADnI/sv3GW3xS1nE/s72-c/screen.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2010/09/html5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ENQ38-cCp7ImA9WhZSFEQ.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-5565586713918409751</id><published>2010-08-11T15:58:00.002+02:00</published><updated>2011-03-30T17:41:32.158+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-30T17:41:32.158+02:00</app:edited><title>Curiosioso bug del copilador Java</title><content type="html">&lt;p&gt;Esto lo comento como curiosidad que me ha ocurrido con cierto código. Las siguientes lineas de código se crearon usando Eclipse 3.5 y el compilador javac 1.6 (1.6.0.13 en mi caso) no me detecta error, pero usando la versión de eclipse 3.6 sí.&lt;/p&gt;
&lt;p&gt;El código sería el siguiente : &lt;/p&gt;
&lt;pre class="java"&gt;
public class BugClass { 
  int methodName (List&lt;String&gt; list) { return 0; }http://www.blogger.com/img/blank.gif
  double methodName (List&lt;Integer&gt; list) {return 0;}
&lt;/pre&gt;

&lt;p&gt;Resulta que este es un error del compilador de Java que me ha llamado mucho la atención. La pagina del bug este esta : &lt;a href="http://bugs.sun.com/view_bug.do?bug_id=6182950"&gt;http://bugs.sun.com/view_bug.do?bug_id=6182950&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-5565586713918409751?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CGLcz4Rf1autoz6mQXNgoix5vK0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CGLcz4Rf1autoz6mQXNgoix5vK0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CGLcz4Rf1autoz6mQXNgoix5vK0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CGLcz4Rf1autoz6mQXNgoix5vK0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/r1avuOeBhgA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/5565586713918409751/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=5565586713918409751" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5565586713918409751?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5565586713918409751?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/r1avuOeBhgA/curiosioso-bug-del-copilador-java.html" title="Curiosioso bug del copilador Java" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2010/08/curiosioso-bug-del-copilador-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YFQHk6cSp7ImA9Wx5TE0w.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-7460259388049690783</id><published>2010-07-28T12:41:00.004+02:00</published><updated>2010-07-28T13:05:11.719+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-28T13:05:11.719+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="multicore" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="thread" /><title>Java es Multi Core</title><content type="html">Hay una pregunta muy común en los desarrollos de aplicaciones java sobre los modernos ordenadores multicore : Java no es multicore.
&lt;p&gt; La respuesta es simple: No por defecto, hay que forzarlo. Yo siempre había pensado que java no soportaba los sistemas multinucleo, solo existía un proceso "java.exe" y ese estaba en un solo nucleo. Sin embargo he encontrado información al respecto (ver enlace adjunto) y como siempre, lo anoto por aqui. La clave está en la clase &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ExecutorService.html"&gt;ExecutorService&lt;/a&gt; que permite controlar el numero de nucleos que quieres usar. A continuacion el ejemplo copiado &lt;a href="http://desarrollo-software.blogspot.com/2007/12/java-1516-es-multi-core_3256.html"&gt;de este blog&lt;/a&gt; y el &lt;a href="http://desarrollo-software.blogspot.com/2007/12/java-1516-es-multi-core-ejemplo_3311.html"&gt;ejemplo&lt;/a&gt;.

&lt;/p&gt;&lt;pre class="java"&gt;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

public class Main {
public static void main(String[] args) {

  ParallelTask pt1 = new ParallelTask();
  ParallelTask pt2 = new ParallelTask();
  ParallelTask pt3 = new ParallelTask();
  ParallelTask pt4 = new ParallelTask();
  ParallelTask pt5 = new ParallelTask();
  ParallelTask pt6 = new ParallelTask();
  ExecutorService es = Executors.newFixedThreadPool(2);
  es.execute(pt1);
  es.execute(pt2);
  es.execute(pt3);
  es.execute(pt4);
  es.execute(pt5);
  es.execute(pt6);

  es.shutdown();
}}
&lt;/pre&gt;
&lt;p&gt;Esta ejecucion esta usando los dos nucleos mi ordenado:
&lt;/p&gt;&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JPDq88g-ZiE/TFAN0xHoRVI/AAAAAAAADhs/bPvL44TZNt4/s1600/process.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 355px;" src="http://2.bp.blogspot.com/_JPDq88g-ZiE/TFAN0xHoRVI/AAAAAAAADhs/bPvL44TZNt4/s400/process.png" alt="" id="BLOGGER_PHOTO_ID_5498910345209070930" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
Además, permite ejecutar "Callable" igual que los threads : &lt;/p&gt;
&lt;pre class="java"&gt;
public static void main(String[] args) throws InterruptedException, ExecutionException {
 ExecutorService es = Executors.newFixedThreadPool(7);
 
Future&lt;Double&gt; f1 = es.submit(new MyCall("F1"));
Future&lt;Double&gt; f2 = es.submit(new MyCall("F2"));
Future&lt;Double&gt; f3 = es.submit(new MyCall("F3"));
Future&lt;Double&gt; f4 = es.submit(new MyCall("F4"));
Future&lt;Double&gt; f5 = es.submit(new MyCall("F5"));
Future&lt;Double&gt; f6 = es.submit(new MyCall("F6"));
Future&lt;Double&gt; f7 = es.submit(new MyCall("F7"));

  
System.err.println( " &gt;&gt; F1 " + f1.get());
System.err.println( " &gt;&gt; F2 " + f2.get());
System.err.println( " &gt;&gt; F3 " + f3.get());
System.err.println( " &gt;&gt; F4 " + f4.get());
System.err.println( " &gt;&gt; F5 " + f5.get());
System.err.println( " &gt;&gt; F6 " + f6.get());
System.err.println( " &gt;&gt; F7 " + f7.get());
es.shutdown();

}

private static class MyCall implements Callable&amp;lt;Double&gt; {
 private String name;
 MyCall (String name) {
  this.name = name;
 }
 private double result = 0;
 @Override
 public Double call() throws Exception {
   double max = Math.random() * 200000000;
   System.out.println (" Starting : " + name + " loop : " + max);
   for (int i = 0; i &amp;lt; max; i++)
      result  = Math.sin(i);
   System.out.println("finishing task " + name);
   return result;
}}
&lt;/pre&gt;
&lt;p&gt;Una de esas cosas que interesa saber &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-7460259388049690783?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0HZHQ1dMDu5eHtAG_KDCLSzUcWg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0HZHQ1dMDu5eHtAG_KDCLSzUcWg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0HZHQ1dMDu5eHtAG_KDCLSzUcWg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0HZHQ1dMDu5eHtAG_KDCLSzUcWg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/Z40iLuNYgeA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/7460259388049690783/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=7460259388049690783" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7460259388049690783?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7460259388049690783?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/Z40iLuNYgeA/java-es-multi-core.html" title="Java es Multi Core" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_JPDq88g-ZiE/TFAN0xHoRVI/AAAAAAAADhs/bPvL44TZNt4/s72-c/process.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2010/07/java-es-multi-core.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4NSXk_cSp7ImA9WxFbFE0.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-5846352902504023235</id><published>2010-07-06T09:55:00.003+02:00</published><updated>2010-07-06T10:13:18.749+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-06T10:13:18.749+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="disculpas" /><title>Cambios</title><content type="html">&lt;p&gt;Hola a todos, ha habido algunos cambios importantes en mi vida, el mayor de todos que soy Padre &lt;a href="http://2.bp.blogspot.com/_JPDq88g-ZiE/TDLlTcgkfCI/AAAAAAAADd0/5s08qGyXyW8/s1600/face-grin.png"&gt;&lt;img src="http://2.bp.blogspot.com/_JPDq88g-ZiE/TDLlTcgkfCI/AAAAAAAADd0/5s08qGyXyW8/s400/face-grin.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5490703017951132706" style="cursor: pointer; width: 32px; height: 32px; " /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Como podréis suponer este cambio ha hecho que el tiempo disponible para dedicarle al blog se ha visto reducido muchos enteros, cosa que antes tampoco era abundante. Así que ya tengo otra excusa más de los retrasos en las actualizaciones en el blog. Estoy buscando huecos libres, en breve volverá la actividad. Prometido.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-5846352902504023235?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OFzaIpgdYfsVn0n0AIpVZusR8xI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OFzaIpgdYfsVn0n0AIpVZusR8xI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OFzaIpgdYfsVn0n0AIpVZusR8xI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OFzaIpgdYfsVn0n0AIpVZusR8xI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/OeTFz90EN54" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/5846352902504023235/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=5846352902504023235" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5846352902504023235?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5846352902504023235?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/OeTFz90EN54/cambios.html" title="Cambios" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_JPDq88g-ZiE/TDLlTcgkfCI/AAAAAAAADd0/5s08qGyXyW8/s72-c/face-grin.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2010/07/cambios.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YFQX8_fip7ImA9WxBaF0U.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-5565644803763498851</id><published>2010-03-28T16:05:00.001+02:00</published><updated>2010-03-28T16:05:10.146+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-28T16:05:10.146+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogger.com/atom/ns#" term="sonar" /><category scheme="http://www.blogger.com/atom/ns#" term="hudson" /><title>Otros tiempos</title><content type="html">&lt;p&gt;   Ha pasado mucho (pero mucho) desde la ultima vez que escribí algo en el blog, la razón principal la de siempre, falta de tiempo. En todo este tiempo he aprendido un montón de cosas nuevas, y no sólo de programacion Java, que aunque sigo programando bastante, no al mismo nivel que antes. He conocido herramientas nuevas y muy interesantes, no muy alejadas de la programación pero si bastante más cerca de donde estoy ahora, QA. 
&lt;/p&gt;&lt;p&gt;Voy a aprovechar esta entrada para enumerar las cosas que quiero ir contando en las próximas semanas, espero que os sirvan para algo.&lt;/p&gt;&lt;p&gt;Lo primero en lo que quiero entrar es en &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt;, esta es una herramienta que creo que deberia de usarse en todos los equipos de desarrollo. Es lo que se llama una herramienda de integración continua, esta es una aplicación web que cada cierto tiempo o a manualemente descarga el codigo completo y lanza los scripts que nosotros queramos. Podemos desde simplemente asegurarnos de que todo sigue compilando a diario a lanzar pruebas automaticas diarias o herramientas del control de la calidad del software, despliegue diario de la aplicacion web en el servidor de pruebas... imprescindible. Tengo que hablar mucho de esto.&lt;/p&gt;&lt;p&gt;La siguiente herramienta que he conocido hace poco pero me parece increible es &lt;a href="http://sonar.codehaus.org/"&gt;Sonar&lt;/a&gt;. se puede integrar con&amp;nbsp; hudson mediante un plugin o simplemente llamar un script. En cualquier caso, configurar un proyecto para usarlo con esta herramiente es tan simple que a veces duele no haberlo usado antes. Sonar no es mas que una "aglutinador" de otras herramientas como "findbugs", "pmd", "checkstye" y presenta los resultados en una una web simple y facil de entender. Permite detectar facilmente "bugs potenciales" o malas prácticas. Desde castings imposibles a operaciones con streams que no se cierran en el finally. 
&lt;/p&gt;&lt;p&gt;Y finalmente quiero hablar un poco de &lt;a href="http://code.google.com/intl/es-ES/webtoolkit/"&gt;GWT &lt;/a&gt;y el desarrollo web de aplicaciones usando este framework de google. Todos los problemas que me estoy encontrando y muchas de las ventanas que tiene.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Bueno, nos vemos en breve (espero).
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-5565644803763498851?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DnFzd7tK30DHzc5FxF5HKSqjyT8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DnFzd7tK30DHzc5FxF5HKSqjyT8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DnFzd7tK30DHzc5FxF5HKSqjyT8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DnFzd7tK30DHzc5FxF5HKSqjyT8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/JOuGCPAFCdM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/5565644803763498851/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=5565644803763498851" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5565644803763498851?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5565644803763498851?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/JOuGCPAFCdM/otros-tiempos.html" title="Otros tiempos" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2010/03/otros-tiempos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUMSHc_fyp7ImA9WxNSGU0.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-4614198671720132249</id><published>2009-09-02T16:32:00.005+02:00</published><updated>2009-09-02T16:38:09.947+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-02T16:38:09.947+02:00</app:edited><title>Validando contra LDAP - Active Directory</title><content type="html">Bueno, sobre esto existe mucha documentaci&amp;oacute;n por el mundo y la verdad que no soy un experto, en mi caso he tenido que hacer una peque&amp;ntilde;a modificaci&amp;oacute;n a una aplicaci&amp;oacute;n de uso interno para que valide el usuario que quiere acceder usando el mismo usuario y contrase&amp;ntilde;a que se usa para acceder al dominio. La historia se resume en que el servidor Tomcat esta en Windows dentro de un dominio con &lt;i&gt;Active Directory,&lt;/i&gt; donde se gestionan los usuarios y grupos. &lt;br&gt; &lt;br&gt; Validar directamente sobre Active Directory al parecer requiere de ciertas llamadas al sistema operativo, una DLL vamos (o al menos eso es lo que yo he entendido recopilando informaci&amp;oacute;n desde google). Yo encontr&amp;eacute; una librer&amp;iacute;a que usa un plug-in de &lt;a  href="https://hudson.dev.java.net/"&gt;Hudson &lt;/a&gt;para validar sobre active directory, se llama "active directory" (como no) y la ha desarrollado un tal Kohsuke Kawaguchi (&lt;a  href="http://www.java.net/blog/108"&gt;su blog&lt;/a&gt; y la entrada donde explica la integraci&amp;oacute;n de &lt;a  href="http://weblogs.java.net/blog/2008/01/10/active-directory-authentication-hudson"&gt;hudson y active directory&lt;/a&gt;).&lt;br&gt; &lt;br&gt; La librer&amp;iacute;a esta muy bien y a mi me funcion&amp;oacute; todo a la primera, pero tenia el inconveniente de la dependencia de una DLL y que el servidor estuviese sobre windows, como estamos intentando migrar algunos sistemas a Linux no quise arriesgarme, as&amp;iacute; que en lugar de hacerlo as&amp;iacute; us&amp;eacute; LDAP sobre el directorio, que aqu&amp;iacute; esta configurado para que funcione (no me pregunten como se configura que eso es cosa de sistemas).&lt;br&gt; &lt;br&gt; Al final el c&amp;oacute;digo queda tan simple&amp;nbsp; que he pensado que es interesante comentarlo.&lt;br&gt; 

&lt;pre class="java"&gt;
DirContext ctx = null;
 Hashtable&lt;String, String&gt; env = new Hashtable&lt;String, String&gt;();
 env.put(Context.INITIAL_CONTEXT_FACTORY,
    "com.sun.jndi.ldap.LdapCtxFactory");
 env.put(Context.PROVIDER_URL, "ldap://domain.corp");
 env.put(Context.SECURITY_PRINCIPAL, username + "@domain.corp");
 env.put(Context.SECURITY_AUTHENTICATION, "simple");
 env.put(Context.SECURITY_CREDENTIALS, password);
 try {
   ctx = new InitialDirContext(env);
   // connected. Login success 

    return true;
 } catch (Exception ex){ 

  LOGGER.log(Level.SEVERE, "Authentication exception : " + ex.getMessage());
} finally {
  if (ctx != null) {
    try { ctx.close(); }
    catch (NamingException e) {
       LOGGER.info("Naming exception : " + e.toString());
}}}
return false;
&lt;/pre&gt; 
&lt;p&gt; Y ya est&amp;aacute;, por supuesto adem&amp;aacute;s se puede verificar a que grupo pertenece el usuario y en funci&amp;oacute;n de eso, dar diferentes permisos. Espero que a alguien le sirva, hay mucha informaci&amp;oacute;n sobre esto por ah&amp;iacute;. &lt;br&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-4614198671720132249?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JJdp4aLH-rYj4htnCmtJ458Et1U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JJdp4aLH-rYj4htnCmtJ458Et1U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JJdp4aLH-rYj4htnCmtJ458Et1U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JJdp4aLH-rYj4htnCmtJ458Et1U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/iNhv4n_cz24" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/4614198671720132249/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=4614198671720132249" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/4614198671720132249?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/4614198671720132249?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/iNhv4n_cz24/validando-contra-ldap-active-directory.html" title="Validando contra LDAP - Active Directory" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/09/validando-contra-ldap-active-directory.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ASHs-fyp7ImA9WxNSEkw.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-6395105911636990757</id><published>2009-08-25T16:33:00.000+02:00</published><updated>2009-08-25T16:34:09.557+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-25T16:34:09.557+02:00</app:edited><title>Decompilando Java</title><content type="html">Afortunadamente son pocas las ocasiones en los que un c&amp;oacute;digo, m&amp;aacute;s o menos esencial, se pierden las fuentes. Hoy en d&amp;iacute;a siempre se sigue el mismo protocolo de usar un SVN u otro sistema de control de versiones para ir almacenando el c&amp;oacute;digo fuente. Sin embargo, por pura ley de Murphy, siempre puede darse uno de esos casos improbables. En mi caso se est&amp;aacute; usando una versi&amp;oacute;n de JAR que no tiene el c&amp;oacute;digo en el SVN. &lt;br&gt; &lt;br&gt; Cuando esto ocurre la soluci&amp;oacute;n m&amp;aacute;s r&amp;aacute;pida pasa por los decompiladores de c&amp;oacute;digo java. Usando estas herramientas es posible extraer desde los ficheros binarios &lt;i&gt;".class"&lt;/i&gt; una versi&amp;oacute;n bastante similar al c&amp;oacute;digo original. &lt;br&gt; &lt;br&gt; Yo he encontrado algunas soluciones interesantes, las enumero aqu&amp;iacute; y as&amp;iacute; las hago p&amp;uacute;blicas: &lt;br&gt; &lt;ul&gt;   &lt;li&gt;&lt;a href="http://members.fortunecity.com/neshkov/dj.htm"&gt;DJ Decompile&lt;/a&gt;. Es una aplicaci&amp;oacute;n comercial, bastante interesante. Tiene una versi&amp;oacute;n de evaluaci&amp;oacute;n de algunos d&amp;iacute;as/usos y para una emergencia puede servir. &lt;br&gt;   &lt;/li&gt;   &lt;li&gt;JAD es una librer&amp;iacute;a para decompilado de java (el sitio oficial no esta disponible. He encontrado un &lt;a  href="http://www.varaneckas.com/jad"&gt;mirror&lt;/a&gt;). Yo encontr&amp;eacute; un programa llamado "FrontEnd plus"como herramienta GUI que usa esta librer&amp;iacute;a internamente, aunque he encontrado m&amp;aacute;s aqu&amp;iacute; : &lt;a  href="http://blogninja.com/doc/jad/jad.html#gui"&gt;http://blogninja.com/doc/jad/jad.html#gui&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;Y el que mas me gusta, el plug-in para eclipse (que tambi&amp;eacute;n es aplicaci&amp;oacute;n para escritorio) JD-Eclipse. M&amp;aacute;s informaci&amp;oacute;n : &lt;a  href="http://java.decompiler.free.fr/"&gt;http://java.decompiler.free.fr/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; Finalmente he optado por esta &amp;uacute;ltima opci&amp;oacute;n, s&amp;oacute;lo requiere tener las clases dentro del classpath de un proyecto eclipse y con un simple click puedes ver el c&amp;oacute;digo fuente, puede servirme para alguna que otra librer&amp;iacute;a que no s&amp;eacute; como funciona. &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-6395105911636990757?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pMxOuE2eijOpJvUeoxbTGPVeUU0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pMxOuE2eijOpJvUeoxbTGPVeUU0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pMxOuE2eijOpJvUeoxbTGPVeUU0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pMxOuE2eijOpJvUeoxbTGPVeUU0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/EljVD3NyVUg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/6395105911636990757/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=6395105911636990757" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/6395105911636990757?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/6395105911636990757?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/EljVD3NyVUg/decompilando-java.html" title="Decompilando Java" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/08/decompilando-java.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIMSXc8fip7ImA9WxJaFUs.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-1346208691265230866</id><published>2009-08-06T14:59:00.001+02:00</published><updated>2009-08-06T14:59:48.976+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-06T14:59:48.976+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="auto build" /><category scheme="http://www.blogger.com/atom/ns#" term="codigo" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><title>FileSets en Ant</title><content type="html">&lt;p&gt;Bueno, como dije en mi anterior post, voy a intentar resumir las cosas nuevas con las que he tenido que trabajar estos meses. Una de ellas son las tareas "&lt;em&gt;ant&lt;/em&gt;" personalizadas. Últimamente he tenido que modificar y crear algunos scripts ant para muchas operaciones diferentes y en mas de una ocasión me he encontrado con situaciones que el script necesita hacer operaciones "poco comunes". En mi caso, consistía en localizar el último fichero modificado en una carpeta.&lt;/p&gt; &lt;p&gt;No quería copiarlo, moverlo ni nada parecido, solo saber cual era. Así que tuve que hacer una tarea para ello. La funcionalidad que busco es, dada una carpeta, localizar el ultimo fichero modificado usando patrones de búsqueda por nombre (include - exclude).&lt;/p&gt; &lt;p&gt;Al final el código del script viene a quedar como esto :&lt;/p&gt; 
&lt;pre class="xml"&gt;
&amp;lt;lastFile property="my.property"&amp;gt;
   &amp;lt;fileset dir="C:/FOLDER"&amp;gt;
     &amp;lt;include name="**/*.exe" /&amp;gt;
     &amp;lt;exclude name="*Setup*" /&amp;gt;
   &amp;lt;/fileset&amp;gt;
&amp;lt;/lastFile&amp;gt;
&lt;/pre&gt;
 &lt;p&gt;Aquí vemos como la tarea "lastFile" debe de buscar todos los ejecutables en la carpeta "C:\FOLDER" excepto aquellos que contengan "Setup" en su nombre y guardar en la propiedad "my.property" el nombre de este. Ahora lo que toca es ponerse manos a la obra y ver el código Java. Para ello empezamos creando una clase que será nuestra tarea:&lt;/p&gt; 
&lt;pre class="java"&gt;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;

public class LastFile
    extends Task
{
  private String property;
  private Vector &amp;lt;Fileset&amp;gt;
 filesets = new Vector&amp;lt;Fileset&amp;gt;();

  public void addFileset(FileSet fileset)  {
    filesets.add(fileset);
  }

  public void setProperty(String property) {
    this.property = property;
  }


  public String getProperty() {
    return property;
  }

  protected void validate() {
         if (property == null)
      throw new BuildException("property not set", getLocation());
    if (filesets.size() &amp;lt; 1)
                throw new BuildException("You must specify a fileset", getLocation());
     }
          @Override
          public void execute()
              throws BuildException
          {
              // Mi código va aquí
          }
} // End Class
&lt;/pre&gt;
 &lt;p&gt;Como se ve, ahora mismo la clave está en la propiedad "filesets", en la que se añaden elementos del tipo "FileSet". Este elemento nos permite saber los ficheros existentes en la carpeta indicada. Ahora la clave está en como usarlo. Así que nos vamos al corazón de la tarea, al método "execute". Primero veamos como lo hice yo.&lt;/p&gt; 
&lt;pre class="java"&gt;
validate(); // 1
long newest = 0;
File last = null;
for (FileSet fs : filesets)
{
    if (fs.getProject() == null)  {
        fs = (FileSet) fs.clone();
        fs.setProject(getProject());
    }
    File dir = fs.getDir();
    log("searching last file in " + dir);
    // Obtenemos una instancia del scanner del directorio
    DirectoryScanner ds = fs.getDirectoryScanner(getProject());
    // Una lista de los ficheros incluidos
    String[] includedFiles = ds.getIncludedFiles();
    for (String filename : includedFiles) {
        log("--&amp;gt; " + filename);
        File currentFile = new File(dir, filename);
        if (!currentFile.isDirectory())
        {
          // Para cada fichero, obtenemos la fecha y nos
          // quedamos con el último
          long lastModified = currentFile.lastModified();
          if (lastModified &amp;gt; newest)
          {
            newest = lastModified;
            last = currentFile;
          }
        }
    }
    if (last == null)
    {
        log("No file was found", Project.MSG_WARN);
    } else  {
        String value;
        value = last.getAbsolutePath();
        log("Find the last file " + last.getName(), Project.MSG_INFO);
        log("Setting propery '" + getProperty() + "' to value '" + value + "'");
        getProject().setProperty(getProperty(), value);
    }
}
&lt;/pre&gt;
 &lt;p&gt;Lo importante con lo que hay que quedarse es que una vez tengamos el FileSet, podemos obtener todos los ficheros que estan incluido (incluso los excluidos) y trabajar con ellos. Cualquier duda, en los comentarios. El código esta disponible dentro de mi SVN en &lt;a href="http://code.google.com/p/guevonaso-codes/"&gt;http://code.google.com/p/guevonaso-codes/&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-1346208691265230866?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gtZGF-cRdX4Nbacd-hvJqgnmrGM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gtZGF-cRdX4Nbacd-hvJqgnmrGM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gtZGF-cRdX4Nbacd-hvJqgnmrGM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gtZGF-cRdX4Nbacd-hvJqgnmrGM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/mhdAnKCOTjw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/1346208691265230866/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=1346208691265230866" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/1346208691265230866?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/1346208691265230866?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/mhdAnKCOTjw/filesets-en-ant.html" title="FileSets en Ant" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/08/filesets-en-ant.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQDQXg_fyp7ImA9WxJaFEg.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-7330372154803732877</id><published>2009-08-05T09:29:00.001+02:00</published><updated>2009-08-05T09:29:30.647+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-05T09:29:30.647+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="disculpas" /><category scheme="http://www.blogger.com/atom/ns#" term="curro" /><category scheme="http://www.blogger.com/atom/ns#" term="trabajo" /><title>El tiempo pasa</title><content type="html">&lt;p&gt;Bueno, han pasado.. ¿cuanto? casi tres meses desde mi último post. Quiero pedir disculpas por el retraso pero han sido unos meses de mucho (realmente mucho) estrés, tanto en el trabajo como en casa, y no he tenido tiempo de poder actualizar nada, espero que a partir de ahora tenga una jornada mas "normal" y me de tiempo a ponerme al día en actualizar el blog con todas las cosas que he aprendido estos meses, que no han sido pocas.&lt;/p&gt; &lt;p&gt;En breve una actualización hablando otra vez de Java y sus cosillas.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-7330372154803732877?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9dmezpAVe0bp_1GTZidxfL1xnMY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9dmezpAVe0bp_1GTZidxfL1xnMY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9dmezpAVe0bp_1GTZidxfL1xnMY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9dmezpAVe0bp_1GTZidxfL1xnMY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/9GF3Bu-KG3Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/7330372154803732877/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=7330372154803732877" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7330372154803732877?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7330372154803732877?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/9GF3Bu-KG3Q/el-tiempo-pasa.html" title="El tiempo pasa" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/08/el-tiempo-pasa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIFQHY_fip7ImA9WxJREUw.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-1056879728930142334</id><published>2009-05-12T09:31:00.001+02:00</published><updated>2009-05-12T09:31:51.846+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-12T09:31:51.846+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="civinova.org" /><title>Blog personal en civinova.org</title><content type="html">&lt;p&gt;El otro día comenzó un nuevo proyecto que mi amigo Ibán está llevando con mucha ilusión. Se llama &lt;a href="http://civinova.org"&gt;http://civinova.org&lt;/a&gt; y &lt;a href="http://civinova.com"&gt;http://civinova.com&lt;/a&gt;. Como indica en la web :&lt;/p&gt;
&lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt;
&lt;p&gt;CiviNova Es una ciudad virtual dedicada a la cultura donde los usuarios (ciudadanos) cuentan con todo lo necesario para dar a conocer su obra. Para los creadores hay gremios de escritores, pintores, músicos... Y para todos, grupos de literatura, arte, música, cine... ¿Te lo vas a perder?&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-WEIGHT: bold"&gt;civi&lt;/span&gt; &lt;span style="COLOR: rgb(121,121,186)"&gt;Nova&lt;/span&gt; es, además, una revista, una editorial y un hosting para alojamiento y creación de webs culturales.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Es decir, civinova es una nueva red social y una revista de cultura en la que cualquiera que se considere creador y/o artista puede empezar a dar a conocer su obra sin complicaciones y ver las creaciones de otros miembros de la "ciudad".&lt;/p&gt;
&lt;p&gt;El proyecto está aún en una fase inicial en la que se han puesto en marcha las herramientas básicas necesarias, pero se espera que la cosa vaya creciendo. Animo a todo el mundo desde mi humilde blog a que os acerquéis a echar un vistazo y si os atrevéis, a crear vuestro perfil de ciudadano. Yo por mi parte he decidido que mi blog personal sea ahora el de civinova &lt;a href="http://www.civinova.org/pg/blog/guevonaso"&gt;http://www.civinova.org/pg/blog/guevonaso&lt;/a&gt; . No sé que pasará con &lt;a href="http://guevonaso.blogspot.com"&gt;http://guevonaso.blogspot.com&lt;/a&gt;, supongo que seguirá existiendo, pero no lo sé. En cualquier caso, desde aquí deseo toda la suerte del mundo a Ibán en su proyecto&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-1056879728930142334?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KZu2To67xYO3AkGQ9u5WtYbhHuA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KZu2To67xYO3AkGQ9u5WtYbhHuA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KZu2To67xYO3AkGQ9u5WtYbhHuA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KZu2To67xYO3AkGQ9u5WtYbhHuA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/q8WObOsjCGk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/1056879728930142334/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=1056879728930142334" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/1056879728930142334?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/1056879728930142334?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/q8WObOsjCGk/blog-personal-en-civinovaorg.html" title="Blog personal en civinova.org" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/05/blog-personal-en-civinovaorg.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQEQ3s5fyp7ImA9WxJSFEg.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-5353145720218993822</id><published>2009-05-04T18:08:00.001+02:00</published><updated>2009-05-04T18:08:22.527+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T18:08:22.527+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="struts2" /><category scheme="http://www.blogger.com/atom/ns#" term="struts" /><category scheme="http://www.blogger.com/atom/ns#" term="google apps" /><title>Actualizando hola mundo struts 2</title><content type="html">&lt;p&gt;Este es un post corto. He reorganizado un poco el código del proyecto de hola mundo del post anterior. Estoy intentando hacer que el proyecto se pueda desplegar usando maven, ya comentaré mis experiencias. La verdad es que está siendo un poco más frustrante de lo que pensé en un momento. Un buen enlace para ver como hacerlo en castellano: &lt;a href="http://renidev.javabolivia.com/2009/04/19/hola-mundo-con-google-app-engine-y-maven/"&gt;Hola mundo con google App Engine y maven&lt;/a&gt;. Esta traducido y resumido de &lt;a href="http://www.salientpoint.com/blog/?p=480"&gt;otro blog&lt;/a&gt; que además tiene en uno de sus comentarios una referencia a esto mismo y que además está creando un "archetype" para maven para crear proyecto de google. Muy didactico seguir la secuencia completa.&lt;/p&gt; &lt;p&gt;Por ahora me conformo con haber podido simplifiar el &lt;a href="http://guevoneandojava.blogspot.com/2009/04/struts-2-en-google-app-engine.html"&gt;ejemplo anterior&lt;/a&gt; para poder ampliarlo poco a poco.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-5353145720218993822?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4n4qZkIgUQCBaf5avegPGObaJqY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4n4qZkIgUQCBaf5avegPGObaJqY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4n4qZkIgUQCBaf5avegPGObaJqY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4n4qZkIgUQCBaf5avegPGObaJqY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/uejr2oqTWRU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/5353145720218993822/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=5353145720218993822" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5353145720218993822?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5353145720218993822?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/uejr2oqTWRU/actualizando-hola-mundo-struts-2.html" title="Actualizando hola mundo struts 2" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/05/actualizando-hola-mundo-struts-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQNRn0ycSp7ImA9WxJTGE8.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-6098305803213376804</id><published>2009-04-26T19:00:00.010+02:00</published><updated>2009-04-27T11:26:37.399+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-27T11:26:37.399+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="struts" /><category scheme="http://www.blogger.com/atom/ns#" term="google apps" /><title>Struts 2 en google-app-engine</title><content type="html">&lt;p&gt;Buenas, he tenido estas últimas semanas mucho (pero mucho) trabajo y no he podido añadir nada nuevo al blog por falta de tiempo. La noticia java durante este tiempo ha sido (a parte de la compra de Sun por parte de Oracle) el hecho de que google haya dado &lt;a href="http://code.google.com/intl/es-ES/appengine/docs/java/overview.html"&gt;soporte Java en su engine&lt;/a&gt; además de python. &lt;/p&gt;  &lt;p&gt;La noticia es genial para todos los que queríamos hacer una aplicación web pública sin costes y sin tener que depender de PHP. El servicio puede hacerse de pago, puesto que la version gratuita tiene una serie de limitaciones de ancho de banda y consumo de CPU, pero sin publicidad incluida. &lt;/p&gt;  &lt;p&gt;Pero yo no quería hablar de las bondades del servicio de google, si no de como poder utilizar algún framework dentro de este. Casi a la vez que salió la noticia he encotrado varios sitios hablando del tema, enumero aqui : &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://renidev.javabolivia.com/2009/04/19/hola-mundo-con-google-app-engine-y-maven/"&gt;En este blog&lt;/a&gt;, comentado en&lt;a href="http://javahispano.org/"&gt; javahispano&lt;/a&gt;, se explica como trabajar con maven y google app engine. Resumiendo un poco lo que comentan &lt;a href="http://www.sonatype.com/people/2009/04/mavenizing-the-appengine-sdk/"&gt;www.sonatype.com&lt;/a&gt; y &lt;a href="http://www.salientpoint.com/blog/?p=480"&gt;Salientpoint.com&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;En &lt;a href="http://aows.wordpress.com/2009/04/09/struts-en-google-appengine/"&gt;AOWS&lt;/a&gt; explica como configurar Struts 1.2 . &lt;/li&gt;    &lt;li&gt;Y en los &lt;a href="http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1"&gt;grupos de google&lt;/a&gt; se habla de todos los frameworks que han conseguido poner en marcha hasta ahora, desde grails a Spring.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Y mi aportación a este mundo es recoger esta informacion y explicar en cuatro pasos simples el hola mundo de Struts 2. No se hasta que punto funcionará todo, pero por probar que no quede. &lt;/p&gt;  &lt;p&gt;Asumo que ya se ha configurado eclipse y habeis hecho el primer "Hola Mundo" usando el AppEngine SDK.&lt;/p&gt;  &lt;p&gt;Una vez tenemos nuestra aplicación de pruebas funcionando, pasamos al siguiente paso, nos bajamos las librerias de struts. Las podemos encontrar en la &lt;a href="http://struts.apache.org/download.cgi#struts216"&gt;página oficial&lt;/a&gt; o usando maven. Yo me las he descargado a mano, la versión que contiene solo los jar necesarios y la que contiene las applicaciones de ejemplo (llamada struts-2.1.6.apps.zip ).&lt;/p&gt;  &lt;p&gt;Mi intención es simplemente ejecutar el "HelloWorld", por lo que descomprimo el helloworld.war.&lt;/p&gt;  &lt;p&gt;El siguiente paso es tan simple como copiar las librerias en la carpeta "lib" y modificar el web.xml añadiendo el filtro de Struts, los JSPs de ejemplo y las clases de ejemplo y los XML que la aplicacion a mi proyecto creado con eclipse. &lt;/p&gt;  &lt;p&gt;La estructura del proyecto eclipse queda algo tal y como se muestra en la imagen a continuacion.  &lt;/p&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JPDq88g-ZiE/SfSfaMgB37I/AAAAAAAACtM/Sv_j6segU8M/s1600-h/proyecto.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5329059531467120562" style="margin: 0pt 10px 10px 0pt; width: 195px; cursor: pointer; height: 400px;" alt="" src="http://4.bp.blogspot.com/_JPDq88g-ZiE/SfSfaMgB37I/AAAAAAAACtM/Sv_j6segU8M/s400/proyecto.jpg" border="0" /&gt;&lt;/a&gt; &lt;p&gt;Si tal y como tenemos el proyecto ahora mismo, la aplicación falla. Nos provocará un error provocado por las restricciones que el engine de google ha introducido en su máquina virtual y que hacen incompatible el funcionamiento por defecto del OGNL. La solución la he encontrado en uno de los enlaces anteriores que me ha llevado a&lt;a href="http://groups.google.com/group/google-appengine-java/browse_thread/thread/19018b0317f27817"&gt; esta entrada&lt;/a&gt; de un foro. En ella se describe que la solución es muy simple, crear un listener que nos permita configurar la gestión de seguridad de OGNL. &lt;/p&gt;  &lt;p&gt;El codigo del listener sería: &lt;/p&gt;  &lt;pre class="java" style="clear: left;"&gt;public class InitListener implements
ServletContextListener
{
public InitListener()
{ }

public void
contextInitialized(ServletContextEvent sce)
{
OgnlRuntime.setSecurityManager(null);
}
// El resto de metodos necesarios se dejan vacios.&lt;/pre&gt;

&lt;p&gt;Incluimos el listener en el web.xml : &lt;/p&gt;

&lt;pre class="xml"&gt;&amp;lt;web-app&amp;gt;
&amp;lt;!-— El filtro de struts 2 --&amp;gt;
&amp;lt;filter&amp;gt;
    &amp;lt;filter-name&amp;gt;struts2&amp;lt;/filter-name&amp;gt;
    &amp;lt;filter-class&amp;gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&amp;lt;/filter-class&amp;gt;
&amp;lt;/filter&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;struts2&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&amp;lt;listener&amp;gt;
    &amp;lt;listener-class&amp;gt;es.guevonaso.InitListener&amp;lt;/listener-class&amp;gt;
&amp;lt;/listener&amp;gt;
&amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;guevonaso&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;es.guevonaso.guevonasoServlet&amp;lt;/servlet-class&amp;gt;
&amp;lt;/servlet&amp;gt;
&amp;lt;servlet-mapping&amp;gt;
    &amp;lt;servlet-name&amp;gt;guevonaso&amp;lt;/servlet-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/guevonaso&amp;lt;/url-pattern&amp;gt;
&amp;lt;/servlet-mapping&amp;gt;
&amp;lt;welcome-file-list&amp;gt;
    &amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;
&amp;lt;/welcome-file-list&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/pre&gt;
Una vez funcionando nos mostrará un mensaje de error de que las sesiones no están configuradas. Para eso solo debemos de modificar el fichero appengine-web.xml y añadir el parámetro "sessions-enabled":

&lt;pre class="xml"&gt;
&amp;lt;appengine-web-app xmlns="&lt;a href="http://appengine.google.com/ns/1.0%22"&gt;http://appengine.google.com/ns/1.0"&lt;/a&gt;&amp;gt;
  &amp;lt;application&amp;gt;guevonaso&amp;lt;/application&amp;gt;
  &amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
  &amp;lt;!-- Configure java.util.logging --&amp;gt;
  &amp;lt;system-properties&amp;gt;
      &amp;lt;property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/&amp;gt;
  &amp;lt;/system-properties&amp;gt;
  &amp;lt;sessions-enabled&amp;gt;true&amp;lt;/sessions-enabled&amp;gt;
&amp;lt;/appengine-web-app&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Y listo, esto nos permite tener un hola mundo empleando struts 2. Ahora es cosa de verificar hasta que punto podemos usar esta librería.
Mientras tanto, el codigo de este ejemplo lo podéis encontrar donde siempre en &lt;a href="http://code.google.com/p/guevonaso-codes/"&gt;http://code.google.com/p/guevonaso-codes/&lt;/a&gt;, con la salvedad de que no he subido los ficheros binarios "&lt;span style="font-weight: bold;"&gt;JAR&lt;/span&gt;", de la carpeta "&lt;span style="font-style: italic;"&gt;lib&lt;/span&gt;". Y la aplicación de pruebas esta en :
&lt;a href="http://guevonaso.appspot.com/example"&gt;http://guevonaso.appspot.com/example&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;El ejemplo de un formulario&lt;/li&gt;&lt;li&gt;Hola mundo
&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-6098305803213376804?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_NQkt1Y-ZZ7ZICsYPUgUVleYKqQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_NQkt1Y-ZZ7ZICsYPUgUVleYKqQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_NQkt1Y-ZZ7ZICsYPUgUVleYKqQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_NQkt1Y-ZZ7ZICsYPUgUVleYKqQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/1DJx7BpXSss" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/6098305803213376804/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=6098305803213376804" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/6098305803213376804?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/6098305803213376804?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/1DJx7BpXSss/struts-2-en-google-app-engine.html" title="Struts 2 en google-app-engine" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_JPDq88g-ZiE/SfSfaMgB37I/AAAAAAAACtM/Sv_j6segU8M/s72-c/proyecto.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/04/struts-2-en-google-app-engine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQHRnw5eCp7ImA9WxVVGUg.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-7939782428711130875</id><published>2009-03-13T15:25:00.001+01:00</published><updated>2009-03-13T15:25:37.220+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-13T15:25:37.220+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="yahoo" /><title>Pequeño cambio</title><content type="html">&lt;p&gt;Hace tiempo incluí en el blog el &lt;a href="http://guevoneandojava.blogspot.com/2008/10/pingbox-de-yahoo.html"&gt;Pingbox de yahoo&lt;/a&gt;. Lo quité porque ralentizaba mucho la carga, ahora lo he vuelto a añadir, esta vez hago una "carga por petición", de forma que dándole al botón de la derecha se carga y me ahorro que se cargue a todos los visitantes.&lt;/p&gt; &lt;p&gt;Espero que os guste el cambio.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-7939782428711130875?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/80Bsbtb4CecHNPtUWyBdAZXA7uI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/80Bsbtb4CecHNPtUWyBdAZXA7uI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/80Bsbtb4CecHNPtUWyBdAZXA7uI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/80Bsbtb4CecHNPtUWyBdAZXA7uI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/fiWSnxjzn4U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/7939782428711130875/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=7939782428711130875" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7939782428711130875?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7939782428711130875?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/fiWSnxjzn4U/pequeno-cambio.html" title="Pequeño cambio" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/03/pequeno-cambio.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QERH4-eyp7ImA9WxVVGEU.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-180496691923394995</id><published>2009-03-12T19:08:00.001+01:00</published><updated>2009-03-12T19:08:25.053+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T19:08:25.053+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="struts" /><category scheme="http://www.blogger.com/atom/ns#" term="enlaces" /><title>Informacion util de Struts 2</title><content type="html">&lt;p&gt;Esta entrada es sólo lo que yo llamo un apunte de algo interesante. Aunque no lo he encontrado yo creo que merece la pena mencionarlo, es una lista de las tags para Struts 2 y como funciona.&lt;/p&gt; &lt;p&gt;&lt;a href="http://mundogeek.net/archivos/2009/02/13/etiquetas-struts-2/"&gt;http://mundogeek.net/archivos/2009/02/13/etiquetas-struts-2/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Struts 2 es una de esas espinitas que tengo clavadas, me parece un framework muy interesante y las pruebas que he hecho me da la sensación de que está muy conseguido, quizás en el momento en que lo use intensivamente cambie mi opinión de como es.&lt;/p&gt; &lt;p&gt;En cualquier caso, es un un buen enlace para tener a mano.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-180496691923394995?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MGfYkekDrP6IXB1RPQfPWtTam1Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MGfYkekDrP6IXB1RPQfPWtTam1Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MGfYkekDrP6IXB1RPQfPWtTam1Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MGfYkekDrP6IXB1RPQfPWtTam1Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/mDVfp-ulnDQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/180496691923394995/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=180496691923394995" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/180496691923394995?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/180496691923394995?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/mDVfp-ulnDQ/informacion-util-de-struts-2.html" title="Informacion util de Struts 2" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/03/informacion-util-de-struts-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQNSH8ycSp7ImA9WxVVE0k.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-414656320479282818</id><published>2009-03-06T14:33:00.005+01:00</published><updated>2009-03-06T14:49:59.199+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-06T14:49:59.199+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenLayers" /><category scheme="http://www.blogger.com/atom/ns#" term="GIS" /><category scheme="http://www.blogger.com/atom/ns#" term="Geoserver" /><category scheme="http://www.blogger.com/atom/ns#" term="SIG" /><title>Esquema de Aplicación GIS para WEB</title><content type="html">&lt;p&gt;
Después de mucho sopesar, me parecía demasiado obvio explicar como instalar y configurar un servidor de mapas (&lt;a href="http://geoserver.org/"&gt;geoserver&lt;/a&gt;) para que estén disponibles nuestra información geográfica, así como configurar un cliente web (&lt;a href="http://www.openlayers.org/"&gt;OpenLayers&lt;/a&gt;) para su visualización.&lt;/p&gt;

&lt;p&gt;
Pero si me parecía de interés publicar un diagrama que nos permita tener un esquema visual de producto completo.&lt;br /&gt;
Entiéndase como producto, una aplicación GIS, que se pueda acceder desde la WEB.
&lt;/p&gt;

&lt;p&gt;
Así pues, os dejo el diagrama.
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Eq4a8K2KPDk/SbEo_uP0TxI/AAAAAAAAADU/p9WFriFz2Sc/s1600-h/DIAGRAMA-WEB-GIS.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 273px; height: 320px;" src="http://2.bp.blogspot.com/_Eq4a8K2KPDk/SbEo_uP0TxI/AAAAAAAAADU/p9WFriFz2Sc/s320/DIAGRAMA-WEB-GIS.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5310070510857768722" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-414656320479282818?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bdwo73w70EDeO8Zj6QviST2z4cU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bdwo73w70EDeO8Zj6QviST2z4cU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bdwo73w70EDeO8Zj6QviST2z4cU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bdwo73w70EDeO8Zj6QviST2z4cU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/KyGGBddszaY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/414656320479282818/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=414656320479282818" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/414656320479282818?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/414656320479282818?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/KyGGBddszaY/esquema-de-aplicacion-gis-para-web.html" title="Esquema de Aplicación GIS para WEB" /><author><name>Texaco</name><uri>http://www.blogger.com/profile/14289494684040611100</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_Eq4a8K2KPDk/SbEo_uP0TxI/AAAAAAAAADU/p9WFriFz2Sc/s72-c/DIAGRAMA-WEB-GIS.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/03/esquema-de-aplicacion-gis-para-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EHQ38zcSp7ImA9WxVVE0k.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-5602777379172015341</id><published>2009-03-05T16:33:00.007+01:00</published><updated>2009-03-06T13:13:52.189+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-06T13:13:52.189+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google Spherical Mercator" /><category scheme="http://www.blogger.com/atom/ns#" term="GIS" /><category scheme="http://www.blogger.com/atom/ns#" term="SIG" /><category scheme="http://www.blogger.com/atom/ns#" term="postGis" /><title>Tus datos geográficos representados sobre GoogleMaps</title><content type="html">&lt;p&gt;
Aunque en una entrada posterior hablaré sobre las proyecciones, ahora me sirve como introducción, indicar que uno de los problemas que nos podemos encontrar es trabajar con datos que son de diferente tipo de proyección.
&lt;/p&gt;

&lt;p&gt;Para estas latitudes, es muy común trabajar con el sistema de referencia &lt;a href="http://spatialreference.org/ref/epsg/23030/"&gt;Datum ED 50/UTM 30N&lt;/a&gt; o si estamos más situados al oeste, como puede ser Huelva o Galicia, podríamos estar hablando de &lt;a href="http://spatialreference.org/ref/epsg/23029/"&gt;Datum ED 50/UTM 29N&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Estas proyecciones son válidas para un rango geográfico. Fuera de este rango geográfico, simplemente no son válidas para georeferenciar.&lt;br /&gt;
Es por esto que google utiliza otros sistemas de referencia, normalmente &lt;a href="http://spatialreference.org/ref/epsg/4326/"&gt;WGS 84&lt;/a&gt; que además se corresponde con el sistema de referencia de la mayoría de los GPS por omisión.&lt;/p&gt;

&lt;p&gt;
Aquí hay un concepto que no tengo del todo claro, pero si sé que tiene que ver con el modelo matemático de la esfera terrestre utilizado.&lt;br /&gt;
Para que nos entendamos. Si queremos solapar nuestros datos sobre cualquier mapa de google, deberíamos de utilizar el sistema de referencias &lt;a href="http://spatialreference.org/ref/sr-org/6627/html/"&gt;Spherical Mercator de google&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Vale, a modo de resumen, el problema es, que tengo sistemas de referencias diferentes y que tengo que "transformar" a uno en concreto para trabajar siempre sobre el mismo sistema de referencias. Si has llegado a la misma conclusión, es que estamos en la misma onda.
&lt;/p&gt;

&lt;p&gt;
Bien, estamos de acuerdo en el problema, pero todavía nos queda establecer una estrategia para resolverlo. &lt;br /&gt;
La estrategia que yo he adoptado (que seguro que no es la única y quizás tampoco la mejor) es crear una vista de mis datos geográficos, pero transformados a este nuevo sistema de referencia (Spherical Mercator de google).
&lt;/p&gt;

&lt;p&gt;
Bueno, en este caso podemos estar de acuerdo o no con la solución, pero nos ponemos manos a la obra para implementarla.
&lt;/p&gt;

&lt;p&gt;
Antes de nada (tarde o temprano, nos daríamos cuenta de ello), os informo de que en nuestra base de datos que hemos creado y poblado con tanto esmero, no existe el sistema de referencia Spherical Mercator de google. Bueno, no pasa nada. Lo metemos.
&lt;/p&gt;

&lt;p&gt;Para meterlo, lanzamos la siguiente query.

&lt;pre class="sql"&gt;
INSERT into spatial_ref_sys (
   srid, auth_name, auth_srid, srtext, proj4text
  ) values (
   900913 ,'EPSG',900913,
  'GEOGCS["WGS 84", 
   DATUM["World Geodetic System 1984", 
   SPHEROID["WGS 84", 6378137.0, 298.257223563,
   AUTHORITY["EPSG","7030"]], 
   AUTHORITY["EPSG","6326"]],
   PRIMEM["Greenwich", 0.0, 
   AUTHORITY["EPSG","8901"]], 
   NIT["degree",0.017453292519943295], 
   AXIS["Longitude", EAST], 
   AXIS["Latitude", NORTH],
   AUTHORITY["EPSG","4326"]],
   PROJECTION["Mercator_1SP"],
   PARAMETER["semi_minor", 6378137.0], 
   PARAMETER["latitude_of_origin",0.0], 
   PARAMETER["central_meridian", 0.0], 
   PARAMETER["scale_factor",1.0], 
   PARAMETER["false_easting", 0.0], 
   PARAMETER["false_northing", 0.0],
   UNIT["m", 1.0],
   AXIS["x", EAST], 
   AXIS["y", NORTH],
   AUTHORITY["EPSG","900913"]] |',
   '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 
    +x_0=0.0 +y_0=0 +k=1.0 +units=m 
    +nadgrids=@null +no_defs'
 );
&lt;/pre&gt;

&lt;span class="nota"&gt;CUIDADO aqui se ha puesto la sentencia con 
retorno de carros en las cadenas de texto, es posible
que copiar y pegar no funcione directamente.&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Vale, ya tenemos el sistema de referencia con el que vamos a trabajar. Ahora necesitamos hacer una vista, que contenga toda la información de mis elementos espaciales (features) en dicho sistema de referencia.
&lt;/p&gt;

&lt;pre class="sql"&gt;
CREATE OR REPLACE VIEW [view_table_name] AS 
 SELECT [table_name].[table_field1], 
        [table_name].[table_field2], 
        st_transform(st_setsrid(
           [table_name].[geom_field], 
           23030
           ), 900913
        ) 
 AS the_geom
 FROM [table_name];
&lt;/pre&gt;

&lt;span class="nota"&gt;
&lt;p&gt;Hay que tener en cuenta que podemos poner tantos campos como necesitemos o tenga la tabla en cuestión.&lt;/p&gt;
&lt;p&gt;Por otra parte, se asigna el alias &lt;i&gt;the_geom&lt;/i&gt; al campo que contendrá los datos de georeferencia, que es el nombre que asigna por omisión el loader de postGis (shp2pgsql)&lt;/p&gt;
&lt;/span&gt;

&lt;p&gt;
Con esto ya tenemos una vista con los datos en la proyección correcta para solaparla con los mapas de Google Maps.
&lt;/p&gt;

&lt;span class="nota"&gt;
Fuentes: 
&lt;ul&gt;
&lt;li&gt;http://trac.openlayers.org/wiki/SphericalMercator&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-5602777379172015341?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WdJRRjMEln4Yh_cuoM7aGrBYg9Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WdJRRjMEln4Yh_cuoM7aGrBYg9Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WdJRRjMEln4Yh_cuoM7aGrBYg9Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WdJRRjMEln4Yh_cuoM7aGrBYg9Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/CFms1WNzDGI" height="1" width="1"/&gt;</content><link rel="enclosure" type="" href="http://trac.openlayers.org/wiki/SphericalMercator" length="0" /><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/5602777379172015341/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=5602777379172015341" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5602777379172015341?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5602777379172015341?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/CFms1WNzDGI/tus-datos-geograficos-representados.html" title="Tus datos geográficos representados sobre GoogleMaps" /><author><name>Texaco</name><uri>http://www.blogger.com/profile/14289494684040611100</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/03/tus-datos-geograficos-representados.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIMQ3o7fip7ImA9WxVVE0k.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-132577519507898923</id><published>2009-03-05T14:06:00.008+01:00</published><updated>2009-03-06T12:56:22.406+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-06T12:56:22.406+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GIS" /><category scheme="http://www.blogger.com/atom/ns#" term="iconv" /><category scheme="http://www.blogger.com/atom/ns#" term="shapefile" /><category scheme="http://www.blogger.com/atom/ns#" term="postgreSql" /><category scheme="http://www.blogger.com/atom/ns#" term="SIG" /><category scheme="http://www.blogger.com/atom/ns#" term="postgres" /><category scheme="http://www.blogger.com/atom/ns#" term="postGis" /><category scheme="http://www.blogger.com/atom/ns#" term="shp2pgsql" /><title>De shapes a geodatabases</title><content type="html">&lt;p&gt;
Bien, una vez que tenemos nuestra geodatabase preparada, nuestra siguiente tarea es poblarla de datos geográficos.&lt;/p&gt;

&lt;p&gt;Datos que posteriormente utilizaremos para representar sobre un mapa desde una página web, desde un cliente móvil o cualquier otro.&lt;/p&gt;

&lt;p&gt;El estandar en información geográfica, son los ficheros shapes. &lt;/p&gt;

&lt;p&gt;Por ende, no sería de extrañar que la información llegue a tus manos en este formato. &lt;/p&gt;

&lt;p&gt;Dentro de nuestras habilidades como expertos en GIS es pasar esta información a nuestra base de datos. &lt;/p&gt;

&lt;p&gt;PostGis ofrece una herramienta que realiza la conversión del fichero shape a un scripts que podemos utilizar para poblar nuestra geodatabase. &lt;/p&gt;

&lt;pre class="bash"&gt;
    shp2pgsql
&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://postgis.refractions.net/documentation/manual-1.3/ch04.html#id2743056"&gt;shp2pgsql&lt;/a&gt; es una herramienta que nos permite obtener desde un fichero shape, un script SQL para la inserción de elementos espaciales en base de datos.&lt;/p&gt;

&lt;pre class="bash"&gt;
    shp2pgsql shaperoads.shp roadstable &gt; roads.sql 
&lt;/pre&gt;

&lt;p&gt;
Con este simple comando obtenemos los objetos espaciales del fichero shaperoads.shp, y creamos los &lt;i&gt;insert into&lt;/i&gt; de dichos objetos a la tabla roadstable.
&lt;/p&gt;
&lt;span class="nota"&gt;
&lt;p&gt;
Dado que la aplicación estandar de facto para la creación y edición de ficheros shapes, es ArcGis, que va sobre Windows, es muy dado que nos encontremos con que la información que contienen los ficheros shapes, estén en algún encoding que no es el que esperamos. Para esto yo uso una herramienta en linux que se llama &lt;a href="http://www.gnu.org/software/libiconv/documentation/libiconv/iconv.1.html"&gt;iconv&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Basta con pasar esta herramienta a los sqls generados para tenerlos preparados para lanzarlos en nuestra base de datos.
&lt;/p&gt;
&lt;/span&gt;
&lt;p&gt;
Posteriormente nos quedaría lanzar el script roads.sql para que dichos objetos espaciales estén registrados en nuestra base de datos.
&lt;/p&gt;

&lt;pre class="bash"&gt;
    psql [base de datos] -f roads.sql 2&amp;gt; roads.err
&lt;/pre&gt;

&lt;p&gt;
Como resultado tendremos los objetos espaciales insertados en nuestra base de datos y un fichero donde guardaremos los posibles errores en la subida del fichero.
&lt;/p&gt;

&lt;p&gt;
Esto es todo lo que necesitamos para pasar nuestros ficheros shapes a una geodatabase.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-132577519507898923?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9AVHxRAJJEN4FkMGb5qDvnXqfTQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9AVHxRAJJEN4FkMGb5qDvnXqfTQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9AVHxRAJJEN4FkMGb5qDvnXqfTQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9AVHxRAJJEN4FkMGb5qDvnXqfTQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/AY3Kb27esiM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/132577519507898923/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=132577519507898923" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/132577519507898923?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/132577519507898923?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/AY3Kb27esiM/de-shapes-geodatabases.html" title="De shapes a geodatabases" /><author><name>Texaco</name><uri>http://www.blogger.com/profile/14289494684040611100</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/03/de-shapes-geodatabases.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcNQHY4eip7ImA9WxVVEkg.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-8099376031033190805</id><published>2009-03-05T12:36:00.005+01:00</published><updated>2009-03-05T12:54:51.832+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-05T12:54:51.832+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="geodatabase" /><category scheme="http://www.blogger.com/atom/ns#" term="GIS" /><category scheme="http://www.blogger.com/atom/ns#" term="postgreSql" /><category scheme="http://www.blogger.com/atom/ns#" term="SIG" /><category scheme="http://www.blogger.com/atom/ns#" term="postgres" /><category scheme="http://www.blogger.com/atom/ns#" term="postGis" /><title>Un poco de GIS</title><content type="html">Bueno, tengo la tarea de documentar mi trabajo sobre GIS, y veo justo y productivo compartir mis conocimientos con todos los lectores de este fantástico Blog.&lt;br /&gt;

Para empezar explicaré como crear una base de datos geo-espacial con software libre.&lt;br /&gt;

La base de datos utilizada es &lt;a href="http://www.postgresql.org/"&gt;postgreSql&lt;/a&gt;, con &lt;a href="http://postgis.refractions.net/documentation/manual-1.3/index.html"&gt;postGis&lt;/a&gt; para el soporte espacial.&lt;br /&gt;

A modo de introducción.&lt;br /&gt;&lt;br /&gt;

PostGis, no es más que un conjunto de funciones y herramientas que permiten realizar operaciones espaciales con los datos almacenados en una base de datos postgreSql.&lt;br /&gt;

El primer paso para crear una base de datos geo-espacial, es instalarse el motor de la base de datos y su extensión espacial (postGis).&lt;br /&gt;

Desde linux es tan sencillo como:&lt;br /&gt;

&lt;pre class="bash"&gt;
     sudo apt-get install postgresql-8.3 postgresql-8.3-postgis
&lt;/pre&gt;

&lt;span class="nota"&gt; Nota: Estos paquetes están incluidos en los repositorios de ubuntu 8.10 (Intrepid Ibex) &lt;/span&gt;

Una vez instalado el motor de base de datos, debemos configurar el control de acceso, para eso tenemos los siguientes ficheros:&lt;br /&gt;

&lt;pre class="bash"&gt;
 /etc/postgresql/8.3/main/postgresql.conf
 /etc/postgresql/8.3/main/pg_hba.conf
&lt;/pre&gt;

Estoy seguro que no os faltarán &lt;a href="http://www.google.es/search?q=pg_hba.conf&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=com.ubuntu:en-US:unofficial&amp;amp;client=firefox-a"&gt;recursos para configurar vuestro control de acceso&lt;/a&gt;.&lt;br /&gt;

&lt;h3&gt; Creamos la base de datos &lt;/h3&gt;

Una vez configurado el control de acceso, creamos una BBDD, por ejemplo con &lt;a href="http://www.pgadmin.org/"&gt;pgadmin3&lt;/a&gt;.&lt;br /&gt;

Para crearla con &lt;a href="http://www.postgresql.org/docs/7.4/interactive/app-psql.html"&gt;psql&lt;/a&gt; teneis documentación suficiente &lt;a href="http://www.postgresql.org/docs/7.4/interactive/sql-createdatabase.html"&gt;aquí&lt;/a&gt;.&lt;br /&gt;

Me vais a perdonar que no entre en mucho de talle en estos pasos pero son más propios de una base de datos postgreSql normal que una base de datos geo-espacial.&lt;br /&gt;

Hasta ahora hemos conseguido crear una base de datos normal, con postgreSql. Lo que nos queda es añadirle las capacidades espaciales. Para ello, vamos a seguir los siguientes pasos.&lt;br /&gt;

&lt;h3&gt; Añadimos Capacidades procedurales &lt;/h3&gt;

Añadimos capacidades procedurales a nuestra base de datos (PL/pgSQL) ya que son requeridas por postGis.&lt;br /&gt;

&lt;pre class="bash"&gt;
 # createlang plpgsql [yourdatabase]
&lt;/pre&gt;

&lt;h3&gt; Añadimos objetos y funciones espaciales a nuestra base de datos &lt;/h3&gt;

El script para añadir estas funcionalidades (y el siguiente) los encontraremos en /usr/share/postgresql-8.3-postgis.&lt;br /&gt;
Ejecutamos el siguiente comando.&lt;br /&gt;

&lt;pre class="bash"&gt;
 # psql -d [yourdatabase] -f lwpostgis.sql
&lt;/pre&gt;

&lt;h3&gt; Añadimos las referencias espaciales a nuestra base de datos &lt;/h3&gt;

Esto no es necesario pero es altamente recomendable, si queremos trabajar con diferentes proyecciones. De esto, si me da tiempo, hablaremos en otro post.&lt;br /&gt;

&lt;pre class="bash"&gt;
 # psql -d [yourdatabase] -f spatial_ref_sys.sql
&lt;/pre&gt;

&lt;span class="nota"&gt; NOTA: Es posible que tengáis que especificar el usuario o la máquina[ y puerto] a la que os queréis conectar. Un "man psql" os dará la información que necesitáis y más.&lt;/span&gt;

Con esto, tendríamos instalada y preparada nuestra geo-database para hacer las pruebas pertinentes.&lt;br /&gt;

&lt;span class="nota"&gt; Fuentes: &lt;a href="http://postgis.refractions.net/documentation/manual-1.3/ch02.html"&gt;postGis&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-8099376031033190805?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UyTEPGjVTUPp-eVuZTGJd9VmBs8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UyTEPGjVTUPp-eVuZTGJd9VmBs8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UyTEPGjVTUPp-eVuZTGJd9VmBs8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UyTEPGjVTUPp-eVuZTGJd9VmBs8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/jk73bbTs9VM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/8099376031033190805/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=8099376031033190805" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/8099376031033190805?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/8099376031033190805?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/jk73bbTs9VM/un-poco-de-gis.html" title="Un poco de GIS" /><author><name>Texaco</name><uri>http://www.blogger.com/profile/14289494684040611100</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/03/un-poco-de-gis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcERX09eyp7ImA9WxVVEEU.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-3294012337254241592</id><published>2009-03-02T14:00:00.002+01:00</published><updated>2009-03-03T13:23:24.363+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T13:23:24.363+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="codigo" /><category scheme="http://www.blogger.com/atom/ns#" term="utilidad" /><title>Quien me llama</title><content type="html">&lt;p&gt;En el proyecto actual me he encontrado con un problema que me tenia bloqueado, había un método de una clase concreta usado para configurar la aplicación que no sabía desde que clase se llamaba. Al ser un producto que tiene infinitas dependencias (por redondear hacia abajo) y no siempre con el código disponible adivinar en que punto se llamaba me estaba costando más de un dolor de cabeza. Al final mi solución es lanzar una RuntimeException y confiar que en los logs dejase el StackTrace (que lo hizo) con lo que pude sacar lo que quería.&lt;/p&gt; &lt;p&gt;A raíz de esto me surgió la duda, ¿Puedo saber en tiempo de ejecución desde donde me llaman?. Sé que existen clases que usan esta posibilidad, el ejemplo más claro lo tengo de Log4J, en el que usando un patrón "%C" por ejemplo me dice desde que clase se ha invocado el método "&lt;em&gt;debug&lt;/em&gt;" (si no sabéis de que hablo, echadle un vistazo a &lt;a href="http://logging.apache.org/log4j/"&gt;log4j&lt;/a&gt;, es muy fácil de usar.... luego vuelve).&lt;/p&gt; &lt;p&gt;Me entró la curiosidad de saber como hacía eso Log4J y me bajé el código fuente, estuve echándole un vistazo y me encontré con la clave, la clase que consigue esta información se llama "org.apache.log4j.spi.LocationInfo" y es tan simple que me da casi vergüenza. La cosa se resumen en crear un objeto Throwable (una excepción vamos) y no lanzarlo, la información sobre los métodos que han llamado al método actual queda registrado en el StackTrace.&lt;/p&gt; &lt;p&gt;En mi &lt;a href="http://code.google.com/p/guevonaso-codes/"&gt;SVN&lt;/a&gt; he subido una clase llamada "&lt;em&gt;WhoCallMe&lt;/em&gt;", con su respectivo test, que no es más que una versión reducida de &lt;em&gt;LocationInfo&lt;/em&gt; de log4j para uso personal. El código se reduce a lo siguiente:&lt;/p&gt; 
&lt;pre class="java"&gt;
 // Creamos el Throwable
 Throwable t = new Throwable();
 // Creamos donde almacenar la información
 StringWriter sw = new StringWriter();
 PrintWriter pw = new PrintWriter(sw);
 String allInfo;
 // Recuperamos la información
 t.printStackTrace(pw);
 allInfo = sw.toString();
 sw.getBuffer().setLength(0);
.... 
 // En all info tenemos el stackTrace

&lt;/pre&gt;
 &lt;p&gt;Con una simple operación de "limpieza" podemos sacar de donde se llama el método sin demasiado esfuerzo. Por lo visto esta es una operación "costosa", por lo que no la recomiendo para uso masivo.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Actualización:&lt;/strong&gt; Me han pedido que explique un ejemplo de uso, el ejemplo lo podemos encontrar en mi &lt;a href="http://code.google.com/p/guevonaso-codes/"&gt;SVN&lt;/a&gt;, en la parte de test. Voy a comentarlo un poco por aquí.&lt;/p&gt; &lt;p&gt;El código anterior quedaría dentro de una clase a la que voy a llamar &lt;em&gt;WhoCallMe&lt;/em&gt;, que tendría un método &lt;em&gt;"getFullInfo()"&lt;/em&gt; que devolvería la lista completa de llamadas hasta el método actual. Seria algo como esto:&lt;/p&gt; 
&lt;pre class="java"&gt;
public class WhoCallMe {
  private String fullInfo;  
  // Constructor
  public WhoCallMe (Class clazz, String method) {
     // aquí irá 
     // más o menos el código anterior...
     this.fullInfo = sw.toString().
  }
  // Método
  public String getFullInfo() {
     return this.fullInfo;
  }
}
&lt;/pre&gt;
 &lt;p&gt;Ahora supongamos un método cualquiera, en mi código, que es llamado en algún momento y quiero saber por que clase (lo que comento al principio, no tengo el código fuente que usa mi clase, por ejemplo, pero me usa mal y quiero informar al responsable). Llamaré a mi clase "&lt;em&gt;CualquierClase&lt;/em&gt;" y para saber quien me usa haría lo siguiente :&lt;/p&gt; 
&lt;pre class="java"&gt;
public class CualquierClase {
 public void unMetodo() {
   // Lo primero que hago es instanciar 
   // WhoCallMe, indicando quien soy yo
   // es decir, a partir de quien quiero
   // saber la invocación.
   WhoCallMe who = new WhoCallMe (CualquierClase.class,"unMetodo");
   // y ahora puedo escribir un log o por
   // consola la traza
   System.out.println (who.getFullInfo()) 
   // aquí el resto del código de mi método.
   int a = 1 + 1;
 }}
&lt;/pre&gt;
 &lt;p&gt;Con esto lo que consigo es un resultado como este :&lt;/p&gt; 
&lt;pre class="java"&gt;
at es.un.paquete.CualquierClase.unMetodo(10)
at es.otro.paquete.OtraClase.otroMetodo(xx)
at ... 
&lt;/pre&gt;
 &lt;p&gt;Es decir que he "adivinado", sin lanzar una excepción, que a mi método lo llama una clase llamada "&lt;em&gt;OtraClase&lt;/em&gt;" en su método "&lt;em&gt;otroMetodo&lt;/em&gt;" en la linea "&lt;em&gt;xx&lt;/em&gt;".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-3294012337254241592?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8B9jX1OOt9OvKqw_dV9ne-dP6VQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8B9jX1OOt9OvKqw_dV9ne-dP6VQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8B9jX1OOt9OvKqw_dV9ne-dP6VQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8B9jX1OOt9OvKqw_dV9ne-dP6VQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/gzNCPqurmUY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/3294012337254241592/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=3294012337254241592" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/3294012337254241592?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/3294012337254241592?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/gzNCPqurmUY/quien-me-llama.html" title="Quien me llama" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/03/quien-me-llama.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04FRXY8fyp7ImA9WxVXFE4.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-1447345029711384086</id><published>2009-02-12T11:51:00.001+01:00</published><updated>2009-02-12T11:51:54.877+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-12T11:51:54.877+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><category scheme="http://www.blogger.com/atom/ns#" term="junit" /><title>Un poco de JUnit</title><content type="html">&lt;p&gt;Ahora ando programando un poco usando JUnit y se me ha ocurrido hacer una pequeña explicación de como funciona el cacharro este y como lo uso yo.&lt;/p&gt; &lt;p&gt;En principio la versión que yo conozco y que estoy usando es la 3, en la nueva versión han añadido algunas mejoras (puedes usar anotaciones en lugar de herencia por ejemplo) pero como yo no lo puedo usar por compatibilidad con lo que tengo, no voy a explicarlo aquí.&lt;/p&gt; &lt;p&gt;Para empezar algunos enlaces:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;En la Wikipedia hay cosas en &lt;a href="http://es.wikipedia.org/wiki/JUnit"&gt;españo&lt;/a&gt;l y en &lt;a href="http://en.wikipedia.org/wiki/JUnit"&gt;ingles&lt;/a&gt;. Con algunos enlaces interesantes.&lt;/li&gt; &lt;li&gt;La pagina oficial &lt;a href="http://www.junit.org/"&gt;aquí&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;En Javahispano &lt;a href="http://javahispano.org/contenidos.item.action?id=1028&amp;amp;menuId=ARTICLES"&gt;un tutorial&lt;/a&gt; (algo antiguo)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Y buscando por la red encontraréis como mil cosas más. La idea principal de JUnit es tener un framework sobre el que poder hacer las pruebas de tu código. Leí por ahí que una mala prueba siempre es mejor que ninguna, podríamos discutir sobre el tema, pero lo cierto es que lo importante es por lo menos deberíamos de tener pruebas mínimas que se puedan repetir siempre que queramos.&lt;/p&gt; &lt;p&gt;Lo difícil de las pruebas siempre es tener un estado inicial y un final conocido con el que determinar que el producto funciona para todos los casos posibles. Este estado inicial y final se suelen resumir en un conjunto de datos de prueba a usar. No siempre podemos mantener estos datos iniciales para asegurarnos de que las pruebas son siempre las mismas. Lo importante en todo caso es tener siempre presente que junit es una herramienta más, algo que existe para facilitar las cosas, pero no es ni la panacea ni nada que te va a solucionar la vida.&lt;/p&gt; &lt;p&gt;Bueno voy empezar con algo simple. Todo el código que aquí se muestra está en el SVN de mi blog : &lt;a href="http://code.google.com/p/guevonaso-codes/"&gt;http://code.google.com/p/guevonaso-codes/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Supongamos que tengo una clase que quiero probar que funciona, en mi caso es una clase que permite dar formato a las fechas en formato texto a clases Date (&lt;a href="http://code.google.com/p/guevonaso-codes/source/browse/trunk/java-utils/src/es/guevonaso/dates/DateTimeUtils.java"&gt;esta aquí&lt;/a&gt; ). Probar esto es simple usando JUnit. El primer paso es crear una clase que hereda de TestCase, la clase principal de JUnit :&lt;/p&gt; 
&lt;pre class="java"&gt;
public class DateTimeUitlsTest extends TestCase {
 @Override
 protected void setUp() throws Exception {
     super.setUp();
 }
 @Override
 protected void tearDown() throws Exception {
     super.tearDown();
}}
&lt;/pre&gt;
 &lt;p&gt;Ya tenemos nuestro primer test (si, si, en serio) ya podemos lanzarlo y veremos como todo funciona perfectamente.... obviamente si no hace nada, nada puede fallar :)&lt;/p&gt; &lt;p&gt;Para lanzar este primer test usaremos Eclipse (Todos los IDES que conozco tienen soporte para JUnit ). Tan simple como pulsar sobre la clase en el explorador de clases --&amp;gt; Botón derecho --&amp;gt; Run As --&amp;gt; JUnit Test . Deberías de tener un resultado similar al siguiente :&lt;/p&gt; &lt;p&gt;&lt;img src="http://img11.imageshack.us/img11/6789/junitlf8.png" style="DISPLAY: block; MARGIN-LEFT: auto; WIDTH: 362px; MARGIN-RIGHT: auto; HEIGHT: 392px; TEXT-ALIGN: center" title="Resultado JUnit" height="392" width="362" alt="junit.png"/&gt;&lt;/p&gt; &lt;p&gt;El método "setUp" es el primer método que se ejecuta en cada test, nos sirve para establecer una configuración inicial (preparar una base de datos, una carpeta, etc) y el método "tearDown" se ejecuta después de cada test (volver a un estado inicial). Depende de la prueba que hagamos estos métodos los sobreescribiremos o no.&lt;/p&gt; &lt;p&gt;Crear un test en esta clase es tan simple como crear un método que se llame "testXXXX" sin argumentos. Ejemplo :&lt;/p&gt; 
&lt;pre class="java"&gt;
public void testHora() {
  Date ahora = new Date();
  String hora = DateTimeUtils.hora(ahora);
  Calendar calendario = Calendar.getInstance();
  calendario.setTime(ahora);
  String[] div = hora.split(":");
  assertNotNull(div);
  assertTrue(div.length &amp;gt; 1);
  int hora = Integer.valueOf(calendario.get(Calendar.HOUR_OF_DAY));
  assertEquals(Integer.valueOf(div[0]),hora ));
  int minuto =  Integer.valueOf(calendario.get(Calendar.MINUTE));
  assertEquals(Integer.valueOf(div[1]),minuto);
}
&lt;/pre&gt;
 &lt;p&gt;Y eso es todo lo importante. Si volvemos a lanzar el test veremos como ahora el resultado muestra nuestro nuevo test. Una vez tengamos organizados los tests podemos agruparlos para lanzarlos todos juntos, la forma que ofrece JUnit son los TestSuite. No son mas que una clase que agrupa tests :&lt;/p&gt; 
&lt;pre class="java"&gt;
public class AllTests {
  public static Test suite() {
     TestSuite suite = new TestSuite("Test for es.guevonaso.test.dates");
     //$JUnit-BEGIN$
     suite.addTestSuite(DateTimeUitlsTest.class);
     //$JUnit-END$
     return suite;
  }
}
&lt;/pre&gt;
 &lt;p&gt;Lanzar ahora esta suite en lugar del test solo y lanzaremos todos nuestros tests juntos. Se pueden añadir suites a una suite, de forma que al final podremos lanzar todos los tests lanzando una sola clase.&lt;/p&gt; &lt;p&gt;La idea es hacer los tests una vez y tenerlos siempre, de forma que tras cualquier cambio, verificar que todo sigue funcionando es trivial. Ya depende del tiempo que le dediquemos a hacer los tests estos serán mas útiles o no.&lt;/p&gt; &lt;p&gt;Cualquier duda, un comentario :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-1447345029711384086?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ta2PYSO_g3vTDd8S9RaVHWR_Zcs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ta2PYSO_g3vTDd8S9RaVHWR_Zcs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ta2PYSO_g3vTDd8S9RaVHWR_Zcs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ta2PYSO_g3vTDd8S9RaVHWR_Zcs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/JWzL51I4Qyk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/1447345029711384086/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=1447345029711384086" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/1447345029711384086?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/1447345029711384086?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/JWzL51I4Qyk/un-poco-de-junit.html" title="Un poco de JUnit" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/02/un-poco-de-junit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUNRHo6cSp7ImA9WxVXEUQ.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-7868571189597612587</id><published>2009-02-09T15:02:00.004+01:00</published><updated>2009-02-09T15:38:15.419+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-09T15:38:15.419+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="codigo" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><title>Desarrollar tareas ant</title><content type="html">&lt;p&gt;Bueno, hoy voy a volver al mundo java, después de algunas semanas con otros temas. La historia de hoy va sobre ant, la herramienta para desarrollar scripts que mas se usa dentro de java. Ya he comentado en alguna ocasión mis impresiones sobre maven, el que pretende ser su "sustituto". Aunque realmente no es mas que una "estandarización" para la creación de proyectos. No voy a entrar en si el final de Ant esta cerca o lejos o si maven es mejor o peor que ant o si existen mejores soluciones para los scripts. Más allá de estas discusiones está la realidad, y es que ant es ahora mismo el "estandard" para la construcción en Java. Hay tanto hecho y tanta gente usándolo que hacer una migración a otra herramienta se hace con pies de plomo, algo parecido me he encontrado con java 1.4, aun hay proyectos en activo que se "niegan" a actualizarse (la ley básica, si funciona no lo toques).&lt;/p&gt; &lt;p&gt;Como recientemente he tenido que revisar algunos script en ant, aprovecho para hacer una breve pasada para hacer nuestros scripts ant más personalizados, creando nuestras propias tareas.&lt;/p&gt; &lt;p&gt;El proceso es relativamente simple, lo primero es la clase Java que vamos a crear. La documentación es aceptable, por lo que podéis echadle un vistazo para más información. Para muestra voy a crear una simple tarea que me dice el tamaño que tiene un fichero o carpeta y me lo va a guardar en una propiedad. Lo primero que voy a crear es la clase java que lo hace:&lt;/p&gt;
&lt;pre class="java"&gt;
package es.guevonaso.ant.size;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;

public class SizeTask extends Task {
private String property;
protected File file;

public SizeTask() {
 file = null;
 property = null;}

public void setFile(String s) {
 file = new File(s);}

public void setProperty(String s) {
 property = s;}

public void execute() throws BuildException {
 if (file == null)
    throw new BuildException("File attribute must be set.");
 if (file.exists()) {
     long lSize = size(file);
     String sSize = Long.toString( lSize / 1024L);
     getProject().setNewProperty(property, sSize);
 } else {
    throw new BuildException("File cannot be found.");
 }
}
private long size(File file) {
 log l = 0;
 if (file.isDirectory()) {
    File afile[] = file.listFiles();
    for (int i = 0; i &amp;lt; afile.length; i++)
       l += size(afile[i]);
 } else {
    l = file.length();
 }
 return l
}
&lt;/pre&gt;
&lt;p&gt;Como se ve, la clase tampoco es muy compleja, quizás se podría perfeccionar un poco, por ejemplo permitiendo indicar la magnitud a usar (KB, MB, GB) o que no fallase si se indica un fichero que no existe, etc. En cualquier caso sirve de orientación.&lt;/p&gt; &lt;p&gt;A modo de resumen comentar que el código que se ejecuta es el que está contenido dentro de "execute", que es el he hará las operaciones necesarias.&lt;/p&gt; &lt;p&gt;El siguiente paso será generar el xml para esta tarea. Yo voy a hacerlo en dos fichero diferentes, para hacerlo más ilustrativo, el primero definirá mi tarea ant, lo llamaré "custom-tasks.xml".&lt;/p&gt;
&lt;pre class="xml"&gt;
&lt;span style="color: rgb(0, 0, 128);"&gt;
&lt;strong&gt;&amp;lt;project name="custom-tasks" basedir=".." &amp;gt;
&amp;lt;taskdef name=&lt;span style="color: rgb(0, 128, 0);"&gt;"filesize"&lt;/span&gt;
&lt;/strong&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;strong&gt;classname=&lt;span style="color: rgb(0, 128, 0);"&gt;"es.guevonaso.ant.size.SizeTask"&lt;/span&gt;&amp;gt;
&amp;lt;classpath&amp;gt;
 &amp;lt;pathelement location="&lt;span style="color: rgb(0, 128, 0);"&gt;${basedir}/lib/guevonaso-ant.jar&lt;/span&gt;" /&amp;gt;
&amp;lt;/classpath&amp;gt;
&amp;lt;/taskdef&amp;gt;
&amp;lt;/project&amp;gt;&lt;/strong&gt;
&lt;/span&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Y por ultimo el fichero ant que usará esta tarea.&lt;/p&gt;
&lt;pre class="xml"&gt;
&lt;span style="color: rgb(0, 0, 128);"&gt;&lt;strong&gt;&amp;lt;project name="&lt;span style="color: rgb(0, 128, 0);"&gt;build&lt;/span&gt;" default="&lt;span style="color: rgb(0, 128, 0);"&gt;default&lt;/span&gt;" basedir="&lt;span style="color: rgb(0, 128, 0);"&gt;.&lt;/span&gt;"&amp;gt;&lt;/strong&gt;
&lt;strong&gt;&amp;lt;import file="&lt;span style="color: rgb(0, 128, 0);"&gt;${basedir}/lib/custom-tasks.xml&lt;/span&gt;"/&amp;gt;&lt;/strong&gt;
&lt;strong&gt; &amp;lt;target name="&lt;span style="color: rgb(0, 128, 0);"&gt;default&lt;/span&gt;"&amp;gt;
   &amp;lt;filesize file="${basedir}" property="sample-size"/&amp;gt;
   &amp;lt;echo&amp;gt;${sample-size} Kb&amp;lt;/echo&amp;gt;
  &amp;lt;/target&amp;gt;
&amp;lt;/project&amp;gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;pre&gt;

&lt;/pre&gt;
&lt;p&gt;El ejemplo es lo bastante básico como para que cualquiera pueda probarlo. Yo he subido este ejemplo al repositorio que tengo para el blog :&lt;/p&gt; &lt;p&gt;&lt;a href="http://code.google.com/p/guevonaso-codes/"&gt;http://code.google.com/p/guevonaso-codes/&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-7868571189597612587?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zjFtsWQ5dp2zOH9ET1hYtd7gHZo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zjFtsWQ5dp2zOH9ET1hYtd7gHZo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zjFtsWQ5dp2zOH9ET1hYtd7gHZo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zjFtsWQ5dp2zOH9ET1hYtd7gHZo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/C9ZCbVZPNUA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/7868571189597612587/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=7868571189597612587" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7868571189597612587?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7868571189597612587?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/C9ZCbVZPNUA/desarrollar-tareas-ant.html" title="Desarrollar tareas ant" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/02/desarrollar-tareas-ant.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIAQXk6cCp7ImA9WxVRFkk.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-5512146452313980922</id><published>2009-01-22T17:58:00.000+01:00</published><updated>2009-01-22T17:59:00.718+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-22T17:59:00.718+01:00</app:edited><title>Programas utiles</title><content type="html">&lt;p&gt;Esto de no programar tiene la cosa de que no tengo mucho de que contar últimamente, por lo que no sé con que actualizar el blog. Así que me he decidido por comentar un programa que me ha parecido tremendamente útil, al menos a mi que tengo que estar constantemente leyendo y escribiendo correos en el idioma de chaquespeare (según quien lo escriba, Shakespeare, se pronuncia algo así como Chesspir, pero esa es otra historia).&lt;/p&gt; &lt;p&gt;El programa en cuestión se llama &lt;a href="http://www.lingoes.net/" title="Lingoes"&gt;Lingoes&lt;/a&gt;, el programa ocupa poquito, se puede dejar en la bandeja del sistema y con un solo click (yo lo tengo configurado con CTRL + Botón derecho del ratón ) te dice la traducción de la palabra que tiene el cursor del ratón debajo en ese momento. Y si le instalas "voces" tienes muchas posibilidades de que te diga como se pronuncia, o usar el "lector automático de windows" o como se llame esa voz metálica de windows que lee textos.&lt;/p&gt; &lt;p&gt;Las voces no son mas que ficheros mp3, cada uno tiene el nombre de la palabra que pronuncian ("potatoe.mp3", "tomatoe.mp3", etc... ), por lo que en algún momento si tenéis buena pronunciación podéis guardar un fichero más que no esté. Aunque si usáis el que viene en la web que se descarga por P2P (emule creo) son casi 200Mb de voces.&lt;/p&gt; &lt;p&gt;Se le pueden añadir muchos diccionarios, que además de traducir te da la definición de la palabra. Puede usar diccionarios online, que lo que hace es conectarse a alguna web para traducir o mostrar una definición, yo por ejemplo he instalado el traductor de google y de yahoo como diccionarios online, de forma que de un click comparo en los dos sitios la traducción de una palabreja (no se exactamente como lo he configurado, pero puedo traducir también algunas frases usando el mismo servicio).&lt;/p&gt; &lt;p&gt;A mi personalmente me esta viniendo de perlas, así que lo pongo por aquí por si a alguien le puede venir igual de bien.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-5512146452313980922?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Zlr4ZaB24JpgioSLilK7lp6do2c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zlr4ZaB24JpgioSLilK7lp6do2c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Zlr4ZaB24JpgioSLilK7lp6do2c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zlr4ZaB24JpgioSLilK7lp6do2c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/nxfZXWbHEIw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/5512146452313980922/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=5512146452313980922" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5512146452313980922?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/5512146452313980922?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/nxfZXWbHEIw/programas-utiles.html" title="Programas utiles" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/01/programas-utiles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcESX84fyp7ImA9WxVSFEQ.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-4157282579380236907</id><published>2009-01-09T09:29:00.002+01:00</published><updated>2009-01-09T09:33:28.137+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-09T09:33:28.137+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="videos" /><category scheme="http://www.blogger.com/atom/ns#" term="curiosidades" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>Youtube para empezar</title><content type="html">&lt;p&gt;Feliz año nuevo a todos!!&lt;/p&gt;&lt;p&gt;Acabó el 2008 y ya empieza un año nuevo, con nuevos propósitos y espero que sea mejor que el pasado, aunque personalmente no me puedo quejar mucho, debo de reconocer que sí que ha sido un año duro en muchos sentidos.&lt;/p&gt;&lt;p&gt;Así que para empezar a hacerlo un poco más liviano, he decidido por comentar una aplicación que he encotrado el año pasado que me ha venido muy bien, mas que a mi personalmente, para resolver el problema casi constante de explicar a familiares como descargar un video del youtube y ponerlo en el movil de ultima generacion tan chulo,o  para descargarlo en el disco duro.&lt;/p&gt;&lt;p&gt;El programa se llama aTube Catcher, lo encontré en &lt;a href="http://atube-catcher.softonic.com/"&gt;Softonic&lt;/a&gt;, pero la pagina oficial es &lt;a href="http://atube-catcher.dsnetwb.com/"&gt;http://atube-catcher.dsnetwb.com/&lt;/a&gt;, basta poner la url el programa te baja el video y lo convierte al formato que queramos.&lt;/p&gt;&lt;p&gt;La cosa de comentarlo aquí es porque, para ayudar un poco a mi familia, hice un pequeño tutorial flash de como se usa. No es gran cosa, pero puede que os interese para ver como funciona o para verlo trabajar sin necesidad de descargar e instalar el programa. Solo funciona para windows, pero quizas funcione con Wine... &lt;/p&gt;&lt;p&gt;El manual : &lt;a title="http://fernando.rosado.googlepages.com/manualatubecatcher" href="http://fernando.rosado.googlepages.com/manualatubecatcher"&gt;http://fernando.rosado.googlepages.com/manualatubecatcher&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Bueno, un saludo y repito: ¡¡¡ FELIZ AÑO 2009!!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-4157282579380236907?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tf91H3xFvDuujZdK2pFcEnR-Chc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tf91H3xFvDuujZdK2pFcEnR-Chc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tf91H3xFvDuujZdK2pFcEnR-Chc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tf91H3xFvDuujZdK2pFcEnR-Chc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/SXO3IFUq5VA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/4157282579380236907/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=4157282579380236907" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/4157282579380236907?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/4157282579380236907?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/SXO3IFUq5VA/youtube-para-empezar.html" title="Youtube para empezar" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2009/01/youtube-para-empezar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYCQHk7eyp7ImA9WxVTF08.&quot;"><id>tag:blogger.com,1999:blog-5685202081702641113.post-7348551706511534724</id><published>2008-12-31T11:42:00.001+01:00</published><updated>2008-12-31T11:42:41.703+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-31T11:42:41.703+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="estadisticas" /><category scheme="http://www.blogger.com/atom/ns#" term="analytics" /><title>Resumen del año</title><content type="html">&lt;p&gt;Se acaba el año y es el momento de hacer recuento de como ha ido la cosa para el blog. Sinceramente el resultado ha sido más bueno de que lo que pensé que iba a ser. Lejos de convertirme en un sitio de referencia, la falta de constancia es una de las razones, al menos se puede ver que cierta cantidad de visitas si que tengo.&lt;span style="FONT-SIZE: 0.75em; FONT-FAMILY: Arial"&gt;&lt;img src="http://img355.imageshack.us/img355/4315/estadistica2008bt0.png" style="DISPLAY: block; MARGIN-LEFT: auto; WIDTH: 550px; MARGIN-RIGHT: auto; HEIGHT: 221px; TEXT-ALIGN: center" height="221" alt="estadistica_2008.png" width="550"/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Aunque al final del año las visitas han caido mucho, lo achaco a que he estado bastante relajado con el blog por la falta de tiempo (en el trabajo ha sido muy intenso estos ultimos meses). En general me salen 11.712 Visitas, que haciendo la media al año son 32 visitas al dia, que personalmente lo considero todo un éxito. Lo genial es que de esas visitas casi un 20% son "reincidentes" lo que me dice que al menos hay unas 7 personas diarias que han pasado por aqui más de una vez, lo que reduce la "accidentalidad".&lt;/p&gt; &lt;p&gt;No voy a hacer una descripcion detallada de todos los puntos de las gráficas y estadisticas que me da &lt;a href="https://www.google.com/analytics/"&gt;analytics&lt;/a&gt;, por no aburrir, pero no quiero dejar de dar las gracias a todos vosotros que pasáis por aqui o habeis pasado.Gracias, me hace mucha ilusion pensar que lo que hago le puede servir o gustar a alguien.&lt;/p&gt; &lt;p&gt;Feliz año nuevo a tod@s.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;Uso Javascript para formatear y colorear. Visita la web 
para verlo mejor.
&lt;script type="text/javascript"&gt;
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
&lt;/script&gt;
&lt;script type="text/javascript"&gt;
var pageTracker = _gat._getTracker("UA-90599-2");
pageTracker._initData();
pageTracker._trackPageview();
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5685202081702641113-7348551706511534724?l=guevoneandojava.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8R4H-rVJo9lxj-Q1L1FQ9ZOBR4E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8R4H-rVJo9lxj-Q1L1FQ9ZOBR4E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8R4H-rVJo9lxj-Q1L1FQ9ZOBR4E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8R4H-rVJo9lxj-Q1L1FQ9ZOBR4E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/GuevoneandoEnJava/~4/Vi_i5zqV1Ek" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://guevoneandojava.blogspot.com/feeds/7348551706511534724/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5685202081702641113&amp;postID=7348551706511534724" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7348551706511534724?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5685202081702641113/posts/default/7348551706511534724?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GuevoneandoEnJava/~3/Vi_i5zqV1Ek/resumen-del-ao.html" title="Resumen del año" /><author><name>Guevonaso</name><uri>http://www.blogger.com/profile/16595225281237936550</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="26" src="http://static.flickr.com/16/21772314_a6f420a97f_o.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://guevoneandojava.blogspot.com/2008/12/resumen-del-ao.html</feedburner:origLink></entry></feed>

