Hamish Rickerby

Technology Consultant & iOS Developer based in Sydney, Australia

I’m on a List

| Comments

Yesterday I attended onedotzero at the British Film Institute. I was invited by alphalabs.cc to their launch event, in conjunction with Microsoft and Nokia.

It was pitched as “an experiment that merges technology and the arts” - and this blend (to me at least) is intriguing. Since I discovered “creative coding” I have been fascinated by the experimental applications that fit in this space, so didn’t want to miss out on this event. I have no idea how I got an invite… I wonder if it was because I’m a Nokia dev member, or because I have previously been active on the oF forums, or maybe I was just very lucky.

Some marketing and community/dev evangelist type people talked for a bit, and they weren’t over the top with pushing WP7.5 - which was good. There was a lot of talk about the lineage of the Metro design (that I found very interesting) - Metro is a relatively unique looking interface, and has some new ideas and interactions in it - so it was nice to hear how it was conceived.

Then, they pulled up 3 teams of developers and designers to talk about the applications they had made over the last two weeks - essentially showcasing the WP7.5 development environment (ease of use, speed, different technologies etc). This was the most interesting part for me. The applications were

  1. a music app that collaboratively generated music across 4 synchronised phones - Vequencer
  2. a music video/game in which you take the form of a 3D shape and can shift gravity and change shapes to navigate through the levels - Redshift
  3. a kaleidoscope app merging video and generative art that changes based on environmental factors such as motion and sound - Kaleidobooth

The applications themselves were quite impressive, but what impressed me more is that the team that did the second app (Field, Treehouse, and Ed from the XNA Users Group) had no experience with the WP7 or XNA development environments previously, and managed to create a 3D game in 2 weeks, with excellent graphics and sound. Very impressed.

And to top it all off, I got a free phone :-) Nokia Lumia 800 - it’s actually really nice. Screen is brilliant.

AND alphalabs are running a little competition too - app development - cash prizes. Doesn’t appear to be on their website yet, but I recall it closes in early Jan-2012.

(Update 20111128 - Ed from XNA User Group was also part of team two - thanks for the update Tristan!)

CASE and Requirements Management

| Comments

I’ve started the feature & function planning for my application - or really, I’ve started to identify the requirements for it. I’m starting by evaluating existing applications in the marketplace, considering the functions they support, the data they collect, and how the user navigates through the application. So far, I have about 300 screenshots from various applications, strewn all over the floor of my office, and 4 coloured pens for me to mark up the screenshots. The colours refer to the following areas of requirements or commentary.

  1. Brick red - bad UI
  2. Blue - data to collect
  3. Green - good UI
  4. Pink - application function, feature, or derived data

The functions are further classified into “things that should be there for a first release” and “things that can wait until later”.

What I’m looking for now is a sensible way to capture and manage all this information. Carrying around 300 pages of screenshots is just silly. I could have electronically marked up the Keynote presentation rather than do this on paper, but I don’t see myself reusing the information if it’s stored in that format.

As part of a contract my company has right now, I’m using a CASE tool for a project with a client. The business analysts on this project are tracking all requirements, use cases and UI modules within a tool called Enterprise Architect by Sparx Systems. I’m currently leading the technical workstream and we are also using it to produce our technical application design. It seems like a very comprehensive tool, but it’s Windows only. I’d love for a tool like that to be native on the Mac.

Other CASE and UML tools I’ve used in the past are:

  • Popkin System Architect (became Telelogic, then IBM and consumed into the Rational suite)
  • Rational Rose
  • ArgoUML
  • Troux Architect
  • Various Eclipse plugins

The issue I have with all of these is that it seems they will be disconnected from the development workflow if you use a mac, or are working on a non-Java project. These tools are supposed to help with the development process, but I can’t see how that will work if they aren’t connected to it. Yes, I understand the value in the whole planning and design side, but the disconnect to development seems large. If I didn’t care about having the process connected, I’d just use OmniOutliner as I have in the past for other personal projects - it can track requirements, feature/release planning, data model elements etc. But because of the potential size of this application, I feel I should be using something more structured.

Maybe the project should change to creating a decent CASE tool for the Mac :-)

At the moment the plan is to use Enterprise Architect, and we’ll see how that goes. One good thing is that I can export data out of it if the process doesn’t work out, so there will be little wasted effort.

If anyone has used CASE tools on the mac for Objective-C based projects, I’d love to hear what was used, and how the experience was - good or bad.

6 < 36

