Sunday, June 29, 2008

Scott Hanselman discusses Scrum with Ken Schwaber in his recent Hanselminutes podcast. A large part of the conversation centres on the meaning of “done”. When your developers say they are done and have completed a piece of work, what does that mean? Ken argues that unless it means ready to deploy and of known good quality (my words) then it is meaningless and, in fact, that any team can increase the apparent amount of work they do by varying the definition of done to mean something less.

One of the key things that he stresses is that the code must be refactored into a good state that can be used as a firm base for future development and that this is part of the work to get to done.

One of the observations that Scott draws out is that Scrum might look quite heavyweight compared to work done by a team before Scrum. At first glance this seems counter-intuitive until you realise that following a non-agile approach makes it harder to see whether the same definition for done is being used (and it probably isn’t). The team probably wasn’t doing solid testing, probably wasn’t ensuring that refactoring was being done, probably wasn’t creating a quality product.

This sounds all well and good if you have a skilled team working closely together. The question this raises in my mind is whether Scrum can therefore work if you have a mediocre team with only a few very good developers? Will the less-experienced developers be capable of refactoring the code so it’s left in a good state? The argument might go that it’s no better and no worse than another approach and you find out quicker what’s not working.

Saturday, June 21, 2008

Clearing out my loft I came across my collection of Sinclair paraphernalia. I worked my way up through the Sinclair systems, ZX-81, ZX-Spectrum and ultimately a Sinclair QL, all of which I still own. Bizarrely, since I can't remember when, I must have acquired a second ZX-81 because I find I now have two. I also discovered a small selection of Sinclair related magazines and, after a quick search on the web, ran into this fab web site: The Your Sinclair Rock 'n' Roll Years, complete with video montage of the history of the Spectrum, etc. This is awesome!

Friday, June 20, 2008

Apparently, the IE team sent a celebration cake to Mozilla to congratulate them on shipping Firefox 3. It's ironic that the mozillalinks.org page describing this with photos doesn't exactly display correctly in IE7. However, if you use IE8's new standards rendering mode then you do get the page as you expect.

While it will be necessary for many sites to "get ready" for IE8 to ensure that their content continues to be displayed correctly, some sites written to rely on CSS 2.1 standards will suddenly leap into life.

Wednesday, June 18, 2008

Phil Haack has a succinct description of the difference between MVC and MVP based on an explanation of why MVP evolved. Good stuff.

Thursday, May 01, 2008

James asked for the script I use. It's actually very simple and doesn't take advantage of any advanced features of AutoHotkey at present. Here it is:

#w::Run iexplore

#h::Run "C:\Program Files\Common Files\microsoft shared\Help 9\dexplore.exe" /helpcol ms-help://ms.vscc.v90 /LaunchNamedUrlTopic DefaultPage /usehelpsettings VisualStudio.9.0

#p::Run %comspec% /k ""C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86,C:\

#y::Run "C:\Program Files\TextPad 5\TextPad.exe"

#z::Run "C:\Program Files\Windows Live\Writer\WindowsLiveWriter.exe"

#x::Run "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe"

#a::Run "C:\Program Files\Winamp\winamp.exe"

#o::Run "%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe",C:\

^#p::Run "C:\Utils\BIN\elevate" -k %comspec% "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"

#Left::WinMinimize A

#Right::WinMaximize A

#Up::WinRestore A

Wednesday, April 30, 2008

While I think UAC is a good thing, it gets pretty annoying when running lots of commands at the command line that just turn around and say "sorry, I need to be elevated". I've blogged before about using AutoHotkey to run commands bound to keyboard shortcuts and I use Win+P to pull up a command prompt with all the environment variables set so that I can access developer tools like devenv and csc. Finally I started to look around at a way to bind an elevated command prompt to a keystroke.

The problem is that the runas command allows you to run as a different user but not as the same user but elevated. John Robbins obviously had this problem too and he wrote a blog article just over a year ago with his elevate command line app to overcome this.

Using elevate, I now can press Ctrl+Win+P when I want an elevated command line and then just hit Alt+C to continue past the UAC dialog.

Saturday, February 09, 2008

I ordered the Dell XPS M1330 with a specific trip in mind. Before ordering, I confirmed with their online sales agent whether if I ordered at that moment I would receive the laptop before I needed to leave. I was told that if I selected the 9 cell battery then it would be scheduled to be received no later than the day I was leaving but if I gave the agent my order reference number, they would prioritise the order so that it would be delivered in time.

