Climbing Mountains or Digging Coal

I was talking to my manager today about what I want to do, specifically about how much of my time I want to spend coding and I came up with a new metaphor!

Coding, especially in Ruby, isn’t the same challenge it used to be. Do I still like it? Sure, it’s fun, and I fear obsolescence so I’d like to stay current as much as possible, but, I’m not scared of any problem I’ve faced in the last… 5 years? 10 years? I’ve been pretty confident I could solve them all.

With code, I’m not climbing mountains anymore, I’m digging coal. It has its dangers, but it’s mostly the same thing over and over again, no matter how much gets delivered or how happy people are, I’ve done it before, and am capable of doing it again.

I used to try something new on every project, and I still do that, but it’s less about code and more about how I work with other people. Mentoring and building people up feels way more like climbing mountains now. Seeing other people flourish and get to the next step of their careers is way more fun than solving technical problems.

What does that mean for my next career steps? Who knows, but it’s exciting to come to that realization.

Importing Rdio Playlists (and Your Collection) Into Google Music

My beloved Rdio is dying, and soon. They ran out of money, sold all their assets in a fire sale and have given their users about a week to find a new music home. I tried Apple Music, but quickly ran into limitations (song limit, my patience with their awful UI, horrible apps for importing songs, etc). Asking around, it looked like Google Music was the next best option.

And then the problem was, how to I get almost 5 years of musical history from Rdio into Google Music? All those favorites playlists from 2011-2015, the road trip playlists, the special occasion playlists… all of those will just disappear.

It took a lot of experimentation, but I found a way to export my playlists (and entire collection) from Rdio to Google Music. Here’s what you need (sorry, this is going to require some Terminal time):

  • First, you need to install the Rdio Enhancer Chrome Add-on.
  • Sign up for the Google Music free trial.
  • Install gmusic-playlist – it’s a python library for interacting with Google Music. It has some dependencies, so you’ll need to follow the README instructions carefully.

After you’ve gotten those installed, you need to do the following to save your playlists and collection in a format that’ll work with the importer:

  • Go to Rdio in Chrome.
  • Click Favorites.
  • You should see an Export CSV button. Click it. Depending on the size of your library, this could take a while. It’s going to generate CSV files for your entire collection. My 35,000 song collection took 3 CSV files, and about 5 minutes to generate and download them. Chrome will probably ask you if this site can download multiple files. Say yes and wait for all of them to download (15,000 songs per file).
  • Once you have all those files, it’s time to do playlists!

For each playlist you want to save:

  • Click its link in the left nav bar.
  • Click the 3 dots in a circle button (next to the share button), then “Extras”, then “Export to CSV”.
  • That’ll download another CSV file.
  • You should open up each CSV and delete the first line (the header) or you’ll end up with “Did She Mention My Name” by Gordon Lightfoot in all of your playlists. If that doesn’t bother you, go ahead skip this step.

Now that you have your collection and all the files you want to save, it’s time to set up the gmusic-playlist importer. After you unzip it, open the folder and then open in your favorite text editor and make the following changes:

  • username should be your google login email address.
  • Change the track_info_order line to look like this: track\_info\_order = \['title','artist','album','trackNumber'\] (the only change is to change “songid” to “trackNumber”).
  • Change allow_duplicates to True.
  • Change search_personal_library to False.
  • Save the file.

Now you can follow the gmusic-playlist directions to import all those CSVs. Google Music has a limit of 1,000 songs per playlist, so your collection will be broken up, but at least you’ll have all your songs!

Update: I tried to like Google Music. I really did. But, it has some fatal flaws:

  • Their new releases page is bad and not updated with actual new releases.
  • There’s no social at all. It’s awful.
  • The Web UI is just broken enough to be really frustrating, and all the web apps for it are hamstrung by the web’s brokenness.
  • They do very strange things with explicit lyrics.

So, I was going to update this post with instructions on how to import your official Rdio export into Google Music, but… don’t do that.

I’m trying out Spotify Premium again for the first time since I started using Rdio, and they’ve paid attention. Social is better. Sharing is better. The queue is persistent between sessions. They have more music than Rdio did, or that Google Music has. Their new releases page is actually mostly up to date.

Instead of using this process to import things to Google Music, use the official Spotify Rdio Import tool. It takes about five minutes and works really well.

