Major Website Upgrade

Submitted by jbreland on Sun, 11/08/2009 - 23:26

I just (mostly) finished a major upgrade of the website backend (Drupal, for those who are curious). Although the site should look and feel the same, I had to make some pretty substantial changes to complete the upgrade. As a result, some parts of the site may not look the same, some functionality may be different or missing, etc. Please notify me ASAP if you find any problems. Some examples:

  • Glitches or general ugliness in the web site layout (I had to upgrade the theme as well, which has had only very limited testing)
  • Broken links
  • Missing components/pages (eg., webmail, dailystrips, etc.)
  • Permissions problems / Access Denied errors on certain pages (again, webmail, dailystrips, etc.)
  • Problems with dailystrips - this is the first (and so far only) personal module that I've converted. I think everything's working properly, but please let me know if you find any issues so I can address them as I port the other modules
    • As an added bonus, I also updated the definition for Penny Arcade, so that should now (finally) be working again

The following issues are currently known:

  • bookmarks, metasearch, ssh, sysinfo, and wishlist modules are missing - these all need to be upgraded, and the SSH and sysinfo modules probably won't make a return at all
  • Web site glitches and general ugliness - I know that there are a number of issues with the theme as things stand currently. It'll take me a while to find and work out all the kinks again. However, please still report any issues you find, as it may be something I haven't noticed.

GMail No Longer Accepted for Forum Registration

Submitted by jbreland on Fri, 10/30/2009 - 11:24

Due to the ever-growing number of spam posts on my forum from GMail accounts, I've had to disable the ability to use GMail addresses when registering for a new account on this site. If you're a (legitimate) GMail user trying to register for this site, I'm afraid you'll need to use an alternate e-mail address from now on. Existing accounts are not affected.

I apologize for the inconvenience.

Update 11/03/2009:
Apparently this was affecting existing accounts. I was just notified of this problem and removed the block. I'll need to find another way to address this. If you were having trouble logging in recently and received the error message, "The name username is registered using a reserved e-mail address and therefore could not be logged in," you should now be able to login again. Again, I apologize for the inconvenience.

Convert to FLAC 2.1.1 Released

Submitted by jbreland on Mon, 10/05/2009 - 00:03

I just pushed out an updated Convert to FLAC release to fix a bug involving spaces in filenames. Again. In my defense, though, the root cause is completely different this time, and was limited to only APE or TTA input files (it was due to an odd way I had to deal with output redirection on some of the conversion commands). I've renamed my test files to include spaces, so hopefully this shouldn't happen again. Twice is definitely enough.

For more information:
Convert to FLAC home page and downloads
Convert to FLAC ChangeLog

Feedback and Support

Convert to FLAC 2.1 Released

Submitted by jbreland on Sun, 09/27/2009 - 23:39

I just uploaded a new version of Convert to FLAC. Aside from a handful of bug fixes and other miscellaneous improvements, the big new features in this release are:

  • Support for converting multiple files concurrently (see the -t option)
  • Support for using ffmpeg as an alternative decoder (see the note about this on the convtoflac page for details and caveats)
  • Support for optionally sending input files to your "trash" after completion (as opposed to leaving or deleting them); this relies on trash-cli

The concurrency support is really the main driver for this release. If you have a dual- or quad-core system, you should upgrade to 2.1 ASAP. This sucker really flies now. :-)

For more information:
Convert to FLAC home page and downloads
Convert to FLAC ChangeLog

Feedback and Support

Miscellaneous Scripts Section Added to Site

Submitted by jbreland on Mon, 08/24/2009 - 02:11

I justed added a section for miscellaneous script section to my Software page. These are various scripts that I've written over the years for my own use, but I'd like to share them with others that may be able to benefit from them. Please note, however, that unlike the other applications I've released on my site (UniExtract, Convert to FLAC, etc.), these scripts are much less polished and robust. Please keep this in mind and review source code running any of them.

Right now there are only a handful of scripts there, but there are plenty of more that I'd like to add when I get the time (some require a little more cleanup than others).

To review and download the scripts:
Miscellaneous Scripts

