HOWTO update HP LaserJet Pro P1102w firmware on macOS

The current version of the firmware (20201023, as of January 22, 2022) for the HP LasterJet Pro P1102w only runs on macOS 10.14 or earlier.

This is not great, as macOS 10.14 was released back 2018. If you try to run the (unsigned, sigh) updater, it crashes looking for a missing dylib (/usr/lib/libnetsnmp.15.dylib):

Not only is this binary unsigned, it uses com.yourcompany instead of com.hp.

The workaround — using an Intel-based Mac — is to install Windows in a VM and update it from there. Here’s how:

  1. Download and install VirtualBox and VirtualBox Extension Pack
  2. Download a Windows 10 VM
  1. Import the VM into VirtualBox
  2. Plug your printer in via USB
  3. In VirtualBox, select your IE Win10 VM. Click Settings > Ports > USB, enable the USB controller and add a USB filter for your printer.
  1. Start Windows. Remember the password is “Passw0rd!”
  2. Go to the HP P1102w driver page. Select Windows and “Windows 10 (64-bit)”:
  1. Download and install the driver. A test page will print.
  2. Download and run the firmware updater

You’re done! Shut down the Windows VM and go about your day.

HP LaserJet Pro P1102w driver fails to install on macOS ≥ 12.0.1

Cross-posted from HP support forum.

HP’s LaserJet Pro P1102w printer drivers (download) fail to install on macOS 12.0.1 or later. Attempting to install them displays the error:

This update requires macOS 12.0 or earlier.



  • macOS 12.0.1 was released on October 25, 2021.
  • HP’s drivers (5.1) were were released on October 27, 2021.
  • Previous thread (“Hp printer driver for Macos Monterey 12.0.1 not available“) October 11, 2021. Support agent @Kumar0307 failed to escalate this to engineering and falsely suggested the driver would work with 12.0.1; it does not.
  • macOS 12.1 was released on December 13, 2021.
  • As of December 29, 2021, HP has not released a fix.

