When I Optimized for Temperature and Forgot About Time

Brian’s fitness journal after a brain stroke

This morning, I made what felt like a perfectly reasonable decision: stay in bed a little longer because it was cold. Very cold. Also, there was no immediate pressure to run—it wasn’t even close to the warmest part of the day yet.

This logic was flawless.
Unfortunately, it was also dangerous.

I waited too long.

By the time I finally started my day, my carefully imagined schedule had already begun to unravel. Saturdays are chore-heavy for me. I do a lot around the house and fit in a 10-kilometer run on top of it. Delaying the start meant everything else slid later… and later… and later.

When I returned from my run, dinner was already behind schedule. I could tell immediately—my wife was not thrilled.

My wife runs life on a timeline. She schedules days and weeks in advance. Cold days and hot days do not interfere with her morning exercise routine. Her internal clock does not negotiate. Sometimes I think she wishes I were more like her. Today, I wished that too.

I felt bad knowing I’d disrupted her carefully structured day.

Normally, when things go wrong because of me, my wife quietly adjusts her tasks so she doesn’t waste time waiting. Today, though, the ripple effects were harder to contain.

Saturday evening is grocery time—specifically a very precise window when the store is less crowded. She also meal-preps for the following week, packing ingredients with recipes so cooking is easy for me. Any delay pushes everything later, including bedtime. She doesn’t like food sitting around unorganized. Neither does her conscience.

By the time I started washing dishes, we were already 45 minutes past our usual grocery time. I panicked, stopped mid-dish, and suggested finishing later—without realizing that this decision now blocked her from organizing groceries afterward.

Efficiency, I had learned, was optional today.

While I was scrambling, my wife quietly rearranged some of her Sunday tasks just to keep the day moving. Then she tackled grocery sorting anyway, because that’s what she does. Later, she gently reminded me of a lesson I apparently needed to relearn: schedule backward.

Start with the fixed commitments.
Work back to the run.
Then decide when sleeping in is actually allowed.

So yes, next time I’m tempted to wait for optimal running temperatures, I’ll also remember this: time waits for no one—and neither does the grocery schedule.Warm legs are nice.
An undisturbed household system is nicer.

Why Didn’t I Think of This in 2005?

Day 21 of 100 Days Coding Challenge: Python

When I saw “audio-to-text converter” on the list, my brain did a dramatic slow turn and whispered, “Where were you twenty years ago?” I mean, really—this could’ve saved me hours of repeating the word “vegetable” into a cassette recorder, trying to sound less like an anime character doing karaoke. Back then, I was on a one-woman mission to master English pronunciation, and a tool like this would’ve felt like cheating—but the good kind. Now, with AI and a little Python magic, I have made a program that converts my voice into readable text. Only catch? It plays favorites with WAV files. No love for MP3s. So naturally, I whipped up an MP3-to-WAV converter on the side, because why not? I recorded my voice straight from my laptop, half-expecting it to transcribe me saying something profound. Instead, I got back “this is a test.” Which is fair. It was.

Today’s Motivation / Challenge

Today’s project is the kind of tool you don’t know you need until you really need it—like when you’re trying to capture a brilliant idea mid-shower, but this time, it’s your voice memos from a walk, an interview, or that rambling TED Talk you gave to your cat. Audio-to-text isn’t just practical—it’s empowering, especially for learners, note-takers, and people who speak faster than they type.

Purpose of the Code (Object)

This simple program listens to your audio file and writes down what you said. That’s it. You talk, it types. It works best with clear speech and doesn’t judge your accent (too much). You can even record yourself with a laptop mic and see your words appear as text. It’s like magic—but with WAV files.

AI Prompt:

Create a Python script using the SpeechRecognition library that takes an audio file (preferably WAV), converts it to text, and prints the result. Add basic error handling. Bonus: include a simple MP3-to-WAV converter using pydub.

Functions & Features

  • Load an audio file (WAV preferred)
  • Convert speech in the file to text
  • Display transcription
  • Convert MP3 to WAV if needed

Requirements / Setup

bash

CopyEdit

pip install SpeechRecognition

pip install pydub

You’ll also need ffmpeg installed and added to PATH for MP3 support.

Minimal Code Sample

import speech_recognition as sr

recognizer = sr.Recognizer()

