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

<channel>
	<title>Mabishu</title>
	<atom:link href="http://www.mabishu.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mabishu.com/blog</link>
	<description>Donde la realidad se pierde</description>
	<pubDate>Thu, 20 Nov 2008 17:04:28 +0000</pubDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
			<item>
		<title>Configuraci&#243;n de PHP 5 en Nginx (Nginx III)</title>
		<link>http://www.mabishu.com/blog/2008/11/20/configuracin-de-php-5-en-nginx-nginx-iii/</link>
		<comments>http://www.mabishu.com/blog/2008/11/20/configuracin-de-php-5-en-nginx-nginx-iii/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 17:04:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/?p=134</guid>
		<description><![CDATA[Continuamos con el periplo de configurar Nginx siguiente con las dos anteriores entradas.
Ahora lo que trataremos es de ejecutar nuestras apps o scripts escritos en PHP 5. Let&#8217;s go.
Instalación de PHP
La instalación de PHP no tiene mucha ciencia en GNU/Linux:
$ sudo apt-get install php5-cli php5-cgi php5-mysql
$ php -v
PHP 5.2.0-8+etch9 (cli) (built: Dec 29 2007 14:49:25)
Copyright [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mabishu.com/blog/wp-content/uploads/2008/05/nginx-black-logo.jpg"><img class="alignright alignnone size-medium wp-image-133 sinborde" style="float: right;" title="Nginx Server" src="http://www.mabishu.com/blog/wp-content/uploads/2008/05/nginx-black-logo.jpg" alt="" width="277" height="92" /></a>Continuamos con el periplo de configurar Nginx siguiente con <a title="Web Server optimizado con Nginx" href="http://www.mabishu.com/blog/2008/05/07/servidor-optimizado-con-nginx-y-memcached" target="_blank">las dos</a> <a title="Configuración de VirtualHosts en Nginx" href="http://www.mabishu.com/blog/2008/05/08/configuracion-de-virtualhosts-en-nginx-con-php-5-nginx-ii">anteriores entradas</a>.<br />
Ahora lo que trataremos es de ejecutar nuestras apps o scripts escritos en PHP 5. Let&#8217;s go.</p>
<h3>Instalación de PHP</h3>
<p>La instalación de PHP no tiene mucha ciencia en GNU/Linux:<br />
<code>$ sudo apt-get install php5-cli php5-cgi php5-mysql<br />
$ php -v<br />
PHP 5.2.0-8+etch9 (cli) (built: Dec 29 2007 14:49:25)<br />
Copyright (c) 1997-2006 The PHP Group<br />
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies</code></p>
<h3>Instalación de FastCGI</h3>
<p>Ya que nginx no cuenta con módulo integrado de php, precisamente porque no encuadra en su arquitectura, la ejecución del código PHP lo vamos a hacer a través de FastCGI. Para eso  utilizaremos la implementación que viene con lighttpd. Lo que haremos será compilar lighttpd, para luego copiar simplemente el spawn-fcgi<br />
<code>wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.gz<br />
gunzip lighttpd-1.4.18.tar.gz<br />
tar xvf lighttpd-1.4.18.tar<br />
cd lighttpd-1.4.18/<br />
./configure<br />
make<br />
sudo cp src/spawn-fcgi /usr/bin/spawn-fcgi</code><br />
Ahora tendremos que crear un ejecutable:<br />
<code>#!/bin/sh<br />
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -f /usr/bin/php5-cgi</code><br />
Y su script de control</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1">PHP_SCRIPT=/usr/bin/php-fastcgi</div>
</li>
<li class="li1">
<div class="de1">RETVAL=<span class="nu0">0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">case</span> <span class="st0">&quot;$1&quot;</span> in</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; start<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$PHP_SCRIPT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; RETVAL=$?</div>
</li>
<li class="li1">
<div class="de1">&nbsp; ;;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; stop<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; killall <span class="nu0">-9</span> php5-cgi</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; RETVAL=$?</div>
</li>
<li class="li1">
<div class="de1">&nbsp; ;;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; restart<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; killall <span class="nu0">-9</span> php5-cgi</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="re0">$PHP_SCRIPT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; RETVAL=$?</div>
</li>
<li class="li1">
<div class="de1">&nbsp; ;;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; *<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="st0">&quot;Usage: php-fastcgi {start|stop|restart}&quot;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <a href="http://www.php.net/exit"><span class="kw3">exit</span></a> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; ;;</div>
</li>
<li class="li1">
<div class="de1">esac</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/exit"><span class="kw3">exit</span></a> <span class="re0">$RETVAL</span></div>
</li>
</ol>
</div>
<p>que arreglamos sus permisos y lo hacemos ejecutar al inicio del sistema:<br />
<code>sudo chmod 755 /etc/init.d/php-fastcgi<br />
sudo chmod 755 /usr/bin/php-fastcgi<br />
sudo /usr/sbin/update-rc.d -f php-fastcgi defaults</code><br />
bastaría añadir la configuración a nuestro virtual host</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">location ~ \.php$ {
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; fastcgi_pass &nbsp; 127.0.0.1:9000;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; fastcgi_index &nbsp;index.php;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; fastcgi_param &nbsp;SCRIPT_FILENAME &nbsp;/var/www/blog.codefront.net$fastcgi_script_name;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; include &nbsp; &nbsp; &nbsp; &nbsp;/etc/nginx/fastcgi.conf;
</div>
</li>
<li class="li1">
<div class="de1">}</div>
</li>
</ol>
</div>
<p>y hacer que carge una serie de parámetros que necesita el spawn para hacer que todo funcione correcto en la comunicación con nginx</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;QUERY_STRING &nbsp; &nbsp; &nbsp; <span class="re0">$query_string</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;REQUEST_METHOD &nbsp; &nbsp; <span class="re0">$request_method</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;CONTENT_TYPE &nbsp; &nbsp; &nbsp; <span class="re0">$content_type</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;CONTENT_LENGTH &nbsp; &nbsp; <span class="re0">$content_length</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;SCRIPT_NAME &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$fastcgi_script_name</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;REQUEST_URI &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$request_uri</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;DOCUMENT_URI &nbsp; &nbsp; &nbsp; <span class="re0">$document_uri</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;DOCUMENT_ROOT &nbsp; &nbsp; &nbsp;<span class="re0">$document_root</span>;</div>
</li>
<li class="li2">
<div class="de2">fastcgi_param &nbsp;SERVER_PROTOCOL &nbsp; &nbsp;<span class="re0">$server_protocol</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;GATEWAY_INTERFACE &nbsp;CGI/<span class="nu0">1.1</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;SERVER_SOFTWARE &nbsp; &nbsp;nginx;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">fastcgi_param &nbsp;REMOTE_ADDR &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$remote_addr</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;REMOTE_PORT &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$remote_port</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;SERVER_ADDR &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$server_addr</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;SERVER_PORT &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$server_port</span>;</div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;SERVER_NAME &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$server_name</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2"># PHP only, required if PHP was built with &#8211;enable-force-cgi-redirect</span></div>
</li>
<li class="li1">
<div class="de1">fastcgi_param &nbsp;REDIRECT_STATUS &nbsp; &nbsp;<span class="nu0">200</span>;</div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/11/20/configuracin-de-php-5-en-nginx-nginx-iii/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Acceso rápido a la documentación de tus gemas de Ruby</title>
		<link>http://www.mabishu.com/blog/2008/08/07/acceso-rapido-a-la-documentacion-de-tus-gemas-de-ruby/</link>
		<comments>http://www.mabishu.com/blog/2008/08/07/acceso-rapido-a-la-documentacion-de-tus-gemas-de-ruby/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 22:36:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Truquitos]]></category>

		<category><![CDATA[Vida virtual]]></category>

		<category><![CDATA[completado]]></category>

		<category><![CDATA[funciones]]></category>

		<category><![CDATA[gem]]></category>

		<category><![CDATA[terminal]]></category>

		<category><![CDATA[zsh]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/?p=161</guid>
		<description><![CDATA[Durante una de mis sesiones de lectura de blogs me encontré que en el de Sergio Gil, programador en The Cocktail, había escrito como tener acceso directo a las gemas mediante un script de Bash que además autocompleta.
La verdad es que es muy cómodo, y no tienes que recurrir a el conocido `gem server`, el [...]]]></description>
			<content:encoded><![CDATA[<p>Durante una de mis sesiones de lectura de blogs me encontré que <a title="Acceso rápido a la Documentación de tus gemas" href="http://www.lacoctelera.com/porras/post/2008/07/11/rapido-acceso-la-documentacion-las-gemas-instaladas">en el de Sergio Gil</a>, programador en <a title="The Cocktail: consultora de experiencia de usuario y diseño de interacción" href="http://www.the-cocktail.com/">The Cocktail</a>, había escrito como tener acceso directo a las gemas mediante un script de Bash que además autocompleta.</p>
<p>La verdad es que es muy cómodo, y no tienes que recurrir a el conocido `gem server`, el cual tiene que levantar un servidor webrick para acceder a toda la documentación. Con este hack no se consumen recursos adicionales y exprimir todavía más nuestro equipo para otras tareas.</p>
<p>El único problema que tiene el post de Sergio es que es dedicado a bash, y hace algún tiempo que proceso amor por <a title="Z Shell" href="http://www.zsh.org/">zsh</a>, por lo que he hecho la modificación para que rule en la misma.</p>
<p>Simplemente copiad el siguiente código en vuestro ~/.zshrc y ya teneis el comnado gemdoc con autocompletado.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw3">export</span> <span class="re2">GEMDIR=</span>`gem <span class="kw2">env</span> gemdir`</div>
</li>
<li class="li1">
<div class="de1">gemdoc<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">open <span class="re1">$GEMDIR</span>/doc/`<span class="kw2">ls</span> -FG <span class="re1">$GEMDIR</span>/doc | <span class="kw2">grep</span> $<span class="nu0">1</span> | <span class="kw2">sort</span> | <span class="kw2">tail</span> <span class="nu0">-1</span>`/rdoc/index.html</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">_gemdocomplete<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">compctl -/ -W <span class="re1">$GEMDIR</span>/doc gemdoc</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">return</span> <span class="nu0">0</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">_gemdocomplete</div>
</li>
</ol>
</div>
<p>Por lo tanto solo habría que escribir en terminal<br />
<code>gemdoc </code><br />
y se autocompletan los nombres de las gemas con sus respectivas versiones, si no proporcionas la version se cogerá la última versión.<br />
<a href="http://www.mabishu.com/blog/wp-content/uploads/2008/08/captura-firefox-gems.gif"><img class="alignnone sinborde size-medium wp-image-168" title="captura-firefox-gems" src="http://www.mabishu.com/blog/wp-content/uploads/2008/08/captura-firefox-gems.gif" alt="" width="100%" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/08/07/acceso-rapido-a-la-documentacion-de-tus-gemas-de-ruby/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Configuración de MySQL para rendimiento</title>
		<link>http://www.mabishu.com/blog/2008/08/03/configuracion-de-mysql-para-rendimiento-2/</link>
		<comments>http://www.mabishu.com/blog/2008/08/03/configuracion-de-mysql-para-rendimiento-2/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 21:43:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[Servidores]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Truquitos]]></category>

		<category><![CDATA[Vida virtual]]></category>

		<category><![CDATA[bases]]></category>

		<category><![CDATA[bases de datos]]></category>

		<category><![CDATA[desarrollo]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[rendimiento]]></category>

		<category><![CDATA[servidor]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/2008/08/03/configuracion-de-mysql-para-rendimiento-2/</guid>
		<description><![CDATA[En el desarrollo de aplicaciones contra bases de datos, la mayoría de las veces, necesitas unos valores de referencia para saber si las consultas o instrucciones que está procesando tu aplicación se están comportando como debiere. También si te toca administrar un servidor de bd y monitorearlo este post te será de gran ayuda.
En este [...]]]></description>
			<content:encoded><![CDATA[<p>En el desarrollo de aplicaciones contra bases de datos, la mayoría de las veces, necesitas unos valores de referencia para saber si las consultas o instrucciones que está procesando tu aplicación se están comportando como debiere. También si te toca administrar un servidor de bd y monitorearlo este post te será de gran ayuda.</p>
<p>En este sentido escribiré algunos de los parámetros que podemos monitorear para el caso de bases de datos MySQL.</p>
<p>Básicamente MySQL nos proporciona una serie de instrucciones SQL que nos devuelve información de estado y rendimiento del servidor, para que luego las evaluemos y decidamos que acción pertinente se lleva a cabo.</p>
<p>La instrucción básica que se usa en MySQL es</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SHOW</span> <span class="kw1">STATUS</span>;</div>
</li>
</ol>
</div>
<p>la cual nos devuelve una cantidad importante de estados de variables. Aquí explico las más importantes.</p>
<p><strong>Threads_connected</strong></p>
<p style="margin-left:30px">Esta variable indica el número total de clientes que tienen una conexión abierta actualmente con el servidor.<br />
Proporciona información en tiempo real de cuantos clientes están conectados con el servidor. Esto puede ser de ayuda para analizar el tráfico o decidir cuando es el mejor instante para reiniciar un servidor.</p>
<p><strong>Created_tmp_disk_tables</strong></p>
<p style="margin-left:30px">Esta variable indica el número de tablas temporales que han sido creadas en disco frente a hacerlo en memoria.<br />
El acceso a tablas en disco normalmente es más lento que acceder a ellas en memoria. Por tanto las consultas que usan la sintaxis <em>CREATE TEMPORARY TABLE</em> son más lentas si el valor de la esta variable es superior.</p>
<p><span id="more-149"></span><strong>Handler_read_first</strong></p>
<p style="margin-left:30px">Esta variable indica el número de veces que un gestor de tabla hace una petición de lectura a la primera fila del índice de la tabla.<br />
Si MySQL accede frecuentemente a la primera fila de un índice de tabla, sugiere que está llevando a cabo un escaneo secuencial al índice completo. Esto indica que la tabla correspondiente no está correctamente indexada.</p>
<p><strong>Innodb_buffer_pool_wait_free</strong></p>
<p style="margin-left:30px">Esta variable indica el número de veces que MySQL tienen que esperar por páginas de memoria que tienen que ser purgadas.<br />
Si esta variable es alta, sugiere que el buffer de memoria de MySQL está configurado incorrectamente de acuerdo con la cantidad de escrituras que el servidor está llevando a cabo actualmente.</p>
<p><strong>Key_reads</strong></p>
<p style="margin-left:30px">Esta variable indica el número de accesos al sistema de archivos que lleva a cabo MySQL para recoger índices de bases de datos.<br />
La lectura de índices de bases de datos en el sistema de archivos ralentiza el rendimiento de las consultas. Si esta variable es alta, indica que  la cache de keys de MySQL&#8217;s está sobrecargada y debe ser reconfigurada.</p>
<p><strong>Max_used_connections</strong></p>
<p style="margin-left:30px">Esta variable indica el número máximo de conexiones que MySQL ha tenido que abrir al mismo tiempo desde que el servidor fue reiniciado.<br />
Este valor proporciona un punto de referencia en la ayuda a decidir el número máximo de conexiones que tu servidor debería soportar. También ayuda al análisis de tráfico.</p>
<p><strong>Open_tables</strong></p>
<p style="margin-left:30px">Esta variable indica el número de tablas que están actualmente abiertas.<br />
Este valor es el mejor analizador en combinación con el tamaño de la cache de tablas. Si el valor es bajo y el valor de <em>table_cache</em> es alto, probablemente es bueno reducir el tamaño de caché sin afectar al rendimiento. Por otra parte, si el valor es alto y cercano al valor de <em>table_cache</em>, puede suponer beneficioso incrementar el tamaño de la caché de tabla.</p>
<p><strong>Select_full_join</strong></p>
<p style="margin-left:30px">Esta variable indica el número de full joins que MySQL ha tenido que llevar a cabo para satisfacer las consultas de los clientes.<br />
Un valor alto indica que MySQL está siendo forzado a hacer full joins de tablas (que tienen un rendimiento intensivo) en lugar de utilizar índices. Esto sugiere la necesidad de una mayor indexación de las tablas correspondientes.</p>
<p><strong>Slow_queries</strong></p>
<p style="margin-left:30px">Esta variable indica el número de consultas que han sido más largas de lo normal.<br />
Un alto valor indica que muchas consultas no están siendo ejecutadas de forma óptima. Un próximo paso necesario sería examinar el log de consultas lentas e identificar estas para la optimización</p>
<p><strong>Uptime</strong></p>
<p style="margin-left:30px">Esta variable indica el número de segundos desde que el servidor fue reiniciado.<br />
Este valor es útil para analizar el tiempo de actividad del servidor, así como para generar informes sobre el rendimiento general del sistema. Un valor bajo de consistencia indica que el servidor se ha reiniciado con frecuencia, lo que ha provocado frecuentes interrupciones del servicio al cliente.</p>
<p>Con toda esta información el analisis de rendimiento y estado del servidor MySQL se hace mucho más llevadera. Espero os sea de ayuda.<br />
Tabla extraída y traducida de <a title="10 MySQL variables that you should monitor | Linux and Open Source | TechRepublic.com" rel="nofollow" href="http://blogs.techrepublic.com.com/opensource/?p=56">http://blogs.techrepublic.com.com/opensource/?p=56</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/08/03/configuracion-de-mysql-para-rendimiento-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Menu web multinivel con HTML y CSS</title>
		<link>http://www.mabishu.com/blog/2008/07/19/menu-web-multinivel-con-html-y-css/</link>
		<comments>http://www.mabishu.com/blog/2008/07/19/menu-web-multinivel-con-html-y-css/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 09:14:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[css]]></category>

		<category><![CDATA[html]]></category>

		<category><![CDATA[menu]]></category>

		<category><![CDATA[multinivel]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/?p=157</guid>
		<description><![CDATA[Un recurso muy utilizado en web son los men&#250;s horizontales y verticales, y realmente los que m&#225;s problemas nos presentan son estos &#250;ltimos debido a la incompatibilidad de algunos navegadores que no siguen los est&#225;ndares. Existen diversas formas de llevar a cabo los men&#250;s horizontales con elementos anidados: desde mostrar los submen&#250;s con javascript, hasta [...]]]></description>
			<content:encoded><![CDATA[<p>Un recurso muy utilizado en web son los men&uacute;s horizontales y verticales, y realmente los que m&aacute;s problemas nos presentan son estos &uacute;ltimos debido a la <a title="Navegador que no sigue los est&aacute;ndares, y qu no se debe usar" href="http://www.microsoft.com/spain/windows/products/winfamily/ie/default.mspx">incompatibilidad de algunos navegadores</a> que no siguen los est&aacute;ndares. Existen diversas formas de llevar a cabo los men&uacute;s horizontales con elementos anidados: desde mostrar los submen&uacute;s con javascript, hasta hacerlo directamente con CSS. En esta ocasi&oacute;n tratar&eacute; de explicar como se crea un men&uacute; con esta &uacute;ltima opci&oacute;n, por su portabilidad adem&aacute;s que nos va a ser indiferente que el cliente tenga o no Javascript en su navegador. <a href="http://www.mabishu.com/blog/wp-content/uploads/2008/07/imagen-2.png"><img class="sinborde alignleft size-medium wp-image-155" title="Menu multinivel en CSS y HTML" src="http://www.mabishu.com/blog/wp-content/uploads/2008/07/imagen-2.png" alt="Menu multinivel en CSS y HTML" align="left" /></a>El resultado final deber&iacute;a ser algo como lo que se ve en la imagen. El nivel de anidamiento es indiferente y tengo comprobado que funciona en todos los navegadores (salvo l&oacute;gicamente links).  El c&oacute;digo HTML es bastante simple, para anidar sub-men&uacute;s simplemente se inserta una estructura &lt;ul&gt;&lt;li&gt;&lt;/li&gt;&lt;/ul&gt; dentro de los &lt;li&gt; as&iacute; la hoja de estilos (que tambi&eacute;n adjunto) recoja la estructura correcta y muestre nuestro precioso men&uacute;. <span id="more-132"></span>Ah&iacute; va el c&oacute;digo html.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;ul id=&quot;menu&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;li&gt;&lt;a class=&quot;selected&quot; title=&quot;Acceder a &nbsp;Inicio&quot; href=&quot;#&quot;&gt;Inicio&lt;/a&gt;&lt;/li&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Descargas&lt;/a&gt;
</div>
</li>
<li class="li2">
<div class="de2">&lt;ul&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;li&gt;&lt;a title=&quot;Acceder a &nbsp;Datos de la empresa&quot; href=&quot;#&quot;&gt;Soft Desktop&lt;/a&gt;&lt;/li&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;li&gt;&lt;a title=&quot;Acceder a &nbsp;Descargas&quot; href=&quot;#&quot;&gt;Soft M&amp;oacute;vil&lt;/a&gt;&lt;/li&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/ul&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/li&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &lt;li&gt;&lt;a title=&quot;Acceder a &nbsp;Nuestro Chef&quot; href=&quot;#&quot;&gt;Localizaci&amp;oacute;n&lt;/a&gt;&lt;/li&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &lt;li&gt;&lt;a title=&quot;Contacte con nosotros&quot; href=&quot;#&quot;&gt;Contacto&lt;/a&gt;&lt;/li&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/ul&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;!&#8211; Menu ends &#8211;&gt;</div>
</li>
</ol>
</div>
<p> Y aqu&iacute; el c&oacute;digo CSS:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">body<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">background</span>:<span class="re0">#fff</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/* Root = Horizontal, Secondary = Vertical */</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; ba</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">margin</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">border</span>: <span class="nu0">0</span> <span class="kw2">none</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">padding</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* &nbsp;width: 500px;*/</span> <span class="coMULTI">/*For KHTML*/</span></div>
</li>
<li class="li1">
<div class="de1">width<span class="re2">:<span class="re3">360px</span></span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">list-style</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">height</span>: <span class="re3">20px</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; border<span class="re2">:<span class="re3">1px</span></span> <span class="kw2">solid</span> <span class="re0">#eee</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; padding-bottom<span class="re2">:<span class="re3">5px</span></span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">margin</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">border</span>: <span class="nu0">0</span> <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">padding</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">float</span>: <span class="kw1">left</span>; <span class="coMULTI">/*For Gecko*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">display</span>: <span class="kw2">inline</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">list-style</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">position</span>: <span class="kw2">relative</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">height</span>: <span class="re3">20px</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; padding-bottom<span class="re2">:<span class="re3">5px</span></span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">background</span>:<span class="re0">#ddd</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> &nbsp;ul <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">margin</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">border</span>: <span class="nu0">0</span> <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">padding</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">width</span>: <span class="re3">160px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">list-style</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">display</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">position</span>: <span class="kw2">absolute</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">top</span>: <span class="re3">25px</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">left</span>: <span class="re3">10px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">background</span>: <span class="re0">#eee</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">border</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; opacity: <span class="nu0">0</span><span class="re1">.<span class="nu0">8</span></span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; -moz-opacity: <span class="nu0">0</span><span class="re1">.<span class="nu0">8</span></span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; filter<span class="re2">:alpha</span><span class="br0">&#40;</span>opacity=<span class="nu0">80</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> ul<span class="re2">:after</span> <span class="coMULTI">/*From IE 7 lack of compliance*/</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">clear</span>: <span class="kw2">both</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">display</span>: <span class="kw2">block</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">font</span>: <span class="re3">1px</span>/<span class="re3">0px</span> <span class="kw2">serif</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">content</span>: <span class="st0">&quot;.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">height</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">visibility</span>: <span class="kw2">hidden</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> ul li <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">width</span>: <span class="re3">160px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">float</span>: <span class="kw1">left</span>; <span class="coMULTI">/*For IE 7 lack of compliance*/</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">display</span>: <span class="kw2">block</span> !important;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">display</span>: <span class="kw2">inline</span>; <span class="coMULTI">/*For IE*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* Root Menu */</span></div>
</li>
<li class="li2">
<div class="de2">ul<span class="re0">#menu</span> a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">padding</span>: <span class="re3">5px</span> <span class="re3">15px</span> <span class="re3">5px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">float</span>: <span class="kw2">none</span> !important; <span class="coMULTI">/*For Opera*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">float</span>: <span class="kw1">left</span>; <span class="coMULTI">/*For IE*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">display</span>: <span class="kw2">block</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">color</span>: <span class="re0">#9fcf21</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">text-decoration</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">font-weight</span>: <span class="kw2">bold</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; font-family<span class="re2">:Arial</span>, Helvetica, <span class="kw2">sans-serif</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; font-size<span class="re2">:<span class="re3">12px</span></span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; font-weight<span class="re2">:bold</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* &nbsp;border-right:1px solid #818181;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">text-decoration</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">height</span>: <span class="kw2">auto</span> !important;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">height</span>: <span class="re3"><span class="nu0">1</span>%</span>; <span class="coMULTI">/*For IE*/</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* Root Menu Hover Persistence */</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> a<span class="re2">:hover</span>,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> a,</div>
</li>
<li class="li2">
<div class="de2">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">color</span>: <span class="re0">#<span class="nu0">003300</span></span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/* 2nd Menu */</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> li a,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> li a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">float</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; border<span class="re2">:none</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* 2nd Menu Hover Persistence */</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> li a<span class="re2">:hover</span>,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> a,</div>
</li>
<li class="li2">
<div class="de2">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> li a<span class="re2">:hover</span>,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">background</span>:<span class="re0">#ddd</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">color</span>: <span class="re0">#<span class="nu0">003300</span></span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* 3rd Menu */</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> li a,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> li a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">background</span>: <span class="re0">#EEE</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">color</span>: <span class="re0">#<span class="nu0">666</span></span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* 3rd Menu Hover Persistence */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> li a<span class="re2">:hover</span>,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> a,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> li a<span class="re2">:hover</span>,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">background</span>:<span class="re0">#ddd</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">color</span>: <span class="re0">#FFF</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* 4th Menu */</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> li a,</div>
</li>
<li class="li2">
<div class="de2">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> li a <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">background</span>:<span class="re0">#ddd</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">color</span>: <span class="re0">#<span class="nu0">666</span></span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/* 4th Menu Hover */</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> li<span class="re2">:hover</span> li a<span class="re2">:hover</span>,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> li<span class="re1">.iehover</span> li a<span class="re2">:hover</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">background</span>: <span class="re0">#CCC</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">color</span>: <span class="re0">#FFF</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> ul ul,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> ul ul ul <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">display</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">position</span>: <span class="kw2">absolute</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">top</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">left</span>: <span class="re3">160px</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/* Do Not Move - Must Come Before display:block for Gecko */</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> ul ul,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> ul ul ul,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> ul ul,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> ul ul ul <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">display</span>: <span class="kw2">none</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re2">:hover</span> ul,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> ul li<span class="re2">:hover</span> ul,</div>
</li>
<li class="li2">
<div class="de2">ul<span class="re0">#menu</span> ul ul li<span class="re2">:hover</span> ul,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> li<span class="re1">.iehover</span> ul,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> ul li<span class="re1">.iehover</span> ul,</div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> ul ul li<span class="re1">.iehover</span> ul <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">display</span>: <span class="kw2">block</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">ul<span class="re0">#menu</span> <span class="re1">.selected</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">color</span>: <span class="re0">#<span class="nu0">003300</span></span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/07/19/menu-web-multinivel-con-html-y-css/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Migraci&#243;n de datos de sqlite3 a MySQL</title>
		<link>http://www.mabishu.com/blog/2008/07/04/migracion-de-datos-de-sqlite3-a-mysql/</link>
		<comments>http://www.mabishu.com/blog/2008/07/04/migracion-de-datos-de-sqlite3-a-mysql/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 10:30:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[bases de datos]]></category>

		<category><![CDATA[migracion]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[sqlite3]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/?p=146</guid>
		<description><![CDATA[
Es algo com&#250;n que est&#233;s desarrollando contra un gestor de bases de datos de &#8220;juguete&#8221; como puede ser sqlite3 y en un momento dado querer pasar a uno &#8220;de verdad&#8221; para probar cuanto rendimiento tiene tu app.
En este caso y como reza el t&#237;tulo explico como hacer la migraci&#243;n de sqlite3 a MySQL, que resulta [...]]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;"><a href="http://www.mabishu.com/blog/wp-content/uploads/2008/07/sqlite1.gif"><img class="alignnone size-medium wp-image-149" style="margin:0 15px" title="Logo SQLite" src="http://www.mabishu.com/blog/wp-content/uploads/2008/07/sqlite1.gif" alt="" width="300" height="88" align="left" /></a></span></p>
<p>Es algo com&uacute;n que est&eacute;s desarrollando contra un gestor de bases de datos de &#8220;juguete&#8221; como puede ser sqlite3 y en un momento dado querer pasar a uno &#8220;de verdad&#8221; para probar cuanto rendimiento tiene tu app.</p>
<p>En este caso y como reza el t&iacute;tulo explico como hacer la migraci&oacute;n de sqlite3 a MySQL, que resulta bastante trivial.</p>
<p><strong>SQLite </strong><strong>a </strong><strong>MySql </strong></p>
<ol>
<li> Se hace un dump de la bbdd que queremos<br />
<em>sqlite3 BasedeDatosaExportar .dump .quit &gt;&gt;fichero-dump.sql</em></li>
<li>Ahora toca adaptarla a la sintaxis expecial de MySQL<br />
- Reemplazar &#8221; (comillas dobles) por ` (acento grave)<br />
- Elimina &#8220;<em>BEGIN TRANSACTION;</em>&#8221; &#8220;<em>COMMIT;</em>&#8220;, y las l&iacute;neas &#8220;<em>sqlite_sequence</em>&#8221;<br />
- Substituye &#8220;<em>autoincrement</em>&#8221; con &#8220;<em>auto_increment</em>&#8220;</li>
<li>Y el fichero ya est&aacute; listo para importar en MySQL.</li>
</ol>
<p>Facil y bonito oye.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/07/04/migracion-de-datos-de-sqlite3-a-mysql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>dotfiles para Unix/Linux</title>
		<link>http://www.mabishu.com/blog/2008/07/04/dotfiles-para-unixlinux/</link>
		<comments>http://www.mabishu.com/blog/2008/07/04/dotfiles-para-unixlinux/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 10:16:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[configuracion]]></category>

		<category><![CDATA[dotfiles]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/?p=145</guid>
		<description><![CDATA[
A veces encuentras perlas por internet gracias a las cuales aprendes m&#225;s que leyendo libros.
En esta ocasi&#243;n he encontrado una web que recompila ficheros de configuraci&#243;n de much&#237;sima gente con buscador incorporado. http://dotfiles.org/
Ya conoc&#237;a en GitHub un proyecto conjunto donde todos los usuarios creaban un repositorio en git donde colgaban sus ficheros .files, y la [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="alignnone size-medium wp-image-144" title="dofiles.org" src="http://www.mabishu.com/blog/wp-content/uploads/2008/07/imagen-1.png" alt="" width="293" height="54" /></p>
<p>A veces encuentras perlas por internet gracias a las cuales aprendes m&aacute;s que leyendo libros.</p>
<p>En esta ocasi&oacute;n he encontrado una web que recompila ficheros de configuraci&oacute;n de much&iacute;sima gente con buscador incorporado. http://dotfiles.org/</p>
<p>Ya conoc&iacute;a en GitHub un proyecto conjunto donde todos los usuarios creaban un repositorio en git donde colgaban sus ficheros .files, y la verdad es que ayuda mucho sobre todo encontrar ficheros de configuraci&oacute;n de autenticos gur&uacute;s en distintos campos. Si os interesa aqu&iacute; teneis una <a title="Lista de repositorios dotfiles en github" href="http://github.com/search?q=dotfiles">lista en github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/07/04/dotfiles-para-unixlinux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gesti&#243;n de Branches y Tags con Git (II)</title>
		<link>http://www.mabishu.com/blog/2008/06/13/gestion-de-branches-y-tags-con-git-ii/</link>
		<comments>http://www.mabishu.com/blog/2008/06/13/gestion-de-branches-y-tags-con-git-ii/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 16:05:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[Truquitos]]></category>

		<category><![CDATA[Vida virtual]]></category>

		<category><![CDATA[Control de versiones]]></category>

		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/2008/06/13/gestion-de-branches-y-tags-con-git-ii</guid>
		<description><![CDATA[Continuo la serie de articulos sobre Git, echa un vistazo a la anterior entrega donde hablamos de creci&#243;n de repositorios y una pequeña introducci&#243;n. En esta ocasi&#243;n indagar&#233; un poco m&#225;s en el ciclo de vida de nuestro software donde mostrar&#233; como crear branches, tags y como Git gestiona todo esto de manera incre&#237;ble y [...]]]></description>
			<content:encoded><![CDATA[<p>Continuo la serie de articulos sobre Git, echa un vistazo a la anterior entrega donde hablamos de creci&oacute;n de <a title="Control de versiones con Git (I) | Mabishu" href="http://www.mabishu.com/blog/2008/06/04/control-de-versiones-con-git-i">repositorios y una pequeña introducci&oacute;n</a>. En esta ocasi&oacute;n indagar&eacute; un poco m&aacute;s en el ciclo de vida de nuestro software donde mostrar&eacute; como crear branches, tags y como Git gestiona todo esto de manera incre&iacute;ble y es realmente lo que lo hace, bajo mi punto de vista, el mejor SCM que he probado.</p>
<h2>Internalidades de Git</h2>
<p>Git internamente gestiona los distintos commits en forma de arbol, donde cada &#8220;hoja&#8221;, que el llama blob son los distintos archivos en un instante determinado y los &#8220;nodos&#8221;, que llama tree son los distintos directorios. Siguiendo este esquema la gesti&oacute;n del repositorio se simplifica mucho.<br />
<img class="sinborde" src="http://www.mabishu.com/blog/wp-content/uploads/2008/07/esquema-del-arbol-de-repositorio-de-git.jpg" alt="Esquema del arbol de repositorio de Git" width="190" height="256" align="left" />En el esquema anterior podemos ver como se pueden diferenciar 2 arboles de objetos y nodos distintos, el primero que referenciamos mediante un tag (con una rama descendente &uacute;nica y que contiene dos directorios y un archivo), y el segundo ser&iacute;a exactamente el mismo arbol anterior pero añadiendole un nuevo archivo. Adem&aacute;s el segundo es la copia actual en nuestro directorio de trabajo.</p>
<h2>Creaci&oacute;n de Tags</h2>
<p>Entonces y deduciendo un poco la creaci&oacute;n de tags en Git es inmediata, basta crear un &#8220;puntero&#8221; que nos apunte, valga la redundancia, a el commit deseado.<br />
<code>$git-tag -a nombre-tag -m "Creaci&oacute;n de Tag nombre-tag"</code><br />
Si no proporcionas el par&aacute;metro -m, simplemente se abrir&aacute; tu editor $EDITOR y podr&aacute;s proporcionar una descripci&oacute;n a el tag en cuesti&oacute;n.<br />
Se pueden hacer m&uacute;ltiples acciones sobre un tag, en el caso anterior se crea un tag sin firmar con GPG pero podemos hacerlo firmado (con el parametro -s) para la posterior identificaci&oacute;n de su creador. Para llevar a cabo el firmado se usa el par&aacute;metro signingkey de nuestro .gitconfig</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>user<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; signingkey =</div>
</li>
</ol>
</div>
<p>Tambi&eacute;n podemos eliminar un tag con el par&aacute;metro -d, y dem&aacute;s. <a title="git-tag(1)" href="http://www.kernel.org/pub/software/scm/git/docs/git-tag.html">git-tag(1)</a><br />
Por lo tanto la creaci&oacute;n de Tags como hemos visto es sencilla y directa, y lo m&aacute;s importante sin crear copias innecesarias de archivos.</p>
<p><span id="more-121"></span></p>
<h2>Creaci&oacute;n de Branches</h2>
<p><img class="sinborde" src="http://www.mabishu.com/blog/uploads/2008/07/branches-en-git.jpg" alt="Branches en Git" width="199" height="172" align="left" />Ahora imaginad el estado del arbol del repositorio de la imagen. En este caso hay dos commits de los cuales hemos omitido toda la estructura. El segundo commit es nuestra copia de trabajo actual y realmente podemos tratar como el branch &#8220;master&#8221;. En este caso y para crear un nuevo branch lo que hacemos es crear un nuevo puntero (que no un commit nuevo) a el &uacute;ltimo commit, como muestro en el siguiente gr&aacute;fico, a partir de ese momento los nuevos commits que hagamos se van a hacer sobre ese branch. Por lo tanto para crear un nuevo branch y hacerlo nuestra copia lo que haremos es ejecutar lo siguiente:<br />
<code>$ git branch master &lt;nuevo-branch&gt;  #creamos el branch a partir de master</code><br />
<code>$ git checkout &lt;nuevo-branch&gt; # hacemos que ese branch sea nuestra copia en nuestro directorio de trabajo</code><br />
<img class="sinborde" src="http://www.mabishu.com/blog/uploads/2008/06/branch-en-git-3.jpg" alt="Branch en Git 3" width="265" height="197" align="left" />En este gr&aacute;fico por fin vemos que hemos creado un nuevo commit y se ha creado bajo nuestro branch y no sobre master. Si luego queremos retomar el branch master no tenemos m&aacute;s que hacer un checkout como en el ejemplo anterior y ya ser&iacute;a nuestra copia.</p>
<p>En la pr&oacute;xima entrega hablar&eacute; de como podemos hacer de distintas formas merges de los branches, y de como Git de nuevo nos facilita la tarea.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/06/13/gestion-de-branches-y-tags-con-git-ii/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Control de versiones con Git (I)</title>
		<link>http://www.mabishu.com/blog/2008/06/04/control-de-versiones-con-git-i/</link>
		<comments>http://www.mabishu.com/blog/2008/06/04/control-de-versiones-con-git-i/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 15:27:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Control de versiones]]></category>

		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/2008/06/07/control-de-versiones-con-git-i</guid>
		<description><![CDATA[En el ciclo de vida de un producto software siempre se debe contar con herramientas que nos faciliten la ayuda a los desarrolladores, y en ese sentido los sistemas de control de versiones, como Subversion, CVS o Mercurial, son de utilizaci&#243;n obligatoria aunque desarrolle s&#243;lo una persona.
En este post relatar&#233; mi experiencia con un sistema [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mabishu.com/blog/wp-content/uploads/2008/07/git-scm1.jpg"><img class="alignnone size-medium wp-image-152" title="git-scm1" src="http://www.mabishu.com/blog/wp-content/uploads/2008/07/git-scm1.jpg" alt="" width="120" height="90" align="right" /></a>En el ciclo de vida de un producto software siempre se debe contar con herramientas que nos faciliten la ayuda a los desarrolladores, y en ese sentido los sistemas de control de versiones, como Subversion, CVS o Mercurial, son de utilizaci&oacute;n obligatoria aunque desarrolle s&oacute;lo una persona.<br />
En este post relatar&eacute; mi experiencia con un sistema de control de versiones que lleva ya algun tiempo haciendo ruido en internet y que ciertamente, adelanto ahora mismo, supone un paso adelante en los sistemas de control de versiones y en particular en su gesti&oacute;n de branches.<br />
Yo ven&iacute;a utilizando Subversion y como todos ve&iacute;a muy pobre su sistema de gesti&oacute;n de tags y branches y el intercambio entre ellos, obligandote a mantener varias copias de todo un proyecto para cada branch y para tag.<br />
<a title="Git - version control system" href="http://git.or.cz/">Git</a> a diferencia de otros SCMs permite commits locales y remotos, no hace falta conexi&oacute;n permanente con un repositorio central, porque simplemente ese repositorio no existe, en cambio la funcionalidad del mismo se distribuye en distintos equipos sin una jerarqu&iacute;a especial.<br />
<a style="margin: 10px;" href="http://www.mabishu.com/blog/wp-content/uploads/2008/07/github.png"><img class="alignnone size-medium wp-image-153" title="github" src="http://www.mabishu.com/blog/wp-content/uploads/2008/07/github.png" alt="" width="154" height="49" /></a>Si bien no existe un servidor central, si tenemos la posibilidad de definir varios repositorios remotos desde los cuales sincronizar todos los commits entre distintas personas, para tal ejemplo tenemos github.com que ofrece servicio gratuito para proyectos de fuente abierta o servicios de pago para repositorios privados.</p>
<h3>Uso de Git</h3>
<p>El primer paso despues de instalar Git es configurarlo para identificarnos, para eso con un simple<br />
<code>$ git config --global user.name "Tu nombre"<br />
$ git config --global user.email "&#100;&#105;r&#101;c&#99;&#105;&#111;n&#64;&#100;&#111;&#109;i&#110;i&#111;&#46;&#116;l&#100;"<br />
</code><br />
configuramos nuestro nombre. Para ver m&aacute;s parametros de configuraci&oacute;n pasaros por aqu&iacute; <a title="git-config(1)" href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html">git-config(1)</a>.</p>
<p>Para configurar un poco el comportamiento de git y sus diferentes acciones podeis editar el archivo general ~/.gitconfig que teneis en vuestro directorio home:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>user<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; name = James Bowes</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; email = MY_EMAIL</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#91;</span><span class="kw3">alias</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ci = commit -a</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">co</span> = checkout</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; st = status -a</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; praise = blame</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>apply<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; whitespace = <span class="kw2">strip</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span><span class="kw2">diff</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; color = auto</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rename = copy</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>pager<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; color = <span class="kw2">true</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>status<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; color = auto</div>
</li>
</ol>
</div>
<p>Para la creaci&oacute;n de un repositorio git simlemente tenemos que ejecutar en consola el siguiente comando dentro de la carpeta que queremos controlar:<br />
<code lang="bash">$mkdir repositorio; cd repositorio;<br />
$ git init</code></p>
<p><span id="more-120"></span></p>
<p>A continuaci&oacute;n podemos editar o generar los archivos dentro de dicho directorio que luego añadiremos al repositorio:<br />
<code>$ touch fichero.example<br />
$ git status<br />
# On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Untracked files:<br />
#   (use "git add ..." to include in what will be committed)<br />
#<br />
#	fichero.txt<br />
nothing added to commit but untracked files present (use "git add" to track)</code><br />
Como vemos el sistema se da cuenta que no tiene traceado el archivo que acabamos de crear, por lo que el estado nos notifica dicho evento. En este momento podemos hacer distintos eventos, eliminarlo (git rm fichero.example), añadirlo:<br />
<code>$git add fichero.txt<br />
$git status<br />
# On branch master<br />
#<br />
# Initial commit<br />
#<br />
# Changes to be committed:<br />
#   (use "git rm --cached &lt; file &gt;..." to unstage)<br />
#<br />
#	new file: fichero.txt<br />
#<br />
$git rm </code><br />
o ignorarlo que es una de las features que m&aacute;s me han gustado de Git, para eso se edita el archivo .gitignore dentro del directorio para especificar eso, por ejemplo para aplicaciones rails se puede especificar lo siguiente:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">log/*.log <span class="re3"># para los ficheros de log</span></div>
</li>
<li class="li1">
<div class="de1">tmp/**/* <span class="re3"># para los ficheros temporales</span></div>
</li>
<li class="li1">
<div class="de1">config/*.yml <span class="re3"># para los ficheros de configuraci&amp;oacute;n</span></div>
</li>
<li class="li1">
<div class="de1">db/*.sqlite3 <span class="re3"># para los ficheros de base de datos temporales</span></div>
</li>
<li class="li2">
<div class="de2">**/*/.* <span class="re3"># archivos temporales editores</span></div>
</li>
</ol>
</div>
<p>Gracias a este fichero habilitamos unos filtros que necesitan pasar todos y cada uno de los archivos y directorios que se quieran que sean gestionados por Git.</p>
<h3>Quiero commitear!</h3>
<p>Llegados a este punto queremos hacer un commit al repositorio local, para eso simplemente se ejecuta:<br />
<code>$ git commit</code><br />
Podemos evitarnos el tener que hacer el &#8220;git add &lt; elemento &gt;&#8221; para eso el commit podemos hacerlo as&iacute;:<br />
<code>$ $git commit -a<br />
Created initial commit 5a5b3af: initial import<br />
0 files changed, 0 insertions(+), 0 deletions(-)<br />
create mode 100644 fichero.txt<br />
</code></p>
<p>Hecho esto, se ha creado un commit con un n&uacute;mero de identificaci&oacute;n que es un hash y que es siempre distinto. Despues de proporcionar un mensaje identificativo del commit, el commit estar&aacute; hecho.<br />
Pero este commit es local, esto es, no se hace el commit a un repositorio externo, y esta es otra de las funcionalidades que diferencian a git del resto, ya que tienes control de versiones local.</p>
<p>Para hacer commits a un repositorio remoto hay que generar una copia de nuestro repositorio pero de una forma especial:<br />
<code>~ $git clone --bare repo/ repo.git<br />
Initialized empty Git repository in /Users/fran/repo.git/</code><br />
Con esto tenemos un directorio nuevo donde tenemos solo los objetos del repositorio y no la copia directa de cada archivo del repositorio. Este copia bare lo subimos a nuestro servidor externo:</p>
<p><code>scp repo.git ssh://user@server:/path/al/repo/</code><br />
A partir de este momento si queremos hacer y recibir commits en el repositorio externo, para eso tendremos que añadirlo a la configuraci&oacute;n:<br />
<code>$git remote add origin ssh://user@server:/path/al/repo.git</code><br />
para posteriormente hacer pulls o pushes cuando queramos actualizar nuestra copia local con la remota en el primer caso y actualizar el server remoto en el segundo caso:</p>
<p><code>$git push #(empujar) enviar el branch actual local al server remoto<br />
$git pull #(tirar) sincronizar nuestra branch actual con los cambios del server remoto</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/06/04/control-de-versiones-con-git-i/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Injection, PHP y Bases de Datos</title>
		<link>http://www.mabishu.com/blog/2008/05/22/sql-injection-php-y-bases-de-datos/</link>
		<comments>http://www.mabishu.com/blog/2008/05/22/sql-injection-php-y-bases-de-datos/#comments</comments>
		<pubDate>Thu, 22 May 2008 10:14:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[seguridad]]></category>

		<category><![CDATA[sql injection]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/2008/05/22/sql-injection-php-y-bases-de-datos</guid>
		<description><![CDATA[SQL Injection, la temida dir&#237;an algunos y la verdad es que si no tienes cuidado al programar suelen ser verdaderos quebraderos de cabeza, que ciertamente despues de retomar c&#243;digo es un tanto dificil de depurar si no sabes lo que ha sucedido.
Aqu&#237; voy a relatar modos de tratar ataques SQL Injection, que har&#225;n nuestras apps [...]]]></description>
			<content:encoded><![CDATA[<p>SQL Injection, la temida dir&iacute;an algunos y la verdad es que si no tienes cuidado al programar suelen ser verdaderos quebraderos de cabeza, que ciertamente despues de retomar c&oacute;digo es un tanto dificil de depurar si no sabes lo que ha sucedido.<br />
Aqu&iacute; voy a relatar modos de tratar ataques SQL Injection, que har&aacute;n nuestras apps m&aacute;s seguras y a nosotros est&aacute;r m&aacute;s tranquilos.<br />
Las SQL Injections son consultas sql que son generadas por scripts/programas que concatenan entradas del usuario con consultas a bases de datos, y ah&iacute; es donde est&aacute; el problema ya que no toda la entrada que proporciona el usuario es segura.<br />
Por ejemplo consideremos la siguiente instrucci&oacute;n:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> users <span class="kw1">WHERE</span> user = <span class="st0">&#8216;Pepito&#8217;</span></div>
</li>
</ol>
</div>
<p>Si quieres en este momento recoger una fila de la base de datos con informaci&oacute;n del usuario insertada debes reemplazar &#8220;Pepito&#8221; con la cadena proporcionada por el usuario.<br />
En PHP se v&eacute; tal que as&iacute;:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> users <span class="kw1">WHERE</span> user = <span class="st0">&#8216;$_GET[nombreUsuario]&#8216;</span></div>
</li>
</ol>
</div>
<p>El problema es simple: si el usuario inserta una cadena formateada especialmente como el nombre de usuario  el puede modificar tu consulta para ejecutar lo que el desee.</p>
<p>Por ejemplo si inserta esto:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="st0">&#8216;;DROP TABLE users;&#8211;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0"</span></div>
</li>
</ol>
</div>
<p>Ahora la consulta se ver&aacute; as&iacute;:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> users <span class="kw1">WHERE</span> user = <span class="st0">&#8221;</span>;DROP <span class="kw1">TABLE</span> users;<span class="co1">&#8211;&#8217;</span></div>
</li>
</ol>
</div>
<p>Hay varias formas con las que alguien puede atacar nuestra base de datos mediante sql injection. Las m&aacute;s rudimentarias son escapar los caracteres &#8216;, pero no siempre funcionan correctamente ya que hay otras formas de alterar la consulta. Echemos un vistazo a esto.</p>
<p>Hay una solucion muy simple a este problema. No concatenes texto proporcionado por el usuario en una consulta, vinculalo. La mayor&iacute;a de las bases de datos soportan bindings, mysql es una de ellas, postgresql, oracle y la lista crece. La idea es simple: proporcionas un marcador en tu consulta que ser&aacute; reemplazado con la variable actual, por lo que no es posible ninguna modificaci&oacute;n posible.</p>
<p>Nuestra anterior consulta se puede escribir tal que as&iacute;:<br />
Mysql (en php con la extensi&oacute;n mysqli)</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> users <span class="kw1">WHERE</span> user = ?</div>
</li>
</ol>
</div>
<p>Oracle</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SELECT</span> * <span class="kw1">FROM</span> users <span class="kw1">WHERE</span> user = :user</div>
</li>
</ol>
</div>
<p>Ejemplo de la extensi&oacute;n mysqli PHP (para m&aacute;s informaci&oacute;n lee la funci&oacute;n de mysqli_stmt bind_param</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/* recoger los datos del usuario */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$nombreUsuario</span> = <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;nombreUsuario&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* preparar la consulta */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$stmt</span> = <span class="re0">$mysqli</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><span class="st0">&#8216;SELECT * FROM users WHERE user = ?&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/* vincular el valor */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$stmt</span>-&gt;<span class="me1">bind_param</span><span class="br0">&#40;</span><span class="st0">&#8217;s&#8217;</span>, <span class="re0">$nombreUsuario</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* ejecutar la declaraci&amp;oacute;n preparada */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$stmt</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$stmt</span>-&gt;<span class="me1">bind_result</span><span class="br0">&#40;</span><span class="re0">$name</span>, <span class="re0">$surname</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* recoger los datos de usuario*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span><span class="re0">$stmt</span>-&gt;<span class="me1">fetch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">//imprimir los datos del usuario</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$nombre</span>, <span class="st0">&#8216; =&gt; &nbsp;&#8217;</span>, <span class="re0">$apellido</span> , <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* cerrar la operaci&amp;oacute;n */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$stmt</span>-&gt;<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Ejemplo con la extensi&oacute;n PHP PDO (para m&aacute;s informaci&oacute;n lee la funci&oacute;n prepare de PDO</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/* recoger los datos del usuario */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$nombreUsuario</span> = <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;nombreUsuario&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* preparar la consulta */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$sth</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><span class="st0">&#8216;SELECT * FROM users WHERE user = ?&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">/* vincultar y ejecutar la consulta */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$sth</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="re0">$userName</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$row</span> = <span class="re0">$sth</span>-&gt;<span class="me1">fetchAll</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Por lo tanto es muy facil para nosotros evitar la reescritura evitando que concatenar los datos proporcionados por el usuario con nuestra consulta, pero hay escenarios donde debes generar una consulta con los datos del usuario, no solo enviando una consulta. Por ejemplo, quieres mostrar diferentes tipos de libros basados en lo que inserta el usuario. El usuario puede elegir ver libros de ciencia ficci&oacute;n, literatura o libros de cocina.</p>
<p>Podr&iacute;as estar tentado a escribir algo como esto:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">SELECT * FROM $_GET[categoriaLibro]</div>
</li>
</ol>
</div>
<p>¿Pero, que pasa si el usuario quiere modificar tu script e inserta &#8216;users&#8217; como una categor&iacute;a? En ese caso podr&aacute; ver el contenido de la tabla de usuarios. La soluci&oacute;n para este problema es comprobar la categor&iacute;a proporcionada por el usuario en vez de la cadena directamente.</p>
<p>En php deber&iacute;as hacer algo como esto:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">switch</span> <span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#8216;bookCategory&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8217;sf_books&#8217;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$table</span> = <span class="st0">&#8217;sf_books&#8217;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8216;literature_books&#8217;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$table</span> = <span class="st0">&#8216;literature_books&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">default</span>:</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$table</span> = <span class="st0">&#8216;cooking_books&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$query</span> = <span class="st0">&quot;SELECT * FROM $table&quot;</span>;</div>
</li>
</ol>
</div>
<p>Si escribes tu script de esta forma, cuando el usuario inserte &#8216;users&#8217; como una categor&iacute;a, el ver&aacute; los libros de cocina, o puedes elegir mostrar un error, esa es tu elecci&oacute;n.<br />
Para resumir este post, quiero decir que deber&iacute;as utilizar el binding de variables cuando quieras enviar datos a la base de datos que proporciona el usuario. Y si formas tus consultas seg&uacute;n la entrada de usuario, simpre compara lo que inserta con algun valor predefinido y usa el valor por defecto.<br />
<strong>Nunca concatenes entrada de usuario en tus consultas, sin excepciones</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/05/22/sql-injection-php-y-bases-de-datos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Configuraci&#243;n de VirtualHosts en Nginx (Nginx II)</title>
		<link>http://www.mabishu.com/blog/2008/05/08/configuracion-de-virtualhosts-en-nginx-con-php-5-nginx-ii/</link>
		<comments>http://www.mabishu.com/blog/2008/05/08/configuracion-de-virtualhosts-en-nginx-con-php-5-nginx-ii/#comments</comments>
		<pubDate>Thu, 08 May 2008 10:13:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Programación]]></category>

		<category><![CDATA[Servidores]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Vida virtual]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[nginx]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[servidor web]]></category>

		<category><![CDATA[virtualhost]]></category>

		<category><![CDATA[webserver]]></category>

		<guid isPermaLink="false">http://www.mabishu.com/blog/?p=132</guid>
		<description><![CDATA[Echa la compilaci&#243;n de nuestro nginx ahora voy a explicar mas o menos mi sistema para gestionar virtualhosts con nginx. Primero de todo, suelo meter los virtualhosts en /opt en el que crearemos el esqueleto para cada slice.
Configuramos nginx para virtualhosts utilizando ficheros separados para cada uno de ellos:
mkdir -p /usr/local/nginx/conf/{sites-available,sites-enabled}

Substitu&#237;mos con lo siguiente en [...]]]></description>
			<content:encoded><![CDATA[<p>Echa la compilaci&oacute;n de nuestro nginx ahora voy a explicar mas o menos mi sistema para gestionar virtualhosts con nginx. Primero de todo, suelo meter los virtualhosts en /opt en el que crearemos el esqueleto para cada slice.</p>
<p>Configuramos nginx para virtualhosts utilizando ficheros separados para cada uno de ellos:</p>
<pre><code>mkdir -p /usr/local/nginx/conf/{sites-available,sites-enabled}
</code></pre>
<p>Substitu&iacute;mos con lo siguiente en el fichero /usr/local/nginx/conf/nginx.conf, para que lea todos los ficheros en sites-enabled y de paso lo limpiamos:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">user www-data;</div>
</li>
<li class="li1">
<div class="de1">worker_processes &nbsp;<span class="nu0">1</span>; <span class="co2">#N&amp;uacute;mero de workers configurable seg&amp;uacute;n necesidades</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/error_log"><span class="kw3">error_log</span></a> &nbsp;/<span class="kw2">var</span>/<a href="http://www.php.net/log"><span class="kw3">log</span></a>/nginx/error.<a href="http://www.php.net/log"><span class="kw3">log</span></a>;</div>
</li>
<li class="li2">
<div class="de2">pid &nbsp; &nbsp; &nbsp; &nbsp;/<span class="kw2">var</span>/run/nginx.pid;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">events <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; worker_connections &nbsp;<span class="nu0">1024</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">http <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">include</span> &nbsp; &nbsp; &nbsp; /etc/nginx/mime.types;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; default_type &nbsp;application/octet-stream;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; access_log &nbsp;/<span class="kw2">var</span>/<a href="http://www.php.net/log"><span class="kw3">log</span></a>/nginx/access.<a href="http://www.php.net/log"><span class="kw3">log</span></a>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; sendfile &nbsp; &nbsp; &nbsp; &nbsp;on;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co2">#tcp_nopush &nbsp; &nbsp; on;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co2">#keepalive_timeout &nbsp;0;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; keepalive_timeout &nbsp;<span class="nu0">65</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; tcp_nodelay &nbsp; &nbsp; &nbsp; &nbsp;on;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; gzip &nbsp;on;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/sites-enabled<span class="coMULTI">/*;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">}</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>LLegados a este punto ya tenemos nuestro nginx preparado para servir cualquiera de los distintos tipos de servidores que soporta (web, proxy web inverso, mail, balanceo de carga). Como aqu&iacute; nos centraremos en configurar un servidor web con virtualhosts, sigo relatando las operaciones.</p>
<p><span id="more-117"></span></p>
<p>Como dije suelo poner mis webs en /opt por lo que crear&eacute; el &#8220;raiz&#8221; del servidor con toda su estructura interna</p>
<pre><code>#Creamos carpeta general y la default donde alvergar los est&aacute;ticos por defecto del servidor
mkdir -p /opt/sites/default
#Creamos la estructura interna virtualhost default
mkdir -p /opt/sites/default/{public,private,logs,cgi-bin,backup}</code></pre>
<p>Ahora tenemos que configurar el virtualhost con sus par&aacute;metros y configuracion, he aqu&iacute; el mio con soporte para php5:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">server <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; listen <span class="nu0">80</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; server_name virtualhost.com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; rewrite ^/<span class="br0">&#40;</span>.*<span class="br0">&#41;</span> http:<span class="co1">//www.virtualhost.com/$1 permanent;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">server <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; listen &nbsp; &nbsp; &nbsp; <span class="nu0">80</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; server_name www.virtualhost.com;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; root /opt/sites/<span class="kw2">default</span>/;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co2">#charset koi8-r;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; access_log &nbsp;/opt/sites/virtualhost.com/logs/<span class="kw2">default</span>.access.<a href="http://www.php.net/log"><span class="kw3">log</span></a>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <a href="http://www.php.net/error_log"><span class="kw3">error_log</span></a> &nbsp; /opt/sites/virtualhost.com/logs/<span class="kw2">default</span>.error.<a href="http://www.php.net/log"><span class="kw3">log</span></a>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; location / <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="co2"># autoindex on;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; root &nbsp; /opt/sites/<span class="kw2">default</span>/virtualhost;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; index &nbsp;index.php index.html index.htm;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co2"># Si el fichero existe sirvelo</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>-f <span class="re0">$request_filename</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2"># Si el directorio existe, sirvelo</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>-d <span class="re0">$request_filename</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; error_page &nbsp;<span class="nu0">404</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/<span class="nu0">404</span>.html;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; location = /<span class="nu0">404</span>.html <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; root /opt/sites/virtualhost.com/errors;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; error_page &nbsp; <span class="nu0">500</span> <span class="nu0">502</span> <span class="nu0">503</span> <span class="nu0">504</span> &nbsp;/50x.html;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; location = /50x.html <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; root &nbsp; /opt/sites/virtualhost.com/errors;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; location ~ /\.ht <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; deny &nbsp;all;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mabishu.com/blog/2008/05/08/configuracion-de-virtualhosts-en-nginx-con-php-5-nginx-ii/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
