2023: Reading Like It’s 1986

Early in elementary school I was not much of a reader. I could read fine, but wasn’t really motivated to read a lot on my own. That changed for me when the family moved [back] to Belgium and I started fifth grade with Ms. Pamay.

Wendy Pamay is one of my favorite teachers of all time. She introduced me to Shakespeare as our class worked on “The Scottish Play”. We sewed frogs. We sewed books. We even sewed frog books. But the thing I remember most about fifth grade was reading. Every week we would fill out a 3×5 card for each book that we had read–along with basic bibliographic information we would also write a few sentences giving a summary of the book. Also, to earn an “A” we were supposed to read 350 pages per week. At first it was hard for me, but by the second half of the school year I was exceeding and sometimes doubling that amount. I had become a reader.

Despite learning to love reading, I didn’t enjoy filling out the 3×5 cards and recording what I read. So once fifth grade ended, I continued being an avid reader, but typically didn’t keep track of what I read beyond my memory.

After I created Better by December I decided that along with tracking things like pushups and situps, that I would also track the books I read. And so, here are the 48 books which I read in 2023 (and the date I finished reading each book):

01/07/23The Priory of the Orange Tree
01/12/23Jade City
01/24/23Jade War
02/02/23The Golden Apples of the Sun
02/13/23Jade Legacy
02/15/23The Reflection on Mount Vitaki
02/19/23The Dream Thief
02/20/23Clockwork Princess
02/26/23The Perfect Perfume and Other Tales
03/03/23Card Sharp Silver
03/09/23Prohibition Orcs
03/12/23Clockwork Heart
04/01/23War of the Worlds: Global Dispatches
04/08/23Shadow Warrior: The CIA Hero of a Hundred Unknown Battles
04/13/23Steampunks and Other Heavy Hitters
04/15/23Fiction River Presents: Sorcery & Steam
05/29/23A Kamigata Anthology: Literature from Japan’s Metropolitan Centers, 1600–1750
06/03/23The Frugal Wizard’s Handbook for Surviving Medieval England (Secret Projects 2)
06/08/23Tress of the Emerald Sea: A Cosmere Novel (Secret Projects 1)
06/19/23The Dark Forest
06/21/23Milky Way Railroad
06/28/23A Shameful Life
07/01/23Doomsday Match (The Dresden Codex Book 1)
07/04/23Yumi and the Nightmare Painter: A Cosmere Novel (Secret Projects Book 3)
07/21/23Death’s End
07/24/23The Funny Business
07/27/23Skeleton in the Closet: A Dragon Business Adventure
07/30/23Eat, Drink, and Be Wary: Satisfying Stories with a Delicious Twist
08/04/23The Nyte Patrol: Book One
08/06/23Lover’s Moon (Canadian Werewolf Book 5)
08/10/23Superhero Portal : An Action-Packed Superhero Origin Story (Dice Ford, Superhero Book 1)
08/12/23Fat Vampire
08/19/23The Magic Touch
08/21/23Behold the Ape
08/24/23The Hole
08/25/23Tales from the Wood: A Modern Fairytale
08/28/23Myths and Magic: A Humorous Fantasy Adventure (The Faerie King Trilogy)
09/04/23A Cat’s Guide to Bonding with Dragons: A Humorous Fantasy Adventure (Dragoncat Book 1)
09/04/23Deadlands: A Novel
09/09/23A Good Running Away (Misplaced Mercenaries Book 1)
09/13/23Just Another Day in Suburbia
09/14/23Nowhere Man
09/20/23Gardens of the Moon: Book One of The Malazan Book of the Fallen
10/07/23Deadhouse Gates: Book Two of The Malazan Book of the Fallen
10/22/23Memories of Ice: Book Three of The Malazan Book of the Fallen
11/11/23D Day: June 6, 1944: The Climactic Battle of World War II
12/02/23House of Chains: Book Four of The Malazan Book of the Fallen
12/18/23Midnight Tides – A Tale of the Malazan Book of the Fallen
Books read in 2023

I don’t have a goal to read any particular number of books. Some books I read have under 200 pages while several had over 1000 pages so I don’t consider the number of books to be too significant. Similarly, I do not track the number of pages since the amount and difficulty of content per page varies significantly between books.

