I have a job that I almost never speak about. All that stuff about quitting full-time employment to become an engineering monk? That is only half the story. My other job, my ‘day job’, is as a stay-at-home dad. It is a difficult thing for me to talk or write about, and in many social circles I go out of my way to hide my house husband status.

Photo of my daughter and I launching a SpaceX inspired bottle rocket.

There are lots of subtle social cues that make stay-at-home dads feel isolated. Alone, like all the unicorns and other fictional animals that don’t exist. Stuff like a sign taped over the bin in the mens toilet: “Nappy bins located in the FEMALE toilets.”

Or that time that I took my daughter to ‘rhyme time’ at the local library. I deliberately arrived just after the start time. I wanted to sneak in, get straight to the singing and hopefully avoid the embarassment of being the only guy in the room. I was thwarted by a ‘helpful’ librarian who practically vaulted over the counter, so she could loudly ask “Do you need any help? We could make room at the front.” A room full of mothers stopped mid-chorus and stared straight at me.

I stuttered and did my best to kindly assure our helpful librarian that I was OK. But I’m pretty sure my tone reflected my embarassment and inner thoughts: “Thanks, I also went to primary school, I think I can remember how to sit cross-legged on the floor with everyone else.”

Oh, but the scariest of them all? Mothers Groups. These cliques are terrifying to me as a stay-at-home dad, they are worse than anything I encountered at school. I went along to a mothers group once. Not long after my daughter was born, when my wife was still at home. It was the first time the Mothers group was meeting and my wife was super nervous. Everything went well, my wife relaxed and made some excellent friends. At the end of the session the facilitator looks at me and says, “We don’t normally let Dads come to these sessions, they are just for the Mums.”

Well shit.

I have never been a popular person, but I needed to check my privilege here. Caucasian. Male. Heterosexual. This was my first bitter taste of adult ostracism.

Then we moved to Cairns, and I became super isolated. No family. No friends from my pre stay-at-home days. No local support groups. The only thing that kept me on an even keel was the stuff I created as an engineering monk. It was my only connection to an identity and world beyond being a Dad. That is until my wife left a copy of ‘Hear Me Roar: the story of a stay-at-home dad’ by Ben Roberston on the kitchen bench. It opens with a story of John Lennon.

John Lennon struggled with loneliness when he was a stay-at-home dad. He told Yoko he wanted to talk to other house husbands about the suffocating isolation, about the mood swings and the dpression. But Yoko said he couldn’t find anyone.

If I met Ben in person, I think we would really struggle to find things in common. He is into sports and doesn’t make a single passing mention of SpaceX or rocketry in his book. We would probably both avoid any talk about the one thing we have in common: that we are stay-at-home dads. This would be the one thing that connects us, the one thing that would break the ice and crippling isolation.

If you are a stay-at-home dad and feeling anything like John Lennon in the quote above, grab a copy of Ben Robertson’s book. It will help. You are a part of the 0.45% (proportion of Australian stay-at-home dads to population). While rare, you are not a unicorn. You do exist. We exist.

 

Humidity and moisture is an ongoing battle here in the tropics. Not only is it an issue when storing 3D printer filament, but everything has a tendency to rust or go mouldy very quickly. For a while I had been keeping those ‘do not eat’ packets that you find in some dried foods, and throwing them in my toolboxes or in with the printer filament.

But I wanted something better, something with more moisture absorbing power. I found these neato metal silica gel canisters. Designed for Pelican cases, you throw them in the oven for a couple of hours to cook off the moisture and ‘reactivate’ them. These looked the business, but were dear as poison. Hrmm, I have a stack of Altoids tins here that I have been collecting to bodge into something…

Photo of DIY molecular sieve altoids dessicant canister

Introducing the ‘Molecular Sieve Altoids canister’… Whoah. I know those words individually, but I have never seen them altogether like that before.

