Headlines for Wednesday:

  1. I'm too lazy not to program (696 words)
  2. Lost some comments in the shuffle (134 words)
  3. Learning how to tell stories (61 words)
  4. Add joy to your job title (231 words)
  5. Optimizing your action loop (761 words)


Priorities - A: high, B: medium, C: low; Status - _: unfinished, X: finished, C: cancelled, P: pending, o: in progress, >: delegated.
A_Dylan McGuffin's birthday



1. I'm too lazy not to program: 07:26

Yesterday, I imported five years of blog posts into Wordpress through RSS. This would have been _painful_ if I wasn't comfortable with programming. With 4587 posts in 2596 files, I wouldn't have even thought about copying them over manually. Instead, I would have just started with a clean slate. I didn't think anyone's really going to want to go back and see everything I've written on my blog. ;) Who was going to notice?

But five years of blog posts—reflections, ideas, notes, interesting links—might still be worth something, so I decided to give it a shot. Initially, I wrote a function which visited files, searched for notes, and added the note to one big RSS feed. However, this slowed down too much when I hit megabytes, so I changed it to dump each note to a file in a directory.

;(sacha/planner-dump-rss "~/public_html/blog-dump/" nil nil)
(defun sacha/planner-dump-rss (directory from to)
  (let ((pages (planner-get-day-pages from to))
        (planner-rss-feed-limits nil)
        (planner-rss-initial-contents "")
    (while pages
      (condition-case err2
            (planner-find-file (caar pages))
            (setq buffer (current-buffer))
                  (goto-char (point-min))
                  (while (re-search-forward "^\\.#\\([0-9]+\\)" nil t)
                      (condition-case err
                            (let ((inhibit-read-only t)
                                  (file (concat directory
                                                (caar pages) "-"
                                                (match-string 1))))
                              (planner-rss-add-note file)
                              (find-file file)
                              (save-buffer 0)
                              (kill-buffer (current-buffer))))
                         (message "Problems processing note on %s: %s"
                                  (caar pages)
                                  (error-message-string err)))))))
              (kill-buffer buffer)))
        (error (message "Problems processing %s: %s"
                        (caar pages)
                        (error-message-string err2))))
      (setq pages (cdr pages)))))

I then concatenated all of these files using

cat header 200* footer > dump.rdf

This file was still much too big, so I manually split it by year, copying and pasting text into different files. I used http://www.feedvalidator.org to check for errors. After Feedvalidator verified that the files were all valid RSS, I tried to import them into Feedwordpress. Nope, still too big. I needed to trim them to around 400k, so I used the following code on the server:

