Calderwood Butte

The Nightmare Scenario

Apple announced today via an open letter to their customers that they would not be complying with a court order to "assist in the enabling of the search of a cellular telephone". This particular phone was owned by one of the San Bernardino shooters.

Part of Apple's letter states:

Specifically, the FBI wants us to make a new version of the iPhone operating system, circumventing several important security features, and install it on an iPhone recovered during the investigation. In the wrong hands, this software — which does not exist today — would have the potential to unlock any iPhone in someone’s physical possession.

It would be reasonable at this point to ask the question, "What's the big deal, Apple?" Especially when Apple says in the previous paragraph, "We have great respect for the professionals at the FBI, and we believe their intentions are good."

Here's why this is a Big Deal, and why Apple giving in and creating such a piece of software truly is a Nightmare Scenario:

1. Apple can't Just Decrypt This Phone

The FBI has already asked Apple to do this, and they said it's not possible. Since iOS 8 was released, all iOS devices encrypt their contents with a combination of data that's only on the device. Apple doesn't have this data, and they can't retrieve it, even if they wanted to. The only way to decrypt the phone is by entering the passcode.

2. The FBI can't Guess the Passcode

The phone only allows 10 wrong guesses before it will erase its contents, and entering the code requires physically tapping on the screen, a process which takes several seconds per attempt. Even if there was not a 10 try limit, it would take years for the FBI to try every combination.

3. What the FBI Wants from Apple

The court order demands apple do 3 things:

  1. Turn off the Auto-Erase function.
  2. Allow passcodes to be entered electronically.
  3. Ensure that passcodes can be entered as quickly as possible by the software (no added delay).

4. How Apple Could Comply

Because the security features are a built-in part of iOS, the only way they could be bypassed would be for Apple to build a custom version of iOS that removed these security measures. Then, this custom version would have to be installed on the phone in question, where it would then allow the FBI to run their own software to attempt to guess the passcode. It is not clear if the FBI would be successful in this endeavor even given the opportunity.

5. Why Compliance Would be a Nightmare Scenario

If Apple were to create a version of iOS that could remove these security features when installed, then you can rest assured that it would only be a matter of months before:

  1. Other law enforcement agencies would demand access to this software to attempt to unlock phones for all sorts of petty crimes.
  2. Those same law enforcement agencies would immediately lose possession of the software to malicious parties.
  3. Exploits would appear online, tricking users into "upgrading" their phones to use this insecure software, making it instantly accessible to malicious hackers the world over.

The bottom line is that this is pandora's box. If Apple creates a piece of software to turn off all these features, then the features might as well not exist for anyone, and that software will absolutely be used for evil in short time.

None of this addresses what is arguably a bigger issue: Whether or not government should be able to force companies to create new products with the purpose of rendering old products insecure and/or for the explicit purpose of acquiring their customers' private data.

Control A ZWay Server From The Command Line

Who doesn't want to automate their house via cron?

I have a Razberry module hooked up to a RaspberryPi, along with about a dozen or so Z-Wave devices (switches, sensors, etc.) throughout my house. The ZWay server still has an awful scheduling UI (you have to add an app for each schedule rule you want). Even X-10 had a scheduling UI, in the 90s. (Sadly, I couldn't find any good pictures of this old interface; perhaps I'm forgetting the proper name of the device.)

Well, cron has been executing the world's scheduled jobs since 1979. Whenever I can utilize a simple *nix tool to get a job done, I jump at the chance.

The only problem is that there isn't a basic command line interface to the ZWay server. So, I wrote one.

zway-cli is a simple Ruby gem that gives you basic command line access to your ZWay server. You can query device status, and turn things on and off. It's super basic, and super simple, which is exactly what I wanted for an application like this.

Things like this make me happy: $ zway kitchen_lights on

If you're running ZWay and want a simple way to control it via the command line you ought to give it a try.

How to 3D Print a Copy of your House Key

What You'll Need


First, figure out if your house key is a Kwikset or Schlage. If it's made by another manufacturer then you'll need to find someone who's made parametric or similar files for your brand of lock.

Next, download the appropriate OpenSCAD file from the bottom of this article.

Measure Your Key

Now, get out your calipers and measure the depth of each of the "Valleys" of the cut, beginning with the valley closest to the shoulder of the key (the end you hold with your fingers when using the key).

The depth is the distance from the flat side of the blade to the bottom of the valley. Write down the values, as we'll use them in the next step.

Note: If you have an original key already, it may be printed with the 5-digit cut code right on the key already. In that case, skip ahead to the section on Setting up the OpenSCAD model.

Figure out the Cut Code