Without recording things on betterbydecember.com, I probably would have guessed I’d read about 30 books over the course of the year, but now, as I did in fifth grade, I’m tracking each book I read. Reading is awesome and I am a reader. Thank you, Ms. Pamay.

Better by December

At the end of 2022 I had scheduled vacation days, but plans fell through and I found myself with extra time to kill. I generally do better when I have something to keep me out of trouble, so I built a web application.

With the new year rapidly approaching I was starting to think about goals that I had for 2023 and how to track them. I again wanted to do 10,000 sit ups and 10,000 pushups over the year. Also, my Wife and I wanted to go on 150 walks together. In addition to goals, I also wanted track other things such as the books I read and the number of days I played guitar. The hope was by doing those things I’d be a better person by the next December.

For those who might be interested in the basic architecture, here’s a summary of the various pieces I built and/or assembled:

  • I have a “december-back” repository on Github (currently the repository is private) which does most of the work for the service. I wrote that in Golang.
  • I have a “december-front” repository on Github (currently the repository is private) which provides the web user interface for the service. I wrote that in JavaScript/TypeScript using React.
  • The “december-front” project is built using npm and the resulting artifacts are stored in an AWS S3 bucket and delivered via Cloudfront.
  • The “december-back” project is packaged into a Docker image and published to a registry via a Github action.
  • Docker containers are spun up in AWS ECS (Elastic Container Service) on Fargate.
  • Route53 on AWS takes care of domain registration for betterbydecember.com and also provides all the DNS goodness and ensures requests are correctly directed to the front or back end.
  • An EC2 Load Application Load Balancer can direct traffic to one of two different regions and also takes care of all the https certificate goodness.
  • All the data is stored in a DataStax Astra database since it’s “a database I want to use“.

The web app is available at https://www.betterbydecember.com/ and anybody can try it out. It’s been over a year since the basic functionality was complete and I started using it to track my progress. I met my 2023 goals and feel like I became Better by December. Now that 2024 is in full swing, I’ve set new goals and am actively working towards becoming Better by December.

Sheveling Like it’s 2024

It’s been a year since I last sheveled so it’s time for my 2024 National Clean Off Your Desk Day sheveling.

Before sheveling

Along with the typical dust, receipts, and miscellaneous bits of paper and trash, I found things such as:

  • An empty box of See’s assorted chocolates
  • 1.5 bags of Ginger Chews (original)
  • Half full box of “Megamix” Mike and Ike candies
  • One-third of a large Toblerone
  • Yellow paper crown
  • Thirteen guitar picks
  • Tin of Trader Joe’s Organic Pastilles Gingermints
  • Cheap combination lock
  • Four juggling bags
  • Doctor Who hat (with white pompom)
  • Tangram set missing one piece
  • Name tag
  • Six chip bag clips
  • Two sets of flashcards (Korean)
  • Rubber locust
  • Assorted paperclips
  • Whistle keychain
  • Seven expired credit and insurance cards
  • Someone else’s keys (that needed to be returned)
  • Program from the Westview performance of “School House Rock Live! JR.”
  • Rubber light-up flower ring
  • Mask (lower face, not my “Man in Black” mask)
  • Two bank statements (now shredded)
  • Ghibli-themed Reversi game
  • Luggage label
  • Effective Java: Third Edition
  • Program from “Westview Band and Choir Present…Sleigh Ride Songs & Deserts”
  • Five snowflake multitools
  • Receipt for my Zamberlan Anabasis Mid GTX Hiking Boots
  • Goodwill tax receipt
  • Notes from a meeting and various numbers/timings as I was measuring performance of a data import task
  • Program from the Westview Choir 2023 Awards Concert
  • Hand-doodled diagrams for an eventing architecture
  • ESP8266 with attached submersible thermometer
  • Kermit the Frog water bottle
  • Old wallet
  • COVID-19 Vaccination Record Card (card was in the same place from when I last sheveled)
  • 75 cents in change
  • Yo-yo string
  • Empty Altoids tin (amazingly only one)
  • Garage door open (was actually expecting to find two–not sure where the other one is…)
  • Bookmark
  • Pointy bit for electronics screwdriver set (since returned to case with other bits)
  • Dice set (including the D10 that I couldn’t find when I last sheveled)
