<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">

  <channel>
	<title>Genciencia</title>
	<link>http://www.genciencia.com</link>
	<description>Genciencia es un weblog colectivo dedicado a la divulgacion cientifica</description>
	<pubDate>Fri, 28 Dec 2007 10:20:32 GMT</pubDate>
	<generator>http://www.genciencia.com</generator>

	
    <item>
      <title><![CDATA[El Test de Turing y el día a día]]></title>
      <link>http://www.genciencia.com/2007/12/14-el-test-de-turing-y-el-dia-a-dia</link>
      <guid>http://www.genciencia.com/2007/12/14-el-test-de-turing-y-el-dia-a-dia</guid>
      <pubDate>Thu, 13 Dec 2007 23:42:57 GMT</pubDate>
      <author>Gabriel A.</author>
      <description><![CDATA[	<p> <br />
<div style="text-align: center"><img src="http://upload.wikimedia.org/wikipedia/commons/6/69/Captcha.jpg" /></div><br />
 </p>

	<p>El <strong>Test de Turing</strong> fue una de las maravillas de ingenio que ideó Alan Turing (1912-1954) para determinar cuándo &#8220;algo&#8221; es inteligente o no. Este test se enmarcaba en las teorizaciones sobre inteligencia artificial de Turing, padre de la computación y precursor de la informática moderna. Básicamente Turing estableció que si &#8220;algo&#8221; se comportaba como si fuera inteligente, entonces era inteligente. Efectivamente inteligente (y no falsamente o solo aparentemente inteligente).</p>

	<p>La forma de hacer pasar el test a un ordenador (por ejemplo, para detectar si el ordenador es inteligente o no) consiste básicamente en una persona hablando con un ordenador que está en otra habitación mediante un sistema de chat. Si la persona es incapaz de determinar si habla con otra persona o con un ordenador, entonces el ordenador es considerado inteligente (no &#8220;inteligente&#8221;, sino verdaderamente inteligente). <strong>Ninguna máquina ha sido capaz de superar el Test de Turing</strong>, de momento.<a name="more"></a></p>

	<p>Esto puede parecer puramente anecdótico, pero hay versiones del Test de Turing que nuestros ojos están acostumbrados a ver en el día a día. Es el caso del Captcha: <strong><em>Completely Automated Public Turing Test </em><em>to tell Computers and Humans Apart</em></strong> (Prueba de Turing pública y automática para diferenciar a máquinas y humanos). Son las típicas letras retorcidas o preguntas del tipo &#8220;dos más dos&#8221; que protegen formularios y demás en internet. La prueba asume que un robot no humano es incapaz de comprender lo que pone en las letras, y por tanto no es capaz de superar la prueba que un humano encuentra fácilmente superable.</p>

	<p>No es un Test de Turing puro, y lo lleva a cabo una máquina y no un humano, y sin embargo se ha demostrado muy eficaz. Por supuesto detrás lleva una escalada imaginativa de robots cada día más capaces de un reconocimiento de caracteres e interpretación de los mismos, etcétera. Toda esta creatividad volcada en violar los Captcha redunda luego en beneficio, por ejemplo, de los discapacitados, al mejorar mucho el software de reconocimiento de voz o de escritura humana.</p>

	<p>No deja de ser interesante que muchas de los problemas y situaciones que ya se planteaban antes de la creación (física) de los ordenadores hayan tardado décadas en empezar a darse en el terreno práctico. <strong>¿Estará cercano el día en el que una máquina supere el Test de Turing?</strong> ¿Será inteligente de verdad? ¿Y si supera otras pruebas más restrictivas? ¿Qué pasará?</p>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[El primer servidor integrado en chip]]></title>
      <link>http://www.genciencia.com/2007/08/16-el-primer-servidor-integrado-en-chip</link>
      <guid>http://www.genciencia.com/2007/08/16-el-primer-servidor-integrado-en-chip</guid>
      <pubDate>Thu, 16 Aug 2007 11:22:58 GMT</pubDate>
      <author>Juan David Pérez</author>
      <description><![CDATA[	<p>¿Qué ocurriría si un servidor pudiera ser integrado en un chip? Las ventajas y beneficios son tantos como inimaginable las aplicaciones que nos ofrecería. Pues bien, Sun Microsystem en su afán de perseguir esa idea ha sacado al mercado su primer chip con un server integrado, el <strong>UltraSPARC T2 de Sun</strong>.</p>

	<p><img class="derecha_sinmarco" src="http://img.genciencia.com/2007/08/377857.jpg" alt="UltraSparc T2" /><br />
Pero&#8230; ¿qué es un <a href="http://es.wikipedia.org/wiki/Servidor">servidor</a>? No es más que una aplicación informática o programa que realiza algunas tareas en beneficio de otras aplicaciones llamadas clientes. Algunos servicios habituales son los servicios de archivos, que permiten a los usuarios almacenar y acceder a los archivos de un ordenador y los servicios de aplicaciones, que realizan tareas en beneficio directo del usuario final. <br />
<a name="more"></a><br />
Con ocho núcleos y 64 subprocesos, el procesador UltraSPARC T2 es un &#8220;servidor en chip&#8221;, que combina el alto rendimiento con un menor consumo energético con tres funciones esenciales integradas en el chip: red de 10 GbE de múltiples subprocesos, aceleración de cifrado y expansión de E/S PCI-Express.</p>

	<p>UltraSPARC T2 fue lanzado el pasado día 8 de agosto y pasa por ser el único procesador de volumen que integra en un único chip 8 núcleos y hasta 64 hilos de ejecución, reuniendo además las funciones clave de un servidor: gran capacidad de proceso (tanto en punto fijo como en punto flotante), conectividad, virtualización y seguridad. Y todo ello optimizado para el sistema operativo Solaris.</p>

	<p>Más rendimiento, más fiabilidad, y una mayor eficiencia energética en menor espacio. Todo ello se traduce en una importante reducción de costes.</p>

	<p>Basado en la revolucionaria <strong>tecnología Chip MultiThread (CMT)</strong>, este nuevo procesador marca nuevos récords mundiales en rendimiento y permite ahorrar energía, ya que consume menos de 2 vatios por hilo de ejecución. Esta empresa siempre ha estado concienciada con la eficiencia energética y lidera el mercado de procesadores co-responsables de alto rendimiento.</p>

	<p>Quizás, el hito más interesante es que la primera versión, la beta, sale en código abierto para disfrute de los programadores y viciosillos de estos aparatillos. Cualquiera puede echar un ojillo y opinar!</p>

	<p>Vía | <a href="http://es.sun.com/2007-0807/">Sun Microsystem</a><br />
Web Oficial | <a href="http://www.sun.com/processors/UltraSPARC-T2/">UltraSPARC T2</a><br />
Fuente | <a href="http://en.wikipedia.org/wiki/UltraSPARC_T2">Wikipedia</a><br />
Fuente | <a href="http://www.opensparc.net/">OpenSPARC </a></p>



 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Software para conocer la felicidad de las personas]]></title>
      <link>http://www.genciencia.com/2007/07/19-software-para-conocer-la-felicidad-de-las-personas</link>
      <guid>http://www.genciencia.com/2007/07/19-software-para-conocer-la-felicidad-de-las-personas</guid>
      <pubDate>Wed, 18 Jul 2007 22:32:38 GMT</pubDate>
      <author>VelSid</author>
      <description><![CDATA[	<p><img id="image3284" src="http://img.genciencia.com/2007/07/software_reconocimiento_facial.PNG" class="centro" alt="software_reconocimiento_facial.PNG" /></p>

	<p>Dos científicos holandeses han creado <strong>un software que es capaz de determinar el grado de felicidad que presenta una persona</strong> a partir del análisis realizado en los gestos faciales. Se trata de una técnica capaz de reconocer los gestos faciales de una persona a través de la captura por un sistema de vídeo, posteriormente las imágenes son convertidas en gráficos 3D gracias a un algoritmo y finalmente se elabora el análisis que detecta el grado de placer del sujeto.</p>

	<p>El análisis de las emociones por parte del software funciona del siguiente modo: todos nuestros músculos faciales trabajan cuando lloramos, reímos, nos enfadamos, etc., los gráficos 3D son creados estableciendo 12 áreas significativas de nuestro estado de ánimo, como por ejemplo la zona de la boca o los extremos de las zonas donde se encuentran los ojos. Todos los movimientos de los músculos que en ese momento están actuando son agrupados dando una imagen que se compara con los seis patrones básicos que contiene el software, sorpresa, felicidad, miedo, tristeza, etc. El software también logra identificar la mezcla de algunos de los seis patrones mostrando el resultado al operador.<br />
<a name="more"></a><br />
Para probar el nuevo sistema se realizaron varias pruebas con 300 mujeres proporcionándoles helados de distintos sabores, frutas y otros alimentos. Con cada alimento la reacción era distinta, al parecer, el helado y el chocolate producían un grado de felicidad mayor que otros alimentos que incluso llegaban a provocar sentimientos de tristeza, es el caso del yogur.</p>

	<p>La empresa responsable del desarrollo del software y sus creadores, Theo Gevers y Nicu Seve, ya ha encontrado una aplicación ideal, comprobar el grado de felicidad que suscitan algunos de los nuevos productos que aparecen en el mercado. Como sistema para comprobar la efectividad y la satisfacción que produce un determinado producto puede estar bien, aunque la verdad, basta con mirar detenidamente a una persona para saber si le satisface lo que está comiendo.</p>

	<p>Vía  |  <a href="http://www.clarin.com/diario/2007/07/18/um/m-01459887.htm">Clarín</a><br />
Más información  |  <a href="http://www.unilever.nl/onzemerken/etengenieten/IJsisplezier.asp">Unilever</a><br />
Más información  |  <a href="http://www.wired.com/science/discoveries/news/2007/07/expression_research#">Wired</a><br />
Más información  |  <a href="http://staff.science.uva.nl/~gevers/">Theo Gevers</a><br />
Más información  | <a href="http://staff.science.uva.nl/~nicu/"> Nicu Seve</a></p>




 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[¿Qué hace un bioinformático?]]></title>
      <link>http://www.genciencia.com/2007/04/19-que-hace-un-bioinformatico</link>
      <guid>http://www.genciencia.com/2007/04/19-que-hace-un-bioinformatico</guid>
      <pubDate>Thu, 19 Apr 2007 10:17:44 GMT</pubDate>
      <author>Leo Icaria</author>
      <description><![CDATA[	<p><img class="izquierda" src="http://img.genciencia.com/2007/04/dna.jpg" alt="Bioinformática" />&#8220;<em>La bioinformática es a la biología lo que la azada al agricultor: sin ella sería imposible cavar los surcos donde, llegada la primavera, crecerán las borrajas</em>&#8221;. </p>

	<p>Hace unos días escribí una entrada en Genciencia sobre la &#8220;biología sintética&#8221;, uno de los cuatro submundos que Antinoo Segura establece en su divertido y controvertido artículo &#8220;<strong>La bioinformática: una ciencia de riesgo</strong>&#8221;. </p>

	<p>Dichos submundos, según el artículo citado, son: <ul><li>Computacional Genomics, Genomica Computacional o Genus Compus</li><li>Structural Bioinformatics, Bioinformática Estructural o Estructurus</li><li>Systems Biology, Biología de Sistemas o Sistematicus Biologius</li><li>Algorithms and Databases, Algoritmos y Bases de datos o Datus</li></ul><a name="more"></a></p>

	<p>El artículo en cuestión nació a raíz de un encargo de &#8220;Omnis Cellula&#8221;, una revista científico-cultural editada por la Sociedad Catalana de Biología. <strong>El autor se planteó inicialmente responder a la pregunta ¿qué hace un bioinformático cuando llega por la mañana al trabajo?</strong></p>

	<p>El resultado final es un texto de divulgación muy interesante que, desde una perspectiva humorística, ayuda a aclarar cuáles son los objetivos de la bioinformática. En cualquier caso, y como propone el mismo autor del artículo, se puede encontrar información más detallada en la Wikipedia, un buen punto de partida a partir del cual iniciar una investigación personal más amplia. </p>

	<p>Vía | <a href="http://penaleat.blogspot.com/2007/03/la-bioinfrmatica-una-ciencia-de-riesgo.html">Pensamientos aleatorios</a><br />
Más información | <a href="http://www.omniscellula.net/">Omnis Cellula</a><br />
Más información | <a href="http://en.wikipedia.org/wiki/Bioinformatics">Bioinformatics</a></p>

	<p>Genciencia | <a href="http://www.genciencia.com/2007/04/18-ingenieria-genetica-extrema">Ingeniería genética extrema</a></p>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Nuevo cemento que reduce la emisión de CO2 y mejora las prestaciones del cemento tradicional]]></title>
      <link>http://www.genciencia.com/2007/01/31-nuevo-cemento-que-reduce-el-co2-y-recicla-residuos-de-carbon</link>
      <guid>http://www.genciencia.com/2007/01/31-nuevo-cemento-que-reduce-el-co2-y-recicla-residuos-de-carbon</guid>
      <pubDate>Wed, 31 Jan 2007 13:21:55 GMT</pubDate>
      <author>VelSid</author>
      <description><![CDATA[	<p><img class="centro" id="image2250" src="http://img.genciencia.com/2007/01/traviesa_tren_nuevo_material.PNG" alt="traviesa_tren_nuevo_material.PNG" /></p>

	<p>Un grupo de científicos del Instituto de Ciencias de la Construcción Eduardo Torroja perteneciente al CSIC (Consejo Superior de Investigaciones Científicas), acaba de desarrollar un <strong>nuevo material</strong> resultante de la combustión del carbón, <strong>muy similar al cemento que además supera varias de las prestaciones del cemento convencional</strong>.</p>

	<p>Gracias a este nuevo material, se obtendría hasta una reducción del 50% de las emisiones que se realizan de dióxido de carbono a la atmósfera como consecuencia de la elaboración, ya que se necesita menos temperatura para su fabricación, con lo que la industria cementera podría contribuir al mantenimiento del medio ambiente.<br />
<a name="more"></a><br />
Aunque no todo acaba aquí, el nuevo cemento es también capaz de absorber diversas sustancias volátiles que son nocivas para la salud, dichas sustancias son las que pueden desprender los barnices o productos de limpieza entre otros. Para elaborar cemento Pórtland se necesita una temperatura de 1450 grados centígrados, el nuevo material tan sólo 80 grados centígrados, con lo que la reducción de energía hidroeléctrica sería muy notable.</p>

	<p>Las pruebas realizadas indican que el comportamiento de este nuevo material es idéntico al del tradicional Pórtland, es tan similar que incluso un experto no podría distinguir entre los dos materiales. Todas las pruebas realizadas para conocer la respuesta frente a distintas agresiones externas como el fuego, el agua, etc., determinan que incluso presenta mayor resistencia que el tradicional cemento. Al ser un material más ligero también puede utilizarse para hacer diversos componentes de la construcción que serían empleados en las construcciones que requieran menor peso.</p>

	<p>Todavía queda una prueba por realizar con el nuevo material, la durabilidad con el paso del tiempo, aunque parece que esta será superada sin problema alguno. </p>

	<p>Vía <a href="http://www.csic.es/prensa/noticias2007/enero/30enero07desarrollo_cemento.pdf"> CSIC</a></p>




 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Los procesos en la multiprogramación]]></title>
      <link>http://www.genciencia.com/2007/01/28-los-procesos-en-la-multiprogramacion</link>
      <guid>http://www.genciencia.com/2007/01/28-los-procesos-en-la-multiprogramacion</guid>
      <pubDate>Sun, 28 Jan 2007 18:42:43 GMT</pubDate>
      <author>Alfonso Jiménez</author>
      <description><![CDATA[	<p><img src="http://img.genciencia.com/2007/01/fp245.jpg" alt="Multiprogramación" class="izquierda" />Las computadoras actuales son capaces de realizar varias actividades a la vez. <strong>Mientras se ejecuta una tarea de un usuario, el sistema puede estar leyendo una unidad de disco o escribiendo en una impresora</strong>, gracias a las posibilidades que ofrecen los circuitos de acceso directo a memoria (<a href="http://es.wikipedia.org/wiki/Acceso_directo_a_memoria">DMA</a>) y las interrupciones generadas por los órganos de L/E (Lectura/Escritura). Además, siempre que existan esas interrupciones, se pueden ejecutar varios procesos de usuario de forma alternada, solapándose con las operaciones de L/E.<a name="more"></a>Así, en el método de multiprogramación conocido como <em>Foreground/Background</em>, un proceso delantero o prioritario, el proceso <em>Foreground</em> (FG), se ejecuta con preferencia sobre los demás. Cuando este preoceso solicita una opreación de L/E, y mientras ésta se realiza el sistema operativo puede aprovechar el tiempo del procesador haciendo que se ejecute el primer proceso trasero o <em>Background</em> (BG 1); si éste a su vez llega a una detención por L/E, se pasa a ejecutar el siguiente (BG 2), y así sucesivamente. Cuando termina la operación de L/E de un proceso más delantero que el que se está ejecutando, el sistema operativo en cuestión congela la ejecución de éste, y reanuda la de aquel. De este modo, en la multiprogramación FG/BG los procesos traseros utilizan el procesador mientras están inactivos los delanteros, mejorando así el aprovechamiento del procesador.</p>

	<p>Igualmente, si el ordenador tiene un reloj que genere interrupciones periódicas, se puede usar para forzar el cambio de un proceso a otro; con esta actuación, el tiempo del procesador se distribuye más equitativamente entre los procesos, llegando así al tiempo compartido.</p>

	<p>Referencias | <a href="http://es.wikipedia.org/wiki/Multiprogramaci%C3%B3n">Wikipedia.org</a><br />
Referencias | <a href="http://exa.unne.edu.ar/depar/areas/informatica/SistemasOperativos/SO1.htm">Universidad Nacional del Nordeste</a></p>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Ciencias de la Web, nuevo título en estudios superiores]]></title>
      <link>http://www.genciencia.com/2006/11/06-ciencias-de-la-web-nuevo-titulo-en-estudios-superiores</link>
      <guid>http://www.genciencia.com/2006/11/06-ciencias-de-la-web-nuevo-titulo-en-estudios-superiores</guid>
      <pubDate>Mon, 06 Nov 2006 15:47:43 GMT</pubDate>
      <author>VelSid</author>
      <description><![CDATA[	<p><img class="derecha_sinmarco" id="image1918" height="180" alt="red_mundo" src="http://img.genciencia.com/2006/11/red_mundo.jpg" />El crecimiento de la red es realmente vertiginoso, tan sólo en España la mitad de la población ya son usuarios. La red influye en la información, en las compras, en la relación, es un punto de encuentro para millones de persona. Por todo esto, se ha presentado un nuevo proyecto de la mano del Instituto de Tecnología de Massachussets y la Universidad Británica de Southampton para la creación de un <strong>nuevo título de estudios superiores, Ciencias de la Web</strong>.</p>

	<p>Tim Berners-Lee, el artífice del World Wide Web y uno de los responsables de esta nueva iniciativa, indica la necesidad de elaborar una ciencia específica para entender lo que representa la red y los escollos que en ella se pueden encontrar. En la nueva ciencia se conjugarán todos los aspectos contenidos en la red, sea sociología, consumo, derechos de autor, cualquier aspecto que se relacione y que haya ganado presencia gracias a la red.<br />
<a name="more"></a><br />
Los nuevos títulos empezarán a ser ofrecidos en el año 2008 y estarán dirigidos a los estudiantes de master para más tarde comenzar con las titulaciones de Grado (licenciaturas). Se contemplarán aspectos como la teoría de la evolución de la web o la web semántica, donde se pretende una búsqueda con mayor comprensión en la red que proporcione información mucho más certera y rápida.</p>

	<p>La red nos cambia en numerosos aspectos e incluso nos moldea físicamente, de eso no hay duda. La nueva titulación será, además de interesante, una puerta abierta para responder a multitud de cuestiones sobre la relación existente entre las personas y la red.</p>

	<p>Parece mentira, en 1995 había en todo el mundo 18.000 sitios web, el pasado mes de octubre se supero la barrera de los 100 millones de sitios web y la marcha continúa…</p>

	<p>Más información  |  <a href="http://www.elpais.es/articulo/sociedad/ciencia/web/elpporsoc/20061103elpepisoc_8/Tes/">EL país  </a><br />
Más información  |  <a href="http://www.nytimes.com/2006/11/02/technology/02compute.html?_r=1&#38;adxnnl=1&#38;oref=slogin&#38;adxnnlx=1162827410-eJpKQShFbELplPdB3CnrnQ">The New York Times</a><br />
Más información  |  <a href="http://web.mit.edu/">Massachusetts Institute of Technology </a><br />
Más información  |  <a href="http://www.soton.ac.uk/">University of Southampton </a><br />
Más información  |  <a href="http://es.wikipedia.org/wiki/Tim_Berners-Lee">Wikipedia</a></p>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Parseando XML con Java (II)]]></title>
      <link>http://www.genciencia.com/2006/10/27-parseando-xml-con-java-ii</link>
      <guid>http://www.genciencia.com/2006/10/27-parseando-xml-con-java-ii</guid>
      <pubDate>Fri, 27 Oct 2006 13:58:28 GMT</pubDate>
      <author>Alfonso Jiménez</author>
      <description><![CDATA[	<p><img src="http://img.genciencia.com/2006/10/javaxml.png" alt="Java XML" class="centro_sinmarco" />
Seguimos con el <a href="http://www.genciencia.com/2006/10/26-parseando-xml-con-java-i">post de ayer</a>, donde estábamos implementando en Java una aplicación que leyese un documento XML usando SAX. La aplicación de ejemplo la he dividido en 5 clases: <strong>Index</strong>, <strong>Acciones</strong>, <strong>Parseador</strong>, <strong>Interfaz</strong> y <strong>Conclusión</strong>.
<a name="more"></a>
<ul>
<li><strong>Parseador:</strong> Es la clase que se encarga de leer el documento XML. Esta clase contiene varios métodos por defecto: inicioElemento(Avisa que se ha encontrado una etiqueta registro, y de paso almacenamos el atributo definido en ella), finElemento (Tratamos los datos, en nuestro caso almacenamos en el objeto Vector) y characters (recibe la ubicación de los caracteres del elemento y los extraemos almacenándolos en una cadena). En realidad inicioElemento y finalElemento son una versión simplificada de los métodos startElement y endElement. De aquí sacaremos una colección con los datos que hayamos leído durante el proceso de lectura. En la variable valor se irá guardando una cadena que contiene los datos extraídos, es decir, los datos que tendremos que almacenar en la colección. El código es el siguiente:
<pre>
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import java.util.Vector;
import org.xml.sax.*;
import org.xml.sax.helpers.*;</p>

	<p>public class Parseador extends DefaultHandler  {</p>
  private Vector coleccion; 
  private Acciones actual; 
  private String valor; 

  public Parseador (Vector coleccion) {
     this.coleccion = coleccion; 
  }

  /*
  localName: contiene el nombre de la etiqueta.
  att: de la clase "org.xml.sax.Attributes",
  es una tabla que contiene los atributos
  contenidos en la etiqueta.
  */
  public void startElement( String namespaceURI,
           String localName, String qName,
           Attributes attr ) throws SAXException {

     inicioElemento(localName, attr);
  }

  public void endElement (String namespaceURI,
           String localName, String rawName)
           throws SAXException {
      finElemento(localName);
  }

   public void inicioElemento(String nombreElemento,
            Attributes atributo) throws SAXException {

      if (nombreElemento.equals("entrada")) {
        actual = new Acciones (); 
        coleccion.addElement(actual); 
        actual.setID(
             Integer.parseInt(atributo.getValue("id"))); 
      }
    }

    public void finElemento(String nombreElemento)
             throws SAXException {

        if (nombreElemento.equals("nombre")){ 
          actual.setNombre (valor);
        } else if (nombreElemento.equals("telefono")) {
          actual.setTelefono (Integer.parseInt(valor)); 
        }
    }

    public void characters (char[] ch, int start, int end)
    {

       valor = new String (ch, start, end);
       valor = valor.trim();
    }
}
</pre>
</li>
<li><strong>Acciones:</strong> La clase Acciones contiene sencillos métodos get y set utilizando en la aplicación. Viene dada por el siguiente código:
<pre>
public class Acciones {

   private String documento;
   private String nombre;
   private int telefono;
   private int id;

   public void setNombre (String nombre) {
      this.nombre = nombre;
   }

   public void setTelefono (int telefono) {
      this.telefono = telefono;
   }

   public void setID (int id) {
      this.id = id;
   }

   public void setDocumento(String documento) {
      this.documento = documento;
   }

    public String getNombre() {
       return nombre;
    }

    public int getTelefono()  {
       return telefono;
    }

     public int getID() {
       return id;
     }

     public String getDocumento() {
       return documento;
     }
}
</pre>
</li>
<li><strong>Index:</strong> Es la clase que contiene el main e invoca a las demás clases. Su código es el que se muestra a continuación:
<pre>
import java.util.Vector;
import org.xml.sax.XMLReader;
import org.xml.sax.SAXException;
import org.apache.xerces.parsers.SAXParser;
import org.xml.sax.*;

	<p>public class Index {</p>

  Vector coleccion = new Vector ();
  Acciones acciones = new Acciones ();
  XMLReader parser = new SAXParser();

 public void ParsearDocumento () throws Exception {

      String nombre_de_archivo;
      acciones.setDocumento("index.xml"); 
      nombre_de_archivo=acciones.getDocumento(); 
      parser.setContentHandler(new Parseador(coleccion));
      parser.parse(nombre_de_archivo); 
      Interfaz contenedor = new Interfaz(coleccion);
 }

 public static void main(String[] args) throws Exception {

      Index ejecutar = new Index();
      ejecutar.ParsearDocumento();
 }

	<p>}
</pre>
</li>
<li><strong>Interfaz y Conclusión:</strong> La clase Interfaz es la que se encarga de crear la interfaz gráfica dónde se mostrarán los datos en pantalla. La clase Conclusión es una clase auxiliar de Interfaz.
<pre>
import java.util.Vector;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.MenuBar;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.Event;
import java.awt.*;
import java.awt.image.ImageObserver;</p>

	<p>public class Interfaz {</p>

   public Interfaz(Vector datos) {

      int i;
      Acciones[] inserta=new Acciones[datos.size()]; 
      List miLista = new List(15,false);

      for(i=0;i&lt;datos .size();i++) {
         inserta[i]=(Acciones)datos.elementAt(i);
         miLista.add(inserta[i].getID()+"."
            &lt;ins&gt;inserta[i].getNombre()&lt;/ins&gt;
            " - "+inserta[i].getTelefono());
      }

      Frame miFrame = new Frame("Agenda Electrónica XML");
      miFrame.setLayout(new FlowLayout());
      miFrame.add(miLista);
      miFrame.setSize(200,275);
      miFrame.setVisible(true); 
      miFrame.addWindowListener(new Conclusion());

   }
}
</pre>
<pre>
import java.awt.*;
import java.awt.event.*;

	<p>public class Conclusion extends WindowAdapter {</p>
    public void windowClosing( WindowEvent evt ) {
         System.exit(0);
    }<br />
}<br />
</pre><br />
</datos></pre></li><br />
</ul><br />
Referencias | <a href="http://es.wikipedia.org/wiki/XML">Wikipedia.org</a><br />
Referencias | <a href="http://xerces.apache.org">Xerces</a>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Parseando XML con Java (I)]]></title>
      <link>http://www.genciencia.com/2006/10/26-parseando-xml-con-java-i</link>
      <guid>http://www.genciencia.com/2006/10/26-parseando-xml-con-java-i</guid>
      <pubDate>Thu, 26 Oct 2006 12:20:03 GMT</pubDate>
      <author>Alfonso Jiménez</author>
      <description><![CDATA[	<p><img src="http://img.genciencia.com/2006/10/java.png" alt="Java" class="derecha" /><strong>XML</strong> es el acrónimo de eXtensible Markup Language (lenguaje de marcado ampliable o extensible). Es un lenguaje de etiquetas que se basa en documentos de texto plano en los que se utilizan etiquetas para delimitar los elementos de un documento. Es una versión simplificada de SGML, capaz de describir diversos tipos de datos. Su principal propósito es facilitar el intercambio de información. Son muchos los lenguajes basados en XML (por ejemplo, SVG, RDF, MathML, XSIL, ...). XML permite a las aplicaciones parsear el contenido del documento, pudiendo modificar y leer su contenido.</p>

	<p>Podemos parsear un documento XML de dos <em>modos</em>: usando SAX o DOM. Podemos distinguir a grandes rasgos el funcionamiento de cada modo de parseo de la siguiente forma:<br />
<ul><br />
<li><strong>DOM:</strong> DOM crea un árbol jerárquico en memoria que contiene el todo documento XML, y con él en memoria podemos hacer realizar cualquier tipo de recorrido, movimiento o acción con los elementos que deseemos.</li><br />
<li><strong>SAX:</strong> SAX significa Simple API for XML. Se usa para realizar un recorrido secuencial de los elementos del documento XML, es decir, vamos tratando la información a la vez que la vamos leyendo.</li><br />
</ul></p>

	<p>SAX es menos potente que DOM, pero aún así es más rápido y útil para los casos donde por ejemplo interesa hacer una lectura secuencial o buscar algún fragmento en un documento.<br />
<a name="more"></a><br />
Para mostrar el funcionamiento de un parser de XML, crearemos una pequeña aplicación donde leeremos el contenido de un documento XML usando SAX y lo mostraremos en pantalla. Para escribir el programa usaremos Java, aún así lo podriamos hacer en cualquier otro C++, PHP, Python, ...</p>

	<p>Nuestra aplicación parseará el siguiente documento XML de ejemplo, que se trata de una agenda que almacena el nombre y el número de teléfono de cada registro insertado.</p>

<pre>
&lt; ?xml version="1.0"?&gt;
&lt;agenda&gt;
   &lt;entrada id="1"&gt;
      &lt;nombre&gt; Javier &lt;/nombre&gt;
      &lt;telefono&gt; 956425981 &lt;/telefono&gt;
   &lt;/entrada&gt;
   &lt;entrada id="2"&gt;
      &lt;nombre&gt; Fran &lt;/nombre&gt;
      &lt;telefono&gt; 645675431 &lt;/telefono&gt;
   &lt;/entrada&gt;
   &lt;entrada id="3"&gt;
      &lt;nombre&gt; Alfonso &lt;/nombre&gt;
      &lt;telefono&gt; 660137258 &lt;/telefono&gt;
   &lt;/entrada&gt;
   &lt;entrada id="4"&gt;
      &lt;nombre&gt; Manuel &lt;/nombre&gt;
      &lt;telefono&gt; 625435431 &lt;/telefono&gt;
   &lt;/entrada&gt;
   &lt;entrada id="5"&gt;
      &lt;nombre&gt; Paco &lt;/nombre&gt;
      &lt;telefono&gt; 630603804 &lt;/telefono&gt;
   &lt;/entrada&gt;
&lt;/agenda&gt;
</pre>

	<p>Para parsear el documento usaremos JAXP y Xerces. JAXP (Java API for XML Processing) es un conjunto de clases que permite a las aplicaciones en Java parsear y transformar documento XML independientemente del modo de procesamiento utilizado. La razón de la existencia de JAXP es facilitar el uso de XML en la plataforma Java, garantizando que una aplicación escrita en Java orientanda hacia un parser con soporte JAXP puede ser migrado a otro sin ningún problema. Xerces es un parseador desarrollado por la fundacion Aparche.org disponible para Java y C++. Para escribir nuestro programa usaremos Xerces. </p>

	<p>Mañana continuaremos con la segunda parte <em>Parseando XML con Java (II)</em> donde mostraré la implementación de las clases necesarias y subiré el código de fuente.</p>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Algoritmo de Huffman]]></title>
      <link>http://www.genciencia.com/2006/09/23-algoritmo-de-huffman</link>
      <guid>http://www.genciencia.com/2006/09/23-algoritmo-de-huffman</guid>
      <pubDate>Sat, 23 Sep 2006 12:09:22 GMT</pubDate>
      <author>Alfonso Jiménez</author>
      <description><![CDATA[	<p>El algoritmo de Huffman se usa para la compresión o encriptación de datos mediante el estudio de la frecuencia de aparición de caracteres. Fue desarrollado por el norteamericano <strong>David Albert Huffman</strong> en 1952 mientras hacía el doctorado en el MIT. El método fue publicado en una revista como <em>A Method for the Construction of Minimum-Redundancy Codes</em> (<a href="http://compression.ru/download/articles/huff/huffman_1952_minimum-redundancy-codes.pdf">el artículo original</a>). El algoritmo funciona a partir de un conjunto dado de símbolos con sus respectivos pesos. Los pesos son la frecuencia de aparición en una cadena. Por ejemplo en la cadena <em>Genciencia</em> el peso del símbolo <em>i</em> es 2, ya que aparece en dos ocasiones. La salida del algoritmo es el mismo conjunto de símbolos de entrada codificado mediante un código binario con un tamaño menor. La descripción matemática del algoritmo de Huffman es la siguiente:</p>

	<p><strong>Entrada</strong></p>

	<p><ul><br />
<li>Conjunto de Símbolos: <img src="http://img.genciencia.com/huffman_entrada.png" alt="Símbolos" /> </li><br />
<li>Pesos asociados: <img src="http://img.genciencia.com/huffman_entrada2.png" alt="Pesos" /></li><br />
</ul></p>

	<p>Donde <em>n</em> es la cantidad de símbolos diferentes que existe en la cadena de entrada. Así pues los pesos asociados a los símbolos pertenecientes al conjunto A se encuentran en un rango comprendido entre 1 y n (entendiendo que la entrada no va a ser una cadena vacía), es decir:</p>

	<p><img src="http://img.genciencia.com/huffman_entrada3.png" alt="Rango de pesos" class="centro_sinmarco" /></p>

	<p><strong>Salida</strong></p>

	<p><ul><br />
<li>Conjunto de código binarios: <img src="http://img.genciencia.com/huffman_salida.png" alt="Salida" /></li><br />
</ul></p>

	<p><strong>Meta</strong></p>

	<p><ul><br />
<li>Conseguir que el peso de C sea menor que el de A: <img src="http://img.genciencia.com/huffman_meta.png" alt="Meta" /></li><br />
</ul><br />
<a name="more"></a><br />
El algoritmo se basa en el uso de un árbol binario dónde las hojas representan los símbolos del conjunto de entrada. Para conseguir el código de Huffman asociado a cada símbolo únicamente hay que seguir las aristas que unen la raíz con la hoja determinada. Vamos a comprimir la cadena de ejemplo: <strong>pablito clavo un clavito</strong>.</p>

	<p><ol><br />
<li>Primero calculamos los pesos de los símbolos (¡ojo!, los espacios en blanco también cuentan) y los disponemos siguiente una ordenación ascendente por frecuencia</p>

	<p><strong>p(1)->b(1)->u(1)->n(1)->i(2)->t(2)->c(2)->v(2)->&#8217; &#8217;(3)->a(3)->l(3)->o(3)</strong></p>

	<p></li></p>

	<p><li>En el paso anterior obtenemos <em>n árboles</em>. Ahora fusionamos los dos primeros árboles sumando sus frecuencias y volviendo a ordenar</p>

	<p><img src="http://img.genciencia.com/huffman1.png" alt="Árboles" class="centro_sinmarco" /></p>

	<p></li></p>

	<p><li>Seguimos agrupando pares de árboles hasta obtener solamente uno. La raíz del árbol resultante debe de ser la suma de los pesos</p>

	<p><img src="http://img.genciencia.com/huffman2.png" alt="Árboles" class="centro_sinmarco" /></p>

	<p></li></p>

	<p><li>Ahora a partir de nuestro árbol obtendremos la codificación de Huffman para nuestra cadena. La regla que hay que seguir es la siguiente: Cuando nos encontremos en un nodo las ramas a la izquierda valen ceros y a la derecha valen unos. Para nuestra cadena las correspondencias quedarían de la siguiente manera:</p>

	<p><img src="http://img.genciencia.com/huffman3.png" alt="Árboles" class="centro_sinmarco" /></p>

	<p></li></p>

	<p><li>Traducimos la cadena de entrada con nuestras correspondencias y agrupamos en grupos de 8 bits (bytes) la cadena binaria resultante</p>

	<p><img src="http://img.genciencia.com/huffman4.png" alt="Cadena Binaria" /></p>

	<p>En la cadena resultante se ha reducido la cantidad de bytes respecto a la cadena original que tenía 24 bytes. Cabe decir que también hay que almacenar información de la codificación, pues para descomprimir los datos hay que conocer las correspondencias ya que es relativo. Por esta razón para ficheros de poco tamaño la compresión no es muy grande, aunque esta afirmación es muy relativa, ya que el porcentaje de compresión depende de la entrada.<br />
</li><br />
</ol></p>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Torres de Hanoi]]></title>
      <link>http://www.genciencia.com/2006/09/19-torres-de-hanoi</link>
      <guid>http://www.genciencia.com/2006/09/19-torres-de-hanoi</guid>
      <pubDate>Tue, 19 Sep 2006 10:02:39 GMT</pubDate>
      <author>Alfonso Jiménez</author>
      <description><![CDATA[	<p><em>&#8220;Al crear el mundo, Dios situó sobre la Tierra tres varillas de diamante y 64 discos de oro. Los discos son todos de diferente tamaño e inicialmente fueron colocados en orden decreciente de diámetros sobre la primera de las varillas. También creó Dios un monasterio cuyos monjes tienen la tarea de trasladar todos los discos desde la primera varilla a la tercera. La única operación permitida es mover un disco de una varilla a otra cualquiera, pero con la condición de que no se puede situar encima de un disco otro de diámetro mayor. La leyenda dice también que cuando los monjes terminen su tarea, el mundo se acabará&#8221;.</em></p>

	<p>El otro día alguien preguntó para qué servían los números de Mersenne. El número <strong>mínimo</strong> de movimientos para resolver el juego de las <strong>Torres de Hanoi</strong> viene dado por los <strong>números de Mersenne</strong> (M=2<sup>n</sup>-1 con n primo), siendo el n el número de discos a trasladar. Por lo tanto, los monjes hubiesen necesitado 2<sup>64</sup>-1 = 18446744073709551615 movimientos para resolver el juego con 64 discos. Si suponemos que los monjes realizan un movimiento por segundo tardarían 58454204609 siglos y 6 años en completar el traslado, contando con que no descansen ni un solo segundo en ese tiempo ni que cometan ningún fallo, pues el tiempo que hemos calculado ha sido el mínimo número de movimientos, es decir, hemos excluido los posibles fallos. Lógicamente si resolvemos este problema para 64 discos el mundo <strong>no</strong> se acaba <img src='http://www.genciencia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Existe un algoritmo recursivo donde podemos ver una sencilla solución al problema:</p>

<pre>
hanoi(n, Orig, Aux, Dst)
si (N&gt;0) hacer
hanoi(n-1, Orig, Dst, Aux)
escribir(Movemos Orig a Dst)
hanoi(n-1, Aux, Orig, Dst)
</pre>
<a name="more"></a>
Una posible implementación en Java del algoritmo es la siguiente:

<pre>
public class TorresDeHanoi {

	<p>public static void main(String[] args) {</p>
    TorresDeHanoi tdh = new TorresDeHanoi();
    tdh.hanoi(3, "A", "B", "C"); //Modifica el primer argumento
 }

	<p>private void hanoi(int n, String ini, String aux, String fin) {</p>
 if (n &gt; 0) {
  hanoi(n-1,"A","C","B");
  System.out.println("Mover " + n + " de " + ini + " a " + fin);
  hanoi(n-1,"B","C","A");
 }
 }
}
</pre>

	<p>Esta aplicación imprime en pantalla los movimientos mínimos que hay que realizar para resolver el juego para el número de discos que definimos en la instancia del método <em>hanoi</em> (el primer argumento). Probad la clase y podréis ver el algoritmo recursivo en funcionamiento <img src='http://www.genciencia.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

	<p><img src="http://img.genciencia.com/hanoi.jpg" alt="Hanoi" class="centro_sinmarco" /></p>

	<p>Más información | <a href="http://descartes.cnice.mecd.es/taller_de_matematicas/rompecabezas/TorresHanoi.htm">Descartes 3D</a><br />
Más información | <a href="http://es.wikipedia.org/wiki/Torres_de_Hanoi">Torres de Hanoi en Wikipedia</a></p>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Algoritmos Voraces: Problema del viajante con prisa]]></title>
      <link>http://www.genciencia.com/2006/09/13-algoritmos-voraces-problema-del-viajante-con-prisa</link>
      <guid>http://www.genciencia.com/2006/09/13-algoritmos-voraces-problema-del-viajante-con-prisa</guid>
      <pubDate>Wed, 13 Sep 2006 16:00:25 GMT</pubDate>
      <author>Alfonso Jiménez</author>
      <description><![CDATA[	<p>Seguimos con problemas que se pueden resolver mediante <a href="http://www.genciencia.com/2006/09/06-algoritmos-voraces-problema-d.php">algoritmos voraces</a>. Vamos imaginar que tenemos a una persona que desea viajar en coche desde un punto A hasta otro punto B (n kilómetros). El viajante dispone de un mapa de carretera que indica la distancia entre las gasolineras que están situadas en el trayecto que va a realizar. En el punto de origen, el tanque del coche se encuentra lleno. Conocemos un máximo de kilómetros que el coche puede realizar sin la necesidad de repostar (x kilómetros / xsu objetivo es pararse a repostar el menor número de veces posibles. El algoritmo voraz nos determinará en qué gasolineras el viajante tiene que parar a repostar. </p>

	<p><img src="http://img.genciencia.com/gasolinera.png" class="centro_sinmarco" alt="Gasolinera" /><br />
<a name="more"></a><br />
Veamos el problema con un ejemplo: </p>

	<p><img src="http://img.genciencia.com/gasolinera2.png" class="centro_sinmarco" alt="Gasolinera" /></p>

	<p>En este ejemplo el viajante tiene que realizar un trayecto de 56 km. En su ruta dispone de 5 gasolineras, siendo conocedor de sus distancias entre ellas (vector g[i]). El número de kilómetros máximos que puede realizar sin repostar es 30, por lo tanto repostamos en una gasolinera si no podemos llegar a la siguiente. Si el viajante del problema avanza hasta la primera gasolinera se encuentra con lo siguiente:</p>

	<p><img src="http://img.genciencia.com/gasolinera3.png" class="centro_sinmarco" alt="Gasolinera" /></p>

	<p>Vemos que no es necesario repostar puesto que podríamos llegar a la siguiente gasolinera sin problemas. Esto no ocurre cuando llegamos a la tercera gasolinera:</p>

	<p><img src="http://img.genciencia.com/gasolinera4.png" class="centro_sinmarco" alt="Gasolinera" /></p>

	<p>Aquí calculamos los kilómetros que tendríamos que realizar para llegar a la siguiente gasolinera y nos indica que no poseemos suficiente combustible. Por lo tanto, debemos de repostar en la tercera gasolinera. Cabe decir que cuando repostamos los kilómetros que hemos realizado desde la última vez que repostamos (kms) vuelven a 0.</p>

	<p>El mejor caso posible (que no tuviéramos que parar a repostar en ninguna gasolinera) tendríamos que recorrer el vector una sola vez, por lo que la complejidad sería O(n). El peor de los casos evidentemente sería tener que parar en todas las gasolineras, por lo cual tendríamos una complejidad O(n<sup>2</sup>). Así pues, la complejidad de este algoritmo se encuentra en un punto intermedio entre O(n) y 0(n<sup>2</sup>), según el número de gasolineras donde haya que parar.</p>

	<p>Más información | <a href="http://es.wikipedia.org/wiki/Algoritmo_voraz">Algoritmos Voraces en Wikipedia</a></p>


 ]]></description>
    </item>
	
    <item>
      <title><![CDATA[Algoritmos Voraces: Problema del cambio de monedas]]></title>
      <link>http://www.genciencia.com/2006/09/06-algoritmos-voraces-problema-del-cambio-de-monedas</link>
      <guid>http://www.genciencia.com/2006/09/06-algoritmos-voraces-problema-del-cambio-de-monedas</guid>
      <pubDate>Wed, 06 Sep 2006 19:29:27 GMT</pubDate>
      <author>Alfonso Jiménez</author>
      <description><![CDATA[	<p>Los algoritmos voraces (<em>greedy algorithms</em> en inglés) son unas rutinas muy eficientes (O(n), O(n<sup>2</sup>)) aunque no suelen proporcionar la mejor solución a un problema. Existen algoritmos voraces muy conocidos, como el Algoritmo de Dijkstra o el Algoritmo de Kruskal. Vamos a resolver mediante un algoritmo voraz el conocido <em>Problema del cambio de monedas</em>. El problema se presenta de la siguiente forma: <strong>Dado un sistema monetario S de longitud K y una cantidad de cambio C, devolver una solución (si existe) que nos indique el número de monedas de S equivalente a C, es decir, que nos muestre el cambio para C a partir de monedas de S.</strong> Veamos un ejemplo:</p>

	<p><img class="centro_sinmarco" alt="Ejemplo 1" src="http://img.genciencia.com/cambiomonedas_ejemplo1.png" /></p>

	<p>En este ejemplo nos proporcionan un sistema monetario que contiene monedas de valor 10, 6, 5 y 1. La cantidad que debemos cambiar es C=12. El algoritmo voraz siempre intentará realizar el cambio mediante monedas del mayor valor posible. Si en algún paso C es menor estricto que S[t] (t≤K), se incrementará t y repetiremos el mismo paso para la siguiente moneda de S. Al finalizar, el algoritmo voraz nos indica que el cambio resultante para 12 son dos monedas de 1 y una de 10. Cómo he comentado al principio los algoritmos voraces en muchas ocasiones no presentan la mejor solución, pues en éste ejemplo sería mejor cambiar 12 por dos monedas de 6, entendiendo por mejor solución devolver el menor número de monedas posibles.<br />
<a name="more"></a><br />
También cabe decir que a veces los algoritmos voraces nos indican que no existe solución cuando realmente sí la hay. Un ejemplo de ello es el siguiente:</p>

	<p><img class="centro_sinmarco" alt="Ejemplo 2" src="http://img.genciencia.com/cambiomonedas_ejemplo2.png" /></p>

	<p>El esquema básico de un algoritmo voraz es el siguiente:</p>

<pre>
Clase EsquemaVoraz
proc voraz()
    alg
       inicializa()
       mientras (No fin())
seleccionaYElimina()
si (prometedor()):
   anotaEnSolucion()
fsi
      fmientras
   fin</pre>

	<p>Para usar el esquema para resolver el <em>Problema del cambio de moneda</em> debemos de implementar los métodos <strong>inicializa, fin, seleccionaYElimina, prometedor y anotaEnSolucion</strong>.</p>

	<ul>
		<li><strong>inicializa(): </strong>Crea e inicializa a ceros el array de enteros dónde se anotará la solución y pone a cero el puntero k.</li>
		<li><strong>fin(): </strong>Comprueba si hemos terminado verificando que se cumpla que hemos llegado al final del recorrido del sistema monetario (es decir, que ya no hay monedas de valor más pequeño) o el cambio se haya completado (c=0).</li>
		<li><strong>seleccionaYElimina(): </strong>Incrementamos el puntero k para seleccionar una moneda de menor valor.</li>
		<li><strong>prometedor(): </strong>Nos indica si la moneda candidata es solución para realizar el cambio (condición: que la moneda tenga un valor inferior al cambio).</li>
		<li><strong>anotaEnSolución(): </strong>Si el candidato cumple la condición lo anotamos en el array de solución.</li>
	</ul>

<pre>
Clase CambiodeMonedas hereda EsquemaVoraz
m: array[1..n] de Entero
c: Entero
k: Entero
sol: array[1..n] de Entero

	<p>proc inicializa()</p>
    alg
       sol:=
       k:=0
    fin

	<p>func fin() dev (b: Lógico)</p>
    alg
       b:=((k=n) ó (c=0))
    fin

	<p>proc seleccionaYElimina()</p>
    alg
       k:=k+1
    fin

	<p>func prometedor() dev (b: Lógico)</p>
    alg
       b:=(m[k] 

	<p>Más información | &lt;a href="http://en.wikipedia.org/wiki/Greedy_algorithm"&gt;Greedy algorithm en Wikipedia&lt;/a&gt;</pre></p>


 ]]></description>
    </item>
	

  </channel>
</rss>
