Research + Portfolio
Where things I've worked on get documented.
A collection of objects that I've 3D modeled and printed, with links
to explanatory videos and photographs of the objects installed in
the real world.
A single page, broadsheet view of the Twitter users you want to
read, written in pure ES6 using the public API. Wider columns than
TweetDeck on large monitors. No algorithmic surfacing. Infinite
scrolling only when you want to.
Page Up / Down will scroll an entire page's worth of feeds,
aligning to the size of the viewport.
Mouse Wheel Up / Down will scroll a user's feed.
To modify TwitGrid for yourself, simply save TwitGrid/index.html (it's all in a
single file) and edit the list of user handles you want to see. The
GitHub repo has more
Strip Your Metadata
By default, most smartphones today will geotag all the photos
they take, wherever you are. Even if you are at home. Which is
kind of creepy.
Here's a short Bash script using the exiv2
tool that strips the most sensitive GPS data, while leaving the rest
of the useful EXIF information in place. It also lets me add creator
+ copyright + website link information easily and recursively to all
files under a folder.
A smart Python script that uses ffmpeg to convert all videos of a
selected resolution and codec type into a set of output videos according to
one or more transcoding profiles.
If the file has already been transcoded, it will not be done again,
which is useful for large batches of video. You can run this script
on a staging folder over and over again and it will pick up and transcode
the new videos each time.
I wrote this script to help me transcode a bunch of
4K HEVC video files into faster, smaller proxy editing files using
something like UT Video
During the fall of 2019, I spent some time seeing which grocery
store plants I could get to grow at home. You know what I mean, the
potato that had sprouted too many eyes, a ginger plant that seemed
to be pushing its way out, green onions, and lemongrass stalks.
These plants had survived through sheer tenacity, so I figured I'd
give them a longer lease on life.
This is writeup of the process of modeling and printing a support
structure for a bundle of green onions in a standard food-safe
plastic bucket. Though it didn't work out as I'd hoped, it was still
a fun experiment.
Tea Filter Holder
When you have a hammer, everything looks like a nail:
When you have a 3D printer, everything looks like it should be 3D printed.
In this case, I modeled a holder to reuse the stainless filter basket
from an IKEA teapot to use it with a regular mug. The first two versions
weren't great, so I made a third. Clearly I have too much time on my hands.
Take 1 part electric screwdriver + 1 part cheap IKEA spice grinder + 1 part 3D printer
and create an electric spice shredder that can quickly pulverize a load of spices for
that next curry you want to make.
Anyone with a 3D printer can print up the pieces needed to build this, the only extra
piece needed is a 50mm adjustable pipe clamp.
mbed Memory Status
Sets up a high-water usage canary for the Interrupt Service Routine, main thread, and other thread stacks;
as well as for the heap memory. Goes pretty deep into the undocumented operating-system interfaces.
I wrote this to debug memory issues I encountered, before newer versions of
mbed OS made this type of functionality part of the mainline.
USB Serial Adapter Shootout
Not all USB Serial Adapters are equal.
After running into errors when programming an embedded microcontroller,
it took me a bunch of time to determine that the issue was in the serial adapter chip hardware.
This was a comparison of the most widespread chips from FTDI,
Prolific, Silicon Labs, and
which took a couple of weeks to complete.
Google Sheets Geocoding Script
A bit of App Script for Google Docs that lets you forward geocode (address -> lat, long)
and reverse geocode (lat, long -> address). Took a bit of experimentation to get working,
but learned how to programmatically modify a Google Sheet. Loads of fun.
Click here to try a live copy of the script in a Test Spreadsheet.
You must be
logged into Google for the script to work due to the way the Geocoding Maps API quotas work.
It won't work for non-logged in or Incognito Mode users.
2014 - 2015
A command-line interface for Arduino with simple commands to control the GPIOs,
read / write EEPROM, and read the ADC pins.
Hackathon: Intel Edison
This was one of the hackathons I took part in in 2015, in which I
built a fun little temperature-based pump controller using the
now-obsolete Intel Edison.
A map of places to eat in Berlin.
I'd been working on this for a while,
and haven't updated it in a while.
Google Maps has a lot more sophisticated tagging and editing of personal maps now,
but when I first created this map, they didn't.
It's a solver for the board game Scotland Yard, which shows you the possible
locations that can be occupied by the shadowy Mr. X, given a last known position
and the moves played.
Google Docs Spreadsheets are a relatively easy way to set up a translation table for
localizing a website.
The only problem: the ATOM, CSV, and RSS publishing functions don't escape strings
properly, leading them to be essentially useless for data interchange. So I spent
a little time putting together a Google App Script that can output a usable translation table in
Have you ever noticed how when you play board games, the numbers that come up on the dice
are oftentimes pretty skewed away from the normal distribution? This is a small program
to graph out the rolls of the dice compared to what should happen if you rolled them
an infinite number of times.
Sometimes your JNI DLLs have bad code in them, it's a fact. Here is how you can connect to a
live instance of your Java application and debug the native code using Microsoft's Visual
Studio Express 2008 package and NetBeans. While this example focuses on locating crash code,
setting breakpoints and stepping is also possible using the same technique.
Usually I set my Windows system up to have two users: one Administrator and one Limited User Account.
Running as an LUA is a good thing, it means viruses and spyware have a harder time getting a foothold
in your system. For those few times you need to run as an Administrator to grab drivers off the 'net
or whatever, it's also good to make sure your browsers run as Limited Users too.
A quick JScript file that will stop as many services on Windows as it can.
Handy for when you want to defragment your hard drive.
This is a small daemon I wrote while building up a server on an old laptop
of mine. Since I usually switch off the AC power to the laptop before going
to work, I needed an automatic way to turn it off without having to log in.
Rather than cron job it or shell script it, I just hacked together this
A small program I put together to demonstrate the use of getopt_long(), the termios
interface, and signal(). It's written in response to a real-world need and serves as
a template for similar programs. (e.g. any program that takes parameters)
A short program to demonstrate resource allocation unwinding under exceptional conditions
in C, one of the few instances where the goto construct makes sense.
A set of two programs that measure latency under Linux between packet reception at the
kernel level network stack and the delivery of a packet to the user space network client.
Uses the SO_TIMESTAMP option from setsockopt() to force the kernel to timestamp an
incoming packet's arrival time.
Just some notes and things to keep in mind, from the design of FIR filters for an
Atmel AVR microcontroller.
Switching on Apache's deflate compression is great, if you have access to httpd.conf.
Discrete Fourier Transform
Fast Fourier Transform
Radio Free America
A map of spectrum utilization from 54-806MHz.
Something I threw together to see how well our precious television spectrum is being used.
Embedded Linux Dev
Project page for the embedded Linux work I was doing on the LogicPD SH7727 (Renesas SH3) development board.
Calder-A is a bigger brother to Hellbender. Another "caseless" computer, this one in the style of Alexander
Calder's mobiles, in other words, mobile
computing. Reengineered into Extrovert, below.
After deciding that Calder-A was just too unwieldy for normal use, and ultimately a bit ridiculous,
I reworked the raw materials into a more compact and usable system. I call it Extrovert, because its
guts are all on the outside.
I created a new Win32 / Windows installer for the MySQL database software using
Nullsoft's Install System. Copies of the server and the scripts used to generate
the install files are posted here. Have a nice install!
[mv 12:40 PM 3/27/2009: This stuff is ancient, and I've removed the binaries, but left the notes on
what I did for my own sake.]
This script takes an input directory and recursively replicates it with zero-length
directory and file entries to a specified output directory.
What this was used for:
Rather than running the compress/decompress cycle on real data while building-testing
an installer, it is much easier if all the input files are simply zeroed out, making
While I was in Washington, DC, I had the opportunity to do a little Warbiking.
The density of Wi-Fi in Washington is excellent.
: A graphical network port watcher.
This is a program I wrote to familiarize myself with the winpcap packet capture
library, thread programming concepts, and the SDL multimedia library.
I bought a new used laptop recently (12.19.2002) and the battery that came with it was Dead On Arrival (DOA).
Luckily, I had an extra battery pack sitting around from my old laptop, and I correctly predicted that the
actual lithium cells would be identical. So I ended up just swapping the dead cells for live ones.
Here is the surgery in pictures.
Just a couple of screenshots from an infared file transfer between my two laptops, in case anyone wants to
know just what they look like. Nothing really special.
Euphemistic Safeway Map
Washington, DC has numerous Safeway grocery stores that residents have lovingly nicknamed
such things as: Social Safeway, Soviet Safeway, Sixties Safeway, and so on. Just for kicks, I decided to
plot them out on a map.
FCC ITFS Antenna Map
Lately, I've been working on the visualization of geographic coordinate data from FCC license databases.
Unfortunately, professional GIS packages cost on the order of $1,000+ and I don't have that kind of money.
So I wrote my own package.
The heavy lifting is done using PHP and the GD graphics library extension, with data sourced from a
MySQL database stored on my laptop.
Way Out West GPS Data
When I originally wrote the GIS analysis package, I ended up with a fairly flexible framework which I tweaked
to process more diverse datasets, such as the GPS data I gathered on my trip out West last summer.
A Collaborative Effort of The New America Foundation and The Shared Spectrum Company, this is a short memo describing measurements
of the electromagnetic spectrum between 30MHz and 3GHz. What we found out was that ~62% of the radio spectrum is unutilized during
peak hours in the urban area around NAF's headquarters. [2003-07-16]
Also included is a snippet of video from the presentation we made at the New America Foundation on June 20, 2003.
"Issue Brief #12: Unlicensed Sharing of Broadcast Spectrum"
by Max Vilimpoc and J. H. Snider
A short (4pg) Issue Brief I put together with J. H. Snider, a Senior Research Fellow
with the Spectrum Policy Program at the New America Foundation. In it,
we discuss the potential for a transition of the broadcast television
spectrum towards greater unlicensed use. [2003-07-16]
"Why Washington Matters in the Silicon Valley"
My first published article, appearing in the August/September 2003 issue of IEEE Potentials magazine.
In it, I discuss the importance of public policy and why engineers need to participate in the
political decisionmaking process.
Created as part of our senior capstone curriculum at Ohio State,
the Argus Project represented the packaging of many distinct
skills into a compact, computer-operated, remote-controlled truck.
Ultimately, our team fit two wireless transmitters, two
microcontrollers, and a host of sensors into every available
space on the truck.
Available sensor data included: acceleration, GPS coordinates,
velocity, and motor/battery temperature.
Additionally, our system had ability to control lights on the
truck including: headlights, brake lights, reversing lights,
turn signals, and fog lights.
Created by Craig Bennetts, Shefali Patel, and I for a course in medical
imaging. This presentation details the process by which High Intensity
Focused Ultrasound energy can be used to treat prostate cancer and other
tissue by inducing ablation and localised necrosis of cancer tissue.
The Digital Millennium Copyright Act: Questions and Critical Observations Slideshow
DMCA: Observations and Critical Questions Final Report
There were numerous comments in this docket that supported or dissented the use of GPS + database-backed interference mitigation
for unlicensed devices (a user-side solution). A better idea would be to shift some responsibility for interference mitigation onto
licensed television broadcasters (a server-side solution).
Two methods should be considered: (1) adding a geolocation signal to NTSC analog television broadcasts, by tucking data into the
Vertical Blanking Interval (VBI), and (2) adding a geolocation signal to an ATSC digital television broadcast, by tucking location
data into the Field Synchronization Segment.
Adding a geolocation signal that uniquely identifies television towers is a good idea that mandates an appropriate level of spectrum
management and stewardship on licensed broadcasters, as already is expected of end users. The proposal also offers a great
public service, making for a geolocation system similar to GPS, with potentially more robust results for urban users.
Privatization, Government, and Economics
The essay "Privatization, Government, and Econonmics"
which I wrote for the John Glenn Institute
Essay Competition in 2001 at OSU, which took the first place prize.
The Net Effect on Popular Participation in Government
Here's my essay "The Net Effect on Popular Participation in Government" which I wrote
for the John Glenn Institute Essay Competition for 2000 at OSU.
This paper took second place.
Newly added to the collection are 5 JPEGs representing the draft work that I did while writing the essay.
It's pretty esoteric, but might give some insight into my thought processes.
The Hellbender Archive is a small "caseless" computer I built using 12" threaded steel rebar and custom
cut wood supports. It's getting up there in age, but it runs Linux + Apache + PHP and SSH pretty handily
and it also handles the video capture for my webcam. While I was travelling in Mexico, I remitted
close to a gigabyte worth of photographs to it over the course of three months. Its security has never