| Comments

Three years eh? I’m planning 6 months.

I guess the key difference here is that I’m not planning on having any employees at 6 months. I don’t plan on being able to replace the lucrative contracting I’ve been doing either. In fact, I don’t really expect any sales at 6 months.

What I am aiming for is to have a software product that I believe has a future. If, 6 months in, I have something that I can start to sell and get feedback on, I’ll be a very happy man.

Start With the End in Mind

| Comments

The product I’m going to make could be very large. There are loads of features it could support, but one of the first jobs I need to do is decide what it must do for a first release, that delivers value to customers. I’ve started getting in touch with small business people that I know to understand what they would value in such a product, but there are just so many diverse suggestions, even when I’ve given them initial scope for what I think the first release could do. I find myself thinking “that’s easy, that’ll only add a day or two” to certain features, but I’m fairly confident when it comes time to design these things, the duration and complexity will explode.

One thing that is common in pharmaceuticals (@mrsrickerby works in that industry, so I have a little understanding of how things work there) is that a “Core Data Sheet” - aka a core product specification - is written before and during development and testing of the product . This document specifies needs and wants which at the end of each phase of development are used as the yardstick to make go/no-go decisions. For example, if you want to show a 5% improvement in some disease state but your phase 2 study doesn’t achieve this, you stop development. It is a living document which, as data is collected, the actual product profile is documented which ultimately becomes the package insert (the bit of paper in the box).

This made me think about how I can manage my scope. The main marketing materials for me will be (1) a web site and (2) the Mac App Store description. I figure that writing the app store description will be the most effortless way to describe the product, the problem it solves, and how it solves that problem for the customers. If I can’t write down the very simple things like what problem this solves, and how it does it, then I should stop right now.

I think this also aligns with something I read recently (although I swear I’ve read this before months and months ago…) from the world’s toughest programmer, Mike Lee. App Genius Mike Lee Talks Product Engineering mentions that you should produce some marketing materials (he suggests a video) to explain why people should buy your product. I don’t plan on making a video, but the app store description fulfils the same purpose, and I’d argue that it’s more valuable, as it saves on a job later as it will be refined over time.

This is the approach I’ll be taking to my scoping.

  1. Define the problem my customers are experiencing
  2. Describe how my software solves those problems for them
  3. Scope the software to solve those problems, and eliminate unnecessary features (and keep them out!)

Work Plans

| Comments

As part of moving to Melbourne, I need to decide what I’m going to do to generate income. Traditionally I would either take a Senior Solutions Architect or Enterprise Architect job in a telco, or look for an equivalent role contracting. I think that’s not going to be the case quite yet.

After talking to @mrsrickerby at the pub about this (all our big decisions are made at the pub), we collectively decided that I am going to continue to work for myself. Not as a contractor though, but trying to create a sustainable software company, that is more than a 1 man band.

Ever since I attended university, I have wanted to make software products for small businesses. I really believe the small business segment is underserved by existing products in the marketplace, and given the size of these organisations (1-10 people is the company/customer size I’d want to target), software and computers need to get out of the way and let the people run their businesses, rather than manage and maintain software. This is also probably the last opportunity I’ll ever have to give a project of this magnitude a go. I expect we’ll be looking to settle down soon, get a family home, big mortgage etc and I can’t take risks like this when I’d have all that to lose. It’d be unfair on everyone involved.

So, I’ll be working for 6 months when we arrive in Australia, at home, by myself, trying to create a product to help small business people run their businesses, as unobtrusively as possible.

I’ll also be enlisting the help of some friends. I can design software and systems very well, but user experience, graphic design, copywriting and the like are not my forte. Luckily I know some people in these areas, and I’ll be drawing on their knowledge and skills too.

So, the 6 months starts in the New Year (2012) and if by June 2012 and it looks like I could have something to replace the contracting work I’d alternatively be doing, I’ll be continuing on with the product. The alternative isn’t bad - it’s just not my dream.

Luckily I’ve managed to save up a runway of cash from working in the UK, and my wife is getting a good salary too, so we won’t be eating pot noodles to make the $$$’s stretch. My wife is very supportive.

Big Changes

| Comments

Big changes are taking place. My wife @mrsrickerby and I have decided that we are going to move to Australia. Well, not so much that we are going to move to Australia, more like we are moving. At the start of December 2011. To a city I have never been to before. Melbourne.

