The process is actually quite easy, but the installation docs don't provide the right hints. I found some posts online suggesting others had battled with this, so I share this here in case others get tripped up as well.

1. Install Docker. Create a docker group, add yourself to it, then log out and back in. Verify you can run the "hello docker" sample as yourself.

2. Run the TensorFlow GPU image:

$ docker run -it -p 8888:8888

3. Visit and verify you can execute the "hello tensorflow" samples. These will run without the GPU--you'll see errors on the console about not finding the CUDA libraries. Close the docker instance.

4. Install the latest nvidia binary display driver for your system. The simplest way to do this is through the Software & Updates GUI, Additional Drivers. Select "using NVIDIA binary driver," apply changes and restart. You can verify you're running the nvidia display driver by running nvidia-settings from the command line.

5. Install CUDA. On 16.04 the easiest way to do this is directly from apt:

$ sudo apt-get install nvidia-cuda-dev nvidia-cuda-toolkit

6. Install cuDNN v4. This needs to be installed manually. See instructions here. (You need to register for an nvidia developer account).

7. Run the TensorFlow GPU image, but this time give it access to the CUDA devices located at /dev/nvidia*. The easiest way to do this is with a script. The one the TensorFlow docs reference doesn't work with 16.04, so use mine.

8. Visit again. This time when you run the samples you shouldn't see any CUDA errors.

I often catch myself telling people how much I hate mailing lists. It's usually around the point in the conversation when I realize they're giving me the "you're a crazy person" look.

Before you give me the same look, hear me out! How often have you said or heard:

  • Who's on this list?
  • What is this list for?
  • Who should be on this list?
  • Should I be on this list?
  • Can you add me to this list?
  • What should we name this list?
  • Who do I talk to create this list?
  • How do I add someone to this list?
  • Can I get permission to add someone to this list?
  • Who has permission to add someone to this list?
Or the worst: "Sorry you missed that super important email--I assumed you were on that mailing list!"

The social dynamic mailing lists create bothers me the most. The inclusion felt by those on the list, the exclusion felt by those not on the list... Creating mailing lists are quick way to silo an organization.

But it's not all bad. Mailing lists are nice when you have a very large number of people that you want to broadcast a message too. They're great for one-way communication like announcements.

Is there a middle ground? I believe if organizations followed some simple guidelines they could derive benefits from mailing lists and avoid most of the negative side effects. If I was so bold as to propose some guidelines for adopting mailing lists, they would be something like the following:

  1. Don't create mailing lists for small groups. I think a good rule of thumb is about 10 people starts to warrant a mailing list. Anything less than that and you can remember their names. If you can't remember their names then don't bother them with an email!
  2. Let anyone join your mailing lists. Don't do "ask to join" or keep the mailing list a secret. If you're tempted to share secret stuff on a mailing list you probably should be mailing people directly anyways.
  3. Let anyone read your mailing lists. Maintain a public, searchable archive for all of your mailing lists. If your IT administrator complains tell them it's the 90's--web indexes for mailing lists have been in existence since the beginning of the web.
The OBDLink SX is an inexpensive USB OBDII scantool marketed by It's sold as a Windows-only scantool and comes packaged with some very simple OBDII software.

Not much exists on MacOS X for CAN monitoring, but I was still curious if I could access my car through my Mac. The System Information app told me the OBDLink SX had the vendor ID for Future Technology Devices International, a manufacturer of popular USB<->Serial bridges like the ones in the Beaglebone Black. Once I had that established it was just a matter of guessing the baud rate to see what was connected to it, and a few minutes later I discovered the OBDLink SX is actually the common ELM327 OBD to RS232 Interpreter, for which a great deal of software already exists.

So here's how you can chat with the OBDLink SX USB on MacOS X:
  • Connect the OBDLink and check if the device appears at /dev/tty.usbserial-000012FD. The Console will also say FTDIUSBSerialDriver: start - ok. If you don't see the device or this message then you may need to install the FTDI USB kext from here or here.
  • Open a screen session 115200 baud, 8 bits, no stop bits, parity.
  • Type ATZ <enter> to reset the device, at which point you can chat with it.
  • If you want to be able to see what it's saying back send the ATL1 command to enable line feeds.
Happy hacking.

$ screen /dev/tty.usbserial-000012FD 115200,cs8,-cstopb,parity
ELM327 v1.3a
> ATL1


Crazy-simple Pot Roast

