Rob Smyth

Saturday, 5 December 2009

OffByZero's Cobalt effort

Software development is all about automating people's processes. I love it when somebody makes the difficult simple. That has gotta be the holy grail of software development. Gotta respect the work done by OffByZero's Cobalt release ...

OffByZero Cobalt is a turnkey software licensing solution for .NET. It integrates with .NET software in a matter of minutes, and provides a powerful and flexible means of licensing the application and individual features within it.

Cobalt supports a variety of platforms (including Citrix and VMWare) and provides for a range of licensing scenarios (including offline licensing, product activation, and dynamic licence configuration).

There's a great screencast demonstrating Cobalt integration at and detailed documentation at

Sunday, 29 November 2009

VisualSVN Server

I respect software that 'just do it'. In this case, I like the way VisualSVN Server, makes installing and managing a Subversion server.

I've installed subversion servers a few times. Not difficult but not doing it often it does require reading instructions, knowing a few command lines, and configuring a few files. But tonight I'm playing with another little experimental project and I find working without version control ... hmmm .... 'interesting'. The project is experimental so it would premature to create an on-line repository (e.g. GoogleCode, Sourceforge) so I downloaded VisualSVN Server, ran the installer and had a running server is just a couple of minutes.

The VisualSVN guys made the job easier by:
  • Making the ignores of: bin, obj, *.suo, etc default. So I did not need to import and then go through the process of ignore and delete.
  • Prompted for the creation of the conventional (trunk, tag, branches) folders, so I did not have to create them.
  • Provides a nice simple GUI that showed me up front the subversion URL (no reading documentation for the port number) and I could add myself as a user while I was committing.
Nice job guys. Slick. As a software developer my job is to automate other people's processes, I appreciate it when others automate my processes.

Thursday, 26 November 2009

Resident Bushfire Gear

While trying to find a bushfire/wildire balaclava/bandana I thing I'm finding a void between the professional/volunteer firie and residents. I'm finding it surprisingly difficult to find gear suitale for a resident's fire kit.

In particular I wanted balaclavas for our kits. I want balaclava that can be used "as required" rather than "in standard preparation". A fire fighter will take on protective gear through training and the knowlege of what is possible. But I'm looking for solutions on extrem fire rating days that allow me to deploy as conditions get worse. A progressive solution. I'm not a firies, so I'm not expecting the worse. I found what seem like good balaclavas, but they require clothing in advance. I want one that I can place in a pocket and use, quickly, when needeed.

Being an (not a firie) resident I do not think I'm going to dress in advance (it will be bloody hot!) and I do expect that conditions will change (worse case) rapidly.

