Oh no! I’m stuck in the doldrums.
My dad said that the difference between an amateur and a professional
is that a professional will deliver even when he doesn’t feel like it.
Or he’s good at making himself feel like it. Someday I’m going to
figure out how to be a professional writer.
Here are the five things I’m going to try to break this writer’s block:
See, that wasn’t so hard…
On Technorati: writing
Random Emacs symbol: make-char-table – Function: Return a newly created char-table, with purpose PURPOSE.
Okay, no more procrastinating.
I just spent the last couple of hours working on my finances. My ledger now shows all the details of my retirement funds. I can tell you how many units I have, at what price I bought them, their net gains since then, and what percentage they make of my portfolio. I’ve accounted for practically all the money in my savings account, and I divided that into envelopes that makes sense.
There isn’t much else to think about my finances. All I have to do now is keep earning.
The wonderful thing about procrastinating is that you get to do all these other things. I’m currently procrastinating working on a book about Emacs. There are several things I still need to describe in the chapter, such as tagging tasks, working with projects, and clocking time. But I wasn’t in the mood to write, and I gave myself permission to procrastinate the entire afternoon by learning the ins and outs of Ledger, a personal finance program with an Emacs interface. At the very least, I’ll have material for a future article.
And now back to task management.
I really want to share my code for reviewing Org timeclock entries for each date. However, it depends on functionality that’s only in the development version of Org. Do I tell people to change to that version? Do I try to make it work with the standard version that comes with Emacs? And the development version of Org comes with all sorts of nice goodies, too…
Okay, I figured out what to do. I’m going to include it, but I’ll use a distinctive background to show people that this is only available with a newer version of Org. That way, the bleeding edge geeks can still do all sorts of cool stuff.
Many professionals bill clients for their time. Even if you don’t, keeping track of the time you actually spend on tasks can help you improve your time estimates and check if you’re spending enough time on the things that are important to you. For example, keeping track of the time you spend on tasks might show you that you spend two and a half hours each day just responding to e-mail. If you can identify problem areas like that, then you can look for more effective ways to perform the tasks that take up a lot of your time.
I love Org’s timeclocking support, and I think you will too. Because it’s integrated with your task list, you don’t have to switch to separate application or reenter data. You can get more detailed time reports, too. All you have to do is remember to clock in before you start a task and clock out when you finish it.
You can clock in by moving your cursor to the task headline in either your organizer.org file or the org agenda view, and then pressing C-c C-x C-i (org-agenda-clock-in or org-clock-in, depending on context). This adds the time stamp to the task. If you are already clocked into another task in that organizer file, you’ll be clocked out of it to prevent you from accidentally double-billing.
To clock out of a task, type C-c C-x C-o from the task headline. Marking a task as done will also automatically stop the clock, if that was the task with the active clock.
Here’s some code to make this even easier. The following code clocks in whenever you market task is started, and clocks out when you market a task as WAITING. It also automatically market task is started if you clock in. This takes advantage of the Org configuration previously suggested in the Setup section. Add this to your ~/.emacs and evaluate it:
(eval-after-load 'org '(progn (defun wicked/org-clock-in-if-starting () "Clock in when the task is marked STARTED." (when (and (string= state "STARTED") (not (string= last-state state))) (org-clock-in))) (add-hook 'org-after-todo-state-change-hook 'wicked/org-clock-in-if-starting) (defadvice org-clock-in (after wicked activate) "Set this task's status to 'STARTED'." (org-todo "STARTED")) (defun wicked/org-clock-out-if-waiting () "Clock out when the task is marked WAITING." (when (and (string= state "WAITING") (equal (marker-buffer org-clock-marker) (current-buffer)) (< (point) org-clock-marker) (> (save-excursion (outline-next-heading) (point)) org-clock-marker) (not (string= last-state state))) (org-clock-out))) (add-hook 'org-after-todo-state-change-hook 'wicked/org-clock-out-if-waiting)))
What if you forgot to clock into a task when you started? No problem. Simply clock in and out of it, then edit the starting timestamp for the task in your ~/organizer.org file. To find a starting timestamp, move your cursor to the task headline. If the task has been collapsed to a single line, press TAB to expand it. Look for a line that starts with CLOCK:, or a collapsed segment that starts with :CLOCK:. If you see a collapsed segment, he expanded by moving a cursor to it and pressing tab. Find the clock entry you want to change, and if the timestamp, and press C-c C-y (org-evaluate-time-range) to update the time total.
To see how much time you’ve spent on a project or task, open your ~/organizer.org file and press C-c C-x C-d (org-clock-display). Total times will be added to each headline, summarizing the times for each subtree.
You can also use one of Org’s dynamic blocks. Open your ~/organizer.org file, move your cursor to where you want the report inserted, and type C-c C-x C-r (org-clock-report). By default, the reports will include all the second-level headings for all the days.
What if you want to limit the report to just the time you clocked last week?
To summarize it for a span of days, change the starting line from:
#+BEGIN: clocktable :maxlevel 2 :emphasize nil
to something like:
#+BEGIN: clocktable :maxlevel 2 :emphasize nil :tstart "<2007-12-25 Sun>" :tend "<2007-12-31 Mon>"
where tstart is the starting time/date and tend is the ending time/date. You can add the timestamps either manually or with C-c C-. (org-time-stamp). After you change the block definition, update the clock table by typing C-c C-x C-u (org-dblock-update).
You can also use a definition like:
#+BEGIN: clocktable :maxlevel 2 :emphasize nil :block today
to see today’s entries. Other block keywords are ‘yesterday’, ‘thisweek’, ‘lastweek’, ‘thismonth’, ‘lastmonth’, ‘thisyear’, or ‘lastyear’.
If you need more levels of headings, change the value of maxlevel. For example, to see a detailed clock table with up to 10 levels of headings, use
#+BEGIN: clocktable :maxlevel 10 :emphasize nil :block today
clocktable summarizes the reported time. What if you want the time broken down by day?
The following code creates a custom dynamic block that breaks the reported time by date. Add the following code to your ~/.emacs:
(defun org-dblock-write:rangereport (params) "Display day-by-day time reports." (let* ((ts (plist-get params :tstart)) (te (plist-get params :tend)) (start (time-to-seconds (apply 'encode-time (org-parse-time-string ts)))) (end (time-to-seconds (apply 'encode-time (org-parse-time-string te)))) day-numbers) (setq params (plist-put params :tstart nil)) (setq params (plist-put params :end nil)) (while (<= start end) (save-excursion (insert "\n\n" (format-time-string (car org-time-stamp-formats) (seconds-to-time start)) "----------------\n") (org-dblock-write:clocktable (plist-put (plist-put params :tstart (format-time-string (car org-time-stamp-formats) (seconds-to-time start))) :tend (format-time-string (car org-time-stamp-formats) (seconds-to-time end)))) (setq start (+ 86400 start))))))
After you load that code, you’ll be able to use a dynamic block of the form
#+BEGIN: rangereport :maxlevel 2 :tstart "<2007-12-25 Tue>" :tend "<2007-12-30 Sun>" ... #+END:
to see your time reported by date. Fill it in by moving your cursor within the block and typing C-c C-x C-u (org-dblock-update).
Org makes it easy to capture timeclock information by integrating the timeclock into your task list so that you don’t even have to think about it, and it can report this time by project or by date. You can use this information to bill clients, improve your time estimates, or reflect on the way you do things. All you have to do is clock in by marking a task as STARTED, and clock out by marking a task as WAITING or DONE. Don’t get discouraged if the time clock shows you do only a few hours of productive work each day. Use that to help you figure out how to do to things better!
Random Emacs symbol: term-previous-matching-input-string – Function: Return the string matching REGEXP ARG places along the input ring.
For the chapter on task management, I have 10,715 words or 38 pages of raw text that still need be edited. This probably means I’m going to miss my goal of December 31. I still need to write two more sections on using tags and projects, which will be roughly another 2,000 words. I’ll try to write another 1,000 words today. I’m planning to spend the evenings and all of January 1 working on this. I think I can finish it this week. I’ll e-mail my editor to adjust my goal one week forward.
The next chapter is the one on taking notes. It’s also 35 pages, and I’ve budgeted a month for it. If I push my current deadline forward one week, I might still be able to make it to my next deadline of January 31, 2008. The raw text should take me about six days of writing 2,000 words each. I’m planning to write about the one-file approach, Remember, Org, Planner, Howm, Records, and blogging from Emacs. Budget in maybe one weekend for editing, and that comes out to writing for three hours every other weekday and doing a little more work on it during weekends. This kind of schedule will help me avoid the mistake I did this month, which was focusing on work during weekday evenings and working on the book only during weekends.
I’m also happy to say that I’m getting the hang of dictating to Dragon NaturallySpeaking. I’ve trained it to recognize things like Emacs and C-c, and I’m getting used to working with a combination of typing and speaking. I carry a portable voice recorder with me, and I dictate into it after I’ve taken off my contact lenses and can’t work at the computer. I’ve been using it for blog posts, chapter drafts, and the occasional rant about Emacs versioning. I’m also getting the hang of not freaking out about the ungrammatical things that Dragon NaturallySpeaking thinks I’ve said.
And I like not having to type.
expertise and writing. It’s as true today as it was then, and my goal today is the same goal I had back then. I want to learn how to express my thoughts, and there’s no substitute for practice. Practice, practice, practice.It’s important to make room in your life for randomness. New ideas come from serendipitous juxtapositions. That’s why I have a Random Posts widget which picks some posts out of more than 4500 posts that I’ve written in the past five years. It gives me a reason to keep coming back to my own blog. For example, after I posted the entry on writer’s block today, I stumbled across an entry that I’d written over 2 years ago about
Practice means writing something even if I don’t feel like doing it. It’s funny, but once I start writing, things come a little more easily. Kirk is right. I don’t have to expect my first draft to feel right. I just have to get it out there, so that I can find out what I’m thinking, and I can edit it. Writing is mostly editing, anyway.
When I was writing my master’s thesis, I got stuck on chapters as well. What helped me then was the realization that it didn’t really matter what I put out was my first draft, because I was going to fix it. My supervisor was going to help me fix it. My thesis committee members were going to help me fix it. I just had to get the raw material out there, so that we all had something to play with. Once I got the raw material out there, putting together a full length draft that my supervisor could then read, things went so much faster.
I’m like that with this book as well. I need to get the chapters out of my head. It’s a little embarrassing posting all of these things and finding version dependencies, typos, bugs in my code, bugs in my writing… but the important thing is that it’s out there. I’m really lucky that people are reading it, commenting, correcting my errors, suggesting other things I can look into. I wouldn’t have that feedback if I didn’t write.
So I just have to get things out there. I need to throw some pots, because each pot will teach me something that will bring me closer to what I want to be able to do. I need to practice. I need to practice, practice, and practice. Even if it sometimes it doesn’t feel like I’m making much progress day by day, eventually I’ll get to the point where even I will be able to see the difference between how I’ll do things and how I used to do things before.
And hey, stuff like this gives me hope and something to stretch for. =)
Nope, neither; just writers. Writers who write for a living (ie they get paid to write in order to put food on the table and buy clothes for thier kids), write a lot and write a lot every day. For them, 10,000 words a day is just more of the same old same old, because theyâ€™d be writing 10,000 words per day even if they were not here on NaNo.