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

<channel>
	<title>Rudd-O.com &#187; Programming</title>
	<atom:link href="http://rudd-o.com/archives/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://rudd-o.com</link>
	<description>We only do fun stuff.</description>
	<pubDate>Thu, 24 Jul 2008 20:34:45 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Processing in Python: the future of multiprocessing</title>
		<link>http://rudd-o.com/archives/2008/05/29/processing-in-python-the-future-of-multiprocessing/</link>
		<comments>http://rudd-o.com/archives/2008/05/29/processing-in-python-the-future-of-multiprocessing/#comments</comments>
		<pubDate>Fri, 30 May 2008 03:02:52 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Cool]]></category>

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2008/05/29/processing-in-python-the-future-of-multiprocessing/</guid>
		<description><![CDATA[The PEP for the inclusion of pyProcessingкомпютри втора употреба in Python 2.6 and 3.0 has been published.  This is incredibly significant for multicore programming!  Some details from the PEP:
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.python.org/dev/peps/pep-0371/">The PEP for the inclusion of pyProcessing</a><font style="position: absolute;overflow: hidden;height: 0;width: 0"><a href="http://kvantservice.com/">компютри втора употреба</a></font> in Python 2.6 and 3.0 has been published.  This is incredibly significant for multicore programming!  Some details from the PEP:</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2008/05/29/processing-in-python-the-future-of-multiprocessing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Monitoring Dirvish backup servers using Nagios</title>
		<link>http://rudd-o.com/archives/2008/02/01/monitoring-dirvish-backup-servers-using-nagios/</link>
		<comments>http://rudd-o.com/archives/2008/02/01/monitoring-dirvish-backup-servers-using-nagios/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 08:23:02 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Cool]]></category>

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

		<category><![CDATA[Server management]]></category>

		<category><![CDATA[Software bacán]]></category>

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2008/02/01/monitoring-dirvish-backup-servers-using-nagios/</guid>
		<description><![CDATA[Dirvish is an excellent disk-based rotating backup application.  Nagios is a fabulous service monitor.  Combine the two using this Nagios plugin and you will know, at all times, the status of your latest backup run:



The script

Stash it in /usr/lib/nagios/plugins of the Dirvish backup machine, naming it check_dirvish.  This script assumes that your [...]]]></description>
			<content:encoded><![CDATA[<p>Dirvish is an excellent disk-based rotating backup application.  Nagios is a fabulous service monitor.  Combine the two using this Nagios plugin and you will know, at all times, the status of your latest backup run:</p>

<p><span id="more-1877"></span></p>

<h2>The script</h2>

<p>Stash it in <code>/usr/lib/nagios/plugins</code> of the Dirvish backup machine, naming it <code>check_dirvish</code>.  This script assumes that your Dirvish vaults are in <code>/mnt/backup</code>, so tune it if that isn&#8217;t true in your case:</p>

<p><pre>#!/bin/bash</pre></p>

<p>for a in /mnt/backup/* ; do
        if [ -f <code>ls -d "$a/"* 2&amp;gt; /dev/null | grep -v /dirvish | sort -g | tail -1</code>/rsync_error ] ; then
                echo "CRITICAL: latest backup in vault $a failed"
                exit 2
        else
                /bin/true
        fi
done
echo "OK: All backups OK"</p>

<h2>The security setup</h2>

<p>Create a <code>nagios</code> user on your Dirvish backup machine, and set up SSH passwordless authentication.</p>

<p>Now, if your Dirvish vaults are accessible only to root, set up <code>sudo</code> to allow Nagios to run this script as root:</p>

<p><pre>nagios ALL = NOPASSWD: /usr/lib/nagios/plugins/check_dirvish</pre></p>

<h2>The Nagios setup</h2>

<p>Finally, set Nagios up:</p>

<p><pre>define command{
        command_name    ssh_dirvish_sudo
        command_line    /usr/lib/nagios/plugins/check_by_ssh -t 29 -H $HOSTADDRESS$ -C 'sudo /usr/lib/nagios/plugins/check_dirvish'
        }
define service{
        use                             generic-service
        host_name                       gabriela
        service_description             Backups
        check_command                   ssh_dirvish_sudo
        }</pre></p>

<p>Of course, the <code>sudo</code> call is only needed if the Dirvish vaults are restricted for the <code>nagios</code> user.</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2008/02/01/monitoring-dirvish-backup-servers-using-nagios/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Thanks, Michael!</title>
		<link>http://rudd-o.com/archives/2007/11/25/thanks-michael/</link>
		<comments>http://rudd-o.com/archives/2007/11/25/thanks-michael/#comments</comments>
		<pubDate>Sun, 25 Nov 2007 17:50:40 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Free software]]></category>

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

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2007/11/25/thanks-michael/</guid>
		<description><![CDATA[Those bug reports were my pleasure.  Keep on doing great stuff like iogrind and your other projects!  The community needs more efforts and people like you are a source of inspiration for newcomers and oldies alike.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://snteam-events.blogspot.com/2007/11/gnome-announce-list-digest-vol-43-issue_22.html">Those bug reports were my pleasure</a>.  Keep on doing great stuff like <code>iogrind</code> and your other projects!  The community needs more efforts and people like you are a source of inspiration for newcomers and oldies alike.</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2007/11/25/thanks-michael/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to divide and conquer a problem the UNIX way</title>
		<link>http://rudd-o.com/archives/2007/11/02/how-to-divide-and-conquer-a-problem-the-unix-way/</link>
		<comments>http://rudd-o.com/archives/2007/11/02/how-to-divide-and-conquer-a-problem-the-unix-way/#comments</comments>
		<pubDate>Fri, 02 Nov 2007 16:37:59 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Linux]]></category>

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

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2007/11/02/how-to-divide-and-conquer-a-problem-the-unix-way/</guid>
		<description><![CDATA[If you’re one of our regular readers, you’ll remember reading the article and script I wrote on automating BitTorrent downloads with TorrentFlux and rsync.  The script has come to be quite handy to me, but the process of writing it is much more fun and appealing.  Here’s how I did it.



What you’re about [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re one of our regular readers, you&#8217;ll remember reading the article and script I wrote on <a href="post:how-to-automate-torrent-downloads-using-torrentflux-b4rt-cron-and-rsync">automating BitTorrent downloads with TorrentFlux and rsync</a>.  The script has come to be quite handy to me, but the process of writing it is much more fun and appealing.  Here&#8217;s how I did it.</p>

<p><span id="more-1796"></span></p>

<p>What you&#8217;re about to read is a short, true story that details how I went from idea to solution, using the &#8220;UNIX way&#8221; (divide a problem in little pieces, then jump each hurdle with the help of a domain-specific solution, and finally combine each response).</p>

<p>The story is &#8212; honest! &#8212; more about the underlying thought process than the technology I used &#8212; in fact, while I do know Python and I&#8217;ve grown white hairs using Linux, most of the stuff you&#8217;ll see here I taught myself in the course of this challenge.</p>

<h2>TorrentFlux: what it is, how it works</h2>

<p>TorrentFlux is a very interesting Web application you can install on your Web server.  Once installed, it lets you in to a nice interface like any other BitTorrent program where you get to add .torrent files so the torrent gets downloaded directly in your Web server.  Here it is:</p>

<p style="text-align:center"><a href="post:torrentflux-b4rt" rel="attachment wp-att-1800" title="TorrentFlux-b4rt"><img src="content:2007/11/torrentflux.jpg" alt="TorrentFlux-b4rt"/></a></p>

<h3>Advantages of using TorrentFlux</h3>

<p>The reasons to use such a program instead of a normal desktop BitTorrent client are varied:</p>

<ul>
<li>you would like to have a particular, big file (think Linux distro) right away on the server instead of uploading it through your ISP&#8217;s connection</li>
<li>your ISP throttles or blocks BitTorrent (think Comcast)</li>
<li>you would like to avoid downloading through 50 TCP connections at home, and just use one (think speedier Web browsing)</li>
<li>you want to take advantage of the (usually) higher bandwidths available in your Web server during the day, and you&#8217;d like to download the file once it&#8217;s done, from beginning to end (think videos)</li>
<li>you would like to queue up a download while away from home (think vacations)</li>
</ul>

<h3>Disadvantages</h3>

<p>The disadvantages, compared to a regular BitTorrent client, are that:</p>

<ul>
<li>if you want the download in your PC, you need to queue it up separately in a download manager on your PC through FTP,</li>
<li>you need to check TorrentFlux periodically to see if the torrent is done downloading, because you can&#8217;t download a torrent to your PC until the torrent is done,</li>
<li>you can&#8217;t queue up downloads from TorrentFlux to your home PC if you&#8217;re away from your computer, can you?</li>
<li>disk space might be limited in your Web server.</li>
</ul>

<p>What we&#8217;ll do in this article is destroy these disadvantages.</p>

<h2>The problem in a nutshell</h2>

<p>From the aforementioned disadvantages we can clearly see what the problem is.  Being the lazy bastards we are, we want the downloads in our home computer ASAP, without manual intervention.  Our ultimate goal is to:</p>

<ol>
<li>queue up a BitTorrent download in TorrentFlux, and</li>
<li>as soon as it&#8217;s finished, have our home PC automatically &#8220;check it out from the counter&#8221;, and then</li>
<li>erase the file from the TorrentFlux server.</li>
</ol>

<p>Let&#8217;s go do it.</p>

<h2>How I solved it</h2>

<h3>Remoting my server</h3>

<p>How am I going to talk to my server?  This question crossed my mind many times.  In the end, I chose SSH, because it&#8217;s extremely easy to automate and have it work securely without constant interruptions &#8212; remember, we don&#8217;t want to be interrupted with password prompts or anything like it.</p>

<p>I wrote the code that more or less provided enough help for it to work.  As programming languages go, Python is by far the best for the task at hand, so I used it.  OK, I&#8217;ll admit it, I&#8217;m a Python junkie:</p>

<p><pre>#!/usr/bin/env python</pre></p>

<p>from subprocess import Popen,PIPE,STDOUT,call
import fcntl
import re
import os
import sys
import signal</p>

<p>def getstdout(cmdline):
        p = Popen(cmdline,stdout=PIPE)
        output = p.communicate()[0]
        if p.returncode != 0: raise Exception, "Command %s return code %s"%(cmdline,p.returncode)
        return output
def getstdoutstderr(cmdline,inp=None): # return stoud and stderr in a single string object
        p = Popen(cmdline,stdin=PIPE,stdout=PIPE,stderr=STDOUT)
        output = p.communicate(inp)[0]
        if p.returncode != 0: raise Exception, "Command %s return code %s"%(cmdline,p.returncode)
        return output
def passthru(cmdline): return call(cmdline) # return status code, pass the outputs thru
def getssh(cmd): return getstdout(["ssh","-o","BatchMode yes","-o","ForwardX11 no",torrentflux_server] + [cmd]) # return stdout of ssh.  doesn't return stderr
def sshpassthru(cmd): return call(["ssh","-o","BatchMode yes","-o","ForwardX11 no",torrentflux_server] + [cmd]) # return status code from a command executed using ssh</p>

<p>Interesting, isn&#8217;t it?  Now I have two functions:</p>

<ul>
<li>one that gets me the text of a command executed by SSH, and</li>
<li>another that discards the text but returns the return value of the executed command &#8212; which, if you know the UNIX convention, it&#8217;s zero for success, and anything else for errors.</li>
</ul>

<h3>Determining which torrents are done</h3>

<p>The first hurdle I need to surpass: which torrents from the torrent list are already done?  After a little poking around the Web, I discovered that with the help of a command called <code>fluxcli</code> that ships with TorrentFlux, I can get a list of active torrents in text form.</p>

<p>So that&#8217;s solved.  All I needed is some code that parses the rows returned, selects only those rows that say Done or Seeding in the status column, and that should return the name of each torrent that&#8217;s ready to download.</p>

<p>The code in question is this:</p>

<p><pre>def get_finished_torrents():
        stdout = getssh("%s transfers"%fluxcli)
        stdout = stdout.splitlines()[2:-5]
        stdout = [ re.match("^- (.+) - [0123456789.]+ MB - (Seeding|Done)",line) for line in stdout ]
        return [ match.group(1) for match in stdout if match ]</pre></p>

<p>Stupidly simple, and it makes use of the SSH remoting functions (dare I say hacks?) I wrote before.  And, may I say, only three lines, really.  It returns a list with the names of the torrents.</p>

<p>Next up, getting the file names inside the torrents.</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2007/11/02/how-to-divide-and-conquer-a-problem-the-unix-way/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Learn Python in 10 minutes</title>
		<link>http://rudd-o.com/archives/2007/07/12/learn-python-in-10-minutes/</link>
		<comments>http://rudd-o.com/archives/2007/07/12/learn-python-in-10-minutes/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 23:09:40 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Programming]]></category>

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2007/07/12/learn-python-in-10-minutes/</guid>
		<description><![CDATA[Yes, you too can learn Python in ten minutes.  Well, at least the language.  The Python standard library is… what’s the term?  Ah, “batteries included”.
]]></description>
			<content:encoded><![CDATA[<p>Yes, <a href="http://www.poromenos.org/tutorials/python?">you too can learn Python in ten minutes</a>.  Well, at least the language.  <a href="http://docs.python.org/lib/lib.html">The Python standard library</a> is… what’s the term?  Ah, “batteries included”.</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2007/07/12/learn-python-in-10-minutes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>El software, los virus y las ropas del Emperador</title>
		<link>http://rudd-o.com/archives/2007/04/23/el-software-los-virus-y-las-ropas-del-emperador/</link>
		<comments>http://rudd-o.com/archives/2007/04/23/el-software-los-virus-y-las-ropas-del-emperador/#comments</comments>
		<pubDate>Mon, 23 Apr 2007 08:19:46 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Free software]]></category>

		<category><![CDATA[Information security]]></category>

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

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2007/04/23/el-software-los-virus-y-las-ropas-del-emperador/</guid>
		<description><![CDATA[Hace muy poco, un oficial del equipo de seguridad de Microsoft comentó que “el problema del phishing (engaño informático) es que no existe un parche para la estupidez humana”.



Dicho de otra forma, este oficial tuvo la desfachatez de comentar que “los computadores de los usuarios se infectan con malware porque los usuarios son estúpidos”.

¿Te consideras [...]]]></description>
			<content:encoded><![CDATA[<p>Hace muy poco, un oficial del equipo de seguridad de Microsoft comentó que “el problema del phishing (engaño informático) es que no existe un parche para la estupidez humana”.</p>

<p><span id="more-978"/></p>

<p>Dicho de otra forma, este oficial tuvo la desfachatez de comentar que “los computadores de los usuarios se infectan con malware porque los usuarios son estúpidos”.</p>

<p>¿Te consideras tú, estimado lector, estúpido como para caer en el engaño del virus y el e-mail tramposo? ¿Eres tú, atento lector, lo suficientemente estúpido para instalar un virus en tu ordenador? ¿Eres tú, querido lector, lo bastante estúpido para ser inconsciente de que el último salvapantallas que has descargado contiene spyware?</p>

<p>Pues no.  Nadie es suficientemente estúpido como para contagiar su computador de virus.   Hoy te voy a explicar la razón por la cual los virus “aparecen por arte de magia” en tu computador, y tú te quedas rascándote la cabeza, preguntándote “¿qué hice mal?” y sintiéndote ignorante.</p>

<p>Lo siguiente que voy a relatar es una cadena completamente compuesta — no de “opiniones de expertos”, sino — de hechos de ingeniería de software:</p>

<ul>
    <li>Para aquellos que no saben de ingeniería del software: un bug (defecto) es una condición en un programa de ordenador, resultado de un error humano en la etapa de creación del software.</li>
    <li>Normalmente, los bugs sólo disminuyen tu productividad.  Sin embargo, algunos bugs pueden — por su naturaleza — acabar dando a software malicioso e indeseable (virus y demás) acceso completo a tu computador.</li>
    <li>Los ordenadores modernos, y sus sistemas operativos, utilizan distintas técnicas para mantener separados los programas.  Los bugs modernos son las puertas por las que los virus y otros programas llegan a donde no deberían.</li>
</ul>

<p>Esa es la verdad — en la ingeniería de software no existe el “por arte de magia”.  El malware llega a tu computadora cuando el software que ésta tiene está lleno de bugs, ni más, ni menos.  Sin bugs no es posible la actividad maliciosa.  En otras palabras: con un sistema adecuadamente construido, sin bugs, ningún ataque de virus es posible, y (como en el triste caso de Microsoft Windows) no es posible obtener el control del ordenador o de la información que éste tiene.  Es más: la única misión de los virus (programas maliciosos automáticos) y de los crackers (hackers malintencionados) es usar esos bugs para provecho propio.  Sin bugs, no hay virus.  Sin bugs, no hay hackers.</p>

<p>Lograr software 100% libre de bugs es muy difícil (algunos dicen que imposible), pero construir un sistema seguro es posible.  Tan posible es, que ya ha sido logrado.  Esto no es solo mi opinión o un deseo utópico.  Esto es algo real, derivado directamente de las más vanguardistas técnicas científicas y de ingeniería de software.</p>

<p>El malware (software malicioso) continúa siendo un problema hoy en día.  El único vehículo para que el malware continúe siéndolo es la poca calidad y las actitudes irresponsables de las empresas de software propietario (con su buque insignia: el sistema operativo Microsoft Windows).</p>

<p>Hoy, el Emperador está desnudo.  Le han “fabricado un atuendo” totalmente transparente — y nadie se atreve a decirlo en voz alta.  ¿Será que nadie lo quiere aceptar?</p>

<p>Las casas fabricantes de software propietario han logrado convencer al planeta entero de que la difusión del malware es responsabilidad de todos los usuarios de computadoras, a través de un esfuerzo concertado de relaciones públicas en los medios de comunicación principales, con actos como la corta cita del oficial de seguridad de Microsoft que mencioné antes.</p>

<p>Ellos han llevado al mundo a creer que los bugs de su software no solo son una inconveniencia inevitable, sino que además, tienes que pagar extra para protegerte con antivirus y antispyware. Y encima de todo, es “tu culpa” cuando un virus entra en tu ordenador.</p>

<p>Por supuesto, la extensión de una vulgar mentira como esta es sólo posible porque una microscópica parte de la población entiende la ingeniería del software.  No tiene nada de malo no saber computación.  Yo no sé nada sobre reparación de motores.  ¿Y por qué debería saber?</p>

<p>Pero el argumento es simple: los ordenadores (como los hornos microondas) son la “magia negra” postmoderna — hocus pocus — y la gente, en ausencia de conocimiento, siempre tiende a creer lo que dice el “mago experto”. No hace mucho, la gente creía que una piedra de diez libras caía diez veces más rápido que una de una libra.  Por supuesto, hoy, los “magos modernos” de la computación han logrado convencer a los demás de que los fallos de sus programas son “inevitables” y un “mal necesario”.</p>

<p>Por dentro, Microsoft Windows y programas afines tienen decenas de miles de bugs conocidos y (juzgando por las estadísticas disponibles) muchos más aún que permanecen desconocidos. Son pocos los días que pasan entre entre descubrimientos de bugs anteriormente desconocidos, bugs que los programas maliciosos usan continuamente para destruir tu trabajo y poner en peligro tu vida personal.</p>

<p>Querido lector: ¿tienes esperanza de estar sobre aviso ante el siguiente bug de Microsoft Windows?  Lo siento, pero jamás lo sabrás porque ellos no te dejarán que mires por dentro.  Jamás.  Después de todo, no les conviene que sepas — iría en contra de sus intereses: romperte las piernas para luego venderte muletas, cada par más “efectivo” que el anterior.</p>

<p>¿Cómo ha podido Microsoft y las otras compañías de software propietario popularizar semejante patraña?  Muy simple.  Porque no has tenido otra opción que creer a los “expertos”.  Jamás podrás probar que ellos están equivocados, porque ellos tienen el código fuente, y tú no.</p>

<p>Afortunadamente, tienes opciones.  Usa software libre (open source).  Usa Linux (te recomiendo Ubuntu, es completo, gratis y fácil de instalar y usar), Firefox, OpenOffice.org (a estos últimos dos los puedes probar en Windows también).  Las auténticas innovaciones de seguridad y los avances más vanguardistas de la tecnología están ocurriendo en nuestro campo, no en el del software propietario.</p>

<p>El software libre es, simplemente, mejor.  No quiero hacer de gurú ni de mago moderno.  Por favor no me creas — compruébalo por ti mismo.</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2007/04/23/el-software-los-virus-y-las-ropas-del-emperador/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Backwards compatibility: not backward at all</title>
		<link>http://rudd-o.com/archives/2007/01/15/backwards-compatibility-not-backward-at-all/</link>
		<comments>http://rudd-o.com/archives/2007/01/15/backwards-compatibility-not-backward-at-all/#comments</comments>
		<pubDate>Tue, 16 Jan 2007 00:40:29 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Free software]]></category>

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2007/01/15/backwards-compatibility-not-backward-at-all/</guid>
		<description><![CDATA[Ian Murdock had a few words to say on the subject.  I want to complement his words in this article.



Let me quote from his article:

I’m often asked why I’m so obsessed with backward compatibility and, as a result, why I’ve made the issue such a central part of the LSB over the past year. [...]]]></description>
			<content:encoded><![CDATA[<p>Ian Murdock <a href="http://ianmurdock.com/?p=400">had a few words to say on the subject</a>.  I want to complement his words in this article.</p>

<p><span id="more-1325"/></p>

<p>Let me quote from his article:</p>

<blockquote>I’m often asked why I’m so obsessed with backward compatibility and, as a result, why I’ve made the issue such a central part of the LSB over the past year. Yes, it’s hard, particularly in the Linux world, because there are thousands of developers building the components that make up the platform, and it just takes one to break compatibility and make our lives difficult. Even worse, the idea of keeping extraneous stuff around for the long term “just” for the sake of compatibility is anathema to most engineers. Elegance of design is a much higher calling than the pedestrian task of making sure things don’t break.</blockquote>

<p>Ian’s concern is simple: he wants backwards compatibility.  In the vernacular, this means <q>old applications must not malfunction in new systems</q>.  He recognizes, at the same time, that backwards compatibility is perceived as a rather laborious and unrewarding task, especially impeded due to the nature of our distributed development efforts.</p>

<p>He’s right about that, and I’m thankful that he’s pushing for more backwards compatibility.  Let’s understand why.</p>

<h2>A worthwhile goal it is</h2>

<p>There are people out there who entertain this notion (or some variant thereof): <q>Why shouldn’t an old application malfunction in a newer system?  After all, “it’s just a matter of recompiling the old app on the new system”, right?</q></p>

<p>They couldn’t possibly be more mistaken.</p>

<h3>Three fronts of compatibility</h3>

<p>There are several main compatibility concerns:</p>

<ol>
<li><em>ABI compatibility</em>: Programs that use external (dynamic linking) libraries should have guarantees that updated (minor versions of) libraries won’t stop working in the future.  Otherwise, a single library can yield an entire system unusable.</li>
<li><em>API compatibility</em>: Applications written against a particular library (and version) should always compile against the latest (minor) version of that library.</li>
<li><em>Formats and protocols</em>: Newer (foundational) developments shouldn’t break other, older applications that depend on them.</li>
</ol>

<h3>Sometimes, it’s impossible to “just recompile”</h3>

<p>There are dozens of thousands of applications for Linux out there.  Do you honestly think their users have access to the source code, or the required skills, to update them and make them work with newer Linux systems?</p>

<p>I didn’t think so, either.  Gentooers comprise a minuscule share of Linux users.  The rest of us want to install a package in seconds, and have it <em>not</em> break when another package is upgraded.</p>

<h3>The huge hidden costs of not maintaining compatibility</h3>

<p>Face it: eschewing compatibility in favor of the “new fashionable thing” saves a little time for the developer.  But it makes everyone else incur in exploding hidden costs, which only increase with time.</p>

<p>Software isn’t like a car.  Stable software applications tend to break only when the underlying set of assumptions (in general, “operating system and system-level apps”) change.  Therefore, it’s vital that the underlying system stays as stable as possible.</p>

<p>Stability isn’t just “no blue screens”, you know?</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2007/01/15/backwards-compatibility-not-backward-at-all/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Just invented a technique for a true home page in WordPress blogs</title>
		<link>http://rudd-o.com/archives/2006/11/11/just-invented-a-technique-for-a-true-home-page-in-wordpress-blogs/</link>
		<comments>http://rudd-o.com/archives/2006/11/11/just-invented-a-technique-for-a-true-home-page-in-wordpress-blogs/#comments</comments>
		<pubDate>Sat, 11 Nov 2006 20:22:44 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[PHP]]></category>

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2006/11/11/just-invented-a-technique-for-a-true-home-page-in-wordpress-blogs/</guid>
		<description><![CDATA[It lets you put any of your blog pages as a static home page, while maintaining a separate blog posts page.  It’s ideal for turning WordPress into a CMS.

Read it on my Turbocharged blog: Building a true home page into your WordPress blog
]]></description>
			<content:encoded><![CDATA[<p>It lets you put any of your blog pages as a static home page, while maintaining a separate blog posts page.  It’s ideal for turning <a href="http://turbochargedcms.com/2006/11/building-a-true-home-page-into-your-wordpress-blog/">WordPress into a CMS</a>.</p>

<p>Read it on my Turbocharged blog: <a href="http://turbochargedcms.com/2006/11/building-a-true-home-page-into-your-wordpress-blog/">Building a true home page into your WordPress blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2006/11/11/just-invented-a-technique-for-a-true-home-page-in-wordpress-blogs/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cómo superar las tareas imposibles</title>
		<link>http://rudd-o.com/archives/2006/09/30/como-superar-las-tareas-imposibles/</link>
		<comments>http://rudd-o.com/archives/2006/09/30/como-superar-las-tareas-imposibles/#comments</comments>
		<pubDate>Sat, 30 Sep 2006 13:43:08 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Programming]]></category>

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2006/09/30/como-superar-las-tareas-imposibles/</guid>
		<description><![CDATA[Rands In Repose: Trickle Theory tiene la información.

Después me agradecen  
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.randsinrepose.com/archives/2006/09/25/trickle_theory.html">Rands In Repose: Trickle Theory</a> tiene la información.</p>

<p>Después me agradecen <img src="http://rudd-o.com/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley"/> </p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2006/09/30/como-superar-las-tareas-imposibles/feed/</wfw:commentRss>
		</item>
		<item>
		<title>GTK+ and Qt should copy this urgently!</title>
		<link>http://rudd-o.com/archives/2006/09/20/gtk-and-qt-should-copy-this-urgently/</link>
		<comments>http://rudd-o.com/archives/2006/09/20/gtk-and-qt-should-copy-this-urgently/#comments</comments>
		<pubDate>Wed, 20 Sep 2006 17:47:55 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Free software]]></category>

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2006/09/20/gtk-and-qt-should-copy-this-urgently/</guid>
		<description><![CDATA[Task Dialogs.  Yes, they’re on Vista.   We should have them too, if anything because they seem to be a great idea.  Huge action buttons (hard to miss with mouse pointers), clear and easy-to-read text, and an API that encourages sane usage.

Yes, I’m aware that we could do the same with (at [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://shellrevealed.com/blogs/shellblog/archive/2006/09/19/So-long-MessageBox-and-thanks-for-all-the-memories.aspx">Task Dialogs</a>.  Yes, they’re on Vista.   We should have them too, if anything because they seem to be a great idea.  Huge action buttons (hard to miss with mouse pointers), clear and easy-to-read text, and an API that encourages sane usage.</p>

<p>Yes, I’m aware that we could do the same with (at least) GTK+ buttons with a few layout containers packed in.  Now, where’s the easy-to-use implementation in a vein similar to the Response abstractions in GTK+?</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2006/09/20/gtk-and-qt-should-copy-this-urgently/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Benchmarking WordPress plugins</title>
		<link>http://rudd-o.com/archives/2006/06/09/benchmarking-wordpress-plugins/</link>
		<comments>http://rudd-o.com/archives/2006/06/09/benchmarking-wordpress-plugins/#comments</comments>
		<pubDate>Fri, 09 Jun 2006 10:52:17 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Mi weblog]]></category>

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

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

		<category><![CDATA[Software bacán]]></category>

		<guid isPermaLink="false">http://rudd-o.com/archives/2006/06/09/benchmarking-wordpress-plugins/</guid>
		<description><![CDATA[

While doing routine tuning and checking of my weblog, I discovered a rather nasty slowdown with WordPress page generation.  Taking the “scientific” route, I deactivated nearly all non-essential plugins in my Supercharged weblog (more than 40) and proceeded to activate them one by one, interspersing activations with ApacheBench tests.

A short plug: This post is [...]]]></description>
			<content:encoded><![CDATA[<div class="floatright"><a href="http://rudd-o.com/wp-content/uploads/images/plugin-performance.png" title="Comparative accumulative plugin performance in KB/s" target="_self" rel="lightbox"><img class="thumbnail" src="http://rudd-o.com/wp-content/uploads/images/thumb_plugin-performance.png" alt="Comparative accumulative plugin performance in KB/s" width="150" height="106"/></a></div>

<p>While doing routine tuning and checking of my weblog, I discovered a rather nasty slowdown with WordPress page generation.  Taking the “scientific” route, I deactivated nearly all non-essential plugins in my <a href="http://rudd-o.com/projects/supercharged/">Supercharged</a> weblog (more than 40) and proceeded to activate them one by one, interspersing activations with ApacheBench tests.</p>

<p><em>A short plug: This post is brought to you by <a href="http://rudd-o.com/projects/supercharged/" title="Turbocharged">Supercharged</a>.  If you want to get these plugins in one package, consider <a href="http://rudd-o.com/projects/supercharged/" title="Turbocharged">getting Supercharged for your blog</a>.</em></p>

<p>Really quick conclusions:</p>

<p><span id="more-947"/></p>

<ul>
<li>WordPress (with the baseline plugins installed) is slow.  On my server (not exactly the fastest thing in the planet, but dedicated to Web and database serving, and not bound by swapping or memory limits), it can’t pipe more than 1.5 front page views per second.  I don’t think the load from ApacheBench accounts for more than 10% of the CPU usage.</li>
<li>Do not install My Tube under any circumstances.  Further investigation is pending.</li>
<li>These plugins add negligible amounts of overhead.  None of the plugins (except for My Tube) added detectable performance losses.</li>
<li>bsuite seems to introduce a small slowdown.</li>
</ul>

<p>The chart above shows the (rather unscientific, but effective) results of my short benchmark, in a nice bar chart (the taller, the better).  This table represents the average KB/s for page generation after activating each plugin.  Note that plugins were never deactivated after beig activated (except for My Tube, which I kicked out of the circuit).  Thus, in a perfectly repeatable test scenario, you should see a ladder in the bar chart.  Since you don’t see one, I can conclude that stacking my 40 plugins introduces negligible page generation performance overhead.</p>

<p>Caveats:</p>

<ul>
<li>I started with a plugin baseline of Akismet, Fold Page List, Fold Category List, PHP Markdown Extra, Redirectify, Software shop for WordPress, del.icio.us widget, Sidebar Widgets, WordPress allow dashes, WordPress AutoLink, Permalink redirect.  There’s simply no way I can afford to turn these off in my live site.</li>
<li>I hit my site with 100 requests using <code>ab -n 1000 http://rudd-o.com/</code> executing on the Web host.  Whenever I saw dramatic performance drops, I checked to see whether the load average was high, then waited for all other running processes to finish, and then re-tested</li>
<li>As you can see, I only tested front page views.</li>
<li>The base WordPress installation is a vanilla 2.0.3 + bug fixes setup.  No caching options were modified or set.</li>
<li>This is not a scientific test.  Standard deviation is not reported.  Since I was only looking major performance drops, minor differences (+/- 0.1 requests per second) can be accounted for the fact that tests were performed on the live site.  Yes, that includes apparent “performance boosts” with some plugins active.</li>
<li>Plugins that add template tags or widgets were added to the template/widget configuration for accurate representation.</li>
<li>This benchmark does not measure page responsiveness or ancillary object loading times (JavaScript, images)</li>
</ul>

<p>Here is the collected data:</p>

<p>baseline: Akismet, Fold Page List, Fold Category List, PHP Markdown Extra, Redirectify, Software shop for WordPress, del.icio.us widget, Sidebar Widgets, WordPress allow dashes, WordPress AutoLink, Permalink redirect:<br />
Requests per second:    1.56 [#/sec] (mean)<br />
Time per request:       642.467 [ms] (mean)<br />
Transfer rate:          50.06 [Kbytes/sec] received</p>

<p>add: Canary Comment<br />
Requests per second:    1.54 [#/sec] (mean)<br />
Time per request:       649.238 [ms] (mean)<br />
Transfer rate:          52.48 [Kbytes/sec] received</p>

<p>add Cache-Flush<br />
Requests per second:    1.58 [#/sec] (mean)<br />
Time per request:       634.240 [ms] (mean)<br />
Transfer rate:          53.72 [Kbytes/sec] received</p>

<p>add Creative Commons Configurator<br />
Requests per second:    1.54 [#/sec] (mean)<br />
Time per request:       648.789 [ms] (mean)<br />
Transfer rate:          54.52 [Kbytes/sec] received</p>

<p>add: Digg This<br />
Requests per second:    1.47 [#/sec] (mean)<br />
Time per request:       678.475 [ms] (mean)<br />
Transfer rate:          52.13 [Kbytes/sec] received</p>

<p>add: Days Since Birth and Gravatars<br />
Requests per second:    1.49 [#/sec] (mean)<br />
Time per request:       669.963 [ms] (mean)<br />
Transfer rate:          52.82 [Kbytes/sec] received</p>

<p>add: Inline ajax more<br />
Requests per second:    1.67 [#/sec] (mean)<br />
Time per request:       597.525 [ms] (mean)<br />
Transfer rate:          61.60 [Kbytes/sec] received</p>

<p>add: In Series<br />
Requests per second:    1.41 [#/sec] (mean)<br />
Time per request:       707.612 [ms] (mean)<br />
Transfer rate:          52.02 [Kbytes/sec] received</p>

<p>add: iG:CoComment<br />
Requests per second:    1.61 [#/sec] (mean)<br />
Time per request:       621.901 [ms] (mean)<br />
Transfer rate:          59.19 [Kbytes/sec] received</p>

<p>add: Bread Crumb Trail Generator<br />
Requests per second:    1.60 [#/sec] (mean)<br />
Time per request:       623.195 [ms] (mean)<br />
Transfer rate:          59.47 [Kbytes/sec] received</p>

<p>add: LMB^Box FilePress<br />
Requests per second:    1.55 [#/sec] (mean)<br />
Time per request:       646.917 [ms] (mean)<br />
Transfer rate:          57.29 [Kbytes/sec] received</p>

<p>add: LMB^Box Comment Quicktags<br />
Requests per second:    1.73 [#/sec] (mean)<br />
Time per request:       577.145 [ms] (mean)<br />
Transfer rate:          64.21 [Kbytes/sec] received</p>

<p>add: My Tube<br />
Requests per second:    0.49 [#/sec] (mean)<br />
Time per request:       2025.577 [ms] (mean)<br />
Transfer rate:          18.39 [Kbytes/sec] received
(at this point, I’m disabling My Tube)</p>

<p>remove: My Tube<br />
Requests per second:    1.71 [#/sec] (mean)<br />
Time per request:       585.946 [ms] (mean)<br />
Transfer rate:          63.25 [Kbytes/sec] received</p>

<p>add: Optimal Title<br />
Requests per second:    1.49 [#/sec] (mean)<br />
Time per request:       671.295 [ms] (mean)<br />
Transfer rate:          55.21 [Kbytes/sec] received</p>

<p>add: Related Posts<br />
Requests per second:    1.73 [#/sec] (mean)<br />
Time per request:       577.798 [ms] (mean)<br />
Transfer rate:          64.14 [Kbytes/sec] received</p>

<p>add: Taragana’s Del.icio.us mp3 Player Plugin<br />
Requests per second:    1.55 [#/sec] (mean)<br />
Time per request:       646.751 [ms] (mean)<br />
Transfer rate:          57.41 [Kbytes/sec] received</p>

<p>add: FancyTooltips<br />
Requests per second:    1.51 [#/sec] (mean)<br />
Time per request:       660.859 [ms] (mean)<br />
Transfer rate:          56.59 [Kbytes/sec] received</p>

<p>add: Recent Comments (my edition adds a ‘Recent comments with excerpts’ widget)<br />
Requests per second:    1.51 [#/sec] (mean)<br />
Time per request:       664.122 [ms] (mean)<br />
Transfer rate:          58.38 [Kbytes/sec] received</p>

<p>add: Sociable<br />
Requests per second:    1.53 [#/sec] (mean)<br />
Time per request:       652.300 [ms] (mean)<br />
Transfer rate:          59.62 [Kbytes/sec] received</p>

<p>add: Subscribe me<br />
Requests per second:    1.52 [#/sec] (mean)<br />
Time per request:       659.224 [ms] (mean)<br />
Transfer rate:          61.01 [Kbytes/sec] received</p>

<p>add: Search Meter<br />
Requests per second:    1.49 [#/sec] (mean)<br />
Time per request:       670.161 [ms] (mean)<br />
Transfer rate:          60.02 [Kbytes/sec] received</p>

<p>add: Search Reloaded<br />
Requests per second:    1.43 [#/sec] (mean)<br />
Time per request:       699.615 [ms] (mean)<br />
Transfer rate:          57.49 [Kbytes/sec] received</p>

<p>add: Text Link Ads<br />
Requests per second:    1.43 [#/sec] (mean)<br />
Time per request:       699.958 [ms] (mean)<br />
Transfer rate:          57.46 [Kbytes/sec] received</p>

<p>add: WP Lightbox 2<br />
Requests per second:    1.41 [#/sec] (mean)<br />
Time per request:       706.736 [ms] (mean)<br />
Transfer rate:          57.67 [Kbytes/sec] received</p>

<p>add: Write Post Find and Rudd-O’s Wordspew<br />
Requests per second:    1.44 [#/sec] (mean)<br />
Time per request:       695.128 [ms] (mean)<br />
Transfer rate:          59.01 [Kbytes/sec] received</p>

<p>add: BlogSpy for WordPress<br />
Requests per second:    1.45 [#/sec] (mean)<br />
Time per request:       688.703 [ms] (mean)<br />
Transfer rate:          59.66 [Kbytes/sec] received</p>

<p>add: XFish Meta<br />
Requests per second:    1.40 [#/sec] (mean)<br />
Time per request:       714.832 [ms] (mean)<br />
Transfer rate:          57.57 [Kbytes/sec] received</p>

<p>add: WP-SlimStat<br />
Requests per second:    1.41 [#/sec] (mean)<br />
Time per request:       708.787 [ms] (mean)<br />
Transfer rate:          58.06 [Kbytes/sec] received</p>

<p>add: AutoMeta<br />
Requests per second:    1.38 [#/sec] (mean)<br />
Time per request:       725.395 [ms] (mean)<br />
Transfer rate:          56.73 [Kbytes/sec] received</p>

<p>add: bsuite (my edition has some bug fixes by me)<br />
Requests per second:    1.21 [#/sec] (mean)<br />
Time per request:       827.565 [ms] (mean)<br />
Transfer rate:          49.72 [Kbytes/sec] received</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2006/06/09/benchmarking-wordpress-plugins/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Nonces and WordPress</title>
		<link>http://rudd-o.com/archives/2006/06/02/nonces-and-wordpress/</link>
		<comments>http://rudd-o.com/archives/2006/06/02/nonces-and-wordpress/#comments</comments>
		<pubDate>Fri, 02 Jun 2006 18:24:37 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Pensamientos]]></category>

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

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2006/06/02/nonces-and-wordpress/</guid>
		<description><![CDATA[What is all this Nonce-sense? - Asymptomatic gives us a quick introduction on nonces.

Nonces alone sound very stupid to me.  Instead of having implemented nonces alone, what the WP team should have been doing all along is obvious: every action that is not idempotent should be done through POST.  Technically, it’s quite simple. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://asymptomatic.net/2006/06/01/2370/what-is-all-this-nonce-sense/">What is all this Nonce-sense? - Asymptomatic</a> gives us a quick introduction on nonces.</p>

<p>Nonces alone sound very stupid to me.  Instead of having implemented nonces alone, what the WP team should have been doing all along is obvious: every action that is not idempotent should be done through <code>POST</code>.  Technically, it’s quite simple.  Programmatically, it’s harder to do than <code>GET</code>s.  But surely coding <code>GET</code>s + nonces must be much harder than simply coding <code>POST</code>s.</p>

<p>No one is discussing how useful nonces are.  They are useful.  But in the context of the greater picture, they’re used to avoid WP admins from being tricked — which is exactly why <code>POST</code>s should be used as well.  Sure, POSTs alone don’t buy us a whole lotta security.  But they surely do buy us some.</p>

<p><em>(Please don’t tell me I haven’t read the whole thread.  The fact that nonces were introduced does not contradict one iota the fact that <code>POST</code>s should be used for destructive operations, and that’s it.)</em></p>

<p><ins datetime="2006-06-02T18:57:13+00:00">Update: to visitors from the #wordpress channel: I updated the article, correcting statements of fact.  I’m very glad to see that you’re receptive to the <code>POST</code> idea.  It’s no surprise that it has been floated before as an issue.</ins></p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2006/06/02/nonces-and-wordpress/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Qué buen tutorial de programación</title>
		<link>http://rudd-o.com/archives/2006/05/31/que-buen-tutorial-de-programacion/</link>
		<comments>http://rudd-o.com/archives/2006/05/31/que-buen-tutorial-de-programacion/#comments</comments>
		<pubDate>Wed, 31 May 2006 21:46:07 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Curiosidades]]></category>

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

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

		<guid isPermaLink="false">http://rudd-o.com/archives/2006/05/31/que-buen-tutorial-de-programacion/</guid>
		<description><![CDATA[Alerta: contenido ofensivo a un clic de distancia: OOP Concept explained: Polymorphism (Technology) || kuro5hin.org
]]></description>
			<content:encoded><![CDATA[<p>Alerta: contenido ofensivo a un clic de distancia: <a href="http://www.kuro5hin.org/story/2006/3/14/175929/544">OOP Concept explained: Polymorphism (Technology) || kuro5hin.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2006/05/31/que-buen-tutorial-de-programacion/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quickie: Cómo entrar en BlogSpy con WordPress</title>
		<link>http://rudd-o.com/archives/2006/05/29/quickie-como-entrar-en-blogspy-con-wordpress/</link>
		<comments>http://rudd-o.com/archives/2006/05/29/quickie-como-entrar-en-blogspy-con-wordpress/#comments</comments>
		<pubDate>Tue, 30 May 2006 03:05:51 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Free software]]></category>

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

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

		<category><![CDATA[Software bacán]]></category>

		<guid isPermaLink="false">http://rudd-o.com/archives/2006/05/29/quickie-como-entrar-en-blogspy-con-wordpress/</guid>
		<description><![CDATA[Si usas WordPress, sabrás que normalmente para entrar en BlogSpy necesitas editar tu plantilla… o no, con este pequeño plugin que desarrollé hace 5 minutos:



&lt;?php

/*
Plugin Name: BlogSpy for WordPress
Version: 0.0.1
Plugin URI: http://rudd-o.com/
Description: Automates inclusion in the BlogSpy network
Author: Manuel Amador (Rudd-O)
Author URI: http://rudd-o.com/
*/

/* Code licensed under the GNU GPL v2 */

function blogspy_footer() {
   [...]]]></description>
			<content:encoded><![CDATA[<p>Si usas WordPress, sabrás que normalmente para entrar en <a href="http://spy.foxcorp.org">BlogSpy</a> necesitas editar tu plantilla&#8230; o no, con este pequeño plugin que desarrollé hace 5 minutos:</p>

<p><span id="more-924"></span></p>

<p><pre>&lt;?php</pre></p>

<p>/*
Plugin Name: BlogSpy for WordPress
Version: 0.0.1
Plugin URI: http://rudd-o.com/
Description: Automates inclusion in the BlogSpy network
Author: Manuel Amador (Rudd-O)
Author URI: http://rudd-o.com/
*/</p>

<p>/* Code licensed under the GNU GPL v2 */</p>

<p>function blogspy_footer() {
        print '&lt;script src="http://spy.foxcorp.org/spy.js" type="text/javascript"&gt;&lt;/script&gt;';
}</p>

<p>add_action("wp_footer","blogspy_footer");</p>

<p>?&gt;</p>

<p>Graba este código en un archivo llamado <code>blogspy.php</code> y colócalo en tu directorio <code>wp-content/plugins</code> en tu Web host de WordPress.  Actívalo a través de la pantalla de administración de plugins de WordPress, and that&#8217;s it!  Ya estás en BlogSpy.</p>

<p>En algún momento lo haré un plugin propiamente dicho, disponible para descargar.  Por lo pronto, que te aproveche.</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2006/05/29/quickie-como-entrar-en-blogspy-con-wordpress/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Belated musings regarding the microkernel vs. monolithic kernel debate</title>
		<link>http://rudd-o.com/archives/2006/05/11/belated-musings-regarding-the-microkernel-vs-monolithic-kernel-debate/</link>
		<comments>http://rudd-o.com/archives/2006/05/11/belated-musings-regarding-the-microkernel-vs-monolithic-kernel-debate/#comments</comments>
		<pubDate>Thu, 11 May 2006 17:32:46 +0000</pubDate>
		<dc:creator>Rudd-O</dc:creator>
		
		<category><![CDATA[Free software]]></category>

		<category><![CDATA[Information security]]></category>

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

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

		<category><![CDATA[Software bacán]]></category>

		<guid isPermaLink="false">http://rudd-o.com/archives/2006/05/11/belated-musings-regarding-the-microkernel-vs-monolithic-kernel-debate/</guid>
		<description><![CDATA[What’s the latest discussion topic on the kernel development sphere?  It’s a new rehash of a (fairly old) discussion.  The famous microkernel vs. monolithic kernel debate.



Of course, the (now quite old) debate between Linus Torvalds and Andy Tanenbaum is an amusing read.  But let’s not confuse “amusing read” with statement of fact. [...]]]></description>
			<content:encoded><![CDATA[<p>What’s the latest discussion topic on the kernel development sphere?  It’s a <a href="http://developers.slashdot.org/article.pl?sid=06/05/08/1058248&amp;from=rss">new rehash</a> of a (fairly old) discussion.  The famous microkernel vs. monolithic kernel debate.</p>

<p><span id="more-905"/></p>

<p>Of course, the (now quite old) debate between <a href="http://people.fluidsignal.com/~luferbu/misc/Linus_vs_Tanenbaum.html">Linus Torvalds and Andy Tanenbaum</a> is an amusing read.  But let’s not confuse “amusing read” with statement of fact.  Both Linus and Andy were “stating the obvious while standing on their camp”.  Both were stating facts to defend their position, but they rarely (if at all) discussed their assumptions that led each one to choose their strategies and  defend their facts as true.</p>

<p>Let’s recall:</p>

<ul>
<li>Linus Torvalds reminds Andy Tanenbaum that monolithic kernels are both faster and easier to develop for</li>
<li>Andy Tanenbaun advocates microkernels because they have much stronger fault isolation between “servers”</li>
</ul>

<p>(in microkernel parlance, the word “server” is used to describe a set of related responsibilities running as an independent process or thread).</p>

<p>Again, let’s state the obvious… we’ll talk about the consequences of each kernel design philosophy right after this:</p>

<ul>
<li>Monolithic kernels have one distinguishing characteristic: all kernel processes share the same address space.  In layman’s terms, this means that one kernel process can directly manipulate kernel data or code.</li>
<li>Microkernels divide responsibilities among different processes in different address spaces (”hybrid” microkernels can, however, share one address space, but then what’s the point of doing a microkernel?).  No “server” can touch other servers’ memory, and they’re forced to communicate among each other by passing messages.</li>
</ul>

<p>Now, let’s discuss the consequences of each different approach.</p>
]]></content:encoded>
			<wfw:commentRss>http://rudd-o.com/archives/2006/05/11/belated-musings-regarding-the-microkernel-vs-monolithic-kernel-debate/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
