<?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-5459850530204411035</id><updated>2011-06-06T17:03:59.301+02:00</updated><category term='Programación'/><category term='Música'/><category term='Humor'/><category term='Utilidades'/><category term='Informática'/><category term='Java'/><category term='Blogosfera'/><category term='Noticias'/><category term='Linux'/><category term='Curiosidades'/><title type='text'>Núcleo de Ferrita</title><subtitle type='html'>Tu blog sobre tecnología, programación, música, humor...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></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-5459850530204411035.post-5402693034111862282</id><published>2009-03-31T00:23:00.003+02:00</published><updated>2009-03-31T00:30:54.629+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Novedades y propuestas (JSR) en Java 7</title><content type='html'>Interesante artículo en &lt;a href="http://tech.puredanger.com/java7/"&gt;el blog de Alex Miller&lt;/a&gt; (en inglés) describiendo numerosas novedades propuestas (&lt;a href="http://jcp.org/en/jsr/overview"&gt;JSR&lt;/a&gt;) que se espera sean incorporadas a &lt;a href="https://jdk7.dev.java.net/"&gt;Java 7&lt;/a&gt; de la mano de &lt;a href="http://www.sun.com/"&gt;Sun&lt;/a&gt;. El autor insiste en que, aunque hay algunas propuestas aprobadas, se trata de algo todavía &lt;span style="font-weight: bold;"&gt;no oficial&lt;/span&gt;, por lo que las incorporaciones de Java 7 pueden no corresponderse exactamente con lo propuesto. Al fin y al cabo Java 7 sigue en desarrollo.&lt;br /&gt;&lt;br /&gt;A continuación, describiré &lt;span style="font-weight: bold;"&gt;alguna&lt;/span&gt; de estas propuestas, indicando si han sido aprobadas o no (considero algunas &lt;span style="font-style: italic;"&gt;no aprobadas&lt;/span&gt; muy interesantes) y facilitando enlaces siempre que me sea posible, aunque recomiendo la lectura del &lt;a href="http://tech.puredanger.com/java7/"&gt;artículo original&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#jsr296"&gt;JSR 296 Swing Application Framework&lt;/a&gt;&lt;/span&gt; (&lt;a href="http://jcp.org/en/jsr/detail?id=296"&gt;JSR&lt;/a&gt;, &lt;a href="https://appframework.dev.java.net/"&gt;Proyecto&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;APROBADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Proporcionar un &lt;span style="font-style: italic;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Framework"&gt;framework&lt;/a&gt;&lt;/span&gt; para aplicaciones &lt;a href="http://es.wikipedia.org/wiki/Swing_%28biblioteca_gr%C3%A1fica%29"&gt;Swing&lt;/a&gt;, definiendo una infraestructura común a la mayoría de aplicaciones de escritorio. El objetivo es que las aplicaciones Swing resulten mas sencillas de crear.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#jsr295"&gt;JSR 295 Beans Binding&lt;/a&gt;&lt;/span&gt; (&lt;a href="http://jcp.org/en/jsr/detail?id=295"&gt;JSR&lt;/a&gt;, &lt;a href="https://beansbinding.dev.java.net/"&gt;Proyecto&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;NO APROBADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Proporcionar un &lt;a href="http://es.wikipedia.org/wiki/Application_Programming_Interface"&gt;API&lt;/a&gt; que permita que dos propiedades de dos &lt;a href="http://es.wikipedia.org/wiki/Bean"&gt;beans&lt;/a&gt; se mantengan sincronizadas, de forma que si cambia una de las propiedades en uno de los beans, automáticamente se refleje en el otro. En &lt;a href="http://jfx.wikia.com/wiki/Introduction_to_Binding_in_JavaFX"&gt;JavaFX&lt;/a&gt; sí hay algo parecido...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://tech.puredanger.com/java7#typeinference"&gt;Type Inference&lt;/a&gt; (&lt;a href="http://www.javac.info/Inference.html"&gt;Propuesta&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;APROBADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Simplificar la inicialización de algunas clases como listas o mapas. Por ejemplo, donde antes teníamos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; anagrams = new HashMap&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt;();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora tendremos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; anagrams = new HashMap&amp;lt;&amp;gt;();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#xml"&gt;Language level XML support&lt;/a&gt;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NO APROBADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Permitir introducir XML literal embebido en el código, e incluso otros tipos de texto o lenguajes:&lt;br /&gt;&lt;code&gt;elt.appendChild(&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;muppet&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;name&amp;gt;Kermit&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/muppet&amp;gt;&lt;br /&gt;);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#bigdecimal"&gt;BigDecimal operator support&lt;/a&gt;&lt;/span&gt; &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;NO APROBADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Posibilidad de manipular objetos &lt;a href="http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html"&gt;BigDecimal&lt;/a&gt; con operadores aritméticos, como se hace con los tipos primitivos y con muchas de las clases que los representan, como &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/Integer.html"&gt;Integer&lt;/a&gt;, &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/Long.html"&gt;Long&lt;/a&gt;, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#switch"&gt;Strings in switch statements&lt;/a&gt;&lt;/span&gt; (&lt;a href="http://yost.com/computers/java/string-switch/index.html"&gt;Propuesta&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;SIN DETERMINAR&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Posibilidad de utilizar la clase &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html"&gt;String&lt;/a&gt; en una sentencia switch:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;static boolean booleanFromString(String s) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;switch(s) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;case "true":&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return true;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;case "false":&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return false;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;throw new IllegalArgumentException(s);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#enum"&gt;Comparisons for Enums&lt;/a&gt;&lt;/span&gt; (&lt;a href="http://www.javac.info/EnumCompare.html"&gt;Propuesta&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;SIN DETERMINAR&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Permitir operadores lógicos en enumerados:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;boolean isRoyalty(Rank rank) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return rank &amp;gt;= Rank.JACK &amp;amp;&amp;amp; rank != Rank.ACE;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#chained"&gt;Chained invocation&lt;/a&gt;&lt;/span&gt; (&lt;a href="http://docs.google.com/View?docid=dg8rbgp8_0gnjwr2"&gt;Propuesta&lt;/a&gt;)  &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;NO APROBADA&lt;/span&gt; &lt;a href="#note"&gt;*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Permitir encadenar fácilmente llamadas a métodos, permitiendo que métodos &lt;code&gt;void&lt;/code&gt; devuelvan implícitamente &lt;code&gt;this&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;class Factory {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;void setSomething(Something something) { ... }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;void setOther(Other other) { ... }&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Thing result() { ... }&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;Thing thing = new Factory()&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;.setSomething(something)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;.setOther(other)&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;.result();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tech.puredanger.com/java7#extmethods"&gt;&lt;span style="font-weight: bold;"&gt;Extension methods&lt;/span&gt;&lt;/a&gt; (&lt;a href="http://www.javac.info/ExtensionMethods.html"&gt;Propuesta&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;NO APROBADA&lt;/span&gt; &lt;a href="#note"&gt;*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Permitir utilizar métodos de otras clases utilizando el operador &lt;code&gt;static&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;import static java.util.Collections.sort;&lt;br /&gt;List&amp;lt;String&amp;gt; list = ...;&lt;br /&gt;list.sort();&lt;br /&gt;/* Parece que se llama a List.sort(), pero en realidad se está llamando a Collections.sort() */&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#null"&gt;Enhanced null handling&lt;/a&gt;&lt;/span&gt; (mi preferida) (&lt;a href="http://docs.google.com/View?docid=dfn5297z_19pnsjkfc6"&gt;Propuesta&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;APROBADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Permitir encadenar llamadas a métodos, comprobando automáticamente que los valores devueltos no sean &lt;code&gt;null&lt;/code&gt;, lo que provocaría una &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/NullPointerException.html"&gt;NullPointerException&lt;/a&gt;. Por ejemplo, donde antes teníamos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;public String getPostcode(Person person) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (person != null) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Address address = person.getAddress();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;if (address != null) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return address.getPostcode();&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;}&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return null;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora bastará con:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;public String getPostcode(Person person) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return person?.getAddress()?.getPostcode();&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Esta misma característica (&lt;a href="http://docs.google.com/View?docid=dfn5297z_2kjj2fk"&gt;Propuesta&lt;/a&gt;)se podrá utilizar con métodos que pueden devolver &lt;code&gt;null&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;String str = getStringMayBeNull();&lt;br /&gt;str = (str == null ? "" : str);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Que pasa a ser:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;String str = getStringMayBeNull() ?: "";&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#catch"&gt;Improved catch clause&lt;/a&gt;&lt;/span&gt; (&lt;a href="http://www.javac.info/Multicatch.html"&gt;Propuesta&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;APROBADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Poder capturar simultáneamente varios tipos de excepciones:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;try {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;return klass.newInstance();&lt;br /&gt;} catch (InstantiationException | IllegalAccessException e) {&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;throw new AssertionError(e);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://tech.puredanger.com/java7#g1"&gt;G1 Garbage Collector&lt;/a&gt;&lt;/span&gt; (&lt;a href="http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf"&gt;PDF&lt;/a&gt;) &lt;span style="font-weight: bold; color: rgb(0, 153, 0);"&gt;APROBADA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;G1 es un mejorado recolector de basura de Java que divide el espacio en varias regiones determinadas, permitiendo limpiar memoria en un conjunto de dichas regiones, en vez de partir el espacio en partes arbitarias. En el JDK de Sun de Java 7 esté será, en principio, el recolector de basura por defecto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:75;"&gt;&lt;a style="color: rgb(255, 0, 0);" name="note"&gt;&lt;span style="font-weight: bold;"&gt;(*)&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; El estado de aprobación de algunas propuestas aparece en el artículo original con interrogantes. Tal vez, a pesar de no haber sido aprobadas, tienen todavía posibilidades.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A mi me parecen de lo más interesantes (unas más que otras, claro). En el artículo original hay muchas más, pero la entrada se quedaba demasiado larga, tal vez para una próxima... Desconozco las posibilidades que puedan tener muchas de las propuestas no aprobadas de cara al futuro. Habrá que estar pendientes.&lt;br /&gt;&lt;br /&gt;Y disculpad si encontrais algún error en las traducciones!&lt;br /&gt;&lt;br /&gt;Gracias a C.A. por el apunte :)&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-5402693034111862282?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/5402693034111862282/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=5402693034111862282&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/5402693034111862282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/5402693034111862282'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/03/novedades-y-propuestas-jsr-en-java-7.html' title='Novedades y propuestas (JSR) en Java 7'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-4509678808970563284</id><published>2009-03-29T17:00:00.000+02:00</published><updated>2009-03-29T17:00:00.651+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogosfera'/><title type='text'>Historia de un Viejo Informático</title><content type='html'>Hoy quiero recomendar una serie de excelentes artículos sobre la historia de la informática aplicada en España desde los años 70, contados de primera mano por &lt;a href="http://eltamiz.com/elcedazo/author/macluskey/"&gt;Mackluskey&lt;/a&gt;, alguien que se autodefine como &lt;i&gt;un informático de los tiempos heroicos, que no ha dejado de trabajar en Informática y disfrutar con ella hasta la fecha. Y lo que el cuerpo aguante&lt;/i&gt;. Lo de los tiempos heróicos es más que cierto &lt;a href="http://eltamiz.com/elcedazo/author/macluskey/"&gt;leyendo sus entradas&lt;/a&gt;, sobre todo las primeras.&lt;br /&gt;&lt;br /&gt;Todavía no he terminado de leerlas todas. Me he quedado a la hora de escribir estas líneas, en la entrada que versa sobre &lt;a href="http://eltamiz.com/elcedazo/2009/03/16/historia-de-un-viejo-informatico-la-programacion-estructurada/"&gt;la programación estructurada&lt;/a&gt;, la más habitual hasta la llegada de la &lt;a href="http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos"&gt;POO&lt;/a&gt;. Sin embargo, ya he leído más que suficiente para decidirme a recomendarlo, especialemente a los informáticos de los últimos años, que no vivimos una época semejante y sobretodo, a los actuales estudiantes de informática.&lt;br /&gt;&lt;br /&gt;Si tuviese que elegir una favorita entre las leídas hasta la fecha, aunque difícil, creo que me quedaría con la entrada sobre &lt;a href="http://eltamiz.com/elcedazo/2009/02/24/historia-de-un-viejo-informatico-los-mainframes-de-ibm/"&gt;los mainframes de IBM&lt;/a&gt;, curiosamente la que menos se mete en datos antiguos, centrándose más en las máquinas actuales, aunque &lt;a href="http://eltamiz.com/elcedazo/2009/02/24/historia-de-un-viejo-informatico-los-mainframes-de-ibm/#comment-1096"&gt;aclarando luego en los comentarios&lt;/a&gt; que, en realidad, se trata de las mismas máquinas elevadas a la enésima potencia. Además, se hace referencia &lt;a href="http://eltamiz.com/elcedazo/2009/02/24/historia-de-un-viejo-informatico-los-mainframes-de-ibm/comment-page-2/#comment-1150"&gt;en los comentarios&lt;/a&gt; y en entradas posteriores a otra serie de historias dedicadas a dichas máquinas, de la mano de &lt;a href="http://sigt.net/etiquetas/mainframes/"&gt;kujaku&lt;/a&gt;. Creo que serán mi próxima lectura.&lt;br /&gt;&lt;br /&gt;Eso sí, advierto que algunas entradas son &lt;span style="font-weight:bold;"&gt;muy&lt;/span&gt; largas y mucha gente, sobre todo &lt;span style="font-weight:bold;"&gt;no&lt;/span&gt; informáticos, serán incapaces de llegar al final. Aunque hay entradas mas llevaderas que otras.&lt;br /&gt;&lt;br /&gt;Totalmente recomendable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-4509678808970563284?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/4509678808970563284/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=4509678808970563284&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/4509678808970563284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/4509678808970563284'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/03/historia-de-un-viejo-informatico.html' title='Historia de un Viejo Informático'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-6963030620088695543</id><published>2009-03-28T10:23:00.006+01:00</published><updated>2009-03-29T15:51:20.888+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><title type='text'>Núcleo de Ferrita</title><content type='html'>El nombre de este blog centrado en la Informática (aunque de vez en cuando salte a otros temas) viene dado por la imagen y emblema de la profesión. Lo que no había hecho todavía era dedicar una entrada a este viejo elemento de la computación.&lt;br /&gt;&lt;br /&gt;En la &lt;a href="http://es.wikipedia.org/wiki/Memoria_de_toros"&gt;wikipedia&lt;/a&gt; podemos leer:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style:italic;"&gt;La memoria de toros o memoria de núcleos magnéticos, fue una forma de memoria principal de los computadores, hasta comienzos de los años 70. La función de esta memoria era similar a la que realiza la memoria RAM en al actualidad: es el espacio de trabajo, para la CPU, donde se graban los resultados inmediatos de las operaciones que se van realizando. A diferencia de la RAM basada en tecnologías DRAM, se basa en las propiedades magnéticas de su componente activo, &lt;span style="font-weight:bold;"&gt;el núcleo de ferrita&lt;/span&gt; y era una memoria no volátil.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Dicho de otro modo, un núcleo de ferrita era capaz de almacenar la unidad mínima de información (un bit) en la memoria de trabajo de estos ordenadores (lo que hoy sería la RAM). Además, era una memoria no volátil, lo que significa que no perdía su valor tras dejar de recibir alimentación eléctrica, por tratarse de un material magnético.&lt;br /&gt;&lt;br /&gt;El &lt;a href="http://4.bp.blogspot.com/_cqSmZCF2mXc/Sc2Fk4Pd7mI/AAAAAAAAADo/kcitP79VmOs/S210/nucleo_ferrita.gif"&gt;emblema&lt;/a&gt; es el que desde hoy puede verse a la derecha en este blog. Para ver una descripción de cómo funciona y de qué significa cada una de las "barras" que lo &lt;s&gt;recorren&lt;/s&gt; atraviesan (en realidad son cables), nada mejor que la magnífica explicación que &lt;a href="http://www.lsi.us.es/~rovayo/"&gt;Manuel Rovayo García&lt;/a&gt;, hace paso a paso en su artículo: &lt;a href="http://www.lsi.us.es/~rovayo/ferrita/ferrita_pf.html"&gt;Diálogo sobre las memorias de anillos de ferrita&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Si os interesa el tema, que lo disfrutéis :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-6963030620088695543?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/6963030620088695543/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=6963030620088695543&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/6963030620088695543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/6963030620088695543'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/03/nucleo-de-ferrita.html' title='Núcleo de Ferrita'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-6553264843373747263</id><published>2009-03-27T23:32:00.002+01:00</published><updated>2009-03-27T23:37:22.099+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Utilidades'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Listado de Live CDs para todos los gustos</title><content type='html'>En &lt;a href="http://www.livecdlist.com/"&gt;http://www.livecdlist.com/&lt;/a&gt; podemos encontrar innumerables enlaces a &lt;a href="http://es.wikipedia.org/wiki/CD_aut%C3%B3nomo"&gt;Sistemas Operativos LiveCD&lt;/a&gt;, orientados a propósitos concretos, la mayoría de ellos basados en &lt;a href="http://es.wikipedia.org/wiki/Distribuci%C3%B3n_Linux"&gt;distribuciones GNU/Linux&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Al abrir la página aparecerá un listado con todas las distribuciones disponibles, aunque se puede seleccionar en el combo de la parte superior cualquiera de las categorías que se prefiera: &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Desktop"&gt;escritorio&lt;/a&gt; (con distros tan conocidas como &lt;a href="http://www.novell.com/linux/"&gt;Suse&lt;/a&gt;, &lt;a href="http://www.knopper.net/knoppix/index-en.html"&gt;Knoppix&lt;/a&gt; o &lt;a href="http://www.ubuntulinux.org/"&gt;Ubuntu&lt;/a&gt;, entre muchas otras), &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Windows+Antivirus"&gt;antivirus para windows&lt;/a&gt;, &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Astronomy"&gt;astronomía&lt;/a&gt;, &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Clustering"&gt;clustering&lt;/a&gt;, &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Development"&gt;desarrollo&lt;/a&gt;, &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Diagnostics"&gt;diagnóstico&lt;/a&gt;, &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Education"&gt;educación&lt;/a&gt;, &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Firewall"&gt;firewall/router&lt;/a&gt;, &lt;a href="http://www.livecdlist.com/?pick=All&amp;showonly=Rescue"&gt;rescate&lt;/a&gt; y un largo etcétera.&lt;br /&gt;&lt;br /&gt;Gracias a D.F! por el apunte :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-6553264843373747263?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/6553264843373747263/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=6553264843373747263&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/6553264843373747263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/6553264843373747263'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/03/listado-de-live-cds-para-todos-los.html' title='Listado de Live CDs para todos los gustos'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-7505167407122950350</id><published>2009-03-23T09:00:00.004+01:00</published><updated>2009-03-23T09:00:00.946+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Mis compañeros en South Park</title><content type='html'>Antes de nada, decir que esta entrada está íntegramente dedicada a mis compañeros de trabajo, en concreto al equipo de desarrollo de nuestro proyecto, por lo que si no eres uno de ellos, probablemente no te interesará lo más mínimo. Aún así he querido tomarme la libertad de este pequeño homenaje. Si alguien se siente molesto u ofendido por supuesto no tiene más que decirlo y lo retiraré inmediatamente.&lt;br /&gt;&lt;br /&gt;Es increíble cómo por casualidad, puedes descubrir en uno de tus contactos de msn un avatar personalizado con la forma clásica de los personajes de &lt;a href="http://es.wikipedia.org/wiki/South_Park"&gt;South Park&lt;/a&gt; (gracias Patri xD) y tras buscar un poco en google y terminar encontrando el sitio (&lt;a href="http://www.sp-studio.de/"&gt;http://www.sp-studio.de/&lt;/a&gt;) acabar totalmente entretenido creando muñequitos como un niño pequeño :)&lt;br /&gt;&lt;br /&gt;Así que me puse manos a la obra con el que será por ahora el nuevo avatar de este blog:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cqSmZCF2mXc/ScTdKA9o4II/AAAAAAAAABg/PJ30Zz8JS7o/s1600-h/mcqueen-southpark.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_cqSmZCF2mXc/ScTdKA9o4II/AAAAAAAAABg/PJ30Zz8JS7o/s200/mcqueen-southpark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315616624330989698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Creo que no he conseguido un parecido demasiado exagerado, pero al menos es un comienzo. El caso es que luego uno no puede parar, y continúa caricaturizando a su responsable técnico y su jefe de proyecto:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_cqSmZCF2mXc/ScTfk6WfaoI/AAAAAAAAAB4/gaQ2jwI4tsY/s1600-h/ca-southpark.png"&gt;&lt;img style="float:left; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 199px; height: 200px;" src="http://1.bp.blogspot.com/_cqSmZCF2mXc/ScTfk6WfaoI/AAAAAAAAAB4/gaQ2jwI4tsY/s200/ca-southpark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315619285435902594" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cqSmZCF2mXc/ScVFfnj10mI/AAAAAAAAAC4/zbHBjx-RyCo/s1600-h/av-southpark.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 199px; height: 200px;" src="http://3.bp.blogspot.com/_cqSmZCF2mXc/ScVFfnj10mI/AAAAAAAAAC4/zbHBjx-RyCo/s200/av-southpark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315731344678310498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y al final terminas por caricaturizar a todos tus compañeros:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cqSmZCF2mXc/ScVHl_SPRoI/AAAAAAAAADA/reG7AyJJsbo/s1600-h/at-southpark.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 199px;" src="http://2.bp.blogspot.com/_cqSmZCF2mXc/ScVHl_SPRoI/AAAAAAAAADA/reG7AyJJsbo/s200/at-southpark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315733653149402754" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cqSmZCF2mXc/ScTgcE1bV8I/AAAAAAAAACQ/FGt1sDD3kYk/s1600-h/dl-southpark.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://2.bp.blogspot.com/_cqSmZCF2mXc/ScTgcE1bV8I/AAAAAAAAACQ/FGt1sDD3kYk/s200/dl-southpark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315620233142818754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cqSmZCF2mXc/ScTg0g2xcpI/AAAAAAAAACY/ug4pP2CsWLY/s1600-h/df-southpark.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 199px;" src="http://2.bp.blogspot.com/_cqSmZCF2mXc/ScTg0g2xcpI/AAAAAAAAACY/ug4pP2CsWLY/s200/df-southpark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315620652981514898" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cqSmZCF2mXc/ScTh1b9L51I/AAAAAAAAACg/iUR8Aig-70I/s1600-h/ra-southpark.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_cqSmZCF2mXc/ScTh1b9L51I/AAAAAAAAACg/iUR8Aig-70I/s200/ra-southpark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315621768357734226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Reconozco que algunas están un poco pilladas por los pelos (¡que complicado D.F!), pero bueno, espero que todo el mundo se "medio-reconozca" xD Y como traca final, los &lt;i&gt;Pancho Villa's Band&lt;/i&gt; en acción:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_cqSmZCF2mXc/ScTj4R3umbI/AAAAAAAAACw/uvKGH93B_1o/s1600-h/sga-southpark.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 260px;" src="http://2.bp.blogspot.com/_cqSmZCF2mXc/ScTj4R3umbI/AAAAAAAAACw/uvKGH93B_1o/s400/sga-southpark.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315624016213350834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nos vemos el lunes! Y que me perdonen los chicos de soporte por no añadirlos, ya no me quedaban ideas :( Tal vez como grouppies... xD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-7505167407122950350?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/7505167407122950350/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=7505167407122950350&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/7505167407122950350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/7505167407122950350'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/03/mis-companeros-en-south-park.html' title='Mis compañeros en South Park'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_cqSmZCF2mXc/ScTdKA9o4II/AAAAAAAAABg/PJ30Zz8JS7o/s72-c/mcqueen-southpark.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-551608576876360913</id><published>2009-03-21T05:18:00.001+01:00</published><updated>2009-03-21T05:21:01.857+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogosfera'/><title type='text'>La guerra de dos mundos</title><content type='html'>Os habréis fijado que a la derecha, tengo un pequeño apartado dedicado a otros blogs recomendados. Normalmente no hago reseña de ninguna de sus entradas, pues todas suelen ser como mínimo interesantes, y por eso figuran ahí. Sin embargo, el artículo que he leído hoy en &lt;a href="http://www.historiasdelaciencia.com/"&gt;historias de la ciencia&lt;/a&gt; me ha llamado la atención especialmente: &lt;a href="http://www.historiasdelaciencia.com/?p=435"&gt;la guerra de dos mundos&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Si os gusta escrutar las películas de ciencia ficción en busca de patadas a las leyes de la física (¿quién no ha comentado alguna vez que las explosiones de La Guerra de las Galaxias no deberían oírse?) seguramente el libro que se comenta en el artículo será de vuestro interés, muy al estilo de otro de los blogs que recomiendo: &lt;a href="http://www.malaciencia.info"&gt;malaciencia&lt;/a&gt;. Por lo pronto el resumen de &lt;a href="http://www.historiasdelaciencia.com/"&gt;omalaled&lt;/a&gt; sirve para abrir boca.&lt;br /&gt;&lt;br /&gt;Totalmente recomendable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-551608576876360913?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/551608576876360913/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=551608576876360913&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/551608576876360913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/551608576876360913'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/03/la-guerra-de-dos-mundos.html' title='La guerra de dos mundos'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-2890640783674580469</id><published>2009-03-20T02:46:00.002+01:00</published><updated>2009-03-20T02:49:34.083+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Utilidades'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Instalación y configuración de conky en ubuntu</title><content type='html'>¡Hola! sí, sigo vivo. Hoy ha sido festivo y he tenido tiempo para trastear un poco. Hace cosa de un mes me instalé una &lt;a href="http://www.ubuntu.com/"&gt;ubuntu&lt;/a&gt; con la que estoy bastante contento (ya había usado antes otras distros GNU/Linux, pero hace tiempo). El caso es que, visitando &lt;a href="http://www.linuxzone.es/"&gt;Linux Zone&lt;/a&gt;, me encontré &lt;a href="http://www.linuxzone.es/2009/03/15/conky-informacion-en-tu-escritorio/"&gt;un artículo&lt;/a&gt; sobre &lt;a href="http://conky.sourceforge.net/"&gt;conky&lt;/a&gt;, un software de monitorización del sistema de lo más ligero. En definitiva, uno de esos programas que había visto funcionando en multitud de pantallazos de escritorio, pero con los que nunca me había metido.&lt;br /&gt;&lt;br /&gt;Hasta hoy estaba utilizando &lt;a href="http://www.gdesklets.de/"&gt;gDesklets&lt;/a&gt;, que permite añadir muchísimos widgets para infinidad de tareas, desde visualizar la temperatura y el clima de una ciudad, hasta monitorizar la carga de tu interfaz de red, por poner dos ejemplos. El problema es que el portátil con el que trabajo ya tiene sus años y resultaba algo pesado. Por ello, como decía, he dado el paso y he desinstalado tanto &lt;a href="http://www.gdesklets.de/"&gt;gDeskelts&lt;/a&gt; como &lt;a href="http://awn.wetpaint.com/?t=anon"&gt;AWN&lt;/a&gt;. Éste último lo he substituído por &lt;a href="http://do.davebsd.com/"&gt;Gnome Do&lt;/a&gt; con su &lt;a href="http://www.genbeta.com/actualidad/docky-la-innovadora-transformacion-de-gnome-do-en-un-dock-impresionante-screencast"&gt;apariencia de docky&lt;/a&gt;, pero esa ya es otra historia.&lt;br /&gt;&lt;br /&gt;Para instalarlo no hay que hacer nada especial, ya que viene por defecto en los repositorios de ubuntu:&lt;br /&gt;&lt;code&gt;$ sudo aptitude install conky&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Una vez instalado, podemos ejecutarlo directamente con la orden &lt;code&gt;conky&lt;/code&gt;. El aspecto inicial es el mostrado en el artículo de Linux Zone mencionado:&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;img class="aligncenter" src="http://i44.tinypic.com/w7fsj9.png" alt="" width="308" height="253" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Para editar tanto la apariencia como las opciones que aparecen, disponemos de una completa colección de &lt;a href="http://conky.sourceforge.net/screenshots.html"&gt;ejemplos&lt;/a&gt; y &lt;a href="http://conky.sourceforge.net/documentation.html"&gt;documentación&lt;/a&gt; en la &lt;a href="http://conky.sourceforge.net/"&gt;web oficial del proyecto&lt;/a&gt;. Especialmente útil el apartado de &lt;a href="http://conky.sourceforge.net/variables.html"&gt;variables disponibles&lt;/a&gt;, ya que son fundamentales para la configuración de conky.&lt;br /&gt;&lt;br /&gt;Cuando se ejecuta el programa, se busca por defecto un script en &lt;code&gt;$HOME/.conkyrc&lt;/code&gt;. Si el script no existe, se muestra el aspecto que ya hemos visto. Para configurar la apariencia de conky debemos editar o crear dicho fichero con el script que deseemos, aunque podemos hacer funcionar conky con cualquier otro script utilizando el parámetro &lt;code&gt;-c&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;$ conky -c myscript&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tras algunos problemas, como el hecho de que me hiciese desaparecer los iconos del escritorio, o que no me funcionasen las variables del &lt;a href="http://audacious-media-player.org/"&gt;audacious&lt;/a&gt;, conseguí dar con la configuración necesaria para adaptarlo a mi gusto, a partir eso sí, de &lt;a href="http://conky.sourceforge.net/conky-vert-thumb-6.png"&gt;uno de los ejemplos de la web&lt;/a&gt;, cuyo script podemos descargar &lt;a href="http://conky.sourceforge.net/conkyrc-vert"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Este es el resultado final, a ver qué os parece (clic para ampliar):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_cqSmZCF2mXc/ScLzkjy8npI/AAAAAAAAABQ/AlnvzLBvjlE/s1600-h/conky.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 102px; height: 320px;" src="http://3.bp.blogspot.com/_cqSmZCF2mXc/ScLzkjy8npI/AAAAAAAAABQ/AlnvzLBvjlE/s320/conky.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315078319660375698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y aquí el script que lo genera:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;# copy at $HOME/ with filename .conkyrc or execute conky -c filename&lt;br /&gt;# conky configuration&lt;br /&gt;# edited by darcon@gmail.com&lt;br /&gt;&lt;br /&gt;# reedited by jfmillan@gmail.com:&lt;br /&gt;# changed some colours, texts, intervals..&lt;br /&gt;# added wireless data&lt;br /&gt;# added audacious data if running&lt;br /&gt;&lt;br /&gt;# set to yes if you want Conky to be forked in the background&lt;br /&gt;background yes &lt;br /&gt;&lt;br /&gt;# X font when Xft is disabled, you can pick one with program xfontsel&lt;br /&gt;#font 5x7&lt;br /&gt;#font 6x10&lt;br /&gt;#font 7x13&lt;br /&gt;#font 8x13&lt;br /&gt;#font 9x15&lt;br /&gt;#font *mintsmild.se*&lt;br /&gt;#font -*-*-*-*-*-*-34-*-*-*-*-*-*-*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Use Xft?&lt;br /&gt;use_xft yes&lt;br /&gt;&lt;br /&gt;# Xft font when Xft is enabled&lt;br /&gt;#xftfont Bitstream Vera Sans Mono:size=8&lt;br /&gt;#xftfont Terminus:size=8&lt;br /&gt;xftfont Monospace:size=8&lt;br /&gt;&lt;br /&gt;# Text alpha when using Xft&lt;br /&gt;xftalpha 0.8&lt;br /&gt;&lt;br /&gt;# Print everything to console?&lt;br /&gt;# out_to_console no&lt;br /&gt;&lt;br /&gt;# mail spool&lt;br /&gt;# mail_spool $MAIL&lt;br /&gt;&lt;br /&gt;# Update interval in seconds&lt;br /&gt;update_interval 3.0&lt;br /&gt;&lt;br /&gt;# This is the number of times Conky will update before quitting.&lt;br /&gt;# Set to zero to run forever.&lt;br /&gt;total_run_times 0&lt;br /&gt;&lt;br /&gt;# Create own window instead of using desktop (required in nautilus)&lt;br /&gt;own_window yes&lt;br /&gt;own_window_type override&lt;br /&gt;&lt;br /&gt;# Use double buffering (reduces flicker, may not work for everyone)&lt;br /&gt;double_buffer yes&lt;br /&gt;&lt;br /&gt;# Minimum size of text area&lt;br /&gt;minimum_size 10 5&lt;br /&gt;&lt;br /&gt;# Draw shades?&lt;br /&gt;draw_shades yes&lt;br /&gt;&lt;br /&gt;# Draw outlines?&lt;br /&gt;draw_outline no &lt;br /&gt;&lt;br /&gt;# Draw borders around text&lt;br /&gt;draw_borders no&lt;br /&gt;&lt;br /&gt;# Stippled borders?&lt;br /&gt;stippled_borders 0&lt;br /&gt;&lt;br /&gt;# border margins&lt;br /&gt;border_margin 4&lt;br /&gt;&lt;br /&gt;# border width&lt;br /&gt;border_width 1&lt;br /&gt;&lt;br /&gt;# Default colors and also border colors&lt;br /&gt;default_color white&lt;br /&gt;default_shade_color black&lt;br /&gt;default_outline_color white&lt;br /&gt;&lt;br /&gt;# Text alignment, other possible values are commented&lt;br /&gt;alignment top_left&lt;br /&gt;#alignment top_right&lt;br /&gt;#alignment bottom_left&lt;br /&gt;#alignment bottom_right&lt;br /&gt;&lt;br /&gt;# Gap between borders of screen and text&lt;br /&gt;# same thing as passing -x at command line&lt;br /&gt;gap_x 5&lt;br /&gt;gap_y 1&lt;br /&gt;&lt;br /&gt;# Subtract file system buffers from used memory?&lt;br /&gt;no_buffers yes&lt;br /&gt;&lt;br /&gt;# set to yes if you want all text to be in uppercase&lt;br /&gt;uppercase no&lt;br /&gt;&lt;br /&gt;# number of cpu samples to average&lt;br /&gt;# set to 1 to disable averaging&lt;br /&gt;cpu_avg_samples 1&lt;br /&gt;&lt;br /&gt;# number of net samples to average&lt;br /&gt;# set to 1 to disable averaging&lt;br /&gt;net_avg_samples 1&lt;br /&gt;&lt;br /&gt;# Force UTF8? note that UTF8 support required XFT&lt;br /&gt;override_utf8_locale no&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Add spaces to keep things from moving about?  This only affects certain objects.&lt;br /&gt;use_spacer yes&lt;br /&gt;#Note: doesn't work in conky 1.2 =(&lt;br /&gt;&lt;br /&gt;#   mldonkey_hostname     Hostname for mldonkey stuff, defaults to localhost&lt;br /&gt;#   mldonkey_port         Mldonkey port, 4001 default&lt;br /&gt;#   mldonkey_login        Mldonkey login, default none&lt;br /&gt;#   mldonkey_password     Mldonkey password, default none&lt;br /&gt;&lt;br /&gt;# stuff after 'TEXT' will be formatted on screen&lt;br /&gt;&lt;br /&gt;TEXT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;${offset 12}${color slate grey}Date..: ${color}${time %a, }${time %e %B %G}&lt;br /&gt;${offset 12}${color slate grey}Time..: ${color}${time %Z, }${time %H:%M:%S}&lt;br /&gt;${offset 12}${color slate grey}UpTime: ${color}$uptime&lt;br /&gt;${offset 12}${color slate grey}Kernel: ${color}$kernel&lt;br /&gt;${offset 12}${color slate grey}CPU...: ${color}$machine   $freq MHz&lt;br /&gt;${offset 12}${color slate grey}Load..: ${color}$cpu%   ${acpitemp}C&lt;br /&gt;${offset 12}${color slate grey}Proc..: ${color}$running_processes / $processes &lt;br /&gt;${offset 12}${cpugraph 20,155 ffff00 ddaa00}&lt;br /&gt;&lt;br /&gt;${offset 12}${color slate grey}Processor:&lt;br /&gt;${offset 12}${color #ddaa00} ${top name 1}${top_mem cpu 1}&lt;br /&gt;${offset 12}${color lightgrey} ${top name 2}${top cpu 2}&lt;br /&gt;${offset 12}${color lightgrey} ${top name 3}${top cpu 3}&lt;br /&gt;${offset 12}${color lightgrey} ${top name 4}${top cpu 4}&lt;br /&gt;&lt;br /&gt;${offset 12}${color slate grey}Memory:&lt;br /&gt;${offset 12}${color #ddaa00} ${top_mem name 1}${top_mem mem 1}&lt;br /&gt;${offset 12}${color lightgrey} ${top_mem name 2}${top_mem mem 2}&lt;br /&gt;${offset 12}${color lightgrey} ${top_mem name 3}${top_mem mem 3}&lt;br /&gt;${offset 12}${color lightgrey} ${top_mem name 4}${top_mem mem 4}&lt;br /&gt;&lt;br /&gt;${offset 12}${color slate grey}RAM.: ${color}$memperc% $mem / $memmax&lt;br /&gt;${offset 13}${membar 3,155}&lt;br /&gt;${offset 12}${color slate grey}SWAP: ${color}$swapperc% $swap/ $swapmax&lt;br /&gt;${offset 13}${swapbar 3,155}&lt;br /&gt;${offset 12}${color slate grey}DiSK: ${color}${fs_free /}/ ${fs_size /}&lt;br /&gt;${offset 13}${fs_bar 3,155 /}&lt;br /&gt;&lt;br /&gt;${offset 12}${color slate grey}Wireless: ${color}${wireless_essid eth1}&lt;br /&gt;${offset 12}${color #ddaa00} IP....: ${color}${addr eth1}&lt;br /&gt;${offset 12}${color #ddaa00} Device: ${color}eth1&lt;br /&gt;${offset 12}${color #ddaa00} Signal: ${color}${wireless_link_qual_perc eth1}%&lt;br /&gt;&lt;br /&gt;${offset 12}${color}Up:   ${color}${upspeed eth1} k/s&lt;br /&gt;${offset 12}${upspeedgraph eth1 20,155 ffff00 ddaa00}&lt;br /&gt;${offset 12}${color}Down: ${color}${downspeed eth1} k/s${color}&lt;br /&gt;${offset 12}${downspeedgraph eth1 20,155 ffff00 ddaa00}&lt;br /&gt;&lt;br /&gt;${if_running audacious}&lt;br /&gt;${offset 12}${color slate grey}${exec audtool version}: ${color}&lt;br /&gt;${offset 12}${color #ddaa00} Artist: ${color}${execi 3 audtool current-song | cut -d "-" -f1}&lt;br /&gt;${offset 12}${color #ddaa00} Title.:${color}${execi 3 audtool current-song | cut -d "-" -f2}&lt;br /&gt;${offset 12}${color #ddaa00} Time..: ${color}${execi 3 audtool current-song-output-length} / ${execi 3 audtool current-song-length} (${execi 3 audtool playback-status})&lt;br /&gt;${offset 12}${color #ddaa00} Song..: ${color}${execi 3 audtool playlist-position} / ${execi 3 audtool playlist-length}  ${color #ddaa00}Vol: ${color}${execi 21 audtool get-volume}%&lt;br /&gt;${endif}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como se puede observar, el código de monitorización de &lt;a href="http://audacious-media-player.org/"&gt;audacious&lt;/a&gt; está incluida en un &lt;code&gt;if_running&lt;/code&gt;. Sólo se muestra cuando dicha aplicación está funcionando.&lt;br /&gt;&lt;br /&gt;Hasta pronto, espero.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-2890640783674580469?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/2890640783674580469/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=2890640783674580469&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/2890640783674580469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/2890640783674580469'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/03/instalacion-y-configuracion-de-conky-en.html' title='Instalación y configuración de conky en ubuntu'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i44.tinypic.com/w7fsj9_th.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-7977530921975114406</id><published>2009-02-07T18:42:00.004+01:00</published><updated>2009-02-08T22:13:29.740+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogosfera'/><title type='text'>50 renders de lo más impresionante</title><content type='html'>No es ningún misterio que la informática avanza en todos los frentes que pueda tener abiertos. Uno de ellos es el diseño gráfico, con programas como el 3DMax y el Photoshop al que miles de modelos deben estar más que agradecidas (y agradecidos). Vía &lt;a href="http://yonkis.com"&gt;Yonkis&lt;/a&gt; [+18] me encuentro una web con los 50 mejores renders... ¿del año? no lo sé. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.zhoog.com/2009/01/50-of-the-most-stunning-3d-renders/50/"&gt;Aquí el enlace&lt;/a&gt;. Por si os da pereza pinchar, pongo unos ejemplos (no todas tienen esta calidad, pero merece la pena echar un vistazo). Que lo disfruteis.&lt;br /&gt;&lt;br /&gt;(Nota: las imágenes mostradas son propiedad de sus autores. No se les aplica la misma licencia &lt;a href="http://creativecommons.org/licenses/by-nc-sa/3.0/es/"&gt;Creative Commons&lt;/a&gt; que al resto de la Web).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.zhoog.com/wp-content/uploads/2009/01/koenigsegg.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 490px; height: 276px;" src="http://www.zhoog.com/wp-content/uploads/2009/01/koenigsegg.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.zhoog.com/wp-content/uploads/2009/01/open-green.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 490px; height: 772px;" src="http://www.zhoog.com/wp-content/uploads/2009/01/open-green.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.zhoog.com/wp-content/uploads/2009/01/ocular-production.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 490px; height: 595px;" src="http://www.zhoog.com/wp-content/uploads/2009/01/ocular-production.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-7977530921975114406?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/7977530921975114406/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=7977530921975114406&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/7977530921975114406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/7977530921975114406'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/02/50-renders-de-lo-mas-impresionante.html' title='50 renders de lo más impresionante'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-5190284927231475687</id><published>2009-01-21T21:51:00.003+01:00</published><updated>2009-01-21T21:55:13.489+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curiosidades'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>En pocas líneas...</title><content type='html'>Hola de nuevo.&lt;br /&gt;&lt;br /&gt;Hoy me gustaría mostraros algunos programas que me he encontrado buceando por la web de &lt;a href="http://albertovilches.com/"&gt;Yo, programador&lt;/a&gt;, todos ellos con un factor en común: su reducido número de líneas o bytes. &lt;br /&gt;&lt;br /&gt;En los títulos teneis los enlaces a la entrada de &lt;a href="http://albertovilches.com/"&gt;Yo, programador&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://albertovilches.com/python_4_lineas_para_resolver_un_sudoku"&gt;Programa en Python para resolver un Sudoku&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;def r(a):i=a.find('0');~i or exit(a);[m&lt;br /&gt;&lt;br /&gt;in[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for&lt;br /&gt;&lt;br /&gt;j in range(81)]or r(a[:i]+m+a[i+1:])for m in'%d'%5**18]&lt;br /&gt;&lt;br /&gt;from sys import*;r(argv[1])&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://albertovilches.com/343"&gt;Servidor web en Bash&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;# web.sh -- http://localhost:9000/hello?world&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;RESP=/tmp/webresp&lt;br /&gt;&lt;br /&gt;[ -p $RESP ] || mkfifo $RESP&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while true ; do&lt;br /&gt;&lt;br /&gt;( cat $RESP ) | nc -l -p 9000 | (&lt;br /&gt;&lt;br /&gt;REQ=`while read L &amp;&amp; [ " " "&amp;lt;" "$L" ] ; do echo "$L" ; done`&lt;br /&gt;&lt;br /&gt;echo "[`date '+%Y-%m-%d %H:%M:%S'`] $REQ" | head -1&lt;br /&gt;&lt;br /&gt;cat &amp;gt;$RESP &amp;lt;&amp;lt;EOF&lt;br /&gt;&lt;br /&gt;HTTP/1.0 200 OK&lt;br /&gt;&lt;br /&gt;Cache-Control: private&lt;br /&gt;&lt;br /&gt;Content-Type: text/plain&lt;br /&gt;&lt;br /&gt;Server: bash/2.0&lt;br /&gt;&lt;br /&gt;Connection: Close&lt;br /&gt;&lt;br /&gt;Content-Length: ${#REQ}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$REQ&lt;br /&gt;&lt;br /&gt;EOF&lt;br /&gt;&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Código original &lt;a href="http://paulbuchheit.blogspot.com/2007/04/webserver-in-bash.html"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://albertovilches.com/un-tetris-en-560bytes"&gt;Tetris básico en 560 bytes&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=shift_jis"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body onKeyDown=K=event.keyCode&amp;gt;&amp;lt;script&amp;gt;X=[Z=[B=A=12]];h=e=K=t=P=0;function Y()&lt;br /&gt;&lt;br /&gt;{C=[d=K-38];c=0;for(i=4;i--*K;K-13?c+=!Z[h+p+d]:c-=!Z[h+(C[i]=p*A-Math.round(p/&lt;br /&gt;&lt;br /&gt;A)*145)])p=B[i];!t|c+4?c-4?0:h+=d:B=C;for(f=K=i=0;i&amp;lt;4;f+=Z[A+p])X[p=h+B[i++]]=1&lt;br /&gt;&lt;br /&gt;if(e=!e){if(f|B){for(l=228;i--;)Z[h+B[i]]=k=1;for(B=[[-7,-20,6,17,-9,3,6][t=++t&lt;br /&gt;&lt;br /&gt;%7]-4,0,1,t-6?-A:-1];l--;h=5)if(l%A)l-=l%A*!Z[l];else for(P+=k++,j=l+=A;--j&amp;gt;A;)&lt;br /&gt;&lt;br /&gt;Z[j]=Z[j-A]}h+=A}for(i=S="";i&amp;lt;240;X[i]=Z[i]|=++i%A&amp;lt;2|i&amp;gt;228)i%A?0:S+="&amp;lt;br&amp;gt;",S+=X&lt;br /&gt;&lt;br /&gt;[i]?"■":"＿";document.body.innerHTML=S+P;Z[5]||setTimeout(Y,99-P)}Y()&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://albertovilches.com/algoritmo-de-ajedrez-en-solo-5kb"&gt;Ajedrez con IA en 5KB&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;De este último no tengo el código, y es sin duda el más extenso, pero es que es un ajedrez...&lt;br /&gt;&lt;br /&gt;El servidor web y el que resuelve sudokus no los he probado, pero para los otros hay 'plug and play' ;)&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://zapanet.info/blog/game/tetorisu.html"&gt;Tetris&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://p4wn.sourceforge.net/5k/"&gt;Ajedrez&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Como mínimo, curiosos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-5190284927231475687?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/5190284927231475687/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=5190284927231475687&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/5190284927231475687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/5190284927231475687'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/01/en-pocas-lneas.html' title='En pocas líneas...'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-796336971293217360</id><published>2009-01-19T01:29:00.000+01:00</published><updated>2009-01-19T01:29:30.326+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Ejemplo modelo Productor-Consumidor en Java</title><content type='html'>Bueno, a actualizar que van siendo horas. En primer lugar, pedir disculpas por la tardanza a mis lectores habituales (¡JA!) pero cuando el tiempo aprieta hay que priorizar :)&lt;br /&gt;&lt;br /&gt;Hoy vamos a ver un ejemplo de modelo Productor-Consumidor, que como sabéis representa un problema típico de sincronización en el que tenemos por un lado un hilo que &lt;b&gt;produce&lt;/b&gt; datos a procesar y otro hilo que los &lt;b&gt;recoge&lt;/b&gt;. Los problemas aparecen por ejemplo, al no poder garantizar que el productor producirá a suficiente velocidad para el consumidor, o viceversa, al no poder garantizar que el consumidor se encontrará siempre algún dato que procesar, con lo que podría estar procesando repetidas veces el mismo dato, o detenerse, etc.&lt;br /&gt;&lt;br /&gt;En Java tenemos una clase muy útil que nos permite implementar muy fácilmente este modelo. Se trata de la clase &lt;code&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html"&gt;LinkedBlockingQueue&lt;/a&gt;&lt;/code&gt;, consistente en una cola bloqueante, la cual se comporta de forma que si intentamos recuperar un dato cuando está vacía, se queda esperando, mientras que si tiene algún dato lo devuelve inmediatamente.&lt;br /&gt;&lt;br /&gt;Con esto se consigue que el hilo productor pueda producir a su ritmo, almacenando en la cola, mientras el hilo consumidor recoge los datos cuando los haya, quedándose a la espera cuando no.&lt;br /&gt;&lt;br /&gt;Veamoslo con un ejemplo. Considero que el código está lo suficientemente comentado, pero de todas formas lo explicaré con más detalle:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;package productor.consumidor;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import java.util.Random;&lt;br /&gt;&lt;br /&gt;import java.util.concurrent.LinkedBlockingQueue;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&lt;br /&gt; * Ejecuta tareas en segundo plano a medida que le van llegando a una cola de&lt;br /&gt;&lt;br /&gt; * tareas.&lt;br /&gt;&lt;br /&gt; * &lt;br /&gt;&lt;br /&gt; * @author McQueen&lt;br /&gt;&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;public class BackgroundThread extends Thread {&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;&lt;br /&gt;  * Cola bloqueante de tareas. Cuando se intenta obtener un elemento de dicha&lt;br /&gt;&lt;br /&gt;  * cola y ésta está vacía, se queda a la espera de que se añada algún&lt;br /&gt;&lt;br /&gt;  * elemento.&lt;br /&gt;&lt;br /&gt;  */&lt;br /&gt;&lt;br /&gt; private static LinkedBlockingQueue&amp;lt;Task&amp;gt; taskQueue = null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;&lt;br /&gt;  * Detendremos la tarea un tiempo aleatorio para simular una tarea costosa&lt;br /&gt;&lt;br /&gt;  * para el sistema.&lt;br /&gt;&lt;br /&gt;  */&lt;br /&gt;&lt;br /&gt; private static Random random = new Random(System.currentTimeMillis());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;&lt;br /&gt;  * Constructor, inicializa la cola bloqueante.&lt;br /&gt;&lt;br /&gt;  */&lt;br /&gt;&lt;br /&gt; public BackgroundThread() {&lt;br /&gt;&lt;br /&gt;  taskQueue = new LinkedBlockingQueue&amp;lt;Task&amp;gt;();&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;&lt;br /&gt;  * Prepara una tarea almacenandola en la cola, para ejecutarla tan pronto&lt;br /&gt;&lt;br /&gt;  * "le toque".&lt;br /&gt;&lt;br /&gt;  */&lt;br /&gt;&lt;br /&gt; public void executeTask() {&lt;br /&gt;&lt;br /&gt;  Task task = new Task();&lt;br /&gt;&lt;br /&gt;  taskQueue.add(task);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;&lt;br /&gt;  * Ejecuta la tarea del hilo.&lt;br /&gt;&lt;br /&gt;  */&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;&lt;br /&gt;  int time = 0;&lt;br /&gt;&lt;br /&gt;  while (true) {&lt;br /&gt;&lt;br /&gt;   try {&lt;br /&gt;&lt;br /&gt;    /* Esperamos a que se pueda ejecutar la tarea. */&lt;br /&gt;&lt;br /&gt;    Task task = taskQueue.take();&lt;br /&gt;&lt;br /&gt;    /* Se ejecuta. */&lt;br /&gt;&lt;br /&gt;    task.execute();&lt;br /&gt;&lt;br /&gt;    time = random.nextInt(100) + 1;&lt;br /&gt;&lt;br /&gt;    /* Se duerme el hilo varios milisegundos (entre 1 y 100) */&lt;br /&gt;&lt;br /&gt;    sleep(time);&lt;br /&gt;&lt;br /&gt;    System.out.println("Ejecutada tarea en " + time&lt;br /&gt;&lt;br /&gt;      + " milisegundos");&lt;br /&gt;&lt;br /&gt;   } catch (InterruptedException e) {&lt;br /&gt;&lt;br /&gt;    System.out.println("Hilo interrumpido");&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&lt;br /&gt; * Clase que realiza una tarea concreta. Se retarda un tiempo para que el&lt;br /&gt;&lt;br /&gt; * ejemplo tenga sentido.&lt;br /&gt;&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;class Task {&lt;br /&gt;&lt;br /&gt; void execute() {&lt;br /&gt;&lt;br /&gt;  System.out.println("Ejecutando nueva tarea");&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta clase tiene un método &lt;code&gt;executeTask&lt;/code&gt; que, pese a su nombre, no ejecuta realmente la tarea, sino que la encola a la espera de que pueda ejecutarse (las tareas se ejecutan de una en una, ya que las estamos lanzando todas en un mismo hilo). Para crear las tareas he utilizado una clase de ejemplo &lt;code&gt;Task&lt;/code&gt;, pero sobra decir que hay mil formas de hacerlo.&lt;br /&gt;&lt;br /&gt;A continuación el método &lt;code&gt;run&lt;/code&gt; que ejecuta el código principal del hilo, simplemente intenta recoger un elemento (una tarea, una &lt;code&gt;Task&lt;/code&gt;) de la cola. Si lo consigue, continúa. Si no lo consigue, se queda a la espera. Una vez lo consigue se ejecuta la tarea (en este caso solo se muestra una línea por consola).&lt;br /&gt;&lt;br /&gt;A continuación viene el código que normalmente sobraría en una aplicación real, y que utilizamos para simular un proceso costoso en tiempo, durmiendo el hilo consumidor entre 1 y 100 milisegundos de forma aleatoria (por darle algo más de dinamismo xD).&lt;br /&gt;&lt;br /&gt;La &lt;code&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/InterruptedException.html"&gt;InterruptedException&lt;/a&gt;&lt;/code&gt; que se puede producir notificaría que se ha interrumpido el hilo por ejemplo por algún otro hilo distinto (ya estuviese esperando, ejecutando...). Si se produce puede avisarse a algún método del evento, mostrar algún error, iniciar otro hilo que ejecute alguna otra tarea, detener la aplicación, o, simplemente, no hacer nada.&lt;br /&gt;&lt;br /&gt;A continuación veremos el código correspondiente a la parte productora. En este caso lo hemos puesto directamente en el &lt;code&gt;Main&lt;/code&gt;, pero evidentemente podría estar en otra clase específica.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;package productor.consumidor;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;&lt;br /&gt;  int n = 10;&lt;br /&gt;&lt;br /&gt;  BackgroundThread back = new BackgroundThread();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;&lt;br /&gt;   * Con 'true' se evita que el programa siga en ejecución si el hilo&lt;br /&gt;&lt;br /&gt;   * principal termina, por eso no llegan a ejecutarse todas las tareas.&lt;br /&gt;&lt;br /&gt;   * &lt;br /&gt;&lt;br /&gt;   * Con 'false' el hilo en background se sigue ejecutando aunque el hilo&lt;br /&gt;&lt;br /&gt;   * principal termine, por tanto se ejecutan todas las tareas.&lt;br /&gt;&lt;br /&gt;   */&lt;br /&gt;&lt;br /&gt;  back.setDaemon(false);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /* Comenzamos el hilo. */&lt;br /&gt;&lt;br /&gt;  back.start();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  while (n &amp;gt; 0) {&lt;br /&gt;&lt;br /&gt;   System.out.println("Añadiendo tarea, quedan " + n + " tareas");&lt;br /&gt;&lt;br /&gt;   back.executeTask();&lt;br /&gt;&lt;br /&gt;   n--;&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /*&lt;br /&gt;&lt;br /&gt;   * OJO, si hemos puesto el setDaemon a false el programa sigue&lt;br /&gt;&lt;br /&gt;   * ejecutandose aún al llegar al final del Main (el hilo en background&lt;br /&gt;&lt;br /&gt;   * seguirá esperando tareas indefinidamente).&lt;br /&gt;&lt;br /&gt;   */&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simplemente creamos el hilo y lo iniciamos. Lanzamos 10 tareas dentro de un bucle, de forma que se van almacenando en la cola y ejecutando tan pronto como les sea posible.&lt;br /&gt;&lt;br /&gt;La salida por consola en un caso así dependerá de la máquina y de si toqueteamos y jugamos con los milisegundos y con el número de tareas a ejecutar.&lt;br /&gt;&lt;br /&gt;Atención a la línea &lt;code&gt;back.&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#setDaemon(boolean)"&gt;setDaemon(false)&lt;/a&gt;;&lt;/code&gt;. Como bien cuentan desde Sun, "&lt;span style="font-style:italic;"&gt;The Java Virtual Machine exits when the only threads running are all daemon threads&lt;/span&gt;" o lo que es lo mismo, la máquina virtual termina cuando los únicos hilos en ejecución son hilos "daemon".&lt;br /&gt;&lt;br /&gt;Por lo tanto, si el hilo lo ejecutamos como "daemon" (&lt;code&gt;true&lt;/code&gt;), en cuanto el hilo principal llegue al final la aplicación terminará, y no llegarán a ejecutarse todas las tareas de la cola. A continuación la salida mostrada en mi máquina (en una de tantas ejecuciones, ya que el resultado varía).&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Añadiendo tarea, quedan 10 tareas&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Añadiendo tarea, quedan 9 tareas&lt;br /&gt;Añadiendo tarea, quedan 8 tareas&lt;br /&gt;Añadiendo tarea, quedan 7 tareas&lt;br /&gt;Añadiendo tarea, quedan 6 tareas&lt;br /&gt;Añadiendo tarea, quedan 5 tareas&lt;br /&gt;Añadiendo tarea, quedan 4 tareas&lt;br /&gt;Añadiendo tarea, quedan 3 tareas&lt;br /&gt;Añadiendo tarea, quedan 2 tareas&lt;br /&gt;Añadiendo tarea, quedan 1 tareas&lt;br /&gt;Ejecutada tarea en 19 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Comienza dos tareas pero solo llega a finalizar una. Las otras 9 quedan sin ejecutarse y el programa se termina.&lt;br /&gt;&lt;br /&gt;Si ejecutamos el programa con &lt;code&gt;setDaemon (false)&lt;/code&gt; como en el ejemplo, el hilo consumidor sigue corriendo aunque el &lt;code&gt;Main&lt;/code&gt; haya finalizado, por lo que se llegan a ejecutar todas las tareas.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Añadiendo tarea, quedan 10 tareas&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Añadiendo tarea, quedan 9 tareas&lt;br /&gt;Añadiendo tarea, quedan 8 tareas&lt;br /&gt;Añadiendo tarea, quedan 7 tareas&lt;br /&gt;Añadiendo tarea, quedan 6 tareas&lt;br /&gt;Añadiendo tarea, quedan 5 tareas&lt;br /&gt;Añadiendo tarea, quedan 4 tareas&lt;br /&gt;Añadiendo tarea, quedan 3 tareas&lt;br /&gt;Añadiendo tarea, quedan 2 tareas&lt;br /&gt;Añadiendo tarea, quedan 1 tareas&lt;br /&gt;Ejecutada tarea en 19 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 66 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 58 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 3 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 90 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 3 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 61 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 48 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 90 milisegundos&lt;br /&gt;Ejecutando nueva tarea&lt;br /&gt;Ejecutada tarea en 57 milisegundos&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En este caso, incluso cuando se han ejecutado las 10 tareas el hilo sigue ejecutándose a la espera de nuevas tareas que en este caso nunca llegarán.&lt;br /&gt;&lt;br /&gt;Como siempre espero que a alguien le sirva.&lt;br /&gt;Saludetes y hasta el mes que viene (que nooooo, intentaré actualizar antes xD).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-796336971293217360?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/796336971293217360/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=796336971293217360&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/796336971293217360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/796336971293217360'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2009/01/ejemplo-modelo-productor-consumidor-en.html' title='Ejemplo modelo Productor-Consumidor en Java'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-7272886980055382529</id><published>2008-12-22T02:40:00.004+01:00</published><updated>2008-12-22T02:48:59.936+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogosfera'/><title type='text'>Repaso a los fogonazos de 2008</title><content type='html'>Aprovechando que se termina el año, uno de los mejores blogs hispanos, &lt;a href="http://fogonazos.blogspot.com/"&gt;Fogonazos&lt;/a&gt;, hace recopilación de &lt;a href="http://fogonazos.blogspot.com/2008/12/los-20-mejores-fogonazos-de-2008.html"&gt;los mejores fogonazos de 2008&lt;/a&gt;. Para quien no conozca este blog, sólo decir que muy rara es la entrada que no se merece sobradamente el tiempo que requiera leerla y ver los videos adjuntos. Como &lt;a href="http://fogonazos.blogspot.com/2007/02/titanes-del-mar_08.html"&gt;muestra un botón&lt;/a&gt; (de tantos).&lt;br /&gt;&lt;br /&gt;Una joya de la blogosfera de esas que enganchan a esto de Internet. Enhorabuena Fogonazos, enhorabuena Aberron... y gracias por tu desinteresado esfuerzo. &lt;br /&gt;&lt;br /&gt;Saludos y que lo disfruteis ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-7272886980055382529?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/7272886980055382529/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=7272886980055382529&amp;isPopup=true' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/7272886980055382529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/7272886980055382529'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2008/12/repaso-los-fogonazos-de-2008.html' title='Repaso a los fogonazos de 2008'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-938930696263064800</id><published>2008-12-20T00:26:00.008+01:00</published><updated>2008-12-25T15:35:33.149+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Música'/><category scheme='http://www.blogger.com/atom/ns#' term='Noticias'/><title type='text'>Joe Satriani demanda a Coldplay por plagio</title><content type='html'>Bueno, parece que la media de retraso en enterarme de lo que pasa por el mundo ronda el mes, pero es lo que tiene estar actualmente sin internet en casa... creo que elegí un mal momento para empezar un blog :)&lt;br /&gt;&lt;br /&gt;Hoy he visto en &lt;a href="http://www.publico.es/culturas/181914/coldplay/joe/satriani/tortas/parecido/demasiado/razonable?pagCom=1#comentarios"&gt;una antigua noticia del diario Público&lt;/a&gt; y en algún que otro blog como &lt;a href="http://blogs.ozu.es/321/2008/12/10/coldplay-vs-joe-satriani"&gt;¡Tres, dos o uno!&lt;/a&gt;, que &lt;a href="http://es.wikipedia.org/wiki/Joe_Satriani"&gt;Joe Satriani&lt;/a&gt; ha demandado a la banda británica &lt;a href="http://es.wikipedia.org/wiki/Coldplay"&gt;Coldplay&lt;/a&gt; por plagio en su exitoso tema &lt;span style="font-weight:bold;"&gt;Viva la vida&lt;/span&gt; con el que opta a varios Grammy en 2009.&lt;br /&gt;&lt;br /&gt;La canción de Satriani que parece haber "insipirado" el tema de Coldplay es &lt;span style="font-weight:bold;"&gt;If I Could Fly&lt;/span&gt;. &lt;a href="http://www.coldplay.com/newsdetail.php?id=242"&gt;Los británicos se han apresurado a desmentirlo&lt;/a&gt;, pero creo que cada uno ha de tomar sus propias conclusiones. &lt;br /&gt;&lt;br /&gt;&lt;object width="450" height="340"&gt;&lt;param name="movie" value="http://www.dalealplay.com/dalealplay.swf?file=142201/6915.flv"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.dalealplay.com/dalealplay.swf?file=142201/6915.flv" type="application/x-shockwave-flash" wmode="transparent" width="450" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;¿Crees en las casualidades?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-938930696263064800?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/938930696263064800/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=938930696263064800&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/938930696263064800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/938930696263064800'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2008/12/joe-satriani-demanda-coldplay.html' title='Joe Satriani demanda a Coldplay por plagio'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-728707132595900309</id><published>2008-12-07T18:58:00.001+01:00</published><updated>2008-12-07T18:58:50.226+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>La Crisis Ninja</title><content type='html'>Hola de nuevo. Cuando miré el correo esta mañana me encontré un vídeo que me había mandado un compañero (gracias Diego) en el que, durante el programa &lt;a href="http://www.buenafuente.lasexta.com/"&gt;Buenafuente&lt;/a&gt; del canal de televisión &lt;a href="http://www.lasexta.com/"&gt;La Sexta&lt;/a&gt;, se pedía a &lt;a href="http://leopoldoabadia.blogspot.com/"&gt;Leopoldo Abadía&lt;/a&gt; que resumiese cómo hemos llegado a esta situación de crisis en la que nos encontramos, hablando de lo que él llama &lt;span style="font-style:italic;"&gt;&lt;a href="http://leopoldoabadia.blogspot.com/search/label/%2B%20ANEXO%201%20Crisis%20NINJA"&gt;La Crisis Ninja&lt;/a&gt;&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;La verdad es que el video ya es de hace unos meses, pero creo que a quien todavía no lo haya visto ni tenga muy claro cómo hemos llegado a esta situación le aclarará un poco el tema, porque casi todos hemos oído hablar de las &lt;a href="http://es.wikipedia.org/wiki/Cr%C3%A9dito_subprime"&gt;hipotecas subprime&lt;/a&gt;, pero ¿sabemos realmente lo que son?&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lU-j2mIwOpE&amp;hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/lU-j2mIwOpE&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Y como no, me he puesto a buscar un poco más y he dado con este otro video del mismo canal, pero del programa &lt;span style="font-style:italic;"&gt;&lt;a href="http://www.cqc.lasexta.com/"&gt;Caiga Quién Caiga&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Jm6KmiXEPp0&amp;hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Jm6KmiXEPp0&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;En cualquier caso, creo que mi preferido ha sido éste último, en inglés pero subtitulado al castellano. Espeluznante el final.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pFmYIFk5i1Q&amp;hl=es&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/pFmYIFk5i1Q&amp;hl=es&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;En fin, por lo pronto les pongo la etiqueta de &lt;a href="http://nucleodeferrita.blogspot.com/search/label/Humor"&gt;Humor&lt;/a&gt;. Espero que no pase mucho tiempo hasta que podamos ver estos videos y reírnos realmente (y no por no llorar) recordando tiempos más difíciles.&lt;br /&gt;&lt;br /&gt;Saludos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-728707132595900309?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/728707132595900309/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=728707132595900309&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/728707132595900309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/728707132595900309'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2008/12/la-crisis-ninja.html' title='La Crisis Ninja'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-2900291849313752358</id><published>2008-12-06T01:04:00.001+01:00</published><updated>2008-12-06T01:27:39.152+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Ordenar una lista de objetos en Java</title><content type='html'>Cuando uno se decide a iniciarse en la programación, una de las primeras cosas "complicadas" que aprende es a ordenar listas y a hacer búsquedas en dichas listas, sobre todo en listas previamente ordenadas. &lt;br /&gt;&lt;br /&gt;Todo ello es algo básico y fundamental que se debe aprender sí o sí. Sin embargo, a la hora de tener que ordenar una lista en una aplicación más compleja, lo normal es utilizar alguno de los métodos que pueda facilitar el lenguaje, y ya se sabe que Java nos ofrece una api muy completa con la que se puede hacer prácticamente de todo.&lt;br /&gt;&lt;br /&gt;Lo que vamos a ver hoy es la clase de métodos estáticos &lt;code&gt;Collections&lt;/code&gt;. Esta clase tiene métodos para ordenar listas, desordenarlas aleatoriamente, hacer búsquedas binarias, obtener el máximo/mínimo elemento, copiar elementos, invertirlos, frecuencia de un elemento... infinidad de posibilidades.&lt;br /&gt;&lt;br /&gt;Evidentemente puede compararse/ordenarse/buscarse en listas de cualquier tipo de objeto, pero entonces, ¿como sabe Java que un elemento de la lista es "menor" que otro para poder ordenarlos? &lt;br /&gt;&lt;br /&gt;Bien, la lista puede ser de dos tipos de clases:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Clases que heredan de &lt;code&gt;Comparable&lt;/code&gt;.&lt;br /&gt;&lt;li&gt;Resto de clases.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Para conseguir ordenar la lista, la clase &lt;code&gt;Collections&lt;/code&gt; hace uso del método &lt;code&gt;compare&lt;/code&gt;, donde se especifica qué elemento es mayor o menor que otro. Cuando se utiliza una clase que extiende a &lt;code&gt;Comparable&lt;/code&gt; (como por ejemplo &lt;code&gt;Integer&lt;/code&gt;), intrínsicamente esa clase ya lleva implementado el método &lt;code&gt;compare&lt;/code&gt;. Cuando se utiliza por ejemplo, una clase personalizada de las que podemos crear en nuestros programas, podemos utilizar la ayuda de un &lt;code&gt;Comparator&lt;/code&gt;, al que le implementamos el método &lt;code&gt;compare&lt;/code&gt; y que debemos facilitar a la hora de ordenar la lista.&lt;br /&gt;&lt;br /&gt;Veámoslo con un ejemplo de ordenación, primero con una lista de enteros, y luego con una lista de otra clase. Para rellenar las listas utilizaremos números aleatorios con la ayuda de &lt;code&gt;Random&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;List&amp;lt;Integer&amp;gt; numbers = new ArrayList&amp;lt;Integer&amp;gt; ();&lt;br /&gt;int n = 10; // número de elementos en la lista&lt;br /&gt;int max = 100; // máximo elemento posible&lt;br /&gt;&lt;br /&gt;// Creamos la semilla aleatoria.&lt;br /&gt;Random random = new Random (System.currentTimeMillis());&lt;br /&gt;&lt;br /&gt;while (numbers.size() &amp;lt; N) {&lt;br /&gt;    // Integer extiende a Comparable&lt;br /&gt;    numbers.add(new Integer (random.nextInt(max)));&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;System.out.println(&amp;quot;Sin ordenar: &amp;quot; + numbers);&lt;br /&gt;Collections.sort(numbers);&lt;br /&gt;System.out.println(&amp;quot;Ordenado...: &amp;quot; + numbers);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Este ejemplo visualizará la lista desordenada y luego ordenada de menor a mayor.&lt;br /&gt;&lt;br /&gt;Imaginemos ahora que queremos ordenarla de mayor a menor. Una manera de hacerlo puede ser ayudarnos de la clase anteriormente mencionada &lt;code&gt;Comparator&lt;/code&gt;, definiendo la ordenación de enteros a la inversa de como está por defecto. El método &lt;code&gt;compare&lt;/code&gt; devuelve un número menor que cero si el primer elemento es menor que el segundo, mayor que cero si el primer elemento es mayor que el segundo, e igual a cero si ambos elementos son iguales.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;Comparator&amp;lt;Integer&amp;gt; comparator = new Comparator&amp;lt;Integer&amp;gt; () {&lt;br /&gt;    public int compare(Integer a, Integer b) {&lt;br /&gt;        return b-a;&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;// Ahora ordenamos utilizando el comparador  &lt;br /&gt;Collections.sort(numbers, comparator);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Veamos otro ejemplo con una clase propia &lt;code&gt;CustomPoint2D&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class CustomPoint2D {&lt;br /&gt;    private int x;&lt;br /&gt;    private int y;&lt;br /&gt; &lt;br /&gt;    CustomPoint2D (int x, int y) {&lt;br /&gt;        this.x = x;&lt;br /&gt;        this.y = y;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    // ... getters, setters... &lt;br /&gt;&lt;br /&gt;    public String toString () {&lt;br /&gt;        return &amp;quot;{&amp;quot; + x + &amp;quot;, &amp;quot; + y + &amp;quot;}&amp;quot;;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Podríamos ordenarlo definiendo por ejemplo, que un &lt;code&gt;CustomPoint2D&lt;/code&gt; es menor que otro si la suma de sus puntos &lt;code&gt;x&lt;/code&gt; e &lt;code&gt;y&lt;/code&gt; es menor que la del segundo objeto.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;List &amp;lt;CustomPoint2D&amp;gt; points = new ArrayList &amp;lt;CustomPoint2D&amp;gt; ();&lt;br /&gt;while (points.size() &amp;lt; N) {&lt;br /&gt;    points.add(new CustomPoint2D (random.nextInt(max), random.nextInt(max)));&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;Comparator &amp;lt;CustomPoint2D&amp;gt; comparatorPoint = new Comparator&amp;lt;CustomPoint2D&amp;gt; () {&lt;br /&gt;    public int compare (CustomPoint2D p, CustomPoint2D q) {&lt;br /&gt;        return (p.getX() + p.getY()) - (q.getX() + q.getY());&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;  &lt;br /&gt;System.out.println(&amp;quot;Sin ordenar: &amp;quot; + points);&lt;br /&gt;Collections.sort(points, comparatorPoint);&lt;br /&gt;System.out.println(&amp;quot;Ordenado...: &amp;quot; + points);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;¿Alguna duda?&lt;br /&gt;&lt;br /&gt;Agradecimientos por la idea y algún ejemplo para este post a mis compañeros Diego F. y Carlos A.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-2900291849313752358?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/2900291849313752358/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=2900291849313752358&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/2900291849313752358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/2900291849313752358'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2008/12/ordenar-una-lista-de-objetos-en-java.html' title='Ordenar una lista de objetos en Java'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-8858172994620541649</id><published>2008-11-28T19:00:00.018+01:00</published><updated>2008-11-29T11:48:49.068+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Informática'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Crear una caché básica en Java</title><content type='html'>Hola, para ir rompiendo el hielo vamos a empezar con algo sencillo. Imaginemos que en nuestra aplicación necesitamos acceder con frecuencia a un dato o registro que podemos identificar por un código, bien sea numérico, alfanumérico...&lt;br /&gt;&lt;br /&gt;Como sabemos, los accesos a disco o a Base de Datos son más lentos que en memoria. Empeorémoslo imaginando que para obtener todos los datos del código necesitamos hacer varios accesos o cruzar un número elevado de tablas.&lt;br /&gt;&lt;br /&gt;La solución a esto puede ser la creación de una caché. En este caso crearemos una caché en la que mantendremos los datos por antigüedad. En una caché propiamente dicha se almacenan un número determinado de datos (por ejemplo 100 registros). Vamos a ver como crear fácilmente una clase Java que implemente una caché de un máximo de N elementos, de forma que cuando hayamos introducido N+1, se elimine automáticamente el elemento más antiguo.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;package cache;&lt;br /&gt;&lt;br /&gt;import java.util.LinkedHashMap;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Caché de datos implementada como LinkedHashMap.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;public class Cache&amp;lt;K, V&amp;gt; extends LinkedHashMap&amp;lt;K, V&amp;gt; {&lt;br /&gt;&lt;br /&gt;   /** Límite de elementos en caché. */&lt;br /&gt;   private int limit;&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Constructor.&lt;br /&gt;    *&lt;br /&gt;    * @param limit&lt;br /&gt;    *            Limite máximo de elementos que tendrá la caché.&lt;br /&gt;    */&lt;br /&gt;   public Cache(int maxLimit) {&lt;br /&gt;       this.limit = maxLimit;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Elimina la entrada más antigua de la caché en el momento de introducir&lt;br /&gt;    * una nueva entrada, sólo cuando se ha alcanzado el límite establecido.&lt;br /&gt;    */&lt;br /&gt;   protected boolean removeEldestEntry(Map.Entry eldest) {&lt;br /&gt;       return size() &amp;gt; this.limit;&lt;br /&gt;   }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Como veis, es tan simple como extender la clase &lt;code&gt;LinkedHashMap&lt;/code&gt; y sobrecargar el método &lt;code&gt;removeEldestEntry&lt;/code&gt;, de forma que cuando el número de elementos supere el límite, devuelva &lt;code&gt;true&lt;/code&gt;. Cuando este método devuelve verdadero, automáticamente se elimina el elemento más antiguo. Este método se ejecuta internamente cada vez que se introduce algo en el &lt;code&gt;Map&lt;/code&gt; (con &lt;code&gt;put&lt;/code&gt; y &lt;code&gt;putAll&lt;/code&gt;). Evidentemente si no se sobrecarga, por defecto devuelve siempre &lt;code&gt;false&lt;/code&gt;, por lo que nunca se borraría nada. &lt;br /&gt;&lt;br /&gt;Una vez implementada, la caché se utiliza de la misma forma que cualquier Map:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/*&lt;br /&gt; * Crear una nueva cache de 100 elementos, con c&amp;oacute;digo Integer y&lt;br /&gt; * contenido String (clave y valor pueden ser de cualquier clase).&lt;br /&gt; */&lt;br /&gt;Cache &amp;lt;Integer, String&amp;gt; miCache = new Cache&amp;lt;Integer, String&amp;gt;(100);&lt;br /&gt;  &lt;br /&gt;// para guardar un dato&lt;br /&gt;cache.put(2, &amp;quot;Juan Fernandez&amp;quot;);&lt;br /&gt;  &lt;br /&gt;/* &lt;br /&gt; * Ahora busquemos un c&amp;oacute;digo, suponiendo que si no lo encontramos&lt;br /&gt; * debemos buscarlo por ejemplo en base de datos.&lt;br /&gt; */&lt;br /&gt;int codigo = 34;&lt;br /&gt;String nombre = cache.get(codigo);&lt;br /&gt;if (nombre == null) {&lt;br /&gt;    nombre = ... /* buscar en BD */&lt;br /&gt;    /* una vez obtenido, lo guardamos en cache por si se vuelve a pedir. */&lt;br /&gt;    cache.put(codigo, nombre);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Espero que a alguien le sirva de algo. Simplemente añadir que yo no me he inventado nada, la documentación de la api de Java es una de las grandes bazas de este lenguaje, y si se busca un poco, se encuentra solución a muchísimos problemas: &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedHashMap.html#removeEldestEntry%28java.util.Map.Entry%29"&gt;Clase LinkedHashMap&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-8858172994620541649?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/8858172994620541649/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=8858172994620541649&amp;isPopup=true' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/8858172994620541649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/8858172994620541649'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2008/11/crear-una-cach-bsica-en-java.html' title='Crear una caché básica en Java'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5459850530204411035.post-4392688400155706316</id><published>2008-11-28T18:36:00.000+01:00</published><updated>2008-11-28T17:46:24.086+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogosfera'/><title type='text'>Inauguración del sitio</title><content type='html'>Hola! A pesar de mi profesión en el mundillo de la informática, este es el primer blog que escribo. Espero no aburriros demasiado y ganarme vuestra compañía. La temática del blog será variada, y consistirá sobre todo en compartir mis conocimientos de Informática, mis gustos musicales, noticias que me hayan llamado la atención, etc.&lt;br /&gt;&lt;br /&gt;Espero poder llevar un buen ritmo de actualización, aunque me temo que no siempre será posible. Paciencia por favor ;-)&lt;br /&gt;&lt;br /&gt;Bienvenid@s.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5459850530204411035-4392688400155706316?l=nucleodeferrita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nucleodeferrita.blogspot.com/feeds/4392688400155706316/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5459850530204411035&amp;postID=4392688400155706316&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/4392688400155706316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5459850530204411035/posts/default/4392688400155706316'/><link rel='alternate' type='text/html' href='http://nucleodeferrita.blogspot.com/2008/11/inauguracin-del-sitio.html' title='Inauguración del sitio'/><author><name>McQueen</name><uri>http://www.blogger.com/profile/04216078999770532309</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_cqSmZCF2mXc/ScVxzWR4ddI/AAAAAAAAADI/nhxH0ggsVTU/S220/mcqueen-southpark.png'/></author><thr:total>1</thr:total></entry></feed>
