<?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>Notas de ant30</title>
	<atom:link href="http://www.ant30.es/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ant30.es</link>
	<description>Quién sabe cómo has llegado hasta aquí</description>
	<lastBuildDate>Tue, 31 Jan 2012 18:47:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Clonando máquinas virtuales con virt-clone</title>
		<link>http://www.ant30.es/2012/01/clonando-maquinas-virtuales-con-virt-clone/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=clonando-maquinas-virtuales-con-virt-clone</link>
		<comments>http://www.ant30.es/2012/01/clonando-maquinas-virtuales-con-virt-clone/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 18:47:20 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Virtualización]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[libvirt]]></category>
		<category><![CDATA[qcow2]]></category>
		<category><![CDATA[qemu]]></category>
		<category><![CDATA[virt-manager]]></category>

		<guid isPermaLink="false">http://www.ant30.es/?p=189</guid>
		<description><![CDATA[En el post anterior, Creando una imagen plantilla de Debian y derivados para kvm, ya vimos lo fácil que era crear imágenes de sistemas virtualizados a través de imágenes skels o plantillas y concluíamos creando la máquina mediante virt-install. También &#8230; <a href="http://www.ant30.es/2012/01/clonando-maquinas-virtuales-con-virt-clone/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En el post anterior, <a href="http://www.ant30.es/2011/12/creando-una-imagen-plantilla-de-debian-y-derivados-para-kvm/" title="Creando una imagen plantilla de Debian y derivados para kvm" target="_blank">Creando una imagen plantilla de Debian y derivados para kvm</a>, ya vimos lo fácil que era crear imágenes de sistemas virtualizados a través de imágenes skels o plantillas y concluíamos creando la máquina mediante virt-install. También comenté que era posible realizarlo con virt-clone.</p>
<p>Virt-clone aún no soporta el tratamiento de snapshots o backing image directamente. De momento, lo que sí que podemos hacer si ya tenemos la imagen creada y el dominio virtualizado disponible en libvirt es invocar al clonado, indicando que queremos preservar los datos de la imagen destino. En nuestro caso, la imagen destino la indicaremos nosotros y se correspondeerá con la imagen del sistema nuevo.</p>
<p>Como ventajas tenemos que copiaremos los datos de ram, cpu, tarjetas de red, contexto selinux/apparmor y el resto de configuraciones del dominio xml asociado a la máquina virtual. Por tanto, resulta interesante principalmente para máquinas con muchos añadidos de configuración.</p>
<p><span id="more-189"></span></p>
<p>Recordamos el proceso de clonación de usando plantillas:</p>
<ul>
<li>Dirigiéndonos a nuestro almacen de imágenes. Congelamos la imagen plantilla quitando permisos de escritura.</li>
<pre class="crayon-plain-tag"><code>chmod -r ubuntu1110-master.img</code></pre>
<li> Indicamos que queremos crear una nueva imagen de disco basándonos en la plantilla</li>
<pre class="crayon-plain-tag"><code>qemu-img create -f qcow2 -b ubuntu1110-master.img ubuntu1110-clon.img</code></pre>
<li> Usamos virt-clone para crear la nueva réplica. Con características similares a la máquina original, en este caso, cambian la mac de la máquina y el UUID del dominio.</li>
<pre class="crayon-plain-tag"><code>virt-clone -n ubuntu1110-clon -o ubuntu1110  -f ubuntu1110-clon.img --preserve-data</code></pre><p></ul>
<p>En algunos casos puede ser que tengamos que forzar a que se conecte con el libvirt local, en este caso, lo ejecutamos de esta forma:</p>
<pre class="crayon-plain-tag"><code>virt-clone --connect qemu:///system -n ubuntu1110-clon -o ubuntu1110 -f ubuntu1110-clon.img --preserve-data</code></pre>
<p>En nuestro caso, como queremos lanzar un clon de forma rápida, ha sido necesario el comando <code>--preserve-data</code>. Sin embargo, si queremos que la imagen sea independiente, se puede hacer sin la opción <code>--preserve-data</code>. La operación durará varios minutos porque revisará todos los mapas de bloques vacíos para resumir el espacio de la nueva imagen de disco.</p><pre class="crayon-plain-tag"><code>virt-clone --connect qemu:///system -o ubuntu1110 -n ubuntu1110-clon2 -f ubuntu1110-clon2.img</code></pre><p>El comando nos muestra el progreso de la ejecución en la salida incluyendo un tiempo estimado de finalización y el porcentaje.</p>
<p>Virt-clone pertenece al grupo de utilidades de gestión de virtualización <a title="virt-manager" target="_blank" href="http://virt-manager.org/">virt-manager</a> que funcionan haciendo uso de la api <a title="libvirt" target="_blank"  href="http://libvirt.org">libvirt</a>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2012/01/clonando-maquinas-virtuales-con-virt-clone/" data-text="Clonando máquinas virtuales con virt-clone"data-count="vertical" data-via="ant30" data-lang="es" data-related="kvm,libvirt,qcow2,qemu,virt-manager""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2012/01/clonando-maquinas-virtuales-con-virt-clone/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2012/01/clonando-maquinas-virtuales-con-virt-clone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creando una imagen plantilla de Debian y derivados para kvm</title>
		<link>http://www.ant30.es/2011/12/creando-una-imagen-plantilla-de-debian-y-derivados-para-kvm/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creando-una-imagen-plantilla-de-debian-y-derivados-para-kvm</link>
		<comments>http://www.ant30.es/2011/12/creando-una-imagen-plantilla-de-debian-y-derivados-para-kvm/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 20:48:40 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Virtualización]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[libvirt]]></category>
		<category><![CDATA[qcow2]]></category>
		<category><![CDATA[qemu]]></category>

		<guid isPermaLink="false">http://www.ant30.es/?p=176</guid>
		<description><![CDATA[¿Qué es una imagen plantilla? Imagen Skel, plantilla, Imagen Gold, template, Appliance, base, .. todo estos términos se acaban refiriendo a lo mismo. En los sistemas de virtualización más habituales, tenemos la posibilidad de guardar el disco duro del sistema &#8230; <a href="http://www.ant30.es/2011/12/creando-una-imagen-plantilla-de-debian-y-derivados-para-kvm/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>¿Qué es una imagen plantilla?</h2>
<p>Imagen Skel, plantilla, Imagen Gold, template, Appliance, base, .. todo estos términos se acaban refiriendo a lo mismo. En los sistemas de virtualización más habituales, tenemos la posibilidad de guardar el disco duro del sistema virtualizado en nuestro propio disco duro en una imagen que habitualmente contiene unos metadatos de información como por ejemplo el tamaño del disco y además contiene lo que sería equivalente al disco duro físico de la máquina virtual. Existen múltiples formatos de imagen de disco como vmdk, vdi, raw, qcow2 o qed. En nuestro caso, vamos a usar qcow2 y porque es el formato más estable para el sistema de virtualización que vamos a usar, libvirt con kvm.</p>
<p>Si solemos trabajar con sistemas virtualizados, es bastante habitual tener múltiples máquinas con una misma versión de debian, aunque luego tengan software diferente. También puede resultar que tengamos todo el sistema y una aplicación desplegada en muchas máquinas, de forma que luego solo hacemos algunas personalizaciones sobre la aplicación. Es decir, que realmente estas máquinas comparten mucha información como sistema operativo y aplicaciones. Intentar evitar la repetición de información compartida es el objetivo de las imágenes gold o plantillas. Pero no solo por evitar la duplicidad de información, sino para conseguir ahorrar tiempo en la creación de nuevas máquinas virtuales de características similares.</p>
<p>A continuación veremos una forma de reducir drásticamente el tiempo de creación de nuevas máquinas virtuales a través de imágenes plantilla.<br />
<span id="more-176"></span></p>
<h2>Un ejemplo</h2>
<p>Imagina que te necesitas 10 máquinas virtuales con debian squeeze, y por tanto, tuvieras que instalar debian 10 veces. Qué pérdida de tiempo ¿no?</p>
<p>Una posible solución, y suele ser la primera solución que hemos hecho alguna vez todos, es tras acabar de instalar debian en esa imagen, copiarla 9 veces. Con un disco duro medianamente rápido conseguimos una tasa de copia en un mismo disco de 40MB/s, te puedes ir a tomar un café mientras se termina la copia y quizás cuando vuelvas aún no haya terminado.</p>
<p>Tras arrancar cada una de las nuevas 9 máquinas es posible que nos encontremos sin red, porque se nos habrá creado una nueva interfaz de red que no está contemplada en la configuración (/etc/network/interfaces) para que se active durante el arranque. Esto ocurre porque la MAC de la tarjeta de red de la nueva máquina virtual es diferente a la que se generó primero.  Para solucionar esto, basta con borrar el fichero /etc/udev/rules.d/70-persistent-net.rules y reiniciar.</p>
<p>Bien, ya tenemos las 10 máquinas arrancadas y con red, si hacemos un ssh y nos fijamos tenemos un nuevo problema. Todos los servidores tienen la misma key. Por tanto toca regenerarlas para cada servidor y reiniciar servicio ssh.</p>
<p>También puede resultar problemático que todas las máquinas tengan el mismo hostname y por tanto, al hacer ssh, todas tengan el mismo prompt, lo cual puede resultar confuso.</p>
<p>Por tanto, seguimos teniendo varios problemas. Larga espera para la copia de las imágenes y modificaciones manuales máquina a máquina. Necesitamos algo más práctico.</p>
<h2>Mejora 1: Reduciendo modificaciones manuales del primer arranque</h2>
<p>Una vez tenemos nuestra imagen preparada, recién instalada, antes de empezar a usarla como imagen plantilla, deberíamos intentar simplificar al máximo las tareas manuales a realizar durante el primer arranque. Además de limpiar de datos que no sean útiles para los futuros clones.</p>
<h3>Eliminar persistencia de nombres de dispositivos de red de udev</h3>
<p>Si estamos usando una imagen con una distribución debian o basada en debian como ubuntu, tendremos el problema de udev, así que lo ideal es siempre borrar el fichero /etc/udev/rules.d/70-persistent-net.rules para que cuando se arranque una copia de la máquina, se cree un nuevo fichero de nuevo. En VMware y XEN este problema no ocurre, pero sí con KVM. El problema radica en que el identificador del dispositivo en KVM es como el de un dispositivo real, ya sea Realtek o Intel, y con esto, udev, no puede distinguir cuando se está usando una interfaz virtual o no.</p>
<p>Actualmente, las reglas para inhibir la creación del fichero de persistencia para redes de KVM están en el fichero /lib/udev/rules.d/75-persistent-net-generator.rules pero también se puede apreciar como existen reglas para Realtek que entran en colisión. Por tanto, también puedes anular la regla de Realtek para se haga efectiva, pero entonces estarás modificando ficheros del paquete udev, práctica nada recomendable para futuras actualizaciones.</p>
<h3>Eliminar historial</h3>
<p>Dependiendo de nuestras necesidades o de quien pueda usar después la imagen que estamos preparando, lo ideal es borrar rastros como por ejemplo el fichero .bash_history de todos los usuarios.</p>
<p>Hay quien incluso limpiaría logs y otros restos.</p>
<h3>Preparar tareas para el primer arranque</h3>
<p>No existe o no conozco una forma elegante de programar una tarea que se ejecute solo en el próximo arranque. Así que lo que vamos a preparar es una forma poco intrusiva para llevarlo a cabo.</p>
<p>Creamos en /root un script llamado firstboot.sh con el siguiente contenido:</p>
<pre class="crayon-plain-tag"><code>#!/bin/bash
rm /etc/ssh/ssh_host_*
/usr/sbin/dpkg-reconfigure openssh-server</code></pre>
<p>En nuestro caso, solo vamos a regenerar las claves del servicio ssh.</p>
<p>Ahora, creamos un nuevo fichero en cron.d para que invoque a nuestro script al completar el arranque, por tanto creamos el fichero /etc/cron.d/firstboot con el siguiente contenido:</p>
<pre class="crayon-plain-tag"><code>@reboot root bash /root/firstboot.sh &amp;&amp; rm -f /etc/cron.d/firstboot /root/firstboot.sh</code></pre>
<p>Primero se ejecutará firstboot.sh y luego se borrará la entrada del cron y el script del primer arranque para que no se vuelvan a ejecutar.</p>
<p>Ya avisé que no era una forma muy elegante de hacerlo.</p>
<p>El script firstboot.sh descrito es lo mínimo, pero sería interesante recoger el hostname desde el DNS y aplicar el cambio, realizar las tareas para inicializar un sistema de gestión de configuración centralizada o cualquier otra tarea.</p>
<h3>Prepara tu entorno</h3>
<p>Una vez finalizada la instalación de debian, tenemos vi, pero no vim, basta con instalar el paquete, pero aprovechando que estamos haciendo nuestra template, deberíamos instalar esas cosas que siempre acabamos usando, y aquí va una lista de las cosas que suelo tener en mis imágenes plantillas independientemente de para qué se usen:</p>
<ul>
<li>El metapaquete vim-nox, o vim</li>
<li>Mi configuración de vim, .vimrc</li>
<li>Mis claves públicas ssh en /root/.ssh/authorized_keys para no tener que estar metiendo contraseñas en cada ssh</li>
<li>Un .bashrc con los alias que suelo usar</li>
<li>Screen y su configuración</li>
<li>¿Está instalado ssh server y aptitude? ¿Necesito sudo?</li>
<li>htop, un top mucho más cómodo</li>
<li>Algunos alias en el fichero /etc/hosts</li>
</ul>
<h2>Mejora 2: técnica alternativa al copiado de imágenes, backing images</h2>
<p>Estamos usando libvirt con kvm, que en definitiva se trata de qemu y por tanto, para la creación de imágenes, usamos qemu-img. Para crear una imagen nueva basada en nuestra plantilla es tan fácil como ir al directorio de imágenes y suponiendo que la imagen creada se llame debian6.img creamos un clon, debian6-clon.img, con el comando qemu-img como sigue:</p>
<pre class="crayon-plain-tag"><code>qemu-img create -f qcow2 -b debian6.img debian6-clon.img</code></pre>
<p>Tendremos la nueva imagen en segundos y el nuevo fichero debian6-clon.img ocupará solo unos kbytes. Esta nueva imagen irá almacenando bloques que se creen que no estén o hayan sido modificados respecto a la imagen base.</p>
<p>Como inconveniente, tenemos una bajada en el rendimiento de IO por los múltiples accesos a disco por cada petición. Este problema se puede solventar en gran medida si las plantillas las alojamos en discos SSD. Aún así, sino vamos a realizar pruebas de rendimiento, no debería suponer mucho problema.</p>
<p>Si vas a usar la propia imagen como backing image para el resto, recuerda quitar los permisos de escritura para que nunca se vuelva a arrancar, y si puede ser posible, deberías desvincularla de cualquier dominio libvirt. En caso de arranque, el resto de imágenes clonadas que se basen en tu backing image, perderán consistencia y dejarán de funcionar. Casi mejor, por tanto, tener cuidado con la imagen plantilla.</p>
<p>Por otro lado, si queremos convertir la imagen de este clon en imagen plantilla, deberíamos aplanarla, es decir, separarla de la imagen debian6.img fusionando sus datos en una nueva imagen que sea independiente. Esta nueva imagen independiente la podremos mover a otra ruta o incluso a otro servidor. Esto se consigue mediante el comando:</p>
<pre class="crayon-plain-tag"><code>qemu-img convert -f qcow2 -O qcow2  debian6-clone.img debian6-plana.img</code></pre>
<p>Que además, evitará poner en la nueva imagen bloques vacíos y por tanto puede ocupar menos de lo que uno espera.</p>
<h2>Creando una máquina virtual con virt-install usando la plantilla</h2>
<p>Entre las utilidades que solemos encontrar con libvirt, tenemos virt-install, que nos permite crear una máquina virtual desde bash, también podríamos crearla desde virt-manager de forma gráfica, pero en nuestro caso la vamos a crear mediante virt-install.</p>
<p>Suponiendo que tengamos la imagein debian6-clon.img creada en el punto anterior, en el directorio /var/lib/libvirt/images/ y teniendo en cuenta que este es el almacenamiento por defecto para las imágenes, para crear un sistema con 512MB de RAM y especificando que está basado en Debian Squeeze (debian 6), ejecutaríamos lo siguiente:</p>
<pre class="crayon-plain-tag"><code>sudo virt-install --name debian-clone --ram 512 --os-variant=debiansqueeze --disk /var/lib/libvirt/images/debian6-clone.img --import</code></pre>
<p>Se nos abrirá un visor vnc con virt-viewer para que podamos acceder, por ejemplo para ver si el script de primer arranque se ha ejecutado correctamente, o para conocer la IP de la máquina y poder acceder por ssh de un modo más cómodo.</p>
<p>Por tanto las nuevas réplicas, tanto por la clonación del disco, como del esquema XML de la máquina en libvirt se obtienen en segundos y las tendremos disponibles en nuestro Virt-Manager.</p>
<p>También podríamos usar virt-clone para la generación del XML, pero eso ya lo dejamos para otro día.
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2011/12/creando-una-imagen-plantilla-de-debian-y-derivados-para-kvm/" data-text="Creando una imagen plantilla de Debian y derivados para kvm"data-count="vertical" data-via="ant30" data-lang="es" data-related="debian,kvm,libvirt,qcow2,qemu,Virtualizaci%C3%B3n""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2011/12/creando-una-imagen-plantilla-de-debian-y-derivados-para-kvm/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2011/12/creando-una-imagen-plantilla-de-debian-y-derivados-para-kvm/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Este blog ya está migrado de Drupal 6 a WordPress 3</title>
		<link>http://www.ant30.es/2011/12/este-blog-ya-esta-migrado-de-drupal-6-a-wordpress-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=este-blog-ya-esta-migrado-de-drupal-6-a-wordpress-3</link>
		<comments>http://www.ant30.es/2011/12/este-blog-ya-esta-migrado-de-drupal-6-a-wordpress-3/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 13:43:27 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.ant30.es/?p=162</guid>
		<description><![CDATA[Tras 3 años con Drupal, ahora he migrado a WordPress. Teniendo en cuenta que solo se trata de un blog, necesito algo que sea más fácil de gestionar, actualizar, utilizar y creo que en eso WordPress gana de sobra a &#8230; <a href="http://www.ant30.es/2011/12/este-blog-ya-esta-migrado-de-drupal-6-a-wordpress-3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tras 3 años con Drupal, ahora he migrado a WordPress. Teniendo en cuenta que solo se trata de un blog, necesito algo que sea más fácil de gestionar, actualizar, utilizar y creo que en eso WordPress gana de sobra a Drupal. Me encantan las Views y los CCK de Drupal, pero es que realmente, para este tipo de blog no los estaba usando.</p>
<p>Existen unas cuantas formas de migrar de Drupal a WordPress, pero no todas contemplan todas las opciones. Lógicamente, migrar funcionalidades de los módulos principales es una tarea que acaba siendo manual.</p>
<p>En mi caso, tenía algunos requisitos mínimos sin los cuales, no podría considerar hacer la migración:</p>
<ul>
<li>Conservar todos los nodos de Drupal. En Drupal, las páginas, libros y entradas de blogs son nodos.</li>
<li>Conservar las taxonomías, pero no en categorías, sino transformándolas a tags.</li>
<li>Resaltado de sintáxis de código. Tengo varios posts con bloques de código, así que es imprescindible que sigan apareciendo con resaltado de sintaxis.</li>
<li>Migración de adjuntos, y en el caso de las imágenes, que por lo menos, sean visibles. No siempre están como html en el contenido, porque mediante el módulo img_filter, se visualizaban de forma automática en los posts.</li>
<li>Conservar los comentarios, aunque cambien un poco el formato. En drupal hay asunto del comentario y en WordPress no.</li>
<li>Solo hay un usuario, así que esto no debería suponer un problema.</li>
<li>Debe haber pocos 404 tras la migración.</li>
</ul>
<p>Esta no iba a ser mi primera migración entre diferentes softwares de servicios web, he realizado diferentes migraciones tanto a nivel profesional, en <a href="http://www.yaco.es">Yaco Sistemas</a>, como para diferentes proyectos personales u otros fines sin ánimos de lucro. En este caso, quiero un resultado no necesariamente profesional, pero sí que esos requisitos mínimos especificados arriba queden satisfechos. Así que como indica el sentido común para realizar migraciones en un sistema de producción, lo ideal es prepararse un entorno de desarrollo con una copia de los datos de producción. En este caso, preparé un chroot con un sistema operativo a donde está hosteado el blog y luego desplegué un clon de Drupal con un dump de la base de datos, y una base de WordPress para comenzar a realizar pruebas.</p>
<p><span id="more-162"></span></p>
<p>Las primeras pruebas que hice, eran pruebas de migración realizando modificaciones sobre el SQL siguiendo algunas guías que existen:</p>
<ul>
<li><a href="http://socialcmsbuzz.com/convert-import-a-drupal-6-based-website-to-wordpress-v27-20052009/">Post de Lincoln Hawks</a> en Socialcmsbuzz.com</li>
<li><a href="http://scurker.com/blog/2010/02/migration-from-drupal-6-x-to-wordpress-2-9x/">Migration from Drupal 6.x to WordPress 2.9x</a></li>
</ul>
<p>El problema con estos procesos de migración, son los adjuntos. En estos posts, se propone reemplazar las rutas de los tags img en el body, pero es que en mi caso hay tags para img_filters de tipo [img:01 yy:left] o sin ni siquiera tag, indicando en el adjunto como se debe publicar.</p>
<p>Al final, entre diversas pruebas, he optado por pasar por un formato intermedio, <a href="http://es.wikipedia.org/wiki/MovableType">MovableTypes</a> Viendo <a href="http://andrew.sterling.hanenkamp.com/2008/03/drupal-to-movable-type.html">este post</a> de Andrew Sterling parece bastante fácil manipular el body, los tags y el resto de información creando un nodo con contenido php en Drupal.</p>
<p>finalmente, mi código de exportación de Drupal, basándome en el publicado por Andrew Sterling, ha quedado como en el siguiente bloque. No es que sea bonito, pero es funcional:</p>
<pre class="crayon-plain-tag"><code>header('Content-type: text/plain');
$nids = db_query(&quot;select distinct n.nid from {node} n inner join {term_node} t on t.nid = n.nid&quot;);
while ($node = node_load(db_fetch_object($nids)-&gt;nid, NULL, TRUE)) {
  print &quot;AUTHOR: &quot;.$node-&gt;name.&quot;\n&quot;;
  print &quot;TITLE: &quot;.$node-&gt;title.&quot;\n&quot;;
  print &quot;STATUS: &quot;.($node-&gt;status?&quot;Publish&quot;:&quot;Draft&quot;).&quot;\n&quot;;
  print &quot;ALLOW COMMENTS: &quot;.($node-&gt;comment&gt;0).&quot;\n&quot;;
  print &quot;CONVERT BREAKS: 1\n&quot;;
  print &quot;ALLOW PINGS: &quot;.($node-&gt;comment&gt;0).&quot;\n&quot;;
  print &quot;DATE: &quot;.strftime(&quot;%m/%d/%Y %I:%M:%S %p&quot;, $node-&gt;created).&quot;\n&quot;;
  print &quot;CATEGORY: blog \n&quot;;
  print &quot;KEYWORDS: \n&quot;;
  foreach ($node-&gt;taxonomy as $vid =&gt; $term) {
    print $term-&gt;name.&quot;,&quot;;
  }
  foreach ($node-&gt;category as $category) {
    print $category-&gt;title.&quot;,&quot;;
  }
  print &quot;\n&quot;;
  print &quot;-----\n&quot;;
  print &quot;BODY:\n&quot;;

  $body = str_replace(&quot;&lt;python&gt;&quot;, &quot;[py]&quot;, $node-&gt;body);
  $body = str_replace(&quot;&lt;/python&gt;&quot;, &quot;[/py]&quot;, $body);

  $body = str_replace(&quot;&lt;bash&gt;&quot;, &quot;[sh]&quot;, $body);
  $body = str_replace(&quot;&lt;/bash&gt;&quot;, &quot;[/sh]&quot;, $body);

  $body = str_replace(&quot;&lt;code&gt;&quot;, &quot;&lt;pre class=&quot;crayon-plain-tag&quot;&gt;&lt;code&gt;&amp;quot;, $body);
  $body = str_replace(&amp;quot;&amp;lt;/code&amp;gt;&amp;quot;, &amp;quot;&lt;/code&gt;&lt;/pre&gt;&quot;, $body);

  $body = str_replace(&quot;/files/&quot;, &quot;/wp-content/uploads/&quot;, $body);

  $media_base = &quot;/wp-content/uploads/&quot;;

  $patterns = array(&quot;/\[img:01 align:left\]/s&quot;,
                    &quot;/\[img:vista-navegacion.png yy:float_left\]/s&quot;,
                    &quot;/&lt;\!-- break --&gt;/s&quot;,
                    &quot;/&lt;\!--break--&gt;/s&quot;,
                    &quot;/&lt;h3&gt;/s&quot;,
                    &quot;/&lt;\/h3&gt;/s&quot;
                     );

  $replace = array('&lt;img src=&quot;'.$media_base.'01_antes_de_comenzar.jpg&quot;/&gt;',
                   '&lt;img src=&quot;'.$media_base.'vista-navegacion.png&quot;/&gt;',
                   &quot;&lt;!--more--&gt;&quot;,
                   &quot;&lt;!--more--&gt;&quot;,
                    &quot;&lt;h2&gt;&quot;,
                    &quot;&lt;/h2&gt;&quot;
                   );

  $body = preg_replace($patterns, $replace, $body);

  print $body.&quot;\n&quot;;

  $uploads = db_query(&quot;select * from {upload} u where u.nid= %d and list = 1&quot;, $node-&gt;nid);
  while ($upload = db_fetch_object($uploads)) {
      $file_query = db_query(&quot;select * from {files} f where f.fid = %d&quot;, $upload-&gt;fid);
      $file = db_fetch_object($file_query);
      $file_url = str_replace(&quot;files/&quot;, &quot;/wp-content/uploads/&quot;, $file-&gt;filepath);
      $pos = stripos($body, $file_url);
      if ($pos === false){
        $pos_mime = stripos($file-&gt;filemime, &quot;image/&quot;);
        if ($pos_mime === false){
            print '&lt;a href=&quot;'.$file_url.'&quot;&gt;'.$file-&gt;name.'&lt;/a&gt;';
        }
        else {
            print '&lt;img alt=&quot;'.$file-&gt;filename.'&quot; src=&quot;'.$file_url.'&quot;/&gt;';
        }
        print &quot;\n&quot;;
      }
  }

  print &quot;-----\n&quot;;
  $comments = db_query(&quot;select * from {comments} c where c.nid = %d&quot;, $node-&gt;nid);
  while ($comment = db_fetch_object($comments)) {
    print &quot;-----\n&quot;;
    print &quot;COMMENT:\n&quot;;
    print &quot;AUTHOR: &quot;.$comment-&gt;name.&quot;\n&quot;;
    print &quot;EMAIL: &quot;.$comment-&gt;mail.&quot;\n&quot;;
    print &quot;IP: &quot;.$comment-&gt;hostname.&quot;\n&quot;;
    print &quot;URL: &quot;.$comment-&gt;homepage.&quot;\n&quot;;
    print &quot;DATE: &quot;.strftime(&quot;%m/%d/%Y %I:%M:%S %p&quot;, $comment-&gt;timestamp).&quot;\n&quot;;
    print $comment-&gt;subject.&quot;\n&quot;;
    print $comment-&gt;comment.&quot;\n&quot;;
  }
  print &quot;--------\n&quot;;
}
exit;
?&gt;</code></pre>
<p>Con este código, las imágenes adjuntas que no estaban insertadas con tags img ya sea de image_filter o html img, se añaden al final. En el caso de que el adjunto no sea una imagen, se incorpora un enlace. Es importante mover las imágenes del directorio drupal files, al de wordpress, /wp-content/uploads/</p>
<p>En los comentarios, el asunto de muestra en la primera línea, y luego se incorpora el body. También hay ciertas personalizaciones como la conversión del <em>break</em> de drupal al <em>more</em> de wordpress y otras conversiones <em>caseras</em>.</p>
<p>El único problema a resolver ahora está en las URL. En el script de Andrew, se incorporaban como categorías, de forma, que luego mediante un redirect a una búsqueda de wordpress, fuera fácil localizar el post. Sin embargo, esto acaba creando muchas categorías que no son útiles, y aunque se puedan usar módulos para ocultarlas, a la hora de publicar contenidos, estas categorías siguen apareciendo. En mi caso tengo 70 posts, así que si tenemos 2 tipos de urls, el permalink y la pretty url, tendríamos 140 categorías inválidas, demasiadas.</p>
<p>Como opción, finalmente, he escrito un pequeño script en php que haga un redirect a la url de búsqueda de wordpress si se detecta en apache una url con el formato de drupal. Este script sí que no lo publico, son 5 líneas que dan vergüenza.</p>
<p>También he tenido en cuenta en la migración la antigua url del feed de Drupal, que se cambia al nuevo formato de WordPress mediante un Redirect en Apache.</p>
<p>He cambiado el color de la cabecera a blanco y negro, en escala de grises, añadido los botones de twitter y google+ y Akismet y poco más. Esta es la historia de una migración de Drupal a WordPress.
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2011/12/este-blog-ya-esta-migrado-de-drupal-6-a-wordpress-3/" data-text="Este blog ya está migrado de Drupal 6 a WordPress 3"data-count="vertical" data-via="ant30" data-lang="es" data-related="Drupal,web,Wordpress""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2011/12/este-blog-ya-esta-migrado-de-drupal-6-a-wordpress-3/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2011/12/este-blog-ya-esta-migrado-de-drupal-6-a-wordpress-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TCOS ha entrado en Debian</title>
		<link>http://www.ant30.es/2011/12/tcos-ha-entrado-en-debian/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tcos-ha-entrado-en-debian</link>
		<comments>http://www.ant30.es/2011/12/tcos-ha-entrado-en-debian/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 00:43:37 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[escritorio]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[tcos]]></category>
		<category><![CDATA[thin-clients]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=73</guid>
		<description><![CDATA[He escrito una entrada sobre TCOS y su entrada en Debian en el blog de Yaco En la que he colaborado poniendo en contacto a Mario, desarrollador de TCOS con desarrolladores de Debian como GheRivero TCOS ya forma parte de &#8230; <a href="http://www.ant30.es/2011/12/tcos-ha-entrado-en-debian/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>He escrito una entrada sobre TCOS y su entrada en Debian en el <a href=http://www.yaco.es/blog>blog de Yaco</a> En la que he colaborado poniendo en contacto a Mario, desarrollador de TCOS con desarrolladores de Debian como GheRivero<br />
<a href=http://www.yaco.es/blog/virtualizacion/2011/12/tcos-ya-forma-parte-debian/>TCOS ya forma parte de Debian en el blog de Yaco</a><br />
Enhorabuena Mario.</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2011/12/tcos-ha-entrado-en-debian/" data-text="TCOS ha entrado en Debian"data-count="vertical" data-via="ant30" data-lang="es" data-related="escritorio,Linux,tcos,thin-clients""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2011/12/tcos-ha-entrado-en-debian/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2011/12/tcos-ha-entrado-en-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Puppet, gestión de configuración centralizada.</title>
		<link>http://www.ant30.es/2011/11/puppet-gestion-de-configuracion-centralizada/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=puppet-gestion-de-configuracion-centralizada</link>
		<comments>http://www.ant30.es/2011/11/puppet-gestion-de-configuracion-centralizada/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 13:48:39 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[puppet]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=72</guid>
		<description><![CDATA[Puppet es una herramienta gestión de configuraciones centralizada que nos ayudará en la laboriosa gestión de servidores cuando el número de estos empieza a crecer. Recientemente ha cambiado de licencia, de GPL a Apache a partir de la versión 2.7.0. &#8230; <a href="http://www.ant30.es/2011/11/puppet-gestion-de-configuracion-centralizada/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://puppetlabs.com/">Puppet</a> es una herramienta gestión de configuraciones centralizada que nos ayudará en la laboriosa gestión de servidores cuando el número de estos empieza a crecer.<br />
Recientemente ha cambiado de licencia, de GPL a Apache a partir de la versión 2.7.0. Está basado en Ruby, pero las descripciones de configuraciones se escriben en modo declarativo. Existen paquetes construidos que ya vienen en el sistema de paquetería para las principales distribuciones Linux, en nuestro caso usaremos Debian Squeeze y los paquetes a los que tenemos acceso en su repositorio. También tienen soporte para otros sistemas UNIX como Solaris, *BSD o Mac OS X. Y en desarrollo tienen un soporte básico de sistemas Windows. El desarrollo es público desde 2006 y destaca por su estabilidad y facilidad de manejo, aunque como todo este tipo de herramientas, la curva de aprendizaje, no es muy liviana.  Entre los principales clientes de la solución enterprise para empresas destacan empresas como Nokia, RackSpace, Zynga, Twitter, Digg, &#8230;<br />
En este post, veremos como configurar Puppet en Debian Squeeze y podremos ver dos ejemplos de aplicación de configuraciones.<br />
<span id="more-72"></span></p>
<h2>¿Porqué escribir sobre puppet?</h2>
<p>Nunca he profundizado en el uso puppet, nunca más allá que algunas de pruebas de concepto o funcionalidad y es por esta razón quiero escribir esta serie de posts, obligarme a conocer mucho mejor esta herramienta. En nuestro caso queremos usar puppet para controlar un entorno virtualizado con libvirt. Nuestro objetivo es controlar solo a Guests, es decir, máquinas virtuales, debido a que este es el entorno más heterogéneo y difícil de mantener, entre nuestros componentes Hosts/Guests. Se supone, que en un sistema de virtualización relativamente grande, todo está controlado mediante una herramienta de orquestado, ya seas herramientas basadas en VMWare como vCenter o vSphere o del tipo RedHat RHEV / Ovirt, Proxmox, Eucalyptus, OpenStack&#8230; Por tanto, los nodos de virtualización deberían estar bastante controlados.<br />
Para la siguiente prueba usaremos tres máquinas procedentes de una misma plantilla de kvm con una instalación de debian6 básica. En otro artículo hablaré sobre como crear templates de kvm, pero para nuestro caso, imagínate que son 3 máquinas virtuales recién instaladas usando virt-manager. En una de las máquinas instalaremos lo que se denomina Master, que será el servidor encargado de gestionar la configuraciones del resto.<br />
El objetivo de la prueba enviar un par de ficheros a los clientes, cliente1 y cliente2 a partir de ahora. Uno de estos ficheros tendrá un contenido diferente según sea el receptor del fichero cliente1 o cliente2.<br />
En la segunda prueba, instalaremos un par de paquetes y al igual que en la prueba anterior, nos aseguraremos de que el paquete 1 se instale en las dos máquinas, y que además, en el cliente1 se instale el paquete 2 y el paquete 3.<br />
Tras bucear un poco en la red, no he encontrado ninguna guía actualizada para debian 6 (squeeze), pero sí que he podido localizar muchas guías de introducción, con las que he ido recomponiendo este post.<br />
En mi caso, me ha ayudado bastante tanto la <a title="documentación de puppet" href=http://docs.puppetlabs.com/>documentación de puppet</a> como esta <a title="Introducción a Puppet de la Universidad de Florida" href=http://www.ctrip.ufl.edu/centralized-system-administration-debian-using-puppet>introducción de la Universidad de Florida</a>. Aunque en este último caso, los ejemplos hablan de debian lenny, es decir, una versión de debian anterior. Realmente, como veremos en los ejemplos, no hay mucha diferencia entre la configuración de Lenny y Squeeze, lo que nos permite confiar en la estabilidad del código.</p>
<h2> Antes de empezar </h2>
<p>Antes de empezar, nos debemos asegurar de que los nombres de las máquinas resuelven correctamente entre ellas. Esto nos permitirá olvidarnos de problemas con certificados y similares, que son difíciles de depurar después.<br />
En mi caso, las dos máquinas clientes, tienen en el /etc/hosts una línea que hace referencia al master, de forma que tiene un nombre del tipo master.cluster. Además, en la máquina master.cluster tengo registrado los nombres de los clientes como client1 y client2.<br />
Por tanto, para verificar que todo está correctamente en cuanto a DNS debemos asegurarnos que tenemos valores de este tipo para el comando hostname</p>
<pre class="crayon-plain-tag"><code>root@master:~# hostname
master
root@master:~# hostname -f
master.cluster</code></pre>
<p>Es un error muy habitual, que por ejemplo hostname -f nos de localhost o localhost.localdomain. Esto es debido a que la línea donde debemos especificar el alias hacia nuestra máquina, debe ser la primera del fichero /etc/hosts</p>
<h2> Preparando el master </h2>
<p>Instalamos el paquete puppetmaster.</p>
<pre class="crayon-plain-tag"><code># apt-get install puppetmaster</code></pre>
<p>Una vez la instalación haya finalizado, hay que configurar el directorio donde se compartiran los ficheros, así que rango de IPs tendrá acceso al directorio de ficheros y plugins.<br />
Abrimos el fichero fileserver.conf</p>
<pre class="crayon-plain-tag"><code># editor /etc/puppet/fileserver.conf</code></pre>
<p>Si estás usando libvirt para gestionar la máquina y usas la configuración de red que viene por defecto, tus máquinas virtuales tendrán una IP dentro del rango 192.168.122.0/24 . Por tanto, para nuestro ejemplo, usaremos este rango. Con esto, el fichero fileserver.conf quedaría de esta forma:</p>
<pre class="crayon-plain-tag"><code>[files]
path /etc/puppet/files
allow 192.168.122.0/24
[plugins]
allow 192.168.122.0/24</code></pre>
<p>También puedes usar nombres DNS, o directamente, permitir a todo el mundo con una regla del tipo allow *. Puedes ver más información en la doc de <a href=http://docs.puppetlabs.com/guides/file_serving.html>puppetlab</a> sobre este fichero de configuración.<br />
Ahora vamos a crear los ficheros básicos de manifest casi vacíos.<br />
Primero creamos el fichero /etc/puppet/manifests/nodes.pp</p>
<pre class="crayon-plain-tag"><code>node pruebanode {
}
node 'client1.cluster' inherits pruebanode {
}
node 'client2.cluster' inherits pruebanode {
}</code></pre>
<p>Para que este fichero sea tomado en cuenta, hay que crear el fichero /etc/puppet/manifests/site.pp e incluir el fichero nodes.pp que hemos comentado antes. En las reglas de estilo de puppet indican que además habría que crear en este directorio un fichero modules.pp e importarlo desde site.pp, pero en nuestro caso no va a ser necesario porque los modulos que crearemos se importarán automáticamente.<br />
Este es el contenido del fichero /etc/puppet/manifests/site.pp</p>
<pre class="crayon-plain-tag"><code>import &quot;nodes&quot;</code></pre>
<p>También es conveniente saber que el nombre del servicio en el servidor es puppetmaster. Por tanto, para reiniciarlo, ejecutaríamos algo como:</p>
<pre class="crayon-plain-tag"><code># service puppetmaster restart</code></pre>
<h2> Preparando los clientes </h2>
<p>Este proceso lo repetiremos en cada uno de las máquinas que queremos controlar.<br />
Instalamos el paquete puppet</p>
<pre class="crayon-plain-tag"><code># apt-get install puppet</code></pre>
<p>Revisamos el fichero de configuración del cliente, que debería lucir así:</p>
<pre class="crayon-plain-tag"><code>root@client1:~# cat /etc/puppet/puppet.conf
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
[agent]
server=master.cluster</code></pre>
<p>Para que pueda funcionar puppetd, el demonio que funciona en los clientes, es necesario habilitarlo. Hay que editar el fichero /etc/default/puppet</p>
<pre class="crayon-plain-tag"><code># editor /etc/default/puppet</code></pre>
<p>Y debemos asegurarnos que START está confirado como yes<br />
Arrancamos el servicio puppet con service</p>
<pre class="crayon-plain-tag"><code># service puppet start</code></pre>
<p>Una vez realizado esto, nos debemos fijar en el syslog del cliente, si vemos líneas con información como esta:<br />
<em><br />
Could not request certificate: Retrieved certificate does not match private key; please remove certificate from server and regenerate it with the current key<br />
</em><br />
Está claro que algo no está funcionando. Verifica la configuración de DNS antes de instalar como comenté en la sección de Antes de empezar<br />
Ahora procedemos a verificar desde el master que se han registrado correctamente los identificadores de las firmas de los clientes:</p>
<pre class="crayon-plain-tag"><code>root@master:~# puppet cert --list --all
client1.cluster (00:00:ssl_fingerprint:00:00)
client2.cluster (00:00:ssl_fingerprint:00:00)
+ master.cluster (00:00:ssl_fingerprint:00:00)</code></pre>
<p>Tenemos que firmar los certificados de los clientes</p>
<pre class="crayon-plain-tag"><code>root@master:~# puppet cert --list
client2.cluster
client1.cluster
root@master:~# puppet cert --sign client1.cluster
notice: Signed certificate request for client1.cluster
notice: Removing file Puppet::SSL::CertificateRequest client1.cluster at '/var/lib/puppet/ssl/ca/requests/client1.cluster.pem'
root@master:~# puppet cert --sign client2.cluster
notice: Signed certificate request for client2.cluster
notice: Removing file Puppet::SSL::CertificateRequest client2.cluster at '/var/lib/puppet/ssl/ca/requests/client2.cluster.pem'</code></pre>
<h2> Creación de un módulo básico y asignación de clientes al módulo </h2>
<p>Podemos tener varios módulos. En un módulo es donde definiremos todas las configuraciones y ficheros de un perfil de máquinas. También se puede tener una configuración determinada. Como ejemplo, podríamos tener un módulo para configurar un LAMP y luego otro para poder desplegar Drupal en el LAMP. Puedes ver más información en <a href=http://projects.puppetlabs.com/projects/puppet/wiki/Puppet_Modules>La doc de puppet</a><br />
Creamos la estructura básica:</p>
<pre class="crayon-plain-tag"><code>mkdir -p /etc/puppet/modules/prueba/{manifests,files,templates}</code></pre>
<p>Creamos un fichero vacío donde pondremos luego la receta de puppet</p>
<pre class="crayon-plain-tag"><code>touch /etc/puppet/modules/prueba/manifests/init.pp</code></pre>
<p>Ahora editamos el fichero de configuración de nodos. Este fichero lo tendremos en la ruta  /etc/puppet/manifests/nodes.pp y deberá tener este aspecto:</p>
<pre class="crayon-plain-tag"><code>node pruebanode {
include prueba
}
node 'client1.cluster' inherits pruebanode {
}
node 'client2.cluster' inherits pruebanode {
}</code></pre>
<p>Con esto, tendremos el modulo prueba aplicado a client1 y client2.</p>
<h2> Prueba 1: Distribución de ficheros </h2>
<p>La primera prueba que realizaremos será colocar un fichero en una ruta en concreto de las dos máquinas.<br />
En el directorio /etc/puppet/prueba/files creamos un fichero llamado ficherodeprueba que contiene solo la siguiente frase: &#8220;esto es un fichero de prueba&#8221;<br />
Ahora nos dirigimos al init.pp del módulo prueba en /etc/puppet/modules/prueba/manifests/init.pp y ponemos el siguiente contenido</p>
<pre class="crayon-plain-tag"><code>class prueba {
file { &quot;/root/ficherodeprueba&quot;:
owner   =&gt; root,
group   =&gt; root,
mode    =&gt; 400,
source  =&gt; &quot;puppet:///modules/prueba/ficherodeprueba&quot;,
}
}</code></pre>
<p>Normalmente, la configuración puede tardar bastante tiempo en aplicarse, para forzarla vamos a ejecutar el siguiente puppetrun en el master.<br />
Además, si queremos verificar si funciona, puede ser de utilidad ejecutar el proceso de actualización de forma manual y en modo de depuración, para esto ejecutaríamos en el cliente:</p>
<pre class="crayon-plain-tag"><code>root@client1:~# puppetd -vt &amp;&amp; ls
info: Caching catalog for client1.cluster
info: Applying configuration version '1322082679'
notice: Finished catalog run in 0.05 seconds
ficherodeprueba</code></pre>
<h2> Prueba 2: Instalación de software procedente de paquetería </h2>
<p>En esta prueba, vamos a instalar un paquete diferente en cada máquina. En client1 instalaremos nginx y en client2 instalaremos el paquete memcached<br />
Comenzamos con la creación del módulo para instalar nginx. Lo vamos a llamar httpd y empezamos creando la estructura de directorios en el master:</p>
<pre class="crayon-plain-tag"><code># mkdir -p /etc/puppet/modules/httpd/{manifests,files,templates}</code></pre>
<p>Ahora en files crearemos un fichero estático para ser servido por nginx. Creamos el fichero en /etc/puppet/modules/httpd/wp-content/uploads/texto y añadimos unas cuantas líneas de texto plano.<br />
Hay que crear el manifiest en /etc/puppet/modules/httpd/manifests/init.pp con el siguiente contenido:</p>
<pre class="crayon-plain-tag"><code>class httpd {
package { &quot;nginx&quot;: ensure =&gt; latest,
}
file { &quot;/var/www/texto&quot;:
owner =&gt; &quot;www-data&quot;,
group =&gt; &quot;www-data&quot;,
mode =&gt; 640,
ensure =&gt; present,
source =&gt; &quot;puppet:///httpd/texto&quot;;
}
service { &quot;nginx::server&quot;:
name =&gt; nginx,
ensure =&gt; running,
enable =&gt; true,
}
}</code></pre>
<p>En este manifest, tenemos tres pasos. Primero instalamos el paquete nginx, después incorporamos un fichero en un ruta de servicio y después arrancamos el servicio nginx y nos aseguramos de que esté arrancado.<br />
Para que se aplique esta ejecución en el servidor client1, tenemos que incorporar la asignación en el fichero /etc/puppet/manifests/nodes.pp con lo que el fichero quedaría como sigue:</p>
<pre class="crayon-plain-tag"><code>node pruebanode {
include prueba
}
node 'client1.cluster' inherits pruebanode {
include httpd
}
node 'client2.cluster' inherits pruebanode {
}</code></pre>
<p>Esta vez solo lo hemos incorporado en client1.cluster para que solo se instale en este servidor.<br />
Una vez salvemos este fichero, cuando toque actualizar, o si forzamos simplemente reiniciando el agente en el cliente con service puppet restart, podremos ver si se ha instalado el paquete nginx, si está funcionando y si además, se puede acceder al fichero de texto que hemos enviado.<br />
Ahora vamos con la instalación memcached, creamos los directorios necesarios:</p>
<pre class="crayon-plain-tag"><code># mkdir -p /etc/puppet/modules/memcached/{manifests,files,templates}</code></pre>
<p>Hay que crear el manifiest en /etc/puppet/modules/memcached/manifests/init.pp con el siguiente contenido:</p>
<pre class="crayon-plain-tag"><code>class memcached {
package { &quot;memcached&quot;: ensure =&gt; latest,
}
service { &quot;memcached::server&quot;:
name =&gt; memcached,
ensure =&gt; running,
enable =&gt; true,
}
}</code></pre>
<p>Tras guardar, añadimos tal y como hicimos con nginx (httpd) en site.pp, este módulo en la parte de client2, con una línea que contenga include memcached . Una vez hecho esto, es cuestión de esperar a que se apliquen los cambios, o forzar a que se apliquen reiniciando el agente en el cliente.<br />
Pues sí que quedó largo al final.</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2011/11/puppet-gestion-de-configuracion-centralizada/" data-text="Puppet, gestión de configuración centralizada."data-count="vertical" data-via="ant30" data-lang="es" data-related="Linux,puppet,software""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2011/11/puppet-gestion-de-configuracion-centralizada/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2011/11/puppet-gestion-de-configuracion-centralizada/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mis impresiones sobre la Apache Barcamp 2011 celebrada en Sevilla</title>
		<link>http://www.ant30.es/2011/10/mis-impresiones-sobre-la-apache-barcamp-2011-celebrada-en-sevilla/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mis-impresiones-sobre-la-apache-barcamp-2011-celebrada-en-sevilla</link>
		<comments>http://www.ant30.es/2011/10/mis-impresiones-sobre-la-apache-barcamp-2011-celebrada-en-sevilla/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 02:16:25 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[yaco]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=71</guid>
		<description><![CDATA[He publicado un post en el blog de Yaco sobre la Apache Barcamp celebrada este fin de semana en Sevilla.Yaco en la Apache Barcamp España 2011 en Sevilla {lang: 'es'}]]></description>
			<content:encoded><![CDATA[<p>He publicado un post en el <a href="http://www.yaco.es/blog">blog de Yaco</a> sobre la Apache Barcamp celebrada este fin de semana en Sevilla.<a href="http://www.yaco.es/blog/yaco/2011/10/yaco-en-apache-barcamp-espana-2011-en-sevilla/">Yaco en la Apache Barcamp España 2011 en Sevilla</a>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2011/10/mis-impresiones-sobre-la-apache-barcamp-2011-celebrada-en-sevilla/" data-text="Mis impresiones sobre la Apache Barcamp 2011 celebrada en Sevilla"data-count="vertical" data-via="ant30" data-lang="es" data-related="eventos,yaco""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2011/10/mis-impresiones-sobre-la-apache-barcamp-2011-celebrada-en-sevilla/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2011/10/mis-impresiones-sobre-la-apache-barcamp-2011-celebrada-en-sevilla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hay que seguir de cerca al proyecto ownCloud</title>
		<link>http://www.ant30.es/2011/10/hay-que-seguir-de-cerca-al-proyecto-owncloud/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hay-que-seguir-de-cerca-al-proyecto-owncloud</link>
		<comments>http://www.ant30.es/2011/10/hay-que-seguir-de-cerca-al-proyecto-owncloud/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 15:15:42 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=70</guid>
		<description><![CDATA[Pon un ownCloud y tendrás un sistema web para compartir ficheros. Bueno, eso era antes, ya se ha publicado la versión 2.0 y ahora es algo más que compartir ficheros. Tienes la posibilidad de escuchar tu música almacenada en el &#8230; <a href="http://www.ant30.es/2011/10/hay-que-seguir-de-cerca-al-proyecto-owncloud/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Pon un <a href=http://owncloud.org/>ownCloud</a> y tendrás un sistema web para compartir ficheros. Bueno, eso era antes, ya se ha publicado la versión 2.0 y ahora es algo más que compartir ficheros. Tienes la posibilidad de escuchar tu música almacenada en el servidor, tener un listado de marcadores web o bookmarks, un calendario y una agenda. Lo tienes en tu servidor y funciona incluso en sharing hostings baratos tipo DreamHost. Con licencia AGPL<br />
<img src="/wp-content/uploads/vista-navegacion.png"/><br />
Lo que me gusta es su simpleza, si tienes disponible un servidor web con php5, conseguir que funcione es muy fácil. Descomprimir y acceder a la url correcta. Al acceder la primera vez nos pide el nombre del usuario administrador y crea la base de datos en sqlite. Y ya queda listo para usar.<br />
Soporta webdav para poder exportar los contenidos. De esta forma, si el servidor donde lo tenemos desplegando lo permite, podremos disponer de acceso desde un navegador de ficheros, ya sea usando davfs2 para montarlo o accediendo desde gnome o kde. No he conseguido que me funcione correctamente el uso de webdav y nginx, pero es que realmente, el soporte de webdav en nginx está aún muy verde.<br />
En esta base de datos se controlan los usuarios y las quotas de disco de cada uno. También se pueden tener grupos y compartir ficheros entre usuarios, entre grupos o publicarlos mediante un enlace con un hash.<br />
<img src="/wp-content/uploads/perfil-usuario.png"/><br />
Una vez hemos subido algunos ficheros, nos podemos centrar en la parte del almacenado de ficheros. Se crea un directorio por usuario creado y dentro de este otro directorio files que es donde residen los ficheros subidos. La ventaja es que si subes un fichero sin pasar por la web, este sí que se verá en la web. De este modo, sería fácil incorporarlo a un sistema con homes UNIX desplegados mapeando los usuarios correctamente. Se le puede indicar donde reside la raíz de los datos.<br />
Se pueden tomar usuarios desde un ldap, y también ofrece la posibilidad de servir de fuente de autenticación OpenID, aunque no he visto como hacer el camino inverso, es decir, autenticare en ownCloud mediante un id OpenID externo.<br />
En la versión de desarrollo tienen incorporadas una app de galería de imágenes y otra para editar ficheros de texto plano en el servidor. Por otro lado, Rekonq, el navegador de KDE4, permite sincronizar los bookmarks con ownCloud. Sería interesante que se pudieran sincronizar con Firefox y Chrome.<br />
La creación de aplicaciones no parece muy complicada y además tienen ya planteado un repositorio de aplicaciones en la web del proyecto.<br />
¿Qué cosas faltan para que pueda ser un reemplazo de dropbox y similares? Lógicamente, aún queda mucho trabajo por hacer, entre otras cosas, aplicaciones locales que faciliten la integración con el escritorio, aún así, accediendo a los contenidos mediante webdav/https, nos quitaríamos el problema de muchas redes corporativas donde resulta complicado abrir nuevos puertos y en otros entornos menos hostiles, se podría incorporar acceso ftp/smb/sshfs a las carpetas de usuario, dando así más posibilidades de integración sin llegar a tener aplicaciones.</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2011/10/hay-que-seguir-de-cerca-al-proyecto-owncloud/" data-text="Hay que seguir de cerca al proyecto ownCloud"data-count="vertical" data-via="ant30" data-lang="es" data-related="software""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2011/10/hay-que-seguir-de-cerca-al-proyecto-owncloud/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2011/10/hay-que-seguir-de-cerca-al-proyecto-owncloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adiós 2010, Feliz 2011</title>
		<link>http://www.ant30.es/2010/12/adios-2010-feliz-2011/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=adios-2010-feliz-2011</link>
		<comments>http://www.ant30.es/2010/12/adios-2010-feliz-2011/#comments</comments>
		<pubDate>Fri, 31 Dec 2010 09:07:32 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[así vivo]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=69</guid>
		<description><![CDATA[El 2010 empieza a caducar y en unas horas empezará a oler a descomposición, vaya a viejo, a muerto. Menos mal que para entonces, ya estaremos en 2011 y no nos daremos ni cuenta entre campanada y campanada, uvas y &#8230; <a href="http://www.ant30.es/2010/12/adios-2010-feliz-2011/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>El 2010 empieza a caducar y en unas horas empezará a oler a descomposición, vaya a viejo, a muerto. Menos mal que para entonces, ya estaremos en 2011 y no nos daremos ni cuenta entre campanada y campanada, uvas y copas de cava.<br />
Haciendo un poco de balance de 2010 puedo afirmar que ha sido un buen año, y espero que 2011 sea igual o mejor.<br />
Este es mi deseo para todos, que 2011 sea un año buenísimo para todos.<br />
<span id="more-69"></span><br />
PD: A ver si ahora se publica en twitter</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2010/12/adios-2010-feliz-2011/" data-text="Adiós 2010, Feliz 2011"data-count="vertical" data-via="ant30" data-lang="es" data-related="as%C3%AD+vivo""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2010/12/adios-2010-feliz-2011/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2010/12/adios-2010-feliz-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asus o!play hdp-r1 como servidor NAS</title>
		<link>http://www.ant30.es/2010/06/asus-oplay-hdp-r1-como-servidor-nas/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=asus-oplay-hdp-r1-como-servidor-nas</link>
		<comments>http://www.ant30.es/2010/06/asus-oplay-hdp-r1-como-servidor-nas/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 08:22:34 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[o!play]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=68</guid>
		<description><![CDATA[Alguien de asus comentó en los foros de soporte de asus que en la siguiente actualización de firmware, la ahora existente 1.27, tendría capacidades de NAS. Tras publicar un firmware de esta versión, la 1.27 en su ftp de betas, &#8230; <a href="http://www.ant30.es/2010/06/asus-oplay-hdp-r1-como-servidor-nas/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Alguien de asus comentó en los <a href=http://vip.asus.com/forum/topic.aspx?board_id=19&#038;model=O!Play%20HDP-R1&#038;SLanguage=en-us>foros de soporte de asus</a> que en la siguiente actualización de firmware, la ahora existente 1.27, tendría capacidades de NAS.<br />
Tras publicar un firmware de esta versión, la 1.27 en su ftp de betas, y quitarlo a las horas debido a problemas en los subtítulos, volvieron a poner una nueva 1.27. Sí, yo opino también que deberían llamarse diferente y no solo indicarlo en el número de build o en el fichero interno de versión de SVN.<br />
Pues bien, el caso es que algunos participantes del foro que he mencionado antes, investigaron y descubrieron que mediante la ejecución de un par de comandos existentes en el firmware y al que se puede acceder vía telnet, se activaba el servidor samba compartiendo lo que haya conectado vía USB/eSATA. Pirlas, publicó en su <a href="http://durao.net/2010/06/01/oplay-hdp-r1-nas-with-firmware-1-27/">blog</a> los comandos a ejecutar pero no indicó una forma para que se iniciase este sistema durante el arranque.<br />
Este mismo usuario, también ha descubierto, que en esta versión del firmware, viene un <a href=http://durao.net/2010/06/01/oplay-hdp-r1-%E2%80%93-bittorrent-client-with-firmware-1-27/>cliente de bittorrent</a> con interfaz web, que aún no parece funcionar del todo bien.<br />
Pues bien, para modificar el arranque del sistema no tenemos más que acceder vía telnet y modificar el fichero que podemos encontrar en la ruta /usr/local/etc/rcS. Este path de etc se encuentra montado para lectura y escritura porque en él, se guardan entre otras cosas la información de configuración, los favoritos y la información de &#8220;pausa&#8221; para continuar por donde se dejaron los contenidos al volver a reproducirlos.<br />
Para que arranque el servicio de samba, nos tenemos que asegurar que está levantada la interfaz de red y se encuentran montados las unidades USB. En mi aparato, conectando un pendrive, puede tardar entre 12 y 18 segundos en montar correctamente la unidad, así que el arranque del servicio samba, lo he retrasado 20 segundos. La red también la levantamos nostros manualmente haciendo uso del binario udhcpc.<br />
Este es el bloque que he añadido al final del fichero /usr/local/etc/rcS</p><pre class="crayon-plain-tag"><code>...
export SMBLOG=/usr/local/etc/smb.log
init_logger () {
date &gt; $SMBLOG
}
logger () {
$@ &gt;&gt; $SMBLOG
}
enable_samba () {
sleep 20
cd /tmp/package/script
logger ./configsamba
logger ./samba start
logger date
}
init_logger
logger /sbin/udhcpc -i eth0 -n -s /etc/udhcpc.script -r 3
enable_samba &amp;</code></pre><p>Este script, deja el rastro de la salida de los comandos en el fichero /usr/local/etc/smb.log . De esta forma, sino funciona, podemos ver que ha ocurrido.<br />
Dejo como adjunto mi fichero rcS con los cambios realizados.<br />
Para copiar este fichero al hdp-r1 tendríamos que hacer lo siguiente:</p>
<ol>
<li>Descomprimir el fichero rcS.tar.gz y copiar el fichero rcS en un pendrive</li>
<li>Enchufar el pendrive al hdp-r1 y asegurarnos de que no hay ninguna otra unidad conectada. Necesitamos la conexión de red.</li>
<li>Encender el aparato desde el mando, ir a Peliculas » Carpeta » Red . Con esto nos aseguramos que se conecte a la red.</li>
<li>Mirar la ip del aparato en la configuración, para ello, pulsamos en <strong>setup</strong>, Nos desplazamos hacia la izquierda hasta que llegemos a <strong>RED</strong> y podemos ver la <strong>ip</strong></li>
<li>Ejecutamos telnet ip en nuestro pc con acceso a la red</li>
<li>Para acceder indicamos que somos root, no se nos pedirá contraseña</li>
<li>Una vez dentro comprobamos que se ha montado correctamente el pendrive ejecutando<br />
<pre class="crayon-plain-tag"><code>ls /mnt/usbmounts/sda1</code></pre>
</li>
<li>Entonces, ejecutamos los siguientes comandos, uno a uno.<br />
<pre class="crayon-plain-tag"><code>cp /usr/local/etc/rcS /usr/local/etc/rcS.old
cp /mnt/usbmounts/sda1/rcS /usr/local/etc/rcS
reboot</code></pre>
</li>
<li>Tras reiniciar, sobre unos 30 segundos después, el servicio de samba debe haber arrancado. Si exploramos la red, ya sea con windows o con linux con los paquetes de samba instalados, veremos la máquina Venus en el grupo de trabajo Workgroup.</li>
<p>Se ha comprobado que si no hay unidad usb, el servicio arranca, pero no comparte nada. Además, si no hay conexión de red, el servicio no arranca pero no entorpece el arranque del sistema de Asus.<br />
La velocidad de transferencia, tanto copiando al asus como desde el asus me han parecido más que aceptables para una red a 100M, en torno a los 6-9MB/s y si copiamos algo vía wifi, entorno a los 2MB/s. Eso sí, si intentamos reproducir contenidos vía lan en el asus mientras estamos realizamos alguna transferencia, el rendimiento de la reproducción decae bastante.<br />
<em>NOTAS:</em></p>
<ul>
<li>He cambiado pirlo por pirlas tal y como me ha sugerido dicho usuario en el primer post.</li>
</ul>
<p><a src="/wp-content/uploads/rcs.tar.gz"></a></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2010/06/asus-oplay-hdp-r1-como-servidor-nas/" data-text="Asus o!play hdp-r1 como servidor NAS"data-count="vertical" data-via="ant30" data-lang="es" data-related="Linux,o%21play""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2010/06/asus-oplay-hdp-r1-como-servidor-nas/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2010/06/asus-oplay-hdp-r1-como-servidor-nas/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Renovación del software del blog</title>
		<link>http://www.ant30.es/2010/04/renovacion-del-software-del-blog/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=renovacion-del-software-del-blog</link>
		<comments>http://www.ant30.es/2010/04/renovacion-del-software-del-blog/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 07:24:43 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[Drupal]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=67</guid>
		<description><![CDATA[Con los ataques de spam de la semana pasada y la lluvia del fin de semana, he tenido algo de tiempo que dedicar al mantenimiento del blog. Además, del cambio de aspecto, hay otros cambios importantes. Como solución al spam, &#8230; <a href="http://www.ant30.es/2010/04/renovacion-del-software-del-blog/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Con los ataques de spam de la semana pasada y la lluvia del fin de semana, he tenido algo de tiempo que dedicar al mantenimiento del blog.<br />
Además, del cambio de aspecto, hay otros cambios importantes.<br />
Como solución al spam, he pasado de usar comentarios con autenticación con OpenID a dejar comentarios libres pero con un filtro <a href="http://drupal.org/project/antispam">antispam</a> basado en <a href="http://akismet.com/">Akismet</a>. Con el módulo AntiSpam, se puede usar este filtro usando una WordPress API Key de forma gratuita. Además, permite seleccionar otros servicios de filtros antispam como <a href="http://antispam.typepad.com/">TypePad AntiSpam</a> y <a href="http://defensio.com/">Defensio</a>. De momento, ya ha marcado un comentario como spam de forma correcta. Creo que usar esta clase de filtros antispam en vez de usar el típico Captcha o requerir autenticación de algún tipo, puede ser bastante beneficioso para la usabilidad de cualquier sitio web. Con la misma idea he metido Facebook Connect, pero no me gusta demasiado el resultado.<br />
Por otro lado, hemos incorporado un theme para que se pueda visualizar el blog en móviles. Esto daría para un pequeño artículo, pero básicamente se trata de usar el tema Nokia Mobile y un Selector de tema para móviles basado en Browscap.<br />
Al cambio de aspecto, aún le falta un repaso, pero de entrada tengo que comentar que está basado en <a href="http://drupal.org/project/fusion">Fusion Themes</a> que usa <a href="http://drupal.org/project/skinr">Skinr</a><br />
También he incorporado el servicio AddToAny que permite a los visitantes publicar el Link en sus redes sociales.<br />
Seguro que se me queda alguna cosa en el tintero, pero sí, ha sido un buen ejercicio de prácticas de administración de drupal.<br />
<span id="more-67"></span><br />
<!--more--></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2010/04/renovacion-del-software-del-blog/" data-text="Renovación del software del blog"data-count="vertical" data-via="ant30" data-lang="es" data-related="Drupal""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2010/04/renovacion-del-software-del-blog/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2010/04/renovacion-del-software-del-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prueba de conexión a twitter</title>
		<link>http://www.ant30.es/2010/04/prueba-de-conexion-a-twitter/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=prueba-de-conexion-a-twitter</link>
		<comments>http://www.ant30.es/2010/04/prueba-de-conexion-a-twitter/#comments</comments>
		<pubDate>Sat, 17 Apr 2010 16:59:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=66</guid>
		<description><![CDATA[Probando conexión de mi blog con twitter {lang: 'es'}]]></description>
			<content:encoded><![CDATA[<p>Probando conexión de mi blog con twitter</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2010/04/prueba-de-conexion-a-twitter/" data-text="Prueba de conexión a twitter"data-count="vertical" data-via="ant30" data-lang="es" data-related="twitter""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2010/04/prueba-de-conexion-a-twitter/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2010/04/prueba-de-conexion-a-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android: Al final me quedo con Super D</title>
		<link>http://www.ant30.es/2010/01/android-al-final-me-quedo-con-super-d/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=android-al-final-me-quedo-con-super-d</link>
		<comments>http://www.ant30.es/2010/01/android-al-final-me-quedo-con-super-d/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 12:16:32 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=65</guid>
		<description><![CDATA[Este fin de semana ha sido un caos de tantas pruebas de roms que he hecho gracias a los amigos de los foros de xda-developers. ¿Porqué cambia uno de rom? La respuesta es fácil, hay ciertas necesidades que no se &#8230; <a href="http://www.ant30.es/2010/01/android-al-final-me-quedo-con-super-d/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este fin de semana ha sido un caos de tantas pruebas de roms que he hecho gracias a los amigos de los foros de <a href="http://forum.xda-developers.com/forumdisplay.php?f=448">xda-developers</a>.<br />
¿Porqué cambia uno de rom? La respuesta es fácil, hay ciertas necesidades que no se me cumplen con la rom que usaba mi dispositivo. Llevo usando los firms de cyanogen desde que dude y haykuro dejaron de aparecer. Sin embargo, en los últimos tiempos, sentía como la ROM iba a pedales. No es normal que al empezar a escribir con el teclado, tengas un lag de varios segundos y que la carga del sistema esté rondando entre 2 y 3 casi todo el día. Así como que la swap estuviese casi siempre saturada. Lógicamente, todo esto hace que la experiencia Android se convierta en un poco desagradable. Así que tocaba probar con los siguientes requisitos:</p>
<ul>
<li>El bluetooth debe de funcionar de forma completa, y la app del market, bluetooth file transfer funcione tanto para los ficheros como para los contactos. Y lo más importante de bluetooth en mi caso es que sea capaz de conectarse al manos libres del coche, un Parrot CK3100 Evolution con firm 5.11c</li>
<li>Velocidad de respuesta y estabilidad. No me importa que no siempre valla a más de 25fps todas las animaciones, ni que estén activadas todas los efectos. Pero sí que quiero tener la sensación de que el terminal responde a mis dedos y no que lo hace unos cuantos segundos después.</li>
<li>Conectividad wifi. La mayoría de firms tienen el mismo soporte de wifi, con que funcione es más que suficiente.</li>
<li>Por supuesto, deben funcionar la localización y My Maps Editor, así HTC_IME como teclado virtual aunque sea instalándolo mediante adb. Este último debe funcionar con soltura.</li>
<li>La home debe responder al acelerómetro para cambiar de vista horizontal a vertical y viceversa.</li>
</ul>
<p>He probado varios firms Eclair tanto 2.0 como 2.1 y la mayoría de ellos me han dejado buen sabor de boca. Muchas de ellas ya sabía que no tenían algunos de los requisitos. Como el funcionamiento de bluetooth, el funcionamiento de la cámara, la no grabación de vídeo existente aún en las 2.x para el Dream y la falta de drivers 2D/3D para estas versiones. Sin embargo, la velocidad del termina era bastante aceptable. Incluso el paso de horizontal a vertical y viceversa tenían buena velocidad. Sin embargo, para la mayoría de firms de estas versiones, el soporte de bluetooth no parece estar completo.<br />
Tras realizar pruebas con las 2.x estaba claro que tenía que pasar a firms 1.6 si quería estabilidad y entonces fue cuando usé la recomendación de <a href="http://twitter.com/hugopvigo">@hugopvigo</a> de usar Super D. Esta ROM tiene el hack de los 10M más de RAM, soporte de swap y en general es como una cyanogen pero los binarios han pasado por un <a href=http://developer.android.com/guide/developing/tools/zipalign.html>zipalign</a>. Lo que mejora sustancialmente el rendimiento del sistema, al estar los apk y compañía más optimizados para su ejecución.<br />
Con esta firm desde cero, wipe + ext3 en sd formateada, me ha funcionado el bluetooth sin hacer nada, simplemente instalando la aplicación que he citado antes. He podido enviar unos cuantos contactos al Parrot y encima el móvil, se desenvuelve con normalidad aún ejecutando unos 12-14 servicios.<br />
En concreto estoy usando la versión estable 1.6 de las publicadas en este hilo: http://forum.xda-developers.com/showthread.php?t=613809<br />
<span id="more-65"></span></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2010/01/android-al-final-me-quedo-con-super-d/" data-text="Android: Al final me quedo con Super D"data-count="vertical" data-via="ant30" data-lang="es" data-related="android""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2010/01/android-al-final-me-quedo-con-super-d/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2010/01/android-al-final-me-quedo-con-super-d/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Trucos Android: Apagado de emergencia</title>
		<link>http://www.ant30.es/2010/01/trucos-android-apagado-de-emergencia/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=trucos-android-apagado-de-emergencia</link>
		<comments>http://www.ant30.es/2010/01/trucos-android-apagado-de-emergencia/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 12:29:16 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=64</guid>
		<description><![CDATA[No es la primera vez que tras instalar un nuevo firmware, mi maltrecho HTC Dream no termina de arrancar. Al principio de mis tiempos con android, lo primero que se me ocurría era quitar la batería. Desde luego es la &#8230; <a href="http://www.ant30.es/2010/01/trucos-android-apagado-de-emergencia/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>No es la primera vez que tras instalar un nuevo firmware, mi maltrecho HTC Dream no termina de arrancar. Al principio de mis tiempos con android, lo primero que se me ocurría era quitar la batería. Desde luego es la solución más drástica y que seguro que funciona. Pero claro, si desmontas unas diez o veinte veces la parte trasera del móvil simplemente para sacar la batería, la tapa cogerá holgura.<br />
En el arranque, tras haber pasado ya la fase de inicio en la que vemos el logo de la compañía, en mi caso Movistar, el terminal ya es capaz de recibir comandos vía adb. Esto nos permite hacer ciertas operaciones mientras el móvil arranca, y en el caso que ahora nos interesa podemos realizar dos importantes acciones que son apagar o reiniciar el móvil.<br />
Para ejecutar estas acciones desde el pc conectado por usb al móvil y sabiendo de antemano que tenemos adb funcionando tendríamos que lanzar los siguientes comandos:</p>
<dl>
<dt>Reiniciar:</dt>
<dd><pre class="crayon-plain-tag"><code>$ adb shell reboot</code></pre></dd>
<dt>Apagar:</dt>
<dd><pre class="crayon-plain-tag"><code>$ adb shell reboot -p</code></pre></dd>
</dl>
<p>Un ejemplo para el que necesitamos el comando de apagado es cuando una rom no termina de arrancar para poder llegar a la pantalla de restauración o recovery. A esa que llegamos si arrancamos el androide dejando pulsado el botón de la casita y a su vez el de encendido.</p>
<p><span id="more-64"></span></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2010/01/trucos-android-apagado-de-emergencia/" data-text="Trucos Android: Apagado de emergencia"data-count="vertical" data-via="ant30" data-lang="es" data-related="android""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2010/01/trucos-android-apagado-de-emergencia/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2010/01/trucos-android-apagado-de-emergencia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Y qué hago yo con el blog</title>
		<link>http://www.ant30.es/2010/01/y-que-hago-yo-con-el-blog/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=y-que-hago-yo-con-el-blog</link>
		<comments>http://www.ant30.es/2010/01/y-que-hago-yo-con-el-blog/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 13:17:01 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[así vivo]]></category>
		<category><![CDATA[otra cosa]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=63</guid>
		<description><![CDATA[Solo con ver la última entrada, que era una prueba, y su fecha, está claro que tengo abandonado este blog. Sin embargo, me resisto a deshacerme de él. Digamos que perdí el hábito de la escritura de textos de más &#8230; <a href="http://www.ant30.es/2010/01/y-que-hago-yo-con-el-blog/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Solo con ver la última entrada, que era una prueba, y su fecha, está claro que tengo abandonado este blog. Sin embargo, me resisto a deshacerme de él.<br />
Digamos que perdí el hábito de la escritura de textos de más de 140 caracteres hace bastante tiempo. Y sin embargo, durante estos meses de abandono sí que he sentido la necesidad de publicar cosas. De ahí que haya algunas en la lista de salida como borrador, pero no saldrán por estar ya más que desfasadas.<br />
Una posible opción para fuente de contenidos sería hablar de las aplicaciones de Android que suelo ir probando. Algunas más útiles que otras, algunas las descubro en el market mientras viajo en el autobús, otra son recomendaciones de amigos y conocidos y otras, de webs. Pero lo cierto es que rara es la semana que no pruebo unas cuantas aplicaciones.<br />
Concluyendo ya, espero poder tener la fuerza de voluntad necesaria como para ir poniendo los reportes de las aplicaciones que vaya probando a partir de ahora. Por lo menos así recordaré lo bueno y lo malo de las aplicaciones que he usado.<br />
<span id="more-63"></span></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2010/01/y-que-hago-yo-con-el-blog/" data-text="Y qué hago yo con el blog"data-count="vertical" data-via="ant30" data-lang="es" data-related="as%C3%AD+vivo,otra+cosa""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2010/01/y-que-hago-yo-con-el-blog/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2010/01/y-que-hago-yo-con-el-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiando de hosting</title>
		<link>http://www.ant30.es/2009/09/cambiando-de-hosting/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cambiando-de-hosting</link>
		<comments>http://www.ant30.es/2009/09/cambiando-de-hosting/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 11:58:48 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[otra cosa]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=62</guid>
		<description><![CDATA[Tras dos años teniendo como hosting a 1and1.es , he decidido cambiar de hosting hacia DreamHost. En un principio, seguiré usando como registrador de dominio a 1and1.es. Por 5€ al año el dominio &#8220;.es&#8221; es un precio bastante asequible. Y &#8230; <a href="http://www.ant30.es/2009/09/cambiando-de-hosting/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tras dos años teniendo como hosting a 1and1.es , he decidido cambiar de hosting hacia DreamHost. En un principio, seguiré usando como registrador de dominio a 1and1.es. Por 5€ al año el dominio &#8220;.es&#8221; es un precio bastante asequible.<br />
Y respecto al espacio, teniendo en cuenta que en dreamhost dan un poco más de holgura respecto a 1and1 y ya tengo varias web alojadas en esa cuenta, pues he acabado decidiéndome por el cambio.<br />
Este post se ha escrito bajo un dominio de prueba en dreamhost con la intención de comprobar el cambio correcto de dns.</p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2009/09/cambiando-de-hosting/" data-text="Cambiando de hosting"data-count="vertical" data-via="ant30" data-lang="es" data-related="otra+cosa""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2009/09/cambiando-de-hosting/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2009/09/cambiando-de-hosting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capturas y marcador para firefox: dashboard</title>
		<link>http://www.ant30.es/2009/08/capturas-y-marcador-para-firefox-dashboard/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=capturas-y-marcador-para-firefox-dashboard</link>
		<comments>http://www.ant30.es/2009/08/capturas-y-marcador-para-firefox-dashboard/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 11:46:10 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=61</guid>
		<description><![CDATA[Buscando si existía un plugin para capturar zonas de una ventana de firefox y que además incorporase un marcador o algo para resaltar una zona de esa captura, me he encontrado con este plugin: DashBlog. Permite capturar tanto una imagen, &#8230; <a href="http://www.ant30.es/2009/08/capturas-y-marcador-para-firefox-dashboard/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Buscando si existía un plugin para capturar zonas de una ventana de firefox y que además incorporase un marcador o algo para resaltar una zona de esa captura, me he encontrado con este plugin: <a href=https://addons.mozilla.org/en-US/firefox/addon/7215>DashBlog</a>.<br />
Permite capturar tanto una imagen, como un vídeo de una página (ideal para efectos js/ajax). Y además, permite escribir, poner flechas o dibujar a mano alzada. Pero es que además de esto, permite publicar esta captura directamente en WordPress, Blogger/Blogspot, Tumblr, aunque esto último no he conseguido que me fucione.<br />
Lo bueno es que te salva de tener que abrir GIMP para remarcar una zona, o incluso recortar una zona de la pantalla sino quieres tener instalado/activo el plugin <a href=https://addons.mozilla.org/es-ES/firefox/addon/1146>ScreenGrab</a>.<br />
Puedes ver los resultados en la captura de ejemplo, en la zona inferior derecha.<br />
Una lástima que el plugin aún no funcione para Firefox 3.5<br />
<img alt="dashboardcapture.png" src="/wp-content/uploads/dashboardcapture.png"/></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2009/08/capturas-y-marcador-para-firefox-dashboard/" data-text="Capturas y marcador para firefox: dashboard"data-count="vertical" data-via="ant30" data-lang="es" data-related="firefox,plugins,software,web""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2009/08/capturas-y-marcador-para-firefox-dashboard/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2009/08/capturas-y-marcador-para-firefox-dashboard/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Terminales ligeros, la solución para las aulas de formación</title>
		<link>http://www.ant30.es/2009/08/terminales-ligeros-la-solucion-para-las-aulas-de-formacion/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=terminales-ligeros-la-solucion-para-las-aulas-de-formacion</link>
		<comments>http://www.ant30.es/2009/08/terminales-ligeros-la-solucion-para-las-aulas-de-formacion/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 12:13:23 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tcos]]></category>
		<category><![CDATA[terminales ligeros]]></category>
		<category><![CDATA[thinclients]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=60</guid>
		<description><![CDATA[Tras llevar bastante tiempo ligado a los servicios web, tanto en el desarrollo como en el despliegue y mantenimiento de esta clase de sistemas, ahora tengo la oportunidad de trabajar en un proyecto mucho más relacionado con Sistemas directamente y &#8230; <a href="http://www.ant30.es/2009/08/terminales-ligeros-la-solucion-para-las-aulas-de-formacion/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tras llevar bastante tiempo ligado a los servicios web, tanto en el desarrollo como en el despliegue y mantenimiento de esta clase de sistemas, ahora tengo la oportunidad de trabajar en un proyecto mucho más relacionado con Sistemas directamente y el comúnmente llamado &#8220;cacharreo&#8221;.<br />
Se trata de incorporar a una serie de aulas de formación, un sistema basado en clientes ligeros y servidor, usando para ello <a href=http://www.tcosproject.org/">Tcos</a>.<br />
El hecho de incorporar este tipo de arquitectura a las aulas es beneficioso por varios motivos:</p>
<ul>
<li>Fácil administración de todos los equipos del aula. Ahora todos los puestos usarán el mismo sistema, que será servidor y procesado por el servidor</li>
<li>Ahorro en máquinas. Los clientes ligeros tienen un tiempo de vida muy superior al de un equipo normal. En un aula con equipos normales, hay que renovar equipos cada 3 o 5 años, porque se han quedado obsoletos. En un aula con clientes ligeros. Pasado este tiempo, solo habría que cambiar el servidor si se necesita más rendimiento.</li>
<li>Consumo energético. En el caso de usar clientes ligeros, tenemos terminales con consumos desde 5w, y máximo de 20w. El PC de un puesto normal, con estar encendido ya viene a consumir 60-80w como mínimo.</li>
<li>Reutilización de equipos viejos. Se pueden usar equipos antiguos con poca ram (a partir de 64MB, o un incluso menos), sin disco duro, ni disquettes. Solo necesitan una tarjeta de red que soporte arranque con PXE o una disquetera para emular el arranque PXE con etherboot</li>
<li>Además, si decidimos usar Linux y la alternativa fuese windows, nos ahorramos el precio de licencia por puesto.</li>
</ul>
<p>Dejo pendiente para otros días analizar alguno de los principales sistemas que tenemos para ofrecer este tipo de servicio, como son LTSP, Tcos, PXEs, &#8230;<br />
<span id="more-60"></span></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2009/08/terminales-ligeros-la-solucion-para-las-aulas-de-formacion/" data-text="Terminales ligeros, la solución para las aulas de formación"data-count="vertical" data-via="ant30" data-lang="es" data-related="Linux,software,tcos,terminales+ligeros,thinclients""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2009/08/terminales-ligeros-la-solucion-para-las-aulas-de-formacion/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2009/08/terminales-ligeros-la-solucion-para-las-aulas-de-formacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pasándome a Android</title>
		<link>http://www.ant30.es/2009/05/pasandome-a-android/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pasandome-a-android</link>
		<comments>http://www.ant30.es/2009/05/pasandome-a-android/#comments</comments>
		<pubDate>Sun, 17 May 2009 09:43:17 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[así vivo]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=59</guid>
		<description><![CDATA[Tras unos meses de espera, ya puedo decir que tengo un móvil con Android. En concreto una HTC Dream de Movistar, pero que ya corre su cupcake gracias un post en el foro de and.roid.es. Va a la perfección, se &#8230; <a href="http://www.ant30.es/2009/05/pasandome-a-android/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Tras unos meses de espera, ya puedo decir que tengo un móvil con Android. En concreto una HTC Dream de Movistar, pero que ya corre su cupcake gracias un post en el foro de <a href="http://and.roid.es/foro/">and.roid.es</a>. Va a la perfección, se nota mucho la evolución de la 1.1 a la 1.5, con el teclado virtual entre otras cosasl<br />
¿Abandono Symbian? la verdad es que el n70 no me ha dejado muy buen sabor de boca, la inestabilidad le hacía bastante deprimente. Ciertos problemas con bluetooth y la asociación con otros dispositivos hacía que la batería se esfumase en unas pocas horas y solo de vez en cuando. Sin embargo, para mí llevar activado bluetooth era casi obligado, por el tema del manos libres del coche o durante aquella época de desarrollos con esta tecnología inalámbrica.<br />
No, no voy a abandonar a Symbian, estoy buscando un móvil pequeño, espero que con symbian, que haga buen reemplazo del n70 y complemente al dream. Hay veces que se necesita llevar un móvil pequeño y la verdad es que la HTC es ladrillo al lado de un 6600 slide, sin symbian o el mismo 6210 navigator, con symbian. A ver si logro encontrar algún stock del 6120 classic.<br />
Por cierto, que tengo esto del blog casi abandonado, a ver si ahora voy sacando cosas para escribir. Alguna sobre algún que otro proyecto hay pendiente.<br />
<span id="more-59"></span></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2009/05/pasandome-a-android/" data-text="Pasándome a Android"data-count="vertical" data-via="ant30" data-lang="es" data-related="android,as%C3%AD+vivo""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2009/05/pasandome-a-android/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2009/05/pasandome-a-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plugin jQuery: jquery.flickrutils.js</title>
		<link>http://www.ant30.es/2009/03/plugin-jquery-jquery-flickrutils-js/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=plugin-jquery-jquery-flickrutils-js</link>
		<comments>http://www.ant30.es/2009/03/plugin-jquery-jquery-flickrutils-js/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 12:54:00 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[flickerutils]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[proyectos]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=58</guid>
		<description><![CDATA[Hace unos meses comencé a mirar la api pública de flickr, entre otras cosas por la necesidad de facilitarme el enlace desde este mismo blog a fotos de flickr. En primer lugar, quería hacer una especie de selector en que &#8230; <a href="http://www.ant30.es/2009/03/plugin-jquery-jquery-flickrutils-js/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hace unos meses comencé a mirar la api pública de flickr, entre otras cosas por la necesidad de facilitarme el enlace desde este mismo blog a fotos de flickr.<br />
En primer lugar, quería hacer una especie de selector en que el se me permitiese realizar búsquedas por tags y nombres, quizás por fechas, incluso fotos de otros usuarios. En un principio, pensando solo en que fuese compatible con Drupal.<br />
Al final, ayer sábado por la mañana, decidí retomar lo que tenía hecho de aquel día y además de intentar aprender un poco de jQuery, conseguir algo que sea fácilmente portable a cualquier sistema web donde se pueda usar jQuery.<br />
Entre alguna de las funciones que ya podemos encontrar son:</p>
<ul>
<li><strong>Buscador de fotos</strong> permite devolver lo obtenido a una función &#8220;callback&#8221; donde se pasa una lista de id de fotos. El callback que viene por defecto mete estos ids en un input. Aún le queda mucho por maquetar y mucho por revisar en la funcionalidad, pero parece funcionar.</li>
<li><strong>Carga de fotos</strong> Ya tenemos una lista de ids, ahora queremos poder cargarla en algún div. Para esto teníamos varias opciones. y al final he ido implementando casi una por una.
<ul>
<li>Imágenes en un link a la vista pública de la imagen en flickr.</li>
<li>Imágenes en un link a la misma imagen pero en otro tamaño.</li>
<li>Buscar un formato en todo el documento y reemplazarlo por imágenes</li>
</ul>
</li>
</ul>
<p>El enlace al proyecto en Google Code:</p>
<h2><a href="http://code.google.com/p/jquery-flickr-utils/">jquery-flickr-utils</a></h2>
<p>Enlace a una demo con lo que hay a fecha de publicación de este post:</p>
<h2><a href="http://demos.ant30.es/jquery-flickr-utils/">Demo</a></h2>
<p>Para obtener la información necesaria uso la API rest de la que tenemos disponible una esplendida documentación a través de   <a href="http://www.flickr.com/services/api/">flickr</a>.  Y recalco lo de espléndida documentación porqué sin ella, no sirve de nada tener una API.<br />
A ver si termino de ponerlo un poco bonito y lo empaqueto como plugin para drupal.<br />
<span id="more-58"></span></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2009/03/plugin-jquery-jquery-flickrutils-js/" data-text="Plugin jQuery: jquery.flickrutils.js"data-count="vertical" data-via="ant30" data-lang="es" data-related="api,flickerutils,jquery,json,proyectos""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2009/03/plugin-jquery-jquery-flickrutils-js/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2009/03/plugin-jquery-jquery-flickrutils-js/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Plugin de Gedit: GeditChecker, Asistente para anlizadores de código, pyflakes y pep8 incluidos.</title>
		<link>http://www.ant30.es/2009/02/plugin-de-gedit-geditchecker-asistente-para-anlizadores-de-codigo-pyflakes-y-pep8-incluidos/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=plugin-de-gedit-geditchecker-asistente-para-anlizadores-de-codigo-pyflakes-y-pep8-incluidos</link>
		<comments>http://www.ant30.es/2009/02/plugin-de-gedit-geditchecker-asistente-para-anlizadores-de-codigo-pyflakes-y-pep8-incluidos/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 12:05:12 +0000</pubDate>
		<dc:creator>ant30</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[gedit]]></category>
		<category><![CDATA[geditchecker]]></category>
		<category><![CDATA[proyectos]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.wordpress.ant30.es/?p=57</guid>
		<description><![CDATA[Si el último post fue sobre un plugin de gedit, aquí va otro plugin. Un ayudante para que nuestro gedit pueda comprobar nuestro código, cuando salvamos el fichero. Lo que hay realizado, está hecho durante el tiempo sobrante después del &#8230; <a href="http://www.ant30.es/2009/02/plugin-de-gedit-geditchecker-asistente-para-anlizadores-de-codigo-pyflakes-y-pep8-incluidos/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Si el último post fue sobre un plugin de gedit, aquí va otro plugin. Un ayudante para que nuestro gedit pueda comprobar nuestro código, cuando salvamos el fichero. Lo que hay realizado, está hecho durante el tiempo sobrante después del almuerzo, y con esto, lo que quiero remarcar es la velocidad de desarrollo que aporta python y tener una api de plugins en este lenguaje como la que tiene Gedit, mi editor habitual cuando ando por escritorios.<br />
En este caso se trata de un plugin para revisar la sintaxis del fichero que estamos editando al salvar. Para ello, en el caso de python, se ayuda para utilidades externas como pyflakes y pep8.py . Vuelva la salida de estos en un panel inferior, pero además, la funcionalidad extra que añade es que analiza las líneas de salida de los analizadores externos para que al clickearlas nos sitúe en la línea que se ha producido el error o warning.<br />
Un compañero de trabajo también está realizando una utilidad para comprobar código css, haciendo uso de w3c, y también está incorporado. De esta forma, ha surgido la idea de hacer esto configurable mediante un panel de configuración en el que poder añadir nuevas &#8220;herramientas externas&#8221;, como las de gedit, o usar esas mismas, y poder asociarlas a extensiones de ficheros para que se asocien al evento de salvado de documentos. También estaría bien poder asignar parámetros extras a estos otros analizadores.<br />
El enlace al proyecto en google code:</p>
<h2>GeditChecker</h2>
<p>El código del panel <a href=http://code.google.com/p/geditchecker/>GeditChecker</a> se publica bajo GPL, como se indica en el directorio. Las utilidades de testeo, tienen cada una su respectiva licencia.<br />
De momento solo se ha probado en Intrepid Ibex que usa Gnome 2.24<br />
Esto me ha recordado algo que se suele decir mucho en Software Libre, y era algo así como que si <em>hay algo que falta en un programa, por qué no lo haces tú</em>.<br />
<span id="more-57"></span></p>
<div class="TweetButton_button" style="float: right; margin-left: 10px;;height:20px;margin-bottom:5px;"><a href="http://twitter.com/share data-url="http://www.ant30.es/2009/02/plugin-de-gedit-geditchecker-asistente-para-anlizadores-de-codigo-pyflakes-y-pep8-incluidos/" data-text="Plugin de Gedit: GeditChecker, Asistente para anlizadores de código, pyflakes y pep8 incluidos."data-count="vertical" data-via="ant30" data-lang="es" data-related="gedit,geditchecker,proyectos,python""><img src="http://www.ant30.es/wp-content/plugins/tweetbutton-for-wordpress/images/tweet.png" style="border:none" /></a></div>
<div name="googleone_share_1" style="position:relative;z-index:5;float: right; margin-left: 10px;"><g:plusone size="tall" count="1" href="http://www.ant30.es/2009/02/plugin-de-gedit-geditchecker-asistente-para-anlizadores-de-codigo-pyflakes-y-pep8-incluidos/">{lang: 'es'}</g:plusone></div>]]></content:encoded>
			<wfw:commentRss>http://www.ant30.es/2009/02/plugin-de-gedit-geditchecker-asistente-para-anlizadores-de-codigo-pyflakes-y-pep8-incluidos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

