Archive for the 'projects' Tag  

Projects completed or still under way.

New Curvature site

November 17th, 2016

Filed under: Computers and Technology , Software

Tags: , ,

Several years after creating Curvature –my program that analyzes road-geometry and builds maps of twisty roads– it now has a dedicated site of its own:

The new site is written to help non-techies understand how to use the curvature files with step-by-step instructions and a lot less jargon than in my original post about the program.

I also took this as an opportunity to learn how to do vector graphics in Inkscape and design myself a new logo — with significant design help from Alison. — find the most twisty-turny roads around

December 5th, 2012

Filed under: Computers and Technology , Software

Tags: , , , , , , , , ,

Update November, 2016: New dedicated Curvature site —

Update October, 2013: Google Earth KML files generated by are now available covering the entire world.

In the process of taking up motorcycling this summer I also gained an additional hobby: scouring maps and travel guides to find the roads that would be most fun to ride. While I’ve had great times on dirt roads through farmland and wide open highways, there just isn’t anything that compares to the thrill of leaning through the corners on a winding road.

While I’ve had some good successes in locating roads by map (such as Tracy Road), one of the shortcomings of a map is the tight curves you can really lean into tend to be below the resolution for many maps. Atlases and electronic maps like Google Earth allow you to zoom in, but then there is the problem of finding the gems in the sea of data. What I realized I needed was a way to highlight just the most curvy roads so that I would know where to explore next.
Continue Reading »

River Levels Widget v.1.2.2 available

March 23rd, 2011

Filed under: Computers and Technology , Software

Tags: , ,

RiverLevels 1.0 Screen Shot

The RiverLevels widget provides an easy way to monitor the amount of water flowing in your favorite streams and rivers right from your Dashboard. The RiverLevels widget is of particular interest to whitewater kayakers and canoeists.

Once any United States Geological Survey (USGS) stream-gauge station is selected, it is automatically refreshed to always provide you with the latest graph of the water-level. As of version 1.2 you can choose between two graph styles: discharge in cubic feet per second (CFS) and water-height in feet.

This widget is Free software, licensed under the GNU General Public License (GPL) version 3 or later.


  • OS X – 10.4 “Tiger” or later

Change Log:
1.2.2 (2011-03-23)

  • Fix for image URL change in USGS site.

1.2.1 (2008-02-10)

  • New zip archive includes the ‘library’ directory missing in the 1.2 release.

1.2 (2008-02-06)

  • Fixed Leopard (10.5) compatability bug.
  • Added the ability to choose Gauge Height (ft) in addition to discharge (CFS).

1.1 (2007-01-08)

  • Fixed graphs extending off bottom of widget
  • Fixed invisibility of front refresh icon

Mission-Style Bookshelf

February 12th, 2011

Filed under: Life and Everything Else

Tags: ,

My current woodworking project is a Mission-style bookshelf that I designed to match the sofa table that I built last year. The bookshelf will sit below a window to the kitchen, so it is low and extra wide to fit that space. To support the weight of the books without sagging, sets of stiles transfers weight from the middle shelf to the frame above and below.

I am building the bookshelf out of cherry. Like the sofa table, all joinery is mortise and tenon. This time I am squaring out the mortises with a new set of mortising chisels rather than rounding off the tenons with a knife as I did on the sofa table — which is making the process go much faster.

If you like the design and wish to build one for yourself, you can download my SketchUp model as a starting point.

Sofa Table Complete

April 11th, 2010

Filed under: Life and Everything Else

Tags: , ,

Over the course of the past year I built this cherry sofa table based on a design by Scott Gibson in Fine Woodworking’s "Furniture" book.

All frame joinery is mortise and tenon, while the drawers use doweled rabbit joints. The finish is boiled linseed oil topped with 3 coats of Minwax wiping varnish.

Building this table was quite a learning experience as just about every part required techniques that I hadn’t used before. Mortise and tenon joinery, biscuits to align the table top during glue-up, doweled joints fort the drawers, quartersawn veneers for the legs, breadboard-ends, and varnish; all of these were new to me and required a bit of trial and error to get right.

This project certainly had its share of "oops" moments, but nothing that couldn’t be repaired or worked-around. I cut the bottom shelf stretcher one inch too short, but was able to cut it in half and splice in a section with a small mortise and tenon in the middle. Later, I made the hipped-tenons on which the breadboard-ends of the top sit too thin. This was repaired with the addition of some 5-minute epoxy to thicken the tenon.

All that remains now is to choose and install drawer-pull hardware.

Sarah’s Jewelry Case

April 4th, 2008

Filed under: Life and Everything Else

Tags: ,