I placed my order, gave the Internet Receipt Number, and asked if they would e-mail me to confirm when they'd had increased the priority of the order, which the agent agreed to before wishing me a "wonderful day ahead". I kept a copy of the transcript of the conversation just in case and awaited the e-mail.

Almost a week later and without having received anything and the predicted date still one day too late, I contacted Dell's customer support and asked if they could confirm that I would still receive the laptop before my trip and that the order priority had been increased as promised since it was on this basis that I placed the order in the first place.

Here is the personalised response that I received:

Thank you for contacting Dell online customer service. Please accept my sincere apologies for the delays you are experiencing with your order.

Your current estimated delivery date is [xx Feb 2008]. Order Number : xxxxxxxxx

Due to the popularity of the product our demand has exceeded supply. Our factory is working with our suppliers and Dell will always try and improve the delivery date on your order.

Once the order is shipped the carrier company will contact you to arrange delivery.

No mention of the conversation I'd had. No specifics. In fact this response could have been automatically generated given that my original enquiry indicated the topic was "checking order status".

I replied with the following:

Does that mean you can't now guarantee delivery on or before xx Feb? If that is the case given that was the condition on which I placed the order then I will have to cancel the order and request a full refund. Please can you confirm if I need to cancel?

I didn't really want to cancel the order but I was hoping this might provoke them into perhaps reading my original mail and maybe double-checking that they weren't going to live up to the original promise.

However the reply from Dell makes it apparent that their customer service system is driven by multiple-choice standard responses. Presumably the service agent reads your mail and has two or three different standard responses that can be sent at the push of a single button. This was their response:

Thank you for contacting Dell online customer service.

As per your request we have cancelled your order {order number xxxxxxxxx}, under Case number (xxxxxxxxx).

I have contacted the finance department to check whether we have received the payment or not in case we have received the payment the refund will be requested immediately once we have an update from Finance.

To be honest I was shocked and other people to whom I've relayed the story were speechless. You'd think they might be interested in trying to persuade me not to cancel. I was trying to give them money after all.

Dell used to be a great company. I've bought laptops from Dell for years and I can remember fantastic examples of great customer service from them. That time has gone. It's apparent that they don't care about their customers any longer. It's not clear whether the problem was with the original sales agent making promises that they knew they couldn't keep or with the customer service agent who it appears didn't really read what I wrote. They didn't try to put it right either way.

I'm not sure what I will do now. Both the MacBook and lightweight Sony laptops have a price premium and don't include some of the features of the Dell. Nevertheless, if it's not possible to actually buy the M1330 then I'll need something else. Most disappointing.

Friday, February 01, 2008

I've been considering buying a new laptop for home for a little while. I want something I can take away with me that contains no work stuff so that, especially when I'm on holiday, I can keep in touch with friends and family but not be lured into looking at work. I toyed briefly with the idea of a fancy Apple MacBook but I can't really justify the price premium. I've been thinking about the Dell XPS M1330 for a while - it gets good reviews and is lightweight and portable.

I read Brad Wilson's post about also buying one yesterday and it tipped me over the edge. From seeing Brad's posts and mails to the WinOffTopic list, I know he has a reputation for selecting good quality hardware. So today, credit card in hand, it was off to the Dell site and they now have my order. In the UK it's not possible to order some of the options Brad selected. They don't have the SSD option for example. I'm not sure I'd have gone for that, though, these disks are still pretty expensive and I can always buy one later when the price comes down.

Anyway, I'm looking forward to receiving it in a couple of weeks and hope it lives up to its reputation.

There's a big long list of problems that are fixed in the .NET Framework Service Pack 1 in this knowledge base article (945757). Some of these have very generic names such as "FIX: You may receive an exception when you browse a .NET Framework 2.0 ASP.NET Web application" but if you click through into the underlying articles you can see more information about the specific scenarios that are covered.

Some of the improvements have also been around improving performance, such as the ADO.NET performance improvements (via Sam Gentile). These changes have the potential to make current applications perform better with no code changes.

One of the questions that I'm often asked by customers, though, is for a definitive list of every change that might affect their applications. One particular customer said that they needed this list so that if something didn't work as expected, they could check off against the list to see if it was a Microsoft change or something in their environment. Unfortunately, life isn't quite this simple. There are some situations where the framework (or any product) works in a particular way by accident more than by design. The behaviour observed happens as a consequence of the way something was implemented but it wasn't by design. We never expected someone to rely on this behaviour and when we add new functionality or fix a bug it may change this behaviour (that we never intended in the first place). Nobody records that this is changed because we never recognised that it was a change - it wasn't a design change. In the end we can't keep lists of this sort of thing - when you're writing code in your projects do you keep a list of all the things you changed that your customers will never see? :-)