| No Comments
Lynne did a show recently where she mentioned off-hand that if you use your dutch oven on a cooktop instead of your oven you'll get similar results and save a lot of energy. We've always done roasts in the oven and we had a roast in the fridge so I thought I'd give this a whirl. But I was also short on time (less than 1.5 hours until dinner) and short on ingredients too, so I tried making the simplest pot roast I could think of. Turned out great.

  • 1.5-2lb beef roast
  • 2 carrots, peeled, diced
  • 2 celery stalks, diced
  • 2 cloves garlic, diced
  • 1 giant russet potato (peeling optional), diced
  • 1/2 yellow onion, diced
  • 1/2 cup red wine
  • 1/8 cup water
  • 1 tbsp kosher salt
  • 1 tbsp coarse ground black pepper
  • olive oil

Heat the dutch oven on medium-high. Put some oil on, heat it right below the smoke point. Thoroughly salt and pepper one side of the roast, then put that side down on the dutch oven. While it's searing salt and pepper the other side. Sear for a minute or two then flip. Sear on the other side then remove the roast to a plate. Should be nice and brown, crusty on both sides.

Loosen the fond off the bottom, add more olive oil and throw in the vegetables. Toss with more oil and saute for a few minutes. Add a splash of water, the wine, bring to a slow boil, reduce to a simmer and cover for 10-15 minutes. You want the potatoes to start showing signs of cooking and the onions starting to become translucent.

Place the roast on top of the vegetables, cover and continue simmering. After 20 minutes start checking the internal temp of the roast. Take it off the heat when it reaches an internal temp of 120F, should take about 20-30 minutes. Let it rest for 5-10 minutes before serving.

If you want to make this complicated you could add fresh mushrooms, fresh thyme, fresh rosemary, shallots, dried porcini mushrooms, a little beef stock (instead of water), or maybe a little butter (as a substitute for some of the oil). If you want to get fancy you could reduce the sauce with some additional wine and butter (maybe a touch of cognac and fresh herbs too?) and pour that over the roast when serving. Most of the crowd at my house wouldn't appreciate that though.

What's especially great about this is if you don't eat the whole thing you can chop the rest of the roast, make a quick roux from 2 tbsp flour + 3 tbsp butter, add 2 cups chicken stock and 1 tsp cognac or brandy then simmer for a few minutes and you've got a beef stew out of the leftovers. Sounds cliche you'll want to say "bam!" after completing the stew.

Matsutake Bisque

| No Comments
Fall is matsutake season in the Pacific Northwest. We went mushroom hunting last weekend and came back with a few pounds--they're easy to find if you know where to look.

  • 1 lb fresh matsutake mushrooms, sliced thin
  • 1 medium yellow onion
  • 4 cups beef stock
  • 4 tbsp butter
  • 3 tbsp flour
  • 8 tbsp half and half
  • 2 tbsp olive oil

Saute mushrooms and onion in olive oil over high heat. The mushrooms will release most of their liquid after a few minutes, then reduce heat and simmer until most of the liquid evaporates. Add beef broth, bring to boil then reduce heat and simmer on low for 30-45 minutes.

Transfer mushrooms and onions to blender along with a cup or two of liquid. Blend on high speed until smooth. Transfer blended mixture back to stock and mix thoroughly.

Make a roux with the butter, flour and half and half. In a separate pan melt butter on medium heat, add flour and stir vigorously with a fork until butter produces dense bubbles, about 60-90 seconds. Add half and half and continue stirring vigorously until thickened, then stir roux into mushroom stock.

Serve. Fresh parsley would make a nice garnish on top.

Julia's mushroom bisque recipe calls for stirring in a few egg yolks at the end, and using a bay leaf in the stock. I haven't tried it with the matsutakes but I suspect it will detract from the unique nutty/woody flavor of the matsutake. I am curious however..

Quick "Tonkotsu" Ramen

| No Comments
Inspired by this article at The Food Lab on making tonkotsu ramen at home, but not inspired by the crazy prep time (12+ hours), I thought I would attempt speeding the process up with a pressure cooker, substituting a little chicken broth and skipping the chashu pork. It turned out pretty good, and took a fraction of the time. I started about 2PM and was eating by 6PM, my kids loved it, and I spent probably less than hour in front of the stove.

  • 3/4 lb pig feet
  • 2 cups chicken stock
  • 3 celery stalks
  • 1/2 yellow onion
  • 4 tbsp miso
  • 2 tbsp fresh finely chopped garlic
  • 1 tsp fresh finely chopped ginger
  • 4 chopped scallions
  • 1/2 lb thinly sliced pork, shabu-shabu style
  • 4 oz white mushrooms, quartered
  • noodles*

