May 2014

On why frugal me is cool with paying other people to do things

May 1, 2014 - Categories: delegation, finance

I am frugal by nature. I do the mental calculations almost reflexively. Food is my favourite measure of equivalent value, since I rarely buy books these days. If I bike instead of taking public transit, that’s three Vietnamese sandwiches. For the price of dinner for two at Pho Hung, we could buy and roast two whole chickens. I hardly eat out, since I know I can make my favourite meals for $2-$4 a serving.

2014-03-06 Our frugal life #finance #frugality

2014-03-06 Our frugal life #finance #frugality

Many people who are working on financial independence take pride in doing as much as possible themselves. It’s a great way to save money and build a variety of skills. I usually do the same. It’s great knowing that fixing a washing machine doesn’t have to be a scary thing.

But there are some areas where I spend more than most people do, like outsourcing.  For example, even though no one expects transcripts for podcasts and even though I can transcribe my own posts, I pay other people to transcribe them for me. I pay people to research, draft, code, experiment, learn. I’m slowly getting the hang of passing on tasks even if I feel like I could learn a lot by doing things myself. If I outsource those tasks, then at least two people learn: my assistant and me. In fact, since they write down things I might otherwise just skim or take for granted, I can usually take what they send me and share that with other people.

For me, outsourcing is so much more than just a money-for-time trade off. I think of outsourcing as a way to help other people build up assets and skills as they figure out flexible work that fits their needs. It’s a way for me to learn from different perspectives and experiences, too. I don’t need stuff. I don’t crave experiences: no exotic vacations, no once-in-a-lifetime memories. I’d rather take advantage of the abundance to scale up and help others.

2014-01-28 What do I get out of delegation

2014-01-28 What do I get out of delegation

(See more in Ramping up delegation)

Independence matters to me. So does interdependence. If I can carve out enough to provide reasonable security for myself and I have the skills to go and earn more money if I need to, then I’ll use the surplus to make the world a little bit better. I had thought about focusing on stashing away more money so that we might have a greater margin of safety. (Who knows, maybe W- might even be able to retire.) I’m slowly adding to that stash, but that doesn’t rule out helping other people along the way.

I don’t want to become dependent on outsourcing. I make sure all my tasks are documented so that I can take over if needed. I establish financial limits so that outsourcing doesn’t encroach on my other plans. (This is one of the reasons why I like working with assistants on an as-needed basis instead of committing to a specific number of hours or tasks a month.) I learn from small experiments before I move on to larger ones. I prefer outsourcing to people who can learn from the experience instead of to established companies with polished solutions.

I don’t have to spend the money on this, but I decide to, and it’s worth it to me.

Getting R and ggplot2 to work in Emacs Org Mode Babel blocks; also, tracking the number of TODOs

May 2, 2014 - Categories: emacs, org, quantified

I started tracking the number of tasks I had in Org Mode so that I could find out if my TODO list tended to shrink or grow. It was easy to write a function in Emacs Lisp to count the number of tasks in different states and summarize them in a table.