Molecular sieve is a desiccant, and like silica gel it absorbs moisture. The difference is that molecular sieve absorbs moisture faster and reduces water vapour to lower levels than silica gel. Apparently molecular sieve can even be used to dry silica gel and is often found in industrial applications like ‘drying cracked gas’. I have no idea what is entailed in drying cracked gas, but it sounds like molecular sieve is suitably overpowered for keeping my printer filament dry and tools rust free.

Supplies and Equipment

Photo of supplies and steps to build a DIY Altoids desiccant canister.

Build Instructions

  1. Use Dremel to cut a window into the Altoids lid. I used the white logo area as a template.
  2. Switch to a grinding attachment and tidy up the edges and remove any burrs.
  3. Cut a piece for flywire to fit inside the Altoids lid.
  4. Run a small bead of hot glue around the inside of the window and push the flywire down.
  5. Fill with molecular sieve 4a and start drying cracked gas. I mean, throw it in your toolbox.
 

I never really got into biographies. I guess I was so focused on ideas that I never spent any time understanding the people who created them. This all changed last year when I started building a family tree of influences. Biographies seemed like an interesting way to learn more about the people I would never get a chance to meet.

Photo of the book 'Elon Musk: Tesla, SpaceX and The Quest for a Fantastic Future' on the top of a table.

In Elon Musk’s biography, Ashlee Vance did an excellent job at creating a balanced picture of Musk. When I first picked it up, I was a bit worried that the book might be chapter after chapter of fawning at an industrial scale. However it was much more even handed than that. Reading Vance’s biography felt more like I was the one sitting down to chat with Elon Musk over dinner. Was Musk somebody I could relate too? Would the dinner fill with interesting conversation, or would it be a car crash as our personalities clashed?

You could certainly understand why some people had come to despise Elon, while others had placed him on a pedestal. In the biography Musk came across as opinionated, ambitious and driven. Fall onto the wrong side of those attributes and you have the recipe for any one of the conflicts Musk has faced during his career. But, if your worldview is similar to the opinions of Elon Musk then you are more likely to admire his attributes and attitudes.

There were only two things I didn’t like about the Elon biography.

In a couple of places Ashlee devolves into Silicon Valley startup lingo. Like where early on in Elon’s companies they are occasionally referred to as ‘plays’. Like some sort of gridiron strategy for extracting value from the marketplace. This was probably just reflective of the venture capitalists Vance interviewed along the way, but the lingo and implication seemed at odds with the general ethos behind SpaceX and Tesla.

The most jarring part of the book came toward the end when Ashlee was drawing conclusions. Vance fell into a trap of armchair psychology when he tried to rationalise some of Elon’s behavior. Ashlee dove into Aspergers, Neuropsychology and existential depression over a couple of short pages. All the research and evidence about these topics was missing and I certainly didn’t feel qualified or educated enough to form an opinion. “Here is a man and his behaviour doesn’t always adhere to these social norms. You need to be careful not to dabble in armchair psychology, but it is probably because of X.”

Quibbles aside, the best elements were certainly the early days at Paypal, Tesla and SpaceX. As someone who works in technology, being able to live vicariously through these engineering pursuits was super fun. I

Elon Musk: Tesla, SpaceX and the Quest for a Fantastic Future by Ashlee Vance is available from Amazon. It gets 4 out of 5.

4 stars out of 5.
 
A photo of a Raspberry Pi 2 with Polar H7 heart rate monitor.

In addition to your Raspberry Pi, you will need the following hardware:

Next, download, compile and install the latest ‘BlueZ’ on your Raspberry Pi. BlueZ is the Bluetooth stack for Linux, and it works with Raspbian. Plug your bluetooth dongle into your Pi and the following commands will install BlueZ:

$ wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.37.tar.xz
$ tar -xvf bluez-5.37.tar
$ ./configure --disable-systemd
$ make
$ sudo make install

The peripheral ID of the heart rate monitor is the address we use for connection. To get the peripheral ID of your Polar H7 heart rate monitor:

$ sudo hciconfig hci0 up
$ sudo hcitool -i hci0 lescan

This will return some output like:

LE Scan...
00:D2:D0:94:C2:C0 (unknown)
00:D2:D0:94:C2:C0 Polar H7 97C4C011

Use control-c to stop the scan. We are just interested in the line with ‘Polar H7’ in the description. In the example above, our peripheral ID is 00:D2:D0:94:C2:C0.

The programming language Go and the gatt library from Paypal can connect and retrieve data from the heart rate monitor. Before running a gatt program, make sure that the BLE device is down (off):

$ sudo hciconfig hci0 down
$ sudo service bluetooth stop

The gatt library defines callbacks for different stages of the peripheral connection process. It has a callback for when your bluetooth dongle changes state (like when it gets powered on). You can also set callbacks when a peripheral is discovered, connected and disconnected. So when we power up the bluetooth device, we start scanning for the peripheral ID of the Polar H7. When found, connect and when we have finished, clean up and disconnect.

d, err := gatt.NewDevice(option.DefaultClientOptions...)
if err != nil {
	log.Printf("ERROR: Unable to get bluetooth device.")
	return
}

// Register handlers.
d.Handle(
	gatt.PeripheralDiscovered(func(p gatt.Peripheral, a *gatt.Advertisement, rssi int) {
		onPeriphDiscovered(p, a, rssi, deviceID)
	}),
	gatt.PeripheralConnected(func(p gatt.Peripheral, err error) {
		onPeriphConnected(p, done, err)
	}),
	gatt.PeripheralDisconnected(func(p gatt.Peripheral, err error) {
		onPeriphDisconnected(p, done, err)
	}),
)

d.Init(onStateChanged)

Reading information from the Heart Rate monitor all happens in the connected callback. The Bluetooth GATT specification calls attributes with a single logical value a ‘Characteristic’. Like Characteristics get grouped together into ‘Services’. The Polar H7 supports the Heart Rate, Device Information and Battery services.

The heart rate measured by the Polar H7 in beats per minute is tucked away in the ‘Heart Rate Measurement’ characteristic of the ‘Heart Rate’ service.

// Get the heart rate service which is identified by the UUID: \x180d
ss, err := p.DiscoverServices([]gatt.UUID{gatt.MustParseUUID("180d")})
if err != nil {
	log.Printf("ERROR: Failed to discover services - %s\n", err)
	return
}

for _, s := range ss {
	// Get the heart rate measurement characteristic which is identified by the UUID: \x2a37
	cs, err := p.DiscoverCharacteristics([]gatt.UUID{gatt.MustParseUUID("2a37")}, s)
	if err != nil {
		log.Printf("ERROR: Failed to discover characteristics - %s\n", err)
		continue
	}

	for _, c := range cs {
		// Read the characteristic.
		if (c.Properties() & gatt.CharRead) != 0 {
			_, err := p.ReadCharacteristic(c)
			if err != nil {
				log.Printf("ERROR: Failed to read characteristic - %s\n", err)
				continue
			}
		}

		// Discover the characteristic descriptors.
		_, err := p.DiscoverDescriptors(nil, c)
		if err != nil {
			log.Printf("ERROR: Failed to discover descriptors - %s\n", err)
			continue
		}

		// Subscribe to any notifications from the characteristic.
		if (c.Properties() & (gatt.CharNotify | gatt.CharIndicate)) != 0 {

			err := p.SetNotifyValue(c, func(c *gatt.Characteristic, b []byte, err error) {
				heartRate := binary.LittleEndian.Uint16(append([]byte(b[1:2]), []byte{0}...))
				contact := binary.LittleEndian.Uint16(append([]byte(b[0:1]), []byte{0, 0}...))

				// Notify if the HRM has skin contact, and the current measured Heart rate.
				if contact == 6 || contact == 22 {
					fmt.Printf("1,%d\n", heartRate)
				} else {
					fmt.Printf("0,%d\n", heartRate)
				}
			})

			if err != nil {
				log.Printf("ERROR: Failed to subscribe characteristic - %s\n", err)
				continue
			}
		}

	}
	log.Println()
}

