Connecting ideas

| writing

One of the things I like about going through elementary education as a parent is thinking about my processes for making sense of things and how I can help A+ figure out her own way to do that. A+ is in grade 4, and she has a research project that's due in a few weeks. I helped her take notes on different websites using a stack of index cards. The next time she lets me help her with homework,1 I can show her how to sort those index cards into piles by topic. Then she can take each pile and figure out their sequence.

Index card sorting is the slightly-larger version of the way I used to help her with writing by letting her brainstorm a whole bunch of keywords in any order she wants. Ideas for a paragraph or a school essay fit on a page, but a longer report needs more space and tactile experience. I write keywords as she dictates them, we move things around to cluster similar ideas, and then she can pick whatever she wants to write about first (or jump into the middle) and thread her sentences through those words. Get the chunks down first, get them to be the right size for your brain, and then figure out the flow. Someday I'll show her mindmapping programs (or even maybe Org Mode!). For now, index cards and drawing programs help us focus on ideas without getting lost in interfaces. She's still far from making her own Zettelkasten. I don't even know if that'll suit her brain. But if I show her the ideas in miniature and shift some of my thinking to forms she can observe, maybe that'll give her some tools that work for where she is right now. Like the way physical math manipulatives make abstract numbers more real, I hope that that moving ideas around helps her think about thinking.

Cognitive load

This challenge of helping A+ figure out how to make sense of things and convert that understanding into a form her teacher can grade is similar to something I've been working on for many years. My mind finds it hard to settle on one topic. It likes to jump from one thing to another. I'm learning to accept that. I like writing non-linearly. I like connecting ideas. To write something sensible, I sometimes need to summarize ideas enough so that I can fit them within my working memory. (In one blog post? On one page? On their own index cards?) Too much cognitive load means the ideas fall apart. There's no getting around intrinsic cognitive load, but sometimes it's easier to look at smaller chunks. I can get around extraneous cognitive load by rewriting or redrawing things to cut out the fluff, like the way business books are padded with lots of filler. Managing my germane load–my working memory, the particular ways of encoding the knowledge into schemas in my head or in my notes that will work for my brain–is the work I get to focus on.

Figuring things out

I use blog posts, sketches, and hyperlinks to chunk thoughts into building blocks. Then I need to figure out the order I want to discuss them in. It's difficult to run a single coherent line through the ideas. Sometimes I experiment with tangents in side notes or collapsible sections. Sometimes I can't get the ideas all straightened out. Sketchnotes and maps sometimes help show the spatial relationship between ideas, when I can squish things down into two(ish) dimensions.2

Even if I had all the continuous quiet time I wanted, I'd still need these rough notes to get things out of my head and into a form I can look at. It's okay for them to not be coherent and polished. I figure out what I think by writing and drawing. This is the doing of it. Other people's essays also evolve out of notes that are gradually fleshed out. There's hope for it yet. Slosh enough mnemonic slurry around in various buckets, and something interesting might precipitate. The idea of an atomic note is nice, but I'm not there yet. For now, I think I'm better off letting my mind explore these branches instead of pruning things down to a singular focus.

Sharing the digressions and connections

It's reassuring to know that I'm not the only one whose mind wants to go down all the different paths. In "The utility of digressions," Ruben Schade wrote:

In my original post I joked that my blog is often full of nonsensical or meandering digressions. This is because I have an odd sense of humour, but it’s also fun making connections between disparate things. … Digressions and tangents are one of the key ways that human writing is interesting. I’ve gone down so many wonderful rabbitholes just by reading a digression note on a blog I first read because we had a common interest.

Maybe it's okay to leave these little signposts in case someone wants to take those forks in the path.

This reminded me of busybody, hunter, and dancer archetypes for curiosity. Sometimes people are curious about lots of different things, like a bee visiting different flowers. Sometimes people are focused on a particular topic and want to know as much as they can about it. Sometimes the joy is in the leap from one topic to another, like when interesting blog posts are juxtaposed in my feed reader or my to-think-about list3.

Connecting one sentence to another is the job of the transition words that A+ learns about in class: first, then, finally. My connections tend to be along the lines of "Similarly…." It's easy for me to connect the ideas that feel the same.

"But" is an interesting transition word I want to use more. It surprises. I wonder where I can practise noticing when two ideas contrast, especially when two seemingly-contradictory things can be true,4 or when there's a general idea but a specific exception. It's not just about looking for an opposite, but thinking more critically about things and seeing the gaps. To practise this, though, I have to be comfortable with writing more for myself than for readers who might not be able to follow the uncertain not-quite-trails I meander down. I'm in good company. Jerry's Brain is quite the knowledgebase, but it might be hard for anyone to use if they're not Jerry. It's better to start, even when the beginning is awkward and I know I'll still need to slog through the plateau of mediocrity.

An example

Henrik Karlsson's recent preview of a paywalled post on agentic fragments had this:

Where I saw a sweater, she saw a thread temporarily shaped as one—it could just as well be a scarf, a pair of socks, a hat, or six gloves. She saw more degrees of freedom than I did, and acted on it.

… which branched off myriad thoughts: MacGyver, my dad's Swiss Army Knife, Henrik's essay on agency? The fun of building things in Emacs, the things I love about free/libre/open source software, the master builder scenes in The LEGO Movie? The way my sister unravels her health challenges and turns them into poignant reflections? Sewing and re-making things, Jacob Lund Fisker's book Early Retirement Extreme, and the skills I want to get better at?5 (Even though I'm starting to have more time for myself, I don't find myself using that time for practising sewing or picking up woodworking again. If anything, at the moment, I'm probably focused on getting by with less stuff instead of more.) Maybe this will eventually be multiple posts, like the way I responded to the IndieWeb Carnival theme of "Take Two" with three posts.6 Maybe I need to lightly sketch out my thoughts with drawings and words until I figure out what I want to say, like moving index cards around on the floor.

Into the unknown

Connecting the dots
Figure 1: Connecting the dots

I wonder what better could look like. There's that meme of connecting the dots, when someone is trying to show a complex theory in an incoherent way. When connections are too lightly supported or too overwhelming in number, it only makes sense to me and not to other people. (Maybe not even to my future self.) A good connection, on the other hand, might lead to "Hmm, I hadn't thought of it that way," or maybe the insights you can get by extending a metaphor. Like when you start to fill in a visual framework and it guides you to think about things you might have missed. Mashing up ideas can reveal different aspects of them: similarities, differences, gaps.

There's something here, I think. A digression doesn't have to be to something I know. A connection can be to an amorphous question I haven't fleshed out. If I mash ideas together with enough energy, what particles come out of the collision? If I connect the ideas that feel similar, can I begin to sense the lacunae, the questions I may want to ask? Here are more signposts to things I'm still figuring out: not so much "Here there be dragons," but pointers to territory I've yet to explore.

Footnotes

1

I'm backing off from homework assistance right now so that I can help her develop autonomy and I don't overwhelm A+ with fretting. Perhaps this index card technique will come in handy for her science project, or perhaps it will wait until her brain is ready.

3

I also like capturing snippets into a sort of commonplace book.

4

This idea often comes up on Dr. Becky's parenting podcast/book, Good Inside: two things are true.

5

Early Retirement Extreme: I remember seeing a chart about how increasing skills decreases expenses and increases freedom.

View org source for this post

2025-10-13 Emacs news

| emacs, emacs-news

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, Mastodon #emacs, Bluesky #emacs, Hacker News, lobste.rs, programming.dev, lemmy.world, lemmy.ml, planet.emacslife.com, YouTube, the Emacs NEWS file, Emacs Calendar, and emacs-devel. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at sacha@sachachua.com. Thank you!

View org source for this post

Added multiple timezone support to casual-timezone-planner

| emacs

My eldest sister got a Nintendo Switch. Now she can join my middle sister, the kids, and me in a Minecraft Realm. We're all in different timezones, so we needed to figure out a good time to meet. I briefly contemplated firing up timeanddate.com's Meeting Planner, but I wanted an Emacs way to do things.

I remembered coming across casual-timezone-planner in one of the Emacs News posts in June. It only handled one remote timezone, but it was easy to extend casual-timezone-utils.el to support multiple timezones. I changed completing-read to completing-read-multiple, added the columns to the vtable, and updated a few more functions. kickingvegas tweaked it a little more, and now multiple timezone support is in the version of casual that's on MELPA. Yay!

2025-10-08_09-55-25.png
Figure 1: Screenshot of times in America/Toronto, Europe/Amsterdam, and America/Los_Angeles

We settled on 7 AM Los Angeles, 10 AM Toronto, 4 PM Amsterdam, and we played on Saturday and Sunday. Had lots of fun!

View org source for this post

2025-10-06 Emacs news

| emacs, emacs-news

Why I Keep Blogging With Emacs is a short blog post that got a lot of comments on HN this week. Also, xenodium is trying out making videos, starting with batch-applying command-line utilities.

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, Mastodon #emacs, Bluesky #emacs, Hacker News, lobste.rs, programming.dev, lemmy.world, lemmy.ml, planet.emacslife.com, YouTube, the Emacs NEWS file, Emacs Calendar, and emacs-devel. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at sacha@sachachua.com. Thank you!

View org source for this post

September 2025: school, playdates, coding, drawing

| monthly, review

Text from sketch

September 2025 school, playdates, newsletter, EmacsConf infrastructure 2025-09-30-11

  1. Science Centre adventure zone
  2. First day: Grade 4
  3. play group
  4. farmers market
  5. First week of Gr. 4! Celebration ice cream
  6. Biidaasige Park, 9x
  7. Trying the loom at Riverdale; also, Happy Kingdom
  8. Bubbles at the park
  9. KidSpark with friends
  10. composted bitter melon, moved strawberries
  11. A+ donated some clothes to the kids clothing swap; Little Miss Light Rye
  12. reusable wipes dispenser
  13. Turns out I needed a nap.
  14. Sortbot
  15. swimming
  16. catch-up day
  17. a good talk; popsicles at the park
  18. newsletter HTML
  19. magic show
  20. taking a break from fretting
  21. had fun coding
  22. Etherpad 2.x
  23. line art
  24. taxes
  25. towel slide
  26. C-'s hat was stuck
  27. Nature Club: poison ivy (okay so far)
  28. A+ caught up with her homework
  29. emergency kit
  30. drawing icons