For my Sarah’s birthday I built her a hanging jewelry case. This was my first fine-woodworking project built out of solid wood and it was quite a learning experience. The case is made of Red Birch with dots of Wenge (black), Satinwood (yellow), Chakte Coc (red), Sucaperē (brown), and Purple Heart (purple). It is finished with three coats of Watco Danish Oil after sanding to 600-grit. The outer dimensions are 23 inches tall, 19 inches wide, and 4 inches deep.

I had originally hoped to construct the case over 2 months of weekends, but this time-line turned out to be a little optimistic and though I didn’t count the hours, it didn’t get completed until 4 months after I started. Work on the project went much faster after I got my own table saw at the end of February and could pop downstairs whenever I had a free moment. Until that point I did most of the work in my friend John Filan‘s shop in Weybridge (VT). John is a wood-artisan, master cabinet-maker, and was an amazing resource throughout this project: from showing me the ropes at Lathrop’s lumber mill, to machine setup, to notes on grain direction. Without his expert help (and workshop, and tools) this project would not have been nearly as successful. While I have so much more to learn, at least I now know where to begin and how to safely and successfully use all of the major machine-tools.

I read (after the fact of course) that it is usually best to start with simple projects before cabinetry to avoid dealing with the close tolerances of all of the joinery and inset pieces. I’d have to agree. Though I consider this project to be a success I did spend many periods just staring at all of my pieces, dry-fitting them, and trying to convince myself that if I trim off 1/64 of an inch off one side that they would all fit together properly.

As I mentioned, the case started as about 20 board-feet of rough lumber stacked on the upper rack of Lathrop’s mill. Once in John’s shop it was flattened on the jointer, planed to thickness and made square, straight and ready for use. I had sketched out most of the design prior to starting, but many things changed over the course of construction. For instance, I hadn’t planned for wood movement so the back panel had to become floating and interior header and footer pieces added to replace the strength I was planning on getting from the panel. Similarly, my initial plans to hang trays on the insides of the doors fell away as I contemplated the additional complexity of cramming them into an already-tight location.

The ring-pillow I made from a piece of foam cut into a wedge-shape with rows then sliced into its surface. I wrapped it in dark red velvet and put stitches in the base of the slices, the ends, and elsewhere to keep it all tightly together.

Happy belated birthday, Sarah!

Spring is Here

May 6th, 2007

Filed under: Life and Everything Else

Tags: , , ,

After a long winter that included some unseasonably late snows in April, spring is now in full swing. As flowers push up through the soil tree-buds are unwrapping their new leaves, the birches leading the way.

New Leaves

In addition house repairs, wedding planning, work, life and everything else we are also planning to put in a garden this summer. We’ve started seed indoors already — about a 100 basil plants, some lufa sponges, morning glories, green peppers, and tomatos — and will need a place to plant them after the risk of frost is gone. To that end I’ve started building a dry-stone retaining wall along the edge of the cliff below our house.

As the cliff-top is the only place not overshadowed by maples (and our reluctance to cut down our beautiful trees) the cliff-top is where the gardens will go. We don’t really have too much good soil elsewhere, so after the terrace walls are complete we will bring in large amounts of compost to grow in.

Our current vegetable plans are for:

  • basil
  • tomatoes
  • zuchini
  • green peppers
  • spinach

Old Laptop –> Digital Picture Frame

November 16th, 2004

Filed under: Computers and Technology

Tags: , ,


With the rapid increase of computer power and the growing software power-requirements that go with them, it is often easy to find old Pentium 100, 133, and 166 (or similar generation) laptops for little if any cost. Machines of this generation generally ran MS Windows 95, which can’t cope with new hardware such as wireless PC cards and such, limiting their usefulness. While machines are woefully underpowered for running a new version of MS Windows, they will often run just fine with Linux.

Sidenote: If you wish to use one of these old laptops as a “desktop computer” running Linux, then you would probably be best to use a light-weight window-manager such as ffwm or windowmaker instead of the KDE or Gnome window-managers that come as the defaults in most Linux distrobutions. Using a less resourse-intensive window manager can make these old computers quite usable, even “snappy”.

The laptop I am using for this Linux picture frame project is an old Dell Inspiron 3000 with a Pentium chip that I got for free since the battery had died and the keyboard didn’t work. It turns out that the keyboard works fine in Linux, just not in the MS Windows 95 that had been installed on the machine.

Even if you can’t find one of these for free, they can usually be had for VERY cheap. To save even more cost, look for ones with broken keyboards/dead batteries, broken touchpad, etc. Just plug in a PS/2 keyboard and mouse for the install, then access the machine through the network (ssh) after that.

The one addition I made to my laptop is a Xircom “Cardbus Ethernet 10/100 + Modem 56” PCMCIA ethernet card. All you generally need is an ethernet card that will work with Linux, for the purposes of the picture frame, speed isn’t much of an issue.

Software Overview

