Categories: review

RSS - Atom - Subscribe via email

A year with my cargo bike

| decision, life

Summary: Life with a cargo bike has been working out really well for our family.

Stroller

I used to walk for an hour to get to some of A+'s playdates, pushing her in the Thule bike trailer / stroller that she still fit into. I liked bringing popsicles during the summer so that A+ could share them with her friends, so I often balanced a small cooler on top of the stroller and walked as briskly as I could. The popsicles were usually still reasonably cold by the time I got to the park. We'd spend a few hours playing there, and then there would be another hour's walk back. A+ usually napped on the way, so it was a chance for me to listen to podcasts.

Car

Sometimes we biked to the playdate instead. That was much faster in terms of getting there, even with a popsicle break halfway through. Those popsicles were only for us, since I couldn't bring a cooler on my bike. Also, A+ was usually too tired to bike back, or it was too dark for her to be safe biking on the busy streets between the park and our house, so we often waited in the mall parking lot for W- to pick up A+ and her bike in his car. Then I biked back by myself.

Dumped

We'd been considering cargo bikes for a while, and eventually things lined up to make it possible. It was a carefully-considered decision. I did a bunch of test rides using different models of cargo bikes. My height (or lack of it) ruled out many of the models designed for taller people. A+ was quite vocal about her preference for the suspension on the R&M Load cargo bikes, and she liked the view from the front-loaders more than the longtails. I rented the Load 75 and the Load 60 to try them out, accidentally tipping over onto the side an embarrassing number of times; A+ was safely buckled in but very grumpy about it.

When we confirmed that a cargo bike fit into our life, I bought a Riese & Müller Load 75 from Curbside Cycle. We picked the Load 75 over the Load 60 because the rain cover was nicer and the extra room could give us more years of use as A+ grows.

Loaded up

I love it. Biking is my favourite way to get around. There's just something so cheerful about it. A+ and I sing as we go around town. We smile at dogs in sweaters. She takes pictures of trees. Sometimes there are cargo bikes in front of us as we wait at the traffic light, and we wave and nod.

We got the Bakkie bag, too. It's designed to tow a kid's bike. That way, A+ can bike wherever she wants. When she gets tired, she can hop into the cargo bike and I can buckle her bike into the Bakkie bag, towing it all the way home. We've been able to go on more bike adventures by ourselves and together with W- because we don't have to worry about exceeding A+'s range.

Hot chocolate

Since we could get to the playground in 15 minutes instead of 60, it was a lot easier to bring snacks to share. We pretty much kept the playground kids well-supplied with free popsicles (and the occasional much-coveted ice cream treat) all summer, and the ice packs came in handy for treating the occasional bumps too. We even brought disposable cups and insulated bottles of hot water for making hot chocolate and instant apple cider in the colder months.

Potting mix

Aside from taking A+ to a wider range of places, we've also used it to bring several bags of potting mix or a propane tank home from the hardware store, carry other bulky items, and take lots of stuff to the community environment days for recycling/donation.

We are very lucky to have cargo biking as an option. When people ask me how much it is, I ruefully tell them, "Well, it's less than a second car." We weren't actually choosing between this and a second car; even though W- rarely uses his car these days, I'm too anxious to drive. My brain gets a little squirrelly and is prone to attentional hiccups. I don't want a moment of distraction to result in someone's death or serious injury. I'm still on alert when I bike, but it feels a lot more like something I can handle. And biking is so fast and convenient. I don't have to nudge A+ out of a playdate so that we can make it out before the subway gets packed like sardines, or shepherd A+ back home from the subway station ("I'm tiiiired.").

I got the bike in November 2023. Here's how much I biked over the past year:

Month KM
Nov 208
Dec 157
Jan 69
Feb 78
Mar 176
Apr 82
May 106
Jun 143
Jul 135
Aug 96
Sep 212
Oct 120
2024-11-04T14:04:00.159647 image/svg+xml Matplotlib v3.6.3, https://matplotlib.org/
Figure 1: Graph of kilometres by month

