<?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>mockyblog</title>
	<atom:link href="http://mocko.org.uk/b/feed/" rel="self" type="application/rss+xml" />
	<link>http://mocko.org.uk/b</link>
	<description>It&#039;s supposed to make sense?</description>
	<lastBuildDate>Fri, 09 Dec 2011 14:15:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>How I Nearly Got Arrested for Going on the Train This Morning</title>
		<link>http://mocko.org.uk/b/2011/12/09/how-i-nearly-got-arrested-for-going-on-the-train-this-morning/</link>
		<comments>http://mocko.org.uk/b/2011/12/09/how-i-nearly-got-arrested-for-going-on-the-train-this-morning/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 11:15:47 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[CrapCompanies]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[Brockley]]></category>
		<category><![CDATA[Charing Cross]]></category>
		<category><![CDATA[Southern]]></category>
		<category><![CDATA[Tfl]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=589</guid>
		<description><![CDATA[Yes, seriously. I get the train into Charing Cross from Brockley every day.  I tend to use an Oyster Card because, well, it&#8217;s convenient.  Except when it goes wrong and you have to deal with a bunch of people in &#8230; <a href="http://mocko.org.uk/b/2011/12/09/how-i-nearly-got-arrested-for-going-on-the-train-this-morning/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Yes, seriously.</p>
<p>I get the train into Charing Cross from Brockley every day.  I tend to use an Oyster Card because, well, it&#8217;s convenient.  Except when it goes wrong and you have to deal with a bunch of people in India to try and get a refund.</p>
<p>This morning the ticket barriers at Brockley were broken.  No way to swipe in with my oyster card.  In fact the barriers were in pieces and there was no way to use any kind of ticket!  I checked with the staff (evidently a lot of people were confused) and was told to go through anyway and that I&#8217;d be charged at Charing Cross.</p>
<p>So with some deep misgivings off I went.  09:17 Southern train to London Bridge then the SouthEastern service to Charing Cross.</p>
<p>When I arrived at Charing Cross the gate staff said they&#8217;d seen a few people from Brockley with this problem and &#8211; clearly disinterested &#8211; told me I&#8217;d have to pay the full fare for a single ticket.  That&#8217;s 40p more than the fare I&#8217;d have paid with Oyster.  I questioned this, pointing out that I&#8217;d tried to pay the correct Oyster fare and that no additional cost had been mentioned they refused to negotiate and repeatedly told me it was “just the regulations”, “I&#8217;d have to complain to Tfl for a refund in writing” and there was nothing they could do.  When I asked in return for the staff to give me a written explanation of why they were imposing the excess charge, they refused.</p>
<p>They further explained that the inflated fare was covered by the Oyster terms and conditions &#8211; but didn&#8217;t offer a copy or say whether those terms applied, given I had not been informed of the additional fare or been given the opportunity to decline it.  Can you be bound by a contract when no money has changed hands and nobody&#8217;s told you the price isn&#8217;t as originally advertised?</p>
<p>I suggested I use my Oyster card to pay the correct fare at that end of the journey but was told “the system isn&#8217;t setup for it”.  Then I suggested I simply pay the correct Oyster fare in cash and was told that &#8211; despite having remained polite and calm throughout &#8211; that I would be arrested if I tried to leave the station without paying for a full single ticket.</p>
<p>W. T. F.</p>
<p>Eventually I and another passenger with the same problem called the police over and they apologetically explained they really would have to arrest us if we wouldn&#8217;t pay the additional fare.</p>
<p>And that was that.  Basically imprisoned at Charing Cross or forced to pay a higher, unannounced fare.  I&#8217;d played nice, remained polite throughout and tried to follow the rules.  So much for that.</p>
<p>Whoever employs the staff at Charing Cross &#8211; let&#8217;s talk about this.  Overcharging passengers at the far end of the journey when it&#8217;s your own equipment at fault and threatening them with arrest if they don&#8217;t submit to the mafia-style shakedown is truly beyond the pale.  Furthermore, telling passengers at Brockley they could pay at the other end but neglecting to mention the price would be higher &#8211; isn&#8217;t that simply fraud?</p>
<p>I know it&#8217;s only 40p but seriously, Tfl, SouthEastern, what the HELL are you playing at?  What kind of a service threatens its customers with a criminal record when all they try to do is pay the advertised price for something?</p>
<p><img src="http://mock.icons.ljtoys.org.uk/mi/5284_custom.gif" alt="" border="0" /></p>
<p><em>NB: SouthEastern/Tfl/whoever &#8211; so as to avoid the popular &#8220;privacy forbids us from discussing individual cases&#8221; excuse &#8211; you have my full permission to publicly discuss what happened this morning.  Please, I really want to hear your version.</em></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/12/09/how-i-nearly-got-arrested-for-going-on-the-train-this-morning/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Silencing the Flood of Recruiter Emails with a Domain List</title>
		<link>http://mocko.org.uk/b/2011/09/08/silencing-the-flood-of-recruiter-emails-with-a-domain-list/</link>
		<comments>http://mocko.org.uk/b/2011/09/08/silencing-the-flood-of-recruiter-emails-with-a-domain-list/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 19:51:50 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[jobs]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[careersuicide]]></category>
		<category><![CDATA[filtering]]></category>
		<category><![CDATA[Freelancing]]></category>
		<category><![CDATA[recruiters]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=517</guid>
		<description><![CDATA[I get a torrent of email from IT recruiters.  There&#8217;s the occasional gem; every once in a while someone really does want to get interesting work done on scalable web-facing UNIX platforms. But the rest is utter dross. &#8220;Your CV &#8230; <a href="http://mocko.org.uk/b/2011/09/08/silencing-the-flood-of-recruiter-emails-with-a-domain-list/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I get a torrent of email from IT recruiters.  There&#8217;s the occasional gem; every once in a while someone really does want to get interesting work done on scalable web-facing UNIX platforms.</p>
<p>But the rest is utter dross.</p>
<blockquote><p>&#8220;Your CV came up in our search&#8221; they bleat, &#8220;we have an excellent opportunity for you to earn £15k+bens per year as a Windows support monkey in the bowels of some godforsaken corporate in Wolverhampton&#8221;.  &#8220;See what a great favour we&#8217;re doing you&#8221;.</p></blockquote>
<p>&nbsp;</p>
<p>It isn&#8217;t a favour.   They aren&#8217;t your mum and they don&#8217;t have your best interests at heart.  Some can do a passable impression of competent, empathic human beings (from experience I&#8217;d say about 10%) but most are illiterate swaggering liars who don&#8217;t have a clue what all those acronyms on your CV mean.  They want your commission and they&#8217;ll say anything to get the meat (that&#8217;s you) into the grinder.  They look and quack like estate agents but cost ten times the price and have even less regulation.</p>
<p>So this torrent of adverts for jobs I won&#8217;t like.  Most are from lazy agents who&#8217;ve done a simple keyword search (I suspect using copies of my CV they&#8217;ve illegally scraped from job sites and dumped into their own database) and mass-mailed a tragically effusive &#8220;this job is perfect for you!!!!&#8221; to any poor soul who came up.  Most turn up just after 6pm because agents believe you just <em>love</em> to get job adverts after a hard day&#8217;s work.  And god, their stunted attempts to make the jobs sound cool&#8230; there shoud be a special hell for anyone who actually refers to IT experts as ninjas and gurus or tries to link the job to some irrelevant current affair.</p>
<p>Any agents reading this: don&#8217;t try to make your emails fun, it instantly marks you out as desperate.  And a tosser.</p>
<p>For a while (for sport?) I&#8217;d occasionally reply to the least appropriate.  &#8220;Yes, I&#8217;d love to be a COBOL developer for a major retail bank&#8230;&#8221; to see how far along in the process I&#8217;d get.  But in the end the stream of invitations to apply for shitty jobs got me down.  Asking them to stop met with variable results; some people just can&#8217;t believe you don&#8217;t want to hear about their &#8216;opportunities&#8217;.</p>
<p>&#8220;Why not use my nerd-fu powers to filter them&#8221; I thought.  Screw it, how many could there be?</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>So the List&#8230;</h2>
<p>84 so far and that&#8217;s just London.  They must breed like rabbits.</p>
<p>This is a non-exhaustive list of the domains used by IT agents from my email in the last couple of years.  It&#8217;s UK-centric but I&#8217;ll add suggestions from other countries.  Global namespaces FTW.</p>
<p>Download: <a href="http://mocko.org.uk/b/wp-content/uploads/2011/09/recruiter_domains_2011-11-31.txt">Domains recruiters mail you from</a> (updated 2011-10-31)</p>
<p>&nbsp;</p>
<h2></h2>
<p>&nbsp;</p>
<h2>How to Use it?</h2>
<p>Turn the list into a set of filtering rules in your favourite mail client.  For me it&#8217;s a joy incorporated into a sieve ruleset on my server.  As for the all-important gmail &#8211; I can&#8217;t find any way to import a bunch of pre-made rules.  Squeak if you have an idea.</p>
<p>Unless you plan to be in your current job forever I wouldn&#8217;t suggest routing them all to /dev/null.  Tag them and file into a &#8220;jobs&#8221; folder to plough through whenever you&#8217;re on a long journey.</p>
<p>Here&#8217;s a trivial python script to compile that list into a sieve rule:</p>
<pre>#!/usr/bin/env python
f = open('recruiter_domains.txt')
doms = filter( lambda d: len(d)&gt;2, f.readlines() )
doms = map( lambda d: '"*@' + d.strip() + '"', doms)
print "# " + '-'*70 + "\n#   Filter messages from recruitment consultants"
print "#   needs require \"fileinto\"; and require \"regex\"; at top of script\n# " + '-'*70 + "\n"
print "if address :matches \"from\" [\n  " + ', '.join(doms) + "\n  ] {\n    fileinto \"recruiters\";\n}\n\n"</pre>
<p>See that recruiters?  YES I CAN DO &#8220;SCRIPTING&#8221;.  Do you know what a scripting are?  That&#8217;s one right there ^^</p>
<p>Disclaimer: I&#8217;m not responsible for, uh, anything.  Ever.  If this list of domains burns your house down it ain&#8217;t my fault.</p>
<p>What if you really do want to block them from your own domain?  If you run Postfix try this:</p>
<pre>sed 's/^\(.*\)/\1     REJECT  Agencies not welcome at this domain/' recruiter_domains.txt &gt; /etc/postfix/recruiters
echo "smtpd_sender_restrictions = hash:/etc/postfix/recruiters" &gt;&gt; /etc/postfix/main.cf
postmap hash:/etc/postfix/recruiters
/etc/init.d/postfix reload</pre>
<p>Sorted; any email from a domain in that list will bounce.  But think about this first &#8211; you might be missing out on some great &#8220;opportunities&#8221;.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Finally&#8230;</h2>
<p>I don&#8217;t hate all recruiters &#8211; just the lazy, incompetent, dishonest ones.  If you&#8217;re one of the few who&#8217;ve made a career out of matching up talented engineers with jobs they&#8217;ll love, go in peace.</p>
<p>The rest of you&#8230; it&#8217;s better left unsaid.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/09/08/silencing-the-flood-of-recruiter-emails-with-a-domain-list/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rule #1 of Marketing: Don&#8217;t Subscribe Me to Your Crap and Call it a Service</title>
		<link>http://mocko.org.uk/b/2011/06/28/rule-1-of-marketing-dont-subscribe-me-to-your-crap-and-call-it-a-service/</link>
		<comments>http://mocko.org.uk/b/2011/06/28/rule-1-of-marketing-dont-subscribe-me-to-your-crap-and-call-it-a-service/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 13:32:31 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[CrapCompanies]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[orange]]></category>
		<category><![CDATA[orange uk]]></category>
		<category><![CDATA[sms]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=504</guid>
		<description><![CDATA[There are two kinds of people who carry multiple phones &#8211; drug dealers and IT consultants.  I&#8217;m the latter.  My second phone is a special one; tiny enough to not get in the way and carried solely so that the &#8230; <a href="http://mocko.org.uk/b/2011/06/28/rule-1-of-marketing-dont-subscribe-me-to-your-crap-and-call-it-a-service/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>There are two kinds of people who carry multiple phones &#8211; drug dealers and IT consultants.   I&#8217;m the latter.  My second phone is a special one; tiny enough to not get in the way and carried solely so that the computers I run can text me when they&#8217;re in pain.   If I&#8217;m doing my job well this almost never happens but when it does the phone goes off like an air raid with PMT.</p>
<p>Yesterday afternoon it went off.   &#8220;Oh no!&#8221; I thought, &#8220;My babies are sick!&#8221;</p>
<p>But no&#8230;</p>
<blockquote><p>Hi from Orange.  You&#8217;ve been chosen to try our free new messaging service Bright Stuff!  That&#8217;s news, competitions and exclusive offers from brands we think you&#8217;ll love, sent direct to your phone.  For more info go to brightstuff.orange.co.uk (free to access in the UK only) or to opt out send STOP to 200000</p></blockquote>
<p>This service sounds awesome.   You say you&#8217;ve chosen me to receive news, competitions and exclusive offers from brands you think I&#8217;ll love?   I feel honoured.   How was I chosen, a magical Willy Wonka ticket?  Have you been carefully watching my texts (occasional messages like &#8220;client-web-01 is unavailable&#8221; and &#8220;disk full, clean out yo&#8217; shi&#8221;) and deduced that I&#8217;d just LOVE a stream of news, competitions and exclusive offers from brands you think I&#8217;ll love?</p>
<p>Doubt it.</p>
<p>&nbsp;</p>
<h2>How Does This Happen?</h2>
<p>What is Orange Bright Stuff?  A quick Google reveals <a href="http://help.orange.co.uk/orangeuk/support/personal/546477">this</a>&#8230;</p>
<blockquote><p>&#8220;At the moment we are inviting users to be part Bright stuff. For more info on the service visit <a href="http://brightstuff.orange.co.uk/"> http://brightstuff.orange.co.uk</a>.&#8221;</p></blockquote>
<p>&nbsp;</p>
<p>No Orange, you aren&#8217;t inviting them.  Inviting means asking somebody if they&#8217;d like to take part.  You forcibly signed me up to it.</p>
<p>Who on earth thought this was a good idea?  I imagine the meeting went something like this&#8230;</p>
<blockquote><p>&#8220;Hey, Tarquil, we need to find a better way of monetizing those cheap-ass PAYG customers.  How can we screw more shareholder value out of the poorest section of our subscriber base?&#8221;</p>
<p>&#8220;I know Barry, let&#8217;s use them as a captive audience for advertising from other companies.  We&#8217;ll make a fortune.  But nobody really wants ads so how can we dress up a shit sandwich full of them to make it taste better?&#8221;</p>
<p>&#8220;Got it!   Let&#8217;s just send them to millions of subscribers who haven&#8217;t asked.  The ones who pay the least so it doesn&#8217;t matter if a few leave.  And we&#8217;ll throw in the odd bit of garnish so we can pretend we&#8217;re offering them a service.  We&#8217;ll send them news and competitions and adverts, all for free.   And if we send it to millions of subscribers by default you just know most will be too dumb or lazy to opt out!&#8221;</p>
<p>&#8220;Tarquil, that&#8217;s brilliant.   We can get paid to send ads to people and it makes the Orange News team look like they do something useful.  We&#8217;ve been trying to justify that news portal for years.   But if we can only compress celebrity gossip into 160 character texts and pump them down the lines mixed in with a torrent of shit we&#8217;ve got it made.&#8221;</p>
<p>&#8220;Barry, that&#8217;s a brilliant value proposition.  We&#8217;re both great.  Marketing is so great.  Let&#8217;s all go and buy Porsches!&#8221;</p></blockquote>
<p>&nbsp;</p>
<p>Tossers.   They&#8217;re figments of my imagination and already I&#8217;m seething.</p>
<p>&nbsp;</p>
<h2>So You Want to Opt Out?</h2>
<p>There&#8217;s more to the story.   I try to unsubscribe.   I reply to the message saying &#8220;STOP&#8221; (and have to change the number since  Orange used a different sender number so if you reply without changing it your &#8220;STOP&#8221; doesn&#8217;t count.  And back comes another message saying, roughly, &#8220;you&#8217;ve asked to opt out of Orange Bright Stuff.  are you really sure?  If you really don&#8217;t want to receive our torrent of crap text STOP to 200000 again.&#8221;</p>
<p>So I text &#8220;STOP&#8221; to 200000 once more (is this getting repetitive?).  The phone bleeps again.  Hurrah, are we done?  &#8220;You&#8217;ve now opted out of Bright Stuff and the service will stop in 24 hours time [why?  does it take 24 hours to update the "don't send pointless crap" field in your database?]   To opt out of other marketing messages from Orange call 450&#8243;</p>
<p>Note the <em>&#8220;other marketing messages&#8221;</em>.  They haven&#8217;t used the &#8216;M&#8217; word before, they know it turns us plebs off.</p>
<p>Wow.  Orange, you&#8217;re really determined to send me marketing.   Isn&#8217;t two STOP&#8217;s enough to convince you I don&#8217;t want it?  Or is this just a ploy to make opting out reeeeally hard so customers will stop trying and you can boast to advertisers about your massive reach?  And, er, what&#8217;s to stop you changing the name of the service and signing me up again?</p>
<p>I call 450, hit 2 and then 4 (hope this saves a few seconds of someone&#8217;s life) and am told I&#8217;ll have to pay 25p to be customer services representative.  Orange, WTF?  I have to pay 25p for service?   And finally I get to explain it all to a nice Indian-sounding lady who checks the &#8220;do not send this guy rubbish&#8221; box on Orange&#8217;s intranet.  She promised to refund the 25p but only after I&#8217;d asked.</p>
<p>Corporate marketers &#8211; here&#8217;s a quick, simple rule.  Your customers will NEVER thank you for signing them up to marketing crap.   Don&#8217;t act like some tinpot spammer, unless you have something good to tell your customers leave them the hell alone.  One-off mailshots about things they really care about (special offer, everything free today) might be okay but signing them up for a shitstream you&#8217;re probably making money out of?</p>
<p>Nice one Orange.   You&#8217;re sending a very clear message that says &#8220;we don&#8217;t give a damn about service, you don&#8217;t give us enough money so we&#8217;re going to make more out of you&#8221;.<br />
<img src="http://mock.icons.ljtoys.org.uk/mi/5278_custom.gif" border="0" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/06/28/rule-1-of-marketing-dont-subscribe-me-to-your-crap-and-call-it-a-service/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Fail of the Day: Federal Express Europe Inc.</title>
		<link>http://mocko.org.uk/b/2011/06/26/fail-of-the-day-federal-express-europe-inc/</link>
		<comments>http://mocko.org.uk/b/2011/06/26/fail-of-the-day-federal-express-europe-inc/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 14:53:10 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[CrapCompanies]]></category>
		<category><![CDATA[Letters]]></category>
		<category><![CDATA[Complaining]]></category>
		<category><![CDATA[FedEx]]></category>
		<category><![CDATA[FedExEurope]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=498</guid>
		<description><![CDATA[Latest rant: FedEx. A month ago I had a parcel shipped from the US.  A week after the parcel arrived came a letter from FedEx saying customs charges needed to be paid.  &#8220;Fair cop&#8221; I thought as I scanned the &#8230; <a href="http://mocko.org.uk/b/2011/06/26/fail-of-the-day-federal-express-europe-inc/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Latest rant: FedEx.</p>
<p>A month ago I had a parcel shipped from the US.  A week after the parcel arrived came a letter from FedEx saying customs charges needed to be paid.  &#8220;Fair cop&#8221; I thought as I scanned the invoice.  But wait, what&#8217;s on it?</p>
<ul>
<li>£10.84 for the customs charge</li>
<li>£10 &#8220;administration fee&#8221; from FedEx</li>
</ul>
<p>Errr, say what now?  Where did I ever agree to pay some unspecified &#8220;administration&#8221; charge?  And what work have FedEx done to justify £10?  Greedy f*ckers.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>The FedEx Website</h2>
<p>The invoice has a URL on it &#8211; which I assume is for online payment.  I go to the FedEx website and try to create an account.</p>
<p>Fail!</p>
<p style="text-align: left;"><a href="http://mocko.org.uk/b/wp-content/uploads/2011/06/fedex-broken.png"><img class="aligncenter size-full wp-image-499" style="border: 1px solid black;" title="fedex broken" src="http://mocko.org.uk/b/wp-content/uploads/2011/06/fedex-broken.png" alt="" width="648" height="112" /></a>&#8220;Oh well&#8221; I figure, &#8220;their website must be really busy on a Sunday night&#8221;.  I email FedEx about it and resolve to try again on Monday.</p>
<p style="text-align: left;">Fail again!</p>
<p style="text-align: center;"><a href="http://mocko.org.uk/b/wp-content/uploads/2011/06/fedex-broken.png"><img class="size-full wp-image-499" style="border: 1px solid black;" title="fedex broken" src="http://mocko.org.uk/b/wp-content/uploads/2011/06/fedex-broken.png" alt="" width="648" height="112" /></a></p>
<p>Nice one FedEx.  Greedy, <strong>incompetent</strong> f*ckers.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>The Post</h2>
<p>By the close of play Monday nobody&#8217;s replied to my email so I write them a letter.  Something along the lines of &#8220;what&#8217;s all this £10 administration charge about?&#8221;.  Since I don&#8217;t dispute the customs charge (well, except morally &#8211; why should one have to pay to import equipment that can&#8217;t possibly be made in one&#8217;s own country?) I include a cheque for it.</p>
<p>A few days later the cheque gets cashed.  Since the letter was wrapped around the cheque it&#8217;s certain that someone at FedEx has seen it.  From this I infer FedEx accept £10.84 is all they deserve.</p>
<p>But wait, what&#8217;s this?</p>
<p>On June 25th I get home to find an &#8220;overdue invoice&#8221; letter.  FedEx seem to have noted my payment of the customs charges (they&#8217;ve knocked £10.84 off the invoice amount) but assert the rest is still due.  No attempt to respond to my dispute, just a big scary &#8220;OVERDUE INVOICE&#8221;.</p>
<p>Nice way to look after people, FedEx.  This goes out tomorrow; I wonder if you&#8217;ll have the manners to respond?</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote>
<p style="text-align: left;">Monday 27th June</p>
<p>Dear Sir/Madam,</p>
<p>Earlier this month I received from FedEx an invoice (no. 5-431-32874) for customs charges applied to a parcel shipped from the US along with a “clearance administration charge” of £10.00.</p>
<p>Since the service I&#8217;ve received in this instance was  poor (broken website, no response to emailed communications) and the invoice contained no information on what “administration” FedEx have performed, I queried it.  On June 7th I sent a letter with a cheque for the £10.84 customs charge (which I do not dispute) together with a question about why you feel entitled to levy a £10 fee on top of the sum already paid to you to transport the parcel.</p>
<p>It is certain that FedEx received this letter since you cashed the cheque enclosed with it.</p>
<p>You have not deigned to reply to my original letter querying the £10 charge you&#8217;re trying to impose.  Instead you sent an overdue notice, acknowledging my payment of the customs charge but claiming £10 is still due.</p>
<p>So I&#8217;ll ask you again –</p>
<p>1. WHAT services have FedEx performed to justify a £10 “administration” charge?<br />
2. WHAT agreement have I made with FedEx to pay any charges you deem fit?<br />
3. WHY when I queried the original invoice have you twice ignored my communications, despite cashing the cheque included in the most recent?</p>
<p>As I said in my letter the level of customer service you&#8217;ve displayed in this instance is abysmal and it&#8217;s hardly reasonable to charge people for “administration” when you won&#8217;t even answer an email.  That you feel justified in sending me overdue notices while ignoring my query about dubious charges rather underlines the fact.  Is this the level of service all customers should expect from FedEx?</p>
<p>If FedEx want my custom in future I suggest you resolve the situation by abandoning your “administration” fee together with explaining why you&#8217;ve given such appalling service and some compensation for the growing amount of time I&#8217;ve had to waste chasing you over it.</p>
<p>Yours Faithfully,<br />
Mr A. Hewson</p></blockquote>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: left;">Judging by this (unexplained &#8220;administration&#8221; charge, broken website, refusal to communicate about a queried invoice) I&#8217;d suggest anyone thinking of having stuff shipped to the UK with FedEx think again.</p>
<p style="text-align: left;">&nbsp;<img src='http://mock.icons.ljtoys.org.uk/mi/5277_custom.gif' border=0/></p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/06/26/fail-of-the-day-federal-express-europe-inc/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>EDF Energy: How Not to do Online Billing</title>
		<link>http://mocko.org.uk/b/2011/02/06/edf-energy-how-not-to-do-online-billing/</link>
		<comments>http://mocko.org.uk/b/2011/02/06/edf-energy-how-not-to-do-online-billing/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 19:29:09 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[CrapCompanies]]></category>
		<category><![CDATA[Letters]]></category>
		<category><![CDATA[Broken websites]]></category>
		<category><![CDATA[EDF]]></category>
		<category><![CDATA[Kafkaesque disclaimers]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=451</guid>
		<description><![CDATA[Dear EDF Energy, I&#8217;ve had an email saying my bill is awaiting payment and suggesting I view it online.  This seems plausible; as a citizen of the developed world I use gas and electricity and I am indeed your customer. &#8230; <a href="http://mocko.org.uk/b/2011/02/06/edf-energy-how-not-to-do-online-billing/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dear EDF Energy,</p>
<p>I&#8217;ve had an email saying my bill is awaiting payment and suggesting I view it online.  This seems plausible; as a citizen of the developed world I use gas and electricity and I am indeed your customer.  It ended with the boilerplate text:</p>
<blockquote><p>&#8220;the internet is inherently insecure and EDF Energy plc cannot accept any liability for the integrity of this message or its attachments. No employee or agent of EDF Energy plc or any related company is authorised to conclude any binding agreement on behalf of EDF Energy plc or any related company by e-mail.&#8221;</p></blockquote>
<p>It&#8217;s a fascinating statement.  An unqualified disclaimer would seem to render the entire email paradoxical.  I pondered this for a while.  Are you authorized to conclude a binding agreement with me that you don&#8217;t accept liability for the email?  Do I actually have a gas bill or is this some elaborate Kafkaesque logic puzzle?  And if you are authorized to make a legally binding commitment to the bill existing, am I authorized to believe it?</p>
<p><span id="more-451"></span></p>
<p>Down this route lay madness.  I opted to accept the missive&#8217;s veracity and should a bill actually exist &#8211; god forbid &#8211; perhaps even pay it.</p>
<p>Clicking the link I was presented with the following, brilliant message:</p>
<blockquote><p>&#8220;If you are new to MyAccount, please click the link below and follow the simple instructions to sign up for MyAccount. If you were registered for MyAccount previously, you will simply need to register again so you can start using our new and improved online service. &#8220;</p></blockquote>
<p>I don&#8217;t know if I had a MyAccount before but since you&#8217;ve dropped everyone&#8217;s details and want us all to register again the point is moot.  I spent the next few minutes of my life filling in the form.  Even the field asking where I was born, though I am genuinely baffled about what my childhood provenance (Scunthorpe if it matters) has to do with the utility bill for a small flat in London.</p>
<p>Alas!  Your website does not like me.  It responds:</p>
<blockquote><p>&#8220;We are currently unable to process your request due to technical reasons. Please try again or you can contact us. Our residential customers can call us on 0800 096 9000 and business customers can call us on 0800 096 2255&#8243;.</p></blockquote>
<p>&#8230;so like a good customer I called 0800 096 9000.  Only to hear a message saying you&#8217;re closed.</p>
<p>Since your website doesn&#8217;t work and you accept no responsibility for things you may or may not have emailed me can we please go back to paper-based billing?  The old system where you concocted a wildly inaccurate estimate, printed it on paper in a legally binding fashion and posted it to my house so I&#8217;d ring you up with a less absurd reading and pay worked much better.<br />
<br/></p>
<p>Kind Regards,<br />
Alex Hewson.</p>
<p><br/><br/><br />
PS. Probably you won&#8217;t get to read any of this after &#8216;should a&#8217; in the fourth paragraph since the textbox on your &#8220;Contact us &#8211; Email&#8221; page (which isn&#8217;t actually an email, it&#8217;s a web form) truncates comments at the thousandth character.</p>
<p>PPS.  Since the Internet is an inherently insecure medium I accept no legal responsibility for this communication.</p>
<p>PPPS.  Also I may or may not disclaim responsibility for the previous disclaimer.</p>
<p style="text-align: center;">&#8212;</p>
<p>Addendum: The first postscript was wrong.  When I submitted it to the web form your site responded with this astounding error:</p>
<p style="text-align: center;"><a href="http://mocko.org.uk/b/wp-content/uploads/2011/02/EDF-failure.png"><img class="aligncenter size-full wp-image-453" style="border: 1px solid black;" title="EDF-failure" src="http://mocko.org.uk/b/wp-content/uploads/2011/02/EDF-failure.png" alt="" width="340" height="135" /></a></p>
<p>&#8230;so unless I print out my message and mail it &#8211; rather like one of those old-fashioned letters you&#8217;re trying to phase out &#8211; you&#8217;re unlikely to ever read any of this.</p>
<p>Yes EDF.  Your website is a truly epic failure.<br />
<img src="http://mock.icons.ljtoys.org.uk/mi/5266_custom.gif" border="0" alt="" width="1" height="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/02/06/edf-energy-how-not-to-do-online-billing/feed/</wfw:commentRss>
		<slash:comments>62</slash:comments>
		</item>
		<item>
		<title>HTTP KeepAlive Considered Harmful</title>
		<link>http://mocko.org.uk/b/2011/01/23/http-keepalive-considered-harmful/</link>
		<comments>http://mocko.org.uk/b/2011/01/23/http-keepalive-considered-harmful/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 19:24:07 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[KeepAlive]]></category>
		<category><![CDATA[Webservers]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=392</guid>
		<description><![CDATA[Isn&#8217;t that a wonderfully alarmist title?  A better one would be &#8220;HTTP KeepAlive harmful for modern high-traffic low-latency low-footprint websites&#8221;.  But then you&#8217;d have fallen asleep by now, wouldn&#8217;t you. This was written to expand on an idea I touched &#8230; <a href="http://mocko.org.uk/b/2011/01/23/http-keepalive-considered-harmful/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Isn&#8217;t that a wonderfully alarmist title?  A better one would be &#8220;HTTP KeepAlive harmful for modern high-traffic low-latency low-footprint websites&#8221;.  But then you&#8217;d have fallen asleep by now, wouldn&#8217;t you.</p>
<p>This was written to expand on an idea I touched on in the <a href="http://mocko.org.uk/b/2011/01/02/how-to-survive-a-slashdotting-on-a-small-apache-server/">last piece about webservers</a> &#8211; the idea that when a browser on a modern PC takes 250 milliseconds to fetch a web page, hanging around for a further <strong>thirty seconds</strong> just in case another request gets made is just plain selfish.</p>
<h2>What&#8217;s All This KeepAlive Nonsense?</h2>
<div id="attachment_433" class="wp-caption alignright" style="width: 310px"><a href="http://mocko.org.uk/b/wp-content/uploads/2011/01/Cyberia_Internet_Cafe.gif"><img class="size-full wp-image-433" title="Cyberia_Internet_Cafe" src="http://mocko.org.uk/b/wp-content/uploads/2011/01/Cyberia_Internet_Cafe.gif" alt="Image from Wikimedia commons" width="300" height="180" /></a><p class="wp-caption-text">Remember when Internet Cafes weren&#39;t full of tramps?</p></div>
<p>We&#8217;ll start with a history lesson.  Think back to 1996 &#8211; a time when <a href="http://web.archive.org/web/19961219233058/http://www.sun.com/">dinosaurs</a> still ruled the earth, Oasis were in the charts and we printed out our web pages at the local cybercafe to read at home later.  The language spoken by web browsers and servers &#8211; the HTTP Protocol &#8211; was simplistic.  <a href="http://www.ietf.org/rfc/rfc1945.txt">HTTP/1.0</a> really was basic: when your client (read: Netscape Navigator) wished to retrieve a page it would connect to a server, request the object, snarf it and then go away.</p>
<p><span id="more-392"></span></p>
<p>After finding your server the conversation went something like this:</p>
<pre>*START*
Client connects to port 80 on server.
Client says "hey, get me /~mocko/mylifestory.html"
Server responds with the file
Server closes the connection
*FINISH*</pre>
<p>With such a powerful and simple concept it&#8217;s easy to see how the web caught on.  Over the slow connections of the day (low bandwidth, high latency) all that work throwing up and tearing down the connection could impose an overhead of seconds.</p>
<p>As the web exploded it became evident that HTTP/1.0 had a few limitations.  Clever people banged their heads together for a while and in 1997 they came up with an extended version, <a href="http://www.ietf.org/rfc/rfc2068.txt">HTTP/1.1</a>.  It added awesome new features like:</p>
<ul>
<li> <strong>Virtual Hosting</strong> &#8211; so more than one domain could be served from a single server.</li>
<li> <strong>Persistent Connections</strong> &#8211; aka. KeepAlive &#8211; so clients could hang around for a while and fetch many objects in the same request.</li>
<li><strong>Pipelining</strong> &#8211; a client firing off many requests before the server has responded to the first one so the server could send a whole string of files without pausing for instructions once each completed.</li>
</ul>
<p>HTTP/1.1 made a big difference.  Suddenly you didn&#8217;t need to buy your own server if you wanted to host a little website &#8211; you could easily rent space for a few dollars on a server owned by someone else.  The number of domains <a href="http://www.zooknic.com/Domains/counts.html">exploded</a>: almost a million new domains were registered in the last six months of 1997 alone.</p>
<p>And these persistent connections.  What were they for?</p>
<p>The <a href="http://www.w3.org/History/19921103-hypertext/hypertext/WWW/TheProject.html">earliest</a> web pages were ridiculously simple.  A single file of HTML (&#8220;Here is my home page on the interwebnets&#8221;).  Your browser connected, snagged the file and rendered the content into a readable page.</p>
<p>But as connection speeds grew (old enough to remember your first 14.4k modem?) people started to include other content in their pages.  Garish &#8220;under construction&#8221; <a href="http://www.cs.utah.edu/~gk/atwork/">images</a>, <a href="http://www.christiananswers.net/midimenu.html">midi</a> files, all sorts of crap.  Like all new technologies taste came late to the party.  And all of a sudden loading a page didn&#8217;t mean just connecting and grabbing some HTML &#8211; browsers had to:</p>
<ol>
<li>Connect &amp; get page</li>
<li>Parse page for references to objects included</li>
<li>Connect again to retrieve every single object</li>
</ol>
<p>With the overhead of starting a fresh TCP connection every time this was <em>really</em> inefficient.  For a complex page (say one with ten images and some godawful background music) you&#8217;d have to go through that connect-request-disconnect dance twelve times.  Madness.  Browsers would do their best to start displaying the page before all the objects had loaded (remember when the images used to arrive five minutes after the text?) but user experience was always, to put it politely, crap.</p>
<div id="attachment_431" class="wp-caption alignright" style="width: 240px"><a href="http://mocko.org.uk/b/wp-content/uploads/2011/01/Thexfiles.jpg"><img class="size-full wp-image-431" title="Thexfiles" src="http://mocko.org.uk/b/wp-content/uploads/2011/01/Thexfiles.jpg" alt="Image pinched from Wikipedia" width="230" height="130" /></a><p class="wp-caption-text">I won&#39;t punish you with the MIDI file.</p></div>
<p>Enter persistent connections.  With the outbreak of HTTP/1.1 a client would connect, load the HTML for the web page, remain connected while determining what other objects to load and then request them too.  All within the lifetime of a single connection.  For a simple page containing a photo of Gillian Anderson[1] and a tinny MIDI rendering of the X-Files theme tune your Netscape[TM] browser would:</p>
<pre>*START*
Connect to server on port 80.  Announce we're talking HTTP/1.1
Request "/~mocko/gillian-anderson-is-a-fox.html"
Receive data; analyse it to determine included content
Request "/~mocko/foxy_gillian_anderson.jpg" and "/~mocko/spooky_music.mid"
Receive both objects in order without delay for further requests
Client has nothing more to request so closes connection
*FINISH*
</pre>
<p>HTTP/1.1 did away with the terrible overhead of negotiating a TCP connection (remember, this could take seconds) for every single object.  One connection, one disconnection.  It made a big difference.  Pipelining helped even more &#8211; on a nascent Internet where your request for the next file took seconds to reach the server giving it a shopping list of items to deliver really cut down on the waiting time.</p>
<p>So KeepAlive exploded into the world like Season 2 of The X-Files.  As the complexity of web pages increased it greatly reduced the time needed to deliver them.  Webmasters (remember them?) loved it and so did the latte-sipping, apple-using cognoscenti in their <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Cyberia,_London">local cybercafe</a>.</p>
<h2>What&#8217;s Up With KeepAlive?</h2>
<p>In the last 13 years the web has changed.  Everybody in the Western world has a high-bandwidth, low-latency connection to it: even my phone can handle a Skype video chat with flawless quality and no dropouts.  Whilst still a good thing pipelining and keepalive don&#8217;t make the difference they used to.  Pages load in milliseconds now, not minutes.</p>
<p>To give users the fastest experience possible browsers have gotten smarter.  Rather than opening a single connection to the server they open a few in parallel.  The copy of Firefox I&#8217;m writing in has a &#8220;<a href="http://kb.mozillazine.org/Network.http.max-connections-per-server">network.http.max-connections-per-server</a>&#8221; setting of fifteen.  And&#8230; duh-duh-duuuuh&#8230; once it&#8217;s fetched a page it holds some open just in case the user (or more likely some Javascript in the page) requests more content from the server.  My Firefox has a&#8221;<a href="http://kb.mozillazine.org/Network.http.keep-alive.timeout">network.http.keep-alive.timeout</a>&#8221; setting of 115 seconds.</p>
<p>Let&#8217;s see a simple example&#8230;</p>
<pre>*START*
Connect to server on port 80.  Announce we're talking HTTP/1.1
Request "/funky/web/app"
Receive data; analyse it to determine included content
Request "/js/jquery.js" and "/images/header.png" and a zillion other things
Receive all objects in order without delay for further requests
Client has nothing more to request BUT HANGS AROUND JUST IN CASE
...long wait
*FINISH*</pre>
<p>What&#8217;s wrong with this behaviour?  Nothing from the browser&#8217;s point of view.  It helps get pages in front of the user&#8217;s eyeballs a little faster.  Nobody likes waiting for their web pages anymore.</p>
<p>But what about the server?</p>
<p>Here&#8217;s the rub.  Webservers (well, most small-scale ones) support a very low number of concurrent connections.  In a world where clients connected, requested stuff then went away  that was fine.  You&#8217;ll only had a few on the line at once &#8211; web users spend most of their time reading shit, not pressing refresh or clicking links as fast as they can.</p>
<p>Modern web browsers are selfish.  Let&#8217;s see how long my copy of Firefox[2] hangs around after loading a simple web page from <a href="http://www.w3.org/History/19921103-hypertext/hypertext/WWW/TheProject.html">www.w3.org</a>.  I&#8217;ll use a simple script to time how long Firefox remains connected to W3&#8242;s poor server&#8230;</p>
<pre>mock-air:~ mock$ cat TestKeepAlive.sh
#!/bin/bash

while /usr/bin/true
do
 now=`date "+%H:%M:%S"`
 lingering=`netstat -W | grep -c 'hans-moleman.w3.org'`
 printf "%-12s %1d\n" $now $lingering
 sleep 1s
done</pre>
<p>And the result:</p>
<pre>mock-air:~ mock$ ./TestKeepAlive.sh
17:41:06     0
17:41:07     1    # Request made &amp; small page delivered
17:41:09     1    # almost instantaneously
17:41:10     1
17:41:11     1    # Browser still connected
17:41:12     1
...
17:41:34     1    # STILL hanging around
17:41:36     1
17:41:37     1
17:41:38     0    # Gone.  Total waiting time 30s seconds.
^C
</pre>
<p>So what just happened?  Firefox connected, fetched a copy of the first web page ever (all 1011 bytes of it) then remained connceted to the remote server for a further 30 seconds.  That&#8217;s 30 seconds longer than a browser would have done in 1993.</p>
<h2>So What&#8217;s Your Beef?</h2>
<p>The problem is this.  <em>Servers can only support a finite number of concurrent connections</em>.  The number depends more on the server&#8217;s software architecture than its hardware.  For Apache &#8211; still by far the most commonly used server on the web &#8211; the default is 150 although for a modern installation linked against an interpreter for dynamic web pages 150 connections would leave machines with less than 4GB of RAM grinding to a halt.  And the more users visiting your website the worse it&#8217;ll get.</p>
<p>It&#8217;s the webserver equivalent of getting stuck behind a 90 year old in the queue at your local supermarket.  Buying the shopping should take, what, 30 seconds?  But instead they&#8217;ll follow it up with a five-hour-long conversation with the cashier about the weather, the government and the football while you quietly seethe and visualise throwing them into a pit of ravenous weasels.  That&#8217;s what your browser is doing <strong>right now</strong> to every webserver it talks with.</p>
<p>Handling lots of concurrent connections has been a long-running issue in computer science.  For a in-depth treatment see &#8220;<a href="http://www.kegel.com/c10k.html">The C10K Problem</a>&#8220;.</p>
<p>Webservers with more modern threading models cope better with this than Apache.  FastCGI can help by making webserver processes much more lightweight and load balancers can mitigate connection starvation by terminating thousands of client connections themselves and forwarding requests to the webserver through a small pool of long-lived KeepAlive connections.</p>
<p>KeepAlive isn&#8217;t evil <em>per se</em> and it was introduced for a good reason.  But it&#8217;s abused terribly by modern web browsers and the result is our poor webservers have thousands of clients tying up processes when only a handful are actively transferring any data.</p>
<p>The problem is especially pronounced in situations of high traffic.  In the last few years I&#8217;ve had to run systems which deal with thousands of connections per second from thousands of separate clients, and when you&#8217;re in that business KeepAlive is public enemy #1.  I&#8217;ve solved more people&#8217;s load issues than I can count by adding the simple line &#8220;KeepAlive Off&#8221; to apache2.conf.</p>
<h2>How Do We Fix It?</h2>
<p>There are two simple answers and a difficult one.  Betcha weren&#8217;t expecting that.</p>
<ol>
<li>For any type of webserver &#8211; unless you expect clients to poll your server every couple of seconds (chat app?) <strong>reduce the length of time a client is allowed to hang around after making her request</strong>.  In Apache it&#8217;s called, predictably, &#8220;<a href="http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout">KeepAliveTimeout</a>&#8221; and the default is a baffling 15 seconds.  That&#8217;s 15 seconds hanging around wasting resources &#8211; an aeon in computer terms.  In a modern world where our clients all run lightning-fast computers and have DSL internet connections three seconds ought to be enough.</li>
<li>Also for any webserver &#8211; <strong>if for each hit you only expect to serve a single object KeepAlive is worthless to you</strong>.  This was true of the LJToys bugserver &#8211; a dedicated webserver I wrote to accept and record isolated &#8220;pings&#8221; of data from many thousands of web clients.  In this case you can stop browsers hanging around by turning it off completely.  &#8220;<a href="http://httpd.apache.org/docs/2.0/mod/core.html#keepalive">KeepAlive</a> Off&#8221; in Apache&#8217;s parlance.</li>
<li>Now the hard one: <strong>let the KeepAlives stay but use a different sort of webserver</strong>.  The killer for Apache and others of its generation is that every connection will use up a process &#8211; and that eats up memory on your server way too fast.  But there are alternatives which can efficiently multiplex thousands of connections while using up only a handful of resources.  <a href="http://wiki.nginx.org/Main">Nginx</a> is the most popular example.  But remember, they&#8217;re relative newcomers and nowhere near as well supported as venerable old Apache.</li>
</ol>
<p>It&#8217;d also help a bunch if we could get over the selfish browser  problem.  Using a single connection to transfer the hundred-or-so  objects in the average web page is great; hanging around afterward for  30 seconds for shits &#8216;n giggles is not.  If the browser makers could  drop that value right down (say 1 second?) or better yet automatically  derive a value for each user&#8217;s connection life at the far end of the  wire would be a damn sight simpler.</p>
<p>So far Apache et al. have stood the test of time &#8211; probably because existing applications and skills in the market are centred around the LAMP stack.  NetCraft&#8217;s <a href="http://news.netcraft.com/archives/2011/01/12/january-2011-web-server-survey-4.html">latest stats</a> sure make interesting reading and I wonder if alternatives like Nginx with much fresher designs will eat the incumbents lunches in the next few years.</p>
<h2>Footnotes</h2>
<p>[1] It is a common misconception that the Internet was developed as a resilient means of distributing images of kittens and naked ladies during the impending nuclear holocaust.  The Internet was actually created to publish humorous sites about teletubbies and images of Gillian Anderson.</p>
<p>[2] Examples use Firefox because that&#8217;s what was closest to hand.  Most modern browsers suck in the same way.<br />
<img src="http://mock.icons.ljtoys.org.uk/mi/5260_custom.gif" border="0" alt="" width="1" height="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/01/23/http-keepalive-considered-harmful/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>&#8220;Open&#8221; UK Rail Data: Media Coverage &amp; Broken Appeals Process</title>
		<link>http://mocko.org.uk/b/2011/01/08/open-uk-rail-data-media-coverage-broken-appeals-process/</link>
		<comments>http://mocko.org.uk/b/2011/01/08/open-uk-rail-data-media-coverage-broken-appeals-process/#comments</comments>
		<pubDate>Sat, 08 Jan 2011 22:16:50 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[Open Data]]></category>
		<category><![CDATA[ATOC]]></category>
		<category><![CDATA[data.gov]]></category>
		<category><![CDATA[Guardian]]></category>
		<category><![CDATA[LDBWS]]></category>
		<category><![CDATA[Live Departure Boards]]></category>
		<category><![CDATA[National Rail Enquiries]]></category>
		<category><![CDATA[Radio 4]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=403</guid>
		<description><![CDATA[Since my last piece on the saga of National Rail Enquiries shutting off public access to their data feed the problem has gained coverage in the Guardian and elsewhere in the press.  On Thursday I went on Radio 4&#8242;s You &#8230; <a href="http://mocko.org.uk/b/2011/01/08/open-uk-rail-data-media-coverage-broken-appeals-process/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Since my <a href="../2010/12/02/national-rail-enquiries-license-application-refused-my-app-still-dead/">last piece</a> on the saga of National Rail Enquiries <a href="../2010/10/29/national-rail-have-killed-my-train-times-app/">shutting off</a> public access to their data feed the problem has gained <a href="http://www.guardian.co.uk/technology/blog/2010/dec/03/national-rail-enquiries-data-charging-developer-protests">coverage</a> in the Guardian and elsewhere in the press.  On Thursday I went on Radio 4&#8242;s You and Yours <a href="http://www.bbc.co.uk/programmes/p00d4n2l">programme</a> to bring more attention to NRE&#8217;s attempts to make money out of commuters.</p>
<p><span id="more-403"></span></p>
<h2>Radio 4 Coverage</h2>
<p>On Thursday I went on Radio 4&#8242;s &#8220;You and Yours&#8221; to bring more attention to the issue.  Right now the programme is still on iPlayer &#8211; <a href="http://www.bbc.co.uk/programmes/p00d4n2l">listen to it here</a>.</p>
<div id="attachment_412" class="wp-caption alignright" style="width: 230px"><a href="http://mocko.org.uk/b/wp-content/uploads/2011/01/220px-Palais_de_la_Decouverte_Tyrannosaurus_rex_p1050042.jpg"><img class="size-full wp-image-412" src="http://mocko.org.uk/b/wp-content/uploads/2011/01/220px-Palais_de_la_Decouverte_Tyrannosaurus_rex_p1050042.jpg" alt="File from Wikimedia Commons" width="220" height="142" /></a><p class="wp-caption-text">A dinosaur</p></div>
<p>TfL (who are a shining example of the <em>right way</em> to do open data) produced an excellent illustration of the benefits to the public.  Later the editor of Wired magazine drew a parallel between National Rail Enquiries and the dinosaurs.</p>
<p>NRE&#8217;s spokesman Edward Welsh reiterated their line that it was unintentional that they made the data available for unlicensed use prior to October 2010, and that they won&#8217;t negotiate with me because I said nasty things about them &#8220;when opening up discussions&#8221;.  That isn&#8217;t entirely true: discussions had already taken place and I didn&#8217;t go public until told by NRE that a free license was unlikely.  You can see that because, uhhh, it&#8217;s what the original blog post was all about!</p>
<h2>License Appeal</h2>
<p>A  month after my appeal arrived at National Rail Enquiries and four hours after Radio 4 broadcast their programme, NRE responded.  While the <a href="http://www.atoc.org/about-atoc/national-rail-enquiries/code-of-practice">Code of Practice</a> says appeals should be addressed in writing to NRE it appears one must embarrass them on national radio to elicit a response.</p>
<p>I was emailed the letter from Mr Scoggins in a pdf.  In it he says:</p>
<ul>
<li>My application for a license is still rejected.</li>
<li>Even if I had a license the critical remarks I have made about ATOC/NRE would place me in breach of it.  [So the NRE license says you may not criticise NRE?]</li>
<li>Former  use of NRE&#8217;s Live Departure Boards feed [even though that feed was freely accessible and documented on the Internet by NRE themselves] was illegal.</li>
<li>I had not engaged with NRE constructively to gain a license.</li>
<li>My blog posts are intended to give NRE a poor reputation.</li>
<li>I am therefore not a reputable or reliable partner for them share the data with.</li>
</ul>
<p>These are National Rail Enquiries&#8217; official reasons why I cannot use the feed of train times data.  Let&#8217;s take them apart one at a time.</p>
<h3>&#8220;Illegal&#8221; usage of the data</h3>
<p>While  my web app was completely free, contained no adverts, existed solely as  a public service to commuters and was written carefully to follow NRE&#8217;s instructions  on querying their service, National Rail Enquiries assert I was using the data illegally.</p>
<p>This  is despite the fact that NRE were providing the data feed and documentation  for using it freely on their website &#8211; and a licensing requirement was not prominently  displayed.  In fact until October 2010 it was even listed as an open data  feed on the London Datastore website.  Programmers had been using the feed for a variety of public-spirited endeavours for a long time before and I find it hard to believe NRE were unaware of this.</p>
<p>Presumably in NRE&#8217;s eyes the army of other developers who had come up with novel uses for the information were also breaking the law.</p>
<p>Here  we see NRE&#8217;s real attitude to the live departure information.  By  presenting it to the public without their approval one is breaking the  law.  One could hardly describe this attitude as &#8220;open&#8221;.</p>
<h3>No constructive engagement / not a reputable partner</h3>
<p>If we look back to the dialogue documented in my <a href="../2010/10/29/national-rail-have-killed-my-train-times-app/">original post</a> from October it&#8217;s obvious that I made several attempts to engage with National Rail Enquiries before publicly criticising them.</p>
<ul>
<li>In late 2009 I wrote asking for a commercial license and had no response at all.</li>
<li>I tried again a month later, this time by registered post, and was told that  absolutely no commercial usage of the data was permitted.  NRE now say  this was in error.</li>
<li>When NRE announced in October 2010 that  license keys would be required I emailed Derek Parlour straight away to ask for  one.  Judge for yourself whether that email was constructive; I think it  was as sweet as pie.</li>
<li>When ordered to shutdown my web  application I continued to attempt a constructive engagement with NRE  asking whether the app could be kept going while we negotiated.</li>
</ul>
<p>Unconstructive?  Hardly.  I did my utmost to engage in a  positive and reasonable manner to gain a license to use the data.</p>
<p>Only  when NRE ordered me to take down my little application and made it  clear that they were intent on charging a fee did I take the issue out into the open.</p>
<p>Related to this: Chris says that even if I had a license the things I&#8217;ve said about National Rail Enquiries would be a breach of its terms.  Let&#8217;s examine that again &#8211; <strong>to get a license to use the rail data from NRE you must agree not to say anything critical of them</strong>.</p>
<p>Sweet Jesus, what is a contract term like that doing in a fair and civilised society?  Is it even valid under English law?</p>
<h3>Blog posts intended to damage NRE&#8217;s reputation</h3>
<p>It is unfortunate if the Chief Executive of National Rail Enquiries feels my blog posts have damaged his organisation&#8217;s reputation.  However all I&#8217;m doing is reporting their actions and statements &#8211; if NRE&#8217;s reputation is suffering it can only be as a result of their own deeds.</p>
<p>If National Rail Enquiries want a better reputation their Chief Executive should resign and make way for someone who isn&#8217;t trying to exploit the traveling public for financial gain.</p>
<h2>So What are the Licensing Rules?</h2>
<p>NRE have not told us what the  rules are for granting licenses.  However I&#8217;ve tried to catalogue <a href="http://mocko.org.uk/ldb/ldb_licenses.html">NRE&#8217;s responses to license applications</a> (get in touch if you want your attempt listed) and it looks like their decision is split along a simple line.</p>
<ul>
<li>If you&#8217;re applying to use the data for a nonprofit <span style="text-decoration: underline;">website</span> a license is offered on fairly reasonable terms.</li>
<li>However  if you intend to make a mobile <span style="text-decoration: underline;">phone application</span> &#8211; even if you&#8217;re not making a penny &#8211; you&#8217;ll be met with licensing terms so draconian you can&#8217;t possibly go ahead.  You  can&#8217;t afford to pay a four-figure license sum if you&#8217;re a small-time  hacker building a free iPhone app.</li>
<li>Of course if you&#8217;ve criticised them in the media <a href="../2010/12/02/national-rail-enquiries-license-application-refused-my-app-still-dead/">you can get lost</a>.</li>
</ul>
<p>National Rail Enquiries told one  applicant that as a private company they are &#8220;not in a position&#8221; to  supply the data for free.  For two reasons this is an outrageous  statement:</p>
<ol>
<li>It flies in the face of the current government&#8217;s  open data policies.  I can only hope that when future franchises are  awarded live train data must be published on a fair and open basis and  not withheld from developers as a punitive measure.</li>
<li>Until late  November National Rail Enquiries were supplying the data for free so  they&#8217;re clearly capable of doing so.  On the Radio 4 programme NRE&#8217;s spokesman went on record as saying that they are  supplying the data for free to at least one developer &#8211; so telling other developers they are not in a position to supply data for free is an outright lie.</li>
</ol>
<p>National Rail  Enquiries real intention, I believe, is to profit from passengers increasing usage of live train data on mobile  devices.  Somebody high up in NRE has  decided to ignore the public and state pressure for open data and  instead try to &#8220;maximise shareholder value&#8221; by exploiting the monopoly  they have on Live Departure Boards data to make money from anyone who wants to access it from an iPhone or Android app.</p>
<p>Still not convinced?  Go to <a href="http://www.nationalrail.co.uk/">www.nationalrail.co.uk</a> and search for a train journey.  At the time of writing the results  page bombards you with adverts.  I counted four, three of them for NRE&#8217;s  own 0871-rate &#8220;TrainTracker&#8221; phone service.  Doesn&#8217;t it look like  they&#8217;re doing their damnedest to claw money out of you?</p>
<p>Need more convincing?  See this <a href="http://www.guardian.co.uk/media/pda/2009/jun/16/apple-iphone">Guardian article</a> from June 2009 when NRE were investigated for threatening mobile app developers.</p>
<h2>What Next?</h2>
<p>Are National Rail Enquiries going to pursue legal action against me for  &#8220;illegal&#8221; usage of the data prior to October 2010?  I hope not.  Gee,  all I was trying to do was help commuters get to work quicker.</p>
<p>In any case it&#8217;s clear by now I&#8217;m not going to gain any traction with the staff of NRE/ATOC.  I&#8217;m not aware of a single free Android or iPhone application they&#8217;ve given a workable license for (please correct me if I&#8217;m wrong) and since it would reduce their revenue from paid applications I reckon they&#8217;ll make just about any excuse to avoid granting one.</p>
<p>In the coming days I&#8217;ll make a complaint about NRE&#8217;s abuse of its monopoly on live departure information directly to the Office of Rail Regulation.   I&#8217;ll also try to open a dialogue with the Secretary of State for Transport; while he has no direct control of National Rail Enquiries (it is indeed a private organisation) it would be very much in the public interest if all future franchises included a requirement for open data in their contracts.</p>
<p>This isn&#8217;t going to blow over anytime soon.  The attitude to data within the Association of Train Operating Companies is the antithesis of openness and it&#8217;ll take nothing less than direct government intervention or pressure slowly applied as new franchises are awarded to change this dinosaur mentality.  For now I fear we&#8217;re stuck with them and anybody who wants an app for live train times on their phone will end up paying the Scoggins Tax.<br />
<img src="http://mock.icons.ljtoys.org.uk/mi/5256_custom.gif" border="0" alt="" width="1" height="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/01/08/open-uk-rail-data-media-coverage-broken-appeals-process/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Awful Recruiter of the Year: Nick Blake of &#8220;Technical Identity&#8221;</title>
		<link>http://mocko.org.uk/b/2011/01/04/awful-recruiter-of-the-year-nick-blake-of-technical-identity/</link>
		<comments>http://mocko.org.uk/b/2011/01/04/awful-recruiter-of-the-year-nick-blake-of-technical-identity/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 23:51:12 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Rude Recruiters]]></category>
		<category><![CDATA[TechID]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=395</guid>
		<description><![CDATA[I originally posted an entry about a particularly obnoxious IT recruiter on LiveJournal in July 2009.  Sometime in the last couple of months it&#8217;s been suspended by them for reasons unknown.  Here&#8217;s the entry in full&#8230; &#8212; snip &#8212; Here&#8217;s &#8230; <a href="http://mocko.org.uk/b/2011/01/04/awful-recruiter-of-the-year-nick-blake-of-technical-identity/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I originally posted an entry about a particularly obnoxious IT recruiter on LiveJournal in July 2009.  Sometime in the last couple of months it&#8217;s been suspended by them for reasons unknown.  Here&#8217;s the entry in full&#8230;</p>
<p><span id="more-395"></span><br />
&#8212; snip &#8212;</p>
<p>Here&#8217;s another IT recruitment gem.  I was going to print the lot out and mail it to <a href="http://www.techid.co.uk/">TechID</a>&#8216;s  directors with &#8220;are your staff supposed to be this rude?&#8221; in 48-point  Arial Bold at the top but a quick look on Companies House WebCheck  reveals&#8230; guess what, the director is one &#8220;Nick Blake&#8221;.</p>
<p>It starts simply enough&#8230;</p>
<blockquote><p>Subject: Senior Systems Administration &#8211; Opportunity<br />
From: &#8220;Nick Blake &#8211; Identity Solutions UK&#8221; &lt;nick.blake@techid.co.uk&gt;<br />
Date: Thu, 22 Jul 2010 15:17:00 +0100<br />
To: &lt;nick.blake@techid.co.uk&gt;</p>
<p>I have spoken to you previously however with the downturn in last 18 months the market has been quiet!<br />
Things are picking up and I have an opportunity that may interest you or perhaps you know someone?<br />
I have your CV although it is out of date so if you could send an updated version for our records it would be great.</p>
<p>[vaguely appropriate but permanent job description follows]</p>
<p>&#8220;The future of technical professional recruitment&#8221;</p>
<p>www.nuera-rec.co.uk search specialists join Identity Solutions UK</p>
<p>Identity Solutions UK Ltd<br />
145-157 St. Johns St,<br />
London,<br />
EC1V 4PY</p></blockquote>
<p>I  haven&#8217;t any record of speaking to a Nick Blake before, or anyone at a  company called &#8220;Identity Solutions&#8221;.  And the  &#8220;To: &lt;nick.blake@techid.co.uk&gt;&#8221; is very suspicious.  Normally  emails are &#8220;To: &lt;you&gt;&#8221;.  Has he just BCC&#8217;ed this to a bunch of  people?  Like a trusting fool I give him the benefit of the doubt and  send a recent CV.</p>
<blockquote><p>Subject: Re: Senior Systems Administration &#8211; Opportunity<br />
From: Alex Hewson &lt;mock@mocko.org.uk&gt;<br />
Date: Thu, 22 Jul 2010 16:14:06 +0100<br />
To: nick.blake@techid.co.uk</p>
<p>Hi Nick,</p>
<p>That  is quite appropriate for me but I&#8217;m only interested in contract roles.  Here&#8217;s the latest CV for your records but do check with me before  sending it to anyone. With regard to rates I&#8217;m looking at £XXpd+</p>
<p>All the best, Alex.</p></blockquote>
<p>[The X's are mine.  Let's pretend they're kisses.]</p>
<p>He responds with a curt &#8220;Ok thanks&#8221;.</p>
<p>On  Saturday (!) Nick emails me another &#8220;opportunity&#8221;.  Actually I&#8217;m really  curious about that word &#8211; who is it an opportunity for?  I guess  &#8220;opportunity&#8221; is just one of those great sounding but meaning-neutral  words salespeople love.</p>
<blockquote><p>Subject: opportunity<br />
From: &#8220;Nick Blake &#8211; Identity Solutions UK&#8221; &lt;nick.blake@techid.co.uk&gt;<br />
Date: Sat, 24 Jul 2010 15:46:38 +0100<br />
To: &lt;jobs@mocko.org.uk&gt;</p>
<p>Hi Alex,</p>
<p>Would  this position interest you ?</p>
<p>Cross skilled Experienced Systems  Administrator &#8211; UK-SouthEast-50K- ***RIGHT TO WORK IN THE UK**** more  details</p>
<p>http://www.nuera-rec.co.uk/jobDetails.php?vacid=32</p>
<p>Regards</p>
<p>Nick Blake<br />
Managing Consultant</p></blockquote>
<p>Well  done Nick.  Remember when I told you &#8220;only interested in contract  roles&#8221; in the last email?  No, you didn&#8217;t, probably because you shoved  my CV in your database without bothering to read the email then went to  the pub.</p>
<p>BTW - if it&#8217;s still up check the vacancy.  At the time of writing it&#8217;s for an &#8220;Experience Systems Administrator&#8221;.</p>
<blockquote><p>Subject: Re: opportunity<br />
From: Alex Hewson &lt;mock@mocko.org.uk&gt;<br />
Date: Sat, 24 Jul 2010 23:41:56 +0100<br />
To: nick.blake@techid.co.uk</p>
<p>Hi Nick,</p>
<p>As I told you on Thursday I&#8217;m only interested in contracts. Can you refrain from mailing me anything else?</p>
<p>Regards, Alex.</p></blockquote>
<p>I  expect it to end here.  Another agent gets the huff when you call them  out for ignoring your requirements.  But no&#8230; a response, at 14:08 on a  Sunday.   Weeeeeird.  Who&#8217;s doing recruiting at 14:08 on a Sunday?   Some kind of IT recruiter voodoo where they think candidates are likely  to read your mail if it wastes their spare time?  Personally I was  watching jet fighters do a whole load of awesome at the Farnborough  Airshow.  Did you know an F16 can fly in corkscrews upside-down?   Seriously, that&#8217;s some awesome shit. That&#8217;s how I spend my Sundays, not  emailing people jobs they don&#8217;t want.</p>
<blockquote><p>Subject: RE: opportunity<br />
From: &#8220;Nick Blake &#8211; Identity Solutions UK&#8221; &lt;nick.blake@techid.co.uk&gt;<br />
Date: Sun, 25 Jul 2010 14:08:10 +0100<br />
To: &#8220;&#8216;Alex Hewson&#8217;&#8221; &lt;mock@mocko.org.uk&gt;</p>
<p>Ok,</p>
<p>I’ll get admin to remove you from our main frame databases of both companies.</p>
<p>Regards</p>
<p>Nick Blake<br />
Managing Consultant</p></blockquote>
<p>Uhh&#8230;.  what now &#8220;?  It&#8217;s &#8220;mainframe&#8221; - even my gran knows that.  If you&#8217;re a  headhunter in the IT industry you sure as hell should.  And if you&#8217;re a  small IT recruitment consultant I sincerely doubt you&#8217;ve got one.  By  now I&#8217;m thinking &#8220;who is this clown?&#8221;</p>
<blockquote><p>From:  &#8220;mock@mocko.org.uk&#8221; &lt;mock@mocko.org.uk&gt;<br />
Date: Sun, 25 Jul 2010 15:11:07 +0100 (BST)<br />
To: Nick Blake &#8211; Identity Solutions UK&lt;nick.blake@techid.co.uk&gt;<br />
Subject: Re: opportunity</p>
<p>Hi Nick,</p>
<p>Mainframe is all one word.   Hope that helps with the IT.</p>
<p>Best,<br />
Alex.</p></blockquote>
<p>A little later:</p>
<blockquote><p>Subject: Re: opportunity<br />
From: nick.blake@techid.co.uk<br />
Date: Sun, 25 Jul 2010 15:38:57 +0000<br />
To: &#8220;mock@mocko.org.uk&#8221; &lt;mock@mocko.org.uk&gt;</p>
<p>Sarcastic prat!</p>
<p>Regards</p>
<p>Nick Blake<br />
Managing Consultant</p></blockquote>
<p>Nice one Nick.  Service with a smile.<br />
<img src="http://mock.icons.ljtoys.org.uk/mi/5255_custom.gif" border="0" alt="" width="1/" height="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/01/04/awful-recruiter-of-the-year-nick-blake-of-technical-identity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Survive a Slashdotting on a Small Apache Server</title>
		<link>http://mocko.org.uk/b/2011/01/02/how-to-survive-a-slashdotting-on-a-small-apache-server/</link>
		<comments>http://mocko.org.uk/b/2011/01/02/how-to-survive-a-slashdotting-on-a-small-apache-server/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 19:29:59 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[High load]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[Slashdot effect]]></category>
		<category><![CDATA[Slashdotting]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=362</guid>
		<description><![CDATA[&#8230;so your plain ordinary webserver just got listed on a high-traffic news site.  Slashdot?  Reddit?  Hacker News?  Well done, turns out you&#8217;re hosting something thousands of people want to read.  Now thousands of people want to come to your webserver &#8230; <a href="http://mocko.org.uk/b/2011/01/02/how-to-survive-a-slashdotting-on-a-small-apache-server/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&#8230;so your plain ordinary webserver just got listed on a high-traffic news site.  Slashdot?  Reddit?  Hacker News?  Well done, turns out you&#8217;re hosting something thousands of people want to read.  Now thousands of people want to come to your webserver at once.</p>
<p>But you&#8217;ve got a problem.  Your server&#8217;s hosed and none of those potential readers can see it.  Worse, your story will only be top of the Slashdot/Reddit/whatever for a few hours and this means you&#8217;ve got to fix the problem <em>right now </em>before the world loses interest.  You haven&#8217;t time to buy new hardware, setup a complex load balancing solution or rewrite half your app&#8217;s codebase.  What are you going to do?</p>
<p>Follow uncle Alex&#8217;s checklist and we&#8217;ll soon have you back on the air.</p>
<p>This is written on the assumption that you&#8217;re running a standard, out-of-the-box setup on RedHat, Ubuntu, CentOS or some other common Linux distro with SYSV init scripts.  It also presumes you have Prefork MPM (the default), MySQL as your database and no other major apps running on there.  If you&#8217;re already running some funky config then this tutorial isn&#8217;t for you.</p>
<p><strong><em>NB: Uncle Alex makes no warranties about his checklist and accepts no liability if destroys your server, fails to solve the problem, runs over your wife or sleeps with your dog.  Follow these instructions at your own risk.  But you&#8217;re desperate, right?</em></strong></p>
<p><span id="more-362"></span></p>
<h2>1) Gain Access</h2>
<p>If your server is really hosed you will find it hard to SSH in.  If you have console access (e.g. on a virtual hosting package, HP&#8217;s excellent iLO or you&#8217;re stood in front of the machine) login through that &#8211; you&#8217;ll save a minute waiting to negotiate a SSH session into your overloaded machine.</p>
<p>Try to run ssh inside a terminal with a scrollback buffer (putty, mac console, gterminal, whatever) because your server may be so laggy it&#8217;s quicker to hunt for the output of previous commands than running them again.  If you&#8217;re running SSH from the command line u﻿se the &#8216;-v&#8217; flag so you can see how the connection progresses.</p>
<p>It might take a while&#8230;</p>
<pre style="margin: 8px;">mock@hostname:~$ ssh -v mock@my.slashdotted.server
﻿OpenSSH_5.2p1, OpenSSL 0.9.8l 5 Nov 2009
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to my.slashdotted.server [x.x.x.x] port 22.
﻿debug1: Connection established.
....
....
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
....
....
﻿You have mail.
Last login: Sat Nov  6 02:13:31 2010 from your.desktop.computer

mock@my.slashdotted.server:~$</pre>
<p>Be patient.  Resist the temptation to open multiple sessions when the first doesn&#8217;t connect immediately: you&#8217;ll only load the machine even more.  For each connection the server needs to negotiate a secure pipeline, do authentication for your user and<em> </em>start a process for your shell.  On a healthy Linux box this is usually instantaneous &#8211; but right now yours ain&#8217;t healthy.</p>
<p>The waiting is the hardest part.</p>
<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; connected?</p>
<p>Good.</p>
<p>Best practice be damned &#8211; become root straight away.  Yeeee-haw cowboy.</p>
<pre style="margin: 8px;">﻿mock@my.slashdotted.server:~$ sudo -s    # or 'su -' if you're in 1990</pre>
<h2>2) Now to Work.  Diagnosis&#8230;</h2>
<p>You&#8217;re on a heavily loaded machine.  Commands will take forever to complete so you&#8217;ve got to make each one count.</p>
<p>First we want to diagnose the problem.  Since interaction with a hosed server is painfully slow we need to do this in as few steps as possible.  But we <em>don&#8217;t</em> want to kill Apache and free up resources before we&#8217;ve examined the system&#8217;s state to figure out what&#8217;s wrong&#8230;</p>
<h3>Bandwidth or server load?</h3>
<p>A slashdotting can kill your server in one of two ways: saturating its internet connection with the data you&#8217;re serving (rare these days, ISP&#8217;s have a <em>lot</em> of bandwidth) or inundating your host with many more connections than it can handle.  We want to figure out which as quickly as possible.</p>
<pre>root@﻿my.slashdotted.server:~$ time ﻿cat /proc/loadavg
45.25 31.26 22.73 1/135 27844

﻿real    0m3.002s
user    0m2.002s
sys     0m1.000s</pre>
<p>Count in your head how long this <em>really</em> takes to return output.  One elephant, two elephant, three elephant&#8230;</p>
<p>The &#8216;cat /proc/loadavg` part is obvious, you want an idea of the system&#8217;s load.  But why `time`?  Because it tells us <em>how long it took your host</em> to load the `cat` program into memory, run it and print out the contents of <a href="http://www.linuxinsight.com/proc_loadavg.html">/proc/loadavg</a>.  Perhaps it took a long time because the system&#8217;s loaded or perhaps it ran quickly and the result took forever to reach you through the congested network.  And the best part of it is if your shell&#8217;s bash `time` is a <a href="http://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html">builtin</a> &#8211; so we can know it imposed almost no overhead.</p>
<p>So does the machine&#8217;s timing for &#8216;real&#8217; match what you counted in your head?</p>
<ol>
<li>If `cat /proc/loadavg` ran quickly but the load is high your network connection is likely okay.  But the load is huge &#8211; what do you do?  Read on&#8230;</li>
<li>If the load is low (say &lt;10) but it took forever for that output to reach you probably your server&#8217;s network link is saturated.  Your server is healthy, it just has a bandwidth issue.  Skip the next section.</li>
</ol>
<h2>3) Getting the Load Down (or &#8220;It&#8217;s almost always the RAM&#8221;)</h2>
<p>Look at the first three figures in /proc/loadavg.  ﻿On a healthy Unix server the load averages ought to be no higher than your number of CPU&#8217;s.  A little higher (maybe 2x) is bearable but really high numbers mean you&#8217;ve got a system load problem.   The extreme figures in the example &#8211; &#8220;85.25 73.26 41.73&#8243; in our example would triangulate your position as &#8220;up shit creek&#8221;.</p>
<p>In case you you were thinking &#8220;hey, how many CPU&#8217;s have I got?&#8221; here&#8217;s a simple way to find out:</p>
<pre>root@﻿my.slashdotted.server:~$ grep ^processor /proc/cpuinfo
processor       : 0
processor       : 1
</pre>
<p>You&#8217;ll see a &#8216;processor:&#8217; line for each CPU.  The server in this example has two cores.</p>
<p>For a better understanding of load averages read ﻿the excellent <a href="http://www.linuxinsight.com/proc_loadavg.html">page at LinuxInsight</a>.  In short &#8211; if the first number is higher than the last your problem is getting worse.</p>
<h3>How many apache processes?</h3>
<p>One dead giveaway for system load issues is the number of Apache processes.  That&#8217;s not to say Apache itself is the problem &#8211; but if you have hundreds of them backing up on a small server it means something&#8217;s wrong&#8230;</p>
<pre># on debian/ubuntu
root@my.slashdotted.server:~$ ps ax | grep -c /usr/sbin/apache2
151

# on redhat/centos/suse etc.
root@my.slashdotted.server:~$ ps ax | grep -c /usr/sbin/httpd
151
</pre>
<p>151?  That&#8217;s a lot of processes.  Why, if you&#8217;d maxed out Apache&#8217;s default &#8216;MaxClients&#8217; setting then added one more for the `grep` it&#8217;d be 151.  I wonder if that&#8217;s a coincidence&#8230;</p>
<p>If you&#8217;re running a modern webserver &#8211; one where Apache has modules enabled for PHP, Perl, Python or some other language interpreter &#8211; each of those processes is going to be big.  So big that together they eat way more RAM than your computer has.   For example on my little 32-bit Ubuntu 10.04 VM <em>each</em> Apache process eats 27Mb of physical RAM.  And that&#8217;s with mod_php alone; add Python or Perl as well and it gets bigger.  If you live in 64-bit land <a href="http://en.wikipedia.org/wiki/64-bit#Pros_and_cons">even more so</a>.</p>
<p>On a machine with limited memory a 32-bit OS is almost always better.</p>
<p>Do you have enough RAM to run 150 processes who each need 27Mb of RAM?  Apache will eat 4Gb before you even begin to think about OS services or MySQL.  Unless you have tons of RAM you can&#8217;t afford that many.</p>
<p>[No, I don't know why the distros all ship with a default so high.  Naughty Apache, why can't you autodetect it and set a sensible value at start time?]</p>
<p>So let&#8217;s figure out how much memory each of your Apache processes is using:</p>
<pre>root@my.slashdotted.machine:~$ top -u www-data -b -n 1
top - 21:21:32 up 3 days, 26 min,  2 users,  load average: 66.6 66.6 66.6
Tasks: 301 total,   1 running, 300 sleeping,   0 stopped,   0 zombie
Cpu(s):  ...
Mem:    408944k total,   310848k used,    98096k free,    12172k buffers
Swap:  1048568k total,   574372k used,   474196k free,    93884k cached

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
16228 www-data  20   0 64072  26m 4996 S  0.0  6.7   0:02.49 apache2
16275 www-data  20   0 62564  25m 3672 S  0.0  6.4   0:02.66 apache2
...
...
</pre>
<p>On a RedHat-derived machine you&#8217;ll want to use &#8220;-u apache&#8221; &#8211; they do things differently over there.</p>
<div id="attachment_378" class="wp-caption alignright" style="width: 310px"><a href="http://mocko.org.uk/b/wp-content/uploads/2010/12/660px-Hard_disk_head.jpg"><img class="size-medium wp-image-378" title="Disk Head" src="http://mocko.org.uk/b/wp-content/uploads/2010/12/660px-Hard_disk_head-300x272.jpg" alt="Image from Wikimedia Commons" width="300" height="272" /></a><p class="wp-caption-text">Right now half your RAM is on the disk and only this wee critter can get to it.  He ain&#39;t in a hurry...</p></div>
<p>Woah buddy, look at that &#8220;Swap:  1048568k total,   574372k used&#8221; line.  That means half your memory has been swapped out to disk.  That ain&#8217;t good; your computer&#8217;s been reduced to the speed of that little mechanical head skittering around inside your hard drive.  The Linux kernel does its best to swap out less-used pages of RAM first but with the kind of overload you&#8217;re seeing half your code is executing off of here.  <a href="http://en.wikipedia.org/wiki/Analytical_engine">Mr Babbage</a> is on the phone and he wants his mechanical computer back&#8230;</p>
<p>Now you know enough about the problem to stop Apache.  Kill it dead with:</p>
<pre># in RedHat/Suse/Centos:
root@my.slashdotted.machine:~$ /etc/init.d/httpd stop

# in Debian/Ubuntu
root@my.slashdotted.machine:~$ /etc/init.d/apache2 stop</pre>
<p>It might take a while for all those processes to terminate.  Apache will try to finish any requests it was servicing but if you have 150+ processes all fighting for memory and CPU they&#8217;ll take a minute or two to come back from swap and terminate.</p>
<p>All stopped? Good. Already the load is starting to fall and your machine is much more responsive to terminal commands.  You&#8217;re off the air so let&#8217;s keep it short and sweet&#8230;.</p>
<p>Open up Apache&#8217;s main config file in your favourite editor. In RedHat land it&#8217;s /etc/httpd/httpd.conf; in Debian/Ubuntu you&#8217;re looking for /etc/apache2/apache2.conf.</p>
<p>If you&#8217;re running with the standard config that came with your machine Apache is likely using the Prefork MPM. This means it runs a bunch of processes waiting for incoming connections and will always try to keep a couple of spare for the next client. If you have enough memory that&#8217;s great; otherwise it results in what&#8217;s called &#8220;swapping yourself to death&#8221;.</p>
<p>Look for the MPM settings. It&#8217;ll be a section of config something like:</p>
<pre>&lt;IfModule mpm_prefork_module&gt;
    StartServers          5
    MinSpareServers       5
    MaxSpareServers       10
    MaxClients            150
    MaxRequestsPerChild   0
&lt;/IfModule&gt;</pre>
<p>Most of these settings are sane.  But look at MaxClients, it&#8217;s the upper limit on the number of processes Apache will run when the whole world is trying to connect.  Reduce it to a level commensurate with your machine&#8217;s amount of RAM.</p>
<p>As a rule of thumb:</p>
<ul>
<li>For 512Mb of RAM MaxClients should be no higher than 20</li>
<li>For 1Gb, 20</li>
<li>For 4Gb, 75</li>
</ul>
<p>That default of 150 is way too generous for a small server.  It comes from a more innocent time before everyone had mod_php (or python or perl or whatever) loaded into Apache and processes were a lot smaller.</p>
<h3>KeepAlives considered harmful</h3>
<p>So now you have Apache configured to run a number of processes roughly in line with what your hardware supports.  While you&#8217;re tinkering with it there are a couple more useful changes you can make:</p>
<ol>
<li>Search for the &#8220;<em>Timeout</em>&#8221; setting.  Usually it&#8217;s way too high &#8211; something like 300 seconds.  This means that if a client browser&#8217;s connection to you hangs (like if their DSL cut out or their PC crashed) the Apache process you had serving them will hang around for 300 seconds in case they come back again.  Screw &#8216;em, drop that value right down.  15 seconds is enough.</li>
<li>Search for the &#8220;<em>KeepAliveTimeout</em>&#8221; setting.  I could write a whole essay on the way modern <a href="http://kb.mozillazine.org/Network.http.keep-alive.timeout">browsers</a> are greedy with HTTP KeepAlives.  If you can only afford a handful of Apache processes do you really want each tied up by an idle client waiting for their user to click the next link?  Until your load spike subsides set it to something like how long it takes to deliver your pages to the average user.  3 seconds, not 30.  HTTP KeepAlives deserve an essay all of their own &#8211; maybe one day I&#8217;ll sit down and write it.  [<a href="http://mocko.org.uk/b/2011/01/23/http-keepalive-considered-harmful/">I did</a>]</li>
<li>Depending on the kind of content you&#8217;re serving you might even switch <em>KeepAlive</em> to &#8220;Off&#8221;.  If you&#8217;re only serving a one or two objects in the average request (i.e. the page getting hammered does not contain much CSS or images) KeepAlive costs you more under high load.  Think of this again if you shift content off to a CDN.</li>
</ol>
<p>For the time being resist the temptation to mess with your php.ini or any other interpreter-level settings.  They are complex and quick to anger.  You want the low-hanging fruit.</p>
<p>By now you should have a sane Apache config, one at least vaguely suited to your hardware.  Start the service up again&#8230;</p>
<pre># Ubuntu/Debian
root@my.slashdotted.machine:~$ /etc/init.d/apache2 start

# RedHat/CentOS/Suse
root@my.slashdotted.machine:~$ /etc/init.d/httpd start
</pre>
<p>If you made a mistake in the config Apache should tell you here. But probably you&#8217;re fine and Apache will go on its merry way.</p>
<p>So now you have a webserver where:</p>
<ul>
<li>Fewer clients can be connected at once, which means fewer of those heavyweight Apache processes will be competing for memory at any one time.  Those processes which do exist now run a lot faster.</li>
<li>Clients are not permitted to stay on the line for ages after you&#8217;ve delivered their web page.  If <em>KeepAlive</em> is still on they get cut off after <em>KeepAliveTimeout</em> seconds; if you disabled it entirely they get one object per connection and the process is immediately free to serve another user.</li>
</ul>
<p>Run `top` and keep an eye on those load figures.  Are they going up or down?  Is your website responsive again?</p>
<h3>What about the database?</h3>
<p>Of course, there might be some underlying reason why your Apache processes were backing up like the holding pattern above Heathrow.   Maybe it was browsers holding open persistent connections forever (which you just stopped) or maybe it&#8217;s something else.  Maybe your code running inside all those Apache processes is waiting to use some shared resource on the system, something that&#8217;s dog-slow and causes each process to pause until it&#8217;s available.</p>
<p>People have described <a href="http://www.gautamlakum.com/mysql-tuning-getting-the-most-out-of-your-database/">optimising MySQL</a> far better than I can in this article but here&#8217;s a few tips:</p>
<ul>
<li>Allocate an amount of RAM (mainly key_buffer_size and innodb_buffer_pool_size in my.cnf) appropriate for your server.  The defaults are measly; allowing MySQL to hold more data in memory can be a big win.</li>
<li>Workloads vary so there are no hard-and-fast rules</li>
<li>Use `show processlist` to look for running queries</li>
<li>The query cache rarely helps &#8211; writes to a table invalidate it</li>
<li>Use the <a href="http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html">slow query log</a> to identify queries taking a long time to run</li>
<li>Slow queries can often be sped up by <a href="http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm">adding an index</a> to the appropriate columns</li>
<li>Use the smallest data type available for each column.  Unsigned integers where appropriate.  The smaller you make your table the more of it will fit in RAM.</li>
</ul>
<p>I could go on.</p>
<p>The single biggest thing you can do to solve database issues is <em>hit the database less</em>.  See section 5 for suggestions on caching with common web applications.</p>
<h2><span style="font-family: monospace;"><span style="white-space: pre;">4) Reducing your Bandwidth<br />
</span></span></h2>
<p>So it turns our your server is connected to the Internet via a piece of wet string and you&#8217;re trying to push way more data than it can handle.  Did your ISP tell you it was on an &#8220;unlimited&#8221; 100Mbit connection?  Did they tell you how many users that 100Mbit is shared between?  Oops.</p>
<p>Or maybe you&#8217;re just terrified of the bandwidth bill.  Either way, while enduring a traffic spike it&#8217;s a good idea to <strong>reduce your network traffic as far as possible</strong>.  The benefits are not solely financial:</p>
<ul>
<li>Delivering less data to your client means they need be connected to your  host for a shorter time.  Think how long it takes to deliver a 300k  jpeg to the average DSL user &#8211; that&#8217;s going to take at least a couple of  seconds, time your valuable Apache process could be using to run the  code which generates your dynamic content &#8211; the only bit that <em>really</em> changes from user to user.</li>
<li>You want to deliver as few objects as possible per page impression.  The more you can shift to someone else&#8217;s server (or even eliminate entirely!) the better.  Get it down to the magic number of 1 and you can turn off KeepAlives and free up a lot of Apache processes.</li>
</ul>
<p>How to do this?  Simple answer: move static assets out to a <a href="http://en.wikipedia.org/wiki/Content_delivery_network">CDN</a>.</p>
<p>&#8220;But that&#8217;ll take ages!&#8221; you wail.  &#8221;I haven&#8217;t time to do a deal with Akamai or open an Amazon CloudFront account!&#8221;</p>
<p>Don&#8217;t worry, there are some very simple CDN&#8217;s out there.  <a href="http://www.coralcdn.org/">Coral Cache</a> is here to save your day.  <em>For free</em> these guys will cache static objects from your server and relay them to your visitors.  At times of low load the Coral Cache slows down your site (objects fall out of the cache and Coral must re-retrieve them for every hit) but when you&#8217;re sustaining a dozen hits per second that isn&#8217;t a problem.  Just remember to switch if off (or get an account with a <a href="http://aws.amazon.com/cloudfront/">proper CDN</a>) once the panic is over.</p>
<h3>Big stuff first</h3>
<p>You don&#8217;t have hours to spend out figuring out what to move.  Small objects (little user icons, spacer gifs, menu options) aren&#8217;t your problem &#8211; look at the pages seeing the highest traffic and figure out what the <em>largest</em> static objects are.  Probably they will be article images (e.g. that 150k jpeg of your mom) and maybe, if there&#8217;s a lot of it, your CSS and Javascript includes.  In almost all cases the body text of the page is the least of your worries.</p>
<p>Firefox will help  you figure out what the largest objects within a page are&#8230;</p>
<ol>
<li>Navigate to your page</li>
<li>Right-click for the context menu</li>
<li>Click &#8220;view page info&#8221;</li>
<li>Move to the &#8220;Media&#8221; tab.  You&#8217;ll see a table of objects loaded as parts of the page.</li>
<li>At the top-right hand corner you&#8217;ll see a button for selecting what columns the table should show.  Ensure &#8220;size&#8221; is checked.</li>
<li>Look at the sizes of objects included in your page.  Starting with the largest items ask yourself &#8220;does this really need to be generated by my server for each hit?&#8221;</li>
</ol>
<p>Of course, if your server&#8217;s <em>really</em> hosed loading the page will be hard.  You&#8217;ll just have to guess what the largest assets were.  Unless you&#8217;ve some big embedded media (videos, audio) it&#8217;s almost certainly the images.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" title="firefox-page-media-info.gif" src="http://mocko.org.uk/b/wp-content/uploads/2010/11/firefox-page-media-info.gif" border="0" alt="firefox-page-media-info.gif" width="496" height="196" /></p>
<p>Hope the nerds don&#8217;t mind me using their page about steam engine design as an example.  Maybe steam engine design will come back into the vogue and they&#8217;ll get slashdotted.</p>
<p>Immediately we can see the best candidates for moving off the server: those jpeg images add 131k per page view. If you have fifty hits a second that&#8217;s going to chew 6.4 megabytes of bandwidth every second.  Yowch.  I don&#8217;t wanna be the guy who pays your hosting bills!</p>
<p>Related: this is why big sites (eBay, Facebook etc) use a separate webserver for big static assets like images.  Delivering them takes much longer than the page&#8217;s dynamic content and can be done much more efficiently using <a href="http://wiki.nginx.org/Main">simpler types of webserver</a>.</p>
<h2>5) Advanced: Caching</h2>
<p>Probably the page getting hammered is being served using some third-party application you installed from the Internet.  Examples here are <a href="http://wordpress.org/">WordPress</a>, <a href="http://gallery.menalto.com/">Gallery</a>, <a href="http://drupal.org/">Drupal</a> and <a href="http://www.joomla.org/">Joomla</a>.</p>
<h3>Caching at the app level</h3>
<p>Bad news: in their default states these applications are rarely efficient.</p>
<p>Good news: for most of the common web applications someone else has already noticed the problem and written a plugin to fix it.  See if you can find a caching plugin that&#8217;ll store generated content and regurgitate it for future hits.  I did this for my WordPress installation and won at least 10x extra performance for a few seconds work.</p>
<p>I won&#8217;t attempt to list the caching plugins for every big web app but here are a few popular ones:</p>
<ul>
<li>WordPress: <a href="http://wordpress.org/extend/plugins/wp-cache/">WP-Cache</a></li>
<li>Drupal: <a href="http://drupal.org/project/cache">Cache</a></li>
<li>Joomla: <a href="http://www.theartofjoomla.com/joomla-caching-explained.html">System cache plugin</a></li>
<li>Gallery: built-in, just enable it</li>
</ul>
<h3>Caching at the PHP level</h3>
<p>Is the app you&#8217;re serving written in PHP?  There&#8217;s an easy win to be had by installing one of the code caches.  I favour <a href="http://xcache.lighttpd.net/">xcache</a> but it&#8217;s a matter of personal choice.</p>
<pre># Ubuntu/Debian
root@my.slashdotted.machine:~$ apt-get install php5-xcache
root@my.slashdotted.machine:~$ service apache2 restart

# RedHat/CentOS/Suse
root@my.slashdotted.machine:~$ yum install php-xcache
root@my.slashdotted.machine:~$ /etc/init.d/httpd restart
</pre>
<p>Tweak the settings if you like but in both cases the cache modules should give a big improvement straight out of the box.</p>
<p>What does it do?  Two things:</p>
<ol>
<li>By default for every hit to a dynamic page PHP will be loading the code from disk, interpreting it and then executing it.  A code cache skips the first two steps &#8211; once the code has been loaded and interpreted it&#8217;ll be stored in memory for later use.  Unless you&#8217;ve changed your code (by default the module calls stat() on the file to check) subsequent hits should mean a lot less work for PHP.</li>
<li>Provides a special area of memory shared between all processes serving your data.  If written to do so (look for a plugin) this can be used to cache generated page content and other commonly loaded data.</li>
</ol>
<h2>6) Conclusions</h2>
<p>If you&#8217;re running a stock install of any OS on minimal hardware as your webserver it&#8217;s common to run into problems under load.  There are plenty of simple, tried-and-tested techniques for reducing it &#8211; with a few minutes and a little knowledge of your server&#8217;s internals you can squeeze an awful lot more performance out of a simple machine before needing to buy more hardware.</p>
<p><img src="http://mock.icons.ljtoys.org.uk/mi/5254_custom.gif" border="0" alt="" width="1" height="1" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2011/01/02/how-to-survive-a-slashdotting-on-a-small-apache-server/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>National Rail Enquiries: License Application Refused; My App Still Dead</title>
		<link>http://mocko.org.uk/b/2010/12/02/national-rail-enquiries-license-application-refused-my-app-still-dead/</link>
		<comments>http://mocko.org.uk/b/2010/12/02/national-rail-enquiries-license-application-refused-my-app-still-dead/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 22:09:41 +0000</pubDate>
		<dc:creator>alexmock</dc:creator>
				<category><![CDATA[Open Data]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ATOC]]></category>
		<category><![CDATA[data.gov]]></category>
		<category><![CDATA[LDBWS]]></category>
		<category><![CDATA[Live Departure Boards]]></category>
		<category><![CDATA[National Rail Enquiries]]></category>

		<guid isPermaLink="false">http://mocko.org.uk/b/?p=367</guid>
		<description><![CDATA[Remember last month (1, 2, 3) where National Rail Enquiries ordered me to shut down my free train times web app and locked down their data feed so only people whom they grant a license key can query it? A &#8230; <a href="http://mocko.org.uk/b/2010/12/02/national-rail-enquiries-license-application-refused-my-app-still-dead/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Remember last month (<a href="http://mocko.org.uk/b/2010/10/29/national-rail-have-killed-my-train-times-app/">1</a>, <a href="http://mocko.org.uk/b/2010/11/02/national-rail-have-killed-my-uk-train-times-app-still-dead/">2</a>, <a href="http://mocko.org.uk/b/2010/11/04/national-rail-enquiries-feed-have-you-applied-for-a-license/">3</a>) where National Rail Enquiries ordered me to shut down my free train times web app and locked down their data feed so only people whom they grant a license key can query it?</p>
<p>A month later they still hadn&#8217;t gotten back about my license application &#8211; even though I&#8217;m aware of several web developers who <em>have</em> been offered licenses to use the data feeds for their free sites.  So I sent Derek Parlour a polite email prodding him about the lack of communication:</p>
<blockquote><p>Hi Derek,</p>
<p>Hope you&#8217;re well.  Has there been any progress on my           application for a           license?</p>
<p>Regards,<br />
Alex.</p></blockquote>
<p>Eight days later Derek replied to say they would not be licensing my use of this &#8220;open&#8221; data feed, and that <strong>this is solely due to the negative publicity caused by my posts about National Rail Enquiries greedy behaviour around its data feeds</strong>.</p>
<p>So much for free speech.  Even though NRE&#8217;s participant organisations (&amp; therefore NRE itself) are funded by passenger fares and government subsidy if you criticize them you get punished: they won&#8217;t let you use the feed of UK train information.</p>
<p>Fortunately National Rail Enquiries are obliged by their <a href="http://www.atoc.org/clientfiles/File/NRE/NRE_COP.pdf">code of practice</a> to give a timely, written response containing their reasons for denying my website a license.  Unfortunately the person I have to appeal to is Chris Scoggins, Chief Executive of National Rail Enquiries &#8211; the very man who took umbrage last month when I quoted the three lines of the email where NRE said my free application was likely to face a license fee.</p>
<p>Here&#8217;s my appeal to Chris Scoggins in full:</p>
<p><span id="more-367"></span></p>
<blockquote><p>Thursday 2nd December</p>
<p>Dear Chris,</p>
<p>We spoke via email a month ago about NRE&#8217;s decision to close their “open” data feeds of train times and provide data on train times only to entities for whom NRE choose to grant a license.</p>
<p>On October 27th I applied to your colleague Derek Parlour for a license to use the service.  As you know he responded somewhat negatively but did not answer my request for a license.</p>
<p>On November 22nd – almost a month later – I emailed Derek again asking whether there had been any progress.  After a a pause of 8 days Derek replied: he said clearly that:</p>
<ul>
<li>NRE have a responsibility to its shareholders and licensees are required to work with it to “promote the industry”</li>
<li>I have made a number of public comments which make him think I will not work with NRE in its aims.</li>
</ul>
<p>No doubt Derek is referring to the blog posts I made after he insisted I shut down my free, public train times application and the subsequent media coverage when you emailed me what looked like a veiled threat for quoting three lines of Derek&#8217;s email.</p>
<p>Derek did not supply any other reasons in his email – thus he&#8217;s stated quite clearly that you&#8217;re refusing the license because I made comments critical of your organisation and not on any technical or other practical grounds.</p>
<p>I responded to Derek asking him to clarify what these “aims” are; while he replied to this email he neglected to answer the question.  As we can see from previous communications Derek seems to have problems answering a lot of simple questions.  May I ask why he is so circumspect in answering simple queries from a member of the public?  Since they form a part of the refusal I do now have a right to know what these aims are.</p>
<p>NRE&#8217;s denial of a license seems extremely childish.  It smacks of a punishment for speaking out publicly about your organisation&#8217;s intention to charge free application developers for train time information.  Is it in fact the case that “promoting the industry” means licensees are not permitted any freedom of speech about NRE and its conduct, and that those who publicly criticize you will be denied access to the data feeds?</p>
<p>As per the Code of Practice NRE must follow regarding its real-time information systems I would like to appeal this decision.  I understand that such appeals should be addressed in writing to you.  You are obliged to give me a “fair and impartial” written response explaining the decision “with full reasons” and that if I am not satisfied with this I can escalate it to the board of National Rail Enquiries, and presumably thence to the Office of Rail Regulation and my MP.</p>
<p>I look forward to your fair and impartial response.</p>
<p>Yours Sincerely,</p>
<p>Mr A. Hewson</p></blockquote>
<p>I am truly fascinated to see how they respond.  More flannel?  Legal threats for exposing their shady practices?  Let&#8217;s wait and see.<br />
<img src="http://icons.mocko.org.uk/mi/5243_custom.gif" border="0" alt="" width="1" height="1" /></p>
<p><strong><em>Edit: &#8220;Your item with reference  AH209917311GB was delivered from our WEST CENTRAL LONDON Delivery Office on 06/12/10.&#8221;.  No response yet as of 2011-01-02.<br />
</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://mocko.org.uk/b/2010/12/02/national-rail-enquiries-license-application-refused-my-app-still-dead/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

