<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>SysMonBlog</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/" />
    <link rel="self" type="application/atom+xml" href="http://sysmonblog.co.uk/atom.xml" />
    <id>tag:sysmonblog.co.uk,2009-02-14://1</id>
    <updated>2009-12-01T13:49:42Z</updated>
    <subtitle>Just another blog about sysadmin</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.23-en</generator>

<entry>
    <title>Munin 1.4.0 released</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/12/munin-140-released.html" />
    <id>tag:sysmonblog.co.uk,2009://1.66</id>

    <published>2009-12-01T13:46:36Z</published>
    <updated>2009-12-01T13:49:42Z</updated>

    <summary>Excellent news and a tonne of new features. new look: nicer html styling and new graph colours with better contrast scalability: including running multiple rrd-graph instances in parallel multigraph: allowing one plugin to create multiple graphs &#8220;drill down&#8221; graphs: aggregate,...</summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    <category term="munin" label="munin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p><a href="http://twistylife.blogspot.com/2009/12/munin-140-released.html">Excellent news</a> and a tonne of new features.</p>

<ul>
<li>new look: nicer html styling and new graph colours with better contrast</li>
<li>scalability: including running multiple rrd-graph instances in parallel</li>
<li>multigraph: allowing one plugin to create multiple graphs</li>
<li>&#8220;drill down&#8221; graphs: aggregate, then refine data in graphs</li>
<li>SSL (TLS) support: finally!</li>
</ul>