Feedback and Support

Small Convert to FLAC Update

Submitted by jbreland on Mon, 08/24/2009 - 01:02

In the 2.0 update for Convert to FLAC I added support for converting from Apple Lossless Audio Codec (ALAC) files. Part of the process of converting formats involves copying existing tags and metadata wherever possible, and in order to do this with ALAC files I use a separate utility called mp4info. This utility originally came from the MPEG4IP project, but unfortunately that project now seems to be defunct. As a result, I've switched over to the libmp4v2 project, which is still active and provides its own mp4info utility.

Unfortunately, the output from the two versions of mp4info is slightly different. As a result, I had to modify Convert to FLAC to support the new syntax. This change will only affect you if you're trying to convert ALAC files to FLAC. If that's the case, please note the following:

  • You must use the libmp4v2 version of mp4info with convtoflac 2.0.2 and newer
  • If you cannot, or do not want to, switch away from MPEG4IP, you must continue to use convtoflac 2.0.1
  • convtoflac offers no error checking for this beyond verifying that the mp4info binary exists; if you do not follow the advice above, your files will be transcoded, but any metadata will be lost

Sorry for the inconvenience. To download the new version:
Convert to FLAC home page and downloads
Convert to FLAC ChangeLog

Feedback and Support

Bash (Shell) Aliases and Functions

Submitted by jbreland on Tue, 08/18/2009 - 19:14

I started using Linux 10 years ago this month (actually, my very first Linux install would've been around 10 years ago today, though I'm not sure of the exact date). Throughout all those years, I've compiled a number of useful Bash functions and aliases that I use on a daily basis to save me time and help get things done. I figure that some of these would be useful to others as well, so I'm posting a list of them here, along with commentary where appropriate.

For those of you that either don't know what I'm talking about, or just aren't very familiar familiar with this topic, Bash stands for the "Bourne-again shell", and is the standard command line interface for Linux. There are plenty of other shells available, but Bash is the most common and is the default on most Linux distributions. Bash aliases and functions allow you to defined shortcuts for longer or more complicated commands.

Bash aliases are used for substituting a long/complicated string for a much shorter one that you type on the command line. As a simple example, consider the following alias that is defined by default on most distributions:

alias ls='ls --color'

This simply means that anytime you use the command ls, bash will automatically substitute ls --color for you. So, if you entered the command ls /home, bash will treat this as ls --color /home.

Bash functions provide the same essential concept, but allow for allow for much more complicated functionality through the use of shell scripting. Here's an example of a function:

function l() { locate "$1" | grep --color "$1"; }

This defines a function named l that will:

  1. Pass the supplied argument (search term) to the locate command, then
  2. pipe the output to the grep command to highlight the matched results

So, if you entered the command l filename, bash would actually run locate "filename" | grep --color "filename", This will search for all files on your computer named "filename", then use grep to highlight the word "filename" in the results. These are two fairly simple examples of aliases and functions, but when used frequently they can lead to significant time savings.

I'm including a full list of my personal aliases and functions below. Note: Some of these commands are rather obscure, but I'm including them anyway just for reference. At the very least, it may inspire similar shortcuts that make sense for you.

To use any of these, simply add them to your ~/.bashrc file.

# Aliases

# Show filetype colors and predictable date/timestamps
alias ls="ls --color=auto --time-style=long-iso"

# Highlight matched pattern
alias grep='grep --color'

# Common shortcuts and typos
alias c=clear
alias x=startx
alias m=mutt
alias svi='sudo vim'
alias ci='vim'
alias reboot='sudo /sbin/reboot'
alias halt='sudo /sbin/halt'

# Clear and lock console (non-X) terminal
alias lock="clear && vlock -c"

# If in a directory containing a symlink in the path, change to the "real" path
alias rd='cd "`pwd -P`"'

# Useful utility for sending files to trash from command line instead of
#   permanently deleting with rm - see
alias tp='trash-put'

# Generic shortcut for switching to root user depending on system
#alias root='su -'
#alias root='sudo -i'
alias root='sudo bash -l'