Monday, December 24, 2007

After evaluating the latest version of VMware Workstation 6 for my free month, I got out my credit card and bought a copy over the weekend.

I was last a VMware customer for Workstation 4 so I didn't qualify for a discount on moving to 6 but, despite the $200 price tag, I think it's money well spent. Microsoft's recent virtualisation investment is going into the server platform, specifically Hyper-V for Windows 2008. As a consequence, desktop virtualisation has been somewhat abandoned for the time being at least. There's really no comparison between Virtual PC and VMware Workstation.

There are a couple of features that make it compelling beyond what Virtual PC provides. The first is that I can run 32-bit Windows Vista as my host operating system, which gives me the best compatibility with drivers, etc. but I can experiment with 64-bit by running 64-bit guests. This means I can set-up 64-bit server environments to play with and also test application compatibility in 64-bit XP or Vista.

The second thing that I like, and that VMware has always been better at handling, is snapshots. In Workstation 6, there is a great dialog that allows you to keep a hierarchy of snapshots and to branch and prune just as you like. Here is an example of an XP VM that I've set-up to allow testing of both IE6 and IE7:

VMware Workstation 6 - Snapshot Manager

Scott Hanselman is working on a series of screencasts demonstrating the new features of the ASP.NET 3.5 Extensions. I watched his How-To Screencast on the MVC Framework a couple of weeks ago and marvelled at the quality of the experience that Scott has created. Very professionally done, at least I think so. Your view counts too, though, and Scott has requested feedback on his screencast style.

I bought Don Syme's Expert F# book a couple of weeks ago. This is the definitive guide to a language that's going to become an officially supported part of the Visual Studio family in the coming year or so. Amazon UK don't seem to have it yet so I bought from Computer Manuals and received a very speedy service.

I've seen quite a few rave reviews of Advanced Windows Debugging including from Raymond Chen and also from Mike. I think this one will make my wish list. :)

Tuesday, December 11, 2007

Last week there was an issue with the FolderShare service, which may have inadvertently moved original files to the FolderShare Trash folder. This is detailed on the FolderShare site:

December 7, 2007
-- Urgent FolderShare User Notification --

Dear FolderShare friends,

This message is to alert you to a potential issue with the data you have saved with FolderShare.

Please do NOT delete files from your FolderShare Trash folder until you have verified that you were not affected by this situation.

From 12/3/07 to 12/6/07, some files may have been accidentally moved from their original folders into the FolderShare Trash folder. The bug that caused this problem has been fixed.

The only files affected are ones with names containing certain characters, such as accents, trademark signs, etc. For example, “España.jpg.”

If you were impacted, your files should still be recoverable. They can be found and restored from the FolderShare Trash.

The actions to take if this has affected you are on the FolderShare home page.

Monday, December 10, 2007

I've been having increasing problems with my Sky+ box over recent weeks culminating in programmes that would just hang during play back. I tried reinitialising the hard disk using the built-in firmware but this didn't solve the problem and I figured it was actually a hardware issue with the disk.

Today, I replaced the disk with one that has been sitting on a shelf for a while looking for a home. I have a Pace 3100 (second generation) Sky+ box which came with a 40GB Maxtor drive and I've replaced it with a 300GB Maxtor. While I apparently won't get all that space available to record on, I should expect a much increased capacity. Frankly, though, if it just recorded reliably with the same capacity I'd be happy.

There are a number of web sites that describe the process of replacing the disk and it's relatively straightforward. So far, touch wood, the new disk appears to be working fine and the few programmes I've tested certainly claim a much lower percentage for the disk space requirement.

The Pace Sky+ box requires a Torx T10 driver to remove the screws both for the case and for the hard drive brackets inside. The FAQ above points to Maplin and Screwfix Direct for this. I managed to get one from my local B&Q.

Wednesday, October 31, 2007

There's no two ways about it, Windows Home Server is cool. The backup system is excellent, especially the part where it only backs up identical clusters for different machines once. This means that if you have the same OS on multiple PCs, all the OS files will be backed up only once saving a bunch of space. It also means that you get differential backups sort of for free.

