Tools of the Trade

A software craftsman needs good tools. This is a list of some of the tools I use for personal development. Every craftsman must choose the tools that they are comfortable with. You might find something here useful, you may well have better alternatives.

Hardware

At home I have a very old 2008 iMac, which is mostly for non-development/home usage. There is also a more recent PC, built from components in 2013, which runs Windows and is mostly used for playing games, though one day it may well also build/test Windows builds of software and/or run various web services.

However, most of my work is done on a laptop. This way I can sit at the desk at home and connect to an external monitor, or sit on the sofa, or at the dinner table by the view, or in the coffee shop, or library, or show my work to somebody while on the bus…

My primary concern was portability, but does that mean you sacrifice power? Well, you can get close, but it does cost a lot more. One down side is you don’t get as much physical screen size, but if that’s useful connect one or two external monitors.

My other motivations for the particular choice I made were:

Laptop

So, my final choice back in late 2013 was to buy another Apple MacBook Pro.

A long time ago (back in the 1990’s and 2000’s) I’d used Dell or IBM/Lenovo laptops and these were great. Back in 2007 my (then four years old) laptop’s screen died, and I wondered what all the fuss was about Apple products. Went to their local (then much quieter) Apple Store and tried their laptops out.

I was instantly impressed; easy to use, well built, nice user interface, but there’s the Unix Terminal under the hood. Nerdy meets Pretty and has little happy baby laptops.

Since then our household has bought far too many Apple products; MacBook Pro (2007), iPod Touch, iMac, Time Machine, iPad, MacBook Air, etc. Possible Apple Fanboy? Perhaps, but I build my own PC’s and use/run Windows for work too. Pragmatic Apply Fanboy then? If Apple products start declining I’ll head for whatever else works for me.

Current Laptop specifications:

Back then it cost somewhere around $2800 Canadian Dollars including tax. Current models are very similar in early 2015: see MacBook Pro

Backup Drives

I have a really old 2008 Time Machine, which has 500Gb hard drive. Everything except the laptop just uses Time Machine for backups currently. Turn it on, done.

For the laptop I bought a 500Gb mini hard drive, which runs over USB 3.0. Fast enough for backup purposes. I’ll be using this to create a bootable clone of the laptop about once a week. Soon I’ll probably switch to using something like Crash Plan to incrementally back up all my machines to local drives and the cloud. That’s something for another week though.

The particular model I choose was a Toshiba 500Gb Canvio Slim II. It’s the super light, the size of a wallet, and shiny silver though not the same as a Mac. I got mine on offer at London Drugs (Canadian store) for about $80 Canadian dollars, which is ridiculously cheap in my mind. It’s not an SSD, but who cares for backup.

Other Hardware

I’ve used Samsung monitors at work for ten years, and they seem like great monitors. This particular one broke down after two years; the screen went pixelated and garbled, like something had chewed on an important signal wire.

Samsung has an excellent 3 year warranty, you print off the forms from their website, put it back in it’s original box (keep your original boxes always) and put on the pre-paid postage, drop off at UPS and UPS send it back. Took under a week to fix, superb service!

Installation and Administration

Here are some recommendations for installation and administration that I’ve always found super handy:

Root Log

I recommend keeping what I call a “Root Log”; a description of everything I install and configure on each machine.

I’ve been doing this for years, and call it a “Root Log” because originally it was a log of all the actions I performed as the “root” super-user on Unix machines. On Mac OS X however you can usually do most of your installation and configuration as a normal user; though occasionally it will ask for admin/root priviledges via GUI or need a “su” or “sudo” command.

The log file is stored in the Documents folder, but early on during installation I symlink Documents into my Dropbox folder:

$ mv ~/Documents ~/Local-Documents
$ ln -s ~/Dropbox/Documents ~/Documents

This means all my documents are synchronized to all machines (iMac, Su’s MacBook Air, the Windows PC) and are in the cloud, as well as being backed up to the TimeMachine (a few times, but who cares).

Provisioning?

Some people “provision” their laptops; essentially writing scripts which automate the set-up. Those people are probably already used to doing this with Chef, Ansible, Puppet or similar software.

I’ve found that I rarely need to re-install or reproduce my exact setup, so this “provisioning” idea is overkill for a personal laptop. Totally would make sense if you need a reproducible development and production environment across lots of machines.

For me a “Root Log” and good backups are sufficient - when I get new hardware it’s probably time to use newer or updated tools and installation methods anyway.

Use The Command-Line

