A Skunk Alarm Clock and My Fastest Start to a New Year

Brian’s fitness journal after a brain stroke

My New Year didn’t start with an alarm clock—it started with a skunk alert.

About an hour earlier than I planned to wake, my wife called me to open the garage door so she could get back into the house after her morning walk. Apparently, she’d spotted a skunk casually loitering near our front porch and decided that direct negotiation was not the safest strategy.

Reasonable.

She’d just returned from her morning exercise, and it was still dark outside. When I turned on the porch light, the skunk immediately fled—clearly not interested in confrontation or homeownership. Crisis resolved. Sleep, however, was not.

Being awake an hour early left me groggy and disoriented, but I did my best to reset into my normal routine. Eventually, I laced up and headed out for my run.

And then something unexpected happened.

The first quarter kilometer felt fast—suspiciously fast. I checked my pace and realized I was already about 30 seconds ahead of my target. Concerned I might burn out early, I shifted focus to simply maintaining speed instead of chasing numbers.

By the end of the first kilometer, I was over a minute ahead of my target pace.

At the two-kilometer mark, my average pace had dropped below 8 minutes per kilometer. That’s the kind of number that starts doing dangerous things to your optimism. If I could hold it for another three kilometers, I’d set a new personal best and potentially smash my end-of-year goal on the first run of the year.

That part felt slightly unreal.

I couldn’t quite maintain that pace through the final kilometer and drifted back above 8 minutes per kilometer—but it didn’t matter. I still set a new personal best and ran significantly faster than my previous run on Wednesday.

More importantly, it confirmed something:
If I just keep doing what I’m doing, my goal is absolutely reachable.

I only need to shave 22 seconds off my pace to hit sub-9 minutes per kilometer.

That’s not magic.
That’s consistency.

For a year that began with a skunk encounter and a disrupted sleep cycle, it turned into a surprisingly perfect first run. Strong, fast, confident, and full of momentum.

Not a bad way to start a new year at all.

Now Showing: The Price is (Almost) Right

Day 58 of 100 Days Coding Challenge: Python

Today, I finally unlocked the magic of seeing live stock prices for the companies I’ve been tracking. I activated the virtual environment I had so carefully crafted for this project—like slipping into a freshly pressed lab coat—and copied my previous file to create the next version. This has become my ritual. I don’t trust myself enough to overwrite yesterday’s work. I’ve learned the hard way: one misstep, and suddenly you’re debugging into the void at midnight.

But this time, everything felt smoother. More methodical. Like my stock tracker finally got itself a LinkedIn profile and a morning routine. I added the new function and, for the first time, watched real prices pop up for the stocks I entered. It was like watching your kid take their first steps… except your kid is Apple and it’s walking straight into your fantasy portfolio.

Today’s Motivation / Challenge


Sure, it’s fun to say you’re tracking stocks—but it’s even better to see what they’re actually worth. Today’s goal was to bring those tickers to life with live price data. It’s like turning a guest list into a party: you know who’s there, but now you see what they’re wearing. A clean interface that pulls prices makes the tracker feel real—and a lot more useful than a plain list of letters.

Purpose of the Code (Object)


This update adds a function that displays all currently tracked stocks alongside their latest prices pulled from Yahoo Finance. It keeps things simple and readable, so users can check their “portfolio” at a glance without needing to log into a brokerage or scroll through a financial website.

AI Prompt:

Add a function to a Python script that displays all stock symbols in a list along with their current market prices using the yfinance library.

Functions & Features

  • Add stock symbols
  • Remove stock symbols
  • Show tracked symbols
  • View current stock prices
  • Exit the program (option 99, always last)

Requirements / Setup

pip install yfinance

You’ll also need Python 3.8+ and a virtual environment (optional but recommended).

Minimal Code Sample

import yfinance as yf

def view_portfolio():

    for symbol in load_stocks():

        price = yf.Ticker(symbol).info.get(‘regularMarketPrice’)

        print(f”{symbol}: ${price:.2f}” if price else f”{symbol}: Price unavailable”)

Fetches and displays each stock’s latest price using Yahoo Finance.

Stock Tracker

Notes / Lessons Learned