I was pleasantly surprised that even during the cold months (and A+'s reluctance to go outside if it was very cold or slushy), and even during the schoolweek, we still managed to get out on the bike.

2024-11-04T13:43:31.432403 image/svg+xml Matplotlib v3.6.3, https://matplotlib.org/
Figure 2: Kilometres by date

I got data from the ebike-connect site using Spookfox using the code below.

Javascript code for extracting distances and times
[...document.querySelectorAll('.activities__ride-menu')].map((o) => {
  return {
    date: o.querySelector('.activities__menu-details > span').textContent,
    distance: o.querySelector('.activities__menu-distance-text').textContent.trim(),
    time: o.querySelector('.activities__menu-details > span:nth-child(2) > span:nth-child(2)').textContent,
  }
});
Emacs Lisp to group distance by month
(let ((by-month (seq-group-by
  (lambda (row)
    (let ((date (plist-get row :date)))
      (when (string-match "[0-9][0-9]\\.\\([0-9][0-9]\\)\\.\\([0-9][0-9]\\) [0-9][0-9]:[0-9][0-9]"
                          date)
        (format "20%s-%s-01"
                (match-string 2 date)
                (match-string 1 date)))))
  trips)))
  (append
   '(("Month" "Distance")
     hline)
   (mapcar
    (lambda (row)
      (list (format-time-string "%b" (date-to-time (car row)))
            (format
             "%d"
             (round (apply '+
                           (mapcar (lambda (entry) (string-to-number (plist-get entry :distance)))
                                   (cdr row)))))))
    (reverse (seq-filter (lambda (o) (string< (car o) "2024-11")) by-month)))))
Emacs Lisp to group distance by date
(let ((by-day (seq-group-by
  (lambda (row)
    (let ((date (plist-get row :date)))
      (when (string-match "\\([0-9][0-9]\\)\\.\\([0-9][0-9]\\)\\.\\([0-9][0-9]\\) [0-9][0-9]:[0-9][0-9]"
                          date)
        (format "20%s-%s-%s"
                (match-string 3 date)
                (match-string 2 date)
                (match-string 1 date)))))
  trips)))
  (json-encode (mapcar
   (lambda (row)
     (cons (car row)
           (format
            "%d"
            (round (apply '+
                          (mapcar (lambda (entry) (string-to-number (plist-get entry :distance)))
                                  (cdr row)))))))
   (reverse (seq-filter (lambda (o) (string< (car o) "2024-11")) by-day)))))
Python code for making a bar graph of distance by month
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
import json

data = trips
df = pd.DataFrame(data, columns=["Month", "Distance"])
df.set_index('Month')
df['Distance'] = df['Distance'].astype(float)
plt.figure(figsize=(8, 6), dpi=100)
sns.barplot(data=df, y='Distance', x='Month')
plt.savefig('biking-distance-by-month.svg')
Python code for making a heatmap
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
import json

start_date = datetime.datetime(2023, 11, 1)
end_date = datetime.datetime(2024, 11, 1)
dates = pd.date_range(start=start_date, end=end_date, freq='D')
data = json.loads(trips)
df = pd.DataFrame.from_dict(data, orient='index')
df.index = pd.to_datetime(df.index)
df[0] = df[0].astype(float)
# Create calendar heatmap
plt.figure(figsize=(16, 3), dpi=100)
pivoted = df.pivot_table(index=df.index.day_name(), columns=df.index.strftime('%Y-%W'))
all_days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
pivoted.index = pd.Categorical(pivoted.index, all_days, ordered=True)
pivoted = pivoted.sort_index()
heatmap = sns.heatmap(
    pivoted,
    cmap="crest",
    linewidths=0.5,
    linecolor='white'
)

# Set the x-axis tick labels to show only the months
month_labels = df.index.strftime('%b').unique()
month_ticks = [i * 4 for i in range(len(month_labels))]
plt.xticks(
    month_ticks,
    month_labels,
    rotation=90
)
tick_positions = [i + 0.5 for i in range(len(all_days))]
plt.yticks(tick_positions, all_days)
plt.title('Distance on dates')
plt.xlabel('November 2023 - November 2024')
plt.ylabel('')
plt.xticks(rotation=90)
plt.savefig('biking-by-day.svg')

