<?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 &#187; tutorial</title>
	<atom:link href="http://blog.chernando.eu/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chernando.eu</link>
	<description>Simplemente otro blog personal</description>
	<lastBuildDate>Wed, 01 Feb 2012 12:58:24 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.chernando.eu' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/0eb8b53f0c14a196e38f0abba5641993?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Soldat&#039;s log &#187; tutorial</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&amp;blog=827394&amp;post=43&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="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/gofacebook/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=827394&amp;post=43&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/07/20/subversion-trac-apache-ldap/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=wavatar&#38;r=PG" 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&amp;blog=827394&amp;post=37&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="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://s0.wp.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/gofacebook/chernando.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/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&amp;blog=827394&amp;post=37&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2008/03/02/tutorial-ant-buildxml/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=wavatar&#38;r=PG" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>Cifrando una partición con cryptsetup</title>
		<link>http://blog.chernando.eu/2007/09/17/cifrando-una-particion-con-cryptsetup/</link>
		<comments>http://blog.chernando.eu/2007/09/17/cifrando-una-particion-con-cryptsetup/#comments</comments>
		<pubDate>Mon, 17 Sep 2007 17:50:50 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[criptografía]]></category>
		<category><![CDATA[cryptsetup]]></category>
		<category><![CDATA[luks]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/2007/09/17/cifrando-una-particion-con-cryptsetup/</guid>
		<description><![CDATA[Disponemos de un ordenador portátil (en este caso concreto una Kubuntu Gutsy) con una partición destinada a /home que queremos cifrar. Esta solución no es de las más seguras, quedando por tratar temas importantes como el cifrado de swap, controlar la integridad del sistema y el correcto manejo de los ficheros temporales. Los pasos son [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=28&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Disponemos de un ordenador portátil (en este caso concreto una Kubuntu Gutsy) con una partición destinada a <em>/home</em> que queremos cifrar.</p>
<p>Esta solución no es de las más seguras, quedando por tratar temas importantes como el cifrado de swap, controlar la integridad del sistema y el correcto manejo de los ficheros temporales.</p>
<p>Los pasos son los siguientes:</p>
<ol>
<li>Ciframos la partición física con <a title="a device-mapper crypto target" href="http://www.saout.de/misc/dm-crypt/">crypsetup</a> y <a title="Linux Unified Key Setup" href="http://luks.endorphin.org/">LUKS</a>:
<pre># cryptsetup luksFormat /dev/sda6</pre>
</li>
<li>Mapeamos lógicamente el dispositivo descifrado:
<pre># cryptsetup luksOpen /dev/sda6 home</pre>
</li>
<li>Trabajamos como si fuera una partición normal:
<pre># mkfs.ext3 /dev/mapper/home
# mount -t ext3 /dev/mapper/home /home</pre>
</li>
</ol>
<p>Para realizar el montaje automático de la partición en el arranque es necesario modificar los ficheros <em>/etc/crypttab</em> y <em>/etc/fstab</em>:</p>
<ul>
<li>crypttab:
<pre># &lt;target name&gt; &lt;source device&gt;         &lt;key file&gt;      &lt;options&gt;
home    /dev/sda6       none    luks</pre>
</li>
<li>fstab:
<pre>/dev/mapper/home        /home   ext3    defaults        0       2</pre>
</li>
</ul>
<p>Con la configuración mostrada se pedirá la contraseña en el momento del arranque.</p>
<p>Podéis encontrar ejemplos más interesantes en la documentación de LUKS o simplemente buscando por Google.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/28/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/28/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/28/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/28/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/28/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=28&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2007/09/17/cifrando-una-particion-con-cryptsetup/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=wavatar&#38;r=PG" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>Trac, gestión de proyectos</title>
		<link>http://blog.chernando.eu/2007/07/10/trac/</link>
		<comments>http://blog.chernando.eu/2007/07/10/trac/#comments</comments>
		<pubDate>Tue, 10 Jul 2007 18:38:17 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[trac]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/2007/07/10/trac/</guid>
		<description><![CDATA[Trac es una herramienta de gestión de proyectos, principalmente de software, que unifica un sistema wiki con un sistema de seguimiento (issue tracking) con claras ventajas a la hora de trabajar con un repositorio de subversion. Esta entrada constituye una breve guía de iniciación a Trac. Instalación Una vez instalado el programa (utilizando el gestor [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=25&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://trac.edgewall.org/">Trac</a> es una herramienta de gestión de proyectos, principalmente de software, que unifica un sistema wiki con un sistema de seguimiento (issue tracking) con claras ventajas a la hora de trabajar con un repositorio de subversion.</p>
<p>Esta entrada constituye una breve guía de iniciación a Trac.</p>
<p><span id="more-25"></span></p>
<h3>Instalación</h3>
<p>Una vez instalado el programa (utilizando el gestor de paquetes según la distribución utilizada) disponemos de varios métodos para ponerlo en funcionamiento: como un CGI, con Apache y mod_python o con el servidor que viene incluido. Para esta guía utilizaré el servidor incluido.</p>
<h3>Creación de un nuevo entorno</h3>
<p>Haciendo uso de trac-admin podemos crear un nuevo entorno:</p>
<pre>$ trac-admin /srv/trac/proyecto initenv

Creating a new Trac environment at /home/chernando/trac/proyecto

Trac will first ask a few questions about your environment
in order to initalize and prepare the project database.

Please enter the name of your project.
This name will be used in page titles and descriptions.

Project Name [My Project]&gt; <kbd>Proyecto</kbd>

Please specify the connection string for the database to use.
By default, a local SQLite database is created in the environment
directory. It is also possible to use an already existing
PostgreSQL database (check the Trac documentation for the exact
connection string syntax).

Database connection string [sqlite:db/trac.db]&gt;

Please specify the type of version control system,
By default, it will be svn.

If you don't want to use Trac with version control integration,
choose the default here and don't specify a repository directory.
in the next question.

Repository type [svn]&gt;

Please specify the absolute path to the version control
repository, or leave it blank to use Trac without a repository.
You can also set the repository location later.

Path to repository [/path/to/repos]&gt; <kbd>/srv/svn/proyecto</kbd>

Please enter location of Trac page templates.
Default is the location of the site-wide templates installed with Trac.

Templates directory [/usr/share/trac/templates]&gt;
...</pre>
<p>Con esto tendremos una mínima configuración funcional de Trac para nuestro proyecto.</p>
<h3>Comprobación rápida con el servidor incluido</h3>
<p>Para comprobar el aspecto que van teniendo las cosas utilizaremos el servidor incluido en el puerto 8000:</p>
<p><kbd>$ tracd -p 8000 /srv/trac/proyecto</kbd></p>
<p>Abriendo un navegador en http://localhost:8000/ podremos contemplar el entorno por defecto. Aprovechando el objetivo didáctico de este ejemplo os animo a que juguéis con la wiki y sistema de tickets.</p>
<h3>Personalización del entorno</h3>
<p>En el fichero proyecto/conf/trac.ini podréis encontrar cosas como [header_logo] que os permitirá cambiar el logotipo o como [project] para fijar el nombre, URLs relacionadas y demás.</p>
<p>Además en el directorio proyecto/templates podéis añadir vuestras propias plantillas que tendrán preferencia sobre las del sistema.</p>
<h3>Ajustando detalles sobre nuestro proyecto: componentes e hitos</h3>
<p>trac-admin crea una serie de componentes y de hitos genéricos que con toda seguridad no nos servirán para nuestro proyecto.  Para gestionar estos detalles utilizaremos trac-admin de nuevo.</p>
<p><kbd>$ trac-admin /srv/trac/proyecto</kbd></p>
<p>Con esto tendremos una shell interactiva con la que podremos ajustar los detalles que necesitemos. Por ejemplo para cambiar los componentes podemos realizar:</p>
<pre>&gt; <kbd>component list</kbd>

Name        Owner
--------------------
component1  somebody
component2  somebody

&gt; <kbd>component rename component1 interfaz</kbd>
&gt; <kbd>component chown interfaz ana</kbd>
&gt; <kbd>component rename component2 datos</kbd>
&gt; <kbd>component chown datos beatriz</kbd>
&gt; <kbd>component add nucleo</kbd>
&gt; <kbd>component add nucleo carlos</kbd>
&gt; <kbd>component list</kbd>

Name      Owner
-----------------
datos     beatriz
interfaz  ana
nucleo    carlos</pre>
<p>Con esto ya tenemos creados 3 componentes (ajustando el responsable de cada componente)  que quedarán reflejados en el sistema de tickets. Veamos ahora modificación de los hitos:</p>
<pre>&gt; <kbd>milestone list</kbd>

Name        Due  Completed
--------------------------
milestone1
milestone2
milestone3
milestone4

Trac [/tmp/trac/proyecto]&gt; milestone rename milestone1 0.1
Trac [/tmp/trac/proyecto]&gt; milestone rename milestone2 0.2
Trac [/tmp/trac/proyecto]&gt; milestone rename milestone3 1.0
Trac [/tmp/trac/proyecto]&gt; milestone rename milestone4 2.0
Trac [/tmp/trac/proyecto]&gt; milestone list

Name  Due  Completed
--------------------
0.1
0.2
1.0
2.0</pre>
<p>Ajustemos las fechas de entrega de cada hito:</p>
<pre>Trac [/tmp/trac/proyecto]&gt; milestone due 0.1 2007-07-01
Trac [/tmp/trac/proyecto]&gt; milestone due 0.2 2007-09-01
Trac [/tmp/trac/proyecto]&gt; milestone due 1.0 2008-01-01
Trac [/tmp/trac/proyecto]&gt; milestone due 2.0 2009-01-01
Trac [/tmp/trac/proyecto]&gt; milestone list

Name  Due         Completed
---------------------------
0.1   2007-07-01
0.2   2007-09-01
1.0   2008-01-01
2.0   2009-01-01</pre>
<p>Una vez completado un hito podremos utilizar el comando milestone completed:</p>
<p>&gt; <kbd>milestone completed 0.1 now</kbd></p>
<p>Podéis curiosear más opciones haciendo uso del comando help dentro de la shell.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/25/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/25/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=25&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2007/07/10/trac/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=wavatar&#38;r=PG" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>CVS: Manejando ramas</title>
		<link>http://blog.chernando.eu/2007/03/07/cvs-ramas/</link>
		<comments>http://blog.chernando.eu/2007/03/07/cvs-ramas/#comments</comments>
		<pubDate>Wed, 07 Mar 2007 18:32:06 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[branches]]></category>
		<category><![CDATA[control versiones]]></category>
		<category><![CDATA[cvs]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://chernando.wordpress.com/2007/03/07/cvs-branches/</guid>
		<description><![CDATA[Hace algunos años publiqué una breve guía práctica de CVS, incompleta. Aprovechando que tengo algo de tiempo he decidido tachar este punto de mi lista de tareas Creando una nueva rama Antes de nada hemos de recordar que necesitamos una versión etiquetada, por ejemplo &#8216;v1_2&#8242;, sobre la que vamos a trabajar. Comenzamos extrayendo la versión [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=14&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hace algunos años publiqué una breve <a href="http://acm.asoc.fi.upm.es/~chernando/doc/cvs/">guía práctica de CVS</a>, incompleta. Aprovechando que tengo algo de tiempo he decidido tachar este punto de mi lista de tareas <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>Creando una nueva rama</strong></p>
<p>Antes de nada hemos de recordar que necesitamos una versión etiquetada, por ejemplo &#8216;v1_2&#8242;, sobre la que vamos a trabajar. Comenzamos extrayendo la versión a nuestro entorno de trabajo:</p>
<p><code>$ cvs checkout -d proyecto-1.2 -r v1_2 proyecto</code></p>
<p>Procedamos a crear la rama propiamente dicha:</p>
<p><code>$ cd proyecto-1.2<br />
$ cvs tag -b v1_2-branch</code></p>
<p>El nombre de la rama es un gusto personal, yo prefiero añadir <em>-branch</em> aunque he visto <em>-bugfixes</em> o combinaciones de ambos.</p>
<p>Con estos simples pasos ya disponemos de una rama de desarrollo a la que podemos acceder, por ejemplo para hacer un cambio a la rama:</p>
<p><code>$ pwd<br />
/home/chernando/proyecto<br />
$ cvs up -r v1_2-branch</code></p>
<p>Si revisamos el estado de &#8216;main.c&#8217; podemos ver que está incluido en una rama:</p>
<p><code>$ cvs -q status main.c<br />
==================================================================<br />
Working revision:    1.1.2.1 2007-03-07 19:06:39 +0100<br />
Repository revision: 1.1.2.1 /tmp/repositorio/proyecto/main.c,v<br />
Commit Identifier:   QwJwh9fAP56fxb9s<br />
Sticky Tag:          v1_2-branch (branch: 1.1.2)<br />
Sticky Date:         (none)<br />
Sticky Options:      (none)</code></p>
<p>Importante fijarse en el cambio en la numeración, a partir de ahora en vez de avanzar con 1.<em>X</em>, se avanza con 1.<em>N</em>.<em>X</em>, siendo <em>N</em> la numeración de la rama.</p>
<p><strong>Mezclando dos ramas</strong></p>
<p>Bien, supongamos que queremos traernos cambios realizados desde una rama,&#8217;v1_2-branch&#8217;, a la principal. Muy fácil, haremos como si forzáramos un cambio de una versión anterior pero especificando la rama en vez de la revisión:</p>
<p><code>$  cvs update -j v1_2-branch main.c<br />
RCS file: /tmp/repositorio/proyecto/main.c,v<br />
retrieving revision 1.1<br />
retrieving revision 1.1.2.1<br />
Merging differences between 1.1 and 1.1.2.1 into main.c<br />
$ cvs commit -m 'Cambios desde la rama v1.2' main.c</code></p>
<p>Hay un problema: no podemos hacer esta jugada dos veces seguidas sin dar conflictos <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Supongamos que queremos volver a traernos un cambio desde la rama &#8216;v1_2-branch&#8217; con el comando <em>update</em>. El diferencial de cambios para hacer la mezcla se hace desde la base de la derivación de la rama, si ya hemos aplicado parte de ese diferencial en una actualización anterior provocará irremediablemente un conflicto.</p>
<p>La solución para evitar el engorro de trabajar con conflictos es utilizar una referencia de la rama justo después de traer los cambios. Dos opciones principales:</p>
<ul>
<li>Etiquetar la rama cada vez que se traen cambios de ellas, &#8216;v1_2- branch-fixes-1&#8242;.</li>
<li>Utilizar las nociones de tiempo de CVS, &#8216;v1_2-branch:3 days ago&#8217;.</li>
</ul>
<p>La idea intuitiva es la de señalar en el historial de la rama dos marcas de tiempo, la última que se llevo a la principal y el actual de la rama, y aplicar los cambios que se realizaron entre esos dos instantes en la rama en la principal. Por ejemplo:</p>
<p><code>$ cvs update -j v1_2-branch-fixes-1 -j v1_2branch</code></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=14&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2007/03/07/cvs-ramas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=wavatar&#38;r=PG" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
		<item>
		<title>svk</title>
		<link>http://blog.chernando.eu/2006/01/26/svk-mas-que-un-subversion-distribuido/</link>
		<comments>http://blog.chernando.eu/2006/01/26/svk-mas-que-un-subversion-distribuido/#comments</comments>
		<pubDate>Thu, 26 Jan 2006 10:21:01 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[control versiones]]></category>
		<category><![CDATA[dcvs]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svk]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://chernando.wordpress.com/2006/01/26/svk-mas-que-un-subversion-distribuido/</guid>
		<description><![CDATA[En la línea de la última entrada voy a comentar brevemente un ejemplo de uso / tutorial de svk. svk está basado en el sistema de ficheros de subversion, está escrito en Perl y cuenta con varias mejoras que le permiten ser un decentralized version control system. Su principal objetivo es permitir a un desarrollador [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=7&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En la línea de la <a href="http://chernando.wordpress.com/2006/01/25/sistemas-de-control-de-versiones-distribuidos/">última entrada</a> voy a comentar brevemente un ejemplo de uso / tutorial de  <a href="http://svk.elixus.org/">svk</a>.</p>
<p>svk está basado en el sistema de ficheros de <a href="http://subversion.tigris.org/">subversion</a>, está escrito en Perl y cuenta con varias mejoras que le permiten ser un <em>decentralized version control system</em>. Su principal objetivo es permitir a un desarrollador disponer de sus propias ramas privadas facilitando enormemente el proceso de <em>merge</em>.</p>
<p>La situación es la siguiente: disponemos de un repositorio central con un proyecto en el que estamos trabajando. Mediante svk vamos a hacer una copia del repositorio, vamos a mantenerlo actualizado y vamos a crear nuestra propia rama de trabajo.</p>
<p><span id="more-7"></span></p>
<p><strong>Preparando nuestro entorno</strong></p>
<p>En primer lugar crearemos un repositorio en el que vamos a guardar la copia del repositorio central:</p>
<p><code>svk depotmap --init</code></p>
<blockquote><p>Este comando creará en <tt>~/.svk/local</tt> un repositorio típico de subversion al que podremos acceder cómodamente mediante la ruta <tt>//</tt>.</p></blockquote>
<p>Disponemos de <tt>//</tt> para guardar los proyectos que necesitemos, en este caso realizaremos una copia local de un proyecto externo.</p>
<p><code>svk mirror https://acm.asoc.fi.upm.es/svn/jurix/jailexec/trunk //jailexec</code></p>
<p>y para actualizar su contenido:</p>
<p><code>svk sync //jailexec</code></p>
<blockquote><p>Durante el proceso de este comando veremos como svk descarga todo los commits realizados en el repositorio central y los replica en nuestro repositorio local, de esta forma conseguiremos disponer de una copia local de todo el repositorio (incluido historial y diferencias).</p>
<p><strong>Importante</strong>: resaltar que utilizamos la ruta <tt>//jailexec</tt> para especificar el lugar en el que hacemos la copia.</p></blockquote>
<p>Bien, ya tenemos todo lo necesario. Podemos desconectarnos de la red hasta que necesitemos o bien subir nuevos cambios o bien actualizarnos con los cambios del repositorio central.</p>
<p><strong>El trabajo del día a día</strong></p>
<p>Ahora crearemos nuestra copia local de trabajo, al igual que hacíamos con svn o cvs:</p>
<p><code>svk checkout //jailexec</code></p>
<blockquote><p>Esto creará un directorio <tt>jailexec</tt> en el que tendremos una copia local de trabajo. Un detalle curioso es que no existen directorios especiales <tt>.svk</tt> ya que las copias de trabajo se gestionan internamente.  Hay que tenerlo en cuenta a la hora de eliminar una copia de trabajo, un simple <code>rm -rf proyecto</code> no es recomendable.</p></blockquote>
<p>A partir de aquí el ciclo de trabajo es el mismo. La única diferencia es que estamos trabajando contra un repositorio local &#8211;nuestra copia del repositorio central&#8211; por lo que algunos comandos tendrán comportamientos distintos.</p>
<ul>
<li><tt>commit</tt>: si realizamos un commit contra nuestro repositorio svk forzará automáticamente el envio contra el repositorio central, es transparente al usuario.</li>
<li><tt>update</tt>: actualizaremos respecto a nuestro repositorio, por lo que si no realizamos un <tt>sync</tt> previo (apartado anterior) no tiene mucho sentido.</li>
</ul>
<p><strong>Manejo de ramas</strong></p>
<p>Hasta el momento disponemos de una copia del repositorio central, vamos a trabajar con las ramas privadas:</p>
<p><code>svk cp -p //jailexec //local/jailexec</code></p>
<blockquote><p>La opción <tt>-p</tt> es para crear <tt>//local</tt>.</p></blockquote>
<p>Hemos creado <tt>//local/jailexec</tt> como una rama solamente disponible en nuestro repositorio local, nuestra rama privada.</p>
<p><code>svk checkout //local/jailexec</code><br />
o<br />
<code>svk switch //local/jailexec</code></p>
<p>Nos prepara el entorno de trabajo sobre nuestra rama privada. A partir de ahora los cambios y el historial permaneceran en nuestro repositorio, sin conocimiento alguno del repositorio central.</p>
<p>Supongamos que hemos estado trabajando sobre una rama privada y queremos subir los cambios al repositorio central. Aquí svk nos facilita las cosas:</p>
<p><code>svk smerge //local/jailexec //jailexec</code></p>
<blockquote><p>Este comando juntará ambas ramas de forma automática. No olvidemos que <tt>//jailexec</tt> es una copia del repositorio central por lo que al juntar ambas ramas se forzará el envio al repositorio central.</p></blockquote>
<p>Con un solo comando podemos enviar todos los cambios que hemos realizado en nuestra rama privada <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>La única pega resulta ser la actualización de nuestra rama privada respecto a las actualizaciones del repositorio central:</p>
<p><code>svk sync //jailexec</code><br />
<code>svk smerge //jailexec //local/jailexec</code><br />
<code>svk up</code> (en el directorio de nuestra copia local)</p>
<blockquote><p>Actualizamos nuestro repositorio local y luego juntamos los cambios en nuestra rama local. Por último actualizamos nuestra copia local de trabajo.</p></blockquote>
<p><strong>Resumen</strong></p>
<p>svk nos ofrece una estructura estupenda sobre la que trabajar y/o hacer copias de repositorios (oficialmente soporta Subversion, CVS y Perforcer) con una sintaxis idéntica a la de subversion.</p>
<p>El inconveniente es que el manejo resulta un poco complicado durante los primeros días.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/chernando.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/chernando.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=7&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2006/01/26/svk-mas-que-un-subversion-distribuido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/062f1c6b266029372b1705c017069e68?s=96&#38;d=wavatar&#38;r=PG" medium="image">
			<media:title type="html">chernando</media:title>
		</media:content>
	</item>
	</channel>
</rss>