For this feature, I added the yfinance library and made sure to import it up top with the rest of the code crew. I also handled the situation where your portfolio might be empty—no one likes being told they have nothing, but it’s better than a crash. Thankfully, all the stocks I added yesterday were valid, so prices rolled in smoothly like a stock market ticker parade.

The function pulls from regularMarketPrice, which seems to be the most consistent for daily price checks. There were no errors, no false alarms, and no imaginary companies to spoil the moment. Just sweet, sweet confirmation that this tracker is starting to walk, maybe even jog.

Optional Ideas for Expansion

  • Show daily percentage change or price movement alongside current price
  • Highlight gains and losses in green/red
  • Let users refresh prices without restarting the script

Day 58 marks the moment this project stopped being theoretical. It’s starting to feel real—and I’m here for it.

Name It and Claim It: Deleting Stocks and Wrestling Filenames

Day 57 of 100 Days Coding Challenge: Python

Yesterday, I made a small typo when entering a stock symbol—just one little slip of the keyboard, and suddenly I’m the proud owner of a fictional stock ticker. Unfortunately, the program didn’t come with an “oops” button, so today’s goal was obvious: build a function that lets me delete stock symbols from my list before my portfolio starts sounding like a toddler named it.

While I was at it, I got curious about filenames. You see, in the past, I’ve gone a bit wild with my naming convention—stuff like Book_Tracker_v2.py, final_final_please_work.py, or the classic version3_newest_final_backup2.py. This time, I wanted to test a more polished approach. I tried naming my file stock_tracker v1.1.py, thinking it looked quite professional. Spoiler alert: Python did not agree. Turns out, spaces in filenames are like pineapple on pizza—technically possible, but likely to cause arguments and strange behavior. Thankfully, stock_tracker_v1.1.py worked like a charm. I even read online that while dashes (-) are allowed, underscores (_) are generally the safer bet, especially if you want to avoid those sneaky bugs that only show up on Tuesdays after coffee.

Today’s Motivation / Challenge

Stock lists, like closets, need regular cleaning. If you accidentally track “TSLAA” instead of “TSLA,” your code won’t yell at you—but your future self will. Today’s challenge was all about giving the user (ahem, me) the power to tidy up their tracked stocks without digging through JSON files manually. It’s about building habits—and menus—that you can live with.

Purpose of the Code (Object)

This code lets you remove any stock symbol you’ve previously added. You just type the ticker you no longer want, and poof—it’s gone from the list. No editing files, no drama. The script also includes the option to view your list or exit gracefully (with a nod of thanks).

AI Prompt:

Write a Python program that allows users to delete a stock symbol from a JSON-based watchlist. The program should prevent duplicates, validate user input, and display a clean menu.

Functions & Features

  • Add new stock symbols to your list
  • View all currently tracked stocks
  • Remove a stock symbol by name
  • Quit the program (option 99, always last)

Requirements / Setup

Python 3.8 or higher

No additional libraries are needed. If you’re starting from scratch, create a virtual environment:

python -m venv venv

source venv/bin/activate  # macOS/Linux

venv\Scripts\activate     # Windows

Minimal Code Sample

def remove_stock(symbol):

    symbol = symbol.upper()

    stocks = load_stocks()

    if symbol in stocks:

        stocks.remove(symbol)

        save_stocks(stocks)

Removes a stock from your tracked list if it exists.

Stock Tracker

Notes / Lessons Learned

The trusty “Exit” option is still holding strong at number 99—right where it belongs. Tucking it at the bottom of the menu means no more accidental goodbyes when all I meant to do was clean up a typo. It’s like the emergency exit: always there, but hopefully not pressed by mistake.

Now, about filenames. I had this grand idea to name my script stock_tracker v1.1.py—you know, a classy versioning system worthy of a Silicon Valley pitch deck. Python, however, wasn’t impressed. Turns out, putting spaces in filenames is a little like trying to run a sprint in flip-flops. Technically doable. Practically… a terrible idea. After a few errors and some Googling, I landed on stock_tracker_v1_1.py, which behaved much better. Pro tip: underscores are your friends, hyphens are moody, and spaces are just asking for trouble.

Oh, and that rogue stock symbol I entered yesterday? Gone. Deleted. Justice served.

Optional Ideas for Expansion

  • Confirm before deleting a stock (a simple “Are you sure?” prompt)
  • Add auto-complete for stock symbols already in the list
  • Show a “last modified” timestamp next to each symbol

