We have got IT covered

Which division do you need?

Blog Archive

Feb 12 (4)

Jan 12 (10)

Dec 11 (8)

Nov 11 (6)

Oct 11 (12)

Sep 11 (10)

Aug 11 (15)

Jul 11 (9)

Jun 11 (12)

May 11 (23)

Apr 11 (10)

Mar 11 (13)

Feb 11 (10)

Jan 11 (5)

Dec 10 (21)

Nov 10 (10)

Oct 10 (10)

Sep 10 (8)

Aug 10 (8)

Jul 10 (10)

Jun 10 (8)

May 10 (14)

Apr 10 (20)

Mar 10 (10)

Feb 10 (3)

Our Blog

Blog RSS

Paul Saunders, 3rd February 2012

OMG Another Slideshare Front Page

0 comments

This afternoon I made a promotional presentation for our new iPad app YBoard. Here it is:
It pretty quickly got 300+ views and attracted the attention of the lovely Slideshare Community Manager Kit Seeborg who dropped me a line to say she was going to feature it on the Slideshare front page. Yay!



Fingers crossed it raises the profile of YBoard.

Related Posts:
[VIDEO] YBoard Demo
The Thinking Behind YBoard
Delete Friction

Author: Paul Saunders

This article has 0 comments

Bookmark this...

Linked In Twitter Digg Delicious StumbleUpon Reddit Facebook Propeller

Paul Saunders, 3rd February 2012

iPad Attrition Rates

0 comments

One question that comes up frequently when I am presenting on the subject of iPads in Aviation is how much to budget for lost, stolen or damaged iPads. I'm probably the worst person to consult on this subject having dropped and smashed my own iPad within days of purchasing it. Of course having a protective case will help to reduce damage, but this won't prevent loss or theft. The best figure I have previously been able to give people who asked the question about attrition rates is 20%.



This number is based on a value budgeted by one of our airline clients. They had an replacement rate of 10% per annum for company mobile phones, so they simply doubled that for the larger, "thief magnet" iPad. However I was chatting to our client yesterday who had some surprising statistics to share with me. In their first four months since deploying 610 iPads to pilots they have replaced 2 devices having been dropped and damaged, 1 due to theft and 1 having being lost. Scaling that up for the first year that is less than a 2% attrition rate. However we did agree that once the iPad 3 is launched then we should expect a few more pilots to drop or lose their current iPad 2 devices.

What rates of loss, damage and theft is your organisation experiencing or budgeting for? Let me know in the comments below. Please contact us to find out how we can help you build your business case and strategy for deploying iPads in your business.

Related Posts:
App Prototyping
iPad App Spotted in the Wild
[VIDEO] YBoard Demo

Author: Paul Saunders

This article has 0 comments

Bookmark this...

Linked In Twitter Digg Delicious StumbleUpon Reddit Facebook Propeller

Paul Saunders, 2nd February 2012

App Prototyping

0 comments

One thing that we have found with developing mobile and tablet apps for clients is that some of the more traditional ways of developing software are not really appropriate. You will commonly find with legacy enterprise software that hours and hours of project time is spent documenting requirements and writing specifications before a single line of code is developed. This normally isn't the case when it comes to developing for iPad or iPhone, because more often than not the client isn't 100% sure of what they want, mainly because they are not familiar with what is possible, what is practical and what might represent a good return on investment.

That's why we like to prototype apps using wireframes. It doesn't take long to convert the clients' stream of thoughts into a set of diagrams of how the app might look and hang together. We like to use Balsamiq Mockups. The good thing about Balsamiq is that it has a whimsical sketchy look and feel which we like because you can immediately see it is only a sketch. Some mockups applications make the wireframe look too real and can give the client the wrong idea about how far progressed you are with the project. With a Balsamiq wireframe it is obvious that you are only demonstrating a conceptual drawing. It is very quick and simple to sit down with the client and show them the wireframe and even make tweaks to the design during the discussion.

Here's a wireframe I knocked up for our friend Michael Denis to help him discuss a proof of concept with his colleagues.

Once you have got your basic design agreed those wireframes can be easily converted into a prototype app so that the concept can be further investigated and tested before you get on with the coding. Here's the same wireframe converted to a protype app.



We use Realizer to make our prototypes. If you do a thorough job of the prototyping this helps a client to approve a business case and allows you to thrash out features and functions without having to spend an age on writing a spec that nobody likes to read anyway.

Please contact us if you would like us to discuss what Conduce Software can do to help with your iPad and iPhone development requirements.

Related Posts:
iPad App Spotted in the Wild
[VIDEO] YBoard Demo
The Thinking Behind YBoard

Author: Paul Saunders

This article has 0 comments

Bookmark this...

