January 2011

You are currently browsing the monthly archive for January 2011.

Here’s a 20-minute video of the entire pen-making process — everything from selecting the wood to preparing the blanks, through to turning the pen on the lathe, finishing it to a shine, and assembling it. Virtually none of the process has been left out of this video, so it should give you a good idea of what’s involved in the process.

There’s a scene index after the video on this page.

Handmade pen featured in video

Handmade pen featured in video

In the video I’m working on three different pens, but I’ve edited out the work I did on the other two pens. Here’s a picture of the pen featured in the video. I traded with a friend for some custom artwork. :)

  • 00:03 Setup and preparing the blanks
  • 00:57 Power on!
  • 01:05 Drilling the blanks
  • 02:35 Sanding and inserting brass tubes
  • 03:36 Trimming the blanks
  • 04:42 Mounting the blanks onto the lathe
  • 05:15 Rough turning
  • 07:25 Detail turning
  • 08:28 Sanding and finish coat #1
  • 10:41 Sanding and finish coat #2
  • 11:56 Sanding and finish coat #3
  • 13:24 Final sanding and coarse polish
  • 15:30 Final polish
  • 16:24 Removing the work from the lathe
  • 16:57 Getting ready to assemble
  • 17:30 Assembly
Share

Okay, let’s get some parenting concerns out of the way first: I believe that a rubber band gun is probably one of the safest ways to teach a kid a bit about gun safety, partly because it actually shoots something that can sting. It’s a good excuse to explain that bringing a weapon (even a toy one) to school will likely get him kicked out, and it’s also a good way to learn how to be conscious of where it’s pointing — loaded or not. Plus it’s fun for target practice.

That said, here’s a single-shooter rubber band gun that we threw together today using scrap wood. The rubber band is loaded from the front onto the top of the trigger lever, which is also the rear sight. It’s alarmingly accurate; I can hit a quarter-sized bull’s eye from across the room.

(Click on the pictures to view larger versions.)

Rubber Band Gun

Rubber Band Gun

It started off as a bamboo flooring plank cut-off, but it wasn’t very accurate or attractive. It was also very difficult to hold and aim.

Rubber Band Gun Loaded

Rubber Band Gun Loaded

The blue rubber band provides enough tension to hold the trigger in place when loaded. The trigger lever pivots on a brad nail inside of the groove. It took some chisel work to get the slot just right.

Rubber Band Gun Trigger Mechanism

Rubber Band Gun Trigger Mechanism

Share

I have everything I need to keep tabs on my home IP address without signing up for a DDNS service like No-IP or DynDNS. My Synology NAS always knows its address when it’s online, and because it’s essentially a little Linux box, there’s no reason it can’t tell my other sites where to find it.

In my case, I want to be able to reach my home IP address by visiting a certain URL on either my remote Linux or Windows host — something like www.mydomain.com/myhomeip. But I don’t really want to hide the IP address like a real DDNS would, and I don’t think my hosting providers would even accommodate that. So I rolled my own.

On the remote web host, I created a few PHP files to receive the notifications. common.php does most of the work:

<?php
$file = 'ip.txt';
$pw = 'some_password_here';
$default = 'www.theFrankes.com';

function redirect() {
  global $file, $default;
  $ip = file_get_contents($file);
  if( isValid( $ip ) ) {
    header( "Location: http://$ip" );
  } else {
    header( "Location: http://$default" );
  }
}

function setIp() {
  global $file, $pw;
  $ip = $_SERVER['REMOTE_ADDR'];
  if( isValid( $ip ) & ( $_GET["pw"] == $pw ) ) {
    $fh = fopen($file, 'w') or die("can't open file");
    fwrite($fh, $ip);
    fclose($fh);
  }
}

function isValid( $ip ) {
  return preg_match( "/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/", $ip );
}
?>

My index page calls redirect(), which reads in the IP address and sends the visitor to it if it’s valid. There’s another page that calls setIp(), and that’s the page that my home computer is going to call, passing in the “password” at the top.

I used putty to log into the Synology server and stopped the cron job.

/usr/syno/etc/rc.d/S04crond.sh stop

Then I edited  /etc/crontab to call a shell script in admin’s home directory every few hours. Don’t copy/paste this into the file using putty, but rather type it in directly and use only one tab to separate each column. Typing it directly prevents special (invisible) characters from getting into the file, which could cause it to be overwritten by the default file upon reboot.

*       */4     *       *       *       root   /volume1/homes/admin/cron/every4hrs.sh

In the shell script, I used wget to make the web request. curl would work just as well. I could have just added this command to the crontab file, but it’s easier to manage a shell script in the home directory. I can also extend it more easily at a later date. The shell script simply contains:

/usr/syno/bin/wget --tries=2 "http://www.mydomain.com/myhomeip/ipsetter.php?pw=some_password_here" -O -

The Synology DiskStation makes a working copy of the crontab when it starts up, and stores it in /var/spool/cron/crontabs/root, so to be safe I just rebooted the device rather than just starting the service up again. When I started the service using “S04crond.sh start”, it would work only until the DiskStation rebooted, and after that it would default back to the original. Rebooting the device right away seems to have fixed that problem.

Share

KeePass is a free and utterly genius password management tool that has allowed me to leave the days of reusing passwords way in the past. Now all of my passwords are different, securely managed, and look something like “út8¥Äbë¬eqö«ûëU^Èm­¯”. (Go ahead — try to guess it!) It was written in Microsoft .Net, and supposedly works just fine under Mono in Linux. Mono is a .Net compatibility layer and it’s already included in Ubuntu installations. Well, most of it is.

The problem is that it didn’t quite work out of the box on our Ubuntu 10.10 machine. In particular, I wasn’t able to connect to my password database via FTP like I usually do, but I solved a couple other common problems along the way as well.

First, download the portable version KeePass from the site’s download page, and move all the files onto your linux box. I put them in my home directory under a new hidden directory called “.KeePass”. The first thing I did was add an application launcher to Ubuntu’s top panel, and lo and behold it would not launch.In console, I saw this error message:

The assembly mscorlib.dll was not found or could not be loaded. It should have been installed in the `/usr/lib/mono/1.0/mscorlib.dll’ directory.

The problem was simple; there was a typo in the path. So be sure to type the path carefully, like this: “mono /home/myname/.KeePass/KeePass.exe”. When Mono can’t find the file, it decides it wants to try to run an older version of itself, and that older version it’s included in Ubuntu by default.

Next there were a couple of errors that I wouldn’t have gotten if I had read the instructions carefully. They were both the standard “assembly not found” errors with the text “The following assembly referenced from /home/myname/.KeePass/KeePass.exe could not be loaded” and “The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly.” The first referred to “System.Windows.Forms” and the next to “System.Runtime.Remoting”.

These assemblies were simply not installed in Ubuntu 10.10 by default, but they’re available in the Ubuntu Software Center. Here’s what they look like when you’re adding them.

Adding Mono System.Windows.Forms Support

Adding Mono System.Windows.Forms Support

Sorry about the overlaid screen shot window in this one, but you can still see how to filter and what to click.

Adding Mono System.Runtime Support

Adding Mono System.Runtime Support

Finally it would run, but I was still unable to from open the database from the URL of the FTP site. When I tried either by opening it directly or tweaking the config file, I got a polite error from KeePass that said, “The requested feature is not implemented.” I recognize this as a System.NotImplementedException that’s trapped (but probably not expected) in the code. What it probably means is that KeePass uses some features of .Net that are not yet implemented in Mono; it’s not KeePass’s fault.

I saw two ways around this error: First I could mount the FTP site to a local path using curlftpfs, but that would mean installing something new. Instead I wrote a short shell script to download the database, launch KeePass, and then upload the database back to the FTP site. Here’s the content of the script:

  Server="ftp://my_ftp_site.com"
  User="my_ftp_username"
  Password="my_password"
  DBFile="database.kdbx"
  LocalPath="$HOME/.KeePass/"

  lftp -u $User,$Password $Server <<EOF
    set ftp:ssl-allow no
    get $DBFile -o $LocalPath$DBFile
  quit
  EOF

  mono ${LocalPath}KeePass.exe

  lftp -u $User,$Password $Server <<EOF
    set ftp:ssl-allow no
    put $LocalPath/$DBFile
  quit
  EOF

Finally, I made the script executable, remapped the launcher to the script, picked a better icon, and I was in business again. I hope someone else out there finds this helpful. I know I will the next time I forget what I did. :)

Share

My son got a set of plastic baseball players and a mat in the shape of a baseball diamond for Christmas. We had a 6-sided die on hand, and he wanted to make a game out of it. Here’s what we ended up with:

Batter rolls die:

  1. Ball
  2. Ball
  3. Strike
  4. Strike
  5. Foul
  6. Hit – Roll again

If batter rolled a 6, the second roll follows these rules. Rolling a 1-4 forces other runners along if necessary. If a runner is not forced, player much decide if that runner is attempting to advance before the team in the field gets to roll.

  1. Runs to 1
  2. Runs to 2
  3. Runs to 3
  4. Runs to home
  5. Roll again, with same rules.
  6. Home Run (out of park; cannot be caught; all runners score)

Runners are moved into position (either advancing between or on base), and die is handed to fielding team, who gets one roll.

  1. Out on first – if a runner is advancing to first, he is out. Otherwise, ignore.
  2. Out on second – if a runner is advancing to second, he is out. Otherwise, ignore.
  3. Out on third – if a runner is advancing to third, he is out. Otherwise, ignore.
  4. Out at home – if a runner is advancing to home, he is out. Otherwise, ignore.
  5. Fly out. Runners don’t advance.
  6. Wildcard out – any single advancing runner may be taken out.

Examples:

If a runner is on third, and batter rolls a 6 (Hit – Roll again), then a 2 (Runs to 2), then the batter may either

  • place batter between 1 and 2, and leave runner on third. Fielder must roll a 2, 5, or 6 to get the runner out.
  • place batter between 1 and 2, and advance runner on third toward home. Fielder must roll a 2, 4, 5, or 6. A 2, 5, or 6 can take the batter out. (With a 5, the runner advancing to home would go back to third.) A 4 or 6 can take out the runner advancing to home.

If a runner is on second and third, and batter rolls a 6 + 6, he scores three points.

If a runner is on second and third, and batter rolls a 6 + 4, he scores two points (runners forced to advance), and fielder may roll a 4, 5, or 6 to get the batter out. If he rolls a 5, then the runners must return to second and third.

Share