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

<channel>
	<title>David North</title>
	<atom:link href="http://www.dnorth.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dnorth.net</link>
	<description>The scribblings of an Oxford-based geek</description>
	<lastBuildDate>Sun, 06 May 2012 15:18:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Dear Internet, any ideas for a free(ish) room booking system?</title>
		<link>http://www.dnorth.net/2012/05/06/dear-internet-any-ideas-for-a-freeish-room-booking-system/</link>
		<comments>http://www.dnorth.net/2012/05/06/dear-internet-any-ideas-for-a-freeish-room-booking-system/#comments</comments>
		<pubDate>Sun, 06 May 2012 15:18:44 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=479</guid>
		<description><![CDATA[I&#8217;ve been tasked with finding a room booking/hiring system for St Columba&#8217;s. Requirements: Booking of different spaces by different users Ability to generate a report of billable hours outstanding for a given user Ability to send invoices and reminders to users and internal staff Integration with Google Calendar, as that&#8217;s how we publish hiring timetables [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been tasked with finding a room booking/hiring system for <a href="http://www.saintcolumbas.org/">St Columba&#8217;s</a>.</p>
<p>Requirements:</p>
<ul>
<li>Booking of different spaces by different users</li>
<li>Ability to generate a report of billable hours outstanding for a given user</li>
<li>Ability to send invoices and reminders to users and internal staff</li>
<li>Integration with Google Calendar, as that&#8217;s how we publish hiring timetables on the website at the moment</li>
</ul>
<p>At the moment, the most promising free option out there seems to be <a href="http://mrbs.sourceforge.net">MRBS</a>, but I&#8217;d have to add the Google Calendar and invoicing integration myself.</p>
<p>Does anyone have any bright ideas? <a href="/contact/">Let me know</a> if so.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/05/06/dear-internet-any-ideas-for-a-freeish-room-booking-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Progress!</title>
		<link>http://www.dnorth.net/2012/04/05/progress/</link>
		<comments>http://www.dnorth.net/2012/04/05/progress/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 18:47:32 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=474</guid>
		<description><![CDATA[Fully ten years after I painstakingly typed out track titles and artist names when ripping old LPs onto CDs, to populate an arcane feature called CD-Text, standard issue car stereos finally support it! Vauxhall do however lose a point for not making the display scroll if the text is too wide, but this gives rise [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Fully ten years after I painstakingly typed out track titles and artist names when ripping old LPs onto CDs, to populate an arcane feature called <a href="http://en.wikipedia.org/wiki/CD-Text">CD-Text</a>, standard issue car stereos finally support it!</p>
<p style="text-align: justify;"><a rel="attachment wp-att-475" href="http://www.dnorth.net/2012/04/05/progress/imag0141/"><img class="aligncenter size-full wp-image-475" title="CD Text" src="http://www.dnorth.net/wp-content/uploads/2012/04/IMAG0141.jpg" alt="CD Text being rendered by a car stereo" width="200" height="276" /></a>Vauxhall do however lose a point for not making the display scroll if the text is too wide, but this gives rise to a fun in-car game guessing the end of the track titles.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/04/05/progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The port 0 trick</title>
		<link>http://www.dnorth.net/2012/03/17/the-port-0-trick/</link>
		<comments>http://www.dnorth.net/2012/03/17/the-port-0-trick/#comments</comments>
		<pubDate>Sat, 17 Mar 2012 13:50:21 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=467</guid>
		<description><![CDATA[The port 0 trick came in handy when writing eximunit, and it&#8217;s something surprisingly few developers know about, so I thought it worth recounting here: The problem: you want to set up a web/mail/whatever server programmatically (e.g. as part of some tests). This server wants to bind to port 80/25/whatever. Your first problem is that [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">The port 0 trick came in handy when writing <a href="https://bitbucket.org/davidnorth/eximunit/">eximunit</a>, and it&#8217;s something surprisingly few developers know about, so I thought it worth recounting here:</p>
<p style="text-align: justify;">The problem: you want to set up a web/mail/whatever server programmatically (e.g. as part of some tests). This server wants to bind to port 80/25/whatever. Your first problem is that it can&#8217;t bind to these because you&#8217;re not running your tests as root (or as an administrator on Windows).</p>
<p style="text-align: justify;">The lazy approach at this point is to hard-code a port number over 1024, which you don&#8217;t have to be privileged to bind to. But this all falls to bits if you want to run the same test simultaneously on the same machine, or you need lots of different ports during the course of one test.</p>
<p style="text-align: justify;">At this point, you can reach for the port 0 trick: on both Windows and Linux, if you bind a socket to port 0, the kernel will assign it a free port number somewhere above 1024. Truly well-written software (e.g. <a href="http://jetty.codehaus.org">Jetty</a>) will not only let you configure it to bind to port 0, but will make it easy to parse its logs to obtain the actual port number it got assigned. Less helpful software (<a href="http://tomcat.apache.org/">Tomcat</a>) will let you configure it to bind to port 0, but print 0 in all its logs, never the actual number. And the majority of software just won&#8217;t let you put 0 as a port number in its configuration.</p>
<p style="text-align: justify;">At this point (subject to a slight race condition), you can grab some port numbers yourself and feed them to whatever you&#8217;re trying to configure:</p>
<pre>def findFreePorts(howMany=1):
    """Return a list of n free port numbers on localhost"""
    results = []
    sockets = []
    for x in range(howMany):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(('localhost', 0))
        # work out what the actual port number it's bound to is
        addr, port = s.getsockname()
        results.append(port)
        sockets.append(s)

    for s in sockets:
        s.close()

    return results</pre>
<p style="text-align: justify;">The above is written in Python, but it translates trivially to any programming language which knows what a socket is.</p>
<p style="text-align: justify;">You&#8217;ll note that the correct way to get, say, five free port numbers is to call the above method once with 5 as its argument. If you wrote a simple method which just returned one number, there would be nothing to stop it returning the same number each time you called it (the Linux kernel is rather more helpful, and will usually hand out a different number to each port 0 request, but I wouldn&#8217;t  rely on this).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/03/17/the-port-0-trick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Housekeeping</title>
		<link>http://www.dnorth.net/2012/03/17/housekeeping/</link>
		<comments>http://www.dnorth.net/2012/03/17/housekeeping/#comments</comments>
		<pubDate>Sat, 17 Mar 2012 11:55:01 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[SysAdmin]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=460</guid>
		<description><![CDATA[I&#8217;ve decided to give up on maintaining my own SVN server &#8211; Mercurial is my version control of choice these days, and for the scale of the open source stuff I do, there&#8217;s no good reason not to use Bitbucket. I&#8217;ve done my best to fix all the historical links pointing to svn.dnorth.net so they [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve decided to give up on maintaining my own SVN server &#8211; <a href="http://mercurial.selenic.com/">Mercurial</a> is my version control of choice these days, and for the scale of the open source stuff I do, there&#8217;s no good reason not to use <a href="http://bitbucket.org">Bitbucket</a>.</p>
<p>I&#8217;ve done my best to fix all the historical links pointing to svn.dnorth.net so they go to the files now on <a href="http://bitbucket.org/davidnorth/">my Bitbucket account</a>, but do get in touch if I&#8217;ve missed one.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/03/17/housekeeping/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing eximunit</title>
		<link>http://www.dnorth.net/2012/03/17/introducing-eximunit/</link>
		<comments>http://www.dnorth.net/2012/03/17/introducing-eximunit/#comments</comments>
		<pubDate>Sat, 17 Mar 2012 10:22:37 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[SysAdmin]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=447</guid>
		<description><![CDATA[For a few years now, I&#8217;ve run a hosting co-operative with a few friends. Although the cost savings versus all renting VMs individually are probably marginal at best these days, one of the nice things about it is the chance to run things like our incoming MX on one machine only, instead of all having [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">For a few years now, I&#8217;ve run a <a href="http://www.splice.org.uk/">hosting co-operative</a> with a few friends. Although the cost savings versus all renting VMs individually are probably marginal at best these days, one of the nice things about it is the chance to run things like our incoming MX on one machine only, instead of all having to run our own anti-spam and other measures. The incoming mail is handled by <a href="http://www.exim.org/">Exim</a>, and each user of our system can add domains for which mail is processed. They get to toggle SMTP-time rejection of spam and viruses, and specify the final destination machine for incoming mail to their domain.</p>
<p style="text-align: justify;">This has all been working well for over  two years, but occasionally something has to change: a few months ago, we got rid of <a href="http://en.wikipedia.org/wiki/Callback_verification">sender verify callouts</a>, now widely considered abusive by SMTP server admins, and more recently we added support for tagging messages with headers to say if they passed or failed <a href="http://www.dkim.org/">DKIM</a> verification. And every time I make such a change, I worry that I might have inadvertently broken something. <em>This server handles mail for 30 domains and 8 people, some of who rely on it to run businesses! Panic!</em></p>
<p style="text-align: justify;">I usually end up reassuring myself by doing some ad-hoc testing by hand after reconfiguring the server. At the most basic level, whatever your SMTP server is, you can use <a href="http://nc110.sourceforge.net/">netcat</a> to have a conversation with it on port 25:</p>
<pre style="text-align: justify;">d@s:~$ nc localhost 25
220 mailserver.splice.org.uk ESMTP Exim 4.71 Sat, 17 Mar 2012 09:51:20 +0000
HELO localhost
250 mailserver.splice.org.uk Hello localhost [127.0.0.1]
MAIL FROM: &lt;&gt;
250 OK
RCPT TO: someaddress@dnorth.net
550-Callout verification failed:
550 550 Unrouteable address
QUIT
221 mailserver.splice.org.uk closing connection</pre>
<p style="text-align: justify;">And there, I&#8217;ve just convinced myself that one of our features is still working: the mailserver should call forward to the final destination for mail to @dnorth.net addresses to check the local part (&#8216;someaddress&#8217; in this case) is valid, and reject the message up-front if it&#8217;s not.</p>
<p style="text-align: justify;">Exim also has a load of other toys you can take advantage of: say I want to check how mail to webmaster@dnorth.net is routed:</p>
<pre>d@s:~$ exim4 -bt webmaster@dnorth.net
R: hubbed_hosts for dnorth.net
webmaster@dnorth.net
 router = hubbed_hosts, transport = remote_smtp
 host mx-internal.dnorth.net [192.0.2.100]</pre>
<p>(IP addresses changed for example purposes, obviously)</p>
<p>And finally, there&#8217;s debug mode: you can run</p>
<pre>exim4 -bhc &lt;ip address&gt;</pre>
<p style="text-align: justify;">to run a complete &#8216;fake&#8217; SMTP session as though you were connecting from the given IP address. You can send messages, but they won&#8217;t actually go through, and exim prints a lot of debug output to give you a clue as to its inner workings as it decides how to route the message.</p>
<p style="text-align: justify;">This is all very well, but a quick brainstorming session gives a list of over 30 things I might want to check about my mailserver:</p>
<ul>
<li>Basic check that mail is accepted to our domains</li>
<li>Only existent addresses on our domains should have mail accepted</li>
<li>Domains with SMTP-time spam rejection on should have spam rejected</li>
<li>Same for viruses</li>
<li>Same for greylisting</li>
<li>&#8230;</li>
</ul>
<p style="text-align: justify;">Testing all these by hand isn&#8217;t going to fly, so what tools can we find for automating it? A bit of Googling turns up <a href="http://www.debian-administration.org/articles/633">swaks</a>, which looks quite handy, but suffers from two drawbacks for me: first, it&#8217;s a bit low-level, and a collection of scripts calling it will be a bit difficult to read and maintain for testing all 30 of my assertions. Second, it really sends the e-mails in the success case, and I don&#8217;t want my users to get test messages or have to set up aliases for receiving and discarding them. swaks will definitely become my tool of choice for ad-hoc testing in future, but meanwhile&#8230;</p>
<p style="text-align: justify;">The other promising Google result is <a href="http://kobesearch.cpan.org/htdocs/Test-MTA-Exim4/Test/MTA/Exim4.html">Test::MTA::Exim4</a>, which is a Perl wrapper for testing an exim config file. However, a few problems: (1) it&#8217;s Perl, and I Don&#8217;t Do Perl. (2), it&#8217;s limited to testing the routing of addresses, so it&#8217;s not going to cut it for checking spam rejection etc.</p>
<p style="text-align: justify;">Having at least pretended not to be suffering from <a href="http://en.wikipedia.org/wiki/Not_invented_here">NIH syndrome</a>, let&#8217;s spec out a fantasy system for doing what I want: I would like to be able to write some nice high-level tests in my favourite language, Python, which look a bit like this</p>
<pre>class HubbedDomainTests(EximTestCase):
    """
    Tests for domains our server acts as the 'proxy MX' for, doing
    scanning etc before forwarding the mail to the destination machine
    """

    def testProxiedMailAccepted(self):
        """Proxied mail should be accepted"""
        session = self.newSession()
        session.mailFrom('dtnorthie@gmail.com').rcptTo('webmaster@dnorth.net').randomData()

    def testLocalPartsVerifiedWithDestinationMachine(self):
        """Local parts should be verified with the destination machine"""
        session = self.newSession()
        session.mailFrom('dtnorthie@gmail.com').assertRcptToRejected('doesnotexist@dnorth.net')</pre>
<p style="text-align: justify;">I could then run these in the usual manner for Python unit tests, and lastly, I want them backed by an exim4 -bhc session so that they&#8217;re as realistic as possible without actually sending messages.</p>
<p style="text-align: justify;">This post is long enough already, so I&#8217;ll cut to the chase and say that I&#8217;ve made a start on writing it, and you can find out more at <a href="https://bitbucket.org/davidnorth/eximunit/">Bitbucket</a>. In a follow-up post, I&#8217;ll talk about how it was done.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/03/17/introducing-eximunit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SFTP/SCP without shell access on Debian</title>
		<link>http://www.dnorth.net/2012/02/27/sftpscp-without-shell-access-on-debian/</link>
		<comments>http://www.dnorth.net/2012/02/27/sftpscp-without-shell-access-on-debian/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 22:46:48 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[SysAdmin]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=445</guid>
		<description><![CDATA[You know how it is: you&#8217;re hosting some creaky mass of PHP and SSIs on your box for historical/hysterical reasons, the site requires some kind of FTP access for its admin to edit it, and you&#8217;d rather not give them an SSH login with which to do arbitrary stuff on your machine. For the last [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">You know how it is: you&#8217;re hosting some creaky mass of PHP and SSIs on your box for historical/hysterical reasons, the site requires some kind of FTP access for its admin to edit it, and you&#8217;d rather not give them an SSH login with which to do arbitrary stuff on your machine.</p>
<p style="text-align: justify;">For the last couple of years, I&#8217;ve used scponly (<a href="http://www.ubuntugeek.com/scponly-limited-shell-for-secure-file-transfers.html">this guide</a>) to achieve roughly the right effect, but having an essentally unmaintained chroot on my box slowly collecting security vulnerabilities felt wrong. Surely it must be possible to provide secure FTP to users without using SSH at all, and without having to maintain a chroot?</p>
<p style="text-align: justify;">Indeeed it is. <a href="http://www.proftpd.org/">ProFTPD</a> is a well-recognised FTP server and has a handy <a href="http://www.proftpd.org/docs/contrib/mod_sftp.html">SFTP module</a>, and both are conveniently packaged for Debian:</p>
<pre style="text-align: justify;"># apt-get install proftpd-basic
</pre>
<p style="text-align: justify;">The documentation is pretty good; it enabled me to arrive at the config below (suck it into the main one using an include for ease of maintenance) with just the one diversion to work out why my WinSCP wouldn&#8217;t talk to it (see the protocol switching line below). In WinSCP&#8217;s defence, I am using a pretty ancient version.</p>
<pre style="text-align: justify;"># Use SFTP with the same keys as SSH
# http://www.proftpd.org/docs/contrib/mod_sftp.html
SFTPEngine on
SFTPLog /var/log/proftpd/sftp.log

SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPHostKey /etc/ssh/ssh_host_dsa_key

# Enable compression
SFTPCompression delayed

# Workaround for WinSCP bug: http://winscp.net/forum/viewtopic.php?t=8121
SFTPClientMatch ".*WinSCP.*" sftpProtocolVersion 4

# Allow the same number of authentication attempts as OpenSSH.
#
# It is recommended that you explicitly configure MaxLoginAttempts
# for your SSH2/SFTP instance to be higher than the normal
# MaxLoginAttempts value for FTP, as there are more ways to authenticate
# using SSH2.
MaxLoginAttempts 6

# Only allow specifically whitelisted users (members of the ftp group)
# http://www.proftpd.org/docs/howto/Limit.html
&lt;Limit LOGIN&gt;
 AllowGroup ftp
 DenyAll
&lt;/Limit&gt;
</pre>
<p style="text-align: justify;">Just make sure your users are in the ftp group, but not able to log in through SSHD.</p>
<p style="text-align: justify;">Of course, with either solution you still have to worry about scripts and PHP executed by your user&#8217;s website being able to see the full filesystem of the machine, but mod_chroot and mod_suexec for Apache are both well documented and also Debian packaged.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/02/27/sftpscp-without-shell-access-on-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Port forwarding with xinetd</title>
		<link>http://www.dnorth.net/2012/02/27/port-forwarding-with-xinetd/</link>
		<comments>http://www.dnorth.net/2012/02/27/port-forwarding-with-xinetd/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 22:06:32 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[SysAdmin]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=441</guid>
		<description><![CDATA[Port forwarding with xinetd &#8211; this is really useful. I spent ages trying and failing to get an iptables-based forward from an IP address/port on machine 1 to an IP address/port on a remote machine2. I thought about writing some sick Python to forward incoming connections, but running it as root to bind the right [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://adamantsys.com/node/116">Port forwarding with xinetd</a> &#8211; this is really useful. I spent ages trying and failing to get an iptables-based forward from an IP address/port on machine 1 to an IP address/port on a remote machine2. I thought about writing some sick Python to forward incoming connections, but running it as root to bind the right port/IP or doing yet more iptables didn&#8217;t appeal &#8230; and then I remembered this is what xinetd is for.</p>
<p style="text-align: justify;">So on Debian, you can apt-get install xinetd and use the config above to forward arbitrary ports (there&#8217;s also a &#8216;bind&#8217; directive to specify the IP to bind to on the forwarding machine).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/02/27/port-forwarding-with-xinetd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>British Gas find a new way to annoy me&#8230;</title>
		<link>http://www.dnorth.net/2012/02/18/british-gas-find-a-new-way-to-annoy-me/</link>
		<comments>http://www.dnorth.net/2012/02/18/british-gas-find-a-new-way-to-annoy-me/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 23:16:04 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[SysAdmin]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=436</guid>
		<description><![CDATA[As if they weren&#8217;t an inefficient enough organisation to deal with in other respects, today a division of British Gas asked me to send them a remittance advice to: CardiffC&#38;MFinance@centrica.com Yes, that really is an ampersand in the local part. Sufficiently unusual that trying to send to it upset my default-configured installation of Exim: rejected [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">As if they weren&#8217;t an inefficient enough organisation to deal with in other respects, today a division of British Gas asked me to send them a remittance advice to:</p>
<p style="text-align: justify;">CardiffC&amp;MFinance@centrica.com</p>
<p style="text-align: justify;">Yes, that really is an ampersand in the local part. Sufficiently unusual that trying to send to it upset my default-configured installation of Exim:</p>
<pre>rejected RCPT &lt;CardiffC&amp;MFinance@centrica.com&gt;: restricted characters in address</pre>
<p style="text-align: justify;">You can tone down the (perfectly reasonable) check for these iffy characters by exempting centrica.com from it: edit /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt and edit the domains line of the <strong>second</strong> &#8216;restricted characters in address&#8217; ACL to read:</p>
<pre>domains = !+local_domains : !centrica.com</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/02/18/british-gas-find-a-new-way-to-annoy-me/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SitRep</title>
		<link>http://www.dnorth.net/2012/02/18/sitrep/</link>
		<comments>http://www.dnorth.net/2012/02/18/sitrep/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 16:51:44 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=432</guid>
		<description><![CDATA[Apologies for the absence of updates here in 2012 to date. It&#8217;s been a frustrating series of false starts to the year for me, with a break-in at St Columba&#8217;s, followed closely by a cycling accident*, a nasty cold and then a stomach bug, leaving me pretty much out of the game until this week. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Apologies for the absence of updates here in 2012 to date. It&#8217;s been a frustrating series of false starts to the year for me, with a break-in at <a href="http://www.saintcolumbas.org/">St Columba&#8217;s</a>, followed closely by a cycling accident*, a nasty cold and then a stomach bug, leaving me pretty much out of the game until this week.</p>
<p style="text-align: justify;">Happily I think I&#8217;m now back to normal, and I have a few interesting things to write about, including some pretty graphs from the new church heating system, and some ideas for the <a href="http://www.raspberrypi.org/">Raspberry Pi</a> when I finally get my hands on one. Oh, and last weekend, I bought a car, so I&#8217;m back on four wheels after an eleven month absence.</p>
<p style="text-align: justify;">Watch this space!</p>
<p style="text-align: justify;">* Don&#8217;t drink and cycle, kids. And don&#8217;t waste any sympathy on me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2012/02/18/sitrep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Over-engineering and how it makes people&#8217;s lives worse</title>
		<link>http://www.dnorth.net/2011/12/27/over-engineering-and-how-it-makes-peoples-lives-worse/</link>
		<comments>http://www.dnorth.net/2011/12/27/over-engineering-and-how-it-makes-peoples-lives-worse/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 11:56:10 +0000</pubDate>
		<dc:creator>David North</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.dnorth.net/?p=422</guid>
		<description><![CDATA[There&#8217;s an acid test that we as engineers should always subject our creations to: do they make life better for the end user? &#8220;Better&#8221; is perhaps quite difficult to quantify, but you can always approach the problem from the opposite direction and see if you&#8217;ve made things worse. This is something British Gas&#8217;s man clearly [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">There&#8217;s an acid test that we as engineers should always subject our creations to: do they make life better for the end user? &#8220;Better&#8221; is perhaps quite difficult to quantify, but you can always approach the problem from the opposite direction and see if you&#8217;ve made things worse.</p>
<p style="text-align: justify;">This is something British Gas&#8217;s man clearly failed to do when fixing my grandparents&#8217; central heating recently. I don&#8217;t know the full details of the problem, but I do know that their thermostat was broken, so he installed a new one.</p>
<p style="text-align: justify;">Fair enough, but it turns out that the iron march of progress has changed a thermostat from a knob with some numbers on it to something &#8216;smart&#8217;:</p>
<p style="text-align: justify;">&nbsp;</p>
<p style="text-align: justify;">&nbsp;</p>
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_424" class="wp-caption aligncenter" style="width: 245px;">
<dt class="wp-caption-dt"><a rel="attachment wp-att-424" href="http://www.dnorth.net/2011/12/27/over-engineering-and-how-it-makes-peoples-lives-worse/before-2/"><img class="size-full wp-image-424" src="http://www.dnorth.net/wp-content/uploads/2011/12/before1.jpg" alt="Central heating thermostat, circa 1990" width="235" height="235" /></a></dt>
<dd class="wp-caption-dd">Before</dd>
</dl>
</div>
<p style="text-align: justify;">&nbsp;</p>
<p style="text-align: justify;">&nbsp;</p>
<div class="mceTemp mceIEcenter" style="text-align: justify;">
<dl id="attachment_425" class="wp-caption aligncenter" style="width: 284px;">
<dt class="wp-caption-dt"><a rel="attachment wp-att-425" href="http://www.dnorth.net/2011/12/27/over-engineering-and-how-it-makes-peoples-lives-worse/index/"><img class="size-full wp-image-425" src="http://www.dnorth.net/wp-content/uploads/2011/12/index.jpeg" alt="Wireless super-blingy modern thermostat, circa 2011" width="274" height="184" /></a></dt>
<dd class="wp-caption-dd">After</dd>
</dl>
</div>
<p style="text-align: justify;">&nbsp;</p>
<p style="text-align: justify;">And how does the new wireless thermostat make life worse for my nonagenarian grandparents? Let us count the ways:</p>
<ul style="text-align: justify;">
<li>Because it&#8217;s wireless, it has batteries in it which need replacing every so often. This is achieved by opening a flimsy plastic door on the bottom of the unit which is fiddly to access once it&#8217;s wall mounted, then scrabbling on the carpet as the batteries fall to earth. It also means the thermostat will mysteriously stop working once every n months until someone younger sorts it out for them, since there&#8217;s no way they&#8217;ll hear a low-battery beep or spot an indicator on the screen.</li>
<li>Since it&#8217;s superglued to the wall just inches away from the hot water tank it controls, the only advantage of wirelessness is to save the drilling of one hole and the running of a six-inch bit of cabling &#8211; and even these could presumably have been avoided by replacing the original thermostat instead of leaving it screwed to the wall but not doing anything.</li>
<li>Instead of reading the numbers round a knob, you see them on an LCD display which is not backlit and not very big, thus making it perfect for people with poor eyesight to see in a not-very-well-lit hallway.</li>
<li>Pressing the middle of it resets it to a pre-programmed &#8216;preset temperature&#8217; (&#8220;ideal for the poorly sighted&#8221;, the manual claims with no sense of irony) &#8211; an unnecessary recipe for confusion if you knock the middle by mistake</li>
<li>It doesn&#8217;t go &#8216;click&#8217; as it passes the current room temperature like an electromechanical thermostat would, so you have to read the screen instead</li>
<li>By default the display shows the current room temperature, meaning you can&#8217;t tell without adjusting the knob what temperature the thermostat is currently set at</li>
</ul>
<p style="text-align: justify;">Somewhat more subjectively, I think it&#8217;s more likely to malfunction than an electromechanical device with two moving parts, and presumably it has to fight for spectrum with all surrounding cordless phones, WiFi units and garage door openers &#8211; let&#8217;s hope the base station does something sensible in the face of losing contact with the unit.</p>
<p style="text-align: justify;">Well done, lads. Another triumph of engineering.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dnorth.net/2011/12/27/over-engineering-and-how-it-makes-peoples-lives-worse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