Keys are cut from the factory with "Codes". Each "Code" value corresponds to a cut depth. What we need to do is work back from the cut depth to the code.

To do this, go to this chart of key code cut depths and scroll down to the section with the values for your lock.

Now, match up the depths you measured with the closest Root Depth value. Write the code (0-9) next to the measurements from before, again working from the shoulder out.

Setting up the OpenSCAD Model

Now that you have the codes, open up the OpenSCAD model for your key type, and scroll to the bottom. Replace the codes with the code for your key, render, and export as an STL file.

Printing The Key

I printed my key on the highest quality setting my printer would allow. I recommend you do the same. Being such a small part the print was very quick.

Using The Key

The first time you go to use your key you may find it difficult to get into the lock. My print lacked the precision in the profile cuts that would allow it to move smoothly at first. With a little bit of scraping or chiseling, you should be able to get it into the lock without too much force, and it should turn freely.

Note: Do not force the key! You do not want to break the key (or any parts) off in your lock, as this could render it unusable!

What if it Doesn't Fit?

Recheck your pin depth measurements and print again, if necessary. Now that you have a printed copy it should be easier to see where things went wrong. Measure your key vs. the printed key to find any codes that are mismatched, then update them in the model and reprint.

Parting Thoughts

I would recommend that you not use this key on a daily basis. A 3D printed key, especially if you're printing with PLA (a very soft material), is going to lose material into the lock each time you use it. Over time you're likely to accidentally introduce plastic fragments that jam your lock or break your key off in the lock.

However, a printed key can make a great emergency key. Key it on hand in a drawer or at a friend's house in case you need an extra key in a hurry.

If you really need a permanent key, try, or your local hardware store.

3D Printing

I got my first 3D Printer on January 6, 2016. I ordered a Maker Architect 3D Printer from Monoprice for $299. It turns out that the Maker Architect 3D is basically a Flashforge Creator, with a single extruder and no heated bed. It came with 1kg of white PLA filament.


The unboxing experience of this printer was pretty poor. I had already read the reviews and knew that the instructions were limited at best, so it wasn't surprising. As poor as the experience was, it was pretty easy to get going. Just a matter of bolting the extruder to the rails, attaching the filament holder, then booting it up and running the startup script.

Leveling the Bed

As I was reading up on 3D printing before my printer arrived I kept reading over and over how important it is to have a perfectly level print bed to get good prints. So when it came time to walk through the bed leveling process I went very slowly, following the instructions as closely as possible.

One problem I've run into is that, during the leveling process, the printer moves the head to the back-center position and asks me to slide a piece of paper for measurment between the bed and the extrusion head. The problem is that the head is actually beyond the bed at this point, so there's no great way to measure. I haven't figured out how to fix this yet.

First Print

My 3D printer came with an SD card that included some test prints available for you right away. I started printing the 42mm test cube, but pretty quickly aborted the process. It was going to take forever to print this cube.

Instead, I downloaded a 22mm test cube from thingiverse to print. This is where I first ran into confusion in dealing with software, which at least at this time was very convoluted.


In order to print on my printer, I need to give it files in x3g format. X3G is a kind of GCode format that's common among Makerbot and compatitble printers. However, the object files you download are in STL format. So, what do you do?

