Powered by Diet Coke

Journeys of an engineer, triathlete, and other stuff.

My newest productivity hack - I finally take notes!

Last week I finally finished something I’ve been planning for a while and started to use it regularly.

In the spirit of automation, and of getting everything out of my head and into a trusted system, I’ve wired together my calendar + my email + Evernote to make sure I take notes for every meeting that I go to, the same day before I forget. So before I go to bed every night, I just reply to emails in my inbox for each meeting and those notes get automatically tagged and filed in Evernote.

I’ve always thought (ok, since sometime after college) that taking notes was important…but I’m always busy/forgetful, and rarely did it. This improved slightly when I started carrying a Moleskine everywhere (now happily embossed with a Hearsay Social superhero thanks to Kathleen and team!), but I still forget a lot, and I also can’t search it!

One thing I am reasonably good at, though, is processing email. (I’m not sure if I should be proud of that, but it’s true). So if I can somehow force myself to take notes to get to Inbox Zero, maybe it’ll help.

Here’s the solution — I’ve only been using it for a week or two now, but so far so good.

A simple script runs every night around 7pm and looks at my calendar for the day and extracts all of the events…the new JSON-based Google Calendar APIs are a massive improvement over the old ones.

For each event, we classify it into one of a couple categories:

  • interview
  • regular (small) meeting
  • large meeting (eg. all-hands)
  • something to ignore
This is currently hard-coded with some simple heuristics (for example, travel time on my calendar always starts with “TT”; interviews always include the resource “scheduling@”; etc).
Depending on the type of event, behavior changes a little bit — for example, interview feedback needs to go to our recruiting team, so the Reply-To on the email is recruiting@hearsay . Ignored meetings obviously don’t need notes. Regular meetings should just go into my trusted system (in this case, Evernote), so the Reply-To is set to my secret Evernote email address. The subject is the title of the meeting, and “@Meeting Notes” is appended to filter it into the “Meeting Notes” notebook, and “#[email]” is appended for each participant so it gets tagged and I can later pull up all notes related to a specific person. (note to Evernote … tagging through email is pretty hit or miss!) The body of the email includes the location and original text of the invite, so it’s postpended to the note for future context.

Right now this is put together with chicken wire & duct tape, but happy to share if anyone is interested…with enough interest I might clean it up and open source/launch it.

Email-to-Voice-to-Dropbox

I have a long commute, and I get long emails. I’ve always wanted to just listen to them…but unfortunately Siri doesn’t do this (yet).

So it seems as though there should be a service where I can forward an email, and get back an audio file. Or even better, just put it somewhere that it’ll end up on my phone.

After a great weekend at PyCon with the Hearsay Social engineering team, tonight this problem seemed like a good excuse to learn some new stuff. 

A quick overview of how I did this is below, but the end result is simple: I send email to foo@bar.com, and an audio file with that text encoded ends up in a “To Read” folder on my iPhone.

—-

The code below is by no means good, but it also only took three hours from start to finish, and now I’m using it. Your mileage may vary—hit me up on Twitter @stgarrity if you have any trouble with it!

First up was Flask. We use Django at Hearsay Social and love it, but I needed none of the infrastructure for this…there’s no database, there’s only temporary local storage, and plus, new is fun!

pip install Flask

After getting Hello World up and running on Flask, I needed a way to receive inbound email. Mailgun was at PyCon this weekend, so that seemed as good an option as any. A free account will let you send a few emails (useful for confirmation) as well as post emails to your webserver as HTTP POST requests. The body parsing isn’t great, but it’s better than handling MIME by yourself, and certainly better than needing to run a mailserver.

Best part? No install needed! Just create an account, create a route (post mail addressed to “reader@YOURDOMAIN.mailgun.org” to http://YOURDOMAIN.com/reader/), and you’re all set.

Once I had the text of the email written out to a temporary file, I needed text-to-speech. The first result on Google was an open-source project called “espeak”, which looks good enough! It requires portaudio on Ubuntu (I do my personal hosting on Rackspace), so 

aptitude install libportaudio-dev

fixes that.

make && make install

So now we can generate a WAV file with the spoken text of the email (and some quick and dirty munging of the email to remove artifacts). Now we need to put it somewhere to consume from the phone.

Dropbox! Not only do they throw fantastic parties right across the courtyard from our office, they have a killer API, complete with a Python client. Download it,

python setup.py install

and voila. A few incantations later to get an OAuth token, and we’re done.

All of the code to glue this together is on GitHub, just insert your own tokens and such!

https://gist.github.com/2020469

or inline:

Why start a blog now?

I’ve never really been a content creator—maybe a content curator, but really I just like to make things work, not write about how I did it. But somewhere over the midwest tonight, a tweet from @prasanna made me want to give it a shot. 

I’m in the middle of an 8-cities-in-5-day customer tour, and tonight was yet another travel snafu. I got stuck in ORD for an extra 3 hours (over the 2-hour layover I already had). I tweeted about my portable power strip (amazing travel accessory), and P replied

prasanna@stgarrity you should write an ebook the nomadic workplace #workingonthego

For some reason this struck me, as things P says are wont to do. And so here goes.