Welcome to the new website!

If you have visited my site in the past you will quickly realise, I’ve had a revamp!

I’m very excited as Parkview Consultants is entering a new phase and I’ve decided to update the site to reflect my new focus. Bristol continues to thrive as a hub for innovation and my consultancy working with early stage tech companies is going from strength to strength.

As a result, some things inevitably change. My previous activity on Joomla!, for example, has been replaced by activities in mobile development, especially on the iPhone and iPad platforms. My web development work is now more targeted to linking mobile platforms with the cloud.

The new site, based on WordPress 3, is cleaner and clearer than the previous site. As part of the transition, I’ve also taken the opportunity to clear out much of the old content, so bear with me whilst new content is added to the site (mainly in the form of the ongoing blog entries).

I hope you like the new look and please feel free to leave feedback below.

Posted in Uncategorized | Comments Off on Welcome to the new website!

Benefits not features

It must be one of the most often quoted ‘Marketing Maxims’ but how many people actually take the time to step back fully and apply the maxim to their business and their marketing mix? What does it really mean anyway? What are the steps to analyse and formulate your benefits and then, how should they be presented?

To start to answer these, let’s take a simple example. What does a consumer want when they buy a power drill?

If you answered any of the following – hammer action, keyless chucks, SDS, cordless, rechargeable – then I’m afraid, in my opinion, you are way out. If you included – convenience, speed, accuracy – then you are getting closer. However, from my perspective the answer is simple. Somebody buys a drill because they need a hole. End of.

Now that we know what they want, we can offer them a hole. Any ‘feature’ we think of is only of use if it increases the benefit realised by the customer. Consider the following two very rough taglines:

Wodgets Power Drills, hammer action in an affordable cordless form factor

Wodgets Power Drills – easy holes in any material in any location at any time

I hope you agree that the second speaks to the customer. Now – and only now – we can start to identify the benefits that matter.

Possible benefits (and why the customer feels the benefit)

  • Speed – I can get my shelf up without spending all day and missing the footy
  • Accuracy – The shelf won’t be wonky and I won’t have to do it again
  • Flexibility – I only have to buy one tool for my whole house

Now, and only now, can we start to improve our tagline and then lead into the rest of our marketing collateral.

Wodgets Power Drills – Fast, accurate results, every time.

Posted in Business | Comments Off on Benefits not features

The Elevator Pitch

I’m often asked what makes a good elevator pitch and generally I respond with a question. Not the smoothest tactic around, probably, but if the person asking me the question is willing to engage, the process of answering my question helps them more than a standard answer ever would.

What is my question I hear you ask?

“What is the purpose of an elevator pitch?”

So many times, people look for a quick patch without going back to basics. An elevator pitch is short. VERY short. Check the definitions if you wish, but even in a skyscraper, you will typically have less than a minute to deliver it. You have to make an impact, and you have to have a takeaway. That’s it. The end. Nothing else. Do you agree?

See what I did there? This is not (really) an exercise in self-indulgent bragging, but that paragraph was short, hopefully grabbed your attention and has a takeaway or call to action. Anything else is redundant. For me its even more simple. The only purpose of giving an elevator pitch to someone else is because you want to motivate them to follow up with you. You want them to call. You want them to do some research. You want them to want to. You need them to want to. And you need them to remember you for long enough to do the required action before the inevitable distractions take you out of their mind again.

So, we will often talk about presentations needing a beginning, a middle and an end. We will discuss foils having a magic number of bullet points. We will spout all of this learned wisdom. And so will everyone else.

Go back to basics. Make them want to remember you. Make them call. Got it? If not, please call me….

Posted in Business | Comments Off on The Elevator Pitch

iOS4 gotchas – video

Remember there are several places you will need to touch your code to allow the app to work seamlessly in iOS4. possibly the biggest headache is the change to the video player.

I have just completed an app for a client. I finished the coding a couple of months ago. Unfortunately (from the development perspective) the client then got embroiled in a takeover which dragged on. By the time the waters settled, the app no longer worked as Apple had released iOS4 with the new video architecture. Although a fairly small change, imagine the client’s surprise when all of the video content suddenly disappeared!

So, how do you fix it? In my case, it was fairly simple. The first function was to check the version of the device/os being used with the following utility function:

