Tuesday, 3 September 2013

Horizons Unlimited

I'll be doing a presentation titled "Turn Left at Bogota", about my solo motorcycle journey from Toronto to Trinidad. I will also lead a workshop on "Don't Quit Your Job to Travel: Work from the Road."

The presentations will be at the Ontario edition of the Horizons Unlimited Travellers Meeting Sep 12 - 14, 2013.

We'll be at Camp Manitou, up northwest of Parry Sound.

View Larger Map

Click here to register.

Wednesday, 7 August 2013

Introducing Digital Signatures

A few years ago I took a magical motorcycle ride. Over the course of 4-1/2 months, I traveled over 19,000 kms through 13 countries. Not surprisingly I felt compelled to share the adventure. I had dozens of blog posts, hundreds of photos, many hours of recorded audio and video, and a desire to publish them all in an e-book format.

As it happens I was between jobs when Apple released iBooks Author – a brilliant eBook creation software package. With its focus on creating highly interactive multimedia titles, I knew this was the platform I needed to share my story. 

Six weeks after the release of the software, I had my first book up for sale on the iBookstore

As a first-time author, I was excited by the entire process. Especially when one of my friends asked me to sign their copy. 

That's a logical request, no? But sadly, pretty much impossible.

So, I decided I would make this happen. The result is Sign My eBook.com

Here's a short video to give you a gist of the idea. Check back later and I'll show you how it's all done. 

Tuesday, 6 August 2013

Caribana is broken, and it's my fault

There is no escaping it, my friends. Carnival in Toronto is broken.
And I am responsible.

Caribana is as old as me. We were born in 1967. I was born in south Trinidad, while Caribana was born right here on Yonge Street. And just like my other siblings and courtesy-cousins, I always assumed Caribana would grow big and strong. I never expected that much would, or should be expected of me in helping her along the way.

While we were growing up, Caribana and I would see each other every year. Every year. It was always a wonderful family time. Grannies and Aunties, with a passel of cousins in tow would turn up each year and we would all meet up at the prearranged time at our special spot, near Dundas and University. Cousin Caribana would always be the last to show up, but that never mattered, as she was always the favoured child. We would wait for her.

And it was always worth the wait. In fact, it still is worth waiting for cousin Caribana to turn up each year.

As we grew older, Caribana and I grew closer. Daddy worked with some of her family. He was a welder, and all-around handyman, so some years you would find him bending wire for some Mas, or building rigging for some big truck. One time I recall him creating a set of steel and brass cowbell for a Bahamian “junkunu” side.

Then, in the 80's it was my turn to really start spending some quality time with that side of the family. I remember the first time I spent the entire parade with my newly adopted family, Afropan. From the heart of the U of T campus, down the Avenue, under the bridge (oh how I love the sound of pan under that bridge!), straight through to the end of the route.

And then, other times I would hang out with my cousin playing dress up. Sometimes we would get dutty together.

Every year was something. From playing official Marshall, (Ha! With t-shirt and all, thank you very much! Who tell them to put ME in charge of bossing people), to selling food, flags and whistles.
But always I made sure I came out to lime with cousin Caribana every year.

In the 90s, she start to get political. Or, as a big person now who understands better, I must say, I just start to _notice_ the politics. Lots of scandal talk. “The ballroom full, but de Treasurer say we have no money”. Bandleaders bawling how they win in August but not getting prize money ’til past Christmas. And on and on.

I look to my Uncles and Aunties in the community - the parents of cousin Caribana. I want to see guidance and clarity from them. What I see is a set of fighting, cussing, name calling.

One year me and a couple friends, decide maybe we should help our cousin, so we go check out a meeting or two when the big people are deciding how things would go. Election time was a remarkable thing! The speechifying, the cussing, the personal attacks, the insinuations and outright allegations. I think there was even a lawsuit or threat of one in the mix.

Yet for all of that, somehow, every year our cousin manage to come out in some shiny new costume, and put on a real nice show in the August sun.

So we looked past the obvious dysfunction (I was only then really learning the full meaning of that word), and said, “Yes, cousin needs help, but the big people in the family will take care.”

Then boycott hit, and find we trekking all the way up to north Markham to see Mas on a farm. Steups.
Around this time we get official news that we ting is a Big Ting! Some accounting agency run by White Men(tm) publish a big number and say this is the economic impact of Caribana. From what I remember though, the government didn't get the report, as they didn't give cousin any more money to organize herself.