After sheveling

Apparently it’s been six years to the day since I first recognized “National Clean Off Your Desk Day” with My Sheveled Desk. And of course, like every time before, now my office is in dire need of tidying . . .

Not The Jungle

I think Upton Sinclair’s novel is one of the most misunderstood novels. Published in novel form in 1906, it was intended to be a sort of communist manifesto to inspire the working man to band together. Instead, it inspired significant changes in the US meat processing/packing industry. This post is not about The Jungle.

Half a century later, in 1957, Ayn Rand’s novel Atlas Shrugged was published. From a literary perspective, beyond the obvious moral commentary, the writing contains elements of adventure, mystery, romance, and science fiction which makes it tricky to be placed in a bucket with similar. But the underlying message is generally understood.

Atlas Shrugged

To say that Atlas Shrugged is a thinly veiled promotion of capitalism, liberalism, and similar “isms” is being generous in suggesting any sort of subtlety, but that’s not to say that is not an enjoyable read. Like many pieces of literature, Atlas Shrugged can be read in multiple ways, but I think most people read it in one of two ways. First, it can be read as a tract proselytizing the various philosophies, ideals, etc. being exemplified in the text. Alternatively, the reader can skim over the lengthy monologues by the various characters and instead just focus on the engaging narrative. The choice is up to the reader and there isn’t necessarily a “right” way.

As a note of personal history, the specific two-volume set published by Easton Press shown above was acquired as an anniversary present. Similar volumes spotted in a locked cabinet at https://www.powells.com for an exorbitant amount in mid September, it took a few months of online searching (and a failed attempt when received in a less-appealing burgundy binding) to obtain the tomes at a reasonable price.

In my mind, I always compare The Jungle and Atlas Shrugged because there are so many ways they are similar and different. For example, both were trying to promote certain ideologies (albeit very different ones). Both are reasonably well-written and engaging stories. Also, for a long time, paperback copies of both were on the same shelf in my office. But this post is not about The Jungle . . .

More Sheveling

Once again it is the second Monday in January and hence National Clean Off Your Desk Day. Time to shevel, but perhaps my desk isn’t in as bad of shape as years past?

At work today there were a lot of times where I would work for several minutes but then need to wait for a couple minutes while tests or other checks ran. During those breaks I would grab a couple of things off the desk and figure out what to do with them. Here are some of the items I encountered:

  • Two tape measures (in case one is under a stack of stuff when I need it).
  • Empty bag that previously contained peach Jolly Ranchers (the best flavor).
  • Printed Allergen Guide for Buffalo Wild Wings.
  • Two ice scrapers (for car windows).
  • Fitbit charger (for a Fitbit model I haven’t owned in years).
  • Empty bag that previously contained Ginger Chews.
  • Invitation to 2022 Christmas Eve Musical Celebration (it was a nice event, but less-well attended than previous years likely due to the weather). Later on I also encountered the program.
  • Three handkerchiefs (two nicely folded, the other crumpled and it may or may not have been used for its intended purpose).
  • Two garage door openers (this was a surprise as I was expecting to find three–I did eventually locate the third one in the pocket of my biking jacket).
  • A rubber locust.
  • Various notes from work including notes about six people I interviewed (we hired one and he’s great).
  • Page of notes from previous job.
  • Empty, reusable cloth bag that previously contained beef jerky.
  • Ninja brand tabi socks.
  • Tickets to the Portland Choir & Orchestra 2022 Christmas concert (it was a great show).
  • Many receipts. In all they totaled around $4670.
  • Peppermint bark and two candy canes (from circa Christmas 2021).
  • Two not-so-smart light bulbs (one went psycho and just flickers like crazy, the other won’t connect and so just functions as a regular bulb).
  • Three masks and my COVID vaccination card (card was in the same place from when I last sheveled).
  • Goggles.
  • Most of a dice set (cannot find second D10).

My desk looks a lot better. The floor of my office, not so much . . .

Louie or Charlie?

Like many children, I was exposed to Alice and Wonderland and many other fantastical creations of Louis Carroll via book and screen. I found the stories palatable but not among my favorites. It was not until I was a bit older that I began to better appreciate the cleverness behind much of the writing

During my junior year of high school I encountered Gödel, Escher, Bach: an Eternal Golden Braid by Douglas R. Hofstadter. The book interweaves math, art, and music in a study of cognition and, to my delight, alternating chapters were written in a Louis Carroll-ish style using curious creatures engaging in odd activities and conversation to depict various theory. Gödel, Escher, Bach influenced me in a variety of ways, but germane to this post was it made me reevaluate actual Louis Carroll texts.

The next year I wrote my Senior Paper about the logic in the writings of Lewis Carroll. I learned that “Lewis Carroll” was actually a pen name for logician and mathematician Charles Lutwidge Dodgson. Within his various “children’s” stories are representations of and allusions to many different logical concepts and I excitedly delved into different occurrences. The story didn’t matter as much as the concepts behind the story.

Years after that, while studying literature as both an undergrad and graduate student, I revisited some Lewis Carroll texts. This time I was focused on his word usage and structures. Sometimes in invented new words. Sometimes he deliberately misused words. Sometimes he embedded different poetic structures into texts. I generally refrain from diving too deeply into this sort of realm, but nevertheless found that just beneath the layer of silliness was a significant depth.

Originally I thought Lewis Carroll to be a writer for children. Later I thought Charles Dodgson to be representing math and logic. After that I found him to be careful crafter of clever and cryptic composition. Sometimes I wonder if I infer more that was intended by by the author, but perhaps that doesn’t really matter. In the words of Lewis/Charles: “Words mean more than we mean to express when we use them: so a whole book ought to mean a great deal more than the writer meant.”

Getting local address in Go

Awhile ago I had some tests that would spin up a server and then hit some “localhost:8080” endpoints and verify the responses. The tests worked great in my IDE, but when the tests were invoked as a step during a Docker build, they could not find the server. This post is about how I got my tests to run within a Docker container.

There are a variety of ways to get the local address in a Docker container, but many of the solutions I found online involved running one or more command line utilities and I wanted something that “just worked” in Go. After various kicking and swearing (and searching), this is what I came up with:


package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    fmt.Println(getLocalAddress())
}

func getLocalAddress() (string, error) {
    var address string
    _, err := os.Stat("/.dockerenv") // 1
    if err == nil {
        conn, err := net.Dial("udp", "8.8.8.8:80") // 2
        if err != nil {
            return address, err
        }
        defer conn.Close()
        address = conn.LocalAddr().(*net.UDPAddr).IP.String() // 3
    } else {
        address = "localhost" // 4
    }
    return address, nil
}

The above is a complete main.go which can be compiled and ran, but the most important piece is the getLocalAddress() function which returns the local address (or an error if something goes wrong, but I haven’t had problems). Here are some of the key points of the code:

  1. Checking if the “/.dockerenv” file exists is an easy way to check if the code is running in a Docker container.
  2. We create a net.Conn instance
  3. I first tried using
    address = conn.LocalAddr().String()
    to get the local IP address, but it included a port that I didn’t want. Instead of doing string manipulation, I found the returned LocalAddr was a pointer to a net.UDPAddr and so a simple casting provided easy access to the IP.
  4. If not running in Docker, “localhost” is good enough.

And that’s about it. When I have checked, the local IP address of the container has been in the 172.17.0.x range which I believe is a Docker default. Since doing this, there haven’t been any problems running the test, but I’m not sure if this is an industrial strength solution suitable for production environments.

Another Desk Sheveling

I was planning to wait until next National Clean Your Desk Day (10 January 2022), but it had been 16 months since I last did a proper desk “sheveling” and I realized it was time.

As always, it was a bit of an adventure and also a trip down memory lane. Here are some things I found:

  • Weed eater line (now in the shed)
  • New health, dental, and vision insurance cards (insurance changed with the new job–cards now in wallet)
  • Various receipts (now recorded and filed)
  • Covid vaccination card (I knew it was somewhere on the desk)
  • Parts of a microscope from a Saturday Academy gala
  • Two small screwdriver sets
  • A one year anniversary card from Circle (card was from April)
  • 26 pages of notes from my previous job
  • My solution for a Mind Your Decisions problem (I solved it)
  • Various swag from gopuff (my new employer)
  • Instructions for my outdoor grill (a Father’s day present)
  • 9 guitar picks
  • Precision knife set (like x-acto) that I couldn’t find last month
  • Diagrams, rosters, etc. for the fall SWSC Microsoccer Jamboree
  • Plastic Easter egg
  • Small, wooded treasure chest filled with gold and silver candy
  • A :(){:|:&};: mug from a friend at Data Machines
  • Root beer and ginger beer bottle caps
  • R2D2 Happy Meal toy
  • Two Raspberry Pis and an ESP8266

