<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Tom Moertel's Weblog: Category hacks</title>
    <link>http://blog.moertel.com/articles/category/hacks</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Quality rants on programming theory and stuff geeks like</description>
    <item>
      <title>How to download photos and movies from the Palm Centro to a Linux desktop</title>
      <description>&lt;p&gt;I recently got a Palm Centro smartphone, and so far I love it. Like
most modern cell phones, it has a built-in camera and takes decent
snapshots and even records short movies. It&amp;#8217;s great for
spur-of-the-moment shots when I don&amp;#8217;t have my real camera.  The
trick &amp;#8211; and there&amp;#8217;s always a trick when it comes to cell phones &amp;#8211; is getting
the photos off the camera and onto my computer.&lt;/p&gt;


	&lt;p&gt;To get at my pictures, Sprint would prefer that I sign up for their
ludicrously expensive &amp;#8220;PictureMail&amp;#8221; service.  Leave it to weasely
telecom execs to come up with another way to squeeze money from
teenagers: charge them $5 each month for the &amp;#8220;privilege&amp;#8221; of sharing
their pictures with friends.  This fee, of course, is in addition to the
fee for &amp;#8220;unlimited&amp;#8221; mobile Internet use.  I guess picture bits are
somehow more expensive to move over the air than other kinds of bits.&lt;/p&gt;


	&lt;p&gt;In any case, my next goal after
getting my &lt;a href="http://blog.moertel.com/articles/2007/10/31/how-to-hotsync-the-palm-centro-with-a-fedora-7-linux-desktop-via-usb"&gt;Centro to hotsync with my Linux
workstation&lt;/a&gt; was to figure out how
to download my photos and movies.&lt;/p&gt;


	&lt;p&gt;After a bit of hacking, I figured out that the Centro stores images in
a typical digital-camera-image (DCIM) hierarchy.  For
example, I have a 4-GB microSD card installed in my Centro, and I
store my photos in the &amp;#8220;Palm&amp;#8221; album on it.  This album ends up stored
in the /DCIM/Palm directory on the card.&lt;/p&gt;


	&lt;p&gt;Using the pilot-xfer program
from the &lt;a href="http://www.pilot-link.org/"&gt;pilot-link&lt;/a&gt; project, I was able
to find the directory and its contents.  The trick was to use the
sparsely documented &amp;#8211;D flag to work with the Centro&amp;#8217;s virtual
filesystem.  Here, for example, is how I list the contents of the Palm album:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;$ pilot-xfer -p usb: -D /DCIM/Palm -l

   Listening for incoming connection on usb:... connected!

   Directory of /DCIM/Palm...
        652 Fri Nov  2 08:17:06 2007  Album.db
     292053 Fri Nov  2 09:04:20 2007  Photo_110207_001.jpg
      78493 Fri Nov  2 08:17:06 2007  Video_110207_001.3g2
         20 Wed Oct 31 12:09:20 2007  Thumbnail.db

   Thank you for using pilot-link.
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Here, you can see that I have one photo and one movie in the album.
(Movies are stored in .3g2 files that contain &lt;span class="caps"&gt;MPEG4&lt;/span&gt; video.)&lt;/p&gt;


	&lt;p&gt;To download the files, I again turned to pilot-xfer, this time using the
&amp;#8211;f (fetch) flag to fetch a list of files.
Here, for example, I&amp;#8217;ll fetch the image from the listing above:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;$ pilot-xfer -p usb: -D /DCIM/Palm -f Photo_110207_001.jpg

   Listening for incoming connection on usb:... connected!

   Fetching '/DCIM/Palm' ... (292053 bytes)   285 KiB total.

   Thank you for using pilot-link.
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;So that&amp;#8217;s the process.  It&amp;#8217;s kind of clunky, so I wrote a small Python
program to automate it.  (I&amp;#8217;m learning Python.  If you&amp;#8217;re a Pythonista, please
consider critiquing my code. I would be especially thankful if you
could point out any helpful idioms that I may have overlooked.)&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s how to use the program:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;$ get-pilot-photos.py --help
Usage: get-pilot-photos.py [options]

Options:
  -h, --help            show this help message and exit
  -s SRCDIR, --srcdir=SRCDIR
                        VFS dir on Palm device from which to fetch images
  -d DESTDIR, --destdir=DESTDIR
                        Where to save the images on your computer
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Both the &amp;#8212;srcdir and &amp;#8212;dstdir options are optional.  If you
omit the first, the program will download photos and movies from the
/DCIM/Palm album.  If you omit the second, the program will save the
downloads to a new, timestamped directory within your home directory.&lt;/p&gt;


	&lt;p&gt;That&amp;#8217;s it.  The code is below.&lt;/p&gt;&lt;pre&gt;&lt;code style="font-size: smaller"&gt;#!/usr/bin/env python