Finally we hear cousin Caribana can’t find any receipts so she not getting ANY money to come back the following year. It was right then I knew my dearest, oldest cousin really and truly needed my help.

And I, I did nothing.

Oh, I still played with her every time she came to visit. But I was lying to myself.

I jumped inside a big 6-bass bin and said, as long as I stayed true to the good things from our past, all would be good. I convinced myself, and others, that politricks was for tricksters.
We “true Carnival people” could still play Mas or pan or write true, true kaiso, and that would be enough to save our dear cousin Caribana.

But I was wrong.

Cousin Caribana and I turn 46 this year. She’s managed to stay looking good, but me, I showing my age. So it's a little ridiculous for me, with my long grey dreadlocks, to be calling for Uncle and Aunty to come fix things. Like it or not, cousin and me are full grown now, and the excuses for not fending for ourselves and looking out for each other -- well, there are no excuses.
People always talking about how “the route is this, the judging is that, and don't get me started on ticket prices!”

But all of this we could fix.

The whole family and I must find a way to help cousin out. We have so much professionals in this family. Some with education, and title. Some with all 26 letters behind their name. You can't tell me we can't help her out.

People blaming the bank for taking over and changing everything. In truth, it was family who invite the bank to give big cheques and splash their name everywhere. Poor cousin couldn't say nothing in her own defence. And me, I said nothing. So who’s to blame?

The issue is not really about fence, or wristband, or dancehall, hip hop or samba floats. It’s also not just about the money we let the government steal from cousin.
It's about giving a damn!

More and more people seem to pass through the house each year, and cousin will always accommodate. You know how she is. She’ll break her back to fix up whenever company is coming. She might not have enough for light bill, but somehow she will find a way to put a pot on the fire, and fill it so every belly in the family could full. Every time.

The shame is, we know she on hard times, yet we refuse to ask ourselves, “But eh, eh, how old girl making out?”

Cousin Caribana and I are now Aunty and Uncle in the family. She have children all across this country, and even grandchildren up and down the States. Yes, every year they pass by to see her, but even the ones living close, like me, we always seem to forget she need help.

I feel it's high time I stand up for my cousin. Somebody has to support her from love. She’s always been there for me. Now I get to step up and return the favour.

It's my time to fix Caribana.

Wednesday, 19 June 2013

Automagically versioning of iOS projects for a team using git

In our shop, we are building iOS projects as a team. We use git as our distributed version control system.

Display an automatic build number within the app, and have it updated properly across all developers.

We display the current build information inside a simple dialog using code like this:

NSDictionary *appInfo = [[NSBundle mainBundle] infoDictionary];
NSString *versionStr = [NSString stringWithFormat:@"%@ (Build %@)",
                                [appInfo objectForKey:@"CFBundleShortVersionString"],
                                [appInfo objectForKey:@"CFBundleVersion"]];
UILabel *versionLabel = [[UILabel alloc] initWithFrame:versionLabelFrame];
versionLabel.font = [[UIFont contentFont] fontWithSize:10.0];
versionLabel.text = [NSString stringWithFormat:@"Version: %@", versionStr];

Which gives us this nice output: Version: 1.0 (Build 311)

Making this happen can be as simple as inserting the proper value into the CFBundleVersion field of the apps' Info.plist file.

That task is pretty simple if you're working solo. With multiple members contributing however, it becomes tricky. Throw in the curve ball that is git's distributed versioning, and it gets really complicated.

Some online searching lead us to try following these very old articles.

They were successful in what they attempted, but their use cases are slightly different that ours. In those examples both authors are working on solo projects, and want to retain more control over the incrementing of the build numbers.

On our team, we want the build number to increase with every single commit to the repo. This is because each build is automatically extracted from git and pushed out to our internal testers using TestFlight. The users can accurately report to us issues based on a build number.

Handling a single version number across multiple developers using a distributed version control system.

Macros with the Jenkins Continuous Integration server

Jenkins CI logo

Configure Jenkins using the Xcode Plugin.
Jenkins uses environment variables to track and expose each build it does on our behalf. In this way, each build knows the current build number.

This plugins will call the avgtool to bump the current build number and then stick the result into the main target's Info.plist.

