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

<channel>
	<title>Jamie Thompson - Web Developer</title>
	<atom:link href="http://jamazon.co.uk/feed/" rel="self" type="application/rss+xml" />
	<link>http://jamazon.co.uk</link>
	<description>Can't Sleep. Clowns Will Eat Me</description>
	<pubDate>Thu, 24 Jul 2008 22:42:19 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5</generator>
	<language>en</language>
			<item>
		<title>Full UK Postcode Database for Free</title>
		<link>http://jamazon.co.uk/web/2008/07/24/full-uk-postcode-database-for-free/</link>
		<comments>http://jamazon.co.uk/web/2008/07/24/full-uk-postcode-database-for-free/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 14:41:56 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://jamazon.co.uk/?p=103</guid>
		<description><![CDATA[
It sounds nuts but for a limited time only Royal Mail are giving away copies of the full UK Postcode Database for free to those wishing to use it for the &#8220;Show Us a Better Way&#8221; competition currently being run by The Cabinet Office.
The Royal Mail has now kindly agreed to make the full PAF [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://jamazon.co.uk/wp-content/uploads/2008/07/paf.jpg" alt="Free UK Postcode Database" title="Free UK Postcode Database" width="530" height="190"  /></p>
<p>It sounds nuts but for a limited time only Royal Mail are giving away copies of the full UK Postcode Database for free to those wishing to use it for the &#8220;<a href="http://www.showusabetterway.co.uk">Show Us a Better Way</a>&#8221; competition currently being run by The Cabinet Office.</p>
<blockquote><p>The Royal Mail has now kindly agreed to make the full PAF data sets available to those who want to use it for the purposes of this competition, but you will need to contact Royal Mail to discuss licensing.</p></blockquote>
<p>Regardless of the fact that this data should be in the <a href="http://www.freethepostcode.org/">public domain</a> anyway, this is pretty exciting. I&#8217;ve certainly put in a claim for my free copy. I&#8217;m sure it will arrive with all sorts of legal threats though, but nevermind.</p>
<p>Find out how to <a href="http://www.showusabetterway.co.uk/call/data.html#mail">get your copy here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/web/2008/07/24/full-uk-postcode-database-for-free/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OMGWTFBBC: This is how &#8220;Hackers&#8221; Steal Software</title>
		<link>http://jamazon.co.uk/rants/2008/07/23/omgwtfbbc-this-is-how-hackers-steal-software/</link>
		<comments>http://jamazon.co.uk/rants/2008/07/23/omgwtfbbc-this-is-how-hackers-steal-software/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 20:44:09 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Rants]]></category>

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

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

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

		<guid isPermaLink="false">http://jamazon.co.uk/?p=102</guid>
		<description><![CDATA[Below, I share with you an excerpt from quite possibly the most pointless thing i&#8217;ve ever wathed on TV. These guys are real hustlers for sure. They certainly know what&#8217;s up.

And there was me using BitTorrent and Rapidshare to download installerz, keygenz and serialz. If only i&#8217;d known that I could just drag desktop shortcuts [...]]]></description>
			<content:encoded><![CDATA[<p>Below, I share with you an excerpt from quite possibly the most pointless thing i&#8217;ve ever wathed on TV. These guys are real hustlers for sure. They certainly know what&#8217;s up.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/0OVUFpPfc5A&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/0OVUFpPfc5A&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>And there was me using BitTorrent and Rapidshare to download installerz, keygenz and serialz. If only i&#8217;d known that I could just drag desktop shortcuts to a massively oversized USB mass storage device.</p>
<p>I think i&#8217;m gonna go LOL in the direction of this <strong><a href="http://www.linkedin.com/in/marcrogers">Marc Rogers</a></strong> guy. He&#8217;s Technical Threat Intelligence Manager for Vodafone. He says&#8230;</p>
<blockquote><p>Most recently I have worked as technical advisor and on screen security guru for BBC&#8217;s &#8220;The Real Hustle&#8221;.</p></blockquote>
<p>So by his own admission we can assume this guy has never SEEN the internet let alone USED it. Glad i don&#8217;t use Vodafone. I dread to think what his concept of &#8220;Technical Threat&#8221; is. It probably involves a 14.4K modem and a copy of HyperTerminal.</p>
<p>n00b</p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/rants/2008/07/23/omgwtfbbc-this-is-how-hackers-steal-software/feed/</wfw:commentRss>
		</item>
		<item>
		<title>An IE7 Bug That Returns MSIE 6.0 User Agent String</title>
		<link>http://jamazon.co.uk/web/2008/07/23/an-ie7-bug-that-returns-msie-60-user-agent-string/</link>
		<comments>http://jamazon.co.uk/web/2008/07/23/an-ie7-bug-that-returns-msie-60-user-agent-string/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 13:44:15 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Web]]></category>

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

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

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

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

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

		<guid isPermaLink="false">http://jamazon.co.uk/?p=99</guid>
		<description><![CDATA[
IE7, don&#8217;t you just love it? What they gave us with one had in terms of CSS actually sort of working they took away with some of the stupidest niggly little bugs ever. Here&#8217;s another potentially large one i&#8217;m stumbled right into recently.
If your user agent string is more than 260 characters in length then [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://jamazon.co.uk/wp-content/uploads/2008/07/header.jpg" alt="Internet Explorer 7 User Agent Bug (MSIE 6.0)" title="Internet Explorer 7 User Agent Bug (MSIE 6.0)" width="530" height="190" /></p>
<p>IE7, don&#8217;t you just love it? What they gave us with one had in terms of CSS actually sort of working they took away with some of the stupidest niggly little bugs ever. Here&#8217;s another potentially large one i&#8217;m stumbled right into recently.</p>
<p><strong>If your user agent string is more than 260 characters in length then your user agent string suddenly and almost magically becomes &#8220;Mozilla/4.0 (compatible; MSIE 6.0)&#8221;</strong></p>
<p>Not what you&#8217;d expect to happen. Now, I know what your thinking. Why on god&#8217;s earth would your user agent string BE that long. The answer is simple. Toolbars and Spyware.</p>
<p><span id="more-99"></span></p>
<h2>Toolbars and Spyware</h2>
<p>The <em>cool</em> thing about Windows is that toolbars, spyware and crapware in general can and do add pointless shit to your Internet Explorer user agent string via the registry. Sounds good doesn&#8217;t it. Now consider the following:</p>
<ol>
<li>Most store bough Windows PCs come pre-installed with tons of stupid toolbars and crapware</li>
<li>IE 7 isn&#8217;t much more secure than IE6 was in terms of spyware</li>
<li>Home users do not know or care about viruses and spyware</li>
</ol>
<p>With me?</p>
<h2>Try it yourself</h2>
<p>You can easily trigger this bug yourself by editing the registry. Fire up regedit and navigate to HKLM/Software/Microsoft/Windows/CurrentVersion/Internet Settings/5./0User Agent/Post Platform. Create a new string key and fill up full of crap (enough to pass the 260 character threshold)</p>
<p><img src="http://jamazon.co.uk/wp-content/uploads/2008/07/regedit.jpg" alt="regedit" title="regedit" width="530" height="190" /></p>
<p>Next, close all instances of IE. Fire UP IE again and type the following into the address bar:</p>
<p><code>javascript:alert(navigator.userAgent)</code></p>
<p>Hit enter and IE7 should now tell you that it&#8217;s IE6. Awesome!</p>
<p>I firmly believe that this is one of the reasons behind problems such as the <a href="/web/2008/03/17/thickbox-31-ie7-positioning-bug/">thickbox positioning bug </a>that many people experience with IE7. </p>
<h2>The workaround?</h2>
<p>This is of course just another argument against relying on the user agent string to determine browser version. It really shouldn&#8217;t be done this way, yet it&#8217;s the method built into many JavaScript libraries including jQuery with it&#8217;s <a href="/web/2008/03/14/jquerybrowserversion-doesnt-recognise-ie7/">unreliable $.browser.version</a> property.</p>
<p>If you really need to know if a browser is IE6 or IE7 then use something more solid like object detection. Simply testing for something like the following would be a better option than extracting unreliable data from the user agent string</p>
<p>A possible patch below redefines the browser version as &#8220;7.0&#8243; only if the browser has already been identified as IE6 and the the presence of the XMLHttpRequest object suggests otherwise.</p>
<p><code>if(jQuery.browser.msie &#038;&#038; parseInt(jQuery.browser.version) == 6 &#038;&#038; this.XMLHttpRequest) {<br />
	jQuery.browser.version = "7.0"<br />
}</code></p>
<p>I&#8217;m thinking though that maybe this might not be bulletproof. If IE8 presents the same or similar &#8220;Hi i&#8217;m IE6!&#8221; behaviour then the above patch could incorrectly identify IE8 as IE7. This might not be as serious as IE7 vs. IE6 but it&#8217;s still an issue.</p>
<p>I just wish that Microsoft would put a bit more effort into writing good software. It&#8217;s not like they don&#8217;t have the resources.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/web/2008/07/23/an-ie7-bug-that-returns-msie-60-user-agent-string/feed/</wfw:commentRss>
		</item>
		<item>
		<title>jQuery ui.tabs, Themeroller and .ui-tabs-nav-item</title>
		<link>http://jamazon.co.uk/web/2008/07/22/jquery-uitabs-and-themeroller/</link>
		<comments>http://jamazon.co.uk/web/2008/07/22/jquery-uitabs-and-themeroller/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 11:52:36 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Web]]></category>

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

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

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

		<category><![CDATA[jQuery UI]]></category>

		<guid isPermaLink="false">http://jamazon.co.uk/?p=89</guid>
		<description><![CDATA[There currently an inconsistency between the jQuery UI tabs plugin and the CSS generated by Themeroller

The CSS includes rules for &#8220;.ui-tabs-nav-item&#8221; but these classes are never added to the list items by the plugin. Because they are unnecessary.
Simply changing the rules to &#8220;.ui-tabs-nav li&#8221; they way they should be brings it all into line again. [...]]]></description>
			<content:encoded><![CDATA[<p>There currently an inconsistency between the jQuery UI <a href="http://ui.jquery.com/functional_demos/#ui.tabs">tabs plugin</a> and the CSS generated by <a href="http://ui.jquery.com/themeroller">Themeroller</a></p>
<p><img src="http://jamazon.co.uk/wp-content/uploads/2008/07/jquery-ui-themeroller.jpg" alt="" title="jquery-ui-themeroller" width="530" height="191" class="alignnone size-full wp-image-90" /></p>
<p>The CSS includes rules for &#8220;.ui-tabs-nav-item&#8221; but these classes are never added to the list items by the plugin. Because they are unnecessary.</p>
<p>Simply changing the rules to &#8220;.ui-tabs-nav li&#8221; they way they should be brings it all into line again. Except the extra specificity overrides the &#8220;.ui-tabs-selected&#8221; rules. These need changing to &#8220;.ui-tabs-nav li.ui-tabs-selected&#8221; and Bob&#8217;s your monkey&#8217;s uncle.</p>
<p>There doesn&#8217;t appear to be a whole lot of consistency (or good CSS) rolling around the JQuery UI project at the moment. Hopefully this will improve. I was of the belief that a theme could be &#8220;dropped onto&#8221; a jQuery UI app to simply re-skin it. This isn&#8217;t the case. Not yet at least.</p>
<p>For the time being I think i&#8217;ll be sticking to good old fashioned hand written CSS</p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/web/2008/07/22/jquery-uitabs-and-themeroller/feed/</wfw:commentRss>
		</item>
		<item>
		<title>jQuery.getScript() does not cache</title>
		<link>http://jamazon.co.uk/web/2008/07/21/jquerygetscript-does-not-cache/</link>
		<comments>http://jamazon.co.uk/web/2008/07/21/jquerygetscript-does-not-cache/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 12:29:44 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Web]]></category>

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

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

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

		<guid isPermaLink="false">http://jamazon.co.uk/?p=88</guid>
		<description><![CDATA[It occurred to me today that when using jQuery&#8217;s handy little .getScript method that each script request is appended by a timestamp appended to the querystring. This is great. A lot of the time this is exactly what you want as it ensures that no browser will ever serve up it&#8217;s own cache in preference [...]]]></description>
			<content:encoded><![CDATA[<p>It occurred to me today that when using jQuery&#8217;s handy little .getScript method that each script request is appended by a timestamp appended to the querystring. This is great. A lot of the time this is exactly what you want as it ensures that no browser will ever serve up it&#8217;s own cache in preference of the actual script from the actual server.</p>
<p><img src="http://jamazon.co.uk/wp-content/uploads/2008/07/getscript.png" alt="jQuery.getScript" title="jQuery.getScript" width="530" height="190" /></p>
<p>But what if you just want to use .getScript to programatically include parts of your application logic only where necessary (aka <a href="http://en.wikipedia.org/wiki/Lazy_loading">Lazy Loading</a>), or you simply want to defer the execution of a non-essential plugin or two until a couple of seconds after the DOM becomes available. You&#8217;d want those scripts cached as if you&#8217;d hard-coded them into script tags right? I guess.</p>
<h2>Can&#8217;t Cache, Won&#8217;t Cache (with Ainsley Harriott)</h2>
<p>There&#8217;s no way you can send cache control options into getScript. It simply doesn&#8217;t accept any. getScript is merely a wrapper around .get which itself does not provide options for controlling caching. I&#8217;m not sure whether or not this is an oversight on the part of the developers. Feel free to shoot me down in flames if i&#8217;m spectacularly missing some glaringly obvious point here.</p>
<p>It&#8217;s not a problem though. .get is itslef just a simple wrapper around .ajax which publicly exposes all of jQuery&#8217;s AJAXy goodness. As such there&#8217;s absolutely no reason why you can&#8217;t just redefine JQuery.getScript to accept an optional boolean argument for cache control. That&#8217;s the beauty of jQuery.</p>
<h2>jQuery.getScript Redefined</h2>
<p><code>$.getScript = function(url, callback, cache){<br />
	$.ajax({<br />
			type: "GET",<br />
			url: url,<br />
			success: callback,<br />
			dataType: "script",<br />
			cache: cache<br />
	});<br />
};<br />
</code></p>
<p>This won&#8217;t break any existing code which references the function as omitting the cache argument defaults caching to false as per the original functionality. But if you want to allow caching you now have that option.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/web/2008/07/21/jquerygetscript-does-not-cache/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Last.fm Loved Tracks RSS Feed</title>
		<link>http://jamazon.co.uk/web/2008/06/30/lastfm-loved-tracks-rss-feed/</link>
		<comments>http://jamazon.co.uk/web/2008/06/30/lastfm-loved-tracks-rss-feed/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 18:58:33 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Web]]></category>

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

		<category><![CDATA[last.fm]]></category>

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

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

		<guid isPermaLink="false">http://jamazon.co.uk/?p=85</guid>
		<description><![CDATA[
Ever wondered why last.fm don&#8217;t provide an RSS feed of your loved tracks? Me too. So using the freely available audioscrobbler web services i&#8217;ve created a very basic last.fm loved tracks feed which. The main reason for doing so was to update twitter with my loved tracks via twitterfeed. The feed can be called with [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://jamazon.co.uk/wp-content/uploads/2008/07/lastfm.jpg" alt="last.fm loved tracks" title="last.fm loved tracks" width="530" height="191" /></p>
<p>Ever wondered why last.fm don&#8217;t provide an RSS feed of your loved tracks? Me too. So using the freely available <a href="http://www.audioscrobbler.net/data/webservices/">audioscrobbler web services</a> i&#8217;ve created a very basic last.fm loved tracks feed which. The main reason for doing so was to update twitter with my loved tracks via <a href="http://www.twitterfeed.com">twitterfeed</a>. The feed can be called with the following syntax:</p>
<p>http://jamazon.co.uk/last.love/user/<strong>[last.fm username]</strong>/feeds/<strong>[feed type (rss|atom|opml)]</strong></p>
<p>It&#8217;ll work with any valid last.fm username. </p>
<p>Here&#8217;s mine:</p>
<p><a href="http://jamazon.co.uk/last.love/user/jamiethompson/feeds/rss">http://jamazon.co.uk/last.love/user/jamiethompson/feeds/rss</a></p>
<p>I might furnish the service with a shiny little user interface at some point, but I don&#8217;t think it really <em>needs</em> one.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/web/2008/06/30/lastfm-loved-tracks-rss-feed/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Publish / Subscribe With jQuery</title>
		<link>http://jamazon.co.uk/web/2008/06/17/publish-subscribe-with-jquery/</link>
		<comments>http://jamazon.co.uk/web/2008/06/17/publish-subscribe-with-jquery/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 16:24:27 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Web]]></category>

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

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

		<guid isPermaLink="false">http://jamazon.co.uk/?p=82</guid>
		<description><![CDATA[With a view to writing a jQuery UI integrated with the offline functionality of Google Gears i&#8217;ve been toying with some code to poll for network connection status using jQuery.
The Network Detection Object
The basic premise is very simple. We create an instance of a network detection object which will poll a URL at regular intervals. [...]]]></description>
			<content:encoded><![CDATA[<p>With a view to writing a <a href="http://jquery.com">jQuery</a> UI integrated with the offline functionality of <a href="http://gears.google.com">Google Gears</a> i&#8217;ve been toying with some code to poll for network connection status using jQuery.</p>
<h2>The Network Detection Object</h2>
<p>The basic premise is very simple. We create an instance of a network detection object which will poll a URL at regular intervals. Should these HTTP requests fail we can assume that network connectivity has been lost, or the server is simply unreachable at the current time. </p>
<p><code>$.networkDetection = function(url,interval){<br />
	var url = url;<br />
	var interval = interval;<br />
	online = false;<br />
	this.StartPolling = function(){<br />
		this.StopPolling();<br />
		this.timer = setInterval(poll, interval);<br />
	};<br />
	this.StopPolling = function(){<br />
		clearInterval(this.timer);<br />
	};<br />
	this.setPollInterval= function(i) {<br />
		interval = i;<br />
	};<br />
	this.getOnlineStatus = function(){<br />
		return online;<br />
	};<br />
	function poll() {<br />
		$.ajax({<br />
			type: "POST",<br />
			url: url,<br />
			dataType: "text",<br />
			error: function(){<br />
				online = false;<br />
				$(document).trigger('status.networkDetection',[false]);<br />
			},<br />
			success: function(){<br />
				online = true;<br />
				$(document).trigger('status.networkDetection',[true]);<br />
			}<br />
		});<br />
	};<br />
};</code></p>
<p>You can view the <a href="/sandbox/nwdetect/">demo here</a>. Set your browser to work offline and see what happens&#8230;. no, it&#8217;s not very exciting.</p>
<h2>Trigger and Bind</h2>
<p>What is exciting though (or at least what is exciting me) is the method by which the status gets relayed through the application. I&#8217;ve stumbled upon a largely un-discussed method of implementing a <a href="http://en.wikipedia.org/wiki/Pub/sub">pub/sub</a> system using jQuery&#8217;s trigger and bind methods.</p>
<p>The demo code is more obtuse than it need to be. The network detection object publishes &#8217;status &#8216;events to the document which actively listens for them and in turn publishes &#8216;notify&#8217; events to all subscribers (more on those later). The reasoning behind this is that in a real world application there would probably be some more logic controlling when and how the &#8216;notify&#8217; events are published.</p>
<p><code>$(document).bind("status.networkDetection", function(e, status){<br />
	// subscribers can be namespaced with multiple classes<br />
	subscribers = $('.subscriber.networkDetection');<br />
	// publish notify.networkDetection even to subscribers<br />
	subscribers.trigger("notify.networkDetection", [status])<br />
	/*<br />
	other logic based on network connectivity could go here<br />
	use google gears offline storage etc<br />
	maybe trigger some other events<br />
	*/<br />
});</code></p>
<p>Because of jQuery&#8217;s DOM centric approach events are published to (triggered on) DOM elements. This can be the window or document object for general events or you can generate a jQuery object using a selector. The approach i&#8217;ve taken with the demo is to create an almost namespaced approach to defining subscribers.</p>
<p>DOM elements which are to be subscribers are classed simply with &#8220;subscriber&#8221; and &#8220;networkDetection&#8221;. We can then publish events only to these elements (of which there is only one in the demo) by triggering a notify event on <strong>$(&#8221;.subscriber.networkDetection&#8221;)</strong></p>
<p>The <strong>#notifier</strong> div which is part of the .subscriber.networkDetection group of subscribers then has an anonymous function bound to it, effectively acting as a listener.</p>
<p><code>$('#notifier').bind("notify.networkDetection",function(e, online){<br />
	// the following simply demonstrates<br />
	notifier = $(this);<br />
	if(online){<br />
		if (!notifier.hasClass("online")){<br />
			$(this)<br />
				.addClass("online")<br />
				.removeClass("offline")<br />
				.text("ONLINE");<br />
		}<br />
	}else{<br />
		if (!notifier.hasClass("offline")){<br />
			$(this)<br />
				.addClass("offline")<br />
				.removeClass("online")<br />
				.text("OFFLINE");<br />
		}<br />
	};<br />
});</code></p>
<p>So, there you go. It&#8217;s all pretty verbose and my example isn&#8217;t at all exciting. It also doesn&#8217;t showcase anything interesting you could do with these methods, but if anyone&#8217;s at all interested to dig through the source feel free. All the code is inline in the head of the <a href="/sandbox/nwdetect/">demo page</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/web/2008/06/17/publish-subscribe-with-jquery/feed/</wfw:commentRss>
		</item>
		<item>
		<title>All Change at Citynoise.org</title>
		<link>http://jamazon.co.uk/projects/2008/06/13/all-change-at-citynoise-dot-org/</link>
		<comments>http://jamazon.co.uk/projects/2008/06/13/all-change-at-citynoise-dot-org/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 13:11:17 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Projects]]></category>

		<category><![CDATA[citynoise.org]]></category>

		<guid isPermaLink="false">http://jamazon.co.uk/?p=80</guid>
		<description><![CDATA[For those who are interested I&#8217;m going to start documenting the upgrades and improvements I&#8217;m making to citynoise.org over the coming months. The site has been struggling under some pretty heavy traffic and several internal optimisations including query caching for some of the more complex database operations has gone a long way towards making the [...]]]></description>
			<content:encoded><![CDATA[<p>For those who are interested I&#8217;m going to start documenting the upgrades and improvements I&#8217;m making to citynoise.org over the coming months. The site has been struggling under some pretty heavy traffic and several internal optimisations including query caching for some of the more complex database operations has gone a long way towards making the site feel usable again.</p>
<h2>Syndication Feeds</h2>
<p><img src="http://jamazon.co.uk/wp-content/uploads/2008/06/twitterfeed.png" alt="" title="twitterfeed" width="125" height="120" align="right" />Since the beginning of time citynoise.org has had an <a href="http://citynoise.org/rss091.php">RSS 0.91 feed</a>, and a broken one at that, but the most recent upgrade has provided solid and stable feeds in a variety of formats including <a href="http://citynoise.org/feed/rss1.0">RRS 1.0</a>, <a href="http://citynoise.org/feed/rss2.0">RSS 2.0</a> and <a href="http://citynoise.org/feed/atom0.3">ATOM</a>. On top of this <a href="http://citynoise.org/author/peter">Peter</a> has implemented a nice <a href="http://twitter.com/citynoisedotorg">Twitter feed</a> using&#8230; um <a href="http://twitterfeed.com/">twitterfeed</a></p>
<p>The old RSS URL points at the new RSS 0.91 feed so there&#8217;s no need to update your bookmarks/aggregator/whatever. Unless you want to.</p>
<h2>Namespaces and hackable URLS</h2>
<p>An important part of any social site IMO is the URL scheme. Hackable urls, that is URLS which the user can inuitively modify to navigate the site in a way which suits them, are integral to this. To this end the &#8220;articles by location&#8221; pages which were previously in the format </p>
<p><a href="http://citynoise.org/hood/london@uk">http://citynoise.org/hood/london@uk</a> </p>
<p>are now in the format </p>
<p><a href="http://citynoise.org/place/uk/london">http://citynoise.org/place/uk/london</a><br />
This makes it much more obvious that the URLs are &#8216;hackable&#8217; in that you can remove the &#8216;london&#8217; segment and use <a href="http://citynoise.org/place/uk">http://citynoise.org/place/uk</a> to view all articles in the UK.</p>
<p>All pages are still available at their old &#8220;hood&#8221; addresses for backwards compatibility.</p>
<h2>Climbing The Technorati Tree</h2>
<p>Every new post is now automatically submitted to Technorati and a handful of other aggregators. This should ensure maximum exposure for new posts especially if they&#8217;re tagged correctly. The next step here would be ensuring posters tag their posts adequately. It makes all the difference.</p>
<p>[[wiki:topic here]] style Wikipedia links also now configured to work as tags within the &#8216;blogosphere&#8217;, though this isn&#8217;t yet detailed anywhere on the site.</p>
<p>More to come soon&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/projects/2008/06/13/all-change-at-citynoise-dot-org/feed/</wfw:commentRss>
		</item>
		<item>
		<title>BBC IPlayer XOR Decryption</title>
		<link>http://jamazon.co.uk/rants/2008/06/11/bbc-iplayer-xor-decryption/</link>
		<comments>http://jamazon.co.uk/rants/2008/06/11/bbc-iplayer-xor-decryption/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 11:31:42 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Rants]]></category>

		<category><![CDATA[anti-DRM]]></category>

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

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

		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://jamazon.co.uk/?p=79</guid>
		<description><![CDATA[As has been widely reported, it is still possible to successfully download the x264  MPEG streams of BBC programmes from the BBC IPlayer service but that they are now XOR &#8220;encrypted&#8221; in such a way that they will only play on Apple mobile devices.

It&#8217;s not really encryption, is it
Long story short, the streams are [...]]]></description>
			<content:encoded><![CDATA[<p>As has been <a href="http://po-ru.com/diary/bbc-iplayer-countermeasures-prove-futile-yet-again/">widely reported,</a> it is still possible to successfully download the x264  MPEG streams of BBC programmes from the BBC IPlayer service but that they are now XOR &#8220;encrypted&#8221; in such a way that they will only play on Apple mobile devices.</p>
<p><img src="/wp-content/uploads/2008/07/iplayer.jpg" width="530" height="190" alt="BBC IPlayer XOR Decryption"/></p>
<h2>It&#8217;s not really encryption, is it</h2>
<p>Long story short, the streams are XOR&#8217;d with a two-byte repeating pattern. It&#8217;s not yet clear how the iPhone picks up the two-byte key for this XOR scheme, or what kind of inside knowledge was needed to discover the capability (collusion?), but it&#8217;s rumoured that the XOR scheme has actually broken the iPod Touch functionality. If this is true it&#8217;s a massive WTF and probably rules out any idea of the BBC colluding with Apple over this.</p>
<p>Putting the moral arguments for the BBC&#8217;s latest move aside for a second. It&#8217;s fairly simple to deXOR the files and there are already a handful of pre-written scripts for doing just that.</p>
<h2>So, What Are The Options?</h2>
<p>Paul Battley has <a href="http://po-ru.com/diary/bbc-iplayer-countermeasures-prove-futile-yet-again/">patched his iplayer-dl</a> script so that it will continue to function in light of the XOR encryption. He&#8217;s also planning on patching the Windows GUI version for n00bs.</p>
<p>There&#8217;s a nice little <a href="http://linuxcentre.net/iplayer_decode">perl script</a> which should prove pretty useful for those of use already using one of the perl based solutions to access the TV shows we&#8217;re forced to pay for.</p>
<p>Most interestingly i&#8217;ve found some C++ code for decrypting the streams which is available at <a href="http://beebhack.wikia.com/wiki/Iplayerdexor">beebhack</a> along with simple instructions for how to compile it for use.</p>
<p>The cat and mouse game continues. Yawn.</p>
<p><strong>Update: June 12th 2008</strong> Paul Battley has <a href="http://po-ru.com/diary/iplayer-downloading-fixes-and-enhancements/">released updated versions</a> of both his ruby command line tool and the Windows GUI download client. Not only that but this morning, new releases of both have appeared which utilise faster XOR decryption. <a href="http://po-ru.com/diary/faster-decryption-for-iplayer-downloads/">His blog post</a> details the changes.</p>
<p>The new project page for iPlayer Downloader is at <a href="http://po-ru.com/projects/iplayer-downloader/">http://po-ru.com/projects/iplayer-downloader/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/rants/2008/06/11/bbc-iplayer-xor-decryption/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tips for Using JQuery with ASP.NET Ajax</title>
		<link>http://jamazon.co.uk/web/2008/06/09/tips-for-using-jquery-with-aspnet-ajax/</link>
		<comments>http://jamazon.co.uk/web/2008/06/09/tips-for-using-jquery-with-aspnet-ajax/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 08:21:20 +0000</pubDate>
		<dc:creator>Jamie Thompson</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[asp.net]]></category>

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

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

		<guid isPermaLink="false">http://jamazon.co.uk/?p=78</guid>
		<description><![CDATA[Dave Ward has put together an excellent and extensive post on his experiences integrating jQuery with ASP.NET
There are the usual number of pitfalls you&#8217;d expect when integrating [insert widely-used microsoft technology here] with [insert useful open source technology here]
Want to consume a JSON Web Service with jQuery? Sounds simple. That&#8217;s kinda the point of JSON [...]]]></description>
			<content:encoded><![CDATA[<p>Dave Ward has put together an <a href="http://encosia.com/2008/06/05/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/">excellent and extensive post</a> on his experiences integrating jQuery with ASP.NET</p>
<p>There are the usual number of pitfalls you&#8217;d expect when integrating <em>[insert widely-used microsoft technology here]</em> with <em>[insert useful open source technology here]</em></p>
<p>Want to consume a JSON Web Service with jQuery? Sounds simple. That&#8217;s kinda the point of JSON right? Well yeah, but no. Everything&#8217;s workaroundable and to be fair it isn&#8217;t all Microsoft&#8217;s fault&#8230; ok so most of it is.</p>
<p>I&#8217;m gonna be starting a large scale ASP.NET / jQuery / ExtJS project in the very near future and Dave&#8217;s short guide has probably just saved me several hours if not a whole day of figuring out all the lumps and bumps myself.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamazon.co.uk/web/2008/06/09/tips-for-using-jquery-with-aspnet-ajax/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
