Using Docker Compose to Run Jekyll

June 18, 2021 | posted in: nerdliness

While setting up my new computer, one of the tasks I was faced with was recreating my Jekyll environment. Jekyll is the Ruby based static site generator I use for this site. MacOS has not always kept up with Ruby, and so I’ve had to employ rbenv to have an up to date Ruby installed. And to segregate the Gem dependencies Jekyll has from any other Ruby project that might have conflicting dependencies.

I kept putting off the task as I wasn’t looking forward to the possibility of some problems in Ruby Gem land. And then I thought about Docker—how hard would it be to use Docker as my Jekyll environment? As it turns out, not very hard at all. Eight lines of YAML total, not very hard.

A quick search lead me to this article, How to run Jekyll locally with Docker and Docker Compose. Using docker-compose and a Docker image that has Jekyll installed on it, you can quickly spin up a fully functioning Jekyll environment.

By putting the docker-compose.yml file in the root directory of my blog, and running

docker-compose up

I get Jekyll without having to install Jekyll, manage Gems, or use rbenv to control which version of Ruby and which collection of Gems is in use. Best of all, since Ruby is installed by default (version 2.6.3p62 as of this writing), I have rake at my disposal, so the Rakefile I have still works. This file has tasks for creating new postings, or new draft postings, for publishing drafts, and for deploying my site using rsync.

The only changes I made to the docker-compose.yml file described in the article, is that I used different flags on the jekyll serve command. I’m using

jekyll serve --watch --drafts

which is what I’ve had for a long time. The performance of the Docker image is a bit slower than it would be if it were natively installed. I may try --incremental at some point to see if that speeds things up.

Here’s my docker-compose.yml file.

    image: jekyll/jekyll:latest
    command: jekyll serve --watch --drafts
      - 4000:4000
      - .:/srv/jekyll

Briefly, this file says, compose a Docker image using the latest jekyll base image. Once it’s ready run the Jekyll server, watching for new drafts, and expose the server on port 4000. Finally, map the current directory ., to /srv/jekyll in the image. Done.

Docker and docker-compose saved me a lot of time and effort. Now I wonder where else I could use it.

Solving Operation not Permitted Errors over Remote Access

June 18, 2021 | posted in: nerdliness

Recently I purchased a 24” M1 iMac. One of my goals was to have a central place for all my digital content: movies, audiobooks, music, and photos. My venerable late-2013 MacBook Pro has a 1TB drive that cannot hold my entire collection along with my other files, applications, and the operating system.

For some time now I’ve been using an external USB drive to house my media. This drive has been plugged into an even more venerable 2009 MacBook Pro. The reason for using the much older laptop as host for my media is simple: that laptop doesn’t get moved. If the external drive were attached to my primary machine, I would constantly be moving it, with the laptop, or mounting and dismounting it.

With all my music, movies, and audiobooks offloaded to the external drive, there was enough room left on my primary laptop for all my photos, and the rest of my files. It wasn’t ideal, but it worked.

The new iMac has 256GB internal storage, and a pair of 4TB external drives. I have spent considerable time this past week consolidating all my digital media to one of the 4TB drives. I’ve also put my software projects directory, called code, there. When I am away from my desk and want to access something on the external drive on the iMac, those files are just an ssh connection away.

From the MacBook Pro I am using iTerm2 and ssh. From the iPadPro I’m using blink since it includes mosh, or mobile shell. The advantage to mosh is that the session stays in sync even if the connection is interrupted. Since iPadOS is fairly aggressive about stopping idle processes, using an ssh connection becomes tiresome as you are constantly having to reestablish it. With mosh, once you are connected you stay connected until you end the session.

I believe, though I am no longer certain, that the first remote session on my iMac was done from the iPadPro using mosh. On the iMac there is a component of mosh, mosh-server the runs and manages the incoming connection. This will play a key part in what happened with my ability to remotely access files over ssh/mosh.

MacOS allows you to control how your computer is shared. Under the Sharing preference pane in System Preferences, there is a Remote Login option. With that selected you can login to the local computer from a remote computer. Once Remote Login is enabled, there is a second option, Allow full disk access for remote users. This should be enough to permit ssh or mosh session access to any of the disks mounted.

