-.                       .-                                    ____        _
                   _..-'(                       )'-.._                               | __ )  __ _| |_
               ./'. '!!\\.       (\_/)       .//!!' .'\.                             |  _ \ / _` | __|
            ./'.!'.'!!!!\\!..    ). .(    ..!//!!!!'.'!.'\.                          | |_) | (_| | |_
         ./'..!'.!! !!!!!\''''''  v v  ''''''/!!!!! !!.'!..'\.                       |____/ \__,_|\__|
       ./'.!!'.!!!! !!!!!!!!!!!!.     .!!!!!!!!!!!! !!!!.'!!.'\.
      /'!!!'.!!!!!! !!!!!!!!!!!!{     }!!!!!!!!!!!! !!!!!!.'!!!'\           ____                  _
     '.!!!'.!!!!!!! !!!!!!!!!!!!{     }!!!!!!!!!!!! !!!!!!!.'!!!.'         / ___|___  _   _ _ __ | |_ _ __ _   _
    '.!!! !!!!!!!!! !/'   ''\!!''     ''!!/''   '\! !!!!!!!!! !!!.'       | |   / _ \| | | | '_ \| __| '__| | | |
    !/' \./'     '\./         \!!\   /!!/         \./'     '\./ '\!       | |__| (_) | |_| | | | | |_| |  | |_| |
    V    V         V          }' '\ /' '{          V         V    V        \____\___/ \__,_|_| |_|\__|_|   \__, |
    '    '         '               V               '         '    '                                        |___/

contact info

Erica Ehrhardt



Becquerel ()

Becquerel is a gateway server that provides an OData 4.0 interface to BigQuery, Elasticsearch, and SQL databases. Want your CRM or customer support system to be able to read from your big data warehouse? Becquerel has the hookup. I developed and open-sourced it at Thumbtack, where it's currently used in production to provide Thumbtack's Salesforce instance with customer data from BigQuery and Elasticsearch.

genderize.io clients ()

I wrote the Python and Go clients for the genderize.io web service, which tries to guess the gender of a given first name and optional locale.

Go interface to NDBM ()

State of the art structured storage for 1986: a Go wrapper around the POSIX NDBM database interface. I wrote the first version of this library on a Mac on a cruise ship, where I needed a persistent key-value store, but had no Internet connection, just OS X system libraries, man pages, and Go documentation. It was a good way to learn cgo.

OpenID Connect extension for Flask ()

I wrote flask-oidc at KIXEYE in 2014 to support logins with OpenID Connect for our Monocle customer service app after Google deprecated OpenID 1.0.

It's now maintained by the industrious Patrick Uiterwijk, who got it working for the Ipsilon IdP as well as Google's IdP.

Fracture ()

Fracture is a fractal image encoder intended for high-quality image enlargement. It contains a GPGPU hardware-accelerated fractal image encoder (implemented as OpenGL shader programs suitable for the GeForce 7600), as well as a software reference encoder and decoder (implemented in Python).

sample output from the very first version of Fracture
sample output from the very first version of Fracture

Here's Lena after being reduced 2✕ and then enlarged 2✕. Note where the conventional upscaler's output is blurry, Fracture's output preserves lines and texture.

sample output from the current version of Fracture
original conventional upscaler Fracture software encoder Fracture GPU encoder
original conventional upscaler Fracture software encoder Fracture GPU encoder

I developed Fracture at Caltech as an undergraduate computer science project (CS 81) in graphics, mentored by my exemplary advisor, Prof. Al Barr. At the time, we thought it was the first GPU-accelerated fractal image encoder, but a more recent literature search turned up "Toward Real Time Fractal Image Compression Using Graphics Hardware" from 2005, which means that Dr. Ugo Erra beat me by 4 years. Hats off to you, Ugo.

GPT Surgeon ()

Perhaps my most popular software. GPT Surgeon is a command-line tool for repairing corruption of HFS+ partition labels on GPT-partitioned drives. Generally this manifests as the partition not mounting, accompanied by the Apple Disk Utility error invalid BS_jmpBoot in boot block: 000000.


Disk image manager for Mac OS X. Mounts necessary images when you launch an app, unmounts them when you quit.

screenshot of DMG DJ in action
screenshot of DMG DJ in action


Engineering Around ADHD (Lesbians Who Tech SF Summit, )

I spoke at LWT about ADHD and strategies for coping with it in the tech industry. ADHD is not a moral failing, and we can treat it as a tech problem.

Building Customer Support and Loyalty (GDC, )

I covered how and why KIXEYE built the Monocle customer support system as a web app, the challenges and rewards of building a uniform support API across multiple games, and how designing games with support scenarios in mind yields benefits across the whole product. Pretty exciting to get to show off my whole team’s work.


PHP ()

I found a subtle bug in the PHP JSON extension's parser while at Thumbtack, filed PHP bug report #68938 with a fix, got the fix merged into PHP 5.5 and 5.6, and then saw it promptly reverted because someone was concerned it'd break PHP code that relied on the incorrect behavior. Shortly afterward, for PHP 7, the entire JSON extension was replaced anyway, including a JSON-compliant parser, and my patch survives only as a regression test. I like to think there was an important PHP lesson in all this.

mod_auth_openid ()

Before Monocle used flask-oidc, we used Apache with the mod_auth_openid module to handle SSO through Google's OpenID 1.x. KIXEYE needed it to work with OpenID Attribute Exchange so we could get email addresses from our users, so I contributed support for AX queries, single IdP mode, and secure cookie options (see previous commits as well).

Later on, KIXEYE also needed support for storing sessions in an external DB so that multiple web servers behind a load balancer could share sessions. I rewrote mod_auth_openid's session storage to use mod_dbd and the Apache DBD SQL abstraction layer so that we could use MySQL instead of SQLite.

Python keepass package ()

KIXEYE's Monocle app needed to store credentials for quite a few internal game DBs and APIs, so we kept them in a KeePass 1.x .kdb file in the Monocle repo, encrypted with a master password that was provisioned separately and never kept in the repo. We used the Python keepass package to read the password databases, and eventually needed to write them as well, so I contributed code for writing .kdb files.

KeePass files are encrypted and binary and this makes them a bear to diff, so we eventually replaced them with a YAML-based format called Line Oriented Password Storage (LOPS for short) where only the actual secrets were encrypted, but the metadata such as game names and environments were in the clear. While LOPS was never open-sourced, I was amused to see that Mozilla SOPS not only independently arrived at the same functionality, but also ¾ of the same name.

GPSBabel ()

I reverse-engineered the .vtt file format used by Vito SmartMap for Symbian Series 60 phones, from hex dumps of a few walks around the neighborhood. This took three days and no small amount of head-scratching. Once I'd figured it out, I contributed the vitovtt format to the very useful GPSBabel so that I could visualize my routes in Google Earth.