with sr.AudioFile(r”C:\path\to\your.wav”) as source:

    audio = recognizer.record(source)

    text = recognizer.recognize_google(audio)

    print(text)  # This prints your spoken words

Audio to Text GUI

Notes / Lessons Learned


So here’s the thing: I wrote audio_file = “C:\Users\tinyt\OneDrive\Desktop\Test\Recording.wav” and, well… Python had a meltdown. Apparently, \t is not just a cute path separator—it’s a tab. Classic Windows-path betrayal. Once I added a humble little r in front like this—r”C:\Users\tinyt\…”—the program stopped being dramatic and worked like a charm. But let’s be real: rewriting the file path in code every time?

That’s a cry for a GUI. So, I made one. And it was glorious. Click, select, transcribe—done. Also, a fun fact: if you skip articles in your speech, the program skips them in your text too. No article, no mercy. And if your grammar is questionable? The output will happily reflect that. It’s an honest mirror, not a grammar teacher.

Optional Ideas for Expansion

  • Add a “Save as TXT” button for transcribed text
  • Let users choose between multiple languages for transcription
  • Record audio directly in the app, no file needed

You Had One Job, Resume!

Day 20 of 100 Days Coding Challenge: Python

Do you know what an ATS resume keyword checker is? About 15 years ago, I had a chat with a friend in HR who casually dropped the term “Applicant Tracking System,” or ATS, as if it were common knowledge. I nodded like I totally knew what she meant, but inside I was thinking, “Ah, yes, the mythical software that eats resumes for breakfast.” She explained that ATS was used to sort through the avalanche of job applications—often over a thousand per listing. But here’s the kicker: the system also had a habit of rejecting the best candidates because they didn’t use the “right” words. The irony stuck with me.

So today, I decided to take matters into my own hands and see if I could make a mini version of this digital gatekeeper, ATS resume keyword checker. Because if robots are going to judge us, we may as well peek under their hood.

Today’s Motivation / Challenge


We’ve all seen those job listings with 50 “required” skills. And let’s be honest—some of them are just buzzword soup. Today’s challenge was about building a tool to fight back. The goal: create a little program that reads your resume and checks it against keywords from a job description. It’s like prepping for a job interview with a cheat sheet—except you built the cheat sheet yourself.

Purpose of the Code (Object)


This code scans your resume and tells you how well it matches a job posting based on keywords. It’s not reading your experience like a recruiter—it’s just playing word bingo. If you mention “Excel,” and the job wants “Excel,” that’s a point for you. The higher the match score, the more likely you are to pass the digital bouncer at the job club door.

AI Prompt: 

 Build a Streamlit app that uploads a resume (.txt or .pdf), compares it against comma-separated keywords, shows which ones are matched and which are missing, and calculates a match score.

Functions & Features

  • Uploads resume in .txt or .pdf format
  • Accepts comma-separated job keywords
  • Checks which keywords are present in the resume
  • Calculates a match score (%)
  • Displays found and missing keywords in separate lists

Requirements / Setup


Install these before running:

bash

CopyEdit

pip install streamlit PyPDF2

Then run the app using:

bash

CopyEdit

streamlit run your_script.py

Minimal Code Sample

python

CopyEdit

def check_keywords(text, keywords):

    found = [kw for kw in keywords if kw.lower() in text.lower()]

    missing = [kw for kw in keywords if kw.lower() not in text.lower()]

    return found, missing

This function splits your keywords into found and missing by checking if they show up in the resume text.

Resume Checker App_GUI

Notes / Lessons Learned


The programming part was smooth. Honestly, I was feeling confident—until I tried to run my Streamlit app like a normal Python script. That’s when Streamlit wagged its finger at me: “Session state does not function when running a script without streamlit run.” Touché, Streamlit. Once I launched it the proper way, everything clicked. I tested the app with a job listing from Indeed and my own five-year-old resume. The result? A humble 50% match. Moral of the story: your resume may be a masterpiece, but if it doesn’t speak ATS language, it’s not getting past the door. Tailoring your resume for each job isn’t just good advice—it’s algorithmic survival.

Optional Ideas for Expansion

  • Add an option to upload a job description file and auto-extract keywords
  • Highlight matched keywords directly in the resume text
  • Export the results as a PDF or CSV for review

One Push-Up a Week and a Year of Quiet Progress

Brian’s fitness journal after a brain stroke