The problem is due to the Distribution script in the installer. It looks like this:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<installer-gui-script minSpecVersion="1">
<options hostArchitectures="x86_64"/>
<installation-check script="InstallationCheck()"/>
<license file="License.rtf"/>
<line choice="manual"/>
<choice id="manual" title="SU_TITLE">
<pkg-ref id="HewlettPackardPrinterDrivers" auth="Root" packageIdentifier="">#HewlettPackardPrinterDrivers.pkg</pkg-ref>
function InstallationCheck(prefix) {
if (system.compareVersions(system.version.ProductVersion, '12.0') &gt; 0) {
my.result.message = system.localizedStringWithFormat('ERROR_25CBFE41C7', '12.0');
my.result.type = 'Fatal';
return false;
return true;
<pkg-ref id="HewlettPackardPrinterDrivers" installKBytes="933742" version=""/>

The script is checking for 12.0 instead of 13.0.

The workaround is described in a macrumors thread: run these commands in Terminal:

curl -o ~/Downloads/hpdrivers.dmg&nbsp;<a href="" target="_blank" rel="noreferrer noopener"></a>
hdiutil attach ~/Downloads/hpdrivers.dmg
pkgutil --expand /Volumes/HP_PrinterSupportManual/HewlettPackardPrinterDrivers.pkg ~/Downloads/hp-expand
hdiutil eject /Volumes/HP_PrinterSupportManual
sed -i '' 's/12.0/13.0/' ~/Downloads/hp-expand/Distribution
pkgutil --flatten ~/Downloads/hp-expand ~/Downloads/HP_Drivers_12.pkg
rm -R ~/Downloads/hp-expand

Then open the newly-created HP_Drivers_12.pkg and install it.

Music booking and house concert notes

House concert information

Businesses that book small shows


HOWTO change a theme slug in WordPress

If you rename a WordPress theme, you will lose customizations (theme mods). They’re stored in wp_options based on the theme’s slug.

WP CLI makes it easy to quickly copy the theme options over:

wp> $new_slug = "my-new-theme-slug";
wp> $theme_slug = get_option( 'stylesheet' )
wp> $mods       = get_option( "theme_mods_$theme_slug" );
wp> update_option( "theme_mods_$new_slug", $mods );

State legislature websites, compared

Having recently spent some time with OpenStates data, I noticed the state government websites varied … a lot. Wanting to quantify this variation, I used the SSL Labs scanner, Lighthouse, and some Ruby scripts to compare the 50 states, DC and Puerto Rico’s legislature’s websites.

The table below covers usability (is the hostname flexible), security (does it allow or require HTTPS), server configuration (SSL Labs) and performance (Google Lighthouse).

state URL www .gov HTTPS Support HTTP Upgrade SSL Labs Perf AX Best Practices SEO ✔️C56747369 🚫 root15766075 🚫 root✔️B65948784 ✔️✔️A43907382 ✔️✔️B31926080 ✔️✔️B30688091 ✔️A29938090 ✔️✔️B22896792 ✔️A64817377 ✔️✔️B14856776 ✔️✔️B44888791 ✔️✔️B69827391 🚫 root✔️✔️A231008092 ✔️✔️B85567350 🚫 root✔️✔️A+94718078 ✔️✔️B27877369 ✔️✔️C87615350 ✔️B96776775
KSkslegislature.org72786067 🚫 www✔️✔️B38898068 ✔️✔️B48738074 ✔️✔️B41858091 ✔️✔️F301007371 ✔️B60926088 ✔️✔️F41827377 ✔️A76857389 ✔️✔️B98946762 ✔️✔️C86978791 🚫 root✔️B32988090 ✔️A+91008779 ✔️✔️B94619354 ✔️✔️B10937384 ✔️❌❌B34658082 ✔️✔️B37916777 ✔️✔️B40936788 ✔️✔️B651007364 ✔️✔️B80998097 F0846075 ✔️A+89674775 ✔️✔️B87807383 ✔️B581006791 ✔️✔️B57988799 ✔️✔️A39806785 ✔️✔️B27987369 ✔️✔️B34616075 ✔️✔️A7767383 ✔️✔️B43907388 ✔️✔️B29977374 ✔️B82638074
PRtucamarapr.org14846067 ✔️✔️B12736769 ✔️F58694742 ✔️✔️B89827379 ✔️✔️A69893100 ✔️✔️B641006782 ✔️✔️B68976769 ✔️✔️B52807377 ✔️✔️A71988085 🚫 www✔️✔️B46876769 🚫 www✔️✔️B90947387 ✔️✔️B34897380 ✔️✔️B80958770 ✔️B86847390 ✔️✔️B4928083


  • Three sites don’t support HTTPS: Alabama, Kansas and Puerto Rico’s lower house. Mississippi downgrades HTTPS request to HTTP.
  • Of the sites supporting HTTPS, Massachusetts, Maryland, New Hampshire and Rhode Island get an “F” grade. (Get it together, northeast!)
  • New York’s old state assembly site ( still works and doesn’t redirect you to
  • The Michigan House uses; redirects there (but doesn’t have a valid certificate).
  • The Michigan Senate uses the opposite: Going to redirects you there (and also lacks a valid certificate).
  • Alabama, Arkansas, Georgia, Iowa and Minnesota require you add a www prefix.
  • Kentucky, Virginia and Vermont don’t permit www prefixes.
  • The Minnesota state senate uses an .mn domain, which belongs to the country of Mongolia. Seems like a security risk.

Installing and updating Creative Suite 6

After upgrading from Mojave to Catalina and Big Sur, Adobe Creative Suite 6 Design Standard no longer worked (despite Illustrator and Photoshop being 64-bit apps).

Not wanting to spend $60/month for occasional use, running these under Mojave in a VM was my next-best option. After repeatedly running into an error using a VirtualBox setup script, I downloaded VMware Fusion 12 Player and tried to install it. The installer got stuck at the macOS Utilities screen, regardless of whether I dragged the Mohave installer app to Fusion or built an ISO.

Eventually I installed Mojave on an external hard drive and used Fusion’s “Install macOS from the Recovery partition” feature to create a working VM.

Once Mojave was up and running, installing Creative Suite from the DVD worked as expected.

After installation, I ran Adobe Application Manager to check for updates. The apps themselves (InDesign, Photoshop, Illustrator) updated successfully. However, several pieces of support software failed to update:

  • Adobe Bridge 5.0.2
  • Photoshop Camera Raw 9.1.1
  • Adobe Extension Manager 6.0.8
  • Adobe Digital Publishing Suite Tools 2015.5

The updater would get to the end of the process and error out.

Updating these four components manually was difficult.

Adobe Support was anti-helpful. @AdobeCare sent me to chat support, who told me (rather ungramatically) that since CS6 was discontinued, support wasn’t available. I didn’t need support, I just wanted the updater to work and for their website to have working links. They sent me to the Bridge updater page (the one I had already found, with its broken link). After I told them (via email) the link was no good, they doubled down on the idea the link was working:

We would like to inform you that the direct download link is working fine at our end. You need to to follow the “Right Click” steps which was attached with the last email for downloading the file on your computer from the link below:

Thanks, folks. I know how to click things, and I know when something is 404:

~  $ curl -I
HTTP/1.1 404 Not Found
Server: Apache
Content-Type: text/html; charset=iso-8859-1
Content-Length: 0
Date: Mon, 01 Feb 2021 15:56:23 GMT
Connection: keep-alive

Since updates took a while before failing, I figured it was actually executing something and used fs_usage -f filesys -w | grep -i adobe to check. Sure enough, it was downloading a file … but deleting it on error, before I could save the downloaded installer file.

My next step was to figure out what was being dowloaded and download those files manually. Using tcpdump -A port 80 | grep -A 5 GET, I was able to grab the URLs the updater uses, and manually download:

Each dmg contained an installer that ran successfully.

Updating a ThinkPad z60t

I recently refurbished an old IBM ThinkPad z60t to make it usable and suitable for donation. This involved two areas of work:

  • Installing Linux
  • Upgrading the firmware

Upgrading the firmware

The ThinkPad has two different firmware upgrades:

  • BIOS
  • Embedded Controller

ThinkWiki’s list is pretty comprehensive, and pointed me to BIOS 1.24 and EC 1.18.

Because this machine is so old, it does not offer .iso files (to put on CD or USB drive) or Linux-compatible firmware. There are diskette versions (for putting on floppy disks) and non-diskette versions (run running manually).

The non-diskette .exe file cannot be extracted using The Unarchiver, unzip, or innoextract. It won’t run on Windows 10, and won’t run under DOS mode. (I tried installing FreeDOS on to a USB stick, too.)

Using Virtualbox and a Windows 10 VM, I installed AOMEI Partition Assistant and tried to create a Windows 7 to Go installation on a USB thumb drive. That got all the way to the end before erroring out.

At this point, I decided to pull the hard drive, install Windows on a new drive, and use Windows to update the firmware.

The BIOS updater runs on Windows 7 (despite not listing that as a compatible option), but the EC updater does not, and gives this error:

DeviceIoControl() returns 24 Please restart your operating system and execute the BIOS or Embedded Controller update utility again.

At this point, I had to find a sketchy Windows XP ISO, burn it to CD and install Windows again.

Once I had XP installed, the EC updater ran as expected and the update completed successfully.

Readers: if you know how to install the diskette version version onto a bootable USB drive, please share how in the comments.

Installing Linux

The z60t uses a Pentium M, which is a 32-bit processor. Most current versions of Linux (such as Ubuntu 20.10) only support 64-bit hardware. I chose Linux Mint 19.3 “Tricia” with Xfce, as it was the least resource-intensive.

After using Etcher put the installer on a USB thumb drive, I was able to easily install Linux Mint on the laptop.

After installation and rebooting, most things worked — except for Wifi. I spent an hour or so googling around and reading about rfkill and trying different commands:

  • sending enable to /proc/acpi/ibm/wan and /proc/acpi/ibm/bluetooth
  • adding blacklist ideapad_laptop to /etc/modprobe.d/blacklist.conf
  • adding option thinkpad_aacpi dbg_bluetoothemul=1 bluetooth state=1 to /etc/modprobe.d/thinkpad-acpi.conf
  • Turning bluetooth/WiFi off and on in the BIOS.

In the end, the solution was much simpler. There’s a hardware slider on the front of the machine, by the headphone ports. Sliding it enables the radios.

Cosmo’s power pancakes, metric edition

I’m a huge fan of Carla Lalli’s Music’s pancakes (aka Bin It to Win It Pancakes aka Cosmo’s Power Pancakes). We make them a bunch, and have fed them to appreciative family and friends.

Carla initially shared the recipe in a Bon Appetit video from April 2017. The recipe was approcumented by a sketchy recipe blogger and a revised version was printed in Where Cooking Begins.

There’s only one problem with this recipe: it calls for 1.5 cups of buttermilk, and buttermilk comes in quarts. Rather than have the buttermilk go to waste, we, of course … make more pancakes.

Unfortunately, the combination of legacy heirloom units and odd fractions leads to some weird quantities, like ⅓ x 2 ⅔ = ⁸⁄₉ = 0.88578 cups of coconut oil.

Being both Canadian and someone who is used to weight-based baking recipes, I knew there was a better way.

With the help of the King Arthur Ingredient weight chart and my handy scale, I converted the recipe to metric and multiplied by 2.66.

I present you with an easy way to use your scale and a whole quart of buttermilk to make a lot of pancakes. (They freeze well.)

IngredientUnofficialVideoMetricMultiplied outWhere Cooking BeginsMetricMultiplied out
Coconut oil0.33 cup0.25 cup79ml210 ml2 tbsp butter28g113g
Oats0.33 cup?30g80g0.33 cup30g80g
Buttermilk1.5 cups?354 ml945 ml 1.5 cups354 ml945 ml
AP Flour1 cup1 cup120g320g0.75 cup90g240g
WW Flour0.5 cups0.5 cups57g150g0.75 cup85g225g
Baking powder1.5 tsp1.5 tsp6g16g1 tsp4g11g
Baking soda0.5 tsp0.5 tsp3g8g1 tsp6g16g
Salt0.5 tsp?1g4g0.5 tsp1g4g
Sugar1 tbspLittle bit12g33g1 tbsp12g33g
Flax0.25 cup?35g93g2 tbsp17g47g
Chia0.25 cup?61g162g0.33 cup81g216g


Tools needed

  • Medium and large bowls
  • Scale
  • Whisk, spatula, scoop
  • Skillet or griddle
  • Microwave- or oven-safe measure to melt coconut oil


  • Measure and melt the 210ml coconut oil
  • Heat a skillet on medium heat and grease with additional coconut oil

In a medium bowl

  • Soak the oats in buttermilk

In a large bowl

  • Combine the dry ingredients: mix all-purpose flour, whole wheat flour, baking powder, baking soda, salt, sugar, flax and chia

In the medium bowl

  • Add eggs and melted coconut oil (to buttermilk and oats)
  • Whisk together

Combine everything

  • Pour the wet ingredients in to the large bowl
  • Stir with spatula to combine


  • Cooking time is approximately 90 seconds per side, depending on the size of the pancake. Adjust your cooktop temperature if they’re cooking too slow or too fast.


  • Salt is based on Diamond Crystal kosher salt. If you’re using Morton’s kosher salt, double the amount of salt provided.
  • For additional background, see Carla’s recipe notes and the buttermilk pancake recipe she used as a starting point.

HOWTO fix ActiveRecord migration NoMethodError in Rails 5.2

Ruby on Rails 5.2 changed the method signature for ActiveRecord::Migrator.migrate().

The old signature was this:

def migrate(migrations_paths, target_version = nil, &block)

The new signature is this:

def migrate(target_version = nil, &block)

Suppose you had some Rails 5.1 code like so:


If you ran it in Rails 5.2, you would get this error:

NoMethodError: undefined method `migrate' for ActiveRecord::Migrator:Class

In Rails 5.2, you would write: ActiveRecord::Tasks::DatabaseTasks.migrations_paths ).migrate( version )