For extra credit I updated the printer firmware.

Dear Circle

Dear Circle,

In thinking back over the past year and a half, I realize that we shared many happy adventures together. I wanted to send you this note to thank you for the great experience and let you know how much I’m going to miss you. This has been the first job I ever had that I was able to explain to my Mother what I did and what you do. Everyone understands the problem we’ve been working together to solve.

You may recall that I joined shortly after COVID became a thing and we were still in lock-down for a “just a couple weeks” to “flatten the curve”. Everyone was friendly as I came on board and was trying to figure out how things worked. A couple weeks later I went to the office for the first time to get a laptop upgrade and I inadvertently set off the alarm–sorry about that.

I think Focus Time was a big step in helping families like mine. My family was probably the first to use Focus Time in a real setting. I remember in the early (prerelease) days when my kids would frantically barge into my office because some random site was blocked and they needed to access it “now” in their class. My family had a lot of discussions about Focus Time and screen time in general–some of those discussions helped Focus Time improve and other discussions helped my family improve.

Do you remember the Release Bonanza on 21 October 2020? We took a risk with that, but we worked hard, planned carefully, and we had a smooth execution. Perhaps it’s not remembered since it ended up almost a non-event, but I’ve always felt that was an important turning point in our doing better cloud releases. I still have the T-Shirt.

And what about the online party on 12 February 2021 where we counted down to 6:00 pm and cheered? I know people had different reasons for celebrating. I was happy that the 10 pm-4 am release windows (who thought that was a good idea?) were finally a thing of the past. That was another important turning point and we were finally able to dedicate more time and energy on important things.

I appreciate how you let me use Innovation Time to experiment and try new things. You were patient with my zany POCs that didn’t go very far (perhaps someone else with finish some of them). We also worked together to make ideas like usage emails and recommendations into features that benefit our users.

I now have an opportunity to try something new and I hope doing that is the right choice for me and my family. I wish you continued growth and success and will be watching your progress as I continue to be a user. I’m going to miss you and all the neat things we’ve done together, but I hope we both continue to do neat things.

Cheers,

Nathan
https://www.linkedin.com/in/nathanbak/
http://www.nathanbak.com/

Breakfast Sandwiches

Upon unwrapping one of my presents last Christmas I found myself still unenlightened as to its purpose. It required further investigation (and reading) to learn that I was now the proud owner of a breakfast sandwich maker. It seemed a novelty of sorts and my initial assessment was that it probably wouldn’t work very well. But in the 10 months since then I think I have used this dumb device to make about half my breakfasts.

My sandwich maker doesn’t have any buttons or switches. I plug it in to turn it on and unplug it to turn it off. When it is on (plugged in) an orange light illuminates . A second light (this one green) lights up when it is preheated. There is no screen, Bluetooth connectivity, no settings, no app. It’s the right level of complexity for me when I may not yet be fully awake.

The actual usage of it is as follows:

  1. Plug in sandwich maker
  2. Wait for green “Preheat” light
  3. Put half and English muffin, a slice of cheese, and some ham or sausage in the bottom ring
  4. Crack an egg in the top ring and top with the other half of the English muffin
  5. Wait for five minutes (I have Alexa keep track for me)
  6. Unplug sandwich maker
  7. Slide out disc that separates top and bottom rings
  8. Flip up rings
  9. Slide breakfast sandwich onto plate

So why do I like this dumb device? It makes breakfast easy for me. I could make something similar without the minor appliance, but it would take longer. Cleanup is easy–about once a week the rings section goes in the dishwasher and the other part gets wiped down. A quick spray of avocado oil after cleaning keeps the eggs from sticking.

There are so many high-tech kitchen appliances out there now that do all the things: digital air fryers, sous vide gadgets, Instapots, etc. My breakfast sandwich maker only really does one thing, but that thing happens to be what I often want for breakfast.