Today marks a small but meaningful milestone for me—one that took an entire year to earn.

About a year ago, I started doing push-ups once a week. I began at 20 and made myself a very modest promise: add one more rep each week. No heroics. No sudden transformations. Just one extra push-up. Today, that number reached 72.

When you have compromised kidneys, muscle-building looks a little different. I can’t eat as much protein as a healthy adult male, so progress doesn’t arrive quickly—or loudly. I started running about a decade ago, but it was only in the last few years that I began adding other forms of exercise. Even then, I did it cautiously.

Summers are already physically demanding thanks to lawn mowing and general activity, and my body doesn’t recover the way it used to. So instead of piling workouts on top of each other, I started doing something less exciting but far more effective: adding things slowly.

I also tweaked how often—and how much—I train. Rather than working everything in one session, I focus on a few selected muscle groups each time. The goal isn’t exhaustion. The goal is regeneration. Training your body not to recover is not a win.

Since switching to this approach, something unexpected happened: it worked.

My wife mentioned that I look noticeably leaner than I did a few years ago, back when running was my only form of exercise. I’ve noticed it too—mostly because my pants are tighter. And no, it’s not because my legs suddenly bulked up. Progress shows up in mysterious ways.

The push-up plan itself has been almost comically simple. One rep per week. That’s it. Occasionally, I misremember what number I hit the week before, which means I may have skipped a number or repeated one. But honestly? I don’t care. What matters is that I showed up every week for a full year.

That alone feels worth celebrating.

I’d like to reach 100 push-ups someday, but that will take most of another year—and I’m perfectly fine with that. I’m not in a rush. Each week, I’ll try the new number. If I succeed, I’ll add one more for next time. Thanks to a spreadsheet, I can now be reasonably sure I’m not accidentally cheating or sabotaging myself.

A fitness journey doesn’t need to be dramatic to be real. It just needs to be yours. I’ve accepted my kidney disease and built my workouts around what my body can actually handle.

And one push-up at a time, it turns out, is more than enough.

Ctrl + M: Merging PDFs Like a Boss With Python PDF Merger GUI

Day 19 of 100 Days Coding Challenge: Python

Have you ever stood at your flatbed scanner, flipping page after page like a 90s office clerk in a movie montage, only to realize—“Oh great, now I have five separate PDFs that should have been one”? Welcome to my world. We’ve got one of those dinosaurs of a scanner that spits out a new file for every single page, and while it’s good at being stubborn, it’s not great at convenience. Sure, there are free websites that claim they’ll merge your files in a flash.

But when those PDFs contain personal, sensitive, or just plain embarrassing content (say, your creative attempts at calligraphy), uploading them to a mystery website isn’t exactly comforting. So I did what any slightly paranoid, slightly annoyed person would do—I made my own PDF merger. Because sometimes, security means building your own tools with a splash of Python and a sprinkle of stubbornness.

Today’s Motivation / Challenge


Today was about practicality. Merging PDFs sounds boring until you actually need to do it—and then you realize it’s oddly satisfying, like organizing your bookshelf by color or alphabetizing your spice rack. Also, there’s something empowering about replacing a clunky online tool with your own sleek script. This challenge hit that sweet spot between “annoyed enough to act” and “curious enough to build.”

Purpose of the Code (Object)


This little Python program takes all the PDF files in a folder and smooshes—yes, smooshes—them together into one tidy document. No need to click through a bunch of file pickers. No typing long file paths. Just point it to a folder, and poof! One big, shiny PDF.

AI Prompt:


“Rewrite the script so that it automatically merges all .pdf files in a folder, no typing required. Also, make it a GUI version.”

Functions & Features

  • Select a folder via a simple GUI window
  • Automatically find and merge all .pdf files in that folder
  • Save the merged file with a custom filename

Requirements / Setup


To run the program, you need:

bash

CopyEdit

pip install PyPDF2

Python 3.x is recommended (Tkinter is usually pre-installed)

Minimal Code Sample

from tkinter import filedialog

import os, PyPDF2

folder = filedialog.askdirectory()

pdfs = sorted([f for f in os.listdir(folder) if f.endswith(“.pdf”)])

merger = PyPDF2.PdfMerger()

for pdf in pdfs:

    merger.append(os.path.join(folder, pdf))

merger.write(“merged_output.pdf”)

This merges all PDFs in the selected folder in alphabetical order.

