When Google and Apple announced in April that they would be working together on a contract tracing API, a lot of people got concerned about privacy. Today, I’m going to try to explain how these apps work so that people can make an informed decision about the technology. Personally, if an app using this technology becomes available for my area, I’ll install it.

Dispelling Misconceptions

First, Apple and Google aren’t making apps. Instead, they are working together to build core technology to make it easier for public health authorities to build apps for their local area. …


I have a relatively simple problem, my cat, Nick, can open our front door and let himself out. Since he’s a strictly indoor cat, this is a problem. In true computer nerd fashion, I way over-engineered a solution to lock the doors automatically after a specified delay to prevent Nick from escaping. My solution involves the Ruby Functions Framework, a container, Google Cloud Run, and Google Cloud Tasks.

While this post is about CatOps, the solution is much more generalizable. If you want to call a webhook after a delay for a chatbot, send an email, or remind folks that…


About a week ago my mac complained that it was running out of disk space. I deleted a bunch of old TV shows and GoPro videos and called it good. Today I went to do an external backup and saw that my drive was still full. Half an hour of investigation and I realized my 500 GB drive had 230 GB of local Time Machine backups. In fact, it was full enough that the Time Machine GUI wouldn’t start, I couldn’t run more backups, and several other basic utilities on my mac stopped working. It took about three hours of…


Google Cloud supports three dynamic languages, JavaScript, Python, and Ruby. One of my goals is to become competent enough to debug and make small patches to libraries in all three. I love Ruby, and I’ve written Javascript professionally, so coming up to speed on Python has been my latest “side” project. I worked through the Python Koans in February, and folks had warned me that list comprehensions are confusing. It turns out that while they are odd to my Ruby sensibilities they are not hard. Even better, some things that are hard in Ruby are one-liners in Python with list…


In April I’m giving a talk at RailsConf titled “Testing in Production.” Today I thought I would write about a straightforward type of testing in production: running your existing tests against production.

There’s a good chance you have some kinds of tests for your code. You probably have some unit tests and you may have higher level integration tests. Maybe your integration tests are written in something like cucumber or a record/replay test automation tool. Now, the hard question, do you run these tests against production? Most folks I talk to don’t. They think of testing as something that happens…


This is part of the Developer Relations series.

The tech industry has a problem that I refer to as the “the toaster problem,” which is of course, best illustrated by “the parable of the toaster”. Suppose you are in the break room and a new employee says “Hey, can you help me with the toaster?” You spend the next 10 minutes explaining how the various knobs and dials work. You say that this toaster uses photoelectric sensors to detect browning instead of a thermostat or a timer. …


Almost every non-trivial website will have storage needs. As a Google Developer Advocate, I’ve been using Google Cloud Storage and talking to customers about their issues and difficulties with GCS. Security has come up a couple of times in these discussions. While I can’t tell you how to make your buckets and objects 100% secure, I can give you some basic advice that is pretty universally applicable. The vast majority of this information came from a week of research into the security of GCS buckets in a typical use case that I did in early December.

Keep Your Credentials to Yourself

I know it seems…


Earlier this week, a conversation on the Seattle.rb Slack reminded me of one of my favorite hidden Gems in Ruby, the case statement. Most languages have syntax for multiway branching. Java calls it switch. Lisp uses cond. Ruby calls it case which relates back to the mathematical roots of this construct. Ruby’s implementation of this feature is particularly flexible, and many folks don’t realize all the things you can do with it.

Testing Values

Here’s a straightforward example of a case statement the way we typically think of them.

case my_var 
when 1
puts "one"
when 2
puts…

Audit logs are boring. At least we hope they’re boring. If your audit logs are exciting, you are likely having a bad day. But audit logging of some sort is often a good idea, and many of us forget to set it up and verify that we understand the data on a regular basis. This post walks through setting up and using the audit logging capabilities of GCP. Operations and site reliability are not my areas of expertise. Also, I am not a security professional or a compliance lawyer. …


Along with what feels like half of the internet, I’m participating in Advent of Code this December. The problems/puzzles in this exercise are the kind of small programming exercise that I enjoy. Incidentally, many of these problems, especially the early ones, look very similar to interview questions I’ve been given over the years.

This year there have been many problems that require writing an interpreter for a simple language. My favorite of these has been day 16 which had you execute some “dance moves” that modify an array. One of the dance moves is “spin” which involves rotating the array…

Aja Hammerly

Rubyist, Data Nerd, Lazy Dev, Stegosaurus. Cloud Developer Advocate @ Google. Disclaimer: My opinions are my own. *RAWR*

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store