Site Map - skip to main content - dyslexic font - mobile - text - print

Hacker Public Radio

Your ideas, projects, opinions - podcasted.

New episodes Monday through Friday.


Jon Kulp

Host Image
Host ID: 238

Music professor, open-source software enthusiast, Lafayette, LA.

episodes: 77

hpr2759 :: Cleaning the Potentiometers on a Peavey Bandit 65

Released on 2019-02-28 under a CC-BY-SA license.

Since my daughter has been learning a bit of guitar in the last several months, I've actually gotten my old electric guitar and amplifier back out again after many years in the closet. The amp is a Peavey Bandit 65, which was a an affordable solid-state workhorse kind of amp back in the mid-80s and I've had it since it was new. In this episode I talk through the process of removing the brains of the amp and cleaning the potentiometers to try to get rid of some of the static that's happening when I turn the knobs. I also discover belatedly that the reason I was not getting any distortion when I turned the saturation up was that the amp was stuck on the clean channel — shows how long it's been since I used the amp, I kind of forgot how the thing works!

Click image below to view photo gallery

Peavey Bandit 65 Cleaning



hpr2737 :: My Pioneer RT-707 Reel-to-Reel Tape Deck

Released on 2019-01-29 under a CC-BY-SA license.

I've had this Pioneer RT-707 reel-to-reel tape deck for something like 10 years, but only recently started using it with enthusiasm. In this episode I talk about the tape deck, about the technology, and about my memories of using this kind of audio tape as a kid. I demonstrate playback of one of my parents' mix tapes, and I also used this machine to record the last few minutes of the podcast onto a reel to reel tape, which of course I then had to transfer back to digital before submitting the show.

Click image below to see a photo album relating to the tape deck.

Pioneer Reel-to-Reel Tape Deck

Tape deck in action (video)

hpr2614 :: My 1948 Truetone D1835 Tube Radio

Released on 2018-08-09 under a CC-BY-SA license.

The 1948 Truetone D1835 Tube Radio

I recently bought a vintage tube powered radio at an estate sale and in this episode I talk about it and let you hear it. Click the image to view my Flickr pictures.

1948 Truetone Tube Radio

Watch A video showing the radio in action!

hpr2604 :: Restoration of a Fasco L55A Hassock Fan

Released on 2018-07-26 under a CC-BY-SA license.

The Fasco L55A Hassock Fan

Click the image to view my Flickr slideshow of the restoration process.

Fasco L55A Hassock Fan Restoration

A video showing my restored fan in action!


hpr2597 :: How to Fix a Remote with Buttons that Don't Work

Released on 2018-07-17 under a CC-BY-SA license.

After listening to Ken Fallon’s episode about how to check whether your remote is working or not, I checked one of our remotes that had been giving us problems and found that only a couple of the buttons produced the light. Then I found a video on YouTube showing how to fix non-working buttons and this is my report.

hpr2589 :: Saving Money: a response to Klaatu's Personal Finance Series

Released on 2018-07-05 under a CC-BY-SA license.


hpr2354 :: Night Sounds in Rural Tennessee

Released on 2017-08-10 under a CC-BY-SA license.

Upon arriving at my parents' house tonight, I was struck anew by the incredible sounds of wildlife where they live in the woods. I decided to record and share with the HPR audience.

hpr2337 :: The Kobo Aura eReader

Released on 2017-07-18 under a CC-BY-SA license.

I recently acquired a refurbished Kobo Aura e-book reader. This episode is a brief review.


hpr2309 :: Crowdsourcing Accessibility

Released on 2017-06-08 under a CC-BY-SA license.

In order to meet basic accessibility standards, I need to have text alternatives to the audio of my online video lectures for my music appreciation class. I have a transcription tool called Dragon Dictate that can do most of the heavy lifting as far as getting a raw transcript of the audio, but the transcription it generates needs a lot of attention in terms of correction, capitalization, and punctuation. It also needs to have all of the text separated into logical paragraphs and it really helps to have proper section headings.

There are 20 lectures in all, and I have finished doing 11 of them, but I still have nine to go and no time to do it. I had an idea to crowdsource this effort by giving extra-credit points to my students for doing little bits of it at a time. They get one extra-credit point for every one minute of lecture that they correct.

I got the idea for this from the Distributed Proofreaders project, where volunteers work to help correct any mistakes that are found in the OCR scans of public-domain books before being posted on a website like Project Gutenberg. So far I've gotten about 30 minutes of lecture transcripts corrected by students who needed extra credit, and I have high hopes that we will finish the project either this summer or next fall.

One excellent tool that I found while I was figuring out how to handle this project logistically is the Linux command line tool called mp3splt. I use this tool to cut the long lecture files up into one-minute segments like so:

mp3splt -t 1.0.0 L13audio.mp3

I also wrote my own script that will generate an HTML page with individual audio players for all of these one-minute audio files so that students can very easily choose an audio file to work on that is exactly one minute long. The script also pushes all of the audio files over to my server after creating ogg versions of the mp3s using mp32ogg.

url='' page=$(pwd)/$(basename $(pwd))_page.html LESSON=$(ls *.mp3 |head -n1 | sed -e 's/audio.*$//') cat >> $page <<EOFtop <h2><a href="$LESSON.html">RAW TRANSCRIPT HERE</a></h2> EOFtop for i in *.mp3; do stem=$(basename $i .mp3) mp32ogg $i sleep .2 cat >> $page <<EOF <h3>File: "$i"</h3> <div class="centered"> <audio controls> <source src="$url/$stem.mp3" type="audio/mpeg"> <source src="$url/$stem.ogg" type="audio/ogg"> </audio> </div> EOF done scp *.ogg servername:~/path/to/filedir/ sleep 1 scp *.mp3 servername:~/path/to/filedir/ #sleep 1 scp $page servername:~/path/to/filedir/


  • Bloviate: to speak or write verbosely and windily—pundits bloviating on the radio

hpr2259 :: Minidiscs: A Response to HPR 2212

Released on 2017-03-30 under a CC-BY-SA license.

This is a walking-and-talking response to hpr2212 (meanderings Cyberpunk and the Minidisc, The Cyberpunk history of the Sony Minidisc, hosted by Quvmoh on 2017-01-24) with my own uses and recollections of this awesome legacy medium.

Video about my USB power supply hack:


hpr2214 :: Upgrading Vehicle Lights From Halogen to LED

Released on 2017-01-26 under a CC-BY-SA license.

This episode is about the process of upgrading halogen vehicle lights to LED. I did this on my pickup truck for the interior dome light, the brake lights, the third brake light, front and back turn signal lights, the backup lights, and also for the license plate lights. While I'm talking about this process, I also install new LED brake light bulbs on our Honda CR-V. I almost forgot to talk about the necessity of installing resistors to handle the problem of hyperflashing with the blinker lights.

Click on the image below to view the photo album associated with this podcast.

LED Vehicle Light Upgrades


hpr2209 :: Calibre eBook Server

Released on 2017-01-19 under a CC-BY-SA license.

You can share your Calibre ebook library by running the calibre-server daemon, either from your desktop machine or on a server that is available on your local network. (Or, if you have it set up that way, it can be outward-facing to the wide world.)

To share your library from the desktop Calibre application, choose Connect/share from the menu at the top of the window, then choose Start Content Server. Make a note of the IP address and port, and then you can use other devices on your network to access the library at that address. Normally I use the "Get Books" function of the Marvin ebook app on my iPad, or else the "Experimental Browser" on my Kindle and download the books directly to the devices. On my Android phone, I use the Chrome browser and then long press on the link to an Epub file, choose to save to device, and then open it using FBreader.

To share the library from your GNU/Linux server, you'll have to install Calibre on the server and then put a copy of your ebook Library on the server as well. To start and stop the server daemon, you need to put a service startup script in the /etc/init.d directory with all of the other system startup scripts. An example is given below—fill in with the appropriate paths and user data for your setup. (See the calibre-server user manual for a full list of options and their descriptions.) When the script is in place and has executable permissions, you start and stop the service as follows (as root):

service calibre-server start|stop|restart

Service Startup Script


USER=<run_as_user>        # run daemon as this user
LOGIN=<end_user_username> # to log into library (optional)
PW=<password>             # to log into library (optional)

start() {
        echo "Starting Calibre server..."
        su -c "calibre-server --with-library=\"$CALIBRE_LIBRARY_PATH\" --username=$LOGIN --password=$PW -p $PORT --pidfile=$PIDFILE --daemonize" & 
        if [ $? -ne 0 ]; then
                echo "Could not start calibre-server."

stop() {
        echo "Stopping Calibre server..."
        if [ -e $PIDFILE ]; then
                read PID < $PIDFILE
                ps aux | grep "$PID" | grep 'calibre-server' > /dev/null
                if [ $RUNNING -eq 0 ]; then
                        kill $PID
                        if [ $? -eq 0 ]; then
                                rm $PIDFILE
                        echo "Could not find a calibre-server process with PID $PID."
                echo "Could not find pidfile: $PIDFILE"

restart() {

status() {
        if [ -e $PIDFILE ]; then
                read PID < $PIDFILE
                echo "calibre-server is running with PID $PID."
                echo "calibre-server is not running."

unknown() {
        echo "Unrecognized command: $1"
        echo "Try one of the following: (start|stop|restart|status)"

case $1 in
        start ) 
        stop )
        restart )
        status )
        * )


  • Calibre ebook Management Software
  • Marvin ebook app for iOS
  • FBreader open-source multi-platform ebook reader.

hpr2199 :: Replacing the Throttle Position Sensor on My Truck

Released on 2017-01-05 under a CC-BY-SA license.

When the "check engine" light came on in my truck again, it turned out to be the throttle position sensor just like when I very first bought the truck about a year-and-a-half ago. That time, I was able to fix it by spraying contact cleaner on it, but this time that didn't work. I ordered a new part. In this episode I talk while I replace the part and I also talk about the nifty diagnostic tool that I used to get the trouble code and how it sends the information to your smartphone.

Throttle Position Sensor Pics

What you can gather with the torque diagnostic tool for Android:

  • View live OBD engine data on your Android phone - Connect to your vehicle ECU
  • Fully customisable dashboard screens - Design your own layouts and custom dials, use your own themes
  • Retrieve Fault Codes (DTCs) and clear Check Engine lights - View fault descriptions using the built-in databases
  • Upload live OBD2 data to your webserver or the torque web viewer in realtime
  • Check the performance of your vehicle with BHP / Torque / 0-60 & Quarter Mile widgets


hpr2154 :: Replacing a Bicycle Brake Cable

Released on 2016-11-03 under a CC-BY-SA license.