Linked In Twitter Digg Delicious StumbleUpon Reddit Facebook Propeller

Paul Saunders, 1st February 2012

Codecademy Walkthrough - Blackjack Challenge #2

0 comments


As promised here's the walkthrough of the second part of this week's Blackjack challenge on Codecademy. Let's get right on with the coding.

Exercise 1. Deal me in
As per usual with the CodeYear courses we start off small and build up. First we need to create a script which generates a random number between 1 and 52 (representing the deck of cards) and return the value in the console. We're using the Math.random command to generate the number and the Math.floor command to round it down to the nearest whole number.

var card = Math.floor(Math.random()*52 + 1);
console.log(card);

Exercise 2. Functionify Dealing

Now we wrap the action of dealing a card in a function and return the value twice in the console to represent two cards being dealt.

// Define a function called deal
// It should return a random number between 1 and 52
var deal = function() {
    var card = Math.floor(Math.random()*52 + 1);
    return card;
};

// Declare two variables
// For both variables, assign values gotten by calling the function
var card1 = deal();
var card2 = deal();
console.log(card1);
console.log(card2);


Exercise 3. What's the Score?
This exercise creates a new function to sum the values of the cards.

// Our deal function will return one random card
var deal = function() {
    var card = Math.floor(Math.random()*52 + 1);
    return card;
};


// Declare our two variables card1 and card2
var card1 = deal();
var card2 = deal();

// Define a function called score, which will assign points by
// adding up the cards:
var score = function() {
    return card1+card2;
};

console.log("You have cards " + card1 + " and " + card2 +
        " for a score of " + score());


Exercise 4. More Score
Now we have a small code iteration to include a new function to get the value of the card being dealt. The function is a simple one at the minute though which just returns the card value. I guess this is an essential lesson in scalability of code.

// Our deal function will return a random card
function deal() {
    card = Math.floor(Math.random()*52+1);
    return card;
}

// Deal out our first hand
var card1 = deal();
var card2 = deal();

// Make a getValue function here, which should convert a card to
// the value that card is worth
var getValue = function(card) {
    return card;
};

// Our score function converts our cards to a score
var score = function () {
    return getValue(card1) + getValue(card2);
};

console.log("You have cards " + card1 + " and " + card2 +
        " for a score of " + score());


Exercise 5. Improving getValue
Using the modulo we add some additional code to the getValue function to get the card value by dividing the card by 13 and returning the remainder.

// Our deal function will return a random card
var deal = function() {
    var card = Math.floor(Math.random()*52 + 1);
    return card;
};

// Deal out our first hand by declaring variables card1 and card2
var card1 = deal();
var card2 = deal();

// Define a function getValue that returns the remainder when card
// is divided by 13
var getValue = function(card) {
    return card % 13;
};

// Return the score of our hand
var score = function() {
    return getValue(card1) + getValue(card2);
};

console.log("You have cards " + card1 + " and " + card2 +
        " for a score of " + score());


Exercise 6. Don't forget the Face Cards
The previous exercise gave us a card number from 1 to 13, but in blackjack the face cards are worth only 10. This exercise introduces an if statement to do the conversion. Here we have used the or command using the double pipes ||.

// Our deal function will return a random card
var deal = function () {
    card = Math.floor(Math.random()*52+1);
    return card;
};

// Deal out our first hand
var card1 = deal();
var card2 = deal();

// This function takes a card as a parameter and returns the value
// of that card
var getValue = function(card) {
    // if its a face card, number should be set to 10
    if(card%13===0 || card%13===11 || card%13===12) {
        return 10;
    }
    // Otherwise number should be set to card modulo 13
    else {
        return card % 13;
    }
};

// Here make a function called score, which will assign points based
// on the cards.  It should take the remainder
var score = function() {
    return getValue(card1) + getValue(card2);
};

console.log("You have cards " + card1 + " and " + card2 +
        " for a score of " + score());


Exercise 7. You're Such an Ace
The final exercise introduces an additional if statement to convert the ace card to the value 11. Here's my code.

// Our deal function will return a random card
var deal = function() {
  card = Math.floor(Math.random()*52+1);
  return card;
};

// Deal out our first hand
var card1 = deal();
var card2 = deal();

// This function takes a card as a parameter and returns the value
// of that card
var getValue = function(card) {
  // if its a face card, number should be set to 10        
    if (card%13===0 || card%13===11 || card%13===12) {
        return 10;
    }
  // What if it's an ace?
    else if (card%13===1) {
        return 11;
    }
  // Otherwise, we just want its number value
    else {
        return card%13;
    }
};
        
// Score the hand
function score() {
  return getValue(card1) + getValue(card2);
}

console.log("You have cards " + card1 + " and " + card2 +
        " for a score of " + score(card1, card2));