I like our cargo bike a lot. I hope to ride it for many years to come.

View org source for this post

Wednesday weblog: Toots ending 2024-10-23

| review, weblog
View org source for this post

Wednesday weblog: Toots ending 2024-10-16

| review, weblog
  • Emacs:
  • Other:
    • Reading books; Atomic Habits - 2024-10-22T13:44:31.682Z

      All right, I'm slowly getting back into reading and sketching books, now that I've discovered that
      Libby lets me export my highlights. =) Here's my #sketchnote of Atomic Habits:
      https://sachachua.com/blog/2024/10/2024-10-21-05-atomic-habits-visual-book-notes-productivity-personal-development/

      Text from the sketch:

      ```
      Atomic Habits - James Clear (2022) - Notes by Sacha Chua 2024-10-21-05

      - time vs results: valley of disappointment: (we expect linear progress)
      - Achieving a Goal only changes your life for the moment.
      - In order to improve for good, solve problems at the system level.
      - Fall in love with process rather than product.
      - Not "what do you want to achieve?", who do you want to become?
      - prove it with small wins
      - habits
      - Problem phase
      - Cue: Make it obvious.
      - point & call: raise level of awareness
      - common cues: time, location, other habits
      - Manage your environment
      - Craving: Make it attractive.
      - Temptation bundling
      - anticipation, dopamine, action
      - Social groups
      - Reframe
      - Solution phase
      - Response: Make it easy.
      - Make it easier to do the right things
      - Motion != action
      - Repetitions, automaticity: habit line
      - Make your habits so easy that you'll do them even when you don't feel like it
      - 2 minutes
      - Reward: Make it satisfying.
      - Immediate
      - Visuals: paper clip strategy, tracker
      - Habits can be easier to change in a new environment. (old cues gone)
      - You have to fall in love with boredom
      - Habit stacking
      - My take aways:
      - Processes, not products
      - Analyze & redesign:
      - habits I have
      - habits I want
      - be thoughtful about helping the kiddo learn
      ```

      (Also, how do I format this text more nicely? I want to preserve indentation, and fencing it with three backticks doesn't seem to be working.)

    • From audio braindumping to a post - 2024-10-16T15:08:13.172Z

      I'm slowly getting the hang of this sketch+audio braindumping thing. I managed to write a fairly long post on #pkm:

      Thinking about 12 aspects of personal information/knowledge management
      https://sachachua.com/blog/2024/10/thinking-about-12-aspects-of-personal-information-knowledge-management/

      Looking forward to exploring more as I dive into reading and conversations!

    • My time data - 2024-10-18T02:39:23.402Z

      I got curious and did a scholar.google.com search for "Sacha Chua." The most amusing thing I found was:

      Joscha Cueppers and Jilles Vreeken. Just Wait For It... Mining Sequential Patterns with Reliable Prediction Delays. In: IEEE International Conference on Data Mining (ICDM). 2020

      which (among other things) had apparently analyzed the time tracking records that I'd intentionally made public:

      "Next we consider Lifelog, which is based on the life of Sacha Chua who logs and publishes all her daily activities. We considered the data over 2017, removing any activities with have the same start and stop timestamp. As this dataset provides many events that are potentially interesting, we consider every e ∈ Ω as target, and have 40 target sequences with Y [i] = 1 iff X[i] = e. In addition, we consider a Y where we marked all business related activities as interesting.
      Over all these datasets, SCIS discovers on average 695 patterns, many of which are redundant and not all make intuitive sense. While SQS only discovers 3 predictive patterns, these do make sense: Cook, Dinner→Clean the Kitchen
      and Subway, Social→Subway. OMEN takes between 6.1 and 37 seconds per dataset, and overall discovers 24 patterns.
      Many of these, such as Sleep→Childcare, Cook→Dinner, Dinner→Clean the Kitchen, predict the next action, i.e. a time delay distribution with a peak at 1. A more interesting pattern is Subway→Subway which has its peak at δ = 2, and for which a natural interpretation is that Sacha takes the subway, logs on average one activity, and then takes the subway back."

      https://publications.cispa.de/articles/conference_contribution/Just_Wait_For_It_Mining_Sequential_Patterns_with_Reliable_Prediction_Delays/24613377?file=43247712

      2017! Bwahaha... I had a one-year-old child and was trying to stay sane by squeezing in some consulting here and there while dealing with sleep deprivation and all sorts of other new-parent challenges. :) I still don't have the time to do lots of different things on one errand, although it's nice that I'm now biking around a lot more than I use the subway. Maybe analyzing 2012-2016 might have been more interesting for their data mining, since that covered a little bit of corporate work time and the transition to self-directed learning in my semi-retirement experiment.

      Cool, cool, very fun, I'm tickled pink that someone else found the data nifty. I recently made quantifiedawesome.com more private, but maybe I should open that part up again.

