3D Printing, Christmas, Maker, Programming

Today’s Functional Print: Christmas Light Clips

In today’s “’tis the season to be printing” news, I’ve printed replacement Christmas light clips.

single-clip

They took about half an hour to model in OpenSCAD, and each one can print in only three minutes. Their exact design appears to be unique to the decoration that they came from, but these very similar clips sell for $2.99 for a pack of 100, so each clip has a retail value of about three cents.

The clips are being used to attach lights to these festive holiday deer:

deer

Here’s a closeup:

deer-clip-closeup

Let’s play “Find the original clip!” It’s in there somewhere.

batch-of-clips

The OpenSCAD script and STL file are available on GitHub.

Standard
3D Printing, Maker, Programming

Today’s Functional Print: Cootie Eyes

In today’s “is he posting about Cootie again?” news, I’ve printed replacement eyes for our Cootie game. The eyes are tiny and get lost really easily, so they are a natural candidate for replenishment.

cootie-o-clock

These eyes are so small that I had to dial the print speed down to 3 millimeters per second (from 30 mm/s) so that plastic would have time to cool before the next layer was added and so the motion of the printer didn’t tip over the eye as it printed the top of the peg.

cootie-eyes-in-place

That’s a face that only a mother cootie could love.

The OpenSCAD script and STL file are available on GitHub.

Standard
3D Printing, Maker, Programming

Today’s Functional Print: Cootie Legs

In today’s “does that really count as functional” news, I’ve printed replacement legs for our Cootie game. You can’t buy replacement parts for Cootie, so the retail value of these legs is literally priceless.

bulk-cootie-legs

cootie

cootie-legs-closeup

These legs are low-polygon because I’m not yet experienced enough in OpenSCAD to replicate organic shapes. I generated these legs by intersecting the extruded x, y, and z profiles of an original leg, seen here:

original-cootie-leg

The OpenSCAD script and STL file are available on GitHub.

Standard
3D Printing, Maker, Programming

Today’s Functional Print: Train Valve Gear

In today’s “how did I ever live without a 3D printer” news, I’ve saved a decades-old toy train from the trash heap by printing a new valve gear for its left side of its wheels. The train is a 1986 model New Bright toy train, and it was destined to encircle our Christmas tree, but a missing piece was causing the front left wheel to get lifted off the track by a dragging piston rod. It took about half an hour to design a replacement in OpenSCAD and an hour to print. Its value is immeasurable.

Here’s the component by itself.

wheel-bracket

And here it is in place:

train-engine

You might not be able to pinpoint it, since it fits so perfectly that it’s undetectable as an aftermarket add-on. Here’s a closeup:

wheel-bracket-in-place

The OpenSCAD script and STL file are available on GitHub.

Standard
3D Printing, Maker

Today’s Functional Print: Oven Handle Hooks

In today’s “how did I live without this” news, I printed s-hooks sized exactly to my oven handle. I modeled them in OpenSCAD in about 30 minutes, they each printed in twenty-six minutes, and the pair has an approximate retail value of $2.85. Cha-ching!

IMG_9714

IMG_9715

The SketchUp model and SCAD file are (of course) available on GitHub.

Standard
3D Printing, Maker, Programming, Woodworking

Today’s Functional Print: Shop-Vac Adapter

In today’s “printing meets programming meets woodworking” news, I’ve printed an adapter that allows me to hook up my Shop-Vac hose (1 1/4″ diameter) to my planer’s dust port (4″ diameter). The adapter was designed in OpenSCAD using a module I wrote that can create adapters between two hoses of any size.

adapter-on-bed

This print was also my first time using a cold acetone vapor bath to smooth out an ABS print. A vapor bath melts the edges and ridges in the print, smoothing out the whole thing. Here’s how the adapter looked after three hours soaking in vapor:

too-much-vapor

Whoops! Three hours was too long… although it is very smooth and shiny. I printed another adapter, but this time, I cut the layer height in half, to 0.1mm. This resulted in a much smoother surface that didn’t need acetone smoothing, but it took twice as long to print.

smooth-funnel

The largest available Shop-Vac adapter on Amazon is 2 1/2″ across and retails for $8.37, so this 4″ adapter can be reasonably appraised at $10. Money in my pocket, and it sure beats the duct tape I was previously using to connect the two machines.