Sorry, but I just can’t understand software developers who rarely use the command line. I’ve seen this more in places where Windows is used; much less so when Linux or Unix is used.

Software developers write code, text, in editors. They make complex technology using highly complex programming languages, and then some of them just use a mouse and GUI to install/configure/administrate their machines? Even worse, they also don’t bother to try to automate tasks that they perform, rather use a GUI and manually click things all day?

For goodness sake LEARN TO USE A DECENT SHELL AND SCRIPTING LANGUAGE.

I’ve been using Unix for so long it’s second nature. With Mac OS X you get bash, python, ruby and perl all installed by default so there’s no excuse.

On Linux it’s similar, and on Windows install Cygwin.

I mainly use Bash scripts for automation, though I’m beginning to use Python and might try out Ruby for comparison.

Software

Many of my choices reflect the choice of MacBook Pro as my primary development machine. My list of software in order of installation is described below:

Operating System - Mac OS X

MacBook Pro comes pre-installed with Mac OS X, I’m now running Yosemite 10.10.1. The main thing for me is:

Yes, I’d use Linux and have done often. Yes I’d use Windows, and have done often, though I always install Cygwin to give me Unix like command line.

Office Tools - iWorks

I use Apple’s free Pages, Numbers and Keynote. I have used Microsoft Office, but it’s way more annoying. Can’t beat free; in which case the alternative might be Open Office or Libre Office.

These are installed in the App Store and can’t (yet) be automated, but whatever.

XCode

I also install XCode from the App Store, just in case I feel the need to use it (I rarely do). I do most of my development with other tools so I can be more platform agnostic.

Software Management - Homebrew

Installing software can be done a few different ways; go to website and download it manually and install, download the source and build it yourself, provisioning using things like Chef, download from the App Store, etc.

On Mac OS X I’ve found using Homebrew does almost all I need in one simple consistent command line driven package.

First things I install from the command line is:

Check the Homebrew home page for the current install magic command, as of Jan 10th 2015 the shell magic copy-paste was:

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Check the Homebrew Cask home page for the current install magic command, as of Jan 10th 2015 the shell magic copy-paste was:

$ brew install caskroom/cask/brew-cask

Pretty much after this you install source/pre-built binaries like this:

$ brew install THING

Applications (Casks) like this:

$ brew cask install THING

You can find things to install like this:

$ brew search SOMETHING

Look at Homebrew and Homebrew Cask for more information. From now on I’ll include the short brew command for software I use.

Verson Control System - Git

$ brew install git

I use Git where possible to store and version source code. It’s a popular distributed version control system, which means you can much more easily share work and contribute to open source projects.

If you have no idea what this is, where have you been? Under a rock? Seriously, read up on these things RIGHT NOW.

I’ve used SCCS, RCS, CVS, Subversion, and Perforce. But for me Git is preferable (partly due to it’s popularity perhaps).

I store my repositories in the cloud; private Git repository on Bitbucket, and public repositories on GitHub.

Standard Tool Configuration

$ git clone XXX/config.git $HOME

Next thing I install is my own tool configuration scripts and files. Most of the files are for configuration of Bash, Emacs, and Git, but has things like fonts, SSH, X11, shell and scripts configurations.

All my configuration is stored as a Git private repository, which is remotely hosted on Bitbucket. The configuration is portable to any machine/platform I use frequently; Mac OS X, Windows, and Linux.

Editor - Emacs

$ brew install --cocoa emacs 
$ brew linkapps

Note: The --cocoa and brew linkapps give you a native Mac OS X Cocoa native application, not just the terminal based Emacs.

I use Emacs for several reasons:

In fact once I’ve installed emacs, I run shell in an Emacs buffer. That way I can quickly copy and yank (paste) text from the shell into the Root Log. * Minimal GUI - Emacs pretty much shows you a window with your files’ text in it. * Well Documented - Emacs has full documentation; on any Lisp function, key binding, command, plus it also lets you read man pages and even web pages (if you so wish) in Emacs. * Live Programming - Emacs is actually really a live Lisp-programming environment disguised as an editor. You can open a “scratch” buffer and type Lisp code at it, while Emacs is running, and modify your running Emacs functionality on the fly. Configuration of key bindings, code highlighting, everthing can be changed live; and since it’s all just text code, it can be stored and version in a VCS; in my case the Git configuration repository I take everywhere.