PDF Merger

Notes / Lessons Learned


This was my first Python GUI script that I actually plan to use often—and honestly, that’s the best kind. My first version worked, but it asked me to type full file paths like some kind of unpaid intern. One typo, and it all crashed. Then I remembered that I am, in fact, very lazy. So I upgraded to a GUI. One click to select the folder. No paths, no quotes, no drama. It’s exactly the kind of script that “future me” will thank “past me” for—like finding frozen soup in the back of the freezer when you’re starving. Am I proud? Absolutely. Will I use this over and over? Also yes.

Optional Ideas for Expansion

  • Add drag-and-drop support for merging selected files
  • Let the user reorder files before merging
  • Show a preview of filenames and file sizes before final merge

Python, Clean Up Your Room!

Day 18 of 100 Days Coding Challenge: Python

Let’s get one thing straight: I am not a digital Marie Kondo. My desktop often looks like a digital garage sale, and every few weeks, I muster the courage to face it—dragging files around like I’m playing a very boring version of Tetris. I usually go the old-fashioned route: click, drag, sort, sigh. Then, one day, while sorting my pictures, I thought… Wait a minute. I know Python. Why am I doing this with my human hands? So, I decided to create a Python file organizer script to organize my pictures.

Today’s Motivation / Challenge

Today’s project tackles a common monster: messy folders. Whether it’s your Downloads folder, your project archive, or that strange desktop abyss, the pain is universal. The challenge? Build a simple, no-fuss tool that does the sorting for you—like a digital butler who doesn’t judge your file-naming habits.

Purpose of the Code (Object)

This little script organizes all the files in a selected folder by their file extensions. That means all your .jpg files go to the “jpg” folder, .pdf files go to the “pdf” folder, and your .who-knows files? They get a home too. It’s your personal assistant for decluttering—minus the hourly rate.

AI Prompt:

Python code to organize files in a folder by their file extension. Include a GUI for folder selection and an undo function to reverse the operation.

Functions & Features

  • Sorts files by extension into neat subfolders
  • Ignores folders and only targets loose files
  • GUI-based folder selection (no need to type paths)
  • Undo function to restore files to original locations

Requirements / Setup

  • Python 3.6+
    No pip installs required—just your standard library.

Minimal Code Sample

python

CopyEdit

ext = ext[1:].lower() or “no_extension”

dest = os.path.join(folder_path, ext)

shutil.move(file_path, os.path.join(dest, filename))

This sorts each file into a folder named after its extension.

File Organizer

Notes / Lessons Learned

This time, I couldn’t resist poking the code like a cat with a suspicious shoelace. I renamed ChatGPT to “Mrs. Cat” just to see if she’d organize with more sass (she didn’t). Then I fed the script a folder full of chaos—downloads, screenshots, and whatever that .swf file was. Everything got tucked neatly into place. The thrill of seeing it work was only topped by the dread of realizing I’d just hidden all my junk into different corners. So, naturally, I added an undo button. Because sometimes, you need to imagine the consequences before you automate your mess.

Optional Ideas for Expansion

  • Add a “preview before sort” function so you can see what’s about to move
  • Let users customize folder names (e.g., “Images” instead of “jpg”)
  • Add a cleanup timer to auto-organize your folder once a week

How I’m Training Myself to Drink Water Like an Adult

Brian’s fitness journal after a brain stroke

Today’s main objective is simple, practical, and surprisingly difficult: drink water on schedule.

My wife recently bought us matching one-liter water bottles with hour-by-hour drinking markers printed right on them. The idea is elegant—drink steadily throughout the day instead of realizing at 8 p.m. that you’ve consumed approximately nothing.

Everyone should drink water regularly, kidney issues or not. In my case, it’s non-negotiable. My doctor reminds me—firmly—that I need at least 1.5 liters a day. Concentrated urine is not something my already overworked kidneys appreciate, and kidney stones are absolutely not on my wish list.

The problem is not knowing this.
The problem is forgetting.

Over the past week, my routine has been hijacked by distractions: lab appointments, our anniversary dinner, Thanksgiving. All good things—but all excellent at pulling me away from my desk, my notebook, and any awareness of hydration. By the time I noticed, I was hours behind.

So I did what any desperate person would do: I guzzled water to catch up.

This was a mistake.

