<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9628557</id><updated>2011-08-01T14:06:50.417-07:00</updated><category term='yahoo pipes'/><category term='tools'/><category term='javascript'/><category term='rsync'/><category term='free'/><category term='last.fm'/><category term='events'/><category term='rhythmbox'/><category term='audio'/><category term='downloads'/><category term='python'/><category term='rss'/><category term='spam'/><category term='quod libet'/><category term='email'/><category term='thunderbird'/><category term='wget'/><category term='google calendar'/><category term='blogs'/><category term='linux'/><category term='scripting'/><category term='barbipes'/><category term='spiders'/><category term='calendars'/><category term='radio'/><category term='ripping'/><category term='ogg'/><category term='lightning'/><category term='queueing'/><category term='markov'/><category term='arc'/><category term='programming'/><category term='ubiquity'/><category term='music'/><category term='lisp'/><category term='similarity'/><category term='artists'/><category term='legal'/><category term='2007'/><category term='ideas'/><category term='gain'/><category term='mp3blogs'/><category term='the netherlands'/><category term='lowlands'/><category term='synchronisation'/><category term='software'/><category term='festivals'/><category term='reminders'/><category term='bands'/><category term='mp3'/><category term='fun'/><category term='tagging'/><category term='spidering'/><category term='automation'/><category term='plugins'/><category term='autoqueue'/><category term='players'/><title type='text'>thisblog</title><subtitle type='html'>"Look out honey, 'cause I'm using technology..."</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9628557.post-203073659057184154</id><published>2010-03-31T14:02:00.000-07:00</published><updated>2010-03-31T14:06:49.807-07:00</updated><title type='text'></title><content type='html'>After a recent snafu where google disabled my blog for a few weeks without even so much as sending me a notification, I've decided to move to posterous. It took a while for their import utility to fully grok my blogger feed, but it just started working, so from now on, my infrequent ramblings can be found here:

&lt;a href="http://thisfred.posterous.com/"&gt;The new and hardly improved thisblog.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-203073659057184154?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/203073659057184154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=203073659057184154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/203073659057184154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/203073659057184154'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2010/03/after-recent-snafu-where-google.html' title=''/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-3731056358986422224</id><published>2010-02-25T19:16:00.000-08:00</published><updated>2010-02-25T20:35:30.419-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='markov'/><title type='text'>Generating Band Names and Song Titles</title><content type='html'>&lt;p&gt;Yesterday my distinguished colleague &lt;a href="http://www.kryogenix.org/days/"&gt;Stuart Langridge&lt;/a&gt; said he could use some fake band names for functional tests in the Ubuntu One Music Store he's working on. Since I'd done a similar thing once before (for realistic sounding Dutch city/village names.) I figured I could hash an algorhithm out pretty quickly, and so I did, last night.&lt;/p&gt;

&lt;p&gt;I started with a simple Markov chain class that can analyse a body of data and then generate text that is like the source data, but does not actually occur in it. At first I used the same algorithm for artist names and song titles, but I soon decided generating songs word by word, and artist names character by character made more sense, since proper names (and a lot of band names) don't adhere to spelling rules anyway.&lt;/p&gt;

&lt;p&gt;The song titles came out pretty great (as in, in every batch I generated there were at least a few funny ones,) but the artist names remained problematic, so the next thing I tried was splitting the artists into groups and people. This seems to be generating even better results, but splitting the list of artists (which I generated with a throwaway plugin for quodlibet, see below) turns out to be a lot of work. I did a few hundred manually, and the results below are quite cool, but there's a lot of partial duplication. Perhaps I shall finally download the musicbrainz data set, and see if I can generate separate lists of people and groups/bands from that easily. (HINT: if someone has such lists lying about, I would be immensely grateful if you could mail them to thisfred at gmail. That would be me.)&lt;/p&gt;

&lt;p&gt;Anyway, here's a single unedited run of the script:&lt;/p&gt;