(defun sacha/org-count-tasks-by-status ()
  (interactive)
  (let ((counts (make-hash-table :test 'equal))
        (today (format-time-string "%Y-%m-%d" (current-time)))
        values output)
    (org-map-entries
     (lambda ()
       (let* ((status (elt (org-heading-components) 2)))
         (when status
           (puthash status (1+ (or (gethash status counts) 0)) counts))))
     nil
     'agenda)
    (setq values (mapcar (lambda (x)
                           (or (gethash x counts) 0))
                         '("DONE" "STARTED" "TODO" "WAITING" "DELEGATED" "CANCELLED" "SOMEDAY")))
    (setq output
          (concat "| " today " | "
                  (mapconcat 'number-to-string values " | ")
                  " | "
                  (number-to-string (apply '+ values))
                  " | "
                  (number-to-string
                   (round (/ (* 100.0 (car values)) (apply '+ values))))
                  "% |"))
    (if (called-interactively-p 'any)
        (insert output)
      output)))
(sacha/org-count-tasks-by-status)

I ran this code over several days. Here are my results as of 2014-05-01:

Date DONE START. TODO WAIT. DELEG. CANC. SOMEDAY Total % done + done +canc. + total + t – d – c Note
2014-04-16 1104 1 403 3 1 104 35 1651 67%
2014-04-17 1257 0 114 4 1 171 107 1654 76% 153 67 3 -217 Lots of trimming
2014-04-18 1292 0 74 4 5 183 100 1658 78% 35 12 4 -43 A little bit more trimming
2014-04-20 1305 0 80 4 5 183 100 1677 78% 13 0 19 6
2014-04-21 1311 1 78 4 4 184 99 1681 78% 6 1 4 -3
2014-04-22 1313 2 75 4 4 184 99 1681 78% 2 0 0 -2
2014-04-23 1369 4 66 4 5 186 101 1735 79% 56 2 54 -4 Added sharing/index.org
2014-04-24 1371 3 69 4 5 186 101 1739 79% 2 0 4 2
2014-04-25 1379 3 60 3 5 189 103 1742 79% 8 3 3 -8
2014-04-26 1384 3 65 3 5 192 103 1755 79% 5 3 13 5
2014-04-27 1389 2 66 3 5 192 103 1760 79% 5 0 5 0
2014-04-28 1396 3 67 3 5 192 103 1769 79% 7 0 9 2
2014-04-29 1396 3 67 3 5 192 103 1769 79% 0 0 0 0
2014-04-30 1404 4 70 4 5 192 103 1782 79% 8 0 13 5
2014-05-01 1413 4 80 3 4 193 103 1800 79% 9 1 18 8

Here’s the source for that table:

#+NAME: burndown
#+RESULTS:
|       Date | DONE | START. | TODO | WAIT. | DELEG. | CANC. | SOMEDAY | Total | % done | + done | +canc. | + total | + t - d - c | Note                       |
|------------+------+--------+------+-------+--------+-------+---------+-------+--------+--------+--------+---------+-------------+----------------------------|
| 2014-04-16 | 1104 |      1 |  403 |     3 |      1 |   104 |      35 |  1651 |    67% |        |        |         |             |                            |
| 2014-04-17 | 1257 |      0 |  114 |     4 |      1 |   171 |     107 |  1654 |    76% |    153 |     67 |       3 |        -217 | Lots of trimming           |
| 2014-04-18 | 1292 |      0 |   74 |     4 |      5 |   183 |     100 |  1658 |    78% |     35 |     12 |       4 |         -43 | A little bit more trimming |
| 2014-04-20 | 1305 |      0 |   80 |     4 |      5 |   183 |     100 |  1677 |    78% |     13 |      0 |      19 |           6 |                            |
| 2014-04-21 | 1311 |      1 |   78 |     4 |      4 |   184 |      99 |  1681 |    78% |      6 |      1 |       4 |          -3 |                            |
| 2014-04-22 | 1313 |      2 |   75 |     4 |      4 |   184 |      99 |  1681 |    78% |      2 |      0 |       0 |          -2 |                            |
| 2014-04-23 | 1369 |      4 |   66 |     4 |      5 |   186 |     101 |  1735 |    79% |     56 |      2 |      54 |          -4 | Added sharing/index.org    |
| 2014-04-24 | 1371 |      3 |   69 |     4 |      5 |   186 |     101 |  1739 |    79% |      2 |      0 |       4 |           2 |                            |
| 2014-04-25 | 1379 |      3 |   60 |     3 |      5 |   189 |     103 |  1742 |    79% |      8 |      3 |       3 |          -8 |                            |
| 2014-04-26 | 1384 |      3 |   65 |     3 |      5 |   192 |     103 |  1755 |    79% |      5 |      3 |      13 |           5 |                            |
| 2014-04-27 | 1389 |      2 |   66 |     3 |      5 |   192 |     103 |  1760 |    79% |      5 |      0 |       5 |           0 |                            |
| 2014-04-28 | 1396 |      3 |   67 |     3 |      5 |   192 |     103 |  1769 |    79% |      7 |      0 |       9 |           2 |                            |
| 2014-04-29 | 1396 |      3 |   67 |     3 |      5 |   192 |     103 |  1769 |    79% |      0 |      0 |       0 |           0 |                            |
| 2014-04-30 | 1404 |      4 |   70 |     4 |      5 |   192 |     103 |  1782 |    79% |      8 |      0 |      13 |           5 |                            |
| 2014-05-01 | 1413 |      4 |   80 |     3 |      4 |   193 |     103 |  1800 |    79% |      9 |      1 |      18 |           8 |                            |
#+TBLFM: @[email protected]>[email protected]$2::@[email protected]>[email protected]$9::@[email protected]>$14=$13-$11-([email protected]$7)::@[email protected]>[email protected]$7

I wanted to graph this with Gnuplot, but it turns out that Gnuplot is difficult to integrate with Emacs on Microsoft Windows. I gave up after a half an hour of poking at it, since search results indicated there were long-standing problems with how Gnuplot got input from Emacs. Besides, I’d been meaning to learn more R anyway, and R is more powerful when it comes to statistics and data visualization.

Getting R to work with Org Mode babel blocks in Emacs on Windows was a challenge. Here are some of the things I ran into.

The first step was easy: Add R to the list of languages I could evaluate in a source block (I already had dot and ditaa from previous experiments).

(org-babel-do-load-languages
 'org-babel-load-languages
 '((dot . t)
   (ditaa . t) 
   (R . t)))

But my code didn’t execute at all, even when I was trying something that printed out results instead of drawing images. I got a little lost trying to dig into org-babel-execute:R with edebug, eventually ending up in comint.el. The real solution was even easier. I had incorrectly set inferior-R-program-name to the path of R in my configuration, which made M-x R work but which meant that Emacs was looking in the wrong place for the options to pass to R (which Org Babel relied on). The correct way to do this is to leave inferior-R-program-name with the default value (Rterm) and make sure that my system path included both the bin directory and the bin\x64 directory.

Then I had to pick up the basics of R again. It took me a little time to figure out that I needed to parse the columns I pulled in from Org, using strptime to convert the date column and as.numeric to convert the numbers. Eventually, I got it to plot some results with the regular plot command.

dates <- strptime(as.character(data$Date), "%Y-%m-%d")
tasks_done <- as.numeric(data$DONE)
tasks_uncancelled <- as.numeric(data$Total) - as.numeric(data$CANC.)
df <- data.frame(dates, tasks_done, tasks_uncancelled)
plot(x=dates, y=tasks_uncancelled, ylim=c(0,max(tasks_uncancelled)))
lines(x=dates, y=tasks_uncancelled, col="blue", type="o")
lines(x=dates, y=tasks_done, col="green", type="o")

r-plot

I wanted prettier graphs, though. I installed the ggplot2 package and started figuring it out. No matter what I did, though, I ended up with a blank white image instead of my graph. If I used M-x R instead of evaluating the src block, the code worked. Weird! Eventually I found out that adding print(...) around my ggplot made it display the image correctly. Yay! Now I had what I wanted.

library(ggplot2)
dates <- strptime(as.character(data$Date), "%Y-%m-%d")
tasks_done <- as.numeric(data$DONE)
tasks_uncancelled <- as.numeric(data$Total) - as.numeric(data$CANC.)
df <- data.frame(dates, tasks_done, tasks_uncancelled)
plot = ggplot(data=df, aes(x=dates, y=tasks_done, ymin=0)) + geom_line(color="#009900") + geom_point() + geom_line(aes(y=tasks_uncancelled), color="blue") + geom_point(aes(y=tasks_uncancelled))
print(plot)

 r-graph

The blue line represents the total number of tasks (except for the cancelled ones), and the green line represents tasks that are done.

Here’s something that looks a little more like a burn down chart, since it shows just the number of things to be done:

library(ggplot2)
dates <- strptime(as.character(data$Date), "%Y-%m-%d")
tasks_remaining <- as.numeric(data$Total) - as.numeric(data$CANC.) - as.numeric(data$DONE)
df <- data.frame(dates, tasks_remaining)
plot = ggplot(data=df, aes(x=dates, y=tasks_remaining, ymin=0)) + geom_line(color="#009900") + geom_point()
print(plot)

r-graph-2

The drastic decline there is me realizing that I had lots of tasks that were no longer relevant, not me being super-productive. =)

As it turns out, I tend to add new tasks at about the rate that I finish them (or slightly more). I think this is okay. It means I’m working on things that have next steps, and next steps, and steps beyond that. If I add more tasks, that gives me more variety to choose from. Besides, I have a lot of repetitive tasks, so those never get marked as DONE over here.

Anyway, cool! Now that I’ve gotten R to work on my system, you’ll probably see it in even more of these blog posts. =D Hooray for Org Babel and R!

Update 2014-05-09: Stephen suggested http://blogs.neuwirth.priv.at/software/2012/03/28/r-and-emacs-with-org-mode/ for more tips on setting up Org Mode with R and Emacs Speaks Statistics (ESS).

Emacs Chat: Xah Lee (ErgoEmacs)

May 3, 2014 - Categories: Emacs Chat, podcast

Update 2014-05-12: Transcript available at http://emacslife.com/emacs-chats/chat-xah-lee.html

I chatted with Xah Lee about how he got started with Emacs, how he’s customized it, and other tips he can share for people who want to learn more.

View the event page here.

Want just the audio? You can download the MP3.

See Emacs Chats for past episodes and information on how you can subscribe to this in your podcast reader.

Weekly review: Week ending May 2, 2014

May 3, 2014 - Categories: weekly

Even more Emacs geekery this week. =) It might be time to reclassify it from Discretionary – Emacs to Business – Build – Emacs or something like that.

Blog posts

Sketches

Link round-up

Focus areas and time review

  • Business (40.4h – 24%)
    • [ ] E1: Attend strategy session
    • [ ] Earn: E1: 2.5-3.5 days of consulting
    • [ ] File payroll return
    • [ ] Plan EmacsLife.com: What am I experimenting with?
    • [ ] Post transcript of Iannis Zannos’ chat
    • [ ] Record session on learning keyboard shortcuts
    • [ ] Record session with technomancy
    • [ ] Try delegating transcripts to Emacs geeks
    • [ ] Sketchnote a book
    • [ ] Start planning talk for International Lisp Conference
    • [ ] Write myself a cheque and remit the appropriate amounts
    • Earn (16.2h – 40% of Business)
      • [X] E1: Rename T groups
      • [X] E1: Work on A
      • [X] [#A] E1: Deploy B code
    • Build (15.4h – 38% of Business)
      • Drawing (2.4h)
      • Delegation (6.8h)
        • [X] Plan for delegation with Alex?
        • [X] Talk to Alex about delegation
      • Packaging (4.1h)
      • Paperwork (2.1h)
        • [X] Calculate how much I can pay myself and set up the appropriate transactions
        • [X] Learn more about pay-what-you-want
      • Emacs
        • [X] Try out the Org presentation tools
        • [X] Set up Jekyll on Windows so that I can export from Org
        • [X] Revise Emacs – ERC transcript
        • [X] Organize Emacs resources into starting/improving/enjoying
        • [X] Incorporate @philandstuff’s feedback
        • [X] Move list of videos into emacs-notes
        • [X] Move Emacs Chat transcripts to Github?
        • [X] Get a list of Emacs videos
        • [X] Create graphviz map for learning Org Mode for Emacs
        • [X] Copy all of my posts into Org files for offline use
        • [X] Make blog posts available offline
        • [X] Contemplate git or blog posts
        • [X] Build a directory of Emacs-related videos – maybe everything with at least 1000 views.
        • [X] Write about keybinding
        • [X] Add support page to emacs-notes
        • [X] Add more details to reading Emacs Lisp tutorial
    • Connect (8.7h – 21% of Business)
      • [X] Set up chat with masteringemacs
      • [X] Set up chat with Xah Lee
      • [X] Set up chat with Christopher Wellons
      • [X] Add April 2014 videos to Quantified Self blog post
      • [X] Upload April 2014 videos
      • [X] Invite mickeynp (Mastering Emacs) for an Emacs Chat
      • [X] Review new video and post it
      • [X] Go to Quantified Self meetup
      • [X] Revise backlog post for Fridge magazine
      • [X] Record session with Xah Lee
  • Relationships (4.7h – 2%)
    • [X] Set up cherry blossom party
    • [ ] Buy groceries for cherry blossom party
  • Discretionary – Productive (17.3h – 10%)
    • [X] Allocate funds on Kiva
    • [X] Find out how much compost I need to order
    • [X] Making my Emacs-related blog posts available for offline reading
    • [X] [#B] Read first chapter of Latin textbook
    • [X] Prepare litter box analysis presentation
    • [ ] Read chapter 2 of Latin textbook
    • Writing (1.0h)
  • Discretionary – Play (9.5h – 5%)
  • Personal routines (22.2h – 13%)
  • Unpaid work (9.0h – 5%)
  • Sleep (68.9h – 41% – average of 9.8 per day)

2048 in Emacs, and colours too

May 5, 2014 - Categories: emacs

While browsing through M-x list-packages, I noticed that there was a new MELPA package that implemented the 2048 game in Emacs. I wrote the following code to colorize it. Haven’t tested the higher numbers yet, but they’re easy enough to tweak if the colours disagree with your theme. =)

2014-04-16 23_27_25-emacs@SACHA-X220

(defface 2048-2-face '((t (:foreground "red"))) "Face used for 2" :group '2048-game)
(defface 2048-4-face '((t (:foreground "orange"))) "Face used for 4" :group '2048-game)
(defface 2048-8-face '((t (:foreground "yellow"))) "Face used for 8" :group '2048-game)
(defface 2048-16-face '((t (:foreground "green"))) "Face used for 16" :group '2048-game)
(defface 2048-32-face '((t (:foreground "lightblue" :bold t))) "Face used for 32" :group '2048-game)
(defface 2048-64-face '((t (:foreground "lavender" :bold t))) "Face used for 64" :group '2048-game)
(defface 2048-128-face '((t (:foreground "SlateBlue" :bold t))) "Face used for 128" :group '2048-game)
(defface 2048-256-face '((t (:foreground "MediumVioletRed" :bold t))) "Face used for 256" :group '2048-game)
(defface 2048-512-face '((t (:foreground "tomato" :bold t))) "Face used for 512" :group '2048-game)
(defface 2048-1024-face '((t (:foreground "SkyBlue1" :bold t))) "Face used for 1024" :group '2048-game)
(defface 2048-2048-face '((t (:foreground "lightgreen" :bold t))) "Face used for 2048" :group '2048-game)

(defvar 2048-font-lock-keywords
  '(("\\<2\\>" 0 '2048-2-face)
    ("\\<4\\>" 0 '2048-4-face)
    ("\\<8\\>" 0 '2048-8-face)
    ("\\<16\\>" 0 '2048-16-face)
    ("\\<32\\>" 0 '2048-32-face)
    ("\\<64\\>" 0 '2048-64-face)
    ("\\<128\\>" 0 '2048-128-face)
    ("\\<256\\>" 0 '2048-256-face)
    ("\\<512\\>" 0 '2048-512-face)
    ("\\<1024\\>" 0 '2048-1024-face)
    ("\\<2048\\>" 0 '2048-2048-face)))

(defun sacha/2048-fontify ()
  (font-lock-add-keywords nil 2048-font-lock-keywords))

(defun sacha/2048-set-font-size ()
  (text-scale-set 5))

(use-package 2048-game
  :config
  (progn
   (add-hook '2048-mode-hook 'sacha/2048-fontify)
   (add-hook '2048-mode-hook 'sacha/2048-set-font-size)))

Thinking about what I want to do with my time

May 6, 2014 - Categories: decision, experiment, planning, time

Every so often, I spend time thinking about what I want to focus on. I’m interested in many things. I like following my interests. Guiding them to focus on two or three key areas helps me avoid feeling split apart or frazzled.

I balance this thinking with the time I spend actually doing things. It’s easy to spend so much time thinking about what you want to do that you don’t end up doing it. It’s easy to spend so much time doing things that you don’t end up asking if you’re doing the right things. I probably spend slightly more time on the thinking side than I could, but that will work itself out over time.

I balance thinking with moving forward. It doesn’t matter if I might be going in the wrong direction, because movement itself teaches you something. You discover your preferences: more of this, less of that. You get feedback from the world. For me, moving forward involves learning more about technology, trying experiments, making things, and so on. Taking small steps helps me avoid spending lots of time going in the wrong direction.

(And are there really wrong directions, or just vectors that don’t line up as well?)

What do I want to do with my time?

Fitness: The weather’s warming up, so: more biking, more raking, more compost-turning, more carrying water to the garden. It would be good to be fitter and to feel fitter. I like the focus on fitness rather than exercise – not exertion for its own sake, but practical application.

Coding: I like coding. Coding might be a perfectly acceptable answer to the question “What do I want to do with my life?”, at least currently. I’ve been doing a lot more Emacs coding, and I’m digging into other technologies as well. I like it because I can build stuff – and more importantly, learning helps me imagine useful stuff to build.

I think I want to get better at making web tools that are useful and that look good, but I’m not sure. Lots of other people can do this, and I haven’t come up with strong ideas that need this. (Back to the need for a well-trained imagination!) I can wait to develop this skill until I have a stronger idea, or I can learn these skills to lay the foundation for coming up with ideas. I’ve been thinking about getting better at working with APIs, but that’s even more like digital sharecropping than creating content on other people’s platform is. APIs, pricing models, and all sorts of other things change a lot. I’m wary of investing lots of time in things that I have very little control over.

What would a few possible futures look like? I could be a toolmaker, building lots of little tools for niche audiences. technomancy and johnw are great role models for this. I could be a contributor or maintainer, building up part of something like Org or Emacs, or perhaps one of the modern Web stacks. If I need to keep a path back into the workforce, maybe back-end development would be a good way to do that. I like talking to fellow geeks anyway, so it’s okay if I don’t focus on front end–that way I won’t have to deal with fiddly browser differences or client tweaks.

Writing: Writing helps me learn more and understand things better. It saves other people time and tickles their brains. It’s also a great use of my time, although sometimes I feel like coding has more straightforward value.

Lots of people write. I want to write about things things that are not already thoroughly covered elsewhere. I want to be myself, not some generic blogger – to write (and draw!) things that are geeky and approachable. I like writing about Emacs (goodness knows how we need more documentation!), self-tracking, experiments, technology, and learning.

What’s on the backburner for now, then?

  • Sketchnoting other people’s content: Useful and easy to appreciate, but potentially distracting from the other stuff I want to do. I may make an exception for books, since I like reading anyway.
  • Spreading sketchnoting: I can leave this in the capable hands of Mike Rohde, Sunni Brown, and Dan Roam. I’ll still use sketchnoting to think through things, though, and I’ll share them on my blog and on Flickr.
  • Spreading alternative lifestyles (semi-retirement, portfolio careers, etc.): Jeff Goins, Pamela Slim, and Mr. Money Mustache are doing fine with this. I tend to stay away from giving advice, and I don’t want to inadvertently feed wantrepreneurship as a substitute for actually taking action. I’ll still write about my experiments and decisions, though.
  • Spreading blogging in general: I’ll answer people’s questions and encourage people along, but I won’t dig into this as much as I could. I might make an exception for tech blogging, because I have a vested interest in getting more geeks to blog – more search results to come across and more posts to learn from! ;)
  • Drawing better: I draw well enough for my purposes, and I want to keep things approachable.

What does this reflection teach me about what drives me?

  • I like the feeling of figuring things out and of contributing to something that will build over time.
  • I like positive feedback, but I can move away from it if I want. For example, people always ask me about sketchnotes, but I like Emacs stuff more even though it’s hard to explain in regular conversation.
  • If I don’t have a particularly strong idea for something I want to build, I can spend the time learning more about the capabilities of the tools I use. Along the way, I’m sure to run into lots of small gaps. I can fill those in to demonstrate my learning.
  • I tend to build things for my own convenience. I open it up if I think a web interface will be handy, and if other people find it helpful, that’s icing on the cake.

For amusement, you can check out my list of back-burner things from October 2013. Back then, I wanted to focus more on drawing and writing. This time, I’m geeking out. Yay! =)

Making my Emacs-related blog posts available for offline reading

May 7, 2014 - Categories: emacs

Deepak Tripathi wanted to know how to download all of my Emacs-related posts for offline reading. It makes sense to put together something like that. Xah Lee even charges for an organized ZIP copy of his site (and he’s put together a lot of resources). I like putting together free/pay-what-you-want things, so I figured I’d add my blog posts to my git repository of Emacs notes.

My blog runs on WordPress. It has a whole bunch of other posts in it, so a straightforward Jekyll import wouldn’t do the trick. I had previously modified my WordPress theme to add a special ?dump=1 parameter for single post pages so that I could use it to archive pages. The first thing I needed to do was to come up with a list of Emacs-related blog posts.

Fortunately, http://sachachua.com/blog/emacs already lists all the pages in the Emacs category. I copied the HTML source for the list and started tinkering with the text. It was a good excuse to try the visual-regexp package – the vr/replace command made working with match groups much easier. Eventually I ended up with a list that looked like this:

wget -p http://sachachua.com/blog/2014/04/thinking-todo-keywords/?dump=1
wget -p http://sachachua.com/blog/2014/04/reflecting-10-episodes-emacs-chats/?dump=1
wget -p http://sachachua.com/blog/2014/04/org-mode-helps-deal-ever-growing-backlog/?dump=1
wget -p http://sachachua.com/blog/2014/04/reinvesting-time-and-money-into-emacs/?dump=1
...

This downloaded the posts and included images. Next, I wanted to process the downloaded HTML pages and turn them into Org files, since I’m more familiar with Org than with Markdown. Pandoc to the rescue! I took the output of find -name \*.html\* and processed it with lots more vr/replace

dos2unix ./sachachua.com/blog/2003/07/emacspeak-creator/index.html?dump=1; (echo "<html><body>"; cat ./sachachua.com/blog/2003/07/emacspeak-creator/index.html?dump=1; echo "</body></html>") > test.html; pandoc test.html -o 2003-07-emacspeak-creator.org
dos2unix ./sachachua.com/blog/2003/07/instructionalsoftwaredesign/index.html?dump=1; (echo "<html><body>"; cat ./sachachua.com/blog/2003/07/instructionalsoftwaredesign/index.html?dump=1; echo "</body></html>") > test.html; pandoc test.html -o 2003-07-instructionalsoftwaredesign.org
dos2unix ./sachachua.com/blog/2003/07/interesting-mail-stats/index.html?dump=1; (echo "<html><body>"; cat ./sachachua.com/blog/2003/07/interesting-mail-stats/index.html?dump=1; echo "</body></html>") > test.html; pandoc test.html -o 2003-07-interesting-mail-stats.org
dos2unix ./sachachua.com/blog/2003/08/emacs-macros/index.html?dump=1; (echo "<html><body>"; cat ./sachachua.com/blog/2003/08/emacs-macros/index.html?dump=1; echo "</body></html>") > test.html; pandoc test.html -o 2003-08-emacs-macros.org

This is a pretty long command line because I didn’t bother with writing a shell script to process files. When I tried running pandoc on the HTML snippets, it choked because the file didn’t have html or body tags, so I ended up adding them with echo before processing them with pandoc.

Anyway, now I had a lot of Org files. I wanted to rename them and clean up the titles. I used this totally hackish bit of code to process all the files in the directory, changing the header to a title and adding the day to the filename (just in case I want to move to Jekyll someday).

(defun sacha/process-blog-posts ()
  (interactive)
  (mapcar (lambda (x)
            (find-file x)
            ;; Set the title
            (goto-char (point-min))
            (when (looking-at "\\(\\*\\*\\)")
              (replace-match "#+TITLE:"))
            (save-buffer)
            ;; Rename the file
            (when (re-search-forward "\\([0-9]+\\)\\(th\\|nd\\|st\\|rd\\), \\([0-9]+\\)")
              (let ((day (match-string 1)))
                (rename-file
                 (buffer-file-name)
                 (replace-regexp-in-string
                  "/\\([0-9]+\\)-\\([0-9]+\\)-"
                  (concat "/processed\\&" day "-")
                  (buffer-file-name)))))
            (kill-buffer))
          (directory-files "." nil ".org$")))

I also wanted to change the image references to use the images that wget had downloaded into my uploads directory. This time I used wgrep, which is awesome. The wgrep package makes grep results editable if you use wgrep-change-to-wgrep-mode (bound to C-c C-p by default, but you can change wgrep-enable-key). If you combine that with vr/replace from visual-regexp or some keyboard macros, you can edit a whole lot of things quickly. Save the changes with C-x C-s (wgrep-finish-edit), and you’re done!

So now I had a bunch of Org files that were in reasonable shape. I wanted to regenerate the HTML pages so that people could browse them even if they weren’t familiar with Org. I set up the relevant org-publish-project-alist entries in a build-site.el that a Makefile could use, and I published the project.

Going from HTML to Org to HTML meant losing some information and lots of my blog posts need reviewing, but it’s a good start. Since I draft many of my Emacs-related blog posts in Org anyway, I can copy the Org source into my emacs-notes repository going forward.

Anyway, there you have it for your grepping pleasure! https://github.com/sachac/emacs-notes/

Monthly review: April 2014

May 8, 2014 - Categories: monthly, review

Last month, I wrote:

In April, I want to:

  • Record and set up more Emacs chats
  • Make open source contribution part of my routine (mailing lists, patches, sharing)

And I did! I moved my Emacs writing workflow online and committed lots of code for different things I was working on. Here’s my Github heatmap as of May-ish:

2014-05-07 21_33_48-sachac (Sacha Chua).png

I’ve been experimenting with focusing more on Emacs. https://github.com/sachac/emacs-notes is coming along nicely, and I’ve started fleshing it out as http://emacslife.com . The guide on how to read Emacs Lisp is now more than 8,000 words, and it has greatly benefited from people’s feedback. =)

I completed my 10-episode goal for Emacs Chats and am starting on another “season”, now that inviting people is less intimidating. It’s fun, and I’ve been hearing from people who find the chats interesting as well. I wonder how I can make this more useful…

The weather has finally warmed up, so I’m back to gardening and biking. (Yay biking! =D) At first I thought our soil was doing okay. Once the rains lightened up, I found that the soil was still pretty sandy. I’ll need to add lots of compost. Still, a number of seedlings are on their way up. Yay!

On my consulting gig, I learned a lot about Tableau and reporting. Looks interesting. On a personal note, we’ve been tracking litter box use, and I now have more than seven hundred rows of data. Still haven’t automated the analysis, though. =)

I’m working on writing based on outlines and getting better at creating e-learning resources. I also need to prepare for a possible talk at the International Lisp Conference in August, too.

In May, I want to:

  • Learn how to write extensions for E1
  • Develop “How to Read Emacs Lisp” into a proper course, with objectives, modules, exercises and other useful things
  • Add compost and herbs to our garden

Blog posts

Time use

Label Hours Percent Notes
Business 160.0 22% Earn: 73.1, E1: 64.5, Connect: 28.0, Build: 58.9; average 37h/week
Discretionary 149.6 21% Social: 13.3, Productive: 90.8 (Writing: 29.2, Emacs: 39.7), Play: 28.8
Personal 97.6 14% Routines: 50.7
Sleep 264.0 37% Average of 8.8 hours per day
Unpaid work 48.8 7% Commuting: 21.5, Cook: 10.8, Tidy: 1.6

Update on time tracking with Quantified Awesome and with Emacs

May 9, 2014 - Categories: quantified

With another Quantified Self Toronto meetup in a few weeks and a conversation with fellow self-trackers, it’s time for me to think about time again.

I’ve been fixing bugs and adding small pieces of functionality to Quantified Awesome, and I spent some time improving the integration with Emacs. Now I can type ! to clock in on a task and update Quantified Awesome. Completing the task clocks me out in Emacs and updates Beeminder if appropriate. (I don’t update Quantified Awesome when finishing a task, because I just clock into the next activity.) This allows me to take advantage of Org’s clock reports for project and task-level time, at least for discretionary projects that involve my computer. I’m not going to get full coverage, but that’s what Quantified Awesome’s web interface is for. It takes very little effort to track things now, if I’m working off my to-do list. Even if I’m not, it still takes just a few taps on my phone to switch activities.

Most of my data is still medium-level, since I’m still getting the hang of sorting out my time in Emacs. Looking at data from 2014 so far, dropping partial weeks, and doing the analysis on April 14 (which is when I’m drafting this), here’s what I’ve been finding.

  • I sleep a little more than I used to: an average of 8.9 hours a day, or 37% of the time. This is up from 8.3 hours last year.
  • It takes me about an hour to get ready in the mornings. If I have a quick breakfast instead of having rice and fried egg, I can get out the door in 30-45 minutes.
  • It takes me 50-60 minutes to get downtown, whether this is by transit or bicycle. Commuting takes 3% of my time.

Little surprises:

  • I’ve spent almost twice as much time on business building or discretionary productive activities (19%) as I have earning (11%) – good to see decisions in action!
  • I’ve spent more time drawing than writing this year (5% vs 3%). Next to writing, Emacs is the productive discretionary activity I spend most of my time on (2%).
  • I’ve spent 10% of my time this year on connecting with people, a surprisingly high number for me. E-mail takes 1% of my overall time.
  • It turns out that yes, coding and drawing are negatively correlated (-0.63 considering all coding-related activities). But writing and drawing are positively correlated (0.44), which makes sense – I draw, and then I write a blog post to glue sketches together and give context. Earning is slightly negatively correlated with building business/skills (-0.15), but connecting is even more negatively correlated with time spent building business/skills (-0.35). So it’s probably not that consulting takes me away from building skills. Sleep is slightly negatively correlated with all records related to socializing (-0.14), but strongly negatively correlated with productive discretionary activities (-0.55). Hmm. Something to tinker with.

Some things I’m learning from tracking time on specific tasks:

  • Outlining doubles the time I take to write (and drops me from about ~30wpm to about 9wpm), but I feel that it makes things more structured.
  • Drawing takes longer too, but it makes blog posts more interesting.
  • Trying to dictate posts takes me way more time than outlining or typing it, since I’m not as used to organizing my thoughts that way.
  • Encoding litter box data takes me about a minute per data point. So spending a lot of time trying to figure out computer vision and image processing in order to partially automate the process doesn’t strictly make sense, but I’m doing it out of curiosity.
  • I generally overestimate the time I need for programming-related tasks, which is surprising. That could just be me padding my estimates to account for distractions or to make myself feel great, though.
  • I generally underestimate the time I need to write, especially if I’m figuring things out along the way.

This post took me 1:20 to draft (including data analysis), although to be fair, part of that involved a detour checking electricity use for an unrelated question. =)

Emacs Chat: Phil Hagelberg

May 10, 2014 - Categories: emacs, Emacs Chat, podcast

Update 2014-06-13: Transcript now available

Phil Hagelberg talks about custom keyboards, pair-programming with syme.herokuapp.com , Clojure REPLs, starter kits and better defaults, packages, helping his kids learn to think systematically, and warming up his shed-turned-office through XMPP (from Emacs, no doubt).

Quick links: http://technomancy.us , https://syme.herokuapp.com/ , http://github.com/technomancy/better-defaults , https://github.com/technomancy/dotfiles/tree/master/.emacs.d , http://leiningen.org/ , http://technomancy.us/171 (heater), http://atreus.technomancy.us (keyboards)

Guest: Phil Hagelberg

For the event page, you may click here.

Want just the audio? Get it from archive.org: MP3

Transcript

Check out Emacs Chat for more interviews like this. Got a story to tell about how you learned about or how you use Emacs? Get in touch!

 

Weekly review: Week ending May 9, 2014

May 11, 2014 - Categories: weekly

More Emacs-y things. =) Also, the weather has finally warmed up, hooray! I turned the compost heap for the first time this year, and I’m looking forward to getting more compost from either the city or Home Depot.

Blog posts

Sketches

None this week.

Link round-up

Focus areas and time review

  • Business (38.0h – 22%)
    • Earn: E1: 2.5-3.5 days of consulting
    • E1: Go to user group meeting
    • E1: Go to training
    • Incorporate and revise transcript
    • Revise transcript from Oli
    • Earn (16.8h – 44% of Business)
      • E1: Attend strategy session
      • E1: Look up details for strategy session
      • E1: Send time summary
    • Build (18.1h – 47% of Business)
      • Drawing (1.4h)
      • Delegation (2.4h)
        • Talk to Oli (libervurto) regarding delegation
      • Packaging (0.5h)
        • Add forgotten Emacs Conference sketchnotes
      • Paperwork (1.2h)
        • Deposit payroll cheque
        • [#B] Write myself a cheque and remit the appropriate amounts
      • Quantified Awesome
        • Get to 100% coverage for Quantified Awesome
        • Add password somewhere to sign-up process
        • Grocery tracking: Find old code
        • Sort out 24h goal bug
        • Make it easier to set the friendly name for receipt items – autocomplete
        • Look up test coverage for Quantified Awesome
        • Fix batch import for grocery tracking
        • Dig up my receipt app and update the records
        • Debug e-mail
      • Get WordPress to show category description only on first page
  • Emacs
    • Write about defuns
    • Write about lambda
    • Start planning talk for International Lisp Conference
    • Set up Emacs environment in dev
    • Review new video and post it
    • Record session with technomancy
    • Prepare for session with technomancy
    • Prep for call with technomancy
    • Post transcript of Iannis Zannos’ chat
    • Post show notes
    • Plan EmacsLife.com: What am I experimenting with?
    • Incorporate DanP’s second round of feedback
    • How to update the Org 7 that comes with Emacs to Org 8 (more configuration! better exports!)
    • Give feedback on show notes for Xah Lee
    • Connect (3.0h – 8% of Business)
  • Relationships (2.7h – 1%)
    • Buy fish for cherry blossom party
    • Buy groceries for cherry blossom party
    • Celebrate Mother’s Day with W-‘s family
    • Ping Mom for mother’s day
    • Spring-clean bedroom
    • Spring-clean living room
  • Discretionary – Productive (23.2h – 13%)
    • Write: Balancing scheduled and unscheduled tasks
    • Figure out how much I need to keep in cash
    • Look for better bike wheels
    • Price-check compost at Home Depot
    • Read chapter 2 of Latin textbook
    • Write: Things to do when you aren’t sure what to do with your life
    • Writing (4.9h)
  • Discretionary – Play (6.7h – 4%)
  • Personal routines (26.9h – 16%)
  • Unpaid work (10.6h – 6%)
  • Sleep (60.3h – 35% – average of 8.6 per day)

How to update the Org 7 that comes with Emacs to Org 8 (more configuration! better exports!)

May 12, 2014 - Categories: emacs, org
Update 2014-05-12: Simplified thanks to Sebastian’s note that Org 8 is available in the built-in package repository, yay!

The Org Mode included in Emacs 24 is version 7. Version 8 has lots of new configuration variables and the exporting mechanism has been rewritten. However, it needs to be installed in an Emacs that has not yet loaded any Org code or files. Here’s how you can upgrade your Org:

  1. Start Emacs with emacs -q. This skips your personal configuration.
  2. You will need an Internet connection for this step. Type M-x package-install, and type in org. This will install the latest version of Org from the built-in package repository.
  3. Edit your ~/.emacs.d/init.el (or ~/.emacs, if you’re using that instead). Add the following code to the beginning of the file:
    (package-initialize)
    (setq package-enable-at-startup nil)
    

    This will load the installed packages when you start Emacs, overriding the buit-in Org 7 with the Org 8 version that you installed.

    Advanced note: If you’ve downloaded Emacs Lisp code that should override code already installed through packages, you need to change this to (package-initialize nil) instead, and add (package-initialize t) after your load-path settings.

  4. Check your configuration for references to the older version of Org. In particular, look for any configuration related to exporting (ex: (require 'org-html)). You can change those lines to their Org 8 equivalents (ex: (require 'ox-html)), but it’s probably easier to just comment them out for now. You can comment out lines by adding ; to the beginning.
  5. Save your init.el and restart Emacs (this time, without the -q option). M-x org-version should now start with Org-mode version 8.
  6. Review your Emacs configuration for any changes that you will need to make. You can ask the Org Mode mailing list for help if you get stuck.

Good luck!

Small talk tweaks

May 13, 2014 - Categories: connecting, kaizen

… though I sometimes amuse myself with suggesting and arranging such little elegant compliments as may be adapted to ordinary occasions, I always wish to give them as unstudied an air as possible.

Mr. Collins in Pride and Prejudice (Jane Austen)

After three successive weekends (three!) with parties, I want to think about small talk and how I can tweak it. Small talk is unavoidable, but there are things you can do to nudge it one way or another. I like having conversations that move me or other people forward, even if it’s just by a little bit.

So, what do I want to do with small talk?

  • Help other people feel comfortable enough to open up about some memorable interest or quirk
  • Find topics of common interest for further conversation
  • Find a way to help or a reason to follow up

We could do the ritualistic weather/profession/how-do-you-know-the-host conversations, or we could change the level of the conversation so that it goes beyond the repetitive gestures that only skim the surface. I could chat as a way of passing time (possibly bumping into interesting thoughts along the way), or I can more deliberately check for things I’m interested in while staying open to the serendipity of random connections. What do I want to be able to frequently do through conversation?

  • Identify possible meetup or global community members – reassure them that this is a thing and that lots of people are interested in it; point people to resources (Emacs, QS, visual thinking)
  • Talk shop with other geeks to find out about tech and business things worth looking into
  • Other geeks (non-tech): learn more about different fields
  • Non-geeks: See if there’s anything I can help with easily (books? ideas?)

I could either dig into people’s interests or be memorable enough so that people look me up afterwards. Many people open up about their interests only when they feel comfortable. What makes people feel more comfortable? It helps to establish a sense of similarity and shared understanding.

People have different strategies for establishing similarity. I know a few people who use the “You look really familiar…” approach (even if the other person doesn’t) because rattling off schools, companies, associations, and interests tends to reveal something in common.

I like building on stuff I’ve overheard or asking questions about common context. That’s one of the reasons why I like events with presentations more than events that are focused only on networking – the presentation gives us something to start talking about.

In terms of helping people get to know me and find topics of shared interest, I use short disclosures with high information value.

Consulting: “I’m a consultant” has low information value: it’s vague and it wouldn’t establish much similarity even if the other person was also a consultant. I rarely use it unless I’m tired, I want to shift the focus back on the other person quickly, or I sense they’re also going through the motions. (Or I want to see at what point their eyes glaze over…)

Emacs: “I’m working on some Emacs projects” has high information value when talking to tech geeks, almost like a secret handshake that lets us shift the conversation. (I talk faster, go into more detail, and use more jargon when talking to fellow geeks, so it’s almost like the 56kbps modem handshake.) I’m female, I don’t wear geeky T-shirts, and I don’t work for a technical company or in a technical position, so it helps to verbally establish geek cred quickly without making a big deal out of it.

Data analysis: For geeks of other fields, Emacs is low-information, but Quantified Self and data analysis seems to be a good way to establish that similarity quickly. It works well with people who are interested in science, tech, engineering, math, or even continuous improvement. Litter box analysis is surprisingly engaging as a cocktail party topic, or at least it’s easy to for people to ask follow-up questions about if they want to.

Sketchnoting: People (including most of the ones who don’t identify as geeks) tend to be curious about my sketchnoting, since it’s visual, easy to understand, and uncommon. That said, I need to get better at handling the usual follow-ups. People tend to say things like “You draw so well” or “I could never do something like that.” I want to nip that in the bud and get people to realize that they can do this too. Pointing out that I draw stick figures like a 5-year-old doesn’t seem to do the trick (“Ah, but you know what to leave out” and “But you’re doing this while listening – that’s hard”). Maybe a little humour, poking fun at the idea of going to an art school that specializes in stick figures or learning how to not fall asleep in presentations? About one in fifty people I talk to recognizes this as something they do on their own or that they want to do, and it’s good to link them up with the global community. For most people, though, I feel slightly more comfortable focusing on ideas they want t olearn more about and sending them sketchnotes if there’s a fit.

Semi-retirement: This experiment with semi-retirement can be a good conversational hook for prompting curiosity. It usually follows this sequence: semi-retired -> “aren’t you a little young? what do you mean?” -> tracked, saved up, experimenting. It tends to be too detached from people’s lives, though – many people don’t think they can pull it off, even experienced freelancers who are doing most of it already.

Variety: If I don’t know how someone identifies, it’s fun to answer the “What do you do?” question (which tries to pigeonhole someone into a neatly understandable job title) with a sense of variety: “I do a lot of different things! This week, I …”

Going forward

For the next few events, I think I’ll experiment with doing the tech/non-tech/non-geek identification earlier, or going into that with an opening based on variety. I could name an example each for tech, non-tech, and non-geek, and see which one they dig into. As for digging into people’s interests, maybe an open-ended survey-type question would be an interesting way to help people open up while still collecting data in case people haven’t thought about how to make themselves easier to get to know. Hmm…

Small talk might be small, but if I have thousands of conversations over the years, I might as well keep learning from it. How have you tweaked how you do small talk?

Visual book notes: Mastery (Robert Greene)

May 14, 2014 - Categories: visual-book-notes

Mastery (by Robert Greene) is a book about discovering your calling, creating your own apprenticeship, and building mastery. It lists different strategies you can take, although the strategy names are often esoteric – you’ll need to read the stories in order to figure out what they mean. Anyway, if you do make it through the book, here’s a one-page summary to help you remember parts of it.

2014-04-16 Book - Mastery - Robert Greene

2014-04-16 Book – Mastery – Robert Greene

There are other books on this topic that I like a little more. Cal Newport’s So Good They Can’t Ignore You is more approachable. Still, Mastery was a decent reminder of the value of apprenticeship, and the stories were interesting. I particularly liked the anecdote about Michael Faraday (as in Faraday’s law and Faraday cages), who apparently used sketchnotes to network with Humphry Davy. Faraday took copious, well-organized notes of Davy’s lectures, and gave them to him as a gift. That started a mentoring relationship, and Faraday became Davy’s lab assistant and amanuensis. Some interesting details can be found at Science Shorts and Academia.edu . I think that picking up yet another historical role model for awesome note-taking made reading Mastery worth it for me. =)

Things to do when you aren’t sure what to do with your life

May 15, 2014 - Categories: planning

“What should I do with my life?”

When you have the freedom to set your own TO-DO list, it can be difficult to decide what goes on it. Should you focus on one project or juggle a few? Why one goal instead of another? How much time should you spend on something new, and how much time on polishing something old?

It’s easy to get stuck in rumination. You can end up spending so much time and mental energy worrying about what you should do with your life that you don’t actually get things done.

Here are some things I’m learning about learning from constant progress and setting limits on second-guessing.

I keep a list of tasks that I can work on even when I feel the twinges of doubt. I organize this by project and type of task. For example, I feel like coding, I can quickly pick a task related to that. This means that if I don’t feel inspired, I can trust that the Sacha who made this list came up with tasks that would be a pretty good use of my time. It might not be the best use, but it won’t be a complete waste either. These unscheduled tasks give me a baseline of productivity. If I don’t want to work on something, I have to justify that by coming up with another task that would be even better.

For example, I know that I will generally get good value out of:

  • writing 1,000 to 2,000 words to answer a question or help people learn more
  • learning more about a specific programming language or platform by reading tutorials, source code, or blog posts, by working through tutorials, or by coding
  • writing tests and code
  • sketchnoting a video or book
  • exercising or cooking
  • braindumping thoughts

You probably have a list like that too: types of tasks that tend to work well for you, especially if they leave you feeling awesome.

Even a good list of tasks wouldn’t help much if I’m switching projects all the time. I’d keep getting started on different things, with very little to show for it. To deal with this second-guessing, I try to publish or share things as early as possible. That way, even if I switch focus, my notes are out there for other people to build on. This also opens it up for feedback and appreciation, which is great for encouraging me to work on something even more.

I also limit when I plan. During the week, I might decide to focus more on one project instead of another, but I don’t dump all my previous projects. If I come up with an idea I’m curious about, I add it to my list for later review. Every month, I look at my goals and evaluate my projects, checking which ones are still relevant. Every year, I look at my values and evaluate my goals.

When I catch myself procrastinating a task, I often use that as an opportunity to evaluate my projects and goals as well. Am I procrastinating because other projects have become more important? Great, I can replace the task with one for a higher-priority project. On the other hand, am I procrastinating because I overvalue immediate rewards over my long-term goals? The project/goal review reminds me why something matters and helps me get back on track. I don’t spend a lot of time thinking about whether I should come up with new projects instead. The time for that is when I review my goals and plan my month, not when I feel like procrastinating things.

Another thing that helps me box in my tendency to over-plan is reminding myself that I’m not trying to decide the absolute best thing to do with my time. Good enough is good enough. If I move forward, even if it’s not quite optimal, I can learn more than I would standing still. If I feel I’m slightly off-track, that can teach me about where the track is.

optimal.png

So it’s worth spending a little time making sure I’m pointed in roughly the right direction, but it might not make to spend four hours trying to figure out how I can get 100% instead of 80% value out of an afternoon.

It’s good to periodically check if I’m going the right way. I’m probably doing okay if:

  • I can tell how I’m different or what I learn week to week, month to month
  • My projects include several things that excite me, and I’m learning from my experiences working on different tasks
  • Other people tell me that what I share or work on is useful
  • Things build up; scale or network effects happen

If those are true, then I’m probably not wasting my time. I might even be able to get away without worrying about better ways at all. I can wait for people to suggest better ways to spend my time, and I can listen for suggestions that resonate with me.

What do you do to avoid getting stuck in the question “What should I do with my life?”

Related: Thinking about what I want to do with my time

Planning an e-mail-based course for Emacs Lisp

May 16, 2014 - Categories: emacs, teaching

I’ve been working on an Emacs Lisp beginner’s course, something focused on helping people become more comfortable configuring Emacs. The web-based guide is taking shape quite nicely, but it’s still a lot of scrolling, and it can still feel overwhelming for newbies. I think it might make sense to offer it as an e-mail course. That way, I can spread the lessons out, help people with their questions, and improve things based on people’s feedback.

2014-05-12 How can I take Learn How to Read Emacs Lisp to the next level #emacs #packaging #writing #teaching

2014-05-12 How can I take Learn How to Read Emacs Lisp to the next level #emacs #packaging #writing #teaching

I can improve the guide by adding more structure, examples, exercises, and so on. I’ve requested several books on e-learning and course design, and I’m looking forward to learning more over the years. And I can also improve it by testing it with people… =)

2014-05-14 Planning an e-mail-based course for Emacs Lisp #emacs #teaching

2014-05-14 Planning an e-mail-based course for Emacs Lisp #emacs #teaching

I floated the idea on Twitter and lots of people e-mailed me to join. Instead of setting up an autoresponder, I decided that I would do things by hand as much as I could. That way, I can personalize the messages based on people’s interests and configuration, and I can enjoy more of the back-and-forth conversation.

After getting annoyed with the SSL hassles of setting up Gnus on Windows, I decided to just use my Linux-based virtual machine for handling mail. That was pretty straightforward, although for some reason, my IMAP view of Gmail doesn’t have all of the messages under a label. It just means that I have to manually re-check the messages to make sure nothing slips through the cracks.

I used an Org file to keep notes on each person, including TODOs under each of them. I sent everyone a checklist to see which section we should start with. A few people are starting at the beginning, and others will get the e-mails once I’ve updated those sections. Text registers (C-x r s) were really helpful since I was pasting different things into different e-mails. I’m still figuring out the workflow for this, and I’m sure I’ll automate pieces of it as more people move through the course.

I’ve sent the first section to some people already, including the Org version in the e-mail body and as an attachment, and linking to the web-based version. The Org version is a little more cluttered than the text export, but the text export uses box quotes, so I figured the Org version was the best to start with.

2014-05-16 A plan for delivering the Emacs Lisp course #emacs #teaching

2014-05-16 A plan for delivering the Emacs Lisp course #emacs #teaching

Want to be part of this? E-mail me at [email protected]

Weekly review: Week ending May 16, 2014

May 18, 2014 - Categories: weekly

Lots of gardening this week. We bought seedlings for the herbs and vegetables we want to grow this year. Excited!

Also, I had this idea for doing an e-mail-based Emacs Lisp course. I floated the idea and lots of people signed up, so I’m going to be focusing on that over the next month. Whee! =)

Blog posts

Sketches

Lots of sketches! Made a concerted effort to think on paper. =)

  1. 2014.05.12 How can I take Learn How to Read Emacs Lisp to the next level #emacs #packaging #writing #teaching
  2. 2014.05.12 How does Emacs fit into my plans and goals #emacs #plans
  3. 2014.05.14 A quiet day at home #life #experiment
  4. 2014.05.14 Evaluating Emacs Chat transcript experiments and other delegation #emacs #delegation
  5. 2014.05.14 Maximizing – continued #planning
  6. 2014.05.14 Planning an e-mail-based course for Emacs Lisp #emacs #teaching
  7. 2014.05.14 What am I maximizing for #planning
  8. 2014.05.14 Which three productivity tools would I use if I could use only those for the rest of my life #emacs #productivity
  9. 2014.05.15 Those awesome moments at work #experiment #work
  10. 2014.05.16 A plan for delivering the Emacs Lisp course #emacs #teaching
  11. 2014.05.16 How to draw a visual summary of a book #drawing

Link round-up

Focus areas and time review

  • Business (34.0h – 20%)
    • Earn: E1: 2.5-3.5 days of consulting
    • [#C] Sketchnote a book
    • Earn (23.9h – 70% of Business)
      • E1: Attend meeting
      • Earn: E1: 2.5-3.5 days of consulting
    • Build (7.8h – 22% of Business)
      • Drawing (5.4h)
      • Delegation (0.0h)
      • Packaging (0.0h)
      • Paperwork (0.9h)
      • Dig up my receipt app and update the records
      • Find out what’s going on with my server
      • Fix summarization bug
    • Connect (2.3h – 6% of Business)
      • Free up space for O
  • Emacs
    • Follow up with other transcript?
    • Send course e-mail: beginner1, beginner2
    • Take notes on people who are interested in taking course, process course steps
    • Get e-mail sending to work from virtual machine
    • [#A] Brainstorm tasks for X
    • Take notes on people who are interested in taking course, process course steps
    • Send first section to myself and others
    • Prepare for session with technomancy
    • Post show notes
    • Pay invoice for transcript
    • Package beginner1 as a lesson
    • Make checklist of topics, figure out where people are
    • Invite Bodil for Emacs Chat?
    • Incorporate and revise transcript
    • Have Emacs Chat with bbatsov
    • Break Emacs Lisp guide up into an e-mail course
    • Assign EmacsNYC transcript
    • Get Gnus send mail working again
  • Relationships (15.3h – 9%)
    • Buy fish for cherry blossom party
    • Celebrate Mother’s Day with W-‘s family
    • Ping Mom for mother’s day
    • Cook bulgogi
    • Help X
    • Think about X
    • [#A] Bake thank-you dessert
  • Discretionary – Productive (12.5h – 7%)
    • Buy compost from Home Depot
    • Doodle more plans
    • Figure out how much I need to keep in cash
    • Fix my bike tire
    • Review sach.ac experiment? nic.ac
    • Make RRSP investments
    • Writing (1.3h)
  • Discretionary – Play (17.4h – 10%)
  • Personal routines (19.6h – 11%)
  • Unpaid work (9.2h – 5%)
  • Sleep (60.7h – 36% – average of 8.7 per day)

Three productivity tools

May 19, 2014 - Categories: productivity

Kosio Angelov asked: “If you could use only three productivity tools for the rest of your life, which three would you choose?”

2014-05-14 Which three productivity tools would I use if I could use only those for the rest of my life #emacs #productivity

2014-05-14 Which three productivity tools would I use if I could use only those for the rest of my life #emacs #productivity

I’m totally cheating with my answers. I can’t imagine using only three tools. What counts as a tool, anyway? Is the Internet a tool? What about the scientific method? Are we talking about apps, applications, platforms, systems, frameworks? =) Anyway, these are the answers that came to mind. They’re not your usual suspects, but I’ll explain why I like them a lot.

Emacs: This arcane text editor from the 1970s is capable of far more than most people think it can. It’s not an application, it’s a platform. I use it to code, write, plan, connect, automate, calculate, and so on. People get intimidated by its learning curve, but for me, it’s well worth it. I’ve been learning and blogging about it for more than ten years. Based on what I’ve seen, I could probably keep going for decades. I love the way you can dig into how things work, tinker with the code to make it fit what you want, and combine different packages. Great user community, too.

I’m not sure what to say to productivity newbies considering Emacs. It takes a certain kind of person, I think. If you’re someone who likes constantly learning and tweaking, you’re good at learning from what other people have written, and you’re not afraid to do a little worse in order to do even better in the future, this might be for you. You don’t have to be a programming geek, although it helps.

Linux: Again, I’m cheating by including an entire operating system, and probably I mean all the little tools I’ve gotten used to rather than the operating system itself. But I love being able to use utilities like grep and find (thanks, GNU!), stitching programs together, scripting things, installing other tools… People have suggested that I look into Mac OS X, but it gets a little on my nerves. I like Linux more. There are some programs I want to run on Windows, though, so I end up using Linux in a virtual machine so that I can do my development in a proper environment.

Ruby:  I use Ruby for little automated scripts as well as special-purpose web-based tools like QuantifiedAwesome.com, which helps me track my time. It feels like the way my mind works. I used to use Perl for scripting and I’m learning Python, but Ruby has the least friction for me. This may change as I get deeper into other languages, but in the meantime, Ruby is a good language for the kinds of things I want to do.

—-

All of these tools take effort to learn. They’re not like, say, Boomerang for Gmail or ScheduleOnce, which are easy to pick up and have clear benefits. My favourite tools require imagination, but they open up infinite possibilities. I’m not locked into one way of doing things. I still have limits, but they’re the limits of my own ideas and skills. I think that’s what I like about these tools. They have depth. Whenever I reach for some new capability, I almost always find it.

So, if you’re a newbie and this sounds intriguing, how do you get from point A to point B?

I think I got here by being interested in learning, being unafraid of tinkering, and having the space to do both. When you’re learning a complex thing, you might feel frustrated and intimidated by it. Good games design that learning experience so that people enjoy small wins as they develop their skills, but not all topics are like that. Sometimes you have to enjoy the learning for its own sake.

… which is an odd message to share with people who are looking for productivity hacks, maybe, but it’s something I’ve been thinking about lately. There’s a cost to picking general-purpose tools that are perhaps not the best at one specific thing, but experience results in compounding benefits. There’s a cost to keeping both your schedule and your eyes open, but perhaps it can lead to surprising things. There’s a cost to choosing the path of learning rather than the quick fix, but who knows what the true cost is down the road?

Emacs Chat: Bozhidar Batsov

May 20, 2014 - Categories: emacs, Emacs Chat, podcast

UPDATE 2014-06-13: The transcript is now available.

Bozhidar Batsov (emacsredux.com) shares how he got into Emacs and Emacs Lisp. He also demonstrates cool features from Prelude and Projectile, which are great if you do a lot of programming. Check it out!

Quick Links: https://twitter.com/bbatsov , https://twitter.com/emacs_knight , http://emacsredux.com , https://github.com/bbatsov/prelude , https://github.com/bbatsov/projectile . If you like his work, there’s https://www.gittip.com/bbatsov/

Guest: Bozhidar Batsov

For the event page, you may click here.

Want just the audio? Get it from archive.org: MP3

Transcript here!

Check out Emacs Chat for more interviews like this. Got a story to tell about how you learned about or how you use Emacs? Get in touch!

Mental hacks for slower speech

May 20, 2014 - Categories: communication, kaizen, speaking

When I’m excited, I say about 200 words per minute. The recommended rate for persuasive speech is in the range of 140-160wpm, although studies differ on whether faster speech is more persuasive or if slower speech is. (Apparently, it depends on the context and whether people are inclined to agree with you…) It’s good to be flexible, though. I’m getting used to speaking slower. In the videos I’ve been making, I experiment with a lower voice, a slower pace, a more relaxed approach. When I record, I imagine the people I know who speak at the rate I want to use. I “hear” them say things, and then I mimic that.

I’ve been talking to a lot of people because of Google Helpouts and other online conversations. I help them with topics that they’re not familiar. Sometimes there are network or technical issues. I’ve been learning to slow down and to check often for understanding.

I think the biggest difference came from software feedback, though. I did the voiceovers for a series of videos. My natural rate was too fast, even when I tried reading at a slower rate. I adjusted the tempo in Audacity and found that I still sounded comfortable at 90% of my usual speed. The sound quality wasn’t amazing, but it was interesting to listen to myself at a slower rate and still recognize that as me.

It’s funny how there are all sorts of mental hacks that can help me play with this. I find it fascinating when a person’s normal pace is faster than the average pace I’ve been nudging myself towards. I’m not used to being the slower conversationalist, but it’s kinda cool.

I still like speed. I do some bandwidth-negotiation in conversations. I ramp up if other people look like they can take it. But it’s nice to know that I don’t have to rule out podcasting or things like that. I can slow down when it counts, so that what I’m saying sounds easier to try, seems less intimidating. It’s the auditory version of sketchnoting, I guess. Sketchnotes help me make complex topics, so it makes sense to do the same when speaking.

Hmm, maybe I can transcribe my recent videos and recalculate my words per minute…

Cobbling together a semi-auto-responder using Emacs, Gnus, and org-contacts

May 21, 2014 - Categories: emacs, org

It turns out that lots of people are interested in an e-mail-based course for learning Emacs Lisp. Yay! =) Maybe it’s the idea of bite-size chunks. Maybe it’s the ease of asking questions. Maybe it’s the regular reminders to work on something. Who knows? Whatever the reason, it’s awesome to see so many people willing to join me on this experiment.

Since this is my first time to venture into the world of teaching people online, I wanted to see how far I could push actually doing all the mails myself, instead of just signing up for an Aweber account and handing everyone off to an impersonal autoresponder. I dusted off Gnus, offlineimap, and org-contacts, and started figuring out my workflow. I’ll share how that workflow’s evolving so that you can get a sense of how someone might write little bits of Emacs Lisp to make something repetitive easier.

For the first little while, I got by with using C-x r s (copy-to-register) and C-x r i (insert-register) to store the text that I needed.
Sometimes I needed to paste in the welcome message and checklist, and sometimes I needed to paste in the first lesson. By using registers, I could insert whatever I wanted instead of going through the kill ring. I also had another bit of templated code in yet another register so that I could easily create an org-contacts entry for the person whose mail I was replying to. In the beginning, I used tasks under each person’s heading to indicate that I had sent them the checklist or that I had sent them the first lesson. Eventually, I changed my org-contacts notes so that the TODO state of each person showed which lesson I was going to send them next, or CHECKLIST if I was waiting for their reply to the checklist. I also set up Org so that it would automatically log when the TODO state was changed.

#+TODO: TODO | DONE
#+TODO: CHECKLIST(c!) BEGINNER1(1!) BEGINNER2(2!) BEGINNER3(3!) BEGINNER4(4!) FULL(f!) | FINISHED(x!)
#+TODO: | CANCELLED

* Who
** CHECKLIST Jane Smith ...
** BEGINNER1 John Smith
   SCHEDULED: <2014-05-28 Wed>
   :PROPERTIES:
   :EMAIL: [email protected]
   :END:
(notes from the messages, etc.)

I wrote some code to make it easier to send someone a checklist and create a note for them in my org-contacts file. I bound it to C-c e c for convenience.
(The bind-key function is defined by a package.)

(setq sacha/elisp-course-checklist-body "... really long text here...")
(defun sacha/elisp-course-checklist ()
  "Copy this message and put it at the end as a checklist item. 
Start a message with the checklist."
  (interactive)
  (gnus-summary-scroll-up 1)
  (with-current-buffer gnus-article-buffer
    (let ((message (buffer-substring-no-properties (point-min) (point-max)))
          (email (cadr (org-contacts-gnus-get-name-email))))
      (with-current-buffer "elisp-course.org"
        (save-excursion
          (goto-char (point-max))
          (save-excursion
            (insert "\n** " message)
            (org-set-property "EMAIL" email)
            (org-todo "CHECKLIST"))))))
  (gnus-summary-followup-with-original nil)
  (goto-char (point-max))
  (insert sacha/elisp-course-checklist-body))
(bind-key "C-c e c" 'sacha/elisp-course-checklist)

This made it easier for me to read the starred messages from my inbox and use C-c e c to get a head start on processing people’s introductory messages.
Yay! I used the register trick to help me reply to people who were ready for the first lesson. After the first few replies, I noticed that the attachment code was fine even if I put that in the register too, so I added it as well.

Things got more complicated when I started processing lesson 2. I didn’t want to have to set up and remember lots of different registers, and I didn’t want to manually update the TODO states either. So I started defining functions that I could call with keyboard shortcuts:

(defun sacha/elisp-course-1 ()
  (interactive)
  (let ((marker (org-contacts-gnus-article-from-get-marker)))
    (if marker
        (org-with-point-at marker
          (org-todo "BEGINNER2"))))
  ;; Find the person's contact record
  (gnus-summary-scroll-up 1)
  (gnus-summary-followup-with-original nil)
  (message-goto-subject)
  (message-delete-line)
  (insert (concat "Subject: " sacha/elisp-course-1-subject "\n"))
  (goto-char (point-max))
  (insert sacha/elisp-course-1-body))
(bind-key "C-c e 1" 'sacha/elisp-course-1)
(defun sacha/elisp-course-2 ()
  (interactive)
  (let ((marker (org-contacts-gnus-article-from-get-marker)))
    (if marker
        (org-with-point-at marker
          (org-todo "BEGINNER3"))))
  ;; Find the person's contact record
  (gnus-summary-scroll-up)
  (gnus-summary-followup-with-original nil)
  (goto-char (point-max))
  (insert sacha/elisp-course-2-body))
(bind-key "C-c e 2" 'sacha/elisp-course-2)

Really, though, it doesn’t make sense to have a lot of duplicated code. So I wrote some code that would use the person’s TODO keyword to look up the message to send them, and then move them to the next keyword. Now I don’t need sacha/elisp-course-1 or sacha/elisp-course-2 any more.

(setq sacha/elisp-course-info
      `(("CHECKLIST" nil ,sacha/elisp-course-checklist-body)
        ("BEGINNER1" ,sacha/elisp-course-1-subject ,sacha/elisp-course-1-body)
        ("BEGINNER2" ,sacha/elisp-course-2-subject ,sacha/elisp-course-2-body)))

(defun sacha/elisp-course-process (subject body &optional state)
  "Process this course entry."
  (if (derived-mode-p 'org-mode)
      (progn
        ;; Move this node to the next state and compose a message
        (if state (org-todo state))
        (org-todo 'right)
        (message-mail (org-entry-get (point) "EMAIL") subject)
        (goto-char (point-max))
        (insert body))
    ;; Doing this from Gnus; find the person's info
    (let ((marker (org-contacts-gnus-article-from-get-marker)))
      (if marker (org-with-point-at marker
                   (if state (org-todo state))
                   (org-todo 'right)))
      ;; Compose a reply
      (gnus-summary-scroll-up 1)
      (gnus-summary-followup-with-original nil)
      (message-goto-subject)
      (message-delete-line)
      (insert (concat "Subject: " subject "\n"))
      (goto-char (point-max))
      (insert body))))

(defun sacha/elisp-course-guess-and-process (&optional state)
  (interactive (list (if current-prefix-arg (read-string "State: "))))
  (let ((current-state
         (or state (elt
                    (if (derived-mode-p 'org-mode)
                        (org-heading-components) 
                      (let ((marker (org-contacts-gnus-article-from-get-marker)))
                        (if marker (org-with-point-at marker (org-heading-components)))))
                    2))))
    (sacha/elisp-course-process
     (elt (assoc current-state sacha/elisp-course-info) 1)
     (elt (assoc current-state sacha/elisp-course-info) 2)
     state)))
(bind-key "C-c e e" 'sacha/elisp-course-guess-and-process)

Come to think of it, I should totally have it schedule the next update for the next Wednesday, too. ;) That’s just (org-schedule "+wed"). Neat, huh?
And I’m sure there are all sorts of ways the code can be simpler, but it works for me at the moment, so hooray!

I really like this approach. It lets me pull in standard information while also letting me customize the messages and how it fits into my task tracking. I can’t get that with Gmail (even with canned responses), and I’m not sure any CRM is going to be quite as awesome as this. I can’t wait to see how else we’ll tweak this as we go through more conversations. I’d like to get better at:

  • having a consistent place where I can process all the messages and make sure nothing falls through the cracks; I currently star messages to make sure I process them, since the Gmail label folder in IMAP seems to be missing some messages
  • seeing all Gnus conversations related to an org-contacts entry
  • reaching out to people proactively with the next lesson, even if they haven’t e-mailed me (or maybe I should wait for them?)

Anyway, that’s an example of writing a little bit of Emacs Lisp in order to connect different packages. Gnus handles mail, Org handles notes, org-contacts links the two together, and with a little bit of custom code, I can make the combination fit what I want to do. I read the source code of org-contacts to find out how I could look up the appropriate note, and I looked at org-shiftright to find out how to move things to the next TODO state. If you know something that works roughly like what you want it to work, you can find out how it does things and then copy that.

As for the course itself: I’ve been sending people links to the HTML output, attached .txt files (with -*- mode: org -*-) so they can open it in Emacs if they want, and inline text so that they can skim it briefly in their e-mail client if they want to. I’m not perfectly happy with the plain-text formats, but it seems to be a reasonable compromise, and so far people have been able to deal with it. I’ve been improving pieces of it based on feedback on clarity, suggestions for good examples, and so on. I didn’t take all the feedback; after thinking about some of the suggestions, I still preferred it my way. It’s shaping up quite nicely, though!

If you’re curious about the beginner’s course on reading Emacs Lisp, e-mail me at [email protected] and we’ll see how this works out. I’m certainly learning a lot. =)

How to draw a visual summary of a book

May 22, 2014 - Categories: drawing

People often ask me how I do my book notes. I’m not really sure how to explain it, since it seems straightforward: read a book, take notes? Maybe these tips can help, though.

2014-05-16 How to draw a visual summary of a book #drawing

2014-05-16 How to draw a visual summary of a book #drawing

Reading the table of contents helps me figure out the structure of a book. Then I just go through it section by section, writing down things that other people might find useful or that I’d like to remember. It helps that I speed-read and that I’ve read a lot of books – I can skip large chunks if I prefer another book’s explanation of that topic.

I like drawing my book notes digitally because I can use colours that match the book and because I can erase or move things around on the computer, but drawing on paper is okay too.

I like thinking about how I can improve my workflow. The next step for me is probably to get better at picking books that I care enough about to draw (or conversely, to draw books anyway, because practice is good). I could also use it to practise colour and imagery, since my notes tend to be mostly text. =)

Here are some more notes on how I read books:

I might be able to explain more if people have specific questions. =)

I’d love to see more visual book notes. They’re a great way to condense a book’s key points for your personal review and for sharing with others. Here are some other people who have shared their visual book notes:

Enjoy!

Writing for myself

May 23, 2014 - Categories: -Uncategorized

Sometimes, when I feel my mind filling up with thoughts of other people (tasks, questions, ideas for helping), I take a step back and focus on something more selfish. It’s important to me that I sometimes write mainly for myself. If it so happens to benefit other people, wonderful, but it’s got to be stuff that I need too.

What are the kinds of things I write about when I’m writing for myself?

  • Notes on things that I’m figuring out
    • Idiosyncratic interests that hardly anyone will find useful
    • Puzzling through the tangles of life
    • Straightforward questions and the journey towards answers, including research and backtracking
    • Plans, scenarios
    • Data analysis
    • Things I’m learning, in case other people want to help out (and sometimes people can learn from it too, which is nice)
  • Things I want to remember
    • Reasons for decisions and expected outcomes
    • What this experiment feels like
    • The influences on my life

Based on a quick scan of the blog posts this year, I’d say that around 25% of my blog posts have been mostly for me rather than other people (excluding weekly and monthly reviews from the count). This is higher than I thought it would be, and I think that’s good. It’s probably just the buzz from e-mail and from a recent experiment tilting my blog towards more technical topics.

Month Mostly-reflections
Jan 6
Feb 6
March 8
April 5
May 3 so far

Based on my time records, drawing has been on a decline (62.6h in Jan, 34.7h in Feb, 18.2h in March, 12h in April), while Emacs has been on the increase. In fact, the correlation is -0.86 over five months. Interestingly, the only negative correlation for sleep in my top 10 activities is with Emacs: -0.43. Pretty strong positive correlations for sleep with work and writing. I probably like a balance like March, where I mixed things up a bit more with personal reflections. Hmm…

Okay. So maybe I dial back a little on the Emacs side, and do more drawing and writing as an experiment to see how that affects buzz. That probably means that Wednesdays and maybe a bit of Friday will be for Emacs (course, e-mail, blog posts, tinkering). Mondays and a bit of Friday will be for planning. Ideally, we’ll get to the point where I don’t feel a smidge of guilt for my inbox or limited ability to explain things, so it’s all upside. =)

If I set the expectation that I mostly care about my inbox only every 2-3 days (and that I sometimes take a week to reply), I think that will un-buzz-ify my brain enough. It’ll be interesting to see if I can still run an engaging e-mail course with those bounds. I like the conversation. I don’t want to give that up. =) I just want to make sure my brain has the quiet it needs for other things, too.

What’s the quiet for? I want to be able to catch myself being confused, to see the gaps, to say, “Hmm, that’s a good question,” and to dig into things further. What am I likely to find interesting after ten years? Easy enough to compare April 2014 with April 2004 (technical posts, snippets, links, teaching, flash fiction), March with March, and so on. I like the mix of March 2014 mix more than April’s. More exploratory, maybe? Hmm…

Weekly review: Week ending May 23, 2014

May 25, 2014 - Categories: weekly

There’s something that needs tweaking. I feel a little off-balance mentally. Hmm…

Blog posts

Sketches

Link round-up

Focus areas and time review

  • Emacs
    • [X] Add objectives to beginner2
    • [X] Announce guide for learning Emacs Lisp
    • [X] Assign EmacsNYC transcript
    • [X] Break guide up into parts that can be focused on for 15-60 minutes
    • [X] Take notes on people who are interested in taking course, process course steps
    • [X] Follow up with other transcript?
    • [X] Have Emacs Chat with bbatsov
    • [X] Invite Bodil for Emacs Chat? – need to follow up
    • [X] Listen to EmacsNYC videos
    • [X] Pick chunk size for sections
    • [X] Send course e-mail: beginner1, beginner2
    • [X] Share reading Emacs config video
    • [X] Package beginner2 as a lesson
    • [X] [#A] Brainstorm tasks for X
    • [X] Get mplayer working with emms on Windows
    • [X] Write about how to read Emacs Lisp
    • [ ] Host chat with Christopher Wellons
  • Business (26.6h – 15%)
    • Earn (17.3h – 64% of Business)
      • [X] E1 Attend training
      • [X] E1: Update names
      • [X] Earn: E1: 2.5-3.5 days of consulting
    • Build (5.1h – 19% of Business)
      • [X] Read IATUR journal in depth
      • [X] Write about semi-auto-responder
      • [X] Find out what’s going on with my server
      • Drawing (2.5h)
      • Delegation (0.4h)
        • [X] Brainstorm more tasks, more, more, more!
      • Packaging (0.0h)
      • Paperwork (1.0h)
    • Connect (4.3h – 15% of Business)
      • [X] Draft title, abstract, bio
      • [X] Cancel speaking engagements
  • Relationships (3.6h – 2%)
    • [X] Attend Peter’s housewarming party
    • [X] Book appointment for June 2
    • [X] Buy mangoes for cherry blossom party
    • [X] Cook bulgogi
    • [X] Think about X
    • [X] Bake thank-you dessert
  • Discretionary – Productive (23.2h – 13%)
    • [X] Buy compost from Home Depot
    • [X] Fix my bike tire
    • [X] Make RRSP investments
    • [X] Review sach.ac experiment? nic.ac
    • [X] Writing for myself
    • [ ] [#C] Tracking: Update the number of tasks
    • Writing (3.6h)
  • Discretionary – Play (8.1h – 4%)
  • Personal routines (37.8h – 22%)
  • Unpaid work (8.7h – 5%)
  • Sleep (60.7h – 36% – average of 8.7 per day)

More gardening notes

May 26, 2014 - Categories: gardening

The weather has been warm and sunny. The other week, we bought bags of compost from Home Depot and seedlings from the corner store. Bitter melon, basil, tomatoes, thyme, oregano, dill… The lettuce and bok choy we started from seeds have been doing okay too. I can tell them apart from the weeds. Yay!

I’ve been turning the compost heap every week, too. Things are breaking down slowly. Maybe we’ll get a chance to use it by next year. Perhaps we should’ve kept a few bags of leaves back, for a second round of compost this year.

2014-05-17 Gardening day

2014-05-17 Gardening day

Mrs. W2 (who has an amazingly productive vegetable garden up the street) gave us some of her surplus choy seedlings last weekend. So exciting! I planted them, and now the main box (4’x12′) is full.

I’m still figuring out watering. We’re regrowing the grass on the boulevard, so I’ve been watering that frequently. The internet recommends twice-daily for a few weeks. As for the other plants… I’m learning to test the soil. The soil for basil shouldn’t dry out, and blueberries are like that too. Too much water for tomatoes results in blossom-end rot and splits; the Internet recommends 2-3 times a week, checking that soil is moistened 6-8″ down. Lavender is drought-tolerant and doesn’t like soggy roots. For sorrel, I should check the first inch of soil for moisture, and water if it’s dry. So much to remember!

2014-05-23 Gardening - Things to learn more about or try

2014-05-23 Gardening – Things to learn more about or try

I’ll get the hang of this eventually… =)

Reflecting on risk aversion

May 27, 2014 - Categories: experiment

I’m more careful about risks than I was at the beginning of this experiment. I see more negative consequences when projecting the results of decisions, and I perceive more volatility. I tend to overestimate the probability and impact of negative possibilities, and I’m conservative about taking advantage of opportunities.

This is interesting to me because I expected the opposite result when I started this experiment. A safety net should enable me to feel comfortable with taking more risks. In particular, I would probably have expected to take more risks in terms of:

  • Tools: get better at seeing the possible improvements or new capabilities opened up by tools
  • Education: learn faster with other people’s help
  • Networking: connect with and help more people
  • Creation: make and ship more things
  • Delegation: working with other people to get even more done
  • Commitment, schedule: plan for larger things, and hustle in order to get more things done

Hmm. Come to think of it, even my perception about increased risk aversion is perhaps inaccurate. Over the past two years, I’ve learned a lot from taking risks in terms of business models, sales, delegation, and so on. Let me take a closer look at the categories I mentioned to see if I can come up with counterpoints:

  • Tools: Small hardware, software, and network upgrades have worked out well.
  • Education: I’ve learned that I can learn a lot from books, experimentation, and connecting online, which is why paid courses and conferences haven’t really been on my radar.
  • Networking: The Emacs Chat podcast is a new thing for me, and I’m slowly getting the hang of it. I’ve been moving to getting to know people online instead of focusing on in-person connecting, and I like connecting with peers or people I can help rather than trying to connect with high-flying celebrities. I think I like the direction I’m going, actually.
  • Creation: PDFs, guides, and e-mail courses are new for me. That’s working well. Free/PWYW helps me reduce risk and avoid being anxious about satisfaction.
  • Delegation: Not as good as I could be when it comes to assigning tasks, but still better than nothing.
  • Commitment, schedule: This is probably where the biggest difference is. I’m less inclined to schedule things, and I try to minimize my commitments in terms of time and energy. Every so often, I think about whether I should be hustling more, but I like my current pace.

Oh, that’s interesting. I think I’m surprised by the way I’m getting better at saying no, which is apparently a very useful skill. I’m getting better at not feeling guilty about it, too. I want to make sure I’m saying yes to some things, what I’m saying yes to is worth it for me, and that I’m not prematurely closing off things that do want.

How do I want to tweak this? I’d still probably minimize the number of commitments. I might take more notes on decisions. That would give me a better handle on risks that worked out well and risks that didn’t, because what I recall is biased by my mood. What I take notes on is biased by mood as well, but it’ll be easier to find contrary examples.

Also, when I find myself possibly overestimating the likelihood or impact of negative possibilities, I can sanity-check my perceptions with research and with other people. Hmm…

It’s kinda fun noticing when your brain is acting a little weird. =) We’ll see how I can work around things!

Playing around with Clojure, Cider, and 4Clojure

May 28, 2014 - Categories: emacs, org

4Clojure has a lovely series of exercises to help you practice Clojure. I don’t know much Clojure yet. I’ve basically been taking what I know of Emacs Lisp and trying to cram it into Clojure syntax. (compose is pretty cool!) I should probably read through a Clojure tutorial and some kind of syntax reference. (Hyperpolyglot is neat!) But hey, I’ve gotten through 21 problems so far.

Tom Marble and I were chatting about Clojure, Emacs, and Org Babel. As it turns out, there are lots of ways to interact with 4clojure problems from within Emacs. Tom told me about the 4clojure package by Joshua Hoff, which is probably slightly improved with the following code:

(require 'clojure-mode)
(defun my/4clojure-check-and-proceed ()
  "Check the answer and show the next question if it worked."
  (interactive)
  (let ((result (4clojure-check-answers)))
    (unless (string-match "failed." result)
       (4clojure-next-question))))
(define-key clojure-mode-map (kbd "C-c C-c") 'my/4clojure-check-and-proceed)

That one doesn’t track your progress on the website, though, so you’ll still want to copy and paste the solution yourself.

I like working within Org Mode so that I can easily take notes along the way. Here are the notes I took while figuring out how to get Clojure and Org to work together. http://www.braveclojure.com/basic-emacs/ is nice. http://bzg.fr/emacs-org-babel-overtone-intro.html has a good introduction. Here’s what I used from those:

Install Java (at least version 6), Clojure and Leiningen.

Install the clojure-mode and cider Emacs packages

Evaluate this by moving the point to the #+begin_src line and running C-c C-c

(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-refresh-contents)
(package-install 'clojure-mode)
(package-install 'cider)

And then evaluate this afterwards:

(add-to-list 'org-babel-load-languages '(emacs-lisp . t))
(add-to-list 'org-babel-load-languages '(clojure . t))
(org-babel-do-load-languages 'org-babel-load-languages org-babel-load-languages)
(setq nrepl-hide-special-buffers t
      cider-repl-pop-to-buffer-on-connect nil
      cider-popup-stacktraces nil
      cider-repl-popup-stacktraces t)
(cider-jack-in)

That should let you evaluate this:

(list? '(1 2 3 4))

—————–
And that let me do stuff like this for #27: Palindrome Detector:

(defn __ [x] (= (seq x) (reverse x)))
(list
  (false? (__ '(1 2 3 4 5)))
  (true? (__ "racecar"))
  (true? (__ [:foo :bar :foo]))
  (true? (__ '(1 1 3 3 1 1)))
  (false? (__ '(:a :b :c))))
true true true true true

If all the results are true, then I’ve passed. Yay! In the web interface, __ is where your answers go. Fortunately, it’s also a valid Lisp name, so I can defn a function to replace it when testing locally. The proper answer would probably be something like (fn [x] (= (seq x) (reverse x))) when submitted through the web interface, which is close enough.

it would be great to have something like 4clojure for Emacs Lisp – a site where you can practise solving small, well-defined problems. =) Has someone already written one?

Hmm, maybe I’m not slacking off after all

May 29, 2014 - Categories: experiment, quantified

Even though I’ve got the steady accumulation of DONE tasks showing my slow-but-constant progress, I still sometimes feel like I’m leaving something on the table when it comes to how I use my time. I feel like I’m living with a more relaxed pace, especially compared with the world of work around me or my fuzzed-by-time recollections of pre-experiment and early-experiment days.

Top line = All tasks excluding cancelled ones, bottom line = DONE

Top line = All tasks excluding cancelled ones, bottom line = DONE

I was thinking about how my time use has shifted over the past few years. I compared my percentages in different categories for 2012, 2013, and for 2014 to date. But the numbers say I’m actually spending more time on work and personal projects, and I do seem to manage to check off lots of things on my TODO list. =) So maybe I’m doing okay with this after all, even though sometimes I think I’m slacking off.

Top-level categories:

  • Sleep: Pretty consistent (34.5-36.6%) – this works out to 8.3-8.8 hours a day.
  • Business: Down, then up lately – 24%, 21%, 26%; but I expect this to be a little lower this year, since I’m taking three months off. =) I’ll probably focus on even more writing, drawing, and Emacs geekery then. (And maybe a crash course in a useful skill…)
    Avg hours per week 2012 2013 2014 to date
    Earn 20 15 17
    Build 12 13 18
    Connect 8 7 9
    Total 40 35 44
  • Discretionary: Up, then down – 18%, 22%, 16%
  • Personal care: Pretty consistent (13-14%)
  • Chores/unpaid work: Pretty consistent (7-8%)

As before, the business/discretionary trade-off is really the main thing that moves. The rest of my life stays pretty much the same. The second level of categories is worth looking at too:

  • Writing is pretty consistent at 3%, or roughly 5 hours a week. Still, I think I’d like to write more. What should get reduced? Ah, video games have been soaking up a little time – although they’re exercise too. Hmm, I could intensify that exercise so that I get more out of it. Oh! I’ve been spending more time gardening lately; that could be another reason. I like both of those alternative activities too, and I think they’ll taper off after a while. That’s okay, there’ll be time enough to write more. Besides, some of my writing is filed under Emacs-related time instead. =)
  • Trending up:
    • Drawing (2.0-4.1%): This is good.
    • Planning (0.2-1.5%): Hmm, this is interesting. Am I running into diminishing returns here? Maybe less time planning, more time experimenting.
    • Emacs (0.4-2.8%), and I’m looking forward to spending even more time on this.
    • Relaxing (0.6-2.0%)
  • Trending down:
    • Tidying up, cleaning the kitchen (2.3-1.6%) – about 3 hours a week? I should do more around the house (or maybe I am, and I’m not tracking it properly)
    • Working on Quantified Awesome (1.4-0.8%) – steady-state since I’m happy with the code so far?
    • Reading fiction (1.2-0.4%) – subsumed into other activities
    • Socializing (8.0-1.4%) – big drop here; winter, becoming more selective?
    • Networking (4.7-1.7%) – big drop here too; not networking as actively
    • Biking (2.4-0.7%) – but then it’s still early in the biking season, and I work fewer days too

I’ll continue to focus on gardening for a bit until the garden is more established. I want to exercise and bike more as well. And there’s all sorts of Emacs coolness to learn about and share! =) Writing will have to be content with these little snippets–thinking out loud, sharing what I learn, and other things like that–until I can spend more time focusing on developing ideas. Mostly, the increase in time on other activities seems to be coming from the time I used to spend socializing. I actually like this new balance. The stuff I make and share online seems to lead to more ongoing conversations than those hi-hellos at tech events, and I’m still happy to spend a few hours getting to know people or going somewhere.

I got the time numbers from http://quantifiedawesome.com and a bit of spreadsheet number-crunching, and the task numbers from Emacs + Org Mode + R. =) Yay data!

Emacs Chat: Christopher Wellons

May 30, 2014 - Categories: emacs, Emacs Chat, podcast

Christopher Wellons (nullprogram.com, github.com/skeeto/) started using Emacs nine years ago and has built all sorts of nifty customizations since, including something that plays Tetris for you. He demonstrates the benefits of having an HTTP server running inside Emacs by using Skewer to interact with a web browser and Impatient-mode to share his syntax-highlighted buffer through the Web. In addition, he covers foreign function interfaces, packages, and other good things. Check it out!

Links: 

Download the MP3

Emacs Chat: Oh no, my chat with Bodil Stokke didn’t get recorded!

May 31, 2014 - Categories: emacs

Camtasia said it was recording the whole thing, and then when I went to edit it, I found that I only had the first 9 minutes. Extracting the .camrec didn’t get me any additional data. Nooooooooooooooooooooooooo! That’s what I get for doing an interview without two recording systems. Normally I use Google Hangout On Air’s built-in recording and Camtasia Studio as a backup, but since I was using appear.in, I only had Camtasia Studio running.

And it was a cool demo/discussion of Flycheck with Haskell (including better ways to do things), Tern, js2-mode, smartparens, tagedit, the XWidgets branch and running Reveal.js presentations inside Emacs, styling tips (Powerline, Nyancat, font-locking), the Emacs Lisp Reference…

We might be able to reschedule after I crawl out from under a rock and also hammer a solid backup screen recording strategy in place, although Bodil mentioned she’s open to using Google Hangout on Air even though it uses some proprietary plugins.

In the meantime:

http://twitter.com/bodil

https://gitlab.com/bodil/emacs-d/tree/master

Argh. Bodil, I’m so sorry!