<?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>alvarezp &#187; Código</title>
	<atom:link href="http://blog.alvarezp.org/categorias/codigo/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alvarezp.org</link>
	<description>cat &#62;&#62; /dev/blog</description>
	<lastBuildDate>Thu, 02 Feb 2012 19:19:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>De Superkb, GCC pedante y portabilidad</title>
		<link>http://blog.alvarezp.org/2009/12/29/de-superkb-gcc-pedante-y-portabilidad/</link>
		<comments>http://blog.alvarezp.org/2009/12/29/de-superkb-gcc-pedante-y-portabilidad/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 09:47:41 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Superkb]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=943</guid>
		<description><![CDATA[Por fin se me hizo: cambiar el Makefile de Superkb para usar gcc -std=c99 -pedantic-errors en lugar de -std=gnu99.
Lo que me impedía hacerlo era que uso algunas extensiones de GNU, BSD o POSIX que no se encuentran en el estándar C.
Yo no sabía, pero basta con añadir la línea
#define _GNU_SOURCE

o, según el caso,
#define _POSIX_C_SOURCE 2

al [...]]]></description>
			<content:encoded><![CDATA[<p>Por fin se me hizo: cambiar el Makefile de Superkb para usar <code>gcc -std=c99 -pedantic-errors</code> en lugar de <code>-std=gnu99</code>.</p>
<p>Lo que me impedía hacerlo era que uso algunas extensiones de GNU, BSD o POSIX que no se encuentran en el estándar C.</p>
<p>Yo no sabía, pero basta con añadir la línea</p>
<pre class="code">#define _GNU_SOURCE
</pre>
<p>o, según el caso,</p>
<pre class="code">#define _POSIX_C_SOURCE 2
</pre>
<p>al principio del código fuente y glibc reconoce y habilita las funciones que hagan falta.</p>
<p>Esto es un paso hacia adelante, pues ahora ya puedo usar un simple &#8220;grep&#8221; para ver en qué archivos están &#8220;solicitando extensiones&#8221;.</p>
<p>Desafortunadamente aún falta bastante para llegar al ideal, pues sigo atado a las herramientas de GNU. Por ejemplo ¿qué pasa si trato de compilar sobre OpenSolaris? La última vez que lo intenté, resultó que el Makefile usa extensiones que dependen de gmake (una de ellas es el <code>include</code> no fatal). Pero si hubiera gmake, ¿compilaría?</p>
<p>Sólo hay una manera de saberlo&#8230; ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2009/12/29/de-superkb-gcc-pedante-y-portabilidad/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bash prompting</title>
		<link>http://blog.alvarezp.org/2009/10/12/bash-prompting/</link>
		<comments>http://blog.alvarezp.org/2009/10/12/bash-prompting/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 03:43:41 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=772</guid>
		<description><![CDATA[Al diagnosticar un problema intermitente, tener la hora exacta en la que una prueba arrojó un determinado resultado puede ser muy útil al momento de tratarlo con los proveedores o intercambiar información con otro técnico.
Por medio de cambiar el prompt PS1 de Bash he resuelto el problema de saber a qué hora ejecuté un comando.
Mi [...]]]></description>
			<content:encoded><![CDATA[<p>Al diagnosticar un problema intermitente, tener la hora exacta en la que una prueba arrojó un determinado resultado puede ser muy útil al momento de tratarlo con los proveedores o intercambiar información con otro técnico.</p>
<p>Por medio de cambiar el prompt PS1 de Bash he resuelto el problema de saber a qué hora ejecuté un comando.</p>
<p><span id="more-772"></span>Mi prompt anterior era el default de Ubuntu:</p>
<pre class="code">PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
</pre>
<p>Para efectos de simplificar, eliminaré la parte <code>${debian_chroot:+($debian_chroot)}</code>. Bastará indicar que muestra la variable de entorno <code>debian_chroot</code> entre paréntesis cuando ésta tenga un valor asignado. Desconozco más.</p>
<p>Digamos entonces que mi prompt anterior era:</p>
<pre class="code">PS1='\u@\h:\w\$ '</pre>
<div id="attachment_776" class="wp-caption aligncenter" style="width: 515px"><a href="http://blog.alvarezp.org/wp-content/uploads/2009/10/prev.png"><img src="http://blog.alvarezp.org/wp-content/uploads/2009/10/prev.png" alt="Versión por default." title="prev" width="505" height="151" class="size-full wp-image-776" /></a><p class="wp-caption-text">Versión por default.</p></div>
<p>Y planteé como objetivos:</p>
<ul>
<li>Que me permitiera encontrar fácilmente la separación entre comandos ejecutados.</li>
<li>Que me permitiera separar visual y fácilmente los componentes del prompt.</li>
<li>Que me permitiera determinar cuándo exactamente ejecuté un comando (útil durante mantenimientos de emergencia).</li>
<li>Que a pesar de tanta información, no se me acabe el renglón para escribir mi comando.</li>
</ul>
<p>Así que:</p>
<ul>
<li>Incluí un <code>\n</code> al principio del prompt para dejar una línea en blanco.</li>
<li>Incluí la fecha y hora con huso horario <code>\d \t \D{%z}</code>. El huso horario es particularmente útil cuando hay que compartir un resultado con un tercero que pudiera estar en otro lugar.</li>
<li>Puse en verde el identificador de usuario y en azul el directorio actual</li>
<li>Inicié el comando en una línea nueva. Una ventaja de esto fue que para documentar, puedo simplemente copiar toda la línea y no se incluye toda la información irrelevante.</li>
</ul>
<p>Quedó como sigue:</p>
<pre class="code">
SET_GREEN=`echo -e '\033[01;32m'`
SET_BLUE=`echo -e '\033[01;34m'`
UNSET_COLOR=`echo -e '\033[0m'`
PS1='\n[\d \t \D{%z} -- \[$SET_GREEN\]\u@\h\[$UNSET_COLOR\]:\[$SET_BLUE\]\w\[$UNSET_COLOR\]]\n\$ '
</pre>
<p>En líneas posteriores en mi .bashrc, Debian y Ubuntu anteponen <code>\[\e]0;\u@\h: \w\a\]</code> para que el título cambie al establecer el prompt. Esto se habilita si la terminal es compatible con los cambios de título.</p>
<p>El resultado final es:</p>
<div id="attachment_775" class="wp-caption aligncenter" style="width: 515px"><a href="http://blog.alvarezp.org/wp-content/uploads/2009/10/after.png"><img src="http://blog.alvarezp.org/wp-content/uploads/2009/10/after.png" alt="Resultado final." title="after" width="505" height="151" class="size-full wp-image-775" /></a><p class="wp-caption-text">Resultado final.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2009/10/12/bash-prompting/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bell on new line</title>
		<link>http://blog.alvarezp.org/2009/09/28/bell-on-new-line/</link>
		<comments>http://blog.alvarezp.org/2009/09/28/bell-on-new-line/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 20:10:21 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Planeta Linux]]></category>

		<guid isPermaLink="false">http://blog.alvarezp.org/?p=725</guid>
		<description><![CDATA[To have a Linux beep each time a new line is printed on standard output, just filter your output through the following code:
gawk '{print "\007" $0 }'
This will effectively &#8220;prepend&#8221; a bell to each line.
You can convert this into an alias or a command (say /usr/local/bin/line-beep.gawk):
#!/usr/bin/gawk -f

{ print "\007" $0; }
So it can be used [...]]]></description>
			<content:encoded><![CDATA[<p>To have a Linux beep each time a new line is printed on standard output, just filter your output through the following code:</p>
<pre class="code"><code>gawk '{print "\007" $0 }'</code></pre>
<p>This will effectively &#8220;prepend&#8221; a bell to each line.</p>
<p>You can convert this into an alias or a command (say /usr/local/bin/line-beep.gawk):</p>
<pre class="code"><code>#!/usr/bin/gawk -f

{ print "\007" $0; }</code></pre>
<p>So it can be used in a code like the following:</p>
<pre class="code"><code>tail -f /var/log/messages | grep --line-buffered dhcpd | line-beep.bash
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2009/09/28/bell-on-new-line/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>title_wrapper.bash</title>
		<link>http://blog.alvarezp.org/2009/06/02/title_wrapperbash/</link>
		<comments>http://blog.alvarezp.org/2009/06/02/title_wrapperbash/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 08:06:11 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Español]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[Software libre]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/?p=400</guid>
		<description><![CDATA[Escribí este script porque yo soy de los que llegan a tener &#8212;sin exagerar&#8212; 20 ó 30 ventanas de GNOME Terminal abiertas simultáneamente.
El resultado es que las ventanas tendrán en su título algo como 192.168.1.0 - ping para aquellos comandos a los que les declare un alias en el paso 2.
1. Colocar este código en [...]]]></description>
			<content:encoded><![CDATA[<p>Escribí este script porque yo soy de los que llegan a tener &mdash;sin exagerar&mdash; 20 ó 30 ventanas de <a href="http://en.wikipedia.org/wiki/GNOME_Terminal">GNOME Terminal</a> abiertas simultáneamente.</p>
<p>El resultado es que las ventanas tendrán en su título algo como <code>192.168.1.0 - ping</code> para aquellos comandos a los que les declare un alias en el paso 2.</p>
<p>1. Colocar este código en /usr/local/bin/title_wrapper.bash</p>
<pre class="code"><code>#!/bin/bash

# Copyright 2009, Octavio Alvarez Piza, alvarezp@alvarezp.ods.org
# Licencia: GPLv3.
# Garantía: absolutamente ninguna.

function settitle() {
	echo -ne "\033]0;$*\007"
}

while getopts "" OPT; do
	true
done

shift $(($OPTIND-1))

COMMAND=$1
COMPLETE_COMMAND="$*"
shift

case $COMMAND in
telnet)
	OPTIONS='468ELadrS:b:l:n:';;
ssh)
	OPTIONS='1246AaCfgKkMNnqsTtVvXxYb:c:D:e:F:i:L:l:m:O:o:p:R:S:w:';;
ping)
	OPTIONS='LRUbdfnqrvVaABc:i:l:p:s:t:w:F:I:M:Q:S:T:W:';;
dynagen)
	OPTIONS='ndh';;
webshare)
	OPTIONS=''
	FORCED_PARAM="`pwd`";;
else)
	OPTIONS=""
esac

while getopts $OPTIONS OPT; do
	true
done

shift $(($OPTIND-1))

PARAM="$*"
[ ! -z "$FORCED_PARAM" ] &#038;&#038; PARAM="$FORCED_PARAM"

settitle "$PARAM - $COMMAND"

$COMPLETE_COMMAND

</code></pre>
<p>2. Configurar en mi .bashrc (o correspondiente script de inicio de Bash):</p>
<pre class="code"><code>alias ping='title_wrapper.bash ping'
alias telnet='title_wrapper.bash telnet'
alias ssh='title_wrapper.bash ssh'
alias rsh='title_wrapper.bash rsh'
</code></pre>
<p>3. Configurar GNOME Terminal para que permita la modificación a los títulos de las ventanas.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2009/06/02/title_wrapperbash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qué falló durante mi plática en el SFD2008</title>
		<link>http://blog.alvarezp.org/2008/09/16/que-fallo-durante-mi-platica-en-el-sfd2008/</link>
		<comments>http://blog.alvarezp.org/2008/09/16/que-fallo-durante-mi-platica-en-el-sfd2008/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 19:27:46 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Anécdota]]></category>
		<category><![CDATA[Conferencias]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Gultij]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[SFD]]></category>
		<category><![CDATA[Tijuana]]></category>
		<category><![CDATA[audiosum]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[sfd2008]]></category>
		<category><![CDATA[Software libre]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/?p=177</guid>
		<description><![CDATA[A todas las personas que estuvieron presentes en la plática &#8220;Invitación al Desarrollo del Software Libre&#8221;:
Quiero expresar mi agradecimiento por su presencia en mi plática; en general, en el evento SFD 2008 en Tijuana.
Recordarán que al terminar la presentación realicé en vivo un cambio al código de audiosum; específicamente, al componente audiodup. Con este cambio [...]]]></description>
			<content:encoded><![CDATA[<p>A todas las personas que estuvieron presentes en la plática &#8220;Invitación al Desarrollo del Software Libre&#8221;:</p>
<p>Quiero expresar mi agradecimiento por su presencia en mi plática; en general, en el evento <a href="http://tonymoyoy.blogsome.com/2008/09/16/sfd-tijuana-08-resumen/">SFD 2008</a> en Tijuana.</p>
<p>Recordarán que al terminar la presentación realicé en vivo un cambio al código de <a href="http://alvarezp.ods.org/blog/audiosum/">audiosum</a>; específicamente, al componente <em>audiodup</em>. Con este cambio busqué mostrarles de manera práctica un ejemplo de cómo se desarrolla en el mundo del software libre mediante <a href="http://git.or.cz/">Git</a>.</p>
<p>También recordarán que el experimento no funcionó del todo:
<ol>
<li>descargamos el código desde repo.or.cz con <code>git clone http://repo.or.cz/audiosum.git</code>,</li>
<li>compilamos audiosum y lo vimos funcionando con <code>./autogen.sh &#038;&#038; ./configure &#038;&#038; make</code>,</li>
<li>realizamos un cambio en audiodup,</li>
<li>mostramos el parche resultante con <code>git diff</code>,</li>
<li>revisamos el estado del repositorio local con <code>git status</code>,</li>
<li>aplicamos el cambio en el repositorio local con <code>git commit -a</code>,</li>
<li>observamos las diferencias entre el repositorio local y el repositorio público con <code>git log origin..master</code>,</li>
<li>pero no pudimos publicar el cambio con <code>git push</code>.</li>
</ol>
<p>El motivo fue muy sencillo: no tenía autorizada la laptop para enviar cambios al repositorio. En <a href="http://repo.or.cz/">repo.or.cz</a> se deben dar de alta las claves públicas de cada persona@computadora autorizada para enviar cambios. Tengo diferentes claves públicas en cada máquina, y sólo tenía dada de alta la PC del trabajo y la PC de la casa. Mi cuenta de la laptop no estaba autorizada para enviar cambios.</p>
<p>Finalmente el cambio fue aplicado con <code>git push</code> y pueden observar en el <a href="http://repo.or.cz/w/audiosum.git">historial de cambios de audiosum</a> el cambio &#8220;<a href="http://repo.or.cz/w/audiosum.git?a=commit;h=02e1ea1a1d99f52d7c44b9f62c6f00e268999947">Added support for file pattern matching</a>&#8220;. En el segundo enlace pueden ver que la fecha es del 13 de septiembre a las 17:56, hora local, es decir, que el commit fue realizado <strong>durante</strong> la conferencia.</p>
<p>Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2008/09/16/que-fallo-durante-mi-platica-en-el-sfd2008/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>convert-mailq-to-tabbed.gawk</title>
		<link>http://blog.alvarezp.org/2008/08/27/convert-mailq-to-tabbedgawk/</link>
		<comments>http://blog.alvarezp.org/2008/08/27/convert-mailq-to-tabbedgawk/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 14:41:52 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Net-admin]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[código postfix mailq convert gawk]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/?p=174</guid>
		<description><![CDATA[Escribí este código para convertir la salida del mailq de Postfix a un formato tabular. Al tener el mailq en un formato tabular, se puede leer más fácilmente con scripts de Bash, filtrar con grep, etc.
El script ignora los mensajes de error de entrega que mailq pudiera indicar.
Está hecho en GNU Awk.
Se usa así: mailq [...]]]></description>
			<content:encoded><![CDATA[<p>Escribí este código para convertir la salida del mailq de Postfix a un formato tabular. Al tener el mailq en un formato tabular, se puede leer más fácilmente con scripts de Bash, filtrar con grep, etc.</p>
<p>El script ignora los mensajes de error de entrega que mailq pudiera indicar.</p>
<p>Está hecho en GNU Awk.</p>
<p>Se usa así: <code>mailq | convert-mailq-to-tabbed.gawk</code>.</p>
<pre class="code">
#!/usr/bin/gawk -f

# Autor: Octavio Alvarez Piza
# Licencia: GPLv3.

BEGIN {
	OFS="\t";
	mode = "from";
}

/\(/ || /^--/ || /^-Queue/ {
	next;
}

$1 !~ /^$/ &#038;&#038; mode == "to" {
	TO = TO $1 ";"
}

$1 ~ /[0-9]/ &#038;&#038; mode == "from" {
	ID=$1
	SIZE=$2
	DOW=$3
	MONTH=$4
	DAY=$5
	TIME=$6
	FROM=$7;
	TO=""
	mode="to";
}

/^$/ &#038;&#038; mode == "to" {
	print ID, SIZE, DOW, MONTH, DAY, TIME, FROM, TO
	mode="from";
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2008/08/27/convert-mailq-to-tabbedgawk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>strvcat &amp; strvcpy</title>
		<link>http://blog.alvarezp.org/2008/03/03/strvcat-strvcpy/</link>
		<comments>http://blog.alvarezp.org/2008/03/03/strvcat-strvcpy/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 04:35:49 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[funciones]]></category>
		<category><![CDATA[strvcat]]></category>
		<category><![CDATA[strvcpy]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/2008/03/03/strvcat-strvcpy/</guid>
		<description><![CDATA[#include &#60;stdarg.h>
#include &#60;stdlib.h>
#include &#60;string.h>
#include &#60;stdio.h>

/* Just like strcat(), but allows multiple strings
 * on the same line.
 */
char *strvcat(char * s1, char * args, ...) {
	va_list ap;

	va_start(ap, args);
	while (args != NULL) {
		strcat(s1, args);
		args = va_arg(ap, char *);
	}
	va_end(ap);
	return s1;
}

/* Just like strcpy(), but allows multiple strings
 * on the same line.
 */
char *strvcpy(char * s1, char [...]]]></description>
			<content:encoded><![CDATA[<pre class="code">#include &lt;stdarg.h>
#include &lt;stdlib.h>
#include &lt;string.h>
#include &lt;stdio.h>

/* Just like strcat(), but allows multiple strings
 * on the same line.
 */
char *strvcat(char * s1, char * args, ...) {
	va_list ap;

	va_start(ap, args);
	while (args != NULL) {
		strcat(s1, args);
		args = va_arg(ap, char *);
	}
	va_end(ap);
	return s1;
}

/* Just like strcpy(), but allows multiple strings
 * on the same line.
 */
char *strvcpy(char * s1, char * args, ...) {
	va_list ap;

	va_start(ap, args);
	strcpy(s1, args);

	args = va_arg(ap, char *);
	while (args != NULL) {
		strcat(s1, args);
		args = va_arg(ap, char *);
	}
	va_end(ap);
	return s1;
}

int main() {

	char a[8192] = "HOLA MUNDO ! -- ";

	strvcpy(a, "Hola", " ", "mundo", "!", "\n", NULL);
	strvcat(a, "Hola", " ", "mundo", "!", "\n", NULL);

	printf("%s\n", a);

}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2008/03/03/strvcat-strvcpy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conversión entre IP y decimal con Bash</title>
		<link>http://blog.alvarezp.org/2007/12/30/conversion-entre-ip-y-decimal-con-bash/</link>
		<comments>http://blog.alvarezp.org/2007/12/30/conversion-entre-ip-y-decimal-con-bash/#comments</comments>
		<pubDate>Sun, 30 Dec 2007 07:00:41 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/2007/12/30/conversion-entre-ip-y-decimal-con-bash/</guid>
		<description><![CDATA[Obtener la lista de direcciones entre 10.20.30.40 y 10.20.30.250 no es tan complicado, pero obtener la lista entre la 10.20.30.40 y la 11.25.60.250, se vuelve algo complejo, considerando ambas direcciones IP como variables arbitrarias.
Un método puede ser convertir la IP de bytes (octetos) a decimal puro y recorrer con un &#8220;for&#8221; los decimales y convertir [...]]]></description>
			<content:encoded><![CDATA[<p>Obtener la lista de direcciones entre 10.20.30.40 y 10.20.30.250 no es tan complicado, pero obtener la lista entre la 10.20.30.40 y la 11.25.60.250, se vuelve algo complejo, considerando ambas direcciones IP como variables arbitrarias.</p>
<p>Un método puede ser convertir la IP de bytes (octetos) a decimal puro y recorrer con un &#8220;for&#8221; los decimales y convertir nuevamente al final.<br />
<span id="more-138"></span></p>
<pre class="code">
<code>
function ip2dec {
	echo $(( $1*256*256*256 + $2*256*256 + $3*256 + $4 ))
}

function dec2ip {
	O4=$(( $1 % 256 ))
	O3=$(( ($1/256) % 256 ))
	O2=$(( ($1/(256*256)) % 256 ))
	O1=$(( ($1/(256*256*256)) % 256 ))
	echo $O1.$O2.$O3.$O4
}

IP_START=10.20.30.40
IP_END=10.25.60.250

# Separar los octetos en START_OCTET[1..4] y END_OCTET[1..4]
IFS=. read START_OCTET[1] START_OCTET[2] START_OCTET[3] START_OCTET[4] &lt; &lt;( echo "$IP_START" )
IFS=. read END_OCTET[1] END_OCTET[2] END_OCTET[3] END_OCTET[4] &lt; &lt;( echo "$IP_END" )

# Recorrer los decimales, convirtiendo los resultados a IP.
for (( IP = `ip2dec ${START_OCTET[1]} ${START_OCTET[2]} ${START_OCTET[3]} ${START_OCTET[4]}`; \\
	IP &lt;= `ip2dec ${END_OCTET[1]} ${END_OCTET[2]} ${END_OCTET[3]} ${END_OCTET[4]}`; \\
	IP++ )); do

	echo `dec2ip $IP`
done</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2007/12/30/conversion-entre-ip-y-decimal-con-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gemelos</title>
		<link>http://blog.alvarezp.org/2007/07/18/gemelos/</link>
		<comments>http://blog.alvarezp.org/2007/07/18/gemelos/#comments</comments>
		<pubDate>Thu, 19 Jul 2007 00:09:49 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[duplicados]]></category>
		<category><![CDATA[gemelos]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/2007/07/18/gemelos/</guid>
		<description><![CDATA[Este script encuentra archivos que tenga el mismo contenido.
Para este script, dos archivos son duplicados uno de otro si su tamaño y su firma MD5 coinciden.
Se le puede pasar la opción &#8220;-v&#8221; para ver qué está haciendo el script en ese momento.
Nombre del archivo: &#8220;bin/gemelos&#8221;.

#!/bin/bash

if [ "$1" == "-h" ]; then
     [...]]]></description>
			<content:encoded><![CDATA[<p>Este script encuentra archivos que tenga el mismo contenido.</p>
<p>Para este script, dos archivos son duplicados uno de otro si su tamaño y su firma MD5 coinciden.</p>
<p>Se le puede pasar la opción &#8220;-v&#8221; para ver qué está haciendo el script en ese momento.</p>
<p>Nombre del archivo: &#8220;bin/gemelos&#8221;.</p>
<p><span id="more-105"></span></p>
<pre class="code"><code>#!/bin/bash

if [ "$1" == "-h" ]; then
        echo usage: $0 [-v]
        exit
fi

OUTPUT_FILE=/dev/null

if [ "$1" == "-v" ]; then
        OUTPUT_FILE=/dev/stderr
fi

echo Obteniendo lista de archivos... > $OUTPUT_FILE

IFS=
find -type f -printf "%13s %p\n" | sort -gr | uniq -w 13 -D | while read T; do
        echo Calculando MD5 para ${T:14}... > $OUTPUT_FILE
        printf "%s %s\n" ${T:1:12} `md5sum ${T:14}`;
done | sort -g | uniq -w 45 --all-repeated=separate
</code></pre>
<p>Ejemplo de la salida:</p>
<pre class="code"><code>alvarezp@octavio:~/non-iso$ ~/bin/gemelos
      358085 5d5c22e4ce586feadefd285ca81350db  ./otra-de-windows/plain-backup/omf/fightr0.af
      358085 5d5c22e4ce586feadefd285ca81350db  ./otra-de-windows/plain-backup/omf/fightr0.afb

      435969 0fcd29b249c145bab33f24c8341dd0a3  ./otra-de-windows/nvidia/Win2KXP/71.84/setup.ibt
      435969 0fcd29b249c145bab33f24c8341dd0a3  ./otra-de-windows/nvidia/Win2KXP/71.89/setup.ibt

      439296 933b377b2ce2f93c0df3bc99a1a45542  ./otra-de-windows/plain-backup/john/run/cygwin1.dll
      439296 933b377b2ce2f93c0df3bc99a1a45542  ./otra-de-windows/plain-backup/john/run/johns/386/cygwin1.dll
      439296 933b377b2ce2f93c0df3bc99a1a45542  ./otra-de-windows/plain-backup/john/run/johns/k6/cygwin1.dll
      439296 933b377b2ce2f93c0df3bc99a1a45542  ./otra-de-windows/plain-backup/john/run/johns/mmx/cygwin1.dll

      459544 de89c44f15d1bfbcca26778af838f720  ./otra-de-windows/nvidia/Win2KXP/71.84/engine32.cab
      459544 de89c44f15d1bfbcca26778af838f720  ./otra-de-windows/nvidia/Win2KXP/71.89/engine32.cab
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2007/07/18/gemelos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Cuál es mi IP?</title>
		<link>http://blog.alvarezp.org/2007/06/30/%c2%bfcual-es-mi-ip/</link>
		<comments>http://blog.alvarezp.org/2007/06/30/%c2%bfcual-es-mi-ip/#comments</comments>
		<pubDate>Sat, 30 Jun 2007 23:47:22 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Net-admin]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[whatismyip]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/2007/06/30/%c2%bfcual-es-mi-ip/</guid>
		<description><![CDATA[El siguiente microscript usa el sitio whatismyip.com para obtener la dirección IP con la que realmente estás saliendo a Internet.
En realidad, lo único que hace whatismyip.com es tomar el valor de la IP que se está conectando a su sitio durante esa conexión en específico, por lo que si sales a través de un PAT [...]]]></description>
			<content:encoded><![CDATA[<p>El siguiente microscript usa el sitio whatismyip.com para obtener la dirección IP con la que realmente estás saliendo a Internet.</p>
<p>En realidad, lo único que hace whatismyip.com es tomar el valor de la IP que se está conectando a su sitio durante esa conexión en específico, por lo que si sales a través de un PAT de varias direcciones públicas, su utilidad se reduce al mínimo.</p>
<p>Nombre de archivo: &#8220;bin/whatismyip&#8221;.</p>
<p><span id="more-103"></span></p>
<pre class="code"><code>#!/bin/bash

wget http://whatismyip.com/ -O - -q | grep "&lt;TITLE>" | cut -b 25- | cut -d\&lt; -f1
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2007/06/30/%c2%bfcual-es-mi-ip/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Transformador de direcciones MAC</title>
		<link>http://blog.alvarezp.org/2007/06/25/transformador-de-direcciones-mac/</link>
		<comments>http://blog.alvarezp.org/2007/06/25/transformador-de-direcciones-mac/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 05:47:27 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[cisco]]></category>
		<category><![CDATA[mac-trans]]></category>
		<category><![CDATA[redes]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/2007/06/25/transformador-de-direcciones-mac/</guid>
		<description><![CDATA[Por si le resulta útil a alguien más.
Nombre de archivo: &#8220;bin/mac-trans.sh&#8221;.

#!/bin/sh

#Autor: Octavio Alvarez, alvarezp@alvarezp.ods.org.
#License: GPLv2.

if [ $# -ne 2 ]; then
	echo
	echo "usage: $0 output-format mac-string"
	echo
	echo "output-format is one of the following:"
	echo "  -c  Cisco form  : 0123.4567.89ab"
	echo "  -l  Linux form  : 01-23-45-67-89-AB"
	echo "  -w  Windows form: [...]]]></description>
			<content:encoded><![CDATA[<p>Por si le resulta útil a alguien más.</p>
<p>Nombre de archivo: &#8220;bin/mac-trans.sh&#8221;.</p>
<p><span id="more-101"></span></p>
<pre class="code"><code>#!/bin/sh

#Autor: Octavio Alvarez, alvarezp@alvarezp.ods.org.
#License: GPLv2.

if [ $# -ne 2 ]; then
	echo
	echo "usage: $0 output-format mac-string"
	echo
	echo "output-format is one of the following:"
	echo "  -c  Cisco form  : 0123.4567.89ab"
	echo "  -l  Linux form  : 01-23-45-67-89-AB"
	echo "  -w  Windows form: 01:23:45:67:89:AB"
	echo "  -p  Plain lower : 0123456789ab"
	echo "  -P  Plain upper : 0123456789AB"
	echo
	echo "If the mac-string is not recognized, it is left unchanged."
	echo
	echo "Example: $0 -c 01-23-45-67-89-AB   # Output is 0123.4567.89ab"
	exit
fi

SEP='-.:'

while getopts "clwpP" OPT; do
	case $OPT in
	c)	FORM='\1\2.\3\4.\5\6'
		CASE='y/ABCDEF/abcdef/'
		;;
	l)	FORM='\1-\2-\3-\4-\5-\6'
		CASE='y/abcdef/ABCDEF/'
		;;
	w)	FORM='\1:\2:\3:\4:\5:\6'
		CASE='y/abcdef/ABCDEF/'
		;;
	p)	FORM='\1\2\3\4\5\6'
		CASE='y/ABCDEF/abcdef/'
		;;
	P)	FORM='\1\2\3\4\5\6'
		CASE='y/abcdef/ABCDEF/'
		;;
	esac
done

shift $(($OPTIND-1))

BYTE='([0-9A-Fa-f]{2})'

MAC_REGEX=$BYTE[$SEP]?$BYTE[$SEP]?$BYTE[$SEP]?$BYTE[$SEP]?$BYTE[$SEP]?$BYTE

echo $1 | sed -re "s/$MAC_REGEX/$FORM/; $CASE"
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2007/06/25/transformador-de-direcciones-mac/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Programa &#8220;hecho a la medida&#8221; y muy económico.</title>
		<link>http://blog.alvarezp.org/2007/03/12/programa-hecho-a-la-medida-y-muy-economico/</link>
		<comments>http://blog.alvarezp.org/2007/03/12/programa-hecho-a-la-medida-y-muy-economico/#comments</comments>
		<pubDate>Mon, 12 Mar 2007 21:50:04 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Computación]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Planet Gultij]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[humor]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/2007/03/12/programa-hecho-a-la-medida-y-muy-economico/</guid>
		<description><![CDATA[/* Programa en C para calcular el área de un cuadrado de 5 m por lado.
 * El resultado se da en metros.
 * Licencia: GPL v2. Autor: Octavio Alvarez.
 */

#include &#60;stdio.h>

int main() {
    printf("El área es: 25\n");
    return 0;
}

]]></description>
			<content:encoded><![CDATA[<pre class="code"><code>/* Programa en C para calcular el área de un cuadrado de 5 m por lado.
 * El resultado se da en metros.
 * Licencia: GPL v2. Autor: Octavio Alvarez.
 */

#include &lt;stdio.h>

int main() {
    printf("El área es: 25\n");
    return 0;
}
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2007/03/12/programa-hecho-a-la-medida-y-muy-economico/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Felices actualizaciones al blog</title>
		<link>http://blog.alvarezp.org/2007/02/08/felices-actualizaciones-al-blog/</link>
		<comments>http://blog.alvarezp.org/2007/02/08/felices-actualizaciones-al-blog/#comments</comments>
		<pubDate>Fri, 09 Feb 2007 02:10:49 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Planet Gultij]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/2007/02/08/felices-actualizaciones-al-blog/</guid>
		<description><![CDATA[Me da gusto anunciar los siguientes cambios al blog:

Actualización a WordPress 2.1: El blog tiene más funciones (principalmente para mí) y es mucho más seguro.
Cambio de theme: Odio, aborrezco y maldigo los temas de ancho fijo. Si yo quiero usar un monitor con una resolución más grande, es porque quiero ver más información a la [...]]]></description>
			<content:encoded><![CDATA[<p>Me da gusto anunciar los siguientes cambios al blog:</p>
<ol>
<li>Actualización a WordPress 2.1: El blog tiene más funciones (principalmente para mí) y es mucho más seguro.</li>
<li>Cambio de <em>theme</em>: <strong>Odio</strong>, <strong>aborrezco</strong> y <strong>maldigo</strong> los temas de ancho fijo. Si yo quiero usar un monitor con una resolución más grande, es porque quiero ver más información a la vez. Así que esta vez, escogí un tema más decente.</li>
<li>Nuevo método antispam: para meter comentarios hay que contestar una simple suma matemática. Si no sabes sumar, pregúntame por IRC cómo usar los dedos.</li>
</ol>
<p>Con toda franqueza, con esto, le tengo más cariño al blog.</p>
<p><span id="more-84"></span></p>
<p>Otra cosa que espero hacer pronto, es cambiarlo todo al idioma inglés. Me gustaría saber si los lectores de este humilde blog hablan inglés o no.</p>
<p>¡Saludos a todos!</p>
<p><strong>Actualización:</strong> Aquí hay un algoritmo en C para sumar con los dedos:</p>
<pre class="code"><code>int sumar_con_dedos(int n1, int n2) {
	int mente;
	int dedo_actual;

	mente = n1 - (n1%10);

	dedo_actual = (n1%10);

	if (dedo_actual == 0)
		dedo_actual = 10;

	for (int i=1; i&lt;=n2; i++) {
		dedo_actual++;
		if (dedo_actual == 10)
			mente = mente + 10;

		if (dedo_actual == 11)
			dedo_actual = 1;
	}

	return (mente + (dedo_actual % 10));
}</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2007/02/08/felices-actualizaciones-al-blog/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Calcular el costo de luz con Google</title>
		<link>http://blog.alvarezp.org/2006/03/09/calcular-el-costo-de-luz-con-google/</link>
		<comments>http://blog.alvarezp.org/2006/03/09/calcular-el-costo-de-luz-con-google/#comments</comments>
		<pubDate>Thu, 09 Mar 2006 10:44:35 +0000</pubDate>
		<dc:creator>alvarezp</dc:creator>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Planet Gultij]]></category>

		<guid isPermaLink="false">http://alvarezp.ods.org/blog/2006/03/09/calcular-el-costo-de-luz-con-google/</guid>
		<description><![CDATA[Quiza algun dia haga un articulo completo, pero he logrado hacer esto con la calculadora de mi buen amigo Google:
(0.8 A)*(100 %)*(2 month)*(1.993 pesos/kWh)*(128 V) in pesos
0.8 A = Consumo de corriente. Lo mides con un amperimetro.
100% =  Porcentaje del periodo que se tiene prendido el aparato. (se debe dejar el otro en 2 [...]]]></description>
			<content:encoded><![CDATA[<p>Quiza algun dia haga un articulo completo, pero he logrado hacer esto con la calculadora de mi buen amigo Google:</p>
<p><code>(0.8 A)*(100 %)*(2 month)*(1.993 pesos/kWh)*(128 V) in pesos</code></p>
<p>0.8 A = Consumo de corriente. Lo mides con un amperimetro.<br />
100% =  Porcentaje del periodo que se tiene prendido el aparato. (se debe dejar el otro en 2 month)<br />
2 month = Tiempo que se tiene prendido el aparato. (se debe dejar el otro en 100%)<br />
1.993 pesos/kWh = Precio del kWh.<br />
128 V = Voltaje. Se puede quitar este junto con 0.8 A y dejar la potencia directamente en Watts (W).</p>
<p>El valor de 0.8 A es lo que el amperimetro marco para mi PC en procesamiento ligero y monitor y bocinas apagadas (por ejemplo, cuando apago monitor y bocinas y me voy sin dejarla haciendo algo).</p>
<p>Total: 298.159187 pesos en el recibo. Esto es si la dejara en este estado durante 2 meses seguidos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alvarezp.org/2006/03/09/calcular-el-costo-de-luz-con-google/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