Starting the Year Strong—with New Year Fitness Goal, Planks, Plans, and Yard Work

Brian’s fitness journal after a brain stroke

Happy New Year!

Looking back over the past year, I’m genuinely pleased with how things turned out. I ran just over 1,200 kilometers, lowered my average pace, and increased my strength training. As a small but satisfying punctuation mark, I completed a three-minute plank on my first attempt today—an achievement my abdominal muscles are already protesting and will likely escalate tomorrow.

I can’t gain muscle quickly, and I never will. With my kidney condition, protein intake has limits, so everything becomes a balancing act: how hard I train versus how much my body can reasonably rebuild. Still, consistency counts. Despite the constraints, my muscle mass percentage remains high, which feels like a quiet victory earned through patience rather than force.

I’ve already started working on my New Year Fitness Goal. New year, clean sheets—literally and figuratively. I spent time around the house updating spreadsheets, refining routines, and mentally shifting into the next phase. My wife was home today because of the holiday, though “home” is a relative term—she was busy all day, as usual, and woke up early like it was any normal workday. My wife, by the way, does not make new year fitness goal or any goals. Instead, she adjusts her goals daily, weekly, and monthly.

Neither of us fluctuates much with our schedules. We go to bed and wake up around the same times every day. Occasionally, I sleep in when I’m especially exhausted, but it’s rare. My wife usually wakes up about thirty minutes before schedule—without an alarm. She doesn’t like being woken during REM sleep. Even when she’s sick or taking medication, the variation is only about 30 to 45 minutes. Consistency is her default setting.

Leaf Collection On January 1st!

Today wasn’t just about reflection and planning, though. There was also one final seasonal obligation: leaf collection.

One stubborn tree had refused to drop its leaves even as temperatures fell. Finally, after the last major windstorm, it gave up and scattered its leaves everywhere. Some were blown away, but enough remained to justify one final cleanup.

After finishing my morning routine, I headed out and completed what should be the last leaf collection of the season. Our trees are now completely bare, and most of the neighbors have already cleared their yards, so accumulation should be minimal from here on out.

That means until spring arrives, my Tuesdays and Thursdays just got a little emptier.

I might even find another small project to fill the gap—at least until mowing season inevitably returns. For now, though, the year has started exactly the way I hoped:
steady, intentional, and quietly productive.

Stocks, Aristotle, and Other Risky Investments

Day 56 of 100 Days Coding Challenge: Python

Introduction to DIY Portfolio: A Python-Powered Stock Tracker (Day 56-Day75)

I’ve always had a curious relationship with investing. Back in my early twenties—just when online trading was beginning to sparkle with possibility—E*TRADE was running flashy stock-simulation competitions. I never had the nerve to join in, but the idea of tracking trades fascinated me. While others were glued to leaderboards, I was quietly watching market psychology unfold.

In one of my marketing classes, we studied consumer behavior, and I couldn’t help noticing the parallel. Stocks, like shoppers, are swayed by emotion. A bad headline sparks panic selling; a glowing report sends buyers rushing in. It was less about the spreadsheets and more about human nature in motion.

That said, I am no day trader. With a full-time job, I simply don’t have the bandwidth—or appetite—to chase tickers every second. Early on, I learned the hard truth: betting heavily on a single stock feels thrilling right up until it doesn’t. So I shifted to a disciplined rhythm. First, parking cash in money markets weekly, then funneling it into chosen investments. Eventually, I swapped most individual stocks for ETFs, which let me hedge my bets without needing caffeine-fueled midnight monitoring.

This is where my stock tracker comes in. It isn’t just a neat dashboard—it’s a sanity check. How much should live in bonds? How much in equities? The tracker keeps me honest, reminding me that a balanced pie chart beats chasing shiny objects.

Unlike my earlier Book Tracker project—where I bolted on features haphazardly and ended up cleaning a digital junk drawer—this time I built with a vision. The bigger the project, the less forgiving chaos becomes. Structure first, spaghetti later (preferably with marinara, not code).

What surprised me most was not the tracker itself but the realization of just how powerful Python can be. With a few libraries and some determination, I had built something that, in the past, I would have had to pay for—except now it’s tailored exactly to me. A personalized financial sidekick, minus the subscription fee.

Experience