(defun sacha/split-dump ()
  (goto-char (min 400000 (point-max)))
  (let ((counter 0)
        (base-name (file-name-sans-extension buffer-file-name)))
    (while (not (eobp))
      (re-search-backward "<item>")
      (kill-region (match-beginning 0) (point-max))
      (insert "</channel></rss>")
      (save-buffer 0)
      (find-file (format "%s%d.rdf" base-name counter))
      (goto-char (point-min))
      (insert "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<rss version=\"2.0\">
    <title>M-x plan :: sachachua's blog</title>
    <description>Sacha Chua's blog about Emacs, personal information management, open source, and random stuff</description>")
      (setq counter (1+ counter))
      (goto-char (min 400000 (point-max))))))

This program looks complicated, but it really isn't. In fact, I could have probably done something just as powerful with keyboard macros, not writing a single line of code. But the code was easy to write, and I figured that I'd keep it around just in case I needed to do something like this again.

After a little bit of manual tweaking, I got all the entries into http://sachachua.com/wp/ .

The ability to write short programs quickly and interactively has not only saved me so much time, but it's also made it possible for me to even _think_ of doing some things. =) I could probably have written the same snippets in Perl or Ruby, but being able to combine manual editing and automated operations in the text editor made it just so much faster. I really like being able to scan back and forth in buffers easily in Emacs, instead of thinking in terms of file streams as in other programming languages.

If you work with lots of text, I definitely recommend learning Emacs Lisp, or whatever language your editor can be programmed in. I started by reading other people's source code and the Emacs Lisp Intro and Emacs Lisp info files. I reread them countless times, picking up a little more each time I went through. Now Emacs Lisp is one of the first things I turn to whenever I want to save time doing something complex and repetitive on the computer, such as adding everyone's pictures to a wiki page. (That's a story for next time!)

Emacs is awesome stuff. More than 20 years old, it's the most advanced program I've ever used. What makes it special? It's _definitely_ optimized for the power user, and it provides so many reasons to become one.

Random Emacs symbol: gnus-summary-goto-last-article - Command: Go to the previously read article.

2. Lost some comments in the shuffle: 21:17

One of the downsides of posting code on your blog is that you tend to confuse your blogging software. In this case, some stray tags that I used in my RSS dumping code resulted in lots of errors in my blog. In a tizzy over the bug, I forgot about the first two public comments ever posted on my Wordpress blog, and I accidentally deleted them while trying to refresh my blog posts. This is a pity, as they were particularly nice comments too.

Ah, life. That's okay.

Just wanted to let you know what happened to them. And kids, if you're going to do this kind of shuffling around... save your data somewhere!

Random Emacs symbol: Custom-goto-parent - Command: Go to the parent group listed at the top of this buffer.

3. Learning how to tell stories: 21:34

Thanks to Michael Nielsen and Jennifer Dodd for highly recommending Made to Stick, a great book about storytelling. It arrived at the same time as The Elements of Persuasion, which made a terrific complementary read. Book notes to follow. =)

Random Emacs symbol: radians-to-degrees - Macro: Convert ARG from radians to degrees. - Variable: Radian to degree conversion constant.

4. Add joy to your job title: 21:53

Over at Matt's Idea Blog, Matthew Cornell has listed some of the coolest job titles he's seen. Not only that, he links to the people who've given themselves those job titles. Check those out for inspiration, and add joy to your own job description. Passion Catalyst! Continuous Self-Improvement Guru! =) How can you not want to get to know people like that?

What's my title? I'm somewhat in between titles. I'm moving away from being a tech evangelist because it doesn't capture my focus on processes and practices. I help companies help people connect. I want to get really good at spotting and telling great stories, refining and sharing best practices, and exploring new tools and new ways of doing things. I want to help companies enable more connection, more conversation, more collaboration... and more innovation. And I want to do all that and make it _fun._ Fun the way discovering how small the world is when you discover that the other person in the elevator with you also reads tons of books and you end up chatting about great reads all the way to the cafeteria and all throughout lunch. Connection is fun. Networking is fun. I want to make it easy.

Connection catalyst?

Random Emacs symbol: calendar - Command: Choose between the one frame, two frame, or basic calendar displays. - Group: Calendar and time management support.

5. Optimizing your action loop: 22:47

If you want to be radically more effective at doing things, get better at deciding what to do. Few things are more personal than figuring out what you're going to do with your life: at this moment, for this day, for the next few years. Few decisions are made as frequently. If you can improve the way you make that decision, you'll reap the benefits everywhere.

We've all developed some ways of coping. We all have our quirks. One of mine is that I can't settle on one way of planning my tasks. Some days, I'm all strategic and top-down, connecting my life goals with the tasks I plan to do that day. Other days, I just need to get a crucial task out of my head so that I don't forget it while hunting for my keys. Some days, I block out time to work on my priority projects. Other days, I have to work around other people's schedules, so it's all about cramming whatever I can into whenever I've got.

Now think of all the other geeks out there, and you'll understand how to-do list programs might outnumber programmers. Despite the collective efforts of companies like Microsoft and IBM, despite the coolness of Web 2.0 services like Remember the Milk, despite the renaissance of paper-based planners such as the Hipster PDA, I have never found anything as powerful as a plain text file in terms of personal productivity: a plain text file with shortcuts that are form-fitted to the way I work.

Here's what my workday looks like:

  • I do a _quick_ scan of e-mail to see if any tasks have come in. I copy those into my inbox. I resist the urge to reply right away, as that turns e-mail into a huge timesink.
  • 5-10 minutes are enough to schedule and prioritize my tasks for the day. I see both my calendar and my task list at the same time, and I can estimate my load. I leave plenty of space for things that come up. I feel better when I finish my scheduled tasks and then cross off a few more, than when I don't finish everything I planned and I have to postpone tasks to the next day.
  • I work on my highest-priority task for the day.
  • _Then_ I respond to e-mail.
  • Then I work through everything else in roughly 45-minute chunks, with some downtime in between to recharge my brain and take care of routine tasks.
  • My computer is set up to encourage me to take 10-second breaks every 5 minutes and 2.5 minute breaks every hour. The numbers are arbitrary, but the result feels good. This works out even better when I work from home: 2.5 minutes is just enough time to clear the sink, or to empty the dishwasher, or to start some tea...

A plain text file keeps me all organized, thanks to the Org module for the Emacs text editor. The text file shows me what's on my horizon and what's on today's schedule. The text file helps me deal with interruptions because it keeps track of what I was working on and what I need to do.

The text file even helps me learn more about myself and my skills through detailed time-tracking. Every time I start a task, the clock starts. Every time I mark a task as waiting or done, the clock stops, and the elapsed time is stored in the task. This helps me tune my time estimates and report time at the end of the week.

And it's just amazing. I don't feel that I waste a lot of time. I have a sense of progress. I can see the big picture, and things almost never fall through the cracks. (When they do, that's because I hadn't gotten around to putting them in my text file yet.) Sure, this still doesn't give me enough time to do everything I want to do, but I don't feel stressed out about it because I'm working well. From now on, most of the performance improvement will come from improving my skills and learning more.

If I can do this much as a new hire with a pretty nifty task management system, think about what you can do with all your experience. What _could_ you do if you spent less time fighting with your memory or with your TODO system, and more time making the difference you want to make?

Random Emacs symbol: edebug-stop - Command: Stop execution and do not continue.


  1. E-mail to Michael Nielsen, Jennifer Dodd
  2. Reply to Mad William Flint - sent today
  3. E-mail to Karen Quinn Fung
  4. E-mail to Martin Blais
  5. E-mail to Dave Boyd
  6. E-mail to Charles Cave
  7. E-mail to Bill Clementson
  8. E-mail to Carsten Dominik
  9. E-mail to Harris M. Falk
  10. E-mail to Mad William Flint
  11. E-mail to P.F. Hawkins
  12. E-mail to Aaron Hawley
  13. E-mail to Matthew Hippely
  14. E-mail to Paul Huff
  15. E-mail to Thomas Knoll
  16. E-mail to Chris Lowis
  17. E-mail to Paul Lussier
  18. E-mail to Mike Mattie
  19. E-mail to Michael McGuffin
  20. E-mail to Joel Samildanach
  21. E-mail to Neal Thomison
  22. E-mail to alice servera, Michael McGuffin

Inbox items: 53 as of 22:56