<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Dev on Karpoke - Just Another Blog</title><link>http://karpoke.ignaciocano.com/categories/dev/</link><description>Recent content in Dev on Karpoke - Just Another Blog</description><generator>Hugo -- 0.159.0</generator><language>es</language><lastBuildDate>Sat, 26 Dec 2015 19:02:00 +0100</lastBuildDate><atom:link href="http://karpoke.ignaciocano.com/categories/dev/index.xml" rel="self" type="application/rss+xml"/><item><title>«¿De quién es el pez?», resuelto mediante Prolog</title><link>http://karpoke.ignaciocano.com/2015/12/26/de-quien-es-el-pez-resuelto-mediante-prolog/</link><pubDate>Sat, 26 Dec 2015 19:02:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2015/12/26/de-quien-es-el-pez-resuelto-mediante-prolog/</guid><description>&lt;p&gt;Éste es un viejo &lt;a href="http://hipertextual.com/2015/12/acertijo-de-einstein"&gt;acertijo lógico&lt;/a&gt;, atribuido a Einstein:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El inglés vive en la casa roja.&lt;/li&gt;
&lt;li&gt;El sueco tiene perro.&lt;/li&gt;
&lt;li&gt;El danés toma té.&lt;/li&gt;
&lt;li&gt;El noruego vive en la primera casa.&lt;/li&gt;
&lt;li&gt;El Alemán fuma Prince.&lt;/li&gt;
&lt;li&gt;La casa verde queda inmediatamente a la izquierda de la blanca.&lt;/li&gt;
&lt;li&gt;El dueño de la casa verde toma café.&lt;/li&gt;
&lt;li&gt;La persona que fuma Pall Mall cría pájaros.&lt;/li&gt;
&lt;li&gt;El dueño de la casa amarilla fuma Dunhill.&lt;/li&gt;
&lt;li&gt;El hombre que vive en la casa del centro toma leche.&lt;/li&gt;
&lt;li&gt;El hombre que fuma Blends vive al lado del que tiene un gato.&lt;/li&gt;
&lt;li&gt;El hombre que tiene un caballo vive al lado del que fuma Dunhill.&lt;/li&gt;
&lt;li&gt;El hombre que fuma Bluemaster toma cerveza.&lt;/li&gt;
&lt;li&gt;El hombre que fuma Blends es vecino del que toma agua.&lt;/li&gt;
&lt;li&gt;El noruego vive al lado de la casa azul.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ante estas afirmaciones, la pregunta es: ¿de quién es el pez?&lt;/p&gt;</description></item><item><title>Exclusión de URLs cuando usamos django-debug-toolbar</title><link>http://karpoke.ignaciocano.com/2014/05/15/exclusion-de-urls-cuando-usamos-django-debug-toolbar/</link><pubDate>Thu, 15 May 2014 20:10:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2014/05/15/exclusion-de-urls-cuando-usamos-django-debug-toolbar/</guid><description>&lt;p&gt;&lt;a href="http://github.com/django-debug-toolbar/django-debug-toolbar"&gt;django-debug-toolbar&lt;/a&gt; es una aplicación para Django que nos muestra
información de depuración acerca de las diferentes peticiones y
respuestas que se llevan a cabo en el servidor: variables de contexto,
cabeceras, peticiones SQL, etc.&lt;/p&gt;
&lt;p&gt;Sin embargo, hay algunas URLs para las cuales nos puede interesar que no
se analicen, como por ejemplo, peticiones que se hagan por Ajax o URLs
relativas a diversas aplicaciones instaladas, como el panel de
administración, Rosetta, etc.&lt;/p&gt;</description></item><item><title>Utilizando un tema hijo en WordPress</title><link>http://karpoke.ignaciocano.com/2013/07/13/utilizando-un-tema-hijo-en-wordpress/</link><pubDate>Sat, 13 Jul 2013 19:04:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2013/07/13/utilizando-un-tema-hijo-en-wordpress/</guid><description>&lt;p&gt;Un &lt;a href="http://codex.wordpress.org/Child_Themes"&gt;tema hijo en WordPress&lt;/a&gt; es un tema que hereda la funcionalidad de
otro, el tema padre, permitiendo modificar el estilo o añadir
funcionalidades a éste. Es la forma más sencilla y segura de modificar
un tema existente, ya sean cambios grandes o pequeños. Si utilizamos un
tema de otros, ya sea gratuito o de pago, crear un tema hijo es una
buena idea.&lt;/p&gt;
&lt;h2 id="por-qué-crear-un-tema-hijo"&gt;¿Por qué crear un tema hijo?&lt;/h2&gt;
&lt;p&gt;Porqué en algún momento cambiaremos algo del tema que estamos usando, y
en algún momento posterior es posible que haya una actualización de
dicho tema. En el mejor de los casos, nos deberemos preocupar de guardar
los cambios que hemos hecho en el tema y aplicarlos de nuevo tras la
actualización. En el peor, perderemos los cambios que hemos hecho.&lt;/p&gt;</description></item><item><title>Saltar a una entrada aleatoria en WordPress</title><link>http://karpoke.ignaciocano.com/2012/07/27/saltar-a-una-entrada-aleatoria-en-wordpress/</link><pubDate>Fri, 27 Jul 2012 00:20:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2012/07/27/saltar-a-una-entrada-aleatoria-en-wordpress/</guid><description>&lt;p&gt;Si queremos añadir un enlace que nos permita saltar a una entrada
aleatoria de un blog en WordPress, basta crear un archivo que contenga
lo siguiente:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;?php
require(&amp;#39;wp-blog-header.php&amp;#39;);
query_posts(array(&amp;#39;orderby&amp;#39; =&amp;gt; &amp;#39;rand&amp;#39;, &amp;#39;showposts&amp;#39; =&amp;gt; 1));
if (have_posts()) : the_post();
$url = get_permalink($post-&amp;gt;id);
header(&amp;#34;Location: &amp;#34; . $url);
endif;
wp_reset_query();
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Guardamos el archivo en una ruta accesible, por ejemplo en la raíz del
blog.&lt;/p&gt;
&lt;p&gt;Sólo queda añadir el enlace para que nos lleve a una &lt;a href="http://karpoke.ignaciocano.com/salta/"&gt;entrada
aleatoria&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Distribución de frecuencias</title><link>http://karpoke.ignaciocano.com/2012/06/22/distribucion-de-frecuencias/</link><pubDate>Fri, 22 Jun 2012 00:53:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2012/06/22/distribucion-de-frecuencias/</guid><description>&lt;h2 id="distribución-de-los-comandos-más-utilizados"&gt;Distribución de los comandos más utilizados&lt;/h2&gt;
&lt;p&gt;Una de esas combinaciones de comandos curiosas es aquella que nos
devuelve un listado de los &lt;a href="http://www.commandlinefu.com/commands/view/604/list-of-commands-you-use-most-often"&gt;comandos más utilizados&lt;/a&gt; ordenados por
frecuencia, en este caso limitado a los más frecuentes:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ history | awk &amp;#39;{a[$2]++} END {for (i in a) { print a[i] &amp;#34; &amp;#34; i }}&amp;#39; | sort -rn | head
62 cd
50 sudo
45 vim
39 ls
32 ssh
25 wget
23 memento.sh
23 cat
9 curl
9 man
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de estos datos, podemos obtener una &lt;a href="http://bayesianbiologist.com/2012/06/01/distribution-of-oft-used-bash-commands/"&gt;distribución de su
frecuencia de uso&lt;/a&gt; en relación al número total de comandos diferentes
utilizando el paquete estadístico R:&lt;/p&gt;</description></item><item><title>vimrepress, publicar en WordPress desde vim</title><link>http://karpoke.ignaciocano.com/2012/05/20/vimrepress-publicar-en-wordpress-desde-vim/</link><pubDate>Sun, 20 May 2012 13:54:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2012/05/20/vimrepress-publicar-en-wordpress-desde-vim/</guid><description>&lt;p&gt;&lt;a href="http://www.vim.org/scripts/download_script.php?src_id=16490"&gt;vimrepress&lt;/a&gt; es un complemento para trabajar con WordPress. Esta mañana
he leído sobre él en el blog de CyberHades y me han entrado ganas de
probarlo.&lt;/p&gt;
&lt;h2 id="instalación"&gt;Instalación&lt;/h2&gt;
&lt;p&gt;Para que funcione, además de instalar el complemento deberemos activar el
servicio XML-RPC en WordPress para publicar de forma remota. Para
activarlo vamos a Ajustes &amp;gt; Escritura y marcamos la casilla XML-RCP.&lt;/p&gt;
&lt;p&gt;Ahora vamos a instalar el complemento. Descargamos la última versión
estable, en estos momentos la 2.1.5, y la descomprimimos en el
directorio &lt;code&gt;~/.vim&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Abrir enlaces externos en una ventana nueva en segundo plano usando jQuery</title><link>http://karpoke.ignaciocano.com/2012/05/13/abrir-enlaces-externos-en-una-ventana-nueva-en-segundo-plano-usando-jquery/</link><pubDate>Sun, 13 May 2012 00:58:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2012/05/13/abrir-enlaces-externos-en-una-ventana-nueva-en-segundo-plano-usando-jquery/</guid><description>&lt;p&gt;Si queremos que nuestros enlaces se abran en una ventana nueva podemos
utilizar el atributo &lt;code&gt;target&lt;/code&gt; para las etiquetas &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;. Sin embargo, si
utilizamos un esquema XHTML Strict este atributo no es válido para
ninguna etiqueta. El motivo es separar la presentación del contenido del
comportamiento, y el atributo &lt;code&gt;target&lt;/code&gt; modifica el comportamiento.&lt;/p&gt;
&lt;p&gt;Una alternativa es utilizar Javascript para conseguir el mismo efecto.
Si Javascript no está disponible simplemente se abrirá en la misma
ventana. Con Javascript, además, podemos conseguir que la ventana se
abra en segundo plano, aunque sólo en algunos navegadores, como por
ejemplo Chromium. &lt;a href="http://stackoverflow.com/questions/2533305/window-focus-self-focus-not-working-in-firefox/2533335#2533335"&gt;En Firefox es necesario modificar un parámetro&lt;/a&gt; que
viene desactivado por defecto.&lt;/p&gt;</description></item><item><title>sed es Turing completo</title><link>http://karpoke.ignaciocano.com/2012/04/22/sed-es-turing-completo/</link><pubDate>Sun, 22 Apr 2012 00:32:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2012/04/22/sed-es-turing-completo/</guid><description>&lt;p&gt;¿Cómo puede ser un editor de flujo, una utilidad para el tratamiento de
texto, un lenguaje Turing completo? &lt;code&gt;sed&lt;/code&gt; permite saltos condiciones e
incondicionales y utiliza un &lt;em&gt;buffer&lt;/em&gt; temporal, lo que permite
&lt;a href="http://www.catonmat.net/blog/proof-that-sed-is-turing-complete/"&gt;construir una máquina de Turing con él&lt;/a&gt;, y cualquier lenguaje que
pueda construir una máquina de Turing es Turing completo.&lt;/p&gt;
&lt;p&gt;Una implementación de una máquina de Turing con &lt;code&gt;sed&lt;/code&gt; es &lt;a href="http://www.catonmat.net/ftp/sed/turing.sed"&gt;turing.sed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un ejemplo de programa que realiza el incremento de un número binario es
el siguiente:&lt;/p&gt;</description></item><item><title>Consultar el buscón de la RAE desde el terminal</title><link>http://karpoke.ignaciocano.com/2012/02/28/consultar-el-buscon-de-la-rae-desde-el-terminal/</link><pubDate>Tue, 28 Feb 2012 01:41:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2012/02/28/consultar-el-buscon-de-la-rae-desde-el-terminal/</guid><description>&lt;p&gt;Al realizar consultas al &lt;a href="http://buscon.rae.es/draeI/"&gt;buscón de la RAE&lt;/a&gt; desde el terminal, me iba
muy lento. Ésta es una página que todavía usa marcos (wtf!), por lo que
si queremos acceder directamente a la página con el resultado de la
búsqueda deberemos utilizar una de las siguientes URLs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;~~Para el &lt;a href="http://buscon.rae.es/draeI/"&gt;diccionario de la RAE&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;`http://buscon.rae.es/draeI/SrvltGUIBusUsual?origen=RAE&amp;amp;TIPO_BUS=3&amp;amp;LEMA=cederrón`~~
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;~~Para el &lt;a href="http://buscon.rae.es/dpdI/"&gt;diccionario panhispánico de dudas&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;`http://buscon.rae.es/dpdI/SrvltGUIBusDPD?origen=RAE&amp;amp;lema=cederrón`~~
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h4 id="actualización"&gt;Actualización&lt;/h4&gt;
&lt;p&gt;La RAE ha cambiado la URL de búsqueda, pasando a ser:&lt;/p&gt;</description></item><item><title>Instalación automática de las fuentes para web de Google</title><link>http://karpoke.ignaciocano.com/2011/08/07/instalacion-automatica-de-las-fuentes-para-web-de-google/</link><pubDate>Sun, 07 Aug 2011 00:21:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/08/07/instalacion-automatica-de-las-fuentes-para-web-de-google/</guid><description>&lt;p&gt;En &lt;a href="http://www.webupd8.org"&gt;webupd8.org&lt;/a&gt; han publicado un &lt;em&gt;script&lt;/em&gt; que permite &lt;a href="http://www.webupd8.org/2011/01/automatically-install-all-google-web.html"&gt;descargar las
fuentes para web de Google&lt;/a&gt;, o actualizarlas si ya las habíamos
descargado.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.google.com/webfonts#AboutPlace:about"&gt;Google Web Fonts&lt;/a&gt; es un proyecto que consiste en crear un repositorio
de fuentes tipográficas de calidad, libres y gratuitas, para que
cualquiera pueda utilizarlas en sus proyectos web, sin ningún tipo de
barrera, mucho menos económica.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Google Web Fonts" loading="lazy" src="http://karpoke.ignaciocano.com/images/google-web-fonts-300x199.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fuente: &lt;a href="http://googlewebfonts.blogspot.com/"&gt;googlewebfonts.blogspot.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;El &lt;em&gt;&lt;a href="http://webupd8.googlecode.com/files/install-google-fonts"&gt;script&lt;/a&gt;&lt;/em&gt; instala las fuentes en el directorio
&lt;code&gt;/usr/share/fonts/truetype/google-fonts/&lt;/code&gt;, por lo que basta eliminar
este directorio para borrarlas.&lt;/p&gt;</description></item><item><title>Variables variables en Bash</title><link>http://karpoke.ignaciocano.com/2011/06/29/variables-variables-en-bash/</link><pubDate>Wed, 29 Jun 2011 12:11:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/06/29/variables-variables-en-bash/</guid><description>&lt;p&gt;Las variables variables se utilizan cuando queremos tener nombres de
variables que puedan usarse y modificarse de forma dinámica. &lt;a href="http://php.net/manual/en/language.variables.variable.php"&gt;PHP
permite su uso&lt;/a&gt; de forma directa:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;?php
$a = &amp;#39;hello&amp;#39;;
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Una variable variable toma el valor de una variable y lo usa para el
nombre de la variable. Podemos utilizar &amp;ldquo;hello&amp;rdquo; como nombre de variable
utilizando dos signos de dólar:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;?php
$$a = &amp;#39;world&amp;#39;;
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En este punto tenemos dos variables, &lt;code&gt;$a&lt;/code&gt; que contiene &amp;ldquo;hello&amp;rdquo; y
&lt;code&gt;$hello&lt;/code&gt; que contiene &amp;ldquo;world&amp;rdquo;. Así, las siguientes instrucciones
escriben &amp;ldquo;hello world&amp;rdquo;:&lt;/p&gt;</description></item><item><title>Nombres de fichero con espacios en Bash</title><link>http://karpoke.ignaciocano.com/2011/05/11/nombres-de-fichero-con-espacios-en-bash/</link><pubDate>Wed, 11 May 2011 20:47:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/05/11/nombres-de-fichero-con-espacios-en-bash/</guid><description>&lt;p&gt;Si queremos recorrer un directorio y hacer algo con cada fichero o
subdirectorio contenido en él, podemos ejecutar algo como:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ for f in *; do
echo &amp;#34;$f&amp;#34;;
done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En lugar de utilizar un &lt;code&gt;for&lt;/code&gt;, también podríamos usar el comando &lt;code&gt;find&lt;/code&gt;
con el parámetro &lt;code&gt;exec&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ find . -maxdepth 1 \( -name &amp;#39;*&amp;#39; ! -name &amp;#39;.&amp;#39; \) -exec echo {} \;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;O en lugar del &lt;code&gt;exec&lt;/code&gt; con un &lt;code&gt;while&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ find . -maxdepth 1 \( -name &amp;#39;*&amp;#39; ! -name &amp;#39;.&amp;#39; \) | while read f; do
echo &amp;#34;$f&amp;#34;;
done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Un par de cosas:&lt;/p&gt;</description></item><item><title>Desordenando listas en Python</title><link>http://karpoke.ignaciocano.com/2011/03/29/desordenando-listas-en-python/</link><pubDate>Tue, 29 Mar 2011 20:00:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/03/29/desordenando-listas-en-python/</guid><description>&lt;p&gt;Si tenemos una lista de elementos, por ejemplo:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; l = [ 2, 3, 5, 7, 11, 13, 17, 19 ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="Deck Card Shuffler" loading="lazy" src="http://karpoke.ignaciocano.com/images/deck_card_shuffler-300x213.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Y queremos desordenarla, pero con la condición de que ningún elemento
ocupe la misma posición que ocupaba originalmente, podemos aplicar el
&lt;a href="http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Sattolo.27s_algorithm"&gt;algoritmo de Sottolo&lt;/a&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from random import randrange
&amp;gt;&amp;gt;&amp;gt; def sattoloCycle(items):
... i = len(items)
... while i &amp;gt; 1:
... i = i - 1
... j = randrange(i) # 0 &amp;lt; = j &amp;lt;= i-1
... items[j], items[i] = items[i], items[j]
... return
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; sattoloCycle(l)
&amp;gt;&amp;gt;&amp;gt; print l
[5, 17, 3, 2, 7, 11, 13]
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>LaTeX en Wordpress</title><link>http://karpoke.ignaciocano.com/2011/03/29/latex-en-wordpress/</link><pubDate>Tue, 29 Mar 2011 18:54:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/03/29/latex-en-wordpress/</guid><description>&lt;p&gt;Descarga el &lt;a href="http://wordpress.org/extend/plugins/latex/"&gt;plugin de LaTeX para Wordpress&lt;/a&gt;. Luego, escribe:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-latex" data-lang="latex"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;\begin&lt;/span&gt;{align*}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ax^2+bx+c &amp;amp;= 0 &lt;span style="color:#66d9ef"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x^2+&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b}{a}x+&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{c}{a} &amp;amp;= 0 &lt;span style="color:#66d9ef"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x^2+&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b}{a}x &amp;amp;= -&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{c}{a} &lt;span style="color:#66d9ef"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x^2+&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b}{a}x+&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b^2}{4a^2} &amp;amp;= &lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b^2}{4a^2} - &lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{c}{a} &lt;span style="color:#66d9ef"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(x+&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b}{2a})^2 &amp;amp;= &lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b^2}{4a^2} - &lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{4ac}{4a^2} &lt;span style="color:#66d9ef"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x+&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b}{2a} &amp;amp;= &lt;span style="color:#66d9ef"&gt;\pm\sqrt&lt;/span&gt;{&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b^2-4ac}{4a^2}} &lt;span style="color:#66d9ef"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x+&lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{b}{2a} &amp;amp;= &lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{&lt;span style="color:#66d9ef"&gt;\pm\sqrt&lt;/span&gt;{b^2-4ac}}{2a} &lt;span style="color:#66d9ef"&gt;\\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x &amp;amp;= &lt;span style="color:#66d9ef"&gt;\frac&lt;/span&gt;{-b&lt;span style="color:#66d9ef"&gt;\pm\sqrt&lt;/span&gt;{b^2-4ac}}{2a}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;\end&lt;/span&gt;{align*}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;El resultado será parecido a éste:&lt;/p&gt;
&lt;div&gt;
$$
\begin{align*}
ax^2+bx+c &amp;= 0 \\
x^2+\frac{b}{a}x+\frac{c}{a} &amp;= 0 \\
x^2+\frac{b}{a}x &amp;= -\frac{c}{a} \\
x^2+\frac{b}{a}x+\frac{b^2}{4a^2} &amp;= \frac{b^2}{4a^2} - \frac{c}{a} \\
(x+\frac{b}{2a})^2 &amp;= \frac{b^2}{4a^2} - \frac{4ac}{4a^2} \\
x+\frac{b}{2a} &amp;= \pm\sqrt{\frac{b^2-4ac}{4a^2}} \\
x+\frac{b}{2a} &amp;= \frac{\pm\sqrt{b^2-4ac}}{2a} \\
x &amp;= \frac{-b\pm\sqrt{b^2-4ac}}{2a}
\end{align*}
$$
&lt;/div&gt;</description></item><item><title>ls sin ls</title><link>http://karpoke.ignaciocano.com/2011/03/12/ls-sin-ls/</link><pubDate>Sat, 12 Mar 2011 13:11:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/03/12/ls-sin-ls/</guid><description>&lt;p&gt;En bash:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ for i in *; do echo $i; done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="ls" loading="lazy" src="http://karpoke.ignaciocano.com/images/ls-300x232.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fuente: &lt;a href="http://nfosolutions.com/"&gt;nfosolutions.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;En &lt;a href="http://snippets.dzone.com/posts/show/2735"&gt;C&lt;/a&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/*
*
* Esempio che scansiona una cartella stampando a video i file in essa
* contenuti.
*/
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;#include
#include
#include
#include
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *drent;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; if(argc &amp;lt; 2)
{
fprintf(stderr, &amp;#34;%s \n&amp;#34;, argv[0]);
return EXIT_FAILURE;
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; if((dir = opendir(argv[1])) == NULL)
{
fprintf(stderr, &amp;#34;Errore opendir()\n&amp;#34;);
return EXIT_FAILURE;
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; while((drent = readdir(dir)) != NULL)
{
fprintf(stdout, &amp;#34;--&amp;gt; %s\n&amp;#34;, drent-&amp;gt;d_name);
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt; if(closedir(dir) &amp;lt; 0)
{
fprintf(stderr, &amp;#34;Errore closedir()\n&amp;#34;);
return EXIT_FAILURE;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En Python:&lt;/p&gt;</description></item><item><title>Imágenes embebidas en el código HTML, CSS o JSON</title><link>http://karpoke.ignaciocano.com/2011/03/06/imagenes-embebidas-en-el-codigo-html-css-o-json/</link><pubDate>Sun, 06 Mar 2011 18:34:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/03/06/imagenes-embebidas-en-el-codigo-html-css-o-json/</guid><description>&lt;p&gt;Mediante esquema &lt;code&gt;data:URI&lt;/code&gt; se pueden &lt;a href="http://mark.koli.ch/2009/07/howto-include-binary-image-data-in-cascading-style-sheets-css.html"&gt;incluir imágenes codificadas&lt;/a&gt;
en &lt;code&gt;base64&lt;/code&gt; en el CSS de una página o en el &lt;code&gt;src&lt;/code&gt; de una etiqueta &lt;code&gt;img&lt;/code&gt;
como si fueran fuentes externas. También se pueden introducir otro tipo
de datos, como por ejemplo, código HTML.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;img src=&amp;#34;data:image/png;base64,iVBORw0KGgo[...]QmCC&amp;#34; title=&amp;#34;image&amp;#34; alt=&amp;#34;image&amp;#34; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;También se puede utilizar en un &lt;a href="http://mark.koli.ch/2011/01/more-fun-with-rfc-2397----the-data-url-scheme.html"&gt;JSON&lt;/a&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{
&amp;#34;image&amp;#34;:{
&amp;#34;data_uri&amp;#34;:&amp;#34;data:image/png;base64,iVBORw0KGgo[...]QmCC&amp;#34;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="Google 404" loading="lazy" src="http://karpoke.ignaciocano.com/images/google-404-300x112.png"&gt;&lt;/p&gt;
&lt;p&gt;Las ventajas de utilizar este método son que no se necesitan abrir
conexiones adicionales para decargar los datos, ya que toda la
información está incluida en el propio archivo, con lo que dejan
recursos disponibles, algo que puede ser especialmente útil en redes
inalámbricas muy saturadas o lentas, como algunas redes de telefonía
móvil, y se crean menos entradas en la caché del navegador. Además, al
estar incluidos en el código se pueden cachear.&lt;/p&gt;</description></item><item><title>urlencode y urldecode</title><link>http://karpoke.ignaciocano.com/2011/03/06/urlencode-y-urldecode/</link><pubDate>Sun, 06 Mar 2011 17:45:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/03/06/urlencode-y-urldecode/</guid><description>&lt;p&gt;Los siguientes caracteres &lt;a href="http://tools.ietf.org/html/rfc3986#section-2.3"&gt;son los únicos que se pueden utilizar&lt;/a&gt; en
una URL:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[a-zA-Z0-9-._~]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;El resto, se deben codificar usando el prefijo &lt;code&gt;%&lt;/code&gt; seguido del valor
ASCII hexadecimal del carácter. Por ejemplo:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;( = %28
) = %29
/ = %2F
+ = %2B
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Para &lt;a href="http://stackoverflow.com/questions/296536/urlencode-from-a-bash-script/298258#298258"&gt;codificar la URL&lt;/a&gt; podemos utilizar la función &lt;code&gt;uri_escape&lt;/code&gt; del
módulo &lt;code&gt;URI&lt;/code&gt; de Perl.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;alias urlenc=&amp;#39;furlenc() { perl -MURI::Escape -e &amp;#34;print uri_escape(\&amp;#34;$1\&amp;#34;).\&amp;#34;\n\&amp;#34;;&amp;#34;; }; furlenc&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;$ urlenc http://www.google.com
http%3A%2F%2Fwww.google.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Para la &lt;a href="http://www.commandlinefu.com/commands/view/2285/urldecoding"&gt;decodificación de la URL&lt;/a&gt;, podemos hacer uso de &lt;code&gt;sed&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Mystery</title><link>http://karpoke.ignaciocano.com/2011/02/26/mystery/</link><pubDate>Sat, 26 Feb 2011 00:49:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/02/26/mystery/</guid><description>&lt;p&gt;Casi parece que está escrito en chino, o mejor dicho en &lt;em&gt;brainfuck&lt;/em&gt;, o
puede que no sea muy &lt;em&gt;&lt;a href="http://karpoke.ignaciocano.com/2011/02/26/python-zen/"&gt;zen&lt;/a&gt;&lt;/em&gt;, pero no deja de ser &lt;em&gt;&lt;a href="http://blog.garlicsim.org/post/3504711416#comment-156082460"&gt;elegante&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;def mystery(n):
a = list(range(n))
[[(yield i) for a[::i] in [([0]*n)[::i]]] for i in a[2:] if a[i]]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;El nombre de la función pretende no dar pistas para que intentemos
averiguar qué hace exactamente esta función. He aquí una pista:&lt;/p&gt;
&lt;p&gt;&lt;img alt="prime numnbers" loading="lazy" src="http://karpoke.ignaciocano.com/images/prime-numbers-300x300.gif" title="prime-numbers"&gt;&lt;/p&gt;
&lt;p&gt;Fuente: &lt;a href="http://www.numberspiral.com/"&gt;numberspiral.com&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; f = mystery(20)
&amp;gt;&amp;gt;&amp;gt; try:
... while True:
... print f.next()
... except StopIteration:
... pass
2
3
5
7
11
13
17
19
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Python Zen</title><link>http://karpoke.ignaciocano.com/2011/02/26/python-zen/</link><pubDate>Sat, 26 Feb 2011 00:40:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/02/26/python-zen/</guid><description>&lt;p&gt;&lt;em&gt;Just to keep in mind&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="zen" loading="lazy" src="http://karpoke.ignaciocano.com/images/zen-300x225.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Author: &lt;em&gt;&lt;em&gt;&lt;a href="http://www.flickr.com/photos/euart/282104427/"&gt;euart&lt;/a&gt;&lt;/em&gt;&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import this
The Zen of Python, by Tim Peters
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren&amp;#39;t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you&amp;#39;re Dutch.
Now is better than never.
Although never is often better than _right_ now.
If the implementation is hard to explain, it&amp;#39;s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let&amp;#39;s do more of those!
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Cambiar la contraseña de administrador en Django 1.2</title><link>http://karpoke.ignaciocano.com/2011/02/16/cambiar-la-contrasena-de-administrador-en-django-1-2/</link><pubDate>Wed, 16 Feb 2011 14:11:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/02/16/cambiar-la-contrasena-de-administrador-en-django-1-2/</guid><description>&lt;p&gt;A partir de &lt;a href="https://pythonhosted.org/django_simple_feedback/topics/auth.html#changing-passwords"&gt;Django 1.2&lt;/a&gt; se ha añadido el comando
&lt;code&gt;manage.py changepassword&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ./manage.py changepassword [&amp;#39;username&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si no proporcionamos un nombre de usuario se intentará cambiar el nombre
de usuario que concuerde con el del usuario que ha iniciado sesión. Este
comando nos ahorra escribir lo siguiente:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from django.contrib.auth.models import User
&amp;gt;&amp;gt;&amp;gt; u = User.objects.get(username__exact=&amp;#39;john&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; u.set_password(&amp;#39;new password&amp;#39;)
&amp;gt;&amp;gt;&amp;gt; u.save()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="Django Admin Login" loading="lazy" src="http://karpoke.ignaciocano.com/images/django-admin-login-300x171.png"&gt;&lt;/p&gt;
&lt;p&gt;El usuario administrador es el primer usuario del sistema por lo que
podemos escribir:&lt;/p&gt;</description></item><item><title>Descifrando al César en Bash</title><link>http://karpoke.ignaciocano.com/2011/02/16/descifrando-al-cesar-en-bash/</link><pubDate>Wed, 16 Feb 2011 04:26:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/02/16/descifrando-al-cesar-en-bash/</guid><description>&lt;p&gt;Después de ver cómo se &lt;a href="http://karpoke.ignaciocano.com/2011/02/16/descifrando-al-cesar-en-python/"&gt;descifra al César en Python&lt;/a&gt;, me he encontrado
con un par de maneras elegantes de hacerlo desde Bash.&lt;/p&gt;
&lt;h2 id="cifrado-césar"&gt;Cifrado César&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;tr&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ echo &amp;#34;lorem ipsum dolor sit amet&amp;#34; | tr &amp;#39;a-z&amp;#39; &amp;#39;d-za-c&amp;#39;
oruhp lsvxp groru vlw dphw
$ echo &amp;#34;oruhp lsvxp groru vlw dphw&amp;#34; | tr &amp;#39;d-za-c&amp;#39; &amp;#39;a-z&amp;#39;
lorem ipsum dolor sit amet
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Con &lt;code&gt;sed&lt;/code&gt; también se puede conseguir, aunque es bastante más laborioso:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ echo &amp;#34;lorem ipsum dolor sit amet&amp;#34; | sed -e &amp;#34;y/abcdefghijklmnopqrstuvwxyz/defghijklmnopqrstuvwxyzabc/&amp;#34;
oruhp lsvxp groru vlw dphw
$ echo &amp;#34;oruhp lsvxp groru vlw dphw&amp;#34; | sed -e &amp;#34;y/abcdefghijklmnopqrstuvwxyz/defghijklmnopqrstuvwxyzabc/&amp;#34;
lorem ipsum dolor sit amet
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="rot13"&gt;ROT13&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;tr&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Descifrando al César en Python</title><link>http://karpoke.ignaciocano.com/2011/02/16/descifrando-al-cesar-en-python/</link><pubDate>Wed, 16 Feb 2011 03:40:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2011/02/16/descifrando-al-cesar-en-python/</guid><description>&lt;p&gt;Si lo que pretendemos es, dada una cadena, sustituir una serie de
caracteres por otra, en Python es tan sencillo como pasarle al método
&lt;code&gt;maketrans&lt;/code&gt; una cadena con los caracteres que queremos cambiar y otra
con los caracteres a utilizar en su lugar. Ambas cadenas deberán tener
la misma longitud. Este método devuelve una tabla de traducción, un
objeto susceptible de ser usado por el método &lt;code&gt;translate&lt;/code&gt; el cual se
aplica sobre un &lt;em&gt;string&lt;/em&gt;, como veremos.&lt;/p&gt;</description></item><item><title>Póster casero</title><link>http://karpoke.ignaciocano.com/2010/12/11/poster-casero/</link><pubDate>Sat, 11 Dec 2010 02:52:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/12/11/poster-casero/</guid><description>&lt;p&gt;Si tenemos una imagen y queremos crear un póster impreso (y montado a
base de folios) por nosotros mismos podemos utilizar un servicio como
&lt;a href="http://www.hogargeek.com/posters-de-hagalo-usted-mismo-con-block-posters/"&gt;Block posters&lt;/a&gt;. También podemos utilizar los comandos &lt;code&gt;convert&lt;/code&gt; y
&lt;code&gt;pdfposter&lt;/code&gt; para conseguir lo mismo.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mapa del Software Libre - 03.02.2010 - René Mérou" loading="lazy" src="http://karpoke.ignaciocano.com/images/Mapa-del-Software-Libre-03.02.2010-Ren%C3%A9-M%C3%A9rou-300x211.png"&gt;&lt;/p&gt;
&lt;p&gt;Primero creamos un PDF a partir de la imagen, en este caso del &lt;a href="http://www.es.gnu.org/~reneme/fsmap/"&gt;mapa del
software libre&lt;/a&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ convert mapa-del-software-libre.png mapa-del-software-libre.pdf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ahora ya podemos crear el póster:&lt;/p&gt;</description></item><item><title>Intercambio de los valores de dos variables</title><link>http://karpoke.ignaciocano.com/2010/12/03/intercambio-de-los-valores-de-dos-variables/</link><pubDate>Fri, 03 Dec 2010 21:01:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/12/03/intercambio-de-los-valores-de-dos-variables/</guid><description>&lt;p&gt;&lt;img alt="Teleporter" loading="lazy" src="http://karpoke.ignaciocano.com/images/teleporter-300x299.jpg"&gt;&lt;/p&gt;
&lt;p&gt;En algunos lenguajes, intercambiar el valor de la variable &lt;code&gt;a&lt;/code&gt; por el de
la variable &lt;code&gt;b&lt;/code&gt; implica, explícitamente, utilizar una variable temporal:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;t = a;
a = b;
b = t;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En Python:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;a, b = b, a
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pero esperen, aún hay más:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;a, b, c, d = d, c, b, a
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h4 id="actualizado-el-31-de-julio-de-2011"&gt;Actualizado el 31 de julio de 2011&lt;/h4&gt;
&lt;p&gt;En &lt;a href="http://www.commandlinefu.com/commands/view/8937/multiple-variable-assignments-from-command-output-in-bash"&gt;Bash&lt;/a&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ read a b c &amp;lt;&amp;lt;&amp;lt; $(echo $c $b $a)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href="http://www.commandlinefu.com/commands/view/8943/multiple-variable-assignments-from-command-output-in-bash"&gt;Otra manera&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Buscar en todos los campos de un modelo en Django</title><link>http://karpoke.ignaciocano.com/2010/11/19/buscar-en-todos-los-campos-de-un-modelo-en-django/</link><pubDate>Fri, 19 Nov 2010 20:49:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/11/19/buscar-en-todos-los-campos-de-un-modelo-en-django/</guid><description>&lt;p&gt;Una acción típica que se va a repetir en, prácticamente, cada listado
que mostremos, es la de añadir un buscador [1]. Un buscador típico
incluirá un pequeño formulario en la misma página de listado:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;form method=&amp;#34;get&amp;#34; action=&amp;#34;&amp;#34;&amp;gt;
&amp;lt;input type=&amp;#34;text&amp;#34; name=&amp;#34;q&amp;#34; value=&amp;#34;{{ q }}&amp;#34; /&amp;gt;
&amp;lt;input type=&amp;#34;submit&amp;#34; value=&amp;#34;Search&amp;#34; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nos interesaría no tener que ir copiando y pengando este código en cada
listado. Aunque sea un código que no vaya a cambiar, viola el principio
de DRY.&lt;/p&gt;</description></item><item><title>Control de concurrencia optimista en Django</title><link>http://karpoke.ignaciocano.com/2010/11/05/control-de-concurrencia-optimista-en-django/</link><pubDate>Fri, 05 Nov 2010 18:11:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/11/05/control-de-concurrencia-optimista-en-django/</guid><description>&lt;p&gt;Si tenemos una aplicación multiusuario, podría darse el caso de que dos
usuarios accediesen simultáneamente al mismo registro para editarlo. Si
no controlamos este evento, sucederá que el primero que guarde, que no
tiene porqué ser el primero que comenzó a editar, perderá los cambios, y
lo que es peor, sin enterarse.&lt;/p&gt;
&lt;p&gt;Una solución sería utilizar &lt;a href="http://docs.djangoproject.com/en/dev/topics/db/transactions/"&gt;transacciones&lt;/a&gt; [1], pero éstas deberían
abarcar varias peticiones HTTP, desde que se empieza a editar hasta que
se guarda satisfactoriamente (o no), con lo que la solución idónea se
complica. Una solución más sencilla, pero efectiva en la inmensa mayoría
de casos, es utilizar el &lt;a href="http://stackoverflow.com/questions/320096/django-how-can-i-protect-against-concurrent-modification-of-data-base-entries"&gt;control de concurrencia optimista&lt;/a&gt; (también
comentado en &lt;a href="http://hardware.slashdot.org/comments.pl?sid=1381511&amp;amp;cid=29536367"&gt;slashdot&lt;/a&gt;).&lt;/p&gt;</description></item><item><title>Actualización recursiva de un diccionario en Python</title><link>http://karpoke.ignaciocano.com/2010/09/28/actualizacion-recursiva-de-un-diccionario-en-python/</link><pubDate>Tue, 28 Sep 2010 13:50:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/09/28/actualizacion-recursiva-de-un-diccionario-en-python/</guid><description>&lt;p&gt;Cuando actualizamos un diccionario con otro en Pyhton, el método &lt;code&gt;update&lt;/code&gt; copia
las entradas del diccionario fuente en el diccionario destino, sobreescribiendo
las de éste si la entrada existe en ambos diccionarios.&lt;/p&gt;
&lt;p&gt;En particular, si un diccionario contiene una entrada que es a su vez otro
diccionario, no se realiza una actualización sobre ésta, por lo que se pierden
los valores que no estuvieran en el diccionario fuente.&lt;/p&gt;
&lt;p&gt;Ilustremos este comportamiento con un ejemplo:&lt;/p&gt;</description></item><item><title>Memento en Bash</title><link>http://karpoke.ignaciocano.com/2010/09/26/memento-en-bash/</link><pubDate>Sun, 26 Sep 2010 16:01:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/09/26/memento-en-bash/</guid><description>&lt;blockquote&gt;
&lt;p&gt;No me acuerdo de olvidarte.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Memento Polaroid Natalie Clean" loading="lazy" src="http://karpoke.ignaciocano.com/images/memento_polaroids_natalieclean_18700997-248x300.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Si lo primero que haces nada más iniciar una sesión es abrir el
terminal. Varias ventanas, varias pestañas. &lt;code&gt;screen&lt;/code&gt;, &lt;code&gt;terminator&lt;/code&gt; o
&lt;code&gt;byobu&lt;/code&gt;. Es posible que, alguna vez, se te haya pasado por la cabeza que
sería interesante guardar una nota sobre algo que estamos haciendo, algo
que quisiéramos recordar más tarde, algo que quisiéramos no olvidar,
algo que está relacionado con el directorio en el que estamos.&lt;/p&gt;</description></item><item><title>Random Bash</title><link>http://karpoke.ignaciocano.com/2010/09/25/random-bash/</link><pubDate>Sat, 25 Sep 2010 00:54:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/09/25/random-bash/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Los números aleatorios no deberían ser generados por un método
elegido aleatoriamente&amp;rdquo;. &lt;em&gt;Donald E. Knuth&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En Bash, podemos obtener números enteros &lt;a href="http://es.wikipedia.org/wiki/Aleatoriedad"&gt;aleatorios&lt;/a&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ echo $RANDOM
20684
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="Random number" loading="lazy" src="http://karpoke.ignaciocano.com/images/random_number-300x107.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Cada vez que se referencia el parámetro &lt;a href="http://linux.die.net/man/1/bash"&gt;RANDOM&lt;/a&gt;, éste devuelve un
valor entre 0 y 32767, es decir, 2^15^-1. Podemos inicializar la
secuencia de números aleatorios asignando un valor a RANDOM. Debemos
tener en cuenta que si le asignamos un valor vacío a RANDOM se pierden
sus propiedades especiales, aunque después lo inicialicemos.&lt;/p&gt;</description></item><item><title>JABH - Just Another Bash Hacker</title><link>http://karpoke.ignaciocano.com/2010/07/28/jabh/</link><pubDate>Wed, 28 Jul 2010 14:03:00 +0100</pubDate><guid>http://karpoke.ignaciocano.com/2010/07/28/jabh/</guid><description>&lt;p&gt;Se le llama &lt;a href="http://en.wikipedia.org/wiki/Just_another_Perl_hacker"&gt;JAPH&lt;/a&gt; a un programa en Perl que escribe &amp;ldquo;Just another
Perl hacker,&amp;rdquo;. JABH vendría a ser algo parecido, en Bash:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ s=&amp;#34;Jaescunrhkso ettBhr haa,&amp;#34;;for y in {0..4};do for x in {0..4};do echo -n &amp;#34;${s:$((5*x+y)):1}&amp;#34;;done;done
Just another Bash hacker,
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Otra versión, algo más críptica:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ s=&amp;#34;Jaescunrhkso ettBhr haa,&amp;#34;;t=4;f(){ eval &amp;#34;for $1 in {0..$t};do eval $2;done;&amp;#34;;};f x &amp;#39;;f y &amp;#34;echo -n \&amp;#34;&amp;#39;\&amp;#39;&amp;#39;\${s:\$(((t+1)*y+x)):1}&amp;#39;\&amp;#39;&amp;#39;\&amp;#34;&amp;#34;&amp;#39;
Just another Bash hacker,
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>