School: A+ started virtual grade 4. After we figured out that we needed to check Google Classroom instead of Brightspace for assignments, she was able to catch up with her homework. She often complains of boredom, but that's expected. Sometimes she tries the extra math topics I introduce. In general, though, she'd rather have the slack time to explore her own interests instead of doing more of the same. Totally understandable. I'll read through the CEMC math problems anyway so that I can keep some of them in my back pocket.

Play: Most days, we made it out to the playground after school. A+ had lots of fun playing with her closest friends, and she was also fine hanging out with me whenever they were playing a game she wasn't keen on. Sometimes we'd do math while waiting: algebra, binary conversion, geometry.

Independence: For my part, I think I've managed to mostly wrangle my school-related anxiety back to the occasional weekend check-in. It helps to remind myself that it's a good way for her to practise making her own decisions in a low-stakes environment: what to do when, what kinds of breaks to take in between. Better to try things and possibly run into things she needs to figure out or get help with now than wait until university. The more I step back, the more I can appreciate how she's growing: getting stuff done during class time, stepping outside to self-regulate when a party's getting too noisy for her. Compared to last year, it's much easier for me to say, "All right, you're in charge. I haven't even checked what's due when. What do you want to work on first, and do you want any help from me?" Usually all the help she wants is hugs, although sometimes I still type what she dictates when the assignment is really boring. It's nice that she can tell me what she wants. I also like seeing that carry over into her social life at the playground. She can think ahead about potential reasons for conflict and stick up for herself when her predictions come true. She enjoyed expanding her emergency kit to cover more scenarios, and it was great to see her satisfaction when the pencil and paper she'd packed came in handy.

My own time: An easy way to tone down my fretting is to redirect some of that nervous energy into my own projects. It's good for me and it's good for A+, who likes it better when I treat her as a 9-("and a half!")-year-old instead of a 5-year-old. I went from spending practically all day with A+ in summer to having more focus time. I'm settling into my own rhythms. There's usually one big chunk I can dedicate to something that might take a long time. Monday is Emacs News, Tuesday is for consulting, Wednesday is my own stuff, Thursday is Bike Brigade, and Friday is Bike Brigade feedback or other things as needed. The other chunk of time might be for miscellaneous tasks: writing, tidying, errands, and so on. The long focus time chunk helps me feel like I'm making tangible progress on things that require coherent thought, and having another chunk for odds and ends lets me putter around with things that might not flow as smoothly.

Thanks to this rhythm, I managed to resist the temptation to focus on just the consulting requests. I finally got to implement a few of the Emacs tweaks that have been collecting dust in my inbox. I upgraded the Etherpad we use for EmacsConf. I felt a little more solid about it because I did it via an Ansible playbook I tested in Vagrant instead of doing it ad-hoc.

I also changed my Bike Brigade newsletter workflow to convert the Google Doc draft into a big mass of HTML that I can just dump into one block. I've been using it for the past few weeks. This is difficult for people to squeeze last-minute edits in, but getting rid of all those mouse clicks makes me a lot happier, and nothing has been truly urgent. It's a trade-off, but I'm okay with choosing to increase my happiness (or at least reduce annoyance).

Fun: In addition to these small technical improvements, I've been practising drawing, too: mostly simple little black-and-white icons, sometimes drawn with references. It's a reasonable way to use the time I'd otherwise spend waiting at playdates. I like it, although I'll probably mix more thoughts and colours back in. The icons are like babbling with words. Sometimes I still want to unwind tangled thoughts into sentences and paragraphs. Sometimes I can't think of anything in particular, and working on visual vocabulary at least keeps me moving forward.

I haven't been doing piano as much, so I decided to just stick with the Simply Piano subscription instead of adding Piano Marvel. I want to get through more of the songs I've marked as favourites. There's still much for me to learn, and it's fun practising with music that we recognize.

I also haven't been playing as much Stardew Valley lately, probably because I'd rather spend that time tweaking Emacs instead. Sometimes A+ likes to interleave homework sessions and Stardew Valley days, so we're still making a little progress on our Stardew Valley Expanded farm. I enjoy playing co-op with her.

The weather's getting colder. I'll be wrapping up our real-life garden soon. Eventually I'll need to shift my playdate time-filler to things I can do outside even with gloves on. Maybe less drawing and more dictation as a way of fleshing out thoughts, or maybe some reading too. Last year, her playmates shifted indoors as the weather cooled down. We might see if this year we'll have more outdoor playdates with new friends, or if the two extracurriculars A+ is in (along with some more bike adventures with us, now that W- is retired) will be enough for us. There's a definite seasonality to my life at the moment, which feels nice.

Next: In October, I probably should record EmacsConf introductions so that I have more space for handling captions once the videos come in. I've scheduled some TODOs for the different e-mails I need to send speakers, too. On the personal side, I want to keep giving A+ space to take ownership of her learning. A+ wants to experiment with gymnastics classes, so we'll try that out.

Blog posts

Sketches

Time