<p>Congratulations to all involved.  I&#8217;m looking forward to playing with the 1.4.x releases.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Debugging Ruby on Rails performance for WhatDoTheyKnow</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/09/debugging-ruby-on-rails-performance-for-whatdotheyknow.html" />
    <id>tag:sysmonblog.co.uk,2009://1.59</id>

    <published>2009-09-18T08:48:42Z</published>
    <updated>2009-09-18T08:55:13Z</updated>

    <summary>WhatDoTheyKnow getting too popular! Yay! Solving the (memory) performance issues more traffic can cause? Boo. RailsSpawnMethod conservative Monit to kick apache when memory (leaks) got too high Profile (memory) usage. More efficient memory usage (&#8220;text.gsub!&#8221; rather than &#8220;text = text.gsub&#8221;)...</summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p><a href="http://www.whatdotheyknow.com/">WhatDoTheyKnow</a> getting too popular!  Yay!</p>

<p><a href="http://www.mysociety.org/2009/09/17/whatdotheyknow-growing-pains-and-ruby-memory-leaks/">Solving the (memory) performance issues</a> more traffic can cause? Boo.</p>

<ul>
<li>RailsSpawnMethod conservative</li>
<li>Monit to kick apache when memory (leaks) got too high</li>
<li>Profile (memory) usage.</li>
<li>More efficient memory usage (&#8220;text.gsub!&#8221; rather than &#8220;text = text.gsub&#8221;)</li>
<li>common sense ;)</li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>your open street map</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/08/your-open-street-map.html" />
    <id>tag:sysmonblog.co.uk,2009://1.54</id>

    <published>2009-08-26T16:50:04Z</published>
    <updated>2009-08-26T16:51:40Z</updated>

    <summary>Your own Amazon ec2 powered open street map tile rendering app (which you can then layer onto top of google maps and more) in just a few clicks. nifty! (via)...</summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>Your own Amazon ec2 powered open street map tile rendering app (which you can then layer onto top of google maps and more) in just a few clicks.</p>

<p><a href="http://tiledrawer.com/">nifty!</a> (<a href="http://waxy.org/links/">via</a>)</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Paste &amp; execute code with results as a short url</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/08/paste-execute-code-with-results-as-a-short-url.html" />
    <id>tag:sysmonblog.co.uk,2009://1.52</id>

    <published>2009-08-20T10:03:07Z</published>
    <updated>2009-08-20T10:18:59Z</updated>

    <summary><![CDATA[codepad.org Kinda like pastebin/nopaste, but with interpreter/compiler/execution built in. You paste code into the website, it is run &amp; executed and you see the results. [that intentionally is designed to fail]. The about page is an interesting read - not...]]></summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    <category term="coding" label="coding" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="development" label="development" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="irc" label="irc" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p><a href="http://codepad.org/">codepad.org</a></p>

<p>Kinda like <a href="http://en.wikipedia.org/wiki/Pastebin">pastebin/nopaste</a>, but with interpreter/compiler/execution built in.</p>

<p>You paste code into the website,  it is run &amp; executed and <a href="http://codepad.org/lhSs5Jhq">you see the results</a>. [that intentionally is designed to fail].</p>

<p>The <a href="http://codepad.org/about">about page</a> is an interesting read - not least how everything is locked down to make it (hopefully) safe.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Apache mod_rewrite and proxypass</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/08/apache-mod-rewrite-and-proxypass.html" />
    <id>tag:sysmonblog.co.uk,2009://1.50</id>

    <published>2009-08-18T14:40:21Z</published>
    <updated>2009-08-18T15:12:43Z</updated>

    <summary>From the department of &#8220;this took me a while to figure out and googling didn&#8217;t help much, so here&#8217;s what I did&#8221;. Problem Combining mod_rewrite (rewriterule / rewritecond) with proxypass directives inside a single virtualhost block in your apache configuration....</summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    <category term="apache" label="apache" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sysadmin" label="sysadmin" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>From the department of &#8220;this took me a while to figure out and googling didn&#8217;t help much, so here&#8217;s what I did&#8221;.</p>

<h1>Problem</h1>

<p>Combining mod_rewrite (rewriterule / rewritecond) with proxypass directives inside a single virtualhost block in your apache configuration.</p>

<h2>Background</h2>

<p>This isn&#8217;t unique to the problem/solution, but fyi, we have:</p>

<ul>
<li>Front end apache, serving static files</li>
<li>Backend &#8220;application&#8221; apache, running our mod_perl application</li>
</ul>

<p>We proxy requests for the application to the backend apache and deliver the rest of the files (css, js, ssi includes) from the frontend.</p>

<pre><code>ProxyPass        /art         !
ProxyPass        /css         !
ProxyPass        /favicon.ico !
ProxyPass        /robots.txt  !
ProxyPass        /            http://localhost:8001/
ProxyPassReverse /            http://localhost:8001/
</code></pre>

<p>We were trying to set an environment variable (or setting a cookie would be another use-case) using RewriteRule.</p>

<p>We wanted to conditionally set the rule based on a querystring, so SetEnvIf wasn&#8217;t sufficient because it cannot see the query string component of the request.</p>

<p>In general, this can be achieved with:</p>

<pre><code>RewriteEngine on
RewriteCond %{REQUEST_URI} ^/some/foo/
RewriteCond %{QUERY_STRING} .*qs_param=.*
RewriteRule (.*) $1 [E=my_env_var:1]
....
ProxyPass        /art         !
</code></pre>

<p>The RewriteRule line is basically saying: set this environment variable but otherwise do nothing.</p>

<p>The problem was that requests for /some/foo/ where 404&#8217;ing rather than being proxy passed.</p>

<h1>Solution</h1>

<p>Can be found in the <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule">apache docs for RewriteRule</a> and specifically the section about PassThrough:</p>

<blockquote>
  <p>This flag is just a hack to enable post-processing of the output
of RewriteRule directives, using Alias, ScriptAlias, Redirect, 
and other directives from various URI-to-filename translators.</p>
</blockquote>

<p>&#8230; such as ProxyPass.  So the fix for us was:</p>

<pre><code>RewriteRule (.*) $1 [PT,E=my_env_var:1]
</code></pre>

<h1>ps</h1>

<p>When trying to figure out what is going on with Rewrite rules, the RewriteLog and RewriteLogLevel options are well worth taking advantage of.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>How to create your own Moose sub types in Perl</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/07/how-to-create-your-own-moose-sub-types-in-perl.html" />
    <id>tag:sysmonblog.co.uk,2009://1.48</id>

    <published>2009-07-19T14:08:00Z</published>
    <updated>2009-07-20T21:40:54Z</updated>

    <summary><![CDATA[I learnt today (thanks to irc.perl.org #moose) that you can do this in Moose: has cookies =&gt; ( is =&gt; 'rw', isa =&gt; 'Bool|Int', # Bool or Int type ); You can also state that the type should be an...]]></summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    <category term="moose" label="moose" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>I learnt today (thanks to <a href="http://www.irc.perl.org/">irc.perl.org</a> #moose) that you can do this in <a href="http://search.cpan.org/perldoc?Moose">Moose</a>:</p>

<pre><code>has cookies =&gt; (
    is  =&gt; 'rw',
    isa =&gt; 'Bool|Int',  # Bool or Int type
);
</code></pre>

<p>You can also state that the type should be an instance of a specific class:</p>

<pre><code>has web_browser =&gt; (
    is  =&gt; 'rw',
    isa =&gt; 'WWW::Mechanize',
);
</code></pre>

<p>However, you cannot use the above OR construct with class names:</p>

<pre><code>has web_browser =&gt; (
    is  =&gt; 'rw',
    isa =&gt; 'WWW::Mechanize|My::Test::Mechanize', # FAIL
);
</code></pre>

<p>At least, not directly out of the box &#8230;.</p>

<h1>class_type</h1>

<p>The quickest way to crack this nut seems to be with <a href="http://search.cpan.org/perldoc?Moose::Util::TypeConstraints#Type_Constraint_Constructors">Moose::Util::TypeConstraints</a> class_type.</p>

<pre><code>use Moose::Util::TypeConstraints;
class_type q[WWW::Mechanize];
class_type q[My::Test::Mechanize];
no Moose::Util::TypeConstraints;
</code></pre>

<p>and now this will work:</p>

<pre><code>has web_browser =&gt; (
    is  =&gt; 'rw',
    isa =&gt; 'WWW::Mechanize|My::Test::Mechanize',
);
</code></pre>

<h1>OR &#8230; Sub types</h1>

<p><a href="http://search.cpan.org/perldoc?Moose::Manual::Types#SUBTYPES">Moose::Manual::Types </a> tells us we can create our own sub types, giving an example of a PositiveInt type.</p>

<p>That in turn points to <a href="http://search.cpan.org/perldoc?Moose::Util::TypeConstraints#Type_Constraint_Naming">Type Constraint Naming in Moose::Util::TypeConstraints</a> which says:</p>

<blockquote>
  <p>Since the types created by this module are global, it is suggested that you namespace your types just as you would namespace your modules. So instead of creating a <code>Color</code> type for your <code>My::Graphics</code> module, you would call the type <code>My::Graphics::Types::Color</code> instead</p>
</blockquote>

<p>I don&#8217;t know if this is the <em>right</em> way to do things, but I now have the following setup:</p>

<h1>Defining My::Types</h1>

<p>In lib/My/Types.pm I have:</p>

<pre><code>package My::Types;

use Moose::Util::TypeConstraints;

subtype 'My::Types::PositiveInt'
    =&gt; as 'Int'
    =&gt; where { $_ &gt; 0 }
    =&gt; message { "'$_' is not a int &gt; 0" };

subtype 'My::Types::Mech'
    =&gt; as 'Object'
    =&gt; where {
        $_-&gt;isa('WWW::Mechanize')
        || 
        $_-&gt;isa('My::Test::Mechanize')
    }
    =&gt; message {
        "'$_' is neither WWW::Mechanize or My::Test::Mechanize"
    };

no Moose::Util::TypeConstraints;

1;
</code></pre>

<h1>Using My::Types</h1>

<p>And then within my other code / modules / classes, I can have:</p>

<pre><code>use My::Types;

has web_browser =&gt; (
    is  =&gt; 'rw',
    isa =&gt; 'My::Types::Mech',
);
</code></pre>

<p>Which will ensure <code>$thing->web_browser</code> is either a <a href="http://search.cpan.org/perldoc?WWW::Mechanize">WWW::Mechanize</a> object or my own My::Test::Mechanize object (used for testing purposes).</p>

<h1>OR &#8230;. MooseX::Types</h1>

<p>An (third) alternative approach is <a href="http://search.cpan.org/perldoc?MooseX::Types">MooseX::Types</a>, which allows for having custom types and choosing which ones you import in any one place.</p>

<p>To define your types, in lib/My/Types.pm</p>

<pre><code>package My::Types;

use MooseX::Types
    -declare =&gt; [qw&lt;PositiveInt Mech&gt;];

use MooseX::Types::Moose qw&lt;Int Object&gt;;

subtype PositiveInt,
    as Int,
    where { $_ &gt; 0 },
    message { "'$_' is not a int &gt; 0" };

subtype Mech,
    as Object,
    where {
        $_-&gt;isa('WWW::Mechanize')
        ||
        $_-&gt;isa('My::Test::Mechanize')
    },
    message {
        "'$_' is neither WWW::Mechanize or My::Test::Mechanize"
    };

1;
</code></pre>

<p>and then to use it in your code:</p>

<pre><code>use My::Types qw&lt;Mech&gt;;
has web_browser =&gt; (
    is  =&gt; 'rw',
    isa =&gt; Mech,
);
</code></pre>

<p>Note that you do not want the quotes around <code>Mech</code> here else it will fail.</p>

<h1>Which one to use?</h1>

<p>I haven&#8217;t a clue.  I think I currently favour defining my own subtype through Moose::Util::TypeConstraints but that is possibly just because it was my first working solution.</p>

<p>Comments welcome :)</p>

<p>ps. thanks again to the friendly people on #moose for putting up with my dumb questions about all this.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Stunning image manipulation in HTML/CSS/JavaScript</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/07/stunning-image-manipulation-in-htmlcssjavascript.html" />
    <id>tag:sysmonblog.co.uk,2009://1.47</id>

    <published>2009-07-17T20:06:52Z</published>
    <updated>2009-07-17T20:16:54Z</updated>

    <summary>Easy as 1,2, 3: Grab a webkit nightly download View the demo Tap on your arrow keys, use Space to toggle zoom mode. Background and videos at satine.org. Or, for a closed source version but with nicer polish try Cooliris...</summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    <category term="browsers" label="browsers" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="css" label="css" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="image" label="image" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ui" label="ui" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webkit" label="webkit" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>Easy as 1,2, 3:</p>

<ul>
<li>Grab a <a href="http://nightly.webkit.org/">webkit nightly</a> download</li>
<li><a href="http://www.satine.org/research/webkit/snowleopard/snowstack.html">View the demo</a></li>
<li>Tap on your arrow keys, use Space to toggle zoom mode.</li>
</ul>

<p>Background and videos <a href="http://www.satine.org/archives/2009/07/11/snow-stack-is-here/">at satine.org</a>.</p>

<p>Or, for a closed source version but with nicer polish try <a href="http://cooliris.com/">Cooliris</a> or the <a href="https://addons.mozilla.org/en-US/firefox/addon/5579">Cooliris Firefox extension</a></p>

<p>Now would someone please find the managers who <a href="http://blog.digg.com/?p=878">refuse to let their IT departments upgrade from IE6</a> and mock and taunt this stupidity until they see sense.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Upgrading libwww-perl via a Debian / Ubuntu deb package</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/07/upgrading-libwww-perl-via-a-debian-ubuntu-deb-package.html" />
    <id>tag:sysmonblog.co.uk,2009://1.44</id>

    <published>2009-07-11T14:12:49Z</published>
    <updated>2009-07-13T08:58:02Z</updated>

    <summary>I had cause to want a more recent version of Perl&#8217;s libwww-perl (specifically 5.829) than ships in Ubuntu 9.04 (Jaunty). This post explains how I built a new .deb file to replace libwww-perl_5.820-1_all.deb that ships in Jaunty. Note that the...</summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    <category term="apt" label="apt" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="aptitude" label="aptitude" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="debian" label="debian" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="howto" label="howto" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="libwwwperl" label="libwww-perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="linux" label="linux" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ubuntu" label="ubuntu" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>I <a href="https://rt.cpan.org/Ticket/Display.html?id=47280">had cause</a> to want <a href="http://search.cpan.org/dist/libwww-perl/Changes">a more recent version of Perl&#8217;s libwww-perl</a> (specifically 5.829) than <a href="http://packages.ubuntu.com/jaunty/libwww-perl">ships in Ubuntu 9.04 (Jaunty)</a>.</p>

<p>This post explains how I built a new .deb file to replace libwww-perl_5.820-1_all.deb that ships in Jaunty.</p>

<p>Note that the resulting file:</p>

<ul>
<li>passes the libwww-perl tests.</li>
<li>uploads to my own local apt repository (optional, not required)</li>
<li>installs cleanly via apt-get or aptitude install on my Jaunty setup</li>
</ul>

<p>However:</p>

<ul>
<li>It is <i>not</i> suitable for uploading to a Debian or Ubuntu apt package repository (mostly because I&#8217;ve not gone through all the required steps to ensure it&#8217;s compatible with their policies and standards).</li>
<li>Is supplied as-is, without any warranty.  It is what I use, and I&#8217;m not aware of any thing bad, but there is at least the possibility this could mess up your system.  <a href="http://en.wikipedia.org/wiki/Caveat_emptor">Caveat emptor</a>.</li>
</ul>

<h1>Overview</h1>

<p>The process is thus:</p>

<ul>
<li>Grab the <a href="http://packages.ubuntu.com/jaunty/libwww-perl">current .deb file that ships in Ubuntu 9.04 Jaunty</a>.</li>
<li>Grab the <a href="http://search.cpan.org/dist/libwww-perl/">latest upstream source for libwww-perl</a>.</li>
<li>Do some un-tarring, directory moving/renaming</li>
<li>The original deb package contains all the changes debian/ubuntu made to the original source.  We re-apply these changes to the newer up-stream source.</li>
</ul>

<p>It occassionally happens that this doesn&#8217;t work cleanly.  For instance, if debian had applied a bug fix which wasn&#8217;t originally in the upstream source, but the latter version of upstream you are building has applied the patch.  The original debian patches will fail because they&#8217;ll be trying to re-apply an already applied patch.</p>

<p>If this happens you need to fiddle with the debian patches until they apply cleanly.  I&#8217;m not covering this here as in my experience this is fairly uncommon, at least when upgrading <a href="http://search.cpan.org/">cpan</a> packages.</p>

<p>Then we:</p>

<ul>
<li>Tweak the debian/control and debian/changes meta-files</li>
</ul>

<h1>Process</h1>

<p>Ensure you have the deb-src lines in /etc/apt/sources.list and you&#8217;ve run &#8220;aptitude update&#8221;.</p>

<p>Namely, /etc/apt/sources.list contains something like:</p>

<pre class=code><code>deb http://gb.archive.ubuntu.com/ubuntu/ jaunty \
  main restricted universe multiverse
deb-src http://gb.archive.ubuntu.com/ubuntu/ jaunty \
  main restricted universe multiverse
deb http://gb.archive.ubuntu.com/ubuntu/ jaunty-updates \
  main restricted universe multiverse
deb-src http://gb.archive.ubuntu.com/ubuntu/ jaunty-updates \
  main restricted universe multiverse
</code></pre>

More details at <a href="http://ubuntuguide.org/">ubuntuguide.org</a>.  

Ensure you&#8217;re up to date:

<pre class=code><code>sudo aptitude update
sudo aptitude safe-upgrade
</code></pre>

Now create yourself a directory to work in, and get the source package from Ubuntu.

<pre class=code><code>mkdir -p /tmp/jaunty-packages
cd /tmp/jaunty-packages
/usr/bin/apt-get source libwww-perl
</code></pre>

Next get the <a href="http://search.cpan.org/dist/libwww-perl/">upstream source</a> for the newer version you are trying to upgrade to.  In this case, I wanted 5.829.  Then decompress and untar it:

<pre class=code><code>wget http://search.cpan.org/CPAN/authors/id/ \
  G/GA/GAAS/libwww-perl-5.829.tar.gz
tar zxvf tar zxvf libwww-perl-5.829.tar.gz
</code></pre>

Ensure the upstream source directory you downloaded matches the style of the debian package.  With libwww-perl there is nothing to do, but generally you need to do something here.  For example:, Jaunty currently has 0.14 of Net::OAuth, but if we were upgrading to the current 0.19 release:

<pre class=code><code>apt-get source libnet-oauth-perl
wget http://search.cpan.org/CPAN/authors/id/ \
  K/KG/KGRENNAN/Net-OAuth-0.19.tar.gz
tar zxvf Net-OAuth-0.19.tar.gz
mv Net-OAuth-0.19 libnet-oauth-perl-0.19
</code></pre>

It&#8217;s the last line that is normally required, but libwww-perl is a special case where it doesn&#8217;t apply.

<div style="background-color: #ccf; margin: 1em; padding: 1em;">
Quick aside - if you are upgrading Net::OAuth from 0.14 to 0.19 be aware that the &#8220;demo&#8221; directory has been renamed &#8220;demos&#8221;.

You&#8217;ll need to adjust libnet-oauth-perl-0.19/debian/rules and libnet-oauth-perl-0.19/debian/libnet-oauth-perl.examples accordingly otherwise you&#8217;ll get this error:

<pre>    
    cp: cannot stat `demo/': No such file or directory
    dh_installexamples: command returned error code 256
    make: *** [install-stamp] Error 1
    dpkg-buildpackage: failure: fakeroot debian/rules 
      binary gave error exit status 2
</pre>

<p></div></p>

<p>Next, create two copies of the directory, one for testing and one that is required for building.</p>

<pre class=code><code>cp -ai libwww-perl-5.829 libwww-perl-5.829.orig
cp -ai libwww-perl-5.829 libwww-perl-5.829.test
</code></pre>

<p>Apply the debian patches:</p>

<pre class=code><code>cd libwww-perl-5.829
gzip -dc ../libwww-perl*.diff.gz | patch -p1
cd ../
</code></pre>

<p>Ensure the debian/rules file in the main build dir is executable:</p>

<pre class=code><code>chmod u+x libwww-perl-5.829/debian/rules
</code></pre>

<p>The next step isn&#8217;t essential, but I find it helps with resolving issues.  It generates the debian meta files, and these can be useful to compare and contrast with what you have inherited from the earlier release.</p>

<pre class=code><code>/usr/bin/dh-make-perl libwww-perl-5.829.test
cd libwww-perl-5.829.test
perl Makefile.PL
make test
cd ../
</code></pre>

<p>That will shake out any required dependencies and highlight any failing tests.  You should take care of those before you continue.</p>

<p>Now back to the primary libwww-perl-5.829 directory.</p>

<p>Take a glance over the debian/control file.  You&#8217;re primarily looking for missing dependencies or where version numbers are too low.  Namely, the earlier version of your module might have depended on Acme::FooBar version 1.2, but the newer version you are building now depends on Acme::FooBar 1.3.  You&#8217;ll want to ensure the debian/control file reflects this.</p>

<pre class=code><code>vi libwww-perl-5.829/debian/control
</code></pre>

<p>Provided you ran the dh-make-perl step above:</p>

<ul>
<li>libwww-perl-5.829.test/debian/control</li>
</ul>

<p>will contain a decent first guess which you can use as a reference.  The Makefile.PL or META.yml or similar files in the upstream source directories are also useful places to look for dependency information (and dependency versions).</p>

<p>Now you need to update libwww-perl-5.829/debian/changelog.  Copy the previous entry, and update for your needs.</p>

<h1>Package version numbers</h1>

<p>A note about about the version number in the first line of the changelog file</p>

<ul>
<li>(5.829-1~0yourname)</li>
</ul>

<p>The 5.829 is the upstream version number.  -1 is the first package built from that.  What about the ~0yourname part?</p>

<p>If debian/ubuntu were to build an official package for this specific version, it would have the version number 5.829-1.  This ought to be &#8220;newer&#8221; than yours (because of the ~0yourname bit), and thus apt will prefer the official version over yours.</p>

<p>If you find a mistake and need to re-build your package, you will need to give it a newer version, but you don&#8217;t want to mess with what upstream or debian/ubuntu would use.</p>

<ul>
<li>(5.829-1~1yourname)</li>
<li>(5.829-1~2yourname)</li>
<li>&#8230;</li>
</ul>

<p>Would be a way to achieve this.  The &#8220;yourname&#8221; part is largely optional, but it helps to make the packages you have built stand out which is sometimes of use.</p>

<h1>Finally &#8230;</h1>

<pre class=code><code>cd libwww-perl-5.829
dpkg-buildpackage -rfakeroot -uc -us
cd ../
</code></pre>

<p>If that works, you should find libwww-perl_5.829-1~0yourname_all.deb along with some other files you would need where you going to upload to a local apt repository.</p>

<p>You can install your deb with:</p>

<pre class=code><code>sudo dpkg -i libwww-perl_5.829-1~0yourname_all.deb
</code></pre>

<p>All done!</p>

<p>Comments, feedback, questions or suggestions welcome.  Preferably in the comments below but otherwise drop us an <a href="mailto:sysmonblog@googlemail.com">email</a>.</p>

<h1>PS</h1>

<p>I&#8217;m aware of <a href="http://debian.pkgs.cpan.org/">http://debian.pkgs.cpan.org/</a> but it doesn&#8217;t always have what I want. I also find that the differently named packages sooner or later cause some kinda clash with the packages I get from Debian/Ubuntu.</p>

<h1>PPS</h1>

<p>I&#8217;m also aware of <a href="http://michael.thegrebs.com/2008/07/02/dh-make-perl-will-rock-your-socks/">dh-make-perl</a> however that has caused me to trip up previously with version numbers.</p>

<p>For example the version of <a href="http://packages.ubuntu.com/jaunty/libspreadsheet-parseexcel-perl">Spreadsheet::ParseExcel in Ubuntu Jaunty</a> is 0.3300. The <a href="http://search.cpan.org/dist/Spreadsheet-ParseExcel/">latest version on cpan</a> is 0.49 and to make that work it&#8217;s version in the debian package needs to be 0.4900. But dh-make-perl picks 0.49.</p>

<pre class=code><code>dpkg --compare-versions 0.3300 lt 0.4900 && echo yes || echo no
</code></pre>

<p>Plus, sometimes you want to tinker with the debian control files a little, and I&#8217;ve not yet figured out how to have it upgrade an existing module rather than build a new version (and loose all the changelog history from the debian package)</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Guardian&apos;s MP expenses crowd sourcing experiment</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/06/guardians-mp-expenses-crowd-sourcing-experiment.html" />
    <id>tag:sysmonblog.co.uk,2009://1.41</id>

    <published>2009-06-23T23:27:33Z</published>
    <updated>2009-06-23T23:36:53Z</updated>

    <summary>A fabulous article about the Guardian&#8217;s MP expenses crowd sourcing experiment Fabulous in so many ways, not least that the whole is greater than the sum of it&#8217;s parts: mp expenses guardian (not-for-profit org = win!) open source web frameworks...</summary>
    <author>
        <name>mint</name>
        <uri>http://bleurgh.minty.org/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>A <a href="http://www.niemanlab.org/2009/06/four-crowdsourcing-lessons-from-the-guardians-spectacular-expenses-scandal-experiment/
">fabulous article about the Guardian&#8217;s MP expenses crowd sourcing experiment</a></p>

<p>Fabulous in so many ways, not least that the whole is greater than the sum of it&#8217;s parts:</p>

<ul>
<li>mp expenses</li>
<li>guardian (not-for-profit org = win!)</li>
<li>open source</li>
<li>web frameworks (django, php, ruby on rails, catalyst)</li>
<li>rapid development</li>
<li>crowd sourcing</li>
<li>amazon ec2 </li>
</ul>

<p>On that last point: entire server/hardware cost: £50 (using Amazon ec2) vs &#8220;The Guardian has lead time of several weeks to get new hardware&#8221;.</p>

<p>And something not explicitly mentioned - <a href="http://www.google.com/search?q=simon+willison">really good developers</a> are <i>really</i> worth it.  Not just in pay, but in listening to, supporting &amp; giving them a brief, then getting the hell out of the way and letting the sparks fly.</p>

<p>I confess a (very personal) weak spot for the application of IT in media environments.  It&#8217;s fabulous.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Apple Airport Extreme Syslog to a Linux / Debian / Ubuntu box</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/06/apple-airport-extreme-syslog-to-a-debian-ubuntu-box.html" />
    <id>tag:sysmonblog.co.uk,2009://1.35</id>

    <published>2009-06-16T11:29:16Z</published>
    <updated>2009-07-11T14:29:21Z</updated>

    <summary>This ought to work for Airport Express devices too, although I&#8217;ve not tested it. Ditto it should be similar on a BSD like machine. On your debian / ubuntu box If you have a firewall / iptables setup, enable UDP...</summary>
    <author>
        <name>snork</name>
        <uri>http://sysmonblog.co.uk</uri>
    </author>
    
        <category term="howto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="monitor" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="network" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="sysadmin" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apple" label="apple" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="howto" label="howto" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="network" label="network" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sysadmin" label="sysadmin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="syslog" label="syslog" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>This ought to work for Airport Express devices too, although I&#8217;ve not tested it.  Ditto it should be similar on a BSD like machine.</p>

<h1>On your debian / ubuntu box</h1>

<ul>
<li>If you have a firewall / iptables setup, enable UDP port 514 from your local network (or at least the IP of the Airport)</li>
<li><p>Add the following line to /etc/syslog.conf</p>

<p>local0.*  /var/log/AirPort.log</p></li>
<li><p>To prevent the Airport messages also appearing in /var/log/messages, find the stanza in /etc/syslog.conf that controls that file and add</p>

<p>!local0.*;\</p></li>
<li><p>Restart your syslog deamon</p>

<p>sudo /etc/init.d/sysklogd restart</p></li>
</ul>

<h1>Access the Airport via your Airport Utility</h1>

<ul>
<li>Advanced tab</li>
<li>Syslog Destination Address is the IP or hostname of the Debian / Ubuntu linux box that you want to contain the logs.  Start with the IP address to get it working, then flip to a hostname if you prefer.</li>
</ul>

<p>See also <a href="http://support.apple.com/kb/TA21492">AirPort Extreme: Remotely logging base station activity</a></p>
]]>
        

    </content>
</entry>

<entry>
    <title>Mutt, Exim4, Debian, Unbuntu and BCC. FAIL [fix included].</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/04/mutt-exim4-debian-unbuntu-and-bcc-fail-fix-included.html" />
    <id>tag:sysmonblog.co.uk,2009://1.28</id>

    <published>2009-04-28T19:11:00Z</published>
    <updated>2009-07-11T14:30:07Z</updated>

    <summary>Take a default Ubuntu/Debian install using the Mutt mail client (MUA) then switch to exim4. You get the most monumental FAIL - your bcc addresses will be included in the message to everyone else. Dangerous and embarrassing! Happily there is...</summary>
    <author>
        <name>snork</name>
        <uri>http://sysmonblog.co.uk</uri>
    </author>
    
        <category term="debian" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="exim" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="howto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="install" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="mutt" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="sysadmin" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ubuntu" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bcc" label="bcc" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="debian" label="debian" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="email" label="email" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="exim" label="exim" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="exim4" label="exim4" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mutt" label="mutt" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ubuntu" label="ubuntu" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>Take a default <a href="http://www.ubuntu.com/">Ubuntu</a>/<a href="http://www.debian.org/">Debian</a> install using the <a href="http://www.mutt.org/">Mutt mail client (MUA)</a> then switch to <a href="http://www.exim.org/">exim4</a>.  </p>

<p>You get the most monumental <a href="http://failblog.org/">FAIL</a> - your <a href="http://en.wikipedia.org/wiki/Blind_Carbon_Copy">bcc</a> addresses will be <em>included</em> in the message to everyone else.  Dangerous <em>and</em> embarrassing!</p>

<p>Happily there is a fix, but it seems insane that you should even need it.  Read on for details.</p>
]]>
        <![CDATA[<h1>Goal</h1>

<ul>
<li>The bcc header saved in Mutt&#8217;s Sent folder</li>
<li>but removed from emails that are actually sent.</li>
</ul>

<h1>Background</h1>

<p>Mutt <a href="http://www.mutt.org/doc/manual/manual-6.html#write_bcc">by default doesn&#8217;t remove bcc: headers</a>.  It will remove them if you set</p>

<pre><code>write_bcc=no
</code></pre>

<p>but then mutt also removes the bcc header from the copy saved in your Sent folder.  </p>

<p>When you later want to check who you sent that message to, anyone bcc&#8217;d will be lost from your historical archive.</p>

<p>exim <a href="http://exim.org/exim-html-current/doc/html/spec_html/ch44.html#SECID222">by default doesn&#8217;t remove bcc: headers either</a>.  It will if it&#8217;s called with the -t switch.</p>

<p>You can do this in your muttrc:</p>

<pre><code>set sendmail="/usr/sbin/sendmail -oem -oi -t"
</code></pre>

<p>You can find your current setting from within mutt with:</p>

<pre><code>:set ?sendmail
</code></pre>

<p>However exim&#8217;s default behaviour is then to remove <em>any</em> addresses that are passed on the command line.</p>

<p>Guess what Mutt does? Passes <em>all</em> the addresses on the command line.  </p>

<p>So telling mutt to use -t with sendmail results in exim thinking you&#8217;re trying to send the message to precisely nobody.  No email sent.</p>

<p>Setting the following exim main configuration option:</p>

<pre><code>extract_addresses_remove_arguments = false
</code></pre>

<p>reverses exim&#8217;s behaviour in this regard and <a href="http://docs.exim.org/4.10/spec_13.html#IX786"><em>augments</em> the list of addresses rather than removing them</a>.</p>

<p>Happily it also appears to de-dupe rather than sending the same message twice to each address.  But dear me, this is fscked up.  Is mutt+exim really that odd a choice?</p>

<h1>Summary</h1>

<p>For Debian or Ubuntu, edit /etc/exim4/conf.d/main/01_local_bcc so that it contains:</p>

<pre><code>extract_addresses_remove_arguments = false
</code></pre>

<p>Then set its permissions</p>

<pre><code>sudo chown root:root /etc/exim4/conf.d/main/01_local_bcc
</code></pre>

<p>and restart exim</p>

<pre><code>sudo /etc/init.d/exim4 reload
</code></pre>

<p>Then, add the following line to your .muttrc and restart Mutt</p>

<pre><code>set sendmail="/usr/sbin/sendmail -oem -oi -t"
</code></pre>
]]>
    </content>
</entry>

<entry>
    <title>Comments are now working again</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/04/comments-are-now-working-again.html" />
    <id>tag:sysmonblog.co.uk,2009://1.27</id>

    <published>2009-04-21T14:53:31Z</published>
    <updated>2009-07-11T14:30:27Z</updated>

    <summary>It appears to me that the javascript shipped in the open source movable type for Ubuntu Intrepid (8.10) is broken. To be fair, it is listed as beta. Anyway, details and a fix follow &#8230;...</summary>
    <author>
        <name>snork</name>
        <uri>http://sysmonblog.co.uk</uri>
    </author>
    
    <category term="bug" label="bug" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="comments" label="comments" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="debian" label="debian" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="movabletype" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sysadmin" label="sysadmin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ubuntu" label="ubuntu" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>It appears to me that the javascript shipped in the open source movable type for Ubuntu Intrepid (8.10) is broken.  To be fair, it is listed as beta.  Anyway, details and a fix follow &#8230;</p>
]]>
        <![CDATA[<p>It contains code like this:</p>

<pre><code>if (u.is_authenticated) {
    u.is_anonymous = false;
} else {
    u.is_anonymous = true;
}
</code></pre>

<p>The problem appears to be that the <code>u</code>(ser) object stores boolean 0/1 values as strings (with the character &#8220;0&#8221; or &#8220;1&#8221;), and a string of &#8220;0&#8221; evaluates to true (at least on the currently stable releases Firefox 3.0.8, Safari 4 - 5528.16 and Opera 9.63 on a Mac).</p>

<p>Try it yourself:</p>

<pre><code>&lt;script type=text/javascript&gt;
if ("0") { alert('true!'); }
&lt;/script&gt;
</code></pre>

<p>If you want to confirm this in the MovableType code, find the web root of your blog (/var/www/&#8230; in Ubuntu), then find your mt.js</p>

<pre><code>find . -name mt.js -print
</code></pre>

<p>edit it, find the <code>function mtBakeUserCookie(u)</code> and add these lines just <i>before</i> the <code>return str</code> at the end:</p>

<pre><code>alert('is_authenticated set to ' + u.is_authenticated);
if (u.is_authenticated) { alert('and it is true'); }
</code></pre>

<p>clear all your cookies, visit a post on your blog and click the &#8220;sign in&#8221; link to post a comment (assuming you have comments enabled).  It should trigger the alert.  <code>if (u.is_authenticated)</code> will evaluate to true.</p>

<p>Republish your blog via your web admin UI and it&#8217;ll republish mt.js which will undo your edits.</p>

<p>(If you want the change to be permanent, then via the web admin UI: Select your blog via the little triangle top left, then Design menu -> Templates.  The top section &#8220;Index Templates&#8221;, contains a row for &#8220;JavaScript, mt.js, Static&#8221;.  Click on the &#8220;JavaScript&#8221; link to edit.  These changes are permenant and I don&#8217;t see any revision control, so be careful &#8230; aka, take a backup before you start.)</p>

<p>Happily this bug appears to be fixed in <a href="https://wiki.ubuntu.com/JauntyJackalope">Ubuntu Jaunty 9.04</a> (it looks like it stores booleans as boolean/integers, not as strings &#8230; <code>if (0)</code> does what you expect where <code>if ("0")</code> does not), which is due for release <a href="https://wiki.ubuntu.com/JauntyReleaseSchedule">23rd April 2009</a>.  And it looks like the &#8220;beta&#8221; tag has been removed too.  Win!</p>

<p>If you particularly need to upgrade before then (or without doing a full system upgrade) then we can upgrade just the movabletype packages to those in Jaunty.  This worked for me, but there are no guarantees - in general it isn&#8217;t clever to be using packages meant for Jaunty on a box running Intrepid!</p>

<p>I&#8217;d strongly encourage you to backup everything before you start (the database &amp; your web directories).</p>

<p>Edit your /etc/apt/sources.list adding a line for jaunty, eg:</p>

<ul>
<li>deb http://gb.archive.ubuntu.com/ubuntu jaunty main restricted universe multiverse</li>
</ul>

<p>then:</p>

<ul>
<li>sudo aptitude update</li>
<li>sudo aptitude install movabletype-opensource</li>
<li>sudo aptitude install movabletype-plugin-core</li>
</ul>

<p>now removed the jaunty line you just added from /etc/apt/sources.list and re-run</p>

<ul>
<li>sudo aptitude update</li>
</ul>

<p>After upgrading, be sure to login to the web admin ui, and go to:</p>

<ul>
<li>System Overview (top left, from the triangle below the MovableType logo)</li>
<li>Preferences</li>
<li>General</li>
</ul>

<p>and set the System Email address, else new registrations won&#8217;t get their email to confirm their account.</p>
]]>
    </content>
</entry>

<entry>
    <title>/etc/init.d/sysmonblog reload</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2009/02/etcinitdsysmonblog-reload.html" />
    <id>tag:sysmonblog.co.uk,2009://1.26</id>

    <published>2009-02-21T13:19:49Z</published>
    <updated>2009-07-11T14:30:45Z</updated>

    <summary>Back after a short relapse and a move to a new server. A few links to stuff that&#8217;s interested us of late: Secure password management using CPM. I&#8217;ve used ccrypt in the past along with a liberal sprinkle of grep...</summary>
    <author>
        <name>snork</name>
        <uri>http://sysmonblog.co.uk</uri>
    </author>
    
        <category term="sysadmin" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="tools" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dns" label="dns" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gmail" label="gmail" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="google" label="google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="links" label="links" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="passwords" label="passwords" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>Back after a short relapse and a move to a new server.</p>

<p>A few links to stuff that&#8217;s interested us of late:</p>

<ul>
<li><a href="http://blog.gnist.org/article.php?story=Console-Password-Management">Secure password management using CPM</a>.  I&#8217;ve used <a href="http://ccrypt.sourceforge.net/">ccrypt</a> in the past along with a liberal sprinkle of grep and some wrappers in bash.</li>
<li>Does the gmail train ever stop?  <a href="http://googlesystem.blogspot.com/2009/01/offline-gmail.html">Offline Gmail</a> (along with some interesting <a href="http://www.theregister.co.uk/2009/02/18/google_gears_hack_attack/">hax0r vectors</a>) and a hint that they might be trying <a href="http://googlesystem.blogspot.com/2009/02/gmail-tests-pgp-signature-verification.html">PGP in Gmail</a>.  How nice would it be if my mum could get PGP email sigs without having to worry about all the nerdy details?</li>
<li>One of <a href="">Google Chrome&#8217;s</a> natty features is <a href="http://blog.chromium.org/2008/09/dns-prefetching-or-pre-resolving.html">DNS Prefetching</a> and now, if you don&#8217;t mind having to login first, you can get a <a href="https://addons.mozilla.org/en-US/firefox/addon/8923">DNS prefetch extension for firefox</a> too.  We&#8217;ve been getting good mileage out of <a href="http://www.opendns.com/">OpenDNS</a> too of recent.  It whips the ass of our (otherwise, pretty savy) isps offering.  Our only niggle is that <a href="http://blog.opendns.com/2007/05/22/google-turns-the-page">OpenDNS proxy google search pages</a> which is vexing.  That said, register a free account and you can <a href="https://www.opendns.com/start/best_practices/#content_filtering">customise the DNS settings for your ip address</a> and, I believe, disable the google proxying.</li>
<li>The consistently enjoyable High Scalability blog has a post about <a href="http://highscalability.com/product-facebooks-cassandra-massive-distributed-store">Facebook&#8217;s Cassandra</a>.  Yet another distributed data store solution, but on the surface, looks like it may be a decent contender.</li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>Network Graphics Hackery</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2008/12/network-graphics-hackery.html" />
    <id>tag:sysmonblog.co.uk,2008://1.25</id>

    <published>2008-12-05T23:31:33Z</published>
    <updated>2009-02-14T19:42:56Z</updated>

    <summary>Use Perl to create graphs from your network logs, then have your friends fire packets at you so they can &#8220;draw&#8221; on your log graphs.Nifty stuff, although it looks to be three years old!...</summary>
    <author>
        <name>snork</name>
        <uri>http://sysmonblog.co.uk</uri>
    </author>
    
        <category term="fun" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="graphing" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="network" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>Use <a href="http://blog.gnist.org/article.php?story=Paint-that-IDS-fireplot">Perl to create graphs from your network logs</a>, then have your friends fire packets at you so they can &#8220;draw&#8221; on your log graphs.Nifty stuff, although it looks to be three years old!</p>
]]>
        

    </content>
</entry>

<entry>
    <title>$2 you can buy 1000 human broken CAPTCHA’s</title>
    <link rel="alternate" type="text/html" href="http://sysmonblog.co.uk/2008/10/2-you-can-buy-1000-human-broken-captchas.html" />
    <id>tag:sysmonblog.co.uk,2008://1.24</id>

    <published>2008-10-15T21:11:16Z</published>
    <updated>2009-02-14T19:42:56Z</updated>

    <summary>Amazon&#8217;s Mechanical Turk is a neat idea, but I&#8217;ve often wondered why people don&#8217;t consider it slave labor the way they might a Nike sweatshop. (Nike settled.)And then High Scalability has a post about getting work done for free albeit...</summary>
    <author>
        <name>snork</name>
        <uri>http://sysmonblog.co.uk</uri>
    </author>
    
        <category term="design" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="fun" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://sysmonblog.co.uk/">
        <![CDATA[<p>Amazon&#8217;s <a href="https://www.mturk.com/mturk/welcome">Mechanical Turk</a> is a neat idea, but I&#8217;ve often wondered why people don&#8217;t consider it slave labor the way they might a <a href="http://news.bbc.co.uk/1/hi/world/americas/2971257.stm">Nike sweatshop</a>. (<a href="http://news.bbc.co.uk/1/hi/world/americas/3106930.stm">Nike settled.</a>)And then <a href="http://highscalability.com/scaling-spam-eradication-using-purposeful-games-die-spammer-die">High Scalability has a post about getting work done for free</a> albeit this time to fight spam.</p>
]]>
        

    </content>
</entry>

</feed>