My body did not appreciate the late-day hydration sprint and politely informed me of its displeasure by waking me up in the middle of the night with a bladder emergency. Lesson learned: hydration is not a cram session.

My wife bought these bottles because she forgets to drink water when she’s writing, reading, or deeply focused on anything at all. She wisely bought one for me too, because I apparently have the same flaw.

Before this bottle, I had no real sense of how much water I was drinking. Now I can see it clearly—and unfortunately, that clarity revealed that several days last week ended with frantic water catch-up. There’s no good excuse for that.

We buy five-gallon jugs from the grocery store and use a water dispenser at home. Between the two of us (and occasional help from the refrigerator dispenser), we now go through about five gallons a week. Ever since getting these bottles, that number has become very consistent—which strongly suggests we were under-hydrating before.

So today, I’m doing things differently. No catch-up drinking. No late-night flooding. Just steady, boring, responsible hydration—one hour mark at a time.If all goes well, my reward will be the most luxurious thing of all:
an uninterrupted night’s sleep.

Choose Your Own Debugging Adventure

Day 17 of 100 Days Coding Challenge: Python

When I was a kid, I got hooked on those old-school text-based games—the ones where you’d type “go north” and end up in a cave with a troll and no map. Pure magic. Eventually, I leveled up to MUD games (multi-user dungeons, for those blessed with youth), which were basically fantasy novels with attitude. Today, I’m not diving headfirst into building a full-blown MUD, but I am reliving those glory days by coding up a little interactive adventure. Because sometimes, the best way to feel powerful is to fight imaginary dragons in your terminal.

Today’s Motivation / Challenge

Today’s project is a nod to nostalgia—and to logic. A text-based adventure game might seem like retro fun, but it’s also a perfect beginner’s playground. It lets you practice the fundamentals of coding in a way that doesn’t feel like homework. Plus, if you’ve ever wanted to boss around a computer with “take sword” or “open door,” this is your moment.

Purpose of the Code (Object)

This program is a simple adventure game where the player makes choices and the story branches based on those decisions. Think of it as a choose-your-own-adventure book, but the computer is the narrator and slightly sassier. It lets you explore, pick up items, and either escape gloriously or fail hilariously.

AI Prompt:

Write a Python text-based adventure game with an inventory system, random events, and health tracking. Keep the story short, funny, and beginner-friendly.

Functions & Features

  • Player can choose paths (left or right) with different story outcomes
  • Inventory system to collect key items like swords or gems
  • Random events (find food, get injured, discover treasure)
  • Basic health tracking for survival stakes
  • A few different endings, some happy, some… less so

Requirements / Setup

You need at least Python 3 to run this program. You do not need any extra libraries for this!

Minimal Code Sample

python

CopyEdit

inventory = []

health = 100

def random_event():

    import random

    outcome = random.choice([“nothing”, “injury”, “found_food”])

    if outcome == “injury”:

        print(“You got hurt! Be careful out there.”)

This function shows how the game randomly triggers events that change what happens next.

Adventure Game

Notes / Lessons Learned

I think this kind of game is secretly a coding bootcamp wearing a fun costume. You get to mess with if, elif, and else without feeling like you’re grinding through math problems. It’s also a nice reminder that logic can be creative. Now, someone like my husband would power through this game in ten minutes flat and ask, “Where’s the final boss?” So next time, I might go full nostalgia and build one of those endless-choice games I used to lose hours in: more dragons, more traps, more ridiculous death scenes.

Optional Ideas for Expansion

  • Add a save/load system so players can return to their adventure
  • Introduce simple combat mechanics with attack and defense options
  • Create a branching map system that tracks where the player’s been

Scraping Smiles: When Quotes and Jokes Collide

Day 16 of 100 Days Coding Challenge: Python

Back in the day, I used to hunt for quotes like a digital philosopher—scrolling through pages of wisdom, looking for that one line to slap on a journal page or a sticky note. Some days were tough, and nothing hits quite like a well-timed dad joke to lift the spirits. At one point, I even had one of those “joke-a-day” calendars perched on my desk like a tiny comedian in paper form. So today, I figured, why not build my own quote-and-joke fetching machine? Just a little web scraping magic to keep inspiration (and groans) flowing.

Today’s Motivation / Challenge