Category Previous month % This month % Diff % h/wk Diff h/wk
Discretionary - Productive 10.3 16.7 6.4 27.1 10.7
Sleep 30.7 32.1 1.4 52.2 2.4
Personal 10.3 11.6 1.3 18.9 2.2
Business 2.5 3.7 1.3 6.0 2.1
Unpaid work 4.7 5.1 0.3 8.2 0.5
Discretionary - Family 0.2 0.2 0.0 0.3 0.1
Discretionary - Play 1.9 1.4 -0.5 2.2 -0.9
A+ 39.4 29.2 -10.2 47.5 -17.1
2025-09-01 23:38 - 00:04: Discretionary - Play - Stardew Valley2025-09-01 23:08 - 23:38: Discretionary - Productive - Drawing2025-09-01 22:55 - 23:08: Personal - Routines2025-09-01 19:34 - 22:55: A+ - Childcare2025-09-01 19:04 - 19:34: Personal - Routines2025-09-01 18:52 - 19:04: Unpaid work - Clean the kitchen2025-09-01 18:37 - 18:52: Personal - Routines2025-09-01 18:18 - 18:37: Unpaid work - Cook2025-09-01 18:01 - 18:18: Unpaid work - Clean the kitchen2025-09-01 12:32 - 18:01: A+ - Childcare2025-09-01 12:08 - 12:32: Unpaid work - Clean the kitchen2025-09-01 10:40 - 12:08: Discretionary - Productive - Emacs2025-09-01 10:31 - 10:40: Discretionary - Family2025-09-01 09:34 - 10:31: A+ - Childcare2025-09-01 09:15 - 09:34: Discretionary - Productive - Gardening2025-09-01 07:44 - 09:15: A+ - Childcare2025-09-01 07:03 - 07:44: Personal - Routines2025-09-01 00:28 - 07:03: Sleep2025-08-31 23:40 - 00:28: Discretionary - Play - Stardew Valley2025-09-02 22:42 - 00:12: Discretionary - Play - Stardew Valley2025-09-02 22:32 - 22:42: Personal - Routines2025-09-02 20:46 - 22:32: A+ - Childcare2025-09-02 20:16 - 20:46: Personal - Routines2025-09-02 20:06 - 20:16: Unpaid work - Tidy up2025-09-02 19:15 - 20:06: Unpaid work - Errands2025-09-02 19:11 - 19:15: Personal - Routines2025-09-02 18:54 - 19:11: Unpaid work - Clean the kitchen2025-09-02 18:24 - 18:54: Personal - Routines2025-09-02 17:25 - 18:24: Unpaid work - Cook2025-09-02 15:09 - 17:25: A+ - Childcare2025-09-02 14:49 - 15:09: Discretionary - Productive - Coding2025-09-02 13:49 - 14:49: Discretionary - Productive - Emacs2025-09-02 13:39 - 13:49: Discretionary - Productive - Gardening2025-09-02 13:39 - 13:39: Unpaid work - Clean the kitchen2025-09-02 13:36 - 13:39: Discretionary - Productive - Emacs2025-09-02 13:30 - 13:36: Personal - Routines2025-09-02 12:47 - 13:30: Unpaid work - Errands2025-09-02 12:32 - 12:47: Personal - Routines2025-09-02 12:19 - 12:32: Discretionary - Productive - Gardening2025-09-02 12:08 - 12:19: Personal - Routines2025-09-02 11:58 - 12:08: Unpaid work - Clean the kitchen2025-09-02 11:31 - 11:58: A+ - Childcare2025-09-02 10:19 - 11:31: Business - Earn - Consulting - E1 - General2025-09-02 10:09 - 10:19: A+ - Childcare2025-09-02 09:11 - 10:09: Business - Earn - Consulting - E1 - General2025-09-02 09:04 - 09:11: Business - Earn - Consulting - E1 - General2025-09-02 08:50 - 09:04: Personal - Routines2025-09-02 07:15 - 08:50: A+ - Childcare2025-09-02 07:00 - 07:15: Personal - Routines2025-09-02 00:09 - 07:00: Sleep2025-09-02 00:04 - 00:09: Personal - Routines2025-09-01 23:38 - 00:04: Discretionary - Play - Stardew Valley2025-09-03 23:51 - 06:51: Sleep2025-09-03 22:26 - 23:51: Discretionary - Productive - Drawing2025-09-03 22:06 - 22:26: Personal - Routines2025-09-03 20:19 - 22:06: A+ - Childcare2025-09-03 19:49 - 20:19: Personal - Routines2025-09-03 19:01 - 19:49: Personal - Routines2025-09-03 18:02 - 19:01: Discretionary - Productive - Bike Brigade2025-09-03 15:18 - 18:02: A+ - Childcare2025-09-03 14:52 - 15:18: Discretionary - Productive - Music2025-09-03 14:45 - 14:52: Personal - Routines2025-09-03 13:21 - 14:45: Business - Build - Paperwork2025-09-03 13:04 - 13:21: Discretionary - Family2025-09-03 12:22 - 13:04: Personal - Routines2025-09-03 12:21 - 12:22: Unpaid work - Clean the kitchen2025-09-03 11:31 - 12:21: A+ - Childcare2025-09-03 11:25 - 11:31: Personal - Routines2025-09-03 10:24 - 11:25: Business - Earn - Consulting - E1 - General2025-09-03 10:11 - 10:24: A+ - Childcare2025-09-03 08:53 - 10:11: Business - Earn - Consulting - E1 - General2025-09-03 07:23 - 08:53: A+ - Childcare2025-09-03 07:00 - 07:23: Personal - Routines2025-09-03 00:15 - 07:00: Sleep2025-09-03 00:12 - 00:15: Personal - Routines2025-09-02 22:42 - 00:12: Discretionary - Play - Stardew Valley2025-09-04 23:15 - 00:30: Discretionary - Play - Stardew Valley2025-09-04 22:11 - 23:15: Discretionary - Productive - Drawing2025-09-04 22:10 - 22:11: Personal - Routines2025-09-04 19:16 - 22:10: A+ - Childcare2025-09-04 18:46 - 19:16: Personal - Routines2025-09-04 18:27 - 18:46: Unpaid work - Clean the kitchen2025-09-04 17:52 - 18:27: Personal - Routines2025-09-04 15:17 - 17:52: A+ - Childcare2025-09-04 14:58 - 15:17: Personal - Routines2025-09-04 14:28 - 14:58: Personal - Routines2025-09-04 13:19 - 14:28: A+ - Childcare2025-09-04 13:19 - 13:19: Discretionary - Family2025-09-04 13:01 - 13:19: Discretionary - Productive - Music2025-09-04 12:26 - 13:01: Unpaid work - Tidy up2025-09-04 11:31 - 12:26: A+ - Childcare2025-09-04 10:33 - 11:31: Discretionary - Productive - Coding2025-09-04 09:57 - 10:33: Discretionary - Productive - Writing2025-09-04 09:45 - 09:57: Discretionary - Productive - Coding2025-09-04 09:22 - 09:45: Discretionary - Productive - Emacs2025-09-04 09:21 - 09:22: Discretionary - Productive - Emacs2025-09-04 08:52 - 09:21: Discretionary - Productive - Bike Brigade2025-09-04 06:51 - 08:52: Personal - Routines2025-09-03 23:51 - 06:51: Sleep2025-09-05 23:53 - 07:02: Sleep2025-09-05 23:34 - 23:53: Discretionary - Productive - Writing2025-09-05 23:14 - 23:34: Discretionary - Productive - Drawing2025-09-05 22:34 - 23:14: Discretionary - Productive - Drawing2025-09-05 22:14 - 22:34: Personal - Routines2025-09-05 20:26 - 22:14: A+ - Childcare2025-09-05 20:06 - 20:26: Personal - Routines2025-09-05 15:15 - 20:06: A+ - Childcare2025-09-05 15:10 - 15:15: Personal - Routines2025-09-05 14:40 - 15:10: Discretionary - Productive - Writing2025-09-05 14:23 - 14:40: Discretionary - Productive - Coding2025-09-05 14:02 - 14:23: Discretionary - Productive - Writing2025-09-05 12:41 - 14:02: Business - Earn - Consulting - E1 - General2025-09-05 12:41 - 12:41: Discretionary - Productive - Coding2025-09-05 12:33 - 12:41: Unpaid work - Clean the kitchen2025-09-05 12:18 - 12:33: A+ - Childcare2025-09-05 12:07 - 12:18: Unpaid work - Clean the kitchen2025-09-05 11:44 - 12:07: A+ - Childcare2025-09-05 11:14 - 11:44: Discretionary - Productive - Writing2025-09-05 10:53 - 11:14: Discretionary - Productive - Emacs2025-09-05 10:50 - 10:53: Discretionary - Productive - Writing2025-09-05 08:58 - 10:50: Discretionary - Productive - Writing2025-09-05 08:49 - 08:58: Discretionary - Productive - Gardening2025-09-05 07:49 - 08:49: A+ - Childcare2025-09-05 07:00 - 07:49: Personal - Routines2025-09-05 00:30 - 07:00: Sleep2025-09-04 23:15 - 00:30: Discretionary - Play - Stardew Valley2025-09-06 22:24 - 07:00: Sleep2025-09-06 21:55 - 22:24: Discretionary - Productive - Drawing2025-09-06 21:30 - 21:55: Personal - Routines2025-09-06 20:15 - 21:30: A+ - Childcare2025-09-06 20:05 - 20:15: Discretionary - Productive - Drawing2025-09-06 19:31 - 20:05: Unpaid work - Laundry2025-09-06 18:45 - 19:31: Personal - Routines2025-09-06 18:37 - 18:45: Discretionary - Productive - Gardening2025-09-06 18:15 - 18:37: Discretionary - Productive - Bike Brigade2025-09-06 17:33 - 18:15: Discretionary - Productive - Bike Brigade2025-09-06 17:28 - 17:33: Unpaid work - Cook2025-09-06 17:18 - 17:28: Discretionary - Productive - Bike Brigade2025-09-06 17:00 - 17:18: Discretionary - Productive - Bike Brigade2025-09-06 16:50 - 17:00: Personal - Routines2025-09-06 09:30 - 16:50: A+ - Childcare2025-09-06 09:10 - 09:30: Unpaid work - Laundry2025-09-06 09:09 - 09:10: Unpaid work - Clean the kitchen2025-09-06 08:42 - 09:09: Discretionary - Productive - Music2025-09-06 07:12 - 08:42: A+ - Childcare2025-09-06 07:02 - 07:12: Personal - Routines2025-09-05 23:53 - 07:02: Sleep2025-09-07 22:09 - 06:50: Sleep2025-09-07 21:46 - 22:09: Personal - Routines2025-09-07 20:20 - 21:46: A+ - Childcare2025-09-07 20:14 - 20:20: A+ - Childcare2025-09-07 20:08 - 20:14: Personal - Routines2025-09-07 20:05 - 20:08: Discretionary - Productive - Emacs2025-09-07 19:36 - 20:05: Discretionary - Productive - Writing2025-09-07 18:37 - 19:36: Personal - Routines2025-09-07 18:06 - 18:37: Discretionary - Productive - Music2025-09-07 17:49 - 18:06: Unpaid work - Clean the kitchen2025-09-07 17:21 - 17:49: Personal - Routines2025-09-07 16:22 - 17:21: A+ - Childcare2025-09-07 15:04 - 16:22: Discretionary - Productive - Drawing2025-09-07 09:57 - 15:04: A+ - Childcare2025-09-07 09:54 - 09:57: Personal - Routines2025-09-07 09:44 - 09:54: Unpaid work - Clean the kitchen2025-09-07 09:17 - 09:44: Discretionary - Productive - Gardening2025-09-07 07:17 - 09:17: A+ - Childcare2025-09-07 07:00 - 07:17: Personal - Routines2025-09-06 22:24 - 07:00: Sleep2025-09-08 22:21 - 07:01: Sleep2025-09-08 22:21 - 22:21: Sleep2025-09-08 22:06 - 22:21: Personal - Routines2025-09-08 20:21 - 22:06: A+ - Childcare2025-09-08 19:23 - 20:21: Personal - Routines2025-09-08 19:21 - 19:23: A+ - Childcare2025-09-08 19:00 - 19:21: Unpaid work - Clean the kitchen2025-09-08 15:07 - 19:00: A+ - Childcare2025-09-08 14:37 - 15:07: Discretionary - Productive - Gardening2025-09-08 12:30 - 14:37: Discretionary - Productive - Writing2025-09-08 12:15 - 12:30: Discretionary - Productive - Drawing2025-09-08 11:53 - 12:15: Unpaid work - Clean the kitchen2025-09-08 11:31 - 11:53: A+ - Childcare2025-09-08 11:01 - 11:31: Discretionary - Productive - Writing2025-09-08 08:55 - 11:01: Discretionary - Productive - Emacs2025-09-08 06:50 - 08:55: Personal - Routines2025-09-07 22:09 - 06:50: Sleep2025-09-09 23:25 - 06:53: Sleep2025-09-09 23:25 - 23:25: Sleep2025-09-09 23:12 - 23:25: Personal - Routines2025-09-09 22:42 - 23:12: Sleep2025-09-09 20:40 - 22:42: A+ - Childcare2025-09-09 20:10 - 20:40: Personal - Routines2025-09-09 19:10 - 20:10: Discretionary - Family2025-09-09 19:00 - 19:10: Personal - Routines2025-09-09 18:15 - 19:00: Personal - Routines2025-09-09 17:53 - 18:15: Unpaid work - Cook2025-09-09 14:35 - 17:53: A+ - Childcare2025-09-09 14:15 - 14:35: Discretionary - Productive - Emacs2025-09-09 14:14 - 14:15: Unpaid work - Tidy up2025-09-09 14:02 - 14:14: Personal - Routines2025-09-09 13:19 - 14:02: Discretionary - Productive - Gardening2025-09-09 12:49 - 13:19: Discretionary - Productive - Music2025-09-09 12:29 - 12:49: Unpaid work - Errands2025-09-09 12:19 - 12:29: Personal - Routines2025-09-09 11:51 - 12:19: Unpaid work - Clean the kitchen2025-09-09 11:30 - 11:51: A+ - Childcare2025-09-09 08:58 - 11:30: Business - Earn - Consulting - E1 - General2025-09-09 07:29 - 08:58: A+ - Childcare2025-09-09 07:09 - 07:29: Sleep2025-09-09 07:01 - 07:09: Personal - Routines2025-09-08 22:21 - 07:01: Sleep2025-09-10 23:32 - 07:00: Sleep2025-09-10 22:22 - 23:32: Discretionary - Productive - Drawing2025-09-10 22:06 - 22:22: Discretionary - Productive - Writing2025-09-10 22:01 - 22:06: Personal - Routines2025-09-10 20:40 - 22:01: A+ - Childcare2025-09-10 20:10 - 20:40: Personal - Routines2025-09-10 15:00 - 20:10: A+ - Childcare2025-09-10 12:00 - 15:00: Discretionary - Productive - Emacs2025-09-10 08:50 - 12:00: Discretionary - Productive - Gardening2025-09-10 07:20 - 08:50: A+ - Childcare2025-09-10 06:53 - 07:20: Personal - Routines2025-09-09 23:25 - 06:53: Sleep2025-09-11 22:35 - 07:00: Sleep2025-09-11 22:05 - 22:35: Discretionary - Productive - Writing2025-09-11 21:51 - 22:05: Personal - Routines2025-09-11 19:56 - 21:51: A+ - Childcare2025-09-11 19:26 - 19:56: Personal - Routines2025-09-11 15:25 - 19:26: A+ - Childcare2025-09-11 15:07 - 15:25: A+ - Childcare2025-09-11 14:42 - 15:07: Discretionary - Productive - Writing2025-09-11 13:27 - 14:42: Discretionary - Productive - Writing2025-09-11 12:31 - 13:27: Discretionary - Productive - Emacs2025-09-11 12:31 - 12:31: Discretionary - Productive - Emacs2025-09-11 12:31 - 12:31: Discretionary - Productive - Emacs2025-09-11 12:11 - 12:31: A+ - Childcare2025-09-11 12:01 - 12:11: Unpaid work - Clean the kitchen2025-09-11 11:34 - 12:01: A+ - Childcare2025-09-11 11:04 - 11:34: Discretionary - Productive - Emacs2025-09-11 09:48 - 11:04: Discretionary - Productive - Gardening2025-09-11 09:27 - 09:48: Discretionary - Productive - Emacs2025-09-11 09:17 - 09:27: Discretionary - Productive - Emacs2025-09-11 08:53 - 09:17: Discretionary - Productive - Bike Brigade2025-09-11 07:48 - 08:53: A+ - Childcare2025-09-11 07:00 - 07:48: Personal - Routines2025-09-10 23:32 - 07:00: Sleep2025-09-12 22:47 - 00:03: Discretionary - Productive - Drawing2025-09-12 22:31 - 22:47: Personal - Routines2025-09-12 21:39 - 22:31: A+ - Childcare2025-09-12 20:42 - 21:39: Discretionary - Productive - Coding2025-09-12 20:29 - 20:42: Discretionary - Productive - Bike Brigade2025-09-12 18:00 - 20:29: Personal - Routines2025-09-12 16:33 - 18:00: A+ - Childcare2025-09-12 15:33 - 16:33: Discretionary - Productive - Writing2025-09-12 15:23 - 15:33: Unpaid work - Tidy up2025-09-12 14:56 - 15:23: Discretionary - Productive - Drawing2025-09-12 14:56 - 14:56: Personal - Plan2025-09-12 14:55 - 14:56: Discretionary - Productive - Emacs2025-09-12 12:34 - 14:55: Business - Earn - Consulting - E1 - General2025-09-12 11:49 - 12:34: A+ - Childcare2025-09-12 11:39 - 11:49: Personal - Routines2025-09-12 10:42 - 11:39: Discretionary - Productive - Writing2025-09-12 10:16 - 10:42: Discretionary - Productive - Music2025-09-12 10:10 - 10:16: A+ - Childcare2025-09-12 10:00 - 10:10: Discretionary - Productive - Music2025-09-12 09:45 - 10:00: Unpaid work - Tidy up2025-09-12 08:52 - 09:45: Discretionary - Productive - Gardening2025-09-12 07:30 - 08:52: A+ - Childcare2025-09-12 07:00 - 07:30: Personal - Routines2025-09-11 22:35 - 07:00: Sleep2025-09-13 23:39 - 07:00: Sleep2025-09-13 22:56 - 23:39: Discretionary - Productive - Drawing2025-09-13 22:46 - 22:56: Personal - Routines2025-09-13 21:16 - 22:46: A+ - Childcare2025-09-13 20:58 - 21:16: Discretionary - Productive - Drawing2025-09-13 20:25 - 20:58: Discretionary - Play - Stardew Valley2025-09-13 19:55 - 20:25: A+ - Childcare2025-09-13 19:32 - 19:55: Personal - Routines2025-09-13 19:24 - 19:32: A+ - Childcare2025-09-13 18:49 - 19:24: Discretionary - Productive - Bike Brigade2025-09-13 18:30 - 18:49: A+ - Childcare2025-09-13 18:25 - 18:30: Discretionary - Productive - Bike Brigade2025-09-13 18:00 - 18:25: Personal - Routines2025-09-13 17:44 - 18:00: Unpaid work - Clean the kitchen2025-09-13 16:32 - 17:44: Personal - Routines2025-09-13 15:10 - 16:32: Sleep2025-09-13 13:03 - 15:10: A+ - Childcare2025-09-13 12:43 - 13:03: Discretionary - Productive - Music2025-09-13 12:15 - 12:43: Unpaid work - Clean the kitchen2025-09-13 11:45 - 12:15: Personal - Routines2025-09-13 11:27 - 11:45: Discretionary - Productive - Emacs2025-09-13 11:22 - 11:27: A+ - Childcare2025-09-13 11:19 - 11:22: Personal - Routines2025-09-13 10:17 - 11:19: Discretionary - Productive - Bike Brigade2025-09-13 10:02 - 10:17: Discretionary - Productive - Bike Brigade2025-09-13 07:00 - 10:02: Personal - Routines2025-09-13 00:03 - 07:00: Sleep2025-09-12 22:47 - 00:03: Discretionary - Productive - Drawing2025-09-14 23:01 - 07:00: Sleep2025-09-14 22:55 - 23:01: Personal - Routines2025-09-14 22:22 - 22:55: Discretionary - Productive - Nonfiction2025-09-14 22:16 - 22:22: Personal - Routines2025-09-14 19:37 - 22:16: A+ - Childcare2025-09-14 19:07 - 19:37: Personal - Routines2025-09-14 18:21 - 19:07: A+ - Childcare2025-09-14 18:05 - 18:21: Unpaid work - Clean the kitchen2025-09-14 17:45 - 18:05: Personal - Routines2025-09-14 17:21 - 17:45: Unpaid work - Cook2025-09-14 16:39 - 17:21: Discretionary - Productive - Writing2025-09-14 16:19 - 16:39: Discretionary - Productive - Writing2025-09-14 16:15 - 16:19: Unpaid work - Tidy up2025-09-14 14:22 - 16:15: A+ - Childcare2025-09-14 12:22 - 14:22: Discretionary - Productive - Drawing2025-09-14 10:36 - 12:22: A+ - Childcare2025-09-14 09:29 - 10:36: Discretionary - Productive - Music2025-09-14 09:04 - 09:29: Unpaid work - Clean the kitchen2025-09-14 08:34 - 09:04: A+ - Childcare2025-09-14 07:34 - 08:34: Unpaid work - Cook2025-09-14 07:00 - 07:34: Personal - Routines2025-09-13 23:39 - 07:00: Sleep2025-09-15 23:53 - 07:00: Sleep2025-09-15 22:34 - 23:53: Discretionary - Productive - Drawing2025-09-15 22:15 - 22:34: Personal - Routines2025-09-15 21:46 - 22:15: A+ - Childcare2025-09-15 21:46 - 21:46: Sleep2025-09-15 19:23 - 21:46: A+ - Childcare2025-09-15 19:09 - 19:23: Unpaid work - Laundry2025-09-15 18:49 - 19:09: Unpaid work - Clean the kitchen2025-09-15 14:58 - 18:49: A+ - Childcare2025-09-15 13:58 - 14:58: Discretionary - Productive - Gardening2025-09-15 13:53 - 13:58: Personal - Routines2025-09-15 12:35 - 13:53: Business - Earn - Consulting - E1 - General2025-09-15 11:40 - 12:35: A+ - Childcare2025-09-15 11:07 - 11:40: Business - Build - Paperwork2025-09-15 10:59 - 11:07: Discretionary - Productive - Emacs2025-09-15 08:59 - 10:59: Discretionary - Productive - Emacs2025-09-15 08:55 - 08:59: Discretionary - Productive - Emacs2025-09-15 07:00 - 08:55: Personal - Routines2025-09-14 23:01 - 07:00: Sleep2025-09-16 22:45 - 00:15: Discretionary - Play - Read - Fiction2025-09-16 22:27 - 22:45: Personal - Routines2025-09-16 20:50 - 22:27: A+ - Childcare2025-09-16 20:20 - 20:50: Personal - Routines2025-09-16 19:45 - 20:20: A+ - Childcare2025-09-16 18:45 - 19:45: Personal - Routines2025-09-16 18:30 - 18:45: Discretionary - Productive - Gardening2025-09-16 18:00 - 18:30: Unpaid work - Clean the kitchen2025-09-16 17:52 - 18:00: A+ - Childcare2025-09-16 17:32 - 17:52: Personal - Routines2025-09-16 17:02 - 17:32: Discretionary - Productive - Emacs2025-09-16 15:46 - 17:02: A+ - Childcare2025-09-16 13:22 - 15:46: Discretionary - Productive - Drawing2025-09-16 13:00 - 13:22: Discretionary - Productive - Nonfiction2025-09-16 12:30 - 13:00: Unpaid work - Clean the kitchen2025-09-16 11:33 - 12:30: A+ - Childcare2025-09-16 08:57 - 11:33: Business - Earn - Consulting - E1 - General2025-09-16 07:57 - 08:57: A+ - Childcare2025-09-16 07:00 - 07:57: Personal - Routines2025-09-15 23:53 - 07:00: Sleep2025-09-17 22:22 - 07:00: Sleep2025-09-17 22:18 - 22:22: Personal - Routines2025-09-17 22:13 - 22:18: Sleep2025-09-17 21:44 - 22:13: Personal - Routines2025-09-17 20:48 - 21:44: A+ - Childcare2025-09-17 20:18 - 20:48: Personal - Routines2025-09-17 20:03 - 20:18: A+ - Childcare2025-09-17 19:58 - 20:03: Personal - Routines2025-09-17 19:27 - 19:58: A+ - Childcare2025-09-17 18:56 - 19:27: Unpaid work - Clean the kitchen2025-09-17 15:46 - 18:56: A+ - Childcare2025-09-17 15:26 - 15:46: A+ - Childcare2025-09-17 15:00 - 15:26: Discretionary - Productive - Writing2025-09-17 14:11 - 15:00: Personal - Routines2025-09-17 12:34 - 14:11: Discretionary - Productive - Writing2025-09-17 12:26 - 12:34: Unpaid work - Clean the kitchen2025-09-17 11:29 - 12:26: A+ - Childcare2025-09-17 10:37 - 11:29: Discretionary - Productive - Coding2025-09-17 09:00 - 10:37: Discretionary - Productive - Writing2025-09-17 07:00 - 09:00: Personal - Routines2025-09-17 00:15 - 07:00: Sleep2025-09-16 22:45 - 00:15: Discretionary - Play - Read - Fiction2025-09-18 23:39 - 00:50: Discretionary - Play - Read - Fiction2025-09-18 23:19 - 23:39: Discretionary - Productive - Drawing2025-09-18 21:49 - 23:19: Discretionary - Productive - Chua paperwork2025-09-18 19:19 - 21:49: A+ - Childcare2025-09-18 18:51 - 19:19: Personal - Routines2025-09-18 18:36 - 18:51: A+ - Childcare2025-09-18 17:28 - 18:36: Discretionary - Productive - Bike Brigade2025-09-18 16:42 - 17:28: Unpaid work - Clean the kitchen2025-09-18 16:02 - 16:42: Personal - Routines2025-09-18 15:52 - 16:02: Discretionary - Productive - Gardening2025-09-18 15:19 - 15:52: Unpaid work - Errands2025-09-18 12:58 - 15:19: Discretionary - Productive - Coding2025-09-18 12:43 - 12:58: Unpaid work - Clean the kitchen2025-09-18 12:15 - 12:43: Personal - Routines2025-09-18 11:32 - 12:15: A+ - Childcare2025-09-18 10:01 - 11:32: Discretionary - Productive - Bike Brigade2025-09-18 09:19 - 10:01: Discretionary - Productive - Writing2025-09-18 08:56 - 09:19: Discretionary - Productive - Chua paperwork2025-09-18 08:56 - 08:56: Discretionary - Productive - Emacs2025-09-18 07:00 - 08:56: Personal - Routines2025-09-17 22:22 - 07:00: Sleep2025-09-19 22:34 - 07:00: Sleep2025-09-19 22:18 - 22:34: Personal - Routines2025-09-19 20:56 - 22:18: A+ - Childcare2025-09-19 20:52 - 20:56: Discretionary - Productive - Music2025-09-19 20:22 - 20:52: Personal - Routines2025-09-19 19:56 - 20:22: Unpaid work - Clean the kitchen2025-09-19 19:26 - 19:56: Personal - Routines2025-09-19 18:54 - 19:26: Discretionary - Productive - Bike Brigade2025-09-19 18:19 - 18:54: Unpaid work - Cook2025-09-19 14:39 - 18:19: A+ - Childcare2025-09-19 14:24 - 14:39: Personal - Routines2025-09-19 12:19 - 14:24: Discretionary - Productive - Emacs2025-09-19 12:01 - 12:19: Unpaid work - Clean the kitchen2025-09-19 11:50 - 12:01: Personal - Routines2025-09-19 11:37 - 11:50: A+ - Childcare2025-09-19 10:24 - 11:37: Discretionary - Productive - Emacs2025-09-19 10:09 - 10:24: A+ - Childcare2025-09-19 08:51 - 10:09: Discretionary - Productive - Emacs2025-09-19 08:47 - 08:51: Discretionary - Productive - Emacs2025-09-19 07:02 - 08:47: Personal - Routines2025-09-19 00:50 - 07:02: Sleep2025-09-18 23:39 - 00:50: Discretionary - Play - Read - Fiction2025-09-20 22:54 - 09:12: Sleep2025-09-20 21:38 - 22:54: Personal - Routines2025-09-20 20:16 - 21:38: A+ - Childcare2025-09-20 19:48 - 20:16: Personal - Routines2025-09-20 19:47 - 19:48: Personal - Routines2025-09-20 19:26 - 19:47: Discretionary - Productive - Emacs2025-09-20 19:13 - 19:26: Discretionary - Productive - Emacs2025-09-20 19:10 - 19:13: Discretionary - Productive - Drawing2025-09-20 18:38 - 19:10: Unpaid work - Clean the kitchen2025-09-20 18:08 - 18:38: Personal - Routines2025-09-20 17:12 - 18:08: Unpaid work - Cook2025-09-20 16:37 - 17:12: Discretionary - Productive - Bike Brigade2025-09-20 16:16 - 16:37: Discretionary - Productive - Bike Brigade2025-09-20 16:12 - 16:16: Discretionary - Productive - Writing2025-09-20 15:56 - 16:12: Discretionary - Productive - Bike Brigade2025-09-20 13:48 - 15:56: Discretionary - Productive - Drawing2025-09-20 13:37 - 13:48: Discretionary - Productive - Music2025-09-20 13:09 - 13:37: Unpaid work - Clean the kitchen2025-09-20 11:21 - 13:09: A+ - Childcare2025-09-20 09:17 - 11:21: Discretionary - Productive - Bike Brigade2025-09-20 08:54 - 09:17: Discretionary - Productive - Drawing2025-09-20 08:41 - 08:54: Discretionary - Productive - Gardening2025-09-20 07:41 - 08:41: A+ - Childcare2025-09-20 07:00 - 07:41: Personal - Routines2025-09-19 22:34 - 07:00: Sleep2025-09-21 23:10 - 07:00: Sleep2025-09-21 22:49 - 23:10: Personal - Routines2025-09-21 20:04 - 22:49: A+ - Childcare2025-09-21 19:34 - 20:04: Personal - Routines2025-09-21 19:01 - 19:34: Unpaid work - Clean the kitchen2025-09-21 16:16 - 19:01: A+ - Childcare2025-09-21 14:19 - 16:16: Discretionary - Productive - Writing2025-09-21 13:57 - 14:19: Personal - Routines2025-09-21 13:26 - 13:57: Discretionary - Productive - Writing2025-09-21 12:48 - 13:26: Discretionary - Productive - Emacs2025-09-21 12:39 - 12:48: Discretionary - Productive - Coding2025-09-21 12:11 - 12:39: Discretionary - Productive - Emacs2025-09-21 11:42 - 12:11: A+ - Childcare2025-09-21 10:33 - 11:42: Business - Earn - Consulting - E1 - General2025-09-21 10:24 - 10:33: Unpaid work - Clean the kitchen2025-09-21 10:12 - 10:24: Discretionary - Productive - Gardening2025-09-21 09:12 - 10:12: Personal - Routines2025-09-20 22:54 - 09:12: Sleep2025-09-22 22:27 - 07:00: Sleep2025-09-22 22:21 - 22:27: Personal - Routines2025-09-22 20:21 - 22:21: A+ - Childcare2025-09-22 19:37 - 20:21: Personal - Routines2025-09-22 18:53 - 19:37: A+ - Childcare2025-09-22 18:33 - 18:53: Unpaid work - Clean the kitchen2025-09-22 18:18 - 18:33: Unpaid work - Tidy up2025-09-22 17:40 - 18:18: Unpaid work - Laundry2025-09-22 15:10 - 17:40: A+ - Childcare2025-09-22 12:46 - 15:10: Discretionary - Productive - Emacs2025-09-22 11:31 - 12:46: A+ - Childcare2025-09-22 08:46 - 11:31: Discretionary - Productive - Emacs2025-09-22 07:46 - 08:46: A+ - Childcare2025-09-22 07:00 - 07:46: Personal - Routines2025-09-21 23:10 - 07:00: Sleep2025-09-23 22:03 - 00:27: Discretionary - Productive - Drawing2025-09-23 19:41 - 22:03: A+ - Childcare2025-09-23 19:11 - 19:41: Personal - Routines2025-09-23 18:51 - 19:11: A+ - Childcare2025-09-23 18:30 - 18:51: Personal - Routines2025-09-23 15:26 - 18:30: A+ - Childcare2025-09-23 15:16 - 15:26: A+ - Childcare2025-09-23 14:59 - 15:16: Business - Build - Paperwork2025-09-23 12:42 - 14:59: Discretionary - Productive - Writing2025-09-23 11:58 - 12:42: Discretionary - Productive - Writing2025-09-23 11:31 - 11:58: A+ - Childcare2025-09-23 11:25 - 11:31: Discretionary - Productive - Writing2025-09-23 10:03 - 11:25: Personal - Walk - Other2025-09-23 09:56 - 10:03: Personal - Routines2025-09-23 09:04 - 09:56: Business - Earn - Consulting - E1 - General2025-09-23 08:04 - 09:04: A+ - Childcare2025-09-23 07:00 - 08:04: Personal - Routines2025-09-22 22:27 - 07:00: Sleep2025-09-24 23:39 - 07:00: Sleep2025-09-24 22:39 - 23:39: Discretionary - Productive - Drawing2025-09-24 21:39 - 22:39: A+ - Childcare2025-09-24 20:39 - 21:39: A+ - Childcare2025-09-24 20:11 - 20:39: Personal - Routines2025-09-24 18:29 - 20:11: A+ - Childcare2025-09-24 18:15 - 18:29: Unpaid work - Clean the kitchen2025-09-24 18:15 - 18:15: Personal - Routines2025-09-24 15:29 - 18:15: A+ - Childcare2025-09-24 14:17 - 15:29: Discretionary - Productive - Emacs2025-09-24 12:09 - 14:17: Business - Build - Paperwork2025-09-24 12:09 - 12:09: Discretionary - Productive - Writing2025-09-24 09:30 - 12:09: A+ - Childcare2025-09-24 08:50 - 09:30: Business - Build - Paperwork2025-09-24 07:00 - 08:50: Personal - Routines2025-09-24 00:27 - 07:00: Sleep2025-09-23 22:03 - 00:27: Discretionary - Productive - Drawing2025-09-25 22:37 - 07:00: Sleep2025-09-25 22:32 - 22:37: A+ - Childcare2025-09-25 22:24 - 22:32: Personal - Routines2025-09-25 20:59 - 22:24: A+ - Childcare2025-09-25 20:44 - 20:59: Discretionary - Productive - Emacs2025-09-25 20:21 - 20:44: Unpaid work - Clean the kitchen2025-09-25 19:59 - 20:21: Personal - Routines2025-09-25 19:17 - 19:59: A+ - Childcare2025-09-25 18:57 - 19:17: Personal - Routines2025-09-25 18:20 - 18:57: Discretionary - Productive - Emacs2025-09-25 15:10 - 18:20: A+ - Childcare2025-09-25 14:23 - 15:10: Business - Build - Paperwork2025-09-25 14:13 - 14:23: Discretionary - Productive - Bike Brigade2025-09-25 12:14 - 14:13: Unpaid work - Clean the kitchen2025-09-25 11:30 - 12:14: A+ - Childcare2025-09-25 09:38 - 11:30: Business - Build - Paperwork2025-09-25 09:38 - 09:38: Discretionary - Productive - Chua paperwork2025-09-25 09:09 - 09:38: Business - Earn - Consulting - E1 - General2025-09-25 07:30 - 09:09: A+ - Childcare2025-09-25 07:00 - 07:30: Personal - Routines2025-09-24 23:39 - 07:00: Sleep2025-09-26 23:33 - 07:00: Sleep2025-09-26 23:33 - 23:33: Sleep2025-09-26 23:03 - 23:33: Discretionary - Productive - Drawing2025-09-26 22:45 - 23:03: Personal - Routines2025-09-26 21:51 - 22:45: A+ - Childcare2025-09-26 21:36 - 21:51: Discretionary - Productive - Emacs2025-09-26 21:00 - 21:36: Discretionary - Productive - Bike Brigade2025-09-26 20:59 - 21:00: Discretionary - Productive - Bike Brigade2025-09-26 20:44 - 20:59: Discretionary - Productive - Emacs2025-09-26 20:37 - 20:44: Discretionary - Productive - Bike Brigade2025-09-26 20:32 - 20:37: Discretionary - Productive - Emacs2025-09-26 20:24 - 20:32: Personal - Routines2025-09-26 18:51 - 20:24: A+ - Childcare2025-09-26 18:46 - 18:51: Discretionary - Productive - Emacs2025-09-26 17:50 - 18:46: Personal - Routines2025-09-26 17:06 - 17:50: Personal - Routines2025-09-26 16:45 - 17:06: Unpaid work - Laundry2025-09-26 16:24 - 16:45: Discretionary - Productive - Music2025-09-26 16:23 - 16:24: Personal - Routines2025-09-26 16:19 - 16:23: Discretionary - Productive - Music2025-09-26 11:42 - 16:19: A+ - Childcare2025-09-26 11:27 - 11:42: Personal - Routines2025-09-26 10:22 - 11:27: Unpaid work - Errands2025-09-26 10:02 - 10:22: Unpaid work - Tidy up2025-09-26 09:31 - 10:02: Unpaid work - Laundry2025-09-26 08:33 - 09:31: A+ - Childcare2025-09-26 08:25 - 08:33: Discretionary - Productive - Coding2025-09-26 07:00 - 08:25: Personal - Routines2025-09-25 22:37 - 07:00: Sleep2025-09-27 23:09 - 07:00: Sleep2025-09-27 22:18 - 23:09: Personal - Routines2025-09-27 20:31 - 22:18: A+ - Childcare2025-09-27 20:24 - 20:31: Personal - Plan2025-09-27 20:07 - 20:24: Discretionary - Productive - Bike Brigade2025-09-27 18:25 - 20:07: Personal - Routines2025-09-27 18:25 - 18:25: Unpaid work - Laundry2025-09-27 18:25 - 18:25: Personal - Routines2025-09-27 18:13 - 18:25: Unpaid work - Clean the kitchen2025-09-27 18:10 - 18:13: Unpaid work - Clean the kitchen2025-09-27 17:43 - 18:10: Personal - Routines2025-09-27 17:26 - 17:43: Unpaid work - Cook2025-09-27 15:55 - 17:26: A+ - Childcare2025-09-27 13:57 - 15:55: Unpaid work - Errands2025-09-27 13:07 - 13:57: A+ - Childcare2025-09-27 12:57 - 13:07: Discretionary - Productive - Tracking2025-09-27 07:36 - 12:57: Unpaid work - Cook2025-09-27 07:00 - 07:36: Personal - Routines2025-09-26 23:33 - 07:00: Sleep2025-09-28 23:09 - 01:10: Discretionary - Play - Read - Fiction2025-09-28 22:54 - 23:09: Personal - Routines2025-09-28 21:54 - 22:54: A+ - Childcare2025-09-28 20:54 - 21:54: Discretionary - Play - Read - Fiction2025-09-28 20:19 - 20:54: Personal - Routines2025-09-28 19:59 - 20:19: Unpaid work - Clean the kitchen2025-09-28 18:56 - 19:59: Personal - Routines2025-09-28 17:47 - 18:56: Sleep2025-09-28 17:08 - 17:47: Discretionary - Productive - Drawing2025-09-28 14:03 - 17:08: A+ - Childcare2025-09-28 13:54 - 14:03: Discretionary - Productive - Coding2025-09-28 13:34 - 13:54: Unpaid work - Clean the kitchen2025-09-28 13:16 - 13:34: Personal - Routines2025-09-28 12:46 - 13:16: Unpaid work - Cook2025-09-28 12:15 - 12:46: Discretionary - Productive - Emacs2025-09-28 09:34 - 12:15: Discretionary - Productive - Music2025-09-28 08:34 - 09:34: Personal - Routines2025-09-28 07:34 - 08:34: A+ - Childcare2025-09-28 07:00 - 07:34: Personal - Routines2025-09-27 23:09 - 07:00: Sleep2025-09-29 23:29 - 00:01: Sleep2025-09-29 20:29 - 23:29: A+ - Childcare2025-09-29 19:54 - 20:29: Personal - Routines2025-09-29 19:47 - 19:54: A+ - Childcare2025-09-29 19:32 - 19:47: Unpaid work - Clean the kitchen2025-09-29 19:17 - 19:32: Personal - Routines2025-09-29 14:41 - 19:17: A+ - Childcare2025-09-29 14:31 - 14:41: Personal - Routines2025-09-29 14:01 - 14:31: Unpaid work - Laundry2025-09-29 13:32 - 14:01: Personal - Routines2025-09-29 13:25 - 13:32: Business - Build - Paperwork2025-09-29 12:38 - 13:25: Business - Earn - Consulting - E1 - General2025-09-29 12:12 - 12:38: Personal - Routines2025-09-29 11:18 - 12:12: A+ - Childcare2025-09-29 10:58 - 11:18: Discretionary - Productive - Music2025-09-29 10:44 - 10:58: Business - Build - Paperwork2025-09-29 08:53 - 10:44: Discretionary - Productive - Emacs2025-09-29 07:00 - 08:53: Personal - Routines2025-09-29 01:10 - 07:00: Sleep2025-09-28 23:09 - 01:10: Discretionary - Play - Read - Fiction2025-09-30 23:39 - 07:00: Sleep2025-09-30 22:21 - 23:39: Personal - Routines2025-09-30 20:05 - 22:21: A+ - Childcare2025-09-30 19:35 - 20:05: Personal - Routines2025-09-30 19:25 - 19:35: Unpaid work - Tidy up2025-09-30 19:05 - 19:25: Unpaid work - Clean the kitchen2025-09-30 18:15 - 19:05: Personal - Routines2025-09-30 15:10 - 18:15: A+ - Childcare2025-09-30 12:43 - 15:10: Discretionary - Productive - Writing2025-09-30 12:32 - 12:43: Discretionary - Productive - Writing2025-09-30 11:49 - 12:32: A+ - Childcare2025-09-30 11:34 - 11:49: A+ - Childcare2025-09-30 11:05 - 11:34: A+ - Childcare2025-09-30 11:04 - 11:05: A+ - Childcare2025-09-30 10:34 - 11:04: Discretionary - Productive - Writing2025-09-30 10:09 - 10:34: A+ - Childcare2025-09-30 09:54 - 10:09: Discretionary - Productive - Writing2025-09-30 09:36 - 09:54: Discretionary - Productive - Emacs2025-09-30 09:27 - 09:36: Business - Build - Paperwork2025-09-30 09:25 - 09:27: Personal - Routines2025-09-30 08:52 - 09:25: Business - Earn - Consulting - E1 - General2025-09-30 07:52 - 08:52: A+ - Childcare2025-09-30 07:01 - 07:52: Personal - Routines2025-09-30 00:01 - 07:01: Sleep2025-09-29 23:29 - 00:01: Sleep
View org source for this post