View org source for this post

Wednesday weblog: Toots ending 2024-10-16: EmacsConf, Emacs, PKM

| review, weblog
  • Personal knowledge management
    • thought management - 2024-10-13T21:24:39.185Z

      I think I don't have a task management or even a knowledge management challenge, I have a thought management challenge. I want to think more thoughts through to a reasonable level of completion (blog post, commit, sketch, even a toot) while still honouring the kiddo's desire for snuggles and playtime. My brain gets cranky about unfinished thoughts because of the Ovsiankina effect[1]. Sometimes I can get away with just adding a note to myself, and sometimes I end up telling the kiddo, "Let me just finish this thought..." My brain also gets cranky if I don't get time to focus on my own stuff, so it's a bit of a balance.

      I like sketchnotes[2] because I can use non-computer time to think nonlinearly and make a thing I can refer to, a chunk I can use to build up other thoughts. I'm working on getting used to even smaller chunks so I can feel like a thought is complete without needing to fill up the page.[3]

      Audio braindumps[4] let me explore thoughts, which is nice. WhisperX gets me reasonable transcripts. The transcripts are unfinished chunks, though, so they often go back into my inbox and feel like an open loop[5]. I'm experimenting with LLMs to help me neaten them up, but I haven't figured out a prompt that I'm happy with yet.

      So here I am: picking up a thought, putting it down, picking it up, putting it down, capturing a bunch of other thoughts that come up along the way. It'll do for now. This is a temporary phase. Just gotta keep sane!

      - [1] Ovsiankina effect https://en.wikipedia.org/wiki/Ovsiankina_effect
      - [2] sketchnotes https://sketches.sachachua.com
      - [3] cropping https://sachachua.com/blog/2024/09/org-attaching-the-latest-image-from-my-supernote-via-browse-and-access/
      - [4] audio braindumps https://sachachua.com/blog/2023/12/audio-braindump-workflow-tweaks-adding-org-mode-hyperlinks-to-recordings-based-on-keywords/
      - [5] open loops https://gettingthingsdone.com/2011/10/gtd-best-practices-collect-part-1-of-5/

      (... Hmm, does my brain like inline links or footnotes when it comes to stuff like this? What does your brain like? I think inline links might be slightly easier when it comes to grabbing segments and using them in other chunks like a blog post, but it might be worth trying different ways.)

    • my personal knowledge management workflow - 2024-10-13T03:35:27.740Z

      I have an inbox via Orgzly Revived (thanks, GTD). On good days, I distinguish between TODO and SOMEDAY; other times, everything starts off as SOMEDAY. I try to have very few commitments or deadlines. I tag some tasks with keywords (consulting, emacsconf, writing, need) to make them easy to refile automatically so that I can see what's left. I don't really worry about tagging by context (computer, errands, phone) because I still don't have enough focused time to batch things. (Sorry, GTD.) My main Org file is roughly organized along the lines of PARA - projects, areas of responsibility/interest, resources, archive. I have yyyy-mm-dd-nn IDs for my sketches and journal entries (thanks, Zettelkasten) and some support for linking between things, but I haven't gotten around to implementing backlinks or spending more time linking concepts.

      I move ideas between sketches and audio braindumps and outlines and notes and toots and blog posts depending on what I can use at the time. Some of them even get turned into audio recordings and videos. Other times, I refile things to rough locations in other parts of my outline; maybe someday I'll get to use them. I tend to use org-refile or ripgrep or Google to try to find things again.

      I'm usually skewed by recency/availability bias, focusing on stuff in my note inbox or scheduled tasks. Sometimes I pick a project and focus on it. I use Org Mode's clocking and capture features to help me manage interruptions from life, other ideas, or other tasks.

      It's a mish-mash of #PIM approaches, nothing particularly elegant or sophisticated, but it helps me get by and I'm looking forward to tweaking it further.

    • evolution of my personal information/knowledge management systems - 2024-10-13T03:00:21.459Z

      I started thinking about the evolution of my personal information management systems from 2001 to now. Rough timeline:

      - 2001: university: assignments, class notes, projects; Planner Mode in Emacs (daily tasks/notes, category notes, blog with RSS feed)
      - 2003: teaching: lesson plans, notes; Planner Mode
      - 2004: internship in Japan: language learning; Planner Mode, flashcard.el
      - 2005: master's degree: research, class notes, finances; Planner Mode, Ledger
      - 2007: sketchnotes, working at IBM: internal vs. external notes, publishing to internal blog, moving my public blog to WordPress; Org Mode, org2blog, WordPress
      - 2012: self-directed learning - what do I want to spend my time and energy on?; time tracker
      - 2015: Emacs News; categorizing Org Mode list items
      - 2016: parenting - sleep deprivation, interruptions, limited computer time; MobileOrg
      - 2017: web-based journal so that I can easily update it when traveling without my computer
      - 2018: switched from MobileOrg to Orgzly
      - 2019: EmacsConf; Org Mode for scheduling and automation
      - 2021: switched from WordPress to the Eleventy static site generator to reduce security things to worry about
      - 2023: SuperNote A5X - easier black/white/gray sketches
      - 2024: starting to have more predictable focus time, can revisit my Org Mode notes and projecrs; WhisperX for audio braindumps

  • EmacsConf
    • Started processing videos for EmacsConf - 2024-10-14T23:03:02.187Z

      It took a bit of figuring out, but I managed to spin up our #emacsconf video processing pipeline and got the first uploaded video through the process and into our backstage area, complete with edited captions. I experimented with using the word-level timestamps from WhisperX, but merging them was a little tedious. I might go back to using the text output and then using either Aeneas to align or splitting based on the word data from the WhisperX JSON. Could try finding some other subtitle segmentation thing - maybe give lachesis another try, or check out recent research, or just go with something based on length+punctuation+gap...

    • Got stuck with Etherpad 2.x, staying with 1.9.7 for now - 2024-10-14T16:11:27.704Z

      Got stuck trying to figure out how to install Etherpad 2.x, so I'm going to leave Etherpad at 1.9.7 for #EmacsConf until I have more brainspace.

  • Emacs
  • Other
    • small ideas - 2024-10-13T15:18:05.139Z

      I was thinking about my visual book notes [1] , my stack of unread books from the library, and my general feeling of time scarcity that makes it difficult for me to sit down with a book (or even a video). I think for this phase of my life, I'd rather reflect on people's personal blog posts and toots about what they're learning, and that's okay. Small (manageable, hold-in-your-head-able) ideas can be much easier to deal with than something that's trying to be a big enough idea to justify the costs of physical book distribution.

      [1] https://sachachua.com/blog/category/visual-book-notes/