The OpenSCAD script and STL file are available on GitHub.

Standard
3D Printing, Maker

Today’s Functional Print: Drawer Hardware

In today’s “we’re living in the future” news, I bought a dresser for only ten dollars because none of the drawers slid smoothly, and I printed replacement drawer slides, returning the dresser to a fully functional state. (The original slides that came with the dresser were all broken for unknown reasons.)

The hardware I printed is a suitable replacement for the Rite Track brand Kenlin socket and case runner. Each set’s retail value is approximately $4.90, and because I needed eight of them, I saved $39.20.

This is the socket that attaches to the drawer:

component-socket

It was printed in two pieces and glued together to avoid needing to print excessive amounts of support material.

component-socket-pieces

Here it is in place:

component-socket-in-place

And here’s the corresponding runner that it fits into on the under-drawer metal bar:

case-runner

The SketchUp models and STL files are available on GitHub.

Standard
Life, Music

Dies Irae: A Composition for Wind Ensemble

In 1998, when I was 14, I wrote a song for wind ensemble: ten brass/woodwind parts and three for percussion. I just recently found the original sheet music (which I think I made using Finale 97), and I transcribed the entire thing again so that I could share it here.

It’s called Dies Irae (“Day of Wrath”), and it’s meant to evoke a fateful day in the life of an unnamed protagonist, using unorthodox playing styles ala Daniel Bukvich’s Dinosaurs. I was inspired to write it after my dad (a professional musician and composer) remarked in the car that the rhythm of the windshield wipers would be an interesting basis for a song.

The full list of the events I was trying to portray is listed below, but listen to it first and see if anything comes to mind.

(If you can’t see the player above, you can access the MP3 directly.)

Here’s what I was hoping you heard:

  • 0:00: Morning. The protagonist sleeps.
  • 0:20: The protagonist’s alarm clock beeps.
  • 0:23: The alarm clock is hit, and the protagonist falls out of bed.
  • 0:27: The protagonist stands and stretches.
  • 0:34: The protagonist begins the day, following the usual routine.
  • 0:48: The protagonist’s car won’t start, but then it does.
  • 0:56: The protagonist begins driving.
  • 1:01: The turn signal is activated.
  • 1:08: It begins raining. Windshield wipers are running.
  • 1:25: The protagonist nears a railroad crossing and hears the bell and the train whistle, but tries to make it across the tracks anyway.
  • 1:51: The train puts on its (squealing) breaks.
  • 2:03: Car/train crash.
  • 2:07: Ambulances on the way. Horns honking, alarms ringing.
  • 2:23: A heart monitor is hooked up to the protagonist.
  • 2:30: Paramedics working on our protagonist, but the heartbeat becomes irregular.
  • 2:45: Cardiac resuscitation attempts. The heart monitor flatlines.
  • 3:09: Dirge.
  • 3:22: The heart monitor suddenly begins beeping again, erratically and then regularly.
  • 3:34: Oh happy day, the protagonist is not dead.

I consciously decided not to try and improve the song as I was reproducing it; if I rewrote it now, I’d give each section way more room to breathe, and I’d go for richer sounds that deviate further from tonic chords. But I don’t particularly have time or inclination right now to rewrite, so I’m leaving it as is as a testament to my fourteen-year-old self’s musical decision making process. (Not that I’m completely unhappy with the choices I made; I’m quite proud of many of them, and I still especially enjoy the sequence starting at 2:23.)

I’ve licensed the song and all of its associated files under a Creative Commons Attribution 4.0 International License. Basically, you are free to do with it what you want (reproduce, edit, perform, publish, etc.) as long as you give credit to me as the original author. The MusicXML file (containing all of the musical notation information), PDFs of the director’s score and individual parts, MIDI files, and a WAV audio version of the playback-quality MIDI are here on GitHub.

This song has never been played publicly and was only attempted privately once, by the George S. Parker High School Symphonic Band in Janesville, Wisconsin at the end of my sophomore year in high school… It did not go well. If you play it with real instruments, I would love to hear how it goes.

I used NoteFlight to re-score Dies Irae, and I would recommend it to anyone looking to write music in a Web-based editor. Word of warning, it is Flash-based. Still not bad though.