First thing on Monday morning, my laptop blue screened due to a fault in the smart-card reader driver. When the system rebooted, my VPN software appeared to be missing and after trying to repair it for a few minutes I decided that even if I got this working I'd never really know why it had disappeared and if anything else was gone. Since I'd created no new files that morning and my e-mail was all stored on the exchange server, I went ahead and booted off the Home Server recovery CD. I picked the back-up image and it re-imaged the disk to just as it had been before the crash. Touch wood, it's been working fine again for the last couple of days.

I guess this post is really about the merits of having a simple backup strategy. Home Server just makes that dead easy.

Monday, October 29, 2007

In the Managing wildcards in paths section of Windows PowerShell in Action (Part 2) on MSDN, it says:

What happens when you want to access a path that contains one of the wildcard meta-characters: "?", "*", "[", and "]"? In the Windows filesystem, "*" and "?" aren't a problem because we can't use these characters in a file or directory name. But we can use "[" and "]". In fact, they are used quite a bit for temporary internet files. Working with files whose names contain "[" or "]" can be a challenge because of the way wildcards and quoting work.

The solution, it says, is the -LiteralPath parameter:

We don't want trial and error when we know the exact name of the file and want to suppress all pattern matching behavior. This is done using the –LiteralPath parameter on the core cmdlets.

Unfortunately, rename-item doesn't have the -LiteralPath parameter so it looks like renaming items with square brackets in their name is a problem.

After a little searching, I came across a forum post by Bruce Payette, Technical Lead in the PowerShell team, that explains the situation:

Here's what happened. There was a push just before the release of version 1 where we went through and cleaned up most of the wildcard quoting bugs. This was done right at the end so the work was triaged pretty heavily. Only the most important things got fixed since we were locking done for RTM/RTW. We fixed all of the *-Item commands except for Rename-Item, the rational being that the Rename-Item cmdlet isn't necessary since you can use Move-Item instead and Move-Item does support the -LiteralPath parameter.

The bottom line is to use Move-Item instead of Rename-Item.

I've recently copied over some Audible files from one PC to another. Had I used robocopy, I could have preserved all the timestamps but I just copied them in Explorer so I ended up with the situation where the last modified time was the same as the original but the created time has very recent. When you import files into your Audible Manager library it shows the created date. Since I usually sort by date so that my recent purchases are at the top of the list, this was something of a problem.

Having been used to the power of Unix shells bash and tcsh years ago, I was really looking forward to the promise of PowerShell. The problem was getting used to its syntax, which as with most powerful shells is a little arcane. Time being the scarce resource it is, I'd seen a few demos from team mates but never really taken the plunge. Returning to what I've known for years, that you learn something new best when you've actually got a need for it, I'm looking for opportunities where PowerShell will help me out. This timestamp situation is one.

I don't know if this is the best or easiest way to accomplish modifying the created time to be the same as the last modified time but it's pretty simple. I'm sure someone will tell me if it can be made simpler still.

dir | foreach { $_.CreationTime = $_.LastWriteTime }

In PowerShell, the dir command (actually an alias for Get-ChildItem) returns a stream of FileInfo objects. Piping them into foreach allows you to execute an action against each. $_ refers to the current object in the pipeline and PowerShell gives you direct access to the properties of objects.

Sunday, October 28, 2007

I've copied across my IE favourites to a new PC knowing that I need to spend some time going through them and reorganising. There are things there that probably don't point to anything useful and a bunch that could be easier to find if they were in sensible folders.

While looking through some of the random things just dumped in the top level folder, I came across the link I'd saved to TestDisk. I came across this tool some time ago while I was having a bit of a panic trying to recover some data. It saved me then and is hence fondly recommended.

At the time, I was planning to use the recovery CD for my Toshiba M400. It's purpose is to format the hard disk and re-write an image of a Windows install with all the drivers installed and the tablet features enabled. I started by copying all my important files onto an external USB hard disk and then booted off the CD. The imaging software seemed to get a bit confused because I'd forgotten to unplug the USB drive so I turned off the system, unplugged the drive and then tried again. Everything went fine this time and in a few minutes I had a brand new install of Windows. Everything started to go wrong when I plugged the USB drive back in. What I hadn't realised was that when the recovery disk got confused with the extra drive being present, instead of deleting the partition table on the internal drive, it had done so on the USB drive. So now, all my carefully backed up files were on a drive where the partition table was no longer present and therefore unreadable.

