<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEUBRHg7cSp7ImA9WhVUGEQ.&quot;"><id>tag:blogger.com,1999:blog-19519354</id><updated>2012-05-24T21:44:15.609+01:00</updated><category term="GIS" /><category term="Personal" /><category term="Google Maps" /><category term="Wireless" /><category term="Vista" /><category term="IE9" /><category term="OS OpenData" /><category term="SQL Server" /><category term="Google Docs" /><category term="Virtual Earth" /><category term="AJAX" /><category term="Metastorm" /><category term="JScript.NET" /><category term="VB.NET" /><category term="Windows Live Writer" /><category term="Cycling" /><category term="London" /><category term="Oracle" /><category term="Skype" /><category term="Programming" /><category term="ASP.NET" /><category term="Finance" /><category term="Web" /><category term="Environment" /><category term="FreeFlow" /><category term="Windows Workflow" /><category term="OS OpenSpace" /><category term="FxCop" /><category term="Delphi" /><category term="Dell" /><category term="Work" /><category term="Friend Connect" /><category term="Spam" /><category term="JScript" /><category term="FireFox" /><category term="Windows 7" /><category term="IE7" /><category term="TV" /><category term="jQuery" /><category term="XSLT" /><category term="IE6" /><category term="CSS" /><category term="Music" /><category term="Films" /><category term="Visio" /><category term="Jobs" /><category term="Business Optix" /><category term="BPM" /><category term="Postcodes" /><category term="IIS" /><category term="MapPoint" /><category term="Google" /><category term="Random Pub Finder" /><category term="Blogging" /><category term="C#" /><category term="PHP" /><category term="Maths" /><category term="AdSense" /><category term="Google Analytics" /><category term="iTunes" /><category term="SEO" /><category term="WCF" /><category term="Trains" /><category term="flickr" /><category term="IE8" /><category term="Sharepoint" /><category term="HTML" /><category term="MySql" /><category term="SonicWall" /><category term="JavaScript" /><category term="WPF" /><category term="Football" /><category term="ZX Spectrum" /><category term="House prices" /><category term=".NET" /><category term="Books" /><title>Doogal Bell's bloggy thing</title><subtitle type="html">"quite amusing and drastically geeky at the same time"</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://doogalbellend.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>522</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/DoogalBellsBloggyThing" /><feedburner:info uri="doogalbellsbloggything" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CEUBRHg5fyp7ImA9WhVUGEQ.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-61682992145539104</id><published>2012-05-24T21:44:00.001+01:00</published><updated>2012-05-24T21:44:15.627+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-24T21:44:15.627+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><title>I don’t rate Rated People</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lgPQQlqz6mu3YRA6bYN-6GhtI9U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lgPQQlqz6mu3YRA6bYN-6GhtI9U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lgPQQlqz6mu3YRA6bYN-6GhtI9U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lgPQQlqz6mu3YRA6bYN-6GhtI9U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You’ve probably seen the adverts where Phil Spencer, the man whose remarkable negotiating skills can sometimes get £5,000 knocked off a £500,000 house purchase, tells us about this remarkable website which can connect us punters with local tradesmen. To me this seems like a good idea for a website and I have some work that needs doing, so thought I’d give it a spin. &lt;/p&gt;  &lt;p&gt;So I filled in my details, entered the job details and waited for a response. And then, nothing. OK, not entirely true, I received a couple of text messages and emails. A couple of days passed and I received an email telling me that I hadn’t had a response and maybe I should expand on my job description to get a response. So off I went and updated the description and hit submit and then I was presented with a 404 error (for the non technical, this means the website is broken). So I tried again and got the same result (definition of insanity - doing the same thing over and over again and expecting different results). And I gave up at that point.&lt;/p&gt;  &lt;p&gt;OK, slightly annoying, but no worries, I’ll drop them an email and let them know and I’ll update the description later when it’s fixed. So I go to their contact page. I can ring them, but not at this time or I can send them a tweet or write on their Facebook page or add a comment to their blog. No feedback form, no email address. I didn’t particularly want to berate them on a public forum, maybe the problem is something specific to me, so none of those options appealed. Yes, yes, I see the irony, I am now berating them quite publically (hello my many reader), but I’m annoyed now. &lt;/p&gt;  &lt;p&gt;So, so far, Rated People is something of a failure for me. I think if you’re going to be spending a bunch of money on TV advertising, quite a bit of effort should also be spent on the product… &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-61682992145539104?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/w5ikcgw4QFI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/61682992145539104/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=61682992145539104" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/61682992145539104?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/61682992145539104?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/w5ikcgw4QFI/i-dont-rate-rated-people.html" title="I don’t rate Rated People" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/05/i-dont-rate-rated-people.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcDQ349fCp7ImA9WhVVGUk.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-4576961893666595424</id><published>2012-05-13T21:14:00.001+01:00</published><updated>2012-05-13T21:14:32.064+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-13T21:14:32.064+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cycling" /><title>Smart phone + app + bike mounting &gt; bike computer</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/B9UL3pnDvDptCt6o73H2HR2DUkE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B9UL3pnDvDptCt6o73H2HR2DUkE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/B9UL3pnDvDptCt6o73H2HR2DUkE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/B9UL3pnDvDptCt6o73H2HR2DUkE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I recently took possession of a new Nokia Lumia 800, thanks to work, and immediately thought it would make a great replacement for my &lt;a href="http://doogalbellend.blogspot.co.uk/2012/03/veloset-gps-600-bike-computer-review.html"&gt;Veloset GPS 600 bike computer&lt;/a&gt;. Hearing Windows Phone didn’t have many apps, I thought I’d have to write my own biking app, but it turns out there are already a couple available, both free. &lt;/p&gt;  &lt;p&gt;The first is &lt;a href="http://www.windowsphone.com/en-GB/apps/c1567ce6-f8b0-4519-87b0-63f3de6f85f7?wa=wsignin1.0"&gt;MapMyRide&lt;/a&gt;. This initially seemed pretty good, but it has one fatal flaw, it lets the phone go to sleep. If you want to look at the map as you ride it is pretty tricky. You really don’t want to be fiddling with your phone when you’re riding.&lt;/p&gt;  &lt;p&gt;Next up is &lt;a href="http://www.appwp.com/fitness/mybikemap-for-windows-phone-7-9396"&gt;MyBikeMap&lt;/a&gt;, which has one big advantage in that it doesn’t let the phone sleep, so I can look at my map all the time during my ride. It’s also well designed, with a simple user interface and showing just the pertinent information on the screen displayed when riding. It’s not perfect, my main complaint is the lack of support for miles, but it’s hard to complain too much when it’s free and it does most of what I want.&lt;/p&gt;  &lt;p&gt;The final piece of the puzzle is something to attach the phone to my bike. I went for &lt;a href="http://www.buybits.com/Product/13956/Easy-Fit-Nokia-Lumia-800-Cycle-Bike-Mount-sku-13956.aspx"&gt;this mounting&lt;/a&gt;, primarily because it came up first on a Google search. The phone fits it perfectly and I was pleased to realise I could leave the zip open slightly to still have access to the buttons and I was able to use the touch screen through the plastic cover. But it does have a somewhat major problem as I found out today. Although the coupling between cover and bracket on the bike is perfectly adequate when riding on a road, if it gets a jolt then the cover (and the phone) can go flying. And you might not even notice until you look down some time later. &lt;/p&gt;  &lt;p&gt;The design of the mounting is kind of weird, the cover is attached to the bracket not once but twice. One of these couplings is pretty secure, but the other isn’t. So the solution I’ve come up with is to glue the weaker coupling and I’m hoping this solves the problem. But you may want to consider this issue before purchasing this mounting.&lt;/p&gt;  &lt;p&gt;But other than the teething problems, I’m pretty happy with this set up. It’s great to have a map in front of me as I ride, since it gives me much more opportunity to try heading off down a road or track that I don’t know without worrying about getting completely lost. And it makes me think the market for high end bike computers may not last much longer. Why spend £200 on one of them when a smart phone can do the same job?&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-4576961893666595424?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/amFG7qDq90o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/4576961893666595424/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=4576961893666595424" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4576961893666595424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4576961893666595424?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/amFG7qDq90o/smart-phone-app-bike-mounting-bike.html" title="Smart phone + app + bike mounting &amp;gt; bike computer" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/05/smart-phone-app-bike-mounting-bike.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQCRXg5eCp7ImA9WhVVGEg.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-7417175367676897501</id><published>2012-05-12T21:09:00.001+01:00</published><updated>2012-05-12T21:09:24.620+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-12T21:09:24.620+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google Maps" /><title>KmlLayer error handling in Google Maps</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0W8N-3dTfXCixdFEz5-Dql829rM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0W8N-3dTfXCixdFEz5-Dql829rM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0W8N-3dTfXCixdFEz5-Dql829rM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0W8N-3dTfXCixdFEz5-Dql829rM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Two years ago I noted that &lt;a href="http://doogalbellend.blogspot.co.uk/2010/06/debugging-kml-loading-problems-in.html"&gt;the KmLayer in Google Maps didn’t provide an event to inform me if there was a problem when loading the KML&lt;/a&gt;. Things have moved on and an event has been added to the API at some point. Usage is as follows.&lt;/p&gt;  &lt;pre&gt;  var kmlLayer = new google.maps.KmlLayer(url, { map: map });
  google.maps.event.addListener(kmlLayer, 'status_changed', function() {
    if (kmlLayer.getStatus() == 'OK')
      $('#status').html('');
    else
      $('#status').html('KML loading problem - ' + kmlLayer.getStatus());
  });&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-7417175367676897501?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/L98oVV17s9E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/7417175367676897501/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=7417175367676897501" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/7417175367676897501?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/7417175367676897501?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/L98oVV17s9E/kmllayer-error-handling-in-google-maps.html" title="KmlLayer error handling in Google Maps" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/05/kmllayer-error-handling-in-google-maps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YARng5fip7ImA9WhVXFE4.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-5163400878037702946</id><published>2012-04-14T22:32:00.001+01:00</published><updated>2012-04-14T22:32:27.626+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-14T22:32:27.626+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="AdSense" /><title>How to increase your AdSense revenue</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Cbnrv4YOFKALD_sYdABIPUlV0kg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Cbnrv4YOFKALD_sYdABIPUlV0kg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Cbnrv4YOFKALD_sYdABIPUlV0kg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Cbnrv4YOFKALD_sYdABIPUlV0kg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;My &lt;a href="http://www.doogal.co.uk/"&gt;proper website&lt;/a&gt; has been around for about 12 years. For most of that time it had very few visitors and the money I made from advertising was minimal. Then a couple of years ago advertising revenue started going up. It’s now plateaued but I earn a nice wedge of cash ever month, not enough to give up the day job but enough to add a decent amount to my income. So what’s my secret and how can you do the same thing?&lt;/p&gt;  &lt;p&gt;Firstly, you can optimise the placement, colours and number of AdSense units. Now this may well improve your revenue but the problem is it is almost impossible to figure out if revenue increased due to changes to your ads or just due to random fluctuations. Take a look at my daily income over the past month.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-kv_QmOE0le4/T4ns5J8UXJI/AAAAAAAAAME/uQrcMKzWcpU/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-kyvA15whzcA/T4ns6V2sxTI/AAAAAAAAAMM/Ck-hMM5WGlA/image_thumb%25255B1%25255D.png?imgmax=800" width="745" height="134" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;There’s a lot of volatility in those figures. Admittedly you can slice the data in different ways which can produce better results but even with no changes to my ad setup, the daily numbers are all pretty volatile. And if you aren’t making a lot of cash from your ads, your figures are likely even more volatile. So I figure if you want to optimise you ad setup, then you need to be looking at weekly or monthly numbers, so the feedback loop on changes is going to be pretty slow. To be frank the limit of my optimisation of ads is to increase the number of ad units to three (the maximum allowed and also probably the maximum number that wouldn’t be too annoying to a user of you site).&lt;/p&gt;  &lt;p&gt;So what did cause the increase in my income? Simple really, an increasing number of visitors. My graph of monthly visitors and my graph of monthly AdSense revenue are almost identical. So unfortunately the answer to the question of how to increase AdSense revenue is another question, how to increase the number of visitors to your site. &lt;/p&gt;  &lt;p&gt;And the answer to that question is actually pretty straightforward I reckon. The first part is fully within your control - Produce a lot of content of a reasonably quality. i.e Content that search engines will consider to be of value and hence index. The second part isn’t completely within your control, gain some inbound links from reputable sites. I actually think this will naturally follow from producing content that people appreciate.&lt;/p&gt;  &lt;p&gt;In some ways I can’t help thinking this is the business model that Facebook has adopted, get a shedload of content (although in their case its helpfully created by their own users) and shove ads on it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-5163400878037702946?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/MIIrNotxWlw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/5163400878037702946/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=5163400878037702946" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/5163400878037702946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/5163400878037702946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/MIIrNotxWlw/how-to-increase-your-adsense-revenue.html" title="How to increase your AdSense revenue" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-kyvA15whzcA/T4ns6V2sxTI/AAAAAAAAAMM/Ck-hMM5WGlA/s72-c/image_thumb%25255B1%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/04/how-to-increase-your-adsense-revenue.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8FQHc_fyp7ImA9WhVXE0k.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-4492885168281043725</id><published>2012-04-13T20:18:00.001+01:00</published><updated>2012-04-13T20:20:11.947+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-13T20:20:11.947+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TV" /><title>Fun with flags</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZiHg9-PaaxL2kO2mRuD372qY3zo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZiHg9-PaaxL2kO2mRuD372qY3zo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZiHg9-PaaxL2kO2mRuD372qY3zo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZiHg9-PaaxL2kO2mRuD372qY3zo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The Big Bang Theory hasn’t been quite the same since the geeks started to pair off with girlfriends (since half the humour was about them failing spectacularly in their endeavours with the opposite sex), but Sheldon’s recent video podcast ‘Fun with flags’ was rather splendid. &lt;/p&gt; &lt;iframe height="315" src="http://www.youtube.com/embed/Xl12Sp1KiEk" frameborder="0" width="560" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-4492885168281043725?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/oMnnnfIRsrw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/4492885168281043725/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=4492885168281043725" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4492885168281043725?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4492885168281043725?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/oMnnnfIRsrw/fun-with-flags.html" title="Fun with flags" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/Xl12Sp1KiEk/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/04/fun-with-flags.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8AR3o5fip7ImA9WhVQGE4.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-2147002798595800396</id><published>2012-04-07T22:07:00.001+01:00</published><updated>2012-04-07T22:07:26.426+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-07T22:07:26.426+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><title>Creepy ads</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LMXCbv4G87lIpgPoWTsn3i7AE_U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LMXCbv4G87lIpgPoWTsn3i7AE_U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LMXCbv4G87lIpgPoWTsn3i7AE_U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LMXCbv4G87lIpgPoWTsn3i7AE_U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I’m used to visiting a website and their adverts then following me round the web afterwards. It’s happened with Dell and some property website. They even seem to make an effort to show me relevant stuff (laptops I was looking at or properties in the area I looked at). Then after a few days they disappear. I find it a bit creepy and it’s a bit of an eye opener to realise what the ad companies know about me (or about the cookie that’s sat on my machine). &lt;/p&gt;  &lt;p&gt;But there’s an advert that’s been following me around for months now, for LeanKit Enterprise Kanban. I’m pretty sure this ad can’t be getting shown to everybody on the web, since this is a pretty niche product, so I can only assume it’s appearing because I visited their site ages ago. This has gone beyond creepy, this is just plain weird. Is showing me the same ad for months on end actually effective? Are the advertisers paying a premium for it? &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-2147002798595800396?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/YYqR6SJuSMA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/2147002798595800396/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=2147002798595800396" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2147002798595800396?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2147002798595800396?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/YYqR6SJuSMA/creepy-ads.html" title="Creepy ads" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/04/creepy-ads.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcHSHw6fip7ImA9WhVQF00.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-2981129491337394318</id><published>2012-04-06T10:53:00.001+01:00</published><updated>2012-04-06T10:53:59.216+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-06T10:53:59.216+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><title>Cross browser selectSingleNode for XML in Javascript</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cVyLDFOfcWTsgUwWFBRc0x1bWRw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cVyLDFOfcWTsgUwWFBRc0x1bWRw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cVyLDFOfcWTsgUwWFBRc0x1bWRw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cVyLDFOfcWTsgUwWFBRc0x1bWRw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Internet Explorer has a non-standard method available in XML documents called &lt;font face="Courier New"&gt;selectSingleNode&lt;/font&gt;. Pass in some XPath and it returns the first node that matches the XPath. Other browsers have ways of doing the same thing, but they are more long winded. So in short, I like the IE implementation and since I don’t fiddle with XML in JavaScript that often I often forget that &lt;font face="Courier New"&gt;selectSingleNode&lt;/font&gt; is not supported on all browsers (and if you’re wondering why I use IE as my primary browser, it’s because it’s still, just about, the most popular browser out there).&lt;/p&gt;  &lt;p&gt;So here’s a cross browser version of &lt;font face="Courier New"&gt;selectSingleNode&lt;/font&gt; (not my own work, copy and pasted from somewhere I can’t remember on the web)&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;    function &lt;/span&gt;SelectSingleNode(xmlDoc, elementPath) {
      &lt;span style="color: blue"&gt;if &lt;/span&gt;(xmlDoc.evaluate) {
        &lt;span style="color: blue"&gt;var &lt;/span&gt;nodes = xmlDoc.evaluate(elementPath, xmlDoc, &lt;span style="color: blue"&gt;null&lt;/span&gt;, XPathResult.ANY_TYPE, &lt;span style="color: blue"&gt;null&lt;/span&gt;);
        &lt;span style="color: blue"&gt;var &lt;/span&gt;results = nodes.iterateNext();
        &lt;span style="color: blue"&gt;return &lt;/span&gt;results;
      }
      &lt;span style="color: blue"&gt;else
        return &lt;/span&gt;xmlDoc.selectSingleNode(elementPath); 
    }&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-2981129491337394318?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/OlLzIPsKb8I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/2981129491337394318/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=2981129491337394318" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2981129491337394318?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2981129491337394318?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/OlLzIPsKb8I/cross-browser-selectsinglenode-for-xml.html" title="Cross browser selectSingleNode for XML in Javascript" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/04/cross-browser-selectsinglenode-for-xml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMFQ3c8fSp7ImA9WhVREUQ.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-5684779839936993672</id><published>2012-03-19T20:53:00.001Z</published><updated>2012-03-19T20:53:32.975Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-19T20:53:32.975Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogging" /><category scheme="http://www.blogger.com/atom/ns#" term="Business Optix" /><title>Business Optix blog now live</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fkwRIAG7wzXttkfP-Wog2COvbYo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fkwRIAG7wzXttkfP-Wog2COvbYo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fkwRIAG7wzXttkfP-Wog2COvbYo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fkwRIAG7wzXttkfP-Wog2COvbYo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The &lt;a href="http://www.businessoptix.com/Blog.aspx"&gt;blog of my employer Business Optix&lt;/a&gt; has gone live. We’ll be posting there as we roll out new features to our web and desktop products, along with tips and tricks to use the current software and any other company news. Keep up to date by signing up to the &lt;a href="http://www.businessoptix.com/DesktopModules/DnnForge%20-%20NewsArticles/Rss.aspx?TabID=123&amp;amp;ModuleID=536&amp;amp;MaxCount=25"&gt;RSS feed&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-5684779839936993672?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/28k7vDcBVsc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/5684779839936993672/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=5684779839936993672" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/5684779839936993672?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/5684779839936993672?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/28k7vDcBVsc/business-optix-blog-now-live.html" title="Business Optix blog now live" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/03/business-optix-blog-now-live.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYHSHc8eip7ImA9WhVVGUk.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-4100618917012194125</id><published>2012-03-10T17:35:00.001Z</published><updated>2012-05-13T21:15:39.972+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-13T21:15:39.972+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Cycling" /><title>Veloset GPS 600 bike computer review</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/b1RBhYZI9OEg31nWJIiQYZ7YPGI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b1RBhYZI9OEg31nWJIiQYZ7YPGI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/b1RBhYZI9OEg31nWJIiQYZ7YPGI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b1RBhYZI9OEg31nWJIiQYZ7YPGI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;My first foray into the world of bike computers was a &lt;a href="http://www.amazon.co.uk/gp/product/B002NGSFP6"&gt;Sigma 1609&lt;/a&gt; device. I quite liked it, since it was simple to use with a clear display, big chunky buttons and a very low price. The only minor downside was a certain amount of faffing around required to get it configured initially since it needed to know how big my wheels were.&lt;/p&gt;  &lt;p&gt;But one day on my ride to work, a driver decided it would be a good idea to pull out at a junction without looking to see if anybody was coming and knocked me to the ground in the process. As I dusted myself off at the side of the road I heard a crunching sound and realised me and my bike had successfully got to the road side but my Sigma hadn’t.&lt;/p&gt;  &lt;p&gt;So it was time to get another bike computer, since they are quite addictive. Being a map geek, I thought it was time I bought one with GPS, so I could map my routes on my PC. The &lt;a href="http://www.amazon.co.uk/gp/product/B004RAP23O"&gt;Veloset GPS 600&lt;/a&gt; caught my eye, since it was probably the cheapest GPS enabled bike computer available. &lt;/p&gt;  &lt;p&gt;And it when it arrived first impressions were good, coming in a nice attractive box. But firing it up was disappointing. For some reason it uses a butt ugly font to display text and since it’s only a small device it’s not only ugly but difficult to read as well. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-qDQiYSXPEH4/T1uQ1tCd-EI/AAAAAAAAALo/166riLz_eJA/s1600-h/image%25255B2%25255D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://lh4.ggpht.com/-dTPKROmo7L0/T1uQ2vmiH7I/AAAAAAAAALw/ZFndiIAGrHQ/image_thumb.png?imgmax=800" width="244" height="126" /&gt;&lt;/a&gt;And things got worse when I fired up the accompanying software, which is possibly the ugliest software I’ve seen in my life. For people used to fondling iPads and the like, this will probably be a grave disappointment. But it does what it needs to do, importing data from the computer and displaying it in various graphs (speed, altitude) and on a map. It does consistently show my average speed as being higher than my maximum speed, which my basic grasp of maths suggests is incorrect, but other than that it seems to function correctly.&lt;/p&gt;  &lt;p&gt;Which can also be said for the bike computer itself. It’s not the prettiest device ever but it does what it needs to do, displaying current speed, average speed (this time accurately!), distance covered, altitude, journey time etc. I’m not particularly keen on the touchpad buttons, since it’s easy to press them by accident and it’s impossible to press them at all when wearing gloves. Also on occasion the GPS seems to take a while to switch itself on, so the starts of journeys are sometimes lost. &lt;/p&gt;  &lt;p&gt;So in conclusion, it’s the cheapest GPS enabled bike computer available and it shows in the presentation. It’s not a device you’ll fall in love with, but it does do everything it needs to do. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-4100618917012194125?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/A4807Pk7Wb0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/4100618917012194125/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=4100618917012194125" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4100618917012194125?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4100618917012194125?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/A4807Pk7Wb0/veloset-gps-600-bike-computer-review.html" title="Veloset GPS 600 bike computer review" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-dTPKROmo7L0/T1uQ2vmiH7I/AAAAAAAAALw/ZFndiIAGrHQ/s72-c/image_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/03/veloset-gps-600-bike-computer-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkICQ308fip7ImA9WhVSEEs.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-6532643544865837251</id><published>2012-03-06T21:16:00.001Z</published><updated>2012-03-06T21:16:02.376Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-06T21:16:02.376Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Finding a UserPrincipal for an email address</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NQ2O3hkzRXm48OkMrIDIvNx1GM8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NQ2O3hkzRXm48OkMrIDIvNx1GM8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NQ2O3hkzRXm48OkMrIDIvNx1GM8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NQ2O3hkzRXm48OkMrIDIvNx1GM8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I wanted to let users log in to our application using their Windows user name or their email address. In order to achieve this aim, I needed to get hold of a &lt;font face="Courier New"&gt;UserPrincipal&lt;/font&gt; from the user’s email address so I could then test the password they entered was correct. It took quite a lot of searching to find the relevant code, so I thought I’d post the pertinent part here.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;      PrincipalContext &lt;/span&gt;context = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PrincipalContext&lt;/span&gt;(
        &lt;span style="color: #2b91af"&gt;ContextType&lt;/span&gt;.Domain, &lt;span style="color: #2b91af"&gt;Environment&lt;/span&gt;.UserDomainName);
      
      &lt;span style="color: #2b91af"&gt;UserPrincipal &lt;/span&gt;user = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UserPrincipal&lt;/span&gt;(context);
      user.EmailAddress = &lt;span style="color: #a31515"&gt;&amp;quot;test@test.com&amp;quot;&lt;/span&gt;;

      &lt;span style="color: green"&gt;// create a principal searcher for running a search operation
      &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PrincipalSearcher &lt;/span&gt;pS = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PrincipalSearcher&lt;/span&gt;(user);

      &lt;span style="color: green"&gt;// run the query
      &lt;/span&gt;&lt;span style="color: #2b91af"&gt;PrincipalSearchResult&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Principal&lt;/span&gt;&amp;gt; results = pS.FindAll();

      &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Principal &lt;/span&gt;result &lt;span style="color: blue"&gt;in &lt;/span&gt;results)
      {
        &lt;span style="color: green"&gt;// do something useful...
      &lt;/span&gt;}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-6532643544865837251?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/y4V41GRvQWk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/6532643544865837251/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=6532643544865837251" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/6532643544865837251?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/6532643544865837251?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/y4V41GRvQWk/finding-userprincipal-for-email-address.html" title="Finding a UserPrincipal for an email address" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/03/finding-userprincipal-for-email-address.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YFQHg7fCp7ImA9WhRaEkg.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-3716941516063497462</id><published>2012-02-14T21:31:00.001Z</published><updated>2012-02-14T21:31:51.604Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-14T21:31:51.604Z</app:edited><title>The scale of the universe</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0VkMcRJYiYeU63N2hmsHsmqmiWs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0VkMcRJYiYeU63N2hmsHsmqmiWs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0VkMcRJYiYeU63N2hmsHsmqmiWs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0VkMcRJYiYeU63N2hmsHsmqmiWs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If like me you find it hard to grasp how the tiny the tiniest things are and how massively huge the biggest things are, then have a look at this&lt;/p&gt;  &lt;p&gt;&lt;a title="http://htwins.net/scale2/" href="http://htwins.net/scale2/"&gt;http://htwins.net/scale2/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I’m not sure our minds can ever fully comprehend these different distances and sizes, but maybe it’ll help…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-3716941516063497462?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/axwdYYrz2-I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/3716941516063497462/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=3716941516063497462" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/3716941516063497462?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/3716941516063497462?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/axwdYYrz2-I/scale-of-universe.html" title="The scale of the universe" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/02/scale-of-universe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcMQn0yfSp7ImA9WhRUGUs.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-4037988371917083746</id><published>2012-01-30T22:20:00.001Z</published><updated>2012-01-30T22:21:23.395Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-30T22:21:23.395Z</app:edited><title>Let’s outsource the bankers</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TrhrGv2N_jBCX42InceExWcp1FE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TrhrGv2N_jBCX42InceExWcp1FE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TrhrGv2N_jBCX42InceExWcp1FE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TrhrGv2N_jBCX42InceExWcp1FE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The main argument for bankers earning vast amounts of money seems to be that in a global market, they’ll just bugger off somewhere else if we can’t match the money available elsewhere. But the odd thing is, for the rest of us, globalization has led to stagnating wages as jobs have been outsourced to countries with cheaper labour. Odd that the free market doesn’t work in the same way for the rich as it does for everyone else. &lt;/p&gt;  &lt;p&gt;So if we assume that maybe this argument is a bit of a fib, and assuming we can find decent replacements in some far off land who are willing to work for a much smaller pay packet, can’t we just outsource all our bankers along with some of our well paid CEOs? That’s some offshoring I wouldn’t mind seeing.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-4037988371917083746?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/WkNfBKWWxWU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/4037988371917083746/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=4037988371917083746" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4037988371917083746?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4037988371917083746?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/WkNfBKWWxWU/lets-outsource-bankers.html" title="Let’s outsource the bankers" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/01/lets-outsource-bankers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EEQng7fip7ImA9WhRUF0U.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-6347841830336282973</id><published>2012-01-28T21:20:00.001Z</published><updated>2012-01-28T21:20:03.606Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-28T21:20:03.606Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Jobs" /><title>Developer interview questions</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n4hmomDEahYiXVlL3pTt-3Iz9Bc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n4hmomDEahYiXVlL3pTt-3Iz9Bc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n4hmomDEahYiXVlL3pTt-3Iz9Bc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n4hmomDEahYiXVlL3pTt-3Iz9Bc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A while back I had to interview some people for a developer role at work so came up with a few questions, combining a few from the web with some of my own. This is essentially a note to myself for next time I’m interviewing.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;jQuery&lt;/strong&gt;    &lt;br /&gt;What's a jQuery selector? How would you select an item by its ID? By its class?    &lt;br /&gt;Give some examples of JQuery UI effects and widgets and what they could be used for&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;.NET     &lt;br /&gt;&lt;/strong&gt;What's an interface? Compare and contrast with an abstract class    &lt;br /&gt;How does memory management differ between .NET and a non-managed language? How can we make .NET behave more like a non-managed language?    &lt;br /&gt;What are generics? Why use List&amp;lt;&amp;gt; instead of ArrayList?    &lt;br /&gt;What's a virtual function? How does it relate to OOP?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Web&lt;/strong&gt;    &lt;br /&gt;What is a RESTful web service? Why are they preferred to SOAP web services?    &lt;br /&gt;What are the common data formats returned by an AJAX web service call? Is one better than the other? What about if you wanted to call it from a fat client?    &lt;br /&gt;Name and describe several HTTP status codes    &lt;br /&gt;Name the various HTTP verbs and when they are used&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;General&lt;/strong&gt;    &lt;br /&gt;Your application has a performance problem, how would you investigate the issue?    &lt;br /&gt;An error occurs in your web application but only in production and only happens occasionally, how do you go about tracking down the problem?    &lt;br /&gt;What are some of the issues around multi-threaded applications?    &lt;br /&gt;Discuss some ways of ensuring code quality remains high in a project    &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-6347841830336282973?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/6UTgZ_8tfok" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/6347841830336282973/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=6347841830336282973" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/6347841830336282973?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/6347841830336282973?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/6UTgZ_8tfok/developer-interview-questions.html" title="Developer interview questions" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/01/developer-interview-questions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0INQHw-eCp7ImA9WhRUEUU.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-2568775615814102999</id><published>2012-01-21T21:33:00.001Z</published><updated>2012-01-21T21:33:11.250Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-21T21:33:11.250Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Do it yourself inbound link alerts</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/O2yL0CK7yQu256vicGGKHPtQbEw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O2yL0CK7yQu256vicGGKHPtQbEw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/O2yL0CK7yQu256vicGGKHPtQbEw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O2yL0CK7yQu256vicGGKHPtQbEw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.embeddedanalytics.com/"&gt;Embedded Analytics&lt;/a&gt; provide a nice service that will email you whenever somebody clicks on a new link to your site. I’ve been signed up for a while and it’s interesting to see who’s linked to my site. But I received an email last week informing me that my site had so many inbound links that I would have to start paying for the service. To be fair the amount they were going to charge me wasn’t a lot, but I couldn’t really justify spending money on something that is essentially just a way to waste a bit of time for me. And I also figured I could probably do the same thing myself through the Google Analytics API, since this is what Embedded Analytics uses.&lt;/p&gt;  &lt;p&gt;I’m assuming that Embedded Analytics uses the source for visitors to your site to spot new links. There is a downside to this since it won’t spot links that have been added but have not been clicked on, but generally these won’t be that interesting, since they presumably are links on low traffic sites. &lt;/p&gt;  &lt;p&gt;So to implement this requires a few steps. Pull out the data from Google Analytics and store this data somewhere (DB, XML file, whatever). Then next time we pull the data out of Google, check for new URLs in the returned data and send a notification of these new URLs. Embedded Analytics also goes a step further and validates that the links are valid and that the pages containing them are available from the web. I was only really interested in the first part of this solution so have written a piece of code to pull out the URLs using the Google Data API for .NET. The rest of the work is left as an exercise for the reader!&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Google.GData.Analytics;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;GoogleAnalytics
{
  &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program
  &lt;/span&gt;{
    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
    {
      &lt;span style="color: #2b91af"&gt;AccountQuery &lt;/span&gt;feedQuery = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;AccountQuery&lt;/span&gt;();
      &lt;span style="color: #2b91af"&gt;AnalyticsService &lt;/span&gt;service = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;AnalyticsService&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;DoogalAnalytics&amp;quot;&lt;/span&gt;);
      service.setUserCredentials(&lt;span style="color: #a31515"&gt;&amp;quot;email&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;);

      &lt;span style="color: #2b91af"&gt;DataQuery &lt;/span&gt;pageViewQuery = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DataQuery&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;https://www.google.com/analytics/feeds/data&amp;quot;&lt;/span&gt;);
      pageViewQuery.Ids = &lt;span style="color: #a31515"&gt;&amp;quot;ga:202885&amp;quot;&lt;/span&gt;;
      pageViewQuery.Metrics = &lt;span style="color: #a31515"&gt;&amp;quot;ga:visits&amp;quot;&lt;/span&gt;;
      pageViewQuery.Dimensions = &lt;span style="color: #a31515"&gt;&amp;quot;ga:source,ga:referralPath&amp;quot;&lt;/span&gt;;
      pageViewQuery.Sort = &lt;span style="color: #a31515"&gt;&amp;quot;ga:source,ga:referralPath&amp;quot;&lt;/span&gt;;
      pageViewQuery.GAStartDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.AddMonths(-1).ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyy-MM-dd&amp;quot;&lt;/span&gt;);
      pageViewQuery.GAEndDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyy-MM-dd&amp;quot;&lt;/span&gt;);

      &lt;span style="color: #2b91af"&gt;DataFeed &lt;/span&gt;feed = service.Query(pageViewQuery);
      &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 0; i &amp;lt; feed.Entries.Count; i++)
      {
        &lt;span style="color: #2b91af"&gt;DataEntry &lt;/span&gt;pvEntry = (&lt;span style="color: #2b91af"&gt;DataEntry&lt;/span&gt;)feed.Entries[i];
        &lt;span style="color: blue"&gt;string &lt;/span&gt;host = pvEntry.Dimensions[0].Value;
        &lt;span style="color: blue"&gt;string &lt;/span&gt;path = pvEntry.Dimensions[1].Value;
        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;http://&amp;quot; &lt;/span&gt;+ host + path);
      }

      &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine();
    }
  }
}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-2568775615814102999?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/6iP2lP-BYKc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/2568775615814102999/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=2568775615814102999" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2568775615814102999?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2568775615814102999?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/6iP2lP-BYKc/do-it-yourself-inbound-link-alerts.html" title="Do it yourself inbound link alerts" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/01/do-it-yourself-inbound-link-alerts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUASH0-eip7ImA9WhRWGEU.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-5833016473415389696</id><published>2012-01-06T21:44:00.001Z</published><updated>2012-01-06T21:44:09.352Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-06T21:44:09.352Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><category scheme="http://www.blogger.com/atom/ns#" term="Finance" /><title>Another take on peer to peer lending</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1UtRJTbOgs_Rm5M2edYCzTAhPTY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1UtRJTbOgs_Rm5M2edYCzTAhPTY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1UtRJTbOgs_Rm5M2edYCzTAhPTY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1UtRJTbOgs_Rm5M2edYCzTAhPTY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;It seems a little strange to me that at a time when banks are meant to be desperately trying to increase their balance sheets, they are offering such meagre interest rates. I dunnow but maybe offer some decent rates and people will shove their money in your bank? But it seems they have decided it’s better to offer crap rates and hope we are too stupid to realise we can get better returns elsewhere.&lt;/p&gt;  &lt;p&gt;So for a few years I’ve been stashing cash in &lt;a href="http://www.zopa.co.uk"&gt;Zopa&lt;/a&gt; and getting a return that manages to beat inflation by lending money directly to people, with the caveat that there is a higher level of risk than having money in the bank. &lt;/p&gt;  &lt;p&gt;But I’m obviously not the only person to choose this option and rates have been falling of late. And although I’m happy to finance personal loans, i did have a hankering to lend money to businesses, especially since this seems to be something else banks are failing to do properly*&lt;/p&gt;  &lt;p&gt;Which is where &lt;a href="http://www.fundingcircle.com/"&gt;Funding Circle&lt;/a&gt; comes in. This is peer to peer lending but the other party is a business. Interest rates are currently some what better than Zopa. Time will tell how bad the default rates are but I’m going to drip feed some money in there and see how it pans out.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;*I always thought banking was pretty straightforward, take in money from deposits, then lend it out to other people and skim a bit of profit from the transaction. Simple and a bit boring. Maybe they should have stuck to this slightly dull job, rather than inventing, buying and selling insane derivatives that nobody understands and nobody can quantify the associated risk. Get back to doing what you’re meant to do and people might get off your back a bit…&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-5833016473415389696?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/X4CyJLXIaeM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/5833016473415389696/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=5833016473415389696" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/5833016473415389696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/5833016473415389696?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/X4CyJLXIaeM/another-take-on-peer-to-peer-lending.html" title="Another take on peer to peer lending" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2012/01/another-take-on-peer-to-peer-lending.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8NQXk8fip7ImA9WhVSEEs.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-3831517116345444263</id><published>2011-12-30T11:16:00.001Z</published><updated>2012-03-06T21:21:30.776Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-06T21:21:30.776Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web" /><title>Why all the free ads for Facebook?</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D5DjOremUjAA-VUd4xECtSAGs3s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D5DjOremUjAA-VUd4xECtSAGs3s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/D5DjOremUjAA-VUd4xECtSAGs3s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D5DjOremUjAA-VUd4xECtSAGs3s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;A while back I picked up a copy of the Evening Standard and was surprised to see Facebook and Twitter logos at the top of every page, suggesting readers follow ES on these two websites. And this is just an extreme example of what I’m seeing more and more. Ads on the telly and in newspapers no longer show the URL of the company’s website, but the URL of their Facebook page instead.&lt;/p&gt;  &lt;p&gt;But the thing that confuses me is why big companies would choose Facebook as their main point of contact with their customers? Sure, social networks are the big thing at the moment and getting users to follow you or like your product might have some benefit, but there seem to be a number of downsides.&lt;/p&gt;  &lt;p&gt;First, who owns all the data being collected about your customers? My guess is Facebook. Can you extract that data if Facebook decide they don’t want you anymore or you decide to move? I guess it’s probably possible via the Facebook API but it seems somewhat risky. And even if you do extract it, Facebook will no doubt keep hold of it as well.&lt;/p&gt;  &lt;p&gt;Then there’s the question of ads. The company pages I’ve seen on Facebook seem to have the same ads as any other page. I’ve found no indication that companies get any of the income from those ads, so why drive traffic to Facebook so they can make money from your brand? And what if Facebook decide to show ads for one of your competitors?&lt;/p&gt;  &lt;p&gt;Frankly it all seems a bit odd. Big companies have big IT departments and generally have their own websites, fully under their control. It is pretty simple to add some Facebook widgets to your own site and get integration that way which seems a more sane approach if you want to get hooked into Facebook.&lt;/p&gt;  &lt;p&gt;For a one man band kind of company, I can see the sense in putting you web presence on Facebook, it’s a lot simpler and cheaper than building your own website, but for multi-nationals my prediction for 2012 is that this is something they do much less of.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-3831517116345444263?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/erpAD1dDEjY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/3831517116345444263/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=3831517116345444263" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/3831517116345444263?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/3831517116345444263?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/erpAD1dDEjY/why-all-free-ads-for-facebook.html" title="Why all the free ads for Facebook?" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/12/why-all-free-ads-for-facebook.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cNSX89cCp7ImA9WhRXGU8.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-1434592245753397421</id><published>2011-12-26T19:46:00.001Z</published><updated>2011-12-26T19:51:38.168Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-26T19:51:38.168Z</app:edited><title>I am Sheldon…</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IIUwQDGDOa-z9aZqzUS8WSE3v5s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IIUwQDGDOa-z9aZqzUS8WSE3v5s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IIUwQDGDOa-z9aZqzUS8WSE3v5s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IIUwQDGDOa-z9aZqzUS8WSE3v5s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/-QKrwoytfh38/TvjPGAxPihI/AAAAAAAAAKI/6UijdOVaUC4/s1600-h/111225-101223%25255B2%25255D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Sheldon / Doogal" border="0" alt="Sheldon / Doogal" align="left" src="http://lh4.ggpht.com/-zvjaHcSGNj4/TvjPHnm1xkI/AAAAAAAAAKQ/xudJgi0Dve0/111225-101223_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;…with a somewhat larger waste line, somewhat smaller IQ and hopefully with less OCD tendencies.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-1434592245753397421?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/slMqMFYO5LY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/1434592245753397421/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=1434592245753397421" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/1434592245753397421?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/1434592245753397421?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/slMqMFYO5LY/i-am-sheldon.html" title="I am Sheldon…" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-zvjaHcSGNj4/TvjPHnm1xkI/AAAAAAAAAKQ/xudJgi0Dve0/s72-c/111225-101223_thumb.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/12/i-am-sheldon.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4MQn44eip7ImA9WhRRGEg.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-4921838916919836038</id><published>2011-12-02T20:49:00.001Z</published><updated>2011-12-02T20:49:43.032Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-02T20:49:43.032Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Friend Connect" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><title>Goodbye Google Friend Connect</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xSotbDXU1sNekvZNujU42UvgkDs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xSotbDXU1sNekvZNujU42UvgkDs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xSotbDXU1sNekvZNujU42UvgkDs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xSotbDXU1sNekvZNujU42UvgkDs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I’ve been disenchanted with &lt;a href="http://www.google.com/friendconnect/"&gt;Google Friend Connect&lt;/a&gt; for a while. I only used it for commenting on my website but it has a number of weaknesses&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A crappy user experience&lt;/li&gt;    &lt;li&gt;No notifications of new comments, which is a pain if you only receive a handful of comments&lt;/li&gt;    &lt;li&gt;Ignoring query strings in URLs, so comments don’t stick to the right page&lt;/li&gt;    &lt;li&gt;Weird date formatting and no control over how they appear&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For a long while I assumed Google would actually update the widgets but I’m not sure anything ever got changed after the initial release. It was released and then, nothing. Even a &lt;a href="http://www.google.com/friendconnect/"&gt;visit to the site&lt;/a&gt; shows a copyright notice from 2009, which suggests they haven’t done much with it for some time. &lt;/p&gt;  &lt;p&gt;So I had been meaning to convert to some other system but just hadn’t got round to it. Then I noticed &lt;a href="http://googleblog.blogspot.com/2011/11/more-spring-cleaning-out-of-season.html"&gt;Google have decided to can it&lt;/a&gt; (which of course hasn’t been mentioned anywhere on the Friend Connect site itself), so I decided it was time to finally do something. Google’s suggested solution is to hook into Google+, but that seems like a pretty useless way to add commenting to a website. So my suggested solution is to sign up to &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt;, it takes about 10 minutes to plug it in to your website and looks pretty good straight out of the box.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-4921838916919836038?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/XC9aZH743z4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/4921838916919836038/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=4921838916919836038" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4921838916919836038?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/4921838916919836038?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/XC9aZH743z4/goodbye-google-friend-connect.html" title="Goodbye Google Friend Connect" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/12/goodbye-google-friend-connect.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQEQ3c_eip7ImA9WhdbE0s.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-145779950024567502</id><published>2011-10-11T21:51:00.001+01:00</published><updated>2011-10-11T21:51:42.942+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-11T21:51:42.942+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Maps" /><title>Google Maps in a desktop app</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Q3KcSu3BiWI-lGFIW9CN22j7o1w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q3KcSu3BiWI-lGFIW9CN22j7o1w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Q3KcSu3BiWI-lGFIW9CN22j7o1w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q3KcSu3BiWI-lGFIW9CN22j7o1w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I’ve seen one or two examples of using Google Maps in a WinForms desktop app, but the ones I’ve seen seem to involve loading image tiles from the Google server directly. There’s nothing wrong with that approach but I thought it would be a lot simpler to simply host a local web page using the Google Maps API in a WebBrowser control in an application. &lt;a href="http://www.doogal.co.uk/files/GoogleMaps.zip"&gt;Here is a very simple example of this idea&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;If you want to extend this example, it’s possible to call scripts in the page via the &lt;font face="Courier New"&gt;WebBrowser.Document.InvokeScript&lt;/font&gt; method and the application can respond to events in the page via the &lt;font face="Courier New"&gt;WebBrowser.ObjectForScripting&lt;/font&gt; property.&lt;/p&gt;  &lt;p&gt;As an aside, similar ideas can be applied to hosting other Javascript web components, such as an HTML editor like &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-145779950024567502?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/PSAcPx0hBDM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/145779950024567502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=145779950024567502" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/145779950024567502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/145779950024567502?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/PSAcPx0hBDM/google-maps-in-desktop-app.html" title="Google Maps in a desktop app" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/10/google-maps-in-desktop-app.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8GRH88fCp7ImA9WhdTFko.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-6335824669845399338</id><published>2011-07-14T22:08:00.001+01:00</published><updated>2011-07-14T22:10:25.174+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-14T22:10:25.174+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Friend Connect" /><category scheme="http://www.blogger.com/atom/ns#" term="IE8" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Maps" /><title>Google Maps and Friend Connect weirdness in IE8</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iL9oTG-ql5D02iFuS9L6xBJsUUc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iL9oTG-ql5D02iFuS9L6xBJsUUc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iL9oTG-ql5D02iFuS9L6xBJsUUc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iL9oTG-ql5D02iFuS9L6xBJsUUc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I received a bug report about my website. The maps that appear on my &lt;a href="http://www.doogal.co.uk/UKPostcodes.php?Search=BB3 3"&gt;UK postcodes pages&lt;/a&gt; weren’t working in IE8. I hadn’t noticed since they were working fine in IE9 but when I switched to compatibility view in IE9 I started to see the same problem. This helped because I was then able to debug my JavaScript (much as I love &lt;a href="http://www.my-debugbar.com/wiki/IETester/HomePage"&gt;IETester&lt;/a&gt;, I’d love it even more if I had access to the developer tools for each version of IE). And debugging the script revealed &lt;font face="Courier New"&gt;google.maps&lt;/font&gt; was null.&lt;/p&gt;  &lt;p&gt;At this point I assumed this was a problem with my Google Maps script, so tried loading &lt;a href="http://code.google.com/apis/maps/documentation/javascript/basics.html#Async"&gt;Google Maps asynchronously&lt;/a&gt; then tried &lt;a href="http://code.google.com/apis/maps/documentation/javascript/basics.html#Versioning"&gt;specifying an older version of the API&lt;/a&gt;. Neither helped. I tried inserting the script in my HTML head but with no luck.&lt;/p&gt;  &lt;p&gt;Finally I had a look at the &lt;font face="Courier New"&gt;google&lt;/font&gt; object and saw the only thing defined in there was &lt;font face="Courier New"&gt;friendconnect&lt;/font&gt;. Now my suspicions moved away from Google Maps to Google Friend Connect. my Friend Connect stuff appears at the bottom of each page and the script reference for it was also down the bottom of the page. So I thought I’d tried moving the Friend Connect script reference to the html header. And voila, the maps started working again.&lt;/p&gt;  &lt;p&gt;So the conclusion? I’m not really sure, although I suspect Friend Connect is removing the &lt;font face="Courier New"&gt;google.maps&lt;/font&gt; object, although it seems odd that it only happens on IE8.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-6335824669845399338?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/cO8XGYAyEFY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/6335824669845399338/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=6335824669845399338" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/6335824669845399338?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/6335824669845399338?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/cO8XGYAyEFY/google-maps-and-friend-connect.html" title="Google Maps and Friend Connect weirdness in IE8" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/07/google-maps-and-friend-connect.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUANSH44fCp7ImA9WhZUEk8.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-6585809573303000396</id><published>2011-06-04T22:43:00.001+01:00</published><updated>2011-06-04T22:43:19.034+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-04T22:43:19.034+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Retrieving the most popular pages using Google Analytics API</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qUyW7-_tDEpAbS15gc7AP8ogUBI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qUyW7-_tDEpAbS15gc7AP8ogUBI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qUyW7-_tDEpAbS15gc7AP8ogUBI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qUyW7-_tDEpAbS15gc7AP8ogUBI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For a long time I’ve shown the most popular pages on &lt;a href="http://www.doogal.co.uk/"&gt;the home page of my website&lt;/a&gt;. I did this by logging every page that was viewed to the MySql database on the back end. This kind of worked but had a few problems. First, it wasn’t very clever since it couldn’t tell the difference between a real visitor and a search engine bot. Second, since I’ve started to get quite a few visitors (no, really), it was writing a large amount of data to the database. &lt;/p&gt;  &lt;p&gt;So I thought there must be a better solution. Figuring that all the information I needed was already being collected by Google Analytics, I thought I could grab this data and dump it into a much smaller with just the page URL and the number of visits (rather than adding a row for every visit). So I coded up a solution using the .NET wrapper around the &lt;a href="http://code.google.com/apis/analytics/docs/gdata/home.html"&gt;Google Analytics API&lt;/a&gt;. And this is what it looks like (with the database access code removed for clarity). You’ll need to provide your own email address, password and Google Analytics account table ID to get this to work, for obvious reasons. &lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Google.GData.Analytics;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;GoogleAnalytics
{
  &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program
  &lt;/span&gt;{
    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
    {
      &lt;span style="color: #2b91af"&gt;AccountQuery &lt;/span&gt;feedQuery = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;AccountQuery&lt;/span&gt;();
      &lt;span style="color: #2b91af"&gt;AnalyticsService &lt;/span&gt;service = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;AnalyticsService&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;DoogalAnalytics&amp;quot;&lt;/span&gt;);
      service.setUserCredentials(&lt;span style="color: #a31515"&gt;&amp;quot;email address&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;);

      &lt;span style="color: #2b91af"&gt;DataQuery &lt;/span&gt;pageViewQuery = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DataQuery&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;https://www.google.com/analytics/feeds/data&amp;quot;&lt;/span&gt;);
      pageViewQuery.Ids = &lt;span style="color: #a31515"&gt;&amp;quot;Google Analytics account table ID&amp;quot;&lt;/span&gt;;
      pageViewQuery.Metrics = &lt;span style="color: #a31515"&gt;&amp;quot;ga:visits&amp;quot;&lt;/span&gt;;
      pageViewQuery.Dimensions = &lt;span style="color: #a31515"&gt;&amp;quot;ga:pagePath&amp;quot;&lt;/span&gt;;
      pageViewQuery.Sort = &lt;span style="color: #a31515"&gt;&amp;quot;-ga:visits&amp;quot;&lt;/span&gt;;
      pageViewQuery.GAStartDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.AddMonths(-1).ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyy-MM-dd&amp;quot;&lt;/span&gt;);
      pageViewQuery.GAEndDate = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToString(&lt;span style="color: #a31515"&gt;&amp;quot;yyyy-MM-dd&amp;quot;&lt;/span&gt;);

      &lt;span style="color: #2b91af"&gt;DataFeed &lt;/span&gt;feed = service.Query(pageViewQuery);
      &lt;span style="color: blue"&gt;for &lt;/span&gt;(&lt;span style="color: blue"&gt;int &lt;/span&gt;i = 0; i &amp;lt; 20; i++)
      {
        &lt;span style="color: #2b91af"&gt;DataEntry &lt;/span&gt;pvEntry = (&lt;span style="color: #2b91af"&gt;DataEntry&lt;/span&gt;)feed.Entries[i];
        &lt;span style="color: blue"&gt;string &lt;/span&gt;page = pvEntry.Dimensions[0].Value.Substring(1);
        &lt;span style="color: blue"&gt;string &lt;/span&gt;visits = pvEntry.Metrics[0].Value;

        &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(page + &lt;span style="color: #a31515"&gt;&amp;quot;: &amp;quot; &lt;/span&gt;+ visits);
      }

      &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine();
    }
  }
}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-6585809573303000396?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/ZYPB4_8zfqk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/6585809573303000396/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=6585809573303000396" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/6585809573303000396?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/6585809573303000396?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/ZYPB4_8zfqk/retrieving-most-popular-pages-using.html" title="Retrieving the most popular pages using Google Analytics API" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/06/retrieving-most-popular-pages-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcMRHY7eyp7ImA9WhZVF0U.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-8775037387006517100</id><published>2011-05-30T21:08:00.001+01:00</published><updated>2011-05-30T21:08:05.803+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-30T21:08:05.803+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="XSLT" /><title>Poor man’s XSLT profiling for .NET</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/owj893wyjsuoGImSotPDEbza6Xk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/owj893wyjsuoGImSotPDEbza6Xk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/owj893wyjsuoGImSotPDEbza6Xk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/owj893wyjsuoGImSotPDEbza6Xk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you’ve ever looked round for a profiler for XSL transformations then chances are you’ve found the &lt;a href="http://msdn.microsoft.com/en-us/library/ee473446.aspx"&gt;Microsoft add-on for Visual Studio&lt;/a&gt;, which looks like it’s just the ticket, if you happen to have Visual Studio Team System. But if you don’t happen to own that version, then it might look like you have to upgrade your VS license or buy some other XSLT profiler. &lt;/p&gt;  &lt;p&gt;But if you happen to own a .NET profiler (I highly recommend &lt;a href="http://smartbear.com/products/development-tools/performance-profiling/"&gt;AQTime&lt;/a&gt;) then there may be another solution. Visual Studio comes with the &lt;a href="http://msdn.microsoft.com/en-us/library/bb399405.aspx"&gt;XSLTC tool&lt;/a&gt; that can be used to generate an assembly from an XSL transformation. Once we’ve got an assembly, then we can build a small wrapper application that loads up the assembly, passes it to an instance of the &lt;font face="Courier New"&gt;XslCompiledTransform&lt;/font&gt; class and calls the transform. And once we’ve got that, we can use a standard .NET profiler to find bottlenecks. &lt;/p&gt;  &lt;p&gt;And as I understand it, the XSLT profiler add-on for Visual Studio works in just this way so profiling using this technique should be just as effective as the Microsoft version.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-8775037387006517100?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/c6IOUIPVdxk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/8775037387006517100/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=8775037387006517100" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/8775037387006517100?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/8775037387006517100?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/c6IOUIPVdxk/poor-mans-xslt-profiling-for-net.html" title="Poor man’s XSLT profiling for .NET" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/05/poor-mans-xslt-profiling-for-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YFQn4zeyp7ImA9WhZRGEw.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-2130026248918770014</id><published>2011-04-14T22:05:00.001+01:00</published><updated>2011-04-14T22:05:13.083+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T22:05:13.083+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Music" /><title>Spotify not too good to be true anymore</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/A-QeIc1cu1Eg_Z3-Sm9Ofbh0q2g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A-QeIc1cu1Eg_Z3-Sm9Ofbh0q2g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/A-QeIc1cu1Eg_Z3-Sm9Ofbh0q2g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/A-QeIc1cu1Eg_Z3-Sm9Ofbh0q2g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://doogalbellend.blogspot.com/2009/02/spotify-future-of-music.html"&gt;Apparently I’ve been using Spotfiy for over two years&lt;/a&gt;. Funny, it seems longer than that. It was the perfect music service for me, unlimited music of my choosing on my PC, which is where I listen to music most of the time, with the only minor downside being some adverts that play occasionally between tracks. &lt;a href="http://www.spotify.com/int/blog/archives/2011/04/14/upcoming-changes-to-spotify-free-open/"&gt;But it looks like it won’t be quite so perfect anymore.&lt;/a&gt; Free users can only listen to a track a total of five times and total listening time will be limited to 10 hours a month.&lt;/p&gt;  &lt;p&gt;As a frequent user of Spotify I can see why they are doing this. First, it’s obvious that advertising revenue is not what they were hoping for, most of the ads are still for Spotify itself. Second, using it has had a perhaps not unexpected effect on my music buying behaviour. First example, U2 put their last album up on Spotify before its official release. I had a listen and realised it was rubbish, so as a marketing exercise I doubt it was a huge success. Second example/s, quite a few new releases are put onto Spotify Premium upon release. On a couple of occasions I’ve then purchased the album before it’s become available on the free version (Elbow, Arcade Fire if you’re wondering). I’m guessing this isn’t what Spotify wanted me to do, they were presumably hoping I’d pony up the Premium version. And then when those albums did become available on the free version (generally only a few weeks after release) I was hit with a mild feeling of regret for spending money that I didn’t really need to and deciding to think twice before making another purchase. Again, probably not what the music industry sponsors of Spotify were hoping for.&lt;/p&gt;  &lt;p&gt;So now I’ve got a choice, sign up for a tenner a month and continue on as I am at the moment or spend that tenner on a CD every month. I guess the music industry don’t care too much which way that ten quid gets to them, so it’s purely a personal dilemma. But the people who can’t or won’t spend a tenner (teenagers, students mostly I guess) will probably rediscover the skill of searching for pirated albums on Google. The music industry is still caught between a rock and a hard place.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-2130026248918770014?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/ZoYNkuXLCHA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/2130026248918770014/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=2130026248918770014" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2130026248918770014?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2130026248918770014?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/ZoYNkuXLCHA/spotify-not-too-good-to-be-true-anymore.html" title="Spotify not too good to be true anymore" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/04/spotify-not-too-good-to-be-true-anymore.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcCQX85fCp7ImA9Wx9aGU8.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-2554177186181307188</id><published>2011-03-12T10:49:00.001Z</published><updated>2011-03-12T10:51:00.124Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-12T10:51:00.124Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySql" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="OS OpenData" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Updating the Code-Point postcode datataset in MySql</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KPqZDqOKjqhAkpiOZkM4O0QMtWM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KPqZDqOKjqhAkpiOZkM4O0QMtWM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KPqZDqOKjqhAkpiOZkM4O0QMtWM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KPqZDqOKjqhAkpiOZkM4O0QMtWM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Some time ago &lt;a href="http://doogalbellend.blogspot.com/2010/06/importing-code-point-dataset-into-mysql.html"&gt;I imported the Ordnance Survey Code-Point postcode dataset into MySql&lt;/a&gt;. It looks like there’s a new version of that dataset available which includes new postcodes so I wanted to update my database. I guess I could just empty the table and re-import the data, but since it takes some time import and &lt;a href="http://www.doogal.co.uk/UKPostcodes.php"&gt;the data is live on the web&lt;/a&gt;, this wasn’t the ideal solution. Fortunately, MySql has a useful IGNORE keyword which will ignore failed inserts so any old postcodes will be ignored (since the postcode is used as the primary key on the table) whilst new ones are inserted. Of course, this assumes that the latitude and longitude of old postcodes doesn’t change, which I’m hoping is a reasonable assumption. So my new code looks like this.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.IO;
&lt;span style="color: blue"&gt;using &lt;/span&gt;DotNetCoords;
&lt;span style="color: blue"&gt;using &lt;/span&gt;LumenWorks.Framework.IO.Csv;
&lt;span style="color: blue"&gt;using &lt;/span&gt;MySql.Data.MySqlClient;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;ImportCodepoint
{
  &lt;span style="color: blue"&gt;class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Program
  &lt;/span&gt;{
    &lt;span style="color: blue"&gt;static void &lt;/span&gt;Main(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] args)
    {
      &lt;span style="color: blue"&gt;string&lt;/span&gt;[] files = &lt;span style="color: #2b91af"&gt;Directory&lt;/span&gt;.GetFiles(&lt;span style="color: #a31515"&gt;@&amp;quot;C:\Users\Doogal\Downloads\codepo_gb\Code-Point Open\Data&amp;quot;&lt;/span&gt;);
      &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;file &lt;span style="color: blue"&gt;in &lt;/span&gt;files)
      {
        ReadFile(file);
      }

    }

    &lt;span style="color: blue"&gt;private static void &lt;/span&gt;ReadFile(&lt;span style="color: blue"&gt;string &lt;/span&gt;file)
    {
      &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;StreamReader &lt;/span&gt;reader = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(file))
      {
        &lt;span style="color: #2b91af"&gt;CsvReader &lt;/span&gt;csvReader = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CsvReader&lt;/span&gt;(reader, &lt;span style="color: blue"&gt;false&lt;/span&gt;);
        &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MySqlConnection &lt;/span&gt;conn = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MySqlConnection&lt;/span&gt;(
          &lt;span style="color: #a31515"&gt;&amp;quot;server=server;uid=username;pwd=password;database=database;&amp;quot;&lt;/span&gt;))
        {
          conn.Open();
          &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;[] data &lt;span style="color: blue"&gt;in &lt;/span&gt;csvReader)
          {
            &lt;span style="color: blue"&gt;string &lt;/span&gt;postcode = data[0];
            &lt;span style="color: green"&gt;// some postcodes have spaces, some don't
            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(postcode.IndexOf(&lt;span style="color: #a31515"&gt;' '&lt;/span&gt;) &amp;lt; 0)
              postcode = data[0].Substring(0, data[0].Length - 3) + &lt;span style="color: #a31515"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ data[0].Substring(data[0].Length - 3);
            &lt;span style="color: green"&gt;// some have two spaces...
            &lt;/span&gt;postcode = postcode.Replace(&lt;span style="color: #a31515"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot; &amp;quot;&lt;/span&gt;);
            
            &lt;span style="color: blue"&gt;double &lt;/span&gt;easting = &lt;span style="color: blue"&gt;double&lt;/span&gt;.Parse(data[10]);
            &lt;span style="color: blue"&gt;double &lt;/span&gt;northing = &lt;span style="color: blue"&gt;double&lt;/span&gt;.Parse(data[11]);

            &lt;span style="color: green"&gt;// there are some postcodes with no location
            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;((easting != 0) &amp;amp;&amp;amp; (northing != 0))
            {
              &lt;span style="color: green"&gt;// convert easting/northing to lat/long
              &lt;/span&gt;&lt;span style="color: #2b91af"&gt;OSRef &lt;/span&gt;osRef = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;OSRef&lt;/span&gt;(easting, northing);
              &lt;span style="color: #2b91af"&gt;LatLng &lt;/span&gt;latLng = osRef.ToLatLng();
              latLng.ToWGS84();

              &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MySqlCommand &lt;/span&gt;command = conn.CreateCommand())
              {
                &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(postcode);
                command.CommandTimeout = 60;
                command.CommandText = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(
                  &lt;span style="color: #a31515"&gt;&amp;quot;INSERT IGNORE INTO Postcodes (Postcode, Latitude, Longitude) &amp;quot; &lt;/span&gt;+
                  &lt;span style="color: #a31515"&gt;&amp;quot;VALUES ('{0}', {1}, {2})&amp;quot;&lt;/span&gt;,
                  postcode, latLng.Latitude, latLng.Longitude);
                &lt;span style="color: blue"&gt;int &lt;/span&gt;count = command.ExecuteNonQuery();
                &lt;span style="color: blue"&gt;if &lt;/span&gt;(count &amp;gt; 0)
                  &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Added&amp;quot;&lt;/span&gt;);
              }
            }
          }
        }
      }
    }
  }
}&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-2554177186181307188?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/qNkiCxeUrMo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/2554177186181307188/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=2554177186181307188" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2554177186181307188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/2554177186181307188?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/qNkiCxeUrMo/updating-code-point-postcode-datataset.html" title="Updating the Code-Point postcode datataset in MySql" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/03/updating-code-point-postcode-datataset.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QFSH8_cSp7ImA9WhZRGEw.&quot;"><id>tag:blogger.com,1999:blog-19519354.post-508271662911501821</id><published>2011-02-22T08:13:00.001Z</published><updated>2011-04-14T22:08:39.149+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T22:08:39.149+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>GZipping all content served up by ASP.NET</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/UTeAJkuaB4nNXe06H5QRBprsiOE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UTeAJkuaB4nNXe06H5QRBprsiOE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/UTeAJkuaB4nNXe06H5QRBprsiOE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/UTeAJkuaB4nNXe06H5QRBprsiOE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; – I now realise this post is kind of pointless, there &lt;em&gt;is&lt;/em&gt; a module for compression of dynamic content, called unsurprisingly DynamicCompressionModule… But the approach described may be useful for someone somewhere…&lt;/p&gt;  &lt;p&gt;I couldn’t find anything that will GZip all the content returned by ASP.NET. There’s a module for compression of static files but nothing for dynamic content. There may be a good reason for this, perhaps the overhead of GZipping content on the fly can kill your server, but since my current project has no static content I thought it would be useful to give it a go. The solution is pretty simple, register the following module in web.config and you’re good to go.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.IO.Compression;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;MyNamespace
{
&lt;span style="color: gray"&gt;  &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GzipModule &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IHttpModule
  &lt;/span&gt;{
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Dispose()
    {
      
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;context)
    {
      context.BeginRequest += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;(context_BeginRequest);
    }

    &lt;span style="color: blue"&gt;void &lt;/span&gt;context_BeginRequest(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)
    {
      &lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;app = (&lt;span style="color: #2b91af"&gt;HttpApplication&lt;/span&gt;)sender;
      &lt;span style="color: blue"&gt;if &lt;/span&gt;((app.Request.Headers[&lt;span style="color: #a31515"&gt;&amp;quot;Accept-Encoding&amp;quot;&lt;/span&gt;] != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp;
            (app.Request.Headers[&lt;span style="color: #a31515"&gt;&amp;quot;Accept-Encoding&amp;quot;&lt;/span&gt;].Contains(&lt;span style="color: #a31515"&gt;&amp;quot;gzip&amp;quot;&lt;/span&gt;)))
      {
        app.Response.Filter = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;GZipStream&lt;/span&gt;(app.Response.Filter, &lt;span style="color: #2b91af"&gt;CompressionMode&lt;/span&gt;.Compress);
        app.Response.AppendHeader(&lt;span style="color: #a31515"&gt;&amp;quot;Content-encoding&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;gzip&amp;quot;&lt;/span&gt;);
        app.Response.Cache.VaryByHeaders[&lt;span style="color: #a31515"&gt;&amp;quot;Accept-encoding&amp;quot;&lt;/span&gt;] = &lt;span style="color: blue"&gt;true&lt;/span&gt;;
      }
    }
  }
}&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;font face="Verdana"&gt;Registration is as follows&lt;/font&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;modules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
      &lt;/span&gt;&lt;span style="color: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;add &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;GzipModule&lt;/span&gt;&amp;quot; &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;MyNamespace.GzipModule&lt;/span&gt;&amp;quot; &lt;span style="color: blue"&gt;/&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;modules&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19519354-508271662911501821?l=doogalbellend.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoogalBellsBloggyThing/~4/SoQcM25ybEQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doogalbellend.blogspot.com/feeds/508271662911501821/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=19519354&amp;postID=508271662911501821" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/508271662911501821?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19519354/posts/default/508271662911501821?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoogalBellsBloggyThing/~3/SoQcM25ybEQ/gzipping-all-content-served-up-by.html" title="GZipping all content served up by ASP.NET" /><author><name>Chris Bell</name><uri>https://profiles.google.com/114189457493774868409</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-S5ZKG_FQ-1k/AAAAAAAAAAI/AAAAAAAAALc/kNkHRauN7BU/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://doogalbellend.blogspot.com/2011/02/gzipping-all-content-served-up-by.html</feedburner:origLink></entry></feed>