View org source for this post

Wednesday weblog: Toots ending 2024-10-09

| review, weblog

Here's what I've been posting on @sacha@social.sachachua.com:

View org source for this post

Wednesday weblog: Toots ending 2024-10-02

| review, weblog
Tech
  • Server upgrade 2024-10-01T19:34:35.535Z

    Okay, my VPS should now be on Ubuntu 24.04 LTS. Things I bumped into along the way:
    - Had to reinstall MySQL for some reason. Fortunately kept all the data, although I did need to recreate directories for logs and sockets.
    - Reinstalled my Docker images. Fortunately kept all the data on disk, so that was fine. Along the way, upgraded my mongo DB from 4.2 to 4.4 to 5 to 6 to 7.
    - Panicked when gotosocial was taking a while to start up, interrupted it and tried again, ended up with a partially-migrated database and worse problems. Fortunately had a backup of the db, so I restored and patiently waited.

  • Eleventy upgrade 2024-09-30T17:35:26.858Z

    I managed to get my blog upgraded from Eleventy 2 to Eleventy 3.0.0-alpha.20. find-dired and wdired were useful for finding all the .js files and turning them into .cjs.

  • Supernote colour template 2024-09-27T03:05:15.033Z

    I finally got around to checking if the #Supernote can handle colour templates despite only letting me draw in black, white, and two shades of gray. It keeps the colour in the export! That means I can make a template that uses a specific color to make a grid, which is then easy to strip out of it with Python. That saves me 3-6 taps and reduces friction even further. Looking forward to experimenting with that at the next opportunity.

  • Blog tweaks and other code - 2024-09-26T17:02:17.804Z

    A couple of little tweaks:

    - I re-added a "Random" link to my blog header, nudged by https://news.ycombinator.com/item?id=41647654
    - I added a sitemap.xml , so let's see if search engines pick stuff up
    - I wrote some code to move Org properties from a subtree to a parent
    - I changed my code for inserting the latest file from my Supernote A5X e-ink device into Org Mode to also recolor, recognize text, rename, and archive the file

  • Setting up hibernate 2024-09-26T00:08:50.365Z

    I followed the directions at https://ubuntuhandbook.org/index.php/2021/08/enable-hibernate-ubuntu-21-10/ to set up a swap partition and enable hibernate. Now I can pause whatever I'm doing in Linux in order to switch to Windows to play Minecraft Bedrock with the kiddo, and then switch back to Linux afterwards.