# Compile kernel, install modules, display kernel version and current date
#   useful for building custom kernels; version and date are for the filename
alias kernbuild='make -j3 && make modules_install && ls -ld ../linux && date'

# Shortcut for downloading a torrent file on the command line
alias bt='aria2c --max-upload-limit=10K --seed-time=60 --listen-port=8900-8909'

# Only show button events for xev
alias xevs="xev | grep 'keycode\|button'"

# Launch dosbox with a preset configuration for Daggerfall
alias daggerfall='dosbox -conf ~/.dosbox.conf.daggerfall'

# Functions

# Search Gentoo package database (portage) using eix
#   $1 = search term (package name)
function s() { eix -Fc "$1"; }     # Search all available; show summary
function sd() { eix -FsSc "$1"; }  # Search all available w/ desc.; show summary
function se() { eix -F "^$1\$"; }  # Search exact available; show details
function si() { eix -FIc "$1"; }   # Search installed; show summary

# Search Debian package database (apt) using dpkg
#   $1 = search term (package name)
#function s() { apt-cache search "$1" | grep -i "$1"; }  # search all available

# Search Arch package database using pacman
#   $1 = search term (package name
#function s() {
#    echo -e "$(pacman -Ss "$@" | sed \
#        -e 's#^core/.*#\\033[1;31m&\\033[0;37m#g' \
#        -e 's#^extra/.*#\\033[0;32m&\\033[0;37m#g' \
#        -e 's#^community/.*#\\033[1;35m&\\033[0;37m#g' \
#        -e 's#^.*/.* [0-9].*#\\033[0;36m&\\033[0;37m#g' ) \
#        \033[0m"

# Mount/unmount CIFS shares; pseudo-replacement for smbmount
#   $1 = remote share name in form of //server/share
#   $2 = local mount point
function cifsmount() { sudo mount -t cifs -o username=${USER},uid=${UID},gid=${GROUPS} $1 $2; }
function cifsumount() { sudo umount $1; }

# Generate a random password
#   $1 = number of characters; defaults to 32
#   $2 = include special characters; 1 = yes, 0 = no; defaults to 1
function randpass() {
    if [ "$2" == "0" ]; then
        cat /dev/urandom | tr -cd '[:alnum:]' | head -c ${1:-32}
        cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-32}

# Display text of ODF document in terminal
#   $1 = ODF file
function o3() { unzip -p "$1" content.xml | o3totxt | utf8tolatin1; }

# Search all files on system using locate database
#   $1 = search term (file name)
function li() { locate -i "$1" | grep -i --color "$1"; }  # case-insensitive
function l() { locate "$1" | grep --color "$1"; }         # case-sensitive