Full source code for reading from a Polar H7 and outputting the result to stdout with Go can be found here.

References

* You can use any heart rate monitor that supports the Bluetooth Heart Rate GATT Profile.

 

I am completely besotted with the Intel Edison. I love it. I think it is the most exciting hardware Intel has developed since my trusty old Pentium 200 MMX.

The only downside lies in the software ecosystem; it is still pretty small. The operating system the Edison ships with is ‘Yocto’, a linux distribution targeted at embedded systems. It is great, but pre-built packages (ipk) of many of your favourite open source tools don’t exist yet.

This guide steps you through the process of creating a package that the opkg package manager can install on the Intel Edison. It assumes you have bootstrapped your Edison, logged in and are comfortable executing programs at the command prompt.

Step #1 - Install opkg utilities.

$ opkg install http://iotdk.intel.com/repos/1.1/iotdk/i586/tar_1.27.1-r0_i586.ipk
$ opkg install http://iotdk.intel.com/repos/1.1/iotdk/i586/findutils_4.4.2-r6_i586.ipk
$ opkg install opkg-utils

Step #2 - Download and compile the utility you want to turn into an ipk

The following will use monit as a concrete example, but similar steps will apply to most Linux applications.

$ wget https://mmonit.com/monit/dist/monit-5.16.tar.gz
$ tar -xvzf monit-5.16.tar.gz
$ cd monit-5.16
$ ./configure --without-pam
$ make

Step #3 - Create the ipk file structure

The folder structure for an ipk is pretty straight forward, if you wanted to just install a file to /etc/foo. Create a directory structure only containing that file.

ipk-build
└── etc
    └── foo

Now if you are building a utility from source, often make install will let you specify a destination directory.

$ mkdir ipk-build
$ make install DESTDIR=ipk-build

For monit, this generated the following:

ipk-build
└── usr
    └── local
        ├── bin
            └── monit
        └── share
            └── man
                └── man1
                    └── monit.1

For monit, I also copied the default monitrc configuration file into the package so that it would be installed into etc.

Step #4 - Created control file

The control file contains metadata that opkg uses to describe and install the package. It should be placed in a directory called ‘CONTROL’:

ipk-build
├── CONTROL
    └── control
├── etc
    └── monitrc
└── usr
    └── local
        ├── bin
            └── monit
        └── share
            └── man
                └── man1
                    └── monit.1

The control file I created for monit contained the following:

Package: monit
Version: 5.16
Architecture: x86
Maintainer: reprage
Section: admin
Priority: optional
Source: https://mmonit.com/monit/
Description: Manages and monitors Unix systems.

Step #5 - Build ipk

To bundle everything up into a single file that can be installed by opkg:

$ opkg-build ipk-build

For my monit example, this created the file: monit_5.16_x86.ipk this can then be installed with:

$ opkg install monit_5.16_x86.ipk

References

 

I really enjoyed The Visual Display of Quantitative Information by Edward Tufte. One sentence from the book is all you need as a synopsis:

Graphical excellence requires telling the truth about the data.

The book is a collection of principles that guide how to effectively tell the truth about data. A couple of my favourites even have measurable metrics, like the ‘lie factor’ - a way of checking if representations of numbers in the graphic are proportional to measured quantities.

Hand drawn formula for the lie factor = size of effect show in graphic / size of effect in data.

If the lie factor is greater than 1.05 or less than 0.95, then the graphic is a distorted representation (i.e. a lie).

There are also a number of principles around efficiency and maximising ‘data-ink’, which is the non-erasable core of a graphic. Again, measurable with a little metric, the data-ink ratio is the proportion of a graphic’s ink devoted to the non-redundant display of data information.