Murray Wilson Is Awesome

My pal Murray Wilson does great things – he and AWOL take kids the system doesn’t want and teaches them to take apart, clean and refurbish computers the system doesn’t want – computers that would otherwise go to the landfill.

They then put linux on them and put them out into the community with families that need them. He’s one my absolute favorite people in Savannah (nay, the world) and I’m proud to know him.

The computers will, of course, end up in the landfill eventually, but the “Goon Squad” gives them easily another 2-5 years of life, and the kids learn useful and marketable skills. It’s a win-win, and an amazing program and Murray and AWOL built from the ground up.

If you can spare it, AWOL can always use some help. Every little bit helps, and every kid they help is one that’s not in the juvenile justice system or out on the street by themselves.

Murray is awesome in the best sense of the word.

Enabling Creativity

Max and I presented today at the Telfair’s Pulse art and technology fair for “family day”. Our presentation went over some of the fun stuff we’ve done together with technology and how people can get their kids to find creative outlets through geekery. We had a lot of fun, and Max had a blast presenting (he did a great job).\
Here’s how we came up with the presentation:

* Two weeks before the presentation, Max and I sat down and talked about what stuff we’ve played with he’d want to tell people about and built an outline.

* I went back later and created the actual presentation, filling in the gaps and figuring out what I wanted to say in the intro and conclusion.

* The week before the presentation, we practiced the demos and came up with the idea of having him tell me how to do everything (instead of the traditional “Mr. Wizard” style approach).

* The morning of, we went through it again and made sure he had some idea of what he wanted to say during his parts.\
I didn’t want to put a huge burden on him, since this was his first time in front of what could have been a large crowd. But, he was very involved in writing the presentation and walked me through all the demos.\
He had so much fun that he wants to present again, maybe at this year’s Geekend.\
Here are the slides if you’re interested:

Categorized as geekery

The Internet Fast

I’ve been stressed out a lot lately… and pretty consistently for the last two years. It finally came to a head this week, and I decided I needed a break from everything. So, I decided that yesterday through Saturday, I would try to live completely without the internet: no blackberry, no laptop, no wi-fi, no nothin’. Since it’s only Friday afternoon, you can see – it didn’t go so well.\
I’ve worked for AOL for over twelve years. In that time, I’ve only been completely offline for more than twenty-four hours twice: first when a bunch of friends and I went to Carlsbad Caverns and none of us had laptops yet (this was 1998), and in 1999 when Jen and I got married and went on a three day cruise. That’s over eight years of pretty much constant connection to e-mail, IM, and everything else.\
Back to the break… in the beginning of my internet life (1995), it was just e-mail, and not a lot of it. I worked with a relatively small number of people, I was relatively isolated within the company, and wasn’t involved in anything outside of work that would produce much e-mail. Then, came the buddy list and instant messaging. OK, two forms of interruption, but pretty much exclusively used for work and at work. Fast forward 12 years, and now here’s what’s built up in the almost thirty-six hours I was able to stay away until the DT’s got me and I had to check:

  • over 270 e-mails
  • over 2,100 unread items in my feed reader (from 581 feeds – recently pruned down from 680 – and I just marked them all read… didn’t even read ’em – it you blogged something you really need me to read, send me e-mail)
  • untold messages on twitter (I haven’t even checked… thankfully, I can ignore all of them and I don’t think anyone’s feelings will be hurt)
  • 45 Facebook notifications (also ignored, mostly because I don’t like Facebook)\
    I checked recently and I receive, on average, 21 instant messages an hour (that’s almost 200 during the course of my regular 9 hour work day).\
    If you figure that out over twenty-four hours and consider the last day and a half “average” (it feels like the normal flow), I handle over 1,700 distinct pieces of communication and information a day, and still manage to do my real job, which is not to just read e-mail, respond to IM’s and read feeds. This pace has only increased in the last five years, and doesn’t show any sign of slowing. It’s only getting worse.\
    I’m not sure what the point of this was, other than to document for myself how bad my information overload is and trying to explain to myself that it’s OK that I was overwhelmed. Dealing with this ever-increasing torrent of data every day for over a decade – it’s OK to take a day off. It’s OK to let people answer their own questions, let the world keep spinning while I take a day to close my eyes and read a book (I’ve been reading Pilgrim at Tinker Creek by Annie Dillard to try to cleanse my system from all the technical books I’ve been reading in my spare time… the most beautiful English prose I’ve read in a long time – a modern Walden).\
    I have another blackout day coming. Monday, I’m heading to London for the Future of Web Apps conference. I’m looking forward to the speakers, but, I’m really looking forward to the eight hours of uninterrupted (well, mostly) reading time on the plane where there’s no way for me to check my mail.

