Driftwood Public Library Follow-Up

Driftwood Public Library is great! I had a wonderful time in Lincoln City speaking about secret societies and cryptography. Links to my slides are below.

Secret Societies in Fiction How Computers Changed Cryptography

For a bibliography for “How Computers Changed Cryptography”, check my notes for my OMSI Science on Screen talk.

Also, I would like to thank the ‘D’ Sands Condominium Motel for sponsoring the talks and providing me with a really lovely room.

My view was great.

This is the view from my motel room balcony at the ‘D’ Sands.

Raspberry Pi GPIO with Erlang

Raspberry Pis are super cool. One of the neat things about them is that they have a ton of general purpose input/output (GPIO) pins, so you can use them to control all sorts of external devices. Unfortunately, most of the examples and applications are written in Python. I know, a lot of people really love Python, but it’s just not my cup of tea.

Enter the Erlang πGPIO library by Paolo Oliveira! This is a simple, straightforward library that implements the RPi GPIO stuff for Erlang. Using it, I have created an Erlang library to control a 28BYJ-48 5V stepper motor with a ULN2003 controller board.

Check out the library here.

OMSI Science on Screen Wrapup

Zimmerman Telegram

My talk at OMSI last night, “Computers and the Dawn of Modern Cryptography,” went really well. It was a great crowd and there was a good Q&A session afterwards. I’m going to keep this post really brief. First, there will be slides for my talk. Following that will be a brief bibliography if you’re interested in learning more about this fascinating topic.

Click here to download my slides.


  • Singh, Simon. The Code Book: The Science of Secrecy from Ancient Egypt to Quantum Cryptography. Reprint edition. New York: Anchor, 2000. This book is the best resource I’ve found for a logical breakdown of how cryptography and cryptanalysis worked for WWII cryptology.
  • Boone, J. V. A Brief History of Cryptology. Annapolis, Md: Naval Institute Press, 2005.
  • Copeland, B. Jack, ed. Colossus: The Secrets of Bletchley Park’s Codebreaking Computers. Oxford ; New York: Oxford University Press, 2006. I can’t wait to explore this book more! It is a massive collection of articles and papers from a wide array of authors.
  • Drea, Edward J. MacArthur’s ULTRA: Codebreaking and the War against Japan, 1942-1945. Modern War Studies. Lawrence, Kan: University Press of Kansas, 1992.
  • Wilcox, Jennifer, United States, National Security Agency/Central Security Service, and Center for Cryptologic History. Sharing the Burden: Women in Cryptology during World War II. Fort George G. Meade, Md.: Center for Cryptologic History, National Security Agency, 1998.

In addition, almost all of the photos and information on individual cipher machines can be found at Crypto Museum. This is a rich and bountiful resource for those interested in the internal workings of modern encryption.

OMSI Science on Screen: The Imitation Game

On March 28th, I will be giving a lecture called “Computers and the Dawn of Modern Cryptography” at OMSI as part of their Science on Screen program. I’ll be speaking and answering questions just before a screening of The Imitation Game, starring Benedict Cumberbatch and Keira Knightley. I am really excited about this opportunity! Please come down to OMSI for an informative lecture and an excellent film.

Buy Tickets Here

From StartCom to Let’s Encrypt

This past Fall, a bunch of big names removed StartCom from their trusted SSL Certificate Authority list. As a result, when I renewed my SSL certificates this year, I went with Let’s Encrypt. It was a pleasant experience, because Let’s Encrypt uses a command-line client called Certbot that does most of the heavy lifting for you.

After certificate renewal, everything is still looking pretty good. Please let me know if you have any SSL problems with my website through the contact form.

Screenshot from 2017-01-19 16-16-45

Installing Ansible 2.2.0 on a Raspberry Pi

Ansible is a powerful IT automation tool with lots of modules and active development. Unfortunately, the only version available for stock Raspberry Pi is old. I wanted to use some of the newer modules and features, so I needed to install at least version 2.2. This tutorial will walk you through installing Ansible 2.2.0 on a Raspberry Pi running Raspbian “jessie”. The version of Raspbian I did this on was tagged “2016-09-23”.