In my case I was getting an Operation not permitted error any time I tried to access any external drive attached to the iMac. I got this error whether I used ssh or mosh, and from any remote device: iPadPro or MacBook Pro.

When the first remote login occurs a setting is added to Full Disk Access under the Security & Privacy Privacy pane. This setting is called sshd-keygen-wrapper. If it isn’t listed, or is listed and enabled, then full disk access is granted. If it is there and no enabled, however, full disk access is not granted. In my case, sshd-keygen-wrapper was present but not enabled.

I suspect that mosh (and mosh-server) having been the mechanism for the initial remote session, left the setting in a state where no remote access to external drives was allowed. Once I enabled that setting I was able to remotely access external drives using either ssh or mosh.

This Apple discussion thread, and the links it contains, do a better job of explaining the ins and outs of sshd-keygen-wrapper. I found this link through the ##apple IRC channel.

Kinds of Documentation

March 02, 2021 | posted in: nerdliness

In the process of learning Go language programming I have consumed a lot of written and visual material. Today I listened to a few minutes of the Go Time podcast, where they were talking about documentation. The introduction to the episode really resonated with me, and so I wanted to capture it in my words here.


When first starting a new topic, particularly a technical one like, say Go programming, tutorials are a common starting point. Explanation mixed with samples, something you can follow along with at home. Learning my mimicking.

How To

How to resources are aimed at solving a particular problem. How to I set up an HTTP router in Go?, or How should a go project be structured? A how to is more narrowly focused. It aims to impart knowledge about this one specific topic.

Articles or Presentations

Somewhat broader in scope than a how to, an article or presentation (i.e., at a conference) dive a bit deeper into a topic. It isn’t a tutorial, assumptions are usually made about what you already know. And it isn’t a focused as a how to. It adds some though process to the solution or technique discussed.


Documentation is a dictionary. An reference. You are looking up the specifics of an API or library. Depending on the maturity of the documentation, and whether it includes examples or not, finding information in the documentation can be difficult. If you know the package or library you need and only need to refresh your understanding of it’s parameters and return value, documentation is fantastic. If you are unsure, and are hunting for the right tool, documentation can be frustrating.

The Arc of Learning

In the course of learning a new programming language, I move through all of these categories of documentation. While working through a tutorial I may digress into a how to or look up things in the documentation. Generally though, I move from tutorials through how to and articles, and finally to documentation.

How Not to End a Customer Relationship

February 26, 2021 | posted in: nerdliness

For more than eight years all of my sites, and my wife’s sites, were hosted at WebFaction. For $102 a year we had reliable, relatively straight forward to setup and use, web hosting and domain email. I originally signed up there as they would let you run Django or Ruby on Rails apps, and I was wanting to experiment.

About a year or so after signing up, I read an article online about tracking your own location using your phone, a database, and some mapping service I no longer remember the name of. I set it up, using PostgreSQL for the database (more experimenting), and once I had it working never really used it.

About two years ago WebFaction announced that their parent company had been bought by GoDaddy. I waited to see what kind of changes would result from this change of ownership. In October I learned that all the WebFaction sites would be migrated to tsoHost. Two days later I was told that might site would not be migrated, it would be terminated on December 9th. The reason given was PostgreSQL wasn’t supported on tsoHost.

A quick email to ask, “Hey, that PostgreSQL database you have that hasn’t seen any activity in years, can that go away? Otherwise we won’t be able to keep you as a customer.”, would have kept my business, at least for a while.

I spent a couple weeks in November preparing and then moving all our domains to Pair Networks. After backing up all the files on my WebFaction account, I deleted everything and let the account expire on December 9th.

The email telling me my account would be closed said that a refund for the unused portion of my annual fee would be refunded, and that this refund would take about 45 days to process. I created a calendar reminder and forgot about it.

When day 45 rolled around and I still hadn’t received any refund I contacted WebFaction. Their refund process requires PayPal. I don’t have, and don’t want, a PayPal account. Apparently they are unable to refund it to the credit card I used through PayPal’s payment portal. I asked if they could send me a check. Nope. Can’t do checks.

Today I got an email saying the could maybe do a wire transfer. They need the bank’s name, the account number, the BIC/Swift code, and the account name. Oh, and a screen shot of this information from the bank’s site. Any fees incurred for accepting the wire transfer, which I believe is coming from England, are on me.

