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

<channel>
	<title>Soldat&#039;s log</title>
	<atom:link href="http://blog.chernando.eu/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chernando.eu</link>
	<description>Simplemente otro blog personal</description>
	<lastBuildDate>Wed, 10 Mar 2010 19:25:24 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='blog.chernando.eu' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/0eb8b53f0c14a196e38f0abba5641993?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Soldat&#039;s log</title>
		<link>http://blog.chernando.eu</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.chernando.eu/osd.xml" title="Soldat&#039;s log" />
	<atom:link rel='hub' href='http://blog.chernando.eu/?pushpress=hub'/>
		<item>
		<title>Servidor de proyectos con Subversion, Trac, Apache (y LDAP)</title>
		<link>http://blog.chernando.eu/2008/07/20/subversion-trac-apache-ldap/</link>
		<comments>http://blog.chernando.eu/2008/07/20/subversion-trac-apache-ldap/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 12:29:42 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ldap]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[trac]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=43</guid>
		<description><![CDATA[En esta entrada vamos a montar un servidor para la gestión de proyectos. Para ello utilizaremos un sistema de control de versiones (Subversion), un sistema de gestión de incidencias (Trac) y un sistema de autenticación compartido, para ello utilizaremos Apache y alguno de sus métodos de autenticación como por ejemplo LDAP (válido si es necesario [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=43&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>En esta entrada vamos a montar un servidor para la gestión de proyectos. Para ello utilizaremos un sistema de control de versiones (<a href="http://subversion.tigris.org/">Subversion</a>), un sistema de gestión de incidencias (<a href="http://trac.edgewall.org/">Trac</a>) y un sistema de autenticación compartido, para ello utilizaremos <a href="http://httpd.apache.org/">Apache</a> y alguno de sus métodos de autenticación como por ejemplo <a href="http://es.wikipedia.org/wiki/LDAP">LDAP</a> (válido si es necesario utilizar las cuentas de un <a href="http://es.wikipedia.org/wiki/Directorio_activo">Directorio Activo</a>).</p>
<p>Aunque existen soluciones más elaboradas y más integradas, como el software de <a href="http://sourceforge.net/">SourceForge.net</a>, este planteamiento permite montar un servidor a medida, pudiendo alterar cualquiera de sus elementos, y en mi opinión más sencillo de mantener.</p>
<p>Nos basaremos en una instalación mínima de Ubuntu Server 8.04 (por lo que no disponemos ni de Subversion 1.5 ni de Trac 0.11) con la idea de montar un servidor preparado para mantener varios proyectos.</p>
<h3>Instalación y configuración de Subversion</h3>
<p>Para empezar instalaremos subversion, también es recomendable subversion-tools por los scripts adicionales que incorpora, y preparamos un repositorio de prueba:</p>
<pre># apt-get install subversion subversion-tools
# mkdir /srv/svn
# svnadmin create /srv/svn/proyecto</pre>
<p>Aprovechamos ahora para crear una estructura básica dentro del repositorio, esto nos servirá en las pruebas para ver si realmente podemos acceder al repositorio:</p>
<pre># svn co file:///srv/svn/proyecto
# svn mkdir proyecto/{branches,tags,trunk}
# svn ci -m 'Estructura Inicial' proyecto</pre>
<h3>Instalación y configuración de Trac</h3>
<p>Instalaremos y configuraremos mínimamente un proyecto de Trac para el repositorio que acabamos de crear:</p>
<pre># apt-get install trac
# mkdir /srv/trac
# trac-admin /srv/trac/proyecto initenv
(Opciones sugeridas)
Path to repository [/path/to/repos]&gt; <strong>/srv/svn/proyecto</strong></pre>
<p>Es el momento de comprobar que trac y su unión con el repositorio de subversion funcionan correctamente, para ello lanzaremos el servidor incluido en trac:</p>
<pre># tracd -p 80 /srv/trac/proyecto</pre>
<p>Abriendo la URL http://localhost:80/ deberíamos ver disponible nuestro proyecto, &#8220;<em>My Project</em>&#8220;, y comprobamos que la función de &#8220;<em>Browse Source</em>&#8221; funciona correctamente.</p>
<p>Por el momento nada nuevo, paremos tracd y sigamos.</p>
<h3>Instalación y configuración de Apache</h3>
<p>Optamos por enganchar Trac con <a href="http://www.modpython.org/">mod_python</a> así que lo más sencillo es instalar el paquete de mod_python y que instale apache por sus dependencias:</p>
<pre># apt-get install libapache2-mod-python</pre>
<p>Bien, ahora editamos la configuración para que Apache pase las peticiones que vayan a <strong>/trac</strong> a nuestro conjunto de proyectos en <strong>/srv/trac</strong>. Editando el fichero <strong>/etc/apache2/sites-available/default</strong> añadimos antes del cierre de <em>&lt;/VirtualHost&gt;</em> lo siguiente:</p>
<pre>&lt;Location /trac&gt;
  SetHandler mod_python
  PythonInterpreter main_interpreter
  PythonHandler trac.web.modpython_frontend
  PythonOption TracEnvParentDir /srv/trac
  PythonOption TracUriRoot /trac
&lt;/Location&gt;</pre>
<p>Forzamos la recarga de la configuración de Apache:</p>
<pre># /etc/init.d/apache2 reload</pre>
<p>Hacemos una prueba con el navegador en http://localhost/trac/ que debería mostrarnos un error por falta de permisos de escritura. Como vamos a dejar a Apache como gestor de los proyectos es necesario darle los permisos que necesita:</p>
<pre># chown -R www-data.www-data /srv/trac/proyecto</pre>
<p>Con esto todo debería funcionar exactamente igual que con la prueba realizada con tracd. Vamos ahora a mostrar el repositorio desde Apache.</p>
<p>Subversion trabaja con Apache haciendo uso de <a href="http://es.wikipedia.org/wiki/WebDAV">WebDAV</a> así que instalamos el módulo necesario:</p>
<pre># apt-get install libapache2-svn</pre>
<p>Añadimos la configuración necesaria en el fichero <strong>/etc/apache2/mods-available/dav_svn.conf</strong>, podéis descomentar las opciones si os resulta más cómodo. En cualquier caso la configuración debe quedar de la siguiente manera:</p>
<pre>&lt;Location /svn&gt;
  DAV svn
  SVNParentPath /srv/svn
&lt;/Location&gt;</pre>
<p>De nuevo, forzamos la recarga de la configuración de Apache y comprobamos que http://localhost/svn/proyecto muestra el proyecto y que podemos navegar dentro de él. Si probáis http://localhost/svn/ os dará un error, ya que en este caso no existe un listado de proyectos disponibles como hacía Trac.</p>
<p>Igualmente que en Trac, si Apache es el gestor del repositorio es necesario que tenga permisos de escritura. En este caso vamos a ceder completamente el control a Apache:</p>
<pre># chown -R www-data.www-data /srv/svn/proyecto</pre>
<p>Ahora mismo disponemos de un sistema completamente funcional en el que no se exige ningún tipo de autenticación. En el caso de Trac no se puede hacer login y en el caso de Subversion ni siquiera se pide. Si queréis verlo en podéis hacer la siguiente prueba:</p>
<pre># svn co http://localhost/svn/proyecto/trunk
# touch trunk/README.txt
# svn add trunk/README.txt
# svn ci -m "Fichero leame" trunk</pre>
<p>Si comprobamos el historial, <em>svn log trunk/README.txt</em>, podremos ver que no hay ningún usuario responsable del commit. En ningún momento se nos ha pedido identificarnos, ya que hay permisos de lectura y escritura para todo el mundo, así que podemos bajarnos el contenido del repositorio y los commit son anónimos.</p>
<h3>Autenticando usuarios</h3>
<p>Empecemos con lo más sencillo, usuarios válidos de un fichero htpasswd, podéis leer algo más en otro de mis artículos sobre <a href="http://chernando.eu/doc/apache/">ficheros .htpasswd</a>.</p>
<pre># htpasswd -c /etc/apache2/users.conf chernando</pre>
<p>Editamos Trac para soportar un login centralizado añadiendo un nuevo <em>location</em> a <em>default</em>:</p>
<pre>&lt;Location /trac/*/login&gt;
  AuthType Basic
  AuthName "Trac Projects"
  AuthUserFile /etc/apache2/users.conf
  Require valid-user
&lt;/Location&gt;</pre>
<p>Forzando la recarga de Apache ya disponemos de la función &#8220;login&#8221; en Trac. Para el repositorio vamos a dejar el acceso de lectura para todo el mundo y limitar el acceso de escritura a los usuarios registrados añadiendo a la configuración de WebDAV:</p>
<pre>AuthType Basic AuthName "Subversion Repository"
AuthUserFile /etc/apache2/users.conf
&lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
  Require valid-user
&lt;/LimitExcept&gt;</pre>
<p>Una vez más recargando Apache ahora podemos bajar y actualizar un repositorio pero necesitaremos identificarnos para subir cambios al repositorio. Probad a añadir un nuevo fichero y comprobaréis que ahora se exige un usuario y password válidos.</p>
<h3>Rizando el rizo, autenticando contra un LDAP</h3>
<p>En el caso de disponer de un sistema de autenticación centralizada, por ejemplo LDAP o un Directorio Activo con el servicio LDAP activo, podemos delegar toda la carga de la gestión de usuarios dejando nuestro servidor de proyectos completamente &#8220;inhabitado&#8221;.</p>
<p>Para ello lo único que necesitamos es cambiar ambas configuraciones. En primer lugar habilitamos los módulos necesarios:</p>
<pre># a2enmod authnz_ldap
(esto debería habilitar el módulo ldap por dependencias)</pre>
<p>Y configuramos ambas secciones de autenticación. Primero eliminamos <em>AuthUserFile</em> que ya no es necesaria y después añadimos:</p>
<pre>AuthBasicProvider "ldap"
AuthLDAPURL "ldap://127.0.0.1/dc=chernando,dc=eu?uid?sub?(objectClass=inetOrgPerson)"
authzldapauthoritative Off</pre>
<p>Podéis ver más detalles en <a href="http://trac.edgewall.org/wiki/TracModPython">http://trac.edgewall.org/wiki/TracModPython</a>.</p>
<h3>Ampliaciones que pueden hacerse a partir de aquí</h3>
<p>En esta entrada he intentado introducir el menor ruido posible, tanto en comandos como software a instalar, por lo que hay ciertas mejoras que se han quedado en el tintero. Por ejemplo:</p>
<ul>
<li>Configurar Apache para hacer uso de SSL, muy necesario ya que hasta el momento todas las negociaciones con Apache van en texto claro.</li>
<li>Establecer limitaciones en el acceso de los repositorios (y en secciones de los mismos) haciendo uso de authz.</li>
<li>Configurar un sistema de correo, que permita notificar todo tipo de eventos: nuevos tickets, cambios en el repositorio&#8230;</li>
<li>Integrar Subversion con Trac, por ejemplo permitir que un commit cierre o añada información a un ticket de Trac.</li>
<li>Utilizar la última versión de Subversion, 1.5, por su mejora en la gestión de merge de ramas.</li>
<li>Utilizar la última versión de Trac, 0.11, por las mejoras en el interfaz y en la gestión del flujo de trabajo asociado a un ticket.</li>
<li>Ampliar el sistema incluyendo otros servicios: listas de correo, servidor de integración continua&#8230;</li>
</ul>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/43/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/43/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=43&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/07/20/subversion-trac-apache-ldap/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>OpenSSL vulnerable en Debian</title>
		<link>http://blog.chernando.eu/2008/05/25/openssl-vulnerable-en-debian/</link>
		<comments>http://blog.chernando.eu/2008/05/25/openssl-vulnerable-en-debian/#comments</comments>
		<pubDate>Sun, 25 May 2008 19:21:06 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[openssl]]></category>

		<guid isPermaLink="false">http://chernando.wordpress.com/?p=42</guid>
		<description><![CDATA[Durante las últimas dos semanas se ha organizado un gran revuelo debido al descubrimiento de Luciano Bello: la generación de claves con openssl no ha sido realmente aleatoria. Para aquellos que no seáis aficionados a la criptografía podemos traducirlo como: &#8220;la hemos pifiado&#8221;.
El problema es &#8220;únicamente&#8221; de OpenSSL en Debian (y distribuciones derivadas)&#8230; es decir [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=42&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Durante las últimas dos semanas se ha organizado un gran revuelo debido al descubrimiento de <a href="http://www.lucianobello.com.ar/">Luciano Bello</a>: la generación de claves con openssl no ha sido realmente aleatoria. Para aquellos que no seáis aficionados a la criptografía podemos traducirlo como: &#8220;la hemos pifiado&#8221;.</p>
<p>El problema es &#8220;únicamente&#8221; de OpenSSL en Debian (y distribuciones derivadas)&#8230; es decir que programas como OpenSSH o OpenVPN o la generación de certificados desde finales del 2006 pueden estar afectados.</p>
<p>Está situación exige una actualización inmediata de todos los sistemas que puedan estar afectados, de hecho si habéis actualizado vuestras máquinas en la última semana habréis sufrido una regeneración forzosa de las claves de los servicios de SSH.</p>
<p>A fin de validar de las llaves se ha incluido una serie de paquetes de definiciones de llaves comprometidas: openssl-blacklist, openssh-blacklist y openvpn-blacklist. Estos paquetes incluyen una función de comprobación que deniega el acceso si se usan llaves comprometidas. Si últimamente el uso de ssh os ha pedido la clave manualmente es que vuestra llave está comprometida.</p>
<p>Para comprobar las llaves ssh de vuestro sistema podéis ejecutar como root: ssh-vulnkey -a</p>
<p>Tenéis más información en:</p>
<ul>
<li><a href="http://wiki.debian.org/SSLkeys">SSL keys en la Wiki de Debian</a></li>
<li><a href="http://metasploit.com/users/hdm/tools/debian-openssl/">Debian OpenSSL Predictable PRNG Toys</a></li>
</ul>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/42/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/42/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/42/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/42/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/42/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=42&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/05/25/openssl-vulnerable-en-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>Apache Ant, primeros pasos creando un build.xml</title>
		<link>http://blog.chernando.eu/2008/03/02/tutorial-ant-buildxml/</link>
		<comments>http://blog.chernando.eu/2008/03/02/tutorial-ant-buildxml/#comments</comments>
		<pubDate>Sun, 02 Mar 2008 17:34:47 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://chernando.wordpress.com/?p=37</guid>
		<description><![CDATA[Uno de los inconvenientes en la construcción de software con más de dos ficheros (cualquier cosa que se salga de un &#8220;Hello world!&#8221;) es el proceso de compilación: orden de compilación de ficheros, dependencias, rutas de librerías internas, etc&#8230; En esta entrada vamos a dar los primeros pasos en una de las soluciones más comunes [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=37&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Uno de los inconvenientes en la construcción de software con más de dos ficheros (cualquier cosa que se salga de un &#8220;Hello world!&#8221;) es el proceso de compilación: orden de compilación de ficheros, dependencias, rutas de librerías internas, etc&#8230; En esta entrada vamos a dar los primeros pasos en una de las soluciones más comunes para proyectos Java: <a href="http://ant.apache.org/">Apache Ant</a>.</p>
<p>Para los impacientes: al final de la entrada encontraréis el build.xml con todo lo explicado que seguramente os sirva tal cuál.</p>
<p>En primer lugar creamos un fichero build.xml en el raíz de nuestro proyecto y definimos su nombre:</p>
<pre>&lt;project name="Proyecto"&gt;
&lt;/project&gt;</pre>
<p>Ant, al igual que otras herramientas de construcción, se basa en el concepto de objetivos o <em>targets</em> cuya definición engloba tanto las dependencias previas como los pasos a seguir para conseguirlo.</p>
<p>Vamos a comenzar definiendo un objetivo de preparación llamado <em>init</em> que será el encargado de crear un directorio <em>classes</em> donde guardaremos los ficheros <em>.class</em> resultantes de la compilación y el directorio <em>build</em> para el .<em>jar</em> final. Para ello basta incluir dentro de &lt;project&gt; las siguientes líneas:</p>
<pre>&lt;target name="init"&gt;
	&lt;mkdir dir="classes" /&gt;
 	&lt;mkdir dir="build" /&gt;
&lt;/target&gt;</pre>
<p>Como podemos ver los objetivos se delimitan con etiquetas <strong>&lt;target&gt;</strong> y un nombre. Dentro de ellos se enumeran los pasos que se han de seguir para alcanzar el objetivo, en este caso ha de crear directorios.</p>
<p>Si queremos alcanzar el objetivo <em>init</em> basta con realizar:</p>
<pre>$ ant init
Buildfile: build.xml

init:
    [mkdir] Created dir: /home/chernando/proyecto/classes
    [mkdir] Created dir: /home/chernando/proyecto/build

 BUILD SUCCESSFUL
Total time: 0 seconds</pre>
<p>Es hora de compilar nuestro proyecto, vamos a definir el objetivo <em>compile</em>. Ahora bien, la compilación depende de la creación del directorio <em>classes</em> que se realiza objetivo anterior. Con esto en cuenta basta con incluir:</p>
<pre>&lt;target name="compile" depends="init"&gt;
	&lt;javac srcdir="src" destdir="classes" /&gt;
&lt;/target&gt;</pre>
<p>La dependencia se fija en la declaración del <em>target</em> de tal manera que se garantiza su cumplimiento antes de comenzarla. Nuestro código está en el directorio <em>src</em> y el resultado de la compilación se lleva al directorio <em>classes</em>.</p>
<p>Importante notar que esta vez estamos usando <strong>&lt;javac&gt;</strong> esto es lo que Ant se denomina tarea. Hay muchas tareas predefinidas, consultad el <a href="http://ant.apache.org/manual/index.html">manual de ant</a>.</p>
<p>Con nuestro proyecto compilado vamos a generar el .<em>jar</em> que distribuiremos haciendo uso de un nuevo objetivo llamado <em>build</em>.</p>
<pre>&lt;target name="build" depends="compile"&gt;
  	&lt;jar destfile="build/proyecto.jar" basedir="classes" /&gt;
&lt;/target&gt;</pre>
<p>En este caso dependemos de los frutos de <em>compile</em> y utilizamos la tarea <em>jar</em> que se encarga de empaquetar todo el contenido del directorio <em>classes</em> en el fichero <em>proyecto.jar</em>.</p>
<p>Finalmente incluiremos un nuevo objetivo para limpiar todo el entorno, el objetivo <em>clean</em>:</p>
<pre>&lt;target name="clean"&gt;
  	&lt;delete dir="classes" /&gt;
  	&lt;delete dir="build" /&gt;
&lt;/target&gt;</pre>
<p>A estas alturas es fácil entender que lo único que realiza es eliminar los directorios de trabajo dejando el entorno limpio del proceso de compilación.</p>
<p>Resumiendo nuestro fichero build.xml es:</p>
<pre> &lt;project name="Proyecto"&gt;
        &lt;target name="init"&gt;
                &lt;mkdir dir="classes" /&gt;
                &lt;mkdir dir="build" /&gt;
        &lt;/target&gt;
        &lt;target name="compile" depends="init"&gt;
                &lt;javac srcdir="src" destdir="classes" /&gt;
        &lt;/target&gt;
        &lt;target name="build" depends="compile"&gt;
                &lt;jar destfile="build/proyecto.jar" basedir="classes" /&gt;
        &lt;/target&gt;
        &lt;target name="clean"&gt;
                &lt;delete dir="classes" /&gt;
                &lt;delete dir="build" /&gt;
        &lt;/target&gt;
&lt;/project&gt;</pre>
<p>Y hasta aquí este minitutorial sobre el uso de ant <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/37/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/37/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=37&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/03/02/tutorial-ant-buildxml/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>Curso de introducción de CSS</title>
		<link>http://blog.chernando.eu/2008/03/01/curso-css/</link>
		<comments>http://blog.chernando.eu/2008/03/01/curso-css/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 20:32:54 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=38</guid>
		<description><![CDATA[Hemos publicado el material del curso que realizamos Ana y yo el pasado martes 26 de febrero en la web del Capítulo de la ACM. Cualquier comentario será bien recibido  
http://acm.asoc.fi.upm.es/documentos/
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=38&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Hemos publicado el material del curso que realizamos Ana y yo el pasado martes 26 de febrero en la web del Capítulo de la ACM. Cualquier comentario será bien recibido <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a href="http://acm.asoc.fi.upm.es/documentos/">http://acm.asoc.fi.upm.es/documentos/</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/38/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/38/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/38/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=38&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/03/01/curso-css/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>&#8220;The Ultimate Student Resource List&#8221; en lifehack.org</title>
		<link>http://blog.chernando.eu/2008/01/27/student-resource/</link>
		<comments>http://blog.chernando.eu/2008/01/27/student-resource/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 16:06:17 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Miscelánea]]></category>
		<category><![CDATA[estudio]]></category>

		<guid isPermaLink="false">http://chernando.wordpress.com/?p=34</guid>
		<description><![CDATA[Con los exámenes a la vuelta de la esquina Lifehack.org nos ofrece una selección de los mejores recursos para estudiantes:
The Ultimate Student Resource List
Solamente se echa en falta el gran clásico de El rincón del vago.
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=34&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Con los exámenes a la vuelta de la esquina <a href="http://www.lifehack.org/">Lifehack.org</a> nos ofrece una selección de los mejores recursos para estudiantes:</p>
<p><a href="http://www.lifehack.org/articles/productivity/the-ultimate-student-resource-list.html">The Ultimate Student Resource List</a></p>
<p>Solamente se echa en falta el gran clásico de <a href="http://www.rincondelvago.com/">El rincón del vago</a>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/34/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/34/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=34&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/01/27/student-resource/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>Wii, mucho más que una consola</title>
		<link>http://blog.chernando.eu/2008/01/22/wii-mucho-mas-que-una-consola/</link>
		<comments>http://blog.chernando.eu/2008/01/22/wii-mucho-mas-que-una-consola/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 19:14:24 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Miscelánea]]></category>
		<category><![CDATA[wii]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/2008/01/22/wii-mucho-mas-que-una-consola/</guid>
		<description><![CDATA[Lo realmente curioso de los ingenieros es que nunca se contentan con algo que simplemente funciona, siempre tienen que ir un paso más allá.  Este es el caso de Johnny Chung Lee y la Wii.
En su sección de proyectos Wii este simpático personaje explica, de forma bastante clara, las posibilidades a la hora de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=33&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Lo realmente curioso de los ingenieros es que nunca se contentan con algo que simplemente funciona, siempre tienen que ir un paso más allá.  Este es el caso de <a href="http://johnnylee.net/">Johnny Chung Lee</a> y la Wii.</p>
<p>En su sección de <a href="http://www.cs.cmu.edu/~johnny/projects/wii/">proyectos Wii</a> este simpático personaje explica, de forma bastante clara, las posibilidades a la hora de trabajar con la interacción con el usuario. Uno de los ejemplos a destacar es un interfaz parecido al propuesto en la película de Minority Report, como se puede ver en el siguiente vídeo:</p>
<p><span style="text-align:center; display: block;"><a href="http://blog.chernando.eu/2008/01/22/wii-mucho-mas-que-una-consola/"><img src="http://img.youtube.com/vi/0awjPUkBXOU/2.jpg" alt="" /></a></span></p>
<p>Pero el caso realmente impresionante es el control de la perspectiva del usuario y el efecto 3D que consigue recrear. El siguiente vídeo es de obligada visualización:</p>
<p><span style="text-align:center; display: block;"><a href="http://blog.chernando.eu/2008/01/22/wii-mucho-mas-que-una-consola/"><img src="http://img.youtube.com/vi/Jd3-eiid-Uw/2.jpg" alt="" /></a></span></p>
<p>Simplemente un pequeño genio <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/33/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/33/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=33&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/01/22/wii-mucho-mas-que-una-consola/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>

		<media:content url="http://img.youtube.com/vi/0awjPUkBXOU/2.jpg" medium="image" />

		<media:content url="http://img.youtube.com/vi/Jd3-eiid-Uw/2.jpg" medium="image" />
	</item>
		<item>
		<title>Jugando con DCOP, cambiando el fondo de pantalla</title>
		<link>http://blog.chernando.eu/2007/12/05/dcop-kdesktop/</link>
		<comments>http://blog.chernando.eu/2007/12/05/dcop-kdesktop/#comments</comments>
		<pubDate>Wed, 05 Dec 2007 20:23:39 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[dcop]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[wallpaper]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/2007/12/05/dcop-kdesktop/</guid>
		<description><![CDATA[Si hacéis uso de la utilidad &#8220;Slide Show&#8221; de kdesktop para gestionar el fondo de pantalla puede que esta entrada os sea útil.
El problema radica es que una vez fijado el directorio del que elegir el fondo no se puede hacer un &#8220;pasa al siguiente&#8221;. O al menos yo no lo he encontrado  
La [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=32&subd=chernando&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Si hacéis uso de la utilidad &#8220;Slide Show&#8221; de kdesktop para gestionar el fondo de pantalla puede que esta entrada os sea útil.</p>
<p>El problema radica es que una vez fijado el directorio del que elegir el fondo no se puede hacer un &#8220;pasa al siguiente&#8221;. O al menos yo no lo he encontrado <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>La posible solución era probar haciendo uso de DCOP y ha resultado tan sencillo&#8230; en fin, aquí tenéis el comando para forzar un avance dentro de la colección:</p>
<pre>$ dcop kdesktop KBackgroundIface changeWallpaper</pre>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/32/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/32/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/32/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&blog=827394&post=32&subd=chernando&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2007/12/05/dcop-kdesktop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
	</channel>
</rss>