When searching around for info on turning a laptop into a digital picture frame, the tutorials I found all focused on modifying the hardware (removing extra plastic, mounting the screen, etc) and made just a passing mention to the software setup involved. This tutorial will start with software for several reasons:

  1. Its a lot easier to install Linux on a computer with a keyboard and mouse than on a stripped down motherboard/screen packed into a picture frame.
  2. You might as well set up Linux and make sure that all of your hardware and software is working well together before modding the hardware. This helps isolate problems.

Operating System
I chose to put Xandros Desktop on my laptop for this project. I had initially tried a Knoppix hard-drive install of “straight” Debian, but had some problems with the network card or something. I don’t quite remember what the problem was, but I tried Xandros as well as replaced my network card with the above mentioned Xircom one. Xandros happend to be the distro that was on the machine when I got networking up, so I didn’t bother to change it.

The nice thing about Xandros is the good hardware detection, this can make for more painless OS installs if nothing else. The big caveat however is that my Xandros installation take up about 1G, half of my laptop’s little 2GB hard drive. A stripped down Debian install would leave more room with less manual cleanup.

You can use any Linux distribution to build your digital pictureframe, but the placement of a few of the initialization scripts may be different on a distribution such as Fedora or SUSE which are not based on Debian (as are Knoppix and Xandros Desktop).

Displaying the Pictures
I chose to use the “feh” image viewer for displaying a slideshow of the photos. “feh” has several big advantages:

  • Full-screen mode
  • Reliable image stretching
  • lots and lots of options for delays, sizing, ordering, etc
  • can be run from the command-line without needing a window manager (I’m not sure if this true of other slideshow programs or not)

Starting/Stopping the Slideshow
I wrote a few little-tiny bash scripts to call the slideshow and initiallize it. Their paths and contents are listed below in the like-named section.

Setting up the Display Software

Assuming that you have successfully installed and are running Linux on the laptop, install the “feh” program from Also install the “unclutter” program to hide the mouse cursor after several seconds of inactivity.

In Debian, one would just use:
apt-get install feh unclutter

Make a script to start feh with the images from a certain directory
As mentioned in the use case above, I want to have feh automatically started with all the images in a folder. To be able to do that with one command, i put the following script at /usr/local/bin/

# This file is located at /usr/local/bin/
# Copyright 2004 Adam Franco
# Licensed under the GNU GPL v1.2+ (

killall feh unclutter

unclutter &

feh -zZFr -D 300 /home/afranco/Photos/

The options I used are as follows:

-z — randomize the order of images

-Z — zoom images to fit the window

-F — make the window full-screen

-r — recursively search the target directory for images

-D — Delay (in seconds) between images
Be sure to change “afranco/Photos/” to your actual image location.

If you now call “” from a console in an X-session, feh should run.

Running from the command-line without an X-session.

I wanted to be able to start the slideshow on boot, and to be able to restart/stop it with the cron schedualer or manually from a remote terminal. Even though I could set the KDE environment to automatically log in and start feh from within the X-session, that wouldn’t allow for easy enough control.

To start/restart the slideshow, I put the following script at /usr/local/bin/

# I put this file at /usr/local/bin/
# Copyright 2004 Adam Franco
# Licensed under the GNU GPL v1.2+ (

# make sure none of our parts are running and are in the way.
killall feh unclutter X kdm;

#run the slideshow
/usr/bin/X11/xinit /usr/local/bin/ &

In Xandros (and other distros that use a graphical login screen like “kdm”) it is important to free up the X-window so that you can put the slideshow there. This is accomplished by killing kdm and X. To prevent the graphical login screen from apearing at all on boot, remove all links that contain “kdm” from /etc/rc2.d/ and /etc/rc3.d/.

Starting the Slideshow on Boot

To start the slideshow on boot, I first made an init script in /etc/init.d/ to control the starting and stopping of the slideshow. Looking back, I could have put the scripts listed above right in this init script, but that wasn’t how I approached it, so I will leave it. Feel free to put the commands from the above scripts right into the init script instead.

The init script at /etc/init.d/picframe:

# Start/stop the pictureframe
# Copyright 2004 Adam Franco
# Licensed under the GNU GPL v1.2+ (

test -f /usr/local/bin/ || exit 0

export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11:/usr/local/sbin:/usr/local/bin
export HOME=/root

case “$1” in
start) echo -n “Starting pictureframe”
# pass something to the mouse to wake up the display if its asleep
echo “Hello there mousey.” > /dev/mouse
echo “Hello there mousey.” > /dev/mouse
sleep 5
echo “Hello there mousey.” > /dev/mouse
setterm -blank 0
# The XF86Config-4 should have Option “BlankTime” “0”
# start the slideshow

stop) echo -n “Stoping pictureframe”
killall feh X

# make sure the display will go to sleep
setterm -blank 1

restart) echo -n “Restarting pictureframe”

*) echo “Usage: /etc/init.d/picframe start|stop|restart”
exit 1
exit 0