I always liked WebFaction, but the way this account termination and refund have been handled have left me with a sour taste in my mouth. I’d advise against signing up with them, but they no longer exists, at least by that name.

Tomorrow I’ll gather all the numbers they need and send them off. I am not going to provide a screen shot of those details from the bank. And I’ll eat what ever fee my bank charges me for accepting an overseas wire transfer.

Online trolls exist because they can be anonymous. Companies, especially those that exist solely online, have some of the same characteristics. I can’t go to the WebFaction building and get my money, there isn’t a phone number, or a mail address. Just a URL that leads to a page with information posted pre-December 9th on it. Since there is little consequence, it is easy for a company to abuse their physical and metaphorical distance. All to their customer’s detriment.

Spark Email for macOS

February 02, 2021 | posted in: nerdliness

I have been using Spark as my primary email client for both work and personal email for ten days. Rather than try to produce day or even semi-daily posts about Spark, I decided to write one summary post.

Overall Impressions

Spark is a well designed, well thought out application. It is opinionated but quite usable. I particularly like the “smart notifications” feature (more on that below). I also like that it has an iOS app so I can use the same client for email on my Macs and on my iPhone and iPad. I do not care for the “Spark account” that is used to synchronize settings from one device to the next — no for security or privacy reasons, although that is a question, but due to wanting a different set of accounts on my work computer than on my personal computer.

Smart Features

Spark has a couple of features they label as “smart”. First up is the smart inbox. When you select the smart, as opposed to classic, inbox, messages are grouped by category. Newsletters, notifications, etc. I supposed this is useful if you have a single email account that is swamped with all kinds of different emails. I have several accounts and tend to use them for different purposes. All my newsletters come to one account, online retail and memberships comes to a different account.

The smart notification feature is very nice. Smart notifications mutes strangers and automated emails. This makes having notifications turned on useful. I wish more applications gave finer grained control over notifications like this.

Spark Account

Spark has you create an account (basically with the first email address you add to the client). This account is used to synchronize your settings from device to device. I won’t get into concerns about a third party being involved in your email. Unless you are using end-to-end encryption, your email is not private.

Where I don’t like the Spark account is wanting to have two distinct profiles. I keep my work email separate from my personal email. I don’t have my work account setup on any personal devices (except for my iPhone). Therefore I have two Spark accounts. One for my work machines, and one for my personal machines. Not a huge minus, but cumbersome. It’d be nicer if you could select which email accounts were active on each device.

Look and Feel

There aren’t any themes for Spark, beyond the ability to have a light or dark interface. I can take or leave themes. I do want to control the font and appearance of my email, and you can do that with Spark. The compose settings are only available when you are composing an email. Again, not a terrible decision, but unnecessarily hidden in my opinion.

I don’t like that you can alter the sort order of the messages. I like my messages oldest first, so that as I work my way through the inbox the oldest is at the top and the newest at the bottom.

The smart inbox feature also messes with ordering. It wants to roll up messages, so that the overall list is shorter I supposed. So you end up having to click to expand the roll up, and then click a message to start reading.

As a whole the user experience Spark provides is polished and comfortable. My quibbles are personal preferences rather than egregious design mistakes.


You can select which set of keyboard shortcuts you want active, and you can customize that set further.

There’s no provision for email encryption.

There is no way to prevent loading of images. Once you select an email any tracking embedded in the message has already phoned home.

Would I use Spark?

Long term the answer is no. It is not at all objectionable. It also isn’t compelling. I’d give it a solid B+, or say an 86 or 87 on a scale of 1 to 100.

Ten Days of Spark Email - Day 1

January 24, 2021 | posted in: nerdliness

The next email client I am trialling is Spark. I no longer remember how I became aware of Spark, but I do know that I briefly used it in May 2018.


Spark has several noteworthy features. It offers a combined inbox, like many other email clients, with a twist — it automatically categorizes incoming emails, making it easy to see what is unread. Spark offers a classic inbox too, if you prefer to see your emails without the category groupings.

Spark also offers smart notifications. With smart notifications turned on you won’t be notified for mails from strangers or automated emails. You can control this notification filter per account, making it easy to see only the notifications that are important to you.

There’s a natural language search feature that allows you to search for “attachments from David” or “links sent yesterday”

And like nearly all modern email clients, Spark offers the ability to snooze emails.

