Groundhog Day Resolutions - October 2020

I didn't write my September post until the 21st, so it didn't give me much time to get things done. Here's how everything went.

September's Primary Goals

1. Complete at least one "other goal"

I marked "Contribute regularly to an online community" as completed. I've been doing this since the start of the year so I think it's fair to mark as completed.

It's a different experience from when I used to post on forums in the late 90's - a lot of communities are centralized on Reddit, Facebook, and Twitter - but it's been nice to talk to other people.

One thing I still want to do is integrate Webmention support into this site.

Out of all the goals I picked this year, this was probably the only one made easier by Covid restrictions.

2. Continue my bodyweight workouts

Not only did I not miss a single workout on September, but I also added some runs to the same days I did workouts. I was a little worried I wouldn't be able to continue the same workout schedule once marathon training starts, but so far things are looking good.

3. Create plans for my bodyweight skill goals, and follow them

I created a spreadsheet to track my progress through each set of progressions, and I added skill work to my scheduled workouts.

September's Secondary Goals

1. Prep for a 30 day blog marathon

I have a list of topics to write about, and I'm sure more ideas will surface once I start writing regularly.

2. Read a book!

I bought some books, but that doesn't count for much if I don't read them.

Primary Goals for October

1. Publish version 0.5 of Writing PHP with Emacs

I've been working on the latest chapter, "Using lsp-mode", for the last week or so. There's quite a lot of information to cover and it will probably be the largest chapter by quite a margin.

I'd like to have it published by the end of October.

2. Start blogging every day

Write every day for 30 days is one of my secondary goals for 2020. I want to have this started before November 1st rolls around.

3. Complete another secondary goal

With less than 3 months to go I need to make some serious progress here.

I have mixed feelings about September. I met nearly all of my targets, but I spent the first few weeks of the month focusing on work to the detriment of everything else. I don't like cramming goals in all at the end of the month - despite how frequently I do it - and it gave me a bit of an unpleasant feeling.

I'm deliberately keeping October's list of goals simple. I'm not a particularly good writer, so I want to make that my primary focus for the month.


Groundhog Day Resolutions - September 2020

I really wanted this entry to be a little more introspective, but it's already September 21st and there isn't much time for that. August was another busy month, and just like July it was so short that I'm not convinced it actually happened.

August's Primary Goals

1. Release version 0.3 of The Book

I published a new chapter of The Book. I'd like to be writing more, but I'm on pace to have everything I wanted written by the end of the year.

2. Bodyweight workouts, 3 times a week

This goal was a big, big success for me. I managed 3 workouts a week and saw some pretty nice improvements: I went from 15 pull ups to 32, increased my push ups to 18 per day, and added some basic dragon flag progressions near the end of the month. I also bought a set of gymnastic rings for incline rows and dips.

I set up a Beeminder goal which made all the difference. Previous attempts at this goal have failed because I would take days off to "rest", or because I didn't feel 100%. It turns out $5 is all it takes to encourage me to work past those problems.

3. Release version 1.2 of beeminder.el

Good grief, what will it take to get this thing released?

August's Secondary Goals

1. Publish 8 posts on this site

Not even close here.

2. Maintain a frog stand for 30 seconds

I made it up to 5 seconds, but it was tough to get much higher than that. I did not practice as deliberately as I should - I set a timer for 5 minutes and then tried to frog stand in that time.

Next time around I'll create a plan and set myself some weekly and daily targets. I've had success with that approach in other areas, and I think it will work here too.

Primary Goals for September

1. Complete at least one "other goal"

2020 is nearly 75% of the way through, but I've only completed 20% of my goals. I need to get a move on here.

2. Continue my bodyweight workouts

This is going so well and I want to keep it going.

3. Create plans for my bodyweight skill goals, and follow them

Frog standing turned out to be more of a challenge than I anticipated. Likewise, my early attempts at L-sits have not been too successful. It's likely that I'll need to integrate additional stretching into my routine before I make much progress here.

Secondary Goals for September

1. Prep for a 30 day blog marathon

There are two things that stop me from writing more: I don't always have a topic to write about, and when I do I tend to go overboard so it takes weeks to actually write.

The plan here is to create a big list of topics I can pick from, and to keep each topic small enough so that I can write a post in under an hour.

2. Read a book!

I haven't sat down and read anything for months. I'd like to change that.


Keeping notes with Zetteldeft

One of my goals for 2020 was to try zettelkasten for managing my notes. I've experimented with various approaches in the past: paper notes in folders (and all over my desk), self-hosted wikis, and custom software like OneNote or Notion.

A few years ago I started using LionWiki to manage a small personal knowledge base. It was somewhat successful, but it didn't quite fit in with my daily workflow. It also required a network connection and browser to be open, and re-organizing notes wasn't quite as quick as I would like. I really like it as a lightweight wiki solution, but for personal notes I wanted something more.

Eventually I switched to deft, an Emacs-based tool for organizing notes that is based on Notational Velocity. This summer I evaluated a number of other zettelkasten tools, but I settled on Zetteldeft as it integrated well with my existing set of notes.

zetteldeft works alongside deft and adds support for special linking syntax, as well as a slightly different naming scheme for notes (timestamp followed by the title).

Zetteldeft open and ready to search
Figure 1: Click to see deft's search in action

There are a few things I really like about deft/zetteldeft's approach:

  • Text based notes – All of my notes are stored in org-mode format on my home computer. deft also supports plain text and markdown formats.
  • Fast to find notes – With a few keystrokes (C-c z D) I can bring up a new search, and the results are narrowed as I type.
  • Fast to add notes – C-c z n brings up a prompt for a new note title. Once that is entered, I'm taken to the note file with the title already filled in.
  • Linking to other notes is easy – zetteldeft supports linking to notes via a special character and the note id, which looks like this: ยง2018-07-09-2115. With some modifications it can also use a special zdlink protocol in org-mode.
  • Fits in with my daily work – If I've found the solution to a problem, I can quickly create a note and paste the solution without having to switch to another application or open a browser tab.

My zetteldeft configuration

The following code lives in my Emacs init.el. It sets up deft and zetteldeft, along with a bunch of keyboard shortcuts.

One additional change I made is binding C-c z p to sodaware/deft-open-preview. This allows me to open notes in a preview window without the list losing keyboard focus.

I use file-truename when setting my notes path as zetteldeft had some problems locating my notes when using a relative path.

