<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Simon's Software Stuff</title><link>http://harriyott.com/index.aspx</link><description>Thoughts about writing software. Thoughts about doing work.</description><language>en</language><managingEditor>noreply@blogger.com (Simon)</managingEditor><lastBuildDate>Fri, 03 Jul 2009 07:04:15 PDT</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">426</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/harriyott/simonssoftwarestuff" type="application/rss+xml" /><feedburner:emailServiceId>harriyott/simonssoftwarestuff</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>(Enter a personal message you would like to have appear at the top of your feed.)</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>OpenHack 2009 London</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/jWIJATnrp1o/openhack-2009-london.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Thu, 07 May 2009 05:17:25 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-6386206189138697595</guid><description>I'm very excited about &lt;a href="http://openhacklondon.pbworks.com/"&gt;OpenHack&lt;/a&gt; this weekend. I had such fun at the last one, and this one is already shaping up to be so much better. Last time I hacked alone, and &lt;a href="http://harriyott.com/2007/06/hackday-london-part-5-of-n.aspx"&gt;came up with a utility&lt;/a&gt; to visit all the links in a user's del.icio.us account to see if they're still around. The links were listed on the page, and any 404 errors turned the link red. It was all updated in a lovely Ajaxy way too.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/sophiemajor/3449550059/"&gt;&lt;img src="http://farm4.static.flickr.com/3414/3449550059_7c1aee6140_m.jpg" alt="OpenHack logo" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fun as it was, I was slightly envious of people who were creating team hacks, so this time I posted a team on the &lt;a href="http://openhacklondon.pbworks.com/Join-a-Hack-Team"&gt;join-a-team page&lt;/a&gt;. &lt;abbr title="To cut a long story short"&gt;TCALSS&lt;/abbr&gt;, I am now part of a 4-man team, which I'm very excited about. For a few days, we were a 3-man team, and Jez had suggested we do something with Flickr photos of blue plaques.  &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jnicho02/3504445928/"&gt;&lt;img src="http://farm4.static.flickr.com/3659/3504445928_da7d6b2415_m.jpg" alt="Max Miller Blue Plaque" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Whilst (independently) looking at plaque photos, Jez and I saw some machine tags of the format openplaques:id=nnn.  We both (independently) contacted Frankie, who tagged the photos, and it turns out that he's been working on a personal project around the plaques and, as it happens, &lt;strong&gt;he's going to OpenHack too&lt;/strong&gt;! Happily, Frankie is joining our team, and it's likely that we'll be doing some kind of mobile plaque-hack.&lt;br /&gt;&lt;br /&gt;What is also fun, is that three of the four of us are back-end developers, and we use three different platforms, so two of us will be learning some new skills.&lt;br /&gt;&lt;br /&gt;Apart from hacking, I'm hoping to meet some new and interesting people, so if you've not met me in person yet, please introduce yourself if you see me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-6386206189138697595?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JqylLwU-fxHA9ubkLyCqRrDeuY4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JqylLwU-fxHA9ubkLyCqRrDeuY4/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/JqylLwU-fxHA9ubkLyCqRrDeuY4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JqylLwU-fxHA9ubkLyCqRrDeuY4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=jWIJATnrp1o:jE4FmtHrjRA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=jWIJATnrp1o:jE4FmtHrjRA:4PU86EYFyYg"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=4PU86EYFyYg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/jWIJATnrp1o" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2009/05/openhack-2009-london.aspx</feedburner:origLink></item><item><title>Site redesign</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/cv92HL6ZWKU/site-redesign.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Mon, 20 Apr 2009 02:54:53 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-2584730783708066002</guid><description>Well, I have a &lt;a href="http://harriyott.com"&gt;new-looking website&lt;/a&gt;, and not before time. It looks so much better, is strictly XHTML, and is faster than the old one. This post is about why and how this happened.&lt;br /&gt;&lt;br /&gt;I decided to have a new site as I'm looking for work, and in a competitive market, my old site was letting me down.  It looked dull, the homepage was the blog, and the design started as a free blogger.com template that I've incrementally hacked about with over the last few years.  There was nothing (other than a CV) that actually promoted my services and skills.&lt;br /&gt;&lt;br /&gt;If I ran a small agency, or was selling a product, then my website would be promotional, so as I'm selling my services, my site should be promotional too.&lt;br /&gt;&lt;br /&gt;Once I decided that I needed a new site, I was quite excited about taking the time to do a good job with it.&lt;br /&gt;&lt;br /&gt;So, with that in mind, the requirements for the new site were:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The home page should be promotional - describing my services and how I could help potential clients.&lt;/li&gt;&lt;li&gt;It should be an example of my skills, so XHTML strict, valid CSS and generally high quality.&lt;/li&gt;&lt;li&gt;The site should look good, and have a pleasing design. Not too flashy.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Well, I can have a go at number 1 for the moment. I can write about what I do, and have done. Number 2 would be fine too, as that's part of what I do. Number 3 though...&lt;br /&gt;&lt;br /&gt;As is common to developers, my graphic design skills aren't that good. With time and practice, I could improve, but it's not high enough on my list. So I can't trust myself to design my own site. I decided to outsource the graphic design. As an individual, any money I spend is at the expense of, say, a family holiday, so I needed inexpensive but good, which is a rare combination.&lt;br /&gt;&lt;br /&gt;Fortunately, I have a friend. I've known &lt;a href="http://twitter.com/loislikesyou"&gt;Lois&lt;/a&gt; for about 10 years, and she's just finishing up her A-levels and then starting an art foundation course in Brighton in September. OK, she's not a professional designer, but she's artistic, motivated and I've seen some posters she designed in the past, which did the job nicely.  I figured that whatever she came up with would be way better than what I could do, so I asked if she'd do it, and how much she'd charge.&lt;br /&gt;&lt;br /&gt;Lois agreed to do it, and within my budget, so we discussed what I was looking for. She went off and researched other sites for people doing what I do, and worked on with three different rough designs, before we met again. Between the meetings, I swayed between thinking that it might be too much of a gamble employing a teenager, and smugly thinking that she'll do a brilliant job and I'll have a great looking website. Happily, when I saw the designs, it was clearly the latter.&lt;br /&gt;&lt;br /&gt;I really liked two of the designs, but couldn't choose between them. It occurred to me that it was more important to chose one there and then than to go away and carefully consider which I preferred. So, I picked one, and Lois could then go and refine the design, and work on the actual pages.&lt;br /&gt;&lt;br /&gt;We met again last Thursday, and I was really impressed with the page designs. I excitedly took the .psd files with me, and set to work on marking them up in XHTML and CSS. After 6 months of rather dry C++ work, I thoroughly enjoyed it.&lt;br /&gt;&lt;br /&gt;The first page I did was &lt;a href="http://harriyott.com/cv"&gt;my CV&lt;/a&gt;, as I'm sending recruiters to it at the moment. I'd previously marked this up in XHTML, so I just needed to change a couple of things to make the design fit. It didn't take long at all, and I W3C validated it, and uploaded it immediately to the live site; it was &lt;a href="http://twitter.com/Imaji/statuses/1534819672"&gt;well&lt;/a&gt; &lt;a href="http://twitter.com/helephant/statuses/1536480752"&gt;received&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Excitedly, I worked on the homepage, and uploaded it, ousting the blog, which in comparison looked worse than ever. How had I put up with it for so long?!&lt;br /&gt;&lt;br /&gt;Next step; the blog. This was always going to be tricker, as part of it is outside my control. I use Google's &lt;a href="http://blogger.com"&gt;blogger.com&lt;/a&gt;: I log into their site, write a post, hit the publish button, and Google FTPs a new page, updated index and archive pages, and feeds to my site. I have &lt;em&gt;almost&lt;/em&gt; total control over the template, which has been fine up to now.&lt;br /&gt;&lt;br /&gt;I downloaded a 3-year-old blog post page (that nobody would be reading) in order to mark it up. I then iteratively modified locally, uploaded and W3C validated the page until it looked right and most of the errors had gone, but there were two issues.  Firstly, ASP.NET. I use master pages, and the blogger template creates an aspx page that uses the master page. I have a &amp;lt;form runat="server" ... &amp;gt; tag that generated an HTML form element with a "name" attribute, which doesn't validate. Also, the blogger.com generated URLs weren't encoded. As it was late Friday night, I left it. I was going to &lt;a href="http://www.developerdeveloperdeveloper.com/webdd09/"&gt;WebDD&lt;/a&gt; on Saturday and had an early start.&lt;br /&gt;&lt;br /&gt;In the bar after an inspiring event, I was talking to &lt;a href="http://twitter.com/serialseb"&gt;Seb&lt;/a&gt;, who told me that I just need to set the xhtmlConformance level in web.config&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;xhtmlConformance mode="Strict" /&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and that will take care of the form tag. Not that I need the form tag, as I wasn't doing post-backs. I rushed home from Reading, even skipping the geek dinner (which is very unlike me), and spent Saturday night working on it, completely in the zone (first time for months). The ASP.NET code was now XHTML strict, but the blogger.com links weren't. I changed the template to generate &amp;lt;asp:Hyperlink&amp;gt; tags, which I could then modify the URL server-side, with a simple Server.HtmlEncode.&lt;br /&gt;&lt;br /&gt;Having seen Phil Pursglove's session on caching at WebDD, I also added caching to the pages, and by 3am, I'd republished the blog, and it all validated. It ran pretty quickly too.&lt;br /&gt;&lt;br /&gt;In conclusion, I feel so much happier with the site, and loved the process of updating it. I'm really pleased with how well outsourcing the design went, and I'm much more confident with using XHTML and CSS as a result.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-2584730783708066002?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/D6fLmKBOwkKAYxGgd0a96dh3LVA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D6fLmKBOwkKAYxGgd0a96dh3LVA/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/D6fLmKBOwkKAYxGgd0a96dh3LVA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/D6fLmKBOwkKAYxGgd0a96dh3LVA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=cv92HL6ZWKU:9xkWDUKlT_A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=cv92HL6ZWKU:9xkWDUKlT_A:4PU86EYFyYg"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=4PU86EYFyYg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/cv92HL6ZWKU" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://harriyott.com/2009/04/site-redesign.aspx</feedburner:origLink></item><item><title>Availability</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/quHjz2GHc44/availability.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Mon, 30 Mar 2009 09:59:33 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-7959955776127523052</guid><description>Due to being super quick and efficient, I've finished my current contract sooner than I expected. This means that I'm now available for C# contract work right now. I'm based in Sussex, so I can travel to Brighton, Mid-Sussex, or the London Bridge area, or I can work from home. If you, or someone you know has anything interesting that may suit, please let me know. Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-7959955776127523052?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6JRpd1KX-lwxnnJs7ViHwGcf2aE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6JRpd1KX-lwxnnJs7ViHwGcf2aE/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/6JRpd1KX-lwxnnJs7ViHwGcf2aE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6JRpd1KX-lwxnnJs7ViHwGcf2aE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=quHjz2GHc44:yK659SRuPjg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=quHjz2GHc44:yK659SRuPjg:4PU86EYFyYg"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=4PU86EYFyYg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/quHjz2GHc44" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2009/03/availability.aspx</feedburner:origLink></item><item><title>Hey, check out my new band, er, startup!</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/Y_jfUhw_Z48/hey-check-out-my-new-band-er-startup.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Tue, 17 Mar 2009 04:37:46 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-5373198044053689275</guid><description>When I was in my late teens, I drummed in a band. It wasn't very good, but we were all learning how to play our instruments, and related skills like song-writing, co-operation, how to get gigs, how to get people to come to gigs, how to run rehearsals (hint: don't nip out for chips halfway through).&lt;br /&gt;&lt;br /&gt;Many of my friends were in bands, and so were their friends, and some were good, and some weren't, some didn't get as far as gigging, and one or two did pretty well, such as Top Loader and Blue States.&lt;br /&gt;&lt;br /&gt;There were many shared traits between bands; everyone thought their band was better than it was (apart from those in really good bands), took themselves too seriously, got over-excited about a rumour of an A and R man maybe coming to a gig, and talked a lot about what it would be like to "make it", and how it was all about us and how great we would be.  We'd hand out our rubbishy photocopied fliers to our mates hoping they'll come to the Shelley at 10pm on a Monday night so we'd get a big enough crowd so the landlord might book us again.&lt;br /&gt;&lt;br /&gt;Since those days, I've been in many bands, playing various instruments. The best band I was in was called Octopus Jam, which was just great. We all played to a similar high standard, and we played mainly covers, because we all had grown up and realised that we were in it for the fun of it, and how great it was to play songs that people loved, and danced and sung along to. We had families and careers, and didn't want to tour round student dives in Hull, Sheffield and Plymouth in the mad pursuit of the chance of future fame and fortune. Taking away the "making it" turned it into "making it fun". It takes huge amounts of time and effort to even make a living from being in a band, but not a slightly profitable hobby.&lt;br /&gt;&lt;br /&gt;When I joined, I set up a web site (of course), and we got random enquiries to play at weddings and parties, for which we could charge some proper money. We asked them what song they wanted for the bride and groom's first dance, and we learnt it, however obscure, and they loved it. &lt;br /&gt;&lt;br /&gt;At one wedding, Dave started the first song with an acoustic guitar and sung the first verse. This was a big moment for the bride and groom - their first dance with their friends and family watching, at the start of the great adventure of marriage. At the start of the second verse, the bass and drums came in, and it sounded amazing, just really tight, and lifted the song beautifully. The bride then turned her gaze from her new husband to me, and mouthed "Thank you". This was, by far, the best moment of my amateur musical career; humbling, moving and proud to make the best day of someone's life just that little bit better.&lt;br /&gt;&lt;br /&gt;I've noticed several parallels in start-up land. I'm starting a start-up in my spare time, and so are many people I know or who's blogs I've read. Many have said that they want to "make it", either by selling to Google, Yahoo! etc. or by getting VC money to work at it full time and hopefully IPO for huge sums. Some aim for making enough money to pay for the founders to live comfortably and cover the costs. Given enough time, vision, skill, determination and luck, occasionally a start-up will "make it". Most don't. Lots don't even make it online.&lt;br /&gt;&lt;br /&gt;I've seen people who take themselves a little too seriously, think their app is better than it is, and do the online equivalent of photocopying flyers to get their friends to take a look at their app. I am one of these people.&lt;br /&gt;&lt;br /&gt;I've seen some make it, due to putting in time, effort and money. I met the founders of Trusted Places before they even had a developer.  Stack Overflow was always going to be a success, due to the fame and skill of the founders. In the same way, Dave Grohl is never going to struggle to launch a band.  &lt;br /&gt;&lt;br /&gt;Not everyone has that level of resources to put into an app. I don't. I have to earn a certain amount each month to pay the mortgage and keep my children in High School Musical yoghurts. I can't spend 3 solid months getting my app finished.&lt;br /&gt;&lt;br /&gt;Some of the &lt;a href="http://fivepoundapp.com/"&gt;&amp;pound;5 apps&lt;/a&gt; I've seen are more like wedding bands - deliberately small and manageable, targeted at a small niche, and doing simple things well. The person writing it is doing it for fun, enjoying the craft of writing the app, and loving it when someone uses it and finds it useful.&lt;br /&gt;&lt;br /&gt;I wish I had a neat and tidy conclusion to this, but I don't. Analogies break down, and only partly apply to situations.  For me, I just need to find more time to rehearse, er, I mean code, and be a bit smarter with my fliers, and I might eventually be able to run the gig full time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-5373198044053689275?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yyrZvI3zWEXbobUqGS6Y_PGcR7w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yyrZvI3zWEXbobUqGS6Y_PGcR7w/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/yyrZvI3zWEXbobUqGS6Y_PGcR7w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yyrZvI3zWEXbobUqGS6Y_PGcR7w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=Y_jfUhw_Z48:-wf9ZLlO23k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=Y_jfUhw_Z48:-wf9ZLlO23k:4PU86EYFyYg"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=4PU86EYFyYg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/Y_jfUhw_Z48" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://harriyott.com/2009/03/hey-check-out-my-new-band-er-startup.aspx</feedburner:origLink></item><item><title>Desktop Clients for Web Apps</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/u1UJ-uUjHGQ/desktop-clients-for-web-apps.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Mon, 16 Mar 2009 03:45:11 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-603229610212913622</guid><description>I'm noticing a trend for creating desktop clients for popular web apps.  Twitter is the clearest example; the website was popular, and has a simple and comprehensive API. The whole premise of twitter is based around messaging, so a desktop client is ideal, as it is similar to traditional one-to-one messaging clients such as AIM, MSN Messenger etc.  Due to the simplicity of the API, many third-party clients exist.&lt;br /&gt;&lt;br /&gt;Other web apps have desktop clients to perform some or all of the web functionality; Picasa, Google's photo sharing website has a great desktop client for editing and managing photos, and uploading them. FogBugz, the bug-tracking web app has a screen-capture tool, and clients for subversion and Visual Studio integration.&lt;br /&gt;&lt;br /&gt;For me though, the cleverest desktop client was written by Microsoft, long before the web app existed. I use Google Documents quite regularly for word processing and spreadsheets. Google Documents haven't been around that long, but more than 20 years ago, Microsoft started writing a desktop client for creating word processing documents and spreadsheets, known as Microsoft Word and Excel respectively. &lt;br /&gt;&lt;br /&gt;Microsoft waited and waited, and finally a web app was created that did the same thing, and Microsoft in a freak moment of luck, judgement and foresight, correctly predicted the exact format that the Google Documents upload would accept. Documents and spreadsheets created in Word and Excel can be uploaded into Google Documents, and be used in the web app. Amazing. This means that Google (or any other company) need not write their own desktop client - Microsoft did it years ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-603229610212913622?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bf95M1IsjO24nlawttwIDrd7b7M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bf95M1IsjO24nlawttwIDrd7b7M/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/bf95M1IsjO24nlawttwIDrd7b7M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bf95M1IsjO24nlawttwIDrd7b7M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=u1UJ-uUjHGQ:X5hkuxjqfHM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?a=u1UJ-uUjHGQ:X5hkuxjqfHM:4PU86EYFyYg"&gt;&lt;img src="http://feeds.feedburner.com/~ff/harriyott/simonssoftwarestuff?d=4PU86EYFyYg" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/u1UJ-uUjHGQ" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2009/03/desktop-clients-for-web-apps.aspx</feedburner:origLink></item><item><title>I am a Snail</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/YnRcCHhnBI4/i-am-snail.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Tue, 24 Feb 2009 01:40:44 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-4484776178146491128</guid><description>I am a snail.&lt;br /&gt;Nomadic; I need no base.&lt;br /&gt;I feed on coffee, power, signals.&lt;br /&gt;I carry; knapsack, laptop.&lt;br /&gt;On my back, my office.&lt;br /&gt;I am a snail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-4484776178146491128?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GbQGMwzasIGAf_RtlcNJR1lqmw8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GbQGMwzasIGAf_RtlcNJR1lqmw8/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/GbQGMwzasIGAf_RtlcNJR1lqmw8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GbQGMwzasIGAf_RtlcNJR1lqmw8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=ctPbvLbx"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=h0ZJVkaB"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/YnRcCHhnBI4" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://harriyott.com/2009/02/i-am-snail.aspx</feedburner:origLink></item><item><title>Numbered Stored Procedures</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/A8bzIqH5PtE/numbered-stored-procedures.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Fri, 13 Feb 2009 09:21:10 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-3047753433683473346</guid><description>I've been looking at some legacy code recently, and came across something completely new to me; numbered stored procedures.  It turns out that in the old days, you could create several stored procedures with the same name, and give each a different number. As you can see from the &lt;a href="http://msdn.microsoft.com/en-us/library/ms187926.aspx"&gt;MS documentation&lt;/a&gt;, there is a number parameter.&lt;br /&gt;&lt;br /&gt;These are called in the normal way:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;EXEC UpdateOrder;4 20, 39&lt;br /&gt;EXEC UpdateOrder;7 '12 High St.'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It's not very nice, and the "advantage" of being able to DROP them all in one go (the only feature mentioned in the documentation), isn't worth the diminished readability.&lt;br /&gt;&lt;br /&gt;Even worse though, is that the newer SQL Server Management Studio doesn't show them in the tree view, and thus can't open them. Even trying to view the code by using INFORMATION_SCHEMA only shows the first one. I'm sure the old Enterprise Manager must be able to, but I don't want to have to install it especially.&lt;br /&gt;&lt;br /&gt;Anyway, I thank my colleagues from throughout my career for having kept me from needing to know about this until now. I don't know who introduced this nonsense into this project (or indeed, SQL Server), and I hope it remains thus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-3047753433683473346?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DDSo_C0VAZw1r7_oMQePC8jO3JQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DDSo_C0VAZw1r7_oMQePC8jO3JQ/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/DDSo_C0VAZw1r7_oMQePC8jO3JQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DDSo_C0VAZw1r7_oMQePC8jO3JQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=jDWBa29t"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=duz5XVdz"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/A8bzIqH5PtE" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2009/02/numbered-stored-procedures.aspx</feedburner:origLink></item><item><title>Co-working at the Lewes Werks</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/7y-iFNrrcb0/co-working-at-lewes-werks.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Wed, 11 Feb 2009 11:03:10 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-5631950991064005133</guid><description>Today I've been co-working at the brand new &lt;a href="http://leweswerks.org.uk/"&gt;Lewes Werks&lt;/a&gt;. Co-working means to work in an office with people who are not your colleagues, which is ideal for self-employed people or homeworkers.&lt;br /&gt;&lt;br /&gt;It's being run by the same people who run the &lt;a href="http://thewerks.org.uk/"&gt;Brighton Werks&lt;/a&gt;, so the philosophy is the same; to provide a shared workspace for creative workers, with an emphasis on the social side of work.  There are also two separate rooms that would suit small companies of 4-6 people.&lt;br /&gt;&lt;br /&gt;I can turn up with my laptop, and have a &lt;a href="http://harriyott.com/2008/04/for-last-3-months-or-so-ive-been.aspx"&gt;break from working from home&lt;/a&gt; (which contains builders and children at various times).  Once it becomes more established, there will be plenty of people to get to know, share ideas and possible projects, and have a bit of techie chat and office banter, which I do miss.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://leweswerks.org.uk/"&gt;&lt;img src="http://leweswerks.org.uk/wp/wp-content/uploads/2009/02/leweswerkslogo.png" alt="Lewes Werks logo" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The full &lt;a href="http://leweswerks.org.uk/workspace/"&gt;price list&lt;/a&gt; is on the Werks website, but for February only, &lt;a href="http://leweswerks.org.uk/opening-up/"&gt;all co-working is FREE&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;There are a few parking spaces, a sandwich shop a few doors away, and a bus stop too, so I'll definitely be going back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-5631950991064005133?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OMV965APw_UL6SVHpZqby4uSYDQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OMV965APw_UL6SVHpZqby4uSYDQ/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/OMV965APw_UL6SVHpZqby4uSYDQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OMV965APw_UL6SVHpZqby4uSYDQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=glEpRjgR"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=dhyuOzTP"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/7y-iFNrrcb0" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2009/02/co-working-at-lewes-werks.aspx</feedburner:origLink></item><item><title>Twitter iPhone DM hoax</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/5EExtSD6XKw/twitter-iphone-dm-hoax.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Sat, 18 Apr 2009 17:52:01 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-3938271190396910950</guid><description>Just noticed my first twitter hoax. Someone I follow retweeted &lt;a href="http://twitter.com/PRsarahevans/status/1096934285"&gt;this message&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;If you get a "want to win an iphone" DM, don't click the link...it's spam!!! Pls RT!&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;At the time of writing, two hours after this tweet, &lt;a href="http://search.twitter.com/search?q=+%22If+you+get+a+%22want+to+win+an+iphone%22+DM%2C+don%27t+click+the+link."&gt;18 people have retweeted&lt;/a&gt;, so people believe it can happen, which it can't.&lt;br /&gt;&lt;br /&gt;Spam is &lt;a href="http://en.wikipedia.org/wiki/Spam_(electronic)"&gt;unsolicited&lt;/a&gt;, and one would have to &lt;a href="https://help.twitter.com/index.php?pg=kb.page&amp;amp;id=15"&gt;follow the twitterer to receive it&lt;/a&gt;. Following someone means that you are opting-in, or soliciting, so by definition, any tweets, direct or otherwise, from the twitterer can't be spam. The best way to not get DMs from spammers, is to simply not follow any spammers. Looking at the originator's follower counts (and that she's in PR), it's not a total shock that she might be following a spammer.&lt;br /&gt;&lt;br /&gt;This tweet has two features of a good hoax, in that it sounds like a well-intentioned warning, and it has a request to spread it around. I get plenty of other hoaxes (usually virus / trojan warnings) from friends via email or facebook message, and I usually reply with a link to a hoax-buster site. Simply googling for a key phrase in the message is enough to find one. In this case, as the message is only two hours old, there aren't any results, so I'm going to claim ... FIRST!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-3938271190396910950?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/85UH8EgrHqek779unIofemJuPOU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/85UH8EgrHqek779unIofemJuPOU/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/85UH8EgrHqek779unIofemJuPOU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/85UH8EgrHqek779unIofemJuPOU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=VQJMzMvP"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=w5bo5PhT"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/5EExtSD6XKw" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://harriyott.com/2009/01/twitter-iphone-dm-hoax.aspx</feedburner:origLink></item><item><title>Free upgrade to Parallels 4.0 for ReMix08 attendees</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/-GBKV1uF-ZM/free-upgrade-to-parallels-40-for.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Thu, 27 Nov 2008 15:07:42 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-6102833688275178942</guid><description>As well as getting a BizSpark subscription recently, I also got a Microsoft Expression subscription as part of my ticket for ReMix08 in Brighton in September. Tucked away in the subscription was a licence for &lt;a href="http://www.parallels.com"&gt;Parallels&lt;/a&gt;. That's cool, and I'm using it. But then recently Parallels 4.0 came out, and it costs money to upgrade. &lt;br /&gt;&lt;br /&gt;Ho-hum, version 3 seems fine, but wait, hang on, there's &lt;a href="http://www.parallels.com/support/pdfm4-upgrade-key/"&gt;a free upgrade for people who bought Parallels since September&lt;/a&gt;. Does my Expression subscription qualify, especially as it was kind of a freebie with the ReMix ticket? Well, if you don't ask, you don't get. So I asked. The asking page said to send a proof of purchase, so I sent a screenshot of my ReMix confirmation email, hoping that would be enough.&lt;br /&gt;&lt;br /&gt;The lovely Maria emailed me back, saying that I needed to send a proof of purchase and to ask which version I had purchase. I told her about the subscription from ReMix, and she, oh yes, replied with a licence key. Bless her.&lt;br /&gt;&lt;br /&gt;Anyway, I'm yet to download and install it, but I thought I'd let you know, in case you were at ReMix, or have recently bought a subscription containing Parallels, and would like a free upgrade to 4.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-6102833688275178942?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fJhMplU7_9X31mrTw4fPhT_re5s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fJhMplU7_9X31mrTw4fPhT_re5s/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/fJhMplU7_9X31mrTw4fPhT_re5s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fJhMplU7_9X31mrTw4fPhT_re5s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=zCQmZirY"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=smVHO4Iz"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/-GBKV1uF-ZM" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2008/11/free-upgrade-to-parallels-40-for.aspx</feedburner:origLink></item><item><title>Free MSDN licences for microISVs</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/xSMFu2mzGzA/free-msdn-licences-for-microisvs.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Thu, 27 Nov 2008 12:48:35 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-4885678993264605987</guid><description>I came across the &lt;a href="http://www.microsoft.com/bizspark/"&gt;BizSpark programme&lt;/a&gt; a few weeks ago, and it is super. What happens is, is that Microsoft want to help small new software development companies get going, and are providing free(ish) licenses for practically everything. The requirements for qualification are that your company:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Is in the business of software development&lt;/li&gt;&lt;li&gt;Is privately held&lt;/li&gt;&lt;li&gt;Has been in business for less than 3 years, and&lt;/li&gt;&lt;li&gt;Has less than US $1 million in annual revenue.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There are some slight conditions around the definitions, but I applied, as I thought I would qualify with &lt;a href="http://matchmatix.com"&gt;MatchMatix&lt;/a&gt;. I turned out that I did qualify, and so I now have three years of MSDN subscription, and (from memory) I pay about $100 after three years. I believe you get one licence per employee, up to a maximum of 24 people.&lt;br /&gt;&lt;br /&gt;So I have very excitedly downloaded Vista Ultimate, Office Ultimate, SQL Server 2008 and Expression Studio. There are other things that I could download if I were interested, such as Sharepoint, Dynamics, Windows 3.1, Visio, Project and so much else. Thank you Microsoft!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-4885678993264605987?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FFx9Z4V7rstC1Q032XUuLo8yEKY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FFx9Z4V7rstC1Q032XUuLo8yEKY/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/FFx9Z4V7rstC1Q032XUuLo8yEKY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FFx9Z4V7rstC1Q032XUuLo8yEKY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=GFqBWMSb"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=iCMPgcpP"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/xSMFu2mzGzA" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://harriyott.com/2008/11/free-msdn-licences-for-microisvs.aspx</feedburner:origLink></item><item><title>Learning about pointers from plasticene</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/0nUhchx9BM8/learning-about-pointers-from-plasticene.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Fri, 17 Apr 2009 14:48:17 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-1090790635528442453</guid><description>I rather enjoyed this animated way of explaining how pointers work. And don't.&lt;br /&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="425" height="344" data="http://www.youtube.com/v/UvoHwFvAvQE"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UvoHwFvAvQE" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-1090790635528442453?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mLtFsFTqkvQ31-q1KgRfn07edi4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mLtFsFTqkvQ31-q1KgRfn07edi4/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/mLtFsFTqkvQ31-q1KgRfn07edi4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mLtFsFTqkvQ31-q1KgRfn07edi4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=ULRKuRp8"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=Fe8ByutC"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/0nUhchx9BM8" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2008/11/learning-about-pointers-from-plasticene.aspx</feedburner:origLink></item><item><title>New Laptop</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/uakUqbQsjB0/new-laptop.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Fri, 31 Oct 2008 14:38:14 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-7830772095737415797</guid><description>This is the first post from my new laptop. Well, when I say new, I mean second-hand. My last laptop (and indeed my first) is a tablet PC, which has been great, but my life has changed since I bought it, and it's not quite up to what I need it for.&lt;br /&gt;&lt;br /&gt;When I bought the tablet, I was a permanent employee at a software house, and all of my work was done at my desk, on a company PC. I wanted a laptop to use at home when I couldn't get on the desktop, to use for the usual sort of home stuff, and some light development. Why did I get a tablet PC rather than a normal laptop? Honestly, I just fancied it. It's been handy on a couple of occasions, such as taking notes in meetings (drawing a diagram is much easier with a pen than cracking open Visio).&lt;br /&gt;&lt;br /&gt;So now, I'm a contractor, and the three contracts I've had this year have required me to use my own computer, which I'm quite happy with. I know how it's all set up, I've got my favourite utilities installed, and I can just get on with the work once I've got the spec and the version control details.  The downside is that the screen on the tablet is tiny - around 13 to 14 inches. &lt;br /&gt;&lt;br /&gt;I spend most of my time in Visual Studio, and by the time I've got the solution explorer on one side, and the output or debugging windows at the bottom, and the menus and toolbars at the top, I've got a screen area about the size of a postcard, and not very high resolution either. That means I can see only around 15-20 lines of code at a time, which can be frustrating, especially if I want to split the window to compare two sections of the same file, or use split view in the designer.&lt;br /&gt;&lt;br /&gt;So, I needed a big laptop. A 17" screen would be ideal, so that's what I've got. That was about my only requirement, other than it could run Visual Studio, so as long as it had a better processor than the tablet, and it had (or I could put in) a decent amount of RAM, then it would be fine. &lt;br /&gt;&lt;br /&gt;So I bought a Mac. Yes, really. A MacBook Pro, 17". Like the tablet, I bought it on eBay, which saved a bit of money. Well, over a grand actually. There's no way I would have bought a new one. So why did I get a Mac? Honestly, I just fancied it. And also, I've never heard anyone say "I used to use PCs, and then went to a Mac, but I didn't like it. Windows is much better". On the contrary.&lt;br /&gt;&lt;br /&gt;The guy I bought it from was a star. He repaved it, and put on Parallels and boot-camp, and when he found out that I've not had a Mac before, he threw in a Mac book (as in a book about Macs, not a smaller laptop).&lt;br /&gt;&lt;br /&gt;First impressions: it's big. It won't quite fit in my laptop bag, which is big. There's a nice big bit of metal to rest my hands, well, &lt;em&gt;arms&lt;/em&gt; on when I'm typing. There's load to get used to, like finding out that there's no Windows Explorer. Yes, really! There's a thing called Finder, which seems a bit odd so far. Simple things like selecting the previous word with the keyboard are tricky too. It's all a case of getting used to things, which I'm sure I will.&lt;br /&gt;&lt;br /&gt;I haven't installed Windows on it yet - I don't have a disk that isn't tied to a specific computer, and nor do I have a licence - yet. Once my free Expression subscription is sorted out, I'll have licences a-plenty, and I'll set it up then, and I'm sure I'll tell you all about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-7830772095737415797?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BNDDuFtQrR-JSPzk4fVGeeEHPuQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BNDDuFtQrR-JSPzk4fVGeeEHPuQ/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/BNDDuFtQrR-JSPzk4fVGeeEHPuQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BNDDuFtQrR-JSPzk4fVGeeEHPuQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=AEHx1VJL"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=FNroVosJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/uakUqbQsjB0" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://harriyott.com/2008/10/new-laptop.aspx</feedburner:origLink></item><item><title>Obfuscation's what you need (if you want to be a Reflector breaker, yeah)</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/U5qBEk0Mpz8/obfuscations-what-you-need-if-you-want.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Mon, 08 Sep 2008 14:33:03 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-2649419299633221039</guid><description>Cool bananas. I just had a crazy idea (to file under cheeky hacks), and it works.  I've been trying to obfuscate &lt;a href="http://matchmatix.com"&gt;MatchMatix&lt;/a&gt; so I can start sending out evaluation versions, without the licensing code being visible.  A couple of weeks ago, I tried Dotfuscator Community Edition (CE), as it comes with Visual Studio.  For the uninitiated, obfuscated code is harder to read in &lt;strike&gt;Lutz Roeder's&lt;/strike&gt; &lt;a href="http://www.red-gate.com/products/reflector/"&gt;Red Gate's Reflector&lt;/a&gt;, so people can't nick your secrets (as easily).&lt;br /&gt;&lt;br /&gt;I was fairly pleased with what it produced, in that the class names were renamed to a, b, c, ... ab, ac, ad etc.  The method names also followed this convention, and there seems to be method overloading too, where differently-named methods with different signatures are obfuscated as methods with the same name. Cunning.&lt;br /&gt;&lt;br /&gt;The problem was that the code in these methods was still visible. This is because the CE version is &lt;a href="http://tinyurl.com/6qyed5"&gt;"Limited to simple renaming"&lt;/a&gt;. The other problem is that the Professional version costs more than a laptop, and it's my policy not to pay more for software than it costs to buy a laptop (at least until I've bought a new laptop, anyway). Actually, even then, I'd rather buy something far more interesting than obfuscation tools for that much.&lt;br /&gt;&lt;br /&gt;I tried a couple of other free obfuscators (I really hate that word now), but without any success, and I ran out of time, and haven't thought about it since.&lt;br /&gt;&lt;br /&gt;Until today, upon seeing a link to the new (and free!) &lt;a href="http://www.codeproject.com/KB/applications/babel.aspx"&gt;Babel Obfuscator&lt;/a&gt; on the most excellent &lt;a href="http://blog.cwa.me.uk/2008/09/04/the-morning-brew-172/"&gt;Morning Brew&lt;/a&gt;. (Hey nice photo, by the way. I like the "CEO-casual" look.)&lt;br /&gt;&lt;br /&gt;It seems as though Alberto Ferrazzoli, the obfuscreator (see what I did there?) had similar issues to me:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I wrote this obfuscator because I need it for one of my early project. I try to use some readymade freeware obfuscators unsuccessfully. There are several professional obfuscators on the market but they are not cheap.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;However, Alberto is more enterprising than me:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I know that writing an obfuscator is not an easy task but two weeks ago I came across an article about Microsoft Phoenix SDK so I realized that should be possible to write this obfuscator.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Good man! I just gave up, but you went right ahead and wrote your own. Marvellous. And it's only 34Kb to download. Brilliant. Ah, hang on, I need this &lt;a href="http://connect.microsoft.com/Phoenix/Downloads/DownloadDetails.aspx?DownloadID=12911"&gt;Phoenix&lt;/a&gt; thingy. 104Mb. What? Oh well.&lt;br /&gt;&lt;br /&gt;This is all command line, unlike Dotfuscator CE, so that's a good start. Not only does it &lt;strike&gt;obfuscate&lt;/strike&gt; mangle (OK, that's the last time I'm typing obfuscate. er..) the code, but it also does MSIL control flow obfuscation (I pasted that one), which adds meaningless IL code that can't be translated back to C# code, so Reflector can't understand it.&lt;br /&gt;&lt;br /&gt;So I ran it, and not only was the source code hidden, it crashed Reflector! Wickid! 10 points to Alberto.  The downside was that the class names weren't mangled, so it was really easy to find my licensing class. So what to do? Do I go for mangled classes, but visible code, or visible classes and mangled code?&lt;br /&gt;&lt;br /&gt;So here comes the crazy idea, so crazy that it might just work. What if I could have both? By using both manglers? Would it really work? (OK, you know it does, because I said so earlier, but I'm trying to build some suspense). Could I daisy-chain them together? Pass the output from one mangler as the input to the other? Well, YES! Sometimes I amaze even myself.&lt;br /&gt;&lt;br /&gt;So, now Reflector shows me mangled class names, and mangled code (it doesn't crash Reflector any more though. Boo). Here's and example method from the &lt;code&gt;a9&lt;/code&gt; class:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;protected StringBuilder c(a8 A_0)&lt;br /&gt;{&lt;br /&gt;    // This item is obfuscated and can not be translated.&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ten pounds says you can't tell me what this method did originally.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-2649419299633221039?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OEyFWPNPqZwl1UZotNNpzB__c40/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OEyFWPNPqZwl1UZotNNpzB__c40/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/OEyFWPNPqZwl1UZotNNpzB__c40/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OEyFWPNPqZwl1UZotNNpzB__c40/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=a3f9mer4"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=GhS0dMwr"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/U5qBEk0Mpz8" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://harriyott.com/2008/09/obfuscations-what-you-need-if-you-want.aspx</feedburner:origLink></item><item><title>Code from 16 years ago</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/RdnhTR-k_0M/code-from-16-years-ago.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Sun, 19 Apr 2009 09:41:57 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-1782476469459787737</guid><description>I've just located four floppy disks I used at sixth form college, which contain some code I wrote as part of my course.  I'm about to look at it, and share my initial reactions.  It's kind of the antithesis to &lt;a href="http://www.hanselman.com/blog/CategoryView.aspx?category=Source+Code"&gt;Scott Hanselman's Weekly Source Code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The one disk is labeled June 1992, so that would be at the end of my 2 year BTEC.  Given that code I wrote last year is quite embarrassing, I'm expecting this to be truly awful. Still, it is also the culmination of three years of tertiary education (I did A-levels for a year before switching - I got an excellent mark for computer science, and rubbish marks for the others at the end of the first year, so I switched).&lt;br /&gt;&lt;br /&gt;Firstly, floppy disks. I'm quite impressed that my (admittedly old) desktop PC has a floppy drive and the disks can be read at all. It's been a long time since I've inserted a floppy into drive A, and so it now feels a bit strange. Windows doesn't detect when the disks have changed, so although no longer a common problem, Explorer shows a list of files that are completely different to the ones on the current disk, until F5 refreshing. I only seem to refresh web pages these days.&lt;br /&gt;&lt;br /&gt;Something else on floppy disks for you USB-happy kids.  In the old days, some PCs (and I had one) didn't have hard drives, they had only floppy drives.  Mine had two!  I used to load the OS from drive A, and take the disk out. The whole OS would sit in RAM (I suppose), and any programs I wished to run I would load from another floppy disk.  Any data would be saved to yet another floppy, which was why having two drives was super good; the data could be saved to a different floppy in the B drive.&lt;br /&gt;&lt;br /&gt;Eventually, my Dad bought a 40Mb hard drive (which still isn't full) which became the C drive. I've kind of taken it for granted that the hard drive is the C drive, but that seems to be the standard now, and A: and B: are generally unused by floppy-less systems.  So now children, that's why the C drive isn't the A drive.&lt;br /&gt;&lt;br /&gt;OK, back to the code. I'm about to open the box...&lt;br /&gt;&lt;br /&gt;The first file is from a Pascal program. I haven't written any Pascal since then, not even Delphi. The first glance shows me I used to be a bit funny about lining stuff up for no reason. The colons are all in a row, so that the data types are lined up too. Oh, and the same with my case statement. It's maybe more readable, but probably not worth doing.&lt;br /&gt;&lt;br /&gt;Next up, there isn't a single comment in the 167-line file.  Not even a file header.  I can roughly work out what's going on though.  Hang on, I've just seen one - it says "Get Valid Key" before the last line of the GetValidKey function.  Well, that's something I've got better at.&lt;br /&gt;&lt;br /&gt;Wait, what? That seems to be a nested function. Can you do that? The child function isn't actually called by anything, so I guess it must be run as part of the parent function in normal flow. Time to google...&lt;br /&gt;&lt;br /&gt;Well &lt;a href="http://en.wikipedia.org/wiki/Nested_function"&gt;blow me down&lt;/a&gt;.  Ah, maybe it's because Pascal isn't object oriented, i.e. there are no classes, that this is possible. Wow. I've been OO for so long, this seems completely odd.&lt;br /&gt;&lt;br /&gt;OK, what else? I've got some constants, but a lot of magic numbers, particularly for screen positioning. Screen positioning is interesting. As it's a console app, you can say &lt;code&gt;gotoxy(35,1);&lt;/code&gt; and that will position the cursor on line 1, column 35, and then write to, or read from, the console.&lt;br /&gt;&lt;br /&gt;My if..thens are all on one line, and I have no consistency for casing functions, parameters and variables. Still, they are generally named sensibly, so I could possibly argue that I was writing &lt;a href="http://en.wikipedia.org/wiki/Self-documenting"&gt;self-documenting code&lt;/a&gt;. Ahem.&lt;br /&gt;&lt;br /&gt;That's probably enough for this file. Not as bad as I was fearing, but still pretty bad. What else is there?  Golly, winfile.exe is there - that's File Manager, the predecessor to Windows Explorer (introduced in Windows 95). Blimey, and it still works.&lt;br /&gt;&lt;br /&gt;Next source file is &lt;a href="http://en.wikipedia.org/wiki/Cobol"&gt;COBOL&lt;/a&gt;. There is one helpful thing that COBOL taught me, and that is how to spell &lt;em&gt;environment&lt;/em&gt;. If you spelt that wrong declaring the environment division, then you'd have more errors than you knew what to do with. COBOL seems quite wordy: whereas now I'd do &lt;code&gt;title.ToUpper()&lt;/code&gt; in C#, I did &lt;code&gt;inspect title converting "mrsipofdr" to "MRSIPOFDR".&lt;/code&gt; (Dammit, I've put the R in twice).&lt;br /&gt;&lt;br /&gt;This is an error prone way of doing case conversion; I've just spotted an entire alphabet version of the above, but I've mistyped the w as a q, which now appears twice. I wonder what would have happened to that.&lt;br /&gt;&lt;br /&gt;Again, no comments. Well, I assume not. The whole thing appears almost as prose (e.g. &lt;code&gt;label records are standard.&lt;/code&gt; and &lt;code&gt;alternate key is surname-pd with duplicates.&lt;/code&gt;), so fewer seem to be needed.&lt;br /&gt;&lt;br /&gt;Bored of COBOL now. Ah, here's some documentation for a &lt;a href="http://en.wikipedia.org/wiki/Superbase_database"&gt;Superbase&lt;/a&gt; (pre-cursor to MS Access) application. It's in Word 1.x, but it still opens. I guess the intended user is quite new to computers:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;When the system is first loaded up you will be confronted by the Main Menu.  This includes eight push buttons which can be activated by clicking on them using the left hand mouse button.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And I guess my technical authorage was as useful as my commenting:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If you want to add a students details then click on 'ADD A STUDENT'.  The cursor will appear on the screen and you will be allowed to enter details.  When you have finished you must click on the 'SAVE' button.  If you wish to print all the students in the information systems file, simply click on the 'PRINT ALL' button.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;There are some &lt;a href="http://en.wikipedia.org/wiki/Jackson_Structured_Programming"&gt;JSP diagrams&lt;/a&gt; in Excel files (which again, still open). The boxes were done by typing in a cell, and setting the border around the eight adjacent cells. Lines between boxes were created with top and left borders on the in-betweenies.  Sounds horrendous, but back then I never needed to visit the visio-therapist. [My apologies]&lt;br /&gt;&lt;br /&gt;There's a proposal from the Small Business Systems course module, which is quite dull, apart from the PC I &lt;strike&gt;speced&lt;/strike&gt; &lt;strike&gt;specked&lt;/strike&gt; specified:&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="5" cellspacing="0"&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Processor&lt;/td&gt;&lt;td&gt;80386SX - running at 25Mhz&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Hard Disk Drive&lt;/td&gt;&lt;td&gt;42Mb&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;RAM&lt;/td&gt;&lt;td&gt;2Mb, expandable to 16Mb.  Compatible with LIM 4.0 EMS&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This would have set you back &amp;pound;795, which sounds a lot, but was cheaper than the &lt;a href="http://www.nefec.org/upm/printers/mok800.htm"&gt;OKIlaser 800&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've found another quote, from 23rd September, 1991, where a 43Mb hard drive cost &amp;pound;2099. Staggering. That's about one eighteenth of the size of a CDROM. Still, we didn't have digital cameras then.&lt;br /&gt;&lt;br /&gt;Finally, here's a nice little office plan I designed myself. Note the disk box, which has its own special place on the desk. Bless.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://harriyott.com/images/officelayout.png" alt="Office layout" title="OK, so it's not an Aeron" /&gt;&lt;br /&gt;&lt;br /&gt;Well, I've enjoyed that little peek into my teenage coding years. A few memories have resurfaced, including a couple of people who I had completely forgotten about (hello Abdul!).  In conclusion, I learnt some useful things there, and I'm now better than I was then (honest boss).&lt;br /&gt;&lt;br /&gt;Right, now onto Facebook to hunt down my old classmates...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-1782476469459787737?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dCFpMZncW7EG-pwJPpLFmpmqSpc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dCFpMZncW7EG-pwJPpLFmpmqSpc/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/dCFpMZncW7EG-pwJPpLFmpmqSpc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dCFpMZncW7EG-pwJPpLFmpmqSpc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=wRGzhpv2"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=e3p4NCf8"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/RdnhTR-k_0M" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total><feedburner:origLink>http://harriyott.com/2008/08/code-from-16-years-ago.aspx</feedburner:origLink></item><item><title>Tip of the day</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/9G5FemFbBVU/tip-of-day.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Thu, 14 Aug 2008 11:08:44 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-6826167561482099374</guid><description>If, when phoning a call centre, you get someone unhelpful, try phoning again. Someone else is likely to answer, and they might be more helpful. In this case, the second person I spoke to decided that they would refund a bank charge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-6826167561482099374?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pnhCDmQyw6sCzNbrFlEnES_ZOZo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pnhCDmQyw6sCzNbrFlEnES_ZOZo/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/pnhCDmQyw6sCzNbrFlEnES_ZOZo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pnhCDmQyw6sCzNbrFlEnES_ZOZo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=UtVX1Yi0"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=D7dMnMEY"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/9G5FemFbBVU" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2008/08/tip-of-day.aspx</feedburner:origLink></item><item><title>Extension methods in C# again</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/c3oxmukvic0/extension-methods-in-c-again.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Tue, 08 Jul 2008 10:48:16 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-6141850749378733897</guid><description>I'm getting extension methods into my regular "coding vocabulary" (i.e. I remembered to use one). I was wondering why String didn't have a Right() method, to save doing maths to work out the numbers to call SubString(), so I decided to write one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-6141850749378733897?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w9LLQxQ5upI61bOatij94fLqNAU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w9LLQxQ5upI61bOatij94fLqNAU/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/w9LLQxQ5upI61bOatij94fLqNAU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w9LLQxQ5upI61bOatij94fLqNAU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=9HnHDG9X"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=bBE5OGmv"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/c3oxmukvic0" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2008/07/extension-methods-in-c-again.aspx</feedburner:origLink></item><item><title>Extension methods in C#</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/O7JRqZ9v8bA/extension-methods-in-c.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Fri, 20 Jun 2008 07:57:30 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-6420797439147689124</guid><description>I recently needed to encrypt a string with MD5 encryption. Not having used this before, I looked at the MSDN page for the &lt;a href="http://tinyurl.com/6gdsqj"&gt;MD5 class&lt;/a&gt;. There was a ComputeHash method, but no overload took a string parameter - just a stream or a byte array.&lt;br /&gt;&lt;br /&gt;I may be naive, but I would have thought encrypting a string would be a common enough task to warrant its own overload, but apparently not. It is common enough though, for some example code that converts the string to a byte array, calls ComputeHash, and converts the result to a hex string. This example seems to work fine, so I don't know why it isn't just squished into the class in the framework.&lt;br /&gt;&lt;br /&gt;Not wanting to just add this example to the class I was working on, I thought I would write my first ever extension method, and add the example as an overload to the MD5 framework class.  I read about extension methods in the marvelous &lt;a href="http://www.amazon.co.uk/exec/obidos/redirect?link_code=ur2&amp;tag=harriyottcom-21&amp;camp=1634&amp;creative=6738&amp;path=ASIN%2F1590598849"&gt;Pro C# 2008 and the .NET 3.5 Plaform&lt;/a&gt;, which are straightforward, but the syntax is a little unintuitive:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public static class MD5Extensions&lt;br /&gt;{&lt;br /&gt; public static string ComputeHash(this MD5 md5, string input)&lt;br /&gt; {&lt;br /&gt;  byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(input));&lt;br /&gt;  StringBuilder sBuilder = new StringBuilder();&lt;br /&gt;  for (int i = 0; i &lt; data.Length; i++)&lt;br /&gt;  {&lt;br /&gt;   sBuilder.Append(data[i].ToString("x2"));&lt;br /&gt;  }&lt;br /&gt;  return sBuilder.ToString();&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In short, both the class and the method should be defined as static, and the first parameter has "this" before the type, which is the class that is being extended.  I'm going to have to keep looking this up, as there are three things to remember. I would have preferred a new keyword, extended, which works in the same way as partial classes, like so:&lt;br /&gt;&lt;pre&gt;public extended class MD5&lt;br /&gt;{&lt;br /&gt; public string ComputeHash(string input)&lt;br /&gt; {&lt;br /&gt;  ...&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This would have been far easier to remember, and would actually look like the programmer's intention. I'm sure there must be a good reason for the way it has been done though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-6420797439147689124?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/56AeTqXDtb2HBNRX80QPYMPzpDE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/56AeTqXDtb2HBNRX80QPYMPzpDE/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/56AeTqXDtb2HBNRX80QPYMPzpDE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/56AeTqXDtb2HBNRX80QPYMPzpDE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=leCqhLFp"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=vPKfMLeK"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/O7JRqZ9v8bA" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://harriyott.com/2008/06/extension-methods-in-c.aspx</feedburner:origLink></item><item><title>Re-inventing the toll</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/x51fGSxA6_E/re-inventing-toll.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Mon, 02 Jun 2008 03:11:24 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-8445931262614310573</guid><description>One of the side-effects of being a developer is that I often find myself &amp;quot;debugging&amp;quot; things outside of the IDE, or the computer itself. Recently I went somewhere that involved driving across the Dartford crossing on the M25*.  There's a tunnel under the River Thames for northbound traffic, and a huge bridge for southbound traffic. There are toll gates for both directions south of the river.&lt;br /&gt;&lt;br /&gt;As I was in a long, southbound queue (caused by the toll) on my return journey, I started thinking about why there were two tolls in operation at the same time, and two resultant traffic jams, and what to do about it. I think I've come up with a way to ease the jams.&lt;br /&gt;&lt;br /&gt;The obvious first choice is to dispense with the tolls altogether, since the bridge paid for itself in 2003.  The government aren't going to do that though.&lt;br /&gt;&lt;br /&gt;I reckon that almost everyone that uses the bridge in one direction uses it again in the opposite direction very shortly afterwards. In my case, it was about 7 hours after. Very few people make journeys from their home or place of work and don't return via the same route in the opposite direction.&lt;br /&gt;&lt;br /&gt;On my journey, I had two toll transactions, of &amp;pound;1 each way. I think it would be better to have one transaction of &amp;pound;2 instead, that would cover both journeys. In this way, one set of tolls could be closed, and allow traffic to flow freely through, removing one traffic jam altogether.&lt;br /&gt;&lt;br /&gt;Depending on the traffic flow, the tolls could be changed over to reduce an extremely long tailback. If this happened in the middle of the day, then some people may have to pay twice, and others nothing at all. Although this doesn't sound fair, it should even out over time.&lt;br /&gt;&lt;br /&gt;Should I suggest this to Boris, or is it a silly idea?&lt;br /&gt;&lt;br /&gt;* Actually, it isn't the M25 at the crossing, it's the A282. I presume this is so that learner drivers can cross the river without going into town, as they're not allowed on motorways.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-8445931262614310573?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n5jgW5k48wzC6ClO_O5r6LC0udM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n5jgW5k48wzC6ClO_O5r6LC0udM/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/n5jgW5k48wzC6ClO_O5r6LC0udM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n5jgW5k48wzC6ClO_O5r6LC0udM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=x3jl78f6"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=K3dqiqGH"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/x51fGSxA6_E" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://harriyott.com/2008/06/re-inventing-toll.aspx</feedburner:origLink></item><item><title>NxtGenUG FEST08</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/Q9C5ZRYXjNQ/nxtgenug-fest08.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Mon, 02 Jun 2008 00:19:37 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-7934629104285692977</guid><description>Dave McMahon has asked me to let you know about FEST08. In his words:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"FEST08 the annual NxtGenUG one-day event takes place ar Microsoft Reading on Thursday 12th June.  As ever it's going to be an action packed day with great content from the likes of Mike Taulty ,Oliver Sturm , Dave Sussman and other top speakers.  No doubt there will be bundles of 'swag' and prizes and Pizza somewhere down the line - there always is when the nxtGenUG Boyz are around.  There seems to be a few more of them this year with the Cambridge and Southampton crews joining in the mix.&lt;br /&gt; &lt;br /&gt;So got to &lt;a href="http://www.nxtgenug.net/fest08/"&gt;http://www.nxtgenug.net/fest08/&lt;/a&gt; for details and to register your place.  It's free to all NxtGenUG members and a mere £49.99 to non-members - bargain!  Oh and also if you're around the night before there is a G(r)eek dinner to toast Daniel Moth on his way to the states.  &lt;a href="http://www.nxtgenug.net/ViewEvent.aspx?EventID=140"&gt;http://www.nxtgenug.net/ViewEvent.aspx?EventID=140&lt;/a&gt; is the link to signup to."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-7934629104285692977?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tIGSvXUhHg1-PYsd2503wWrOK9w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tIGSvXUhHg1-PYsd2503wWrOK9w/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/tIGSvXUhHg1-PYsd2503wWrOK9w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tIGSvXUhHg1-PYsd2503wWrOK9w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=1R8XhQve"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=B6VgDj8J"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/Q9C5ZRYXjNQ" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2008/06/nxtgenug-fest08.aspx</feedburner:origLink></item><item><title>Converting SVG images to PNG in C#</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/FOceiIpBanw/converting-svg-images-to-png-in-c.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Thu, 22 May 2008 23:47:04 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-4898461041698635015</guid><description>I've been dynamically generating SVG images for the intranet I'm working on.  I initially chose SVG, as it's an XML format, which is easy to manipulate in C#. I've started with the template picture, and added elements based on the data pulled from the database. These elements are lines and text, positioned according to the data.&lt;br /&gt;&lt;br /&gt;There have been two minor problems so far. Firstly, although FireFox displays SVG files beautifully, IE just shows the XML. No biggie, as there's only a few users, and I can tell them to use FireFox (a pragmatic bug fix!).  The other problem is that one of the users wants to copy and paste the image into PowerPoint. With a BMP, JPEG or PNG image, the context menu has a &lt;em&gt;copy&lt;/em&gt; option that just isn't there with SVG, so there's no simple way to get it into PowerPoint. Time to bite the bullet (whatever that means) and convert the image to PNG.&lt;br /&gt;&lt;br /&gt;I decided not to convert my code to use the System.Drawing to generate PNGs from the database data, as I'd already solved that problem. Surely conversion would be easier...&lt;br /&gt;&lt;br /&gt;The obvious first step is to Google for a free SVG to PNG library, or example code on CodePlex or something, but I couldn't see anything amongst the noise of shareware apps that did conversions through a GUI.  I did however, &lt;a href="http://zkwarl.blogspot.com/2006/08/inkscape-tip-use-inkscape-on-command.html"&gt;find mention&lt;/a&gt; of &lt;a href="http://www.inkscape.org/"&gt;inkscape&lt;/a&gt;'s &lt;a href="http://inkscape.modevia.com/inkscape-man.html"&gt;command line interface&lt;/a&gt;. Inkscape is an open source SVG editor, which I used to create the image template.&lt;br /&gt;&lt;br /&gt;I tried it out, and it was really quick, and the resultant PNG file was indistinguishable (that's a longer word than it sounds) from the original. Now to call it from the .ashx.  This was quite simple, but I'll put the code here for any future Googlers (and there'll be some, there always is. If it's you, then hello and welcome. You're the reason I wrote this post). First, the "spec":&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Write the SVG file to disk&lt;/li&gt;&lt;li&gt;Start inkscape as a process with the correct parameters&lt;/li&gt;&lt;li&gt;Send the PNG file back to the browser&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Now the code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void ProcessRequest(HttpContext context)&lt;br /&gt;{&lt;br /&gt; context.Response.ContentType = "image/png";&lt;br /&gt; &lt;br /&gt; String svgXml = GetSvgImageXml(context);&lt;br /&gt; string svgFileName = GetSvgFileName(context);&lt;br /&gt; using (StreamWriter writer = new StreamWriter(svgFileName, false))&lt;br /&gt; {&lt;br /&gt;  writer.Write(svgXml);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; string pngFileName = GetPngFileName(context);&lt;br /&gt;&lt;br /&gt; string inkscapeArgs = &lt;br /&gt;  "-f " + svgFileName + " -e \"" +&lt;br /&gt;  context.Server.MapPath(PngRelativeDirectory) + "\\" +&lt;br /&gt;  pngFileName + "\"";&lt;br /&gt;&lt;br /&gt; Process inkscape = Process.Start(&lt;br /&gt;   new ProcessStartInfo(&lt;br /&gt;    "C:\\program files\\inkscape\\inkscape.exe",&lt;br /&gt;    inkscapeArgs));&lt;br /&gt; inkscape.WaitForExit(3000);&lt;br /&gt; context.Server.Transfer(PngRelativeDirectory + pngFileName);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There's only one drawback that I can see, and that's having to install inkscape on the server. It's fine for me and my intranet, but may not be possible on hosted servers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-4898461041698635015?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WcHYLppYq9Jv0I4DxzUst-zH9tQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WcHYLppYq9Jv0I4DxzUst-zH9tQ/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/WcHYLppYq9Jv0I4DxzUst-zH9tQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WcHYLppYq9Jv0I4DxzUst-zH9tQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=9O7j7o9b"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=NgnJeRuA"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/FOceiIpBanw" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://harriyott.com/2008/05/converting-svg-images-to-png-in-c.aspx</feedburner:origLink></item><item><title>Dell has a screw loose</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/BIZtE8wtK24/dell-has-screw-loose.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Sat, 26 Apr 2008 09:58:50 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-1714789492234209243</guid><description>A friend of mine has a new computer, her very first, and she asked me to set it up for her. I plugged everything in, switched it on, and got a black screen with some hardwareish words on it. It looked like it hadn't booted properly, so I wondered if something had come adrift in transit.&lt;br /&gt;&lt;br /&gt;As I tilted the computer ready to open it, there was a gentle &amp;quot;clonk&amp;quot; noise from within. Once I'd opened the case, I saw that the hard drive was connected by only one of its two cables, hence the boot failure. I also saw that the hard drive wasn't attached to anything, and was completely out of its bay and resting on the motherboard.  &lt;br /&gt;&lt;br /&gt;This was rather surprising, as it should have been screwed into the case. I checked inside the case, but there were no screws rattling around. Not that they could have come off, as the screw-holes in the bay were covered by the side of the case. No, the screws were quite simply never there in the first place. All 4 of them.&lt;br /&gt;&lt;br /&gt;Fortunately, my friend's mum had given her a really old Dell (Pentium III old), which was unused in a cupboard and about to go to the tip. I opened it up, and eventually found 4 screws that fitted the hard drive. I attached the hard drive into the new PC, connected the cables and it all works fine. &lt;br /&gt;&lt;br /&gt;The question remains though, how on earth can Dell fail on something so basic? Not being into hardware, I don't know whether a minimum-wage worker forgot to screw it in, or the robot's screw pot was empty, but either way, I would have expected better from Dell.&lt;br /&gt;&lt;br /&gt;[Tags:  &lt;a href="http://technorati.com/tag/dell" rel="tag"&gt;dell&lt;/a&gt; &lt;a href="http://technorati.com/tag/hard%20drive" rel="tag"&gt;hard drive&lt;/a&gt; &lt;a href="http://technorati.com/tag/fail" rel="tag"&gt;fail&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-1714789492234209243?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gM9LJe1H480LKOlP6oxPRKK0f3I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gM9LJe1H480LKOlP6oxPRKK0f3I/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/gM9LJe1H480LKOlP6oxPRKK0f3I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gM9LJe1H480LKOlP6oxPRKK0f3I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=jFIHqjac"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=KninSxQn"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/BIZtE8wtK24" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://harriyott.com/2008/04/dell-has-screw-loose.aspx</feedburner:origLink></item><item><title>Geek Dinner with Mike Hadlow</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/dqhu8yPvk_0/geek-dinner-with-mike-hadlow.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Wed, 23 Apr 2008 16:37:26 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-2661165424993705948</guid><description>Many thanks to &lt;a href="http://mikehadlow.blogspot.com/"&gt;Mike Hadlow&lt;/a&gt;, who gave an excellent presentation with code samples about inversion of control containers tonight. A link to the source code for the examples will appear on &lt;a href="http://mikehadlow.blogspot.com/"&gt;his blog&lt;/a&gt; soon.&lt;br /&gt;&lt;br /&gt;Good to meet a few new people too, and catch up with various people I haven't seen for a while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-2661165424993705948?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9GxC4ZZryflfQIm5PC5x3SY2eJQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9GxC4ZZryflfQIm5PC5x3SY2eJQ/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/9GxC4ZZryflfQIm5PC5x3SY2eJQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9GxC4ZZryflfQIm5PC5x3SY2eJQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=7U6Nkbeu"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=6LX5Jf0R"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/dqhu8yPvk_0" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://harriyott.com/2008/04/geek-dinner-with-mike-hadlow.aspx</feedburner:origLink></item><item><title>Working in Uckfield</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/QN0f62DdfKo/working-in-uckfield.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Wed, 11 Feb 2009 08:26:55 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-141171939074474521</guid><description>Despite my &lt;a href="http://harriyott.com/2008/04/for-last-3-months-or-so-ive-been.aspx"&gt;enthusiasm for co-werking in Brighton&lt;/a&gt;, I have a problem. I live in Uckfield.  Not that it's a problem in general; I love being near the country-side, being able to afford a house, and seeing someone I know &lt;i&gt;every&lt;/i&gt; time I go into town.  Uckfield is a small town, and contrasts greatly with Brighton. &lt;br /&gt;&lt;br /&gt;Brighton has free wi-fi along the seafront, and in lots of caf&amp;eacute;s, bars and restaurants. Brighton has lots of web agencies, software companies, financial institutions and a thriving tech community. &lt;br /&gt;&lt;br /&gt;Uckfield is somewhat different. There are very few tech companies in Uckfield. Apart from one or two geek dinners that I organised a while back, there is no tech community in Uckfield. Just like with clothes shopping, you'd have to go to Brighton for that. I've tried working in various catering establishments in Uckfield, but they're not that geared up for it.&lt;br /&gt;&lt;br /&gt;Here's a quick run down on what Uckfield has to offer the mobile worker:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Vespa&lt;/strong&gt;. The only place in Uckfield with free wi-fi. Despite this, I've been there only once. MTV was on quite loud, playing music I didn't like. It closes at 4pm, which means I had to find somewhere else to go.  The coffee was fine, but I didn't feel that comfortable there.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Coffee House&lt;/strong&gt;. Opposite Vespa, but not near enough to filch their wi-fi. I've met Heath, the guy in charge, only twice, but already he feels like a friend. Very friendly and welcoming. There aren't many tables, and the chairs are rather uncomfortable for working at though.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Costa&lt;/strong&gt;. The nicest interior by far, and I like the coffee. I asked about wi-fi, and they said they're always asked, but apparently the owner isn't that bothered about it. They might put it in and charge for it one day. I did manage to connect to someone else's unsecured network sitting in the front of the shop though.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Luna&lt;/strong&gt;. Being a restaurant, it's open after the caf&amp;eacute;s close, so I'll head there if I'm working late. I'm always made to feel welcome, although it is disconcerting sitting near couples out for a romantic meal (I'm sure they're less than delighted too). Although it advertises wi-fi on the sandwich board outside, it hasn't been working for yonks.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;There are a few other places to try, but they look even less promising than these. Even though it takes an hour to get to Brighton in rush hour, it's still a good alternative.  Clearly there's no mention of co-working in Uckfield (although I can use a window-less room in our church office), so I'm hoping that &lt;a href="http://www.facebook.com/group.php?gid=32800515346&amp;ref=nf"&gt;The Source&lt;/a&gt; will be a good option when it opens soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-141171939074474521?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nMuwQHCVonXvN9rSKgUMsF8D5XM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nMuwQHCVonXvN9rSKgUMsF8D5XM/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/nMuwQHCVonXvN9rSKgUMsF8D5XM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nMuwQHCVonXvN9rSKgUMsF8D5XM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=dyRK7ef6"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=U22FcZlk"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/QN0f62DdfKo" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://harriyott.com/2008/04/working-in-uckfield.aspx</feedburner:origLink></item><item><title>Shared Office Space</title><link>http://feedproxy.google.com/~r/harriyott/simonssoftwarestuff/~3/JQD7vKtqGrc/for-last-3-months-or-so-ive-been.aspx</link><author>noreply@blogger.com (Simon)</author><pubDate>Fri, 18 Apr 2008 13:01:52 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7937700.post-9098430496013735016</guid><description>For the last 3 months or so, I've been working from home, and I've loved it. The flexibility, the commute, and the better family life are huge advantages, but the biggest disadvantage, for me anyway, is the loss of office life. I'm working in my spare room, which is small, contains a bed, an open wardrobe and a small table and chair. It needs painting, and the sun shines in mercilessly, so I have to close the curtains.  Some days I don't leave the house, and other days I may not see my family until the afternoon.  After a couple of months, the novelty started wearing off, and despite the advantages, I was feeling lonely.&lt;br /&gt;&lt;br /&gt;As I'm now getting into twitter, I &lt;a href="http://twitter.com/harriyott/statuses/773288202"&gt;twittered my loneliness&lt;/a&gt;, for no other reason than I fancied telling anyone who would listen. I was surprised when &lt;a href="http://twitter.com/richardvahrman"&gt;@richardvahrman&lt;/a&gt; replied, generously &lt;a href="http://twitter.com/richardvahrman/statuses/773305207"&gt;offering me a desk&lt;/a&gt; in his office. I spent the next day in a lovely office in Hove overlooking the sea, and had a very productive time.  There were 5 of us working in the office, and nobody working for the same company (the others rent desk space from Richard). It seemed like good old office life again, with long periods of companionable, busy silence, interspersed with the occasional techy discussion or general banter. &lt;br /&gt;&lt;br /&gt;I was also invited to &lt;a href="http://thewerks.org.uk/space"&gt;The Werks&lt;/a&gt;, also in Hove, so I went along a week or so later.  The Werks is just brilliant. It's a co-working office, where people turn up and work. (Generally it seems to be people like me who work with laptops, rather than people who work with pneumatic drills.)  I turned up quite early, and I was the only one there, so I just plugged my laptop in, connected to the wi-fi and got to work. Before long, a couple more people turned up, some who I knew from various Brighton geek events, and some strangers. We all sat round the same table, busying away, with the occasional chat, and sharing advice when appropriate.  Again, a really productive environment, as it felt like being at work, as opposed to being at home.  I've been back once since, and it was just as good.&lt;br /&gt;&lt;br /&gt;There are a few different ways of doing it, which are &lt;a href="http://thewerks.org.uk/space/coworking-space"&gt;priced accordingly&lt;/a&gt;.  Occasional use (couple of times a month) is free (with contributions welcome), 2-3 days a week costs &amp;pound;60p/m, which seems very reasonable. So let's say that's 12 days a month, that makes it a fiver per day. An excellent alternative to renting an office.  It's possible to rent a fixed desk and move in too, so there's a good mix of people there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7937700-9098430496013735016?l=harriyott.com%2Findex.aspx'/&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KSqFNVvbTQWJZrOGHL3UJJSjQBw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KSqFNVvbTQWJZrOGHL3UJJSjQBw/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/KSqFNVvbTQWJZrOGHL3UJJSjQBw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KSqFNVvbTQWJZrOGHL3UJJSjQBw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=RujJrgnY"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?a=uZuJtTZx"&gt;&lt;img src="http://feeds.feedburner.com/~f/harriyott/simonssoftwarestuff?d=2843" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/harriyott/simonssoftwarestuff/~4/JQD7vKtqGrc" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://harriyott.com/2008/04/for-last-3-months-or-so-ive-been.aspx</feedburner:origLink></item></channel></rss>