Great products out there but I want one that has something like a velcro strip so I can slap it on as needed. (I'm a whimp so if hot I probably will not be wearing it until really needed).

The photo shows the one we got. Seems good, but I would rather one that did not need me to put it on before doning a helmet.

Balaclavas/Bandanas I have found:

  • Friday, 20 November 2009

    Bushfirre FDR - Potential Yet To Deliver

    Following the tragic bushfires (wildfires), and the interim report from the 2009 Bushfire Royal Commission recommendations 5.1 & 5.2, we now have a new Fire Danger Rating (FDR) system which seems good but is, currently, difficult to use.

    We have, following community education, based our fire plans on the new FDR. But I'm finding it difficult to keep informed of the forecast FDR. The media gives great details of the "Total Fire Bans" (TFBs) but not the new FDR.

    I'm wondering if the CFA's community education had been successful but not supported by the media, CFA web site, and the BOM's web site.

    Gotta love the CFA. Great organisation that we owe so much to.

    Friday, 13 November 2009

    Monday, 19 October 2009

    NMate - Missing In Action?

    Anybody know were to download NMate? There seems to be plenty of download links but not work. Sounds like a useful NUnit application.

    Friday, 9 October 2009

    Source Code Outliner PowerToy

    Another useful, and free, VS2008 tool Source Code Outliner PowerToy.

    Why install? Well it is free, painless (negligable learning curve), and it helps.

    Install it and go to the menu View | Other | Source Code Outliner Power Toy’. Then drag the window to dock into your Visual Studio IDE (see picture). Now you can forget about about it .. it adds more convieniant navigation that offered by the standard IDE drop downs.

    Not a killer app, but nice.

    Thursday, 8 October 2009

    PowerCommands for Visual Studio 2008

    I came accross 'PowerCommands for Visual Studio 2008'. It looks to me like one those free tools that you 'just should' have. Not a killer app, but no cost, no learning curve, and it makes life easier. The 'Collapse All' command, which collapses all projects in the solution explorer alone makes it worthwhile. I'm liking it already.

    Edit Project File looks real useful if you have embedded MSBuild community tasks.

    Hmmm ...'Undo Closed' looks interesting.

    Monday, 5 October 2009

    I'm Too Young For The Internet

    I'm trying to sign up for an aaNet ADSL account and got the attached error.

    I'm chuffed.

    "I need my mummy"

    Wednesday, 2 September 2009

    Gimmie - Mimo Mini USB Monitor

    I want one! USB powered with touch screen. Yum. Check it out here.

    What a great solution for a build box light, or context shortcuts like build and test, deploy, show me the weather radar.

    Just a wonderful solution looking for a problem.

    Monday, 31 August 2009

    diagrammr - A Good Example Of Domain Language

    diagrammr is a great example of how domain language is so powerful. There are many good drawing packages that can do the same with drag and drop of objects and lines with arrows. Drag and drop seems so self evidently the simplest solution. But then comes a nice app like diagrammr that show that the four simple steps can be done in one for a particular application. Kinda a 'flat earth' discussion.

    If we can write code in a language that matches the domain how can we go wrong? I'm thinking using architects/designers to develop a language so that others can implement the application. Now that would be leveraging skills.

    I recently got a link to 'diagrammr' from Nitins Knowledge Share list.

    Wednesday, 29 July 2009

    My First Love ... From An Error Message Anyway

    First time an error message has brought a smile to my face. What a wonderful caption.

    Gotta respect a company that can turn an error message into a smile. Wow.

    Wednesday, 24 June 2009

    Bushfire Bunkers #2

    We are actively considering a bunker as a last resort option for our home, but I remain worried about them. Tonight I came accross the following from CSIRO's page 'Q&A: Victorian bushfires':

    What research has CSIRO done on fire bunkers?

    CSIRO is not currently conducting research into bushfire bunkers or shelters. Previous research by the Department of Defence indicated that underground bunkers may not be safe in bushfires due to the accumulation of toxic gases coming from a bushfire itself.


    As well as the technical issues, there are a range of other considerations including:

    • decision making processes and education around when to retreat to the bunker
    • when to close off a bunker
    • how long to remain in the bunker
    • how to determine when it is safe to exit the bunker.


    It is a worry.

    Thursday, 18 June 2009

    Bushfire Bunkers

    I've not been a fan of bushfire bunkers. I think that if you cannot defend your home you should not be there (leave early meaning prior to 10AM before there is a threat). But, living in a bushfire risk area, and given recent credabile information we are now looking at a bunker as a backup / last option. There are a few bunker options on the market but a couple that I find 'interesting' have emerged (I'm not an expert, just my opinion).

    Interesting options (with very different pricing) are:

    * Wildfire Safety Bunkers
    * MineArc Bush-Fire Chambers

    (Wildfire Safety Bunker image shown)

    A bunker approach does worry me. See my notes here.

    Gosh You Would Hope It Is Worth It

    In order to sell a safety product it must surely inspire confidence. But does it need to inspire fashion, good looks?

    The image of an excape mask makes me wonder about the old saying ...
    "I would not be caught dead ..."

    Friday, 12 June 2009

    Bushfire House Survival Meter

    This week I purchased a 'House Survival Meter' produced by CSIRO. Really cheap (less than $20) and it is a bit of an eye opener. If this of any interest you, just phone the company given on the site and you will have it tomorrow or the next day. Just do it!

    I wonder if one was sent one to every home in 'rural' and 'bushland residential' Australia if it would raise community awareness of risk. I recon it would.

    BTW, the meter gives our home a 30% probability of survival if attended and has changed my plans. Hmmm ...

    Thursday, 11 June 2009

    Componentalization Can Be An Enabler For Automated Testing

    While working on componentalizing a project (think Domain Driven Design) I have become aware that componentalization may reduce reliance on User Acceptance Testing (UATs) of the application to something simpler and lighter kinda like integration tests. Thing is that these tests are not quite UATs nor integration tests so I've found I need another name to enable effective focus and conversation. The name I'm currently using is 'Component Tests'.

    Here is the thing ... you could say that the user of a component, via its API, is a different user. In this case a developer or team. So, component tests are UATs. Sure, but this language looses the focus that UATs have given us of creating automated test as close to the real thing (mouse clicking a button) as possible. Thing is that this makes UATs inherently slow and difficult to test all the corner cases. For example, what if the USB memory stick fails after the user clicks the 'Do It' button but before the save is completed? Hard from a UI level. But if the UI code is moved to its own component and the 'do it' logic in another domain component then this testing is on the domain component via its API. Not hard.

    So component tests differ is difficulty, speed, and only the UATs actually test the final functionality. Whenever developers use tests at code level the question is 'how can I know this is the functionality used in the product?'. By componentalizing the products code this risk is greatly mitigated giving the end customer confidence. He/she can believe that the component tests do test the functionality used in the product as the component is clearly identified. A user database component is more likely to provide the functionality of adding a user than the product help framework component.

    Critically a component must provide encapsulation, typical via an API. The API is the line of demarcation defining it from integration or unit tests.

    The potential advantages are:
    • Simpler to test corner cases, more unit test like. An enabler for better tests.
    • Test run faster. Essential for Continuous Integration (CI) and a cost saving for any project.
    • Componentalization means fast developer and build box compile times.

    Wednesday, 3 June 2009

    Developer Continuous Integration Visibility

    I wonder if it would be useful to measure individual developer commit rate (say over last day) and display this on a screen alongside a teams story board, or in its area. This metric gives an indication if a developer is in trouble and has gone 'stale'. Happens to me some days :-).

    Of course all days are not equal and some days can be dominated by non-coding work. Hence the reason for placing the monitor next to the story board so it becomes useful information during stand-up (if the team does that kind of stuff). So a team member can report ... "yesterday I was distracted by administrative tasks so you can see my commit rate was low". Great to raise the visibility on this kind of stuff.

    Perhaps the screen could look something like this ...
    In a team using CI I often find a drop of commit rate as an early indicator that somebody needs help (sometimes me!).

    Cyclomatic Complexity To Monitor Unit Test Coverage

    NCoverCop has proven to be a great tool that I like a lot. It fails the build if code coverage falls. But, people always trump process and there is always the temptation to write test cases for code coverage rather than test the code. All too easy. I wonder if a better approach would be to measure project cyclomatic complexity (CC) against number of test cases.

    If the code CC rises then the number of unit tests is expected to rise by the same amount. The benefit is that this approach gives more focus on testing functionality rather than ensuring coverage. It does not ensure that the tests are completed, but perhaps it is an improvement.

    It is interesting to note that NCover version 3 offers CC metrics. Only problem is that NCover can be set to fail the build if a metric falls below a threshold but it does not, of its own accord, detect falls from last value. Besides, if code is deleted, it is acceptable for the number of test cases to fall by the same difference as the CC.

    Here the metric that matters, and should fall with time, is the difference between the test case count and the CC.

    Thursday, 28 May 2009

    For non-trivial applications I'm finding Visual Studio's designer to be a bit of honey pot for corruption. Great for a trivial app but it exposes just too many options. Once the application design has been defined I'm wondering if some think the following code is simpler and simpler to maintain than traditional designer generated code.

    using NDependencyInjection.interfaces;
    using UISpike.Application;
    using UISpike.Controls;
    namespace UISpike.Scenario3.InjectionApproach
    public class PageBuilder : ISubsystemBuilder
    public void Build(ISystemDefinition system)
    using (var page = new ActionResultsPanelBuilder(system))
    using (var actions = page.Actions)
    actions.HasButton<IFrontCamera>("frontCameraHomeButton", "Home Camera");

    using (var content = page.Content)
    using(var splitPanel = content.HasSplitPanel())
    using (var panel = splitPanel.LeftPanel)
    panel.HasNumericLabel<IFrontCamera>("fronCameraPosition", "Front camera pos", "#,###");
    panel.HasNumericLabel<IRearCamera>("rearCameraMotorPosition", "Rear camera pos", "#,###");

    using (var panel = splitPanel.RightPanel)
    panel.HasCustomControl(new BigGraphBuilder());

    Storing a .Net C# Generic Type Parameter

    From time to time I hit the problem where I have a call to a generic method where I need to resuse the generic type for later use. Today I think I found a simple pattern that solves the problem.

    A code fragement explains all (I hope):
      public class MyRegister
    private List<IToken> tokens = new List<IToken>();

    public void HasService<T>()
    tokens.Add(new MyToken<T>());

    public object[] UseRegisteredGenericTypes()
    List<object> results = new List<object>();

    foreach (var token in tokens)

    return results.ToArray();

    public class MyToken<T> : IToken
    public object DoSomethingWithMyType()
    // Do the stuff here like ... return myApp.DoStuff<T>();

    Sunday, 26 April 2009

    Seduced to Compliance by the Process's Dark Side

    Bloged on PL's suggestion ...

    Working in a Agile fashion can be hard. It means collaboration, passive compliance is not enough. Using eXtreme Programing processes is even harder. XP is a set of high discipline processes. But I've often noticed that the jargon of both Agile principles and XP processes are just too easy to misinterpreted. This has lead to the birth of an Agile and XP dark side, an interpretation that absolves developers of all responsibility, encourages passive compliance, and gives the customer god like powers. It moves responsibilities to the customer.

    The XP Dark Side seems to me like planning for failure in a way that the developers cannot be blamed. It is the customer who will be left holding the baby. Real seductive if you want to code without responsibility.

    The most recent XP Dark Side smell I have come across is the:
    'A story is what the customer says it is.'
    All hail the customer :-)

    The customer is seen as an all powerful, all knowing, boss figure. The developer a passive compliant servant. Sometimes this comes from the customer as:
    'I'm the customer, I can do anything I want.'
    Command and control? Certainly not agile.

    A collaborative team (which includes the customer) should never move forward without the customer's full agreement, so at the end of the day the story will always be what the customer, and the team, say it is. The customer is a vital leader and owner here, but he/she is not all knowing. The team has a responsibility to work with the customer. Collaboration (Agile) is a choice, but if taken, it requires everybody to contribute to help.

    I think that an Agile developer's responsibility includes investigating the cause of defects to validate the design and remove the source of future defects. Code health is the team's responsibility. To delegate this to the customer leaves a conflict of responsibility which results in the 'oh that happened because you did not let us ...'. To delay the investigation distorts velocity and the work must be done and leaving it only increases the cost.

    So customers ... beware of the dark side :-)

    Friday, 17 April 2009

    NCover Scalability

    We seem to have hit a glass ceiling with NCover on our build process. We run NCover on all builds to ensure that coverage does not fall (thanks to NCoverCop). In the last couple of days we have started to get out of memory exceptions. It seems that the process of generating a coverage report just takes too much memory.

    The project is significant but not large (yet) so this was a surprise. The solution seems to be to break up the coverage test into multiple build tasks.

    Thursday, 16 April 2009

    Is Domain Entity Migration The Real Need?

    'Data Migration' has always been a real 'challenge' in each project I've been involved in. Sometimes it is a seen as migrating application file format, other times database schema. I wonder if the perception does not match the need and hence ends up more complicated than necessary.

    Where the file / database is used to persist an application's state or configuration, and not raw data to be processed, I'm thinking that they are presenters (aka UI forms) that happen to provide persistence. This perspective moves the focus to being able to migrate application objects, the file format is an 'end to means' rather than the objective.

    The 'need' is to be able to restore an application's state. Maintaining some presentation of the that sate (ala file format) is one of multiple solutions and not the objective/need. These conversations so often come down to what we think is possible rather than what is needed.

    I'm hoping to use this approach with NXMLSerialiser (to be known as NSerializer) so that migration can be supported independent of file format such as binary or XML. It is the objects that matter.

    A snapshot of my current thinking:

    public class VersionMigrationBuilder : IVersionMigrationBuilder
    public void Build(IVersionMigrators migrators)
    migrators.PriorToVersion(1, 2, 3).UseMigrator(new V010203Migrator());
    migrators.PriorToVersion(1, 2, 2).UseMigrator(new V010202Migrator());
    migrators.PriorToVersion(1, 2, 1).UseMigrator(new V010201Migrator());
    migrators.PriorToVersion(1, 2, 0).NotSupported();

    public class V010201Migrator : IMigrator
    public void Build(IVersionMigrator versionMigrator)

    I'm keeping notes here.

    Tuesday, 14 April 2009

    Iffy Density - A Useful Metric?

    Any mention of code metrics is on slipery ground. Metrics are good, given a problem, and are best only used until the problem is solved...

    I wonder if an 'Iffy Density' (my invention until I'm told otheriwse) is a useful metric to indicate code health and probable defect density.

    Iffy Density is a measure of the number of 'if' / 'case' statements within a method or class. Will these add to code's TLA infestion with MID and CID :-)?

    Monday, 13 April 2009

    Using Subversion Revision as the AssemblyVersion - Revisited

    I've been using MSBuild tasks for a while to automate the generation of an AssemblyInfo.cs file with an AssemblyVersion that matches the current Subversion revision (commit number). See my prior post here. But, I've had mixed success with that approach and this posting is about using the Tortoise SubWCRev.exe utility that I hope will be more appropriate to open source projects.

    The Need
    • Automate the file and assembly version numbers to use the Subversion revision number for the revion number in '...'.
    • Make the project configuration visible in the Visual Studio 2008 UI.
    • Suitable for debugging by typical developers using the VS2008 UI.
    • Project compilation without third party application installation.

    The Problem

    The MSBuild community task approach works but its configuration is obfuscated from the typical software developer user. It requires all users to have the MSBuild community tasks installed on the developer's (user) PC. That alone is not the 'obfuscation', thing is that if a user tries to build the project on a PC that does not have the MSBuild communicaty tasks intalled they are given an error that cannot be fixed withing the Visual Studio 2005/2008 UI that they are using. This is the critical 'usability' issue that I have found.

    It has not been such a problem for commercial use as a software devs are resolved early and only once on each developer box and probably documented for future developement or maintenance.

    But I have found it to be a big inhibitor for open source software users. The code cannot just be download and compiled without either reading all the documentation to find such details (a deoderant ... it ought to be self evident or, better still ... just work). It means that if you have many users you will incur a significant support cost or the inhitor will reduce user product acceptance. In other words ... ungood.

    The Solution

    After much googling I came across Bruce Boughton's blog showing how to use the TortoiseSVN SubWCRev.exe utility in a pre-build event. His solution did require a little pocking around in the Visual Studio project file and also required TortoiseSVN to be installed on the PC. I've adapted it a bit here is my solution:

    1. Add the existing AssemblyInfo.cs file to Subversion's ignore list. This file will be replaced by the auto generated file later.
    2. Copy your existing AssemblyInfo.cs file to a file named AssemblyInfo_temp.cs. This will become the source file used by the auto generator. Move this new file into the Properties folder by drag and drop in VS Solution Explorer pane.
    3. In the new AssemblyInfo_temp.cs file add required SubWCRev.exe keywords. We want to set the version revision so change your [assembly : AssemblyVersion("")] to [assembly : AssemblyVersion("1.0.0.$WCREV$")]. If you want the FileVersion to be the same, delete the FileVersion entry.
    4. Copy the TortoiseSVN SubWCRev.exe file into your source tree. I keep a Lib folder in the root (trunk) of all my project source folders. In this case I copy the file to Lib\TortoiseSVN\SubWCRev.exe to make it clear it is a TortoiseSVN file. This way anybody can download the project and compile without the need to install TortoiseSVN (although anybody using Subversion should anyway).
    5. Now add as a project pre-build event: $(SolutionDir)..\Lib\TortoiseSVN\subwcrev.exe $(ProjectDir). $(ProjectDir)Properties\AssemblyInfo.cs.tmpl $(ProjectDir)Properties\AssemblyInfo.cs.
    Done. This solution does require copying a TortoiseSVN file into your source tree. TortoiseSVN is an open source project, check its license to be sure you can use it. Otherwise install TortoiseSVN and reference the installed file.

    Friday, 13 February 2009

    A Support Antipattern

    Yea, a negative post about a company. I wondered if to mention the company, but in the online community we have a responsibility and, I recon, these guys have raised the bar in how to not treat a customer.

    Last week I placed and order with I-Tech and to their credit they delivered what I ordered fast. But on receiving the order I realised I made a mistake. I ordered the wrong item. Yep, no doubt, my mistake. I can use the one I ordered but another would be 'better' (I can live with that).

    So, I was wondering if I could exchange it for the one I wanted. I emailed the company making it clear that it was my error. I would have only been 'disappointed' if they said a 'sorry ... but no' but the treatment I got was ... well ... 'disappointing'.

    Here is a good lesson on what not to do ....

    I sent my first email to 'sales', my first surprise was their response:
    Please write the email to our RA department. Their email address is

    Okay, so sales does not talk to 'RA'. So I forwarded the email to 'RA' (twice). They did not respond. Hmmm, not a good impression so far. I went back to to tell him/her/them that I had not got a response ... now I getting a real bad impression of this company and then I get the response:
    Was the item opened?
    I told them in my original email, but okay ... pressures of business. Some poor bugger sitting at a desk. So, I respond that I had not opened the box. The email form 'RA':
    If the box had been opened, we wont be able to accept your return.
    What! Why tell me that? Why try to aggravate your customer for no reason? Okay, now customer relationship is not the best but then I get another email from 'RA':
    Sorry, I just spoke with my supervisor, according to our company policy, we can not exchange an item simply because the customer ordered the wrong item or changed their mind
    "simply because the customer ordered the wrong item" ... true, and no doubt this is what the supervisor said, but gosh, not the best customer communications. (thx for the 'Sorry' though).

    You gotta wonder about the management of this company. They did deliver what was ordered well. But, if there is a problem with the order?

    Good script for the next 'The Office' TV series?

    Tuesday, 27 January 2009

    To Revert Is Right To 'Go-on' Is To Look Good

    As people come onto a team using continuous integration (CI) we usually hear:
    • 'I cannot commit as there are too many changes. (Has not committed changes as done)'

    • 'I cannot commit as I have conflicts. (Has not updated frequently)'
    It is a learning curve, and usally works out. But now a new guys gave some great feedback (in my words as I do remember the exact quote):
    The thing I have taken on is that reverting my changes enables me to deliver faster.
    So true. But I notice that when somebody says at stand-up that they did X hours and then reverted all changes, it is often seen as a failure. An intereting reflection on time to deliver working code to measured effort/behaviour/complexity/expired time/working. I think we have another dimension to software development about measuring success.

    Words seem to lead us. 'Perfromance' is about an act, delivery of working functionality in minimal time is about efficiency. Would we be better off talking about efficency than perfromance?

    Monday, 12 January 2009

    Compliance/Collaboration Confusion

    I've realised that collaboration can be confused with compliance, and when it is, collaboration can then be confused with resistance.

    Thursday, 1 January 2009

    Does Microsoft Not Want Australian Money?

    I've been using a trial version of Visual Studio 2008 for a while now and the time has come to buy a license. So I click on the VS2008 license pop-up which takes me to Microsoft's site ... a couple of hours later I've given up. I do not think it is possible for somebody in Australia to buy a license on-line from Microsoft.

    The Microsoft site takes you to their "Windows Marketplace" which is a front end to a regional "Microsoft Store". You must select a country ... no surprise Australia is not listed. Only about half a dozen countries are listed and I tried all of them. If you choose USofA you need to enter a US state. If you choose UK then your offered European countries, but no Australia. Similar story for the others, or I could not read Japanese, Korean, German, etc.
    I tried navigating from the AU site and tried different links. Humbug! I'm feeling very unwanted. I dunno if it is a web site fault, an oversight in letting us know we a 'special', or if I've just missed the right link.