&lt;pre&gt;
Jack Planter - First true love will die
The Islandry The Mountals - And We Wake Up (live acoustic)
Eef Bunyan - 08-Welcome to Rock Remix
Luna - The Deacon (Duke Dumont Remix)
Jolie Newsom - What A Christmas Duel
Dj Funky Banhardo Villah Priest - King Of The Enemy
The Ian Mouse - Carol Of The Goober Woobers
Robby Brokend - The Same Machine
Princeformeroon) - Long Dark Blues
Joha - What The Fuck Out
Cartripes Young Lips - How Blue You Can Live Without You
Rude Stooges - I Called Out Your Window?
El Perrown - And a She Wolf (Moto Blanco Radio Edit)
Jana Talmann - When My Broken Shield
Flip Kowlie Newsom - Lookin' For A Propulsion Device Based On Heim's Quantum Theory)
Kelle Shock - Used to Hate Us)
Billiams - Forever On The Verge
Iggy Polly - Extraball ft. Amanda Blank
Marton - We Are Decided
...And thers of Leon &amp; Kypski - One Of These Days (Clifton Chenier cover)
Misse Dayton - Home On The Edge
Whisperdrag - Son of Rio Mix (Single Version)
Raftwer - Song A Day Another Day
Stard, Run Run - Begin to See What I Meant to Be Glad
Asobius Pip - Music Sounds Better with You
Ill Girl Seed - Never an Easy Way to the Center of the South
The Weeper Girls - Mind How You Feel It?
Flip Kowlie Newsom - Sondre Lerche - To Plant A Seed.mp3 [Unknown]
Alexand - Far Cry (live in the Jungle
Rocker - Veins To The City
Sean Lionhearthan - put it on the Dancefloor (John B Remix)
Trail Riot - Islands In The Gale/Josephine
Williott - Make It Home
Death - Section 7 (Hanging Around the Christmas Tree On Fire (Holy Ghost! Remix)
C-Monobotix - Never Make a Noise
MC Ricard Coxon - Hell - Part Four
Williams Jebeniana Nastarr - Drop Some Silver In The Dead
Williott - Le Le
Alexandt - Pop song for our City
Beth Lakemann - A Friend (That I've Never Understood
Corns of Happies - The Only Healer - Featuring Caroline Schutz Of Folksongs For The Winter
The Naturday - Awoken By a Horse
The Plaza Cent - Like a Mama
Emma Pop - Mogwai and Summer Walks
Ra Ricord Citi 80 - I.C. Y'All (feat. Busta Rhymes, Raekwon &amp; Lil Wayne)
Wints Sected The Tegenwoording Cooks - To Save You
Madow - I Sold My Hands Are Made
Read - 94b Christmas in July
Franco et and - Can't Turn You Into the Pit
The Do Roots - Remember When I Was a Lover
Killalobos - How We Do Is Wrong
David Krauss - Remedy (A1 Bassline Remix) - L2
Eringfielson - Rock The Beach (Neil Young Cover Live 8/15/2003)
Mitch Harcourtis Pilar - Bathroom Gurgle (Duke Dumont Ode To Todd Mix)
Shape - Lost in the game (pt 1)
Tweakes - If You've Got Hopes
Steve Elliams - Dis policeman keeps on kicking me to the Mardi Gras In New Orleans
Billaloner - Motown Never Sounded So Good They Named it Thrice
Van Lidbo - Take me Down
Elastin Trainfully Bessy Bean Moby Grape. - How's The World Can Stop Me Worryin' Bout That Girl
Jural - Long Live The Fallen Aristocracy.mp3 [Unknown]
The Machiefs - Hunt Like the Real Thing
Case - Back In Your Window
Bennie Hollalobos - Shoes (A Bang Gang Remixxx)
Foung Afteras - It Aint Me Babe.mp3 [Unknown]
Dar Willalobotnicks - You Still Believe In Christmas
Anthony Robinson - The Pink Wig To My World Fell Down (Single Version)
erlights - Fall From Your Bed
Eddie Kennor - Last Kiss (Originally recorded by J. Bryson &amp; 1st draft by Zaki Ibrahim)
Chrissy Elliams - Sunday Kind of Chill
Erlendrick Ense - Get Up I Feel For You
Mic Spareck Plan - Walking With a Mixx
Jay Bird - I'm In Your Area
Neko Catra - More Like It
Сергей Шнургей Шнургей Шнургей Шнургей Шнуров - Back of the Dead
Doctors - What Once Was Will Be Free
Emmy Cliff - We Are Golden (Jokers of the seasons
Sean Lionheart - CrowdedHouse - Something Special
Lesbian Cobra - If I Got 5 On It (Clean Edit)
Del Maar - ...Has A Way
Brooks Stra - The Hazards of Love
Chiness Candy - Brahms: Studies, Anh 1A/1 - Presto - Allegro con spirito
Hermanna Nadle - The Other Version (ft. Kid Cudi)
Tokyo Police - Got It and Grab It
A Silents - Your Ex-Lover Is Dead (Remaster)
Tigerince - Now I'm Here You're There (Mexicans with Guns Remix)
Page Fays - I Won't Be That Way
J Dieneman - Got To Make You Strong
The Walkmena Vistener - Someone to Love You Until My Veins Again
Digable Strung - Standing At the speed of life
Willalobos - Sinatra - It Was
Wayne Staalendricks - Steven McCauley for President (Exclusive)
Bonna - Devil Made Us Do It Again
Palaxy - small town (live)
Territsen - We Got The Money I've Got It Bad and Young Jeezy: National Anthem
Shears - A Lonely Construction Worker
Garvie - Walking On A Cloud Of Smoke and Sassafras
Broobinski - Lords of The World, Jonah
Williams - Lake Shore Drive (Todd Terje Edit)
Two Bassibles - Madmen's Discotheque (Disconet Casey Jones (On The Road
&lt;/pre&gt;

&lt;p&gt;As you can see there's a lot of names that are too close to real names to be interesting, and quite a few common patterns. Also broken parentheses, due to (my implementation of) Markov chains being only mildly context sensitive. (See how I used that term in an actual sentence? Totally worth it, that education.) Also, I can't guarantee that none of these titles or artist names aren't actually real, because of trivial lower case/upper case and or white space and punctuation differences, or, due to the artist not being in my source data set.&lt;/p&gt;

&lt;p&gt;And here's the code that generated it:&lt;/p&gt;

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;

import random

class Markov(object):

    def __init__(self, words=False):
        self.db = {}
        self.lines = set([''])
        self.words = words
        if words:
            self.prevs = 2
        else:
            self.prevs = 3

    def process_file(self, filename):
        with open(filename, 'r') as file:
            for line in file:
                self.process_line(line)

    def process_line(self, line):
        self.lines.add(line.strip())
        prevs = []
        for i in range(self.prevs):
            prevs.append(None)
        if self.words:
            line = line.split()
            line.append('\n')
        for character in line:
            self.db.setdefault(
                tuple(prevs), []).append(character)
            prevs.append(character)
            prevs = prevs[1:]

    def generate_line(self):
        line = ''
        tries = 0
        while line.strip() in self.lines and tries &lt; 100:
            tries += 1
            prevs = []
            for i in range(self.prevs):
                prevs.append(None)
            line = ''
            while True:
                char = random.choice(self.db[tuple(prevs)])
                if char == '\n':
                    break
                prevs.append(char)
                prevs = prevs[1:]
                line += char
                if self.words:
                    line += ' '
        return line.strip()

n = Markov()
n.process_file('names.txt')

g = Markov()
g.process_file('groups.txt')

t = Markov(words=True)
t.process_file('titles.txt')

for i in range(100):
    x = random.choice([n, g])
    print x.generate_line() + ' - ' + t.generate_line()

&lt;/pre&gt;&lt;/code&gt;
&lt;/div&gt;
&lt;p&gt;[Edit]: removed a redundancy left by earlier refactoring.&lt;/p&gt;

And here's the dead simple quodlibet plugin, just to show how cool quodlibet is. Note that quodlibet, unlike for instance the also quite nice Rhythmbox, would allow you to do this (or much more interesting things) with *any* id3 tag, including ones you make up yourself.:

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
import os
import const
from plugins.songsmenu import SongsMenuPlugin

class AddToListPlugin(SongsMenuPlugin):
    PLUGIN_ID = "Export artist list"
    PLUGIN_NAME = _("Export artist list")
    PLUGIN_DESC = _("Add artist name to artists.txt.")
    PLUGIN_ICON = "gtk-find-and-replace"
    PLUGIN_VERSION = "0.1"

    def player_get_userdir(self):
        """get the application user directory to store files"""
        try:
            return const.USERDIR
        except AttributeError:
            return const.DIR

    def plugin_songs(self, songs):
        f = open(os.path.join(self.player_get_userdir(), "artists.txt"), 'a')
        artists = set()
        for song in songs:
            artist = song("artist")
            if artist in artists:
                continue
            artists.add(artist)
            f.write('%s\n' % artist)

&lt;/pre&gt;&lt;/code&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-3731056358986422224?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/3731056358986422224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=3731056358986422224' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/3731056358986422224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/3731056358986422224'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2010/02/generating-band-names-and-song-titles.html' title='Generating Band Names and Song Titles'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-1141391867429488016</id><published>2009-02-05T10:51:00.000-08:00</published><updated>2009-03-18T10:14:20.138-07:00</updated><title type='text'>Subscribing to google groups with a non gmail mail address</title><content type='html'>&lt;p&gt;Dear lazyweb, I keep running up against this, and it may be documented, but not any place I could find easily:&lt;/p&gt;

&lt;p&gt;I want to subscribe to a google group with a non gmail email address, and I can't seem to do it myself. I know as admin of several groups that owners can subscribe or invite people with different email addresses, and I figured that maybe I could just send a mail to [nameofgroup]+subscribe@googlegroups.com, since the +unsubscribe version of that works. I had a brief moment of "doodgemaakt met een blije mus"-erlebnis when I got a confirmation mail, but alas, the link seemed to be invalid. Anyone have any bright ideas?&lt;/p&gt;

&lt;p&gt;[edit:] Actually there is a separate page where you can manage all your group subscriptions, and *there* it is possible to select all your registered email addresses on a per group basis. Yay!&lt;/p&gt;

Go to &lt;a href="http://groups.google.com/groups/mysubs"&gt;http://groups.google.com/groups/mysubs&lt;/a&gt;

&lt;p&gt;[edit:] actually still doesn't work, because only my gmail address shows up in the dropdowns, not my other registered and confirmed address.&lt;/p&gt;

&lt;p&gt;[edit:] And it suddenly just works now, I noticed the other day. (as in the other email address shows up in the dropdown now.) Cool!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-1141391867429488016?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/1141391867429488016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=1141391867429488016' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/1141391867429488016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/1141391867429488016'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2009/02/subscribing-to-google-groups-with-non.html' title='Subscribing to google groups with a non gmail mail address'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-6764364000352513760</id><published>2008-11-02T08:46:00.000-08:00</published><updated>2008-11-02T10:07:29.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='last.fm'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ubiquity'/><title type='text'>Ubiquity command: lastfm</title><content type='html'>&lt;p&gt;I found myself tagging all the songs of &lt;a href="http://www.sho.com/site/weeds/music.do"&gt;the soundtrack of the tv series 'Weeds'&lt;/a&gt; on last.fm (as you do,) when I realized the search on last.fm is less than optimal for this purpose. It almost always takes three clicks to get to the page I need, even if I have the exact spelling for an artist/track. Enter &lt;a href="https://wiki.mozilla.org/Labs/Ubiquity"&gt;Ubiquity&lt;/a&gt;, the new firefox extension that allows you to add and use simple commands to your browser. In less than an hour, most of which was spent reading &lt;a href="https://wiki.mozilla.org/Labs/Ubiquity/Ubiquity_0.1_Author_Tutorial"&gt;the excellent tutorial&lt;/a&gt;, the command was working.&lt;/p&gt;

&lt;p&gt;The script can be found &lt;a href="http://gist.github.com/raw/21719/7f8c8fb503f59eeeb0d83ed137ec46e075815c63"&gt;here on github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To use it, open ubiquity with your command key, then type:&lt;/p&gt;

&lt;div class="code"&gt;&lt;code&gt;&lt;pre&gt;
lastfm [artistname]&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;

&lt;p&gt;or:&lt;/p&gt; 

&lt;div class="code"&gt;&lt;code&gt;&lt;pre&gt;lastfm [artistname] - [title]&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;

&lt;p&gt;to go directly to the artist or track page on last.fm in a new tab. Because of the way ubiquity works, you can also select text on a page, and call the command with the selected text as an argument.&lt;/p&gt;

&lt;p&gt;Note: this is pretty rough around the edges for now: If the artist name or the track title contain dashes, it will not end up on the correct page. Also, I'm not sure how I can host this so that others can subscribe to the command, and automatically get changes. I currently don't have any 'real' hosting. Maybe github allows me to do this, but I haven't figured it out yet.&lt;/p&gt;

&lt;p&gt;P.S.: Here's the link to the tag, and the one to the soundtrack for &lt;a href="http://www.hbo.com/trueblood/"&gt;True Blood&lt;/a&gt;, which is a work in progress. Both have very good and diverse soundtracks, which make for nice impromptu last.fm radio stations:&lt;/p&gt;

&lt;a href="http://www.last.fm/user/thisfred/library/tags?tag=weeds"&gt;Weeds tag radio&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.last.fm/user/thisfred/library/tags?tag=true+blood"&gt;True Blood tag radio&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-6764364000352513760?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/6764364000352513760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=6764364000352513760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/6764364000352513760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/6764364000352513760'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/11/ubiquity-command-lastfm.html' title='Ubiquity command: lastfm'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-7996711512848698990</id><published>2008-11-01T09:49:00.000-07:00</published><updated>2008-11-02T02:47:28.916-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='spam'/><title type='text'>A better anti-spam method</title><content type='html'>&lt;p&gt;Recently an idea on how to combat spam occurred to me, that I haven't heard before. It's very low tech, which I find attractive, and it would never result in false positives, which is the most important shortcoming of all the systems I've tried up until now.&lt;/p&gt;

&lt;p&gt;What if everyone in the world had an additional email address, that they would never ever use or give out, but that would be publicized in places where only email address harvesting bots would encounter them. A bit of handwaving here, but in its simplest form, just put your real and your spam email address on your webpage, completely unobfuscated, (perhaps even in mailto: links!) but stipulating (in a clear, but not easily machine readable way,) that people should not send mail to the fake/spam one should be enough.&lt;/p&gt;

&lt;p&gt;Then *any* message that arrives in the spam account is necessarily spam. You can now use that account to filter your real account, by removing messages with a body that is identical, or similare enough. Again some handwaving on similar enough, (do this wrong, and voilà: false positives again) but you get the drift.&lt;/p&gt;

&lt;p&gt;This kind of filter could be implemented by a provider, where the user would not have to do anything manually, except putting the fake address out there for the harvesters to find, or it could be implemented client side, where the mail client gets all mail from both accounts, and does its thing.&lt;/p&gt;

&lt;p&gt;And another thing: I also think the current bayesian filters could be improved upon, by recognizing more/different patterns than just lexical ones. I have an intuition that character based markov chaining could catch a lot of spam I get: I built a small script in college which could reliably distinguish quite a number of languages. That would get rid of all the mail addressed to me in languages I cannot read, which I would classify as spam. Taken further this could also get rid of intentionally misspelt spam, to the detriment of poor spellers that want to send me legitimate mail, or (specific patterns of) html markup in mails,  which would get rid of most all the other tricks one could use to show the word 'viagra', without actually writing it.&lt;/p&gt;

&lt;p&gt;I might have a go at this, to see if my intuition that these could be better predictors than word counts is correct. (I would train my dutch email and my english email into separate 'ham languages',  and everything showing entire unpredicted character sequences, would be unsure/spam. Marking things as spam could train a 'spam' language, so there could be both positive and negative indicators.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-7996711512848698990?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/7996711512848698990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=7996711512848698990' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7996711512848698990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7996711512848698990'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/11/better-anti-spam-method.html' title='A better anti-spam method'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-7077746008190484823</id><published>2008-08-09T01:28:00.000-07:00</published><updated>2008-08-09T01:57:12.318-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='similarity'/><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='rhythmbox'/><category scheme='http://www.blogger.com/atom/ns#' term='players'/><category scheme='http://www.blogger.com/atom/ns#' term='quod libet'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='queueing'/><category scheme='http://www.blogger.com/atom/ns#' term='autoqueue'/><title type='text'>Autoqueue goes cross-player!</title><content type='html'>&lt;p&gt;When m' colleague Sylvain expressed an interest in porting my autoqueue plugin for Quod Libet to itunes, I experimented a little with factoring out all the generic parts, and it turned out the player specific stuff isn't all that much, so I decided to do a little work and see what kind of problems I would run into when porting it to another player. I chose Rhythmbox for my experiment, since it's in my Ubuntu anyway, and it has support for python plugins.&lt;/p&gt;

&lt;p&gt;Turns out it was pretty easy. I have a large part of the featureset working in less than a day, with a lot of help from this page:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://live.gnome.org/RhythmboxPlugins/WritingGuide"&gt;http://live.gnome.org/RhythmboxPlugins/WritingGuide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and example code in Alexandre Rosenfeld's lastfmqueue plugin:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://code.google.com/p/airmindprojects/source/browse/#svn/trunk/rbplugins/lastfm_queue"&gt;http://code.google.com/p/airmindprojects/source/browse/#svn/trunk/rbplugins/lastfm_queue&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;which offers similar functionality, but is a little more lightweight (less features/bloat, depending on how you look at it ;)&lt;/p&gt;

&lt;p&gt;I also moved autoqueue into it's own repository, since it's now no longer solely a Quod Libet plugin, nor, hopefully, a single developer effort. If you're a rhythmbox (or Quod Libet) user and you're interested in checking an early, but working version out, get the plugin here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://code.google.com/p/autoqueue/source/browse/trunk"&gt;http://code.google.com/p/autoqueue/source/browse/trunk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll need autoqueue.py, rhythmbox_autoqueue.py, and rhythmbox_autoqueue.rb-plugin. Drop those in your ~/.gnome2/rhythmbox/plugins directory, start rhythmbox, and activate the autoqueue plugin.&lt;/p&gt;

&lt;p&gt;If you have questions, feature requests, or would like to help with porting the plugin to your favorite player, you can contact me directly, or even better, join the autoqueue mailing list here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://groups.google.com/group/autoqueue"&gt;http://groups.google.com/group/autoqueue&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-7077746008190484823?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/7077746008190484823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=7077746008190484823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7077746008190484823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7077746008190484823'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/08/autoqueue-goes-cross-player.html' title='Autoqueue goes cross-player!'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-5704940074068222599</id><published>2008-08-04T02:36:00.000-07:00</published><updated>2009-07-22T03:58:49.949-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='barbipes'/><category scheme='http://www.blogger.com/atom/ns#' term='spidering'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='spiders'/><title type='text'>mp3spider becomes barbipes</title><content type='html'>&lt;p&gt;Just a short note: After my colleague &lt;a href="http://www.z0pe.org/"&gt;Sylvain&lt;/a&gt; showed some interest in my mp3spider script, and actually built some really cool new features for it, I decided to split it off into its own little project rather than keep it in my supremely unimaginatively named 'thisfred-python-stuff'.&lt;/p&gt;

&lt;p&gt;After a very short google I found this cute little critter:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Saitis_barbipes"&gt;http://en.wikipedia.org/wiki/Saitis_barbipes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And so, from now on, the mp3spider will be known as barbipes and can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://code.google.com/p/barbipes/"&gt;http://code.google.com/p/barbipes/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone interested in contributing, just drop me a note at my usual username at gmail and I'll give you check-in rights.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-5704940074068222599?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/5704940074068222599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=5704940074068222599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/5704940074068222599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/5704940074068222599'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/08/mp3spider-becomes-barbipes.html' title='mp3spider becomes barbipes'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-4707515066984111251</id><published>2008-06-29T06:42:00.000-07:00</published><updated>2008-08-09T01:57:35.996-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='quod libet'/><category scheme='http://www.blogger.com/atom/ns#' term='autoqueue'/><title type='text'>Quod Libet Plugins Released!</title><content type='html'>&lt;p&gt;After working on them for a long time, and then procrastinating for at least as long on wrapping them up into releasable shape, I'm sort of proud to announce my plugins for Quod Libet, (the best music player I have yet found):&lt;/p&gt;

&lt;a href="http://code.google.com/p/thisfred-quodlibet-plugins/downloads/list"&gt;http://code.google.com/p/thisfred-quodlibet-plugins/downloads/list&lt;/a&gt;

&lt;p&gt;There are three plugins in there, in order of increasing complexity and interest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;h4&gt;autosearch.py&lt;/h4&gt;
&lt;p&gt;Very simple plugin, searches for the title of the current song in your library: Good for getting rid of duplicates, and finding possible covers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;h4&gt;lastfmtagger.py&lt;/h4&gt;
&lt;p&gt;Useful only if you have a last.fm account and make use of tags there. This will synchronize last.fm tags both ways, saving them in a custom 'tag' id3 field in your local files. Since Quod Libet has a great id3 editing interface (Ex Falso, also usable as a stand alone application,) this makes adding and editing tags to songs, artists and albums on last.fm much easier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;h4&gt;autoqueue.py&lt;/h4&gt;
&lt;p&gt;This gets similar tracks to the ones you play from last.fm and puts them in the queue. It is smart enough not to play the same artists/songs for a configurable time, and has some other options (for instance it can also look up similar songs based on the tags created by the lastfmtagger.py mentioned above.) It works pretty well in creating a consistent yet not wholly predictable listening experience if you have a large and diverse library.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As always, feedback is very welcome, I'm sure there are some bugs left in there, or at the very least some rough edges.&lt;/p&gt;

&lt;p&gt;(edit: of course within minutes of posting this I find out last.fm's 2.0 API has gone official, so it appears that once again there is some work to do :) &lt;a href="http://www.last.fm/group/Last.fm+Web+Services/forum/21604/_/426605"&gt;Apparently there's no API for getting similar tracks anymore&lt;/a&gt; though. That's a shame...)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-4707515066984111251?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/4707515066984111251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=4707515066984111251' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/4707515066984111251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/4707515066984111251'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/06/quod-libet-plugins-released.html' title='Quod Libet Plugins Released!'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-8768099771162740680</id><published>2008-06-19T09:41:00.000-07:00</published><updated>2008-06-20T06:37:14.295-07:00</updated><title type='text'>last.fm adds event radio</title><content type='html'>&lt;p&gt;Cool! Now I don't have to tag the artists for the festivals I'm going to by hand, which always felt a little redundant. (I still might though, since I synchronize the tags with my local library, and it's nice to play all the songs I have locally from a particular edition of a particular festival.)&lt;/p&gt;

&lt;p&gt;Anyhoo, urls like (for lowlands 2008, which is going to be very good):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.last.fm/listen/event/436106"&gt;http://www.last.fm/listen/event/436106&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;allow you to listen to a randomized stream of the entire lineup. A feature I have been rooting for for a long time. Last.fm, once again you come through.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-8768099771162740680?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/8768099771162740680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=8768099771162740680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/8768099771162740680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/8768099771162740680'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/06/lastfm-adds-event-radio.html' title='last.fm adds event radio'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-155000466927927283</id><published>2008-02-23T03:44:00.000-08:00</published><updated>2008-04-18T08:51:10.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='ogg'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>The Musical Gardener's Tools #5: Yet Another Way to Harvest mp3blogs</title><content type='html'>&lt;p&gt;Update 2008-03-11: There were a number of things wrong with this script making the spidering *waaaay* slower than it needs to be. Fixed that below, and added threading for both the spidering and downloading, thanks to &lt;a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496799"&gt;this cool recipe by Wim Schut&lt;/a&gt; which lets me run all the sqlite code in a separate thread. (Important because you can only use sqlite connections in the thread in which they were created.) All of this results in a nice speed-up.&lt;/p&gt;

&lt;p&gt;Ok I said I wasn't going to, but I did end up writing a bit of code, although it didn't get too far out of hand. Yet :). It solves *all* of my problems: it does not download files over 30MB in size, and it never downloads the same link twice.&lt;/p&gt;

&lt;p&gt;I found &lt;a href="http://mail.python.org/pipermail/python-list/2007-August/454005.html"&gt;this message&lt;/a&gt; on the python mailing list, which seemed like a very good start. It almost did what I needed, but not quite, and also the parsing was overcomplicated and didn't catch all links, so I replaced that with a simple regular expression.&lt;/p&gt;

&lt;p&gt;I ended up changing most of the code and functionality, (for instance it now stores links in a database.) There's a lot of hard coding in there, which I could factor out if people want to use it, but for now it solves my problems beautifully ;).&lt;/p&gt;

&lt;p&gt;It's used with the following syntax:&lt;/p&gt;

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
# initial set up
python spider.py createdb
# add a new blog to be harvested
python spider.py add http://url.of.blog/
# (shallowly) spider all blogs for new links to files
python spider.py
# spider a url to a specific depth (5 for example should get 
# most everything, but will take a while)
python spider.py deepspider 5
# download all files
python spider.py download
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;

&lt;p&gt;A minor problem is that curl doesn't do *minimum* file sizes, and with a lot of broken links it does download something small that isn't really an ogg or mp3 file, but a http response. I can probably solve this better, but for now I call the download from an update script as follows: 

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
python spider.py download
find . -iname "*.mp3" -size "-100k"  -print0 | xargs -0 rm
find . -iname "*.ogg" -size "-100k"  -print0 | xargs -0 rm
find . -iname "*.mp3" -print0 | xargs -0 mp3gain -k -r -f
find . -iname "*.ogg" -print0 | xargs -0 vorbisgain -fr
&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;

&lt;p&gt;Translation: download files, throw away suspiciously small ones, mp3/vorbisgain what's left.&lt;/p&gt;

&lt;p&gt;Here's the code:&lt;/p&gt;

&lt;p&gt;Edit 2008-04-18: Moved the code to google code, so I don't have to update it here. Find the latest version here: &lt;a href="http://code.google.com/p/thisfred-python-stuff/source/browse/trunk/mp3spider/spider.py"&gt;spider.py&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-155000466927927283?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/155000466927927283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=155000466927927283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/155000466927927283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/155000466927927283'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/02/musical-gardeners-tools-5-yet-another.html' title='The Musical Gardener&apos;s Tools #5: Yet Another Way to Harvest mp3blogs'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-5072282024204100050</id><published>2008-02-12T02:50:00.000-08:00</published><updated>2008-02-23T03:54:55.320-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reminders'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo pipes'/><title type='text'>Reminders via del.icio.us and Yahoo Pipes</title><content type='html'>&lt;p&gt;Just thought I'd share this, while we still *have* del.icio.us and yahoo pipes... ;)&lt;/p&gt;
&lt;p&gt;A while ago I stumbled agross &lt;a href="http://www.tagmindr.com/"&gt;tagmindr&lt;/a&gt;, which seemed like a cool idea: put a custom tag on some url in your del.icio.us account and it will remind you at a certain date to look at that url again. I frequently see announcements on website that say something like check back here on [some date] for [some interesting news]. Having automatic reminders for things like that are great, because the chances of me forgetting otherwise are near 100%. The thing is: the personal feed tagmindr promised me *NEVER WORKED*. That's how I completely forgot about a number of things, and tagmindr itself for a while. No biggie, just not very smart if you wanna get all start-uppy and generate buzz ;)&lt;/p&gt;
&lt;p&gt;So I decided, how hard can it be to get this right? Turns out not hard at all! I built a yahoo pipe in under an hour that does exactly the same thing. You just give it your del.icio.us username, and it gives you reminders for anything you tag with the tags 'reminders' and 'remind:yyyy-mm-dd' where you replace the ys and ms and ds with the date you want to be reminded on.&lt;/p&gt;
&lt;p&gt;The yahoo pipe is &lt;a href="http://pipes.yahoo.com/pipes/pipe.info?_id=lBSI3YnU3BGVqYiqjUnRlg"&gt;here&lt;/a&gt;. Enjoy! (As always, feedback and bug reports very welcome!)&lt;/p&gt;
&lt;p&gt;Yahoo pipes rock, del.icio.us rocks. Let's hope Yahoo can hold out. I have nothing against Microsoft per se, but I don't think they ever got the web, and I fear they will screw up the nice and open things (like YUI, for instance) that Yahoo has been developing in the past few years.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-5072282024204100050?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/5072282024204100050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=5072282024204100050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/5072282024204100050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/5072282024204100050'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/02/reminders-via-delicious-and-yahoo-pipes.html' title='Reminders via del.icio.us and Yahoo Pipes'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-7001333730137997120</id><published>2008-02-03T10:38:00.000-08:00</published><updated>2008-02-23T03:55:12.974-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='arc'/><title type='text'>Exploratory programming, or my 2 ¢ on arc</title><content type='html'>&lt;p&gt;A lot of people have blogged on Paul Graham's new language, &lt;a href="http://arclanguage.org/"&gt;arc&lt;/a&gt;, the (perceived lack of) new features it brings, and the intentionally non-PC announcement by Mr. Graham. I don't have much to add to that particular debate. It looks like lisp, with some new syntactic sugar, which is fine by me. I like lisp, but I wouldn't want to use it in my day job. Others no doubt do, and their taste is no worse or better than mine.&lt;/p&gt;

&lt;p&gt;I think maybe the development time worked against it, in that some features seem less than revolutionary, because other languages got there first. Now lisp has them too, and maybe even better implemented, I'm not one to judge.&lt;/p&gt;

&lt;p&gt;What I take issue with is that Mr. Graham explains the lack of some other features by the fact that arc is for exploratory programming only, and those features are somehow a hindrance for that. I think this is just plain wrong: unicode support will hurt noone in their exploratory programming, it will actually help a lot of people a good deal. Mr. Graham quotes Guido van Rossum stating he spent a year implementing unicode. I very much doubt that that quote is correct, but *even if it were*, so what? That means exactly nothing to the exploratory programmer, and only hurts the exploratory *language designer* which I think may be a little closer to what is going on here.&lt;/p&gt;

&lt;p&gt;As an exploratory programmer in any language I've ever used, (I do think Mr. Graham correct in saying everyone is,) I can safely say that features have never harmed me, as long as they did not get in the way when I wasn't using them. Unicode support in python doesn't. In fact, python (my favorite language, *and* the one I'm most fluent in by now, so yes, I'm biased) is absolutely fantastic for exploratory programming, exactly because of its huge standard library, which helps you get to the meat of the task at hand, without having to build your own support library first.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-7001333730137997120?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/7001333730137997120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=7001333730137997120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7001333730137997120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7001333730137997120'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/02/exploratory-programming-or-my-2-on-arc.html' title='Exploratory programming, or my 2 ¢ on arc'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-6561281082642119268</id><published>2008-01-24T09:07:00.000-08:00</published><updated>2008-02-23T03:58:40.600-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='ogg'/><category scheme='http://www.blogger.com/atom/ns#' term='automation'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='wget'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>The Musical Gardener's Tools #4: Lazyweb, lazyweb on the wall...</title><content type='html'>&lt;p&gt;..who is the smartestest wgetter of them all?&lt;/p&gt;

&lt;p&gt;I need a little help here. As I've described as part of &lt;a href="http://thisfred.blogspot.com/2007/03/musical-gardeners-tools-2-more-sources.html"&gt;an earlier post&lt;/a&gt;, one of my sources for new music is wget, in combination with an ever growing list of mp3 blog urls. The ever growing part is now slowly starting to become a problem. I ran my update script yesterday evening and it took well over 12 hours to complete. (Mind you, I have fiberoptics to the door, speed is not an issue, at least not at my end.) That is unacceptable, in terms of energy wasted. Also the way it works potentially wastes a lot of bandwidth for the poor blog owners, mostly because files I have deleted are downloaded again, unless they were removed from the blog in the meantime. Note that this hits sites heavier that put up music I don't like or already have, but that should hardly be the measure of all things. Maybe. ;)&lt;/p&gt;

&lt;p&gt;I see two ways to solve this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;drastically clean up the list of urls that I harvest from.&lt;br /&gt;&lt;br /&gt;

This is possible, I do it semi-regularly, but new and interesting mp3 blogs keep popping up, so this is only a short term solution.&lt;br/&gt;&lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;filter out the stuff I know I don't want&lt;br/&gt;&lt;br/&gt;

To some extent, I know what I don't want to download. First of all, long podcasts and extended mixes (let's arbitrarily say, anything over 20MB,) since the way I like to listen to music is at the individual track level, otherwise all my tagging tools and last.fm don't work. Anyway we're getting past the whole idea that (web) music radio is consumed in an order predefined by someone else. More suggestion, less force feeding, kthxbye. (On a tangent: can we get this for news radio: just the news items, not a whole, usually extremely repetitive, bulletin as atomic? True podcasting should let me skip items I'm not interested in/have already heard.) Second of all, for obvious reasons, all the files I've already downloaded but deleted.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since I am far from a linux command line deity, I thought I would ask here, does anyone have any suggestions on how to start on tackling these two problems, given the script:&lt;/p&gt;


&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
wget --timeout=5 -U"Mozilla/5.0" -r -l1 -H -t1 -x -nc -np -P ~/mp3blogs/ -A.mp3,.ogg -erobots=off -i ~/mp3blogs/urls.txt
&lt;/pre&gt;&lt;/code&gt;
&lt;/div&gt;

&lt;p&gt;A: How can I limit the length of mp3s and oggs downloaded in this way to for instance 20MB per file? Keep in mind, throwing them away after downloading is not an option, since I want to prevent the download from happening at all. I don't think wget has a switch for this, so it will probably not be possible in a one liner.&lt;/p&gt;

&lt;p&gt;B: I would like to store all of the urls of the files I do download (probably just in a flat text file for now) and then have my script skip them when downloading. Again, I don't think a one liner is possible.&lt;/p&gt;

&lt;p&gt;Solutions to either problem are worth a 20$ amazon voucher from me (or somewhere else, I don't really care, as long as I'm out only 40$ total and it's not too much hassle to get it to you.)&lt;/p&gt;

&lt;p&gt;I am, of course, the sole judge of this contest, but I will try to be fair. You don't have to give me a whole script, I'm a fairly competent programmer, just not too deep into bash, but if you'll point me at where to start, and I get it to work, that counts as a solution. Although as I've said, it's going to grow beyond a one liner, I would like to keep it a simple script, and I'm not looking for an application. I could build one in Python myself, but I want to keep it zero maintenance, basically too simple to even put the code into subversion.&lt;/p&gt;

&lt;p&gt;UPDATE 2008-01-28: I'm now looking into pavuk, which may or may not have all the features I need. If this works, I just earned myself 40$ :)&lt;/p&gt;

&lt;p&gt;UPDATE 2008-01-28.1: pavuk, although having rather exotic naming of options and switches, seems to solve A quite nicely, which is a bandwidth (and time, and thus energy) saver. Finding all the right options was made much easier by &lt;a href="http://pavuk.cvs.sourceforge.net/*checkout*/pavuk/pavuk/wget-pavuk.HOWTO?revision=1.2000"&gt;this guide&lt;/a&gt;. I'm still thinking about solving B, there may be options in pavuk to help me with that too.&lt;/p&gt;

&lt;p&gt;For completeness' sake, the updated script looks like this (except it should all be one line...):&lt;/p&gt;

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
pavuk -timeout 5000 -identity "Mozilla/5.0" -lmax 1 -retry 1 -dont_leave_dir -cdir ~/mp3blogs/ -asfx .mp3,.ogg -noRobots
 -urls_file ~/mp3blogs/urls.txt -maxsize 30000000 -fnrules F '*' '%h/%d/%n'
&lt;/pre&gt;&lt;/code&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-6561281082642119268?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/6561281082642119268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=6561281082642119268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/6561281082642119268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/6561281082642119268'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/01/lazyweb-lazyweb-on-wall.html' title='The Musical Gardener&apos;s Tools #4: Lazyweb, lazyweb on the wall...'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-4881992700206451376</id><published>2008-01-23T03:53:00.000-08:00</published><updated>2008-02-23T03:55:53.022-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google calendar'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><category scheme='http://www.blogger.com/atom/ns#' term='calendars'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo pipes'/><title type='text'>Coolendar</title><content type='html'>&lt;p&gt;After reading &lt;a href="http://www.hypernarrative.com/wordpress/2008/01/22/building-a-party-calendar-with-lastfm-yahoo-pipes-and-google-calendar/"&gt;this  hypernarrative post&lt;/a&gt; about calendar mashups using yahoo pipes, I realized I could make my own filtered calendar feed for stuff events that are recommended to me by various sources, chiefly my last.fm recommendation feed. Since those sources tend to contain more noise than signal, at least for now, (automatic recommendation is hard, I read that somewhere,) and I tend to miss things because they get buried, I decided to take a page out of Wilbert's book, and become the editor of my very own event feed, mostly targeting myself, and perhaps one or two friends.&lt;/p&gt;

&lt;p&gt;Since I use thunderbird with the lightning and google calendar provider plugins, which tend to visually clutter when too many events show up, I can now show only this feed there. Once a month I copy everything that looks remotely interesting from the other calendar feeds by hand, and Bob's my uncle. The yahoo pipes part is cool, and I might redirect all the feeds I subscribe to into one big source funnel yet, but for now I don't need it. Also I like to see who recommended me what, so I can unsubscribe from feeds that turn out to be of less interest to me than I thought.&lt;/p&gt;

&lt;p&gt;So, without further ado, I present you with: &lt;a href="http://thisfred.jottit.com/coolendar"&gt;teh coolendar&lt;/a&gt;! (The actual ical feed is &lt;a href="http://www.google.com/calendar/ical/dp74c1ncvnqpoeo3696fo7108g%40group.calendar.google.com/public/basic.ics"&gt;here&lt;/a&gt;, for completeness' sake.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-4881992700206451376?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/4881992700206451376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=4881992700206451376' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/4881992700206451376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/4881992700206451376'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/01/coolendar.html' title='Coolendar'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-1434845698787457458</id><published>2008-01-17T02:14:00.000-08:00</published><updated>2008-01-17T04:31:55.148-08:00</updated><title type='text'>My top 50 artists for 2007</title><content type='html'>&lt;p&gt;In descending order of listening frequency:&lt;/p&gt;

&lt;p&gt;Bishop Allen, Bright Eyes, Belle and Sebastian, Beck, Nina Simone, De La Soul, Rilo Kiley, Joni Mitchell, Ween, Steve Earle, Aimee Mann, Johnny Cash, OutKast, John Prine, Casiotone for the Painfully Alone, Hank Williams, Dusty Springfield, The Knife, Johan, Frank Black, Gillian Welch, Tori Amos, Indigo Girls, of Montreal, Beth Orton, Gorillaz, The Flaming Lips, A Tribe Called Quest, Sultans of Ping F.C., Flip Kowlier, The Young Knives, Duvelduvel, The Thermals, Kaiser Chiefs, Billy Bragg, Jacques Brel, Missy Elliott, Elastica, M. Ward, Van Morrison, Devo, Peaches, Nouvelle Vague, Mates of State, Martha Wainwright, The View, Randy Newman, Tom Waits, Editors, Damien Rice&lt;/p&gt;

&lt;p&gt;There you have it, gentlemen, what more evidence do you need? Hardly anything very *now*, except maybe for The Thermals, The Young Knives and The View, all of which I personally didn't discover until 2007. Not terribly hip I'm afraid, but last.fm don't lie. :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-1434845698787457458?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/1434845698787457458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=1434845698787457458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/1434845698787457458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/1434845698787457458'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/01/my-top-50-artists-for-2007.html' title='My top 50 artists for 2007'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-8169982062349273712</id><published>2008-01-14T09:30:00.000-08:00</published><updated>2008-01-14T09:34:25.814-08:00</updated><title type='text'>last.fm dream job</title><content type='html'>Wow, &lt;a href="http://www.last.fm/about/jobs/#job_Metadata+Tzar"&gt;this&lt;/a&gt; sounds pretty amazing, it has programming, music metadata obsessiveness, and last.fm. Maybe they'd even let me use Python ;).

Shame the timing's a little off, I can't really move to London right now, should I even interview successfully. I wish whoever gets the job a lot of fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-8169982062349273712?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/8169982062349273712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=8169982062349273712' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/8169982062349273712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/8169982062349273712'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2008/01/lastfm-dream-job.html' title='last.fm dream job'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-492526613847802821</id><published>2007-12-04T08:20:00.000-08:00</published><updated>2007-12-04T08:26:33.647-08:00</updated><title type='text'>Premature migration</title><content type='html'>Ok, so I'm not ready just yet to go over to &lt;a href="http://jottit.com"&gt;jottit.com&lt;/a&gt;, cool and python based as the service is, the way it works is in too much flux to run a serious site on it for now. They've just completely changed the way the navigation works, so that my blog entries are no longer sorted, and show meaningless ids instead of titles in the text of the links. Also they now have rss/atom feeds, but they aren't very usable for the public. They show changes to pages, but for a blog, you mostly just want a feed of new entries, and a changes/deletions feed is more of an added feature. So happily back to blogger it is ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-492526613847802821?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/492526613847802821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=492526613847802821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/492526613847802821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/492526613847802821'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2007/12/premature-migration.html' title='Premature migration'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-7329691754046044407</id><published>2007-06-20T00:53:00.000-07:00</published><updated>2008-01-17T04:33:07.786-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='synchronisation'/><category scheme='http://www.blogger.com/atom/ns#' term='ogg'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='rsync'/><category scheme='http://www.blogger.com/atom/ns#' term='audio'/><title type='text'>The Musical Gardener's Tools #3: The Kitchen Sync</title><content type='html'>One of the potential downsides of obtaining your music from a large number of mixed quality sources is that your collection will be overrun by crap if you don't aggressively cull the crap. Since I listen to music on at least 4 machines (my laptop, my work desktop, my home desktop and my iAudio M5 hard drive player) synchronisation could become nightmarish: If I delete something from my laptop and I sync with any of the other machines, I don't want the deleted crap to reappear, but I do want new stuff I downloaded to get transferred.

The way I solved this is with a few scripts using the wonderful &lt;a href="http://en.wikipedia.org/wiki/Rsync"&gt;rsync&lt;/a&gt; and a bit of self-discipline:

&lt;h4&gt;syncing between computers&lt;/h4&gt;

I have two scripts on my work desktop called hello.sh and goodbye.sh. The former I run every day when I come into the office in the morning and this synchronizes all music from my laptop onto my desktop, including new, changed or deleted files:

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
#! /bin/sh
rsync -avz --delete laptop:~/ogg/ ~/ogg
~/ogg/mp3blogs/update
./rm_empty
rsync -avz --delete ~/ogg/ laptop:~/ogg
&lt;/pre&gt;
&lt;/code&gt;
&lt;/div&gt;

where 'laptop' is the hostname of the laptop, and 'update' and 'rm_empty' are the names of the scripts mentioned in &lt;a href="http://thisfred.blogspot.com/2007/05/new-lastfm-features-rock.html"&gt;a previous post&lt;/a&gt;. So, the script does the following, in order:

&lt;ol&gt;
&lt;li&gt;synchronize files from laptop to desktop&lt;/li&gt;
&lt;li&gt;download new files from selected mp3blogs to the desktop&lt;/li&gt;
&lt;li&gt;remove any empty directories under the ogg directory on the desktop&lt;/li&gt;
&lt;li&gt;synchronize files from desktop to laptop&lt;/li&gt;
&lt;/ol&gt;

That last step is actually redundant when I don't forget to use the accompanying 'goodbye.sh' script when I leave at night, but sometimes I do, when I have to run for a train.

The 'goodbye.sh' script is even simpler:

&lt;div class="code"&gt;
&lt;code&gt;
&lt;pre&gt;
#! /bin/sh
./rm_empty
rsync -avz --delete ~/ogg/ laptop:~/ogg
&lt;/pre&gt;
&lt;/code&gt;
&lt;/div&gt;

and does the following:

&lt;ol&gt;
&lt;li&gt;remove any empty directories under the ogg directory on the desktop&lt;/li&gt;
&lt;li&gt;synchronize files from desktop to laptop&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;syncing between a computer and a music player&lt;/h4&gt;

For this I wrote a little Python script, mostly because I like Python syntax much better than whatever shell script syntax (yeah, I'm new school), but it could be easily solved differently. The use case here is: all the music on any one of my computers will never fit on the puny 20GB my music player sports. That's ok, because this is only meant to hold the music I *know* I like, and to which I like to relax on the train to and from home. So the problem is we want to synchronize a subset of the music on (for instance) my desktop. I made a script that does this:

&lt;div class="code"&gt;
&lt;code&gt;
&lt;pre&gt;
#!/usr/bin/env python
from os.path import isdir
from os import listdir, system

local = '/home/eric/ogg'
iaudio = '/media/IAUDIO/MUSIC'

localdirs = listdir(local)
iaudiodirs = listdir(iaudio)

for entry in iaudiodirs:
    iaudio_path = iaudio + '/' + entry
    local_path = local + '/' + entry
    if isdir(iaudio_path):
        if entry not in localdirs:
            print "synching %s from iaudo to local" % iaudio_path
            system('rsync --size-only --delete --delete-excluded \
            --exclude-from= /home/eric/.rsync/exclude -avz \
            --no-group %s/ %s' % (iaudio_path, local_path))
        else:
            print "synching %s from local to iaudo" % entry
            system('rsync --size-only --delete --delete-excluded \
            --exclude-from= /home/eric/.rsync/exclude -avz \
            --no-group %s/ %s' % (local_path, iaudio_path))
&lt;/pre&gt;
&lt;/code&gt;
&lt;/div&gt;

With small modifications, this can be made to work with any music player that behaves like an external HD under Linux (obviously paths and directory names need to be changed, I did not try to make this script generic). 

What it does is run through all the artist directories on my player. 

If an artist directory exists there that is not on my desktop, it copies it, under the assumption that it is a new artist that I like and picked up somewhere or other.

If the artist directory *does* exist, it does the exact reverse: it syncs from the computer *to* the player, under the assumption that I only delete or add single files on the desktop, since it's too much of a hassle to do it on the music player directly.

If either of these assumptions are not valid in your case, obviously the script wouldn't work for you without some serious modification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-7329691754046044407?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/7329691754046044407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=7329691754046044407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7329691754046044407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7329691754046044407'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2007/05/musical-gardeners-tools-3-kitchen-sync.html' title='The Musical Gardener&apos;s Tools #3: The Kitchen Sync'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-4653755576778986049</id><published>2007-06-15T03:49:00.000-07:00</published><updated>2007-06-20T07:34:36.022-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='last.fm'/><category scheme='http://www.blogger.com/atom/ns#' term='artists'/><category scheme='http://www.blogger.com/atom/ns#' term='radio'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='festivals'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><category scheme='http://www.blogger.com/atom/ns#' term='bands'/><title type='text'>Metropolis 2007</title><content type='html'>Sunday july 1st is the annual free &lt;a href="http://www.metropolisfestival.nl"&gt;Metropolis festival&lt;/a&gt; in Rotterdam. I've never actually been, but heard great things about it, and it looks like this year has another great line-up, so I'm definitely planning on going this time.

I've tagged and bagged another radio station:

&lt;style type="text/css"&gt;table.lfmWidget20070615104851 td {margin:0 !important;padding:0 !important;border:0 !important;}table.lfmWidget20070615104851 tr.lfmHead a:hover {background:url(http://panther1.last.fm/widgets/images/en/header/radio/regular_grey.png) no-repeat 0 0 !important;}table.lfmWidget20070615104851 tr.lfmEmbed object {float:left;}table.lfmWidget20070615104851 tr.lfmFoot td.lfmConfig a:hover {background:url(http://panther1.last.fm/widgets/images/en/footer/grey.png) no-repeat 0px 0 !important;;}table.lfmWidget20070615104851 tr.lfmFoot td.lfmView a:hover {background:url(http://panther1.last.fm/widgets/images/en/footer/grey.png) no-repeat -85px 0 !important;}table.lfmWidget20070615104851 tr.lfmFoot td.lfmPopup a:hover {background:url(http://panther1.last.fm/widgets/images/en/footer/grey.png) no-repeat -159px 0 !important;}&lt;/style&gt;
&lt;table class="lfmWidget20070615104851" cellpadding="0" cellspacing="0" border="0" style="width:184px;"&gt;&lt;tr class="lfmHead"&gt;&lt;td&gt;&lt;a title="Music tagged metropolis 2007" href="http://www.last.fm/listen/usertags/thisfred/metropolis%202007" target="_blank" style="display:block;overflow:hidden;height:20px;width:184px;background:url(http://panther1.last.fm/widgets/images/en/header/radio/regular_grey.png) no-repeat 0 -20px;text-decoration:none;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="lfmEmbed"&gt;&lt;td&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="184" height="140" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab%23version=7,0,0,0" style="float:left;"&gt;&lt;param name="bgcolor" value="999999" /&gt;&lt;param name="movie" value="http://panther1.last.fm/widgets/radio/12.swf" /&gt;&lt;param name="quality" value="high" /&gt;&lt;param name="allowScriptAccess" value="sameDomain" /&gt;&lt;param name="FlashVars" value="lfmMode=radio&amp;amp;radioURL=usertags%2Fthisfred%2Fmetropolis%25202007&amp;amp;title=Music+tagged+metropolis+2007&amp;amp;theme=grey&amp;amp;autostart=&amp;amp;lang=en" /&gt;&lt;embed src="http://panther1.last.fm/widgets/radio/12.swf" type="application/x-shockwave-flash" name="widgetPlayer" bgcolor="999999" width="184" height="140" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer"  FlashVars="lfmMode=radio&amp;amp;radioURL=usertags%2Fthisfred%2Fmetropolis%25202007&amp;amp;title=Music+tagged+metropolis+2007&amp;amp;theme=grey&amp;amp;autostart=&amp;amp;lang=en" allowScriptAccess="sameDomain"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="lfmFoot"&gt;&lt;td style="background:url(http://panther1.last.fm/widgets/images/footer_bg/grey.png) repeat-x 0 0;text-align:right;"&gt;&lt;table cellspacing="0" cellpadding="0" border="0" style="width:184px;"&gt;&lt;tr&gt;&lt;td class="lfmConfig"&gt;&lt;a href="http://www.last.fm/widgets/?widget=radio&amp;amp;url=usertags%2Fthisfred%2Fmetropolis%25202007&amp;amp;colour=grey&amp;amp;width=regular&amp;amp;autostart=&amp;amp;from=code" title="Get your own widget" target="_blank" style="display:block;overflow:hidden;width:85px;height:20px;float:right;background:url(http://panther1.last.fm/widgets/images/en/footer/grey.png) no-repeat 0px -20px;text-decoration:none;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="lfmView" style="width:74px;"&gt;&lt;a href="http://www.last.fm/user/thisfred/" title="View thisfred's profile" target="_blank" style="display:block;overflow:hidden;width:74px;height:20px;background:url(http://panther1.last.fm/widgets/images/en/footer/grey.png) no-repeat -85px -20px;text-decoration:none;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="lfmPopup"style="width:25px;"&gt;&lt;a href="http://www.last.fm/widgets/popup/?widget=radio&amp;amp;url=usertags%2Fthisfred%2Fmetropolis%25202007&amp;amp;colour=grey&amp;amp;width=regular&amp;amp;autostart=&amp;amp;from=code&amp;amp;resize=1" title="Load this radio in a pop up" target="_blank" style="display:block;overflow:hidden;width:25px;height:20px;background:url(http://panther1.last.fm/widgets/images/en/footer/grey.png) no-repeat -159px -20px;text-decoration:none;" onclick="window.open(this.href + '&amp;amp;resize=0','lfm_popup','height=240,width=234,resizable=yes,scrollbars=yes'); return false;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-4653755576778986049?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/4653755576778986049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=4653755576778986049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/4653755576778986049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/4653755576778986049'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2007/06/metropolis-2007.html' title='Metropolis 2007'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-9102208952436012790</id><published>2007-05-21T06:41:00.000-07:00</published><updated>2007-05-29T01:33:17.305-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='artists'/><category scheme='http://www.blogger.com/atom/ns#' term='the netherlands'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='festivals'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><category scheme='http://www.blogger.com/atom/ns#' term='bands'/><category scheme='http://www.blogger.com/atom/ns#' term='lowlands'/><title type='text'></title><content type='html'>&lt;p&gt;I've started tagging the confirmed artists for &lt;a href="http://www.lowlands.nl"&gt;Lowlands 2007&lt;/a&gt; (as &lt;a href="http://www.last.fm/tag/lowlands%202007"&gt;lowlands 2007&lt;/a&gt;, surprisingly,) so watch that space for and ever updating radio station of all this year's edition goodness. I'll add the artists as they are officially confirmed. (There are some unconfirmed artists there, obviously tagged by people who know more. Looks like fun though, Cansei de Ser Sexy, yay!)&lt;/p&gt;

&lt;p&gt;And here's a radio player widget thingy, for that station:&lt;/p&gt;

&lt;style type="text/css"&gt;table.lfmWidget20070529083157 td {margin:0 !important;padding:0 !important;border:0 !important;}table.lfmWidget20070529083157 tr.lfmHead a:hover {background:url(http://panther1.last.fm/widgets/images/en/header/radio/regular_grey.gif) no-repeat 0 0 !important;}table.lfmWidget20070529083157 tr.lfmEmbed object {float:left;}table.lfmWidget20070529083157 tr.lfmFoot td.lfmConfig a:hover {background:url(http://panther1.last.fm/widgets/images/en/footer/grey.gif) no-repeat 0 0 !important;;}table.lfmWidget20070529083157 tr.lfmFoot td.lfmView a:hover {background:url(http://panther1.last.fm/widgets/images/en/footer/grey.gif) no-repeat -85px 0 !important;}table.lfmWidget20070529083157 tr.lfmFoot td.lfmPopup a:hover {background:url(http://panther1.last.fm/widgets/images/en/footer/grey.gif) no-repeat -159px 0 !important;}&lt;/style&gt;
&lt;table class="lfmWidget20070529083157" cellpadding="0" cellspacing="0" border="0" style="width:184px;"&gt;&lt;tr class="lfmHead"&gt;&lt;td&gt;&lt;a title="Music tagged lowlands 2007" href="http://www.last.fm/listen/usertags/thisfred/lowlands%202007" target="_blank" style="display:block;overflow:hidden;height:20px;width:184px;background:url(http://panther1.last.fm/widgets/images/en/header/radio/regular_grey.gif) no-repeat 0 -20px;text-decoration:none;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="lfmEmbed"&gt;&lt;td&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="184" height="140" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab%23version=7,0,0,0" style="float:left;"&gt;&lt;param name="bgcolor" value="999999" /&gt;&lt;param name="movie" value="http://panther1.last.fm/widgets/radio/3.swf" /&gt;&lt;param name="quality" value="high" /&gt;&lt;param name="allowScriptAccess" value="sameDomain" /&gt;&lt;param name="FlashVars" value="lfmMode=radio&amp;amp;radioURL=usertags%2Fthisfred%2Flowlands%25202007&amp;amp;title=Music+tagged+lowlands+2007&amp;amp;theme=grey&amp;amp;autostart=" /&gt;&lt;embed src="http://panther1.last.fm/widgets/radio/3.swf" type="application/x-shockwave-flash" name="widgetPlayer" bgcolor="999999" width="184" height="140" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer"  FlashVars="lfmMode=radio&amp;amp;radioURL=usertags%2Fthisfred%2Flowlands%25202007&amp;amp;title=Music+tagged+lowlands+2007&amp;amp;theme=grey&amp;amp;autostart=" allowScriptAccess="sameDomain"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="lfmFoot"&gt;&lt;td style="background:url(http://panther1.last.fm/widgets/images/footer_bg/grey.gif) repeat-x 0 0;text-align:right;"&gt;&lt;table cellspacing="0" cellpadding="0" border="0" style="width:184px;"&gt;&lt;tr&gt;&lt;td class="lfmConfig"&gt;&lt;a href="http://www.last.fm/widgets/?widget=radio&amp;amp;url=usertags%2Fthisfred%2Flowlands%25202007&amp;amp;colour=grey&amp;amp;width=regular&amp;amp;autostart=&amp;amp;from=widget" title="Get your own" target="_blank" style="display:block;overflow:hidden;width:85px;height:20px;float:right;background:url(http://panther1.last.fm/widgets/images/en/footer/grey.gif) no-repeat 0 -20px;text-decoration:none;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="lfmView" style="width:74px;"&gt;&lt;a href="http://www.last.fm/user/thisfred/" title="View thisfred's profile" target="_blank" style="display:block;overflow:hidden;width:74px;height:20px;background:url(http://panther1.last.fm/widgets/images/en/footer/grey.gif) no-repeat -85px -20px;text-decoration:none;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="lfmPopup"style="width:25px;"&gt;&lt;a href="http://www.last.fm/widgets/popup/?widget=radio&amp;amp;url=usertags%2Fthisfred%2Flowlands%25202007&amp;amp;colour=grey&amp;amp;width=regular&amp;amp;autostart=&amp;amp;from=widget&amp;amp;resize=1" title="Load this radio in a pop up" target="_blank" style="display:block;overflow:hidden;width:25px;height:20px;background:url(http://panther1.last.fm/widgets/images/en/footer/grey.gif) no-repeat -159px -20px;text-decoration:none;" onclick="window.open(this.href + '&amp;amp;resize=0','lfm_popup','height=240,width=234,resizable=yes,scrollbars=yes'); return false;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-9102208952436012790?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/9102208952436012790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=9102208952436012790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/9102208952436012790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/9102208952436012790'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2007/05/ive-started-tagging-confirmed-artists.html' title=''/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-4017507819969051233</id><published>2007-05-14T04:04:00.000-07:00</published><updated>2007-05-14T10:22:23.942-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='last.fm'/><category scheme='http://www.blogger.com/atom/ns#' term='google calendar'/><category scheme='http://www.blogger.com/atom/ns#' term='lightning'/><category scheme='http://www.blogger.com/atom/ns#' term='thunderbird'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='events'/><category scheme='http://www.blogger.com/atom/ns#' term='calendars'/><title type='text'>New last.fm features rock</title><content type='html'>&lt;p&gt;There are a few new features last.fm introduced last week (I guess it was last week, it may have actually been earlier, they're sneaky that way.) that make it an even more useful service than it already was.&lt;/p&gt;
&lt;p&gt;Along with the introduction of some shiny new widgets that are sure to appeal to the myspace crowd, they threw in some great new functionality:&lt;/p&gt;
&lt;h4&gt;RSS/Ical feeds for the recommended events.&lt;/h4&gt;
&lt;p&gt;YAY! Now I can see what artists that I listen to are playing venues near me. This is sure to make my schedule even more hectic and my wallet more empty. &lt;a href="http://upcoming.org"&gt;upcoming.org&lt;/a&gt; has been doing the same thing for a long time, but there are two reasons why I expect last.fm to work better for me: It does only music, whereas upcoming is starting to include a lot of business/tech conferences, which I have other channels for. It filters on my taste or where my friends are going, in addition to location, (upcoming only does locations), and it does that in a smarter way too: it allows you to set a geographic radius, instead of saying, I want to include these and these cities. I'm not sure how much difference this will make in practice, but I do like that I will be notified of stuff happening near me, even if it's happening just outside one of the cities in my area.&lt;/p&gt;
&lt;p&gt;One thing I like about upcoming that the last.fm don't yet seem to have is the buttons to send an event directly to a calendar. The ical feed can be used to send all events to a separate calendar, I guess, but I like a little more manual control. The 'Add this to your [foo] calendar' buttons in upcoming are a great thing. (For me foo==google calendar, especially now that it's fully integratable with thunderbird + lightning through &lt;a href="https://addons.mozilla.org/en-US/thunderbird/addon/4631"&gt;this nice plugin&lt;/a&gt;. Installation instructions &lt;a href="http://bfish.xaedalus.net/?p=239"&gt;here&lt;/a&gt;.)&lt;/p&gt;
&lt;h4&gt;Configure your overall top artist and top tracks lists to include the last 12, 6 or 3 months only.&lt;/h4&gt; 
&lt;p&gt;This is great if you have been using last.fm for a while, and would like your evolving interests to show up in your profile. For instance, I have listened to a *lot* of Joni Mitchell, and I suppose I will continue to do so, which means that she and other long time favorites tend to keep newer dicoveries out of my charts. Now that I've set the charts to show 12 months, she'll still be in the top 10, but not on 1st place, and other older artists which I've not been listening to quite so much anymore actually have a chance to drop out of the top 50.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-4017507819969051233?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/4017507819969051233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=4017507819969051233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/4017507819969051233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/4017507819969051233'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2007/05/new-lastfm-features-rock.html' title='New last.fm features rock'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-7208108743915430345</id><published>2007-03-07T09:01:00.000-08:00</published><updated>2007-08-23T02:43:55.334-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ogg'/><category scheme='http://www.blogger.com/atom/ns#' term='legal'/><category scheme='http://www.blogger.com/atom/ns#' term='free'/><category scheme='http://www.blogger.com/atom/ns#' term='mp3'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='downloads'/><title type='text'>The Musical Gardener's Tools #2: More Sources</title><content type='html'>&lt;p&gt;My second biggest source for new music is the web, where, with a little work, a lot of high quality free and legal stuff is to be had. Here are some of my tips:&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://www.last.fm"&gt;www.last.fm&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Easily my favorite website/service of the last years. For anyone still unfamiliar with it, what it does, in a nutshell, is keep track of all music you listen to on your computer (or even on your portable music player,) and generate &lt;a href="http://www.last.fm/user/thisfred"&gt;weekly and lifelong personal and global charts&lt;/a&gt; from that.&lt;/p&gt;

&lt;p&gt;While people with charts fetishes may feel that's quite exciting already, where last.fm positively shines is what it does with those charts; After a few hundred songs, it starts to compute your musical neighbours, and recommended artists you may or may not have heard of. It lets you listen to a personal 'recommended radio' station, which is in my opinion last.fm's greatest feature. It will play the artists last.fm thinks you might like based on your neighbours, in addition to personal recommendations from other users, and recommendations sent to groups you belong to.&lt;/p&gt;

&lt;p&gt;What I usually do is have 'recommendation fridays' where instead of starting my regular music player, I listen to recommendation radio all day. If stuff comes by that I really like, I check whether it's available as a download on last.fm, (there are &lt;a href="http://www.last.fm/charts/free/"&gt;loads of free downloads&lt;/a&gt;,) or see if it's available elsewhere.&lt;/p&gt;

&lt;p&gt;See the sidebar on the right for my weekly artist chart, and a link to 'thisfred radio' which you can listen to from any flash enabled browser, or from last.fm's own standalone music player.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://www.daytrotter.com"&gt;www.daytrotter.com&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;The Daytrotter Sessions are a great and consistently high quality source of unique mp3s. The idea is that bands touring the area stop by at daytrotter, exclusively record three or four songs, which are then put up as free mp3s on the site. The bands are usually on the indie side of the fence, and on the verge of breaking through, although there are some bigger names in the list.&lt;/p&gt; 

&lt;p&gt;To consistently make available a new interesting session at least every week for a good while now, is a pretty amazing achievement. The new edition is a welcome surprise in my bag o' RSS each week.&lt;/p&gt;

&lt;p&gt;A few of my personal favorites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.daytrotter.com/daytrotterSessions/68/free-songs-casiotone"&gt;Casiotone for the Painfully Alone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.daytrotter.com/daytrotterSessions/577/free-songs-about"&gt;About&lt;/a&gt;. This one just in, and maybe a bit chauvinistic, since they're from the Netherlands. I gather they'll be playing &lt;a href="http://2007.sxsw.com/"&gt;South by Southwest&lt;/a&gt; (see below) in Austin this month, so do check them out if you're there (if you are: I'm green with envy,) and in the mood for some high energy melodic bleepcore laptop pop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;&lt;a href="http://player.sxsw.com/torrents/"&gt;South By Southwest Showcase Torrents&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;I've never been to SxSW, but every year it looks like I'm missing a lot, and I definitely plan to save up and go there one year. That year won't be 2007 unfortunately. *Fortunately*, for us Atlantically challenged Erpians, SxSW makes available a torrent of mp3s from artists that will be playing the festival each year. Apparently, not all of the music industry is clueless. The torrents go back to 2005, and are pretty large. it's some 8GB of music, a *lot* of it very good.&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://amiestreet.com/"&gt;amiestreet.com&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;Just discovered this today: Amie Street is an mp3 web store with several twists: First of all: DRM-free, which is a sine qua non for me, but not terribly earth shattering. What is interesting is their business model: All mp3s start out as free, as in beer, downloads, but rise in price as they get more recommendations. People recommending the mp3s that get popular get a little kickback, if I understand correctly, which they can use to buy other mp3s. So it literally pays to check out new and unknown stuff, and the less adventurous/miserly users have a pretty good indication of popularity in the price of individual mp3s.&lt;/p&gt;

&lt;p&gt;After sifting through some of the free mp3s, I must say the quality is varied to say the least, but that's to be expected. What I think I'll do is shell out some money, and jump in after the first round of sifting through is done, and look for the gems in the 1-10¢ price range. Watch &lt;a href="http://amiestreet.com/users/thisfred"&gt;this space&lt;/a&gt; for my recommendations.&lt;/p&gt;

&lt;p&gt;I do think this might work as a business model, where you let users with little money pay with their time, and vice versa. It does feel right. And they don't just have completely unknown bands on there either. I already saw Barenaked Ladies and Au Revoir Simone advertised.&lt;/p&gt;

&lt;h4&gt;Your favorite mp3blogs and &lt;a href="http://www.gnu.org/software/wget/"&gt;wget&lt;/a&gt;&lt;/h4&gt;

&lt;p&gt;A slightly more geeky way to get your mp3s, which I originally found &lt;a href="http://www.veen.com/jeff/archives/000573.html"&gt;here&lt;/a&gt; and then slightly adapted to suit my particular needs better.&lt;/p&gt;

&lt;p&gt;As noted by Jeffrey in his post, using wget for this in the wrong way can cause bandwidth problems for the sites you are hitting, so use caution: presumably you are targeting those sites because you like the music they make available, causing them problems is probably not the best way to ensure they continue to do so.&lt;/p&gt;

&lt;p&gt;The way I call wget is:&lt;/p&gt;

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
wget -U"Mozilla/5.0" -r -l1 -H -t1 -x -nc -np -P ~/mp3blogs/ -A.mp3,.ogg -erobots=off -i ~/mp3blogs/urls.txt
&lt;/pre&gt;&lt;/code&gt;
&lt;/div&gt;

&lt;p&gt;(That should be all on one line.)&lt;/p&gt;

&lt;p&gt;My wget call differs from Jeffrey's in the following ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I added -nc which stands for 'no clobber', it means it won't re-download files that are already there, which I'm sure makes the site owners happier. I think the original does a checksum check on the files, so it won't reload them, *unless* they have changed. Since I use mp3gain on the files, and almost always correct some tags, that means they would always be downloaded again in my case, losing the changes I made...&lt;/li&gt;
&lt;li&gt;I removed -nd and added -x, which forces directories for the entire url path, because I like having the directories over a single directory with all the files: It shows me where the files came from, so I can give kudos for those I like, and if I end up getting a lot of crappy ones from a particular site, I can remove its url from urls.txt. This can mean a lot of empty directories after a while, but I have a script for that too, see below.&lt;/li&gt;
&lt;li&gt;I added .ogg to the file mask, just on the off chance that someone out there is providing oggs rather than mp3s.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some more nice wget tips can be found &lt;a href="http://applications.linux.com/article.pl?sid=07/01/08/2219231"&gt;here on linux.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the update, I run the following bash script to remove any empty directory trees that are created by using wget in this way:&lt;/p&gt;

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
#!/bin/bash
LS="$(find ~/mp3blogs -type d -empty)"
echo $LS
while [ -n "$LS" ]; do
    find ~/mp3blogs -type d -empty -print0 | xargs -0 rm -rf
    LS="$(find ~/mp3blogs -type d -empty)"
done
&lt;/pre&gt;
&lt;/code&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;[Edit 2007-08-23:]&lt;/strong&gt; One thing that script doesn't take into account is album covers: my &lt;a href="http://www.sacredchao.net/quodlibet"&gt;excellent music player&lt;/a&gt; lets me directly delete songs from the hard drive if I decide I don't like them, but when jpegs or playlist files remain in a directory when all the songs have gone, it won't ever get cleaned up. So I wrote a new version, that also takes an argument for the path:&lt;/p&gt;

&lt;div class="code"&gt;
&lt;code&gt;&lt;pre&gt;
set -u
find $1 -depth -type d | while read dir
do
    songList=`find "$dir" \( -iname '*.ogg' -o -iname '*.mp3' \)`
    if [[ -z "$songList" ]]
    then
        rm -rf "$dir"
    fi
done
&lt;/pre&gt;
&lt;/code&gt;
&lt;/div&gt;


&lt;p&gt;Then all that remains is to run the recursive mp3gain and vorbisgain commands I described in my previous post.&lt;/p&gt;

&lt;p&gt;Of course I call these 3 commands (and then some I will talk about in an upcoming post) from a single master script, called 'hello', which I run about once a day while I get morning coffee.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-7208108743915430345?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/7208108743915430345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=7208108743915430345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7208108743915430345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7208108743915430345'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2007/03/musical-gardeners-tools-2-more-sources.html' title='The Musical Gardener&apos;s Tools #2: More Sources'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-1575833554765217737</id><published>2007-02-25T15:24:00.000-08:00</published><updated>2007-03-10T10:09:31.968-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gain'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='tagging'/><category scheme='http://www.blogger.com/atom/ns#' term='ripping'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>The Musical Gardener's Tools #1: Ripping your CDs</title><content type='html'>&lt;p&gt;My number one source for music files is still plain old fashioned CDs, and I suspect it will be a while before anything changes that. I like browsing through the new stuff and the bargain bins, and I'll buy pretty much anything if it's cheap enough on the off chance that there's something worthwhile on there. Usually there isn't, but I did find a few gems over the years.&lt;/p&gt;

&lt;p&gt;For ripping CDs to ogg vorbis files (my favorite, but mp3s work just the same) I use &lt;a href="http://nostatic.org/grip/"&gt;grip&lt;/a&gt;, a great little ripper for Linux, that does everything I must have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rip to wav, usually even if the CD is 'protected' by some hare-brained DRM, although I make it a point not to consciously buy CDs with DRM, so I haven't tried with very many.&lt;/li&gt;
&lt;li&gt;look up metadata over the net, so I don't have to type over the liner notes.&lt;/li&gt;
&lt;li&gt;convert to ogg or mp3 with the quality settings of my choice. (Basically it calls the appropriate command line utilities, and you can specify the parameters.)&lt;/li&gt;
&lt;li&gt;save the files in a place and with a filename that I can fully specify. (I use oggs/artist/album/artist-album-tracknumber-title, everything lower cased, spaces replaced by underscores. I realize there's some redundancy in there, and the filenames are a tad long, but it does make identifying individual files by their filename easy.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those still left on windows, I recommend &lt;a href="http://cdexos.sourceforge.net/"&gt;CDex&lt;/a&gt; which I've used in the past and which has a nearly identical feature set. It's also open source.&lt;/p&gt;

&lt;p&gt;The next step is volume gain: when you listen to large playlist as opposed to single CDs, large differences in volume quickly become annoying. What I do is normalize the (perceived) volume of all my files, to prevent nasty headphone surprises and constant twiddling of volume knobs.&lt;/p&gt;

&lt;p&gt;On Linux there's the command line utilities vorbisgain (for oggs) and mp3gain, probably in your distribution already, I know they are in &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;. I use the following two commands, depending on whether I'm dealing with oggs or mp3s:&lt;/p&gt;

&lt;div class="code"&gt;
&lt;code&gt;
find . -name "*.mp3" -print0 | xargs -0 mp3gain -k -r -f #recmp3gain&lt;br /&gt;
find . -name "*.ogg" -print0 | xargs -0 vorbisgain -fr #recvorbisgain
&lt;/code&gt;
&lt;/div&gt;

&lt;p&gt;The find/xargs combo means that I process all files of the relevant type from the current directory and below. This works for huge numbers of files, where just calling find and the mp3gain or vorbisgain command would not.&lt;/p&gt;

&lt;p&gt;The comments at the end, #recmp3gain and #recvorbisgain, are of course not necessary. I just use them so that I can use CTRL-R on the command line, type '#recv' or '#recm' and have the entire command. You can do the same with an alias of course, but somehow I'm always hesitant to pollute the global namespace, and this is a nice alternative.&lt;/p&gt;

&lt;p&gt;The options mean find everything, skip the files that have already been adjusted, and check and adjust the rest. For large numbers of files, this can take a while and a lot of CPU. I use global gain rather than album gain, (which would keep the relative loudness of tracks from one album intact,) because then I would have to run the command on each album folder separately, and also it only really matters for classical albums, where the differences in loudness between tracks can be huge. I don't really listen to classical music much, but if you do, you probably want to use album gain.&lt;/p&gt;

&lt;p&gt;The last thing I usually do, is check the tags against &lt;a href="http://musicbrainz.org/"&gt;musicbrainz&lt;/a&gt;, with the &lt;a href="http://musicbrainz.org/doc/PicardDownload"&gt;picard&lt;/a&gt; tagger. The nice thing about that tagger is that it will recognize individual files, not just CDs, and the quality of the tag data is usually higher than that of freedb.org, which grip, and a lot of other CD rippers use. Also, it adds its own musicbrainz tags, which can be used by players or other software to look up the most current version of the tags in the musicbrainz database. For instance, the &lt;a href="http://www.last.fm/"&gt;last.fm&lt;/a&gt; plugin for my &lt;a href="http://www.sacredchao.net/quodlibet"&gt;favorite music player&lt;/a&gt;[&lt;a href="#1"&gt;1&lt;/a&gt;] uses that to submit information.&lt;/p&gt;

&lt;p&gt;[&lt;a name="1"&gt;1&lt;/a&gt;] More about that in another post.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-1575833554765217737?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/1575833554765217737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=1575833554765217737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/1575833554765217737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/1575833554765217737'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2007/02/musical-gardeners-tools-1-ripping-your.html' title='The Musical Gardener&apos;s Tools #1: Ripping your CDs'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9628557.post-7978660661602471817</id><published>2007-02-20T10:10:00.000-08:00</published><updated>2007-03-07T11:40:30.460-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>The Musical Gardener's Tools: Introduction</title><content type='html'>&lt;p&gt;A large part of my time is spent either actively or passively listening to music. As a rule, I don't really like radio, because of the repetitive and predictable music on it, and carrying CDs around is impractical, so what I usually do is listen to my collection of oggs and mp3s.&lt;/p&gt;

&lt;p&gt;To keep things interesting, I check a lot of sites periodically for new songs to download, and I tend to throw a lot of them away again after listening, the theory being that my collection is forever getting better and better through constantly keeping an eye on what grows there, and culling the crap, sort of like gardening. Or so I imagine.&lt;/p&gt;

&lt;p&gt;I'm also a big fan of last.fm, where everything I play is registered, (guilty secrets and all,) and which regularly recommends me some great new bands in return. Because last.fm only works when the id3 tags in your music files are correct, (*and*, I suspect, because I'm anal about categorizing stuff,) I also tend to do a lot of editing of same tags.&lt;/p&gt;

&lt;p&gt;Taking the above as a given, I'm constantly searching for the best tools to make my life easier, and I thought I'd share some of my favorites....&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9628557-7978660661602471817?l=thisfred.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thisfred.blogspot.com/feeds/7978660661602471817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9628557&amp;postID=7978660661602471817' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7978660661602471817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9628557/posts/default/7978660661602471817'/><link rel='alternate' type='text/html' href='http://thisfred.blogspot.com/2007/02/musical-gardeners-tools-introduction.html' title='The Musical Gardener&apos;s Tools: Introduction'/><author><name>thisfred</name><uri>http://www.blogger.com/profile/04987961040938197252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_vruC6bJjGl8/SQyIYZ9pR5I/AAAAAAAAABw/qbwEwjiyGFg/S220/629809.gif'/></author><thr:total>0</thr:total></entry></feed>