Doodling icons in a grid

| drawing, emacs

Last week, I experimented with practising drawing little icons as a way of expanding my visual vocabulary.

Making a template

Building on Visual vocabulary practice - ABCs, I decided to make a regular grid that I could then automatically split up into individual images. I used Emacs's svg.el to generate the grid. I started with 4 rows of 7 boxes to match the alphabet example, but I realized that using 5 rows of 7 boxes each would let me reuse the grid for a monthly calendar. I numbered the boxes to make it easier to double-check if the lists line up, but I can write over the numbers for things like dates since the background won't be exported.

icon-grid.png

I used convert icon-grid.svg icon-grid.png to make it from the SVG produced by the following code.

Code for producing the template

(require 'svg)
(defvar my-dot-grid-boxes-params
  '(:num-rows 5
    :num-cols 7
    :dot-size 3
    :line-width 3
    :dot-spacing 60
    :grid-color "#a6d2ff"
    :row-size 6
    :col-size 6
    :text-size 50
    :margin-top 2))
(cl-defun my-dot-grid-boxes-template (&key (num-rows 5)
                                           (num-cols 7)
                                           (dot-size 3)
                                           (line-width 3)
                                           (dot-spacing 60)
                                           (grid-color "#a6d2ff")
                                           (row-size 6)
                                           (col-size 6)
                                           (text-size 50)
                                           (margin-top 2))
  "Prepare an SVG with a dot grid within a table with solid gridlines.
Each dot is a solid circle of DOT-SIZE filled with GRID-COLOR spaced DOT-SPACING apart.
The gridlines are also GRID-COLOR. They should divide the image into ROWS and COLUMNS, which are ROW-SIZE * DOT-SPACING and COL-SIZE * DOT-SPACING apart.
The table has a top margin with the dot grid, and this is MARGIN-TOP * DOT-SPACING tall.
All dots are centered on their x, y coordinates.
The rest of the image's background is white."
  (let* ((width (* num-cols col-size dot-spacing))
         (height (* dot-spacing (+ margin-top (* num-rows row-size))))
         (margin-top-height (* margin-top dot-spacing))
         (svg (svg-create width height)))
    (dotimes (row (+ (* num-rows row-size) margin-top))
      (dotimes (col (1+ (* num-cols col-size)))
        (let ((x (* col dot-spacing))
              (y (* row dot-spacing)))
          (svg-circle svg x y dot-size
                      :fill-color grid-color
                      :stroke-width 0))))
    (when (> text-size 0)
      (dotimes (i (* num-rows num-cols))
        (let ((x (* (% i num-cols) col-size dot-spacing))
              (y (+ margin-top-height (* (/ i num-cols) row-size dot-spacing))))
          (svg-text svg
                    (number-to-string (1+ i))
                    :x x :y (+ y text-size)
                    :fill-color grid-color
                    :font-size text-size
                    :stroke-width 0))))
    (dotimes (col (1+ num-cols))
      (let ((x (* col col-size dot-spacing)))
        (svg-line svg x margin-top-height x height
                  :stroke-color grid-color
                  :stroke-width line-width)))
    (dotimes (row (1+ num-rows))
      (let ((y (+ margin-top-height (* row row-size dot-spacing))))
        (svg-line svg 0 y width y
                  :stroke-color grid-color
                  :stroke-width line-width)))
    svg))

With that function defined, I can make a template with:

(with-temp-file "~/Dropbox/sketches/icon-grid.svg"
  (svg-print
   (my-dot-grid-boxes-template)))

I used that template to draw a bunch of little doodles. The Noteful app I use on my iPad makes it easy to import a template and then export my drawings without including the template.

(If this blog post is out of date, you can check the Dot-grid box templates section in my config for my current code.)

I've done this sort of thing before, when I made a font based on my handwriting. That time, I used Python to generate the template with sample characters, and I used Python again to cut the exported image into individual glyphs.

The drawings

Once I imported the template into Noteful, it was easy to draw using fragments of time. 35 boxes are a lot, but each icon was just a few minutes of drawing, and I enjoyed seeing the progress.

Stream of consciousness

Sometimes I drew whatever came to mind:

Text from sketch

Drawing practice 2025-09-24-09

me A+ pizza mom and kid flower witch hat pencil chopsticks rice bowl peach pillow desk fan folding fan pumpkin jack o' lantern ghost taxes broomstick bubbles candy bow bao bowl strawberry tomato cherries cake slice cake

Text from sketch

Drawing practice 2025-09-25-01

mug teacup tempest in a teapot skull poison cauldron tree baseball cap propeller beanie top hat magic magic wand cape playing card hanging towel folded towels soap dispenser bar soap picnic table picnic basket bread croissant donut donut sandwich soup bowl rice and eggs oatmeal