There are some downsides; it’s a tired old beasty, you’ll be holding the Control key down a lot, you might get tired hands or worse, and all those “Lisp brackets” and “neck beard” jokes from colleagues get a bit tedious.

Documents in the Cloud - Dropbox

$ brew cask install dropbox
$ mv ~/Documents ~/Local-Documents
$ ln -s ~/Dropbox/Documents ~/Documents

Keeps all the Documents in sync across all machines and in the cloud.

See Dropbox for more information on signing up and different plans and prices.

Too Many Passwords? - 1Password

$ brew cask install 1password

1Password does what it says on the tin; you only need to remember one password, it does the rest.

It’s a standalone application and also a browser extension; once you’ve entered the passphrase for 1Password, you can hit a key binding to pop-up a search in your browser; type in a website name, and it takes you there, enters the right user name and password for that site and logs you in. Magic!

1Password keeps all your passwords in one super secure place, and since we use Dropbox it’s synchronized and accesible everywhere (even on the web). 1Password supports Mac OS X, Windows, iPhone/iPad and Android.

I use a Diceware Passphrase for my “one password”:

“Eh? 78 bits of what?”

That means there’s so many possibilities that even knowing the source dictionary means it would take a bazillion computers a bazillion years to crack (or something, see http://en.wikipedia.org/wiki/Passphrase):

```bash $ echo '6 ^ 30' | bc 221073919720733357899776 ```

Initially you have to write it down on paper and type it a few times before it really sinks in. Once you have it memorized, tear up the paper, seperate them into five piles randomly, burn them, flush the pieces down six different toilets (or whatever feels safe to you).

See 1Password for more information and getting a license.

Moving Windows - Optimal Layout

$ brew cask install optimal-layout

Handy little utility for using keyboard bindings to move and resize windows. I prefer to keep my “Hands On Keyboard” and not on the mouse or track pad.

See http://most-advantageous.com/optimal-layout/ for cost, etc. Also available in App Store.

Why Is My Laptop Slow? - System Pal

A handy menu bar app that shows memory/cpu/temp/disk/net statistics. Configurable and discrete. Available in the App Store for a small price.

See https://itunes.apple.com/ca/app/systempal/id453164367?mt=12

Laptop Auto-Sleep Off - Caffeine

$ brew cask install caffeine

A super simple menu bar app that stops your Mac going to sleep. Handy for presentations, playing guitar, and whenever you need your Mac to just do things without you touching it.

See http://lightheadsw.com/caffeine/

Git Makes No Sense? - Source Tree

$ brew cask install sourcetree

A Free GUI for Git and Mercurial. Occasionally this is handy for inspecting source, history, branch state visualization and remote repository states or for doing things with Git that are unfamiliar.

It’s free! By those awesome Atlassian people.

See http://www.sourcetreeapp.com

General Development Tools

$ brew install ctags
$ brew install global
$ brew install idutils
$ brew install ispell
$ brew tape homebrew/dupes
$ brew install gdb
$ brew install imagemagick --with-libtiff
$ brew install pcre
$ brew install wget

Various things I use in development, as you can see Homebrew means you just find something useful and install it.

Much of what I use comes by default with Mac OS X and XCode:

Virtual Machines - Virtual Box

$ brew install virtualbox

Intall Virtual Box so you can play with Virtual Machines, run Mac OS X/Linux/Windows on the same machine, whatever. It’s free!

Java

$ brew cask install java
$ brew tap caskroom/versions
$ brew cask install java7

Install both Java 1.8 and 1.7 for playing Minecraft, running Jira/Confluence and other web applications.

RSS Reader - NetNewsWire

$ brew cask install netnewswire

Subscribe to and view RSS web feeds in style. Reasonably priced (Beta is free right now).

See http://netnewswireapp.com

Cloned Bootable Backup - Carbon Copy Cloner

$ brew cask install carbon-copy-cloner

I use CCC to make a cloned bootable backup of the laptop to an external backup drive about once a week. This software is pretty much “click-click-click”, plus it has command line automation in case I want to get serious later.

See https://bombich.com, it’s fairly expensive as software goes, but backups!

Webite/Blogging - Jekyll, Octopress, GitHub

See Setting Up A Free Blog

Drawing Stuff - Omnigraffle

$ brew cask install omnigraffle

If you ever need to draw boxes and lines to work out some software architecture, or draw some “UML” like class relationships to design something, then Omnigraffle is one good, if slightly expensive way.

See https://www.omnigroup.com/omnigraffle

Future Blogs/Ideas

comments powered by Disqus