# View latest installable portage ebuild for specified package
#   $1 = package name
function eview() {
    FILE=$(equery which $1)
    if [ -f "$FILE" ]; then
        view $FILE

# View portage changelog for specified package
#   $1 = package name
function echange() {
    PACKAGE="$(eix -e --only-names $1)"
    if [ "$PACKAGE" != "" ]; then
        view /usr/portage/$PACKAGE/ChangeLog

# Displays metadata for specified media file
#   $1 = media file name
function i() {
    EXT=`echo "${1##*.}" | sed 's/\(.*\)/\L\1/'`
    if [ "$EXT" == "mp3" ]; then
        id3v2 -l "$1"
        mp3gain -s c "$1"
    elif [ "$EXT" == "flac" ]; then
        metaflac --list --block-type=STREAMINFO,VORBIS_COMMENT "$1"
        echo "ERROR: Not a supported file type."

# Sets custom Catalog Number ID3 tag for all MP3 files in current directory
#   $1 = catalog number
function cn() { for i in *.mp3; do id3v2 --TXXX "Catalog Number":"$1" "$i"; done; }

Convert to FLAC Updated (again)

Submitted by jbreland on Thu, 05/14/2009 - 22:46

I just pushed out an important bugfix release for Convert to FLAC. When testing the new multiple input file support, I apparently never bothered testing it on files with spaces in their names. Oops. Version 2.0.1 fixes this oversight.

Relevant links below. If you've already upgraded to v2.0, please download this new version ASAP. Sorry for the inconvenience.

For more information:
Convert to FLAC home page and downloads
Convert to FLAC ChangeLog

Feedback and Support

Convert to FLAC and apeinfo Updated

Submitted by jbreland on Thu, 05/14/2009 - 03:15

I just posted updates for apeinfo and Convert to FLAC, which is the first update in quite some time for both of them.

The apeinfo update was mostly to address compatibility issues. It's been updated to properly support GCC 4.x (which almost all Linux distributions ship with today), and I've also included a 64-bit binary for those of you running 64-bit Linux distributions. The older 32-bit still works fine if you'd prefer to use it, but using it on a 64-bit distro will require installation of 32-bit compatibility libraries.

Convert to FLAC received a much more significant update, and has been bumped up to version 2.0 as a result. The highlights include the ability to accept and process multiple input files, support for Apple Lossless (ALAC) and True Audio (TTA) input files, dynamic path setting for "helper" binaries (so you no longer need to edit paths in the script), and a rather import bug fix to ensure that both the decode and encode steps in the transcoding process are completed successfully. Anyone using Convert to FLAC is strongly encouraged to update to this new version.

For more information:
apeinfo home page and downloads
apeinfo ChangeLog

Convert to FLAC home page and downloads
Convert to FLAC ChangeLog

Feedback and Support


Ogg Vorbis (and FLAC) Comment Field Recommendations

Submitted by jbreland on Sat, 05/09/2009 - 13:00

Note: The following information was originally published at, but this page is no longer available. I found this information to be extremely useful, so I'm posting a copy of it here for archival purposes. This copy was pulled from a mirror of the original site, located at, on 05/09/2009.

This is currently a direct copy of the original source content, modified only slightly in order to match the format of my site. In time I may modify or extend it, but any changes will be clearly indicated.

Updated 12/14/2010:  Additional proposed fields added below, indicated by "proposed by"

Suggestions For Tagging Vorbis/FLAC Files

Originally published Thu Jul 3 20:35:53 PDT 2003

The following recommendations were developed by a community of Ogg/Vorbis users for their own use.

The purpose of the set of tags in this recommendation is to provide information about the track that contains the tags. It is not the purpose of the tags to provide general information about the piece of music in the track, such as a listing of every recording that contains that same piece of music. External databases and the internal Ogg metadata stream are appropriate for information about the music, except where it fills one of the 4 goals listed below.


  1. Identify a track so the listener can know what he is listening to.
  2. Identify a track to allow music companies to profit from it.
  3. Meet goals 1 and 2 without access to external data sources.
  4. Identify a track within a database that contains information about the track.

NOT goals

  1. Stuff every available bit of information about a track and the CD it is on into the TAGS section. (liner notes, lyrics, the bandleaders dogs name...)
  2. Backward compatibility with ID3 and MP3 tagging schemes, structures, and infrastructures.

Piracy happens. We can't prevent it. At least we can encourage less damaging behaviors, such as making sure than when someone likes a track, they have enough information to reimburse the artist by going out and purchasing the original source media the music came on.

These recommendations are written in the context of, which is authoritative.

All tags are OPTIONAL; you can have an ogg file with NO tags present and it will still be compliant. It is RECOMMENDED that you put enough tags in the ogg to meet goals 1 through 4 above. The tags needed will vary with each recording, and will often be no more than the tags already used.

Before we continue, here is a nifty bourne shell function you can stick in your ~/.bash_profile:

ogg-grep () {
   for i in "$@"; do
      vorbiscomment -l "$i"|grep -i "$REGEX" >/dev/null && echo "$i";

You could use it like this:

ogg-grep "CONDUCTOR=.*Karajan" ~/music/oggfiles/*.ogg

It would display, one per line, all the ogg files where Karajan was the conductor of the piece.

What is the effect of following these Recommendations?

Users will be playing their oggs; their player software is expected to display the tags that exist in an oggfile, intelligently.
Therefore the users are not affected by these recommendations and need know nothing about them. Player programs ARE affected, and their job should be made as easy as possible.
There will be a subset of users who create ogg files. Inasmuch as it is their responsibility to tag their files correctly, it would be nice if they knew about these recommendations. However, their ripping software should make it trivial for them to fill in the correct tags in the common cases, and let them access the full tagset if they feel they need it.
Therefore, encoders will almost not notice the adoption of these recommendations, unless they wanted to benefit from its increased flexibility, in which case they will rejoice. Ripper and tagging SOFTWARE on the other hand will need to support these recommendations, and again, its job should be made as easy as possible.
Coders are those who write the software used by users and encoders. They are the ones who will need to make their software compliant, and the ones who need to make sure their software is easy for people to use.
Therefore, it is the coders who will be affected most by these recommendations. Their job should be made as easy as possible so they can support it trivially and well.


A compliant Ogg player program will intelligently display, or let the user specify how to display, all the tags in an Ogg file.

A compliant Ogg file may contain tags not in these recommendations.

Compliant tag editors and rippers may support tags not in these recommendations, but should encourage use of recommended tags over tags not in this document.

Character Set Encoding of Tags

UTF-8 is the default encoding for tag data. Unfortunately UTF-8 muffed it for Asian languages by doing the equivalent of giving the same character codes to English, Russian, and Greek letters.

Fortunately UTF-8 itself has an internal, standard solution to the problem: which basically says: mark the language of text with U+E0001 LANGUAGE TAG, followed by the RFC 3066 language ID (ie. "ja") encoded in lowercase ASCII plus 0xE0000. This is the only mechanism recognized by this document.

Programs which don't want to interpret such markup can simply ignore it; it is zero width. The scope of the language setting is until the end of the tag, or until a new language setting is encountered, whichever comes first.

We have the following STANDARD tags

Singleton tags, which should only appear once. If one of these tags appears more than once, its last appearance should be displayed if there is only room to display one instance of the tag.

if appropriate, an album name
for information to be displayed on systems with limited display capabilities. it is not a replacement for the ENSEMBLE and PERFORMER tags, but typically will summarize them.
who publishes the disc the track came from
who holds copyright to the track or disc the track is on
if part of a multi-disc album, put the disc number here
this number lets you order a CD over the phone from a record shop.
there may be a barcode on the CD; it is most likely an EAN or UPN (Universal Product Number).
the record label or imprint on the disc
record labels often put the catalog number of the source media somewhere on the packaging. use this tag to record it.
the license, or URL for the license the track is under. for instance, the Open Audio license.
the number of the work; eg, Opus 10, BWV 81, K6
the recording media the track came from. eg, CD, Cassette, Radio Broadcast, LP, CD Single
"the work", whether a symphony, or a pop song
the track number on the CD
Make sure you don't put DATE or LOCATION information in this tag. "live", "acoustic", "Radio Edit" "12 inch remix" might be typical values of this tag
The person who encoded the Ogg file. May include contact information such as email address and phone number.
Put the settings you used to encode the Ogg file here. This tag is NOT expected to be stored or returned by cddb type databases. It includes information about the quality setting, bit rate, and bitrate management settings used to encode the Ogg. It also is used for information about which encoding software was used to do the encoding.

Additional singletons proposed by

full lyrics for the track
a full URL linking to the album's official web site

The remaining tags are multiples; if they are present more than once, all their occurrences are considered significant.

composer of the work. eg, Gustav Mahler
the person who arranged the piece, eg, Ravel
the person who wrote the lyrics, eg Donizetti
for text that is spoken, or was originally meant to be spoken, the author, eg JRR Tolkien
conductor of the work; eg Herbert von Karajan. choir directors would also use this tag.
individual performers singled out for mention; eg, Yoyo Ma (violinist)
the group playing the piece, whether orchestra, singing duo, or rock and roll band.
a division within a work; eg, a movement of a symphony. Some tracks contain several parts. Use a single PART tag for each part contained in a track. ie, PART="Oh sole mio"
The part number goes in here. You can use any format you like, such as Roman numerals, regular numbers, or whatever. The numbers should be entered in such a way that an alphabetical sort on this tag will correctly show the proper ordering of all the oggs that contain the contain the piece of music.
like the genre tag from the cddb but without the limitations. You can put any genre you want in this tag. If you think "Pink Floyd" are a genre unto themselves, say so here. For crossover works, or ambiguous works, use as many GENRE tags as you think it takes to describe the styles used.
date or date-time of relevance to the track. The date must be in ISO 8601 format, but may be followed by a space character, then any text you wish, including the same date in any other format. None of the alternate formats in ISO 8601 may be used. Only the primary format in ISO 8601 is to be used. q.v. eg, DATE="1999-08-16 (recorded)" or DATE="1999-08-16 recorded August 16, 1999"
location of recording, or other location of interest
additional comments of any nature.

Examples of Tag Usage

Here is a typical example for most POP music.


Here is what you might see if you played it with ogg123:

Album: Joyride
Ensemble: Roxette
Title: Joyride

Bitstream is 2 channel, 44100Hz

Here is a typical example for CLASSICAL music.

LABEL=Deutsche Grammophon
COMPOSER=Gustav Mahler
CONDUCTOR=Herbert von Karajan
ENSEMBLE=Berliner Philharmoniker
PERFORMER=Liza don Getti (soprano)
PERFORMER=Joe Barr (piano)
PART="movement 1. Allegreto"
TITLE="Symphony no. 4"
COMMENT=I was present when this recording was made; met my wife there.
COMMENT=The flautist ate a green pickle with a purple egg.

And here is what you might see if you played it with ogg123:

Playing from file ogg/mystery_file_I_got_from_gnutella.ogg
Label: Deutsche Grammophon
Composer: Gustav Mahler
Conductor: Herbert von Karajan
Ensemble: Berliner Philharmoniker
Performers: Liza don Getti (soprano)
            Joe Barr (piano)
Title: Symphony no. 4 (Opus 8), movement 1. Allegreto
Comments: I was present when this recording was made; met
          my wife there. The flautist ate a green pickle
          with a purple egg.

Bitstream is 2 channel, 44100Hz

Here is a really whacked example that uses all the tags in this document.

AUTHOR=Reverend Lovejoy
PERFORMER=Nix Nax (piccolo)
ENSEMBLE=Upper East German Woodwind Band
ALBUM=Tootles and Tunes
TITLE=The Life and Times of Friar Tux
PART=1. Minuet (allegro con molto)
GENRE=classical (avant garde)
DATE=1974-09-03 recorded
LOCATION=Easthampton Cathedral, Chesterwickshire
COMMENT=This is the wierdest, ugliest piece of music I've ever heard. Its the ugly duckling of the classical music world.

And here is what it would like like from ogg123

Album: Tootles and Tunes
Track: 8
Title: The Life and Times of Friar Tux (Opus 1), first minuet (allegro con molto)
Composer: Stravinksy
Conductor: Zubin Meta
Performer: Nix Nax (piccolo)
Ensemble: Upper East German Woodwind Band
Arranger: Ravel
Lyricist: Puccini
Author: Reverend Lovejoy
Label: BIZ
Copyright: Unclaimed
EAN/UPN: 111111111
Genre: classical (avant garde)
Producer: Fat Fred
Recorded on: Sept 3, 1974
Recorded at: Easthampton Cathedral, Chesterwickshire
Comments: This is the wierdest, ugliest piece of music I've ever heard.
          Its the ugly duckling of the classical music world. It has a
          monotone reading throughout, of that famous sermon by
          Reverend Lovejoy, "Life and Times of Friar Tux"

Bitstream is 2 channel, 44100Hz

This document is provided for reference purposes only. It is not endorsed by Reactor Core staff or Jonathan Walther, unless otherwise stated. The battle for Christ's Kingdom is always changing, moving to new fronts. The Christian soldier must be trained to prove every thought, ideology, train of reasoning, and claim to truth he meets. Slander is from Satan; Truth is from the Holy Spirit. The wise and the just check every fact for themselves before judging. (1 Thessalonians 5:21, 1 John 4:1-3, John 14:26, John 16:26, Revelation 12:10, Proverbs 14:15, Proverbs 18:13)