# get-pilot-photos.py -
# Download photos and movies from my Palm Centro via pilot-link
#
# Tom Moertel &amp;lt;tom@moertel.com&amp;gt;
# 2007-11-01
#
# Copyright 2007 Thomas G. Moertel
#
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# See &amp;lt;http://www.gnu.org/licenses/&amp;gt; for more.

import os
import optparse
import re
import subprocess
import time

PILOT_XFER = 'pilot-xfer'
DEFAULT_PALM_IMAGE_DIR = '/DCIM/Palm'

class PhotoImporter(object):

    def __init__(self, src_dir, dest_dir=None):
        self.src_dir = src_dir
        self.dest_dir = dest_dir or self.get_image_dir()

    def run(self):
        print 'Finding images in %s on your Palm device.' % self.src_dir
        print 'Begin hotsync now...'
        images = self.get_image_list()
        if len(images) == 0:
            print 'No images were found.  Done.'
            return
        print 'Found %s images' % len(images)
        print 'Waiting for hotsync to complete...'
        time.sleep(10) # give 1st hotsync time to complete
        print 'Begin another hotsync now...'
        self.fetch_images(images)
        print 'Done.  The images were fetched to the following directory:'
        print self.dest_dir

    def get_image_list(self):
        cmdline = [PILOT_XFER, '-p',  'usb:', '-D', self.src_dir, '-l']
        proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
        listing = proc.stdout.read()
        proc.wait()
        return re.findall(r'\b\S+\.(?:jpg|3g2)\b', listing)

    def fetch_images(self, images):
        cmdline = [PILOT_XFER, '-p',  'usb:', '-D', self.src_dir, '-f'] + images
        subprocess.Popen(cmdline, cwd=self.dest_dir).wait()

    def get_image_dir(self):
        root = os.getenv('HOME') or tempfile.mkdtemp()
        now = time.strftime("%Y-%m-%d--%H.%M.%S", time.localtime())
        dir = os.path.join(root, 'images', 'unsorted-pix', now)
        os.makedirs(dir, mode=0771)
        return dir

def main():
    p = optparse.OptionParser()
    p.add_option('--srcdir', '-s', default=DEFAULT_PALM_IMAGE_DIR,
                 help='VFS dir on Palm device from which to fetch images')
    p.add_option('--destdir', '-d',
                 help='Where to save the images on your computer')
    opts, args = p.parse_args()
    PhotoImporter(opts.srcdir, opts.destdir).run()

if __name__ == '__main__':
    main()
&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>Fri, 02 Nov 2007 15:32:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:92fcb359-e7e8-41dc-a5b9-86caffcde1f5</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2007/11/02/how-to-download-photos-and-movies-from-the-palm-centro-to-a-linux-desktop</link>
      <category>hacks</category>
      <category>movies</category>
      <category>palm</category>
      <category>centro</category>
      <category>hotsync</category>
      <category>images</category>
      <category>download</category>
      <category>python</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/616</trackback:ping>
    </item>
    <item>
      <title>Greasmonkey script annotates IMDb movies with their decoder-ring percentile ranks</title>
      <description>&lt;p&gt;Sam at &lt;a href="http://rephrase.net/"&gt;rephase.net&lt;/a&gt; has harnessed the earth-shattering power of the &lt;a href="http://community.moertel.com/ss/space/IMDB+Movie-Rating+Decoder+Ring"&gt;IMDb movie-rating decoder ring&lt;/a&gt; to create a &lt;a href="http://rephrase.net/days/07/06/imdb-decoder"&gt;Greasmonkey script that annotates IMDb-listed movies with their percentile ranks&lt;/a&gt;. Now you don&amp;#8217;t need to look up a movie&amp;#8217;s &amp;#8220;star rating&amp;#8221; in the decoder ring to see where the movie ranks; the ranking appears right on the movie&amp;#8217;s IMDb page.&lt;/p&gt;


	&lt;p&gt;Do check out the &lt;a href="http://rephrase.net/box/user-js/scripts/imdb-percentile-ratings.user.js"&gt;script itself&lt;/a&gt;  to see how Sam cleverly embeds a copy of the decoder ring and plucks scores from it as needed.&lt;/p&gt;


	&lt;p&gt;For more on the IMDb movie-rating decoder ring, see:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://community.moertel.com/ss/space/IMDB+Movie-Rating+Decoder+Ring"&gt;the decoder ring itself&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://blog.moertel.com/articles/2007/06/21/talk-fun-with-numbers-r-and-perl-and-imdb-data"&gt;my talk &lt;em&gt;Fun with Numbers: R and Perl and &lt;span class="caps"&gt;IMDB&lt;/span&gt; data&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://blog.moertel.com/articles/2006/01/17/mining-gold-from-the-internet-movie-database-part-1"&gt;Mining gold from the IMDb&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Wed, 11 Jul 2007 13:49:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:ccf23640-312c-49f8-9e89-7bae08d56c4f</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2007/07/11/greasmonkey-script-for-imdb-decoder-ring</link>
      <category>hacks</category>
      <category>imdb</category>
      <category>statistics</category>
      <category>greasmonkey</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/513</trackback:ping>
    </item>
    <item>
      <title>Adding reddit and del.icio.us buttons to articles in Typo</title>
      <description>&lt;p&gt;Here&amp;#8217;s quick patch I made to my &lt;a href="http://typosphere.org"&gt;Typo&lt;/a&gt; 4.0