Perhaps the nicest feature is the availability of Spark on mobile platforms too. I can have Spark on my macOS desktop or laptop, and on my iPhone or iPad.

Spark also offers a set of collaboration tools for teams.


Spark uses a “Spark account” to synchronize your email accounts across devices. This allows you personalizations and settings to be quickly setup on a new device. The Apple App Store Privacy report for Spark shows that Spark has contact info, user content, and identifiers linked to you, while they don’t track usage data or any diagnostics.

Look and Feel

Spark doesn’t offer any themes other than a light or dark mode. Dark mode looks good, but I personally don’t like dark mode for things like web browsing or email. Having white content starkly outlined by dark windows and controls is not an appealing look for me.

You can assign a color to each email account. This color appears as a small vertical line just ahead of each email’s subject. When you are viewing the combined inbox this makes it a little easier to see which emails are from which accounts.

There is also a mail preview feature that allows you to see a 1, 2, or 3 line preview of the mail’s content in the list of mails. You can also show an avatar for each email, based off the sender.

Instead of a global setting for the font used when composing, there is a formatting option in the composition window. Changing the compose font there is sticky — meaning once set it stays set — but it wasn’t obvious that was the case until I played with it.

One nice feature is being able to choose the set of keyboard shortcuts you prefer. You can have Spark’s shortcuts, the Gmail ones, the Apple Mail ones, or you can create a custom set for yourself.

Signatures support plain text or HTML formatting.

There is no encryption support.

Operating Systems

Currently Spark is available on macOS, iOS and Android mobile support. Work is underway for a Windows client.

First Impression

I like many of the features that Spark has. I do like that I can have the same tool on all my devices. On the whole Spark is fairly low key. It has a simple elegance that is appealing.

I haven’t yet decided if I’ll use it for my work email or not. At first glance it doesn’t look like you can turn accounts on or off per device. I don’t like to have my work email on my personal computers, although I do have it on my iPhone. I could setup a second Spark account that only had my work account in it for use on my work computers. That wouldn’t make getting both personal and work email on my phone easy. That will bear some further investigation.

Thirty Days of Mutt - Day 10

January 23, 2021 | posted in: nerdliness

My experiment to try mutt for thirty days is over today. After ten days I realize that I enjoy tinkering with mutt more than I enjoy using it as my primary email client. Consequently, I’ll be switching to a different email client for the next ten days.

What Works About Mutt

  • It is hugely customizable.
  • There is a vibrant community devoted to it.
  • Through ssh and tmux, it is possible to access it from any computer.
  • Encryption is a first-class citizen.

What Doesn’t Work About Mutt

  • While you can run a terminal emulator on your smart phone, you will most likely not use mutt for mail on the go.
  • HTML email is everywhere. Viewing it in w3m of Lynx is less than satisfactory.
  • Even with urlview, deciphering a list of URLs embedded in an email to find the one you want is cumbersome.
  • The burden of mapping an account and its mail boxes is on you.
  • There is no built in junk mail filtering. I ran SpamSieve in another client to prevent mutt from being cluttered up.


I’ll continue to maintain my mutt setup. When I’m using my Linux laptop, which has only the Sway Window Manager, and I need email, I connect to my local server and access mutt. I guess mutt is a reserve email solution. Nice to have, enjoyable to tinker with, can be used in a pinch, but not what you want for day-to-day use.

Thirty Days of Mutt - Day 8

January 21, 2021 | posted in: nerdliness

Eight days into my month long test of mutt and I’m starting to have second thoughts about the duration of the experiment. My thinking was that 30 days would be long enough to firmly develop habits with mutt. However, I am finding some of the hindrances that come with mutt (or at least my configuration of it) more than I want to deal with.

Ultimately I was going to trial several different email programs, each for 30 days, to see which one came the closest to my ideal. I am relatively neutral about email. It is my preferred method of communicating. Composing an email allows me to order my thoughts. And the social contract, from my perspective, is that the recipient can take their time in composing a response. I treat chat or messaging the same way. I don’t expect an immediate response. Chat is ephemeral whereas email has longevity.

Mutt introduces slightly more friction to my desired work flow than I think I am willing to abide. The handling of file types that may be attached to the email is the single largest pain point. Since I run mutt on a server and access it through ssh and tmux, I can’t use any mechanism to open a browser from the email, as the browser would be on the server and not on the computer I happen to be using. Image files are not possible with my setup.