BarCampDC: The Kid Comes Along

Youngest BarCamper
by Kelly Gifford

(that’s Dr. Joe talking to Max)\
Max and I went to BarCampDC this Saturday. BarCamp is an “un-conference” (no set schedule, everyone participates), and they’re held all over the world. This one was organized by Jason Garber, Jackson Wilkinson and Justin Thorp. They did a great job, and were cool with Max coming and participating.\
I spoke on Rails, did the live coding demo I’ve done at other unconferences, and helped out in the portable social networking session.\
Here are some links related to those sessions:

  • Ficlets, Rails and OpenID – I used this presentation during the intro to show off some of what Rails can do (also has some good OpenID info).
  • Tapping the Portable Social Network – Explains some of the concepts behind the prototype I put together, and
  • Portable Social Networks – The blog post that explains the prototype and presents the flow (and has a link to download the app).
  • The International Day of Awesomeness – Because I “sponsored” (on accident, I swear), I got to speak before one of the sessions. Of course, I spoke about The International Day of Awesomeness.\
    Now that’s out of the way, let’s talk about Max! When I originally asked Max if he wanted to go to BarCamp with me, I wasn’t sure he’d want to go. We talked about it a couple times on the way to summer camp and the more he found out about it, the more excited he got. I was excited for him to see me give a presentation and see what it is that I do when I travel. He had a great time. Everyone was really great with him. He was so excited to talk about Scratch and Hackety Hack and to learn from everyone. He was by far the youngest attendee there (I mean, Jason only looks 15). He was insanely well-behaved, and other than him clicking markers together a couple times or tearing paper, he was as well-behaved as any of the adults. He zoned out a little bit in the afternoon, but I think most people did.\
    On the way home, we talked a lot about what he thought of the day. Even after almost twelve hours of non-stop geekdom (we left the house at 7:30AM and this was at about 7PM), he was asking when the next BarCamp was going to be (in the last twenty-four hours, he’s asked me when the next one is about ten times), and asking me if I’d help him do a presentation on animation and using Hackety Hack.\
    Thank you to everyone who sponsored BarCamp, helped organize things, presented, and talked to Max during the day. I can’t tell you how cool it was to watch him talking to people and share his passion. It was great to share that with him, and to see him get out there. He said afterwards that he was a little shy in the morning, but that everyone was really nice. Max is an interesting kid, and I love seeing him learn and discover new things – and I love being able to share the things I’m passionate about with him.

My boys

