3D Printing, Life, Woodworking

Printing Construction Equipment for Fun

For Father’s Day, my wife and kids got me this “Construction-grade Backhoe Loader” kit from WOOD Magazine. The kit contains hardware and wheels; you build the rest of the backhoe yourself:


I planned on doing this project with my sons (ages 5 and 3) until I realized that the fine detail woodworking involved would bore them and I’d end up all alone in the garage. I decided to do something experimental and 3D-print the backhoe instead.

I’ve had a 3D printer for about six months, but I’ve only attempted small projects with it: printing new hardware for a dresser, fixing a pair of sunglasses, creating small hooks to hang towels on our oven’s handle… Reproducing this toy in plastic on my desktop would give me a chance to explore my printer’s capabilities and expand my 3D modeling skills.


Replicating the components in SketchUp turned out to be the easiest part of the process; most of the eighteen distinct pieces took less than 15 minutes each.

Pivot Bracket in SketchUp

With the permission of the fine people at WOOD Magazine, I’ve made the SketchUp and STL files of all of the parts I printed available on GitHub. The original plans for the Construction-grade Backhoe Loader are copyright 2014 Meredith Corporation. If you decide to try and print this project, consider buying the plans and/or the project kit.


3D printing is not a speedy process. This picture was taken about four hours into an eight hour print:


In addition to being slow, 3D printing is not foolproof either. One problem that I encountered on the taller pieces was layer separation:


I’ve determined that this was probably due to the ambient air temperature being too cold, causing the lower layers of plastic to shrink and split from the upper layers. After filling the cracks with an acetone/ABS plastic slurry and sanding, it looked ok:


(Don’t get me wrong — I’m a huge fan of 3D printing and knew about its drawbacks before I ordered my printer. I think that in 20 years, these printers will be as common in households as regular printers are today… possibly moreso. Who will need to print paper documents in 20 years?)

My printer’s print bed is only six inches in diameter, so some of the longer pieces required creative positioning in order to print seamlessly.

I split some of the larger pieces into multiple parts in order to save hours of printing time and some non-zero amount of plastic. For example: instead of printing the entire chassis as one piece, which would require a lot of infill material, I cut it in two and printed one tall hollow piece plus a solid cap that I glue on afterwards:

The total print time for all of the pieces I printed was 80 hours, 57 minutes.

Here’s the lineup of all the pieces immediately before I began assembly. On the left, the hardware and wheels from the kit; on the right, the thirty-seven separate pieces I printed.

Assembly (pre-paint)

With better planning, I would have printed all of these objects with their brackets already in place. Since I didn’t, I had to weld them in place using the aforementioned acetone/ABS slurry.



Painting was done with glossy black and sun-yellow spray paint made for plastic in a cardboard box in my garage. Très professional.


Assembly (post-paint)

At this point, all that was left was to connect the nuts and bolts.







Lessons Learned

It was fun printing an exact duplicate of the wooden model, but if I did it again, I’d go for a more realistic look that doesn’t use as much material. Woodworking plans don’t translate directly to plastic particularly well, since their dimensions are based on commonly available lumber sizes, so most of the pieces were oversized for their purpose.

I’d also skip the painting step entirely by printing in the correct color of filament. I used white because it’s what I already had, but for my next serious project, I’ll order the colors I need.

Due to the post-print crack-filling (and filing and sanding) I had to do, the surfaces of some of the pieces look pretty gnarly even after painting:


It’s apparent in direct light but not obvious at a glance. If I did it again, I’d remake the cracked pieces and get them to print properly rather than trying to fix them in post-production, or I’d attempt an acetone vapor bath to smooth out all the surfaces.

Now that I’m more familiar with my printer, I’ll modify the print settings more aggressively. I printed with 0.2mm-thick layers since it was the default setting, but I’ve since done some testing and found that 0.1mm-thick layers create pieces with almost perfectly smooth surfaces, not the obvious stratification you can see in the pictures. It would take longer, but it would be worth it.

Even though there are plenty of problems that I can see, my kids don’t mind, and I’m sure they’ll enjoy playing with it. It’s not the beautiful wooden family heirloom it could have been, but maybe when they’re older, they’ll say “Can you believe Dad made this on an ancient 3D printer? It had to print using plastic wire instead of pulling carbon directly out of the air!”


3D Printing

I saved a pair of sunglasses with a 3D printer

My sister-in-law’s sunglasses lost an accent from one of the earpieces, leaving the left temple loose. Could I fix this?, she asked. Twenty minutes and 63 millimeters of plastic filament later, my purchase of an Orion Delta 3D printer was 100% validated.


The accent on the print bed.


The accent installed.