In our case, we use the brilliant, and affordable build service from Hosted-CI.com. Their build server already has the necessary plugins installed. For us, it was as simple as adding "${BUILD_NUMBER}" to the Technical Version field of the Xcode plugin.

Now the entire process is as easy as a git checkin. Every single time any of the developers on the team pushes a build to git, we get Jenkins to bump the build number, and inject that into Info.plist before building the project. (As a bonus, it runs our unit tests and proceeds or halts based on those results.)
Each successful build is then sent to TestFlight for distribution to the distribution list of our choosing: Developer, Internal or External testers. This last decision is made manually, as we don't want to flood our testing teams with several builds each day.

Wednesday, 12 June 2013

Early thoughts on iOS 7

I installed the first beta of iOS 7 on Monday night and have been playing around with it. Constantly. I have no choice really, it's installed on my personal, daily use iPhone.

These are my thoughts:
  • The new UI is gorgeous.
  • I love the extra, subtle animations throughout. Esepcially the fade in/fade out when sleeping/waking the device.
  • This build is a battery SUCK! Down to 77% battery from the time I wake in the morning, to getting on the bus to work. No doubt this will improve dramatically before too long.
  • Having apps update in the background is great! Yesterday I had 32 apps update during the day, so almost every time I glanced at my iPhone, I could see one or more apps being updated. Luckily, I never needed to use one while it was being updated. Rare, but I guess it could happen.
  • We finally have quick access to the common settings, including switching the radios on and off, as well as a handy flashlight(!) 
  • We can now share passes, and scan in new ones, right from within Passbook
All in all, I think I'm going to love iOS 7. I'm really looking forward to opening up the SDK, and playing with the internals. 

Designed by Apple in California

I tell you, I LOVE the culture of excellence they have baked into the core of this company! 

Here's the poem they opened their 2013 developer conference with. Who does this?!

Apple!!! Yaaaaayyyyyy!

This is it.
This is what matters.
How it makes someone feel.
When you start by imagining
What that might be like,
You step back.
You think.

Who will this help?
Will it make life better?
Does this deserve to exist?
If you are busy making everything,
How can you perfect anything?

We don't believe in coincidence.
Or dumb luck.
There are a thousand “no’s” 
For every “yes.”
We spend a lot of time
On a few great things.
Until every idea we touch
Enhances each life it touches.

We’re engineers and artists.
Craftsmen and inventors.
We sign our work.
You may rarely look at it.
But you'll always feel it.
This is our signature.
And it means everything. 

Thursday, 25 April 2013

NFC Primer

In the world of mobile technology, NFC refers to "near field communications". It is a series of technologies which use radio frequencies to communicate tiny bits of data over ultra-short distances. In the typical scenario, an RFID tag must be within 4 centimetres of a reader device for communication to occur.

Though the technology has existed for decades, recent advances have finally allowed smartphones to act as both the tag and the readers.
Tags come in two variants; passive tags contain no power source of their own, and hold very small data payloads, usually less than 256 bytes. Industry is able to produce these tags in very minute sizes - as thin as a piece of paper and smaller than a fingernail.

Active tags require a power supply and are able to hold substantial amounts of information (up to 4K bytes)

Most smartphones being produced in 2013 include the chipsets required for NFC solutions. The significant holdout is, of course, the Apple iPhone.

When a Tag is passed through the electrical field generated by the Readers' antenna, a unique signature pattern can be detected. The payload of this pattern is a tiny message. Industry standards currently allow for 5 types of messages: Text , URI, Smart Poster, Signature, Handover

In Writer mode, the process remains the same, but new data will be added to the card.

Security in an NFC devices relies on a tiny onboard protected datastore called the "Secure Element". Access to this area is restricted by cryptographic keys. The Secure Element can be either embedded in the device by the manufacturer, or added by 3rd parties via an SD slot or the SIM card. Most solutions use methods A) and C)

The current industry norm involves a "man-in-the-middle" security strategy using a 3rd-party "Trusted Services Manager" (TSM). For a credit card solution, the TSM holds crypto keys from the bank (card issuer) as well as the cellular carrier (owner of the SIM-based Secure Element).

Writing wallet-type software applications to interact with items stored in the Secure Element requires working closely (and contractually) with the TSM and/or carrier.
Software Links: SEEK-for-Android (Secure Element Evaluation Kit)