Granted I could replicate my mutt setup on each computer and rely upon local tools to handle images, etc. It is a non-trivial amount of work to setup mutt. Off the top of my head there’s mutt, mbsync, msmtp, neovim, GnuPG, and urlview to install and configure. Currently mutt is on an Ubuntu machine. My other computers are macOS and Arch Linux. Adapting the install to those operating systems should be straight forward.

Maintaining the setup in multiple locations would not be fun. I don’t want to have to Sysadmin my email program. I want to read, reply, compose, and archive my email.

I may give mutt another day or two. Ten is nice round number. Then I’ll write up an evaluation of it, comparing it to my ideal email client. And I’ll move on to the next candidate.

Thirty Days of Mutt - Days 4 & 5

January 18, 2021 | posted in: nerdliness

Having not used mutt regularly for some time now, I’ve had to relearn its built-in keyboard commands as well as some of the macros that I created.

Custom Keyboard Commands

I currently have four separate email accounts setup in mutt. I’m actually using neomutt which has the sidebar already baked in. I have the sidebar setup to list each account with the folders I’m interested in: INBOX, Drafts, Sent, Junk, and Archive.

I have two sets of macros that let me jump to the inbox of any account directly. I can key .1 or .2 or .3 or .4 to access the accounts by their relative position in the list. I can also use a letter designation: m, r, n, c, preceded by a dot to accomplish the same thing. I set the letter shortcuts up first, and later added the numbers.

I also have a shortcut, .s to save an email to that account’s Archive folder. And a shortcut to move mail to the junk folder, .j. Both of these work in conjunction with to built-in tag, t command to operate on multiple emails.

I can also move up and down the list of mailboxes using the arrow keys. Once a mailbox has focus, pressing the right-arrow key refreshes the contents of that box.

Finally I have some filter defined as macros, allowing me to view unread mail only, .u, to see only today’s email (read or unread), t, to see this week’s mail, .w. .a removes any filter allow all mail to be viewed again.

Being able to customize the possible interactions with mutt is one of its most compelling features.

Thirty Days of Mutt - Day 3

January 16, 2021 | posted in: nerdliness

Mutt is attractive to me for several reasons. And there are some things about it that detract from it as a everyday email solution.


Nearly every facet of mutt can be customized to your liking. Colors, layout, key bindings, even the tools used to receive or send emails can be selected. Setting up mutt and getting everything just the way you want is no minor task. I dare say your understanding of how email is sent, received, and stored will improve as a result of installing mutt.


Email encryption ought to be included in every email client. It should be dead simple to use. Unfortunately it is neither wide spread nor easy to use. However, once you put in a little effort to add encryption to mutt, using for emails is very simple. While it may not be a true first class citizen, as a feature, it is very close to that. Too many other email clients ignore encryption altogether, or only provide it through 3rd-party add-on libraries.

Email in a Single Place

My mutt install is on a single computer. I have my home network setup to allow me to access this computer from anywhere. Mutt (and weechat for that matter) are always running on this computer. By running them inside a [tmux[( “tmux”) session I can remotely access the computer, attach to tmux and get to my mail. I can be attached to that tmux session from multiple computers at the same time. All are seeing the exact same running process. Instead of having my mail synced to every computer, it is synced to one computer, where I can access it.

Nerd Quotient

Finally I like mutt since it is nerdy. Getting it up and running is a bit of a hurdle. Learning the ins and outs and adapting to it are another hurdle. As with anything difficult, there is satisfaction is mastering it.

Requires Dedication

On the minus side of the equation, mutt does require more effort and more dedication than using Gmail, say. My mutt setup consists of mutt, mbsync, msmtp, GnuPG, and urlview. This doesn’t include the Ubuntu OS it’s running or, or some ancillary tools like tmux and Neovim. I guess you could say mutt is like a kit car. One that requires an effort to construct, and that will require on-going maintenance to keep in good running condition.

HTML Emails

Reading emails that are basically web pages is cumbersome at best. Some HTML emails are surprisingly easy to view and read. Others expose horridly complex, obfuscating HTML, wrapped around very little actual content.

If there is going to be one reason I don’t keep mutt as my email, it will be the difficulties around HTML email,