A number of people have generously offered feedback, code and suggested improvements to this tutorial. In no particular order: