2025 Hugo Finalists: Someone You Can Build a Nest In

Posted on 18 April 2025 in Literature • Tagged with books, hugo, reading, sci-fi

This post is part of the series, Reading the 2025 Hugo Finalists for Best Novel, where I am reading through all the 2025 Hugo Award Finalists for best novel.

Someone You Can Build a Nest In by John Wiswell deals with themes that most other Hugo winners I have read do not (or do little): dependence, pain, family, parenting, "otherness", self. It is a challenging read, yet has some good dark humor and a lot of action and adventure packed in.

The opening paragraphs set up the world of the novel splendidly and makes one eager to read more (quickly, in my case). From her very birth, in memory, of Shesheshen to her hibernation and immediate peril there is action and interest in her experiences -- I felt on "her side" right away and carried that relationship through the whole novel.


Continue reading

Reading the 2025 Hugo Finalists for Best Novel

Posted on 18 April 2025 in Literature • Tagged with books, hugo, reading, sci-fi

Having finished reading through the past 71 years of Hugo award winners and with the 2025 Hugo Award finalists announced, I'm planning to spend the next few months reading through the best novel finalists so I can vote on the winners.

I won't be writing "reviews" of the novels by any means. I will simply be capturing my opinions about each one so I can think about them as a whole during voting. I hope to keep this up year-to-year as I am a somewhat slow reader and I can't even imagine trying to follow more novels over the course of the year in order to actually nominate something.

Reading in no particular order (just whenever I can get them from the library!):


Continue reading

Reading 71 Years of Hugo Award Winners

Posted on 17 April 2025 in Literature • Tagged with books, hugo, reading, sci-fi

Sometime back in May 2019 I started reading award winners of the Hugo award for best novel in chronological order starting with the first novel awarded (from 1953).

I regret not taking more time to document the process. I don't even recall how I decided to follow the list. I just needed something to help me to decide what to read at all. May 2019 is my best estimate based on exchange I had with my wife on Telegram in early June about Ben Reich from The Demolished Man. Beyond that, I have kept only minimal "ratings" of the books and whatever stuck with me through 5+ years.

I finished up just in time for the announcement of the 2025 Hugo award finalists so now I'm going to take the time to read all the nominees for the year and try to do a better job documenting my thoughts.

Here are some short thoughts and recollections from all that reading (not reviews by any means!).


Continue reading

Pipenv to UV

Posted on 12 April 2025 in Technology • Tagged with pip, pipenv, python, uv

I have been (mostly) happily using Pipenv for many years now on all of my Python projects. Recently, I heard about UV so I'm giving it a try with the very small set of Python dependencies used for this blog.


Continue reading

Ubuntu on a Macbook Pro Mid 2019 (MacBookPro15,1)

Posted on 15 February 2022 in Technology • Tagged with apple, linux

Apple's T2 Security Chip gets itself in the way as much as possible when attempting to install Linux on a Mid 2019 Macbook Pro and a lot of the available documentation for Linux-on-the-mac online is pre-T2. After quite a bit of back and forth and eventually finding the right resources I managed to get Ubuntu installed on my MacBook Pro with everything working... except the microphone.


Continue reading

Back to PHP

Posted on 11 August 2018 in Asides • Tagged with drupal, php

A few months back I started a new job with a much greater focus on development work over IT systems management. Unfortunately this has led to a pretty big drop off in amount of time spent on personal side projects, but happily my new employer is fully supportive of open source and I am able to release much of what I work on to the wider community.


Continue reading

Pip, Pis, Pandas and Wheels

Posted on 07 May 2018 in Technology • Tagged with arm, baby buddy, pip, pipenv, python, raspberry pi, troubleshooting

A user attempting to install Baby Buddy submitted an interesting issue with the following error during the pipenv install process:

THESE PACKAGES DO NOT MATCH THE HASHES FROM Pipfile.lock!. If you have updated the package versions, please update the hashes. Otherwise, examine the package contents carefully; someone may have tampered with them.
    docopt==0.6.2 from https://www.piwheels.org/simple/docopt/docopt-0.6.2-py2.py3-none-any.whl#sha256=0340515c74203895f92f87702896e45424bf51dc71bf15b4748450f50be04346 (from -r /tmp/pipenv-vf5_eub9-requirements/pipenv-k7_dvsro-requirement.txt (line 1)):
        Expected sha256 49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491
             Got        0340515c74203895f92f87702896e45424bf51dc71bf15b4748450f50be04346