installation to add &lt;a href="http://reddit.com"&gt;Reddit&lt;/a&gt; and
&lt;a href="http://del.icio.us/"&gt;del.icio.us&lt;/a&gt; buttons to articles.  Now one click
is all it takes to submit an article to either site.  (These buttons
appear on my blog at the end of each article.)&lt;/p&gt;


	&lt;p&gt;If you want to apply the patch, be sure to also place copies of the
button images into &lt;code&gt;public/images&lt;/code&gt;.  You can snag the
images from my site or from the Reddit and del.icio.us sites.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s the patch:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;--- typo.orig/app/helpers/articles_helper.rb    2006-07-24 11:04:27.000000000 -0400
+++ typo/app/helpers/articles_helper.rb    2006-08-09 17:06:51.000000000 -0400
@@ -73,7 +74,26 @@
       code &amp;lt;&amp;lt; tag_links(article)        unless article.tags.empty?
       code &amp;lt;&amp;lt; comments_link(article)    if article.allow_comments?
       code &amp;lt;&amp;lt; trackbacks_link(article)  if article.allow_pings?
-    end.join("&amp;amp;nbsp;&amp;lt;strong&amp;gt;|&amp;lt;/strong&amp;gt;&amp;amp;nbsp;")
+      code &amp;lt;&amp;lt; submit_this_article_links(article)
+    end.join("&amp;amp;nbsp;| ")
+  end
+
+  def submit_this_article_links(article)
+    u_url = u(url_of(article, false))
+    u_title = u(article.title)
+    [  # move me into a database table
+      [ "Submit to Reddit.com",
+        "http://reddit.com/submit?url=&amp;lt;URL&amp;gt;&amp;#38;title=&amp;lt;TITLE&amp;gt;",
+        image_tag("reddit.gif", :size =&amp;gt; "18x18", :border =&amp;gt; 0)
+      ],
+      [ "Save to del.icio.us",
+        "http://del.icio.us/post?v=2&amp;#38;url=&amp;lt;URL&amp;gt;&amp;#38;title=&amp;lt;TITLE&amp;gt;",
+        image_tag("delicious.gif", :size =&amp;gt; "16x16", :border =&amp;gt; 0)
+      ]
+    ].map do |submit_title, submit_url, image_tag|
+      submit_url = submit_url.gsub(/&amp;lt;URL&amp;gt;/, u_url).gsub(/&amp;lt;TITLE&amp;gt;/, u_title)
+      %(&amp;lt;a href="#{h submit_url}" title="#{h submit_title}: &amp;amp;#x201C;#{h article.title}&amp;amp;#x201D;"&amp;gt;#{image_tag}&amp;lt;/a&amp;gt;)
+    end.join("&amp;amp;nbsp;")
   end

   def category_links(article)
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;The code is begging for a little refactoring love, but I&amp;#8217;m off for vacation
in about twenty minutes, so it will have to wait.&lt;/p&gt;</description>
      <pubDate>Wed, 09 Aug 2006 18:25:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:517cb441-e204-4713-94c5-321917af0d73</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/08/09/adding-reddit-and-del-icio-us-buttons-to-articles-in-typo</link>
      <category>site news</category>
      <category>typo</category>
      <category>hacks</category>
      <category>typo</category>
      <category>reddit</category>
      <category>delicous</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/152</trackback:ping>
    </item>
    <item>
      <title>How to flash your BIOS when you don't have a floppy drive</title>
      <description>&lt;p&gt;Tonight while building a new workstation, I needed to update the &lt;span class="caps"&gt;BIOS&lt;/span&gt;
on the motherboard, a &lt;a href="http://www.tyan.com/products/html/tomcatk8e.html"&gt;Tyan Tomcat
&lt;span class="caps"&gt;K8E&lt;/span&gt;&lt;/a&gt;.  Tyan, however,
offers only floppy-based &lt;span class="caps"&gt;BIOS&lt;/span&gt; flashing software to do the job.  Worse,
the software requires me to boot into &lt;span class="caps"&gt;DOS&lt;/span&gt; first, using a &lt;span class="caps"&gt;DOS&lt;/span&gt; boot
floppy that is neither provided nor lying around the office (I&amp;#8217;m
a Linux guy).&lt;/p&gt;


	&lt;p&gt;One more thing: it turns out that my new floppy drive is junk.&lt;/p&gt;


	&lt;p&gt;Thus we arrive at tonight&amp;#8217;s problem:  &lt;em&gt;If you do not have a floppy drive, how can you flash a motherboard&amp;#8217;s &lt;span class="caps"&gt;BIOS&lt;/span&gt; when its manufacturer provides only a &lt;span class="caps"&gt;DOS&lt;/span&gt;-floppy-based &lt;span class="caps"&gt;BIOS&lt;/span&gt; flasher?&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;Fortunately, the problem can be solved.  In case &lt;em&gt;you&lt;/em&gt; ever need
the solution, here it is.&lt;/p&gt;


&lt;div style="border: solid 1px red; margin: 1em; padding: 1em;"&gt;
&lt;strong&gt;Disclaimer:&lt;/strong&gt;  This recipe worked fine for me, but might not for you.  If you follow these instructions, you do so at your own risk and assume all responsibility for whatever happens, even if your computer catches on fire or your pants explode.  You have been warned.
&lt;/div&gt;

	&lt;p&gt;First, download a bootable floppy image from the &lt;a href="http://www.freedos.org/"&gt;FreeDOS
Project&lt;/a&gt;.  The one you want is the &lt;a href="http://odin.fdos.org/odin2005/odin2880.img"&gt;2.88-MB
&lt;span class="caps"&gt;ODIN&lt;/span&gt; image&lt;/a&gt; because it has
about 1.5 MB of free space, enough to hold the contents of the &lt;span class="caps"&gt;BIOS&lt;/span&gt;
flasher&amp;#8217;s floppy.&lt;/p&gt;


	&lt;p&gt;Second, mount the floppy image so that you can edit it:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;mkdir /tmp/image
mount -o loop /path/to/odin2880.img /tmp/image
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Third, copy the &lt;span class="caps"&gt;BIOS&lt;/span&gt; flasher and associated files into the mounted
floppy image.  I just unziped Tyan&amp;#8217;s archive directly into
the image:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;unzip /tmp/tyan_2865_301.zip -d /tmp/image
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Fourth, unmount the image.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;umount -d /tmp/image
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Fifth, create a bootable CD-ROM from the floppy image.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;cd /tmp
mkdir boot_cd
mv /path/to/odin2880.img boot_cd
mkisofs -o odin-cdrom.img -b odin2880.img -c boot.catalog boot_cd
cdrecord -v -eject odin-cdrom.img
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Finally, reboot your PC using the CD-ROM and flash away!  (Note:  If FreeDOS asks, you don&amp;#8217;t want to use extended memory or anything like that because &lt;span class="caps"&gt;BIOS&lt;/span&gt; flashers don&amp;#8217;t like it.  You want old 8086-style
unprotected memory.)&lt;/p&gt;</description>
      <pubDate>Fri, 17 Feb 2006 02:23:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7afcd8064a6e0f2fd7f3c8da8eb6dbc5</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2006/02/17/how-to-flash-your-bios-when-you-dont-have-a-floppy-drive</link>
      <category>hardware</category>
      <category>hacks</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/54</trackback:ping>
    </item>
    <item>
      <title>My new Radio VCR</title>
      <description>&lt;p&gt;I like to listen to &lt;a href="http://www.npr.org/"&gt;&lt;span class="caps"&gt;NPR&lt;/span&gt;&lt;/a&gt;, but I often miss interesting shows. So I decided to make a &lt;span class="caps"&gt;VCR&lt;/span&gt; for radio. That way I can record shows and listen to them at my leisure.&lt;/p&gt;


	&lt;p&gt;I started by taking an old radio and connecting its headphone output to one of my server&amp;#8217;s audio-in jacks w/ a 6-foot 1/8&amp;#8221; Stereo plug to 1/8&amp;#8221; Stereo plug Cord from Radio Shack. Then I installed the &lt;a href="http://www.alsa-project.org/"&gt;Advanced Linux Sound Architecture&lt;/a&gt; on the server because it has better support for the server&amp;#8217;s built-in audio chip (CS4236B).&lt;/p&gt;


	&lt;p&gt;Playing around for a while, I managed to get decent recordings to &lt;span class="caps"&gt;WAV&lt;/span&gt; format. Since WAVs are rather large (about 200 MB/hr at the settings I was using) I tried re-encoding the recordings as Ogg Vorbis in various bitrates, but ultimately settled on &lt;a href="http://www.speex.org/"&gt;Speex&lt;/a&gt;, which is much better at compressing speech. Final file sizes are about 10 MB/hr, which is fine considering my hard-drive space.&lt;/p&gt;


	&lt;p&gt;Next, I wrote a small shell script to record a show, compress it, and store it in a library:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;#!/bin/bash

# Simple script to record a radio show and save as a Speex-encoded file
# Tom Moertel &amp;lt;tom@moertel.com&amp;gt;
# 20 Feb 2004
#
# Usage: record-show &amp;lt;show-name&amp;gt; &amp;lt;show-duration-in-seconds&amp;gt;

#
# Recordings are saved in the following directory structure:
#
# ~/recordings/&amp;lt;show-name&amp;gt;/2004/02/&amp;lt;show-name&amp;gt;--2004-02-19--Thu--2359.spx
#
# Directories are created as needed.

# Check arguments.

if [ -z "$1" ]; then
    echo 'Usage: record-show show-name show-duration-in-seconds'
    exit 1;
fi

# Set up definitions for use later

show_base="$HOME/recordings" 
show="${1:-recording}" 
duration="${2:-3600}" 
year=$(date +%Y)
month=$(date +%m)
now="$(date +%F--%a--%H%M)" 
showdir="$show_base/$show/$year/$month" 
showfile="$showdir/$show--$now.spx" 

# Make directory to contain the show recording (if necessary)

mkdir -p "$showdir" &amp;gt;&amp;#38;/dev/null

# Record the show and exit with the exit status of speexenc

arecord -q -d $duration -c2 -r16000 -f S16_LE |
  speexenc --vbr --vad --dtx - "$showfile" &amp;gt;&amp;#38;/dev/null
exit $?
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Finally, I programmed my &amp;#8220;Radio &lt;span class="caps"&gt;VCR&lt;/span&gt;&amp;#8221; to record any potentially interesting shows that are broadcast by my local &lt;span class="caps"&gt;NPR&lt;/span&gt; affiliate. This was simple using my script above and the following crontab:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;00 06 * * 1-5           record-show morning-edition         3600
00 12 * * 1-5           record-show day-to-day              3600
00 15 * * 1-5           record-show fresh-air               3600
00 17 * * 1-5,6-7       record-show all-things-considered   3600
30 18 * * 1-5           record-show marketplace             1800

00 08 * *     6-7       record-show weekend-edition         3600
00 10 * *     6         record-show car-talk                3600
00 10 * *       7       record-show studio-360              3600
00 11 * *     6         record-show whad-ya-know            7190
00 13 * *     6         record-show wait-wait-dont-tell-me  3600
00 15 * *       7       record-show this-american-life      3600
00 16 * *       7       record-show splendid-table          3600
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;All in all, this has turned out to be a great hack &amp;#8211; simple, fun, &lt;em&gt;and&lt;/em&gt; useful.&lt;/p&gt;</description>
      <pubDate>Fri, 20 Feb 2004 12:00:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:2a9de8f2d4f2bf5d9a4ff4a40e9f9340</guid>
      <author>Tom Moertel</author>
      <link>http://blog.moertel.com/articles/2004/02/20/my-new-radio-vcr</link>
      <category>hacks</category>
      <trackback:ping>http://blog.moertel.com/articles/trackback/37</trackback:ping>
    </item>
  </channel>
</rss>