Hand drawn formula for the data ink ratio = data-ink / total ink used to print the graphic.

Tufte describes a number of ways for both erasing redundant data-ink and maximising data-ink. It is at this point where the book gets really interesting. He adds a bit of depth by giving the necessary information to critique some of his following redesigns with this quote:

When modern architects righteously abandoned ornament on buildings, they unconsciously designed buildings that were ornament. In promoting space and articulation over symbolism and ornament, they distorted the whole building into a duck. The substituted for the innocent and inexpensive practice of applied decoration on a conventional shed the rather cynical and expensive distortion of program and structure to promote a duck…

Tufte then continues down a road of epic reductionism to maximise the data-ink used in Eleanor Spear’s range bar. Taking the design from this:

Photo of Eleanor Spear's range bar in the book the visual display of quantitative information.

Down to this:

Photo of Edward Tufte's range bar redesign in the book the visual display of quantitative information.

I felt as though Tufte had gone too far, promoting minimalism over legibility, and thus stripping the warmth and welcome from the original design. I guess I’m trying to say that if it is impossible or difficult to gleam understanding from a visual display, then it is nothing more than abstract ornamental art.

But then I realised this was Edward Tufte’s plan all along. He wanted to promote skepticism and critical reactions to his re-designs, as revealed in his Epilogue:

The theory of the visual display of quantitative information consists of principles that generate design options and that guide choices among options. The principles should not be applied rigidly or in a peevish spirit; they are not logically or mathematically certain; and it is better to violate any principle than to place graceless or inelegant marks on paper. Most principles of design should be greeted with some skepticism, for word authority can dominate our vision, and we may come to see only though the lenses of word authority rather than with our own eyes.

Oh, but the best part? That would be the simple word-sized graphics section in the final chapter, which demonstrates simple neat depictions of biomedical data. Stunning. A visual culmination of all the text that precedes it.

The Visual Display of Quantitative Information is available from Amazon. It gets 5 out of 5.

5 stars out of 5.
 

Last year, I started to put some serious effort into learning about influences. I’m starting to get a better handle on the ‘family tree’ of people that influence my own ideas and work. Two people in this tree are Van Neistat and Tom Sachs, the authors of ‘Nautical Challenge’.

Tom and Van are both artists - Tom’s focus is mostly on sculpture, while Van’s focus is film. They have a long history of working together, and in 2008 collaborated on a story that was woven through different episodes of the HBO series ‘The Neistat Brothers’.

You can watch extracts from the TV series in the supercut below. It’s a boat race that sets the scene for playful rivalry between the two friends.

In 2013, ‘Nautical Challenge’ was printed to accompany Tom Sachs’ exhibition “Nautical Challenge and other Voodoo” at Baldwin Gallery. The book opens with a letter each from Van and Tom, and contains a collection of photos from the exhibit and stills from the film. Being a couple of years late, and half a planet away, it was the closest I can get to seeing the exhibit in person. The layout perfectly shows off the props and boats installed at the Gallery. However the layout doesn’t work quite as well for the stills from the film. It is the only thing that holds this book back from scoring a perfect five.

Stills from the video are often used in a double-page spread throughout the book. They provide a great blast of full colour to offset the other pages containing white space and sketches. However they struggle to translate into the printed pages of the book. If the frame is centered on a subject, there often ends up being a massive crease through the point of interest. Here. Let me show you.

Photo a page crease in nautical challenge, obscuring Tom Sachs' reaction to a taunt.

This is a still from my favourite scene, where Van taunts Tom with a scale model. The crease obscures Tom’s reaction to Van’s gift. But really? Page creases in a book? That is all there is to complain about? You will have to excuse me while I sip on this glass of cool clean drinking water while I ponder other first world problems.

This book made an awesome gift, and as Australians say, it is going straight to the pool room.

Nautical challenge is still avaiable from Amazon and Printed matter. It gets 4.5 out of 5.

4.5 stars out of 5.