NFC Forum

Saturday, 6 April 2013

We reach!

Indeed, it's been quite the long journey! Almost one year ago I published the iPad-only version of the story of my solo motorcycle trip from Toronto to Trinidad. Today, I have finally published the Kindle version. It's gone through an extensive rewrite as I had to remove the 20 videos and most of the photos found in the iPad version.

With the move to include the Kindle platform, the book will now be available for purchase on virtually any brand of smartphone, tablet or computer.

And, yes, the new sale price is only $2.99. Temporarily.

Friday, 22 March 2013

Password Sanity

I use, and love!, the password management 1Password, from AgileBits -- a wonderfully Canadian company.
I have copies of the app sitting on all 3 of my devices -- my MacBook Pro, my iPhone, and my iPad. All are synced together through my DropBox account.

The brilliance of the software is that you literally need only remember a single password. This unlocks the app, which is a password database and generator. 

Every time I need to sign up for some new web site or service, I login to 1Password using the handy button installed in both my Safari and Chrome browsers.

Thursday, 7 March 2013

Our dev stack

Here's a quick run down of the workflow we're using, and finding quite effective, on a current iOS project.

As with all iOS projects, the main ingredient is Apple's free IDE, Xcode. When we created the project, we allowed the wizard to set up a git repo for us.

But we don't use Xcode's built-in git tools. Instead we use SourceTree, the visual git manager from Atlassian, the powerhouse software tools vendor. It's free, has a fairly small learning curve, but has just about everything we need. A great feature I use just about daily is GitFlow. This allows 1-click creation and merging of new branches.

GitHub.com is the home of our code. With a small, but mobile team, having all of our code stored on a high-availability, secure and robust service allows us to be highly productive from wherever we can get on the 'net. Shhh... don't tell Marissa.

Each new piece of functionality big enough to be assigned a work ticket is branched in the repo. GitHub and SourceTree make this an easy-peasy thing to do and share.

Logo for Hosted-CI.comHosted-CI.com The "CI" in the name refers to continuous integration. This online service runs the Jenkins port of the venerable Hudson build server, so we consider this service as a giant build server in the sky. We have an integration with github whereby each time a project team member commits code to github, the continuous integration server pulls the latest code from the repo. We have our project configured to automatically run all of the unit tests, before building a signed, distribution-ready application.

JIRA is another great Atlassian product, JIRA is where we track the progress of all phases of the project. Another small integration with github allows each commit to be tied to a specific JIRA ticket. When a developer commits code to the repo, the full commit log, including a list of files worked on, is automatically added to the JIRA issue ticket. We can now not only track who worked on which issues, but also see exactly what the solution was.

Finally, once a fully tested and properly signed binary has been produced, it is sent to TestFlight for distribution to all of our developers and testers. Each person on the distribution list receives an email that allows them to install the latest build directly onto their iOS device with a single click, right from within the email message.

Copy & Paste can be good!

Rather than point to some sort of innovation gap at Samsung, I prefer to consider that Samsung building their new Wallet to be interoperable with the iOS Passbook is a great thing for the industry.

Samsung Wallet logo
For e-wallets to truly take off requires a certain scale in the number of businesses using the technology. This tipping point can most quickly be achieved by multiple vendors releasing complementary and enabling products. The very last thing I want to see if yet another vendor introduce a new tech that they hope to become yet another 'standard'.
Apple Passbook logo

It's a smart move on Samsung's part to follow Apple on this. It shows that their business sense is not being overridden by some schoolyard-level ego about "anything they can do, I can do better." -- a mantra that seems to be the tone of too many journalists and commenters.

Kudos to Apple for not suing.

Now that the two largest smartphone vendors have found more common ground, perhaps a true "standard" will evolve from this.

Thursday, 17 January 2013

The long way to Trinidad


How the heck are people supposed to buy my book if they can't even find a copy for sale?

I published this book last spring, but haven't really done much to promote it. You can pick up your very own copy of Goin' Toco: Toronto to Trinidad on a motorcycle here: https://itunes.apple.com/ca/book/goin-toco/id521656804?mt=11

It's currently only available for iPad, but there will be versions for Kindles and other ebook readers coming soon.

You can also catch a cheeky little trailer video I made of the trip here: http://www.youtube.com/watch?v=qG2nRkFGyZ8