Now that the init script is in place, the slideshow can be started with the command:

/etc/init.d/picframe start

and stopped with:

/etc/init.d/picframe stop

To get the start the slideshow on boot, make a link in either/both of /etc/rc2.d/ or /etc/rc3.d/. All of the links in /etc/rc2.d/ are called with “start” when booting into runlevel 2 or higher. The links in /etc/rc3.d/ are called with “start” when booting into runlevel 3 or higher. The runlevel is set in /etc/inittab. Anyway, I am running the machine at runlevel 3 and I made a link called “S99picframe” that links to my init scrip. The command to do this is:

ln -s /etc/init.d/picframe /etc/rc3.d/S99picframe

You can reorder the call sequence in the /etc/rcX.d/ directories, by renaming the links (they are executed in alpha-numeric order). The slideshow should now start on boot.

Starting and stopping on schedual with cron

I wished to save both power and screen-life by turning off the screen when I am asleep/not home. To do so, I put the following lines in my crontab:

0 2 * * * /etc/init.d/picframe stop > /dev/null
0 17 * * 1-5 /etc/init.d/picframe start > /dev/null
0 9 * * 0,6 /etc/init.d/picframe start > /dev/null

The first line stops the slideshow at 2am every night. The second one starts it every weekday at 5pm. The third line starts the slideshow every sunday and saturday at 9am.

Blanking the screen when the slideshow is stopped.

It seems that a user has to be logged into a local tty terminal on the machine and have “setterm -blank 1” run in order for the screen to be turned off when the slideshow is stopped. You could manually log in to a tty. Another way to do this is follow the directions on this site for automatically loging into a tty and running the setterm command. Alternatively, it may work to modifiy the terminial creation piece in /etc/inittab to just run the setterm command before showing the login prompt.

How I finally got the screen to blank automatically:

  1. Followed these directions for installing qlogin and the two libraries it needs.
    • Download qlogin into a convenient directory such as /usr/local/src/.
    • copy the “qlogin” program in the archive to something like /sbin/qlogin
    • Install the setgroups extention:
      …it comes with Qlogin. To build that, cd to the “setgroups” subdirectory
      in the Qlogin source tree, then

      perl Makefile.PL
      make install

    • Download and install the User::Utmp perl package with the same commands as above.
  2. Edit /etc/inittab to make qlogin automatically log in to the first tty:
    1:23:respawn:/sbin/getty 38400 tty1


    1:23:respawn:/sbin/qlogin –command=”/bin/bash” /dev/tty1 pictureframe
  3. Add “setterm -blank 1” to the rc.local file.

    If you are using Debian and therefore don’t have an rc.local file, you can make the equivalent as follows:

    • make a script with the following at /etc/init.d/local

      /usr/bin/setterm -blank 1 > /dev/console

    • make that script executable
      chmod a+x /etc/init.d/local
    • add that to the startup:
      update-rc.d local defaults 80
  4. Reboot and enjoy.


Laptop with slideshow software running on it
My rule of thumb for the hardware side of this project was to do as little modification as necessary to achieve the desired form and function. My main reason for this is that I wished to retain as much of the basic functioning of a normal laptop as possible to facilitate future modifications and upgrades to my picture-frame system. By retaining the general laptop form-factor, keyboard, CDROM, etc, reinstalling the operating system, other devices, etc is much easier. As seen in the picture at right, I started this project in “laptop form”, getting the software working first for exactly this reason.

Hinge-end of the laptop showing extended cables.
Once I had gotten the software worked out as described in the sections above, it was time to modify the hardware of the laptop to get it into “picture frame” form-factor.

I was initially hoping to be able to simply unscrew the hinges and remount the display backwards so that it closed with the back of the screen on top of the keyboard, a la “tablet PC”. This configuration would be strong — since the screen would still be screwed to the body of the laptop, just backwards — as well as simple and extensible — since it could easily be returned to “laptop” form-factor.

Side-view of laptop with the screen epoxied to the bottom of the laptop. The hole seen is where the dead battery used to live.Unfortunately, the orange data-cable/strip (shown in the picture above/left) was not flexible enough to twist around to an inverted configuration. Since that wasn’t going to work, I decided just to pull the data-cable/strip out as far as it would go and epoxy the back of the screen to the “bottom” of the laptop with wood spacers to allow for airflow. In addition to the gluing, I had to solder a 3-inch extension into the display power-cable-bundle so that it could reach around the back of the laptop.

The display/laptop standing on a shelf with matting in front of it. The power and network cables are sneaking around behind the booksThe only remaining job is to obtain a frame and hang the display on the wall. In the mean-time I am just standing the machine on a shelf with a piece of matting leaning against it. The power and network cables that sneak back through the books on the shelf allow me to ssh into the display and update/change the pictures in the slideshow.