Part of my series of fixing stuff and wearing a microphone while I do it, listen along as I replace the brake cable and housing on my bicycle. For information about the tools I'm using, check out my earlier episode about the tools in my bicycle repair toolbox. Check the Flickr photo album below for pictures to go along with the narrative. Sorry I kept sniffling so much. Allergies were terrible. The church bells in the background are from Our Lady of Fatima Church, which is nearby. I remember Dave wondered about the church bells from a previous episode.

Bicycle Brake Cable Replacement


hpr2124 :: Repairing a Cloth Shopping Bag with a Sewing Machine

Released on 2016-09-22 under a CC-BY-SA license.

In this episode I repair one of the straps/handles of a cloth shopping bag. I talk about using a sewing machine, about those dreadful bobbins, and about sewing a Halloween costume one time. I actually cut out about four or five minutes of near silence from when I was trying to get the thread to go through the needle. That's getting much harder to do as I get older. See the Pictures too.

Shopping Bag Repair

hpr2119 :: Making Chocolate Chip Cookies

Released on 2016-09-15 under a CC-BY-SA license.

Baking Cookies

The $250 Cookie Recipe


1 cup butter
1 cup sugar
1 cup brown sugar
1 tsp. vanilla
2 eggs
2 cups flour
1 tsp. soda
1 tsp. baking powder
2½ cups blended oatmeal
½ tsp. salt
12 oz. chocolate chips
1½ cups chopped nuts (your choice)


Cream the butter and both sugars. Add eggs and vanilla. Mix dry ingredients together in separate bowl. Combine with the butter/sugar/egg mixture. Add chocolate chips. Roll into balls and place 2 inches apart on a cookie sheet.

Bake for 10–12 minutes at 375°F.


hpr2110 :: Overhauling a Bicycle Hub

Released on 2016-09-02 under a CC-BY-SA license.

I record and talk while overhauling the rear hub of my 1985 Schwinn road bike. I wasn’t able to take pictures because my hands were really greasy, so if this interests you and you want to see how it’s done, search the web or YouTube for instructional materials. This episode was recorded on my phone with the $2 lapel microphone, uploaded straight to the HPR website. Easy!

hpr2108 :: Changing the Oil on My Wife's Car

Released on 2016-08-31 under a CC-BY-SA license.

Since people don’t seem to be adding enough shows, you’re going to be subjected to listening along while I change the oil on the car. This might be fascinating or it might be boring, but in either case I hope it inspires someone else to start uploading more shows. Incidentally, I recorded this whole thing on my phone, I’m doing these show notes on my phone, and am going to upload it from my phone as well, without adding the intro and outro music, showing just how easy it really is (as the saying goes).

hpr2107 :: Makefiles for Everyday Use

Released on 2016-08-30 under a CC-BY-SA license.

In this episode I talk about how I use Makefiles to ease the process of building complicated projects in Lilypond and HTML. You can use Makefiles to run any kinds of commands you want. It does not have to be building actual computer programs. In my case I use them to build musical scores and web pages. Keep in mind I'm not an expert on this, and I'm hoping I will make enough mistakes that it will prompt a series of follow-up episodes by people who actually know what they're talking about.

Here's an example. This is the Makefile for my Counterpoint workbook Gratis ad Parnassum, which I wrote in 2009. Written in a combination of LaTeX and Lilypond, this requires very complicated and long commands to build the workbook, and I found that the only way to do this project in a sane manner was to create a Makefile that would keep track of changes in the files and only rebuild when necessary. It also meant that the only commands I would have to type were very simple, because the long command line options were all stored in the Makefile.

LILYBOOK_PDF=lilypond-book --output=$(OUTDIR) --pdf $(FILE).lytex
LILYBOOK_HTML=lilypond-book --output=$(WEBDIR) $(FILE).lytex
PDF=cd $(OUTDIR) && pdflatex $(FILE)
HTML=cd $(WEBDIR) && latex2html $(FILE)
INDEX=cd $(OUTDIR) && makeindex $(FILE)
PREVIEW=$(VIEWER) $(OUTDIR)/$(FILE).pdf >& /dev/null

all: pdf web


cp -R $(WEBDIR)/$(FILE)/ ./
sleep 1
$(BROWSER) $(FILE)/index.html &

keep: pdf
cp $(OUTDIR)/$(FILE).pdf gratis.pdf
pdftk gratis.pdf update_info output GratisAdParnassum.pdf

rm -rf $(OUTDIR)

rm -rf $(WEBDIR)