Text from sketch

Drawing practice 2025-09-26-01

clogs slippers slipper tic-tac-toe stockpot skillet crepe pan crepe pancakes cereal sun sailboat crown see saw ice cream cupcake with icing dress and pants rice cooker leap heart heart - anatomical eye headband hairpin bandage glasses glass straw air purifier mask - KN95 pie pie slice pie chart orange lemon

Text from sketch

Drawing practice 2025-09-26-02

trash can garbage can chef's knife paring knife steak knife bread knife butter knife egg egg shells scrambled egg toast bean peas peas hot dog in a bun hot dog octopus avocado taco milk yogurt applesauce chicken drumstick sushi - hand roll lamp present presentation audience applause almond bitter melon oil chopping board partly cloudy rainy cloudy

Learning from books

Other times, I tried systematically going through the doodling books I checked out from the library:

Text from sketch

From "How to Draw Almost Every Day" - Kamo 2025-09-26-05

sake bottle sake cup brush snowflake kite top cat sleeping orange rice cake ornament notebook kimono shopping bag pencil eraser thermometer medicine scarf mittens glove hat boot coat skate snowman shovel washer refrigerator microwave laundry convenience store blimp spatula hot pot bonsai coffee maker

Text from sketch

From "How to Draw Cute Doodles and Illustrations" - Kamo 2025-09-29-05

enjoyment crying happy or asleep making a mistake sleepy yum or cheeky cheerful or excited smiling confusion anger unsettled discomfort front view rear view side view sitting on a chair teacher baby kids (1-3) kids (4-5) walking running jumping raising a hand sitting on the floor swinging singing drawing sunny rain cloudy windy stormy snow moon and stars

Text from sketch

From "How to Draw Cute Doodles and Illustrations" – Kamo 2025-09-30-05

cat cat profile dog dog cat napping cat sitting upright dog dog (fluffy) rabbit monkey mouse cheetah bear raccoon dog fox squirrel lion koala pig elephant sheep giraffe horse bird (front) bird (profile) duck owl swan sparrow nest peacock chicken, chick, egg stork fish whale

Extracting icons from my other sketches

I also extracted the stick figures and cats I'd drawn for different emotions.

Text from sketch

Stick figure feelings 2025-09-30-05

playful content interested proud accepted powerful peaceful trusting optimistic startled confused tired busy amazed stressed stressed excited bored scared mad aggressive frustrated frustrated let down bitter weak weak anxious distant critical humiliated rejected threatened insecure insecure

Text from sketch

Stick figure and feline feelings 2025-09-30-06

lonely vulnerable despair guilty depressed hurt awful disapproving repelled disappointed startled confused bored scared excited tired let down rejected insecure anxious threatened humiliated cheeky interested peaceful successful content aggressive accepted trusting proud vulnerable optimistic lonely frustrated

Splitting up the drawings into individual components

Because I kept all my doodles within the template's boxes, it was easy to split up the images into individual files. First, I needed the text for all the labels. Sometimes I typed this in manually, and sometimes I used Google Cloud Vision to extract the text (editing it a little bit to put it in the right order and fix misrecognized text). Then I used Emacs Lisp to read the labels from the text file, calculate the coordinates, and use ImageMagick to extract that portion of the image into a file. I used filenames based on the label of the individual icon and the ID of the image it came from.

Code for extracting the icons

