<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.dantup.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"> <id>tag:blog.dantup.com,2009:/</id> <updated>2013-04-22T07:24:00Z</updated> <title type="text">Danny Tuppeny / DanTup</title> <subtitle type="text">Adventures in programming: C#, ASP.NET MVC, Razor, PowerShell, XNA, Google App Engine, Objective-C and lots more!</subtitle>  <link rel="alternate" type="text/html" href="http://blog.dantup.com/" /> <author> <name>Danny Tuppeny</name> <uri>http://blog.dantup.com/</uri> </author> <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.dantup.com/DanTup" /><feedburner:info uri="dantup" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry> <id>tag:blog.dantup.com,2013-04-22:/2013/04/powershell-function-to-launch-kiln-bitbucket-github-google-code-etc-for-current-repo-from-command-line</id> <published>2013-04-22T07:24:00Z</published> <updated>2013-04-22T07:24:00Z</updated> <category term="Bitbucket" /> <category term="Google Code" /> <category term="Opensource" /> <category term="Powershell" /> <category term="Kiln" /> <title type="text">PowerShell function to launch Kiln/BitBucket/Google Code/etc. for current Mercurial repo from command line</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;A small, but useful, PowerShell function that I have in my PowerShell profile that reads the default repo path from .hg\hgrc and launches it in the default browser. This means after I've done &lt;code&gt;hg push&lt;/code&gt; I can just ype &lt;code&gt;kiln&lt;/code&gt; to quickly get to the repo page to raise code reviews, etc.&lt;/p&gt;

&lt;script src="https://gist.github.com/DanTup/5433001.js"&gt;&lt;/script&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2013/04/powershell-function-to-launch-kiln-bitbucket-github-google-code-etc-for-current-repo-from-command-line"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/cpvTK0fi3io" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/cpvTK0fi3io/powershell-function-to-launch-kiln-bitbucket-github-google-code-etc-for-current-repo-from-command-line" title="PowerShell function to launch Kiln/BitBucket/Google Code/etc. for current Mercurial repo from command line" /> <feedburner:origLink>http://blog.dantup.com/2013/04/powershell-function-to-launch-kiln-bitbucket-github-google-code-etc-for-current-repo-from-command-line</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2012-10-13:/2012/10/thoughts-on-typescript-dart-and-the-future-of-browser-based-coding</id> <published>2012-10-13T15:20:00Z</published> <updated>2012-10-13T15:20:00Z</updated> <category term=".NET" /> <category term="Google Dart" /> <category term="TypeScript" /> <category term="Opensource" /> <category term="JavaScript" /> <title type="text">Thoughts on TypeScript, Dart, and the future of browser-based coding</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Had &lt;a href="http://twitter.theinfo.org/256885747091656704"&gt;a bit of a discussion&lt;/a&gt; on Twitter with &lt;a href="https://twitter.com/kdarty"&gt;Kevin Darty&lt;/a&gt; about TypeScript. It started off with this tweet:&lt;/p&gt;

&lt;blockquote class="twitter-tweet"&gt;
	&lt;p&gt;Please RT if you actually know JavaScript and don't need a crutch like CoffeeScript, Dart or TypeScript.&lt;/p&gt;
	&amp;mdash; Kevin Darty (&lt;a href="https://twitter.com/kdarty"&gt;@kdarty&lt;/a&gt;) &lt;a href="https://twitter.com/kdarty/status/256885747091656704" data-datetime="2012-10-12T22:35:09+00:00"&gt;October 12, 2012&lt;/a&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm still a bit puzzled by all the hate for TypeScript. There seem to be a lot of NaySayers, but I've still yet to see a single example of a codebase that couldn't benefit from TypeScript. Since it's a superset of JS, you don't have to do anything to start using it except rename your .js files to .ts, and then you can add TypeScript only where you think it will add value.&lt;/p&gt;

&lt;p&gt;It's like having a magic switch that helps you find errors and refactor. How can it possibly be a bad thing?&lt;/p&gt;

&lt;p&gt;I don't buy the "it'll stop people learning proper JavaScript" argument. I don't know a huge amount of Assembly or IL. Sure, there might be situations were knowing more of them would be useful, but is it really worth the time investment when I could instead be improving my C#/other skills that I use &lt;em&gt;every single day&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Does it matter if I can't type javascript without looking it up to hook up subclass prototypes in JavaScript if TypeScript can do it for me? No. Does it help if I understand the generated code? Sure. Is it a requirement? No. All that matters is I understand how it behaves and any limitations of it. The same way I don't need to understand 100% of the IL generated when I write C#.&lt;/p&gt;

&lt;p&gt;I'd actually argue that TypeScript will actually &lt;em&gt;improve&lt;/em&gt; most peoples ability to write this kind of JavaScript. Think of the workflow... Chances are, you'll store both .ts and .js files in source control (that's how I'd probably do it, so code reviews can see the actual code going to the browser, and we don't have to worry about devs seeing different code to what's being deployed by the CI server). That means when you're viewing your diffs prior to committing, you'll review both your changes and the generated changes from TypeScript. I'd say this will &lt;em&gt;teach&lt;/em&gt; you how these things work in JS. You'll become more aware of how sub-classes work, the behaviour of "this" in event handlers, etc.&lt;/p&gt;

&lt;p&gt;I'm still generally curious; I'd love to see someone present a codebase that can't benefit from TypeScript and prove me wrong. I genuinely can't think of how anyone could write JavaScript to run in the browser that wouldn't benefit from type-checking (whether it by their own objects, or access to the DOM) in any way. If you're a NaySayer, then take this challenge! :-)&lt;/p&gt;

&lt;p&gt;There was also some discussion about Dart following on from +Kevin Darty's tweet, like:&lt;/p&gt;

&lt;blockquote class="twitter-tweet" data-in-reply-to="256947591667924992"&gt;
	&lt;p&gt;@&lt;a href="https://twitter.com/cdhowie"&gt;cdhowie&lt;/a&gt; what about how MSFT Devs everywhere ripped Google a new one for Dart but are embracing TypeScript with open arms. Hypocritical?&lt;/p&gt;
	&amp;mdash; Kevin Darty (&lt;a href="https://twitter.com/kdarty"&gt;@kdarty&lt;/a&gt;) &lt;a href="https://twitter.com/kdarty/status/256948413537587200" data-datetime="2012-10-13T02:44:10+00:00"&gt;October 13, 2012&lt;/a&gt;
&lt;/blockquote&gt;

&lt;p&gt;I can't speak for all MS devs, but I thought it worth sharing my opinion... I certainly LOL'd at the Hell World JavaScript created from Dart, but that was kinda funny (moreso with recent talk of Tree Shaking being a huge advantage of Dart). In general, however, I think Dart is a good idea, but possibly this effort could be better spent doing things slightly differently (more on that later).&lt;/p&gt;

&lt;p&gt;I think Dart is a &lt;em&gt;very&lt;/em&gt; ambitious project. I really hope it catches on and we see support in all browsers. However, I just can't see it happening :O( Dart and TypeScript solve some of the same issues but coming from the exact opposite sides.&lt;/p&gt;

&lt;p&gt;TypeScript is designed to be compatible with JavaScript so you can use all of the existing JS libraries out there, and slowly/progressively add TypeScript to your code.&lt;/p&gt;

&lt;p&gt;Dart goes further, and also provides a runtime, which brings huge performance benefits (where it can be executed natively). It compiles to JavaScript for compatibility (a necessity to ever gain traction). It tries to do so much more than TypeScript, however the trade-off is that it doesn't integrate with existing JS libraries.&lt;/p&gt;

&lt;p&gt;
	In an ideal world, the decision to use something like TypeScript vs Dart should be based on things like:
&lt;ol&gt;
	&lt;li&gt;Whether a Dart runtime is available to the majority of your users&lt;/li&gt;
	&lt;li&gt;Whether you need to interact with a lot of existing JS libraries&lt;/li&gt;
	&lt;li&gt;Whether you need to interact with a lot of your own JS (legacy projects)&lt;/li&gt;
	&lt;li&gt;Whether you can invest the time required to learn Dart (there's a lot less to learn with TypeScript)&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
	However, I can't help but think that the decision is actually going to be based on one thing only:
	&lt;ol&gt;
		&lt;li&gt;Are you using Visual Studio or an Open Source IDE?&lt;/li&gt;
	&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;I just can't see TypeScript support ever being as good in non-VS IDEs. Nor can I see Dart support in VS ever being as good as it will elsewhere.&lt;/p&gt;

&lt;p&gt;I actually think we could do much better than Dart or TypeScript. &lt;a href="http://www.hanselman.com/"&gt;Scott Hanselman&lt;/a&gt; &lt;a href="http://www.hanselman.com/blog/JavaScriptIsAssemblyLanguageForTheWebSematicMarkupIsDeadCleanVsMachinecodedHTML.aspx"&gt;described JavaScript as the "Assembly Language for the Web"&lt;/a&gt;. I think this is the first problem to address. We need something that runs in all browsers that addresses the issues with JavaScript, but it should be more like an intermediate language that other languages/tools can compile to (like we currently do with JavaScript, but less shit). That way, the choice of language can be decoupled from the browser support. If you want to write C#, VB.NET, Dart, Java, etc., it shouldn't matter. As long as they can all be compiled to a standard "IL", they should be deployable to a browser.&lt;/p&gt;

&lt;p&gt;I don't know whether any of the existing technologies are good candidates for this (could we compile C#/Java/etc. into Dart? NaCl?), but I think it would be the best solution for all. People could use the IDE and languages they feel most comfortable/productive with.&lt;/p&gt;

&lt;p&gt;In the meantime, compiling to JavaScript is the only thing we can do for compatibility. But in the background, I wish the standards bodies and browser vendors could get their heads together and agree on a new way of executing code in the browser in a way that they can all offer the experiences they wish to their devs. It doesn't matter whether it's based on something existing or new; the important thing is that it's not tied to the web development language and that the browser vendors and the companies with huge influences in development get behind it. &lt;strong&gt;If we can develop desktop apps and server-side code in the language of our choice; why can't we do the same for the browser?&lt;/strong&gt; This would allow huge amounts of code reuse across our applications that we don't currently get.&lt;/p&gt;

&lt;p&gt;Chrome already has NaCl, and will presumably have native Dart support soon. I wouldn't be surprised if IE ended up with native TypeScript support. This is going backwards, not forwards.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2012/10/thoughts-on-typescript-dart-and-the-future-of-browser-based-coding"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/Anlh_C_gEF8" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/Anlh_C_gEF8/thoughts-on-typescript-dart-and-the-future-of-browser-based-coding" title="Thoughts on TypeScript, Dart, and the future of browser-based coding" /> <feedburner:origLink>http://blog.dantup.com/2012/10/thoughts-on-typescript-dart-and-the-future-of-browser-based-coding</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2012-10-11:/2012/10/fixing-adb-device-not-found-with-nexus-7-in-recovery-mode</id> <published>2012-10-11T20:00:00Z</published> <updated>2012-10-11T20:00:00Z</updated> <category term="Google" /> <category term="Mobile Phones" /> <category term="Android" /> <category term="Tablets" /> <title type="text">Fixing adb "Device not found" with Nexus 7/Android devices in Recovery Mode</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I'm a huge fan of the Nexus 7, but one of the things that annoyed me from day one was the lack of landscape support on the homescreen. I almost always use the tablet in landscape mode, so when switching to an app I didn't already have in the open/recent apps list, I would have to hit the Home button; which flipped everything around temporarily. There was already a user-set orientation lock, and we knew Android could handle it (from other devices, and those with rooted devices changing build properties), so it always seemed like a really random restriction.&lt;/p&gt;

&lt;p&gt;This was announced as fixed in Android 4.1.2, which began rolling out only a few days ago. As of this evening, my device still showed no update, so after finding &lt;a href="http://www.tapscape.com/want-to-upgrade-your-nexus-7-to-android-jelly-bean-4-1-2-heres-how/"&gt;some instructions&lt;/a&gt;, I decided to load the update myself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;These instructions do &lt;em&gt;*not*&lt;/em&gt; require you to root your device or unlock the bootloader&lt;/strong&gt;. If your device is unlocked/rooted, I have no idea what affect that might have on this process. If you're unsure about this, don't do it. I accept no liability if you mess things up. I have only limited knowledge of Android! The steps seemed fairly straight forward, which is the only reason I was attempting them!&lt;/p&gt;

&lt;p&gt;My first problem was that I was unable to boot into recovery mode using the instructions. When I selected Recovery Mode from the boot menu, my device just booted normally. I didn't get the Android with the red exclamation mark. This was easily fixed by using adb (installed as part of the Android SDK) and running:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;adb reboot recovery&lt;/pre&gt;

&lt;p&gt;This rebooted the device to the screen showing an Android with a red exclamation mark, and pressing Power + Up allowed me to select the "Update from ADB" option.&lt;/p&gt;

&lt;p&gt;The problem was, once in this mode, Windows failed to recognise the decide/load the drivers that were previously loaded (before the reboot), which meant adb would no longer be able to connect the device:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;adb: device not found&lt;/pre&gt;

&lt;p&gt;After a lot of searching online, I figured out that the problem was that the Hardware ID of my Nexus 7 when in recovery mode was not listed in "android_winusb.inf" file from the &lt;a href="http://developer.android.com/sdk/win-usb.html"&gt;Google Android Windows USB Drivers&lt;/a&gt;. The ID I saw in device manager against the Nexus was &lt;em&gt;USB\VID_18D1&amp;PID_D001&lt;/em&gt;, which didn't turn a lot up in Google!&lt;/p&gt;

&lt;p&gt;I decided to try adding this to the inf file manually (&lt;em&gt;C:\Program Files (x86)\Android\android-sdk\extras\google\usb_driver\android_winusb.inf&lt;/em&gt;). As I'm running on a 64bit machine, I added the following to the &lt;em&gt;[Google.NTamd64]&lt;/em&gt; section (note: this applies to Intel 64 bit machines, not just AMDs!). If you're using 32bit, you'd want to add it to the &lt;em&gt;[Google.NTx86]&lt;/em&gt; section:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
[Google.NTamd64]

; !-- snip other devices... --!

; Google Nexus 7
; !-- snip existing device IDs --!
; This is the HardwareID shown in Device Manager for the "Nexus"
;  device when in Recovery mode
%CompositeAdbInterface%     = USB_Install, USB\VID_18D1&amp;PID_D001
&lt;/pre&gt;

&lt;p&gt;After making this change, I uninstalled the device drivers, then reinstalled them using this inf file. I once again rebooted into Recovery mode, and this time, Windows correctly displayed the device as "Android ADB Interface", and I was then able to sideload the Android 4.1.2 update (&lt;a href="http://android.clients.google.com/packages/ota/google_nakasi/03a4eaf95f73.signed-nakasi-JZO54K-from-JRO03D.03a4eaf9.zip"&gt;downloaded directly from Google&lt;/a&gt;) by typing:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
adb sideload 03a4eaf95f73.signed-nakasi-JZO54K-from-JRO03D.03a4eaf9.zip
&lt;/pre&gt;

&lt;p&gt;ADB transmitted the file to the Nexus 7, then the Nexus spat out the progress as it verified the image and updated the device. A reboot later, and my Nexus 7 was running Android 4.1.2!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2012/10/fixing-adb-device-not-found-with-nexus-7-in-recovery-mode"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/FjMCcngmZh0" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/FjMCcngmZh0/fixing-adb-device-not-found-with-nexus-7-in-recovery-mode" title="Fixing adb &quot;Device not found&quot; with Nexus 7/Android devices in Recovery Mode" /> <feedburner:origLink>http://blog.dantup.com/2012/10/fixing-adb-device-not-found-with-nexus-7-in-recovery-mode</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2012-08-18:/2012/08/frustrations-with-git-on-windows-and-codeplex-suggestions-to-the-git-devs</id> <published>2012-08-18T13:34:00Z</published> <updated>2012-08-18T13:34:00Z</updated> <category term="Bitbucket" /> <category term="Misc" /> <category term="Opensource" /> <title type="text">Frustrations with Git on Windows (and Codeplex) / Suggestions to the Git Devs</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;During some ranting about Git on Twitter, &lt;a href="https://twitter.com/shiftkey"&gt;Brendan Forster&lt;/a&gt; suggested I blog the things I would change. I don't have time to write a lot, but I thought I could spam out a list of things based on my first 30 minutes with Git on Windows.&lt;/p&gt;

&lt;p&gt;Note: I've just installed GitHub for Windows as a result of these frustrations. I'm not usually a big GUI fan (I use Mercurial from the CLI always), but initial impressions are good. But still, I'm blogging about the CLI for now...&lt;/p&gt;

&lt;p&gt;I grabbed a "Portable" version of Git, as I didn't want to soil my machine with something I knew was going to frustrate me. It contained a "git-cmd.bat" file that seemed to get me to a command prompt with git in the path.&lt;/p&gt;

&lt;h2&gt;Cloning&lt;/h2&gt;
&lt;p&gt;This one should be easy, right? Even with no knowledge of Git, I knew I could do &lt;code&gt;git clone url&lt;/code&gt;. Well, turns out I couldn't do what I was used to doing with Mercurial (though this may be Codeplex's fault). I copy/pasted the URL to my fork of xUnit from the address bar, and hit enter. I got an error: &lt;code&gt;fatal: http://(url) not found: did you run git update-server-info on the server?&lt;/code&gt;. WTF? Is this a Codeplex issue?&lt;/p&gt;

&lt;p&gt;No, it wasn't. It was a user issue. The clone url for a repository on Codeplex is not the same as the homepage of the project. The last part of the message is rather misleading. I've no idea what update-server-info is, but I'm going to bet that more than 90% of the time that someone encounters this error, they just pasted the wrong url (or typo'd). The text should suggest this, rather than some server-side command that is probably rarely correct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: Re-word this message to be useful for the majority of cases.&lt;/p&gt;

&lt;h2&gt;Repository Status&lt;/h2&gt;

&lt;p&gt;In Mercurial, I type &lt;code&gt;hg st&lt;/code&gt; to see repository status. It works, because I've typed enough characters that Mercurial knows that I must mean status. I tried &lt;code&gt;git st&lt;/code&gt; and was greeted with a big list of commands that I "might have" meant, including even &lt;code&gt;reset&lt;/code&gt;! Eh?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: Steal Mercurials behaviour, and save keystrokes.&lt;/p&gt;

&lt;p&gt;I did a quick count on how many keystrokes it took me to do the same thing (commit an edited file) in Mercurial and Git. It was 18 + the message in Mercurial, and 40 + the message in Git. WTF?&lt;/p&gt;

&lt;h2&gt;Repository Diff&lt;/h2&gt;

&lt;p&gt;In Mercurial, I type &lt;code&gt;hg diff&lt;/code&gt; to see all of the outstanding changes that will be committed if I call &lt;code&gt;commit&lt;/code&gt;. I did the same in Git and ended up stuck in some crazy mode that let me page up/page down, but apparently not exit. I tried Ctrl+C, Break, Escape, Enter and tons of other keys. I had no idea how to quit. After some Googling, I discovered it was &lt;em&gt;:q&lt;/em&gt;. Classy. Just like all those other Windows applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: Spit the diff out directly to the console like Mercurial (especially if it's so short it wouldn't fill the buffer). We already have the ability to scroll!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: Don't use shortcut keys that aren't familiar to Windows users on Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: If you put the user into a mode that they need to "exit" to continue doing anything, &lt;strong&gt;tell them&lt;/strong&gt;. Show something on screen that says "Press :q to exit"!&lt;/p&gt;

&lt;h2&gt;Commit&lt;/h2&gt;

&lt;p&gt;Ok, so I've seen my change. It all looks good. I need to commit it. Diff has already shown me the changes, so it knows what I want. &lt;code&gt;git commit&lt;/code&gt;, right? Wrong! This command told me I hadn't added any changes to the staging area. What? Diff just showed me them! Turns out, I have to do "git add" first, so it knows what I want to commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: Either don't show unstaged(?) changes in diff, just show a message saying there are some, or highlight the unstaged changes in some way.&lt;/p&gt;

&lt;p&gt;(I'd almost go as far as ditching this staging crap, but I don't know enough Git to really understand the implications of that)&lt;/p&gt;

&lt;h2&gt;Commit (part 2)&lt;/h2&gt;

&lt;p&gt;With my changes staged, I can finally commit (&lt;strong&gt;hurray! so far this has taken longer than the 10-line-change I actually made!&lt;/strong&gt;). So I type &lt;code&gt;git commit&lt;/code&gt;. With Mercurial, this would fire up Notepad and let me type my commit message...&lt;/p&gt;

&lt;p&gt;With Git, this &lt;strong&gt;launched VIM&lt;/strong&gt;. That's right, VIM. You know, that standard Windows editor that &lt;em&gt;everybody&lt;/em&gt; is familiar with? No, exactly. I started typing my commit message and my cursor starting moving all over the place and doing crazy things; I'd clearly mashed my way into executing commands or something... With that fixed, it was time to save and quit. I probably don't need to tell you how this works in Notepad! I tried Ctrl+S, Escape, Enter, Ctrl+C, and all sorts of other stuff. Again, I had to resort to Google. I wanted &lt;code&gt;&amp;lt;ESCAPE&amp;gt;qw&lt;/code&gt;. Of course. Just like Microsoft Word; I should've known that! :-/&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: Use Notepad by default on Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: Don't use shortcut keys that aren't familiar to Windows users on Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: If you put the user into a mode that they need to "exit" to continue doing anything, &lt;strong&gt;tell them&lt;/strong&gt;. Show something on screen that says "Press &amp;lt;ESCAPE&amp;gt;qw to exit"!&lt;/p&gt;

&lt;h2&gt;Pushing&lt;/h2&gt;

&lt;p&gt;With my change (finally) committed, it was time to push to Codeplex. This one isn't really Git's fault, but I spent 5 minutes trying to figure out why I got Authentication Failed messages when I entered my Microsoft Account details. Turns out, I have a Codeplex username/password from years ago which is "linked" to my Microsoft Account, and despite logging in to Codeplex using my Microsoft Account, this doesn't work with Git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggestion&lt;/strong&gt;: Let users push to Git using the same details they login to the site with! Or at a minimum, change the text that says "&lt;em&gt;same as your website password&lt;/em&gt;" to make it more clear this is a Codeplex password, and not the one you probably used to login to the website!&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;My conclusion after all of this, is that Git is a fuckup on Windows. It's not friendly to Windows users, and it makes things way more complicated than they should be. If Mercurial had been half as complicated as this, I'd have never moved to (and advocated) DVCS.&lt;/p&gt;

&lt;p&gt;I don't buy the "it's more complicated because it's more powerful" bullshit. What I was doing today should've been incredibly simple; and in Mercurial, it would have been. Mercurial is also cross-platform, so it's not like this terrible Windows support can be blamed on that.&lt;/p&gt;

&lt;p&gt;I'm genuinely surprised that Git has become so popular on Windows (and at Microsoft) when it's such a mess. I can only assume this is down to GitHub doing a significantly better job than sites like BitBucket!&lt;/p&gt;

&lt;p&gt;Luckily, it looks like GitHub for Windows might fill the gap between the totally-ridiculously-complicated-CLI and the complicated-and-badly-performing-explorer-humping Tortoise applications. No doubt I'll be tweeting more about that soon ;-)&lt;/p&gt;

&lt;p&gt;I'm sure the Git fanboys/Linux Zealots will disagree with all of this and tell me I'm wrong. And that is why Git fails so badly on Windows. The zealots care more about trying to force their way on users rather than trying to build something that is easy to use and fits in with what different people are familiar with.&lt;/p&gt;

&lt;p&gt;Git devs: &lt;a href="http://en.wiktionary.org/wiki/when_in_Rome,_do_as_the_Romans_do"&gt;When in Rome, do as the Romans do.&lt;/a&gt;&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2012/08/frustrations-with-git-on-windows-and-codeplex-suggestions-to-the-git-devs"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/ayZhu1f83Ms" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/ayZhu1f83Ms/frustrations-with-git-on-windows-and-codeplex-suggestions-to-the-git-devs" title="Frustrations with Git on Windows (and Codeplex) / Suggestions to the Git Devs" /> <feedburner:origLink>http://blog.dantup.com/2012/08/frustrations-with-git-on-windows-and-codeplex-suggestions-to-the-git-devs</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2012-05-06:/2012/05/free-dependency-graph-generation-using-powershell-and-yuml</id> <published>2012-05-06T16:45:00Z</published> <updated>2012-05-06T16:45:00Z</updated> <category term=".NET" /> <category term="Misc" /> <category term="Opensource" /> <category term="Powershell" /> <title type="text">Free dependency graph generation using PowerShell and yUML</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I don't like the idea of paying for (or installing) a tool to just show me some simple relationships between my Visual Studio projects, but it's something that is pretty useful when trying to tidy up a huge legacy codebase.&lt;/p&gt;

&lt;p&gt;I whipped together a quick PowerShell script that spits out project references in a format ready for pasting into &lt;a href="http://yuml.me"&gt;yuml.me&lt;/a&gt; to draw a chart:&lt;/p&gt;

&lt;script src="https://gist.github.com/2623209.js"&gt;&lt;/script&gt;

&lt;p&gt;The output will look something like this:&lt;/p&gt;

&lt;img src="http://yuml.me/4f30e632" /&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2012/05/free-dependency-graph-generation-using-powershell-and-yuml"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/PgEEtv4yymg" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/PgEEtv4yymg/free-dependency-graph-generation-using-powershell-and-yuml" title="Free dependency graph generation using PowerShell and yUML" /> <feedburner:origLink>http://blog.dantup.com/2012/05/free-dependency-graph-generation-using-powershell-and-yuml</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2012-02-27:/2012/02/enabling-cron-on-a-western-digital-my-book-world-edition</id> <published>2012-02-27T21:31:00Z</published> <updated>2012-02-27T21:31:00Z</updated> <category term="Backup" /> <category term="Misc" /> <title type="text">Enabling Cron on a Western Digital My Book World Edition</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Earlier today, &lt;a href="https://twitter.com/#!/richymtfc21/status/174218295434690561"&gt;a tweet from a colleague&lt;/a&gt; got me wondering whether I could set up cron on my NAS drive to give me the ability to run scheduled tasks. I don't leave any machines on at home, but my NAS drive is on 24/7, so it could be useful - especially as a backup system if Google open an API to Takeout!&lt;/p&gt;