With the temple opened.


And the other side, with the original accent, for comparison. I later painted the printed accent gold with some nail polish, and you could hardly tell the difference between the two.

If you happen to have this same pair of sunglasses, and your pair has also lost one or more of its accents, you can download the 3D models and print a replacement yourself.

PHP, Programming

Quick and Dirty Command Line PHP

I do 99% of my programming in PHP, and when I’m on the command line, I would rather use the PHP functions I know than look up the Bash functions I don’t, so I wrote this PHP script and saved it in my $PATH as an executable file named p.

#!/usr/bin/env php

		array_slice( $argv, 2 )

This way, if I want to quickly get the length of a string, I can type:

$ p strlen paraskavedekatriaphobia

and get


instead of looking up that I could have done:

$ foo=paraskavedekatriaphobia && echo ${#foo}

(or apparently a dozen other methods of finding the length of a string in Bash).

It even works with Bash variables:

$ foo=acbdef
$ p strlen $foo

Thanks to all the time this script has saved me, I was able to write this post!

Life, Minnesota, Woodworking

My Minneapolis Table Has Found a Forever Home

Backstory: Last year, I built a table that resembles the downtown skyline of Minneapolis.

Minneapolis Table

I didn’t intend to keep it after I finished building it, so I contacted a few local organizations to see if they’d be interested in accepting it as a donation. I’m happy to announce that the Minneapolis table has found a home at the Minneapolis Institute of Arts, a fine-arts museum in Minneapolis.

Minneapolis Institute of Arts

Here I am making the furniture delivery on a Monday in June:

Donating the Minneapolis Table

The museum employees that I spoke to when I dropped it off said they planned to use it in their retail store to display work by local artists, and when I visited the museum yesterday for the first time since then, I found it after just a few minutes of browsing the gift shop:

Minneapolis Table in the Minneapolis Institute of Arts Retail Store

I imagine this is how parents feel when their child moves out and gets a job, no longer needing their support. I’ll never forget you, Minneapolis table; don’t forget to call me on Christmas and my birthday.

Life, Programming

Data Mining My Family Tree

One of my hobbies is researching my family tree; I enjoy learning about where I’ve come from as well as reading about how my relatives lived in centuries past. I was recently fortunate enough to come into possession of a 200-page family history written in the late 1970s, and after I finished reading and digitizing it, I wanted to see what data and trends I could extract from my now 2,500-person-strong family tree, so I started writing a collection of PHP scripts aimed at reading and manipulating GEDCOM files. (GEDCOM is the defacto standard for digital family tree files, and it is used by essentially all family tree software.) The scripts are open source and available via Github in my PHP GEDCOM Tools repository.

I downloaded my family tree from Ancestry.com in GEDCOM format and got started. First things first: I generated a second GEDCOM file containing only the people that are related to me by blood. This isn’t strictly necessary, but I prefer to limit the results to my genetic relatives.

./export-related.php --gedcom=Everyone.ged --person='Christopher Finke' --out=Related.ged

After I had a tree with all in-laws removed, I started with something simple: gender breakdown.

./gender-counts.php --gedcom=Related.ged

Gender breakdown chart

53/47% male/female split. Not that interesting, and possibly skewed by incomplete data. How about something more personal, like name choices?

./name-histogram.php --gedcom=Related.ged --histogram=cloud-raw

Given Name Word Cloud

(The image was generated by pasting the command output into the tool at http://timc.idv.tw/wordcloud/)

That’s kind of neat. Women are outnumbered, but they teamed up to make “Mary” the most common given name. “John” and “William” were close behind. “Melvin” brought up the rear.

Does my family line favor any of the months for giving birth?

./date-histogram.php --gedcom=Related.ged --type=BIRT --specificity=month --histogram=counts

(This and other charts were generated by pasting the command output into a Google Docs spreadsheet and using that data to create the image).

Births by month

September and July have little (baby) bumps, but births are pretty uniform across the board. The same chart for deaths is a little more interesting though.

./date-histogram.php --gedcom=Related.ged --type=DEAT --specificity=month --histogram=counts

Deaths by month

A little more variation — deaths seem to be less common in the summer months, but no month really takes more than its fair share of lives. September has the best net gain for life, since it produced lots of babies and the fewest deaths. You go, September!

How about marriage? Is June really the most popular month for weddings, as is often assumed?

./date-histogram.php --gedcom=Related.ged --type=MARR --specificity=month --histogram=counts

Marriages by month

Well, yeah.

How old are those lovebirds when they tie the knot?

./age-histogram.php --gedcom=Related.ged --type=MARR --histogram=counts

Marriages by age

Across my entire recorded family history, the most common time to get married has been between the ages of 20 and 25; the median marriage age is 23.

How many children do those married couples end up having?

./child-count-histogram.php --gedcom=Related.ged --histogram=counts

Number of children per family

There’s a steep dropoff after the fourth child, and I’m not surprised. As Jim Gaffigan said, “If you want to know what it’s like to have a fourth, just imagine you’re drowning, and then someone hands you a baby.”

Death comes to all, but when??

./death-age-stats-over-time.php --gedcom=Related.ged --timeframe=decade

Death age over time

You can see that over the last 50 years, my family’s median and average age at death has been slowly rising. That’s good news for me, right? (Early numbers are pretty jumpy due to a lower sample size and frequent stillbirths.)

How did these people die? Does any cause of death stand out?

./death-note-histogram.php --gedcom=Related.ged --histogram=cloud-raw

Most causes of deaths weren’t known or mentioned, but for those that were, cancer was at the top of the list.

Cause of death word cloud

Where were my ancestors born? Can I see my family spread across the country as sons and daughters move away and start their own families?

./place-progression.php --gedcom=Related.ged --type=BIRT --out=birth-places.gif --key=[Google API key] --icon=[URL of icon mask] --start_year=1860

Birth places

I can! You can literally see my family spread like an outbreak of measles. (Note that this GIF begins in the year 1860 when my ancestors first began arriving from Europe.)

If you want to investigate your own family tree, grab a copy of the scripts and see for yourself. If you have ideas for any other interesting stats that could be gleaned from family trees, leave them in the comments and I’ll add some more scripts to the repository.

HTML, JavaScript, Photography, PHP, Programming

Turn your iPhoto library into a Web photo album

iPhoto is good for managing and organizing photos and photo metadata, but it’s not easy to get that information back out if you want to share more than a few photos. I recently finished scanning 13,000 family photos and importing them into iPhoto, and I wanted to be able to share all of those photos (complete with the faces I spent hours tagging) with my brothers and sisters.

I could just burn copies of the iPhoto library to discs, but not all of my siblings have Macs, and iPhoto may not be around for very long. I needed a way to export all of the photos and metadata in a format that I felt comfortable would be supported for a long time: the Web.

The result was a PHP script that exports an iPhoto library into folders of image files (one folder per event), generates JSON arrays of event and photo metadata, and builds a minimalist JavaScript-powered website that provides a simple photo viewing experience. The website can be put online, or it can be run entirely offline (like from a DVD, which is my plan for sharing with my family members). The code is all open source (https://github.com/cfinke/iPhoto-Disc-Export) and the usage instructions are in the README.

Here’s a screenshot of the main page of the website it generates:


And here’s an example of a single photo’s page:

I know it’s a pretty niche project, but hopefully it will come in handy for anyone looking to make their iPhoto library more shareable and accessible, especially as Apple drops support for iPhoto in the near future.

iPhoto Disc Export

Facebook, Themes, Twitter, WordPress

Keyring River: A new WordPress theme to complement Keyring Social Importers

It’s no secret that I use Keyring and Keyring Social Importers to import my activity on third-party services into a WordPress blog. All of my Facebook posts and photos, Twitter updates, foursquare checkins, and Reddit comments and submissions are archived in a single location; this makes it simple to see a snapshot of my online life at any point in time. I’ve even imported my IM chat transcripts from over a decade ago.

I’ve long been searching for the perfect WordPress theme to showcase all of this data. Typical blog themes didn’t work because each “post” needed different styling based on the service it came from, so it was unlikely that I was going to find what I needed already built for me.

But then, I came across an effort by David Hariri to build a non-WordPress lifestreaming product called River. While I’m already committed to using WordPress, his frontend design was exactly what I had been looking for. Luckily, David’s project is open source and MIT-licensed, so I was able to use his design and adapt it to a WordPress theme. With that, I present Keyring River:


Keyring River is a new WordPress theme coded specifically to complement Keyring Social Importers. It’s feature-poor and purposefully so; there are no sidebars, no footers, no menus, no comments — just a search box and a list of activity. For maximum enjoyment, install Jetpack and activate the Infinite Scroll module so that you can scroll infinitely into your online history. See it in action on my example lifestream blog, where I’ve imported my Twitter and Reddit history.

The timestamp on each entry links to the single-item view in WordPress, and the logo links to the item on the service it was originally posted on. Amuse yourself by scrolling back a couple of years, finding an interesting Facebook post, and reviving discussion on it!

Keyring River currently supports posts imported by the following plugins:

…and of course, regular WordPress posts.

Download Keyring River from Github, and let me know if you put it into practice. Taking ownership of your data is important, and more importantly, it’s fun!