Evil plans

Curious about anything? Contact me at sacha@sachachua.com . Web: http://sachachua.com/evil-plans Raw files: evil-plans

Additional notes: http://sachachua.com/blog/2014/03/reflecting-goals-time/

Current goals

See raw file or end of document for code.

Sorry, your browser does not support SVG.

Including "Someday" goals

See raw file or end of document for code.

Sorry, your browser does not support SVG.


Life 10 SOMEDAY set up distinctly interesting memories for four months straight
Life 30 SOMEDAY get driver's license?
Drawing 20 SOMEDAY draw recognizable people
Programming 10 SOMEDAY contribute to open source documentation
Writing 30 SOMEDAY write book about 5-year experiment to capture memories and help other people curious about it
Writing 50 SOMEDAY write a set of three or four 4-part courses
Life 10 SOMEDAY create four major projects in a year
Writing 20 SOMEDAY write mini-book on building Emacs habits
Learning 10 SOMEDAY create syntopicon/bibliography

Goals   goal

SOMEDAY maintain or improve my health

So that I can live an awesome life

live an awesome life

enrich our experiences

So that I can live an awesome life

tickle my brain

TODO sew more clothes for A- and me

so that I can tickle my brain

TODO build organizers and other things for the house

so that I can tickle my brain

share useful stuff

improve my drawing skills

So that I can share useful stuff

improve my coding skills

So that I can tickle my brain

SOMEDAY publish resources

So that I can share useful stuff

SOMEDAY make better decisions

so that I can live an awesome life

DONE re-examine spending and carve out more for what matters   Finance

So that I can make better decisions

get more value from my time

so that I can live an awesome life

DONE Practise kaizen on our new routines

So that I can get more value from my time and enrich our experiences

Current gaps/opportunities:

  • Taking care of A-'s basic needs
  • Choosing activities to consistently attend
  • Making time to think, draw, and share

DONE develop structures for journaling   Writing

SOMEDAY create syntopicon/bibliography   Learning

DONE keep a year of journals (short entries)   Writing

SOMEDAY delegate more effectively

SOMEDAY delegate 2,000 hours or $20,000 of meaningful, useful work   delegation project

So that I can delegate more effectively and

So far:

(let ((dollars 8229.45)
      (hours 486))
  (format "%d dollars - %d%%; %d hours - %d%%"
          dollars (* (/ dollars 20000.0) 100.0)
          hours (* (/ hours 2000.0) 100.0)))

The work should:

  • move me towards my primary goals
  • help assistants improve their skills and justify better rates in the marketplace

Need to compensate for 2,166 hours as of 2014-05-16

SOMEDAY add 50 items to my process library   delegation

So that I can delegate more effectively and share useful stuff

Process library - for my virtual assistants and for other people who are interested in delegation

;;#+CALL: list-files-with-target(directory="~/Google Drive/Delegation - Sacha Chua/Processes", pattern="How to", target=50) :results value org

35 items - 70%
1. How to add blogs to Feedly
2. How to add resources to the resources page and sidebar widget
3. How to add tags to Flickr sketches
4. How to animate sketches with Autodesk Sketchbook Pro and Camtasia Studio
5. How to convert a Vimeo or YouTube video to MP3 and save it for offline listening
6. How to create a Frugal FIRE event on Google+
7. How to create a Google+ Event banner
8. How to create a Helpers Help Out event on Google+
9. How to download invoices from InvoiceTrack
10. How to draft Q&A posts based on a transcript
11. How to draft an Emacs Basics blog post
12. How to draw and implement highlighted hand-drawn icons using CSS sprites
13. How to extract the MP3 from YouTube or an MP4
14. How to file a healthcare claim for massage
15. How to identify Q&A from a transcript
16. How to import my theme into your local development environment and get ready for work
17. How to look up additional information for people
18. How to post show notes
19. How to prepare for and host a Google Hangout on Air
20. How to process audio in Audacity
21. How to process scheduling requests
22. How to request books from the library
23. How to research related posts
24. How to set up a public conversation over Google Hangouts On Air
25. How to set up a public conversation
26. How to set up a redirection URL
27. How to summarize blog posts as tweets
28. How to transcribe audio
29. How to update Flickr with blog post URLs
30. How to update QuantifiedSelf.ca blog posts with video embeds
31. How to update a blog post with an MP3
32. How to update a book through CreateSpace
33. How to update the MP3 metadata
34. How to upload an MP3 to archive.org
35. How to write a blog post