Today’s project is all about turning the internet into your personal mood board—one quote and one groan-worthy joke at a time. The goal? Learn the basics of web scraping without frying your brain. You’ll send a polite request to a webpage, receive a heap of HTML in return, and pick out the good stuff—like a claw machine that actually works. It’s a small but mighty step into real-world automation.

Purpose of the Code (Object)

This script scrapes quotes from a publicly available website and fetches a dad joke from an API. It prints both to your terminal for an instant dose of motivation and humor. There’s no fancy GUI or app—just simple code that works behind the scenes like a cheerful assistant with a dry sense of humor.

AI Prompt: Make it cleaner

Create a Python script that scrapes quotes from http://quotes.toscrape.com and fetches a random dad joke from https://icanhazdadjoke.com. Display both in the terminal using clean formatting.

Functions & Features

  • Scrapes inspirational quotes and author names from a static website
  • Pulls a random dad joke from an online API
  • Prints both quote and joke to the terminal in a readable format

Requirements / Setup

pip install requests

pip install beautifulsoup4

Python 3.6+ recommended.

Minimal Code Sample

import requests

from bs4 import BeautifulSoup

# Get quote

soup = BeautifulSoup(requests.get(“http://quotes.toscrape.com”).text, “html.parser”)

quote = soup.find(“span”, class_=”text”).get_text()

author = soup.find(“small”, class_=”author”).get_text()

# Get dad joke

joke = requests.get(“https://icanhazdadjoke.com/”, headers={“Accept”: “text/plain”}).text.strip()

print(f”{quote} — {author}”)

print(f”Joke of the Day: {joke}”)

This snippet shows the basic scraping and fetching process in just a few lines.

Dad Joke Fetcher

Notes / Lessons Learned

The program itself was refreshingly simple—point, click, extract. However, once the quote and joke came flying out of the terminal like a stand-up act with no stage, I realized something: terminal text isn’t exactly audience-friendly. It’s like watching Shakespeare on a Post-it note. Formatting matters. Also, working with APIs felt smoother than HTML scraping—less messy, like ordering takeout instead of cooking with whatever’s left in the fridge.

Optional Ideas for Expansion

  • Save daily quotes and jokes to a .txt or .csv file to build your own “Laughspiration” archive
  • Schedule the script to run automatically each morning (with cron or Task Scheduler)
  • Add categories for quotes (e.g., motivational, funny, philosophical) and let users choose

When One Missed Task Knocks Over the Whole Day

Brian’s fitness journal after a brain stroke

Today, I learned—once again—that my schedule is only as intense as its weakest forgotten task.

The first crack appeared when I realized I hadn’t prepared the kombucha bottles on Wednesday. Typically, I fill them with sanitizing solution so they’re ready to rinse on Thursday and usable by Friday. This time? Completely skipped. That meant starting the process today and planning to rinse them after we returned from my sister’s house. Already, the day was improvising without my consent.

Next came the laundry problem. I had also forgotten how being away would collide with my laundry schedule—specifically, sheet-changing day. We do have a second set of sheets, but the matching pillowcases disappeared during one of our last two moves and have never been seen again. That meant the current ones had to be washed, dried, and put back on the bed all in the same day.

No pressure.

After my shower, I started the laundry, timing it carefully in my head and hoping it would finish washing just in time to move everything into the dryer before we left. This was optimistic math.

One thing occupational therapy taught me after my brain injury was how essential time management systems are. Trauma made me more forgetful and shortened my attention span. I can easily lose track of what I’m doing—or what I was about to do.

So, through trial and error, I built a system. I remember one anchor task in the morning and linking everything else to it in a chain. Wake up → medication → breakfast → next task → next task. It works beautifully… until it doesn’t.

Holidays are natural enemies of systems.

I love Thanksgiving. Truly. But it rearranges routines just enough to break everything quietly. I suddenly realized I’d missed a few steps earlier in the week, and now I was paying for it in delayed laundry and bottle logistics.

We had already told my sister we’d be on a specific schedule. The plan was to complete everything before leaving. Reality disagreed. The washing machine still needed ten more minutes when it was time to go, meaning the dryer would have to wait until we returned.

At that point, I could feel the pressure building. Too many tasks were being deferred to “later,” and I knew that meant a busier, more chaotic evening. Still, there wasn’t much choice. The schedule had already gone off the rails—I was just managing the damage now.

Some days, the system wins.
Some days, the holiday wins. Today was clearly the latter—but at least I know why.