Research + Portfolio

Where things I've worked on get documented.


A title image for a series of videos about 3D modeling and printing
Simple Printables

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 title image for the TwitGrid project page

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 detailed instructions.

screenshot of exiv2 output
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.

Shrinkr logo

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 or MagicYUV.


Picture of printed hydroponic support structure

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 Version 2019.11.1
Tea Filter Holder Version 2019.12.1
Tea Filter Holder Version 2020.02.1
Picture of printed tea filter holder
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.

Spice Shredder thumbnail
Spice Shredder

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 output
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.


Your Life In Weeks thumbnail
Your Life In Weeks

Life is short. Experience this fact vis(cer|u)ally.


USB Serial Adapter shootout thumbnail
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 WinChipHead, which took a couple of weeks to complete.

Animated preview of reverse geocoding
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

Arduino Shell thumbnail

A command-line interface for Arduino with simple commands to control the GPIOs, read / write EEPROM, and read the ADC pins.

Intel Edison hackathon thumbnail
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.

Here's a video of the mocked-up Brewbeard pump controller I built using the Intel Edison and the presentation PDF I gave at the hackathon.

It used a halogen bulb to heat a temperature sensor, which then triggered the movement of fluid between two bottles, simulating the boiling and transfer process from a mash tun.

Discoverous thumbnail

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.


Scotland Yard Solver

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.

Localization Spreadsheet JSONify

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 JSON format.


How Fair Are My Dice? 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.


Java Native Interface DLL Debugging 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. Privilege Deescalation 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.


Stop All Services 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. Simple AC Monitor 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 quick daemon.


serialping.c 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) "RAII in C" A short program to demonstrate resource allocation unwinding under exceptional conditions in C, one of the few instances where the goto construct makes sense. Kernel/User-Space Latency Measurer 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. Fixed-Point FIR Filter Considerations Just some notes and things to keep in mind, from the design of FIR filters for an Atmel AVR microcontroller. Make JavaScript Load Faster Switching on Apache's deflate compression is great, if you have access to httpd.conf. If not, here's another way you can get your JavaScript to load faster.


Discrete Fourier Transform
Fast Fourier Transform
Bit dumper.
access() call.


Radio Free America visualization
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.


sh3 development icon
Embedded Linux Dev

Project page for the embedded Linux work I was doing on the LogicPD SH7727 (Renesas SH3) development board.

caldera icon


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.

extrovert icon

Extrovert Caseless

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.

MySQL Installer Built Using Nullsoft Install System

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.]

Zero Length Directory Mirror JScript [.js file]

[usage] [original/replica]

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 compression instantaneous.

Warbiking Icon


While I was in Washington, DC, I had the opportunity to do a little Warbiking. The density of Wi-Fi in Washington is excellent.

PortMonitor/G: a graphical network port watcher.

PortMonitor/G: 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.


Toshiba Portege Battery Swap

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.

Infared (IR) Netting

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 Thumbnail

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 Thumbnail

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 Trip Thumbnail

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.

Spectrum Data Analysis

Radio Spectrum Measurements

Results from electromagnetic / radio spectrum measurements taken June 10, 2003 in cooperation with the New America Foundation and the Shared Spectrum Company.

"Dupont Circle Spectrum Utilization During Peak Hours"
[pdf] [mp4, 26MB]

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
[pdf] [NAF pdf]

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.


Wireless Telemetry + Car, Argus 682


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.

Presentation: High Intensity Focused Ultrasound

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
[html] [pdf] [powerpoint]

DMCA: Observations and Critical Questions Final Report

Here is a presentation I created for the Washington Internship for Students of Engineering (WISE) as part of my summer 2002 research project. I discuss a few of the problems currently faced under the current system of copyright.

Appended is a copy of the final report I wrote for the WISE program. (It was once mirrored at the WISE program website.)

Reply Comments to the FCC in the Matter of Additional Spectrum for Unlicensed Devices Below 900MHz and in the 3GHz Band
(ET Docket No. 02-380)
[jpg1] [jpg2] [jpg3] [jpg4]
[FCC pdf mirror]

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
[pdf] [html]

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
[pdf] [html] draft [ jpg1 | jpg2 | jpg3 | jpg4 | jpg5 ]

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.


Hellbender Archive thumbnail

Hellbender Archive

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 been compromised.

© 1999-2020 Max Vilimpoc