<?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/"
	>

<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>Mon, 23 Jan 2012 08:38:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Trabajar con MySQL y utf-8 en PHP</title>
		<link>http://www.manuelrecena.com/blog/archives/1215</link>
		<comments>http://www.manuelrecena.com/blog/archives/1215#comments</comments>
		<pubDate>Tue, 13 Dec 2011 08:17:25 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[utf8]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=1215</guid>
		<description><![CDATA[Ayer mientras trabajábamos en la nueva versión de mivecindad.com tuvimos que importar al modelo de datos el listado de países del mundo en varios idiomas. Esta información la obtuvimos de Geonames en formato XML (también hay otros formatos). La primera opción fue usar LOAD XML de MySQL, pero la versión de MySQL que tenía en [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer mientras trabajábamos en la nueva versión de <a title="Herramienta social para comunidades de vecinos" href="http://mivecindad.com" target="_blank">mivecindad.com</a> tuvimos que importar al modelo de datos el listado de países del mundo en varios idiomas. Esta información la obtuvimos de <a title="The GeoNames geographical database covers all countries and contains over eight million placenames that are available for download free of charge." href="http://www.geonames.org" target="_blank">Geonames</a> en formato XML (también hay otros formatos). La primera opción fue usar <strong>LOAD XML</strong> de MySQL, pero la versión de MySQL que tenía en mi entorno no soportaba este comando. Fue entonces cuando decidí hacer un pequeño script en PHP para procesar el archivo XML y posteriormente insertarlo en la base de datos. De ahí obtuve el SQL que podré reutilizar en otros proyectos y compartirlo con nuestros compañeros de <a title="Sitio web de Toolea" href="http://www.toolea.com" target="_blank">Toolea</a>.</p>
<p>El motivo de escribir esta pequeña entrada es para que no se me olvide que si queremos trabajar con MySQL y utf-8, y lo hacemos usando en API de PHP (sin librerías ni frameworks) no se nos puede olvidar indicar que nuestra sesión con MySQL (que actúa de cliente) use utf-8. Por muy a pesar de que MySQL tenga configurado en el servidor que su encoding por defecto sea utf-8. Eso sirve, entre otras cosas, para la creación de nuevos esquemas.</p>
<p>Os dejo un ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$xml</span> <span style="color: #339933;">=</span> <span style="color: #990000;">simplexml_load_file</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/home/recena/countries_es.xml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$link</span> <span style="color: #339933;">=</span>  <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'mivecindad'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No pudo conectarse: '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SET NAMES 'utf8';&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$xml</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$capital</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">capital</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;INSERT INTO MV_PAIS (CAPITAL) VALUES('&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$capital</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;')&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Invalid query: '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">mysql_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/1215/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Librerías para trabajar con JSON en PHP</title>
		<link>http://www.manuelrecena.com/blog/archives/1029</link>
		<comments>http://www.manuelrecena.com/blog/archives/1029#comments</comments>
		<pubDate>Sat, 02 Apr 2011 18:56:32 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=1029</guid>
		<description><![CDATA[La semana pasada, mientras trabajaba en el sitio web de mivecindad.com necesité trabajar con JSON dado que la capa de servicios que tiene la aplicación así lo requiere. La comunicación entre el sitio web y la aplicación es muy básica, un formulario recoge los datos para registrar una comunidad, se genera el JSON, se envía [...]]]></description>
			<content:encoded><![CDATA[<p>La semana pasada, mientras trabajaba en el sitio web de <a title="Información sobre el proyecto" href="http://blog.klicap.es/productos/mivecindad" target="_blank">mivecindad.com</a> necesité trabajar con JSON dado que la capa de servicios que tiene la aplicación así lo requiere. La comunicación entre el sitio web y la aplicación es muy básica, un formulario recoge los datos para registrar una comunidad, se genera el JSON, se envía y posteriormente se valida el resultado de la operación.</p>
<p>Para el sitio web <a title="Información sobre klicap" href="http://blog.klicap.es/conocenos" target="_blank">estamos</a> usando <a title="Sitio web del framework" href="http://www.yiiframework.com" target="_blank">yii framework</a> y el pequeño modelo (datos) que necesitamos (persona, dirección, comunidad) se construye según <a title="Referencia a la documentación" href="http://www.yiiframework.com/doc/guide/1.1/en/form.model" target="_blank">la propuesta</a> del framework. Me dejé llevar pensado que luego tendría la posibilidad de generar mi JSON según lo requiere el servicio y me encontré bastante limitado.</p>
<p>En mi entorno de desarrollo tengo compilado PHP con <a title="Información sobre el soporte de JSON en PHP" href="http://php.net/manual/en/ref.json.php" target="_blank">soporte</a> (nativo, parte del core de PHP) para JSON. Lo probé, no conseguí hacer lo que necesitaba sin reinventar la rueda en el framework, y decidí buscar algo de información para conocer qué otras opciones tenía. La idea era encontrar alguna librería que me permitiese manipular JSON con mayor flexibilidad.</p>
<ol>
<li><a title="Información sobre la extensión" href="http://pecl.php.net/package/json" target="_blank">Extensión de PECL</a>. Realmente no es una opción porque esta extensión es la que ahora forma parte del core de PHP y está muy limitada.</li>
<li><a title="Información sobre el paquete de PEAR" href="http://pear.php.net/package/Services_JSON" target="_blank">Service JSON</a>. Un paquete de PEAR cuya última versión fue publicada a comienzos de este año. Al igual que la anterior, muy limitada.</li>
<li><a title="Referencia a la documentación de Zend Framework" href="http://framework.zend.com/manual/en/zend.json.html" target="_blank">Zend_JSON</a>. Realmente tampoco era una opción porque no estoy usando Zend framework, pero es bueno saber que está ahí.</li>
</ol>
<p>Hay algunas (pocas) opciones más pero ninguna hacía lo que necesitaba. Tengo que reconocer que vengo muy condicionado porque en Java sí existen librerías que permiten una mayor manipulación en la codificación. Concretamente en nuestros últimos proyectos estamos usando <a title="Sitio web de la librería" href="http://flexjson.sourceforge.net" target="_blank">FlexJSON</a> (v.2.0b4, aunque ya está publicada la v2.1).</p>
<p>¿Realicé una mala búsqueda de información o realmente lo que está publicado se limita a decode/encode? Cualquier sugerencia será bienvenida para completar esta pequeña entrada en el blog.</p>
<p>Finalmente decidí hacer algo muy simple pero no por ello menos eficaz. Comprobé que si en lugar de trabajar con objetos, trabajaba con un array asociativo, podía obtener el JSON que necesitaba, por lo tanto, creé dicho array a partir de los datos almacenados en el modelo (clases de yii framework). Dejo una última <a title="Comparativa entre librerías de JSON en PHP" href="http://gggeek.altervista.org/sw/article_20070425.html" target="_blank">referencia</a> con una comparativa interesante.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/1029/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalación de OAuth (PHP Extension)</title>
		<link>http://www.manuelrecena.com/blog/archives/1017</link>
		<comments>http://www.manuelrecena.com/blog/archives/1017#comments</comments>
		<pubDate>Sat, 05 Mar 2011 14:55:55 +0000</pubDate>
		<dc:creator>Manuel Jesús Recena Soto</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[php oauth pear pecl]]></category>

		<guid isPermaLink="false">http://www.manuelrecena.com/blog/?p=1017</guid>
		<description><![CDATA[Desarrollando en sitio web de mivecindad.com nos surgió la necesidad de integrar el timeline de la cuenta en twitter de @mivecindad. Para este desarrollo estamos usando Yii Framework y la extensión que hay no soporta OAuth. Hemos decidido modificar la extensión para añadir esta mejora. Como recordatorio, y por si a alguien le pudiera ser [...]]]></description>
			<content:encoded><![CDATA[<p>Desarrollando en sitio web de <a title="mivecindad.com" href="http://mivecindad.com" target="_blank">mivecindad.com</a> nos surgió la necesidad de integrar el timeline de la cuenta en twitter de <a href="http://twitter.com/mivecindad">@mivecindad</a>. Para este desarrollo estamos usando <a title="Sitio web del framework de PHP" href="http://www.yiiframework.com" target="_blank">Yii Framework</a> y la <a title="Información sobre la extensión que integra el timeline de twitter en Yii" href="http://www.yiiframework.com/extension/twitter-full-featured-extension" target="_blank">extensión</a> que hay no soporta OAuth. Hemos decidido modificar la extensión para añadir esta mejora.</p>
<p>Como recordatorio, y por si a alguien le pudiera ser de interés, algunos apuntes sobre la instalación. Indicar que para este entorno de desarrollo estoy usando Ubuntu y tirando de paquetes (nada de compilar por raro que parezca en mi):</p>
<ol>
<li>Comprobar que tenéis <a title="Sitio web del proyecto PEAR" href="http://pear.php.net" target="_blank">PEAR</a> y en caso negativo instalarlo.</li>
<li>Comprobar que tenéis el paquete de desarrollo de PHP (php5-dev). Nos daremos cuenta fácilmente que lo necesitamos porque durante la compilación de la extensión nos dirá que no encuentra la herramienta phpize.</li>
<li>[opcional] Comprobar que tenéis CURL y su paquete de desarrollo</li>
<li>Instalación de la extensión: sudo pecl install oauth</li>
<li>En el directorio /etc/php5/conf.d creamos un archivo llamado oauth.ini (podéis llamarlo como queráis) e incluis la siguiente línea:
<pre>extension=/usr/lib/php5/20060613+lfs/oauth.so</pre>
</li>
<li>Reiniciamos el servidor web e invocamos al conocido testphp.php con su llamada a phpinfo() para asegurarnos de que la extensión está disponible y se ha cargado correctamente.</li>
</ol>
<p>Le enviaré al <a title="Sitio web del autor" href="http://www.vadimg.com" target="_blank">autor</a> de la extensión (yii) nuestros cambios confiando que aplique el parche y publique una nueva versión. Leyendo un poco en su blog he podido comprobar que está trabajando en una herramienta de gestión de proyectos similar a Trac y Redmine. Le seguiré el rastro para ver su evolución.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.manuelrecena.com/blog/archives/1017/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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 [...]]]></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>2</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 [...]]]></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>
	</channel>
</rss>

