<?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>Fri, 20 Jan 2012 12:24: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</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>PHP, PEAR y PHPUnit para Yii en Mac OS X Lion</title>
		<link>http://blog.chernando.eu/2011/10/16/php-pear-y-phpunit-para-yii-en-mac-os-x-lion/</link>
		<comments>http://blog.chernando.eu/2011/10/16/php-pear-y-phpunit-para-yii-en-mac-os-x-lion/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 16:22:31 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=163</guid>
		<description><![CDATA[He tenido que montar un entorno de desarrollo para Yii, un framework de PHP, en mi Mac OS X Lion. Como he tenido que hacer varios apaños he recopilado todos los ajustes en esta entrada. Antes de nada enumero las versiones del software utilizadas: Mac OS X 10.7.2 PHP 5.3.6 PEAR 1.9.4 PHPUnit 3.5.15 Selenium [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=163&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>He tenido que montar un entorno de desarrollo para Yii, un framework de PHP, en mi Mac OS X Lion. Como he tenido que hacer varios apaños he recopilado todos los ajustes en esta entrada.</p>
<p>Antes de nada enumero las versiones del software utilizadas:</p>
<ul>
<li>Mac OS X 10.7.2</li>
<li>PHP 5.3.6</li>
<li>PEAR 1.9.4</li>
<li>PHPUnit 3.5.15</li>
<li>Selenium Server 2.8.0</li>
<li>Yii 1.1.8</li>
<li>Firefox 7.0.1</li>
</ul>
<p>La mayoría de las acciones que comento han de realizarse con permisos de administrador.</p>
<h3>Activar el servidor web con PHP</h3>
<p>Mac OS X Lion incluye Apache con soporte para PHP. Sin embargo es necesario activarlo. Para ello en <em>/etc/apache2/httpd.conf</em> descomentamos:</p>
<pre>LoadModule php5_module libexec/apache2/libphp5.so</pre>
<p>Y en <em>/etc</em> copiamos el fichero de configuración de fábrica:</p>
<pre># cp /etc/php.ini.default /etc/php.ini</pre>
<p><strong>Nota</strong>: personalmente prefiero que mis entornos de desarrollo y pruebas sean lo más privados posibles. Por ello modifico el <em>Listen</em> de <em>/etc/apache2/httpd.conf</em> a</p>
<pre>Listen 127.0.0.1:80</pre>
<p>Solamente resta activar el servidor web desde <em>System Preferences / Sharing / Web Sharing</em>.</p>
<p>El directorio que se publica como página principal está ubicado en <em>/Library/WebServer/Documents/</em> podemos utilizar directamente esta carpeta o bien utilizar carpetas personales ( http://localhost/<strong>~usuario</strong>/ ). La opción de carpetas personales busca el directorio <em>Sites</em> en el home del usuario, que se puede crear a partir del cuadro de configuración anterior.</p>
<p>Para probar que todo está funcionando lo más recomendable es publicar un fichero .php con un getinfo():</p>
<p><pre class="brush: php;">
&lt;?php
phpinfo();
?&gt;
</pre></p>
<h3>Instalar PEAR y PHPUnit</h3>
<p>En las versiones anteriores de Mac OS X PEAR está directamente instalado, en Lion es necesario hacer un paso previo:</p>
<pre><code># php /usr/lib/php/install-pear-nozlib.phar </code></pre>
<p>Con esto ya tenemos PEAR instalado. Actualizamos:</p>
<pre># pear upgrade-all</pre>
<p>configuramos el autodiscover (para hacernos las cosas más fáciles) e instalamos PHPUnit:</p>
<pre># pear config-set auto_discover 1
# pear install pear.phpunit.de/PHPUnit</pre>
<p>Solamente nos falta un detalle más, añadir el software instalado por PEAR a la configuración de PHP. Añadimos al <em>/etc/php.ini</em>:</p>
<pre>include_path = "/usr/lib/php/pear/"</pre>
<p>Para comprobar que todo va bien comprobamos la versión de PHPUnit</p>
<pre># phpunit --version</pre>
<h3>Montar y ejecutar las pruebas de un proyecto Yii</h3>
<p>A partir de aquí lidiaremos con los problemas que surgen con Yii. Primero nos descargamos Yii y creamos un proyecto de prueba:</p>
<pre>$ yii/framework/yiic webapp demo</pre>
<h4>Problema con date.timezone</h4>
<p>Al acceder a la demo puede que nos muestre un mensaje de error como el siguiente:</p>
<p style="padding-left:30px;">It is not safe to rely on the system&#8217;s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function.</p>
<p>La solución más sencilla es configurar en <em>/etc/php.ini</em> el timezone, por ejemplo:</p>
<pre>date.timezone = "Europe/Madrid"</pre>
<h4>Problema con Selenium, arrancar Firefox</h4>
<p>Configuramos la URL para las pruebas en el fichero <em>protected/tests/WebTestCase.php</em>:</p>
<pre>define('TEST_BASE_URL','http://localhost/~chernando/demo/index-test.php/');</pre>
<p>Descargamos Selenium y lo dejamos ejecutando:</p>
<pre>$ java -jar selenium-server-standalone-2.8.0.jar</pre>
<p>e intentamos lanzar las pruebas funcionales del proyecto yii:</p>
<pre>$ cd demo/protected/tests/
$ phpunit functional/SiteTest.php</pre>
<p>Lo más probable es que falle el lanzamiento de iexplorer (bastante razonable en Mac OS X <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) o que no encuentre firefox-bin ya que no está en el path. Para solucionarlos editamos <em>protected/tests/phpunit.xml</em>, eliminamos:</p>
<pre>&lt;browser name="Internet Explorer" browser="*iexplore" /&gt;</pre>
<p>y modificamos la entrada del Firefox a nuestro, en mi caso es el siguiente:</p>
<pre>&lt;browser name="Firefox" browser="*firefox /Users/chernando/Applications/Firefox.app/Contents/MacOS/firefox-bin" /&gt;</pre>
<p>Con esto podremos ejecutar las pruebas funcionales.</p>
<h4>Problema con Selenium, fallan los test</h4>
<p>Después de llegar hasta aquí me sorprendió bastante que de los tres tests que vienen de fábrica fallaran dos <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Concretamente estos dos fallos:</p>
<p style="padding-left:30px;">Body cannot be blank.<br />
Failed asserting that &lt;boolean:false&gt; is true.</p>
<p style="padding-left:30px;">Password cannot be blank.<br />
Failed asserting that &lt;boolean:false&gt; is true.</p>
<p>Por suerte es un problema conocido y ya está corregido en el repositorio.</p>
<p>El problema es que no se espera a que se ejecuten las validaciones con JavaScript. El <a href="http://code.google.com/p/yii/source/diff?spec=svn3383&amp;r=3383&amp;format=side&amp;path=/trunk/framework/cli/views/webapp/protected/tests/functional/SiteTest.php">parche publicado</a> corrige un par de líneas en el fichero <em>protected/tests/functional/SiteTest.php</em> que cambia los dos <em>assert</em> que fallan por <em>waitFor</em>, consiguiendo el comportamiento esperado.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/163/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/163/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/163/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=163&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2011/10/16/php-pear-y-phpunit-para-yii-en-mac-os-x-lion/feed/</wfw:commentRss>
		<slash:comments>7</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>Homebrew, gestión de paquetes en Mac OS X</title>
		<link>http://blog.chernando.eu/2011/09/22/hombrew-mac-os-x/</link>
		<comments>http://blog.chernando.eu/2011/09/22/hombrew-mac-os-x/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 14:15:45 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[brew]]></category>
		<category><![CDATA[Fink]]></category>
		<category><![CDATA[MacPorts]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=143</guid>
		<description><![CDATA[Homebrew es un sistema de gestión de paquetes de software para Mac OS X como podría ser un apt en sistemas GNU/Linux pero sin distribución de paquetes precompilados. Gestión de paquetes en Mac OS X Apple propone el App Store como sistema para obtener software y mantenerlo actualizado. Evidentemente solo las aplicaciones publicadas en el [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=143&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://mxcl.github.com/homebrew/">Homebrew</a> es un sistema de gestión de paquetes de software para Mac OS X como podría ser un apt en sistemas GNU/Linux pero sin distribución de paquetes precompilados.</p>
<h3>Gestión de paquetes en Mac OS X</h3>
<p>Apple propone el App Store como sistema para obtener software y mantenerlo actualizado. Evidentemente solo las aplicaciones publicadas en el Apple Store pueden ser mantenidas de esta manera. Y aún así la oferta es bastante limitada si nos fijamos en software Unix.</p>
<p>Otras opciones disponibles son <a href="http://www.macports.org/">MacPorts</a> o <a href="http://www.finkproject.org/">Fink</a>. Todos ellas tienen un planteamiento parecido y diferente al mismo tiempo. MacPorts y Fink plantean mantener todo el software a parte de la base de Mac OS X mientras que Homebrew prefiere utilizar al máximo la base propuesta por el sistema y construir únicamente lo que falte.</p>
<p>Este planteamiento tiene sus ventajas y sus inconvenientes:</p>
<ul>
<li>Al necesitar menos dependencias externas es más rápido.</li>
<li>Al utilizar las dependencias del sistema las cosas se pueden romper cuando el sistema las actualice.</li>
</ul>
<p>Por otro lado MacPorts y Fink, aunque más laboriosos tienen un entorno más controlado y por tanto más estable.</p>
<p>En resumen, depende de las necesidades de cada uno. En este artículo veremos el uso de habitual de Homebrew que probablemente sea el más ligero para empezar a probar.</p>
<h3>Requisitos</h3>
<p>Necesitamos el entorno de compilación de Mac OS X. Aunque algunas utilidades vienen ya instaladas de fábrica en el sistema, es recomendable (y en algunos casos indispensable) instalar Xcode. Lo podemos encontrar en el App Store.</p>
<h3>Instalación de Homebrew</h3>
<p>Desde la web oficial podemos acceder a la <a href="https://github.com/mxcl/homebrew/wiki/installation">guía de instalación</a>. En la práctica se reduce a ejecutar (a fecha de este artículo):</p>
<p><code>/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"</code></p>
<p>La instalación se realiza en <em>/usr/local</em> por lo que o bien lo ejecutamos como administrador o bien nos damos de permisos para escribir en ese directorio.</p>
<h3>Actualizar el listado de fórmulas</h3>
<p>Homebrew utiliza el concepto de fórmula. Este concepto transmite la idea de cómo se obtiene un programa, es decir, sus dependencias y sus pasos de compilación.</p>
<p>El listado de fórmulas se mantiene en los repositorios de <a href="https://github.com/">GitHub</a>. Esto nos permite crear forks del proyecto, añadir nuestras fórmulas y demás. Veamos cómo se actualiza el listado:</p>
<pre>$ brew update
remote: Counting objects: 141, done.
remote: Compressing objects: 100% (63/63), done.
remote: Total 122 (delta 93), reused 88 (delta 59)
Receiving objects: 100% (122/122), 13.71 KiB, done.
Resolving deltas: 100% (93/93), completed with 18 local objects.
From http://github.com/mxcl/homebrew
   f34cda7..09ad71b  master     -&gt; origin/master
Updated Homebrew from f34cda74 to 09ad71bd.
[...]</pre>
<p>Es la salida típica de git. A partir de ahí veremos un resumen de las nuevas fórmulas añadidas y de las actualizadas.</p>
<h3>Buscar fórmulas</h3>
<p><em>brew search PATRÓN</em></p>
<h3>Mostrar información de una fórmula</h3>
<p>Tenemos la opción clásica:</p>
<p><em>brew info FÓRMULA</em></p>
<p>y la curiosa opción de visitar la página del proyecto:</p>
<p><em>brew home FÓRMULA</em></p>
<h3>Instalación de fórmulas</h3>
<p><em>brew install FÓRMULA</em></p>
<h3>Listar fórmulas antiguas</h3>
<p>En el proceso de actualización del listado de fórmulas se detectarán nuevas versiones de fórmulas ya instaladas:</p>
<p><em>brew outdated</em></p>
<h3>Actualización de paquetes</h3>
<p>Tenemos dos opciones</p>
<p><em>brew upgrade</em></p>
<p>que actualiza todos las fórmulas con nuevas versiones o</p>
<p><em>brew upgrade FÓRMULA</em></p>
<p>que actualiza únicamente la fórmula especificada.</p>
<h3>Eliminación de versiones antiguas</h3>
<p>Una curiosidad de Homebrew es que no desinstala versiones anticuadas para ello usamos:</p>
<p><em>brew cleanup</em></p>
<h3>Crear nuevas fórmulas</h3>
<p>Es bastante sencillo crear una fórmula nueva. Aunque el <a href="https://github.com/mxcl/homebrew/wiki/Formula-Cookbook">Formula Cookbook</a> es bastante claro, veremos brevemente los paso principales:</p>
<ol>
<li><em>brew create URL</em> (con la URL de la descarga)</li>
<li>Editar el fichero, creado automáticamente, en <em>/usr/local/Library/Formula/FÓRMULA.rb</em></li>
</ol>
<ol>
<li>Añadir las dependencias con depends_on.</li>
<li>Añadir los comandos system necesarios para la compilación</li>
</ol>
<ul>
<li>Probar la fórmula con <em>brew install -vd FÓRMULA</em></li>
</ul>
<h3>Más información</h3>
<ul>
<li><a href="http://mxcl.github.com/homebrew/">Homebrew</a></li>
<li><a href="https://github.com/mxcl/homebrew/wiki/FAQ">Homebrew FAQ</a></li>
<li><a href="https://github.com/mxcl/homebrew/wiki/Formula-Cookbook">Homebrew Formula Cookbook</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/143/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/143/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/143/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=143&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2011/09/22/hombrew-mac-os-x/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>NTP Sincronización de tiempos</title>
		<link>http://blog.chernando.eu/2011/09/15/ntp/</link>
		<comments>http://blog.chernando.eu/2011/09/15/ntp/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 14:15:17 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[*NIX]]></category>
		<category><![CDATA[ntp]]></category>
		<category><![CDATA[ntpd]]></category>
		<category><![CDATA[ntpdate]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=105</guid>
		<description><![CDATA[Uno de los principios que debemos mantener en nuestros equipos es mantenerlos en hora. En algunos es un requisito, por ejemplo sistemas de autenticación dependientes del tiempo, y en otros para mantener la cordura, por ejemplo para realizar un seguimiento de logs en distintas máquinas. La solución es el uso de NTP (Network Time Protocol) [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=105&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Uno de los principios que debemos mantener en nuestros equipos es mantenerlos en hora. En algunos es un requisito, por ejemplo sistemas de autenticación dependientes del tiempo, y en otros para mantener la cordura, por ejemplo para realizar un seguimiento de logs en distintas máquinas.</p>
<p>La solución es el uso de <a href="http://en.wikipedia.org/wiki/Network_Time_Protocol">NTP</a> (Network Time Protocol) que nos permite sincronizar los relojes de nuestros equipos y mantenerlos en hora con el paso del tiempo. Vamos a ver las configuraciones típicas usando <em>ntpdate</em> y el demonio <em>ntpd</em>.</p>
<p>Pero antes un breve comentario sobre el <a href="http://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_strata">stratum</a>. El número del stratum nos indica el número de pasos a los que estamos de un reloj atómico (nivel 0). Los relojes atómicos son muy precisos (no como los relojes de cuarzo) pero también muy caros, por lo que es habitual que se utilicen <a href="http://en.wikipedia.org/wiki/GPS_clock#GPS_clocks">relojes de GPS</a> como origen.</p>
<p>Existen multitud de servidores públicos de NTP. Una iniciativa que mantiene un pool abierto y que además realiza balanceo es <a href="http://www.pool.ntp.org/">NTP pool project</a>. Para este artículo utilizaremos de ejemplo <em>2.es.pool.ntp.org</em>.</p>
<h3><em>ntpdate</em>, para equipos itinerantes</h3>
<p><em>ntpdate</em> está pensando para utilizarse una sola vez. Lo lanzamos, obtiene el tiempo del servidor remoto y sincroniza la hora local. Por ejemplo:</p>
<pre># ntpdate 2.es.pool.ntp.org
 14 Sep 12:18:03 ntpdate[3359]: adjust time server 158.227.98.15 offset 0.000969 sec</pre>
<p>El uso más habitual es para equipos portátiles u ordenadores que no tienen conexión permanente a Internet. Los equipos esperan a tener conexión y efectúan la sincronización.</p>
<p>Un error habitual es que el socket esté en uso, normalmente por el demonio <em>ntpd</em>, que exige cerrar primero <em>ntpd</em> y luego lanzar <em>ntpdate</em>:</p>
<pre># ntpdate 2.es.pool.ntp.org
 14 Sep 12:21:57 ntpdate[3392]: the NTP socket is in use, exiting</pre>
<p>La configuración de <em>ntpdate</em> como servicio es muy sencilla, podemos echar un vistazo en <em>/etc/default/ntpdate</em> (sistemas Debian).</p>
<h3>Demonio <em>ntpd</em>, equipos con conexión permanente</h3>
<p>Si el equipo está conectado la gran parte del tiempo lo recomendable es utilizar el demonio <em>ntpd</em>. Evidentemente se encargará de mantener el equipo sincronizado con el paso del tiempo.</p>
<p>Existe una diferencia importante entre <em>ntpdate</em> y <em>ntpd</em>. <em>ntpd</em> realiza un ajuste sutil sobre la velocidad del reloj para compensar la deriva natural del reloj (drift). Esto tiene una repercusión: el tiempo es continuo (obviemos cuestiones metafísicas <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</p>
<p>Por ejemplo imaginemos que nuestro equipo está 5 minutos atrasado. <em>ntpd</em> intentará que el reloj “corra” hasta llegar a la sincronización sin saltarse ni un segundo (simplemente “cuenta los segundos más rápido”). <em>ntpdate</em> por otro lado al ver que la diferencia es mayor a medio segundo directamente “saltará” en el tiempo fijando la hora actual inmediatamente.</p>
<p>La práctica recomendada es arrancar el equipo con <em>ntpdate</em> y dejar que el demonio <em>ntpd</em> se haga cargo de mantener la hora.</p>
<p>La configuración es un poco más elaborada, ya que podemos configurarlo como servidor de NTP. El fichero de configuración <em>/etc/ntp.conf</em> está muy bien comentado y básicamente cambiando las directivas <em>server</em> por servidores locales (o del <a href="http://www.pool.ntp.org/">NTP pool project</a>) sería suficiente.</p>
<h3>Prestando servicio interno</h3>
<p>Si queremos sincronizar varios equipos dentro de nuestra red haremos que un par de equipos se sincronicen con servidores externos y al mismo tiempo presten ese servicio a nivel local. De esta forma, incluso si se cae la conexión, todos los equipos estarán sincronizados contra la misma fuente de referencia. Además es más educado y consume menos recursos <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Para ello simplemente es necesario revisar las directivas <em>restrict</em>.</p>
<h3>Broadcast</h3>
<p>La última modalidad es la sincronización por broadcast. En esta configuración un servidor local de NTP emite de forma regular la hora actual, los equipos que escuchen actualizan la hora. Es una configuración muy típica para desplegar equipos con conexión a red como impresoras, cámaras y dispositivos similares.</p>
<p>Para configurar al servidor para que emita hay que hacer uso de la directiva <em>broadcast</em>.</p>
<p>Para hacer que un equipo escuche las emisiones la directiva es <em>broadcastclient</em>.</p>
<h3>Más información</h3>
<ul>
<li><a href="http://www.eecis.udel.edu/~mills/ntp/html/index.html">The Network Time Protocol (NTP) Distribution</a></li>
<li><a href="http://www.pool.ntp.org/">NTP pool project</a></li>
<li><a title="NTP Server and Client Configuration in debian" href="http://www.debianadmin.com/ntp-server-and-client-configuration-in-debian.html" rel="bookmark">NTP Server and Client Configuration in debian</a></li>
<li><a href="http://wiki.debian.org/NTP">NTP Debian Wiki</a></li>
<li><a href="http://ocubom.wordpress.com/2008/06/18/sincronizacion-del-reloj-en-windows/">ocubom &#8211; Sincronización del reloj en Windows</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/105/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=105&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2011/09/15/ntp/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>Python generators</title>
		<link>http://blog.chernando.eu/2011/09/01/python-generators/</link>
		<comments>http://blog.chernando.eu/2011/09/01/python-generators/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 14:15:22 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Desarrollo Software]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=101</guid>
		<description><![CDATA[Todos conocemos las listas de Python mientras que sus hermanos los generadores son menos conocidos. Este breve artículo es un recordatorio El concepto de generador La idea de los Generators se basa en dos conceptos: los iteradores y la evaluación perezosa. Python utiliza el concepto de iterador de una forma muy natural, por ejemplo: Por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=101&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Todos conocemos las listas de Python mientras que sus hermanos los generadores son menos conocidos. Este breve artículo es un recordatorio <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>El concepto de generador</h3>
<p>La idea de los <a href="http://docs.python.org/tutorial/classes.html#generators">Generators</a> se basa en dos conceptos: los iteradores y la evaluación perezosa.</p>
<p>Python utiliza el concepto de <a href="http://docs.python.org/tutorial/classes.html#iterators">iterador</a> de una forma muy natural, por ejemplo:</p>
<p><pre class="brush: python;">
for i in elementos:
    print i
</pre></p>
<p>Por debajo el intérprete lo que hace es crear un iterador mediante el método <em>iter()</em> y avanzar posiciones con el método <em>next()</em> del iterador devuelto. Cualquier objeto que cubra estos métodos puede ser tratado como un iterador y por tanto trabajar de forma transparente con el resto de la API.</p>
<p>El segundo concepto es la <a href="http://en.wikipedia.org/wiki/Lazy_evaluation">evaluación perezosa</a> (lazy evaluation), que en pocas palabras significa que una expresión se resuelve únicamente cuando se la necesita, no antes.</p>
<p>Uniendo ambos conceptos tenemos el generador: una estructura, sobre la que podemos iterar, cuyos componentes se van obteniendo según se va avanzando.</p>
<p>La diferencia fundamental con la lista es que la lista tiene una <a href="http://en.wikipedia.org/wiki/Eager_evaluation">evaluación ansiosa/codiciosa</a> (eager evaluation). Esto implica que cuando queremos manejar una lista de 10 elementos la lista necesita disponer de esos 10 elementos en el momento de su declaración. Sin embargo el generador solamente necesita saber cómo generar el siguiente valor por lo que no necesita ni reservar espacio ni conocer a priori ningún elemento.</p>
<h3>Declaración de un método generador</h3>
<p>Un método que utilice la palabra reservada <em>yield</em> se trata como un generador. <em>yield</em> puede devolver un valor, como si fuera un <em>return</em> (cuidado, <em>return</em> se utiliza para terminar el generador).</p>
<p>Por ejemplo definimos la función <em>naturales()</em> que devuelve un iterador de todos los números naturales:</p>
<p><pre class="brush: python;">
def naturales():
    n = 1
    while True:
        yield n
        n = n + 1

i = naturales()
print i         # &lt;generator object naturales at 0x10f1a3050&gt;
print i.next()  # 1
print i.next()  # 2
</pre></p>
<p>Vemos que la primera ventaja de la evaluación perezosa es que podemos tratar estructuras infinitas.</p>
<p>Emulemos el método <em>enumerate(list)</em> nativo de Python utilizando el generador como una lista (o mejor dicho su iterador):</p>
<p><pre class="brush: python;">
ls = ['a', 'b', 'c']
print zip(naturales(), ls)  # [(1, 'a'), (2, 'b'), (3, 'c')]
</pre></p>
<h3>Declaración de una expresión generadora</h3>
<p>Otra forma de declarar un generador es exactamente igual que una expresión de lista pero con paréntesis. Por ejemplo los números pares:</p>
<p><pre class="brush: python;">
print [p for p in range(10) if p % 2 == 0]  # [0, 2, 4, 6, 8]
print (p for p in range(10) if p % 2 == 0)  # &lt;generator object &lt;genexpr&gt; at 0x10f1a3190&gt;
</pre></p>
<p>En este caso vemos que la lista está completa mientras que el generador se queda a la espera. A partir de este ejemplo podemos definir otro generador de números naturales pares:</p>
<p><pre class="brush: python;">
i = (p for p in naturales() if p % 2 == 0)
print i.next()  # 2
print i.next()  # 4
</pre></p>
<p>Es importante encadenar generadores con generadores, en caso contrario la evaluación de la lista obligaría el recorrido completo del generador. Si la estructura fuera infinita, como el ejemplo, provocaría la muerte del intérprete:</p>
<p><pre class="brush: python;">
[p for p in naturales() if p % 2 == 0]
</pre></p>
<h3>Conclusiones</h3>
<p>Evidentemente utilizar los generadores no es la solución para todos los problemas.</p>
<p>Hay unos escenarios concretos en los que merece la pena considerados:</p>
<ul>
<li>Estructuras infinitas.</li>
<li>Estructuras que ocupen mucha memoria, reducimos así el espacio de memoria a reservar.</li>
<li>La generación de los elementos es costosa, podemos retrasar su cálculo hasta el último momento.</li>
<li>Sabemos que la estructura no se va a consumir completamente, una mezcla de las dos anteriores.</li>
<li>Cuando trabajamos con otros generadores.</li>
</ul>
<h3>Más información</h3>
<ul>
<li><a href="http://docs.python.org/tutorial/classes.html#generators">Python Tutorial &#8211; Generators</a></li>
<li><a href="http://www.python.org/dev/peps/pep-0255/">PEP 255 &#8212; Simple Generators</a></li>
<li><a href="http://stackoverflow.com/questions/102535/what-can-you-use-python-generator-functions-for">What can you use Python generator functions for?</a></li>
<li><a href="http://www.dabeaz.com/generators/">Generator Tricks for Systems Programmers</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/101/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=101&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2011/09/01/python-generators/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>Wargames</title>
		<link>http://blog.chernando.eu/2010/07/22/wargames/</link>
		<comments>http://blog.chernando.eu/2010/07/22/wargames/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 20:09:59 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[wargame]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=96</guid>
		<description><![CDATA[Aquí tenéis otra entrada baja en contenidos para estar en forma este verano Aprovechando estos ratos muertos que tienen las vacaciones, he estado reuniendo estos enlaces de Wargames y retos similares. Para aquellos que quieran practicar técnicas de seguridad, criptografía, ingeniería inversa en un entorno cómodo y con todas las garantías higénicas o bien pasar [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=96&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Aquí tenéis otra entrada baja en contenidos para estar en forma este verano <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Aprovechando estos ratos muertos que tienen las vacaciones, he estado reuniendo estos enlaces de Wargames y retos similares.</p>
<p>Para aquellos que quieran practicar técnicas de seguridad, criptografía, ingeniería inversa en un entorno cómodo y con todas las garantías higénicas o bien pasar el tiempo con algo más que un sudoku, aquí tenéis la lista:</p>
<ul>
<li><a href="http://warzone.elhacker.net/">http://warzone.elhacker.net/</a> WarZone de elhacker.net</li>
<li><a href="http://www.hackthissite.org/">http://www.hackthissite.org/</a> Hack This Site!</li>
<li><a href="http://www.mod-x.co.uk/">http://www.mod-x.co.uk/</a> Mod-X Security Challenge</li>
<li><a href="http://hackquest.com/">http://hackquest.com/</a> HackQuest</li>
<li><a href="http://www.informatica64.com/RetosHacking.aspx">http://www.informatica64.com/RetosHacking.aspx</a> Retos Hacking Informática 64</li>
<li><a href="http://www.hellboundhackers.org/">http://www.hellboundhackers.org/</a> HellBound Hackers</li>
<li><a href="http://crackmes.de/">http://crackmes.de/</a></li>
<li><a href="http://bright-shadows.net/">http://bright-shadows.net/</a> TheBlacksheep</li>
<li><a href="http://www.try2hack.nl/">http://www.try2hack.nl/</a></li>
<li><a href="http://www.hackertest.net/">http://www.hackertest.net/</a> Hacker Test</li>
<li><a href="http://www.smashthestack.org/">http://www.smashthestack.org/</a> SmashTheStack Wargamming Network</li>
<li><a href="http://www.overthewire.org/wargames/">http://www.overthewire.org/wargames/</a> OverTheWire</li>
<li><a href="http://www.yashira.org/">http://www.yashira.org/</a></li>
</ul>
<p>Además <a href="http://www.wechall.net/">http://www.wechall.net/</a> mantiene un listado de wargames activos, con puntuaciones y estadísticas de jugadores entre juegos. Es una lista mucho más seria <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Enjoy!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/96/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/96/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/96/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=96&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2010/07/22/wargames/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>Aplicaciones Mac OS X recomendables</title>
		<link>http://blog.chernando.eu/2010/05/25/aplicaciones-mac-os-x-recomendables/</link>
		<comments>http://blog.chernando.eu/2010/05/25/aplicaciones-mac-os-x-recomendables/#comments</comments>
		<pubDate>Tue, 25 May 2010 21:51:56 +0000</pubDate>
		<dc:creator>chernando</dc:creator>
				<category><![CDATA[Mac OS X]]></category>

		<guid isPermaLink="false">http://blog.chernando.eu/?p=86</guid>
		<description><![CDATA[Hace unos cuantos años compré un Mac Mini con idea de sustituir el ordenador de sobremesa de mi casa. Posiblemente una de las mejores inversiones en hardware que he hecho Así que he decidido exprimir un poco más la plataforma y empezar a utilizarlo como un equipo de trabajo. A continuación os detallo las aplicaciones [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=86&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hace unos cuantos años compré un Mac Mini con idea de sustituir el ordenador de sobremesa de mi casa. Posiblemente una de las mejores inversiones en hardware que he hecho <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Así que he decidido exprimir un poco más la plataforma y empezar a utilizarlo como un equipo de trabajo. A continuación os detallo las aplicaciones que me han recomendado y que he ido encontrando por el camino.</p>
<ul>
<li><a href="http://www.macports.org/">MacPorts</a>, una implementación del clásico ports de BSD. Permite acceder a un repositorio muy amplio de software libre a golpe de compilador.</li>
<li><a href="http://www.tug.org/mactex/2009/">MacTeX</a>, entorno completo de LaTeX.</li>
<li><a href="http://iterm.sourceforge.net/">iTerm</a>, sustituta de la terminal de Mac OS X. Especial mención a la colocación inteligente (las nuevas terminales no se pisan) y al seleccionar un texto se copia automáticamente.</li>
<li><a href="http://adium.im/">Adium</a>, cliente de mensajería instantánea. Completo, práctico y muy personalizable.</li>
<li><a href="https://www.dropbox.com/">Dropbox</a>, solución de copia, sincronización y compartición de ficheros. En realidad es multiplataforma pero es bastante conocida entre los maqueros.</li>
<li><a href="http://www.freemacsoft.net/AppCleaner/">AppCleaner</a>, limpiador de aplicaciones. Inevitable si probamos nuevos programas; se encarga de buscar y eliminar ficheros de configuración.</li>
<li><a href="http://danauclair.com/addressbooksync/">AddressBookSync</a>, obtiene información desde Facebook para completar tu agenda personal. Una pequeña utilidad para poner “caras” a tus contactos.</li>
<li><a href="http://www.transmissionbt.com/">Transmission</a>, cliente de BitTorrent ligero y con acceso web.</li>
<li><a href="http://www.ted.nu/">ted</a>, descarga tus series favoritas.</li>
<li><a href="http://lightheadsw.com/caffeine/">Caffeine</a>, evita que el Mac entre en reposo.</li>
</ul>
<p>A partir de MacPorts podéis obtener el software que se echa de menos del mundo GNU/Linux. Utilidades para el desarrollo: <a href="http://maven.apache.org/">maven</a>, <a href="http://git-scm.com/">git</a>, <a href="http://www.grails.org/">Grails</a>&#8230; de redes: <a href="http://nmap.org/">nmap</a>, <a href="http://www.wireshark.org/">Wireshark</a>&#8230; hasta casi los 7000 paquetes disponibles.</p>
<p>Por último, conviene recordar el juego de aplicaciones que es bueno tener cerca: <a href="http://www.openoffice.org/">OpenOffice</a>, <a href="http://www.firefox.com/">Firefox</a>, <a href="http://www.gimp.org/">GIMP</a>, <a href="http://www.inkscape.org/">Inkscape</a>, <a href="http://filezilla-project.org/">FileZilla</a>, <a href="http://www.mplayerhq.hu/">MPlayer</a>, <a href="http://musicbrainz.org/doc/MusicBrainz_Picard">Picard</a>, <a href="http://www.eclipse.org/">Eclipse</a>&#8230;</p>
<p>Se agradecen recomendaciones <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/chernando.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/chernando.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/chernando.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/chernando.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/chernando.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/chernando.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/chernando.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/chernando.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/chernando.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/chernando.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/chernando.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/chernando.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/chernando.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/chernando.wordpress.com/86/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.chernando.eu&amp;blog=827394&amp;post=86&amp;subd=chernando&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.chernando.eu/2010/05/25/aplicaciones-mac-os-x-recomendables/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>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>
	</channel>
</rss>