Rinse the pig feet in water, then place in the pressure cooker with the celery and fill half way with water. Add about a tsp of salt, then fire it up and walk away.

After about 2 hours take it off the heat and let it cool. Use a fat separator to separate the pork bits and vegetables from the broth, rinse out the pressure cooker and then return 4 cups of the pork broth to the pressure cooker. Keep a good amount of the pork fat in the stock, you'll thank me later.

Add the chicken broth to the pork broth, toss in the mushrooms, onion and a slice or two of the pork and simmer at just under a boil.

At this point you'll want to start bringing your pork up to room temperature. Later I'm going to ask you cook it in your bowl in the hot soup, and you'll want it warmed up as much as possible so it cooks fully and doesn't cool your soup too much. It this makes you nervous it also tastes great if you flash-brown the pork in the garlic-infused oil you're left with following the next step, then set it aside in a covered bowl. Just don't over-cook it.

Heat up a few tablespoons of vegetable oil in a pan and fry the garlic and ginger, until it's a crispy, golden brown. Then remove from the pan and set aside.

Let your stock go with the mushrooms and onion for at least 15 minutes. Once the mushrooms are soft and the onion is a little translucent add the miso. 4 tbsp is just a suggestion--I would recommend starting there and adding more to taste.

Now get your *noodles ready. You want them to be steaming when you pour the soup over them. I've done this a few ways: With pre-cooked soft noodles you can heat them with a few drops water in the microwave, or you can drop them in the stock for 15-30s inside a large colander ladle. (I wouldn't recommend the later unless you plan to consume all of the stock immediately, as the stock will get starchier the more you do this). With fresh noodles you can boil them separately then strain them in a colander--just be sure they're still hot when you assemble the soup.

To serve, put the noodles in a bowl and place some of that raw, thinly sliced pork on top. Pour the near-boiling soup in, then sprinkle on the fried garlic and scallions. I also like to add a little bit of pure chili paste on top.


See also: Mediocre Tonkatsu Ramen
Hard drive encrypted using FileVault? Lost your password? 

You can't get your data back, but you can make the MacBook usable again:

  • Start the MacBook in Target Disk Mode by holding down 't'
  • Connect the MacBook to another computer using a Thunderbolt Cable.
  • You will be prompted for the drive's password. Click Cancel.
  • Wipe the partition table of the drive using sudo dd if=/dev/zero of=/dev/diskN bs=1024k count=1 (where N is the drive number)
  • Eject the drive.
  • Reboot the MacBook while holding down Cmd-R to enter recovery mode. It will switch to "Internet Recovery Mode" and begin the restore process.

On the Art of Debugging Software

| No Comments
Excerpt from Mager, Troubleshooting the Troubleshooting Course, 1982:

A 1979 study by Cutler (Problem Solving in Clinical Medicine) made an observation about the importance of probability information by offering three maxims for diagnosticians:

  • Common diseases occur commonly.
  • Uncommon manifestations of common diseases are more common that common manifestations of uncommon diseases.
  • No disease is rare to the person who has it.
It is interesting to translate these maxims into the language of equipment and troubleshooting. They come out this way:

  • Common troubles occur frequently.
  • Unusual symptoms of common troubles occur more often than common symptoms of uncommon troubles.
  • No trouble is rare to the client who has it.
Mager's book is mostly about equipment troubleshooting. More specifically, training courses on troubleshooting, their flaws, and how to fix them. The anecdotes in the book deal with the diagnosis of appliances, manufacturing equipment, radars, etc., but I was delighted by how relevant they are to diagnosing issues in software.

Most software engineers have a crazy bug story or two (or twenty) but it's rarely a true "crazy bug." It's usually a typical bug like a race condition, off-by-one, uninitialized variable, memory leak, misinterpreted API, etc. that manifested itself in an extremely odd way.

Updating Cutler and Mager:

Uncommon behavior resulting from common software defects occur more often than common behavior of uncommon software defects.

About two weeks ago I noticed my wifi performance at home went to garbage. When I first got the router I was getting 20-30Mbps but now I was lucky to get 250kbps. TCP connections were constantly retrying and frequently timing out. Something changed. Figuring my neighbors might have set up a new AP I opened up Maverick's Wireless Diagnostics tool and started scanning.