tar -cvvf free-counterpoint.tar \
--exclude=out/* \
--exclude=*.tar \
--exclude=*.zip \
--exclude=htmlout/* \
--exclude=workbook_main/* \
--exclude=*midi \
--exclude=*pdf \
--exclude=*~ \
tar -xvvf free-counterpoint.tar
zip -r FreeCounterpoint
rm -R FreeCounterpoint

And here is the Makefile for my song collection called Canciones para niños, using Lilypond source files.

piece = lorca
#CPU_CORES=`cat /proc/cpuinfo | grep -m1 "cpu cores" | sed s/".*: "//`
LILY_CMD = lilypond -ddelete-intermediate-files \
                    -dno-point-and-click #-djob-count=$(CPU_CORES)

notes = \
cancioncilla.ily \
cantada.ily \
caracola.ily \
china.ily \
lagarto.ily \
nana.ily \
paisaje.ily \

.SUFFIXES: .ly .ily .pdf .midi

#CURDIR = $(shell pwd)
VPATH = $(CURDIR)/Scores $(CURDIR)/PDF $(CURDIR)/Parts $(CURDIR)/Notes %.ily
%.pdf %.midi: 
$(LILY_CMD) $<
mv *.pdf PDF/
mv *.midi MIDI/

$(piece).pdf: $(notes) 

cancioncilla.pdf: cancioncilla.ily
cantada.pdf: cantada.ily
caracola.pdf: caracola.ily
china.pdf: china.ily
lagarto.pdf: lagarto.ily
nana.pdf: nana.ily
paisaje.pdf: paisaje.ily
remanso.pdf: remanso.ily

.PHONY: score
score: $(piece).pdf

keep: score
cp $(CURDIR)/PDF/$(piece).pdf $(CURDIR)/CancionesParaNinos.pdf

tar -cvvf lorca.tar \
--exclude=*.pdf \
--exclude=*.midi \
--exclude=*~ \
tar -xvvf lorca.tar
zip -r Canciones
rm -R Canciones


hpr2094 :: Custom Keystrokes for Desktop Navigation on Gnome

Released on 2016-08-11 under a CC-BY-SA license.

In this episode I talk about how to set up custom keystrokes so that you can launch or switch to applications easily using the super key on your keyboard. I do this on the classic Gnome desktop environment and have not tested it on Gnome 3 or Unity to see whether it works on those.

To create a new custom keystroke, open System Settings, then go to Keyboard and Shortcuts. Click on the plus sign to open the dialog box where you specify the name of the keystroke and the command that is to be launched when the keystroke is executed. Click "Apply" and then click "Disabled" and it will allow you to type the keystroke you want to use.

At this point the keystroke configuration is ready, but you have to either log out of the current session and log back in, or find some other way to reload the desktop environment configuration before you can actually use the keystroke.

I also talked about how I use my own scripts to check to see whether a program is running, and then either switch to that program if it's running or launch it if it's not. Here is an example for launching or switching to LibreOffice.


# Look for the string "LibreOffice" on the list of 
# window titles and check the return code

checktitle=$(wmctrl -l | grep "LibreOffice" &> /dev/null ; echo $?)

# If the return code is 0 that means it found the 
# string, so I use wmctrl to switch to the window 
# that has that string in the title. 

if [ $checktitle == 0 ] ; then
    wmctrl -a "LibreOffice"
# If it returns a 1, then that means it did not 
# find a window with that string in it so I 
# launch the application.
    loffice &

Save the script somewhere in your PATH, make it executable, and then use the script name in the command when you're setting up the keystroke.

hpr2084 :: Cleaning the Throttle Body on My Pickup Truck

Released on 2016-07-28 under a CC-BY-SA license.

In this episode I take you along for the ride as I do a little bit of maintenance on my pickup truck. I've been trying to track down the source of of a rough idling problem that sometimes turns into stalling out. I already replaced the fuel filter (did not solve the rough idling problem but probably was due anyway), and here I make an audio recording as I clean the throttle body, which apparently is one of the first things you should do when your vehicle is idling roughly and stalling out. Still not sure if I have totally fixed it but it seems to run OK so at least I did not mess it up any worse.

Throttle body photos for HPR


hpr2069 :: Counting Stuff in LibreOffice Calc

Released on 2016-07-07 under a CC-BY-SA license.

When I took over as Director of the School of Music in January, one of the first things I did was to try to get a better handle on the number of faculty I had at various ranks, how many had terminal degrees, how many already had tenure, how many were on tenure track, how many held endowed professorships, and so forth. Somewhere in the process, I discovered a handy trick for generating reports for this kind of thing. It's the COUNTIF function of LibreOffice calc. In this episode I will go through some examples of ways that I've used COUNTIF to generate reports.


Count occurrences of the string from A6 of current sheet on other sheet Personnel in column K


Count occurrences of explicit string on other sheet "Personnel" in column K


Count greater than or equal to 50


Using SUMPRODUCT, count between range greater than or equal to 40 but less than 50


Look for the string from sheet "Reports," cell A21, in the sheet "Personnel" column U, excluding any rows that have the value "Adjunct" in column K.


hpr2054 :: Blather Configuration Part 1: Desktop Management

Released on 2016-06-16 under a CC-BY-SA license.

Blather Configuration Part 1: Desktop Management

In this episode I show how to start adding more commands, how to use the language updater script, and how to start doing some basic desktop navigation. I'll show you how to open and quit applications, and how to switch from one application to another using your voice.

For information about installing blather for the first time, as well as the startup script that I use, please refer to episode 0 of this series, which has examples and links for this stuff.

To start using the language updater script, you need to move it or copy it from the blather source code directory into your path (e.g. ~/bin/). To add new commands you will have to edit the main command configuration file:


Commands are configured in a "key: value" pair, where the key is what you wish to say, and the value is the command that will be executed when you say it. We will start out with some very basic ones, but these can be as elaborate as your imagination and scripting skills will allow. You can execute built-in system commands, or you can write your own scripts that will be executed upon the voice command.

Here's an example of a basic desktop application command set:

OPEN CHROMIUM: chromium &
GO TO CHROMIUM: wmctrl -a "google chrome"
QUIT CHROMIUM: wmctrl -c "google chrome"

The first command launches Chromium, the second one will switch focus to Chromium when you are currently in another program, and the third one closes Chromium. This makes use of the command line tool wmctrl, which is a very handy window management tool. The wmctrl -a command chooses which window to put focus on (or close) based on the window title, which in the commands above is given in quotation marks. There are many options to how wmctrl can find windows and take actions, but for now we will just use this basic option.

Once you have one command set of this kind working as you like, it's very easy to set up additional command sets for all of the desktop applications you use most often.

Some applications are more difficult to handle than others. For example media players typically change the window title based on which track is playing. This makes it impossible to use the static window title option above, so I resort to a bit of scripting to help it find the right window to put focus on or close:

OPEN clementine: clementine &
GO TO clementine: rid=$(pgrep clementine -u $(whoami) |head -n 1) && rwinname=$(wmctrl -lp |grep $rid |sed -e "s/.*$rid * //" | sed -e "s/$(hostname) //") && wmctrl -a "$rwinname"

Opening the music player is easy. Switching to it is something else. To make this work I first find the process ID of the Clementine music player, and then I use the wmctrl list command to list all of the windows that are open and I grep for the process ID that I found in the first part. Then I extract the window name from that command's output and use the result inside quotation marks in the very last command to change Focus to that window. Whew!

One last basic desktop navigation command for this episode. This is one that I use probably more than any other command. What it achieves is the alt + Tab Key stroke, which switches Focus to the previous window. Here's how I do it:

BACK FLIP: xdotool key alt+Tab

This makes use of the wonderful xdotool package to execute a virtual keystroke. Magic!


hpr2039 :: Blather Configuration Part 0: Initial Setup

Released on 2016-05-26 under a CC-BY-SA license.

In this episode I walk you through the process of getting the Blather GNU/Linux speech recognition program running for the first time.

Arch: On Arch Linux this is really easy. Jezra made a package build for the AUR so you can just install it that way.

Debian: I wrote an installation script for Debian-based systems that installs the dependencies to build pocketsphinx, plus a few extra packages that I use continually when I'm running blather (xvkbd, xdotool, espeak, wmctrl, elinks, xclip, curl). It builds/installs the Sphinx stuff, pulls the blather source code, and puts some configuration files and a startup script in place for you. This should take care of pretty much all of the heavy lifting.

I refer frequently to Jezra's usage notes on the Blather source code page at gitlab, so if you're trying to install this as I talk, you might want to follow along over there.

The trickiest bit in the initial run is the creation and placement of the language files. I normally use a bash script for this, but on this first episode of the series I'm going to use the web-based lmtool to create the language files, just the way Jezra says to do on his usage page. He also includes my automated language updater script in the blather source code, though, so going forward I will be talking about how to use that script instead of the web-based tool.

Blather Launch Script

I use a bash script to launch Blather because I want to set several environmental variables: location of the pocketsphinx gstreamer libraries, default browser, default text-to-speech engine, and so forth. Having these environmental variables set means that I can use easy-to-remember shortcuts in my blather commands config file. Here is my launch script:


# tell it where the Gstreamer libraries are
export GST_PLUGIN_PATH=/usr/local/lib/gstreamer-0.10

# set some shortcuts to use in the commands file

#export VOICE="/usr/bin/festival --tts"
export VOICE="/usr/bin/espeak"
export CONFIGDIR="/home/$(whoami)/.config/blather"
export KEYPRESS="xvkbd -xsendevent -secure -text"
export BROWSER="chromium-browser"

# add blather script directory to the user's PATH
export PATH="$HOME/bin:/home/$(whoami)/.config/blather/scripts:$PATH"

# start blather in continuous mode with the GTK GUI 
# and a history of 20 recent commands

python2 /home/$(whoami)/code/blather/ -c -i g -H 20



hpr2024 :: Remapping Keys with xmodmap

Released on 2016-05-05 under a CC-BY-SA license.

In this episode I talk about how I tried to implement an idea that my son had when we were talking one day. I was complaining about file names with spaces in them, and he asked what if the computer automatically changed the spacebar so that it made underscores whenever somebody was trying to save a file? I thought this was a great idea. I even thought of a way implement it, though not quite as magically as he had envisioned. My solution involves the use of the command-line tools xev and xmodmap, and one blather voice prompt to launch the xmodmap command that will remap the spacebar to make underscores instead. Maybe somebody a whole lot smarter than me can figure out how to make this happen automatically whenever a save dialog box is open.

First you need to find the keycode for your spacebar. Run the xev command and then press the spacebar to see which key code it is. Here's the output on my laptop:

KeyPress event, serial 48, synthetic NO, window 0x4e00001,
    root 0xc0, subw 0x0, time 116149126, (-739,-226), root:(448,358),
    state 0x0, keycode 65 (keysym 0x20, space), same_screen YES,
    XLookupString gives 1 bytes: (20) " "
    XmbLookupString gives 1 bytes: (20) " "
    XFilterEvent returns: False

As you can see, my spacebar has the keycode of "65." Now we use xmodmap to reassign keycode 65 to make underscores:

xmodmap -e "keycode 65 = underscore"

Now to test it out. While xev is running, press spacebar. Notice that now when the spacebar is pressed it makes an underscore:

KeyPress event, serial 57, synthetic NO, window 0x2600001,
    root 0xc0, subw 0x0, time 116190619, (-520,-247), root:(667,337),
    state 0x0, keycode 65 (keysym 0x5f, underscore), same_screen YES,
    XLookupString gives 1 bytes: (5f) "_"
    XmbLookupString gives 1 bytes: (5f) "_"
    XFilterEvent returns: False

And to change it back:

xmodmap -e "keycode 65 = space"

Now whenever I want to change the spacebar to make underscores or switch it back, I speak one of the following commands, which are in my blather configuration file.

MAKE UNDERSCORES: xmodmap -e "keycode 65 = underscore"
MAKE SPACES: xmodmap -e "keycode 65 = space"


  • xmodmap man page: xmodmap is a utility for modifying keymaps and pointer button mappings in X
  • xev man page: use xev print contents of X events

Video Demonstration

hpr1994 :: Truck Repair: Serpentine Belt Replacement

Released on 2016-03-24 under a CC-BY-SA license.

Come along for the ride as I repair my pickup truck. The job is to replace the serpentine belt, idler pulley, and belt tensioner in the hope of getting rid of a very annoying loud chirping sound that was coming from my engine. Even after cutting out the long pauses where I was staring at my engine trying to imagine how I was going to get the belt to go in the indicated pattern, this episode still tops out at about one hour. Be warned. There are several sections where you're just kind of listening along to sounds of nature as I work.

Here's the instructional video I watched to learn how to do it:


hpr1979 :: How to Make Perfect Steel-Cut Oats

Released on 2016-03-03 under a CC-BY-SA license.

How to Make Perfect Steel-Cut Oats

Steel-Cut oats are amazingly good—delicious and nutritious—but they're kind of a pain to cook because they're so hard and require so much simmering. It can take up to 30 minutes to cook them on the stove top and you have to stir constantly to make sure they don't boil over or stick to the pan. I tried doing them in a rice maker and in the microwave, neither of which turned out well. Then I tried the slow cooker and found that this is the perfect way to make steel-cut oats exactly right every time with hardly any effort.


  • Steel-cut oats
  • Water (4-to-1 water-to-oats ratio)
  • Salt (¼ teaspoon for each ¼ c. oats)
  • Pure maple syrup to taste
  • Butter to taste


Just put all the ingredients in the slow cooker and cook on 200 degrees Fahrenheit for about 4 hours. The water and oats should be combined in a 4 to 1 ratio. When I make this using American measurements, I used 1 Cup water for each ¼ cup of oats. In the metric system this is about 240 ml water for each 40 grams of oats.


hpr1954 :: Grandpa Shows Us How to Turn Custom Pens

Released on 2016-01-28 under a CC-BY-SA license.

Grandpa Shows Us How to Turn Custom Pens on a Lathe

Warning: this show is kind of long, even though I cut out about half of the original raw audio. While my parents were visiting during the holidays, my dad taught me, the wife, and the kids how to turn pens on his mini lathe. We made a few mechanical pencils, a pen and I also made a giant workshop pencil. Click on the image below to look at the gallery of photos on Flickr.

Pen Turning

[my wife's lovely mechanical pencil]



hpr1949 :: The Kindle/Kobo Open Reader (KOReader)

Released on 2016-01-21 under a CC-BY-SA license.

In this episode I talk about installing an alternate ebook reader app on your Kindle paperwhite. The one I'm using is called the Kindle/Kobo Open Reader (KOReader), and it has many features that the stock Kindle reader does not have:

  • Epub support
  • Word-breaking hyphenation
  • PDF reflow
  • Take screenshot with diagonal swipe
  • Export highlights to Evernote
  • Fills more screen space
  • User-installed fonts

How to get it running:

  • Jailbreak your Kindle, refer to this post. Jailbreaking doesn't give you any new programs. What it does is unlock the potential of the device and allows you to install different launchers and applications.
  • Install alternate launcher, such as KUAL, the Kindle Unified Application Launcher. This is a framework that allows developers to create menu items that will launch applications on a jailbroken Kindle.
  • Install KOreader. Instructions
  • Install Dictionary files for whatever languages you want to have (optional)
  • install Tesseract language data (optional)

You can allow KOreader to take over styling of whatever book you're reading. If you don't like the style rules it applies, you can hack the epub CSS file located here: /koreader/data/epub.css


hpr1939 :: Collating Pages with pdftk

Released on 2016-01-07 under a CC-BY-SA license.

I'm moving into my new office at work, and among many things I had to move are file boxes full of old class notes from graduate school. The academic hoarder in me doesn't want to recycle them—I might need these things again! I'm scanning.

I've inherited an excellent scanner/copier with a feeder that lets you scan stacks of pages with one click. This works great for single-sided documents, but most of my handwritten notes are double-sided. I scan one side, then turn the stack over and scan the other side, and I end up with two PDFs for a single stack of pages—one with the front pages and the other with back pages in reverse order. The difficulty is to collate the pages of those two files so that the front and back sides appear in a single PDF in the correct order. Sounds like a job for a shell script!

The script takes two CLI arguments. The first argument is the PDF containing front pages, and the second is the PDF of the back pages.

The first job is take the backsides and reverse the page order, because they were scanned in last-page-to-first. This is very easy with pdftk:

pdftk back.pdf cat end-1 output backfix.pdf

Now that the pages are all in the correct order it's time to collate them. We're going to use the burst function of the PDF toolkit to explode each of the two PDFs into separate pages. After that, we recombine the separate pages in the correct order. The trick is finding a way to do this efficiently. In concept, it's not hard to collate pages in whatever order you want after they've been burst. You simply keep giving pdftk CLI arguments for all of the files you want to combine and then output them as a single file. However, if you have 40 or 50 pages, it's extremely tedious to provide that many CLI args one at a time. This must be automated!

The way I figured out how to do this was to ensure that the burst command would output files that would appear in the correct order automatically when using the ls command inside the working directory. The burst command automatically numbers the output files, but you can specify certain filename formatting parameters if you want to. I chose a format that would begin the filename with the numerical page count in at least three digits with leading zeros (001, 002, etc), followed by an underscore and either the word "front" for the front pages or "reverse" for the back pages.

So here are the burst commands:

pdftk front.pdf burst output %03d_front.pdf
pdftk backfix.pdf burst output %03d_reverse.pdf

At this point a bunch of new files appear, looking something like this:


Notice how the front and back pages all appear in the correct order? Now, instead of typing in the filename for every page, we can use the output of the ls command, filtering out any files not beginning with numbers.

pdftk $(ls |grep ^[0-9]) cat output collated.pdf

And it's done. The entire script loks like this:


# Requires: pdftk

front=$(readlink -f "$1")
back=$(readlink -f "$2")
basedir=$(dirname $front) 
stem=$(basename $back .pdf)
new=$(basename $front .pdf | sed -e 's/[Ff]ront/Combined/')

cd $basedir
pdftk $back cat end-1 output $backfix &> /dev/null
pdftk $front burst output %03d_front.pdf &> /dev/null
pdftk $backfix burst output %03d_reverse.pdf &> /dev/null
pdftk $(ls |grep ^[0-9]) cat output "$new".pdf


hpr1929 :: I Found a Flashlight

Released on 2015-12-24 under a CC-BY-SA license.

I Found a Flashlight

A couple of weeks ago on the way to work I found a flashlight (or a "torch," for those folks across the pond). It was rolling around on the street getting run over by cars and seemingly not suffering any damage as result. As soon as it was safe, I walked out into the street and grabbed it and took it with me. A little poking around online showed me that this was no ordinary device, but a police-grade flashlight.

I contacted the Lafayette Police Department to find out what kind of flashlights they used and whether anyone had reported one missing. Ordinarily when I find something I don't worry about this, but I discovered that this thing cost quite a lot of money—around $125 on Amazon with a retail price of $225—and if a police officer had lost it I certainly didn't want him going into his own pocket to replace it if I could just give it back to him. The police department wrote back to me saying, yes, this was the kind of flashlight that they issued to their officers but no one was missing one. I also asked the University Police and they said they don't normally issue flashlights but that sometimes officers bought their own and no one had reported missing one.

After seeing the amazing build quality and absolutely unbelievable light quality this thing produced, I decided to keep it and so I had to buy a charger to recharge the battery. This cost about $28 and now I'm the proud owner of a Streamlight SL-20L flashlight. This is truly one of the greatest tools I've ever had. Listen to the show to hear me sing its praises!


hpr1909 :: Creating an Open, Embedded-Media Music Textbook

Released on 2015-11-26 under a CC-BY-SA license.

Re-Invigorating the Wheel: Creating an Open, Embedded-Media Music Textbook for the Digital Age

This is a recording of a presentation I gave on November 7th, 2015, at the national joint meeting of the College Music Society (CMS) and the Association for Technology in Music Instruction (ATMI) in Indianapolis, Indiana. I even have some action photos! Click on the first image below to visit the Flickr photo album, which also includes the slides from my presentation.

ATMI 2015 photo Album on Flickr


  • Percy Goetschius. Counterpoint Applied in the Invention, Fugue, Canon and Other Polyphonic Forms. New York: G. Schirmer, 1902. Download
  • ________. Exercises in Elementary Counterpoint. New York: G Schirmer, 1910. Download
  • Kent Kennan. Counterpoint, 4th ed. Englewood Cliffs, NJ: Prentice-Hall, 1999.
  • Jonathan Kulp, Gratis ad Parnassum: A Free Workbook for 18th-Century Counterpoint. Lafayette, LA: [no publisher] 2009. view pdf
  • Friedrich J. Lehmann. A Treatise on Simple Counterpoint in Forty Lessons. New York: G Schirmer, 1907. (This is the one I found on Project Gutenberg that I did not think was suitable as a textbook for my class)

Resources Mentioned

Watch My Workflow:

Serious Nerds Only

Many of the tedious repetitive processes I had to do on image files and audio files are done by bash scripts that are launched by voice commands, as demonstrated in the YouTube video above. The processes I'm talking about are things like renaming files according to my filenaming conventions, putting the files in the right place, resizing images, converting images to different formats, optimizing them for file size, converting audio from MIDI to ogg and mp3, and reducing audio from two channels to one in order to reduce file size. Below are the main tools I use for this, apart from the Linux bash shell itself. If you're interested in actually seeing the scripts I wrote to perform the magic, I am happy to share. Just drop me an email.

  • Calibre command-line tools: these were essential to automate the process of converting the source HTML file into the various versions and eBook formats of the book. Without this I might have thrown up my hands in defeat long ago.
  • ImageMagick: command-line image-manipulation tools
  • sox: command-line audio-manipulation tool, "the Swiss Army knife of sound processing programs."
  • optipng: command-line png optimizer. This is important to keep the book's file size as small as possible.
  • jpegoptim: command-line jpeg optimizer.
  • TiMidity++: an open-source, command-line MIDI-to-WAVE converter and player.
  • LAME: high quality MPEG Audio Layer III (MP3) encoder licensed under the LGPL.
  • oggenc (part of vorbis-tools): Several tools to use, manipulate and create Vorbis files (vorbis is a free audio codec).

hpr1899 :: MyTinyTodo List

Released on 2015-11-12 under a CC-BY-SA license.

This show is about my favorite tool to keep track of stuff I have to do, stuff I want to do, gift ideas for my family, books I want to read, HPR topics to record, etc. It's called MyTinyTodo. It's a web app that you can host on your own server and access from any device that has a web browser.

The website claims that it is already mobile friendly, but I did not like the mobile interface they had, and also did not like the fact that I had to use a different URL to get the mobile interface, so I hacked the stylesheet and the index.html file in the code to make it a responsive design. Now it looks great on all of my devices.


  • Multiple lists
  • Task notes
  • Tags (and tag cloud)
  • Due dates (input format: y-m-d, m/d/y, d.m.y, m/d, d.m)
  • Priority (-1, 0, +1, +2)
  • Different sortings including sort by drag-and-drop
  • Search
  • Password protection

System requirements

  • PHP 5.2.0 or greater;
  • PHP extensions: php_mysql (MySQL version), php_pdo and php_pdo_sqlite (SQLite version).


Setup is very easy as these things go. Check out the installation instructions at their website.

hpr1879 :: Hacking a Belt to Make it Fit

Released on 2015-10-15 under a CC-BY-SA license.

In this episode I talk while I'm performing a belt hack. I bought a belt at Goodwill that is in excellent condition but does not fit me. To make it fit I need to cut off 6.25 inches and then put it back together.

This is the belt as I got it. Notice the very small screws holding the buckle to the belt.

The Buckle

The screws are out, the belt removed from the buckle. You can see here the two holes that accommodate the screws as well as the rectangular notch.

Buckle detached from belt

I've cut off 6.25" from the belt, ready to make the holes and notch in the remaining part.

6.25" cut off

Here I've clamped the part of the belt that I cut off to the remaining part to use as a template for making the holes and the notch.

Hole-and-notch template clamped to the belt

Holes and notch cut in the remaining part of the belt. Doesn't look as nice as the original but it should work.

Holes and notch are cut

All done. Belt is reassembled and I'm wearing it, fits just right!

Perfect fit

hpr1867 :: The Lafayette Public Library Maker Space

Released on 2015-09-29 under a CC-BY-SA license.

The Lafayette Public Library Maker Space

Exterior photograph of the downtown Lafayette Public Library

The Renovated Main Library

Large table with sewing machine

Sewing Area

Display case in maker area with laser etched rolling pin

Rolling pin with laser-etched π symbols

Array of comfy chairs in a circle with a basket of knitting materials nearby

Knitting Area

Triangular table with laptops and tubs of Lego robotics parts

Lego Robotics Space

One of the 3d printers in the maker space

The Ultimaker2

Close up image of the display panel on 3d printer

Trying to print my Kindle paperwhite stand.

The other 3d printer in the maker space

The Taz 3D printer by Lulzbot

The finished Kindle stand:

My new Kindle stand printed using blue filament

It worked! Bad part of this design is that it does not accommodate the case that I have on my Kindle, so to use the stand with the Kindle I'll have to remove the case. The next photo shows my son's nook color sitting sideways on it. I might try to modify the design so that it will accommodate the Kindle with its case and also prop it up a bit more vertically. Still, this was a really fun experiment with my first 3d printout.

Kindle stand holding a Nook Color in landscape position



hpr1854 :: Installing Ubuntu on the Asus TP500L

Released on 2015-09-10 under a CC-BY-SA license.
  1. Getting to BIOS
    1. In Windows, go to Settings
    2. Search for advanced startup options
    3. Follow your nose to Boot to UEFI settings
    4. Can also get there by doing Shift+click on the Restart or Shutdown buttons then clicking through to advanced options until you find "enter setup." Pressing F2 never worked for me
  2. In the BIOS
    1. Security tab: disable "Secure Boot Control"
    2. Boot tab: disable "Fast Boot"
    3. Boot tab: Here Asus support says to enable "launch CSM" (Compatibility Support Mode) but it wouldn't boot from the Ubuntu USB image this way. It worked when I left CSM disabled. I bet CSM works with a Windows or DOS USB.
  3. Plug in USB with Ubuntu image on it
  4. Restart computer and hold ESC key down, forcing windows boot menu to appear
  5. Choose the USB drive to boot from, off you go!


hpr1844 :: The Marantz PMD 660 Professional Solid State Recorder

Released on 2015-08-27 under a CC-BY-SA license.

The Marantz PMD 660 Professional Solid State Recorder

I inherited a really nice audio recorder and microphone from my mother-in-law recently and in this episode I talk all about it and use the new device to record the show.




hpr1839 :: My "New" Used Pickup Truck

Released on 2015-08-20 under a CC-BY-SA license.

My "New" Used Pickup Truck

After 16 years my wife and I decided to become a 2-vehicle family, and as a result I got myself a 2004 Ford Ranger. In this episode I talk about the process of finding and purchasing the truck, and then about some repairs I did and some other stuff related to it.

hpr1834 :: Password Cards

Released on 2015-08-13 under a CC-BY-SA license.

How to Hide a Password Using a Password Card

It's okay to write your password down and keep it in your wallet, but it's best to try to hide it as well. Here's how to keep your password secure and handy at the same time by embedding it in a password card.

Method 1

Generate a fancy symbol-and-color-coded password card at Follow the directions there on how to use it best.

Method 2

Make your own. Use the password generation package pwgen on Linux to generate a whole bunch of random passwords. In the following example, the -s flag tells it you want secure passwords that are generated randomly, not suitable for human memory. The -y flag tells it to include special characters, and 24 indicates how many characters each password should contain.

pwgen -sy 24

Then either use one of the passwords that was generated from this command or embed your own existing password somewhere inside the giant block of gibberish such that only you will know where your password begins and ends. You can put a copy of this in your wallet.


If you want extra security make two columns or increase the character count.

ra;aH5v"}2lF()\;K0f-G;YT 3XGq>wQ6")UvSU#NpYfr,M(h
PCgM%L)O[mra3vgsX{"0rV"0 7>qSluuegS<#;V-nI"uyc$bX
JE+4MxT/[t&i0\(ndpE(z\%@ }ZS\3<xdG1]G%wf9;k6*_94%
FFZ}gR9hyZ=EsC6QgMz:n$=U h&-O+Wz7L8LmehF&znhF8#Ig
p`4C3PN^1F"AmlQe=[pkz<EM /,FOfQtR|"c8EzN8ug?i359=
a%i;X3~g0SqbKM|]#{hReCmP }.#EOVPxCX)b!r_>o@V9J_^9
H-<FAQ4I]SPlX!$o#I?~2ACy -<JE82-'YV@bl;O_>(nxPgVH
PNHYp2_[-q9G?$Z:m?yZiAH. Xj(mZ0,7EabI-TL4-7RWK]n9
HCmiaZV{8EHREpS5Ppi_^SCl DTzK!CkZ#.c<3I;#}A#D(n$c
<koQz[`F99"{/vB~GcSt@n,* :J&*}n~.#F%{ErSs7j:}eyly
=!F:m65sA5utY,<AU\8~Omz2 @P"*SIR/\Ln0H;1JjM7P"{[0
8hk%p-)_3(P>;p.ROtRevNX_ BbwP00-Vq-5:38O.Z9MGom-n
9,txEI%j+'7=7T@?X7^j^*`U ;!R<$|r3(QuJmsZe6}C(7%&s
X]`(;_6S@@<}Ia[&fZ3*naG7 fij5f)Mkp;EDO.CP""*~8{-^
S2_'(C8Fn&[%nJ%`S3&r.N2< *$o\Nrl*vJ0;zq7G3}wtMd0h
%is{8%'^[b$Cu;a5_RYpy]LM k-=7(<\uQ|hQH-m9.WYq6tx+
Vmb&c!$.@P>\`1;1@ln(B#GY eQu\~"L'*xX%_)CTl*}8#2oD
=6I'>(_nIsu=D2J{l4a4tf5x 3/7J1Rm.G.Hwo=Xm=Lv"o}jF
RYV/lC1|t&;!]@4#2r-h<88/ o[B[qZq@;=/MD8hX|nnZ-0$j
5k`x|:.0G{sra@WiuhHr^aU> Dy@Df^op.WCT)3jD(|T,I7E"


hpr1829 :: My "New" Used Kindle DX

Released on 2015-08-06 under a CC-BY-SA license.

I talk about my latest gadget, a used Kindle DX, which is a discontinued model with a 9.7 inch epaper screen. I talk about its features, limitations, how to navigate it, and I demonstrate its text-to-speech capabilities. Incidentally I really low-balled the original price of the Kindle DX. Looking around a little bit, I find that the original retail price was $479, which was then reduced to just under $400. Mine now seems like a bargain at $128 used.

Kindle DX

hpr1824 :: I'm Learning Some Python

Released on 2015-07-30 under a CC-BY-SA license.

I'm Learning Some Python

Lately I'm finally getting around to learning some Python. I wouldn't go as far as to say I'm learning it properly—that's not really my way—I'm kind of poking around in the dark learning things on an "as-needed" basis, but I'm finding that it's incredibly powerful and making me much more efficient in my daily life. In this podcast I discuss some of my favorite ways of using it and some of the cool modules and libraries that I've found that make things surprisingly easy in Python that used to be difficult for me in bash.

What I Use It For

  1. Website build scripts, both for the School of Music and for my personal website. Converted from bash, tested and working fine on Windows and Mac.
  2. Text manipulation scripts, used in conjuction with blather. These do things like change text case, remove spaces, and so forth.
  3. Text entry. Voice commands insert various kinds of text templates or canned email responses for my classes. Also used in conjunction with blather.
  4. Adding or stripping HTML tags to/from selected text.
  5. Getting current weather conditions and forecasts, having results spoken back to me using system text-to-speech engine.
  6. Fun blather commands where I interact with my computer and have it talk back to me.

Favorite Python Modules/Libraries

pyperclipA cross-platform clipboard module for Python. (only handles plain text for now)
pyttsxA Python package supporting common text-to-speech engines on Mac OS X, Windows, and Linux.
bs4HTML parsing library. Beautiful Soup Documentation
htmlminA configurable HTML Minifier with safety features.
smartypantssmartypants is a Python fork of SmartyPants, which easily translates "plain" ASCII punctuation characters into “smart” typographic punctuation HTML entities.
titlecaseChanges all words to Title Caps, and attempts to be clever about SMALL words like a/an/the in the input.
swnamerA name generator that uses Star Wars characters, species and planets to create un fisique names.

Demo Screencasts

hpr1819 :: LibreOffice Tips: Horizontal Lists and Headless Operation

Released on 2015-07-23 under a CC-BY-SA license.

LibreOffice Tips: Horizontal Lists

One of these things is how to create horizontal lists in LibreOffice. This is something that I wanted to do, I think it was maybe a year ago that I was really trying to find out how to do this. What I mean by that is I wanted to be able to do in LibreOffice the equivalent of an in-line list in HTML and CSS. There's a way in CSS to tell the browser to display a series of list items in-line rather than vertically—and this is used all the time for footers and headers and things of that sort—and I wanted to be able to do that in LibreOffice because it would ease the process of creating the exams that I make in my classes, where I have a numbered list for all of the questions, and the answers for each question are also done in a numbered list but at the 2nd level—usually done with a, b, c and d, whereas the numbers of the questions are 1, 2, 3, 4, and so forth. What I wanted to be able to do was have the ordered list a, b, c, d spread out horizontally across the page without having to do it manually. So in other words I wanted to be able to type a word for an answer and then press enter, and instead of having it go into a new line, have it simply move over to the right a little bit with a new letter in place for the next item in the ordered list. I hope it's clear what I'm after here.

Anyway I never did find a way to do this. I searched online and there were a couple of other people who were interested in doing the same thing but they were all told this is impossible. Well, sort of. I found a workaround for this and it's not all that elegant but in a pinch it could work, and I don't think I would want to do it for an entire test but I thought it was kind of a cool way to do it.

So what you do his make up the ordered list just like usual. I have here on my computer right now opened a document with a single question, question no. 1. And then it has at the 2nd level of ordered list a series of 4 options: red, purple, green, and blue. And each one of these is in a font color of the same name, so that the word "Red" is red, the word "Purple" is in purple, "green" is in green. I do this because it makes it easier to see how these things move up and down. There are little buttons down at the bottom of the screen where if you click on the arrow up or the arrow down, it will move the list item up or down. So right now red is in the 1st position, but if I click the down arrow it will go down to the 2nd position and the one that was formally 2nd is now 1st. So purple and red have switched places.

I want to have this kind of flexibility going horizontally as well, and the way I found to do this was to use columns. I select the 4 items and then under the Format menu choose Columns and tell it I want 4 columns because I have 4 items, and I click OK and suddenly these things are distributed across the screen horizontally. Now if I click the up arrow, the item moves left and right!

The bad thing about using columns is that the columns are of uniform width, so they do not dynamically change according to the number of characters that are in the word the way it would do in HTML with CSS.

Headless Operation

To convert a Word .docx file to HTML, run the following command (LibreOffice must not be open in a graphical environment when you try to do this):

libreoffice --headless --convert-to html foobar.docx

To convert the same document to .odt format, run this command.

libreoffice --headless --convert-to odt foobar.docx


hpr1814 :: Custom Context Menus in GNU/Linux GUI File Managers

Released on 2015-07-16 under a CC-BY-SA license.

On Nautilus

On Nautilus you have to put your scripts into the Nautilus scripts folder, which on my system is located here:


You can either put copies of the scripts in there, or you can do like I did and make symlinks from the Nautilus scripts folder to your /home/bin folder. (I prefer to make symlinks instead of copying the files in there, just in case I make any changes to my scripts. If I have made a symlink instead of copying the file, then I only have to change original script and the symlink will automatically use the updated version.) Once you've done that, you right-click on a file and choose scripts then <yourscriptname> to run your script on the file.


On Thunar you don't have to put your scripts anywhere special. It actually handles custom actions much better than Nautilus, in my opinion. What you do is go to the Edit menu and choose Configure custom actions. Then you get a dialog box with two tabs. The first tab is where you can give your custom action a name and then tell it what command to run, and also tell it whether to apply the custom action only to the selected file, to all files in the directory, or to all selected files. On the other tab you choose the context in which this custom action will appear. You can select categories of files—like images, audio files, or text files, and so forth—or you can specify filetypes by extension, so that your custom action will only appear if you right click on a file that has the extension.


hpr1812 :: Headphones and a $2 Microphone

Released on 2015-07-14 under a CC-BY-SA license.

In this episode I use a $2 microphone to record as I walk from home to my office. The topic is the 5 pairs of headphones I have and their various features, qualities, drawbacks, etc.

Headphones Mentioned in Podcast

  • Neewer 3.5mm Hands Free Computer Clip on Mini Lapel Microphone
  • Bose Quiet Comfort 15
  • Sennheiser HD 550A
  • Aftershokz Sportz M2 Bone-Conduction Headphones
  • Sony MDR-J10 H ear headphones with non-slip design
  • Howard Leight 1030110 sync noise-blocking stereo earmuffs

hpr1809 :: My "New" Used Kindle Touch

Released on 2015-07-09 under a CC-BY-SA license.

In this show I talk about why I like to buy stuff used whenever possible, whether it be printers, routers, shirts, books, or my latest acquisition, a used Kindle Touch, which in many ways is much better than my (much newer) Kindle paperwhite. Just for fun, I allow the Kindle Touch itself (using its built-in text-to-speech capabilities) to tell me the ways in which it's better than the Kindle Paperwhite.

hpr1804 :: What's in my Bicycle Repair Tool Box

Released on 2015-07-02 under a CC-BY-SA license.

Tools Mentioned

Unless otherwise stated, all are made by Park Bicycle Tools:

  • SPA-1: Pin Spanner: Green
  • SPA-6: Adjustable Pin Spanner
  • SW-7: Triple Spoke Wrench
  • XLC bike tools crank tool TO-C02 (Crankarm removal tool):
  • SCW-13, SCW-15: 13mm, 15mm Shop Cone Wrenches
  • DCW-1: Double-Ended Cone Wrench
  • FR-1, 2, 5, 6: Freewheel Remover tools
  • BBT-22: Bottom Bracket Tool
  • CN-10: Professional Cable and Housing Cutter
  • Avenir "Third Hand" Cable Puller: 94-27-403 (
  • HCW-5: Crank and Bottom Bracket Wrench
  • CT-3: Chain tool
  • HCW-15: Headset Wrench
  • Ferrules for cable housing
  • Cable End Caps
  • TW-1: Torque Wrench
  • SR-1: Sprocket Remover / Chain Whip
  • Vise Grips (small and large)
  • Adjustable wrenches: 6", 8", 10", 12"

hpr1799 :: Posting From the Command Line on Open Social Networks

Released on 2015-06-25 under a CC-BY-SA license.

Posting From the Command Line on Open Social Networks

You can post to your open social media timelines from the command line using API access. Why would you want to do this?

  • Script automated postings.
  • Bots
  • Post from terminal environments.
  • Post from wherever else you are without having to go to the social media site or to the client that you use to access it.
  • Trigger postings via voice command (what I do).

On GNU Social

Here is the basic format for the command to post a message to a Statusnet / GNU Social timeline:

curl -s --basic --user <username:password> --data status="Hello World" --output /dev/null

And here is the script I use to post a message to my timeline, launched by a blather voice command:


# SN account info

# a place to store the text message 

# Virtual keystrokes to copy selected text to the clipboard
xdotool key Control+c

# pipe text out of clipboard into the text file
xclip -o > $text

# rest for half a sec
sleep .5

curl -s --basic \
--user $user:$pass \
--data status="$(cat "$text")" \
--output /dev/null \ 

rm $text

exit 0


On you have to install the software on your computer. You don't have to be running a server, you just have to have the binaries so that you can run the commands. I will not go into how this is done on this podcast, but there's a link to the website below and there should be installation instructions available there. Once you have the software installed, you also have to allow command-line access to your account and get the token for authentication, maybe authorize the user too:

pump-register-app -s -P 443 -t CLI
pump-authorize -s -P 443 -u username

Finally you can post to your timeline from the command line:

pump-post-note -s -P 443 -p -u username -n "Hello World."

My script to post a message to the timeline, launched by a blather voice command:


# a place to put the text. 

# --------------------------------
# Since markdown is possible, I run 
# the text through markdown to get
# a bit of formatting and save it
# as a separate file 
# --------------------------------

# Virtual keystrokes to copy selected text to the clipboard
xdotool key Control+c

# pipe text out of clipboard into the text file
xclip -o > $text

# run Markdown
markdown $text > $pump

# Post message
pump-post-note -s -P 443 -p -u username -n "$(cat $pump)"

sleep 1

rm $text
rm $pump

exit 0


hpr1794 :: 12-Tone Music and My Random 12 Tone Row of the Day

Released on 2015-06-18 under a CC-BY-SA license.

12-Tone Music (Dodecaphony) and My Random 12 Tone Row of the Day

In this episode I cover a bit of music theory as well as some bash scripting. The topic is the Twelve-Tone System of music composition and the scripting of a random 12-tone row to be generated daily. For a full transcript of the show click here.

randomly generated 12-tone


hpr1789 :: The Ubuntu Quickly Ebook Template and Ebooks in General

Released on 2015-06-11 under a CC-BY-SA license.

Ubuntu Quickly Ebook Template

I recorded this conversation with Mike Hingley about a year ago (12 June 2014) but never released it because I thought the audio didn't sound very good and I didn't feel like editing it at the time. Honestly I forgot all about it until now when the HPR queue is low again. I apologize for the slightly clippy quality of my audio, I must have had my microphone too hot on the mumble. It's really interesting to listen to this conversation a year later because I have worked out so many of the problems that I was mentioning to Mike, including the automation of the entire build process using command-line tools from Calibre.



hpr1784 :: Intro to the Fugue and the Open Well-Tempered Clavier

Released on 2015-06-04 under a CC-BY-SA license.

Intro to the Fugue

This episode of HPR is inspired by the recent release of a new recording by Kimiko Ishizaka of J.S. Bach's Well-Tempered Clavier, Book I. This is a very special recording because it is free and open, licensed to be shared freely forever. The recording was crowdfunded and immediately released with a public license after editing. This allows for legal remixing and sharing, and also makes it perfect for stuff like I do in this episode—cutting the recordings up for inserting as musical examples and then presenting the whole thing for your listening enjoyment.

Full Show Notes

Please see the full show notes for detailed descriptions of the parts of a fugue and a few musical examples as well.


hpr1779 :: Cowsay and Figlet

Released on 2015-05-28 under a CC-BY-SA license.

Basic commands

Make default cow speak:

cowsay "Hacker Public Radio"


< Hacker Public Radio >
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


  • -b Borg mode;
  • -d dead;
  • -g greedy mode;
  • -p causes a state of paranoia to come over the cow;
  • -s makes the cow appear thoroughly stoned;
  • -t yields a tired cow;
  • -w is somewhat the opposite of -t, and initiates wired mode;
  • -y brings on the cow's youthful appearance.

Use "tired" cow mode:

cowsay -t "Ken is tired of begging for shows"


< Ken is tired of begging for shows >
        \   ^__^
         \  (--)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Specify different images with -f

Threaten someone with a dragon:

cowsay -f dragon 'record and upload a show OR ELSE!'


< record and upload a show OR ELSE! >
      \                    / \  //\
       \    |\___/|      /   \//  \\
            /0  0  \__  /    //  | \ \    
           /     /  \/_/    //   |  \  \  
           @_^_@'/   \/_   //    |   \   \ 
           //_^_/     \/_ //     |    \    \
        ( //) |        \///      |     \     \
      ( / /) _|_ /   )  //       |      \     _\
    ( // /) '/,_ _ _/  ( ; -.    |    _ _\.-~        .-~~~^-.
  (( / / )) ,-{        _      `-.|.-~-.           .~         `.
 (( // / ))  '/\      /                 ~-. _ .-~      .-~^-.  \
 (( /// ))      `.   {            }                   /      \  \
  (( / ))     .----~-.\        \-'                 .~         \  `. \^-.
             ///.----..>        \             _ -~             `.  ^-`  ^-_
               ///-._ _ _ _ _ _ _}^ - - - - ~                     ~-- ,.-~

On Linux, praise Ahuka with a Random Cow:

echo 'Ahuka Rocks!' | cowsay -f $(locate *.cow | shuf -n1)

One Result:

< Ahuka Rocks! >
        \    ,-^-.
         \   !oYo!
          \ /./=\.\______
               ##        )\/\
                ||      ||

               Cowth Vader


Make ASCII banner text with figlet. This one uses the default font and wraps the lines at 45 characters:

figlet -w 45 "Hacker Public Radio"


 _   _            _             
| | | | __ _  ___| | _____ _ __ 
| |_| |/ _` |/ __| |/ / _ \ '__|
|  _  | (_| | (__|   <  __/ |   
|_| |_|\__,_|\___|_|\_\___|_|   
 ____        _     _ _      
|  _ \ _   _| |__ | (_) ___ 
| |_) | | | | '_ \| | |/ __|
|  __/| |_| | |_) | | | (__ 
|_|    \__,_|_.__/|_|_|\___|
 ____           _ _       
|  _ \ __ _  __| (_) ___  
| |_) / _` |/ _` | |/ _ \ 
|  _ < (_| | (_| | | (_) |
|_| \_\__,_|\__,_|_|\___/ 

Use an alternate font with -f option:

figlet -f digital "Community News"
+-+-+-+-+-+-+-+-+-+ +-+-+-+-+
|C|o|m|m|u|n|i|t|y| |N|e|w|s|
+-+-+-+-+-+-+-+-+-+ +-+-+-+-+


hpr1774 :: Router Hacking

Released on 2015-05-21 under a CC-BY-SA license.

Router Hacking


  • Flashing a router with alternate firmware


  • Provide additional features
  • Improve performance
  • Privacy (gets rid of unwanted spyware)
  • Fun


How: Steps for My Latest Hack

  1. Find used Netgear WNDR3400 router on shelf at local Goodwill store, priced at $3.99.
  2. Use my smartphone to check the dd-wrt database to see if this router is hackable.
  3. Grin broadly upon seeing the green "Yes" beside router WNDR3400.
  4. Double-check that power supply is included, find an AC outlet and plug in to be sure it powers on and my phone sees its ESSID. Yep and yep.
  5. Take router to cashier and purchase.
  6. Do hard reset of router to clear any previous configuration.
  7. Hook a laptop up to router using ethernet patch cable (turning off WiFi adapter on laptop).
  8. Access router's configuration in web browser at default router address of just to confirm that it works.
  9. Go back to the dd-wrt router database and find the router again, then download the corresponding "mini" and the "mega" versions of dd-wrt firmware (The mega version has the most features—including USB support, which I wanted—but on many routers, including this one, you have to install the mini version first or else you could brick the router)
  10. Read over the dd-wrt wiki page for this specific router just to see if there's anything unusual about the hack. There's not.
  11. Go to the router's stock configuration page again and find the "Firmware upgrade" button.
  12. Click the button and choose the "mini" version of the dd-wrt firmware, and click upgrade, then wait while crossing fingers until it says firmware successfully upgraded.
  13. Refresh the configuration page at and see the new dd-wrt configuration interface.
  14. Pat myself on the back because I have just hacked another router. Hray!
  15. Find the upgrade firmware area on the new dd-wrt interface, and this time choose the "mega" firmware file and submit, then wait and cross fingers as before. Celebrate when it works.
  16. Configure newly hacked router as wireless bridge (this is NOT going to be my main router), enable the USB and printer support, hook up our formerly-usb-only printer to the router, and configure household computers to be able to print wirelessly to the newly-networked printer.
  17. Enjoy kudos from appreciative family.

hpr1771 :: Audacity: Label Tracks

Released on 2015-05-18 under a CC-BY-SA license.

Label Tracks in Audacity

I don't know if I'm ignorant and everyone else already knows about this, but I decided to record a quick show about Audacity "Label Tracks," something I discovered while working on another HPR episode today.

The label track is one of the most useful things I've found in a long time. It allows you to annotate your audio project so that you can quickly see important spots or summarize the contents of whole segments and see at a glance what they are about without hunting all over the place and playing things back, trying to find the part where you were talking about X,Y, or Z. You can also export the labels as a plain text file with exact timestamps. I have not tried this, but according to the documentation you can also use labels to mark the beginnings of separate songs in a long track and export multiple separate files at once from a single source based on the labels.

To add a label track, go to the Tracks menu and select Add New --> Label Track, and it will add the label track to the bottom of your list of tracks. To add a label, either stick the cursor where you want the label to be and press ctrl+b to add text, or select a region to label by clicking and dragging over a region in the label track, then do ctrl+b to start typing the label text.


hpr1770 :: The OpenDyslexic Font

Released on 2015-05-15 under a CC-BY-SA license.

In this episode I talk about how you can take advantage of the OpenDyslexic font as a user, and also how as a content provider you can use it to help your readers. Incidentally, we also talked about this for a while during episode 1418, one of the 2013 New-Year shows.


hpr1769 :: A Demonstration of Dictation Software on my Office Computer

Released on 2015-05-14 under a CC-BY-SA license.

Transcript Performed by Dragon Dictate [dumped "as is"]

Hi everybody! This is John Kulp In Lafayette, Louisiana. I am going to do a rather strange episode today. What I'm doing is demonstrating the dictation software that I use on the office computer that I have here at work. If you listen to my previous episodes, then you have heard me speak of the blather speech recognition program that I use on my Linux desktop, but as you may also remember, blather is not a dictation tool. Blather is a tool where you have to set up commands that will run other commands. In other words, you have to configure everything from scratch. I do have some capabilities for dictation on my Linux desktop, but they involve using the Google Web speech API and a special dictation box that I have set up, and these are not at all good for longform dictation. For serious dictation, such as writing letters and memos and other longform text, you really need a proper dictation tool. These are available built into the operating systems of Windows and Mac OS 10, but I normally use the Dragon naturally speaking software instead. I have found that it is more accurate and more powerful than the built-in versions that you can get on either Windows or Mac. That doesn't mean you shouldn't try out the built-in speech recognition on Windows and Mac, you definitely should, because I think you would be very impressed with him. I know for sure that the version on Windows learns from your voice and from the corrections that you make to the text that you were spoken, and eventually becomes very powerful in recognizing your speech. The biggest problem that I had with the Windows speech recognition was that it was a huge memory hog and frequently brought my system to a grinding halt. This is not good. Blather never does that, but then again bladder cannot take dictation. The latest system that I use for dictation is on a fairly recent Mac Mini running the nuance Dragon Dictate software. This is a very powerful dictation program that learns from your speech patterns and you can also add words to the vocabulary so that it will get them right when it hears them. This is especially important to do if you have frequently used unusual words, such as a name with an alternate spelling from what is normally in the program's dictionary. One of the great things about the Mac Dragon Dictate program, also, is its ability to do transcriptions of audio files. In fact the reason I am speaking this way is that I plan to use the transcription of this recording as the show notes verbatim without any corrections. The difficulty that most people have with dictation software at least initially is doing things like punctuation and capitalization. You have to remember to do these things or else your transcript will come out without any punctuation or capitalization, unless the words that you are speaking are known proper nouns. It also capitalizes automatically at the beginning of the sentences, so that if you use periods frequently then you will have capitalized words after those periods. You can see that I'm having trouble speaking this text in a fluent way, and this is one of the other difficulties that people have when initially using transcription software. It works best when you can express complete thoughts without pausing, because it learns from the context of your words. It has algorithms that calculate the possibility of one word or another based on the context, and so it is much better to speak entire sentences at one than it is to pause while trying to gather your thoughts. This is a major difference from trying to write at the keyboard, where it does not matter at all if you pause for seconds or even minutes while you think of what you want to write next. Anyhow, I highly recommend using some kind of dictation software if you suffer from repetitive strain injuries like I do. This will save you many thousands of keystrokes. Even if it's only using the speech recognition that's available on your phones over the web, that's better than nothing. The disadvantage of any of these services that have to send your recording over the web to get a transcription and then send it back into your device is that they will never learn your voice and your particular speech patterns. In order for that to work best, you really have to use a dedicated standalone speech recognition program that resides locally on your computer and saves your profile and learns from your speaking. Well, I guess that is about it for today, I hope you have enjoyed hearing this brief lesson on dictation. See you next time!




hpr1760 :: pdftk: the PDF Toolkit

Released on 2015-05-01 under a CC-BY-SA license.

Hacking Apart and Re-Assembling PDFs

Extract pages 3–5 from file foobar.pdf:

pdftk foobar.pdf cat 3-5 output excerpt.pdf

Same thing but also grab the cover page:

pdftk foobar.pdf cat 1 3-5 output excerpt.pdf

Combine multiple PDFs:

pdftk file1.pdf file2.pdf file3.pdf cat output combined.pdf

Reassemble a 50-page document with all of the pages in reverse order (I once actually did this for my wife and she was very grateful—she had scanned an article at the library and it ended up with all of the pages in the wrong order from last to first. This command solved her problem in about one second.):

pdftk wrongorder.pdf cat 50-1 output rightorder.pdf

Check the pdftk man page for all kinds of other manipulations you can do, including "bursting" a PDF into its component pages, rotating pages in any direction, applying password protection, etc.

Embedding “Bookmarks” as a Table of Contents

You can also use pdftk to embed a table of contents in a flat PDF file. This is incredibly useful, as it can make large, unwieldy files very easy to navigate. All you have to do is add some bookmark data in a fairly straightforward format as shown below. As a starting point you should that dump the current metadata content of the file with this command:

pdftk foobar.pdf dump_data_utf8

Save the contents of this data dump in a text file and then add bookmark information just below the NumberOfPages value. Here is an excerpt from the huge anthology of public-domain scores I assembled for my music history class:

InfoKey: ModDate
InfoValue: D:20150106100000-06'00'
InfoKey: CreationDate
InfoValue: D:20150106100000-06'00'
InfoKey: Creator
InfoValue: pdftk 2.02 -
InfoKey: Producer
InfoValue: itext-paulo-155 (
PdfID0: ece858bf9affbcad3b575cf3891a187f
PdfID1: 23f89459e103dd43c6e7bc92028245c0
NumberOfPages: 765
BookmarkTitle: Beethoven: Symphony no. 5 in C minor Op. 67
BookmarkLevel: 1
BookmarkPageNumber: 205
BookmarkTitle: Beethoven 5: I. Allegro con brio
BookmarkLevel: 2
BookmarkPageNumber: 205
BookmarkTitle: Beethoven 5: II. Andante con moto
BookmarkLevel: 2
BookmarkPageNumber: 235
BookmarkTitle: Beethoven 5: III. Allegro
BookmarkLevel: 2
BookmarkPageNumber: 256
BookmarkTitle: Beethoven 5: IV. Allegro
BookmarkLevel: 2
BookmarkPageNumber: 275

And here is the command to update the PDF with the table of contents embedded. This tells it to take the input file foobar.pdf and update its metadata using the file (with utf8 encoding) and output the results as foobar_with_toc.pdf.

pdftk foobar.pdf update_info_utf8 output foobar_with_toc.pdf



I made a screencast as a follow-up, showing the process of embedding bookmarks to make a table of contents:

hpr1754 :: D7? Why Seven?

Released on 2015-04-23 under a CC-BY-SA license.

In this episode I respond to one of the community-requested topics ("Music Theory") and try to explain what seventh chords are and why they are used. Below are some of the terms that I use in the course of the discussion.

  • Interval: The distance between two pitches (sounded either consecutively or simultaneously)
  • Consonance: Relatively stable sound between two or more pitches
  • Dissonance: Relatively unstable sound between two or more pitches. Dissonance often needs a "resolution" to consonance
  • Chord: three or more notes sounded together
  • Chord progression: a succession of chords
  • Triad: a chord with 3 pitches, the adjacent pitches separated by the interval of the 3rd.
  • Seventh chord: a chord with 4 pitches, the adjacent pitches separated by the interval of the 3rd.
  • Tonality: harmonic system that governs the use of major and minor keys
  • Tonic: the central tone of a piece of music
  • Mode: major or minor [e.g. Symphony no. 5 in C minor]
  • Modulation: the process of changing keys within a piece of music
  • Scale: Ascending or descending series of notes that define a key or tonality, with a specific arrangements of half-steps and whole-steps. Major and Minor scales are most common in Western music

Free public-domain music reference book: Music Notation and Terminology by Karl Wilson Gehrkens: (see ch. 18)

Free Online Music Dictionary:

hpr1750 :: xclip, xdotool, xvkbd: 3 CLI Linux tools for RSI sufferers

Released on 2015-04-17 under a CC-BY-SA license.

Basic commands

Type the words "foo bar" with xvkbd:

xvkbd -xsendevent -secure -text 'foo bar'

Types out the entire contents of the file "foobar.txt" with xvkbd:

xvkbd -xsendevent -secure -file "foobar.txt"

Send text to the clipboard:

xclip -i

Send clipboard contents to standard output:

xclip -o

Do virtual Ctrl+C key combination with xdotool:

xdotool key Control+c

Save this complicated command as an environment variable—then the variable "$KEYPRESS" expands to this command.

export KEYPRESS="xvkbd -xsendevent -secure -text"


With virtual keystrokes and CLI access to the clipboard, you're limited only by your imagination and scripting ability. Here are some examples of how I use them, both for the manipulation of text and for navigation. The words in bold-face are the voice commands I use to launch the written commands.

Capitalize this. Copies selected text to the clipboard, pipes it through sed and back into the clipboard, then types fixed text back into my document:

xdotool key Control+c && xclip -o \
| sed 's/\(.*\)/\L\1/' \
| sed -r 's/\<./\U&/g' \
| xclip -i && $KEYPRESS "$(xclip -o)"

Go to grades. This example takes advantage of Firefox "quick search." I start with a single quote to match the linked text "grades" and press the Return key (\r) to follow the link:

$KEYPRESS "'grades\r"

First Inbox. From any location within Thunderbird I can run this command and it executes the keystrokes to take me to the first inbox and put focus on the first message:

xdotool key Control+k && $KEYPRESS "\[Tab]\[Home]\[Left]\[Right]\[Down]" && sleep .2 && xdotool key Tab

single ex staff. Type out an entire Lilypond template into an empty text editor window:

xvkbd -xsendevent -secure -file "/path/to/"

Paragraph Tags. Puts HTML paragraph tags around selected text:


KEYPRESS='xvkbd -xsendevent -secure -text'

xdotool key Control+c

xdotool key Control+v
$KEYPRESS '</p>'

Launching commands with keystrokes in Openbox

I normally use blather voice commands to launch the scripts and keystroke commands, but I have a handful of frequently-used commands that I launch using keystroke combos configured in the Openbox config file (~/.config/openbox/rc.xml on my system). This block configures the super+n key combo to launch my script.

<keybind key="W-n">
  <action name="Execute">


hpr1732 :: Renovating another Public-Domain Counterpoint Textbook

Released on 2015-03-24 under a CC-BY-SA license.

I mistakenly referred to episode 1516 while I was speaking. I meant to say 1512. The two musical bumpers I used in the show are by J.S. Bach, examples 90 and 91 in the textbook "Applied Counterpoint," by Percy Goetschius. These are my own MIDI renditions so they have no copyright burden upon them.

My html-to-epub conversion command (requires calibre):

ebook-convert foobar.html foobar.epub \
--output-profile=tablet \
--disable-font-rescaling \
--smarten-punctuation \
--change-justification=left \
--preserve-cover-aspect-ratio \
--cover=./pathto/cover.jpg \
--use-auto-toc \
--level1-toc "//h:h1" \
--level2-toc "//h:h3"


hpr1657 :: Hacking Gutenberg eBooks

Released on 2014-12-09 under a CC-BY-SA license.

Links to stuff I mentioned in the podcast:

hpr1568 :: Blather Speech Recognition for Linux

Released on 2014-08-06 under a CC-BY-SA license.

Blather Speech Recognition for Linux: Jon has a conversation with his computer

In this episode I have a blather conversation with my computer. This is a sort of appendix to an episode I released earlier (hpr 1284 which was a conversation with Jezra, the lead developer of the blather speech recognition program for Linux. The current episode will make much more sense if you listen to the previous one first.

For the most part I use blather as an accessibility tool, to manipulate my desktop and generally to save myself hundreds of keystrokes a day. This is important because of my repetitive strain injuries. Blather allows me to do many “productivity” tasks using only my voice. I also like to have fun with it, though, and this “conversation” is an example of the sort of goofy stuff I like to do. When the computer hears me say certain predefined phrases, it runs commands. For example when I say “what’s for dinner,” it shuffles the contents of a plaintext file that has about 20 options for dinner, chooses the top option and pipes it through my default text-to-speech program, which is either espeak or festival, depending on what I set as the environment variable in my blather startup script. When it hears me ask for certain other information, such as “what day is it?” and “what’s today’s date?”, it runs the appropriate system command and pipes the output through the text-to-speech program. For information about blather, the various back-end things that make it work, examples of my blather scripts and configuration files, visit the links below.


hpr1538 :: Overhauling the School of Music website

Released on 2014-06-25 under a CC-BY-SA license.

I discuss the process of overhauling a badly out-of-date website to make it conform to accessibility standards and give it a responsive design. I also discuss how I came up with my own content management system by Bash scripting.


hpr1512 :: Adopting and Renovating a Public-Domain Counterpoint Textbook

Released on 2014-05-20 under a CC-BY-SA license.

In this episode I discuss the problem of increasingly expensive college textbooks, and share with you the solution I devised to combat the problem in my counterpoint class at the University of Louisiana at Lafayette.

Part of the solution is to adopt a public-domain textbook that's more than 100 years old, and to give the text a 21st-century makeover that I believe will make it even better-suited for the digital age than any other comparable book in the market at any price. The counterpoint page on my website, with source files and information about my creative-commons counterpoint workbook, "Gratis ad Parnassum," as well as links to the 1910 counterpoint textbook by Percy Goetschius: entitled "Exercises in Elementary Counterpoint."

My html version of the Goetschius textbook (in progress):

hpr1368 :: How to Fold a Fitted Sheet

Released on 2013-10-30 under a CC-BY-SA license.

How to Fold a Fitted Sheet

In this episode I try to teach you how to fold a fitted sheet, something that could earn you sheet-folding duties for the rest of your life. See the photo gallery at

[Pictures recovered and uploaded to HPR 2015-06-19]

hpr1349 :: Melissa Dupreast helps me with Audio Compression

Released on 2013-10-03 under a CC-BY-SA license.

I impose upon Melissa Dupreast to help me learn about audio compression and I make a recording of our session for HPR. Missy is a professional audio engineer, working locally for radio and live sound reinforcement. She is also a recent graduate of our masters program at the University of Louisiana at Lafayette and is currently teaching 3 classes for us as an adjunct instructor.

hpr1339 :: Legacy Technology: My Victrola

Released on 2013-09-19 under a CC-BY-SA license.

I talk about and demonstrate my wonderful 1917 Victrola, purchased in Austin, Texas sometime around 1993 from a private individual.

Photo Gallery:

hpr1313 :: How I Manage Contacts

Released on 2013-08-14 under a CC-BY-SA license.

How I Manage Contacts

About a year ago I decided to try to clean up my contacts.

The problem: CRUFT!

  • Importing, exporting re-importing in different accounts and in different email clients and several computers etc over span of ~10 years.
  • 1200+ gmail contacts
  • Many duplicates

What I wanted:

  • 1 set of contacts across platforms with single source file from which all others are generated
  • plain-text format, easy to use w/scripting & text editor
  • No duplicates
  • no cruft
  • easy to maintain
  • easy to import/export in T-bird, ownCloud
  • sync with phone

Steps to Success:

  1. Turn off Gmail default setting that saves every incoming email address in your address book
  2. Deleted all extraneous contacts (went from ~1200 down to about 400)
  3. Tedious part here: compare duplicates, consolidate info
  4. Decide on source-file format
  5. T-bird = LDIF
  6. OwnCloud = vCard
  7. LDIF wins b/c found script to convert to vCard, but not good script for other direction
  8. Convert all disparate contacts lists to LDIF, begin consolidating into one file
  9. LDIF ready? Import to T-bird
  10. Perl script to convert LDIF to vCard –> import to ownCloud
  11. CardDAV-sync to sync from o.c. to phone
  12. Bash script to create new LDIF entries, convert to vcf, add to master file easily


  1. Make t-bird sync w/owncloud (t-bird SOGO extension broken)
  2. CLI API to update owncloud contacts via a script instead of having to use the web interface


hpr1304 :: Jon Kulp and His Son Talk Hacking

Released on 2013-08-01 under a CC-BY-SA license.

I chat with my son about the concept of hacking, Linux, Blacksmithing, and about some of the other stuff he does that smacks of hacking.

hpr1301 :: Conversation with Nybill and Jon Kulp

Released on 2013-07-29 under a CC-BY-SA license.

While I am on vacation near New York City, fellow HPR host NYbill drives down from upstate and we meet for the first time face-to-face. Of course we have to record a conversation for posterity. Topics include activities at LUG meetings, Cory Doctorow, Neal Stephenson, blather speech recognition (a live demonstration!), guitars, and more. Outtakes after the outro.


hpr1299 :: What's in my Bag

Released on 2013-07-25 under a CC-BY-SA license.

I go through the usual stuff in my bag. One thing I forgot to say is that my laptop is a Toshiba Satellite with i3 processor, 6gb of RAM, 750gb hard drive running Crunchbang Linux. Here are links to two of the items mentioned in the episode.

hpr1284 :: Blather Speech Recognition for Linux: Interview with Jezra

Released on 2013-07-04 under a CC-BY-SA license.

Jon's Recumbent Bicycle
A conversation with Jezra, sometime HPR host and the lead developer of the Blather speech recognition program for Linux.


hpr1282 :: My Homemade Recumbent Bicycle

Released on 2013-07-02 under a CC-BY-SA license.

Jon's Recumbent Bicycle
The Green ♲ Machine

In this episode I discuss my experience building a Recumbent Bicycle from donor bikes. A couple of things I forgot to mention while recording the podcast. First of all I had to use tandem bicycle cables for the brakes and the rear derailleur because they had to be very long. I also forgot to talk about the time when I was in a panic that the rear triangle was a bit out of alignment with the front, such that it would make the bike turn a little bit to the left by default. I called Andrew Carson and asked him if there was anything I could do to fix it and his solution was just awesome. What he told me to do was to put a spare hub in the rear triangle to keep the seat- and chain stays from collapsing together, lay the frame on the ground with the front end propped up on a step or something, and then just stand on it, jumping up and down slightly on it if necessary until I could feel it bend back a little bit. This actually worked! It straightened the frame right out. :) Finally, the total cost for this project was under $300. The most expensive single part of it by far was the powder coat, which cost $120. Here are links to resources mentioned in the podcast or simply of general interest.

hpr1280 :: Homemade Antennas for OTA Hi-Def TV

Released on 2013-06-28 under a CC-BY-SA license.

In this episode I discuss my experience building and using antennas for over-the-air hi-def TV.

Here are pictures of my two main antennas:

Bow-Tie style

Jon's bow-tie antenna

Gray-Hovermann style

Jon's gray-hoverman antenna

hpr1276 :: Two Hacker Public Radio hosts meet face-to-face for the first time

Released on 2013-06-24 under a CC-BY-SA license.

I have known windigo for more than 4 years as a virtual acquaintance, first on the Linux Outlaws forums, then on identica, and finally on the Federated Statusnet network. It was awesome when he and his girlfriend stopped by my house today to visit while on a massive road trip around the United States. We took advantage of the opportunity to record a brief conversation for Hacker Public Radio. Here's a photo of windigo, me, and Dingle the cat between us.

windigo, dingle, and Jon Kulp


hpr1270 :: Fathers Day Special: Jon Kulp interviews his Dad

Released on 2013-06-14 under a CC-BY-SA license.

While my parents are visiting from Tennessee I take advantage of the opportunity to talk to my dad for awhile about his early days of computing. He has a PhD in statistics and has been using computers since the 1960s. we talk about his programming in Fortran and Cobol, about building Heathkit projects, about his duties as a VP for information technology at a small private university in Nashville, and about his more recent programming in Windows.

hpr1247 :: Recording Terrestrial Radio with bash scripts and cron jobs

Released on 2013-05-14 under a CC-BY-SA license.

In this episode I talk about my solution for capturing terrestrial radio so that I can listen to it at my own convenience. I use a bash script, cron jobs, and the streamripper package. here are some links to things I mentioned in the podcast.

Jezra's command-line audio player sap (simple audio player):


Radio station KRVS 88.7 FM, Lafayette, Louisiana, USA

And you can see the whole radio-recording script here:

hpr1197 :: What I do with bash scripts

Released on 2013-03-05 under a CC-BY-SA license.

In this episode I talk about the way I use shell scripting on a day-to-day basis. I am not employed in a technical field, so the fact that I use shell scripts at all surprises most people. I am just a music history professor with an enthusiasm for Linux and free software. Although I have dabbled a bit with Python, I don't feel nearly as comfortable with Python as I do with bash, so all of the scripts I mention in this episode are written for bash.

Here are links to blog posts about some of the scripts mentioned in the show.


Cowsay stuff:

"stick" scp script:


Become a Correspondent