Archive for February 2018

A Subtle Python Bug

Published on February 23, 2018

I recently had a very subtle bug with an OrderedDict in my Python code at work. I constructed the contents of this object from a SQL query that was output in a specific order (can you spot the bug?):

qs = models.MyModel.objects.all().order_by("-order")
data = OrderedDict({x.id: x.name for x in qs})

My expectation was output like the following, which I was seeing on my development system (Python 3.6):

OrderedDict([(4, 'Four'), (3, 'Three'), (2, 'Two'), (1, 'One')])

However, on my official sandbox test system (which we use for internal testing, running Python 3.5), I was seeing output like this:

OrderedDict([(1, 'One'), (2, 'Two'), (3, 'Three'), (4, 'Four')])

There are actually two issues in play here, and it took me a while to figure out what was going on.

  1. First, I’m constructing the OrderedDict element incorrectly. I’m using a dictionary comprehension as the initialization data for the object’s constructor. Dictionaries are (until recently) not guaranteed to preserve insertion order when iterated over. This is where my order was being screwed up.
  2. Second, the above behavior for dictionary order preservation is an implementation detail that changed in Python 3.6. As of 3.6 (in the CPython implementation), dictionaries now preserve the insertion order when iterated over. My development system, running on 3.6, was therefore outputting things as I expected them. The sandbox system, still running 3.5, did not. What an annoyance!

I’ve learned two valuable lessons here: (a) make sure you’re running on the same levels of code in various places, and (b) don’t initialize an OrderedDict with a dictionary comprehension.

High Contrast Mouse Pointer

Published on February 19, 2018

As I age, my vision is getting worse (and it’s already pretty bad). At work, I use a three monitor setup: my laptop is the middle screen, and two external monitors sit to either side. Given the large screen real estate, and given my increasingly bad eyesight, I’ve been having a tough time finding my mouse pointer. Windows has an option to show the location of the mouse pointer when you press the Ctrl key, but that has limited usefulness (though I do use it from time to time).

I recently stumbled upon a neat feature in Windows 10 that has helped me tremendously. There are several mouse-specific features in the Ease of Access section of the Windows settings. The pointer size can be adjusted (which is helpful to a degree), but the most helpful feature is the Pointer Color setting. There’s an option to adjust the pointer color based on whatever color is beneath it. It took a little getting used to, but I can now find the mouse pointer a lot easier than I could before.

ThruNite Archer 2A Flashlight

Published on February 11, 2018

I have always liked a good flashlight. As a kid, I even asked for a 5-cell D Maglite for Christmas (which Santa brought!). This past December, I picked up the ThruNite Archer 2A flashlight from Amazon, based on a review from The Wirecutter. At $30 it’s not cheap, but boy is this thing great.

It uses two AA batteries and puts out an incredible amount of light. There are four brightness settings, ranging from dim (great for when your eyes are adjusted to the dark) to blindingly bright. I also like the fact that it’s compact; you could easily store this in a bag, car console, or junk drawer without taking up much space.

Since I bought it, I’ve put it to use in a number of ways (looking for dropped items in the car, using it on walks at night, and hunting under furniture for lost cat toys). I highly recommend this spectacular flashlight.

Copyright © 2004-2018 Jonah Bishop. Hosted by DreamHost.