<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="http://tomholland.me.uk/feed.xml" rel="self" type="application/rss+xml"/><title>Tom Holland's blog</title><link>http://tomholland.me.uk/</link><description>Blog of Tom Holland, a freelance developer in Kingston upon Hull, UK</description><language>en-gb</language><lastBuildDate>Tue, 24 Jan 2012 11:16:26 +0000</lastBuildDate><item><title>FacebookNewspaperAppArticleLinkBreakout</title><link>http://tomholland.me.uk/blog/2012/01/FacebookNewspaperAppArticleLinkBreakout/260</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2012/01/FacebookNewspaperAppArticleLinkBreakout/260</guid><pubDate>Tue, 24 Jan 2012 11:16:26 +0000</pubDate><description>&lt;p&gt;I was tired of clicking on a link to a newspaper article in my Facebook timeline that a friend had read, and then being prompted to add the app - with no option to just read the original article (perhaps for if I didn't want to add the app?). Sure, I could search for the article by its title, but that seemed a little too manual.&lt;/p&gt;&lt;p&gt;I was only really interested in the articles from The Guardian, so I made a Safari extension (&lt;a href="http://tomholland.me.uk/downloadables/FacebookNewspaperAppArticleLinkBreakout.safariextz.zip"&gt;FacebookNewspaperAppArticleLinkBreakout&lt;/a&gt;) that alters the links to these articles so that they are standard links again - no more annoying requests to add the app getting in the way.&lt;/p&gt;&lt;p&gt;It may later support articles from The Independent, if my Facebook friends post any interesting articles from it (the workaround requires that the original article URL be part of the link, which not all the newspapers' implementations seem to do).&lt;/p&gt;&lt;p&gt;The code the extension applies is:&lt;/p&gt;&lt;code&gt;&#13;
setInterval(function() {&lt;br /&gt;&#13;
&lt;span class="tab"&gt; var links = document.getElementsByTagName('a');&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; for (i = 0; i &amp;lt; links.length; i++) {&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; if (links[i].href.match(/^http\:\/\/www\.guardian\.co\.uk\//) &amp;amp;&amp;amp; links[i].href.match(/\?/)) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; links[i].href = links[i].href.substring(0, links[i].href.indexOf('?'))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; links[i].target = '_blank';&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; links[i].onmousedown = function() {};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; }&lt;/span&gt;&lt;br /&gt;&#13;
}, 1000);&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;This is only applied to pages on Facebook.&lt;/p&gt;&lt;p&gt;setInterval is used because additional newsfeed content can be loaded dynamically.&lt;/p&gt;</description></item><item><title>Internet Explorer / IE ignoring certain CSS when printing</title><link>http://tomholland.me.uk/blog/2011/08/Internet-Explorer-IE-ignoring-certain-CSS-when-printing/259</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2011/08/Internet-Explorer-IE-ignoring-certain-CSS-when-printing/259</guid><pubDate>Thu, 18 Aug 2011 18:14:18 +0100</pubDate><description>&lt;p&gt;Is Internet Explorer 7 or 8 ignoring (some) CSS rules when printing or generating a print preview (but the page displays fine in the browser)? Are you using HTML5 by any chance? Are the rules being ignored those that use the new HTML5 tags in their selectors? Congratulations, you've found another bug in IE 7 &amp;amp; 8 (it looks to of been fixed in IE 9).&lt;/p&gt;&lt;p&gt;Yes, even if you've used the document.createElement('tagname'); JS fix to allow you to apply styles to the new HTML5 tags in IE, this is a different issue - which specifically affects printing or generating a print preview.&lt;/p&gt;&lt;p&gt;So, to fixes. There is the &lt;a href="http://code.google.com/p/ie-print-protector/"&gt;IE Print Protector&lt;/a&gt; for printing HTML5 pages in Internet Explorer (pre v9). This JS library replaces the new HTML5 tags with existing tags (such as divs) when the page is printed and applies the same styles to them.&lt;/p&gt;&lt;p&gt;This isn't the only solution however. The new HTML5 tags do not have to be replaced with other tags - they just have to have the CSS rules (re)applied directly to them through JS. You could hard-code these into a JS file - or you could write some JS which reads the CSS rules and (if their selectors use the new HTML5 tags) applies the same rules directly to the relevant elements.&lt;/p&gt;&lt;p&gt;Here is an example (that uses the &lt;a href="http://prototypejs.org/"&gt;Prototype 1.7 JS library&lt;/a&gt;) which handles the header, nav and footer tags (but could easily be expanded for other tags):&lt;/p&gt;&lt;code&gt;&#13;
document.observe('dom:loaded', function() {&lt;br /&gt;&#13;
&lt;span class="tab"&gt; if (Prototype.Browser.IE &amp;amp;&amp;amp; // oh how I loathe thee..&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; (navigator.userAgent.match(/MSIE 7/) || navigator.userAgent.match(/MSIE 8/))) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; /* this compensates for IE 7 &amp;amp; 8 not applying the styles of CSS selectors&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; which use the new HTML5 tags - but only when printing a page! */&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; var cssSelectorsAndRules = new Array();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; for (var i = 0; i &amp;lt; document.styleSheets.length; i++) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; /* this is the IE 'processed' version of the original content (no comments, individually&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; separated-out selectors (and duplicated 'shared' rules), all rules on a single line for&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; a selector, etc.) */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; var lines = document.styleSheets[i].cssText.split(&amp;quot;\n&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; var html5TagSelector = '';&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; var rulesStr = '';&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; for (var lineNum = 0; lineNum &amp;lt; lines.length; lineNum++) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; if (lines[lineNum].match(/\{/) &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; lines[lineNum].match(/(?:(?:header)|(?:nav)|(?:footer))/)) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; // HTML5 tag selector line&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; html5TagSelector = lines[lineNum].sub(/\{/, '').strip().toLowerCase();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; } else if (!html5TagSelector.empty()) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; if (!lines[lineNum].match(/\}/)) rulesStr = lines[lineNum].strip().toLowerCase();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; else { // end of rules for a HTML5 tag selector&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; cssSelectorsAndRules.push(new Array(html5TagSelector, rulesStr));&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; html5TagSelector = '';&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; /* because of a bug in Prototype 1.7 in IE 7 we can't rely on CSS selectors which&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; use the new HTML5 tags, so we add an id attribute to the tags of the same name */&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; if (navigator.userAgent.match(/MSIE 7/)) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; $$('body')[0].descendants().each(function(element) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; if (element.tagName == 'header') element.writeAttribute('id', 'header');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; else if (element.tagName == 'nav') element.writeAttribute('id', 'nav');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; else if (element.tagName == 'footer') element.writeAttribute('id', 'footer');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; cssSelectorsAndRules.each(function(cssSelectorAndRules) {&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; var selector = cssSelectorAndRules[0];&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; // change to id instead of tag selector to match the altered markup&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; if (navigator.userAgent.match(/MSIE 7/)) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; selector = selector.replace(/((?:header)|(?:nav)|(?:footer))/, '#$1');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; $$(selector).each(function(element) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; var styles = {};&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; var rulesArray = cssSelectorAndRules[1].split(';'); // index 1 is the rules&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; rulesArray.each(function(ruleStr) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; var ruleParts = ruleStr.split(':');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; styles[ruleParts[0].strip().camelize()] = ruleParts[1].strip();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; element.setStyle(styles);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; &lt;span class="tab"&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; &lt;span class="tab"&gt; });&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;span class="tab"&gt; }&lt;/span&gt;&lt;br /&gt;&#13;
});&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;Unfortunately, due to a bug in Prototype 1.7 in IE 7 (&lt;a href="http://groups.google.com/group/prototype-scriptaculous/browse_thread/thread/b000de9d6697ec46?pli=1"&gt;due to be fixed in v1.7.0.1 apparently&lt;/a&gt;), we have to employ an additional measure for IE 7 - adding an id to the HTML5 tags, that we then use to apply the CSS rules. In this example, it adds an id of &amp;quot;header&amp;quot; to the header tag, an id of &amp;quot;nav&amp;quot; to the nav tag, and so forth. Obviously this is not ideal and may potentially conflict - so this may need to be tweaked, depending on your setup. Prototype 1.7.0.1 doesn't seem to have an official release date has yet (&amp;quot;soon-ish&amp;quot; was mention back in July). Alternatively, if you're using a locally hosted copy of the Prototype 1.7 library, you can try patching your local version with &lt;a href="http://groups.google.com/group/prototype-scriptaculous/browse_thread/thread/b000de9d6697ec46?pli=1"&gt;this proposed fix&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Android bitmap image / graphic reporting incorrect / wrong pixel size / dimensions</title><link>http://tomholland.me.uk/blog/2011/08/Android-bitmap-image-graphic-reporting-incorrect-wrong-pixel-size-dimensions/258</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2011/08/Android-bitmap-image-graphic-reporting-incorrect-wrong-pixel-size-dimensions/258</guid><pubDate>Sun, 14 Aug 2011 18:20:17 +0100</pubDate><description>&lt;p&gt;Is a bitmap image / graphic you've loaded in your Android code reporting its dimensions different from what you know it really is - even though all you've done with it is BitmapFactory.decodeResource?&lt;/p&gt;&lt;p&gt;Did you put your image in the drawable directory? (thinking drawable-hdpi, drawable-mdpi and drawable-ldpi were for different resolution graphics - but 'drawable' has no dpi reference in the name, so why would items loaded from here have any resolution specific measures applied?)&lt;/p&gt;&lt;p&gt;Well you (and I) were wrong. Images loaded from the drawable directory are automatically resized, depending on the resolution you're working in - not always what you want (nor would expect when there are other drawable directories which explicitly reference different dpi levels).&lt;/p&gt;&lt;p&gt;To prevent this, create a new directory called 'drawable-nodpi' (at the same level as the drawable directory) and move your images / graphics into there. You still use the same R.drawable.whatever to reference them - but they won't have any automatic scaling applied.&lt;/p&gt;&lt;p&gt;If Eclipse gives you any trouble, use Project &amp;gt; Clean... (which seems to rescan the drawable directories).&lt;/p&gt;</description></item><item><title>Writing a CUPS filter for Mac OS X Snow Leopard (Mac OS v10.6)</title><link>http://tomholland.me.uk/blog/2011/03/Writing-a-CUPS-filter-for-Mac-OS-X-Snow-Leopard-Mac-OS-v10.6/257</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2011/03/Writing-a-CUPS-filter-for-Mac-OS-X-Snow-Leopard-Mac-OS-v10.6/257</guid><pubDate>Sun, 20 Mar 2011 17:29:23 +0000</pubDate><description>&lt;p&gt;I wanted to be able to save a PDF version of anything I printed automatically - without having to manually generate the PDF as a separate action, or needing to send the documents to print twice - once to a physical printer, then to a virtual printer.&lt;/p&gt;&lt;p&gt;My solution was to dig into the &lt;a href="http://www.cups.org/"&gt;CUPS (Common UNIX Printing System)&lt;/a&gt; components in Mac OS X. CUPS uses a series of filters (command line programs) to convert a document from its original content into a PostScript file for sending to the printer (assuming a PostScript printer that is).&lt;/p&gt;&lt;p&gt;By working with configuration files, it is possible to insert an additional filter step (my own program) into the standard filter chain - giving me access to the PostScript content before it is sent to the printer (from which a PDF can then be easily generated by calling existing command line programs).&lt;/p&gt;&lt;p&gt;The first stage is to add an entry to the filters pipeline.&lt;/p&gt;&lt;p&gt;If you inspect the contents of:&lt;/p&gt;&lt;code&gt;&#13;
/usr/share/cups/mime/&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;There are 4 files:&lt;/p&gt;&lt;code&gt;&#13;
apple.convs&lt;br /&gt;&#13;
apple.types&lt;br /&gt;&#13;
mime.convs&lt;br /&gt;&#13;
mime.types&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;It's worth reading the contents of these (especially the comments) - but we're not going to edit these files. Some things worth noting are:&lt;/p&gt;&lt;p&gt;From /usr/share/cups/mime/mime.convs&lt;/p&gt;&lt;blockquote&gt;&#13;
#   DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW&lt;br /&gt;&#13;
#   VERSIONS OF CUPS.  Instead, create a &amp;quot;local.convs&amp;quot; file that&lt;br /&gt;&#13;
#   reflects your local configuration changes.&lt;br /&gt;&#13;
&lt;/blockquote&gt;&lt;blockquote&gt;&#13;
# Format of Lines:&lt;br /&gt;&#13;
#&lt;br /&gt;&#13;
#   source/type destination/type cost filter&lt;br /&gt;&#13;
&lt;/blockquote&gt;&lt;blockquote&gt;&#13;
#   All filters *must* accept the standard command-line arguments&lt;br /&gt;&#13;
#   (job-id, user, title, copies, options, [filename or stdin]) to&lt;br /&gt;&#13;
#   work with CUPS.&lt;br /&gt;&#13;
&lt;/blockquote&gt;&lt;p&gt;From /usr/share/cups/mime/apple.convs&lt;/p&gt;&lt;blockquote&gt;&#13;
#   The &amp;quot;cost&amp;quot; field must be less than the value for the same entry&lt;br /&gt;&#13;
#   in mime.convs so that these filters replaces the ones defined&lt;br /&gt;&#13;
#   in that file.&lt;br /&gt;&#13;
&lt;/blockquote&gt;&lt;p&gt;So, based on this, we will create 2 new files in the same directory:&lt;/p&gt;&lt;code&gt;&#13;
sudo touch /usr/share/cups/mime/local.convs&lt;br /&gt;&#13;
sudo touch /usr/share/cups/mime/local.types&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;The contents of /usr/share/cups/mime/local.convs should be:&lt;/p&gt;&lt;code&gt;&#13;
application/postscript&lt;span class="tab"&gt; application/foo&lt;span class="tab"&gt; 1&lt;span class="tab"&gt; bar&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
application/foo&lt;span class="tab"&gt; application/vnd.cups-postscript&lt;span class="tab"&gt; 1&lt;span class="tab"&gt; pstops&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;The contents of /usr/share/cups/mime/local.types should be:&lt;/p&gt;&lt;code&gt;&#13;
application/foo&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;We're introducing a new mime type locally and we're replicating the application/postscript to application/vnd.cups-postscript conversion with 2 steps, both of which have a lower 'cost'; the option we're 'replacing' is the following line from /usr/share/cups/mime/mime.convs&lt;/p&gt;&lt;blockquote&gt;&#13;
application/postscript&lt;span class="tab"&gt; &lt;span class="tab"&gt; application/vnd.cups-postscript&lt;span class="tab"&gt; 66&lt;span class="tab"&gt; pstops&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&#13;
&lt;/blockquote&gt;&lt;p&gt;Note that we're using the same program to handle the conversion (pstops), but that our combined 'cost' is not a realistic one - it's deliberately lower so that our filter(s) will be picked; we're not altering any of the existing configuration files (there is no need to comment things out).&lt;/p&gt;&lt;p&gt;The second stage is to add the filter program itself.&lt;/p&gt;&lt;p&gt;Here is an example written in PHP (but intended to be run as a command line program):&lt;/p&gt;&lt;code&gt;&#13;
#!/usr/bin/php&lt;br /&gt;&#13;
&amp;lt;?php&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
$arguments = array();&lt;br /&gt;&#13;
$arguments['job'] = $_SERVER['argv'][1]; // $_SERVER['argv'][0] is the program path&lt;br /&gt;&#13;
$arguments['user'] = $_SERVER['argv'][2];&lt;br /&gt;&#13;
$arguments['title'] = $_SERVER['argv'][3];&lt;br /&gt;&#13;
$arguments['copies'] = $_SERVER['argv'][4];&lt;br /&gt;&#13;
$arguments['options'] = $_SERVER['argv'][5];&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
if (count($_SERVER['argv']) == 7) {&lt;br /&gt;&#13;
&lt;span class="tab"&gt; $postscript = file_get_contents($_SERVER['argv'][6]);&lt;/span&gt;&lt;br /&gt;&#13;
} else {&lt;br /&gt;&#13;
&lt;span class="tab"&gt; $postscript = stream_get_contents(STDIN);&lt;/span&gt;&lt;br /&gt;&#13;
}&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
/*&lt;br /&gt;&#13;
Here you could:&lt;br /&gt;&#13;
- write the arguments to a file&lt;br /&gt;&#13;
- write the PostScript content to a file&lt;br /&gt;&#13;
- call the pstopdf program (passing the PostScript file path) to generate a PDF file from the PostScript file (it will be generated in the same directory that the passed PostScript file resides in)&lt;br /&gt;&#13;
- modify the PostScript before it is passed to the next filter (if you know what you're doing - watch out for errors!)&lt;br /&gt;&#13;
*/&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
echo $postscript; // for passing on to the next filter&lt;br /&gt;&#13;
exit;&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;The filter programs reside in:&lt;/p&gt;&lt;code&gt;&#13;
/usr/libexec/cups/filter/&lt;br /&gt;&#13;
&lt;/code&gt;&lt;p&gt;Following the example, this file would be saved as simply 'bar' (it does &lt;strong&gt;not&lt;/strong&gt; have a .php extension). It's important to note that your program should have the same owner, group and permissions as the other filters in the directory; if you're using a symlink, both the symlink and the program it references must have these same owner, group and permissions as well. Otherwise you will receive errors when try to print (&amp;quot;The printer software was installed incorrectly. Please reinstall the printer's software or contact the manufacturer for assistance.&amp;quot;) and the cups error_log (at /private/var/cups/error_log - use the Console app) will report something similar to:&lt;/p&gt;&lt;blockquote&gt;&#13;
Unable to execute /usr/libexec/cups/filter/bar: insecure file permissions (0100755)&lt;br /&gt;&#13;
Unable to start filter &amp;quot;bar&amp;quot; - Operation not permitted.&lt;br /&gt;&#13;
Stopping job because the scheduler could not execute a filter.&lt;br /&gt;&#13;
&lt;/blockquote&gt;</description></item><item><title>MailChimp API sending with us-ascii charset instead of UTF-8?</title><link>http://tomholland.me.uk/blog/2011/02/MailChimp-API-sending-with-us-ascii-charset-instead-of-UTF-8/256</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2011/02/MailChimp-API-sending-with-us-ascii-charset-instead-of-UTF-8/256</guid><pubDate>Sat, 19 Feb 2011 14:40:50 +0000</pubDate><description>&lt;p&gt;If you're using the MailChimp API to create campaigns with fully custom HTML &amp;amp; text versions and you're working in UTF-8 - but the emails come through with a charset of us-ascii instead of UTF-8, try adding a &lt;a href="http://en.wikipedia.org/wiki/Byte_order_mark" title="Wikipedia: Byte order mark"&gt;BOM&lt;/a&gt; to the content being supplied in the API call.&lt;/p&gt;</description></item><item><title>NV21 / YUV to greyscale (or grayscale) conversion for Android camera preview</title><link>http://tomholland.me.uk/blog/2010/11/NV21-YUV-to-greyscale-or-grayscale-conversion-for-Android-camera-preview/254</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2010/11/NV21-YUV-to-greyscale-or-grayscale-conversion-for-Android-camera-preview/254</guid><pubDate>Tue, 23 Nov 2010 18:47:43 +0000</pubDate><description>&lt;p&gt;This was very helpful (and took a while to find): &lt;a href="http://code.google.com/p/android/issues/detail?id=823#c4"&gt;NV21 / YUV to greyscale (or grayscale) conversion for Android&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;If you only need grayscale information, the first (width * height) bytes of the preview are provided as unsigned byte intensities.&lt;/blockquote&gt;&lt;p&gt;If you call print on the byte array entries directly the values are incorrect (they are presumed to represent signed integers); you'll need to convert each byte value to an unsigned integer yourself:&lt;/p&gt;&lt;code&gt;int value = (int) _data[i] &amp;amp; 0xFF;&lt;/code&gt;&lt;p&gt;(this may not be the most optimal way, but it seems to work).&lt;/p&gt;&lt;p&gt;The specifics of the format are detailed at &lt;a href="http://www.fourcc.org/yuv.php#NV21"&gt;YUV pixel formats at FOURCC.org&lt;/a&gt; (you'll need to read the &lt;a href="http://www.fourcc.org/yuv.php#NV12"&gt;NV12 entry&lt;/a&gt; as well) but these didn't make sense until I had read the post in the first link.&lt;/p&gt;</description></item><item><title>Mac BBC iPlayer Desktop no window problem</title><link>http://tomholland.me.uk/blog/2010/10/Mac-BBC-iPlayer-Desktop-no-window-problem/252</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2010/10/Mac-BBC-iPlayer-Desktop-no-window-problem/252</guid><pubDate>Fri, 15 Oct 2010 15:54:47 +0100</pubDate><description>&lt;p&gt;Every so often, when I open the BBC iPlayer Desktop program on my Mac, no window appears. Restarting the program has no effect. The official suggestion is to remove the program and its associated files to perform a reinstall - which works - but this means losing my existing downloads.&lt;/p&gt;&lt;p&gt;Instead of deleting the program and all associated files, if I quit the BBC iPlayer Desktop program and simply move this file out of its folder:&lt;/p&gt;&lt;code&gt;/Users/&amp;lt;name&amp;gt;/Library/Application Support/Adobe/AIR/ELS/BBCiPlayerDesktop.blah/PrivateEncryptedDatai&lt;/code&gt;&lt;p&gt;The program then creates this file again on relaunch. Initially, existing downloads say &amp;quot;License Pending&amp;quot; (and the videos cannot be watched), but with an active Internet connection, these then change back to their original expiry date and the videos will play.&lt;/p&gt;</description></item><item><title>Playing with Gumtree scammers</title><link>http://tomholland.me.uk/blog/2010/08/Playing-with-Gumtree-scammers/249</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2010/08/Playing-with-Gumtree-scammers/249</guid><pubDate>Fri, 27 Aug 2010 12:56:37 +0100</pubDate><description>&lt;p&gt;My original (genuine!) Gumtree advert:&lt;/p&gt;&lt;blockquote&gt;I'm a 28 year old postgraduate student moving to St. Andrews in the next few weeks. I'm looking for a flat to rent for a year, either in St. Andrews or close by with suitable transport links (i.e. bus or within reasonable cycling distance).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
My budget is £500 p.c.m.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I'm a non-smoker with no pets. Quiet &amp;amp; tidy, just wanting somewhere I can live while I finish my Ph.D.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I'm not really looking to share (I'm the shy, quiet type).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Internet connection (or an ability for me to add one) is a must (BT phone connection would suffice).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
References available.&lt;/blockquote&gt;&lt;p&gt;A suspicious response arrives:&lt;/p&gt;&lt;blockquote&gt;On 18 Aug 2010, at 14:39, ramondkelly223@gmail.com wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Hello&lt;br /&gt;&#13;
How are you doing?i saw your post and i have the perfect apartment for you which is fully furnished at location of your choice (St. Andrews, Edinburgh ) and it's a one bedroom apartment,the monthly rent is £500.&lt;br /&gt;&#13;
let me know if you're interested&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards.&lt;/blockquote&gt;&lt;p&gt;It may yet be a valid (but poorly written) response; more information is requested but in colloquial manner befitting the response:&lt;/p&gt;&lt;blockquote&gt;On 18 Aug 2010, at 14:43, Tom Holland wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Wow, that sounds perfect. How do we proceed?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards.&lt;/blockquote&gt;&lt;p&gt;Suddenly ramondkelly223@gmail.com is no more; it's AlertPay &amp;lt;alertpaynotifier@consultant.com&amp;gt; now. How odd.&lt;br /&gt;&#13;
The property was meant to be in or near St. Andrews, but it's actually in Frederick Street, Edinburgh EH2 1EX?&lt;br /&gt;&#13;
Presuming &amp;quot;Newcastle&amp;quot; refers to Newcastle Upon Tyne (UK), it's an hour and a half by direct train to Edinburgh?&lt;br /&gt;&#13;
We have states in the UK?&lt;br /&gt;&#13;
For a 1 bedroom apartment, it has a rather large sitting room and quite a few seats. And a family sized kitchen?&lt;br /&gt;&#13;
The security deposit is less than 1 month's rent?&lt;br /&gt;&#13;
Who rents an apartment with a hairdryer? It sounds more like a hotel room...&lt;/p&gt;&lt;blockquote&gt;On 18 Aug 2010, at 15:58, AlertPay wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
It was nice reading from you.&lt;br /&gt;&#13;
I work as an Engineer,currently supervising the building construction&lt;br /&gt;&#13;
of an hotel in outside the state which would be finishing soon before&lt;br /&gt;&#13;
i leave for Newcastle where i start my new job.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
For this reason,i wont be living in the apartment,i only inherited it&lt;br /&gt;&#13;
and haven't lived in it for too long.it's a One bedroom apartment and&lt;br /&gt;&#13;
it is located at Frederick Street, Edinburgh EH2 1EX...It is available&lt;br /&gt;&#13;
for both short and long tern rent the monthly rent is £500  while&lt;br /&gt;&#13;
security refundable deposit is £400 if nothing got damage in the&lt;br /&gt;&#13;
apartment(The deposit will be refund back to you two days before your&lt;br /&gt;&#13;
tenancy expires).I wouldn't like to leave it dirty and unkept so i&lt;br /&gt;&#13;
need clean and responsible tenant.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Apartment amenities include. CentralHeating,Refrigerator,Ironing&lt;br /&gt;&#13;
Board,Good wireless internet Connection,Washing&lt;br /&gt;&#13;
machine,Dishwasher,Microwave Oven,Television with Built-in DVD&lt;br /&gt;&#13;
Player,Coffee Maker,Double Sofa bed in Sitting Room,Dining&lt;br /&gt;&#13;
Area,Hairdryer just to mention a few.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
As regards the viewing,i think we could fix a date i come&lt;br /&gt;&#13;
down for the viewing and we reach an agreement.Have been very busy&lt;br /&gt;&#13;
with work lately so its hard for me to spare time,i would like to be&lt;br /&gt;&#13;
more certain about your intentions before booking my plane tickets&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
for this.I would be staying in Newcastle for more than 4 years so its&lt;br /&gt;&#13;
up to you to decide how long you want the apartment for.&lt;br /&gt;&#13;
Please let me know what are the things you have in mind...how many&lt;br /&gt;&#13;
people would be occupying the apartment and for how long you want the&lt;br /&gt;&#13;
contract to last for.Also let me know when you intend to move in and&lt;br /&gt;&#13;
more other details you feel necessary for me to know.Whereabouts do&lt;br /&gt;&#13;
you live in currently?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Hope to read from you...&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
*The attached images:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;img src="http://tomholland.me.uk/blogimages/234B2D74-31B7-2BF4-30B0-8E2D361D482A.jpg" alt="" style="height: 300px;" /&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;img src="http://tomholland.me.uk/blogimages/7649697C-43A8-D96C-3756-942B2EDA4F18.jpg" alt="" style="height: 426px;" /&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;img src="http://tomholland.me.uk/blogimages/5AC7F01A-4583-6BDC-952D-6FD9F491840F.jpg" alt="" style="height: 300px;" /&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&lt;img src="http://tomholland.me.uk/blogimages/8A1E7FE2-DFC6-1CC3-A175-B1FB4C8CCA63.jpg" alt="" style="height: 480px;" /&gt;&lt;/blockquote&gt;&lt;p&gt;Something smells fishy. We need a cat (perhaps several) on this to locate the fishy source:&lt;/p&gt;&lt;blockquote&gt;On 18 Aug 2010, at 19:08, Tom Holland wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
The computer thinks you're called &amp;quot;AlertPay&amp;quot; now for some reason - not sure why. It might be something I've done - I'm not good with these things.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; It was nice reading from you.&lt;br /&gt;&#13;
&amp;gt; I work as an Engineer,currently supervising the building construction&lt;br /&gt;&#13;
&amp;gt; of an hotel in outside the state which would be finishing soon before&lt;br /&gt;&#13;
&amp;gt; i leave for Newcastle where i start my new job.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Which state are you in at the moment? Is that Newcastle Upon Tyne UK? I lived there for 3 years.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; For this reason,i wont be living in the apartment,i only inherited it&lt;br /&gt;&#13;
&amp;gt; and haven't lived in it for too long.it's a One bedroom apartment and&lt;br /&gt;&#13;
&amp;gt; it is located at Frederick Street, Edinburgh EH2 1EX...&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
This isn't quite St. Andrews or nearby - it looks like quite a few miles away; 49 or so to be exact.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; It is available for both short and long tern rent the monthly rent is £500  while&lt;br /&gt;&#13;
&amp;gt; security refundable deposit is £400 if nothing got damage in the&lt;br /&gt;&#13;
&amp;gt; apartment(The deposit will be refund back to you two days before your&lt;br /&gt;&#13;
&amp;gt; tenancy expires).I wouldn't like to leave it dirty and unkept so i&lt;br /&gt;&#13;
&amp;gt; need clean and responsible tenant.&lt;br /&gt;&#13;
&amp;gt; &lt;br /&gt;&#13;
&amp;gt; Apartment amenities include. CentralHeating,Refrigerator,Ironing&lt;br /&gt;&#13;
&amp;gt; Board,Good wireless internet Connection,Washing&lt;br /&gt;&#13;
&amp;gt; machine,Dishwasher,Microwave Oven,Television with Built-in DVD&lt;br /&gt;&#13;
&amp;gt; Player,Coffee Maker,Double Sofa bed in Sitting Room,Dining&lt;br /&gt;&#13;
&amp;gt; Area,Hairdryer just to mention a few.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Would the cost of the internet Connection included in the rent?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; As regards the viewing,i think we could fix a date i come&lt;br /&gt;&#13;
&amp;gt; down for the viewing and we reach an agreement.Have been very busy&lt;br /&gt;&#13;
&amp;gt; with work lately so its hard for me to spare time,i would like to be&lt;br /&gt;&#13;
&amp;gt; more certain about your intentions before booking my plane tickets&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Where abouts are you flying from?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; for this.I would be staying in Newcastle for more than 4 years so its&lt;br /&gt;&#13;
&amp;gt; up to you to decide how long you want the apartment for.&lt;br /&gt;&#13;
&amp;gt; Please let me know what are the things you have in mind...how many people would be occupying the apartment&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
There would be just me for now.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; for how long you want the contract to last for&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I only needed somewhere to live for a year.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; Also let me know when you intend to move in&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I was looking to move next week if possible.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; and more other details you feel necessary for me to know.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I quite fancy a cat. Are you a cat person? Would you permit a cat? Is there an upper limit on the number of cats you would permit?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; Whereabouts do you live in currently?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I'm in Kingston upon Hull at the moment. Are you familiar with it?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards.&lt;/blockquote&gt;&lt;p&gt;A reply, but my questions go unanswered; Mr. AlertPay seems more concerned that I can afford to pay (&amp;quot;ABILITY TO PAY&amp;quot;!).&lt;/p&gt;&lt;blockquote&gt;On 18 Aug 2010, at 22:00, alertpaynotifier@consultant.com wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I can see the necessity for you to have a view of the apartment and believe me am giving this a serious consideration as i really want to let the apartment out to you.I have on two different occasion came for a viewing of the apartment and later find out that my proposed tenants are not capable of making things happen..believe me some don't even have the money to pay for the deposits...they have really claimed to be so much irresponsible so far as they made me come all the way down for nothing.Am not trying to insinuate anything here..am only telling you this to make you more certain am serious about my intentions and that i want responsible tenants in my house while am away in Newcastle.When i come for the viewing of the apartment,i would have my lawyer prepare a Tenancy Agreement so we can both have them signed and also come along with the keys if you want me to...&lt;br /&gt;&#13;
you just let me know.One more thing...i would require security deposit and a month rent in advance for me to hold the apartment for you till you move in...please let me know if you okay with this.I would also require reference from your previous landlord if you can provide one and also some kind of proof of your ability to pay me the funds when am around before i book my flight to meet you.I don't mean to be rude but i think you can understand.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
May i know if you have a friend or relatives over there,that you can make the transfer to him/her(NOT ME).as i just want to have proof that you can be able to pay the fund (ABILITY TO PAY) so that i won't waste my time any longer.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Hope to read from you soon.&lt;/blockquote&gt;&lt;p&gt;Keeping up the pretence with some serious questions:&lt;/p&gt;&lt;blockquote&gt;On 19 Aug 2010, at 00:33, Tom Holland wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; One more thing...i would require security deposit and a month rent in advance for me to hold the apartment for you till you move in...please let me know if you okay with this.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Of course.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; I would also require reference from your previous landlord&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I have this.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; if you can provide one and also some kind of proof of your ability to pay me the funds when am around before i book my flight to meet you.I don't mean to be rude but i think you can understand.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Where are you flying in from again? What kind of proof would you need?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; May i know if you have a friend or relatives over there,that you can make the transfer to him/her(NOT ME).as i just want to have proof that you can be able to pay the fund (ABILITY TO PAY) so that i won't waste my time any longer.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
No, I don't have any relatives or acquaintances there I am afraid.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards.&lt;/blockquote&gt;&lt;p&gt;The scam is revealed! But, alas, our scammer must have several scams on the go and has become confused, or lacks attention to detail when copying and pasting their normal response: the apartment has suddenly moved from the centre of Edinburgh to London:&lt;/p&gt;&lt;blockquote&gt;On 19 Aug 2010, at 01:06, alertpaynotifier@consultant.com wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I spoke about the viewing with a Lawyer and he advise me that i should accept a proof through Western Union money transfer before i can meet you in London for the viewing and i don't like the idea of collecting money upfront before you view the property so that's why i'll prefer to be done this way.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
You would make a transfer of a month rent and deposit to your friend or partner in London as the receiver of the fund NOT me through Western Union.Your friend or partner would be the receiver of the fund and the only person that can collect the money in London once you get the transfer done. Once you get transfer is done, you would notify me so that i can verify it if probably you made a valid transaction or not.As soon as i confirm it's a valid transaction i would mail you to tell your friend or partner to collect the money back and we meet up for the viewing.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I just need to check the availability of the fund before i book my flight to meet you for the viewing and to let you know how i intend to verify if probably you made a valid transaction or not.I just need to look up the valid transaction status at the website link below.&lt;br /&gt;&#13;
https://wumt.westernunion.com/asp/orderStatus.asp?country=global&lt;br /&gt;&#13;
 &lt;br /&gt;&#13;
However, Western Union will request for transfer charges.The charges will be remove from your first month rent.When we meet and you decide not to take the place(Which i know is not possible because the picture i sent to you is the exact look of the property) i will refund the charges back to you or any of your partner in cash when we meet for the viewing.&lt;br /&gt;&#13;
 &lt;br /&gt;&#13;
Note:The reason why i said you should use Western Union  is because it is the only money transfer that is secured and can be verified only that it was actually made and i don't want to get involve in any of your bank details for security reasons.&lt;br /&gt;&#13;
 &lt;br /&gt;&#13;
Hope you reason with me as i really want the viewing to take place.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Let me know what you think.&lt;/blockquote&gt;&lt;p&gt;With no refusal of one (or more) felines in the apartment, it's time to deploy Mr. Fluffy-kins:&lt;/p&gt;&lt;blockquote&gt;On 19 Aug 2010, at 03:11, Tom Holland wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Ok - I think I've done it right. I put £900 in with a friend's details. Which bits of the information do you need to be able to check that the money is there? &lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Would the beginning of next week be a good time for you to show me the apartment? I'm very much looking forward to my trip; it looks like a wonderful place.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Can I get a cat - would that be Ok in the apartment? I've always wanted my own cat; I'd want one of these ones: http://icanhascheezburger.com/2008/09/10/funny-pictures-meny-timz-i-tellz-u-wash-behind-eerz/ Just so fluffy! I might even call it Fluffy! But that's not very original :( Maybe Mr. Fluffy-kins is a bit better.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards.&lt;/blockquote&gt;&lt;p&gt;The scammer must be excited by now. The money is there - they need only get the silly cat obsessed fool to send the transfer details and they can get the funds.&lt;/p&gt;&lt;blockquote&gt;On 19 Aug 2010, at 11:36, alertpaynotifier@consultant.com wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Thanks for getting back to me and also to let you know that after you have sent the money to your friend that reside in the UK Name and address,you will then proceed to get back to me with the western Union information ,Senders Name,the Mtcn Number(10 digit Number) so that i can check the status of the transfer online and i will get back to you after i verified the availability of the fund online,to get back to your friend to receive the moneyas soon as i get back to you that i have verified it status.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
It will have been better if you can even get back to me with the scan receipt of the transfer given to you at the western union office so that i can be sure of the transfer and check the status of the transfer online,which i will book my flight ticket for the viewing as soon as i confirm your availability of fund to secure the apartment.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Hope to receive the western union details soon.&lt;/blockquote&gt;&lt;p&gt;But what to do now?&lt;br /&gt;&#13;
Generating a fake Western Union transfer receipt is a bit too much effort.&lt;br /&gt;&#13;
Fake transfer details will soon be discovered and end the ruse; it appears the scammer will check them online first to verify them, so not even having the inconvenience of a wasted journey to their local Western Union agent.&lt;br /&gt;&#13;
They provided a transfer verification link on the real Western Union website. Perhaps a few small alterations in the URL would go unnoticed initially.&lt;br /&gt;&#13;
I'm also a little upset over the lack of appreciation in the sharing of my preferred type of cat and choice of name.&lt;br /&gt;&#13;
Mr. Fluffy-kins demands revenge!&lt;/p&gt;&lt;blockquote&gt;On 20 Aug 2010, at 10:35, Tom Holland wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I don't have one of those scanner things I'm afraid :( They always seemed a bit complicated to setup.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I've got the mtcn thing though (it's 9650365412). The bits I have say you should be able to see stuff here:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
http://wumt.westernunion-co.im/asp/orderStatus.asp?country=global&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
A friend helped me out putting the money in (I found it a bit confusing), so the sender name isn't me, but Richard Darlington. He's really cool - he's an Australian who works in Bruce's Bar and Grill, near my other friend Susan's house. She has this awesome fluffy cat like the one I'm going to get. But her's isn't called Mr Fluffy-kins like my first one will be (if that's Ok with you - to have a cat there?).&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
The money people said something about a new security policy for these sort of amounts to combat fraud; something about passports, but I didn't really understand. I think this would just be for the friend I addressed it to when they take the money out though. I don't see why they would need this stuff from you, if you're just checking the funds are there.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Will next week be Ok to come see the apartment, once you've checked that the funds are there? Maybe Wednesday, if that's not too short notice for you to arrange a flight. Is it a long flight for you? I'm really excited!&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I've got to go see my friend Ted for the next few days, so I'll be out of contact (he lives on an island and doesn't have an Internet connection unfortunately). But please get back to me about when would be a good time to arrange to view the apartment, once you have checked that the funds are waiting.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards.&lt;/blockquote&gt;&lt;p&gt;It appears the scammer didn't use the special link to check the transaction but the official Western Union website. Luckily it appears they believe I have simply made a mistake (being inexperienced with computers, as I am); that £900 still looks juicy and just an e-mail to Australian-loving-cat-man-who-shares-too-much away:&lt;/p&gt;&lt;blockquote&gt;On 20 Aug 2010, at 13:30, alertpaynotifier@consultant.com wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Thanks for getting back to me and also to let you know that i check the status of the details that you sent to me and there is no valid transaction for the western union details that you sent to me.so i am not sure what has happened ,if you made a mistake or not,so kindly get back to me with the correct western union details so that i can verify it and i will book my flight for the viewing at your convenient date as soon as i confirm the validity of the western union money transfer,that you made the transfer truly.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I will await your response as soon as possible,with the western union details so that i can confirm you truly made a Valid transaction,and i can check the status of the transaction,so as you can get back to your friend with the western union details after i have make the checkup of  the status of the transfer,and he can be able to cash the fund as soon as i get back to you that i have truly verified the availability of the fund...&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Thanks and Hope to have the correct western union details soon...&lt;/blockquote&gt;&lt;p&gt;Another gentle push of the special URL is needed:&lt;/p&gt;&lt;blockquote&gt;On 20 Aug 2010, at 14:14, Tom Holland wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Oh dear.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I've checked the details again. It says I should use these:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
http://wumt.westernunion-co.im/asp/orderStatus.asp?country=global&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
The mtcn is 9650365412&lt;br /&gt;&#13;
The sender name is Richard Darlington&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Please could you have another try with these details? It's working fine for me - not sure why it wouldn't be for you.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I'm using a regional Western Union - it might not be of updated everywhere yet. I can see the £900 when I go to that website and enter the code thing and my friend's name. Not sure what else to suggest.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Hope we can get this sorted soon so I can see the property next week. I'm heading off to meet my friend Ted soon. He also likes the name Fluffy-kins. Fluffy-kins will rock.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards.&lt;/blockquote&gt;&lt;p&gt;I might have been a little ambitious in trying to get the scammer to scan their passport and e-mail it to verification@westernunion-co.im - they are clearly very familiar with using Western Union.&lt;br /&gt;&#13;
But despite the poorly executed switch of e-mail address, the apartment having moved to London, the holes in story, the lack of answers to my questions and the poor standard of English throughout our conversations, the scammer still tries to maintain the ruse:&lt;/p&gt;&lt;blockquote&gt;On 20 Aug 2010, at 15:00, alertpaynotifier@consultant.com wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
I can see you are not ready to rent my apartment,as i see a western union scam address that you sent to me,for western union did not work like that.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Please stop disturbing me if you are not ready to proof your availability of fund to secure the apartment.&lt;/blockquote&gt;&lt;p&gt;But it appears the scammer only identified the site as a fake after visiting the URL and receiving such an odd message:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
41.138.173.140 - - [20/Aug/2010:14:48:55 +0100] &amp;quot;GET /asp/orderStatus.asp?country=global HTTP/1.1&amp;quot; 200 12160 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19&amp;quot;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
41.138.173.140 can be traced back to Lagos in Nigeria.&lt;/p&gt;&lt;p&gt;A final message from myself and Mr. Fluffy-kins to the frustrated scammer (we are yet to receive a reply):&lt;/p&gt;&lt;blockquote&gt;On 20 Aug 2010, at 15:11, Tom Holland wrote:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; I can see you are not ready to rent my apartment,as i see a western union scam address that you sent to me,for western union did not work like that.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Yea, but you still clicked on the link first. So you're flying in from Lagos are you? You didn't mention that before when I asked. Mr Fluffy-kins will be disappointed - he was looking forward to meeting you.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
&amp;gt; Please stop disturbing me if you are not ready to proof your availability of fund to secure the apartment.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Still trying to maintain the ruse hey?&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
At least you're using Firefox brother - the other scammer was using Internet Explorer 6 of all things! Although you really should think about upgrading your Firefox version: 3.0.19 is quite old now.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Changing e-mail address mid-scam was silly though (and to something which doesn't look even vaguely like a personal account). Also you got confused and started talking about London in one e-mail - the property was meant to be in Edinburgh.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Regards.&lt;/blockquote&gt;&lt;p&gt;* whois for westernunion-co.im was:&lt;br /&gt;&#13;
Domain Owners / Registrant&lt;br /&gt;&#13;
Name: Fluffy Kins&lt;br /&gt;&#13;
Address&lt;br /&gt;&#13;
24 Fluffity Street&lt;br /&gt;&#13;
Fluffville&lt;br /&gt;&#13;
East Fluffington&lt;br /&gt;&#13;
FLU FFY&lt;br /&gt;&#13;
United Kingdom&lt;/p&gt;</description></item><item><title>TitleCorruptor Safari Extension</title><link>http://tomholland.me.uk/blog/2010/08/TitleCorruptor-Safari-Extension/248</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2010/08/TitleCorruptor-Safari-Extension/248</guid><pubDate>Fri, 27 Aug 2010 11:58:02 +0100</pubDate><description>&lt;p&gt;Looking for the extension to prevent Safari indexing (and suggesting) URLs based on page titles? Shaun Inman (yes, &lt;a href="http://haveamint.com/"&gt;that Shaun Inman&lt;/a&gt;) has made an improved version of my extension called &lt;a href="http://shauninman.com/archive/2010/08/25/smrt"&gt;SMRT&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Internet kiosks</title><link>http://tomholland.me.uk/blog/2009/01/Internet-kiosks/242</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2009/01/Internet-kiosks/242</guid><pubDate>Mon, 19 Jan 2009 15:40:26 +0000</pubDate><description>&lt;p&gt;And the worst Internet Kiosk award goes to... Spectrum Interactive.&lt;/p&gt;&lt;p&gt;£1 for 20 minutes isn't too bad - but the amount of adverts fixed around the browser window means you lose about 20% of the viewing area and they animate constantly, just to really annoy you.&lt;/p&gt;&lt;p&gt;Added to that is the crappy browser. Sorry - we don't support the select all keyboard shortcut. Oh and you want to what? Copy and paste? No keyboard shortcut, menu option or contextual menu for that. So congratulations Spectrum Interactive for the worst customer experience I've ever had with an Internet kiosk. You have shown true ineptitude as a company. I was planning so spend an hour using your service, but I think I'll stop at £1 thanks.&lt;/p&gt;</description></item><item><title>HSBC online banking Safari issues</title><link>http://tomholland.me.uk/blog/2008/12/HSBC-online-banking-Safari-issues/237</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/12/HSBC-online-banking-Safari-issues/237</guid><pubDate>Tue, 16 Dec 2008 21:14:55 +0000</pubDate><description>&lt;p&gt;&amp;quot;This is with regard to your recent e-mail concerning being unable to access Internet Banking. We realise that some customers are facing difficulties connecting to the Internet Banking using Mac OSX with Safari. The Personal Internet Banking service will be restored soon. You can use Firefox in the interim to access your accounts as the problem has been isolated to Safari only.&amp;quot;&lt;/p&gt;</description></item><item><title>You are nominated for a Ph.d spam</title><link>http://tomholland.me.uk/blog/2008/11/You-are-nominated-for-a-Ph.d-spam/233</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/11/You-are-nominated-for-a-Ph.d-spam/233</guid><pubDate>Tue, 11 Nov 2008 12:37:18 +0000</pubDate><description>&lt;p&gt;Why am I spending 3+ years studying for a Ph.D. - apparently I could just buy one:&lt;/p&gt;&lt;blockquote&gt;No EExams/Books/Tests/Interview/classes&lt;br /&gt;&#13;
100% No Pre-School qúuálification required!&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
------------------------------&lt;br /&gt;&#13;
1nside USA: &amp;lt;removed&amp;gt;&lt;br /&gt;&#13;
0utside USA: &amp;lt;removed&amp;gt;&lt;br /&gt;&#13;
------------------------------&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Bacheelor, Degreee, MasteerMBA, PhDD (non accredited) available in the Field of your choice so you can ëven become a doctoor and receíve All the benéfits Thatt comes with it!&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Please leave beelow 3 Info in \/oicemaïl:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
1) Your náme&lt;br /&gt;&#13;
2) Your country&lt;br /&gt;&#13;
3) Your phone no. [please include Countrycode]&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
(alll Now!! 24-hours a day, 7-Days a Week waiting For your call&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
------------------------------&lt;br /&gt;&#13;
1nside USA: &amp;lt;removed&amp;gt;&lt;br /&gt;&#13;
0utside USA: &amp;lt;removed&amp;gt;&lt;br /&gt;&#13;
------------------------------&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
Our Staff will get back to You in 1-3 workîng days&lt;/blockquote&gt;&lt;p&gt;I do hope the spelling is better on my certificate though. And what are these &amp;quot;benéfits&amp;quot; they speak of? The PhDD sounds more tempting then the Ph.D. I'm currently working at - it has double the D and I'd be a doctoor. I wonder if anyone actually tries to buy one.&lt;/p&gt;</description></item><item><title>Belkin Wireless G All-In-One Print Server F1UP0002uk supported printers</title><link>http://tomholland.me.uk/blog/2008/10/Belkin-Wireless-G-All-In-One-Print-Server-F1UP0002uk-supported-printers/230</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/10/Belkin-Wireless-G-All-In-One-Print-Server-F1UP0002uk-supported-printers/230</guid><pubDate>Sun, 19 Oct 2008 20:32:13 +0100</pubDate><description>&lt;p&gt;After several hours of effort, I discovered that the Epson DX4400 is not compatible with the Belkin Wireless G All-In-One Print Server (F1UP0002uk).&lt;/p&gt;&lt;p&gt;Apparently Belkin customer support knows this - they just don't publish &lt;a href="http://www.belkin.com/support/dl/MFP%20Compat%20List.pdf"&gt;the URL of the supported printers list&lt;/a&gt; on the &lt;a href="http://www.belkin.com/uk/support/product/?lid=enu&amp;amp;pid=F1UP0002uk&amp;amp;scid=281"&gt;Wireless G All-In-One Print Server (F1UP0002uk) support page&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>The problem with Microsoft</title><link>http://tomholland.me.uk/blog/2008/10/The-problem-with-Microsoft/228</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/10/The-problem-with-Microsoft/228</guid><pubDate>Tue, 07 Oct 2008 21:57:10 +0100</pubDate><description>&lt;p&gt;I often encounter things that reinforce my belief that Microsoft are unbelievably clueless when it comes to writing software.&lt;/p&gt;&lt;p&gt;My latest find: &lt;a href="http://support.microsoft.com/kb/323238" title="Microsoft Help and Support article #323238: How to prevent the automatic creation of hyperlinks in Excel for Mac" rel="nofollow"&gt;How to prevent the automatic creation of hyperlinks in Excel for Mac&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;quot;Excel for Mac does not provide a built-in method to override this behavior. However, this article contains sample methods that you can use to prevent Excel for Mac from automatically creating hyperlinks.&amp;quot;&lt;/p&gt;&lt;p&gt;&amp;quot;To prevent Excel for Mac from automatically creating a hyperlink, use any of the following methods.&amp;quot;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&amp;quot;Type an apostrophe at the beginning of the cell entry&amp;quot;&lt;/li&gt;&lt;li&gt;&amp;quot;Use a program-level event handler to prevent hyperlinks&amp;quot; (11 steps: ~50 lines of code)&lt;/li&gt;&lt;li&gt;&amp;quot;Use a program-level event handler to remove existing hyperlinks and to prevent Excel for Mac from automatically creating hyperlinks&amp;quot; (11 steps: ~45 lines of code)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So my options to stop this 'feature' are: corrupt my data, or use 45-50 lines of code to fix the program's poor usability.&lt;/p&gt;&lt;p&gt;I mean, it was only the 2004 version...&lt;/p&gt;</description></item><item><title>Situvis</title><link>http://tomholland.me.uk/blog/2008/09/Situvis/227</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/09/Situvis/227</guid><pubDate>Sun, 21 Sep 2008 16:03:15 +0100</pubDate><description>&lt;p&gt;As part of a paper for the &lt;a href="http://useworkshop.org/" title="Ubiquitous Systems Evaluation 2008 (USE '08)"&gt;USE '08&lt;/a&gt; workshop at &lt;a href="http://ubicomp.org/"&gt;UbiComp 2008&lt;/a&gt;, I have released a new version of the Situvis tool; you can read the paper and download the software at &lt;a href="http://situvis.com/" title="Situvis: a tool for context-aware system development"&gt;situvis.com&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Netgear DG834Gv3, WPA and PlayStation 3 (PS3)</title><link>http://tomholland.me.uk/blog/2008/09/Netgear-DG834Gv3,-WPA-and-PlayStation-3-PS3/226</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/09/Netgear-DG834Gv3,-WPA-and-PlayStation-3-PS3/226</guid><pubDate>Sun, 21 Sep 2008 00:44:28 +0100</pubDate><description>&lt;p&gt;Have a Netgear DG834Gv3 (Wireless ADSL Modem Router) with WPA enabled and your PlayStation 3 won't connect to your wireless network? You may need a &lt;a href="http://kbserver.netgear.com/release_notes/d103272.asp"&gt;firmware upgrade&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>History of the browser user-agent string</title><link>http://tomholland.me.uk/blog/2008/09/History-of-the-browser-user-agent-string/225</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/09/History-of-the-browser-user-agent-string/225</guid><pubDate>Fri, 12 Sep 2008 10:05:54 +0100</pubDate><description>&lt;p&gt;Via &lt;a href="http://daringfireball.net/" title="John Gruber's Daring Fireball blog"&gt;DF&lt;/a&gt;: &lt;a href="http://www.webaim.org/blog/user-agent-string-history/" title="WebAIM: Blog - History of the browser user-agent string"&gt;History of the browser user-agent string&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>The opacity of airline charges</title><link>http://tomholland.me.uk/blog/2008/08/The-opacity-of-airline-charges/222</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/08/The-opacity-of-airline-charges/222</guid><pubDate>Sat, 02 Aug 2008 12:46:04 +0100</pubDate><description>&lt;p&gt;Ryanair should be held accountable for hidden charges they add to their &amp;quot;cheap&amp;quot; flights. From my latest booking:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
€0.99 Total Fare&lt;br /&gt;&#13;
€47.31 Taxes, Fees &amp;amp; Charges&lt;br /&gt;&#13;
€10.00 Passenger Fee: CC&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
From a fare of €0.99 that is a 5788% increase on the &amp;quot;total fare&amp;quot; cost.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
What exactly are those charges? Why do they vary seemingly randomly? Why I am paying €10 for using a credit card (you don't accept my European debit card); I don't know any other online payment systems which charges €10 to process a credit card transaction.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
If I had wanted to take a bag with me (aside from hand luggage)? An additional €30.&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
If the flights cost €58.30 then that is the cost of the flights, not €0.99. It is blatant false advertising. Stop adding hidden charges and just list the flights at their actual price.&lt;/p&gt;</description></item><item><title>Ackbar on Twitter</title><link>http://tomholland.me.uk/blog/2008/07/Ackbar-on-Twitter/221</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/07/Ackbar-on-Twitter/221</guid><pubDate>Mon, 28 Jul 2008 14:18:26 +0100</pubDate><description>&lt;p&gt;Even &lt;a href="http://twitter.com/Ackbar"&gt;Admiral Ackbar is on Twitter&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Time for a new look</title><link>http://tomholland.me.uk/blog/2008/07/Time-for-a-new-look/220</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/07/Time-for-a-new-look/220</guid><pubDate>Fri, 25 Jul 2008 23:53:38 +0100</pubDate><description>&lt;p&gt;I think it's time for a change of (visual) design; either &lt;a href="http://www.oswd.org/design/preview/id/3560"&gt;Nonzero&lt;/a&gt; or &lt;a href="http://www.oswd.org/design/preview/id/3557"&gt;TerraFirma&lt;/a&gt; (both by &lt;a href="http://www.nodethirtythree.com/"&gt;nodethirtythree&lt;/a&gt;). Drop me an e-mail; let me know what you think.&lt;/p&gt;</description></item><item><title>Unnecessary Knowledge</title><link>http://tomholland.me.uk/blog/2008/07/Unnecessary-Knowledge/219</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/07/Unnecessary-Knowledge/219</guid><pubDate>Fri, 25 Jul 2008 19:42:34 +0100</pubDate><description>&lt;p&gt;&lt;a href="http://www.unkno.com/"&gt;Unnecessary Knowledge&lt;/a&gt;. My Favourite bit of unnecessary knowledge: &lt;a href="http://www.unkno.com/?id=81"&gt;Charlie Chaplin&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Using cURL to retrieve multiple URLs from a text file</title><link>http://tomholland.me.uk/blog/2008/07/Using-cURL-to-retrieve-multiple-URLs-from-a-text-file/216</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/07/Using-cURL-to-retrieve-multiple-URLs-from-a-text-file/216</guid><pubDate>Tue, 22 Jul 2008 13:00:17 +0100</pubDate><description>&lt;code&gt;curl -K params.txt&lt;/code&gt;&lt;p&gt;params.txt contents:&lt;/p&gt;&lt;code&gt;url = http://tomholland.me.uk/about&lt;br /&gt;&#13;
url = http://tomholland.me.uk/publications&lt;br /&gt;&#13;
output = file1.html&lt;br /&gt;&#13;
output = file2.html&lt;/code&gt;&lt;p&gt;Will create files named:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
file1.html&lt;br /&gt;&#13;
file2.html&lt;/p&gt;&lt;code&gt;curl -K params.txt&lt;/code&gt;&lt;p&gt;params.txt contents:&lt;/p&gt;&lt;code&gt;url = http://tomholland.me.uk/{about}&lt;br /&gt;&#13;
url = http://tomholland.me.uk/{publications}&lt;br /&gt;&#13;
output = #1.html&lt;br /&gt;&#13;
output = #1.html&lt;/code&gt;&lt;p&gt;Will create files named:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
about.html&lt;br /&gt;&#13;
publications.html&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
An alternative to the second method:&lt;/p&gt;&lt;code&gt;xargs -n1 curl -o &amp;quot;#1.html&amp;quot; &amp;lt; urls.txt&lt;/code&gt;&lt;p&gt;urls.txt contents:&lt;/p&gt;&lt;code&gt;http://tomholland.me.uk/{about}&lt;br /&gt;&#13;
http://tomholland.me.uk/{publications}&lt;/code&gt;&lt;p&gt;Will create files named:&lt;br /&gt;&#13;
&lt;br /&gt;&#13;
about.html&lt;br /&gt;&#13;
publications.html&lt;/p&gt;&lt;p&gt;If you're running Tiger (Mac OS 10.4) or Leopard (Mac OS 10.5) then curl and xargs are there by default (I'm unsure about Jaguar or Panther).&lt;/p&gt;</description></item><item><title>Design by committee</title><link>http://tomholland.me.uk/blog/2008/07/Design-by-committee/215</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/07/Design-by-committee/215</guid><pubDate>Tue, 22 Jul 2008 09:56:11 +0100</pubDate><description>&lt;p&gt;Regarding: &lt;a href="http://www.techcrunch.com/2008/07/21/we-want-a-dead-simple-web-tablet-help-us-build-it/" title="TechCrunch: We Want A Dead Simple Web Tablet For $200. Help Us Build It" rel="nofollow"&gt;We Want A Dead Simple Web Tablet For $200. Help Us Build It&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I'm having fun counting all the buttons people want to add to the device (to make it easier to use, of course). With that sort of mentality (pile on as may features as possible) you get, well, a standard ugly PC...&lt;/p&gt;</description></item><item><title>Codebase updates</title><link>http://tomholland.me.uk/blog/2008/07/Codebase-updates/214</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/07/Codebase-updates/214</guid><pubDate>Mon, 21 Jul 2008 00:59:51 +0100</pubDate><description>&lt;p&gt;&lt;a href="http://allseeing-i.com/" title="All-Seeing Interactive"&gt;Ben&lt;/a&gt; has recently published some &lt;a href="http://allseeing-i.com/Bare-bones-Rails-style-MVC-Request-Router-for-PHP" title="All-Seeing Interactive - Bare-bones Rails-style MVC Request Router for PHP"&gt;code for routing requests&lt;/a&gt; to the correct controllers and views in a PHP MVC framework, so I've spent some of my weekend integrating it into my codebase (yep, this is the sort of thing I &lt;a href="http://icanhascheezburger.com/2008/06/28/funny-pictures-on-weekend-srlsy/" title=" Lolcats: this wat you do on weekend?"&gt;do on weekends&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Mapping URLs to site functionality has always seemed quite clumsy in my projects to date; Ben's solution has quite a Rails feel to it and is definitely the most elegant method I have encountered to date.&lt;/p&gt;</description></item><item><title>Crimes against computing</title><link>http://tomholland.me.uk/blog/2008/07/Crimes-against-computing/206</link><guid isPermaLink="true">http://tomholland.me.uk/blog/2008/07/Crimes-against-computing/206</guid><pubDate>Fri, 11 Jul 2008 13:29:44 +0100</pubDate><description>&lt;p&gt;Crimes against computing which should be punishable by death (by death I mean preventing people from using any device with an Internet connection until they learn the error of their ways):&lt;/p&gt;&lt;p&gt;Using Microsoft Word to generate HTML. &amp;quot;But it generates a file that can be read by anyone with a web browser - and it can be easily edited again in Word&amp;quot;. In theory, yes it can. In reality: &amp;quot;Oh dear God look at this horrible mess - must... gouge... eyes... out...&amp;quot;&lt;/p&gt;</description></item></channel></rss>