What I saw shocked me. There was a new network, one BSSID away from mine, named 'xfinitywifi' broadcasting on the same channel, at the same signal strength. That could only mean one thing: someone had hacked my wifi router and somehow got it to broadcast a second network so they could steal my bandwidth.

Thinking first that I was hacked, I reset the modem to factory settings and picked new passwords for everything. I ran some tests and confirmed that my wifi performance was back to what it was the day I got it. Things were fine for a few hours but then the xfinitywifi AP reappeared.

Google search for 'xfinitywifi'. I'm not the only one. Lot's of angry people. Others were noticing the same thing, and the culprit was Comcast. Searching more I found that supposedly you can disable it:

We encourage all subscribers to keep this feature enabled as it allows more people to enjoy the benefits of XFINITY WiFi around the neighborhood. You will always have the ability to disable the XFINITY WiFi feature on your Wireless Gateway by calling 1-800-XFINITY. You can also visit My Account at, click on "Users & Preferences", and then select "Manage XFINITY WiFi."

But when I followed these instructions I received the classic lazy programmer's, "an unexpected error has occurred, please try again later" error message.

So I called the number and was able to speak to a human being after being on hold for 9 minutes. What they said reflected the experience of other's who've tried similar.

At first she denied that this was going on. I said that my router was broadcasting a second BSSID with the network name "xfinitywifi" and I wanted them to disable it. She said (not joking): "Are you sure? How do you know?" I said I have diagnostic tools and when I power the router off the second network goes down with it.

She still didn't believe me. She wanted to run me through a set of standard "put the O.N.O.F.F. switch in the O.F.F. position then back in the O.N. position" tests. I interrupted and said I knew it was a Comcast configuration, "you have a button on your website to disable this but it's not working, I get an error."

Long pause. Then in a tone that said, "why didn't you say that the first time" she says "Ohhh... the XFINITYWIFI network... Why would you want to disable that? That's a free service that we provide. You don't need to disable it." Then she pauses, expecting me to say something in return.

My turn to pause. Having practiced these types of conversations in the past, I paused for about 5 seconds, then let out a slow, exasperated sigh. I said, "I dunno.. I dunno what to say. I'm speechless... So.. How can you do this? How can you share my bandwidth without my permission? Where did I agree to this? How is this legal?"

She then tells me that she doesn't have permission to disable it. Only the wifi support department has that capability. I'm put back on hold.

Imagine at this point my frustration. While on hold I go back to the website and keep reloading the page to disable the feature and finally on the 5th try it lets me disable it. The changes take effect after a minute, the BSSID is gone. I hang up the phone.

30 minutes later I check the Wireless Diagnostics tool again. The BSSID 'xfinitywifi' is back. Go back to the website, "unexpected error" yet again.


So it automatically re-enables itself. Which means the choice is either a) buy a different cable modem that doesn't support this garbage or b) move to a different Internet provider.

I'm 110% for community wireless initiatives. I believe free or highly affordable public access to the Internet would be good for people and better for the economy. In 2002 I co-founded, a small project that tried to blanket as much of the Corvallis, Oregon area in free wifi as possible.

What bothers me about xfinitywifi is a) they didn't ask my permission to steal my bandwidth b) broadcasting a second AP on the same channel is just dumb and c) they're charging for this service. I would rather have an open AP and use MAC filtering to limit bandwidth.

It's been about 5 years since my wife and I switched full-time to cast iron cookware. We've thrown out all of our Teflon and all that remains that's not cast iron are a few stainless pots and sauté pans.

If you haven't made the switch yet, you should make the switch:

  • Easy to clean. Just quickly scrub under hot water with a stainless steel scrubber and wipe dry. A few times a week rub a few drops of oil in with a paper towel. Stainless spatulas are also easier to clean than the plastic ones you need to use with teflon.
  • Easy to cook with. Cast iron heats incredibly evenly, meaning your pan won't have any hot spots. Apply a little bit of oil before cooking and you've got a perfect non-stick surface. Fried eggs, omelets, steaks are all wonderful when cooked in cast iron.
  • No health or environmental concerns. Teflon breaks down over time and gets into your food, stainless can warp or rust if mishandled. Cast iron is virtually indestructible. Even if your cast iron rusts you can scrub the rust off, reseason it and it's as good as new. Your children's children will inherit your cast iron.
  • Highly affordable. Cast iron pans are about half to a third the cost of equivalent non-stick pans and when you consider they last forever it's an even better bargain.
See also



Monthly Archives


Tag Cloud

Find recent content on the main index or look in the archives to find all content.