<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>VirtualMinds &#187; Linux</title>
	<atom:link href="http://virtualminds.es/blog/index.php/category/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://virtualminds.es/blog</link>
	<description>Think Virtually</description>
	<lastBuildDate>Mon, 07 Jun 2010 09:31:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Extraer tabla de un dump en MySQL</title>
		<link>http://virtualminds.es/blog/index.php/2009/05/extraer-tabla-de-un-dump-en-mysql.html</link>
		<comments>http://virtualminds.es/blog/index.php/2009/05/extraer-tabla-de-un-dump-en-mysql.html#comments</comments>
		<pubDate>Fri, 22 May 2009 13:46:14 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[Receta]]></category>

		<guid isPermaLink="false">http://virtualminds.es/wordpress/?p=23</guid>
		<description><![CDATA[Una pequeña receta que nos ha tocado hoy hacer en el curro. A veces necesitamos recuperar de un dump de mysql, los datos de una tabla. En este caso, el script que nos ocupa, recupera de un full dump, una tabla completa, con su definición, aunque sería relativamente sencillo recuperar solo los datos (INSERT): #!/bin/sh [...]]]></description>
			<content:encoded><![CDATA[<p>Una pequeña receta que nos ha tocado hoy hacer en el curro. A veces necesitamos recuperar de un dump de mysql, los datos de una tabla. En este caso, el script que nos ocupa, recupera de un full dump, una tabla completa, con su definición, aunque sería relativamente sencillo recuperar solo los datos (INSERT):</p>
<pre class="brush:bash">
#!/bin/sh
if [ $# -lt 1 ]; then
echo "Use: $0 table_name [filename]"
exit 1
fi

sed -n "/structure for table \`$1\`/,/UNLOCK TABLES/p" $2
</pre>
<p>Se puede invocar de dos formas:</p>
<pre>
extract_table.sh nombre_de_tabla fichero_con_el_dump
</pre>
<p>o</p>
<pre>
cat fichero_con_el_dump | extract_table.sh nombre_de_tabla
zcat fichero_con_el_dump.gz | extract_table.sh nombre_de_tabla
</pre>
<p>Un saludo</pre>
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2009/05/extraer-tabla-de-un-dump-en-mysql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mi correo no es un ftp</title>
		<link>http://virtualminds.es/blog/index.php/2009/05/mi-correo-no-es-un-ftp.html</link>
		<comments>http://virtualminds.es/blog/index.php/2009/05/mi-correo-no-es-un-ftp.html#comments</comments>
		<pubDate>Fri, 22 May 2009 13:23:32 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Receta]]></category>

		<guid isPermaLink="false">http://virtualminds.es/wordpress/?p=22</guid>
		<description><![CDATA[Existe una creciente oleada de personas dispuestas a quejarse porque cuando mandan ficheros de tropecientos megas, el servidor de correo no va bien. Señores, señoras, el correo no es un ftp. Uno al final se cansa de recibir mensajes enormes y muchos de ellos, inútiles. Así que os dejo una pequeñ receta de procmail para [...]]]></description>
			<content:encoded><![CDATA[<p>Existe una creciente oleada de personas dispuestas a quejarse porque cuando mandan ficheros de tropecientos megas, el servidor de correo no va bien. Señores, señoras, el correo no es un ftp. Uno al final se cansa de recibir mensajes enormes y muchos de ellos, inútiles. Así que os dejo una pequeñ receta de procmail para evitar saturaros la cuenta con ppt y demás familia:</p>
<div class="codigo"><code># MAXMSG = bytes del mail<br />
MAXMSG=14680064<br />
NL="<br />
"<br />
:0<br />
* $ &gt; $MAXMSG<br />
{<br />
LOG="Mi correo no es un ftp${NL}"<br />
EXITCODE=69<br />
HOST<br />
}<br />
</code></div>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2009/05/mi-correo-no-es-un-ftp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL CMDBA &#8211; Certificándose</title>
		<link>http://virtualminds.es/blog/index.php/2009/04/mysql-cmdba-certifica%c2%a1ndose.html</link>
		<comments>http://virtualminds.es/blog/index.php/2009/04/mysql-cmdba-certifica%c2%a1ndose.html#comments</comments>
		<pubDate>Wed, 15 Apr 2009 16:20:17 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySql]]></category>

		<guid isPermaLink="false">http://virtualminds.es/wordpress/?p=20</guid>
		<description><![CDATA[Hace tiempo comenté que estaba detrás de la certificación y por fin le pude dedicar tiempo. El resultado, por fin tengo mi certificación y va en camino la de clustering (CMCDBA). Y cómo no, el honor de aparecer en la web de MySQL Para no repetir contenido, os dejo un enlace comentando un poco el [...]]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo comenté que estaba detrás de la certificación y por fin le pude dedicar tiempo. El resultado, por fin tengo mi certificación y va en camino la de clustering (CMCDBA). Y cómo no, el honor de aparecer en la web de <a href="http://www.mysql.com/certification/candidates.php?exam=4"  title="http://www.mysql.com/certification/candidates.php?exam=4">MySQL</a></p>
<p>Para no repetir contenido, os dejo un enlace comentando un poco el examen (el DBA I, porque el DBA II fue igual). Os animo a sacaros la certificación, la verdad es que aprendí bastante cosas que no sabía. No sé cómo serán los cursos, en mi caso, dado que necesitaba esta certificación para acceder a la de clustering, lo hice por libre, pero si podéis permitíroslo (que lo paga la empresa, hombre) seguro que os podrán ayudar a pasarlo sin problemas.</p>
<p>Ahora, unas semanas de &#8220;relax&#8221; y a por la de clustering. Y si alguno va a ir al curso de alta disponibilidad que organiza Warp, allí nos veremos.</p>
<p>Saludos</p>
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2009/04/mysql-cmdba-certifica%c2%a1ndose.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restaurar password de root en MySQL</title>
		<link>http://virtualminds.es/blog/index.php/2008/11/restaurar-password-de-root-en-mysql.html</link>
		<comments>http://virtualminds.es/blog/index.php/2008/11/restaurar-password-de-root-en-mysql.html#comments</comments>
		<pubDate>Thu, 13 Nov 2008 09:58:55 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySql]]></category>

		<guid isPermaLink="false">http://virtualminds.es/wordpress/?p=15</guid>
		<description><![CDATA[Leo vía http://code.openark.org/blog/?p=102 un par de formas de restaurar la contraseña de MySQL. Normalmente siempre se suele usar con la opción &#8211;skip-grant-tables y se recomienda usar --init-file con la instrucción que cambie la contraeña. En debian tenemos otra forma de hacerlo que no requiere reinicio. Por defecto, en la instalación de MySQL se añade el [...]]]></description>
			<content:encoded><![CDATA[<p>Leo vía <a href="http://code.openark.org/blog/?p=102"  title="http://code.openark.org/blog/?p=102">http://code.openark.org/blog/?p=102</a> un par de formas de restaurar la contraseña de MySQL. Normalmente siempre se suele usar con la opción <strong>&#8211;skip-grant-tables</strong> y se recomienda usar -<strong>-init-file</strong> con la instrucción que cambie la contraeña.</p>
<p>En debian tenemos otra forma de hacerlo que no requiere reinicio. Por defecto, en la instalación de MySQL se añade el usuario <strong>debian-sys-maint</strong> para la reparación de las tablas en background en el inicio. La contraseña varía de instalación en instalación y podemos verla en el fichero <strong>/etc/mysql/debian.cnf</strong>.</p>
<p><code><br />
[client]<br />
host     = localhost<br />
user     = debian-sys-maint<br />
password = xxxxxxxxxxxxxxxxxx<br />
socket   = /var/run/mysqld/mysqld.sock<br />
</code></p>
<p>Para acceder de forma rápida, podemos escribir en la consola:</p>
<p><code><br />
mysql -u debian-sys-maint -p$(grep -m 1 "^password" /etc/mysql/debian.cnf | cut -d' ' -f3)<br />
<code></p>
<p>Y ya puestos, meterlo en nuestro .bashrc como un alias:</p>
<p><code><br />
alias mysql-debian="mysql -u debian-sys-maint -p$(grep -m 1 "^password" /etc/mysql/debian.cnf | cut -d' ' -f3)"<br />
</code></p>
<p>Como contrapartida, el fichero debian.cnf solo puede leerlo el root por lo que no sería mala idea tener una copia o modificar el alias para que se ejecute con sudo.</p>
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2008/11/restaurar-password-de-root-en-mysql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Limitar descarga de apt-get</title>
		<link>http://virtualminds.es/blog/index.php/2008/07/limitar-descarga-de-apt-get.html</link>
		<comments>http://virtualminds.es/blog/index.php/2008/07/limitar-descarga-de-apt-get.html#comments</comments>
		<pubDate>Thu, 03 Jul 2008 02:27:03 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Receta]]></category>

		<guid isPermaLink="false">http://virtualminds.es/wordpress/?p=8</guid>
		<description><![CDATA[Mis compañeros se quejan a veces de que no pueden ver videos de youtube porque algún desaprensivo está usando la adsl de la oficina para actualizarse su Debian. Que falta de respeto. Buscando enmendar tal afrenta, encontré la manera de limitar el ancho de banda que usa apt-get para descargarse los paquetes: # apt-get install [...]]]></description>
			<content:encoded><![CDATA[<p>Mis compañeros se quejan a veces de que no pueden ver videos de youtube porque algún desaprensivo está usando la adsl de la oficina para actualizarse su Debian. Que falta de respeto. Buscando enmendar tal afrenta, encontré la manera de limitar el ancho de banda que usa apt-get para descargarse los paquetes:</p>
<p><code><br />
# apt-get install trickle<br />
# dpkg-divert --local --rename /usr/lib/apt/methods/http<br />
# echo '#!/bin/sh' > /usr/lib/apt/methods/http<br />
# echo 'RATE=100' >> /usr/lib/apt/methods/http<br />
# echo '/usr/bin/trickle -s -d $RATE /usr/lib/apt/methods/http.distrib' >> /usr/lib/apt/methods/http<br />
# chmod 755 /usr/lib/apt/methods/http<br />
<code></p>
<p>Esto es posible gracias a trickle, una aplicación que nos permite gestionar el ancho de banda tanto de subida como de descarga. La aplicación funciona en espacio de usuario, por lo que no es necesario tener privilegios de root para usarla en otras aplicaciones. Por lo que se puede leer en su man, parece funcionar "suplantando" las funciones de gestión de sockets del sistema. </p>
<p>Referencia:</p>
<p><a href="http://ubuntuforums.org/showthread.php?t=20342" >http://ubuntuforums.org/showthread.php?t=20342</a></p>
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2008/07/limitar-descarga-de-apt-get.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Registrando robots de búsqueda en Apache</title>
		<link>http://virtualminds.es/blog/index.php/2007/10/registrando-robots-de-busqueda-en-apache.html</link>
		<comments>http://virtualminds.es/blog/index.php/2007/10/registrando-robots-de-busqueda-en-apache.html#comments</comments>
		<pubDate>Wed, 03 Oct 2007 12:56:15 +0000</pubDate>
		<dc:creator>Iñaki</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Receta]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://virtualminds.es/wordpress/?p=4</guid>
		<description><![CDATA[Hace unos días, un cliente me comentó su necesidad de loguear las entradas de los robots de búsqueda en un fichero aparte, para después procesarlas. Como me resultó novedoso el tema (en tanto que nunca he hecho algo parecido) me decidí a escribir un post. También han ayudado factores como recordarme que si me pagan [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días, un cliente me comentó su necesidad de loguear las entradas de los robots de búsqueda en un fichero aparte, para después procesarlas. Como me resultó novedoso el tema (en tanto que nunca he hecho algo parecido) me decidí a escribir un post. También han ayudado factores como recordarme que si me pagan el dominio, lo podría ir usando. Melón.</p>
<p>Vamos a ponernos en faena. Apache tiene una directiva para definir variables de entorno en función de una serie de condiciones. Me refiero a la directiva <a href="http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif">SetEnvIf</a>. Para nuestro ejemplo también nos valdría <a href="http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#browsermatch">BrowserMatch</a> pero opté por la primera por ser más genérica. Simplificaré un poco el montaje (mi cliente tenía varios dominios virtuales). En nuestro caso lo vamos a hacer con mi dominio, por ejemplo.</p>
<p>Lo primero que tenemos que hacer es abrir el fichero donde definimos nuestro virtualhost. Sobre la línea que define el CustomLog escribimos:</p>
<p />
<code>SetEnvIf User-Agent bot is_a_robot<br />
CustomLog /var/log/apache2/robots_access.log combined env=is_a_robot
</pre>
<p>Estas dos líneas sirven para definir la variable is_a_robot y activar el log en caso de que esa variable de entorno exista (con el tipo de log combined)</p>
<p>Fácil ¿no? Ya para terminar y rizar el rizo, hice un pequeño script en perl para separar cada bot en un fichero. Os lo pego aquí mismo (<a href="http://www.virtualminds.es/uploads/scripts/split-robots.pl">y os incluyo un enlace de paso aquí)</a></p>
<pre class="brush:perl">
#!/usr/bin/perl

#
# Iñaki Rodriguez (2007)
#
# Split robots in separate files (using md5 as filename)
#
# License: GPL

use Digest::MD5 'md5_hex';

my $robot_log = '/var/log/apache2/robots_access.log';
my $output_dir = '/var/log/apache2/robots/';
my %bots;

open BOTLOG, "<$robot_log" or die ("$robot_log: I can't open it");
open INDEX, "<".$output_dir."index.txt";

while(<INDEX>) {
    chomp();
    my ($md5,$ua) = split(/\t/);
    $bots{$md5} = $ua;
}
close(INDEX);

while(<BOTLOG>) {

    chomp();
    m/^(.+?) (.+?) (.+?) (\[.+?\]) (".+?") (\d\d\d) (.+?) (".+?") (".*")$/;
    my $md5 = md5_hex($9);
    my $tmpf = $output_dir.$md5.".log";
    open LOG,">> $tmpf" or die ("$tmpf: I can't write it");
    print "Adding entry to $tmpf ($9)\n" if ($ARGV[0] ne '-q');
    $bots{$md5} = $9 if (!$bots{$md5});
    print LOG $_."\n";
    close(LOG);
}

close(BOTLOG);

open INDEX, ">".$output_dir."index.txt" or die($output_dir."index.txt: I can't create it");
foreach $md5 (keys %bots) {
    print INDEX $md5."\t".$bots{$md5}."\n";
}
close(INDEX);
</pre>
<p>Solo comentar un par de cosas del script. La variable $output_dir especifica el directorio donde va a guardar los logs por separado. En este mismo directorio se creará un fichero index.txt que guarda la correspondencia de cada log con su user agent. El nombre del fichero es la suma md5 del campo User Agent del log. Por último la variable $robot_log es la que establece el fichero donde se almacenan los registros de todos los robots.</p>
<p>Se podría mejorar. Invito al lector a añadir:</p>
<ul>
<li>Registro de la última entrada para no duplicarlas</li>
<li>Exclusiones</li>
</ul>
<p>Y hasta aquí el post del día. </p>
<p>Nota Mental: Arreglar el css que se descuadra (el theme no es mío)</p>
<p />
<p />
]]></content:encoded>
			<wfw:commentRss>http://virtualminds.es/blog/index.php/2007/10/registrando-robots-de-busqueda-en-apache.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