-(BOOL) isOS4 {
    static BOOL _isOS4 = FALSE;
    static BOOL _checkOSVersion = YES; // Only perform check once

    if (_checkOSVersion) {
        NSString *osVerStr = [[UIDevice currentDevice] systemVersion];
        if ([osVerStr characterAtIndex:0] >= '4') {
            _isOS4 = TRUE;
        }
        _checkOSVersion = FALSE;
    }
    return _isOS4;
}

In the routine that plays a video resource, simply call that routine to launch an OS specific version:

-(void) playMovieWithName:(NSString *)name {
    if (!name) {
        NSLog(@"No movie found - No action possible");
        return;
    }

    NSLog(@"Play Movie: %@", name);

    NSString *moviePath = [[[NSBundle mainBundle] resourcePath]
                            stringByAppendingPathComponent:name];
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath];

    if ([self isOS4]) {
        [self playMovieDirectAtURL_OS4:movieURL];
    } else {
        [self playMovieDirectAtURL:movieURL];
    }
}

Now to the differences. Firstly, the established pre iOS4 version:

-(void) playMovieDirectAtURL: (NSURL*) theURL {

    MPMoviePlayerController* theMovie =
            [[MPMoviePlayerController alloc] initWithContentURL: theURL];

    theMovie.scalingMode = MPMovieScalingModeAspectFit;
    theMovie.movieControlMode = MPMovieControlModeHidden;

    // Register for the playback finished notification
    [[NSNotificationCenter defaultCenter] addObserver: self
            selector: @selector(myMovieFinishedCallback:)
            name: MPMoviePlayerPlaybackDidFinishNotification
            object: theMovie];

    // Movie playback is asynchronous, so this method returns immediately.
    [theMovie play];	

#ifdef DEBUG_MODE
    theMovie.movieControlMode = MPMovieControlModeDefault;
#endif
}

(note the optional debug section – if I am in debug mode, I want the option to skip out of a long video. In the final app, my client does not want the user to skip the video).

And the iOS4 version:

#define degreesToRadian(x) (M_PI * (x) / 180.0)

-(void) playMovieDirectAtURL_OS4: (NSURL*) theURL {
    MPMoviePlayerController* theMovie =
            [[MPMoviePlayerController alloc] initWithContentURL: theURL];
    UIView *movieView = [theMovie view];

    [movieView setFrame:CGRectMake(0, 0, 480, 320)];

    CGAffineTransform landscapeTransform;
    landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(90));
    landscapeTransform = CGAffineTransformTranslate(landscapeTransform, 80, 80);
    [movieView setTransform: landscapeTransform];

    theMovie.scalingMode = MPMovieScalingModeAspectFit;
    theMovie.controlStyle = MPMovieControlStyleNone;
    theMovie.shouldAutoplay = TRUE;
    theMovie.fullscreen = TRUE;

    // Register for the playback finished notification
    [[NSNotificationCenter defaultCenter] addObserver: self
            selector: @selector(myMovieFinishedCallback:)
            name: MPMoviePlayerPlaybackDidFinishNotification
            object: theMovie];

    // Movie playback is asynchronous, so this method returns immediately.
    [[[UIApplication sharedApplication] keyWindow] addSubview:movieView];
    [[UIApplication sharedApplication] setStatusBarHidden:TRUE];

#ifdef DEBUG_MODE
    theMovie.controlStyle = MPMovieControlStyleDefault;
#endif
}

And finally, the callback routine, which must also determine the os version:

-(void) myMovieFinishedCallback: (NSNotification*) aNotification {
    MPMoviePlayerController* theMovie = [aNotification object];

    [[NSNotificationCenter defaultCenter] removeObserver: self
            name: MPMoviePlayerPlaybackDidFinishNotification
            object: theMovie];

    if ([self isOS4]) {
        [[UIApplication sharedApplication] setStatusBarHidden:FALSE];
        [theMovie.view removeFromSuperview];
        // Belt and braces - force a redraw of what is underneath
        [self.view setNeedsDisplay];
    } else {
        [theMovie stop];
    }

    // When the movie is done, release the controller.
    [theMovie release];
}

And that’s it. A new video handling system that will work on each os version without loads of compiler directives.

Enjoy!

Posted in iOS Development | Comments Off on iOS4 gotchas – video