Life
View org source for this post

Wednesday weblog: Toots ending 2024-09-25: Emacs and tech

| review, weblog
Emacs:
  • Emacs community

    Looking at how the kiddo dives deeply into one interest and then moves on to another, and how she gets such satisfaction from sharing those interests with me, I think part of why #Emacs has been a long-lasting interest of mine is that it involves an endless space of novel possibilities that is entirely because of a wonderful community.

  • keyboard shortcuts

    I wonder if someone's already written a newbie-friendly #Emacs Customize-based interface for defining and saving keyboard shortcuts, function aliases, and other little things that could make it easier for people to make Emacs more comfortable for themselves.

  • org-src-lang-modes and web-mode

    I want my #Emacs #OrgMode `#+begin_export html ... #+end_export` blocks to open in web-mode, not html-mode. I customized `org-src-lang-modes` and now `org-edit-special` does the right thing. Yay Emacs!

  • beginner map

    I pulled together a bunch of beginner-oriented links from past #Emacs News and started mapping out topics. https://sachachua.com/web/beginner-map.html

  • consult-omni and Google searches

    I want to quickly look up and add links. [consult-omni](https://github.com/armindarvish/consult-omni) lets me search within #Emacs instead of switching to a web interface. After I set up consult-omni-google with a Google custom search engine and a JSON API key, I can call it with my shortcut: `M-g w`. Using `M-n` for future history pulls in the word at point. Then I can select a site and use Embark to insert with `C-. i` or copy with `C-. w`.

    My config: https://sachachua.com/dotemacs#consult-omni

Tech:
  • hibernate

    I followed the directions at https://ubuntuhandbook.org/index.php/2021/08/enable-hibernate-ubuntu-21-10/ to set up a swap partition and enable hibernate. Now I can pause whatever I'm doing in Linux in order to switch to Windows to play Minecraft Bedrock with the kiddo, and then switch back to Linux afterwards.

  • ffmpeg and fps

    I noticed out-of-sync subtitles when I used #ffmpeg to combine an animated gif with audio and subtitles. Turns out all I needed to do was to bump up the fps with the fps filter in order to get the video to play smoothly.

View org source for this post