&lt;p&gt;I managed to get it working with some help from &lt;a href="http://mybookworld.wikidot.com/cron"&gt;this post&lt;/a&gt;, so I thought I blog the details here (it turned out to be simpler than that post suggested) should it be useful to you (or to me, should I ever need to do this again).&lt;/p&gt;

&lt;p&gt;There was no requirement to do anything crazy to make this work. I didn't install anything on the NAS, everything was there - even the SSH access is enabled via the web app!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to the My Book admin web app.&lt;/li&gt;
&lt;li&gt;Go to the Advanced section.&lt;/li&gt;
&lt;li&gt;Tick to enable SSH access at the top of the page (note: you may need to update your firmware to get this option).&lt;/li&gt;
&lt;li&gt;SSH into to the IP address of your mybook, using the username "root" and the password displayed on the page where you enabled SSH access.&lt;/li&gt;
&lt;li&gt;Create a folder to store our crontabs. Since /var/spool is mapped to /tmp it'll be wiped at rebooted, so we need to keep our own.&lt;pre class="prettyprint"&gt;mkdir /etc/crontabs&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Create a job that touches /tmp/crontab.test every minute (for testing).&lt;pre class="prettyprint"&gt;echo "* * * * * touch /tmp/crontab.test" &gt; /etc/crontabs/root&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Create an entry in init.d to start crond using our /etc/crontabs folder.&lt;pre class="prettyprint"&gt;echo "/usr/sbin/crond -c /etc/crontabs" &gt; /etc/init.d/S99crond&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Set permissions for execution.&lt;pre class="prettyprint"&gt;chmod 755 /etc/init.d/S99crond&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That was all there was to it. I ran "reboot" and let the NAS reboot, then confirmed that /tmp/crontab.test was being touched every minute (with "ls /tmp/crontab.test -l").&lt;/p&gt;

&lt;p&gt;Note: You should disable SSH access when you're done, or change the password. Otherwise, anybody on your network may be able to gain root access to your NAS!&lt;/p&gt;

&lt;p&gt;If you make changes, you'll need to restart crond. You can do this with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;pre class="prettyprint"&gt;killall crond&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;pre class="prettyprint"&gt;/usr/sbin/crond -c /etc/crontabs&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Next up, I'd like to find a way to edit the cron scripts from my Chromebook via something like Cloud9IDE rather than SSH/Vi ;(&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2012/02/enabling-cron-on-a-western-digital-my-book-world-edition"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/qiTWmlLsjhw" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/qiTWmlLsjhw/enabling-cron-on-a-western-digital-my-book-world-edition" title="Enabling Cron on a Western Digital My Book World Edition" /> <feedburner:origLink>http://blog.dantup.com/2012/02/enabling-cron-on-a-western-digital-my-book-world-edition</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2012-01-07:/2012/01/google-chrome-nativeclient-the-new-activex-is-it-good-for-the-web</id> <published>2012-01-07T11:48:00Z</published> <updated>2012-01-07T11:48:00Z</updated> <category term="Deployment" /> <category term="Games" /> <category term="Google Chromebook" /> <category term="Misc" /> <title type="text">Google Chrome NativeClient - The New ActiveX? Is it Good for the Web?</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I like the possibilities that NativeClient in Chrome will open up, but I can't help think that we're going backwards... Do you remember when we used to see "Best viewed in Internet Explorer" and other crazy stuff written on websites?&lt;/p&gt;

&lt;p&gt;Surely with Chrome/NaCl we're just going to end up with "This game/app only works in Google Chrome with NativeClient". This doesn't seem like a good thing for anyone (devs or consumers). We were just starting to get web standards right, with cross-platform coding easier than it's ever been.&lt;/p&gt;

&lt;p&gt;I think it's highly unlikely that other browser makers will add NaCl. Certainly not Microsoft - it just makes Chrome, Chromebooks, ChromeOS more attractive to their Windows customers. I don't think they'll want to help that cause!&lt;/p&gt;

&lt;p&gt;I love the Chromebook because it's designed for the web. It's apps are cross-browser/platform by design. It's not like Windows, Linux, iOS, Android, etc., where all the "default" apps are locked to the OS. My biggest problem with the recent take off in mobile computing is that apps are tied to the OS. This just isn't right. I should be able to pick an OS based on my preferences, and not lose all my apps, or have a restricted choice of what I can run. ChromeOS will only run things written in an open standard that work on every other common consumer OS. Do we really want to destroy this?&lt;/p&gt;

&lt;p&gt;Don't get me wrong, I think the idea of being able to run near native code over the web is an *excellent* idea. Web-based apps solve so many problems with deployment, updates, security, etc., and being able to run performant apps in the same way is great. However, we need something open for the web, not another thing Google have gone away and built on their own and try to force upon others (just look at Wave, Dart, etc.). If they intend for NaCl to be in all browsers, then it needs to be developed openly with input from all parties, not just sprung on the world (note: I don't know if this is their intention).&lt;/p&gt;

&lt;p&gt;Is NaCl just going to be the new ActiveX?&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2012/01/google-chrome-nativeclient-the-new-activex-is-it-good-for-the-web"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/0pf-je6j--o" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/0pf-je6j--o/google-chrome-nativeclient-the-new-activex-is-it-good-for-the-web" title="Google Chrome NativeClient - The New ActiveX? Is it Good for the Web?" /> <feedburner:origLink>http://blog.dantup.com/2012/01/google-chrome-nativeclient-the-new-activex-is-it-good-for-the-web</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-12-17:/2011/12/google-chromebook-first-weeks-impressions</id> <published>2011-12-17T22:58:00Z</published> <updated>2011-12-17T22:58:00Z</updated> <category term="Google Chromebook" /> <title type="text">Google Chromebook - First Week's Impressions</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I've had my Chromebook for a week now, so I thought it was worth posting my thoughts on it so far. I have the Samsung Series 5 WiFi model and paid £299 for it in the Birmingham "Black" PC World/Currys store. I'm sat here on the Sofa with it, writing this post :-)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="#s_reason"&gt;Reason for Purchase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_build"&gt;Build Quality&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_battery"&gt;Battery Life&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_flash"&gt;Adobe Flash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_profile"&gt;Profile Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_sync"&gt;Google Chrome Sync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_performance"&gt;Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_music"&gt;Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_notifications"&gt;Notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_bugs"&gt;Bugs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#s_conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="s_reason"&gt;Reason for Purchase&lt;/h2&gt;

&lt;p&gt;You may wonder why I bought a Chromebook when I already have a PC and an iPad (and tablets are apparently killing the Netbook industry). There are a few reasons... I'm a nerd, so I have to have new toys. The iPad is great for a lot of stuff (mostly &lt;em&gt;consuming&lt;/em&gt;), but not so great if you want to do a lot of typing. For example, one of the tasks I have since moving, is logging in to a &lt;em&gt;ton&lt;/em&gt; of websites and updating my address. The iPad just doesn't cut it. Finally, since moving house, my PC is now upstairs. In the flat it was in the lounge, so when I was casually surfing the web, reading email, etc., I was in the same room as my wife, and it wasn't a huge hassle. Since moving, I found myself avoiding doing things that involved going "all the way" upstairs, turning the PC on, waiting for Windows to boot, logging on, waiting for Windows to finish logging on, etc..&lt;/p&gt;

&lt;p&gt;So, why the Chromebook and not another Netbook that does more for the same price? Well, I already have a PC upstairs, and it's unlikely that will change, because it's unlikely I'll find a mobile device that'll run Visual Studio + SQL Server well for a decent budget, and I often play games. So given the limited things I need from the device, I was attracted to the decent battery life and 8 second startup time of the Chromebook over another Windows machine.&lt;/p&gt;

&lt;h2 id="s_build"&gt;Build Quality&lt;/h2&gt;

&lt;p&gt;The build quality of the Samsung is pretty good. It does feel a little cheap/plastic, but it doesn't feel like it's going to break/fall apart. It's solid enough that I'd feel more comfortable carrying it around without a case than I would my iPad without a case (though I wouldn't - I have cases for both!).&lt;/p&gt;

&lt;h2 id="s_battery"&gt;Battery Life&lt;/h2&gt;

&lt;p&gt;So far, the battery life has been excellent. Google claim around 8 hours battery life, though I think it's lasting a little better than that for me (it currently reports 1:20 remaining, on 12%, which would suggest around 11 hours). I've only charged it twice - once on the Sunday I got it, and then again Wednesday evening. With around an hour left, that's about 3 days per charge, with me using it around 2.5 - 3 hours per day.&lt;/p&gt;

&lt;p&gt;This is far better than the laptops I've had, but not as great as the iPad. I haven't had any netbooks to compare it with, but I suspect it's in the same region as similar spec'd devices.&lt;p&gt;

&lt;h2 id="s_flash"&gt;Adobe Flash!&lt;/h2&gt;

&lt;p&gt;I've had my iPad around 18 months - since it first launched (I'm still using an iPad 1). I never really had any issues with a lack of Flash because the main sites I used Flash on (like YouTube) had alternatives that worked in the browser anyway. Now I have Flash on the Chromebook (and realise why Google built it in to Chrome!), I've been able to do a little more, however with Flash usage rapidly dropping, I don't think Flash support is going to matter much as time goes on.&lt;/p&gt;

&lt;h2 id="s_profile"&gt;Profile Support&lt;/h2&gt;

&lt;p&gt;Google really nailed the login/profile support on the Chromebook. One of the things that annoys me most about the iPad, is that it's a "one person" device. I can't give it to my Wife and have her login so the email app shows her email, the homescreens show her apps, etc. Apple want you to have an iPad each. On the Chromebook you login as your Google account and everything is yours. Logoff, give it to someone else, they login, and it's theirs. If you enable Sync, you even get all your bookmarks, saved passwords etc. from your other Chrome instances. This works really well, and there's even a guest mode to let people use it temporarily without anything persisting.&lt;/p&gt;

&lt;h2 id="s_sync"&gt;Google Chrome Sync&lt;/h2&gt;

&lt;p&gt;This isn't really specific to the Chromebook, but I didn't really use it until now so I didn't realise how useful it was. I turned on Chrome Sync on my PC then when I logged into the Chromebook as my Google account, my bookmarks bar was there, my extensions where there, and even all my saved passwords where there. If I threw this Chromebook in a river and picked up a new one, I'd have the same experience when I logged on.&lt;/p&gt;

&lt;p&gt;This is probably the thing that hit me the most. Years ago, people said Google was working on its own OS. We all laughed. No way can you take on Windows starting from nothing, and certainly not with something "web based", it's just not going to work. After using the Chromebook for just a week, I realise it's Google who should be laughing. The Chromebook is really ahead of its time. This is how things are going to be... When I upgrade Window, why do I have to reinstall all of my apps? Why do some of them need to run in "compatibility mode"? Hang on, why did I even have to upgrade Windows? And why did I have to pay for it? Why are my apps tied to my operating system anyway? If I'm on my Windows PC and I change to my Mac, why can't I just run the same things? To steal a quote... "This changes everything" ;)&lt;/p&gt;

&lt;p&gt;Sure, Windows isn't going away anytime soon. However; the Chromebook is already a very reasonable system for casual users, and the appeal is only going to grow over the coming years. Rather than Chrome OS taking on Windows, I really think Windows needs to take on Chrome OS. Google seem to have an incredible nack for taking existing things and rebuilding them from the ground up, better. It seems like one of those things where being the "first" puts you at a disadvantage, because your competitors were able to do things differently, not stuck with your old crap (*cough*BT copper cables *cough*crap UK internet).&lt;/p&gt;

&lt;h2 id="s_performance"&gt;Performance&lt;/h2&gt;