Kevin and Max spent Saturday at a computer conference-thingie. Max loved it. Much more than I was expecting. He did utilize the markers and paper I sent along though. He wants to present sometime on animation and scratch. I am not sure what computer professional would want to listen, but hey- go for it, kid. He came home all psyched to hop on the computer and get started with some new project but Kevin was too tired. This morning he woke up at 5:30 (maybe because Brian and I were already awake and making noise) and immediately went to the computer.\
Brian and I spent all day Saturday gorging on preseason football games! Wheee. Brian wasn’t so happy with this, actually. Too bad, kid, you’ve got another six months of football to endure! I tried to teach him how to catch a football, but my boobs kept getting in the way of the appropriate position. Booo.\
The other day I went clothes shopping for the boys and put the bags on the couch. Brian saw them and asked, “What’s this?” I told him it was some shirts for Max. Brian wanted a shirt too. Being awesome, I said, “I got you some too. Here they are,” and pulled out his totally cute new shirts. Brian flipped out! He started screaming and crying, “Too big, too big,” (which is what he says when he doesn’t like something). Jeeze, what a drama queen. He could give the people on Project Runway a lesson or two.\
Last week Max asked for his first pair of name-brand shoes. Sniff. They grow up so fast. Since the shoes, Skecher Airators, were on super sale and available during the tax-free weekend, I decided to get them. He was interested in them because the supposedly keep your feet color by letting air in, or air goes out. Something. After wearing them for a few minutes, he was disappointed by the lack of air wooshing. I was thinking about taking the shoes back, since he wasn’t so keen on them. “They don’t do a thing,” he said, but I decided that it would be a good lesson that commercials aren’t so accurate. Ten minutes later Max said he wants Skech-Airs. Headdesk.\
Brian’s started saying, “Yank you,” instead of “Go” for thank you. He also says, “Peek-a-you,” instead of peek-a-boo. Totally cute.\
Last week the boys came home from Babba’s with a toy pet. It was an egg that when put in water, a little rubber lizard hatches. Since then, it has more than doubled in size. I am not sure if it is still growing or not. It’s kind of awesome. Max named it Buddy 2, after my dad’s dog. I want another one of these things so Buddy can have a friend. Currently Buddy is living in my large glass mixing bowl. I am not sure we have room for two. Hmm. Max really wants a fish tank, so Kevin and I are going to get one for him for his birthday (no one steal our idea!). I need to make sure the tank is big enough to house Buddy too.\
Speaking of birthdays, Brian got screwed out of his big birthday gift. Kevin and I had decided to get him a little kitchen, but the store didn’t have the one I wanted. We then spent a few days checking out online stores and shipping rates. By this time, Brian’s birthday party was over and we just sort of forgot about it. Oops. The kids have way too many toys though. So many in fact that it is hard for me to go present shopping for them because they pretty much have everything- blocks, trucks, little people, etc. How many trucks do they really need? Plus, Brian only really plays with two marbles, two cars, and a handful of blocks all day long. This makes me feel not so bad about planning to box up half of their toys for storage and/or Goodwill.\
Let’s end on a random note. I rarely agree with Heather Havrilesky’s Salon column, but this week she pimps the season premiere of Weeds (I stopped watching) with my all-time favorite quote:

My all-time favorite is when Doug and Andy are getting high in the living room and Andy asks the housekeeper, “Lupita, settle an argument for us. What do you call the thing between the dick and the asshole?” She answers, “The coffee table.”

Man, look at all of the tags on this post!

AIM Pages

We’ve launched!! Hooray!! You can go check it out for yourself over here. If you want to create a profile, you can do that too. All you need is an AIM screen name (and who doesn’t have one of those?) to get started.\
This project has been more fun than anything else I’ve done in my \~11 years at AOL. It was full of huge technical challenges, was a great place for us to try out new things, and the team was probably the best I’ve ever worked with. From product management to QA to Operations and the rest of the developers, everyone pitched in, went the extra mile, pushed themselves to find the best (or at least the one that worked) solution, and kept a good sense of humor about it all.\
I started on this thing as a “consultant” and wasn’t supposed to write any code. I ended up:

  • joining the team responsible for it
  • writing a site’s worth of documentation
  • creating a microformat
  • coming up with a set of rules for writing CSS to accomodate modules, themes and user styles
  • writing almost a dozen modules (only some of which are actually live)
  • helping with dozens more, writing a bunch of themes, and making sure that over 60 themes were ready for launch.
  • spent late nights and weekends at the office debugging javascript
  • worked on convincing developers, management and design that web standards are the way to go
  • and discovered several one-line crashers for Internet Explorer (and one or two ways to make Firefox REALLY unhappy as well).\
    It’s not done, not by a long shot. There are still dozens of bugs and hundreds of features still to come. But, it’s a start. It’s all kinds of fun, not just for end users, but for developers too. One of my “secret” goals at the beginning of this project was to make module development easy enough that even “normals” could do it. And just this morning, sitting around a big conference table, there were three product managers talking about their modules. And my other secret goals? Here they are:
  • Get more people to learn the “right” way to write CSS.
  • Help microformats go mainstream.
  • Show the outside world that AOL can do innovative stuff, and that we support Open Source (we’re using the hell out of Dojo).
  • Show the outside world, and the internal development community, that using web standards don’t limit you. They help you. Creating modules for our product is so much easier than creating them for, dashboard or Google Homepage. Why? Because microformats are “just” HTML.\
    There you go. Go play. And while you’re at it, check out my profile.\
    Oh, and for all you Digg folks, I Am Alpha is not AIM Pages.