Creating a Debian package for Ansible requires a lot of prerequisites, including TeX Live, which can take up almost 2GB of space. If you don’t want to do this yourself, you can try downloading the Ansible package I built. It might be old by the time you read this, though!

Install Prerequisite Packages

Log into the terminal of your Raspberry Pi and run the following command to install the required packages.

sudo apt install asciidoc devscripts python-dev libffi-dev libssl-dev cdbs sshpass -y

Download and Prepare the Ansible Repo

Ansible is available for download from GitHub. Use the following commands to retrieve the Ansible source code and modules.

git clone git://github.com/ansible/ansible.git --recursive
cd ansible/

Use these commands as a guide to select and checkout a stable Ansible release. The list of tags should give you clues as to which tag is the latest and not a development version.

git tag -l
git checkout v2.2.0.0-1
make deb

Your new .deb package will be located in ./deb-build/unstable/. You can install it with the dpkg command like this.

sudo dpkg -i ./deb-build/unstable/ansible_2.2.0.0-100.git201611010320.cdec853.HEAD~unstable_all.deb

Using the Newest Ansible Features

My goal was to use Ansible on my Raspberry Pi to implement my poor-man’s dynamic DNS solution. However, you might also want to use your RPi as a centralized Ansible hub to control a cluster like the Raspberry Pi Dramble. Also consider checking out the ansible-simple-slurm-cluster repo on GitHub for more ideas.

Let me know how you’re using Ansible on your Raspberry Pi in the comments!

Using Amazon S3 as a Nette Service

Nette is a popular web application framework for PHP. It is mostly pretty well documented and easy to use. Recently, I needed to upload media from a Nette application to Amazon S3. This is how I created an S3 service for my Nette application. You will need to be familiar with Nette and have an existing Nette application to follow along.
Read more

A Poor-Man’s Dynamic DNS with Ansible and Amazon Route53

Traveling Route53

I wanted to be able to configure a DNS hostname dynamically, but couldn’t find an easy-to-use dynamic DNS client that suited my needs. Using Ansible and Amazon Route53, I put together a quick, effective solution.


First, you need an AWS account with a Route53 DNS zone. I followed these directions to create a subdomain.

Next, you need a remote host that accessible via SSH. On that host, install Python and the Boto library. Make sure that Boto is configured with sufficient AWS credentials to access and change your Route53 zone.

Ansible Configuration

This section was updated on 2016-11-29 to reflect improvements I’ve made in the Ansible playbook.

Ansible made this task simple. In fact, the playbook below is mostly based on example recipes from the Ansible Route53 module documentation. The YAML playbook should look like the example below. Replace YOUR-ROUTE53-ZONE with the zone you configured in Route53. Replace YOUR-FULL-DYNAMIC-HOSTNAME with the fully-qualified domain name that you’ll use for dynamic DNS.

Note that this uses the ipify_facts Ansible module. You can use the default value or pass api_url like I’m doing in this example.

- name: Update Dynamic IP
  hosts: localhost
    dyn_zone: YOUR-ROUTE53-ZONE
    - name: Get public IP
      ipify_facts: api_url=https://arnesonium.com/api/yourip.php
      connection: local
    - name: Get existing host information
      register: dynip
        command: get
        zone: "{{ dyn_zone }}"
        record: "{{ dyn_hostname }}"
        type: A
    - name: Delete existing host information
      when: ipify_public_ip != dynip.set.value
        command: delete
        zone: "{{ dyn_zone }}"
        record: "{{ dynip.set.record }}"
        ttl: "{{ dynip.set.ttl }}"
        type: "{{ dynip.set.type }}"
        value: "{{ dynip.set.value }}"
    - name: Create new host record
      when: ipify_public_ip != dynip.set.value
        command: create
        zone: "{{ dyn_zone }}"
        record: "{{ dyn_hostname }}"
        type: A
        ttl: 600
        value: "{{ ipify_public_ip }}"

Running Your Playbook

I named my playbook dyndns.yml, so I run it with this shell command:

ansible-playbook -vv dyndns.yml

The -vv increases the verbosity so you can see what’s going on.

The Next Step

Next, I need to convince this script to run every time my laptop’s network comes back online. I’m sure there’s a good way to do that, but I haven’t spent much time looking into it.

Did this playbook work for you? Let me know! I’d love to get feedback on it.