I tried a number of different attempts before deciding that I really needed a proper tool to try to fix this. Partition Magic from Symantec was one that was well known and considering the importance of the data, the price tag wasn't outrageous. Reviewing the product information suggested that it would do just what I needed and I could buy online. In the past I'd bought Symantec products online and found it very convenient. You download an ISO file then you can burn it to a disk and you've got the product there - easy. Only for some obscure reason, Partition Magic didn't come as an ISO file but just installed as a collection of files. This meant you couldn't boot off a disk as you would if you bought it from a store and for some reason, when running it under Windows on my laptop it just crashed while scanning the drive I wanted to repair.

I tried working with the support people from Symantec but they were pretty unhelpful. They didn't see the irony of them asking me to boot on a clean install of Windows and then to try it even though they hadn't given me a bootable image which would have made that easy.

At the end of my tether I gave up on Partition Magic and searched some more before landing on the TestDisk site. To cut a long story short, TestDisk did an exhaustive search of the disk (which took quite a while) before telling me that it had found an NTFS partition and was quite willing to re-write the partition table if I so desired. And so all my data came back.

These days I make sure that back-up drives are nowhere near being connected while re-installing the OS but I keep a link to this (free!) tool in my favourites.

Saturday, October 27, 2007

I used to use WinKey to bind the Windows key on the keyboard together with another key to use as a shortcut. By default, the Windows shell has some "hotkeys". For example, Win+R gives the run dialog and Win+E opens an Explorer window. I wanted some extras for common tasks and that's what WinKey did. Unfortunately, as you can see if you follow the link, WinKey hasn't been supported by Copernic since 2005. In the past, I noted that it didn't work completely without admin rights and under Vista that becomes common with UAC but I've struggled on nevertheless.

This weekend, I've built a new installation of Vista on my new desktop and wanted to find a solution to the UAC+WinKey issues. I'd considered writing my own version in the past but time being what it is never actually got around to it. It crossed my mind again today and in searching around for some clues to assess how hard it was going to be, I stumbled upon a solution that's already been written.

Enter AutoHotkey. This sophisticated utility allows you not only to bind keys to actions but includes a clever scripting syntax that allows you to re-map keys and take different actions based on what it happening on your system. As a simple example, you could bind a key so that it runs an application but if that application is already running it just brings the window to the front.

So far, I've only created some simple key bindings but I suspect that as things crop up that I want to automate, I'll be building upon the simple script I'm using now. Definitely recommended.

Friday, October 05, 2007

Once I'd made the decision to begin blogging again, I had a look around to see whether I should change the engine used to host my blog.

3 or 4 years ago, when I made the decision to move away from Radio Userland, I wrote my own engine using ASP.NET and SQL Server. What I created was very basic but the implementation taught me a lot about developing with ASP.NET. I focused on writing a scalable, reusable core that could readily be customised and made appropriate use of caching for commonly used data, such as the RSS feed. I was pleased with what I created and I had planned to extend it and add new functionality maybe even getting to a point where I might share the source code. In the end, I never simultaneously had both the time and the inclination to move things forward and that never happened.

These days my motivation is a little different. While I will likely always dabble in writing code and playing with new technology my passion isn't for spending every day in a development environment. There are so many things that occupy me both at work and in my own time that I really don't want to spend it building something that other people have spent enough time on already. For this reason, I decided to review the available blogging systems and to select one for my blog moving forward. I didn't have many criteria for the selection with the primary one being that I'd be able to import all my previous posts relatively easily. I quickly discounted Community Server as being overkill for what I wanted. I took a long hard look at dasBlog and was almost convinced. It didn't take much, in the end though, to persuade me to go with Subtext. I like the way the data is stored in SQL Server - I figured I may want to do some manipulation with that in future. I liked the way it was so easy to set-up - there were very few configuration settings before I was led through most of the settings through the browser. Finally, I liked the simple BlogML import feature that I could use to import my old posts.

One of my current interests is F# and so I wrote a small F# script that exported my old posts from SQL into a BlogML file. It only took me an hour or so and a large part of that was really learning about the F# features I wanted to use. I'll likely post about that in more detail in the near future.

I've written a simple redirect script that should map the old URL format to the new with a permanent (301) redirect. This should push search engines and aggregators to update their links. If you spot any broken links, please let me know.

All in all, I'm happy with the decision so far. Time will tell if I remain content with that decision but at the present time I would recommend Subtext if you're looking for a straightforward .NET blog engine.