<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-33500033</id><updated>2012-01-18T15:12:49.762-03:00</updated><category term='linux'/><category term='musica'/><category term='ciclo'/><category term='sincronizar'/><category term='id3'/><category term='pausar'/><category term='java'/><category term='swing'/><category term='hilos'/><category term='organizar'/><category term='nimbus'/><category term='look and feel'/><category term='automatico'/><category term='jscrollpane'/><category term='gtk'/><category term='thread'/><category term='politica chile tecnologia de informacion TI desarrollo sustentable inversion pyme'/><category term='for'/><category term='respaldo'/><category term='anidado'/><category term='copiar'/><category term='unix'/><category term='disco duro'/><category term='mp3'/><category term='runnable'/><category term='qt'/><category term='jpanel'/><category term='para pensar'/><title type='text'>Leopard ...</title><subtitle type='html'>Asuntos de java, motos, musica, informática... y cualquier otra cosa que se me venga a la mente.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33500033.post-3007174642818170461</id><published>2011-11-30T09:46:00.001-03:00</published><updated>2011-11-30T10:32:38.713-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='respaldo'/><category scheme='http://www.blogger.com/atom/ns#' term='disco duro'/><title type='text'>Respaldo rápido de un disco duro en UNIX con dd</title><content type='html'>dd es un comando muy potente que realiza copias bit-a-bit de un archivo a otro. Gracias a que en UNIX, todos los dispositivos son un archivo, podemos aprovechar esta característica para hacer copias de seguridad.&lt;br /&gt;&lt;br /&gt;El uso básico de dd es:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;$dd if={archivo_de_entrada} of={archivo_de_salida} bs={tamaño_bloque}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;El tamaño de bloque indica más o menos la cantidad de bytes que se copiaran a la vez. Un tamaño de bloques pequeño permite una mayor tolerancia a fallos en el origen, mientras que un tamaño más grande permite una mayor velocidad.&lt;br /&gt;&lt;br /&gt;Por ejemplo, una copia de disco a disco podría ser:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;$dd if=/dev/hda of=/dev/sda bs=4096&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;También es posible usar un archivo de imagen:&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;$dd if=/dev/hda of=./imagen.img bs=4096 conv=noerror&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El parametro&amp;nbsp;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;conv=noeeror&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;indica que continúe si se presenta un error de lectura.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Especificamos un tamaño de bloque de 4k para hacerlo más tolerante a errores de lectura.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Otra forma es utilizarlo en conjunto con gzip para hacer copias de respaldo comprimidas:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;$dd if=/dev/hda conv=noerror bs=4k | gzip -c ./imagen.img.gz&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;O con gunzip para restaurar las imágenes de respaldo&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;$gunzip -z ./imagen.img.gz | dd of=/dev/hda bs=4k conv=noerror&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;Obviamente hay muchas más opciones, que pueden ser investigadas en el manual de dd&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;$man dd&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-3007174642818170461?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/3007174642818170461/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=3007174642818170461' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/3007174642818170461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/3007174642818170461'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2011/11/respaldo-rapido-de-un-disco-duro-en.html' title='Respaldo rápido de un disco duro en UNIX con dd'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-6885031447099754214</id><published>2011-08-30T10:42:00.000-03:00</published><updated>2011-11-30T10:32:08.748-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='runnable'/><category scheme='http://www.blogger.com/atom/ns#' term='thread'/><category scheme='http://www.blogger.com/atom/ns#' term='ciclo'/><category scheme='http://www.blogger.com/atom/ns#' term='for'/><category scheme='http://www.blogger.com/atom/ns#' term='hilos'/><title type='text'>Recorriendo Vectores gigantes con multiples hilos</title><content type='html'>&lt;span style="font-size: small;"&gt;Hay momentos en la vida en que inebitablemente nos enfrentamos a la busqueda de un valor dentro de una coleccion gigante. Hay veces en que el uso de un &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;contains(Object o)&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: small;"&gt; aplicado a una &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;Collection&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: small;"&gt; puede ser suficiente, pero hay ocasiones en las que incluso esto no es bastante.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Hace poco me vi enfrentado a un problema en que dado un dato y un gran vector, debía aplicar un algoritmo de comparación especial que me impedía recurrir al &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;contains().&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;El problema fundamental en este caso era que la comparación no se hacía directamente con un metodo &lt;/span&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;equals()&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: small;"&gt;o un == sino que ambos datos debían ser entregados a un tercer objeto que se encargaba de la verificación, por lo que me vi enfrentado a un punto en el que mi unica vía era iterar uno a uno los elementos del vector.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;En las pruebas de desarrollo el modelo funcionaba perfectamente, pero al ponerlo en producción comenzó a mostrar falencias en el rendimiento. Pese a que el algoritmo de verificación es eficiente, el ciclo&amp;nbsp;&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;for&lt;/span&gt;&lt;/i&gt;&lt;span style="font-size: small;"&gt; utilizado podía ser realmente demoroso.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Lugo de pensarlo un poco, llegué a una solución bastante aceptable, aprovechando las características multi hilo de Java.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;La solución en si es simple: &lt;/span&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;divide y vencerás&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: small;"&gt;. Corté el vector en N trozos de pequeño tamaño e inmediatamente lanzo N hilos de verificación simultánea que realizán la búsqueda. El primero que encuentre el dato grita "gané" y detiene a los demas hilos.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Visto paso a paso:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Establezco un tamaño de bloque. Por ejemplo 100 unidades. Cada hilo hará la búsqueda sobre este número de datos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Divido el tamaño de mi vector en el tamaño del bloque. Si el resultado es menor a uno, significa que mi vector es menor al bloque, por lo que el resultado debe ser 1.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Preparo un espacio para que cada hilo notifique que ha terminado sin encontrar resultados.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Preparo un boolean para indicar que el dato fue encontrado.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Lanzo hilos de busqueda.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Espero...&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;La implementacion mas simple de esta algoritmo, podria hacerse asi:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;public class Buscador &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; private static final int TAM_BLOQUE = 100; //Tamaño del bloque&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; private static Logger logger = Logger.getLogger(&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;Buscador.class.getName()&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;);&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; private boolean encontrado; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Indica que el dato fue encontrado&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; private List datos; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Donde se hara la busqueda&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; private Map&lt;integer, boolean=""&gt; flags;&lt;/integer,&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Donde cada hilo indica que termino&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; private Resultado resultado; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //El dato que fue encontrado&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; public &amp;nbsp;Buscador(List datos) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.datos = datos;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; /**&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Este metodo debe ser lanzado desde un hilo, no desde el event-dispatch&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* thread ya que si no bloqueara la GUI&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; public Resultado buscar(Muestra muestra) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (datos == null || datos.isEmpty()) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return null;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Sincronizo los datos para buscar desde muchos hilos&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List vector = Collections.synchronizedList(datos);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int bloques = datos.size() / TAM_BLOQUES;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (bloques &amp;lt; 1) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bloques = 1;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; flags = Collections.synchronizedMap(new HashMap&lt;integer, boolean=""&gt;(bloques));&lt;/integer,&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;final int largoSegmento = t / bloques;&lt;br /&gt;&amp;nbsp;       &amp;nbsp; &amp;nbsp; &amp;nbsp; encontrado = false;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; resultado = null;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /*&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* Este es el punto donde se lanzan los hilos de busquedas. Aprovechamos&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* las caractristicas de las clases anonimas y el metodo sleep() de la&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* clase Thread. Por eso este metodo debe lanzarse desde un hilo en&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;* segundo plano.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int hilo = 1; hilo &amp;lt;= bloques; hilo++) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final int nHilo = hilo; &amp;nbsp;//Lo hacemos final para usarlo en la clase anonima&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;flags.put(nHilo, false); //El hilo aun no termina&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Runnable busqueda = new Runnable() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void run() {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//Desde donde y hasta donde debe buscar este hilo&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int desde = desde = (nHilo - 1) * largoSegmento;&lt;br /&gt;&amp;nbsp;                   &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int hasta = largoSegmento * nHilo;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * Instancia del verificador. Es propia de cada clase, &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * para asi evitar colisiones entre los hilos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Verificador v = Verificador.newInstance();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int k = desde; k &amp;lt; hasta; k++) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (encontrado) {&lt;br /&gt;&amp;nbsp;                           &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logger.debug("Hilo " + nHilo + ": Otro hilo encontro el registro :(");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;                           &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; marcarfin();&lt;br /&gt;&amp;nbsp;                           &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&lt;br /&gt;&amp;nbsp;                       &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Object dato = vector.get(k);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Realiza la verificacion. . .. bla bla bla&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; v.verificar(dato, muestra);&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (v.esValido()) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;logger.debug("Hilo " + nHilo + ": Encontre el registro! :D");&lt;br /&gt;&amp;nbsp;                                   &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; encontrado = true;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; resultado = v.getResultado();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; marcarfin();&lt;br /&gt;&amp;nbsp;                                   &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logger.debug("Hilo " + nHilo + ": Finalizo sin encontrar registro :(");&lt;br /&gt;&amp;nbsp;                   &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; marcarfin();&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/**&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * Coloca en el mapa la marca de que este hilo ya temino.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private void marcarfin() {&lt;br /&gt;&amp;nbsp;                   &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;flags.put(nHilo, true);&lt;br /&gt;&amp;nbsp;               &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new Thread(busqueda, "Hilo de busqueda " + hilo).start();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while (!encontrado &amp;amp;&amp;amp; !finalizado()) {&lt;br /&gt;&amp;nbsp;           &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {&lt;br /&gt;&amp;nbsp;               &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Thread.sleep(500L);&lt;br /&gt;&amp;nbsp;           &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (InterruptedException ex) {&lt;br /&gt;&amp;nbsp;               &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//algo con la excepcion&lt;br /&gt;&amp;nbsp;           &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;       &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;       &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return resultado;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; /**&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Verifica que todos los hilos hayan finalizado.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; private boolean finalizado() {&lt;br /&gt;&amp;nbsp;       &amp;nbsp; &amp;nbsp; &amp;nbsp; for (boolean hiloFinalizado : flags.values()) {&lt;br /&gt;&amp;nbsp;           &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!hiloFinalizado) {&lt;br /&gt;&amp;nbsp;               &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return false;&lt;br /&gt;&amp;nbsp;           &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;       &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp;       &amp;nbsp; &amp;nbsp; &amp;nbsp; return true;&lt;br /&gt;&amp;nbsp;   &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;span style="font-size: x-small;"&gt;}&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;A simple vista puede verse algo confuso, pero si examina con detencion, puede verse que el truco se encuentra dentro del ciclo &lt;i&gt;for.&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt; Aqui se lanzan tantos hilos como deban ser lanzados. Cada hilo comparte algunos atributos con los demas hilos: Un mapa para grabar su estado, la variable donde se graba el resultado, un boolean para indicar que el dato fue encontrado y un vector sincronizado que es copia del original.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;Cada hilo realiza la búsqueda en su espacio asignado dentro del&amp;nbsp;&lt;i&gt;gran vector&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;. Asi, por ejemplo si nuestro vector tiene 1000 unidades y cada bloque es de 100, el primer hilo hará la busqueda desde el 0 al 99, el segundo desde el 100 al 199, el tercero desde el 200 al 299 y asi sucesivamente.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;Obviamente los valores aqui expresados son para ejemplo, quiza puedan modificarse los valores para ajustarse a un escenario más real. La clase &lt;i&gt;Verificador &lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;y sus metodos son ficiticias y la idea es que sea reemplazado por lo que se necesite. Del mismo modo puede optimizarse el uso de &lt;i&gt;Generics&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt; en el buscador y hacer otras mejoras como eliminar el boolean "encontrado".&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;También puede limitarse el número de hilos lanzados &lt;a href="http://leopard-bsod.blogspot.com/2009/08/control-y-pausa-de-ciclos-for-do-while.html"&gt;aplicando un mecanismo de pausa y espera&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt; para el control de los hilos y varias mejoras más que se me van ocurriendo.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;Actualmente esta implementación está funcionando perfectamente y mis usuarios no han vuelto a quejarse por lentitud.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: inherit;"&gt;=)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-6885031447099754214?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/6885031447099754214/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=6885031447099754214' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/6885031447099754214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/6885031447099754214'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2011/08/recorriendo-vectores-gigantes-con.html' title='Recorriendo Vectores gigantes con multiples hilos'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-1880073671660579625</id><published>2011-07-26T16:57:00.002-04:00</published><updated>2011-07-26T16:57:43.471-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='para pensar'/><title type='text'>Reflexión</title><content type='html'>Un buen programador no hace la pega.... hace un programa que haga la pega por él . . . .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-1880073671660579625?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/1880073671660579625/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=1880073671660579625' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/1880073671660579625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/1880073671660579625'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2011/07/reflexion.html' title='Reflexión'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-7189708192933670989</id><published>2011-07-26T12:50:00.001-04:00</published><updated>2011-07-26T13:00:47.739-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Controlar JSpinner con la rueda del mouse</title><content type='html'>Una caracteristica de una buena aplicacion con interfaz gráfica es la capacidad de responder a eventos que el usuario supone debe realizar para una determinada acción.&lt;br /&gt;&lt;br /&gt;Me explico: Si un usuario ve un botón, la acción natural es hacer clic en el, pero también sería válido hacer que el botón responda a la tecla 'enter'.&lt;br /&gt;&lt;br /&gt;Del mismo modo, en los JSpinner la acción natural es utilizar las flechitas y hacer clic en ellas para modificar el valor, pero si el mouse tiene rueda probablemente el usuario girará la rueda esperando modificar el valor del JSpinner.&lt;br /&gt;&lt;br /&gt;Para que esto ocurra, se debe agregar al JSpinner un &lt;i&gt;listener&lt;/i&gt; que implemente la interfaz &lt;b&gt;MouseWheelListener&lt;/b&gt;. Java tiene por defecto una implementación vacía llamada &lt;i&gt;MouseAdapter&lt;/i&gt; que simplifica la creación de &lt;i&gt;listener&lt;/i&gt; ya que debe sobrecargarse sólo el método que necesitamos.&lt;br /&gt;&lt;br /&gt;Manos a la obra: Una vez instanciado nuestro JSpinner agregamos un &lt;i&gt;MouseAdapter&lt;/i&gt; con un código similar a éste:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;JSpinner spinner = new JSpinner();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;SpinnerModel modelo = new SpinnerNumberModel(0, 0, 100, 1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;spinner.setModel(modelo);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;spinner.addMouseWheelListener(new MouseAdapter() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; public void mouseWheelMoved(MouseWheelEvent e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Object mov = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (e.getWheelRotation() == 1) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //la rueda baja&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov = modelo.getPreviousValue();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else if (e.getWheelRotation() == -1) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //la rueda sube&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov = modelo.getNextValue();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (mov == null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; modelo.setValue(mov);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } catch (Exception ex) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ex.printStackTrace();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;});&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, &amp;quot;Courier&amp;quot;, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Como puede observarse, se agrega una clase anónima que extiende a &lt;i&gt;MouseAdapter&lt;/i&gt; y sobrecargamos el método &lt;i&gt;mouseWheelMoved()&lt;/i&gt;. En este método leemos el evento y determinamos la dirección en que se giró la rueda. Para ello invocamos el método getWheelRotation() que retornará un entero: -1 si la rueda "sube" y 1 si la rueda "baja". &lt;br /&gt;&lt;br /&gt;Luego, sabiendo la direccion en que el usuario giró la rueda, le solicitamos al modelo del JSpinner el valor siguiente o anterior según el caso. Cuando se ha llegado al tope de valores del modelo (0 o 100 en el ejemplo) el modelo retorna null.&lt;br /&gt;&lt;br /&gt;Teniendo el valor que debemos aplicar, se lo entregamos al modelo. Fin del problema.&lt;br /&gt;&lt;br /&gt;Se pueden hacer varias mejoras al ejemplo (por ejemplo usar un &lt;i&gt;switch&lt;/i&gt; en lugar de un &lt;i&gt;if&lt;/i&gt;, pero eso queda a gusto del programador)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-7189708192933670989?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/7189708192933670989/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=7189708192933670989' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/7189708192933670989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/7189708192933670989'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2011/07/controlar-jspinner-con-la-rueda-del.html' title='Controlar JSpinner con la rueda del mouse'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-7215496481184311810</id><published>2009-10-23T16:51:00.001-03:00</published><updated>2009-10-23T16:51:52.593-03:00</updated><title type='text'>Primeras Impresiones de Kubuntu Karmic Koala</title><content type='html'>En cuanto me entere de que se habia liberado la primera RC de Kubuntu 9.10 Karmic Koala me hice el animo y decidi dar el salto.&lt;br /&gt;&lt;br /&gt;La actualizacion desde los repositorios de Chile tomo solo un par de horas y pude continuar trabajando normalmente mientras se hacia la actualizacion.&lt;br /&gt;&lt;br /&gt;La primera impresion fue notar la ausencia de parpadeos en la pantalla al conmutar entre el splash de inicio y el entorno X. Este beneficio se obtiene por el uso del Kernel Linux 2.6.31-14. &lt;br /&gt;&lt;br /&gt;Luego de un par de problemas con mi cliente SVN que pude solucionar purgando y reinstalando el paquete, pude comenzar a operar en serio.&lt;br /&gt;&lt;br /&gt;Uno de los cambios que me dejo gratamente sorprendido es la optimizacion en el uso de memoria que tambien viene gracias al uso del Kernel 2.6.31. El plasmoide de uso de memoria y la luz de actividad del disco duro acusan un menor uso de memoria virtual para la misma cantidad de aplicaciones abiertas. &lt;br /&gt;&lt;br /&gt;El rendimiento general tambien se vio incrementado. El comportamiento de Kwin por fin ha alcanzado un punto en el que no tiene nada que envidiar a otros sistemas de composicion. En mi  caso particular me he visto beneficiado por las mejoras en el driver de la tarjeta Intel.&lt;br /&gt;&lt;br /&gt;El aspecto grafico esta muy bien cuidado. Por ejemplo al instalar un programa con KPackageKit no utiliza una ventana GTK para pedir la contraseña de usuario sino que la aplicacion es "100% KDE". La integracion grafica de OpenOffice tambien agrega uniformidad al escritorio lo mismo que K3b (que por fin se integra visualmente con el tema de escritorio de KDE), auque no puedo decir lo mismo de otras aplicaciones que utilizan bindings GTK como Eclipse.&lt;br /&gt;&lt;br /&gt;En resumen general, Karmic Koala cumple lo que promete: Un incremento en el rendimiento que el usuario notará y mejoras visuales que se agradecen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-7215496481184311810?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/7215496481184311810/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=7215496481184311810' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/7215496481184311810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/7215496481184311810'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/10/primeras-impresiones-de-kubuntu-karmic.html' title='Primeras Impresiones de Kubuntu Karmic Koala'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-6493961910244910602</id><published>2009-10-21T15:46:00.002-03:00</published><updated>2009-10-21T15:46:41.482-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politica chile tecnologia de informacion TI desarrollo sustentable inversion pyme'/><title type='text'>La necesidad de inversion en TI en Chile</title><content type='html'>Les contare una experiencia personal&lt;br /&gt;&lt;br /&gt;Años atras participe en un proyecto de empresa con unos amigos en el que desarrollamos tecnologia para garantizar la trazabilidad de productos agricolas. El software era muy bueno, combinabamos lo mejor de la tecnologia móvil, software libre y un desarrollo innovador, creando un producto nacional que tenía un gran potencial para dotar a la industria agricola Chilena con una excelente herramienta de apoyo.&lt;br /&gt;&lt;br /&gt;Intetamos infructuosamente de obtener algun apoyo estatal ya que los ciclos de venta de este tipo de proyectos son largos, lo que no genera ingresos a corto plazo y por otro lado la mano de obra altamente calificada requiere pagar buenos salarios y contar con una oficina medianamente decente para reunirse con los clientes. Pese a que contamos con el apoyo de algunos empresarios y logramos cerrar algunos proyectos, se necesitaba una inyeccion de recursos importante en los primeros años de funcionamiento.&lt;br /&gt;&lt;br /&gt;Golpeamos las puertas de todos los bancos, recurrimos a varios ministerios, postulamos a varios proyectos y al final tuvimos que bajar la cortina. Me quedo una muy mala sensacion de la importancia que se le da a la industria nacional, sobre todo en el sector TI. Hasta el momento no existe una politica clara del gobierno para entregar apoyo al emprededor (en todas las areas) y mas aun en el área de TI.&lt;br /&gt;&lt;br /&gt;Con mucha tristeza he visto grandes acuerdos que cierra el gobierno con empresas extranjeras, entregando recursos preciosos que podrian ser invertidos en la industria nacional obtieniendo los mismos resultados a corto plazo, pero generando a largo plazo una plataforma de conocimento y experiencia que potencialmente se puede transformar en un producto de exportacion que generaria mucha riqueza.&lt;br /&gt;&lt;br /&gt;Solo basta imaginar que hubiera pasado si hubieramos conseguido el apoyo necesario en el moento necesario. Probablemente hoy en dia seriamos lider en sistemas de trazabilidad agrícola y quiza ya estariamos exportando nuestro conocimiento generando riqueza y puestos de trabajo que tan necesarios son hoy en dia.&lt;br /&gt;&lt;br /&gt;Tambien imagino una distribucion Linux desarrollada en conjunto por muchas universidades, institutos y liceos con patrocinio del estado. Imagino empresas recibiendo regalias tributarias en la medida que implementan esta distribucion. Imagino computadores ensamblados aqui en Chile con software nacional a bajo costo para todo ciudadano. Imagino muchas empresas utilizando estas herramientas y contratando a los profesionales surgidos de estas universidades e institutos prestando servicios aca y exportando su know-how a otros paises.&lt;br /&gt;&lt;br /&gt;He visto nacer y morir muchas empresas TI aca en Chile por falta de apoyo estatal. Por lo mismo creo que se hace necesario un rol mas activo del estado que vaya en apoyo del pequeño y mediano empresario que quiera innovar en tecnologia. Tal como dicen muchos, tecnologia no es lo mismo que internet. No estamos en condiciones de desarrollar una industria pesada o una industria de alta tecnologia (hardware) que sea competitiva con los estandares internacionales, pero si estamos en condiciones de desarroollar una industria basada en el software que puede potenciar y revolucionar el modelo economico nacional. Las herramientas estan al alcance de la mano, hay mucha innovacion aca, hay mucha gente inteligente, trabajadora y emprendedora. Solo hace falta darles una mano.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-6493961910244910602?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/6493961910244910602/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=6493961910244910602' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/6493961910244910602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/6493961910244910602'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/10/la-necesidad-de-inversion-en-ti-en.html' title='La necesidad de inversion en TI en Chile'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-4667733041050707800</id><published>2009-10-14T12:20:00.000-03:00</published><updated>2009-10-14T12:20:28.012-03:00</updated><title type='text'>Horas extras</title><content type='html'>2 horas extras diarias.. de 18:00 a 20:00 hrs, justo cuando comienza el horario de verano. Que lindo!!!&lt;br /&gt;&lt;br /&gt;Hay que ganarse el pan, asi que es mejor dedicarse de cabeza a eso, debemos establilizar una version del programa que cariñosamente llamamos 'incompilable' mientras que debemos hacer mejoras de ultimo minuto a la version estable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-4667733041050707800?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/4667733041050707800/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=4667733041050707800' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/4667733041050707800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/4667733041050707800'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/10/horas-extras.html' title='Horas extras'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-3302887082124198361</id><published>2009-09-08T08:45:00.000-04:00</published><updated>2009-09-08T08:45:31.901-04:00</updated><title type='text'>Makepkg version PI</title><content type='html'>En Slackware 13:&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Slackware package maker, version 3.14159&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;:-P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-3302887082124198361?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/3302887082124198361/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=3302887082124198361' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/3302887082124198361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/3302887082124198361'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/09/makepkg-version-pi.html' title='Makepkg version PI'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-2866752583251282425</id><published>2009-09-03T08:54:00.003-04:00</published><updated>2009-09-03T09:55:30.425-04:00</updated><title type='text'>Slackware 13 a la carta</title><content type='html'>Acabo de enterarme del &lt;a href="http://www.slackware.com/announce/13.0.php"&gt;lanzamiento de la version 13&lt;/a&gt; de la veterana distribucion Slackware Linux.&lt;br/&gt;&lt;br /&gt;Ha pasado mucha agua bajo el puente desde que probe linux por primera vez en 1998. Y dado que Slackware (version 3.3) fue lo primero que conoci, paso a ser mi distribucion favorita durante muchos años, llegando incluso a escribir &lt;a href="http://www.slackware.cl/index.php?q=node/345"&gt;un libro&lt;/a&gt; con algunos consejos para la utilizacion y aprendizaje.&lt;br/&gt;&lt;br /&gt;Cambios en mi enfoque de usuario, insatisfaccion con el ritmo de desarrollo y software disponible y otras cosas que no viene al cabo mencionar me hicieron abandonar el uso de esta distribucion cuando se encontraba en la version 11 (creo). Aun asi siempre tuve el DVD a mano ya que hasta el momento no he conocido otra distribucion que funcione en modo Live sin tratar de iniciar X, lo que se agradece cuando la tarjeta de video no esta soportada (lease ATI).&lt;br/&gt;&lt;br /&gt;Hace un par de meses atras tuve que descargar el DVD de la version 12.2 para probar un servidor con tarjeta RAID que era imposoble de hacer funcionar con otras distros (Centos, Ubuntu y Suse no se la pudieron). Al comprobar que Slackware arrancaba sin problemas y felizmente reconociendo de inmediato la controladora e ignorando cualquier otro error, retumbaron en mi mente las palabras 'Keep it simple, stupid'.&lt;br/&gt;&lt;br /&gt;Y bien, hoy me disponia a instalar Slackware 12 en una maquina virtual cuando solo por curiosidad visito la pagina oficial. Asi es como me encuentro con la agradable noticia de una nueva version de la que fue mi primer amor. Una lectura del anuncio oficial hizo que me pusiera a descargarla de inmediato y ahora solo espero que termine pronto la descarga para probarla en una maquina REAL y no virtual:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Por primera vez Slackware tiene un port &lt;b&gt;oficial&lt;/b&gt; a 64 bits. Era algo de realmente necesario y que de hecho me tenia desencantado.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Entornos de escritorio XFCE 4.6.1 y KDE 4.2.4. Personalmente creo que habria sido mejor incoporar KDE 4.3.0 pero considerando que fue lanzado hace poco... quiza en la version current....&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Kernel 2.6.29. Debo agregar que Slackware es la unica distribucion de todas las que he probado que &lt;b&gt;nunca me ha dado problemas con los drivers propietarios de ATI y Nvidia&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GNU Lib C 2.9&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GCC 4.3.3&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Una coleccion de paquetes de X 'remasterizada' que en muchos casos presciende del archivo de configuracion&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Un nuevo formato de paquetes 'txz' con mayor compresion y otras mejoras&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Ahora solo espero que termine de bajar para probarlo... espero reencantarme.&lt;br/&gt;&lt;br /&gt;bytes!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-2866752583251282425?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/2866752583251282425/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=2866752583251282425' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/2866752583251282425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/2866752583251282425'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/09/slackware-13-la-carta.html' title='Slackware 13 a la carta'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-1475078399527887524</id><published>2009-08-28T11:29:00.002-04:00</published><updated>2009-08-28T11:33:53.504-04:00</updated><title type='text'>Eclipse v/s Netbeans  . . .  Introduccion</title><content type='html'>&lt;p&gt;Una disputa de nunca acabar. Una guerra santa mas &lt;br /&gt;en el universo del software.&lt;br/&gt;&lt;br /&gt;Cuando no es Windows v/s Linux, Kde v/s Gnome, GTK v/s QT. Siempre hay un buen motivo para pelear. Y como no se puede ser menos, tambien hay bandos que luchan a muerte por imponer al bando contrario la idea de que su IDE favorito es el mejor.&lt;br/&gt;&lt;br /&gt;No pretendo aqui decantarme por un bando en particular. He usado ambos IDE en los ultimos 6 &lt;br /&gt;meses, lo suficiente como para dar una opinion objetiva y sin cegueras causadas por el fanatismo. Cada IDE tiene sus pro y sus contra, y la decision final dependera de las necesidades y el gusto personal de cada uno.&lt;br/&gt;&lt;br /&gt;&lt;b&gt;Preparando el terreno:&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;Antes de comenzar, quiero poner mis piezas sobre el tablero &lt;br /&gt;para que asi se entienda en cierta manera mi perspectiva:&lt;br/&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Llevo casi 3 años programando en Java, 11 años usando Linux, y trabaje 5 años como administrador de redes antes de programar.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cuando aprendi Java (hice un curso), fue con Eclipse. Mis primeros pasos en Java fueron con Eclipse.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Durante 1 año y medio aprox trabaje exclusivamente con NetBeans, desarrollando en J2EE, Struts y Swing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Los ultimos 6 meses han sido simultaneamente en Eclipse y Netbeans dependiendo del problema a enfrentar. Ha sido trabajando en una aplicacion Swing con base de datos Postgres&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Durate los proximos meses ire escribiendo acerca de mis impresiones, las cuales emanan desde una prespectiva de usuario de la aplicacion, el cual debe lidiar con factores como la configuracion, ayuda, herramientas disponibles, extensiones, bugs, etc. Factores que finalmente influyen en algo tan trascendental como es la &lt;b&gt;productividad&lt;/b&gt; de quien utiliza estas herramientas.&lt;br/&gt;&lt;br /&gt;No pretendo hacer una comparación demasiado acuciosa, sino más bien que estas líneas y sus futuras extensiones sirvan de orientación al usuario neófito que debe decidir por cual herramienta decantarse.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Let's dance!&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-1475078399527887524?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/1475078399527887524/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=1475078399527887524' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/1475078399527887524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/1475078399527887524'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/08/eclipse-vs-netbeans-introduccion.html' title='Eclipse v/s Netbeans  . . .  Introduccion'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-3676561731158627664</id><published>2009-08-21T08:44:00.005-04:00</published><updated>2009-08-21T09:27:53.669-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='id3'/><category scheme='http://www.blogger.com/atom/ns#' term='musica'/><category scheme='http://www.blogger.com/atom/ns#' term='organizar'/><category scheme='http://www.blogger.com/atom/ns#' term='copiar'/><title type='text'>AudioCopy 0.1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_r7GBSM1p5ik/So6Zd8R7zBI/AAAAAAAAAAM/WcvsjgwWLoc/s1600-h/audiocopy_0.1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 272px;" src="http://3.bp.blogspot.com/_r7GBSM1p5ik/So6Zd8R7zBI/AAAAAAAAAAM/WcvsjgwWLoc/s320/audiocopy_0.1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5372400145176185874" /&gt;&lt;/a&gt;&lt;br /&gt;AudioCopy es una sencilla herramienta para copiar y transferir archivos de audio&lt;br /&gt;desde una carpeta a otra.&lt;br /&gt;&lt;br /&gt;A diferencia de los complementos y plugins de algunos reproductores de musica,&lt;br /&gt;AudioCopy tiene algunas ventajas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Copia hasta 4 archivos simultaneamente (por defecto 2)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Permite pausar las copias&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Es ligero y consume pocos recursos del computador.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;100% Java. Puede ser ejecutado en cualquier computador con Java 6 o superior&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Codigo Libre. Puedes modificar, contribuir o simplemente curiosear respetando&lt;br /&gt;la licencia. Tambies puedes compartirlo con quien quieras.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Facil de usar. Su interfaz es simple y no tiene menus extravagantes o atajos&lt;br /&gt;dificiles de aprender.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Caracteristicas de la version actual 0.1&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Hasta 4 copias simultaneas&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Pausado de copia.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Agregar nuevas pistas a la cola mientras copia.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Crea carpetas destino segun tags de archivos de audio&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Licencia GPL V2&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;artista/año - album/pista - titulo.extension&lt;br /&gt;&amp;nbsp;&amp;nbsp;Depeche Mode/1997 - Ultra/01 - Barrel of a Gun.mp3&lt;br /&gt;&lt;br /&gt;Requisitos:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Java 1.6 o superior&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Errores conocidos en la version actual.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Falla con carpetas de musica demasiado grande&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Se puede cambiar la carpeta origen durante la exploracion, lo que da problemas&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No manipula bien los errores durante la copia (disco lleno, etc.)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Mejoras proximas:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Corregir errores conocidos&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Acelerar la exploracion.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Recordar carpetas origen (con contenido) y destino.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cancelar la copia&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Seleccionr codificacion (ISO/UTF) segun filesystem de carpeta destino&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Posiblemente en un futuro distante:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Tooltips y ayudas contextuales&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Informar progreso de copias individuales.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Editor de tags&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Detectar automaticamente unidades USB&lt;/li&gt;&lt;br /&gt;&lt;li&gt;¿Reproductor?   ... por ahora me quedo con &lt;a href="http://jajuk.info/index.php/Main_Page"&gt;Jajuk&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;La version actual puede obtenerse &lt;a href="http://kenai.com/projects/audiocopy"&gt;aqui&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-3676561731158627664?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/3676561731158627664/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=3676561731158627664' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/3676561731158627664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/3676561731158627664'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/08/audiocopy-01.html' title='AudioCopy 0.1'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</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://3.bp.blogspot.com/_r7GBSM1p5ik/So6Zd8R7zBI/AAAAAAAAAAM/WcvsjgwWLoc/s72-c/audiocopy_0.1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-5320306139610667754</id><published>2009-08-19T09:16:00.005-04:00</published><updated>2009-08-19T10:55:07.985-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='runnable'/><category scheme='http://www.blogger.com/atom/ns#' term='thread'/><category scheme='http://www.blogger.com/atom/ns#' term='ciclo'/><category scheme='http://www.blogger.com/atom/ns#' term='sincronizar'/><category scheme='http://www.blogger.com/atom/ns#' term='for'/><category scheme='http://www.blogger.com/atom/ns#' term='pausar'/><category scheme='http://www.blogger.com/atom/ns#' term='hilos'/><title type='text'>Control y pausa de ciclos for, do, while en Java</title><content type='html'>Un problema que sucede a menudo cuando se necesita procesar gran cantidad de informacion en un ciclo for o do/while es el de pausar el ciclo, esperar alguna señal y continuar. &lt;br /&gt;&lt;br /&gt;for (condicion) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....hacer algo...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....esperar....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....continuar.....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Por ejemplo, un problema al que me vi enfrentado fue el de ingresar el precio para una gran cantidad de productos, teniendo los productos en un Collection, parecia facil iterar sobre este listado, mostrar una ventana para que el usuario ingresara el precio y continuar:&lt;br /&gt;&lt;br /&gt;Collection&lt;Producto&gt; productos;&lt;br /&gt;for (Producto p : productos) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ingresarPrecio(p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;A primera vista se ve simple, pero si este codigo es ejecutado, su resultado sera abrir tantas ventanas de ingreso como productos tenga el Collection.&lt;br /&gt;&lt;br /&gt;La forma de ir mostrando las ventanas de forma ordenada, es pausar el ciclo for hasta que la ventana genere algun evento. Para ello lo primero sera hacer correr el ciclo dentro de un &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html"&gt;Thread&lt;/a&gt; diferente del actual de forma que pueda ser controlado sin interrumpir la ejecucion del programa:&lt;br /&gt;&lt;br /&gt;Runnable hiloFor = new Runnable() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (Producto p : productos) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ingresarPrecio(p);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;new Thread(hiloFor).start;&lt;br /&gt;&lt;br /&gt;Esto lanzara nuestro ciclo for en un hilo distinto del actual, abriendonos la posibilidad de control. Para ello utilizaremos los metodos proporcionados por la clase &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html"&gt;Thread&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lo que haremos a continuacion sera sincronizar el Thread donde vive nuestro ciclo for con el Thread principal donde se enta ejecutando nuestra aplicacion (en el caso de una aplicacion Swing sera el &lt;a href="http://en.wikipedia.org/wiki/Event_dispatching_thread"&gt;Event dispatching thread&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Collection&lt;Producto&gt; productos;&lt;br /&gt;Thread hilo;&lt;br /&gt;&lt;br /&gt;Runnable hiloFor = new Runnable() {&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread actual = Thread.currentThread();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;synchronized(actual) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (Producto p: Productos) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ingresarPrecio(p);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;actual.wait();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;hilo = new Thread(hiloFor);&lt;br /&gt;hilo.start();&lt;br /&gt;&lt;br /&gt;Puede notarse de inmediato los cambios introducidos: Primero obtenemos el objeto Thread donde se ejecuta nuestro for y luego ejecutamos el ciclo dentro de un bloque sincronizado con este hilo, invocamos el metodo que abre la ventana y pausamos la ejecucion del hilo.&lt;br /&gt;&lt;br /&gt;En este punto el hilo donde se ejecuta el ciclo for estara pausado de forma indefinida esperando la señal notify(). Luego el metodo ingresarPrecio(Producto p) debera:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Abrir la ventana para ingresar el precio en el event dispatching thread&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Notificar al hilo que puede continuar una vez se haya hecho el ingreso&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Para ello, bastara que el metodo ingresarPrecio(Producto p) incluya en su interior algo similar a:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ingresarPrecio(final Producto p) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Runnable abrir = new Runnable() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void run() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VentanaIngreso v = new VentanaIngreso(p);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.addActionListener(new ActionListener() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void actionPerformed(ActionEvent e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continuar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private void continuar() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;synchronized (hilo) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hilo.notify();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SwingUtilities.invokeLater(abrir);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;La parte importante aca es el metodo continuar(). Aqui se le dice al hilo que continue ejecutandose. Como puede verse en este sencillo ejemplo, este metodo se llama desde un ActionListener que sera gatillado dentro de la ventana de ingreso ante ciertas acciones (cancelar, grabar el precio, etc).&lt;br /&gt;&lt;br /&gt;El ejemplo puede mejorarse y extenderse a otras situaciones.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bytes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-5320306139610667754?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/5320306139610667754/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=5320306139610667754' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/5320306139610667754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/5320306139610667754'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/08/control-y-pausa-de-ciclos-for-do-while.html' title='Control y pausa de ciclos for, do, while en Java'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-745367962462499676</id><published>2009-08-13T09:19:00.003-04:00</published><updated>2009-08-13T09:22:13.556-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='look and feel'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='nimbus'/><category scheme='http://www.blogger.com/atom/ns#' term='qt'/><title type='text'>Control de Look and Feel en Swing</title><content type='html'>&lt;p&gt;Un problema recurrente de los usuarios de aplicaciones &lt;br /&gt;creadas en Java es el del look an feel. "No se ve como &lt;br /&gt;si fuera windows" es el tipico comentario de quien usa &lt;br /&gt;una aplicacion Swing en este sistema operativo. Los &lt;br /&gt;usuarios de *nix estan mas acostumbrados a las diferencias &lt;br /&gt;de l&amp;f segun el toolkit de la aplicacion (gtk+, qt, motif.. etc) &lt;br /&gt;y no suelen quejarse tanto.&lt;br /&gt;&lt;br /&gt;Personalmente encuentro horrible el l&amp;f por defecto (metal) &lt;br /&gt;asi que tengo a mano un codigo que selecciona automaticamente &lt;br /&gt;el l&amp;f dependiendo del sistema:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;&lt;br /&gt;String jVersion = System.getProperty("java.version");&lt;br /&gt;String os = System.getProperty("os.name");&lt;br /&gt;String[] ver = jVersion.split("_");&lt;br /&gt;if (ver.length &gt; 0) {&lt;br /&gt;                String vMajor = ver[0];&lt;br /&gt;                Double update = Double.parseDouble(ver[1]);&lt;br /&gt;                try {&lt;br /&gt;                    if (vMajor.compareTo("1.6.0") &gt; -1 &amp;&amp; update &gt;= 10) {&lt;br /&gt;                        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");&lt;br /&gt;                    } else {&lt;br /&gt;                        if (os.toLowerCase().contains("windows")) {&lt;br /&gt;                            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");&lt;br /&gt;                        } else if (os.toLowerCase().contains("linux")) {&lt;br /&gt;                            UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                } catch (ClassNotFoundException ex) {&lt;br /&gt;                    Logger.getLogger(Main.class.getName()).log(Level.WARNING, bundle.getString("error.lf"), ex);&lt;br /&gt;                } catch (InstantiationException ex) {&lt;br /&gt;                    Logger.getLogger(Main.class.getName()).log(Level.WARNING, bundle.getString("error.lf"), ex);&lt;br /&gt;                } catch (IllegalAccessException ex) {&lt;br /&gt;                    Logger.getLogger(Main.class.getName()).log(Level.WARNING, bundle.getString("error.lf"), ex);&lt;br /&gt;                } catch (UnsupportedLookAndFeelException ex) {&lt;br /&gt;                    Logger.getLogger(Main.class.getName()).log(Level.WARNING, bundle.getString("error.lf"), ex);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;----------&lt;br /&gt;&lt;br /&gt;El codigo en si es bastante simple:&lt;br /&gt;&lt;br /&gt;- Obtengo la version de la VM de java.&lt;br /&gt;- Obtengo el nombre del sistema operativo.&lt;br /&gt;- Obtengo el numero de actualizacion de la VM.&lt;br /&gt;&lt;br /&gt;Desde el update 10 de la JVM 1.6 se encuentra disponible &lt;br /&gt;el l&amp;f "Nimbus", asi que si nuestra version de JVM es &lt;br /&gt;1.6_10 o superior se selecciona este L&amp;F para la &lt;br /&gt;aplicacion. En caso contrario si el sistema es Windows &lt;br /&gt;se selecciona el L&amp;F de Windows, si el OS es Linux &lt;br /&gt;se selecciona el L&amp;F GTK  (como quisiera un l&amp;f QT!!!).&lt;br /&gt;&lt;br /&gt;Si no es posible seleccionar alguno de estos L&amp;F se &lt;br /&gt;mantendra el por defecto (metal).&lt;br /&gt;&lt;br /&gt;Bastara con que este codigo se inserte en el main() de &lt;br /&gt;nuestra aplicacion Swing, antes que se dibuje el primer &lt;br /&gt;JFrame y lo demas sera coser y cantar.&lt;br /&gt;&lt;br /&gt;Esta solucion es muy simple y utiliza las bibliotecas &lt;br /&gt;estandar de la JVM. No obstante podemos extender &lt;br /&gt;las capacidades de L&amp;F de nuestra aplicacion utilizando &lt;br /&gt;la completisima biblioteca &lt;a href="https://substance.dev.java.net/ "&gt;substance&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;bytes!!&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-745367962462499676?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/745367962462499676/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=745367962462499676' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/745367962462499676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/745367962462499676'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/08/control-de-look-and-feel-en-swing.html' title='Control de Look and Feel en Swing'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-5415679597914686406</id><published>2009-08-12T17:46:00.002-04:00</published><updated>2009-08-13T09:23:01.543-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='jpanel'/><category scheme='http://www.blogger.com/atom/ns#' term='automatico'/><category scheme='http://www.blogger.com/atom/ns#' term='jscrollpane'/><category scheme='http://www.blogger.com/atom/ns#' term='anidado'/><title type='text'>Moviendo un JScrollPane de forma automatica</title><content type='html'>&lt;p&gt;Uno de los problemas clasicos al tener un JPanel dentro &lt;br /&gt;de un JScrollPane es como mover automaticamente la &lt;br /&gt;barra de Scroll del JScrollPane. Para ello existe el metodo &lt;br /&gt;scrollRectToVisible(Rectangle r) que hara que el o los&lt;br /&gt;ScrollBar se desplazen para hacer que el rectangulo indicado &lt;br /&gt;sea visible.&lt;br /&gt;&lt;br /&gt;Hasta aqui la cosa no es muy complicada, pero ¿que ocurre &lt;br /&gt;si dentro de nuestro JPanel tenemos uno o mas JPanel &lt;br /&gt;anidados? La cosa tiende a complicarse un poco ya &lt;br /&gt;que la posicion final de nuestro componente es desconocida &lt;br /&gt;para el JScrollPane.&lt;br /&gt;&lt;br /&gt;Consideremos el siguiente ejemplo:&lt;br /&gt;&lt;br /&gt;--------------------&lt;br /&gt;JScrollPane scrPane = new JScrollPane();&lt;br /&gt;JPanel panelPrincipal = new JPanel();&lt;br /&gt;JPanel panelAnidado1 = new JPanel();&lt;br /&gt;JPanel panelAnidado2 = new JPanel();&lt;br /&gt;&lt;br /&gt;JLabel label = new JLabel("....");&lt;br /&gt;JTextField txt = new JTextField("......")M&lt;br /&gt;&lt;br /&gt;panelAnidado2.add(txt);&lt;br /&gt;panelAnidado2.add(label)&lt;br /&gt;&lt;br /&gt;panelAnidado1.add(panelAnidado2);&lt;br /&gt;panelPrincipal.add(panelAnidado1)&lt;br /&gt;&lt;br /&gt;scrPane.setViewportView(panelPrincipal);&lt;br /&gt;----------------------&lt;br /&gt;&lt;br /&gt;Si queremos desplazar el JScrollPane hasta la posicion del &lt;br /&gt;label o el txt, la primera idea que se nos viene a la cabeza &lt;br /&gt;seria:&lt;br /&gt;&lt;br /&gt;-------&lt;br /&gt;scrPane.scrollRectToVisible(label.getBounds());&lt;br /&gt;-------&lt;br /&gt;&lt;br /&gt;Lamentablemente esto no funcionara ya que scrPane solo &lt;br /&gt;"sabe de la existencia" de panelPrincipal e ignora su contenido. &lt;br /&gt;Por lo tanto lo que debemos hacer es calcular la posicion &lt;br /&gt;relativa de label  con respecto a panelPrincipal.&lt;br /&gt;&lt;br /&gt;Para ello, el siguiente codigo de ejemplo puede ser util;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;//obtengo el padre del label (panelAnidado2)&lt;br /&gt;JPanel padre = (JPanel) label.getParent();&lt;br /&gt;//Obtengo la posicion del padre&lt;br /&gt;Point posPadre = padre.getLocation();&lt;br /&gt;//Obtengo el 'padre del padre' (panelAnidado1) y su posicion&lt;br /&gt;JPanel padre2 = (JPanel)&lt;br /&gt;Point posPadre2 = padre2.getLocation();&lt;br /&gt;&lt;br /&gt;//Conociendo las posiciones, puedo hacer el calculo&lt;br /&gt;Double y = posPadre2.getY() + posPadre1.getY() + label.getLocation.getY();&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * la variable y contiene la distancia desde el borde del&lt;br /&gt; * panelAnidado1 hasta el borde del label&lt;br /&gt; */&lt;br /&gt;//Creo un punto en la posicon  relativa del Label&lt;br /&gt;&lt;br /&gt;Point relativo = new Point(new Double(posPadre2.getX()).intValue(), y.intValue());&lt;br /&gt;&lt;br /&gt;//Con este punto relativo puedo crear un rectangulo y desplazar el JScrollPane&lt;br /&gt;&lt;br /&gt;Rectangle moverA = new Rectangle(relativo, label.getPreferredSize());&lt;br /&gt;scrPane.scrollRectToVisible(moverA);&lt;br /&gt;&lt;br /&gt;---------------&lt;br /&gt;&lt;br /&gt;Resumen:&lt;br /&gt;&lt;br /&gt;Como 'panelPrincipal' desconoce la presencia y posicon &lt;br /&gt;de label, calculamos la posicion relativa de label con &lt;br /&gt;respecto a 'panelPrincipal' en base a la posicion de su padre &lt;br /&gt;y cualquier panel previo. Una vez conocida esta posicion &lt;br /&gt;relativa, basta desplazar el scrPane hasta un rectangulo &lt;br /&gt;ubicado en esta posicion relativa con el tamaño del &lt;br /&gt;componente que queremos enfocar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Agregando este codigo a un FocusListener, es facil &lt;br /&gt;hacer que el JScrollPane se desplace hasta la posicion &lt;br /&gt;del componente que obtiene el foco:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;--------------&lt;br /&gt;&lt;br /&gt;scrollOpcional = new FocusAdapter() {&lt;br /&gt;&lt;br /&gt;                    @Override&lt;br /&gt;                    public void focusGained(FocusEvent e) {&lt;br /&gt;                        Point posicionOpcional = panelOpcional.getLocation();&lt;br /&gt;                        JPanel parent = (JPanel)e.getComponent().getParent();&lt;br /&gt;                        Double y = posicionOpcional.getY() + parent.getLocation().getY();&lt;br /&gt;                        Point relativo = new Point(new Double(posicionOpcional.getX()).intValue(), y.intValue()  + parent.getHeight());&lt;br /&gt;                        panelIngreso.scrollRectToVisible(new Rectangle(relativo, parent.getPreferredSize()));&lt;br /&gt;                    }&lt;br /&gt;                };&lt;br /&gt;--------------&lt;br /&gt;&lt;br /&gt;bytes!&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-5415679597914686406?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/5415679597914686406/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=5415679597914686406' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/5415679597914686406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/5415679597914686406'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/08/moviendo-un-jscrollpane-de-forma.html' title='Moviendo un JScrollPane de forma automatica'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-7557520488164556309</id><published>2009-01-22T15:06:00.002-03:00</published><updated>2009-01-22T15:09:03.730-03:00</updated><title type='text'>BLOG??</title><content type='html'>Veo que por fin la interfaz de Blogspot ha mejorado un poco.&lt;br /&gt;&lt;br /&gt;Lo suficiente para animarme a escribir de vez en cuando.&lt;br /&gt;&lt;br /&gt;La vida ya tiene demasiadas interfaces: los mandos de un vehículo, las ventanas de windows, la consola de Linux, la interfaz del celular, el idioma de las mujeres... si a eso sumamos que para escribir idioteces que nadie lee debes entenderte con una interfaz maldita que apenas se entiend, poco ánimo queda de publicar entradas...&lt;br /&gt;&lt;br /&gt;en fin.. a ver si me hago el animo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-7557520488164556309?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/7557520488164556309/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=7557520488164556309' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/7557520488164556309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/7557520488164556309'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2009/01/blog.html' title='BLOG??'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-33500033.post-8091073096000025061</id><published>2007-06-05T16:07:00.000-04:00</published><updated>2007-06-05T16:08:29.134-04:00</updated><title type='text'>return</title><content type='html'>volviendo a esto del blog....&lt;br /&gt;&lt;br /&gt;espero escribir mas seguido, aunque nadie lo lea&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33500033-8091073096000025061?l=leopard-bsod.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://leopard-bsod.blogspot.com/feeds/8091073096000025061/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33500033&amp;postID=8091073096000025061' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/8091073096000025061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33500033/posts/default/8091073096000025061'/><link rel='alternate' type='text/html' href='http://leopard-bsod.blogspot.com/2007/06/return.html' title='return'/><author><name>Leopard</name><uri>http://www.blogger.com/profile/03364206591567109276</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
