bcrypt_objc: Command Line Utilities in Objective-C

About a week ago, I advised Rogelio Gundino on Twitter that it was not only possible, but pretty fun to write command-line apps on OS X in Objective-C. I promised him that I’d make a blog post about it, and started drafting examples. The problem with sample code, of course, is that it’s sample code. There is a world of difference between:

  1. code written for an API presentation or tech demo
  2. code written to actually perform a useful task

Since I like to read (and write) the latter, I threw out three attempts at useful demonstration before I stumbled across Marco Arment’s clean-room implementation of the bcrypt cryptographic hash algorithm for PHP 5.3. Cryptography gets any developer nerd’s juices flowing, and I began to consider what it would take to port bcrypt to Objective-C. Continue reading

Posted in development | Tagged , , , , , , , |

Left is Right

In a 2005 Pimp My Code post, Wil Shipley challenged the Objective-C idiom for class instantiation. The traditional method is something like this:

- (id)init
{
  if ((self = [super init])) {
    // Success!
    // Initialize your ivars, etc.
  }
  return self;
}

For a number of reasons, Wil pushed a different idiom:

- (id)init
{
  if (! (self = [super init]))
    return nil;

  // Success!
  // Initialize your ivars, etc.

  return self;
}

This felt strange to me until I realized that it looks an awful lot like other conditional blocks of code I’ve written. Take this snippet from my MailQueue project, for example:

public function addMailRecipient($mailRecipient)
{
  if (! is_a($mailRecipient, 'MailRecipient'))
    // Failure: Improper type
    return FALSE;

  if ($this->addressExists($mailRecipient->address()))
    // Failure: email address is already on the recipient list
    return FALSE;

  // Success: Add recipient to recipient list
  $this->_list[] = $mailRecipient;
  return TRUE;
}

What this function and Wil’s constructor idiom have in common is that the normal flow of control follows the left margin of the code. This is one of those little things that makes a HUGE difference when you’re writing a project of any non-trivial size (or when you’re working on multiple projects at once in multiple languages.) Try to write your code so that your conditionals test for failures instead of successes. This enables anyone who reads your code (including you!) to more easily follow along.

Posted in development | Tagged , , , |

Unique Build Numbers for XCode 4

With XCode 4′s integration of Git for version control, I found an old post from Marcus Zarra and Matt Long of Cocoa Is My Girlfriend to be very useful. Back in 2008 they built a handy build number script. It builds on Daniel Jalkut’s Perl script, originally written for Subversion, that injects a unique identifier from the latest commit into an application’s Info.plist file on every build. Such unique identifiers are very useful for developers in distinguishing larger public revisions (i.e. version 1.5) from smaller internal revisions (i.e. build 5369f78).

How to arrange your new build phase.

How to arrange your new build phase. (Click to enlarge.)


I’ve written a Python script that does much the same thing for XCode 4. To use this script, create a new “Shell Script Phase” at the end of your target’s build phase chain, just after “Copy Bundle Resources.” Paste the contents of the script into that phase, and be sure to specify “/usr/bin/python” as the shell for the script. The script will edit the Info.plist file of your fresh app build to reflect the latest git revision.

# XCode 4 auto-versioning script for Git
# Inspired by the work of Axel Andersson, Marcus S. Zarra and Matt Long
# http://valthonis.net/u/19

"""
NOTE: Due to its use of build environment variables, this
script will only work from inside XCode's build process!
"""

import os
import csv
from subprocess import Popen, PIPE
from Foundation import NSMutableDictionary

cmd = "/usr/local/bin/git rev-parse --short HEAD" # get the short commit hash from git
build_number = Popen(cmd, shell=True, stdout=PIPE).stdout.read()
info_plist = os.environ['BUILT_PRODUCTS_DIR'] + "/" + os.environ['WRAPPER_NAME'] + "/Info.plist"

# Open the plist and write the short commit hash as the bundle version
plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_plist)
core_version = csv.reader([plist['CFBundleVersion'].rstrip()], delimiter=" ").next()[0]
full_version = ''.join([core_version, ' build ', build_number])
plist['CFBundleVersion'] = full_version
plist.writeToFile_atomically_(info_plist, 1)

EDIT: Changed script to append build number to project version. The plist should now use the form “1.5 build 5369f78″

EDIT: Fixed a bug where successive builds might repeatedly append build numbers to the core version (resulting in version strings like “1.6 build 5a32f28 build 03b295e” and so on.) As such, the script now requires Python’s built-in csv module. Also, this script is now available via gist.github.

Posted in development | Tagged , , , , , , , |

Unplayed

Shaun Inman devised a rather easy and ingenious way to keep track of one’s various video games.

I do this for a couple reasons:

  • To keep track of games that I’ve heard great things about but never played. There was a period during college and a couple years after where I didn’t own any consoles. I missed out on some great titles and I’m still catching up. The Unplayed.
  • To keep track of games that I’ve started (and may have been distracted from finishing). I’m playing more games lately as research and sometimes stumble across a game so good I forget about the game I was playing for pleasure. The Unbeaten.
  • To keep track of games I’ve put down and why. The Beaten and The Abandoned. I’m human, I like specific genres (eg. jRPGs and metroidvanias) and repeating my mistakes (eg. any Dragon Quest game without Rocket Slime in the title).

You can grab Shaun’s Markdown-powered Unplayed script for use on your own PHP-enabled web host.  I’ve rolled out my own list for your perusal.

I fully expect to be pilloried on Twitter for some of the titles in the Unbeaten list.

Posted in games | Tagged , , , |

Modernize Your Git Workflow

I’ve linked previously about Vincent Driessen’s awesome git-flow extension for streamlining your source control workflow, but Laust Rud Jacobsen has posted an even better overview of how to best use git-flow.  I didn’t know about neat features like publishing feature branches or git-flow’s support for rebasing local work until I read this.

Posted in development | Tagged , , |