(use-package deft
  :bind
  (("C-c d" . deft))
  :custom
  ;; Set deft path to full path so that zetteldeft works.
  (deft-directory         (file-truename "~/Documents/notes"))
  (deft-extensions        '("md" "org"))
  (deft-default-extension "org")
  (deft-recursive         t))

(use-package zetteldeft
  :bind
  ("C-c z d" . deft)
  ("C-c z R" . deft-refresh)
  ("C-c z D" . zetteldeft-deft-new-search)
  ("C-c z s" . zetteldeft-search-at-point)
  ("C-c z c" . zetteldeft-search-current-id)
  ("C-c z f" . zetteldeft-follow-link)
  ("C-c z F" . zetteldeft-avy-file-search-ace-window)
  ("C-c z l" . zetteldeft-avy-link-search)
  ("C-c z t" . zetteldeft-avy-tag-search)
  ("C-c z T" . zetteldeft-tag-buffer)
  ("C-c z i" . zetteldeft-find-file-id-insert)
  ("C-c z I" . zetteldeft-find-file-full-title-insert)
  ("C-c z o" . zetteldeft-find-file)
  ("C-c z n" . zetteldeft-new-file)
  ("C-c z N" . zetteldeft-new-file-and-link)
  ("C-c z p" . sodaware/deft-open-preview)
  ("C-c z r" . zetteldeft-file-rename)
  ("C-c z x" . zetteldeft-count-words)
  :config
  (defun sodaware/deft-open-preview ()
    (interactive)
    (deft-open-file-other-window))

  (font-lock-add-keywords
   'org-mode
   `((,zetteldeft-id-regex  . font-lock-warning-face)
     (,zetteldeft-tag-regex . font-lock-warning-face))))

Additional changes: the zdlink protocol

This is one of my favourite changes - it adds a new org-mode protocol, zdlink, which allows me to insert an org-style link to any note via C-c C-l. These links can be opened like any other org-mode link, and because they only include the note name (not the full path) they work across machines.

This isn't very useful if you're using markdown, but for pure org it makes linking and navigating much easier.

;; Add custom `zdlink` to handle zettledeft links.
(eval-after-load 'org
  (lambda ()
    (require 'zetteldeft)
    (org-link-set-parameters
     "zdlink"
     :follow
     (lambda (str) (zetteldeft--search-filename
		    (zetteldeft--lift-id str)))
     :complete  #'sodaware/zd-complete-link
     :help-echo "Searches provided ID in Zetteldeft")))

(defun sodaware/zd-complete-link ()
  "Link completion for `zdlink' type links."
  (let* ((file (completing-read "File to link to: "
				(deft-find-all-files-no-prefix)))
	 (link (zetteldeft--lift-id file)))
    (unless link (user-error "No file selected"))
    (concat "zdlink:" link)))

Additional feature: zetteldeft homepage

Note: This behaviour is now part of zetteldeft core. A home note can be assigned via the zetteldeft-home-id variable, and then accessed with M-x zetteldeft-go-home.

This is a small change that allows me to open a specific note file with a keyboard shortcut. This is useful when keeping a single note that acts as a gateway to all others.

I prefer the main search buffer for finding notes, but I keep one note that lists my main projects and links to their notes.

(defun sodaware/zd-homepage ()
  "Open Zetteldeft home file."
  (interactive)
  (zetteldeft-find-file "2020-07-10-0959 Home.org"))
(global-set-key (kbd "C-c z h") #'sodaware/zd-homepage)

Additional feature: .dir-locals.el config

This is a really simple .dir-locals.el file that lives in my main notes directory. It adds 3 features:

  • emojify-mode support – Sometimes I see fancy notion setups and want to spice up my buffers with some emoji. I don't, but with emojify-mode I could.
  • whitespace-mode - This removes trailing whitespace when I save notes.
  • Expands notes on opening – I normally have org-mode headlines collapsed as I use it for organizing my todo lists, but for notes I like to see the entire document when I open it.
((org-mode . ((mode . emojify)
	      (mode . whitespace-cleanup)
	      (eval . (outline-show-all)))))

How I use org-mode

A few days ago, someone in /r/emacs asked the following question:

Hi! I am getting started with org and wanted to ask you why do you use it and how did org changed your life/workflow.

Answering it made me realize just how much of my daily workflow uses org-mode. Even more interesting was how much I use it for non-task related work. This is an expanded version of my original answer.

Tracking my diet, weight, and workout routines

This is something I wrote about in July. I've used org-mode to track my diet for years; the combination of properties and inline tables makes it extremely flexible.

I also use org-mode for tracking my exercise routines. This is integrated with beeminder to keep me on track.

Keeping on top of recurring tasks

I use org-habits for tracking recurring tasks and habits that I want to create. It integrates with org-agenda and shows a progress bar of days I have completed it.

All of my habits are also tied to beeminder goals (via beeminder.el) to give me some additional incentive.

A single habit entry looks like this:

* TODO Weekly review
  SCHEDULED: <2020-08-28 Fri .+7d>
  :PROPERTIES:
  :beeminder: weekly-review
  :STYLE:     habit
  :beeminder-skip-deadlines: true
  :END:

Marking the task as completed sends a datapoint to beeminder, and because the task is a habit the TODO remains open for the next date. I use the :beeminder-skip-deadlines: property to prevent habit deadlines from clogging up my agenda.

Keeping work and personal notes

I've been using zetteldeft to create and organize my notes for a couple of months. I was using deft before, so there wasn't much of a learning curve. I really like how the search narrows things as I type, and linking notes together makes it easier to keep things organized.

I'm not quite as organized as some other systems I've seen, but for the amount of notes I have (~150) it works quite well.

The full setup deserves an entire post of its own.

My full setup is detailed here: "Keeping notes with zetteldeft".

Keeping track of important dates

I use org-anniversary and a single file called dates.org to store birthdays and anniversaries.

An entry in my dates.org looks like this:

* Anniversaries
  :PROPERTIES:
  :CATEGORY: Important Dates
  :END:

%%(org-anniversary 2020  6 16) Gingersnap's %d adoptaversary

Unlike a scheduled TODO item, these dates show up in the agenda with the correct anniversary or birthday number. So in 2021 this entry would show as Gingersnap's 1 adoptaversary.

Planning out projects and organizing my day

The combination of plaintext for tasks and the dynamic agenda are extremely powerful for organizing projects. The agenda shows everything I have scheduled for the current week, and I'll usually narrow it down to the current day to get a better view.

This is another thing that deserves its own post.

Writing my personal blog

I use org-mode's html exporter to convert posts to html. I wrote about this in "From WordPress to Jekyll", but that process is a little outdated.

My current system involves storing posts in git, and then building the html + site on the server whenever content is pushed to it. I should probably write a post about this one too.


Groundhog Day Resolutions - August 2020

July was was busy. Really busy. I'm also convinced it was the shortest month of the year.

July's Primary Goals

1. Release version 0.3 of The Book

I wrote a lot of notes but didn't get them in a publishable state.

2. Run some more

I ran more miles in July than any month since March. I can't say I enjoyed running them, but the longer runs were not as painful as last time I trained for a half.

3. Release version 1.2 of beeminder.el

I finished a couple more features and straightened out some bugs, but there is one last part I need to get finished and tested before release.

July's Secondary Goals

1. Complete another "other goal"

Success, I planted a tree! Or rather, I donated money to an organization that plants trees. I would have preferred to do the planting myself, but given the various restrictions in place due to COVID-19 that wasn't looking likely.

2. Create a short screencast

I underestimated how difficult this was going to be. Not just from a technical point of view, the also the amount of writing and editing required.

This is still something I'd like to try, but I don't think it's something to attempt without more planning and research.

Primary Goals for August

1. Release version 0.3 of The Book

Let's try this one again. I really want to have the first complete edition published by the end of the year. There are still 4 months left, but that time goes by pretty darn quick.

2. Bodyweight workouts, 3 times a week

My October half marathon has been canceled, so there is no need for me to run as many miles as I had planned. I'll still be running, but only 3 times a week instead of 5 days like before. I'm okay with that.

To replace the running I'd like to get back into bodyweight workouts. I already have most of the equipment I need, which is handy given that everything is sold out.

I expect there will be some Beeminding involved with this goal.

3. Release version 1.2 of beeminder.el

Third time's a charm?

Secondary Goals for August

1. Publish 8 posts on this site

There are a couple of topics I've been meaning to write about but haven't made the time for. August seems like as good a time as any.

2. Maintain a frog stand for 30 seconds

Learning three bodyweight skills is one of my major goals for 2020, but I've been quite lax lazy about practicing them.

By the end of August I want to be able to maintain a frog stand for 30 seconds without falling over.

July absolutely flew by. Work was especially busy, but I still should have spent more time on my goals. I have a bad habit of setting GHD goals and then forgetting about them until it's too late.

For August I'll be putting them all into my GTD system (like I should have been doing). We'll see if that makes a difference.