(cl-defun my-dot-grid-boxes-list (&key (num-rows 5)
                                       (num-cols 7)
                                       (dot-spacing 60)
                                       (row-size 6)
                                       (col-size 6)
                                       (text-bottom 1)
                                       (margin-top 2)
                                       filename
                                       &allow-other-keys)
  "Return a list of boxes."
  (let* ((margin-top-height (* margin-top dot-spacing))
         (max-image-size nil)
         (size (image-size (create-image filename nil nil :scale 1) t))
         (ratio (/ (car size) (* num-cols col-size dot-spacing 1.0)))
         results)
    (message "Expected adjusted height %f actual height %f"
             (* (+ margin-top (* num-rows row-size)) dot-spacing ratio)
             (cdr size))
    (dotimes (i (* num-rows num-cols))
      (let* ((r (/ i num-cols))
             (c (% i num-cols))
             (y (* (+ margin-top-height (* r col-size dot-spacing)) ratio))
             (x (* c row-size dot-spacing ratio))
             (width (* col-size dot-spacing ratio))
             (height (* (- row-size text-bottom) dot-spacing ratio)))
        (setq results (cons
                       `((r . ,r)
                         (c . ,c)
                         (i . ,i)
                         (x . ,(floor x))
                         (y . ,(floor y))
                         (w . ,(floor width))
                         (h . ,(floor height))
                         (x2 . ,(floor (+ x width)))
                         (y2 . ,(floor (+ y height))))
                       results))))
    (nreverse results)))

(defvar my-sketch-icon-directory "~/sync/sketches/icons")
(cl-defun my-dot-grid-boxes-extract (&rest args &key filename labels
                                           (output-dir my-sketch-icon-directory) force &allow-other-keys)
  (let* ((list (apply #'my-dot-grid-boxes-list args))
         (base (file-name-base filename))
         (ext (concat "." (file-name-extension filename)))
         (id
          (if (string-match "^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]" base)
              (match-string 0 base)
            ""))
         results
         args)
    (dolist (icon list)
      (let-alist icon
        (let ((new-filename (expand-file-name
                             (concat (my-make-slug (elt labels .i)) "--"
                                     id
                                     (format "-%d-%d"
                                             .r .c)
                                     ext)
                             output-dir)))
          (push `((term . ,(elt labels .i))
                  (icon . ,(file-name-nondirectory new-filename))
                  (source . ,(file-name-nondirectory filename)))
                results)
          (when (or force (not (file-exists-p new-filename)))
            (setq args
                  (list (expand-file-name filename)
                        "-crop"
                        (format "%dx%d+%d+%d" .w .h .x .y)
                        "+repage"
                        new-filename))
            (message "%s" (concat "convert " (mapconcat #'shell-quote-argument args " ")))
            (apply #'call-process "convert" nil nil nil args)))))
    (nreverse results)))

(defun my-dot-grid-boxes-labels (id)
  (with-temp-buffer
    (insert-file-contents (concat (file-name-sans-extension (my-get-sketch-filename id)) ".txt"))
    (goto-char (point-min))
    (re-search-forward "^ *$")
    (split-string (string-trim (buffer-substring (point) (point-max))) "\n")))

2025-09-30_13-13-52.png
Figure 1: Dired and image-dired in Emacs

I really liked being able to write code to extract and name images all in one go. If you don't want to dive into Emacs Lisp, though, you can slice up a large image into small ones using ImageMagick.

Thinking ahead: if I use a similar process for my daily drawings, I can extract an "on this day" slice like the one I have for blog posts and sketches (blog post about it).

I had worked on a similar visual vocabulary project in 2013, but I had made it as a shared notebook in Evernote. That's gone now, and I can't remember if I backed it up or where I would've saved a backup to. Ah well, no harm in starting again, with files under my control.

Looking up images

Now that I'd broken down the images into labelled components, I wanted to be able to quickly look up icons from a web browser; my own version of The Noun Project. First, I exported the label information into a JSON.

Code for processing a sketch and updating the index

(defun my-sketch-icon-update-index (list)
  (let (data
        (index-file (expand-file-name "index.json" my-sketch-icon-directory)))
    (with-temp-file index-file
      (setq data
            (if (file-exists-p index-file)
                (json-read-file index-file)
              '()))
      (dolist (entry list)
        ;; Remove current entry
        (setq data (seq-remove (lambda (o)
                                 (and (string-match (regexp-quote (alist-get 'source o)) (alist-get 'source entry))
                                      (string= (alist-get 'term o) (alist-get 'term entry))))
                               data))
        ;; Add a new entry
        (push
         `((term . ,(alist-get 'term entry))
           (icon . ,(alist-get 'icon entry))
           (source . ,(alist-get 'source entry)))
         data))
      (insert (json-encode (sort data :key (lambda (o) (alist-get 'term o)) :lessp #'string<))))))

(defun my-dot-grid-boxes-process (id &optional force)
  (interactive
   (list
    (my-complete-sketch-filename "drawing")
    current-prefix-arg))
  (let* ((labels (my-dot-grid-boxes-labels id))
         list)
    (cl-assert (= (% (length labels) 7) 0))
    (cl-assert (> (length labels) 1))
    (setq list
          (my-dot-grid-boxes-extract :output-dir my-sketch-icon-directory
                                     :num-rows (/ (length labels) 7)
                                     :filename (my-get-sketch-filename id)
                                     :labels labels
                                     :force force))
    (my-sketch-icon-update-index list)))

(defun my-dot-grid-boxes-process-all-icons ()
  (interactive)
  (dolist (source (my-sketches "icons")) (my-dot-grid-boxes-process source)))

Then I made a simple interface for looking up icons.

2025-10-01_10-09-32.png
Figure 2: Screencast showing my icon lookup interface

I can filter it by terms, and I can exclude the icons I've copied from illustration books for practice.

I can even use it as a rudimentary visual menu for showing A+ some choices.

Oatmeal, cereal, pancakes

2025-09-30_13-40-06.png

Reflections on doodling

My curves are shaky. I'm mostly learning to ignore that and draw anyway. Good thing redoing them is a matter of a two-finger tap with my left hand, and then I can redraw until it feels mostly right. I try up to three times before I say, fine, let's just go with that.

I often draw with my iPad balanced on my lap, so there's an inherent wobbliness to it. I think this is a reasonable trade-off. Then I can keep drawing cross-legged in the shade at the playground instead of sitting at the table in the sun. The shakiness is still there when I draw on a solid table, though. I have a Paperlike screen protector, which I like more than the slippery feel of the bare iPad screen. That helps a little.

It's possible to cover it up and pretend to confidence that I can't draw with. I could smooth out the shakiness of my curves by switching to Procreate, which has more stylus sensitivity settings than Noteful does. A+ loves the way Procreate converts her curves to arcs. She moves the endpoints around to where she wanted to put them. I'm tempted to do the same, but I see her sometimes get frustrated when she tries to draw without that feature, and I want to show her the possibilities that come with embracing imperfection. It's okay for these sketches to be a little shaky. These are small and quick. They don't have to be polished.

The Internet says to draw faster and with a looser grip, and that lots of practice will build fine motor skills. I'm not sure I'll get that much smoother. I think of my mom and her Parkinson's tremors, and I know that time doesn't necessarily bring improvement. But it's better to keep trying than to shy away from it. Maybe as I relax more into having my own time, working on my own things and moving past getting things done, I'll give myself more time for drawing exercise, like filling pages with just lines and circles.

Reflections on sources

I had fun coming up with words and drawing them. I could start with whatever was in front of me and go from there. I used my phone to look up the occasional reference image, like the heart. Sometimes A+ suggested things to draw. Sometimes she even took over.

The books were handy when I didn't feel like thinking much. I could just reproduce the already-simplified drawings. I often felt like I still wanted to tweak things a bit more to make them feel like my own, though, which was a useful way to figure out more about what I like.

Instead of mimicking other people's sketches, I can mine my sketchnotes and pull out the concepts I tend to think about a lot. If I've drawn them in Noteful, I can even copy them from their original sketches, resize them, and make the lines a consistent thickness. If I've drawn them elsewhere, it's easy enough to redraw.

Other resources

Ellane W's mustache post reminded me that Inktober has just started, so that's another source of ideas. Zsolt's 2021 post on sketchnoting for PKM led me to Quick, Draw!, which has 345 simple drawing prompts I can try. There's also a TU Berlin dataset with 250 drawing prompts. SketchDaily Reference Site could be good for randomness and inspiration, too.

Building a visual library is a great way to learn how to actually draw things. I'm curious about using this 30-minute drawing exercise to start paying attention to a few things, and maybe using the shrimp method if there's something I really want to nail down. Visual mnemonic links might be a way to explore the connections between things as I wander around ideas (even though this video is way more advanced than I am).

Next steps

I think I'll keep drawing these visual vocabulary practice sketches, focusing more on my own ways of drawing. It's fun. I have 324 icons at the moment. I wonder what the collection will be like when I have a thousand terms in it.

On the Emacs side, it might be interesting to quickly add a related doodle to the margin of a blog post, or to look up or copy a personal reference image as I untangle my thoughts in a sketch. I'm tempted to write some Emacs Lisp that searches for these terms in my draft blog posts and adds a little hint whenever it finds a match. Another small piece of code might identify recurring nouns and verbs in recent posts and suggest those if I haven't drawn them yet. Could be fun.

Check out my icon library if you're curious!

View org source for this post

Org Mode: calculating table sums using tag hierarchies

| org, elisp

While collecting posts for Emacs News, I came across this question about adding up Org Mode table data by tag hierarchy, which might be interesting if you want to add things up in different combinations. I haven't needed to do something like that myself, but I got curious about it. It turns out that you can define a tag hierarchy like this:

#+STARTUP: noptag
#+TAGS:
#+TAGS: [ GT1 : tagA tagC tagD ]
#+TAGS: [ GT2 : tagB tagE ]
#+TAGS: [ GT3 : tagB tagC tagD ]

The first two lines remove any other tags you've defined in your config aside from those in org-tag-persistent-alist, but can be omitted if you want to also include other tags you've defined in org-tag-alist. Note that it doesn't have to be a strict tree. Tags can belong to more than one tag group.

EduMerco wanted to know how to use those tag groups to sum up rows in a table. I added a #+NAME header to the table so that I could refer to it with :var source=source later on.

#+NAME: source
| tag  | Q1 | Q2 |
|------+----+----|
| tagA |  9 |    |
| tagB |  4 |  2 |
| tagC |  1 |  4 |
| tagD |    |  5 |
| tagE |    |  6 |
(defun my-sum-tag-groups (source &optional groups)
  "Sum up the rows in SOURCE by GROUPS.
If GROUPS is nil, use `org-tag-groups-alist'."
  (setq groups (or groups org-tag-groups-alist))
  (cons
   (car source)
   (mapcar
    (lambda (tag-group)
      (let ((tags (org--tags-expand-group (list (car tag-group))
                                          groups nil)))
        (cons (car tag-group)
              (seq-map-indexed
               (lambda (colname i)
                 (apply '+
                        (mapcar (lambda (tag)
                                  (let ((val (or (elt (assoc-default tag source) i) "0")))
                                    (if (stringp val)
                                        (string-to-number val)
                                      (or val 0))))
                                tags)))
               (cdr (car source))))))
    groups)))

Then that can be used with the following code:

#+begin_src emacs-lisp :var source=source :colnames no :results table
(my-sum-tag-groups source)
#+end_src

to result in:

tag Q1 Q2
GT1 10 9
GT2 4 8
GT3 5 11

Because org--tags-expand-group takes the groups as a parameter, you could use it to sum things by different groups. The #+TAGS: directives above set org-tag-groups-alist to:

(("GT1" "tagA" "tagC" "tagD")
 ("GT2" "tagB" "tagE")
 ("GT3" "tagB" "tagC" "tagD"))

Following the same format, we could do something like this:

(my-sum-tag-groups source '(("Main" "- Subgroup 1" "- Subgroup 2")
                            ("- Subgroup 1" "tagA" "tagB")
                            ("- Subgroup 2" "tagC" "tagD")
                            ))
tag Q1 Q2
Main 14 11
- Subgroup 1 13 2
- Subgroup 2 1 9

I haven't specifically needed to add tag groups in tables myself, but I suspect the recursive expansion in org--tags-expand-group might come in handy even in a non-Org context. Hmm…

View org source for this post