Today marks the thrilling kickoff of a brand-new project: a stock tracking system. That’s right—I’m building a little Wall Street in my terminal. This time, I’ve sworn an oath to the ghost of Aristotle not to wing it. Last time, when I built a book tracker, I skipped the whole “final cause” thing—you know, the actual goal—and ended up redesigning everything from the menu to the data structure while muttering like a sleep-deprived philosopher. It was less “Eureka!” and more “Why did I do this to myself?” But not today. Today, I have a plan. A real roadmap. With arrows and everything. Step one? Get a stock symbol into the system without accidentally starting a recession.

Today’s Motivation / Challenge

We all want to be savvy investors, right? Or at least know what “diversification” means without Googling it every week. Today’s project is the first brick in a 20-day tower of financial wisdom—well, mock financial wisdom. We’re not handling real money here (unless you count emotional investment). The goal is simple: give users a way to start tracking the stocks they care about. It’s the tech equivalent of sticking Post-its on your fridge, but smarter—and less sticky.

Purpose of the Code (Object)

This tiny program lets you add stock symbols you want to track. It stores them in a JSON file so you don’t lose them the moment you close the terminal. It also shows you your current list, so you can admire how financially responsible you look. No actual money involved—yet.

AI Prompt:

Write a Python program that allows users to input and store multiple stock symbols, display them, and save the list in a JSON file. Make it beginner-friendly.

Functions & Features

  • Add a stock symbol to your personal watchlist
  • Display your current stock list
  • Save everything to a JSON file for future sessions
  • Quit the program using a menu option (helpfully numbered 99)

Requirements / Setup

Python 3.8 or higher

No external libraries required (yet). If you’re starting fresh, set up a virtual environment like this:

python -m venv venv

source venv/bin/activate  # On macOS/Linux

venv\Scripts\activate     # On Windows

Minimal Code Sample

def add_stock(symbol):

    symbol = symbol.upper()

    stocks = load_stocks()

    if symbol not in stocks:

        stocks.append(symbol)

        save_stocks(stocks)

Adds a new stock symbol to the list and saves it—simple, clean, effective.

Stock Tracker

Notes / Lessons Learned

I meant to start this two or three weeks ago, but I blinked and suddenly forgot how to create a virtual environment. My brain filed it somewhere between “how to fold a fitted sheet” and “useful Latin phrases.” After some desperate Googling, I finally got it working and documented it—this time for real. No more fumbling with pip and hoping for the best.

Since I want my little tracker to actually remember the stocks I add, I set it up to save everything in a JSON file. I also made the menu option to quit the program number 99. Why? Because it looks dramatic, and it guarantees it’ll always show up at the end of the menu. Will this strategy work? Unclear. Will I pretend I did it on purpose even if it doesn’t? Absolutely.

I enthusiastically added all the stock tickers I wanted to follow… and of course, I immediately typed one in wrong. Which means tomorrow’s task is obvious: build a delete function so I can pretend that the mistake never happened.

Optional Ideas for Expansion

  • Let users add a nickname or note next to each stock (e.g., “my retirement bet”)
  • Validate stock symbols against a real financial API to catch typos early
  • Add timestamps to track when each stock was added

How I Made My Python Book Tracker Fully Customizable

Day 55 of 100 Days Coding Challenge: Python

Once upon a time—okay, a few days ago—I had my genre-color pairings carved in digital stone. Tucked inside a function like a squirrel’s hoard of acorns, the genres and their matching hues were hard-coded, like:

“Historical Fiction”: “sienna”,

“Fiction”: “gray”,

“Memoir”: “lightcoral”,

You get the idea.

Back then, it felt efficient. But let’s be honest: it was as user-friendly as a brick in a gift box. So I set out to give my humble book tracker a glow-up. I added functionality to let users add their own genres, pick colors from a GUI color chooser, save them in a JSON file, and even reorder or delete genres if needed. No more pre-determined palettes—now users can start with a clean slate.

With all those new powers in place, it became clear: the old load_genre_colors() hardcoded fallback was now the fossil in the room. So I yanked it out and simplified the codebase. And just to test it, I cleared out most of my book log entries too—leaving only a lean trio: Fantasy, Science Fiction, and Romance. The result? A slicker, cleaner, beginner-friendly tool. And no more assumptions about people loving “lightcoral.”

Today’s Motivation / Challenge

Today’s challenge was about trust. Not between people—but between me and my code. I wanted to trust my users enough to let them decide what genres they care about and what colors they want. The control panel is theirs now. My job? Just to make sure the wires behind the scenes don’t catch fire.

This was also a step toward user-friendliness. The kind that makes someone say, “Hey, I could actually use this!” rather than “What on earth is ‘slateblue’?”

Purpose of the Code (Object)

This program is a customizable book tracker. It lets users log what they read, track their reading progress over time, and visualize it through colorful charts. It also gives them complete control over how genres are defined and displayed—no default lists, no assumptions.

AI Prompt:

“Can I remove the hardcoded genre-color mapping and just let the user build their own?”

Yes. And I did.

Functions & Features

  • Add, edit, or delete book entries
  • Define custom genres and pick colors for each
  • Save genre-color preferences in a JSON file
  • View genre breakdowns via pie or bar charts
  • Reorder genre list and edit mappings interactively

Requirements / Setup

Install the essentials:

pip install pandas matplotlib

If using the color picker:

pip install tk

Tested with Python 3.10+

Minimal Code Sample

genre_color_dict = {

    ‘Fantasy’: ‘purple’,

    ‘Science Fiction’: ‘blue’,

    ‘Romance’: ‘red’

}

This is where your genre-color story begins—users can expand it from here.

Book Tracker App

Notes / Lessons Learned

Actually, for the first time in this series, I wrestled with my own AI prompt. You see, the chat history had gotten so long (we’ve been working on this file for over two weeks) that when I asked to “remove the hardcoded section,” it started offering way too much interpretation—like a method actor who wouldn’t stop improvising.

Eventually, I had to open a fresh chat in the same project folder and restate everything clearly. That’s when it hit me: AI is powerful, but not psychic. It only knows what you tell it. If you’re not precise with your wording, it’ll do what it thinks you mean, not what you actually mean.

Just like coding, AI prompting is a language of its own. Respect it. Be clear. And maybe don’t expect it to read your mind… yet.

Optional Ideas for Expansion

  • Add a “preview” button to visualize the genre-color palette before saving it
  • Let users export their reading stats as an image or PDF report
  • Build a tag system so one book can belong to multiple genres (for the indecisive types)

Let’s be honest, even Tolkien would’ve struggled choosing between “Fantasy” and “Adventure.”

Ending the Year Shaking, Sweating, and Still Standing

Brian’s fitness journal after a brain stroke

Being the very last day of the year, I decided it was now or never.

I added a few extra seconds to my planking session and went for my first three-minute plank. I’d been hoping to reach this milestone before the year ended, and since calendars are unforgiving, today was my final chance.

It took three attempts.

On the third try, I summoned every ounce of stubbornness I possess and held on through the shaking, bargaining, and quiet questioning of my life choices. But I made it. Three minutes. Done.

It’s strange how quickly a year disappears when you look back at it. Somehow, I managed to achieve all the goals I set for myself this year. Tomorrow, the slate resets—but today, I’m allowing myself to acknowledge that effort matters.

Feeling fairly triumphant, I headed out for my run, hoping to double the celebration by matching my target pace. That didn’t quite happen. Still, I achieved a sub-9-minute-per-kilometer pace, which was my primary running goal for the year. That counts.

My wife and I both set goals—but in very different ways.

I tend to set yearly goals, supported by smaller milestones that I adjust as needed. Physical progress isn’t linear. Sometimes you move forward, sometimes you stall, and sometimes you need to force a milestone just to see what’s possible.

My wife doesn’t really think in years. She thinks in decades.

Her goal is simple and ambitious: at 80, she still wants to enjoy moving her body. From there, she works backward—long-term vision, then mid-term goals (three to seven years), then short-term ones. She says that after 50, you really have to focus on the next zero to three years, because anything can happen. We share the same personality type—INTJ—but her timeline makes mine look impatient.

Still, I’m satisfied.

This Friday, I’ll begin a new year-long quest: shaving another minute off my pace. It will be hard. Possibly frustrating. But as long as I’m making progress, I’ll be content—even if I don’t fully succeed.

And if I don’t? I’ll try again next year.

What’s remarkable is that my slowest runs over the past couple of weeks would have ranked among my fastest runs at this time last year. Progress has happened, even when it didn’t feel dramatic.

So I’ll end the year the same way I lived it:

  • a little stubborn
  • a little reflective
  • and still moving forward

Taming the Menu Beast: When Order Matters More Than Code

Day 54 of 100 Days Coding Challenge: Python

I’ve been dancing with this project for over two weeks now. And you know what? When your project involves books—the thing you’re borderline obsessed with—you start fussing over the little things. Like menus. Yes, menus.

Today was the day I finally tackled something that had been silently bothering me: the out-of-whack order of the main menu. I had “Exit” sitting at #7 like it owned the place, while other features awkwardly piled up from 8 to 12. Not exactly elegant. So I did what any self-respecting, slightly neurotic book tracker would do—I cleaned house.

I reorganized the main menu to follow a more logical and satisfying sequence. Something clean, orderly, and sometimes won’t drive future-me (or any poor GitHub visitor) up the wall.

Here’s the new lineup, alphabet soup no more:

  1. Add a book
  2. Edit or delete a book
  3. Show all books
  4. Import from CSV
  5. Show overall reading graph
  6. Show genre summary chart (Pie or Bar)
  7. Show filtered chart by year and quarter
  8. Show average pages per genre per quarter
  9. Add a new genre and color
  10. Rename or delete a genre
  11. Reorder genre list manually
  12. Exit

Take that, chaos.

Today’s Motivation / Challenge

The real motivation? Sanity—and a sprinkle of future-proofing. I want to post this project on GitHub when it’s done, and I figured any stranger poking around deserves a user-friendly menu. Think of it like alphabetizing your spice rack: not necessary, but undeniably satisfying.

Also, adding new functions is becoming easier. Which means cleaning up after myself is now the least I can do.

Purpose of the Code (Object)

This script tracks the books you’ve read and turns them into beautiful visual summaries. From adding titles to generating colorful graphs, it’s designed to help readers stay organized, reflect on their reading habits, and play with genre data like it’s LEGO.

Today’s focus? Making the main menu feel like a polished app, not a last-minute potluck.

AI Prompt:

“Reorder the menu options and update the corresponding elif statements so the user sees a more intuitive and logically grouped main menu.”

Functions & Features

  • Add, edit, or delete book entries
  • Import a list of books from a CSV
  • Display all books in a clean format
  • Visualize reading progress with graphs
  • Analyze reading trends by genre and quarter
  • Manage genres with custom colors and order

Requirements / Setup

pip install matplotlib

pip install pandas

tkinter (comes pre-installed with Python)

Tested with Python 3.10+

Minimal Code Sample

print(“12. Exit”)

elif choice == “12”:

    print(“Goodbye!”)

    break

Just update the number and make sure the function still points to the right feature. Think of it like updating the index in your table of contents—crucial if you don’t want your reader flipping to the wrong page.

Book Tracker

Notes / Lessons Learned

Basically, what you need to do is reassign the menu numbers in the order you want. Then, carefully adjust each elif block to reflect the new structure.

I had:

elif choice == “7”:

    print(“Goodbye!”)

    break

Now I want:

elif choice == “12”:

    print(“Goodbye!”)

    break

The actual task wasn’t hard. The challenge was not falling into a logic trap—accidentally assigning two features to the same number or skipping one entirely. I highly recommend using AI or a numbered to-do list when reordering more than a few options. Saves brain cells.

It’s funny how a simple reorder can make the whole project feel more finished, more elegant—even if no code logic changes at all.

Optional Ideas for Expansion

  • Let users “star” favorite genres for quick filtering
  • Add keyboard shortcuts for power users
  • Enable saving custom menu layouts as presets

The Librarian Strikes Back: Renaming and Deleting with Style

Day 53 of 100 Days Coding Challenge: Python

We’re rounding the final bend on this book tracker project, and like any good road trip, it’s time to clean out the car before showing it off. Yesterday, I had an itch to tidy up the main menu—it had the organizational charm of a sock drawer after laundry day. It wouldn’t matter much if I were the only one using this program, but I plan to upload it to GitHub. And if you’re going to invite guests into your house, you should at least sweep the floor.