And that's it for this week's Blackjack challenge. Roll on Monday for another round of Codecademy courses and lessons. Check out my previous Codecademy Walkthroughs below.

Previous Walkthroughs:
Codecademy Walkthrough - Blackjack Challenge Part 1
Codecademy Walkthrough - Starting a Startup
Codecademy Walkthrough - Hello New York
Codecademy Walkthrough - FizzBuzz Answers

Author: Paul Saunders

This article has 0 comments

Bookmark this...

Linked In Twitter Digg Delicious StumbleUpon Reddit Facebook Propeller

Paul Saunders, 30th January 2012

Codecademy Walkthrough - Blackjack Challenge #1

1 comment


Its the start of a new week and a new challenge on Codecademy... and quite literally a new challenge. I logged on to Codecademy this morning to find a new Courses page layout with lessons and projects grouped into sections and something called the Blackjack Challenge. Today's Codecademy Walkthrough steps us through the first part of the Blackjack challenge: "Deal 'em Up"

Apart from a few layout changes and improvements, the first thing to notice with the exercise screen is that the script and console section have had a bit of a revamp. There is now some client side validation of code which is helpful to prevent mistakes and to give you better feedback if something isn't quite right with your code. This week I don't think I made a single syntax error due to this improved feedback mechanism. Nice work guys! OK, on with the lesson.

Blackjack challenge: Deal 'em Up >> Section 1 Before we get started....
Exercise 1. Introduction
Instead of the usual "hit run when you're ready" we have a to do a bit of thinking with this introductory exercise. Now we have to actually return the text "I'm ready to build a blackjack game" in the console.

console.log("I'm ready to build a blackjack game!");

Exercise 2. Dealing
Now we have to refer back to the previous Dice Game project to lift the code used to generate random numbers. There's a tweak needed though as instead of returning a random number from 1 to 6 we need to return a number from 1 to 10.

var randomRating = Math.floor(Math.random()*10 + 1);

Exercise 3. More Dealing
Next we need to build a function that takes two random scores from 1 to 10 and sums them together. There are no parameters in the function, but when returning the function don't forget to include the empty brackets.

var twoRandomScores = function () {
    var score1 = Math.floor(Math.random()*10 + 1);
    var score2 = Math.floor(Math.random()*10 + 1);
    return score1 + score2;
};
twoRandomScores();


Exercise 4. Give me my cards!
This exercise introduces concatenating a numeric value with a string to provide a sensible message by reintroducing the "string + variable concept.

var randomScore = Math.floor(Math.random()*52 + 1);
console.log("I got the score "+randomScore);


Exercise 5. Scoring System
The modulo operator is reintroduced to provide the mechanism to convert a random number from 1 to 52 into a face value of a card by dividing by 13 and returning the remainder.

var deal = Math.floor(Math.random()*52 + 1);
var final = deal % 13;
console.log(final);


Exercise 6. Scoring System Continued
The modulo operator is continued in this exercise to return whether a random number is odd or even. Remember to use the triple equal signs here as we are comparing the modulo result with zero. The exercise hint talks about using the OR operator, but I didn't use it or need it for this exercise. Here's my code.

var outcome;
var randomScore = Math.floor(Math.random()*40 + 1);
if (randomScore % 2 === 0){
    outcome = "even";
} else {
    outcome = "odd";
}
console.log(outcome);

Exercise 7. We think you're ready
Following on from the first exercise there is a brief review and what would have previously required us to hit the run button now asks us to confirm we are ready in code using the confirm command.

confirm("Are you ready?");

And that's the first part of the Blackjack challenge done. The lessons, projects, and challenges are coming thick and fast now, and if like me you are noticing an improvement in your coding ability and combined with the enhancements to the  Codecademy website you will be rattling through the exercises at a good pace. I will attempt to get the next part of the challenge posted as a walkthrough later this week. In the meantime why don't you take a look at my previous walkthroughs and see if you can make a more elegant version of my code.
Have fun!

Previous Walkthroughs:
Codecademy Walkthrough - Starting a Startup
Codecademy Walkthrough - Hello New York
Codecademy Walkthrough - FizzBuzz Answers

Author: Paul Saunders

Steven, 5th February 2012 at 10:24pm

For exercise #6 there's all this stuff about odd versus even numbers. The exercise asks to give a value of 10 to the face cards. Why is this code below not correct?
var deal = Math.floor(Math.random()*52 + 1); // get a value from 1 to 52
var final = deal % 13;
if (final === 0 || final === 11 || final === 12){
final = 10;
}
console.log(final);

This article has 1 comment

Bookmark this...

Linked In Twitter Digg Delicious StumbleUpon Reddit Facebook Propeller