help the Emacs community grow

TODO smoothen Emacs and Org use on my phone

SOMEDAY get back into Emacs Hangouts

DONE make it to 52 issues of Emacs News   emacs

SOMEDAY Develop emacslife.com into beginner/enthusiast resources for Emacs   emacs project

so that I can help the Emacs community grow

What do I want to learn from working on EmacsLife?

  • Organizing questions logically, and adding links between sections
  • Writing based on an outline
  • Revising with feedback
  • Developing a smooth workflow for exporting my blog posts
    • Update monthly, perhaps?
  • Herding cats: Delegating to other geeks
  • Eventually: structuring courses, creating resources

Sketching the future:

Because of the time I've invested in working on resources for the Emacs community, I have the confidence that I can logically structure my thoughts and write technical learning-oriented books. I have a community of people happy to proof-read/beta. I have a lot of experience in creating rich media resources as well.

I have a smooth workflow for identifying topics, outlining them, organizing the topics, researching information, filling in the gaps (whether I'm writing things myself or paying other people to do so), pulling everything together, and publishing and sharing the results. This may even be self-financing. I create a useful resource of at least 10,000 words at least every 12 weeks.

This gives me great ways to:

  • Learn more about what I'm curious about
  • Organize my thoughts and identify gaps
  • Communicate clearly, approachably, and engagingly
  • Share in scalable ways

SOMEDAY create a 10-week Emacs Basics course   emacs specific project someday

So that I can help the Emacs community grow


  1. ☑ Use the mouse
  2. Call commands by name with M-x
  3. ☑ Customize and configure
  4. ☐ Learn keyboard shortcuts
  5. ☐ Learn Emacs Lisp
  6. ☐ Customize keyboard shortcuts
  7. ☐ Save time with keyboard macros
  8. ☐ Be inspired

DONE set up regular Emacs hangouts

so that I can help the Emacs community grow

Every two weeks? Every month? Need a co-host.

Old graph



(let ((count 0)
       (directory-files directory nil pattern)))
  (format "%d items - %d%%\n%s"
          (length files)
          (/ (* 100.0 (length files)) target)
           (lambda (x)
             (setq count (1+ count))
             (format "%d. %s" count (replace-regexp-in-string strip "" x)))
(defvar include-someday nil)
(defun sacha/fill-string (string new-fill-column &optional replace-char)
  "Wrap STRING to NEW-FILL-COLUMN. Change newlines to REPLACE-CHAR."
    (insert string)
    (let ((fill-column new-fill-column))
      (fill-region (point-min) (point-max))
      (if replace-char
            (goto-char (point-min))
            (while (re-search-forward "\n" nil t)
              (replace-match replace-char t t))))

(defun sacha/org-map-goals (tag)
  "Return an alist, based on the TAG tree and \"so that I can\" link structure.
  Structure: ((nodes . ((components) ...)) (edges . ((a . b) ...)))"
  (let (nodes edges)
    ;; Go through the entries
     (lambda ()
       (let ((heading (org-heading-components)))
         (when (or (not (elt heading 2)) (member (elt heading 2) (if include-someday '("TODO" "WAITING" "SOMEDAY") '("TODO"))))
               ;; Ignore subtrees in the body
                 (org-set-property "CUSTOM_ID" (replace-regexp-in-string "[^A-Za-z0-9]" "_" (elt heading 4))))
                (if (re-search-forward
                     (concat "[\r\n]\\(" org-outline-regexp "\\)") nil t)
                    (match-beginning 1)
               (goto-char (point-min))
               (when (> (car heading) 1)
                 (setq nodes (cons heading nodes)))
               (when (re-search-forward "so that I can" nil t)
                 (while (re-search-forward org-bracket-link-regexp (line-end-position) t)
                   (setq edges (cons (cons (elt heading 4) (match-string-no-properties 1)) edges)))))))))
    (list (cons 'nodes nodes) (cons 'edges edges))))

(defvar sacha/elgraphviz-attributes '((:color . "color")
                                      (:fontname . "fontname")
                                      (:pad . "pad")
                                      (:shape . "shape")
                                      (:style . "style")
                                      (:tooltip . "tooltip")
                                      (:target . "target")
                                      (:url . "URL")
                                      (:width . "width"))
  "List of attributes")

