<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:ymaps="http://api.maps.yahoo.com/Maps/V2/AnnotatedMaps.xsd">

<channel>
	<title>Mi espacio &#187; Programación</title>
	<atom:link href="http://www.manuelrecena.com/blog/archives/category/programacion/feed" rel="self" type="application/rss+xml" />
	<link>http://www.manuelrecena.com/blog</link>
	<description>Donde escribo sobre cosas que forman parte de mi vida profesional</description>
	<lastBuildDate>Sun, 08 Aug 2010 20:15:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>cmislib, cliente CMIS en python</title>
		<link>http://www.manuelrecena.com/blog/archives/922</link>
		<comments>http://www.manuelrecena.com/blog/archives/922#comments</comments>
		<pubDate>Sun, 23 May 2010 19:15:51 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[alfresco]]></category>
		<category><![CDATA[cmis]]></category>
		<category><![CDATA[nuxeo]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=922</guid>
		<description><![CDATA[A finales de agosto del año pasado comencé un nuevo proyecto, un plugin para Trac que permitiese su integración con Alfresco. Desde entonces mucho ha llovido, especialmente este año. Cuando comencé no encontré ninguna librería que facilitase el trabajo con el Restful API que proporciona Alfresco y comencé un pequeño cliente para este proyecto. Más [...]]]></description>
			<content:encoded><![CDATA[<p>A <a title="Referencia a una entrada de este blog" href="http://www.manuelrecena.com/blog/archives/803" target="_blank">finales de agosto</a> del año pasado comencé un nuevo <a title="Sitio web del proyecto" href="http://clinker.klicap.es/projects/alfrescointegration" target="_blank">proyecto</a>, un plugin para Trac que permitiese su integración con Alfresco. Desde entonces mucho ha llovido, especialmente este año. Cuando comencé no encontré ninguna librería que facilitase el trabajo con el <a title="Información sobre Restful API de Alfresco" href="http://wiki.alfresco.com/wiki/Alfresco_REST_API" target="_blank">Restful API que proporciona Alfresco</a> y comencé un pequeño cliente para este proyecto. Más adelante pensé que si el cliente maduraba, quizás me convendría liberarlo de forma independiente al plugin para que otros pudieran evolucionarlo y mejorarlo. Yo sólo quería implementar los métodos más básicos.</p>
<p>Los momentos de <a title="Referencia a la wikipedia" href="http://es.wikipedia.org/wiki/Stand_by" target="_blank">standby</a> son realmente malos para cualquier proyecto, pero lo son especialmente para proyectos en los que sólo hay una persona y su planificación no se extiende más allá de tres meses para la primera versión. Con el nacimiento de <a title="Información sobre klicap" href="http://blog.klicap.es/about">klicap</a>, decidimos impulsar este plugin y <a title="Timeline del proyecto" href="http://clinker.klicap.es/projects/alfrescointegration/timeline" target="_blank">en ello estamos</a>. Antes de retomarlo, analicé el trabajo realizado y me cuestioné algunas decisiones previas. Durante esos días, descubrí <a title="Sitio web de la librería" href="http://code.google.com/p/cmislib" target="_blank">cmislib</a>. Según he pedido comprobar, su primer commit tiene fecha de mediados de diciembre de 2009. Su autor es <a title="Blog de Jeff Potts" href="http://ecmarchitect.com">Jeff Potts</a>, presidente y CEO en <a title="Sitio web de Metaversant Group, Inc." href="http://www.metaversant.com" target="_blank">Metaversant Group, Inc.</a>, donde parece que es el único empleado. Esta librería, escrita en python, forma parte del proyecto (en incubación) <a title="Sitio web del proyecto Apache Chemistry" href="http://incubator.apache.org/chemistry" target="_blank">Apache Chemistry</a>. Éste último tiene como objetivo proporcionar librerías cliente para trabajar con soluciones que implementen la especificación <a title="Información sobre la especificación" href="http://docs.oasis-open.org/cmis/CMIS/v1.0/cmis-spec-v1.0.html" target="_blank">CMIS</a>. La librería no está completa, aun quedan funcionalidades por implementar, pero desde luego su última versión 0.3 publicada es estable y cubre gran parte de la especificación. Teniendo en cuenta que la versión 1.0 de la especificación de CMIS tiene fecha 1 de mayo de 2010, sólo me queda agradecer el excelente trabajo de Jeff.</p>
<p>Esto se traduce en que he dejado de implementar mi propio cliente, y he comenzado a usar esta librería. Esto hace incluso que me planté el nombre del plugin, porque ahora podemos integrar Trac con Alfresco, Nuxeo y otros ECM que implementen CMIS. Desde <a title="klicap en twitter" href="http://twitter.com/klicap" target="_blank">@klicap</a> haremos lo posible por colaborar en este proyecto.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/922/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comprobar que Alfresco REST API está disponible</title>
		<link>http://www.manuelrecena.com/blog/archives/842</link>
		<comments>http://www.manuelrecena.com/blog/archives/842#comments</comments>
		<pubDate>Thu, 12 Nov 2009 11:47:21 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[alfresco]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=842</guid>
		<description><![CDATA[Para el plugin de Trac que estoy desarrollando (en los huecos que tengo) estoy desarrollando un pequeño cliente en python que me permita trabajar cómodamente con Alfresco REST API, especialmente con CMIS Web Reference. Uno de los métodos que necesitaba para este cliente es aquel que me permitiese comprobar si la configuración para trabajar con [...]]]></description>
			<content:encoded><![CDATA[<p>Para el <a title="Referencia a una entrada de este blog" href="http://www.manuelrecena.com/blog/archives/803" target="_blank">plugin de Trac</a> que estoy desarrollando (en los huecos que tengo) estoy desarrollando un <a title="Acceso al código fuente del plugin" href="http://trac.ebabel.info/projects/alfrescointegration/browser/trunk/alfrescointegration/alfresco_backend.py" target="_blank">pequeño cliente</a> en python que me permita trabajar cómodamente con <a title="Referencia a la documentación de Alfresco sobre su RESTful API" href="http://wiki.alfresco.com/wiki/Repository_RESTful_API_Reference" target="_blank">Alfresco REST API</a>, especialmente con <a title="Referencia a la documentación de Alfresco sobre su RESTful API (CMIS Web Reference)" href="http://wiki.alfresco.com/wiki/CMIS_Web_Scripts_Reference" target="_blank">CMIS Web Reference</a>. Uno de los métodos que necesitaba para este cliente es aquel que me permitiese comprobar si la configuración para trabajar con el API era correcta. Comprobar eso lleva implícito comprobar que Alfresco está disponible (se tiene acceso HTTP).</p>
<p>La configuración del plugin en relación a Alfresco es muy simple:</p>
<ul>
<li>Usuario y contraseña (credenciales)</li>
<li>URL base en la que se publica RESTful API</li>
</ul>
<p>Dejo por aquí el fragmento de código:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> is_alive<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
    isAlive_service = <span style="color: #008000;">self</span>.__url_api + <span style="color: #483d8b;">'/login'</span> +  <span style="color: #483d8b;">'?u=dummy&amp;amp;pw=dummy'</span>
    <span style="color: #008000;">self</span>.__log.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Restful Service: '</span> + isAlive_service<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        response, content = <span style="color: #008000;">self</span>.__http.<span style="color: black;">request</span><span style="color: black;">&#40;</span>isAlive_service, <span style="color: #483d8b;">'GET'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> response.<span style="color: black;">status</span> == <span style="color: #dc143c;">httplib</span>.<span style="color: black;">FORBIDDEN</span>:
            <span style="color: #008000;">self</span>.__log.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Alfresco RESTful API is alive'</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.__log.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Alfresco RESTful API is not alive'</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
    <span style="color: #ff7700;font-weight:bold;">except</span>:
        <span style="color: #008000;">self</span>.__log.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Alfresco RESTful API is not alive'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span></pre></div></div>

<p>Cualquier sugerencia será bienvenida.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/842/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabajar con documentos CSV con Java</title>
		<link>http://www.manuelrecena.com/blog/archives/814</link>
		<comments>http://www.manuelrecena.com/blog/archives/814#comments</comments>
		<pubDate>Mon, 21 Sep 2009 22:57:54 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[csv]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=814</guid>
		<description><![CDATA[Hace algunas semanas escribía una breve entrada sobre librerías para trabajar con hojas de cálculo Excel desde Java. En esta ocasión he tenido la necesidad de exportar un conjunto de datos en formato CSV. Generar un archivo con datos separados por comas o punto y coma es sencillo, y quizás, no compense añadir una nueva [...]]]></description>
			<content:encoded><![CDATA[<p>Hace <a title="Referencia a una entrada de este blog" href="http://www.manuelrecena.com/blog/archives/762" target="_blank">algunas semanas</a> escribía una breve entrada sobre librerías para trabajar con hojas de cálculo Excel desde Java. En esta ocasión he tenido la necesidad de exportar un conjunto de datos en <a title="RFC del formato" href="http://tools.ietf.org/html/rfc4180" target="_blank">formato CSV</a>. Generar un archivo con datos separados por comas o punto y coma es sencillo, y quizás, no compense añadir una nueva dependencia para algo tan simple. Antes de ponerme a codificar, decidí ojear un poco:</p>
<ol>
<li><a title="Sitio web oficial de la librería" href="http://www.csvreader.com/java_csv.php" target="_blank">Java CSV</a></li>
<li><a title="Sitio web oficial de la librería" href="http://supercsv.sourceforge.net" target="_blank">SuperCSV</a></li>
</ol>
<p>Opté por la segunda porque me ha permitido trabajar directamente con <a title="Referencia al sitio web de Sun Microsystem" href="http://java.sun.com/javase/6/docs/technotes/guides/beans/" target="_blank">JavaBeans</a> y es algo más completa que la primera. Otra librería que conocí hace algún tiempo es <a title="Sitio web oficial de la librería" href="http://www.smooks.org" target="_blank">Smooks</a>. Aunque hubiera sido como cortar el césped con una excavadora, estuve tentado a usarla. Tiene muy buena pinta y las referencias y ejemplos que he visto, son muy interesantes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/814/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Desarrollando plugins de Trac</title>
		<link>http://www.manuelrecena.com/blog/archives/781</link>
		<comments>http://www.manuelrecena.com/blog/archives/781#comments</comments>
		<pubDate>Wed, 19 Aug 2009 10:52:22 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=781</guid>
		<description><![CDATA[El otro día comencé a configurar el entorno de desarrollo local. Se me olvidó comentar que para desarrollar plugins de Trac la mejor opción es ejecutarlo en modo standalone. El porqué viene justificado por uno de los pros de este modo:
Automatic reloading: For development, Tracd can be used in auto_reload mode, which will automatically restart [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Referencia a una entrada de este blog" href="http://www.manuelrecena.com/blog/archives/773" target="_blank">El otro día</a> comencé a configurar el entorno de desarrollo local. Se me olvidó comentar que para desarrollar plugins de Trac la mejor opción es ejecutarlo en <strong>modo standalone</strong>. El porqué viene justificado por uno de los pros de este modo:</p>
<blockquote><p>Automatic reloading: For development, Tracd can be used in auto_reload mode, which will automatically restart the server whenever you make a change to the code (in Trac itself or in a plugin).</p></blockquote>
<p>Toda la <a title="Documentación sobre Trac en modo standalone" href="http://trac.edgewall.org/wiki/TracStandalone" target="_blank">configuración</a> está perfectamente explicada en el sitio web de Trac. En mi caso me he creado un pequeño script (start_trac.sh):</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">tracd <span style="color: #660033;">-p</span> <span style="color: #000000;">8000</span> <span style="color: #660033;">--basic-auth</span>=AlfrescoTracIntegration,<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>recena<span style="color: #000000; font-weight: bold;">/</span>Documentos<span style="color: #000000; font-weight: bold;">/</span>trac-users.conf,<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>recena<span style="color: #000000; font-weight: bold;">/</span>Documentos<span style="color: #000000; font-weight: bold;">/</span>trac-projects<span style="color: #000000; font-weight: bold;">/</span>AlfrescoTracIntegration <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>recena<span style="color: #000000; font-weight: bold;">/</span>Documentos<span style="color: #000000; font-weight: bold;">/</span>trac-projects<span style="color: #000000; font-weight: bold;">/</span>AlfrescoTracIntegration</pre></div></div>

<p>Si por el contrario lo que queremos es ejecutarlo desde Eclipse, también podemos encontrar las correspondientes <a title="Referencia a la documentación del sitio web de Trac" href="http://trac.edgewall.org/wiki/TracDev/DevelopmentWithEclipseAndPyDev#InstallingandconfiguringEclipse" target="_blank">instrucciones</a>. La intención era haber publicado esta pequeña entrada el pasado jueves, 13 de agosto. Pero he estado sin acceso a Internet desde entonces. Algunas notas que a mi me están viniendo muy bien para comenzar a desarrollar un plugin de Trac sin tener experiencia en Python:</p>
<ol>
<li>Configurar un <em>buen</em> entorno de desarrollo local que nos permita trabajar cómodamente y como no, depurar.</li>
<li>Conocer las características del lenguaje de programación. Me he leído &#8220;<a title="Sitio web oficial del libro" href="http://mundogeek.net/tutorial-python/" target="_blank"><strong>Python para todos</strong></a>&#8220;, y sólo agradecer a Raúl González Duque el excelente trabajo realizado.</li>
<li>Guías:
<ol>
<li><a title="Referencia al sitio web de Python" href="http://www.python.org/dev/peps/pep-0008" target="_blank">Style Guide for Python Code</a></li>
<li><a title="Rerencia al sitio web de Python" href="http://www.python.org/dev/peps/pep-0257/" target="_blank">Docstring Conventions</a></li>
</ol>
</li>
<li>Estudiar <a title="Comunidad de Trac donde se publican plugins y macros" href="http://trac-hacks.org" target="_blank">otros plugins</a></li>
<li>Instalar <a title="Sitio web del plugin" href="http://trac-hacks.org/wiki/TracDeveloperPlugin" target="_blank">TracDeveloper</a>, un plugin de Trac muy útil para desarrollar.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/781/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurando un entorno para desarrollar plugins de Trac</title>
		<link>http://www.manuelrecena.com/blog/archives/773</link>
		<comments>http://www.manuelrecena.com/blog/archives/773#comments</comments>
		<pubDate>Wed, 12 Aug 2009 13:43:24 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=773</guid>
		<description><![CDATA[Desde que era muy pequeño mis padres me inculcaron que las vacaciones (especialmente los veranos) no son para &#8220;no hacer nada&#8221;. Son una época en la que uno dispone de mayor tiempo y por tanto mayor posibilidad de hacer cosas. Recuerdo aquellos veranos en los que la TV estaba prácticamente prohibida durante el día, las [...]]]></description>
			<content:encoded><![CDATA[<p>Desde que era muy pequeño mis padres me inculcaron que las vacaciones (especialmente los veranos) no son para &#8220;no hacer nada&#8221;. Son una época en la que uno dispone de mayor tiempo y por tanto mayor posibilidad de hacer cosas. Recuerdo aquellos veranos en los que la TV estaba <em>prácticamente</em> prohibida durante el día, las mañanas eran para hacer cuadernillos Rubio y las tardes para hacer deporte, pescar o campamentos, pero lo más deseado por mi, pasar tiempo con mi <a title="Información sobre este modelo de PC" href="http://en.wikipedia.org/wiki/PC-1512" target="_blank">Amstrad 1512</a> y posteriormente con mi 80486 con el que conocí la <a title="Referecia sobre el término demoscene" href="http://en.wikipedia.org/wiki/Demoscene" target="_blank">demoscene</a>.</p>
<p>Durante estos días me gustaría acercarme al desarrollo de plugins en Trac. Lo primero que he hecho es leer un poco y conocer qué necesito para configurar un entorno de desarrollo local que me permita trabajar cómodamente. A continuación una descripción del entorno:</p>
<ol>
<li>Mandriva 2009</li>
<li>Aptana Studio 1.5.1 (con PyDev)</li>
<li>Python 2.6 (paquetes)</li>
<li>MySQL Server 5.1</li>
<li>Genshi 0.5.1 (paquetes)</li>
<li>Setuptools 0.6c9 (paquetes)</li>
<li>Subversion 1.6.4 (paquetes)</li>
<li>SWIG 1.3.38 (paquetes)</li>
<li><a title="¿Cómo instalarlo desde los fuentes?" href="http://svn.collab.net/repos/svn/trunk/subversion/bindings/swig/INSTALL">Subversion SWIG Python bindings</a> (paquetes, subversion-devel)</li>
<li><a title="Sitio web oficial del proyecto MySQLDB" href="http://sourceforge.net/projects/mysql-python" target="_blank">MySQLDB</a> (Ojo! no ZMySQLDA)
<ol>
<li>Descargamos los <a title="MySQL Python 1.2.2" href="http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.2/MySQL-python-1.2.2.tar.gz">fuentes</a> correspondientes a la versión 1.2.2</li>
<li>Descomprimimos el tar.gz</li>
<li>Asegurarse de que están disponibles de los fuentes de MySQL porque MySQLDB los necesita para su instalación</li>
<li>Seguimos las instrucciones que vienen en archivo README</li>
</ol>
</li>
<li>Trac 0.11.5</li>
</ol>
<p>Os podéis ahorrar muchos de estos pasos porque en varias distribuciones de Linux ya existe un paquete con Trac (con soporte para MySQL y Subversion). Por ejemplo, en Mandriva existe ese paquete. En nuestro <a title="Refencia a DEIN - Ecosistema Software" href="http://www.manuelrecena.com/blog/archives/562" target="_blank">ecosistema software</a> usamos Trac con SQLite y todo va muy bien, sin embargo, he querido aprovechar esta ocasión para conocer de primera mano el soporte de MySQL que tiene Trac. Si los resultados son positivos, probablemente, nos planteemos la migración a medio plazo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/773/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabajar con documentos Excel con Java</title>
		<link>http://www.manuelrecena.com/blog/archives/762</link>
		<comments>http://www.manuelrecena.com/blog/archives/762#comments</comments>
		<pubDate>Tue, 04 Aug 2009 20:48:17 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jexcelapi]]></category>
		<category><![CDATA[opina]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=762</guid>
		<description><![CDATA[Una de las nuevas funcionalidades de Opina que está planificada para la versión 1.4.0 es la exportación de los resultados de una encuesta a una hoja de cálculo Excel. Inicialmente había pensado en trabajar con OpenDocument, pero necesitaba compatibilidad con Microsoft Excel 97 y sus versiones posteriores. La verdad es que la hoja de cálculo [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las <a title="Referencia a la milestone 1.4.0 de Opina" href="http://trac.ebabel.info/projects/opina/query?status=assigned&amp;status=new&amp;status=reopened&amp;group=status&amp;milestone=1.4.0" target="_blank">nuevas funcionalidades</a> de Opina que está planificada para la versión 1.4.0 es la exportación de los resultados de una encuesta a una hoja de cálculo Excel. Inicialmente había pensado en trabajar con OpenDocument, pero necesitaba compatibilidad con Microsoft Excel 97 y sus versiones posteriores. La verdad es que la hoja de cálculo que se necesita es un muy simple, nada de imágenes, nada de fórmulas, simplemente celdas con algo de estilos (colores, tipos de letra y tamaños) y datos.</p>
<p>Las opciones que encontré para trabajar con documentos Excel desde Java fueron:</p>
<ol>
<li><a title="Sitio web de JExcelApi" href="http://jexcelapi.sourceforge.net" target="_blank">JExcelApi</a></li>
<li><a title="Referencia al proyecto POI de Apache Software Foundation" href="http://poi.apache.org/spreadsheet" target="_blank">POI-HSSF / POI-XSSF</a></li>
</ol>
<p>En estos momentos estoy usando la primera en Opina, y las impresiones son muy buenas:</p>
<ul>
<li>Aunque a priori la documentación parece escasa, es suficiente para comenzar a trabajar y montar un ejemplo.</li>
<li>Tiene carencias en cuanto al manejo de fórmulas y gráficos, pero si no necesitas algo complejo, es una opción válida.</li>
<li>No he trabajado con documentos complejos y grandes, pero en breve tendré referencias en este sentido. Tengo encuestas con más de 40 preguntas y más de 1500 usuarios encuestados. Además la <a title="Sitio web de GMV" href="http://www.gmv.es" target="_blank">estamos</a> usando en un proyecto donde se gestiona un volumen de datos importante y puede ser otra buena referencia. Cuando tenga resultados, los compartiré.</li>
<li>Los conceptos a manejar son pocos: workbook, worksheet, label, writableFont, writableCellFormat y algunos más.</li>
<li>La última versión (2.6.10) es el 28 de mayo de <strong>2009</strong>. La primera versión de la rama 2.x es del 10 de octubre de <strong>2003</strong>. Durante este periodo más de 30 versiones publicadas. Y si vemos la <a title="Referencia a la lista de correo del proyecto" href="http://tech.groups.yahoo.com/group/JExcelApi/" target="_blank">lista de correo</a>, podemos comprobar su actividad.</li>
</ul>
<p>Que conste que las necesidades que Opina tiene son muy básicas, es probable que otro tipo de proyectos tengan más requisitos y tengan que descartar esta opción. He buscando el artefacto por los repositorios de Maven que conozco, pero no lo he encontrado. Por lo tanto, he definido sus coordenadas para instalarlo en mi repositorio local (y en <a title="Referencia a una entrada de este blog" href="http://www.manuelrecena.com/blog/archives/562" target="_blank">nuestro ecosistema</a>) y he añadido el JAR a directorio <a title="Referencia al repositorio SVN de Opina 1.x" href="https://svn.ebabel.info/repos/opina/branches/1.x/libs/" target="_blank">libs</a> correspondiente.</p>
<p>De la segunda opción no puedo decir nada de primera mano, sólo tengo comentarios e impresiones. Es un proyecto <em>importante</em> en <a title="Sitio web de Apache Software Foundation" href="http://www.apache.org" target="_blank">ASF</a> y son muchos los proyectos que en él se apoyan, por lo tanto, me da confianza. De hecho lo usamos de forma indirecta porque Eclipse Birt es nuestra opción (actual) para la generación de reportes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/762/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Temas en Drupal</title>
		<link>http://www.manuelrecena.com/blog/archives/539</link>
		<comments>http://www.manuelrecena.com/blog/archives/539#comments</comments>
		<pubDate>Wed, 11 Mar 2009 12:38:59 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[temas]]></category>
		<category><![CDATA[zen]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=539</guid>
		<description><![CDATA[En los últimos meses he tenido que codificar varios temas en Drupal para unos proyectos que hemos desarrollado. Para aquellos que estáis comenzando os recomiendo encarecideamente que no comencéis un tema desde cero. En Drupal, existe el concepto de módulo y submódulo, esto se extendiende también para los temas.
Haz un sub-tema partiendo de Zen Extend [...]]]></description>
			<content:encoded><![CDATA[<p>En los últimos meses he tenido que codificar varios temas en Drupal para unos proyectos que <a title="Sitio web de GMV Soluciones Globales Internet" href="http://www.gmv-sgi.es" target="_blank">hemos</a> desarrollado. Para aquellos que estáis comenzando os recomiendo encarecideamente que no comencéis un tema desde cero. En Drupal, existe el concepto de módulo y submódulo, esto se extendiende también para los temas.</p>
<p>Haz un sub-tema partiendo de <a title="Acceso al proyecto Zen Extend And Design" href="http://drupal.org/project/zen" target="_blank">Zen Extend And Design</a>. Es un tema considerado base sobre el extender el tuyo. ¿Qué te proporciona?</p>
<ul>
<li>Plantillas de las vistas principales (node, page, comment, etc)</li>
<li>Las plantillas tienen una semántica muy bien definida y usan correctamente los estándares web.</li>
<li>Un punto de partida para aprender a desarrollar temas en Drupal</li>
<li>Buena documentación</li>
</ul>
<p>Una lectura que no puede faltal para todo aquel que vaya a desarrollar un tema es lo que se conoce como la <a title="Anatomía de un tema" href="http://drupal.org/node/171194" target="_blank">anatomía de un tema</a>. A mi me ha venido muy bien organizar las hojas de estilo según dicha anatomía:</p>
<p><img class="alignnone" title="Captura de pantalla de cómo organizo mis hojas de estilo" src="http://farm4.static.flickr.com/3351/3346796518_21fc506df2_o.png" alt="" width="436" height="291" /></p>
<p>En unos días liberaré el último en el que estoy trabajando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/539/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurando un entorno de desarrollo para Drupal</title>
		<link>http://www.manuelrecena.com/blog/archives/282</link>
		<comments>http://www.manuelrecena.com/blog/archives/282#comments</comments>
		<pubDate>Fri, 05 Sep 2008 19:50:16 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=282</guid>
		<description><![CDATA[Recientemente he tenido que configurar un entorno de desarrollo para trabajar con Drupal en Linux, concretamente Madriva. Quizás a alguien le puedan venir bien estas notas:

Instalar y configurar Eclipse IDE con soporte para PHP (PDT Project). Ya comenté hace tiempo que uso Pulse para gestionar y mantener distintas instancias de Eclipse IDE.
Instalamos Apache Web Server [...]]]></description>
			<content:encoded><![CDATA[<p>Recientemente he tenido que configurar un entorno de desarrollo para trabajar con Drupal en Linux, concretamente Madriva. Quizás a alguien le puedan venir bien estas notas:</p>
<ol>
<li>Instalar y configurar Eclipse IDE con soporte para PHP (PDT Project). Ya <a title="Referencia a una entrada de este blog" href="http://www.manuelrecena.com/blog/archives/114">comenté</a> hace tiempo que uso Pulse para gestionar y mantener distintas instancias de Eclipse IDE.</li>
<li>Instalamos Apache Web Server con soporte para PHP (preferiblemente PHP5). Para esto tenemos varias opciones:
<ol>
<li><a title="Para descargar LAMPStack" href="http://bitnami.org/stack/lampstack">LAMPStack</a> de BitNami</li>
<li>Seguir estas <a title="Información sobre LAMP" href="http://www.lamphowto.com">instrucciones</a>.</li>
<li>Instalar Apache Web Server con soporte para PHP y MySQL desde paquetes</li>
<li>Instalar Apache Web Server con soporte para PHP y MySQL desde los fuentes</li>
</ol>
</li>
<li>Descargamos y descomprimimos Drupal dentro de nuestro workspace de Eclipse:
<pre>[recena@localhost Eclipse 3.3 PDT]$ wget http://ftp.drupal.org/files/projects/drupal-6.4.tar.gz
[recena@localhost Eclipse 3.3 PDT]$ tar -xvzf drupal-6.4.tar.gz
[recena@localhost Eclipse 3.3 PDT]$ rm drupal-6.4.tar.gz</pre>
</li>
<li>Ahora configuramos un alias (p.e. qabox) para poder acceder a nuestra instalación de Drupal de una forma similar a <em>http://localhost/qabox</em>. Para ello añadimos a httpd.conf:
<pre>Alias /qabox "/home/recena/Workspaces/Eclipse 3.3 PDT/drupal-6.4"
&lt;Directory "/home/recena/Workspaces/Eclipse 3.3 PDT/drupal-6.4"&gt;
        AllowOverride All
        Options MultiViews Indexes Includes FollowSymLinks
        Order allow,deny
        Allow from all
&lt;/Directory&gt;</pre>
</li>
<li>A partir de este momento, accedemos a <em>http://localhost/qabox</em>, y lo que resta es seguir las instrucciones de la propia instalación de Drupal. Que no se os olvide colocar el correspondiente archivo .htaccess en el directorio raíz donde se encuentre instalado Drupal. En la documentación viene todo perfectamente comentado.</li>
</ol>
<p>Una vez que tenemos lo básico para ejecutar Drupal nuestro trabajo se centrará -probablemente- en el desarrollo de módulos y/o temas. Pues bien, la idea es tener un proyecto para cada uno de los módulos y/o temas que desarrollemos. De esta forma tendremos nuestra instalación de Drupal por un lado, y nuestros desarrollos (modelados como proyectos de Eclipse) por otro. Ahora lo único que tenemos que hacer es decirle a Drupal que use estos módulos y/o temas. Así iremos viendo los resultados. Para hacer esto basta con hacer simples enlaces simbólicos donde corresponde y hacía donde se encuentran nuestros proyectos.</p>
<p>En la captura de pantalla que se muestra a continuación, veréis un tema que estoy desarrollando que se llama QABox y el enlace simbólico que he creado para que Drupal sepa que dispone de ese tema como se estuviera almacenado en $DRUPAL_HOME/sites/default/themes (p.e.):</p>
<p><a href="http://www.manuelrecena.com/resources/eclipse_drupal.png"><img class="alignnone size-medium wp-image-294" title="Eclipse y Drupal" src="http://www.manuelrecena.com/blog/../resources/eclipse_drupal-300x187.png" alt="" width="300" height="187" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/282/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gráficas renderizadas en Flash (SWF)</title>
		<link>http://www.manuelrecena.com/blog/archives/127</link>
		<comments>http://www.manuelrecena.com/blog/archives/127#comments</comments>
		<pubDate>Sat, 29 Mar 2008 17:14:27 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/wordpress/archives/127</guid>
		<description><![CDATA[La verdad es que la primera vez que tuve que renderizar unas gráficas fue para una pequeña aplicación programada en PHP que se encargaba de controlar la ocupación de unas aulas de informática. Por aquella época, JpGraph era una de las mejores librerías en PHP para el renderizado de gráficas. La verdad es que desde [...]]]></description>
			<content:encoded><![CDATA[<p>La verdad es que la primera vez que tuve que renderizar unas gráficas fue para una pequeña aplicación programada en PHP que se encargaba de controlar la ocupación de unas aulas de informática. Por aquella época, <a title="Referencias a la librería" href="http://www.aditus.nu/jpgraph" target="_blank">JpGraph</a> era una de las mejores librerías en PHP para el renderizado de gráficas. La verdad es que desde aquello ha llovido un poco y ahora hay otras opciones.</p>
<p>Hace unos días <a title="Referencia a un post de este blog" href="http://www.manuelrecena.com/blog/archives/114-STractistics-0.1.0beta,-un-nuevo-plugin-para-TRAC.html" target="_blank">os comentaba</a> que estábamos (en GMV) trabajando en un plugin para TRAC llamado <a title="Sitio web de STractistics" href="http://trac-hacks.org/wiki/StractisticsPlugin" target="_blank">STractistics</a> para medir la actividad de los proyectos. Todavía está un poco verde, pero estamos trabajando para añadirle nuevas funcionalidades. Para este proyecto se barajaron varias opciones:</p>
<ul>
<li>Generar las gráficas en el servidor al estilo de JpGraph y devolverlas al cliente como una imagen.</li>
<li>Generar las gráficas en el cliente: HTML + CSS o HTML + CSS +Javascript.</li>
<li>Generar las gráficas en el cliente: Flash (SWF), <a title="Sitio web de Open Flash Chart" href="http://teethgrinder.co.uk/open-flash-chart/" target="_blank">OpenFlashChart</a></li>
<li>Generar las gráficas en &#8220;Google&#8221; haciendo uso de Google Chart API</li>
</ul>
<p>Se hicieron algunas pruebas con la segunda opción y los resultados no eran malos, todo lo contrario, sin embargo, los problemas de compatibilidad con los distintos navegadores web suponía un problema. Las búsquedas nos llevaron a Open Flash Char, desde mi punto de vista, un excelente trabajo que nos permite generar <a title="Sitio web donde están usando STractistics" href="http://www.clever-age.org/trac/stractistics" target="_blank">unas vistosas</a> y configurables gráficas.</p>
<p>Ayer <a title="Refencia a la noticia" href="http://www.soitu.es/soitu/2008/03/25/met/1206461193_108279.html" target="_blank">leía</a> que el software usado en SOITU durante las elecciones para el renderizado de gráficas ha sido liberado con licencia GNU GPLv3. Mi más sincera enhorabuena por la iniciativa. Después de conocer cómo funciona OpenFlashChart y de leer como funciona Charts (SOITU), la forma en la que este último recoje los datos es más sencilla y cómoda, basta con generar un XML.</p>
<p>Por ahora STractistics se quedará así pero se estudiará la migración a Charts (SOITU).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/127/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ingredientes: Eclipse, Jetty y un proyecto J2EE descrito con Maven</title>
		<link>http://www.manuelrecena.com/blog/archives/94</link>
		<comments>http://www.manuelrecena.com/blog/archives/94#comments</comments>
		<pubDate>Sun, 19 Aug 2007 16:10:54 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/wordpress/archives/94</guid>
		<description><![CDATA[Esta semana ha surgido en Opina la necesidad de definir un entorno de desarrollo en el que en lugar de Apache Tomcat se necesitaba trabajar con Jetty 6.x. Nunca había trabajo con Jetty, sin embargo, mis compañeros de trabajo todos lo usaban y las primeras impresiones son muy buenas.
El objetivo del presente post es, teniendo [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana ha surgido en <a title="Herramienta de gestión de proyectos de Opina" href="http://trac.ebabel.info/projects/eBabel">Opina</a> la necesidad de definir un entorno de desarrollo en el que en lugar de Apache Tomcat se necesitaba trabajar con Jetty 6.x. Nunca había trabajo con Jetty, sin embargo, mis compañeros de trabajo todos lo usaban y las primeras impresiones son muy buenas.</p>
<p>El objetivo del presente post es, teniendo nuestro proyecto J2EE descrito con Maven y configurado en Eclipse, trabajar con Jetty. En este caso el proyecto será Opina e intentaremos usar Jetty en lugar de Apache Tomcat durante el desarrollo.</p>
<p>En primer lugar tendremos que configurar el plugin de maven correspondiente. Para ello, en la sección correspondiente a <span style="font-family: courier new,courier;">build</span> (dentro de pom.xml):</p>
<blockquote><p><span style="font-family: courier new,courier;">&lt;plugin&gt;<br />
&lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;<br />
&lt;artifactId&gt;maven-jetty-plugin&lt;/artifactId&gt;<br />
&lt;version&gt;6.1.5&lt;/version&gt;<br />
&lt;configuration&gt;<br />
&lt;scanIntervalSeconds&gt;5&lt;/scanIntervalSeconds&gt;<br />
&lt;scanTargets&gt;<br />
&lt;scanTarget&gt;<br />
${basedir}/src/main/webapp/WEB-INF<br />
&lt;/scanTarget&gt;<br />
&lt;/scanTargets&gt;<br />
&lt;classesDirectory&gt;<br />
${basedir}/src/main/webapp/WEB-INF<br />
&lt;/classesDirectory&gt;<br />
&lt;contextPath&gt;${project.artifactId}&lt;/contextPath&gt;<br />
&lt;webAppSourceDirectory&gt;<br />
${basedir}/src/main/webapp<br />
&lt;/webAppSourceDirectory&gt;<br />
&lt;webXml&gt;<br />
${basedir}/src/main/webapp/WEB-INF/web.xml<br />
&lt;/webXml&gt;<br />
&lt;/configuration&gt;<br />
&lt;/plugin&gt;</span></p></blockquote>
<p>Esta configuración está condicionada a que en Opina usarmos <span style="font-family: courier new,courier;">${basedir}/src/main/webapp</span> para montar la aplicación mientras estamos desarrollando. Prueba de ello es que normalmente usamos: <span style="font-family: courier new,courier;">mvn compile war:inplace</span></p>
<p>Una vez que hemos actualizado el archivo pom.xml, vamos a configurar Eclipse para que podamos invocar a Maven con los argumentos que necesitamos:</p>
<ol>
<li><span style="font-family: courier new,courier;">Run &gt; External Tools &gt; Open External Tools Dialog</span></li>
<li>Sobre <span style="font-family: courier new,courier;">Program</span>, pulsamos el botón derecho y  <span style="font-family: courier new,courier;">New</span></li>
<li>Definimos un nombre para esta tarea (junto a <span style="font-family: courier new,courier;">Name</span>)</li>
<li>Estando sobre la pestaña <span style="font-family: courier new,courier;">Main</span>:
<ol>
<li>Location: Indicamos donde se encuentra el ejecutable de Maven</li>
<li>Working directory: Navegamos por <span style="font-family: courier new,courier;">Working Directory</span> y seleccionamos nuestro proyecto</li>
<li>Arguments: Indicamos los argumentos que nos interesen, por ejemplo: <span style="font-family: courier new,courier;">compile war:inplace jetty:run.</span> Con estos argumentos conseguimos que nuestro proyecto pase por todas las fases del <a title="Referencia al sitio web de Maven" href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html" target="_blank">ciclo de vida</a> definido en Maven hasta llegar a la fase de compilación. Esto nos garantizará que se han generado todos nuestros recursos (web.xml, struts-config.xml, etc), se ha aplicado nuestro perfil correspondiente (profiles.xml), se ha compilado nuestras clases, se han obtenido nuestras dependencias y que nuestra aplicación se ha construido en <span style="font-family: courier new,courier;">${basedir}/src/main/webapp</span>.</li>
</ol>
</li>
<li>Aplicar</li>
<li>Cerrar</li>
</ol>
<p>Si todo ha ido bien, estaremos dispuestos a ejecutar la tarea. Para ello:</p>
<blockquote><p><img title="Captura de pantalla de Eclipse" src="/blog/uploads/images/eclipse_tasks.png" border="0" alt="Captura de pantalla de Eclipse" width="288" height="192" /></p></blockquote>
<p>He preparado un <a title="Screencast con la consola de Eclipse" href="/misc/eclipse/eclipse_tasks.html" target="_blank">screencast</a> de la consola de Eclipse simplemente para que vea como se ejecutan las distintas tareas que se le indican a Maven y como posteriormente se lanza Jetty con nuestra aplicación.</p>
<p>Y ahora lo más importante para poder desarrollar con estos ingredientes, la depuración. ¿Qué tenemos que hacer para poder depurar? El siguiente objetivo es claro. Ahora necesitamos seguir usando la perspectiva de depuración de Eclipse de igual forma que la usamos en otros proyectos o la usamos cuando usamos Apache Tomcat.</p>
<p>Tenemos que modificar la tarea que hemos creado. Para ello, editamos la tarea, y sobre la pestaña <span style="font-family: courier new,courier;">Environment</span>, añadimos la variable <span style="font-family: courier new,courier;">MAVEN_OPTS</span> con el valor: <span style="font-family: courier new,courier;">-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=y</span></p>
<p>Una vez modificada la tarea:</p>
<ol>
<li><span style="font-family: courier new,courier;">Run &gt; Open Debug Dialog</span></li>
<li>Sobre <span style="font-family: courier new,courier;">Remote Java Application</span>, pulsamos con el botón derecho y <span style="font-family: courier new,courier;">New</span></li>
<li>Definimos un nombre (junto a <span style="font-family: courier new,courier;">Name</span>)</li>
<li>Y sobre la pestaña <span style="font-family: courier new,courier;">Connetion</span>:
<ol>
<li>Project: Selecionamos nuestro proyecto</li>
<li>Connection Properties:
<ol>
<li>Host: <span style="font-family: courier new,courier;">localhost</span></li>
<li>Port: <span style="font-family: courier new,courier;">4000</span> (el que hemos indicando en <span style="font-family: courier new,courier;">MAVEN_OPTS</span>).</li>
</ol>
</li>
</ol>
</li>
<li>Aplicar</li>
<li>Cerrar (aun no debemos depurar nada)</li>
</ol>
<p>Teniendo la tarea definida y la configuración para la depuración, estamos en disposición de comprobar si todo ha ido bien. Para ello, he preparado un <a title="Screencast de Eclipse depurando con Jetty" href="/misc/eclipse/eclipse_debug.html" target="_blank">segundo screencast</a>.</p>
<p>Algunas referencias donde viene todo esto explicado:</p>
<ol>
<li><a title="Referencia 1" href="http://docs.codehaus.org/display/JETTY/Debugging+with+the+Maven+Jetty+Plugin+inside+Eclipse" target="_blank">Debugging with the Maven Jetty Plugin inside Eclipse</a></li>
<li><a title="Referencia 2" href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin" target="_blank">Maven Jetty Plugin</a></li>
</ol>
<p>Un problema con el que me he encontrado, y parece que <a title="Referencia a un foro" href="http://docs.codehaus.org/display/JETTY/Debugging+with+the+Maven+Jetty+Plugin+inside+Eclipse#comment-75256" target="_blank">más gente</a>, es que cuando se desea terminar la tarea que acabados de ejecutar el proceso no se detiene y Jetty continua en ejecución. Si las tareas que hemos definido las ejecutamos desde la línea de comandos todo funciona perfectamente. Al pulsar <span style="font-family: courier new,courier;">CTRL+C</span>, la tarea de Maven termina y Jetty de apaga correctamente. Parece que hay un <a title="Referencia al bug" href="http://jira.codehaus.org/browse/JETTY-412" target="_blank">parche</a> que nos ayuda a terminar la tarea que aun no he probado.</p>
<p>Es probable que la integración mejore considerablemente cuando hagan compatible con la versión 6 de Jetty el plugin de Eclipse <a title="Jetty Launcher" href="http://jettylauncher.sourceforge.net" target="_blank">Jetty Launcher</a>.</p>
<p>Existen otras formas de integración con los mismos ingredientes. Sin embargo esta es la que interesante me ha parecido, entre otras cosas porque no nos hemos tenido que preocupar ni de descargar Jetty.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/94/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