The rationale behind the move is that we would both like to be closer to our families. We’re both from New Zealand, and the UK for us was only ever temporary. We’ve been here 5 years, and it’s time to move on. We’ve had a good time here. Reading is the place I’ve spent the 3rd most time in, only being beaten by Auckland (if you count living in a hotel in Sydney for 9 months as living in Auckland), and Christchurch where I spent just over 21 years.

My wife has a job organised there, but I don’t. I’m a telco consultant, and have worked for myself for the past 18 months or so doing this, as well as developing iOS applications for myself and the occasional client. I really like software product development, and would like to do more of this. Melbourne isn’t the best city in Australia for what I do (Sydney would be a more sensible choice for my work), but it’s probably time for a change, or at least, a commitment to try something I’ve wanted to do for a long time.

More soon.

iPhone & iPad (iOS) Localizations and Regions

| Comments

Recently I have been doing some localizations of an iOS app from English (US) to English (UK). The iPhone development guides from Apple describe how to support multiple languages (such as English, German, Japanese), but fail to describe how to support multiple variants of a single language. By this I mean support support for US English, English, NZ English, AU English. The word I needed to regionalize was Behavior (or Behaviour, depending where you come from).

In the Apple Developer Library, it explicitly states that for MacOS applications take both the Language and Regional preferences of the user into account, but only look at the preferred language on iOS - Support for Internationalization. This means that a single variant per language is supported.

However, these is a way around this. I’m not sure if this is a good thing to do, but it works for me and I haven’t noticed any ill side effects yet.

To support both US English and British English in your iOS application, create 2x Localization.strings files just as you would for multiple language. Put the US English translation file Localization.strings in a directory in your iPhone app called English.lproj (Apple defaults) and the British English translation in a directory named en_GB.lproj (just in case they decide to support regions in the future).

Then, you’ll need to create some code to manually set the preferred localization. In your main.m file (yup, main.m is being edited) alter it so it performs some logic similar to below.

int main(int argc, char *argv[]) {
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
  NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
  if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) {
      [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"];
  int retVal = UIApplicationMain(argc, argv, nil, nil);
  [pool release];
  return retVal;

When the line

int retVal = UIApplicationMain(argc, argv, nil, nil);

gets executed, it seems to set up all the Localization bundles before calling the application:didFinishLaunchingWithOptions method on your app delegate, so putting Localization code in the app delegate is too late. So, what the code above does is retrieve the users current language and region, and compares those against pre-determined values - en for the language and gb for the region. If these match, then I force a new setting in the NSUserDefaults to overwrite the users preferred language. Then, when the UIApplicationManager function gets called, it appears to retrieve the users preferred language setting, and look up the Localization for that - which in my case I’ve forced to be en_GB.

One thing you need to be careful about is persistence of this NSUserDefault setting. It is saved once it’s set, and persists through multiple application executions. To get around this (lets say the user changes their region back to US), you need to remove the setting after the bundle initialization has taken place. In you app delegates application:didFinishLaunchingWithOptions method, just execute the following code.

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];

This wipes out the NSUserDefault setting that the app made in the main.m file.

If anyone knows of issues with this approach (apart from being a dirty hack), or faults with my code please let me know in the comments below. I wish Apple supported different regions per language natively in iOS but they don’t. This is the only way I’ve found to do this, and continue to use localization functions such as NSLocalizedString.

Moving Van

| Comments

Yesterday when I came home Moving Van’s sales were up. I was a bit surprised as I hadn’t done any specific marketing for the app, and what was really odd is that they were only up for the UK. A little investigation and I discover that Moving Van has been featured as “New and Noteworthy” in the iTunes Store UK.

Moving Van in the iTunes Store

How frickin’ exciting!

Ad From Digg

| Comments

Seriously, WTF? I assume it’s some sort of movie tie-in…

Calculate Age in Objective-c

| Comments

For an iPhone application I’m developing for a client I need to capture the birthdate of a user, and then show their age on a profile screen. I went looking for a function to help with this simple and tedious task, but couldn’t find any example code that could be lifted to help me, so I rolled my own. ┬áHere is what I made, steal as you see fit.

- (NSInteger)age:(NSDate *)dateOfBirth {
  NSCalendar *calendar = [NSCalendar currentCalendar];
  unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
  NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]];
  NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth];

  if (([dateComponentsNow month] < [dateComponentsBirth month]) ||
      (([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) {
    return [dateComponentsNow year] - [dateComponentsBirth year] - 1;
  } else {
    return [dateComponentsNow year] - [dateComponentsBirth year];