(defun sacha/elgraphviz-process-property-list (prop-list)
  "Convert PROP-LIST to an alphabetically sorted, comma-separated attribute list."
  (mapconcat 'identity
             (delq nil
                   (mapcar (lambda (x)
                             (if (plist-get prop-list (car x))
                                 (format "%s=\"%s\"" (cdr x)
                                         (sacha/elgraphviz-quote-string (plist-get prop-list (car x))))))

(ert-deftest sacha/elgraphviz-process-property-list ()
  (should (string= (sacha/elgraphviz-process-property-list '(:width 1)) "width=\"1\"")))

(defun sacha/elgraphviz-quote-string (string) "Quote \" in strings." (replace-regexp-in-string "\"" "\\\"" (format "%s" string)))

(defun sacha/elgraphviz-node (name &rest args)
  "Return the node definition for NAME with ARGS as attributes."
  (if args
      (format "\"%s\" [%s]" (sacha/elgraphviz-quote-string name) (sacha/elgraphviz-process-property-list args))
    (format "\"%s\"" (sacha/elgraphviz-quote-string name))))
(defun sacha/elgraphviz-directed-edge (a b &rest args)
  "Return the node definition for NAME with ARGS as attributes."
  (format "\"%s\" -> \"%s\" [%s]"
          (sacha/elgraphviz-quote-string a)
          (sacha/elgraphviz-quote-string b)
          (sacha/elgraphviz-process-property-list args)))

(ert-deftest sacha/elgraphviz-node ()
  (should (string= (sacha/elgraphviz-node "Test" :style "filled" :url "http://example.com" :tooltip "test")
                   "\"Test\" [style=\"filled\",tooltip=\"test\",URL=\"http://example.com\"]")))

(defun sacha/elgraphviz-default-node (&rest attributes)
  (format "node [%s]" (sacha/elgraphviz-process-property-list attributes)))

(ert-deftest sacha/elgraphviz-default-node ()
  (should (string= (sacha/elgraphviz-default-node :color "#cccccc" :width 100)
                   "node [color=\"#cccccc\",width=\"100\"]")))

(defun sacha/elgraphviz-default-edge (&rest attributes)
  (format "edge [%s]" (sacha/elgraphviz-process-property-list attributes)))
(defun sacha/elgraphviz-attribute (name val)
  (format "%s=\"%s\"" name (sacha/elgraphviz-quote-string val)))

(defun sacha/elgraphviz-digraph (id &rest body)
  (concat "digraph " id " {\n"
          (mapconcat 'identity body "\n")

(defun sacha/org-map-to-graphviz (map fill-column id)
  "Convert MAP to a graphviz representation. Wrap titles at FILL-COLUMN."
  (sacha/elgraphviz-digraph id
                            (sacha/elgraphviz-attribute "id" id) 
                            (sacha/elgraphviz-default-node :shape "box" :fontname "Open Sans" :pad 1) 
                            (sacha/elgraphviz-default-edge :color "#CCCCCC") 
                             (lambda (x)
                                (sacha/fill-string (car x) fill-column "\\n")
                                (sacha/fill-string (cdr x) fill-column "\\n")))
                             (cdr (assoc 'edges map)) "\n")
                             (lambda (x)
                                (sacha/fill-string (elt x 4) fill-column "\\n")
                                :style (if (null (elt x 2)) "filled")
                                :url (concat "index.html#" (replace-regexp-in-string "[^A-Za-z0-9]" "_" (elt x 4)))
                                :target "_parent"
                                :tooltip (elt x 4)))
                             (cdr (assoc 'nodes map)) "\n")))
(org-babel-execute:dot (sacha/org-map-to-graphviz (sacha/org-map-goals tag) fill-column id) (list (cons :file outputfile) (cons :cmdline cmdline)))
Back to top
Back to top | E-mail me