Go download and install Makerbot Desktop. Then, drag your STL file into Makerbot. From there, click Settings, and configure your print settings. For your first test print, try just going with the standard quality preset. The only things to look for would be bed temperature (set to 0° if you don't have a heated bed) and max movement speeds. In my case the manual listed those out, and all of the standard template values were within range, so I just stuck with the defaults. Then, it was time to export the X3G file, copy it to the SD card, take the SD card over to the printer, and try to print.

First Print, Actually Printing

This time, the print moved along at the speed I was expecting. It took about 15 minutes to print the 20mm cube on top of a raft.

Getting the Print off the Bed

My printer came with a sheet of 3M material that I stuck to the top of the acrylic bed before leveling. For me, getting the prints off has been pretty easy with my knife. Just stick the edge of the knife under the edge of the raft or part, and start prying gently. I haven't had a problem with a part sticking to the board (parts sticking to the raft is another story). For the cube, it popped right off, and the raft also peeled right off for me. First print success!


I've printed about a dozen items since then. I'll cover the more interesting ones in other articles. For those looking for objects to print, there's a reason everyone goes to Thingiverse.

Building a (Siri Controllable) Raspberry Pi Thermostat

When it first came out, I was really enamoured with the nest thermostat. The idea of a remotely-accessible, app-controlled thermostat appealed to the gadgeteer in me, but the price and lack of flexibility (it really wanted to be left alone to learn and do its own thing, as opposed to being controlled by a fixed schedule), plus my propensity to tinker, led me to build my own.

For a long while I had an Arduino-based thermostat running in my house, but I wasn't very happy with it. Writing code for the Arduino isn't always very fun (for me), especially when you want it to be web-accessible.

Then came the Raspberry Pi.

This is what I had always wanted: a little full-blown computer with a bunch of GPIO pins. It runs Linux, which means you can leverage all the great software you're already using elsewhere, and you're free to use your programming language and web technologies of choice when building the software.


The basic idea of the PiThermostat is this: The Raspberry Pi reads the current temperature from a Dallas 18B20 temperature sensor, and then turns on/off the relevant relays on a linked Relay Board. That relay board can either control the direct wires from your existing thermostat, or can control the A/C power to an outlet, etc. This gives you full flexibility to replace an existing central HVAC thermostat, or just control a window A/C unit. I have two thermostats running, one in each of those configurations.

Parts List

This is the current parts list:

Setting Up the Raspberry Pi

  1. Download the latest version of Raspbian from
  2. Install the image to your SD card.
  3. Connect your Raspberry Pi to the network, wait for it to boot, then SSH to it.
  4. Run raspi-config and configure your Pi as desired, changing passwords, etc.
  5. Turn your Pi off.
  6. Wire up your temperature sensor. I used GPIO pin GPIO04 (hardware pin #7). See the pinout here
  7. Wire up your relay board. I used GPIOGEN0 - GPIOGEN3 to control relays 1-4, respectively.
  8. Install the software to run the PiThermostat code as explained under 'Setting up the Pi' over on the project Github site

Controlling the Thermostat From the Web

By default, the rails app powering the thermostat runs on the web. Just point your browser to that IP Address / URL and you can set the temperature, set schedules, override schedules, etc. Just make sure you setup the thermostat on the rails console first.

Controlling the Thermostat From An App

The rails server has a full REST API for handling a native app. I've hacked together a few UIs to manage my thermostats, but none are polished enough to be worth releasing. If you write one I'd love to know.

Controlling the Thermostat From Siri

This is where things get even cooler. First, go install Homebridge, which basically involves installing node.js and editing a single config file.

Once Homebridge is installed, go get the accessory file for the PiThermostat, and install it into your accessories folder. Then edit your config, restart Homebridge, and boom, you should be able to tell Siri to "Make the thermostat colder." If you have an Apple Watch, you can even do it from your wrist, Dick Tracy style.

The Cashflow

In Stephen King's, The Langoliers, we are introduced to the creatures that consume the past, preventing us from ever returning to it. Merciless devourers, they relentlessly follow us all through time, ingesting history, insatiably pursuing us in an eternal chase.

As the story progresses, the main characters find themselves face to face with these gluttons, and they must do their best to outrun them; winning the race is their only hope.

As a micro-business owner I awake most days with the weight of an awareness on my shoulders; I must to attempt to evade my own kind of Langolier, the ravenous and unquenchable monster of Cashflow.

Each day I travel down the rough-shodden and mostly gravel road of business, always trying to get away from the beast.

From time to time I am able to find a bicycle to ride. Landing a new deal yields strength for pedaling, at least until the tires run flat or the chain snaps.

When the rusty wheels skitter to a halt I may take a moment to catch my breath and look behind me to appreciate the distance that I have put between me and the leviathan that pursues me.

Though while I may wait, he never stops.

Relentless in his pursuit, I jog ahead, legs burning from the journey, looking for another ride; I might even take a skateboard if I find it. Anything to keep moving, and stay ahead of him.

When I stand still, I can hear the churning of his teeth and the bones breaking in his mouth. I can feel his steps in the ground.

There are times he has been close. So close that I could smell the stench of debt on his breath. Close enough to see the blood dripping from his lips as he devours everyone in his path. I have been separated from those I cared about as we tried to outrun him together.

You can't fight the Cashflow. You can try to slow it down, or get ahead of it. You might find yourself, as I have, on the ground, the gravel ripping into your back while you throw everything you can find at it in an attempt to satiate it for just long enough to get back on your feet and get away. You might even manage to succeed, to get back up, hitch a much needed ride, and put a little distance between you and the savage.

If things go well for you, you may find yourself moving quickly down the road, putting so much distance between you and the monster that you can't see him anymore. You may find a ride that carries you for years.

But no matter how far ahead of that devourer you are, when you stand still and the wind is blowing gently from behind, you will still hear that churn, still remember that crunch, and still feel those steps. Your pulse will quicken, your muscles will tense, and you will be reminded: you can never stop, because if you do, he will find you.



The first time you feel it your blood goes cold. The hair on the back of your neck might stand up. Your pulse almost certainly rises quickly, which does nothing to help.

You sit perfectly still. You're probably holding your breath, but you don't realize it. Like your rising pulse, this also does nothing to help.

You wait expectantly, but nothing happens.

You go back to what you were doing. Maybe you were working at your desk, or mending a garment, or working in the garage. As you work on the task at hand, the thwump fades away, and your current task regains your focus.

Then it happens again: Thwump.

Any hope you had that the first occurrence was a fluke, or perhaps just a figment of your imagination, is gone. That thwump truly happened; there can be no doubt about it. If the first thwump made your blood run cold, the second fills it with icebergs.

Those thwumps that you felt were right in the center of your chest, or maybe a little to the left. They were about as hard as someone flicking your sternum, but it came from the inside.

That thwump was your heart, and that thwump was not a normal heartbeat.

At this point you are almost certainly wondering if you're having a heart attack. You're not, but it's hard to imagine that one would feel any different.

You're probably breaking out in a sweat, and as frightened as you have ever been. If you're young, you're wondering how this could be happening to you at this age. In any case, as you sit at your desk you're wondering if this cubicle is going to be the last thing you'll ever see.

But, like the first one, the second thwump fades, and time passes. The third one follows at another random interval, maybe shortly after the second, perhaps not for several hours.

That first day, you'll probably only experience a few. If you haven't already gone to the emergency room by the evening of the first day, you'll probably sleep that night, though rather fitfully. The lack of sleep the next day does nothing to help the symptoms.

If you haven't made a cardiologist appointment (thwump) by the next morning, it won't be long before you do.

When you have your appointment with the cardiologist, you'll receive an EKG that says everything is normal. You'll wonder if the cardiologist understands what normal actually means.

Your cardiologist will ask you to explain your "symptoms", perhaps asking in such a way as to imply that you probably don't even have a heart in that chest anyway. You'll feel stupid, because when this first happened you were sure you're dying, but here you are a few days later an, honestly, you feel pretty okay.

You'll do a stress test, which involves running on a treadmill with a series of electrodes taped to your chest monitoring your heart while you run. It might even involve an ultrasound of your heart at the same time.

You'll wear a "halter pack", which is a heart monitor that you wear all day under your clothes, gathering data. You'll have a button to press every time you experience your "symptoms." You'll press the button several times, but those thwumps never seem to happen at quite the frequency they do when you aren't wearing the monitoring equipment.

A few days or weeks later, your cardiologist will come into the room with a smile to let you know that "everything is fine" and that it's "probably just PVCs.” She'll say just in that way that makes you pretty sure she's wondering why you're in this office in the first place.

"There's really nothing to worry about. They aren't harmful. Cut back on caffeine, alcohol, and stress. Get more sleep and exercise."

You have three kids and thwump your own business, and now your heart seems to need to remind you randomly that it's still in your chest, though frankly, it'd rather be doing something else. Stress? What stress?

Oh the way home you're wondering how you're going to adj-thwump-just.

For the next few days you'll probably find yourself sitting in your chair for a long while, just waiting for that next thwump to kick you in the chest.

Eventually you really do adjust. When you survive enough thwumps without any obvious side effects, you start to believe your cardiologist. You Google PVC too much, read too many articles, but start to realize that you probably will survive this thwump just fine.

Hopefully, you find some ways to cut back on stress and increase sleep and exercise. Prayer, meditation, and relaxation techniques are actually very helpful in this regard.

While you might be able to adjust to these irregular heartbeats, it's impossible to get used to the feeling of your heart kicking you in the chest when you least expect it.

If you're able to make some lifestyle changes, you can go weeks or months without experiencing that kick. You might even start to forget that it can happen.

Then, one day, when you're making your coffee in the morning, you'll be reminded of your mortality in the way know one else around you will know.


While taken from my own experiences, people with PVCs can experience a wide array of symptoms, and for some people the condition can be debilitating. Thankfully that has not been the case for me up to this point.

I have found that there are 2 main contributors to my PVCs: lack of sleep, and anxiety, the latter of which is often amplified by the former.

Getting regular sleep has taken on a new priority for me, which has meant giving up on certain things I'd rather do to ensure that I don't miss out on a good night's rest whenever possible.

Dealing with stress and anxiety is a large enough topic that it deserves its own post, but I can summarize my approach by saying that I now take specific steps to try to get ahead of anxiety rather than waiting for symptoms to crop up and force my hand.

If you suffer with PVCs and feel the isolation that can come along with that, I hope you'll find someone to talk to. If you don't have anyone in your life you can confide in, I'd be happy to talk.