But before I rolled up my sleeves to alphabetize those menu options, I realized one last function was missing: editing or deleting a book from the log. Imagine proudly logging “The Wind in the Pillars” instead of “The Wind in the Willows,” and having no way to fix it. I knew I had to patch that hole. Mistakes happen—we’re human, and sometimes our fingers think faster than our brains.

This new function feels like the final polish on a well-loved tool, the last screw tightened before the machine hums just right.

Today’s Motivation / Challenge

Let’s face it: no book tracking tool is complete if you can’t fix a typo or remove that self-help book you never actually finished (and don’t want to admit you bought). Editing and deleting books makes your log feel more like a digital journal and less like a permanent tattoo. Today’s challenge was about giving myself—and any future users—permission to change their minds.

Purpose of the Code (Object)

This feature adds a small but mighty update to the book tracker: the ability to edit or delete entries in your reading log. It helps you clean up titles, fix authors, update genres, or just delete a book altogether if you never finished it (no judgment). It’s all about control—because even logs deserve second chances.

Functions & Features

  • View a list of all books in your log with entry numbers
  • Edit any detail of a selected book (or leave it unchanged)
  • Delete a book entirely if it was added by mistake
  • Automatically save updates to your CSV log file

Requirements / Setup

pip install pandas

You’ll also need:

  • Python 3.8 or higher
  • A CSV file named book_log.csv in the same folder (or let the script create one)

Minimal Code Sample

df = pd.read_csv(FILE_NAME)

for idx, row in df.iterrows():

    print(f”{idx+1}. {row[‘Title’]} by {row[‘Author’]}”)

choice = int(input(“Choose a book to edit or delete: “)) – 1

This snippet prints a numbered list of books and lets the user choose one to modify.

Book Tracker

Notes / Lessons Learned

Adding new features is getting easier—finally! The hardest part this time wasn’t writing the logic; it was making the user interface feel smooth and forgiving. I had to read through my own book log like a detective, catch typos, and trace the moment a “Memoir” turned into “Memor.” It turns out, the edit function is not just about fixing mistakes. It’s about telling your story the way you meant to tell it.

At one point, I found a mismatch between my Notion log and the CSV file this script uses. That’s when I decided: I’ll start fresh—clean log, clean menu, clean conscience.

Optional Ideas for Expansion

  • Add a search function so you can find books by keyword before editing.
  • Include a confirmation screen to preview changes before saving.
  • Show book stats (like total pages read) after edits are made.

Nashville Weather Changes: Spring Yesterday, Winter Today

Brian’s fitness journal after a brain stroke

True to the forecast, the temperature dropped 40 degrees since yesterday. This is classic Nashville behavior. Our weather doesn’t transition—it teleports. One day you’re contemplating spring allergies, the next you’re questioning your glove choices.

Just yesterday, it felt so warm that we spotted early spring flowers on the trees. My wife’s allergies immediately noticed. Apparently, pollen doesn’t wait for official permission. Spring showed up briefly, caused chaos, and left.

The shift happened fast. It stayed warm through the evening, but around 10 p.m., the wind started howling like it had a personal vendetta. The temperature plunged, and for a while, I was mildly concerned about losing electricity. My wife, meanwhile, slept soundly through it all—completely unaware of the weather drama unfolding outside.

To be fair, she had already checked today’s temperature before bed. She always does. Her running clothes are selected and staged based on the forecast, prepared calmly in advance like a seasoned field commander.

This morning, I waited for the day to reach its warmest point—which was still just below freezing—then reluctantly pulled on my gloves and headed out for my run. I was annoyed, but annoyance is practically a Tennessee weather survival skill.

Sometime overnight, a large branch snapped off a tree behind our house. I’m fairly certain I heard it crack. The tree itself survived, thankfully—it chose to sacrifice an arm rather than topple over onto our deck or house. Strategic, if unfortunate.

In the daylight, the damage was clear. The tree lost its largest limb and now looks thoroughly defeated. It was already struggling against neighboring trees, and since the one next to it fell last year, the ground may be too disturbed for it to stay upright much longer. This is likely a conversation I’ll need to have with my wife later.

On a brighter note, her Christmas present finally arrived today. I wrapped it up so it’ll be ready when she gets home—a small victory amid the wind, cold, and fallen branches.

So yes:
  • Yesterday: spring
  • Today: winter
  • Tomorrow: who knows

That’s Nashville. And somehow, we keep running anyway.