Raspberry Pi 4, Ubuntu 20.04, PoE Hat Fan Control

I recently acquired an 8Gb Raspberry Pi 4 and promptly installed Ubuntu 20.04 on it to see how it worked. Right away, I was excited that the PoE Hat worked and that it booted without any problems, except that the fan on the Hat was no longer controllable the way that it used to be.

It appears that the old way of using config.txt and friends to override those settings no longer works.

Here’s what you need to do:

sudo nano /etc/udev/rules.d/50-rpi-fan.rules

Put this in it to start with, and tweak as needed for your situation:


# If the temp hits 81C, highest RPM
# If the temp hits 80C, higher RPM
# If the temp hits 70C, higher RPM
# If the temp hits 60C, turn on the fan
# Fan is off otherwise


macOS Disk Utility “Operation cancelled”

When trying to use Disk Utility to make a backup of one of my Raspberry Pi’s, I was repeatedly seeing an error that was causing my backup to fail.

Operation cancelled

Disk Utility

Not particularly helpful.

For me, the fix involved setting the Disk Utility application to have Full Disk Access inside macOS System Preferences, under Security & Privacy, and then Privacy.

Once I did this, everything started working again! ­čą│


Update GitLab signing key

At the beginning of April, GitLab updated their repository signing key. If you try to update, you will see an error during sudo apt update :

W: An error occurred during the signature verification. The repository is not updated and the previous index files will
be used.
GPG error: bionic InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 3F01618A51312F3F
W: Failed to fetch The following signatures couldn't be verified because the public key is not available: 
NO_PUBKEY 3F01618A51312F3F
W: Some index files failed to download. They have been ignored, or old ones used instead.

The easiest fix appears to be simply to update the signing key:

curl --silent | sudo apt-key add -

The trailing hyphen is part of the command; don’t forget it.

Software WordPress

Easy PHP Upgrade

I had a few servers that needed upgrading from PHP7.2 to 7.3, so I wrote this little single-line command to help simply things.

It uses apt list to get the PHP modules that are currently installed with 7.2, and passes them through to apt install for 7.3.

sudo apt install $(apt list --installed | grep php7.2- | cut -d'/' -f1 | sed -e 's/7.2/7.3/g')

This can easily be modified for any PHP version later.


Empty Space in macOS Dock

defaults write persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock
Software WordPress

Variable SSL certificate directives in nginx (part 2)

Feeling encouraged by my friend Jeremy Felt’s blog post on the subject, I thought I may finally be able to achieve the panacea of WordPress Multi-Network SSL configurations:

Continue reading “Variable SSL certificate directives in nginx (part 2)”

Install nginx from source

At the time of this writing, the latest stable version of nginx is 1.16.0, and none of the package managers have updated themselves to include it.

Before you get started, you’ll want to be logged in to an open terminal session with a user that has sudo access. The reason for this, is because nginx itself requires root access when it starts up, to bind itself to lower number ports (usually 80 and 443.)

You’ll also notice that I use nano for editing files. Use what you prefer.

First, stop any version of nginx that might already be running:

sudo service nginx stop

Next, you’re going download the latest version of nginx directly from the official website:

cd ~/

Next, decompress it, and change into the new directory it made:

tar xvf nginx-1.16.0.tar.gz nginx-1.16.0/
cd nginx-1.16.0/

Next, you’ll probably want to install some related dependencies. Below is a pretty general list, but if you know better for yourself, replace these as needed:

sudo apt-get install -y curl build-essential make gcc libpcre3 libpcre3-dev libpcre++-dev zlib1g-dev libbz2-dev libxslt1-dev libxml2-dev libgd2-xpm-dev libgeoip-dev libgoogle-perftools-dev libperl-dev libssl-dev libcurl4-openssl-dev libatomic-ops-dev

Next, you’ll want to configure nginx.

There are about a million different ways to do this depending on your needs. For our purposes (and for most people reading this) the below approach should be sufficient:

sudo ./configure \
--user=nginx \
--group=nginx \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/ \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module \
--with-http_perl_module=dynamic \
--with-mail \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-google_perftools_module \
--with-cpp_test_module \
--with-compat \
--with-pcre \
--with-pcre-jit \
--with-zlib-asm=CPU \
--with-libatomic \
--with-debug \

Many of the above flags are important, but I think the most important one for our purposes is --with-debug because without that flag, you cannot log any of nginx’s important debug information, in the event something isn’t working correctly.

Next, you need to build the executable from the configured source. You’ll make it and install it like this:

sudo make && sudo make install

Next, you’ll want nginx to autostart on boot, so:

sudo nano /lib/systemd/system/nginx.service

And put this in there:

Description=The NGINX HTTP and reverse proxy server

ExecStartPre=/usr/sbin/nginx -t
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID


Then run these two commands and nginx should fire right up:

sudo systemctl daemon-reload
sudo service nginx start

All done!

Bad UI

Wi-Fi Calling – macOS

This glitchy bit of UI shows up after enabling WiFi calling on an iPhone.

Software Politics

Open source requires a senatorial style of leadership to move big projects forward since there isn't necessarily a single key decision maker.

Joe McGill


Stop indexing your development directory

Are you a software developer?

Do you run macOS?

Do you frequently checkout files from third party code repositories?

Do you use an IDE like PHPStorm, Xcode, Atom, Netbeans, or something else?

Do you frequently run commands like npm install that reach out to the web and pull down a bajillion files you will literally never-ever open even if your life depended on it?

I do… and that’s why I block macOS Spotlight from indexing the parent directory to all of those files. It’s a dead simple and obvious thing to do once you think of it.

Continue reading “Stop indexing your development directory”