And as a testament to how far MIDI has come in 16 years, here’s what the one I saved back in 1998 sounded like:

Apparently, I used to live inside an 8-bit video game.

Standard
3D Printing, Maker, Programming

Today’s Functional Print: Guitar Strap Button

In today’s “validating my 3D printer purchase” news, I’ve printed a replacement strap button for a child’s guitar. Designed in OpenSCAD in about ten minutes, it took eight minutes to print and has an approximate retail value of $2.62.

original-button-and-copy

The original remaining button (left) and the printed reproduction (right).

strap-button-in-place

guitar-and-strap

The OpenSCAD script and STL file are available on GitHub.

Standard
3D Printing, Akismet, Maker, Programming

Meet Akisbot

IMG_9669

Akisbot is the Akismet mascot; he was originally designed by Dan Hauk, but this 3D version was modeled and printed by yours truly.

Here’s Dan’s design that I used as a reference during fabrication:

akisbot

I designed the entire thing in OpenSCAD, and I’ve published all of the source files on GitHub, so you can print your very own Akisbot. The bot in these pictures was printed at 40% scale and is eight inches tall.

akisbot-scad

I wanted all of the joints in the robot to be movable, and in order to test that my design would work, I started by printing the arms, which should have been the quickest and easiest joint to print and test. (All of Akisbot’s parts were printed on an Orion Delta 3D with ABS plastic.)

IMG_9581

Their small size actually caused them to take a very long time to print, since they would sometimes break loose from the print bed, and I had to slow the printer down so that each layer of plastic had the right amount of time to cool.

IMG_9584

This forearm printed ok though. Notice the joint on the far end that fits with the joint on the end of the upper arm in the next picture.

IMG_9586

Here’s a pair of upper arms. One of these things is not like the other.

The top of this piece fits inside of the joint in the upper arm, allowing it to bend as shown in the next picture.

IMG_9587

I eventually got two full arms printed. It’s a shame that I later decided to modify the elbow joint and had to reprint all four of the pieces.

IMG_9602

I printed the eye rings and eyeballs separately from the face and welded them in place with acetone later. In this photo, they were just set in place to check that they were the right size. I did re-print the inner eye parts so that they would fit more snugly.

IMG_9604

Another dry fit to get a feel for how big the finished robot would be.

IMG_9623

This is the base that connects the body to the wheels and treads. The “A” is the Akismet logo — I initially had printed a solid cube, but I thought this would be more fun.

IMG_9626

These braces attach to the sides of the base to hold the wheels and treads in place. If I printed them again, I’d make them thicker; they’re a little flimsy.

IMG_9628

This is the joint/skeleton system for Akisbot. All of the joints are movable and have freedom to move in all directions, but the base joint was made thicker to give it more support and not allow for as much vertical movement, since robots don’t usually bend over at the knees.

It was difficult to get exactly the right fit between the joint pieces so that they’d be loose enough that the arms and neck could move but would still stay in place from the pressure between the front and back of the robot alone. When the print finished, the joint was a little bit loose, so I added coats of clear nail polish to the inner joints until it was just the right tightness.

IMG_9631

This was the first time I was able to put all of Akisbot’s parts together. He’s only held together with scotch tape, but it proved that welding his front and back parts together should work fine and confirmed that the joint sizing was correct.

IMG_9653

The meter hand and the buttons were all painted with nail polish that my wife Christina already had on hand (no pun intended).

I still need to attach or print his monogrammed “A,” but I haven’t decided yet whether I’m going to print a stamp, paint it freehand, or stencil it in.

IMG_9661

This was my desk shortly before finishing the project. It’s a graveyard of surplus plastic and deformed robot parts.

The tread was created using a pretty neat technique taken from MakerBot user emmett. You print just the perimeter of an object with a curlicued edge, and ABS is flexible enough that it creates a tread that can be routed around wheels. The modeled object is on the left, the printed perimeter on the right.

IMG_9663

These antennas were tough to get printed without the ball snapping off; I gradually increased the radius of the rod until I got two successful prints and called it a day.

IMG_9667

This is Akisbot during the final acetone glue-up and clamp-up. The ABS plastic I used is soluble in acetone, so to permanently connect two pieces of ABS, you can just dab some acetone on one and clamp them together. They’ll become bonded as if they were one piece of plastic.

