3D Printing, Programming

OpenSCAD is Awesome

I’ve been getting into 3D printing, and until recently, I was using SketchUp to create all of the models for my 3D prints. However, whenever I needed to do anything even mildly involved, like align the center of a sphere with the center of the top of a cylinder (or even create a sphere in the first place), I found the limitations of visual modeling frustrating. I thought to myself, “Why can’t I just write a program or use something like SVG to describe the model I want?”

Of course, a solution already existed: OpenSCAD. OpenSCAD is a free and open-source scripted modeling program for solid CAD objects — instead of drawing the shapes you want, you write a program that describes them. Switching to it from SketchUp has been like being able to stretch my legs after a long cramped airplane flight. Consider my latest print:


It’s a replacement tray for this card shuffler I bought for $0.25 at a garage sale a decade ago:

It only required 33 lines of code. The total time I spent starting from when I created the file in OpenSCAD to when I exported it as an STL file was twenty-two minutes, and that included pausing to feed my one-year-old daughter some mashed bananas. To design the same model in SketchUp would have taken at least an hour without the bananas. (Here’s the OpenSCAD file with some additional comments and newlines.)


So if you’re a programmer that would like to create 3D models but you find visual CAD limiting or frustrating, consider OpenSCAD.

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