Hash checking and Pipfile.lock are a part of the pipenv toolchain and meant to verify the integrity of packages being installed. Committing the lock file is recommended practice and generally something I have not had many problems with. There are some old tickets on GitHub reporting issues with this hashing between operating systems, but the latest versions of pipenv supposedly do not have these problems.

Why is this user getting a hash match error? I had a Pi lying around, so I decided to try replicating the issue. Many hours later, I got Baby Buddy up and running on my (second) Pi and learned a lot about the Python packaging process and how it can go wrong on ARM devices.


Continue reading

Advent of Code 2017: Days 16 - 20

Posted on 20 December 2017 in Technology • Tagged with advent of code, python

This post is part of the series, Advent of Code 2017, where I work my way through (part of) the 2017 Advent of Code challenges in order to re-learn some of the basics of Python and reflect on some simple concepts and functionality. All my challenge code is available in cdubz/advent-of-code-2017 on GitHub.

Day 16: One Billion Permutations in 0.535 Seconds

Ok, not really (: This challenge involved making specific modifications to a list 1,000,000,000 (one billion) times. Out of curiosity, the first thing I did was set up a progress bar loop to run the actual modifications all one billion times. The resulting progress bar estimated that the entire operation would take around 133 days. So... a different approach:

1 2 3 4 5 6 7 movements = [...] possibilities = [positions] while True: positions = move(positions, movements) if positions in possibilities: break possibilities.append(positions)

Because the movements are always the same, eventually the positions list elements will return to their initial state. In this case, that happened on the 41st movement, making for a possibilities list of size 42. Armed with the answer to the ultimate question of life, the universe, and everything, it was much easier to determine the value of positions at the one billionth permutation:

9 10 answer_key = pos - int(pos/len(possibilities)) * len(possibilities) print(possibilities[answer_key]) # 1,000,000,000!

This all takes a little over half a second, as opposed to the 133 days of processing that would be needed to run all one billion permutations. Phew!


Continue reading

Advent of Code 2017: Days 11 - 15

Posted on 15 December 2017 in Technology • Tagged with advent of code, python

This post is part of the series, Advent of Code 2017, where I work my way through (part of) the 2017 Advent of Code challenges in order to re-learn some of the basics of Python and reflect on some simple concepts and functionality. All my challenge code is available in cdubz/advent-of-code-2017 on GitHub.

Day 11: Navigating a Hexagon Grid

I fought with how to create and navigate a hexagon grid for a bit before I stumbled on an extremely useful post by Chris Schetter: Hexagon grids: coordinate systems and distance calculations. Working in 2d grids (with four possible movement directions) in Python is fairly easy with some dictionaries, but a hexagon grid means there are six potential directions and simple calculations of x,y coordinates won't quite get the job done. What Chris explains so well is a simple concept: flip the grid and add a z-axis.

For my solution, I "flip" the grid by turning it to the right twice such that north and south become east and west:

  \ n  /
nw +--+ ne              sw +--+ nw
  /    \                \ /    \ /
-+      +-    ---->    s +      + n
  \    /                / \    / \
sw +--+ se              se +--+ ne
  / s  \

This puts north and south along the x-axis instead of the y-axis. Next, adding the z-axis and shifting all axises 120 degrees means that each hex can be made up of three points instead of two. Again, I refer to Chris's post and this image that illustrates the concept wonderfully:

Hex grid with coordinates Credit Chris Schetter (Hexagon grids: coordinate systems and distance calculations)


Continue reading

Advent of Code 2017: Days 6 - 10

Posted on 10 December 2017 in Technology • Tagged with advent of code, python

This post is part of the series, Advent of Code 2017, where I work my way through (part of) the 2017 Advent of Code challenges in order to re-learn some of the basics of Python and reflect on some simple concepts and functionality. All my challenge code is available in cdubz/advent-of-code-2017 on GitHub.

Day 6: max(x, key=y)

Another simple revelation on built-ins from this challenge: the key argument can be used to modify what is evaluated by the max function. This concept is explained in detail as part of the accepted answer to this Stack Overflow post: python max function using 'key' and lambda expression.

For Python dictionaries, this means that the get() method can be used to return the key of the maximum value in a dictionary. This works because the max function sends each of the dict keys to the dict.get() method and evaluates that result instead of the key itself. Without this argument, max will actually evaluate the dictionary's keys, which isn't terribly useful:

1 2 3 4 >>> max(d) 3 # This is the *maximum value of the dictionary's keys*. >>> max(d, key=d.get) 2 # This is the *key of the maximum value in the dictionary*.
Continue reading