&lt;p&gt;Here's somewhere the Chromebook doesn't do so well. The processor is a dual-core Intel Atom N570 running at 1.66Ghz and there's an integrated Intel NM10 graphics chip. Throw in 2GB of RAM and I thought this would be plenty for a system that does nothing but web browsing. Sadly, this hasn't been the case, and when visiting pages full of Flash, Ads and JavaScript, the Chromebook feels a little underpowered compared to a desktop PC. That said, this doesn't really cause issues; it just doesn't feel as snappy as you may be used to :(&lt;/p&gt;

&lt;p&gt;I'm fairly sure we'll see higher-spec Chromebooks out before long, so that should make this less of an issue.&lt;/p&gt;

&lt;h2 id="s_music"&gt;Music&lt;/h2&gt;

&lt;p&gt;There doesn't seem to be many decent services I can use for listening to music on the Chromebook. No spotify app, no Google Music or Amazon Cloud Player in the UK, etc. :( The only service I managed to get working is Grooveshark, though it's a little slow and clunky on the Chromebook.&lt;/p&gt;

&lt;p&gt;There are also no hardware buttons for controlling music, like many PC keyboards have these days. This would've been a nice addition, especially if services like Google Music etc. had Chrome Extensions that could react to them (and, of course, worked in the UK!).&lt;/p&gt;

&lt;h2 id="s_notifications"&gt;Notifications&lt;/h3&gt;

&lt;p&gt;I'm not entirely sure what happens when the Chromebook goes into "sleep" mode, but with Google Talk behaving strangely (see Bugs section), I presume it shuts off the network. This means that unlike Push Notifications you can get on iOS and other mobile operating systems, there's no equivalent here. That means you can't have sounds play when someone tries to chat to you (or emails you) when the lid is down. This would be a great addition IMO.&lt;/p&gt;

&lt;h2 id="s_bugs"&gt;Bugs...&lt;/h2&gt;

&lt;p&gt;I haven't really had any major issues, but there have been a few little niggles that bug me...&lt;/p&gt;

&lt;p&gt;1. The Google Mail Checker extension is really intermittent. Sometimes it works, and some times it's just greyed out.&lt;/p&gt;

&lt;p&gt;2. The Google Talk extension behaves strangely when I "sleep" the Chromebook - when I resume, all the messages received while slept arrive in the wrong order (some even appear before messages I received before sleeping the Chroomebook!).&lt;/p&gt;

&lt;p&gt;3. Sometimes I have to sign in to Google services again (like Google+), even though it's supposed to "just work" because I signed into the Chromebook with the Google account already.&lt;/p&gt;

&lt;p&gt;4. Sometimes it takes hours for bookmarks to sync to Chrome on my PC (and sometimes they just never sync).&lt;/p&gt;

&lt;p&gt;5. I can't make Google Talk play sound notifications when someone sends me a message :(&lt;/p&gt;

&lt;p&gt;6. Mail notifications seem to only work when I have Mail open in a tab, even though Google Mail Checker is installed :(&lt;/p&gt;

&lt;h2 id="s_conclusion"&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;I'm getting far more use out of the Chromebook than I expected. Since getting it, I've only booted my PC for two things; 1. To turn on Chrome Sync, so I could get my bookmarks etc. onto the Chromebook; 2. To play games with my friends. I'm sat here on the Sofa writing this post, Chromebook on my knees, streaming free music from Grooveshark. It was originally only intended as a quick way to access the web when the iPad wouldn't cut it, but I actually pick it up over the iPad for a lot more - even using Google Reader on the web (press F for fullscreen mode!) instead of Flipboard, and taking it to work instead of the iPad!&lt;/p&gt;

&lt;p&gt;There is one thing that the Chromebook &lt;em&gt;hasn't&lt;/em&gt; yet replaced the iPad for, and that's Twitter. I don't think it's related to the hardware or OS differences between the iPad and Chromebook, but rather that I can't find any decent web clients that are anywhere near as good as Twitterrific on the iPad. If there were, I might stop using the iPad altogether! :/&lt;/p&gt;

&lt;p&gt;I think Chromebook has a bright future. Once you've been forced to live out of the cloud, you start to realise how handy it is. When I first booted my PC a few days ago, my backup script ran. It backs up many GB of data to my NAS. I immediately thought "WTF? Why do I need to do this?".&lt;/p&gt;

&lt;p&gt;It'll be interesting to see what the future holds. I think the operating system you'll be using 10 years from now will be a lot more like Chrome OS than Windows, and I think that's a great thing.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/12/google-chromebook-first-weeks-impressions"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/84nqfmvQzVA" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/84nqfmvQzVA/google-chromebook-first-weeks-impressions" title="Google Chromebook - First Week's Impressions" /> <feedburner:origLink>http://blog.dantup.com/2011/12/google-chromebook-first-weeks-impressions</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-10-28:/2011/10/using-a-google-apps-account-as-an-open-id-login-with-a-custom-url</id> <published>2011-10-28T17:05:00Z</published> <updated>2011-10-28T17:05:00Z</updated> <category term="Domains" /> <category term="Google+" /> <category term="Misc" /> <category term="Opensource" /> <title type="text">Using a Google Apps account as an Open ID login with a custom URL</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;For a long time, I've been using the address of this blog to login to websites that support OpenID. Rather than handling this myself, I used OpenID Delegation to let Google handle the login for me. However, it's always bugged me that due to the requirement of Google Profiles, I've always had to use my GMail account to login:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;link rel="openid2.provider" href="https://www.google.com/accounts/o8/ud?source=profiles"&amp;gt;
&amp;lt;link rel="openid2.local_id" href="http://www.google.com/profiles/danny.tuppeny"&amp;gt;
&lt;/pre&gt;

&lt;p&gt;That was, until now. With &lt;a href="http://googleenterprise.blogspot.com/2011/10/google-is-now-available-with-google.html"&gt;Google+ launching for Google Apps&lt;/a&gt; yesterday, we now have profiles URLs for Google Apps accounts! It's as simple as changing the openid2.local_id tag to point at this URL, and now I can use my Google Apps account to login to websites using Open ID without being tied to Google in the future!&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;link rel="openid2.provider" href="https://www.google.com/accounts/o8/ud?source=profiles"&amp;gt;
&amp;lt;link rel="openid2.local_id" href="https://plus.google.com/113181962167438638669"&amp;gt;
&lt;/pre&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/10/using-a-google-apps-account-as-an-open-id-login-with-a-custom-url"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/vaB4TXFvHhY" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/vaB4TXFvHhY/using-a-google-apps-account-as-an-open-id-login-with-a-custom-url" title="Using a Google Apps account as an Open ID login with a custom URL" /> <feedburner:origLink>http://blog.dantup.com/2011/10/using-a-google-apps-account-as-an-open-id-login-with-a-custom-url</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-09-10:/2011/09/automating-deployment-building-a-specific-mercurial-tag-on-cruisecontrol-net</id> <published>2011-09-10T11:30:00Z</published> <updated>2011-09-10T11:30:00Z</updated> <category term=".NET" /> <category term="Deployment" /> <title type="text">Automating Deployment: Building/Deploying a Specific Mercurial Tag on CruiseControl.NET</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Over the past few weeks, I've been claiming control of more of the build/deployment processes where I work. I was getting tired of seeing a red icon on CCTray because half of the company projects didn't build, and the few that had unit tests weren't even running them :-(&lt;/p&gt;

&lt;p&gt;With all that addressed, I turned my attention to the process of deploying code to the staging servers. We wanted this to be as simple as possible, however it needs to be a conscious decision - we could not just have the public stage systems (used by clients, trainers, etc.) constantly building every time someone commits.&lt;/p&gt;

&lt;p&gt;I like &lt;a href="http://scottchacon.com/2011/08/31/github-flow.html"&gt;the way GitHub works&lt;/a&gt; but sadly we have no chatroom/chatbot to order to deploy for us! :-( We decided that a reasonably simple solution was to have a Mercurial tag called "Stage" to act as a flag for deploying. Once we're happy to push to stage, we can just pull the Stage tag up to the correct revision, and the build server can run with it.&lt;/p&gt;

&lt;p&gt;To do this, we needed to add another project to CruiseControl.NET. One will build continuously (and update local test sites, for non-devs to test during development), and the other will deploy to the public staging environment. The problem came when I wanted to set up this new project to build from a tag. The CruiseControl.NET documentation (if you can find it - Google is polluted with tons of copies of old/stale documentation!) didn't seem to give any option for checking out a tag, only a branch! I tried putting the tag name in there in the hope it might still work, but sadly, no such luck!&lt;/p&gt;

&lt;p&gt;I came across some info online that pointed me to "hg help urls" which shows you can use URL fragments to check out revisions, like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
hg clone \\myserver\Development\MyRepo#Stage
&lt;/pre&gt;

&lt;p&gt;This worked great on my machine, so I configured CCNet to use this as the repository. Unfortunately the build failed immediately, with this error:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
abort: repository \\myserver\Development\MyRepo#Stage not found!
&lt;/pre&gt;

&lt;p&gt;At first I thought maybe CCNet was doing something fruity, but after trying the same command on the build server from a command window, I discovered that this functionality has become broken in a recent version of Mercurial!&lt;/p&gt;

&lt;p&gt;I've &lt;a href="http://mercurial.selenic.com/bts/issue2997"&gt;filed a bug&lt;/a&gt; on the Mercurial site and for now, rolled the server down to 1.7.3 (the version I had on my desktop, which I knew worked). This meant uninstalling TortoiseHG, but that's not the end of the world, right? ;-)&lt;/p&gt;

&lt;p&gt;Now the CCNet config looks something like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;sourcecontrol type="hg"&amp;gt;
    &amp;lt;repo&amp;gt;\\myserver\Development\MyRepo&lt;strong&gt;#Stage&lt;/strong&gt;&amp;lt;/repo&amp;gt;
    &amp;lt;autoGetSource&amp;gt;true&amp;lt;/autoGetSource&amp;gt;
    &amp;lt;workingDirectory&amp;gt;$(WorkingPath)\$(ProjectName)&amp;lt;/workingDirectory&amp;gt;
    &amp;lt;purgeModifications&amp;gt;true&amp;lt;/purgeModifications&amp;gt;
    &amp;lt;revertModifications&amp;gt;true&amp;lt;/revertModifications&amp;gt;
&amp;lt;/sourcecontrol&amp;gt;
&lt;/pre&gt;

&lt;p&gt;With this now working, things were starting to come together. To make things even easier, I added an alias in my Mercurial.ini file:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
[alias]
stage=tag -f Stage
&lt;/pre&gt;

&lt;p&gt;There's still a little way to go to fully automate the process of extracting the build on the server, but what used to take 30+ minutes is now as simple as:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Type "hg stage"&lt;/li&gt;
&lt;li&gt;Go and make a cup of tea for the team&lt;/li&gt;
&lt;li&gt;Build server will:
&lt;ul&gt;
&lt;li&gt;Check out the Stage tag&lt;/li&gt;
&lt;li&gt;Overwrite the AssemblyVersion attribute in a shared AssemblyInfo.cs file with the CruiseControl label&lt;/li&gt;
&lt;li&gt;Build the project using MSBuild/NANT&lt;/li&gt;
&lt;li&gt;Run all tests&lt;/li&gt;
&lt;li&gt;Zip up the resulting build and store it alongside previous versions&lt;/li&gt;
&lt;li&gt;FTP the zip file up to the staging server ready for deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Extract the zip file into the "Latest" folder (this is where most client IIS hosts point)&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Automating the last part is a little more tricky because we'll need something on the server to extract the zip (possibly a web service we can call, or a services that watches the folder for the releases), but if you consider that I deployed 6 times in the last 2 days and it's taken only 4-5 hours to automate this much, it's clear the savings will mount up!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/09/automating-deployment-building-a-specific-mercurial-tag-on-cruisecontrol-net"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/CFJttURt8gA" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/CFJttURt8gA/automating-deployment-building-a-specific-mercurial-tag-on-cruisecontrol-net" title="Automating Deployment: Building/Deploying a Specific Mercurial Tag on CruiseControl.NET" /> <feedburner:origLink>http://blog.dantup.com/2011/09/automating-deployment-building-a-specific-mercurial-tag-on-cruisecontrol-net</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-08-29:/2011/08/my-use-of-google-is-rapidly-reducing</id> <published>2011-08-29T12:34:00Z</published> <updated>2011-08-29T12:34:00Z</updated> <category term="Google Apps" /> <category term="Google+" /> <title type="text">My use of Google+ is rapidly reducing</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;In only a few weeks, my use of Google+ is rapidly reducing :-( I really like Google+, and I'd like to use it more, but there are some real issues that make it less worthwhile for me to use than, say Twitter/Email/SMS/etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No Google Apps support&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;The more I post here, the more I'll lose when I Google Apps is supported&lt;/li&gt;
&lt;li&gt;All of my photos are already on my Apps account (Picasa), which I paid to upgrade storage space for&lt;/li&gt;
&lt;li&gt;Most of my family don't use Google+ because they don't want "another" account, and I don't want to "support" them getting confused with the two, especially with the login issues Google has since "transitioning"&lt;/li&gt;
&lt;li&gt;(Google "transitioned" all of our accounts so we can no longer login to both at the same time to "fix" the fact that Google Apps always lagged behind, yet seemingly this isn't fixed at all. Why did they bother?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No native iPad app&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;95% of my time spent on social media is on my iPad, away from home, or on the sofa with the PC off&lt;/li&gt;
&lt;li&gt;The mobile web app doesn't support things like Huddles or Push Notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No keeping track of what I've read&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This makes it impossible to just "dip in" and read a few posts, because you end up with read posts/unread posts/read posts in your stream&lt;/li&gt;
&lt;li&gt;I want to read chronologically&lt;/li&gt;
&lt;li&gt;I want to read &lt;em&gt;everything&lt;/em&gt; from my close friends/family. The current interface just doesn't support this&lt;/li&gt;
&lt;li&gt;(Almost every Twitter client supports this basic functionality, why don't Google think it's important?)&lt;/il&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No ability to control which circles appear in my main stream&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;My stream gets flooded with semi-interesting people that I have in circles so I can read their posts when I have "extra time", or that I have in circles so I can easily share with them. Eg. I have many non-native English speakers in a circle to keep track of who's helping translate &lt;a href="http://gplusnotifier.com/"&gt;G+ Notifier&lt;/a&gt;. Some of them always post in their native language, which isn't really useful to me.&lt;/li&gt;
&lt;li&gt;(Ironically, Twitter lists solve this problem perfectly, because I can read what those people post when I have extra time, and otherwise keep up with people I follow in my main timeline)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share spam&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I follow a lot of Google employees and when something new is launched, my stream _fills_ with everyone sharing the same post&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first three are pretty much deal-breakers for me. Currently Google+ just feels like a naff copy of Facebook, though almost everyone I know is on Facebook and only a &lt;em&gt;fraction&lt;/em&gt; are on Google+. Google+ doesn't seem to offer any functionality aimed at eating away at Twitter.&lt;/p&gt;

&lt;p&gt;It's a shame. There is so much potential in Google+, but I think it launched way too early, and Google aren't talking enough to the users. They should have something like Moderator/UserVoice/etc. rather than taking feedback secretly. It would be nice to know whether Google agree with feedback we've raised and it might be implemented, or if they've decided it's not the direction they'd like to take the product in - at least then we wouldn't sit around "waiting".&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/08/my-use-of-google-is-rapidly-reducing"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/366cPqglsNA" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/366cPqglsNA/my-use-of-google-is-rapidly-reducing" title="My use of Google+ is rapidly reducing" /> <feedburner:origLink>http://blog.dantup.com/2011/08/my-use-of-google-is-rapidly-reducing</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-08-07:/2011/08/the-state-of-instant-messaging-in-social-2011</id> <published>2011-08-07T21:10:00Z</published> <updated>2011-10-10T18:30:00Z</updated> <category term="Apple iPhone" /> <category term="Apple Mac" /> <category term="Google+" /> <category term="Microsoft Windows" /> <category term="Mobile Phones" /> <category term="Windows Phone 7" /> <title type="text">The State of Instant Messaging in "Social" 2011</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;It's 2011, seemingly "the year of Social". We have Facetime, Google+ Hangouts/Huddles, Facebook video chat, Twitter and iMessage built into iOS, Messenger built into WP7. It sounds like we're making great progress in improving the way we can communicate with our friends. Super!&lt;/p&gt;

&lt;p&gt;I really like Google+. &lt;a href="https://plus.google.com/116849139972638476037"&gt;I use it a lot&lt;/a&gt;. However I think they really screwed up a few things with their launch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restricted invite-only launch (you can't be social without your friends)&lt;/li&gt;
&lt;li&gt;No apps for iOS/WP7 at launch&lt;/li&gt;
&lt;li&gt;No tablet apps at launch&lt;/li&gt;
&lt;li&gt;When iOS app finally launched, won't even install on iPad/iPod Touch (for seemingly no reason)&lt;/li&gt;
&lt;li&gt;No access to huddles in web app/desktop/iPad&lt;/li&gt;
&lt;li&gt;Google Talk and Huddles are not the same...?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyway, getting back on track... Not having access to Huddles on my iPad, my iPod Touch, my Windows Phone or my desktop got me thinking about the state of instant messaging... I wondered whether any of the networks actually work on all popular mobile platforms... There are third party client for most networks on most platforms, however they almost always require you hand over the login details to an account that controls &lt;em&gt;far more&lt;/em&gt; than just chat. This is completely unacceptable in 2011, the year Sony got ripped to shreds by hackers.&lt;/p&gt;

&lt;p&gt;I &lt;a href="https://plus.google.com/116849139972638476037/posts/2naPbnpNRz4"&gt;posted earlier on Google+&lt;/a&gt; that I found it quite incredible that in 2011 nobody had bothered to make their platforms support all instant messaging networks, or that no instant messaging networks had bothered to make sure their network was available on all platforms. Is it so difficult to comprehend that I might want to organise a night out with a group of friends via instant messaging? Google+ Huddles seem to have been designed specifically for this sort of thing, yet you'll see in the table below that it fails, badly.&lt;/p&gt;

&lt;p&gt;I created a table to compare the various instant messaging options across platforms. There are a few basic requirements that must be met for a network/platform combination to be considered fulfilled.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access must not require handing over a password that controls more than just chat to anyone other than the owner of the network, or the device/OS.&lt;/li&gt;
&lt;li&gt;Access must be "native" to the platform (eg. no iPhone apps on iPad).&lt;/li&gt;
&lt;li&gt;Must be true "instant messaging" that gives useful alerts/push notification (eg. Email notification does not count).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are my findings so far. If you spot a mistake, please let me know and I'll update accordingly.&lt;/p&gt;

&lt;style&gt;
.imResults, .imResults th, .imResults td
{
border-collapse: collapse;
border: 1px solid #f6f6f6;
}
.imResults th
{
vertical-align: bottom;
}
.imResults td
{
text-align: center;
}
.imResults .l
{
text-align: left;
font-weight: bold;
}
&lt;/style&gt;

&lt;p&gt;&lt;strong&gt;Edit: Added Skype, GTalk on Android Tablet, G+ stuff on iPod Touch.&lt;/strong&gt;&lt;/p&gt;

&lt;table class="imResults"&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th class="l"&gt;Network&lt;/th&gt;&lt;th&gt;Win&lt;/th&gt;&lt;th&gt;Mac OS&lt;/th&gt;&lt;th&gt;Web&lt;/th&gt;&lt;th&gt;iPad&lt;/th&gt;&lt;th&gt;iPhone&lt;/th&gt;&lt;th&gt;iPod&lt;/th&gt;&lt;th&gt;Android Tablet&lt;/th&gt;&lt;th&gt;Android Phone&lt;/th&gt;&lt;th&gt;Windows Phone&lt;/th&gt;&lt;th&gt;Blackberry&lt;/th&gt;&lt;th&gt;Num Platforms&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td class="l"&gt;Messenger&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="l"&gt;Skype&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="l"&gt;Facebook*&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;6*&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="l"&gt;GTalk&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;*&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;4*&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="l"&gt;iMessage&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="l"&gt;G+ Huddle&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="l"&gt;G+ Hangout&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="l"&gt;AIM&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="l"&gt;BBM&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="/pi/tick.png" /&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Items marked * do not support group chat :o(&lt;/p&gt;

&lt;p&gt;To me, this is a pretty poor show. Out of 10 popular platforms, not one service is available across them all with built-in/first-party apps (third party apps excluded on security grounds). Messenger and Skype seem to come closest with support on 7 platforms, though Messenger has no support for tablets - you know, those things that are &lt;em&gt;massive&lt;/em&gt; this year :-( &lt;small&gt;It's particularly annoying for me to have Messenger on my Windows Phone and have to respond to messages on a tiny on-screen keyboard with my iPad sat next to me doing nothing!&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;I think the most shocking stat here is that Google have launched Google+ as a social network and have not only introduced &lt;em&gt;two&lt;/em&gt; new chat/messaging protocols, but the support for them across platforms is pretty poor. (Please don't give me shit about it being "preview". If my mum can join, it's public. Putting a preview/beta on something is not an excuse for poor support. If it's not ready, don't start shouting about it and letting us all pile in).&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/08/the-state-of-instant-messaging-in-social-2011"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/ICfQ3iJ8zOY" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/ICfQ3iJ8zOY/the-state-of-instant-messaging-in-social-2011" title="The State of Instant Messaging in &quot;Social&quot; 2011" /> <feedburner:origLink>http://blog.dantup.com/2011/08/the-state-of-instant-messaging-in-social-2011</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-07-25:/2011/07/g-notifier-1-3-live-updates-posted-to-twitter</id> <published>2011-07-25T18:50:00Z</published> <updated>2011-07-25T18:50:00Z</updated> <category term=".NET" /> <category term="Bitbucket" /> <category term="Google+" /> <category term="Microsoft Windows" /> <category term="Opensource" /> <category term="Google+ Notifier" /> <title type="text">G+ Notifier 1.3 live, updates posted to Twitter</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Version 1.3 of &lt;a href="http://gplusnotifier.com"&gt;G+ Notifier (for Google+)&lt;/a&gt; recently went live. Unfortunately, due to an error with 1.2, you might not be notified about the update by the application unless you leave it running for 12 hours!&lt;/p&gt;

&lt;p&gt;Here's some screenshots of the current version:&lt;/p&gt;

&lt;p&gt;&lt;img alt="The notifications window" src="http://gplusnotifier.com/Images/Notifications.png" /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;img alt="The balloon notification" src="http://gplusnotifier.com/Images/Balloon.png" /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, with &lt;em&gt;absolutely no warning&lt;/em&gt;, Google suspended the G+ Notifier account I'd created on Google+ to announce updates. I'd asked a number of times whether this was ok, and got no response. As a result, if you want notification of updates without all of my unrelated posts on Google+, the best way is to follow &lt;a href="http://twitter.com/GPlusNotifier"&gt;@GPlusNotifier on Twitter&lt;/a&gt;. Yeah, really.&lt;/p&gt;

&lt;p&gt;Of course, if you don't mind the personal posts, the best place to follow G+ Notifier is &lt;a href="https://plus.google.com/116849139972638476037"&gt;my account on Google+&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have any ideas and suggestions for &lt;a href="http://gplusnotifier.com"&gt;G+ Notifier&lt;/a&gt;, &lt;a href="http://gplusnotifier.uservoice.com/"&gt;please submit them to the support site&lt;/a&gt;. You can also vote on other peoples suggestions there to influence the things worked on next!&lt;/p&gt;

&lt;p&gt;You're also welcome to &lt;a href="https://bitbucket.org/DanTup/g-notifier/fork"&gt;fork the code&lt;/a&gt; and send pull requests. It's a good idea to let me know in advance, just to ensure someone isn't already doing the same thing. There are already a few people (&lt;a href="https://plus.google.com/109531055133116706775"&gt;Adam Simmons&lt;/a&gt;, &lt;a href="https://plus.google.com/112139137835193833820"&gt;The Configurator&lt;/a&gt; and &lt;a href="https://plus.google.com/114121441074506314281"&gt;Andrew Nurse&lt;/a&gt;) contributing to the project!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/07/g-notifier-1-3-live-updates-posted-to-twitter"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/5k5s1w9CTfc" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/5k5s1w9CTfc/g-notifier-1-3-live-updates-posted-to-twitter" title="G+ Notifier 1.3 live, updates posted to Twitter" /> <feedburner:origLink>http://blog.dantup.com/2011/07/g-notifier-1-3-live-updates-posted-to-twitter</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-07-19:/2011/07/g-notifier-first-version-live</id> <published>2011-07-19T19:06:00Z</published> <updated>2011-07-23T19:40:00Z</updated> <category term=".NET" /> <category term="Bitbucket" /> <category term="Google Wave Notifier" /> <category term="Google+" /> <category term="Opensource" /> <category term="Microsoft Windows" /> <title type="text">G+ Notifier - First Version Live!</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;The first version of my G+ Notifier is now live, ready to download!&lt;/p&gt;

&lt;p&gt;The first version is pretty basic, but it's still incredibly useful. It sits in the notification area and shows how many unread notifications you have (and shows balloons periodically). Double-clicking the icon (or single-clicking a balloon) will launch Google+ in your default browser.&lt;/p&gt;

&lt;a href="http://gplusnotifier.com/"&gt;&lt;img src="http://gplusnotifier.com/Images/Balloon.png" /&gt;&lt;/a&gt;

&lt;p&gt;For full info and a download link, visit &lt;a href="http://gplusnotifier.com/"&gt;gplusnotifier.com&lt;/a&gt;!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/07/g-notifier-first-version-live"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/ERNrD3VopKs" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/ERNrD3VopKs/g-notifier-first-version-live" title="G+ Notifier - First Version Live!" /> <feedburner:origLink>http://blog.dantup.com/2011/07/g-notifier-first-version-live</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-07-15:/2011/07/g-notifier-windows-utility-to-show-notifications-from-google-in-the-notification-area</id> <published>2011-07-15T20:46:00Z</published> <updated>2011-07-23T19:37:00Z</updated> <category term=".NET" /> <category term="Bitbucket" /> <category term="Google Buzz" /> <category term="Google Wave Notifier" /> <category term="Opensource" /> <category term="WPF" /> <category term="Google+" /> <title type="text">G+ Notifier - Windows Utility to show notifications from Google+ in the notification area</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I recently picked up some domains for my next open source project - &lt;a href="http://gplusnotifier.com/"&gt;G+ Notifier&lt;/a&gt;. It's a simple Windows utility that'll sit in the notification area and alert you to notifications from Google+! Similar to my previous Google Wave Notifier, but hopefully Google won't discontinue this service quite so quick!&lt;/p&gt;

&lt;img src="http://gplusnotifier.com/Images/Notifications.png" /&gt;

&lt;p&gt;I'm not sure if I'll be able to launch the application before Google+ gets a public API, but I'll do some investigation over the coming days.&lt;/p&gt;

&lt;p&gt;If you want to be kept informed with the progress of the app, please &lt;a href="https://plus.google.com/u/0/101567187775228995510"&gt;follow G+ Notifier on Google+&lt;/a&gt;, I'll post all updates on that account :-)&lt;/p&gt;

&lt;p&gt;The website for the application is &lt;a href="http://gplusnotifier.com/"&gt;gplusnotifier.com&lt;/a&gt; and will also be updated regularly. Full source code will be hosted on &lt;a href="http://code.dantup.com/"&gt;Bitbucket&lt;/a&gt;!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/07/g-notifier-windows-utility-to-show-notifications-from-google-in-the-notification-area"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/1nDkW56ycRY" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/1nDkW56ycRY/g-notifier-windows-utility-to-show-notifications-from-google-in-the-notification-area" title="G+ Notifier - Windows Utility to show notifications from Google+ in the notification area" /> <feedburner:origLink>http://blog.dantup.com/2011/07/g-notifier-windows-utility-to-show-notifications-from-google-in-the-notification-area</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-07-15:/2011/07/google-code-git-support-added</id> <published>2011-07-15T15:30:00Z</published> <updated>2011-07-15T17:34:00Z</updated> <category term="Google Code" /> <title type="text">Google Code - Git Support Added!</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;It's been a little while since &lt;a href="/2010/03/is-google-code-readying-git-support"&gt;my prediction&lt;/a&gt;, but I just got email notification of the "Native Git support" issue on Google Code being fixed!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://code.google.com/p/support/issues/detail?id=2454"&gt;http://code.google.com/p/support/issues/detail?id=2454&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've checked this, and you can indeed select Git for your new projects. See - I told you it was coming ;-)&lt;/p&gt;

&lt;p&gt;Of course, we've all moved to Bitbucket and Github now, so it's unlikely anybody cares! :/&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/07/google-code-git-support-added"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/V8LTegNbm0s" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/V8LTegNbm0s/google-code-git-support-added" title="Google Code - Git Support Added!" /> <feedburner:origLink>http://blog.dantup.com/2011/07/google-code-git-support-added</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-05-22:/2011/05/google-app-engine-price-increases-bad-for-small-apps-and-no-more-free-scaling-o</id> <published>2011-05-22T15:56:00Z</published> <updated>2011-05-22T15:56:00Z</updated> <category term="Amazon EC2" /> <category term="AppHarbor" /> <category term="Google App Engine" /> <category term="Microsoft Windows Azure" /> <title type="text">Google App Engine Price Increases - Bad for Small Apps, and No More Free Scaling :o(</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;At Google IO it was announced that this year that &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; will come out of "preview" and add additional features and an SLA. Sounds great, but it also seemed like a lot of this hype was to try and downplay something else that was changing... &lt;em&gt;the prices&lt;/em&gt;. As the service comes out of preview, it needs to be able to sustain itself financially. That means, price increases! (&lt;a href="http://www.google.com/enterprise/appengine/appengine_pricing.html"&gt;full details here&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The most significant change to me is the shift from charging for "CPU hours" being actual hours worth of CPU cycles (for a "standard" CPU), to being "your app being live for an hour, even if it uses 0 CPU". This is how most of App Engine's competitors work, and actually the reason I always thought Google App Engine's prices were so reasonable for small apps.&lt;/p&gt;

&lt;p&gt;The problem with this model is that if you have a very low traffic application (which, let's face it, is how most apps will start out), it costs you almost nothing. In fact, for the few years this blog has been running on App Engine, I haven't paid a single penny. Even on a day I received 50,000 visitors, I didn't break the free quota despite my application being scaled across 4-5 instances for most of the day. My CPU use was so low, it was measure in &lt;em&gt;minutes&lt;/em&gt;!. This made App Engine an ideal place for trying out ideas, because it was really cheap. And let's face it, if your idea takes off and it's already hosted on App Engine, you're unlikely to move away, so it was Win/Win, both for you, and Google.&lt;/p&gt;

&lt;p&gt;The alternative model, which App Engine is soon to adopt, is that your low-traffic app is being charged just for being "live". This is the reason I've never set anything up on Azure or EC2. It costs you the same if you get 0 visitors in a month, as a single-instance application getting moderate traffic.&lt;/p&gt;

&lt;p&gt;This change has another implication for small apps. &lt;strong&gt;No more free scaling&lt;/strong&gt;. Previously, your application could scale out to a number of instances for periods of the day and you could stay within the free quota. Now that the free quota will be only 24 CPU hours, it's impossible for your application to burst out of a single instance without incurring a cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &lt;a href="http://www.google.com/enterprise/appengine/appengine_pricing.html"&gt;new pricing page&lt;/a&gt; lists "Dynamic Scaling" under the free version, however unless you're prepared for your application to be available for less than 24 hours in a day, I don't see how this could possibly be achieved. It's possible this refers to it being possible, though extra charges will apply.&lt;/p&gt;

&lt;p&gt;This might not sound like a big deal - competing services already charge like this anyway (and some don't even have free quotas), however for me, this is more significant. I'm a .NET developer by trade. I'm not a huge fan of Java or Python, but App Engine's pricing was so good, it went some way to outweighing the use of .NET. Now that the pricing is the same, it doesn't really make sense as a .NET developer to give up all the benefits of the development environment/frameworks I'm used to using (and the productivity boost I get from them).&lt;/p&gt;

&lt;p&gt;My current thinking is to move my apps over to &lt;a href="http://appharbor.com/"&gt;AppHarbor&lt;/a&gt;, but once they're written in .NET, Azure and EC2 are probably also possibilities if AppHarbor doesn't work out. First project, this blog!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/05/google-app-engine-price-increases-bad-for-small-apps-and-no-more-free-scaling-o"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/80WxMYHTyaE" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/80WxMYHTyaE/google-app-engine-price-increases-bad-for-small-apps-and-no-more-free-scaling-o" title="Google App Engine Price Increases - Bad for Small Apps, and No More Free Scaling :o(" /> <feedburner:origLink>http://blog.dantup.com/2011/05/google-app-engine-price-increases-bad-for-small-apps-and-no-more-free-scaling-o</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-05-21:/2011/05/configuring-elmah-to-send-emails-without-putting-your-password-in-the-config-file</id> <published>2011-05-21T17:51:00Z</published> <updated>2011-05-21T17:51:00Z</updated> <category term="ASP.NET MVC" /> <category term="Email" /> <title type="text">Configuring ELMAH to send emails without putting your password in the config file</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Today I was configuring ELMAH to send emails when an exception occurs on my new blog. While looking for the config options, I noticed that a lot of the snippets being posted around suggests people are putting &lt;em&gt;usernames and passwords&lt;/em&gt; in their config files to make this work. &lt;strong&gt;That's pretty scary&lt;/strong&gt;! :(&lt;/p&gt;

&lt;p&gt;Because SMTP is a bit crap, you don't actually need to authenticate to send email. Most SMTP servers are locked down to stop relaying, but if you deliver directly to the recipients server, the mail will (usually) be accepted anonymously. I say&lt;em&gt;usually&lt;/em&gt; because your email could be rejected based on the &lt;strong&gt;From&lt;/strong&gt; header if something like DomainKeys is set up for that domain.&lt;/p&gt;

&lt;p&gt;To configure ELMAH to send mail without authentication, simply look up an MX record for the domain you wish to send the email to, and use that as the SMTP Server. Eg., if you're using Google Apps (like me), you could do something like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;errorMail
    from="&amp;amp;quot;Blog Error&amp;amp;quot; &amp;amp;lt;blog+errors@fakedomain.com&amp;amp;gt;"
    to="&amp;amp;quot;Blog Errors&amp;amp;quot; &amp;amp;lt;blog+errors@fakedomain.com&amp;amp;gt;"
    smtpServer="aspmx.l.google.com" /&amp;gt;
&lt;/pre&gt;

&lt;p&gt;This means you don't need to put your email username/password in the config file to receive emails about your exceptions.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/05/configuring-elmah-to-send-emails-without-putting-your-password-in-the-config-file"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/_RuQnI3V3bw" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/_RuQnI3V3bw/configuring-elmah-to-send-emails-without-putting-your-password-in-the-config-file" title="Configuring ELMAH to send emails without putting your password in the config file" /> <feedburner:origLink>http://blog.dantup.com/2011/05/configuring-elmah-to-send-emails-without-putting-your-password-in-the-config-file</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-05-09:/2011/05/adding-tab-expansion-to-andrew-nurses-psget-nuget-powershell-module</id> <published>2011-05-09T20:00:00Z</published> <updated>2011-05-09T20:00:00Z</updated> <category term=".NET" /> <category term="Bitbucket" /> <category term="Opensource" /> <category term="Powershell" /> <category term="NuGet" /> <title type="text">Adding Tab-Expansion to Andrew Nurse's PSGet (NuGet Powershell Module)</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;If you &lt;a href="http://feeds.dantup.com/DanTup"&gt;subscribe to my blog&lt;/a&gt; or &lt;a href="http://twitter.com/DanTup"&gt;follow me on Twitter&lt;/a&gt; you'll probably know I'm quite a fan of NuGet. Recently I was playing around with &lt;a href="http://code.andrewnurse.net/psget"&gt;Andrew Nurse's PSGet module&lt;/a&gt; that wraps NuGet.exe for PowerShell (which, by the way, is an &lt;em&gt;awesome&lt;/em&gt; idea, and should be added as built-in functionality!). I decided a good way to learn a little more about PowerShell would be to try and add Tab Expansion to PSGet, similar to the functionality in the Visual Studio Package Manager Console.&lt;/p&gt;

&lt;p&gt;Note: &lt;a href="http://code.dantup.com/psget"&gt;I forked Andrew Nurse's PSGet project to make these changes&lt;/a&gt;, though I'll see if he's interested in pulling them back into his, and updating the NuGet package. That way people will have a single source for PowerShell/NuGet goodness. Until then, if you want my Tab Expansion, you can &lt;a href="https://bitbucket.org/DanTup/psget/src/21e51011c46a/Packages/PS-Get/PS-Get.psm1"&gt;grab the module from here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Disclaimer: I've only been using PowerShell for around a week, so I'm sure there are much better ways to do what I've done. I did what I could with the (little) knowledge I have and some Googling. If you can see better ways of doing things, &lt;strong&gt;please let me know&lt;/strong&gt; so I can learn, and update my code (&lt;a href="https://bitbucket.org/DanTup/psget/pull"&gt;send me a pull request on Bitbucket if you want&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show me the code!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tab Expansion in PowerShell works via the TabExpansion method. This function is called and provided with the current line in addition to the last word typed. I couldn't find a way to hook TabExpansion for just the commands we're interested in, so I had to hijack the whole lot. This doesn't seem to be a problem, as falling back to the default behaviour seemed pretty simple by keeping a copy of the function:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# Copy the current Tab Expansion function so we can fall back to it if we're not supposed to handle a command
Copy Function:\TabExpansion Function:\OriginalTabExpansion

function TabExpansion([string] $line, [string] $lastword)
{
    # Only run for "Get-PSPackage" or "Install-PSPackage"
    if (somecondition)
    {
        # Do cool NuGet stuff here
    }
    # Otherwise, fall back to default TabExpansion function
    else
    {
        OriginalTabExpansion $line $lastword
    }
}
Export-ModuleMember -Function TabExpansion
&lt;/pre&gt;

&lt;p&gt;We need our NuGet code to run only for two specific commands, for the first parameter. The easiest way seemed to be to check that $line is equal to one of our commands followed by the $lastword. This probably isn't the best way, but it seems to do the job for the obvious cases.&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# Only run for "Get-PSPackage" or "Install-PSPackage" where we're typing the first argument
if ($line -eq "Get-PSPackage $lastword" -or $line -eq "Install-PSPackage $lastword")
{
    # ...
}
&lt;/pre&gt;

&lt;p&gt;Inside this block, we need to query the OData feed for NuGet packages. Rather than hard-coding the URI, we're supposed to go through a Microsoft fwlink (https://go.microsoft.com/fwlink/?LinkID=206669), but because we can't append parameters to the end, we need to resolve this redirect. I found &lt;a href="http://nuget.codeplex.com/workitem/304"&gt;some code in the NuGet issue tracker&lt;/a&gt; written by David Ebbo to do just this. I converted it to PowerShell and added a $defaultSource variable:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# Follows redirects and returns the final URI. Used to support fwlink as package source.
function GetRedirectedUri($uri)
{
    $req = [System.Net.HttpWebRequest] [System.Net.WebRequest]::Create($uri)
    $req.AllowAutoRedirect = $FALSE; # Don't follow redirects, to save bandwidth/roundtrip
    $resp = $req.GetResponse()
    if ($resp.StatusCode -eq [System.Net.HttpStatusCode]::Redirect)
    {
        $resp.Headers["Location"]
    }
    else
    {
        $uri;
    }
}
# Set the default NuGet source
$defaultSource = GetRedirectedUri("https://go.microsoft.com/fwlink/?LinkID=206669")
&lt;/pre&gt;

&lt;p&gt;With this done, we just needed to call the feed with some search parameters and parse the results. Luckily, parsing OData is pretty trivial, and with Fiddler and Visual Studio, it was easy to find the syntax for searching for packages with IDs that start with a given string :)&lt;/p&gt;

&lt;p&gt;The final step was to pipe through Get-Unique because the OData feed returns multiple entries for packages with multiple versions (but the ID is the same):&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# Construct a URI to fetch the top 30 matching packages, sorted by download count
$uri = "$($defaultSource)Packages()?`$filter=startswith(tolower(Id),'$($lastword)')&amp;`$orderby=DownloadCount%20desc,Id&amp;$`skip=0&amp;`$top=30"

# Fetch the data, return as XML
$wc = New-Object Net.WebClient
$data = [xml]$wc.DownloadString($uri)

# Pipe result through Get-Unique because there could be multiple versions with the same ID
$(
    # Loop, just grabbing the ID from Properties
    foreach ($entry in $data.feed.entry)
    {
        $entry.properties.Id
    }
) | Get-Unique
&lt;/pre&gt;

&lt;p&gt;And viola, Tab Expansion! Now when you type "Install-PSPackage x" or "Get-PSPackage x" you can use tab to cycle through the matching packages (sorted by download count, in an attempt to give the most likely result first).&lt;/p&gt;

&lt;p&gt;The full module is &lt;a href="https://bitbucket.org/DanTup/psget/src/21e51011c46a/Packages/PS-Get/PS-Get.psm1"&gt;is up on Bitbucket&lt;/a&gt;, but maybe with a little tidying up we can get Andrew Nurse to pull the functionality into his repository and update PSGet on NuGet.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/05/adding-tab-expansion-to-andrew-nurses-psget-nuget-powershell-module"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/tcKFErYbq0w" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/tcKFErYbq0w/adding-tab-expansion-to-andrew-nurses-psget-nuget-powershell-module" title="Adding Tab-Expansion to Andrew Nurse's PSGet (NuGet Powershell Module)" /> <feedburner:origLink>http://blog.dantup.com/2011/05/adding-tab-expansion-to-andrew-nurses-psget-nuget-powershell-module</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-05-08:/2011/05/extending-markdownhelper-markdowndeep-net-to-support-google-codes-prettify-syntax-highlighter</id> <published>2011-05-08T19:50:00Z</published> <updated>2011-05-08T19:50:00Z</updated> <category term=".NET" /> <category term="AppHarbor" /> <category term="ASP.NET MVC" /> <category term="ASP.NET Razor" /> <category term="Bitbucket" /> <category term="Opensource" /> <title type="text">Extending MarkdownHelper/MarkdownDeep.NET to support Google Code's Prettify Syntax Highlighter</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I'm in the process of &lt;a href="http://code.dantup.com/blog"&gt;rewriting my blog&lt;/a&gt; in ASP.NET MVC to move it from Google App Engine to AppHarbor. One of the important changes is that all my articles will be stored as &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt; instead of HTML.&lt;/p&gt;

&lt;p&gt;I've &lt;a href="/2011/04/markdownhelper-on-nuget-using-markdowndeep"&gt;blogged previously&lt;/a&gt; about the MarkdownHelper class I created and put on NuGet to make using Markdown in views as trivial as typing:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;@Html.Markdown(Model.Body)&lt;/pre&gt;

&lt;p&gt;One thing that I didn't take care of was adding syntax highlighting to code blocks. On this blog I currently use &lt;a href="http://code.google.com/p/google-code-prettify/"&gt;Google Code's Prettify syntax highlighter&lt;/a&gt;, and this requires a CSS class be applied to code blocks:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;pre class="prettyprint"&amp;gt;
// Code here
&amp;lt;/pre&amp;gt;
&lt;/pre&gt;

&lt;p&gt;By default, MarkdownDeep (which my MarkdownHelper uses) doesn't add these classes, so I had to make some changes to support it. I didn't want to build this into MarkdownHelper as it's fairly specific to using this particular syntax highlighter. Instead, I decided to take advantage of &lt;a href="http://msdn.microsoft.com/en-us/library/wa80x488(v=vs.80).aspx"&gt;partial classes&lt;/a&gt; to allow the functionality to be customised without having to modify the MarkdownHelper.cs file added by MarkdownHelper/NuGet.&lt;/p&gt;

&lt;p&gt;First I amended the MarkdownHelper class, adding "partial" to the declaration. This was pushed to &lt;a href="http://nuget.org/List/Packages/MarkdownHelper"&gt;NuGet as MarkdownHelper 1.2&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
public static partial class MarkdownHelper
{
// ...
}
&lt;/pre&gt;

&lt;p&gt;With this done, I loaded my blog in Visual Studio and opened the Library Package Manager, which showed the update and replaced the class with one click. With this done, I then created a new file named "MarkdownHelper.CodeFormatting.cs" alongside "MarkdownHelper.cs" in my Helpers folder. This is where my customisations should go, which will allow MarkdownHelper.cs to be updated by NuGet without affecting the customisations.&lt;/p&gt;

&lt;p&gt;As it turned out, customising the code blocks with MarkdownDeep was pretty easy. The class has several extension points, the interesting one for me being:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
public Func&amp;lt;Markdown, string, string&amp;gt; FormatCodeBlock;
&lt;/pre&gt;

&lt;p&gt;If you set this property, when a code block is encountered, your code will be called instead of the default. To make sure I wasn't losing any functionality, I checked the &lt;a href="https://github.com/toptensoftware/markdowndeep/blob/master/MarkdownDeep/Block.cs"&gt;source code of MarkdownDeep&lt;/a&gt; to see exactly what it did with a code block:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
b.Append("&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;");
foreach (var line in children)
{
    m.HtmlEncodeAndConvertTabsToSpaces(b, line.buf, line.contentStart, line.contentLen);
    b.Append("\n");
}
b.Append("&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;\n\n");
&lt;/pre&gt;

&lt;p&gt;This seemed simple enough, and actually, the code path when you had a custom method was almost the same, it just didn't put the pre/code blocks in:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
var sb = new StringBuilder();
foreach (var line in children)
{
    m.HtmlEncodeAndConvertTabsToSpaces(sb, line.buf, line.contentStart, line.contentLen);
    sb.Append("\n");
}
b.Append(m.FormatCodeBlock(m, sb.ToString()));
&lt;/pre&gt;

&lt;p&gt;This meant the &lt;em&gt;only&lt;/em&gt; thing I needed to do was surround the string with the pre/code tags. Adding class="prettyprint" was rather trivial:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
/// &amp;lt;summary&amp;gt;
/// Overrides the Markdown formatting for code blocks to inject "prettyprint" classes for syntax highlighting.
/// &amp;lt;/summary&amp;gt;
private static string FormatCodeBlock(Markdown md, string code)
{
	// Wrap the code in &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt; as the default MarkdownDeep.NET implementation does, but add a class of
	// "prettyprint" which is what Google Code Prettify uses to identify code blocks.
	// http://google-code-prettify.googlecode.com/svn/trunk/README.html
	var sb = new StringBuilder();
	sb.Append("&amp;lt;pre class=\"prettyprint\"&amp;gt;&amp;lt;code&amp;gt;");
	sb.Append(code);
	sb.Append("&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;\n\n");
	return sb.ToString();
}
&lt;/pre&gt;

&lt;p&gt;Then in my partial class, I simply assigned this method to the FormatCodeBlock property of the Markdown transformer in a static constructor (since this is a partial class, it has direct access to the "markdownTransform" object):&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
/// &amp;lt;summary&amp;gt;
/// Static constructor to set MarkdownHelper options.
/// &amp;lt;/summary&amp;gt;
static MarkdownHelper()
{
    // Override code formatting to support syntax highlighting.
    markdownTransformer.FormatCodeBlock = FormatCodeBlock;
}
&lt;/pre&gt;

&lt;p&gt;With those changes, all my code blocks have the correct class and highlight correctly :-) You can see a sample of a code block on &lt;a href="http://dev.dantup.com/"&gt;the homepage of the development site&lt;/a&gt; where I'm building the blog. You can also see the &lt;a href="http://code.dantup.com/blog"&gt;full source code on Bitbucket&lt;/a&gt; (&lt;a href="https://bitbucket.org/DanTup/dantup-blog/src/03cfceba726b/DanTup%20Blog/Helpers/MarkdownHelper.CodeFormatting.cs"&gt;MarkdownHelper.CodeFormatting.cs&lt;/a&gt;).&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/05/extending-markdownhelper-markdowndeep-net-to-support-google-codes-prettify-syntax-highlighter"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/3BjytvBa4qY" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/3BjytvBa4qY/extending-markdownhelper-markdowndeep-net-to-support-google-codes-prettify-syntax-highlighter" title="Extending MarkdownHelper/MarkdownDeep.NET to support Google Code's Prettify Syntax Highlighter" /> <feedburner:origLink>http://blog.dantup.com/2011/05/extending-markdownhelper-markdowndeep-net-to-support-google-codes-prettify-syntax-highlighter</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-05-07:/2011/05/setting-up-nuget-to-automatically-fetch-packages-when-deploying-to-appharbor-without-storing-binaries-in-source-control</id> <published>2011-05-07T22:17:00Z</published> <updated>2011-05-07T22:17:00Z</updated> <category term=".NET" /> <category term="ASP.NET MVC" /> <category term="ASP.NET Razor" /> <category term="Bitbucket" /> <category term="Opensource" /> <category term="AppHarbor" /> <category term="NuGet" /> <title type="text">Setting up NuGet to Automatically Fetch Packages When Deploying to AppHarbor Without Storing Binaries in Source Control</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Over the last few days I've been blogging and tweeting about using NuGet without committing the packages folder to source control. &lt;a href="http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html"&gt;David Ebbo blogged about using a pre-build event&lt;/a&gt; to fetch packages at build time.&lt;/p&gt;

&lt;p&gt;Unfortunately, this doesn't work on AppHarbor because build events are not supported. If you try, you'll find the pre-build step doesn't fire and the build fails due to the missing dependencies :(&lt;/p&gt;

&lt;p&gt;I voted on (and tweeted about, lots) &lt;a href="http://j.mp/ahNuGet"&gt;a feature request about supporting NuGet natively on AppHarbor&lt;/a&gt;. The request has had quite a few votes, and &lt;a href="http://twitter.com/#!/friism/status/66893714781511681"&gt;Friism said they'll probably implement it&lt;/a&gt;, but in the meantime, this meant I couldn't deploy to AppHarbor. I didn't want to add my packages folder to source control, because even once I remove it when AppHarbor supports NuGet natively, it'll still be in the history (and therefore every clone), which I'd like to avoid.&lt;/p&gt;

&lt;p&gt;I scratched my head a little, and re-read the &lt;a href="http://nuget.codeplex.com/wikipage?title=Enabling%20Using%20NuGet%20Without%20Checking%20In%20Packages%20Folder"&gt;proposed spec&lt;/a&gt; for baking this functionality into NuGet/MSBuild (to be honest, I don't actually understand what there is to improve!). The mentions of MSBuild got me thinking - custom build targets!&lt;/p&gt;

&lt;p&gt;I opened up my csproj file in Notepad, and scanned through for the "BeforeBuild" step that's included by default &lt;strong&gt;but commented out&lt;/strong&gt;. I removed the comment, and moved my pre-build event into the target:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;Target Name="BeforeBuild"&amp;gt;
&amp;lt;Exec Command="&amp;amp;quot;$(SolutionDir)Tools\NuGet&amp;amp;quot; install &amp;amp;quot;$(ProjectDir)packages.config&amp;amp;quot; -o &amp;amp;quot;$(SolutionDir)packages&amp;amp;quot;" /&amp;gt;
&amp;lt;/Target&amp;gt;
&lt;/pre&gt;

&lt;p&gt;First I checked whether this worked locally, by deleting my packages folder and running MSBuild from the command line. Success! I added in &lt;a href="http://nuget.org/List/Packages/MarkdownHelper"&gt;MarkdownHelper&lt;/a&gt; and added some test code to a view:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
@Html.Markdown("We can use **Markdown!**")
&lt;/pre&gt;

&lt;p&gt;Everything worked fine locally. An "hg ci" and "hg push" later, Bitbucket notified AppHarbor, AppHarbor checked out, built, and successfully deployed!&lt;/p&gt;

&lt;p&gt;To show it working, you can see the &lt;a href="http://dev.dantup.com/"&gt;test page at dev.dantup.com&lt;/a&gt; that will form the basis of the ASP.NET MVC / Razor version of this blog, and &lt;a href="http://code.dantup.com/blog"&gt;view the source code that AppHarbor is pulling&lt;/a&gt; to see there's no packages folder!&lt;/p&gt;

&lt;p&gt;So, it turned out to be quite simple to get it working. I've also notified David Ebbo to see if he'd update his post with this info for anyone reading there that's using AppHarbor! :-)&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/05/setting-up-nuget-to-automatically-fetch-packages-when-deploying-to-appharbor-without-storing-binaries-in-source-control"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/TmtHg_RcN4o" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/TmtHg_RcN4o/setting-up-nuget-to-automatically-fetch-packages-when-deploying-to-appharbor-without-storing-binaries-in-source-control" title="Setting up NuGet to Automatically Fetch Packages When Deploying to AppHarbor Without Storing Binaries in Source Control" /> <feedburner:origLink>http://blog.dantup.com/2011/05/setting-up-nuget-to-automatically-fetch-packages-when-deploying-to-appharbor-without-storing-binaries-in-source-control</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-05-05:/2011/05/official-blackpool-guide-for-iphone-and-ipod-touch-live</id> <published>2011-05-05T18:04:00Z</published> <updated>2011-05-05T18:04:00Z</updated> <category term="Apple iPhone" /> <category term="Mobile Phones" /> <title type="text">Official Blackpool Guide for iPhone and iPod Touch now Live!</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;img src="http://a4.mzstatic.com/us/r1000/031/Purple/f9/9c/55/mzl.qhkcjnng.320x480-75.jpg" style="float: left; margin: 10px 10px 10px 0" /&gt;

&lt;p&gt;The &lt;a href="http://j.mp/blackpoolapp"&gt;Official Blackpool Guide for iPhone and iPod Touch&lt;/a&gt; is now live in the Apple App Store!&lt;/p&gt;

&lt;p&gt;This is the third tourism app that I've worked on, joining &lt;a href="http://j.mp/cardiffapp"&gt;Cardiff&lt;/a&gt; and &lt;a href="http://j.mp/newcastleapp"&gt;NewcastleGateshead&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These applications are all official, with the data being supplied directly by the tourist board. If you try out the app, please be sure to leave a review in iTunes, and if you have feedback or suggestions, &lt;a href="http://www.newmind.co.uk/site/technology/mobile-apps/iphone-app-support"&gt;please send them in&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;There will surely be more where these came from, so be sure to &lt;a href="http://twitter.com/DanTup"&gt;follow me on Twitter&lt;/a&gt; or &lt;a href="http://feeds.dantup.com/DanTup"&gt;subscribe to my RSS feed&lt;/a&gt; for notifications!&lt;/p&gt;

&lt;div style="clear: left;"&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/05/official-blackpool-guide-for-iphone-and-ipod-touch-live"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/glAhgFTxkO0" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/glAhgFTxkO0/official-blackpool-guide-for-iphone-and-ipod-touch-live" title="Official Blackpool Guide for iPhone and iPod Touch now Live!" /> <feedburner:origLink>http://blog.dantup.com/2011/05/official-blackpool-guide-for-iphone-and-ipod-touch-live</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-05-04:/2011/05/vote-for-native-nuget-support-on-appharbor-to-save-your-repositories-from-the-bloatmonster</id> <published>2011-05-04T20:42:00Z</published> <updated>2011-05-04T20:42:00Z</updated> <category term=".NET" /> <category term="ASP.NET MVC" /> <category term="Bitbucket" /> <category term="Opensource" /> <category term="AppHarbor" /> <category term="NuGet" /> <title type="text">Vote for Native NuGet Support on AppHarbor to save your Repositories from The Bloatmonster</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;div style="text-align: center; font-weight: bold; font-size: 24px; background-color: #eeeeee; padding: 10px; border: solid 1px #999999;"&gt;&lt;a href="http://j.mp/ahNuGet"&gt;Vote for Native NuGet support on AppHarbor!&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;I was hoping to post tonight about how awesome BitBucket, AppHarbor and NuGet all worked together. Sadly, I hit a problem with getting NuGet to fetch packages on AppHarbor. First, some background...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Binaries in distributed version control systems are evil.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem with binaries in DVCS is that every clone pulls an entire copy of the repository (this is good, normally). If you have ten different revisions of a 10mb binary file, then your clone will include all of these copies - 100mb in total.&lt;/p&gt;

&lt;p&gt;David Ebbo posted about &lt;a href="http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html"&gt;using NuGet without committing packages to source control&lt;/a&gt;. The idea is that when you check out, you can use NuGet.exe to fetch all the packages based on your packages.config file. This means you can keep your repository lean, but still get all the required dependencies with little effort. In fact, David suggests a pre-build event that will run NuGet automatically! Unfortunately...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AppHarbor does not support build events&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means the pre-build event that executes NuGet to fetch the packages on a clean checkout, doesn't run, and the AppHarbor build will fail due to missing dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The fix is for AppHarbor to either support build events (tricky, for security reasons), or support NuGet natively, and allow us to tell AppHarbor to automatically execute NuGet to fetch our packages after checking the code out, but before running MSBuild.&lt;/p&gt;

&lt;p&gt;So, what are you waiting for? Go and &lt;a href="http://j.mp/ahNuGet"&gt;vote for NuGet support on AppHarbor&lt;/a&gt; so you can host your ASP.NET MVC applications there (for free, if not very big!) without needing to bloat your repositories with 400MB of NHibernate ;)&lt;/a&gt;

&lt;div style="text-align: center; font-weight: bold; font-size: 24px; background-color: #eeeeee; padding: 10px; border: solid 1px #999999;"&gt;&lt;a href="http://j.mp/ahNuGet"&gt;Vote for Native NuGet support on AppHarbor!&lt;/a&gt;&lt;/div&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/05/vote-for-native-nuget-support-on-appharbor-to-save-your-repositories-from-the-bloatmonster"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/XYbFy-5hbH8" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/XYbFy-5hbH8/vote-for-native-nuget-support-on-appharbor-to-save-your-repositories-from-the-bloatmonster" title="Vote for Native NuGet Support on AppHarbor to save your Repositories from The Bloatmonster" /> <feedburner:origLink>http://blog.dantup.com/2011/05/vote-for-native-nuget-support-on-appharbor-to-save-your-repositories-from-the-bloatmonster</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-04-30:/2011/04/formatting-powershell-objects-using-the-razor-engine</id> <published>2011-04-30T19:21:00Z</published> <updated>2011-04-30T23:20:00Z</updated> <category term=".NET" /> <category term="ASP.NET Razor" /> <category term="Opensource" /> <category term="Powershell" /> <category term="Bitbucket" /> <title type="text">Formatting PowerShell Objects using the Razor Engine</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I've been meaning to look into PowerShell for a while - it's been on an ever-growing list of things I'd like to learn more about. Recently I got around to spending some time with it and decided an interesting way to learn a little would be to create a module that allowed you to format objects using the Razor Engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; When writing this article, I forgot to mention you need to make Powershell run .NET 4 to be able to use Razor. I did this by creating powershell.exe.config and powershell_ise.exe.config files as &lt;a href="http://tfl09.blogspot.com/2010/08/using-newer-versions-of-net-with.html"&gt;explained here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The goal of the module is that you would be able to pipe some objects inand pass some template text, like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
PS&amp;gt; Get-Command | Format-Razor "Command: @Model.Name, @for (int i = 0; i &lt; 5; i++) { &lt;y&gt;@i&lt;/y&gt; }"
&lt;/pre&gt;

&lt;p&gt;Ok, so this sample isn't particularly useful, but you should get the idea. The string passed in could be read from a file, and the output could be written to a file. This will allow you to format objects using Razor, which I think it is a pretty cool templating language.&lt;/p&gt;

&lt;p&gt;When I opened PowerShell ISE to start coding, I actually expected this to be only a line or two of code, but it turned out to be a little more complicated. Because Razor compiles to code, and you'd likely only want to do this once regardless of how many times the template would be used, it's not as simple as just passing an object and a template into Razor. First we had to create the Razor Engine:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# Create an instance of the Razor engine for C#
$language = New-Object System.Web.Razor.CSharpRazorCodeLanguage
$host = New-Object System.Web.Razor.RazorEngineHost($language)
    
# Set some default properties for the Razor-generated class
$host.DefaultBaseClass = "TemplateBase" # This is our base class (created below)
$host.DefaultNamespace = "RazorOutput"
$host.DefaultClassName = "Template"

# Add any default namespaces that will be useful to use in the templates
$host.NamespaceImports.Add("System") | Out-Null

New-Object System.Web.Razor.RazorTemplateEngine($host)
&lt;/pre&gt;

&lt;p&gt;This sets up the Razor Engine with some fairly basic settings, including the name and namespace of the generated class, and also the base class. The base class is required to have a few things for Razor to be able to use it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A virtual Execute() method&lt;/li&gt;
&lt;li&gt;A Write(object) method, called when Razor outputs a variable/expression&lt;/li&gt;
&lt;li&gt;A WiteLiteral(object) method, called when Razor outputs literal content from the template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because it's not trivial (or certainly, I couldn't find a way) to create a class inside PowerShell, I cheated a little bit. To avoid including a binary .NET assembly, I compiled the base class from a string on the fly:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# HACK: To avoid shipping a DLL, we're going to just compile our TemplateBase class here
$baseClass = @"
using System.IO;
using System.Text;

	public abstract class TemplateBase
	{
		public StringBuilder Buffer { get; set; }
		public StringWriter Writer { get; set; }
		public dynamic $modelName { get; set; }

		public TemplateBase()
		{
			this.Buffer = new StringBuilder();
			this.Writer = new StringWriter(this.Buffer);
		}

		public abstract void Execute();

		public virtual void Write(object value)
		{
			WriteLiteral(value);
		}

		public virtual void WriteLiteral(object value)
		{
			Buffer.Append(value);
		}
	}
"@
    
# Set up the compiler params, including any references required for the compilation
$codeProvider = New-Object Microsoft.CSharp.CSharpCodeProvider
$assemblies = @(
	[System.Reflection.Assembly]::LoadWithPartialName("System.Core")
		.CodeBase.Replace("file:///", ""),
	[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.CSharp")
		.CodeBase.Replace("file:///", "")
)    
$compilerParams = New-Object System.CodeDom.Compiler.CompilerParameters(,$assemblies)
    
# Compile the template base class    
$templateBaseResults = $codeProvider.CompileAssemblyFromSource($compilerParams, $baseClass);
    
# Add the (just-generated) template base assembly to the compile parameters
$assemblies = $assemblies + $templateBaseResults.CompiledAssembly
	.CodeBase.Replace("file:///", "")
$compilerParams = New-Object System.CodeDom.Compiler.CompilerParameters(,$assemblies)
    
# Compile the Razor-generated code
$codeProvider.CompileAssemblyFromDom($compilerParams, $razorResult.GeneratedCode)
&lt;/pre&gt;

&lt;p&gt;This code first compiles the base class into an assembly, and then calls Razor to generate its own code, which is then compiled with a reference to the first assembly, which contains the base template class.&lt;/p&gt;

&lt;p&gt;Finally, we create an instance of the Razor-generated class which we'll finally use for the transformation:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# Grab the assembly that contains the Razor-generated classes
$assembly = $results.CompiledAssembly
    
# Create an instance of our Razor-generated class (this name is hard-coded above)
$type = $assembly.GetType("RazorOutput.Template")
[System.Activator]::CreateInstance($type)
&lt;/pre&gt;

&lt;p&gt;To perform a transformation, all we need to do is set the Model property on the Template, and then call the Execute method:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# Set the model to the current object, using the $modelName param so the user can customise it
$template.$modelName = $model
        
# Execute the code, which writes the output to our buffer
$template.Execute()
        
# "Return" the output for this item
$template.Buffer.ToString()
&lt;/pre&gt;

&lt;p&gt;And that's it, now we can format our objects using a Razor template, as shown earlier:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
PS&amp;gt; Get-Command | Format-Razor "Command: @Model.Name, @for (int i = 0; i &lt; 5; i++) { &lt;y&gt;@i&lt;/y&gt; }"
&lt;/pre&gt;

&lt;p&gt;The full source code is &lt;a href="http://code.dantup.com/psrazor"&gt;available here&lt;/a&gt;. Feel free to do with it as you wish. If you make any useful changes to it, please do send them over (you can send a Pull Request on Bitbucket if you like). This is my first PowerShell module, so I'm sure there's plenty that can be improved!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/04/formatting-powershell-objects-using-the-razor-engine"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/rTitfbkgtgw" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/rTitfbkgtgw/formatting-powershell-objects-using-the-razor-engine" title="Formatting PowerShell Objects using the Razor Engine" /> <feedburner:origLink>http://blog.dantup.com/2011/04/formatting-powershell-objects-using-the-razor-engine</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-04-27:/2011/04/markdownhelper-on-nuget-using-markdowndeep</id> <published>2011-04-27T13:58:00Z</published> <updated>2011-04-27T13:58:00Z</updated> <category term=".NET" /> <category term="ASP.NET MVC" /> <category term="ASP.NET Razor" /> <category term="Opensource" /> <category term="Bitbucket" /> <category term="NuGet" /> <title type="text">MarkdownHelper on NuGet, using MarkdownDeep</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Last month I &lt;a href="/2011/03/an-asp-net-mvc-htmlhelper-extension-method-for-markdown-using-markdownsharp"&gt;posted a small HtmlHelper&lt;/a&gt; to make transforming Markdown in an ASP.NET MVC application a little easier. Unfortunately, getting it up and running wasn't quite so easy... You had to go and download MarkdownSharp (or copy the code file from the Google Code site) and put it in your project, then copy/paste my code into a file, add the namespace to a Views/Web.config, and blah blah, you gave up already.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not any more!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I created a package called &lt;a href="http://nuget.org/List/Packages/MarkdownHelper"&gt;MarkdownHelper on NuGet&lt;/a&gt;. It took me less time to create the package than it took to get up and running previously, but now using the package is as simple as typing the following into the Package Manager Console...&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
PM&amp;gt; Install-Package MarkdownHelper
&lt;/pre&gt;

&lt;p&gt;... that's it! All done! Now in your views, you can simply type:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
@Html.Markdown(Model.YourMarkdownPropertyHere)
&lt;/pre&gt;

&lt;p&gt;This means you no longer have to copy/paste code around. This is mighty useful if you're using Markdown in multiple ASP.NET MVC applications.&lt;/p&gt;

&lt;p&gt;Rather than creating another assembly to import, the helper class will be put directly into your project (inside a cryptically named "Helpers" folder), though if this isn't the done thing, I can change it easily enough.&lt;/p&gt;

&lt;p&gt;Also worth noting that I changed from MarkdownSharp to MarkdownDeep.NET. In addition to being faster (which isn't really important unless you're transforming a &lt;em&gt;lot&lt;/em&gt; of text), it has a Javascript version that works transforms 100% the same, which will come in handy if you're writing an editor. Currently the package imports only the .NET version, though this might change as I add functionality.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/04/markdownhelper-on-nuget-using-markdowndeep"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/tNkfn08tAQ8" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/tNkfn08tAQ8/markdownhelper-on-nuget-using-markdowndeep" title="MarkdownHelper on NuGet, using MarkdownDeep" /> <feedburner:origLink>http://blog.dantup.com/2011/04/markdownhelper-on-nuget-using-markdowndeep</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-04-04:/2011/04/speeding-up-disqus-comments</id> <published>2011-04-04T12:36:00Z</published> <updated>2011-04-04T12:42:00Z</updated> <category term="Misc" /> <title type="text">Improving Performance of the Disqus Commenting System</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;With search engines using page loads times as a factor in ranking results, making sure your website loads quickly is becoming more and more important. Gone are the days when we used to say "If your website doesn't load in 10 seconds, people will go elsewhere". Nowadays, people expect websites to load in tenths of seconds, not seconds.&lt;/p&gt;

&lt;p&gt;There are a huge number of browser addons/tools that will help you measure the performance of your website, but my current favourite way to check is using &lt;a href="http://loads.in/"&gt;loads.in&lt;/a&gt;. Some of the things highlighted by loads.in when I entered the address of this blog were trivial to fix (loading Google's API and jQuery when neither are being used, for example!). Some others required a little more thought :(&lt;/p&gt;

&lt;p&gt;The next-slowest target was the &lt;a href="http://www.disqus.com"&gt;Disqus comments system&lt;/a&gt;. It wasn't particularly slow, but there was one part that frustrated me:&lt;/p&gt;

&lt;p&gt;The request for &lt;strong&gt;http://dantup.disqus.com/count.js&lt;/strong&gt; takes around 600ms and just returns a &lt;strong&gt;302 redirect&lt;/strong&gt; to &lt;strong&gt;http://mediacdn.disqus.com/1301599987/build/system/count.js&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm not entirely sure of the reason for this redirect, but it's adding 600ms to my page being ready. This extra round-trip will also be far slower on a mobile device, and with 3G tablets become more popular, it makes sense to try and eliminate this.&lt;/p&gt;

&lt;p&gt;This looks pretty easy to "fix", but before changing the path to be hard-coded to the mediacdn address, I asked Disqus if they saw any problems with this (after all, the redirect might be because the mediacdn address may change). Unfortunately, they &lt;a href="http://twitter.com/disqus/status/53566108380307456"&gt;weren't really sure&lt;/a&gt; if this would be a problem :(&lt;/p&gt;

&lt;p&gt;Another possible problem is that the redirect could be different depending on the user agent. If I hard-code it, this would be gone. After a little testing, I decided this wasn't the case, and the redirect was always the same (and this makes sense, because the work is still exactly the same regardless of the user agent - not to mention browser-sniffing this way being a terrible idea).&lt;/p&gt;

&lt;p&gt;I decided to give it a try anyway. It's just comment counts. If the URL changes, the comment counts will be broken until I notice. That's hardly the end of the world. So, my change looks like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
// Old Code
&amp;lt;script type="text/javascript"&amp;gt;
    var disqus_shortname = 'dantup';

    (function () {
        var s = document.createElement('script'); s.async = true;
        s.type = 'text/javascript';
        s.src = 'http://' + disqus_shortname + '.disqus.com/count.js';
        (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
    } ());
&amp;lt;/script&amp;gt;

// New Code
&amp;lt;script type="text/javascript"&amp;gt;
    var disqus_shortname = 'dantup';

    (function () {
        var s = document.createElement('script'); s.async = true;
        s.type = 'text/javascript';
        s.src = 'http://mediacdn.disqus.com/13015111111199987/build/system/count.js';
        (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
    } ());
&amp;lt;/script&amp;gt;
&lt;/pre&gt;

&lt;p&gt;I tested this using loads.in, and it actually took &lt;strong&gt;two full seconds&lt;/strong&gt; off the time until the onload event fired, from around 4s to 2s! As well as eliminating the extra round trip which was pretty slow, there's no longer a DNS lookup for dantup.disqus.com.&lt;/p&gt;

&lt;p&gt;So, assuming Disqus don't change this, it looks like a fairly safe way to speed up a site with Disqus comment counts. &lt;strong&gt;If you're going to try it yourself, be sure you work out the correct count.js path by following your own redirect!&lt;/strong&gt; I edited the numbers in the URL of my sample code to avoid people copy/pasting my URL in.&lt;/p&gt;

&lt;p&gt;I'd love to see Disqus eliminate this roundtrip themselves, so everybody using Disqus would get this little boost. Until then, this seems to be a decent workaround.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/04/speeding-up-disqus-comments"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/BNjW_54pxxQ" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/BNjW_54pxxQ/speeding-up-disqus-comments" title="Improving Performance of the Disqus Commenting System" /> <feedburner:origLink>http://blog.dantup.com/2011/04/speeding-up-disqus-comments</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-03-26:/2011/03/writing-comments-in-code-is-not-a-waste-of-time</id> <published>2011-03-26T15:07:00Z</published> <updated>2011-03-26T15:07:00Z</updated> <category term=".NET" /> <category term="Google App Engine" /> <category term="Google Code" /> <category term="LINQ to SQL" /> <category term="WPF" /> <category term="XNA" /> <title type="text">Writing Comments in Code is *NOT* a Waste of Time</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I was recently discussing the value of comments in code with some colleagues. After the discussion, one of them sent me a link to "&lt;a href="http://riyadsthoughts.blogspot.com/2011/01/dont-waste-your-time-commenting-source.html"&gt;Don't Waste Your Time Commenting Source Code&lt;/a&gt;" written by Riyad Mammadov.&lt;/p&gt;

&lt;p&gt;I have to say I'm both shocked and disappointed that there are developers out there that have this opinion. And there seems to be quite a &lt;em&gt;lot&lt;/em&gt; of them. I'm quite passionate about code comments because I spend the huge majority of my time maintaining/debugging/fixing code written by other people that has no comments (other than commented out code...). I waste an enormous amount of time stepping through code with a debugger, just trying to understand WTF it's trying to do.&lt;p&gt;

&lt;p&gt;I know some developers that always respond "The code is self-explanatory". This is a garbage excuse from a lazy programmer. There are a few reasons why this argument is not valid:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It might be self-explanatory to you, but there are other developers here that may need to maintain your code, some less skilled than others.&lt;/li&gt;
&lt;li&gt;Unless you're a compiler, reading an English comment is &lt;em&gt;far quicker&lt;/em&gt; than parsing code in your head.&lt;/li&gt;
&lt;li&gt;It's rarely clear from code &lt;em&gt;why&lt;/em&gt; it does what it does.&lt;/li&gt;
&lt;li&gt;Reading code only helps you understand what it &lt;em&gt;does&lt;/em&gt;, not what it was &lt;em&gt;intended to do&lt;/em&gt;. This would be fine if you wrote flawless code. You don't.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In addition to this, we often have to write less-than-ideal code. You might find a bug, and to work around it, change some nice clean code to something a little bit hacky. If you don't comment why, there are good chances that someone will come along, think "WTF, this could be done better" and refactor your code, re-introducding the bug. A simple comment saying "Can't do this using X, because it causes Y to fail" could save a lot of time and effort.&lt;/p&gt;

&lt;p&gt;Back to some of the points made in Riyad's article...&lt;/p&gt;

&lt;blockquote&gt;I strongly believe that 90% of source code comments are a waste of time&lt;/blockquote&gt;

&lt;p&gt;I think Riyad is a little confused between code with crap comments, and code that doesn't need commenting. I can't possible agree that only 10% of all code written is worth commenting. I might agree that only 10% of code comments are useful, but that just means the developers are failing at writing good comments, not that the idea of writing comments is bad. A &lt;em&gt;huge&lt;/em&gt; portion of useless comments on code could be replaced with useful comments.&lt;/p&gt;

&lt;blockquote&gt;if you think about it, a well-designed program doesn't need comments to be maintainable&lt;/blockquote&gt;

&lt;p&gt;This really is tripe. Code does not convey the *reason* you are writing it. Here's an example from some real code:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
// When the transition finishes, hide the screen. We don't remove it,
// because we want it to come back when the covering screen is dismissed
this.ScreenState = ScreenState.Hidden;
&lt;/pre&gt;

&lt;p&gt;Without the comment, it might not be clear why the screen is being hidden, instead of being removed. Somebody that's not familiar with the code (which, six months after it being written, is everybody, including the author). The comment makes this pretty clear &lt;em&gt;why&lt;/em&gt; the code does what it does.&lt;/p&gt;

&lt;blockquote&gt;
If the choice is between a well-designed program without comments and a thoroughly commented but poorly architected one, I will choose the former any day of the week
&lt;/blockquote&gt;

&lt;p&gt;I don't understand the logic here. There is some suggestion that writing comments comes with a penalty that somehow affects the architecture of your system. I think a more valid comparison whould be "Unfinished, but commented code" vs "Finished, but uncommented code", and I would absolutely take the commented code any day. It's unlikely that it'd take longer to finish a well written, well commented application than it would to try and understand thousands of lines of uncommented code.&lt;/p&gt;

&lt;p&gt;Riyad shows some sample code to illustrate his point:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
/**
 * Always returns true.
 */
public boolean isAvailable() {
    return false;
}
&lt;/pre&gt;

&lt;p&gt;There's no argument here. This comment is pointless. However, there's some suggestion that because this comment is pointless, this code does not need commenting. That is absolutely not the case. The comment is crap. It should be replaced with one that is not crap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not writing code comments because some people write crap comments is like not writing code because some people write crap code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sadly the biggest loser in all this is not the developer that's not writing comments, but his colleagues. They'll struggle to maintain his uncommented code while he easily understands their well-commented code :(&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/03/writing-comments-in-code-is-not-a-waste-of-time"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/C2ZfIILGPJs" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/C2ZfIILGPJs/writing-comments-in-code-is-not-a-waste-of-time" title="Writing Comments in Code is *NOT* a Waste of Time" /> <feedburner:origLink>http://blog.dantup.com/2011/03/writing-comments-in-code-is-not-a-waste-of-time</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-03-16:/2011/03/windows-phone-7-part-deux</id> <published>2011-03-16T21:30:00Z</published> <updated>2011-03-19T18:56:00Z</updated> <category term=".NET" /> <category term="Mobile Phones" /> <category term="Windows Phone 7" /> <category term="XNA" /> <title type="text">Windows Phone 7 Part Deux</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;&lt;strong&gt;Update (19th March):&lt;/strong&gt; I've added some additional info I received at the end of the post.&lt;/p&gt;

&lt;p&gt;It's been a funny week. My blog usually receives a few hundred visitors per day. This weekend, I published a post titled "&lt;a href="/2011/03/why-im-close-to-giving-up-on-windows-phone-7-as-a-user-and-a-developer"&gt;Why I'm Close to Giving Up on Windows Phone 7, as a User and a Developer&lt;/a&gt;", sharing my frustrations with Windows Phone 7. I hoped that someone from Microsoft might read and respond to it. I wasn't really expecting the attention the post got during the last 24 hours.&lt;/p&gt;

&lt;p&gt;The post had over 40,000 visitors in a 12-hour period yesterday (which cost me exactly £0.00 in hosting - go App Engine!) and was &lt;a href="http://www.businessinsider.com/why-im-close-to-giving-up-on-windows-phone-7-as-a-user-and-a-developer-2011-3"&gt;republished by BusinessInsider&lt;/a&gt;. Today, I had a call with &lt;a href="http://www.manyniches.com/"&gt;Brandon Watson&lt;/a&gt;, Director, Dev Platform &amp; Ecosystem and &lt;a href="http://twitter.com/benlower"&gt;Ben Lower&lt;/a&gt;, Senior Product Manager, Dev Platform &amp; Ecosystem.&lt;/p&gt;

&lt;p&gt;This was somewhat unexpected.&lt;/p&gt;

&lt;p&gt;Given they'd taken time to call me, I thought it was fair I take time to post some of the things we discussed (I hope I understood them right - the line was pretty bad). It sounds like they're taking the feedback seriously and didn't seem too annoyed with the bad PR I might have created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weak UK Launch / Knowledge of Operator Employees&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The fact the UK launch was weak (to say the least) didn't sound like a surprise to Brandon. He explained the marketing budget was of course much smaller than in the states and that it's difficult to get info into shops (Microsoft are far divorced from the stores).&lt;/p&gt;

&lt;p&gt;This certainly explains the poor support my colleague got from Virgin, who didn't seem to know what the Zune software was or why there had been an update. However, I wonder whether this is the whole picture - it seemed to take a long time for stores to even start getting their first handsets, so I still wonder whether a problem supplying the devices resulted in a deliberate reduction in marketing during the first few weeks.&lt;/p&gt;

&lt;p&gt;I think this is something Microsoft &lt;em&gt;must&lt;/em&gt; work to address. Apple have their own stores across the country, so the people selling the devices are their employees. Microsoft don't have this luxury and will need to work far harder to ensure the same quality of information and hardware availability at point of sale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieving Error Logs from Retail Devices&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I brought up the issue of my SMS bug. I was willing to help Microsoft to try and diagnose the issue if they could get logs from my device. Brandon pointed out that the real issue here was that the parts of the software that allow sending of logs to Microsoft are removed from retail builds of the OS - only developer builds are able to do this.&lt;/p&gt;

&lt;p&gt;This seems a little naive to me. There are a ton of developers out there that are very good at reporting bugs and they'll almost all have retail devices with a retail build of the OS. Brandon said he'd discuss the possibility of having this functionality included and enabled when a phone becomes developer unlocked. I think it's really important this is done if Microsoft want to be able to track down and resolve issues in a timely fashion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SMS &amp; Bluetooth Bugs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Brandon said he'd try and find out whether the SMS and Bluetooth bugs I specifically mentioned may be fixed in NoDo. I'm not too fussed about the SMS issue (it's never happened since), but the bluetooth issue happens daily and is so annoying to me that I'll seriously consider swapping phones if it's not addressed soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Way for Users/Devs to Report Bugs&lt;/strong&gt;&lt;p&gt;

&lt;p&gt;I was really frustrated with not being able to report bugs in WP7 to Microsoft in a structured way. Developer-focused products at Microsoft use &lt;a href="http://connect.microsoft.com/"&gt;Connect&lt;/a&gt;, but WP7 seems to be excluded. People are more than happy to help by submitting bugs, if they knew where to send them!&lt;/p&gt;

&lt;p&gt;Ben suggested the idea of using a service like &lt;a href="http://uservoice.com/"&gt;UserVoice&lt;/a&gt; to allow collection of issues and voting. I'm not sure why this would be better than Connect, but it sounds like a reasonable idea. Even a wiki page would be better than the "current system"!&lt;/p&gt;

&lt;p&gt;I had a quick search and noticed there's a &lt;a href="http://http://windowsphone7community.uservoice.com."&gt;Windows Phone 7 Community UserVoice&lt;/a&gt; forum already. Not sure if this is official in any way, but if not, I do hope an official account is set up and monitored by Microsoft.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slow Updates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is quite a big one, but sadly, the one with least info. I suggested it was ridiculous that such a big company can take so long to get an update out. Brandon pointed out that in reality, bigger companies move slower. I don't really think this is a good excuse - if policies and processes mean it takes 5 months to release an update, then the policies and processes need improving. If a big company can't work as efficiently as a small company, then the big company should act as smaller companies.&lt;/p&gt;

&lt;p&gt;You probably saw the &lt;a href="http://windowsteamblog.com/windows_phone/b/windowsphone/archive/2011/03/10/phone-updates-process-and-timing.aspx"&gt;recent blog post&lt;/a&gt; by Eric Hautala. He's the new guy, and his job is delivering updates. Eric's appointment looks like acknowledgement that Microsoft know they have work to do in this area, so we'll have to see how things evolve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Visibility of Incoming Fixes / Release Notes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I raised the issue of nobody knowing what's in NoDo other than the few features that have been announced. Brandon agreed that some sort of release notes should definitely be included (and are, for many of the development products) and said he'd look into it. Apple provide release notes for all of their updates, though I'd prefer to see Microsoft go one step further and publish them &lt;em&gt;before&lt;/em&gt; the update. If Microsoft need inspiration, they should take a look at how Blizzard manage releases for World of Warcraft; &lt;a href="http://eu.battle.net/wow/en/game/patch-notes/ptr-patch-notes"&gt;Patch notes&lt;/a&gt; are posted and updated constantly before launch, and go into great detail. I'd love to see this kind of transparency from Microsoft.&lt;/p&gt;

&lt;p&gt;I think I've covered the main points we discussed. The conversation was positive, but it was only talk. It'll take time to see whether Microsoft is really moving forwards. If I receive any additional info or responses from Brandon or Ben, I'll post about them.&lt;/p&gt;

&lt;p&gt;One thing is clear from this experience; Microsoft care about developers. Apple failed to respond to the massive WiFi issues in iOS4.2.1 during the 5 months it took them to fix it, whereas within 24 hours of my post getting attention, I'd been contacted by around 6 Microsoft employees, including Brandon Watson. Let's hope the enthusiasm for getting in touch with me turns into results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update (19th March):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since posting, I received a little additional info:&lt;/p&gt;

&lt;p&gt;Connect &lt;em&gt;is&lt;/em&gt; still being used for Windows Phone 7, though it is restricted to certain closed/invite-only programs (eg. for MO/OEMs/Devs that had development devices pre-launch). A public connect will require a better structure to deal with the volume of cases. I got the impression this is being evaluated, though no commitment.&lt;/p&gt;

&lt;p&gt;UserVoice is also being evaluated as an option for user (non-dev) feedback. Fingers crossed if this doesn't pan out, we get an equivalent at least.&lt;/p&gt;

&lt;p&gt;It seems that these guys agree that being big isn't an excuse for being slow, and they're committed to improving things and making things move efficiently.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://live.visitmix.com/"&gt;MIX&lt;/a&gt;. April 12 - 14, Las Vegas. ;)&lt;/p&gt;

&lt;p&gt;Also - Brandon sent me a link to the &lt;a href="http://www.microsoft.com/windowsphone/en-us/features/update-schedule.aspx"&gt;Windows Phone 7 update schedule&lt;/a&gt;. There's some excellent info there. I looks like MS are really taking user feedback onboard - this gives me faith :-)&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/03/windows-phone-7-part-deux"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/cElYNnsh-MU" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/cElYNnsh-MU/windows-phone-7-part-deux" title="Windows Phone 7 Part Deux" /> <feedburner:origLink>http://blog.dantup.com/2011/03/windows-phone-7-part-deux</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-03-14:/2011/03/an-asp-net-mvc-htmlhelper-extension-method-for-markdown-using-markdownsharp</id> <published>2011-03-14T18:45:00Z</published> <updated>2011-04-28T15:03:00Z</updated> <category term=".NET" /> <category term="ASP.NET MVC" /> <category term="ASP.NET Razor" /> <category term="Opensource" /> <title type="text">An ASP.NET MVC HtmlHelper Extension Method for Markdown using MarkdownSharp</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I &lt;a href="/2011/04/markdownhelper-on-nuget-using-markdowndeep"&gt;changed from using MarkdownSharp to MarkdownDeep.NET&lt;/a&gt; and &lt;a href="http://nuget.org/List/Packages/MarkdownHelper"&gt;pushed the helper to NuGet&lt;/a&gt; to make it easier to use. Sure, it's only a few lines of code, but this way one command will import the MarkdownDeep.NET library and add the namespace to your views Web.config easily. It'll also make updates much simpler if you use it in many places :-)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;One of the goals for my new blogging engine in ASP.NET MVC/Razor is to store all of my articles using &lt;a href="http://en.wikipedia.org/wiki/Markdown"&gt;Markdown&lt;/a&gt; instead of HTML. If you don't know what Markdown is, go read. I'll wait... If you've used StackOverflow much, you're probably already familiar with it, even if you didn't know it by name.&lt;/p&gt;

&lt;p&gt;Since I first started working on content management systems many moons ago, there was something I disliked about using HTML to store content. Even with strides towards semantic markup, HTML felt a little clunky as a storage format. I wanted something better.&lt;/p&gt;

&lt;p&gt;I tried many things to "solve" this problem, including creating my own XML markup for content, which I could transform into HTML for displaying on the website (or plain text, if required). &lt;strong&gt;This was totally stupid&lt;/strong&gt;, and I permit for you to laugh at me (just this once, mind). My XML was 95% the same as HTML. Duh. It made more sense to just store HTML, and convert that into other formats if required, but this still didn't feel right.&lt;/p&gt;

&lt;p&gt;As years went by, I really learned to hate rich HTML editors. They usually generate crap markup (why are there 50 divs wrapped around my content?!), and often destroyed relative paths in links and images. They also didn't work on mobile versions of most browsers, meaning I couldn't even fix simple typos when away from my computer. I was sure there had to be a better way, but unfortunately at the time of building this blog, I couldn't find one. As a result, all of the articles currently on this blog are hand-typed HTML in a &amp;lt;textarea&amp;gt;! This has an advantage of working on my iPad, but it kinda sucks. It makes me cry a little inside every time I create a post.&lt;/p&gt;

&lt;h2&gt;Enter, Markdown&lt;/h2&gt;

&lt;p&gt;Over the past few years, I've been using &lt;a href="http://stackoverflow.com/users/25124"&gt;StackOverflow&lt;/a&gt; quite a lot and I've really grown to love the editor they use, which uses Markdown for formatting. The more I use it, the more I think it's what I should be using for my blog. Not only is the markup much simpler than hand-crafting HTML, it's 100% human-readable in text format and also editable on my iPad!&lt;/p&gt;

&lt;p&gt;To test out how this could work, I decided to knock up a quick prototype in ASP.NET MVC/Razor. The code used to transform StackOverflow's content server-side was opensourced under the name &lt;a href="http://code.google.com/p/markdownsharp/"&gt;MarkdownSharp&lt;/a&gt;, so I grabbed that. The project includes a lot of files, but these are mostly tests. The file Markdown.cs is all you need to transform text. I didn't expect it to be difficult, but it still turned out to be far simpler and far more elegant than I was expecting!&lt;/p&gt;

&lt;h2&gt;Creating an HtmlHelper Extension Method&lt;/h2&gt;

&lt;p&gt;The best way to use Markdown in an MVC view would be by creating an extension method on the Html property (an instance of HtmlHelper&amp;lt;T&amp;gt; of a view. This will allow us to transform text very easily, like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
@Html.Markdown(Model.Body)
&lt;/pre&gt;

&lt;p&gt;To do this, we need to create an extension method on HtmlHelper. We do this by using the class we'd like to extend as the first argument, but prefixing it with the keyword "this":&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
/// &amp;lt;summary&amp;gt;
/// Helper class for transforming Markdown.
/// &amp;lt;/summary&amp;gt;
public static class MarkdownHelper
{
	/// &amp;lt;summary&amp;gt;
	/// An instance of the Markdown class that performs the transformations.
	/// &amp;lt;/summary&amp;gt;
	static Markdown markdownTransformer = new Markdown();

	/// &amp;lt;summary&amp;gt;
	/// Transforms a string of Markdown into HTML.
	/// &amp;lt;/summary&amp;gt;
	/// &amp;lt;param name="helper"&amp;gt;HtmlHelper - Not used, but required to make this an extension method.&amp;lt;/param&amp;gt;
	/// &amp;lt;param name="text"&amp;gt;The Markdown that should be transformed.&amp;lt;/param&amp;gt;
	/// &amp;lt;returns&amp;gt;The HTML representation of the supplied Markdown.&amp;lt;/returns&amp;gt;
	public static IHtmlString Markdown(this HtmlHelper helper, string text)
	{
		// Transform the supplied text (Markdown) into HTML.
		string html = markdownTransformer.Transform(text);

		// Wrap the html in an MvcHtmlString otherwise it'll be HtmlEncoded and displayed to the user as HTML :(
		return new MvcHtmlString(html);
	}
}
&lt;/pre&gt;

&lt;p&gt;It's important to note that you need to wrap the resulting string in an MvcHtmlString (or other IHtmlString) to stop the framework from HtmlEncoding the output, since in this case the result is deliberately HTML that should be rendered by the browser.&lt;/p&gt;

&lt;p&gt;In order to be able to use this method in our views without having to import namespaces, we can add the namespace to the web.config file, like this:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;pages&amp;gt;
	&amp;lt;namespaces&amp;gt;
		&amp;lt;add namespace="DanTup.Web" /&amp;gt;
	&amp;lt;/namespaces&amp;gt;
&amp;lt;/pages&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Now in our view, we'll see our Markdown method in the intellisense once we've typed "Html.", allowing us to pass in the string we'd like to transform.&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;div id="content"&amp;gt;
	&amp;lt;h2&amp;gt;@Model.Title&amp;lt;/h2&amp;gt;
	@Html.Markdown(Model.Body)
&amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;p&gt;In addition to transforming data in your model, you could also pass a string in directly if you wish to keep your markup a little clearer:&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;div id="sidebar"&amp;gt;
@Html.Markdown(@"
Links
---

* [Danny Tuppeny](http://blog.dantup.com/)
* [Andrew Nurse](http://vibrantcode.com/)
")
&amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Unfortunately if you add indenting you'll get strange issues (since indenting means something in Markdown), but for a simple hard-coded list of links/etc. this might be more elegant than ahrd-coding UL/Hyperlinks!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/03/an-asp-net-mvc-htmlhelper-extension-method-for-markdown-using-markdownsharp"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/Q5qtNoj63AU" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/Q5qtNoj63AU/an-asp-net-mvc-htmlhelper-extension-method-for-markdown-using-markdownsharp" title="An ASP.NET MVC HtmlHelper Extension Method for Markdown using MarkdownSharp" /> <feedburner:origLink>http://blog.dantup.com/2011/03/an-asp-net-mvc-htmlhelper-extension-method-for-markdown-using-markdownsharp</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-03-12:/2011/03/why-im-close-to-giving-up-on-windows-phone-7-as-a-user-and-a-developer</id> <published>2011-03-12T12:12:00Z</published> <updated>2011-03-19T18:54:00Z</updated> <category term=".NET" /> <category term="Games" /> <category term="Mobile Phones" /> <category term="Windows Phone 7" /> <category term="XNA" /> <title type="text">Why I'm Close to Giving Up on Windows Phone 7, as a User and a Developer</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; A few days after posting this, I had a call with &lt;a href="http://www.manyniches.com/"&gt;Brandon Watson&lt;/a&gt;, Director, Dev Platform &amp; Ecosystem and &lt;a href="http://twitter.com/benlower"&gt;Ben Lower&lt;/a&gt;, Senior Product Manager, Dev Platform &amp; Ecosystem. &lt;a href="/2011/03/windows-phone-7-part-deux"&gt;I've posted a little update here&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Note: This is a pretty long post, but it's the only way to get across why I'm suddenly so disappointed in Windows Phone 7 - a platform I've been so excited about for so long. I really hope someone on the WP7 team takes the time to read it to the end. I'm probably not unique in having these feelings.&lt;/p&gt;

&lt;p&gt;It's a harsh title, so first, a little background...&lt;/p&gt;

&lt;p&gt;I've been waiting for Windows Phone 7 for around 10 years. Really! &lt;small&gt;See what I did there? :)&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;In 2001 I finished my A-Levels and got a job as a web programmer. I lived with my parents and had plenty of cash to &lt;s&gt;waste&lt;/s&gt;spend. One of the first gadgets I bought was a &lt;a href="http://en.wikipedia.org/wiki/IPAQ"&gt;Compaq iPaq&lt;/a&gt;. I convinced myself that it was really useful, and that it saved me lots of time, but in reality, it was horrid. The Windows operating system was slow and sluggish and the usability was pretty awful. I had to buy a sleeve that made the device twice as thick and a huge WiFi card just to allow it to connect to anything. It was crap, but I loved it anyway.&lt;/p&gt;

&lt;p&gt;When Microsoft released the .NET Compact Framework, I was so excited. I could now write my own applications to run on this device that would fit in my pocket. Awesome! Except, it wasn't. The device was still a pain in the ass to use and the performance still sucked. The ideas were great. The execution was terrible.&lt;/p&gt;

&lt;p&gt;It wasn't long before I picked up an &lt;a href="http://en.wikipedia.org/wiki/O2_Xda"&gt;XDA&lt;/a&gt;, so I no longer had to carry both a mobile phone and a PDA. Good times! Or not. The mobile version of Windows was still pretty bad.&lt;/p&gt;

&lt;p&gt;Over the coming years, I bought practically every Windows mobile device I could afford. I lived in hope that this new device would be nice and snappy, and Microsoft will have improved the OS and added functionality. It never happened, but it didn't stop me throwing money at them each time, in hope.&lt;/p&gt;

&lt;p&gt;Fast forward a few more years, and I'd been playing with Managed DirectX. The idea of programming games in C# was pretty exciting. Ultimately this became XNA, and the Zune wasn't far behind. I really wanted a Zune, but the UK launch was delayed and delayed, and ultimately never happened.&lt;/p&gt;

&lt;p&gt;When Apple released the iPhone, I started to wonder if the reason we hadn't seen a Zune in the UK was that Microsoft were holding back to release a ZunePhone. Despite waiting and waiting, this didn't happen.&lt;/p&gt;

&lt;p&gt;During this time (since 2001), my career was built on building web applications in Microsoft technologies. My life is well and truly in the Microsoft camp. I love .NET, I love C# and I love Visual Studio. It made me die a little inside every time I had to do some work in PHP or fire up Eclipse...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;However... In 2008, I ditched my Windows-based XDA and bought an iPhone&lt;/strong&gt;. Sorry Microsoft, I'd been waiting for 7 years, and you still hadn't delivered.&lt;/p&gt;

&lt;p&gt;I loved my iPhone. It made me sad that there was no competition from Microsoft. I even started working on &lt;a href="http://j.mp/newcastleapp"&gt;iPhone&lt;/a&gt; &lt;a href="http://j.mp/cardiffapp"&gt;apps&lt;/a&gt;. I really hate Mac OSX, Objective-C, and XCode. But I had to go with the market.&lt;/p&gt;

&lt;p&gt;Imagine how excited I was when Microsoft announced Windows Phone 7! I can ditch this Apple nonsense and develop applications in C#, Visual Studio, XNA, Silverlight! Finally, Microsoft are putting their weight into a promising mobile platform. Despite previous failures, this time, I have hope that they can really do it.&lt;/p&gt;

&lt;p&gt;Through my company, I was able to get access to a developer WP7 device from Microsoft. The hardware was a little shoddy, but the OS was &lt;em&gt;very&lt;/em&gt; promising. Everything was looking good!&lt;/p&gt;

&lt;p&gt;I'd convinced my company we should be working on a Windows Phone 7 version of our iPhone apps, and I resisted picking up an iPhone4 because Windows Phone 7 was the way forward. I kept my eyes open for a UK launch date in the hope it wouldn't overlap with my holiday in Orlando, so I could get one right away. As luck would have it, the launch was announced as a few weeks before my holiday!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is where it started to go wrong...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As we got closer to launch, I noticed there seemed to be a huge lack of advertising. I started to doubt whether the launch would be met at all. I started calling around local stores, and nobody knew anything about the launch. WTF? How can they not know about &lt;em&gt;Microsoft's competitor to the iPhone?!&lt;/em&gt; I popped into a Carphone Warehouse over the road from the office where I work on launch day. The staff knew &lt;em&gt;nothing&lt;/em&gt; about WP7. I called all the local Orange stores, hoping for a HTC Mozart. &lt;em&gt;Nobody knew when, or if, they would be getting any Windows Phone 7 devices&lt;/em&gt;. Wow.&lt;/p&gt;

&lt;p&gt;I wasn't giving up that easily, so I spent the next few weeks (getting close to my Orlando holiday) trying to track down a device. Eventually, I found that a local O2 store had HTC HD7s in stock. I rushed down there, and managed to convince them to sell me one as Pay-As-You-Go (since I'm on, and very happy with, &lt;a href="http://j.mp/ggjoin"&gt;giffgaff&lt;/a&gt;). I was made up! Windows Phone 7 was awesome. Just being able to pin a tile for my wife and see calendar appointments on the homescreen was enough for me to purchase it over an iPhone!&lt;/p&gt;

&lt;p&gt;Then I went on holiday to Orlando. I took loads of geo-tagged pics, and was genuinely really impressed with the phone. Congratulations Microsoft. You've finally done it. But still, where is all the fanfare? You need to show people how awesome this phone is - then you'll sell bucket-loads!&lt;/p&gt;

&lt;p&gt;As time went on, cracks started to show. There were bugs. Many bugs. At one point, the SMS message store for my wife got corrupt, which meant I couldn't send, or read, text messages to/from her. I got in touch with the UK WP7 developer advocate that had sorted out the developer phone for my company, and explained the issue. After many emails going back and forth I was told that there may be logs on my phone that would help Microsoft track down this issue &lt;strong&gt;but security procedures do not allow them to share a tool to get the logs off my device&lt;/strong&gt;. I was instead, told to try a factory reset. This fixed the issue, but Microsoft were no closer to finding/fixing the bug.&lt;/p&gt;

&lt;p&gt;Another pretty annoying bug was that the bluetooth randomly disconnects from my car. Frequently. About every 2-3 minutes. If I'm on a call when this happens, the call stays open, but just normally via the handset in my pocket. As you can imagine - I can't hear the person at the other end, and they can't hear me. 10-20 seconds later, it reconnects, and the call continues.&lt;/p&gt;

&lt;p&gt;Because I preferred coding in VS/C# so much, I started work on a Windows Phone 7 game in my spare time. I even got a few colleagues to join in by creating their own games, as part of an XNA coding competition. Most of these guys had never even coded C#, never mind written a game!&lt;/p&gt;

&lt;p&gt;My game is called &lt;a href="http://badgerquestgame.com"&gt;Badger Quest&lt;/a&gt;, and currently has a few playable levels. There are no videos online yet, but you can see how it looks from the background on &lt;a href="http://twitter.com/BadgerQuestGame"&gt;the Twitter page&lt;/a&gt;. It'll be pretty similar to Mario, though played by tapping buttons on the screen to use your abilities (jump, turn, throw, slash, etc.) which are limited in number.&lt;/p&gt;

&lt;p&gt;As time went by, I started to have doubts. WP7 handsets weren't selling very well. The marketplace was buggy (eg. returns to the "Xbox LIVE" filter when you press "Back" from looking at an "indie" game). I started to wonder how seriously Microsoft were taking their platform. The OS was great, but how they responded to initial feedback and bug reports (and how quickly) would ultimately decide the fate of the platform.&lt;/p&gt;

&lt;p&gt;With a huge outcry over the lack of Copy &amp; Paste, Microsoft announced there would be an update in January that would add this. Excellent - if we don't get the bugfixes before then, they'll be in that update. All will be good.&lt;/p&gt;

&lt;p&gt;Sadly, it wasn't good. The update was delayed. And delayed. There was zero transparency from Microsoft. Despite the rest of the company making huge strides in this area over the previous few years, Windows Phone 7 is a quiet, closed box. Nobody knew what was happening with the update, and more importantly, the bug fixes.&lt;/p&gt;

&lt;p&gt;Eventually, an update started to roll out. Yay! Only, we quite quickly discovered it wasn't NoDo. It was a pre-update update. An update that updates the update system. Why couldn't this just be bundled with NoDo?! More annoying was that Microsoft didn't announce this update until &lt;em&gt;after&lt;/em&gt; they started pushing it. They told us &lt;em&gt;nothing&lt;/em&gt; about what it did.&lt;/p&gt;

&lt;p&gt;Then it got worse. One of my colleagues was prompted to install his update. He connected his phone as described, and the update started. Then it failed. It gave an error saying his phone was not updated, and could not be rolled back. He tried all sorts of resets, with no luck. &lt;strong&gt;His phone was bricked&lt;/strong&gt;. As I'd been one of the people that had suggested he get a WP7, I felt pretty bad. He spent the next day being bounced between Microsoft, Virgin and Samsung, trying to get his phone working. &lt;strong&gt;During this time, he could not use his phone in any way&lt;/strong&gt;. The staff at Virgin and Samsung knew very little about WP7 and more specifically, this update. Eventually, Virgin agreed to send him a new handset.&lt;/p&gt;

&lt;p&gt;Fast forward a few more days, and we're all still waiting for NoDo, and our bugfixes. It's been over four months and we've still had &lt;strong&gt;zero&lt;/strong&gt; bugfixes. Rumours start spreading across the web that NoDo has been delayed. Again, it takes a week before Microsoft finally come out and tell us what's going on.&lt;/p&gt;

&lt;p&gt;Hopefully if you've read this far, you now know why I'm starting to have serious doubts about Windows Phone 7. If Microsoft can't turn around bugfixes in a timely fashion, what's going to happen when people start finding exploits (and they &lt;em&gt;will&lt;/em&gt; find exploits)?&lt;/p&gt;

&lt;p&gt;Of course, if I'm not confident in the platform as a user, I can't be as a developer. I've put my Windows Phone 7 development on hold. I can't commit to spending more time on a platform that Microsoft seems to be sending the way of previous versions. I still believe the OS is excellent, but sadly, that's only half the battle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'm not giving up, just yet&lt;/strong&gt;. I truly believe Windows Phone 7 can be something brilliant, but there are definitely issues that need addressing. To show how seriously I believe Microsoft &lt;em&gt;could&lt;/em&gt; make this work, I've applied to go and work for the Windows Phone team via the &lt;a href="https://careers.microsoft.com/"&gt;Microsoft Careers&lt;/a&gt; website. If Microsoft want to make Windows Phone 7 better, here's an offer for another set of hands to test the platform. I'm serious - I'd relocate from the UK to the US to help work on making Windows Phone 7 better, because I think it &lt;strong&gt;could&lt;/strong&gt; have a strong future.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/03/why-im-close-to-giving-up-on-windows-phone-7-as-a-user-and-a-developer"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/5Hx35zOJM5E" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/5Hx35zOJM5E/why-im-close-to-giving-up-on-windows-phone-7-as-a-user-and-a-developer" title="Why I'm Close to Giving Up on Windows Phone 7, as a User and a Developer" /> <feedburner:origLink>http://blog.dantup.com/2011/03/why-im-close-to-giving-up-on-windows-phone-7-as-a-user-and-a-developer</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-02-27:/2011/02/is-google-app-engine-having-performance-issues</id> <published>2011-02-27T12:36:00Z</published> <updated>2011-02-27T12:36:00Z</updated> <category term="Google App Engine" /> <category term="Google Apps" /> <title type="text">Is Google App Engine Having Performance Issues?</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;While clicking through &lt;a href="https://www.google.com/webmasters/tools/"&gt;Google Webmaster Tools&lt;/a&gt; recently, I noticed an interesting performance chart. It looks like since January, the performance of this blog has gone down the crapper. I've made zero code changes that could account for this, so my assumption is that it must be something on App Engine. Interestingly, around the start of January, Google App Engine rolled out the &lt;a href="http://googleappengine.blogspot.com/2011/01/announcing-high-replication-datastore.html"&gt;High Replication Datastore&lt;/a&gt; option, so I wonder if this may be related.&lt;/p&gt;

&lt;img src="/pi/gae_performance.png" /&gt;

&lt;blockquote&gt;
&lt;strong&gt;Performance overview&lt;/strong&gt;
&lt;p&gt;On average, pages in your site take 14.3 seconds to load (updated on Feb 19, 2011). This is slower than 98% of sites. These estimates are of low accuracy (fewer than 100 data points). The chart below shows how your site's average page load time has changed over the last few months. For your reference, it also shows the 20th percentile value across all sites, separating slow and fast load times&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sounds a bit pants, eh? :(&lt;/p&gt;

&lt;p&gt;Strangely, the app is responding very quickly here, so it's possible the issue is only affecting GoogleBot. Either way, something appears to have changed, somewhere!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/02/is-google-app-engine-having-performance-issues"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/u2v0iM5fE2M" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/u2v0iM5fE2M/is-google-app-engine-having-performance-issues" title="Is Google App Engine Having Performance Issues?" /> <feedburner:origLink>http://blog.dantup.com/2011/02/is-google-app-engine-having-performance-issues</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-02-06:/2011/02/blog-comments-switched-to-disqus</id> <published>2011-02-06T17:17:00Z</published> <updated>2011-02-06T17:17:00Z</updated> <category term="Google App Engine" /> <title type="text">Blog Comments Switched to Disqus</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I've spent the last few hours wrestling with the &lt;a href="http://www.disqus.com/"&gt;Disqus&lt;/a&gt; comment importer. For some reason it seems to randomly fail with a vague error. I spent ages thinking it was errors in my XML file, but when I uploaded the same file twice, it worked the second time!&lt;/p&gt;

&lt;p&gt;Anyway, it's all sorted now. I've hidden the original blog comments/form and put Disqus live on all posts. Sadly your previous comments (and mine) won't be tied to your Disqus profiles, but comments going forwards will be.&lt;/p&gt;

&lt;p&gt;I'm still not entirely sold on the idea of comments not being visible to search engines, as some posts have had better info in comments than in the actual post. However, I think the other advantages of a system like Disqus outweight that (for now...).&lt;/p&gt;

&lt;p&gt;So, happy commenting!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/02/blog-comments-switched-to-disqus"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/iDUkVlApR-E" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/iDUkVlApR-E/blog-comments-switched-to-disqus" title="Blog Comments Switched to Disqus" /> <feedburner:origLink>http://blog.dantup.com/2011/02/blog-comments-switched-to-disqus</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-02-05:/2011/02/compressing-folders-into-individual-encrypted-7-zip-files-from-the-command-line</id> <published>2011-02-05T22:02:00Z</published> <updated>2011-02-05T22:02:00Z</updated> <category term="Backup" /> <title type="text">Compressing Folders into Individual Encrypted 7-Zip Files from the Command Line for Backing Up to Dropbox</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;As previously mentioned, I've started backing my important files up to &lt;a href="http://db.tt/i9D1nEf"&gt;Dropbox&lt;/a&gt; to make sure I have a copy of the things I can't replace, should the worst happen. To easily encrypt the file contents, I decided to put things into password-protected 7-Zip files before copying into my Dropbox folder.&lt;/p&gt;

&lt;p&gt;The problem with putting everything into the same zip file, is that any change to a single file would cause Dropbox to upload the entire archive again. This would be quite a waste of bandwidth!&lt;/p&gt;

&lt;p&gt;So, I came up with the following solution. If I create an encrypted 7-Zip file for each sub-directory within a given directory (eg. for each photo album within my photos directory), then only folders that contain changes will be uploaded/overwritten. Since I rarely make changes to photo albums, but frequently create new ones, this will ensure my new files are backed up without constant uploading of the old ones, while still sending any changes I &lt;em&gt;do&lt;/em&gt; make to the existing albums. To script this, I'm using the command-line version of &lt;a href="http://www.7-zip.org/download.html"&gt;7-Zip&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The following command will loop through each sub-directory in the provided directory, and call 7-Zip, telling it to compress the contents into a 7-Zip file (using the original directory name as the zip filename). Note: This is written for use in a .bat file. You may need to tweak it to use it directly on the command-line.&lt;/p&gt;

&lt;pre&gt;
for /D %%d in ("&lt;strong&gt;D:\Pictures&lt;/strong&gt;\*.*") do "&lt;strong&gt;J:\Downloads\Utilities\7-Zip&lt;/strong&gt;\7za" a -mx0 -t7z -p&lt;strong&gt;SuperStrongPasswordHere12345&lt;/strong&gt; "&lt;strong&gt;J:\TempBackup\Photos&lt;/strong&gt;\%%~nd.7z" "%%d\*"
&lt;/pre&gt;

&lt;p&gt;You'll want to replace the bold parts with the directory you want to back up, the location of the command-line version of 7-Zip, the password you want to encrypt with and finally, the location to store the files in. I put them into a temp folder first, then copy them over into the &lt;a href="http://db.tt/i9D1nEf"&gt;Dropbox&lt;/a&gt; folder once completed.&lt;/p&gt;

&lt;p&gt;It's worth noting that because the script loops through the sub-directories, it will not include any files in the root directory you specified. If you want to include them too, you'll need to add another command, eg:&lt;/p&gt;

&lt;pre&gt;
"&lt;strong&gt;J:\Downloads\Utilities\7-Zip&lt;/strong&gt;\7za" a -mx0 -t7z -p&lt;strong&gt;SuperStrongPasswordHere12345&lt;/strong&gt; "&lt;strong&gt;J:\TempBackup\Photos\_Files.7z&lt;/strong&gt;" "&lt;strong&gt;D:\Pictures&lt;/strong&gt;\*"
&lt;/pre&gt;

&lt;p&gt;If you don't mind the script taking a little longer, you can change the "mx" argument to compress the files ("mx0" = "zero compression") and it'll take up less space on your &lt;a href="http://db.tt/i9D1nEf"&gt;Dropbox&lt;/a&gt; account. If you're going to encrypt things, make sure you store the encryption password somewhere offsite - so that if the need comes to rebuild a PC, you still have a copy of it!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/02/compressing-folders-into-individual-encrypted-7-zip-files-from-the-command-line"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/ga6LJQFYfiU" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/ga6LJQFYfiU/compressing-folders-into-individual-encrypted-7-zip-files-from-the-command-line" title="Compressing Folders into Individual Encrypted 7-Zip Files from the Command Line for Backing Up to Dropbox" /> <feedburner:origLink>http://blog.dantup.com/2011/02/compressing-folders-into-individual-encrypted-7-zip-files-from-the-command-line</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-02-02:/2011/02/using-dropbox-as-an-off-site-backup</id> <published>2011-02-02T19:50:00Z</published> <updated>2011-02-02T19:50:00Z</updated> <category term="Backup" /> <title type="text">Using Dropbox as an Off-site Backup</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;After a number of incidents with lost (or almost lost) data, I decided it's about time I started backing my important data up properly. Most of the important things on my PC are on RAID-1 mirrored disks, but since they're only 75GB each (giving a total of only 75GB when mirrored!) some things (like music) have been relegated to a single 1TB drive.&lt;/p&gt;

&lt;p&gt;I originally planned on picking up a Western Digital My Book World Edition II because it has two disks and supports RAID 1. Only a few weeks ago I spent many hours recovering data from a half-broken NAS with an Ubuntu Live CD, so it seemed to be a good idea.&lt;/p&gt;

&lt;p&gt;However, after some discussion with colleagues and a little sleep, I decided that it would really make more sense to back up &lt;strong&gt;To The Cloud!&lt;/strong&gt; (&lt;em&gt;sorry&lt;/em&gt;!) than just having a backup 2ft from my PC, should something more catastrophic than a disk failure occur. Some things I can get away with just having locally (eg., music, since I still have the CDs), but other things (like wedding and holiday photos), I wouldn't be able to replace if lost.&lt;/p&gt;

&lt;p&gt;I originally planned on using Amazon S3 (or Google Storage, if it had been cheaper), but since I couldn't find any decent software for backing up, I settled on &lt;a href="http://db.tt/i9D1nEf"&gt;Dropbox&lt;/a&gt;. You get 2GB for free, and the Windows client seems pretty lean. You pick a folder to Sync and it sits quietly in your systray uploading files as you create/modify them. Even better, you get an extra 250MB for every person you refer (and they get an extra 250MB for being referred too!), up to 10GB (2GB free + 8GB bonus).&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
&lt;a href="http://db.tt/i9D1nEf"&gt;
&lt;strong&gt;Sign up for an extra 250MB free&lt;/strong&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;So, this post has two purposes. One, is to get you thinking about backing your shit up. Disks fail. Often. &lt;strong&gt;Stop putting it off, it'll only bite you in the ass&lt;/strong&gt;. Backing up to a NAS does not help if your house burns down or &lt;a href="http://www.pittsburghlive.com/x/pittsburghtrib/s_716608.html"&gt;some idiots demolish your house in error&lt;/a&gt;. The second purpose, is because if I can get a few more referrals, then I can store all of my family wedding and holiday photos online at &lt;a href="http://db.tt/i9D1nEf"&gt;Dropbox&lt;/a&gt; without having to upgrade just yet. Whoop!&lt;/p&gt;

&lt;p&gt;To get an extra 250MB on top of the 2GB free, &lt;a href="http://db.tt/i9D1nEf"&gt;click here to sign up to Dropbox&lt;/a&gt;.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/02/using-dropbox-as-an-off-site-backup"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/iqrnah-nxW8" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/iqrnah-nxW8/using-dropbox-as-an-off-site-backup" title="Using Dropbox as an Off-site Backup" /> <feedburner:origLink>http://blog.dantup.com/2011/02/using-dropbox-as-an-off-site-backup</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2011-01-28:/2011/01/woohoo-im-back</id> <published>2011-01-28T12:14:00Z</published> <updated>2011-01-28T12:14:00Z</updated> <category term="Google Apps" /> <title type="text">Woohoo - I'm Back!</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;After a week of downtime, things are back up and running. I can't explain why it takes so long to close a Google Apps acount (5 days advertised, but took longer), but I'm happy things are back up and running (for one, this domain is used for as my OpenID identifier and I couldn't login to many services!).&lt;/p&gt;

&lt;p&gt;Thanks to Google for finally sorting it - but should it &lt;em&gt;really&lt;/em&gt; be this difficult? There's definitely some room for improvement...&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2011/01/woohoo-im-back"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/KGNn279mEzk" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/KGNn279mEzk/woohoo-im-back" title="Woohoo - I'm Back!" /> <feedburner:origLink>http://blog.dantup.com/2011/01/woohoo-im-back</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-11-28:/2010/11/giffgaff-going-the-extra-mile</id> <published>2010-11-28T20:48:00Z</published> <updated>2010-11-28T20:48:00Z</updated> <category term="Mobile Phones" /> <title type="text">giffgaff - Going the Extra Mile</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;A few days ago, &lt;strong&gt;&lt;a href="http://www.unofficialgiffgaff.com/"&gt;giffgaff&lt;/a&gt;&lt;/strong&gt; ("the mobile network run by you") celebrated it's first birthday. It launched (in beta) on 25th November 2009. On the 25th November this year, giffgaff sent out an email titled "Happy Birthday giffgaff" which had a few interesting things in it that impressed me, so I thought I'd share.&lt;/p&gt;

&lt;h2&gt;Save Money by Changing Goodybag/PAYG&lt;/h2&gt;

&lt;p&gt;You might think that because giffgaff is so cheap, that they might like to make money from people being on "the wrong tarrif" as many networks do. Not so. In the email from giffgaff, I was given a summary of my texts and calls, along with some info on how I could save:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You're currently are on the £10 goodybag – looking at how you use your mobile, you might be better just on our standard pricing (4p/text and 8p/min).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The email shows that I would actually &lt;strong&gt;only be paying around £4/month&lt;/strong&gt; if I didn't buy the goodybag! This might change when the free internet ends in February, but for now, it seems like a no-brainer.&lt;/p&gt;

&lt;h2&gt;£5 Free Sims Without Sharing Address&lt;/h2&gt;

&lt;p&gt;Something I criticised giffgaff for a few months back was that to qualify for the free £5 credit when you join, you must be referred by another member. However, there was no way for a member to refer you without you giving them your address. giffgaff have addressed this, and members now have a custom URL that allows the new member to enter their address directly into the giffgaff website, but the both members will still get £5!&lt;/p&gt;

&lt;p&gt;Note: If you sign up directly at giffgaff.com, nobody will get the free £5, so make sure you use &lt;a href="http://j.mp/ggjoin"&gt;someone's affiliate link&lt;/a&gt;!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/11/giffgaff-going-the-extra-mile"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/Od8YQRumXa0" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/Od8YQRumXa0/giffgaff-going-the-extra-mile" title="giffgaff - Going the Extra Mile" /> <feedburner:origLink>http://blog.dantup.com/2010/11/giffgaff-going-the-extra-mile</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-11-25:/2010/11/my-first-iphone-app-live-official-newcastlegateshead-city-guide</id> <published>2010-11-25T19:20:00Z</published> <updated>2010-11-25T19:20:00Z</updated> <category term="Mobile Phones" /> <category term="Apple iPhone" /> <title type="text">My First iPhone App, Live! Official NewcastleGateshead City Guide</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;It's taken a while, but the first iPhone app I've worked on was recently approved by Apple! It's &lt;a href="http://j.mp/newcastleapp"&gt;the Official NewcastleGateshead City Guide&lt;/a&gt;, available on the app store for £1.19 :-)&lt;/p&gt;

&lt;p&gt;I can't say Objective-C ranks high on my list of easiest languages to code in, but having another language/framework under the belt always useful, especially when it comes to mobile platforms!&lt;/p&gt;

&lt;p&gt;If you do check it out, honest feedback/ratings would be appreciated :-)&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/11/my-first-iphone-app-live-official-newcastlegateshead-city-guide"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/vMhQArVBfMg" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/vMhQArVBfMg/my-first-iphone-app-live-official-newcastlegateshead-city-guide" title="My First iPhone App, Live! Official NewcastleGateshead City Guide" /> <feedburner:origLink>http://blog.dantup.com/2010/11/my-first-iphone-app-live-official-newcastlegateshead-city-guide</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-10-31:/2010/10/windows-phone-7-wp7-less-stop-and-stare-more-glance-and-go</id> <published>2010-10-31T11:45:00Z</published> <updated>2010-10-31T11:45:00Z</updated> <category term="Mobile Phones" /> <category term="Windows Phone 7" /> <title type="text">Windows Phone 7 (WP7) - Less Stop and Stare, More Glance and Go?</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I was recently discussing &lt;a href="/tags/Windows%20Phone%207"&gt;Windows Phone 7&lt;/a&gt; with fellow coder &lt;a href="http://www.mikewilson.cc/"&gt;Mike Wilson&lt;/a&gt; of &lt;a href="http://www.evolvedsoftware.com/"&gt;Evolved Software Studios&lt;/a&gt;. During the discussion, Mike said:&lt;/p&gt;

&lt;blockquote&gt;I'm not totally convinced by WM7 although it is original and has some unique features. What gets me is the general design and UI of the whole new 'Windows Live' theme. It wastes space unnecessarily and makes performing straightforward tasks just that little bit harder than it really needs to be.&lt;/blockquote&gt;

&lt;p&gt;I won't argue that WP7 has room for improvement (and some catching up to do), however I don't really agree with the last part of Mike's sentence, "makes performing straightforward tasks just that little bit harder than it really needs to be". I've been using WP7 for a little over a week and there are lots of little things that make life easier. I thought it was worth sharing some of these here for others that haven't been able to play with a real device at length.&lt;/p&gt;

&lt;p&gt;This isn't intended to be an iPhone vs Windows Phone 7 post. Nor is it intended to give an unbiased comparison of the two. It will focus solely on some of the nice features that Windows Phone 7 has to save you time.&lt;/p&gt;

&lt;h2&gt;Calendar Appointments on the Lock Screen and Home Screen&lt;/h2&gt;

&lt;p&gt;This a killer feature for me. My upcoming appointments are shown on both the lock screen and on the calendar tile on the home screen. If you think about how many times you see these screens in a day compared to how many times you open your calendar app, I'm sure you can appreciate the usefulness. I really wish my iPad did this, but with Apple's app-centric approach, I'm not sure we'll ever see this sort of functionality.&lt;/p&gt;

&lt;h2&gt;Use the Camera without Unlocking the Phone&lt;/h2&gt;

&lt;p&gt;In Windows Phone 7, there's an option that allows you to long-press the camera button to launch the camera app, even when the phone is locked. This makes it much easier to pull out your phone and snap a picture without having to enter your pin and find and launch the camera app.&lt;/p&gt;

&lt;h2&gt;Voice Commands without Unlocking the Phone&lt;/h2&gt;

&lt;p&gt;Another time-saver is being able to hold the Windows key and instruct the phone to call people without unlocking the device. Again, this is optional, since it allows calling without entering your PIN.&lt;/p&gt;

&lt;h2&gt;Pin Contacts to the Home Screen&lt;/h2&gt;

&lt;p&gt;Another huge time-saver. If you're like me, 90% of your calls and texts are to the same person. Windows Phone 7 allows you to pin a contact to the home screen. With a single tap on their tile you land at a screen with options to call, text and email this contact. It even includes the ability to write on their Facebook wall or see their latest Facebook status (Facebook is very well integrated, should you choose to enable it).&lt;/p&gt;

&lt;h2&gt;Email Count on the Lock Screen&lt;/h2&gt;

&lt;p&gt;This is something very minor, but for some reason it's missing from iOS. In addition to showing missed calls and text notifications on the lock screen, Windows Phone 7 also shows a count of emails. I find this pretty useful because I'm not always near my iPad so when I do pick it up, I have to unlock it to see if I have any new email.&lt;/p&gt;

&lt;h2&gt;Hardware Search Button&lt;/h2&gt;

&lt;p&gt;I didn't think this would be all that useful but it's actually turned out to be a nice addition. By having a dedicated search button, you don't have to navigate around an app to get to the search box. When you're not in an app, it launches Bing - not my preferred search engine, but the app works very well on the phone.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;While there is certainly room for improvement in Windows Phone 7, I have to argue that on the whole it makes a lot of tasks a lot easier than other smartphones. I think the next 6-12 months are going to be very interesting. How Microsoft responds to initial user feedback will play a huge part in the success of the platform. It will also be interesting to see how the competition responds to Microsoft finally launching a serious consumer smartphone. With three huge players in the smartphone market I can't wait to see what each comes up with to try and get ahead of the competition!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/10/windows-phone-7-wp7-less-stop-and-stare-more-glance-and-go"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/VKnfnnQX66w" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/VKnfnnQX66w/windows-phone-7-wp7-less-stop-and-stare-more-glance-and-go" title="Windows Phone 7 (WP7) - Less Stop and Stare, More Glance and Go?" /> <feedburner:origLink>http://blog.dantup.com/2010/10/windows-phone-7-wp7-less-stop-and-stare-more-glance-and-go</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-10-23:/2010/10/amazon-aws-adds-free-usage-tier</id> <published>2010-10-23T20:19:00Z</published> <updated>2010-10-23T20:19:00Z</updated> <category term="Amazon EC2" /> <title type="text">Amazon AWS adds Free Usage Tier</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Carrying on from the &lt;a href="/2010/10/google-app-engine-gae-vs-amazon-elastic-computing-ec2-vs-microsoft-azure"&gt;cloud comparison&lt;/a&gt; posts, I thought it worth mentioning that Amazon has &lt;a href="http://aws.amazon.com/about-aws/whats-new/2010/10/21/announcing-aws-free-usage-tier/"&gt;recently announced&lt;/a&gt; a free usage tier for their web services:&lt;/p&gt;

&lt;blockquote&gt;
To help new AWS customers get started in the cloud, AWS is introducing a new free usage tier. Beginning November 1, new AWS customers will be able to run a free Amazon EC2 Micro Instance for a year, while also leveraging 5 GB of Amazon S3 storage, and free tiers of Amazon Elastic Block Store, Amazon Elastic Load Balancer, and AWS data transfer. In addition, customers can benefit from the existing free tiers for Amazon SimpleDB, Amazon Simple Queue Service, and Amazon Simple Notifications Service. To learn more about the new AWS free usage tier, visit &lt;a href="http://aws.amazon.com/free"&gt;aws.amazon.com/free&lt;/a&gt;.
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately the Micro instance is linux-only (presumably for licensing reasons), but it's still a good deal, and there's other stuff included.&lt;/p&gt;

&lt;p&gt;I should also point out that some of the free stuff only applies to &lt;em&gt;new&lt;/em&gt; customers.&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/10/amazon-aws-adds-free-usage-tier"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/THa_-Td42ZE" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/THa_-Td42ZE/amazon-aws-adds-free-usage-tier" title="Amazon AWS adds Free Usage Tier" /> <feedburner:origLink>http://blog.dantup.com/2010/10/amazon-aws-adds-free-usage-tier</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-10-16:/2010/10/windows-phone-7-marketplace-managed-and-indie-game-tiering</id> <published>2010-10-16T13:30:00Z</published> <updated>2010-10-16T13:30:00Z</updated> <category term=".NET" /> <category term="Games" /> <category term="Mobile Phones" /> <category term="Windows Phone 7" /> <category term="XNA" /> <title type="text">Windows Phone 7 Marketplace - Managed and Indie Game Tiering</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;A few months ago, &lt;a href="/2010/08/did-microsoft-just-kill-windows-phone-7"&gt;I posted about&lt;/a&gt; (and &lt;a href="/2010/08/did-microsoft-just-kill-windows-phone-7-part-2"&gt;updated&lt;/a&gt;) the news of the Windows Phone 7 Marketplace separating "managed portfolio" games (eg. those that have relationships with Microsoft - generally the bigger games developers) and "indie games" (created by you and I). I was concerned that the lack of XBLIG sales would continue in the WP7 world. Now that the Windows Phone 7 Marketplace is live in the Zune 4.7 software, I thought I'd post an update on how things turned out.&lt;/p&gt;

&lt;p&gt;When first entering the apps section of the marketplace, the intro screen is comprised of four sections. The top one (largest) looks like a list of Microsoft-chosen list of apps, similar to Apple's featured/staff picks section. Just undernearth, slightly smaller, is a "We recommend" section. It's not entirely clear what the difference is here - it's possible that this is just one list, and the top four simply get bigger icons. &lt;em&gt;It's not clear whether either of these may ever contain indie games, though I'll try to get clarification&lt;/em&gt;. The remaining two sections are top selling lists, which do include indie games, one of which can be seen in the screenshot below.&lt;/p&gt;

&lt;img src="/pi/wp7_1.png" alt="The Windows Phone 7 Marketplace apps langing screen" /&gt;

&lt;p&gt;The landing screen is not restricted to games, so for the games section, you'd click the "games" option on the left side of the screen. This brings you to the games section, which can be filtered to All, Paid, Free, Xbox LIVE. Notice that the default section is Xbox LIVE. This section is restricted to managed portfolio games, which all have full access to the LIVE APIs. You can easily identify these games by the "XBOX LIVE" banner at the top of the icons.&lt;/p&gt;

&lt;img src="/pi/wp7_2.png" alt="The Xbox LIVE section of the Windows Phone 7 Games Marketplace" /&gt;

&lt;p&gt;Clicking the "all" option, will give you a full list of all Windows Phone 7 games. There are subgenres in the bottom left, but this list contains both managed portfolio games, and indie games. Hurrah! No navigating to the indie bin!&lt;/p&gt;

&lt;img src="/pi/wp7_3.png" alt="The Xbox LIVE section of the Windows Phone 7 Games Marketplace" /&gt;

&lt;p&gt;Clicking the "paid" option, takes you to a section that is exactly the same as the "all" option, but shows only games that cost. Again, indie games sit side-by-side with managed portfolio games here.&lt;/p&gt;

&lt;img src="/pi/wp7_4.png" alt="The paid section of the Windows Phone 7 Games Marketplace" /&gt;

&lt;p&gt;Clicking the "free" option, as expected, takes you to the same again, but shows only games that a free to download. Again, indie games sit side-by-side with managed portfolio games here.&lt;/p&gt;

&lt;img src="/pi/wp7_5.png" alt="The paid section of the Windows Phone 7 Games Marketplace" /&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In summary, I think this is an excellent structure. Defaulting to the Xbox LIVE games is a great choice for consumers, and outside of this section, it looks like indie games are treated equally. This eliminates all concerns I had, and I can't wait to finish &lt;a href="http://badgerquestgame.com"&gt;Badger Quest&lt;/a&gt; and get it up there!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/10/windows-phone-7-marketplace-managed-and-indie-game-tiering"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/nfJzZDah434" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/nfJzZDah434/windows-phone-7-marketplace-managed-and-indie-game-tiering" title="Windows Phone 7 Marketplace - Managed and Indie Game Tiering" /> <feedburner:origLink>http://blog.dantup.com/2010/10/windows-phone-7-marketplace-managed-and-indie-game-tiering</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-10-02:/2010/10/google-app-engine-gae-vs-amazon-elastic-computing-ec2-vs-microsoft-azure</id> <published>2010-10-02T21:20:00Z</published> <updated>2010-10-03T11:03:00Z</updated> <category term=".NET" /> <category term="Amazon EC2" /> <category term="ASP.NET MVC" /> <category term="Google App Engine" /> <category term="Microsoft Windows Azure" /> <title type="text">Google App Engine (GAE) vs Amazon Elastic Computing (EC2) vs Microsoft Azure</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Almost a year ago, I &lt;a href="/2009/12/microsoft-windows-azure-vs-google-app.html"&gt;compared Google App Engine and Microsoft Windows Azure&lt;/a&gt;, trying to decide which platform I should write and host my blog (and some other small projects) on. The comparison was about more than hosting - the languages and frameworks used would be influenced by the platform I was hosting on. There were also APIs available only to one platform, or easier to use on one platform compared to the other (such as the App Engine authentication).&lt;/p&gt;

&lt;p&gt;Due to the huge differences, I did a little homework on each platform, and ultimately, it came down to price. The difference in pricing between Google App Engine and Windows Azure was so enormous, that there wasn't really a decision to make. App Engine hosts this blog for free. Windows Azure would've cost around $100/month minimum.&lt;/p&gt;

&lt;h2&gt;One Year On&lt;/h2&gt;

&lt;p&gt;Fast forward a year and things have changed a little. App Engine has become more mature, Amazon has introduced Micro instances, and Microsoft has done, well, not a lot. There's been seemingly  zero change in the pricing for Windows Azure, meaning there's still a significant minimum cost in using it.&lt;/p&gt;

&lt;h2&gt;Maybe Windows Azure is aimed at The Big Boys?&lt;/h2&gt;

&lt;p&gt;I can only assume Microsoft don't care so much about small developers and are aiming Windows Azure at bigger businesses that already have significant applications. Of course, this is their decision. However, I think they are overlooking something significant. All successful websites/applications start small. At the time of launch, it's very difficult to tell whether a website/application will do well. Who wants to fork out for expensive hosting for something that might not take off?&lt;/p&gt;

&lt;p&gt;If the price is too high, people will pass on Windows Azure for small start-up websites/applications. They'll look at cheaper alternatives, such as Google App Engine or Amazon EC2. If they explode overnight, they have two options; 1) Stick with App Engine/Amazon EC2; 2) Convert everything to Windows Azure. One of them is zero work, and one of them is significant work. What do you think most business will choose?&lt;/p&gt;

&lt;h2&gt;Google App Engine Lock-in&lt;/h2&gt;

&lt;p&gt;Despite currently hosting my log on App Engine, I do agree with the lock-in argument. With Google App Engine, you're very closely tied to Google's way of doing things, and Google's APIs. Although there are initiatives out there trying to make it possible to run App Engine apps on non-Google hardware, they're generally incomplete, lagging behind, and it's unlikely they will ever match the performance and scalability of hosting with Google.&lt;/p&gt;

&lt;p&gt;Put bluntly, if you want to move away from App Engine, there will certainly be a lot of pain and re-writing code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; In the comments, Tobias points out that TyphoonAE is pretty much a complete implementation of the API, making this much easier. I'm not sure how the performance or scalability stacks up to App Engine, but you can certainly get the code up and running elsewhere (even EC2!) relatively easily.&lt;/p&gt;

&lt;h2&gt;Enter, Amazon EC2&lt;/h2&gt;

&lt;p&gt;Amazon EC2 wasn't mentioned much in my original comparison because it was similarly priced to Windows Azure, but you also have to manage your own servers. It also requires much more work to make your application scale. Things have changed a little at Amazon EC2 over the last year.&lt;/p&gt;

&lt;p&gt;Recently, &lt;a href="http://aws.amazon.com/about-aws/whats-new/2010/09/09/announcing-micro-instances-for-amazon-ec2/"&gt;Amazon introduced Micro Instances&lt;/a&gt;. These are low power instances and have only 600MB RAM, but they come in at around 3 cents per hour! If you're prepared to pay a little up-front (&lt;a href="http://aws.amazon.com/ec2/reserved-instances/"&gt;Reserved Instances&lt;/a&gt;), then the price is just 1 cent per hour! Before you run and sign up, be aware that with Micro instances, there is no instance storage - your volumes must all be &lt;a href="http://aws.amazon.com/ebs/"&gt;EBS volumes&lt;/a&gt;. This doesn't really change much, but you will incur a charge for all disk access (IOPS), but this should still work out pretty cheap.&lt;/p&gt;

&lt;p&gt;In addition, Amazon now has an &lt;a href="http://aws.amazon.com/autoscaling/"&gt;Autoscaling&lt;/a&gt; service, which allows you to automatically start up new instances (or shut them down) based on load. This service is free if you opt for CloudWatch (a resource monitoring service, which costs 1.5 cents per instance per hour).&lt;/p&gt;

&lt;p&gt;Going hand in hand with Autoscaling, there is &lt;a href="http://aws.amazon.com/elasticloadbalancing/"&gt;Elastic Load Balancing&lt;/a&gt;, which allows an IP address to balance load across multiple instances. This costs 2.5 cents per hour, and 0.8 cents per GB of data handled by the load balancer.&lt;/p&gt;

&lt;p&gt;These scaling options aren't cheap (they're not expensive either), but they are options that require little work. You can start off with a Micro instance and scale up &lt;em&gt;fairly&lt;/em&gt; easily if things explode overnight. The only real thing you need to handle is scaling your writable data. You can't just run SQL on each instance, because the data would not be replicated. You also have a serious single point of failure running just one instance.&lt;/p&gt;

&lt;h2&gt;Google App Engine vs Amazon EC2&lt;/h2&gt;

&lt;p&gt;So, with Windows Azure's cost (and lack of an equivalent to Amazon's Micro Instances), it looks like it's between Google App Engine and Amazon EC2. It's time to make a list of pros and cons for each! This list is based on my opinions, and my requirements, so it might not match your own (eg. you might love Python!).&lt;/p&gt;

&lt;h3&gt;Amazon EC2 Pros and Cons&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
Pros
&lt;ul&gt;
&lt;li&gt;No lock-in. Relatively easy to move code to another box.&lt;/li&gt;
&lt;li&gt;Code in C#, .NET, ASP.NET MVC / Visual Studio&lt;/li&gt;
&lt;li&gt;SQL Server (Express/Compact)&lt;/li&gt;
&lt;li&gt;Amazon staff very active in the community&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Cons
&lt;ul&gt;
&lt;li&gt;No free quota - minimum cost per month, even if 0 visitors&lt;/li&gt;
&lt;li&gt;Scaling harder (if required) - need to handle data spread across n instances&lt;/li&gt;
&lt;li&gt;Single point of failure with single Micro instance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Google App Engine Pros and Cons&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
Pros
&lt;ul&gt;
&lt;li&gt;Generous free quota&lt;/li&gt;
&lt;li&gt;Billed for actual CPU usage, not "live" hours&lt;/li&gt;
&lt;li&gt;Scaling is (relatively) easy&lt;/li&gt;
&lt;li&gt;"Free" built-in Google authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Cons
&lt;ul&gt;
&lt;li&gt;&lt;s&gt;(Pretty much) locked in to Google App Engine&lt;/s&gt; &lt;small&gt;See comments below&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;No support for C#/.NET&lt;/li&gt;
&lt;li&gt;Non-relational datastore - more restrictive on how data can be accessed&lt;/li&gt;
&lt;li&gt;(Relatively) high rate of datastore errors, need to code to handle them&lt;/li&gt;
&lt;li&gt;Blog is already hosted here - don't need to do any work ;)&lt;/li&gt;
&lt;li&gt;No local storage, so unable to use libraries that rely on writing to disk&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both platforms have a lot going for them. It's a tough decision, but it doesn't need to be. If Google added support for C#/ASP.NET MVC (unlikely, but technically possible), then there would be no contest for me. Alas, it really comes down to whether to pay the extra cash for EC2, in return for being able to use Visual Studio, C# and ASP.NET MVC!&lt;/p&gt;

&lt;p&gt;It's a really tough call, so I'm going to have to think a little more about it, and maybe do a little more research!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/10/google-app-engine-gae-vs-amazon-elastic-computing-ec2-vs-microsoft-azure"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/odMqE5OzWw8" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/odMqE5OzWw8/google-app-engine-gae-vs-amazon-elastic-computing-ec2-vs-microsoft-azure" title="Google App Engine (GAE) vs Amazon Elastic Computing (EC2) vs Microsoft Azure" /> <feedburner:origLink>http://blog.dantup.com/2010/10/google-app-engine-gae-vs-amazon-elastic-computing-ec2-vs-microsoft-azure</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-09-27:/2010/09/should-i-move-my-blog-from-google-app-engine-back-to-asp-net-mvc-on-amazon-ec2</id> <published>2010-09-27T19:00:00Z</published> <updated>2010-09-27T19:00:00Z</updated> <category term=".NET" /> <category term="ASP.NET MVC" /> <category term="Google App Engine" /> <category term="Amazon EC2" /> <category term="Microsoft Windows Azure" /> <title type="text">Should I Move My Blog from Google App Engine (Back) to ASP.NET MVC, Hosted on Amazon EC2?</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;If you &lt;a href="http://twitter.com/DanTup"&gt;follow me on twitter&lt;/a&gt;, you'll probably have noticed I've been &lt;a href="http://twitter.com/DanTup/status/25512240540"&gt;playing around with Amazon EC2&lt;/a&gt; lately. My blog is currently &lt;a href="/2009/12/should-i-move-my-blog-to-google-app.html"&gt;hosted on Google App Engine&lt;/a&gt; for two real reasons. Firstly, cost. Google App Engine works out &lt;em&gt;free&lt;/em&gt; for my blog. Secondly, it seemed like something cool to learn and play with. Knowledge is power :-)&lt;/p&gt;

&lt;p&gt;I'm a C# coder by trade, so when I came to update my blog a year ago, I naturally &lt;a href="/2009/12/microsoft-windows-azure-vs-google-app.html"&gt;looked at Microsoft Azure&lt;/a&gt;, but it just worked out way too expensive to consider for something so small. I didn't really look into Amazon EC2 because it also looked too expensive, and I wanted to avoid having to manage the server!&lt;/p&gt;

&lt;p&gt;Fast forward a year. I've spent a large part of the last 10 months working on an iPhone application. That means using a Mac, Xcode and Objective-C. These aren't really my tools of choice. I'm so comfortable with C# and Visual Studio that coding on the Mac in Objective-C is frankly, frustrating. The OS is different, the IDE and shortcuts are all different, I have to clean up my variables (WTF?), and I'm generally quite slow at it!&lt;/p&gt;

&lt;p&gt;Now, I'm playing around with XNA again. I'm working on a &lt;a href="http://badgerquestgame.com"&gt;Windows Phone 7 game, Badger Quest&lt;/a&gt;. The coding in Objective-C has really made me appreciate what Visual Studio and C# bring. It's good to be back! :-) Amazon have also recently launched "Micro" instances, for only 3 cents/hour, which makes running .NET on a reputable host a reasonable price.&lt;/p&gt;

&lt;p&gt;So, I'm hoping to start blogging (about programming-related stuff) a little more. For any WP7 games I create, I'll need to code a reusable high score system, which would make an interesting topic. I was going to put this on Google App Engine, but I hear voices in my head telling me to use C#.&lt;/p&gt;

&lt;p&gt;However, the overhead and cost in setting up some .NET hosting is quite high for something so small. I also need to set up a "website" for a family member anyway, so it makes sense to put all this stuff, along with my blog, in one place, on one platform.&lt;/p&gt;

&lt;p&gt;So, what do I do? I love that Google App Engine would be free and scalable. However, I don't like the lock-in, or not being able to use .NET. The cost of EC2 is starting to look reasonable, though Azure is still way too expensive (though I hope Microsoft are taking note of Amazon's micro instances!)&lt;/p&gt;

&lt;p&gt;Do I migrate to Amazon EC2 and write everything in .NET (which I can deploy anywhere, if circumstances change), or stick with Google, king of free, being tied in, and using a language I'm not a huge fan of to avoid spending a few quid?&lt;/p&gt;

&lt;p&gt;Decisions, decisions!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/09/should-i-move-my-blog-from-google-app-engine-back-to-asp-net-mvc-on-amazon-ec2"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/1Ra63CvajNU" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/1Ra63CvajNU/should-i-move-my-blog-from-google-app-engine-back-to-asp-net-mvc-on-amazon-ec2" title="Should I Move My Blog from Google App Engine (Back) to ASP.NET MVC, Hosted on Amazon EC2?" /> <feedburner:origLink>http://blog.dantup.com/2010/09/should-i-move-my-blog-from-google-app-engine-back-to-asp-net-mvc-on-amazon-ec2</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-09-24:/2010/09/farewell-google-wave-notifier</id> <published>2010-09-24T18:14:00Z</published> <updated>2010-09-24T18:14:00Z</updated> <category term=".NET" /> <category term="Google Code" /> <category term="Google Wave" /> <category term="Google Wave Notifier" /> <category term="Opensource" /> <title type="text">Farewell, Google Wave Notifier :-(</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Over the last few days, I noticed &lt;a href="http://wavenotifier.dantup.com/"&gt;Google Wave Notifier&lt;/a&gt; complaining of login issues. I finally got around to looking at the problem today, and unfortunately, it's not good...&lt;/p&gt;

&lt;p&gt;With no Google Wave API, when I wrote Google Wave Notifier, I had to scrape the pages and parse text out of some JSON to figure out what your new messages were. Knowing this was likely to change, GWN was written to alert the user if the parsing failed, explaining there had probably been an update to Google Wave, and GWN would be updated soon.&lt;/p&gt;

&lt;p&gt;Unfortunately, Google changed the way Wave works recently, and I've been unable to figure out a way I can make GWN continue to function without significant changes. Since Google are ditching Wave soon anyway, I've decided not to invest the time required to make these changes.&lt;/p&gt;

&lt;p&gt;It was great fun to work on an open source project that was downloaded by thousands of users across the many versions, but sadly that journey has come to an end. I'd like to give a huge thank you to all of the people that used GWN and reported bugs, spurring me on to continue developing. And let's not forget &lt;a href="http://wavenotifier.dantup.com/translate"&gt;everyone that contributed a translation&lt;/a&gt;, allowing GWN, unlike other Wave notifiers, to be used all around the world.&lt;/p&gt;

&lt;p&gt;I'm sure I'll find other little projects to work on with some of the spare time I have, and I'll be sure to post updates here. &lt;a href="http://feeds.dantup.com/DanTup"&gt;Subscribe to the RSS Feed&lt;/a&gt; or &lt;a href="http://twitter.com/DanTup"&gt;follow me on Twitter&lt;/a&gt; for updates!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/09/farewell-google-wave-notifier"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/8_R9PJUxHJc" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/8_R9PJUxHJc/farewell-google-wave-notifier" title="Farewell, Google Wave Notifier :-(" /> <feedburner:origLink>http://blog.dantup.com/2010/09/farewell-google-wave-notifier</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-09-06:/2010/09/giffgaff-earning-90-in-two-months</id> <published>2010-09-06T17:43:00Z</published> <updated>2010-09-06T17:43:00Z</updated> <category term="Mobile Phones" /> <title type="text">giffgaff Earning - £90 in two months!</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;I just updated my &lt;a href="/giffgaff-earnings"&gt;giffgaff earnings post&lt;/a&gt; with the figures from this month. I did a lot less than last month, but it still amounts to £90 in two months! I moved from O2 to giffgaff to save money - I never imagined they'd be paying me instead!&lt;/p&gt;

&lt;p&gt;Now if I can just find an equivalent of &lt;a href="http://www.unofficialgiffgaff.com/"&gt;giffgaff&lt;/a&gt; for my internet, gas, electricity, etc.!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/09/giffgaff-earning-90-in-two-months"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/obqawPBMFNM" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/obqawPBMFNM/giffgaff-earning-90-in-two-months" title="giffgaff Earning - £90 in two months!" /> <feedburner:origLink>http://blog.dantup.com/2010/09/giffgaff-earning-90-in-two-months</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-08-18:/2010/08/did-microsoft-just-kill-windows-phone-7-part-2</id> <published>2010-08-18T20:26:00Z</published> <updated>2010-08-18T20:26:00Z</updated> <category term=".NET" /> <category term="Mobile Phones" /> <category term="Windows Phone 7" /> <category term="XNA" /> <title type="text">Did Microsoft Just Kill Windows Phone 7? (Part 2, Answer: No?)</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Yesterday &lt;a href="/2010/08/did-microsoft-just-kill-windows-phone-7"&gt;I posted some info&lt;/a&gt; that suggested a two-tier Xbox LIVE marketplace on Windows Phone 7, and that I thought it was a massive mistake on Microsoft's part. Today I had a lengthy chat with Paul Foster, a Microsoft Developer Evangelist, about that post. He wanted to give some more details about how things worked to avoid me having to draw my own conclusions.&lt;/p&gt;

&lt;p&gt;We went into Xbox LIVE publishing in great detail, and I decided to get Paul to confirm some of the things we discussed by email so I could post them here, for those that had read my previous post and were worried. Paul was unable to answer all of the questions (due to various things being hush-hush at this time), but said he'll answer them when he can. Below I've included his answers, along with the outstanding questions we'll hopefully have answers for in the future!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Will Microsoft engage directly with small companies/individuals that have great games, ready to publish (to become part of the managed portfolio)?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Microsoft's XBL team and importantly a range of 3rd party XBL publishers are looking out for new opportunities, in fact at GDC 2010 and Mix10 the wpgames@microsoft.com alias was advertised asking for indie games devs to submit their game concepts they are building. The important point here is that if you want your game to be a big success you have to do more than just post it into an app store. You need to think about it as a manuscript for a book and take it around various publishers to get opinion and seek publishing opportunities. Publishers have the skill and capability to market your game and find bigger publishing opportunities – such as XBL. Publishing by default into an app store isn't enough for success when big numbers of people are doing just that – you need to do more than just develop your game, you need to drive the commercial publishing of it and the ecosystem of XBL provides broad opportunities for publishing. If after doing all that, the best opportunity for you is to publish straight into the marketplace then work at advertising your game. Seek magazine or blog reviewers, publish videos of it and ensure you have a cool web landing page for it. None of this stuff costs much and can raise the profile of your game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; How are managed/unmanaged portfolio games separated in the store (visually/category-wise)?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; All apps/games are in the single app store, filed by various categories. There are various merchandising locations in the marketplace and in the Games hub – these will be driven by various metrics from the store as well as for apps/games of planned marketing activities.&lt;/p&gt;

&lt;p&gt;The following questions are unanswered as yet, but it seems like the answers will be positive for indies!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Will there be separate "top sellers" / "what's new"-type lists for managed/unmanaged portfolio games, or combined lists?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Are managed/unmanaged games separated in search results (if I search by name)?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Will there by managed/unmanaged portfolios of apps too, or games only?&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/08/did-microsoft-just-kill-windows-phone-7-part-2"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/UJSVX5ijAPw" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/UJSVX5ijAPw/did-microsoft-just-kill-windows-phone-7-part-2" title="Did Microsoft Just Kill Windows Phone 7? (Part 2, Answer: No?)" /> <feedburner:origLink>http://blog.dantup.com/2010/08/did-microsoft-just-kill-windows-phone-7-part-2</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-08-17:/2010/08/did-microsoft-just-kill-windows-phone-7</id> <published>2010-08-17T21:00:00Z</published> <updated>2010-08-18T13:20:00Z</updated> <category term=".NET" /> <category term="Windows Phone 7" /> <category term="Mobile Phones" /> <category term="WPF" /> <category term="XNA" /> <title type="text">Did Microsoft Just Kill Windows Phone 7?</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Today I had a lengthy chat with Paul Foster, a Microsoft Developer Evangelist, about this post. I posted &lt;a href="/2010/08/did-microsoft-just-kill-windows-phone-7-part-2"&gt;an update here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ever since I had my first iPaq with the .NET Compact Framework, I've wanted to code for a Microsoft mobile device. Coding in C# and Visual Studio is by far the nicest coding experience I've come across in the 15 or so years I've been programming. Unfortunately, up until now, Microsoft's mobile operating systems have all been absolutely rubbish.&lt;/p&gt;

&lt;p&gt;Windows Phone 7 is set to change all that. Everything I've seen suggests Microsoft have finally got their act together, and WP7 looks set to be a huge success. Finally I can have the Windows phone I've &lt;em&gt;always&lt;/em&gt; wanted!&lt;/p&gt;

&lt;p&gt;Over the past couple of months, I've been reading more about developing for Windows Phone 7, and in the last few weeks, I've been playing around with both Silverlight and XNA as part of this. The experience is great, and I've been really looking forward to working on a game for WP7. I've spent the last few months of my spare time working on an iPhone app, and it's so nice to be able to switch Xcode/Objective-C for Visual Studio and C#!&lt;/p&gt;

&lt;p&gt;However, there may be a problem...&lt;/p&gt;

&lt;p&gt;I was just pointed to &lt;a href="http://www.ozymandias.com/how-do-i-use-xbox-live-apis-on-windows-phone"&gt;this page&lt;/a&gt; by a fellow XNA coder. Although not entirely clear, my interpretation of this text surprises, and shocks me. (Emphasis mine).&lt;/p&gt;

&lt;blockquote&gt;To answer, it's important to understand that we have a managed portfolio for Xbox LIVE titles on Windows Phone 7. As we looked at how the mobile gaming industry was evolving, it was obvious that there's a &lt;em&gt;significant problem with&lt;/em&gt; the "race to zero" – or having &lt;em&gt;too many, mixed quality titles available on a marketplace&lt;/em&gt;. Too many offerings makes it very hard for any specific title to stand out (no matter how high-quality), and negatively impacts the overall business ecosystem by making it almost impossible for developers to earn a fair return on their work. Our goal with the Windows Phone 7 games that utilize Xbox LIVE services is to cultivate a portfolio of high-quality titles that are regularly released – this is &lt;em&gt;very similar to the portfolio management we do for Xbox LIVE Arcade titles&lt;/em&gt;.&lt;/blockquote&gt;

&lt;p&gt;This sounds to me, an awful lot like the current Xbox LIVE Arcade situation. Indie titles (eg., those created by people that do not have commercial relationships with Microsoft) are relegated to a crappy sub-category of "Indie Games".&lt;/p&gt;

&lt;p&gt;You may be wondering what the big deal is here - surely we want to keep all this "indie crap" generated by bedroom coders hidden away so we can see stuff output by the real companies, eh? Well, not so. Not only are there "real games companies" that develop this way (because they're just not big enough to have this kind of relationship with Microsoft), there are also a &lt;em&gt;lot&lt;/em&gt; or &lt;a href="http://www.breezegame.com/"&gt;really good quality games output by "bedroom coders"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you look at the Apple/iTunes App Store, every application or game sits equal. A game I publish, sits alongside a game published by a large company like EA. There are "league tables" for ratings and sales, which allow the best games (whether they're from a large games publisher, or a single coder in his bedroom) to rise to the top. For all of the faults with Apple's App Store, this is how it should be. If an individual puts out some work that is better than EA, then it deserves to be above them. Consumers care games, not about the companies (or individuals) behind them.&lt;/p&gt;

&lt;p&gt;I have no real idea, but I would estimate that &lt;em&gt;at least&lt;/em&gt; 75% of all apps/games on the App Store are created by individuals or companies too small to have relationships with Microsoft. That is a &lt;em&gt;huge&lt;/em&gt; portion of apps/games to relegate to "the shit section". One of the reasons the iPhone did so well was because of the third party software. If Microsoft screws over the huge majority of developers like this, it will absolutely affect the success of their platform. We're already lacking things like Achievements - it's already going to be hard to convince users they should buy our game instead of EAs's, so pushing us into the amateur category will just make things harder (And therefore, less worthwhile).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My interpretation of the quoted text may be incorrect&lt;/strong&gt;. I &lt;em&gt;really&lt;/em&gt; hope it is. It's also possible this affects only games, and not apps. Who knows? If games created by me are relegated on Windows Phone 7 like they are on the Xbox, then I'll simply put up with Xcode/Objective-C, and go back to coding for Apple's platform. And this means, despite my desite for a WP7 phone, I'd probably end up buying a new iPhone, and not a WP7 phone.&lt;/p&gt;

&lt;p&gt;Until this little mystery is confirmed, one way or another, my WP7 game is on hold :-(&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/08/did-microsoft-just-kill-windows-phone-7"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/NHHq_k3cH-c" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/NHHq_k3cH-c/did-microsoft-just-kill-windows-phone-7" title="Did Microsoft Just Kill Windows Phone 7?" /> <feedburner:origLink>http://blog.dantup.com/2010/08/did-microsoft-just-kill-windows-phone-7</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-08-16:/2010/08/giving-up-on-google-buzz-and-why</id> <published>2010-08-16T18:35:00Z</published> <updated>2010-09-25T12:36:00Z</updated> <category term="Google Buzz" /> <title type="text">Giving up on Google Buzz (and why)</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;&lt;strong&gt;I hate Twitter.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's always down, it's full of spambots, and 140 characters is just too short. If I find myself going back to shorten words to cram them in, then there's something wrong. It can't be my fault - I don't know any big words!&lt;/p&gt;

&lt;p&gt;With that out of the way, hopefully it's clear I'm a Twitter Fanboi. Infact, you could probably conclude that I'm a Google Fanboi. I host my domains at Google, I use their email (Apps for Domain - all free!), I even wrote this blog in Python - a language I've never used before, to host on App Engine. I'm a Google Trusted tester, and have been beta testing new features in Buzz for a few months. I'd go and work for Google at the drop of a hat.&lt;/p&gt;

&lt;h2&gt;Hate Twitter, Love Google, but Ditching Buzz? WTF?&lt;/h2&gt;

&lt;p&gt;It might sound a bit crazy, but there are good reasons. And in the interests of being constructive, I'm going to list them here. Some of them might (will) contradict things said above, but tough. That's how it is.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Not enough people using it&lt;/strong&gt;. It's catch 22, but all the people I want to follow do not use Buzz, so I have to use Twitter too. I don't need two services doing (mostly) the same thing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Posts are too long&lt;/strong&gt;. This might sound stupid given I said Twitter was too short, but the problem with Buzz is that it takes too long to catch up with things. I should be able to skip over a summary of posts, with a link to read more for the things that entice me. Twitter got the number of characters wrong, but the idea of restricting things right. I can skim over 24 hours of Twitter in 5 minutes. Not true of Buzz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.google.com/buzz/danny.tuppeny/MgciRQ6NUDs/Google-Buzz-Still-no-proper-sorting-WTF-Like-most"&gt;Google Buzz &lt;em&gt;still&lt;/em&gt; can't sort properly&lt;/a&gt;&lt;/strong&gt;. This one &lt;a href="http://www.google.com/buzz/danny.tuppeny/MgciRQ6NUDs/Google-Buzz-Still-no-proper-sorting-WTF-Like-most"&gt;really&lt;/a&gt; bugs me. &lt;a href="http://www.google.com/buzz/danny.tuppeny/MgciRQ6NUDs/Google-Buzz-Still-no-proper-sorting-WTF-Like-most#1277765377962000"&gt;Googlers suggested muting&lt;/a&gt;, but this is a pain in the ass, and will also break &lt;a href="http://www.google.com/buzz/danny.tuppeny/MgciRQ6NUDs/Google-Buzz-Still-no-proper-sorting-WTF-Like-most#1277742595190000"&gt;Google's clever algorithm&lt;/a&gt; that learns what I want to read. I want to read it - I just don't want comments sending it to the top!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;There are no decent iPad clients&lt;/strong&gt;. I love &lt;a href="http://iconfactory.com/software/twitterrific"&gt;Twitterrific&lt;/a&gt; on my iPad. Buzz doesn't have any decent clients (seemingly on any platform). I don't like web-based apps, they just aren't written to work with the device, and they're slow. I totally get that Google want to be web-based and work on all platforms. That really is great - but they will definitely lose out a little against clients written specifically for a device.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of these reasons are linked - eg. a decent client would surely sort properly :-) However, one of the problems that a third party can't solve is that it's impossible to render a decent "summary" of a Buzz post. The web application shows the first few lines, but this rarely represents the content of the article.&lt;/p&gt;

&lt;p&gt;I totally believe Google Buzz could &lt;em&gt;easily&lt;/em&gt; become a better service than Twitter (Apples to Oranges, I know, but there isn't really need for both). Unfortunately it has some major issues that just make it hard for me to use. It's entirely possible that my use case is wrong, and that it's a fantastic service for other people. For me, however, it just doesn't fit. It's like a lame version of Google Reader, without &lt;a href="http://reederapp.com/ipad/"&gt;the awesome third party iPad apps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the interests of getting feedback from people that might not visit to leave comments, I'll be following &lt;a href="http://www.google.com/buzz/danny.tuppeny/8yYaUTWyMm5/Giving-up-on-Google-Buzz-and-why"&gt;this post in Google Buzz&lt;/a&gt; too, though it's probably the only thing in Buzz I will be following!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/08/giving-up-on-google-buzz-and-why"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/1ry1KgSI2no" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/1ry1KgSI2no/giving-up-on-google-buzz-and-why" title="Giving up on Google Buzz (and why)" /> <feedburner:origLink>http://blog.dantup.com/2010/08/giving-up-on-google-buzz-and-why</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-08-15:/2010/08/breeze-xbox-live-indie-game</id> <published>2010-08-15T17:53:00Z</published> <updated>2010-08-15T20:47:00Z</updated> <category term=".NET" /> <category term="Games" /> <category term="XNA" /> <title type="text">Breeze - Xbox LIVE Indie Game</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Rob Hutchinson, a talented programmer I used to work with, from &lt;a href="http://www.nullcity.com/"&gt;nullcity.com&lt;/a&gt; has just release a game called &lt;a href="http://www.breezegame.com/"&gt;Breeze&lt;/a&gt; on the Xbox LIVE Indie Marketplace. It was built using &lt;a href="http://www.nullcity.com/?section=Kitae"&gt;Kitae, his 2D XNA Game Engine&lt;/a&gt;. I'm really impressed with how this game turned out, and I think it's going to do really well in the marketplace. I thought I'd plug it here, as I know many readers are XNA coders :-)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.breezegame.com/"&gt;Breeze official website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marketplace.xbox.com/en-US/games/media/66acd000-77fe-1000-9115-d802585505fa"&gt;Breeze on Xbox LIVE Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="text-align: center;"&gt;
&lt;object width="560" height="340"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/7kgi-y6W2O0&amp;amp;hl=en_GB&amp;amp;fs=1?rel=0"&gt;&lt;/param&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;
&lt;embed src="http://www.youtube.com/v/7kgi-y6W2O0&amp;amp;hl=en_GB&amp;amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/div&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/08/breeze-xbox-live-indie-game"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/Cc_j325q0_g" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/Cc_j325q0_g/breeze-xbox-live-indie-game" title="Breeze - Xbox LIVE Indie Game" /> <feedburner:origLink>http://blog.dantup.com/2010/08/breeze-xbox-live-indie-game</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-08-11:/2010/08/xna-games-competition-work</id> <published>2010-08-11T20:20:00Z</published> <updated>2010-08-11T20:20:00Z</updated> <category term=".NET" /> <category term="Games" /> <category term="XNA" /> <title type="text">XNA Games Competition @ Work</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;With the iPhone app I've been working on nearing completion, and &lt;a href="http://creators.xna.com/en-GB/launchcenter"&gt;Windows Phone 7 + XNA 4.0&lt;/a&gt; in sight, I recently decided to get back into game creation. I've previously released a game on Xbox LIVE Indie Games,  &lt;a href="http://marketplace.xbox.com/en-US/games/media/66acd000-77fe-1000-9115-d80258550221/"&gt;Jungle Blocks&lt;/a&gt;, but it wasn't very good, because I was somewhat excited about the idea of my game being live, and pushed the button before it was really finished.&lt;/p&gt;

&lt;p&gt;So, here I am again. Take 2. This time, I want to finish something. A game to be proud of! It doesn't matter how long it takes to finish, I've already done the whole XBLIG thing, so I aim to take my time and do it right.&lt;/p&gt;

&lt;p&gt;In order to keep me motivated, I decided to encourage my colleagues to get involved, by declaring a games programming competition. Until now, nobody else at work really knew XNA, so by getting others involved, there will be people to talk to and discuss ideas with. To encourage people to join in, even if they have other priorities, we set a 6 month deadline and set down minimal ground rules. To keep things fair, we decided:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Games must be legally publishable - e.g. no copyright material&lt;/li&gt;
&lt;li&gt;No paid-for assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We didn't define a platform/technology, to allow for iPhone, Android and other platforms, but as it turned out, all but one participant decided on XNA :-)&lt;/p&gt;

&lt;p&gt;It would be kinda lame for someone outside our company to win the competition, so I'm afraid you guys are official excluded. However, if you're interested in learning something new, I encourage you guys to lay down a similar challenge at your workplaces. If you do, be sure to let me know - I'd be interested to see how other people get on with the same challenge :-)&lt;/p&gt;

&lt;p&gt;I was toying with the idea of creating "Jungle Blocks 2" for the Windows Phone 7, since it wouldn't be hard to do, and if it was ready for WP7 launch, it could probably make a few quid before the marketplace fills up. However, because I have a (small, but real) advantage over my colleagues (having used XNA before) and because a few of them are ambitious enough to be doing 3D, I feel somewhat pressured into not being a wuss with a 2D game...&lt;/p&gt;

&lt;p&gt;So, my plan is now to build a small 3D RPG for the Xbox, something not too different to Zelda 64 or Mario 64 (though on a much smaller scale ;-)). I've not really played with 3D, so this feels like enough of a challenge that I'll learn a ton of stuff, but simple enough that I (hopefully) won't just abandon it half-way through (something I may have a reputation for...).&lt;/p&gt;

&lt;p&gt;Over the coming months, I'll blog about what I'm doing as I go. I can't promise I won't give up and go back to a 2D Jungle Blocks, but at least if I do, I can say I tried!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/2010/08/xna-games-competition-work"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/2QcP4yo7rW4" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/2QcP4yo7rW4/xna-games-competition-work" title="XNA Games Competition @ Work" /> <feedburner:origLink>http://blog.dantup.com/2010/08/xna-games-competition-work</feedburner:origLink></entry> <entry> <id>tag:blog.dantup.com,2010-08-05:/giffgaff-earnings</id> <published>2010-08-05T13:00:00Z</published> <updated>2010-10-09T19:30:00Z</updated> <category term="Mobile Phones" /> <title type="text">giffgaff Earnings - September 2010 - £100 in three months!</title> <content type="html" xml:base="http://blog.dantup.com/">
			&lt;p&gt;Those that &lt;a href="http://twitter.com/DanTup"&gt;follow me on twitter&lt;/a&gt; have probably noticed me talking about &lt;a href="http://www.unofficialgiffgaff.com/"&gt;giffgaff&lt;/a&gt; a lot lately. This isn't just some scam to try and earn money - I really believe what giffgaff are doing is fantastic. They're bringing lower prices (and cash for referring friends) by saving money by not having expensive TV ads or call centres. But this post isn't about who giffgaff are - you can &lt;a href="/giffgaff"&gt;read that in a previous post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Payback&lt;/h2&gt;

&lt;p&gt;To encourage customers to spread the word, giffgaff offers £5 to new customers that are referred by a friend. The friend also gets £5 as a thank you. So everyone wins. Additionally, you can earn money by helping out in the forums answering questions. The cash you earn can be paid out as credit &lt;strong&gt;or even real cash&lt;/strong&gt; via paypal!&lt;/p&gt;

&lt;p&gt;So, over the last few months I've been spreading the love, and earning a few quid. To show how easy this is, I decided to publish my earnings each month to show what you can earn! I'll update this post each month with the latest figures.&lt;/p&gt;

&lt;h2&gt;July 2010 Earnings - £59.52&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sim cards activated £5.00 x 8 = £40.00&lt;/li&gt;
&lt;li&gt;Emails sent £0.50 x 10 = £5.00&lt;/li&gt;
&lt;li&gt;Forum participation £14.52&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: £59.52&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;August 2010 Earnings - £27.37&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sim cards activated £5.00 x 3 = £15.00&lt;/li&gt;
&lt;li&gt;Forum participation £12.37&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: £27.37&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;September 2010 Earnings - £13.09&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Sim cards activated £5.00 x 2 = £10.00&lt;/li&gt;
&lt;li&gt;Forum participation £3.09&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: £13.09&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: The forum participation figure may be different each month, and depends on how much you post. The top posters earn around &lt;strong&gt;£25&lt;/strong&gt; in a month!&lt;/p&gt;

&lt;p&gt;This is a very reasonable amount of cash for doing very little work, and it suggests that not only will I never pay for my mobile usage, I'll probably be able to pick up new handsets for free (or almost free) too!&lt;/p&gt;

&lt;p&gt;If all this sounds good, and you want a free sim card with £5 credit to get started (Note: You only get the £5 if you are referred, and you must buy credit to activate the sim card and receive it), then &lt;a href="/giffgaff#simform"&gt;request one here&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Fore more info, check out the &lt;a href="http://www.unofficialgiffgaff.com/"&gt;unofficialgiffgaff.com website&lt;/a&gt;!&lt;/p&gt;

			&lt;p&gt;This post was served up via my RSS feed. Please &lt;a href="http://blog.dantup.com/giffgaff-earnings"&gt;visit the original article&lt;/a&gt; to read/post comments. If you found this article interesting, why not &lt;a href="http://www.twitter.com/DanTup"&gt;follow @DanTup on Twitter&lt;/a&gt; for more? :)&lt;/p&gt;
		&lt;img src="http://feeds.feedburner.com/~r/DanTup/~4/kfyrMo3obT8" height="1" width="1"/&gt;</content> <link rel="alternate" type="text/html" href="http://feeds.dantup.com/~r/DanTup/~3/kfyrMo3obT8/giffgaff-earnings" title="giffgaff Earnings - September 2010 - £100 in three months!" /> <feedburner:origLink>http://blog.dantup.com/giffgaff-earnings</feedburner:origLink></entry> </feed>