IMG_9673

3D printing isn’t foolproof. This is the bag of just the green broken parts and extra plastic generated during the build process.

IMG_9674

Akisbot’s total print time, not including assembly or design or re-prints, was about nineteen hours.

Standard
3D Printing, Maker, 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:

printed-card-tray

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

card-shuffler

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

Standard
3D Printing, Life, Maker, 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:

backhoe-loader-wooden

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.

Design

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.

Printing

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

backhoe-cab-printing

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

backhoe-cab-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:

backhoe-cab

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

backhoe-brackets-attached

Painting

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

backhoe-paint-station

Assembly (post-paint)

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

backhoe-assembled-chassis-cab

backhoe-assembled-base

backhoe-attaching-boom

Ta-Da

backhoe-loader-mode

backhoe-bucket-mode

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:

IMG_9329

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!”

backhoe-trick-mode

Standard
3D Printing, Maker

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.

on-print-bed

The accent on the print bed.

installed

The accent installed.

in-place

With the temple opened.

other-side

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.

Standard
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
<?php

var_dump(
	call_user_func_array(
		$argv[1],
		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

int(23)

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
int(6)

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

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

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

Standard
HTML, JavaScript, Photography, PHP, Programming

Turn your iPhoto library into a Web photo album

Update: Now that Apple has dropped support for iPhoto, you may be more interested in the new version of this software, Photos Disc Export.

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:

all

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

Standard
Maker, Woodworking

I Built a Rolling Workbench

Just looking for the plans to make this? You can get the PDF plans for this rolling workbench with a table saw cutout on Etsy or download the the SketchUp file for free.

This weekend, I finally got tired of having this guy be my only workspace in the garage. Any time I wanted to use my table saw, or planer, or jointer, or drill press, or router, I had to clear off this table, hoist the tool up there and clamp it in place. Talk about a lot of wasted time.

After 11 hours of work (including the trip to Home Depot to buy the lumber), this is what I’ve upgraded to. No more using the kids’ toys in the garage as temporary sawhorses! I can use the table saw, planer, and router in place, and I’ll be mounting a drill press on top too. The jointer will be stored underneath, since I don’t use it that often and it’s not that heavy.

Home Depot. My SUV can fit a 48″ wide sheet of plywood perfectly, but I guess MDF is sold in 49″ widths.

The base framed up. You can see on the side some 90ยบ clamps I bought the day before at a garage sale. I am in love with them already.

I used the plans from The Backyard Workshop (which have since disappeared). You can see the Sketchup model on my computer in the back of my car.

Framing the box for the table saw. I am so looking forward to having an outfeed table and not having to clamp the saw in place every time I use it.

I routed an opening for my router table to sit flush in the bench. Very happy with this too. (There’s a fence and stuff for this, it’s just not in the picture.)

The seat for the table saw.

My saw has a home!

My helper for the day. He volunteered to shop-vac all the sawdust, and I was not going to say no.

Finished (for now)! Total materials cost: about $170. I wanted to get it all loaded up with the rest of my tools, but it started raining and I was exhausted. I’m going to be adding some upper shelves in the middle two sections too for storing smaller tools.

Standard
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:

screenshot-1

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!

Standard
Plugins, Programming, Reddit, WordPress

Import your Reddit activity into WordPress

I try to maintain a copy of all of my social media activity in a single WordPress-powered archive. Twitter, Facebook, foursquare, Reddit, Usenet, chat logs: all searchable in one place via a single search box. Or, I can just scroll back in time, using Jetpack’s Infinite Scroll module. It’s heavenly.

Screen Shot 2014-01-17 at 12.09.02 AM

To import my activity from third-party services, I use Keyring Social Importers. Keyring Social Importers ships with support for a handful of services, but not Reddit, so I’ve written a WordPress plugin that adds support for importing comments and submissions from Reddit.

The plugin (“Reddit for Keyring”) is available at Github. (Make sure you install Keyring and Keyring Social Importers first.) After installing it, use it like any of the other Keyring Social Importers. Submissions (both link and text) and comments will be imported and saved as posts.

Let me know if you use it; bug reports are welcome in the comments below or in the Github project.

Standard