23 Feb

The house is very quiet now.

There are not as many loud complaints about people on the street, birds in the trees, or the wind blowing the leaves.

There are not as many shouts about people walking around the house.

There are no complaints about it being 9:00pm and we are not in bed yet. Or complaints that we are in bed, but the TV is too loud.

There is one less tail constantly wagging.

It was for the best, but we miss her terribly.

You were a Very Good Dog, Jemma.

Well OK Then

18 Feb

This is what happens when your hosting provider goes bust without notice and you have not made a backup in over a year. I don’t post much, but have made a few in the last several weeks which have now gone into the bitbucket.  I’ll try to reconstitute some of them eventually.

Oh, well.

(ps: I was able to get access to the old server for long enough to grab a current backup. Maybe I’ll be able to use the data within to put the posts here. We’ll see.)

(pps: I grabbed the data from the old site,  manually edited the sql for the posts, and used it to restore the posts older than this one. Most are missing images which I might or might not re-edit in. How the ones that do have images do is a mystery. None of the restored posts have a Category; maybe I’ll fix that at some point. Let me know if you notice any weirdness in the older posts and maybe I’ll fix them. )

Strong Opinion on git Workflow

7 Feb

Strong Opinion

Whether working in trunk-based style or feature-branch style, the main (or trunk, also known as master) branch, along with any release branches if doing that thing, SHOULD NOT have merge-commits.


I do not like to see merge commits in the main/trunk branch. I prefer a straight, unblemished history line.

* d589966 -(17 hours ago) (HEAD->main, origin/main,origin/HEAD)
* 5f3c420 -(17 hours ago) Merge branch ‘main’
| * 4650c10 -(17 hours ago)
| * ae51497 -(17 hours ago)
| * b45fa11 -(18 hours ago)
* | d532336 -(17 hours ago)
* 3d7bb50 -(18 hours ago)
* 6851949 -(18 hours ago)
* 28a191b -(19 hours ago)
* 01f6be2 -(19 hours ago)

Merge commits make reviewing the history more difficult for humans and source control tools to understand, explore, and resolve issues. Other than the visual part, they introduce complexities to reverting any issues that come up which cross the merge-commit line.


I have these settings in my global .gitconfig to fail any merges that are not fast-forward. This forces me to resolve those with a proper rebase before merging into main.

    ff = only
    ff = only


The workflow I use to resolve such problems is:

  • Create a branch at the current state git branch wip
  • Reset the main branch upstream head either by resetting it then pulling or fetching then resetting it.
  • Change to the wip branch git checkout wip
  • Rebase wip onto main get rebase main (resolve any merge conflicts the usual way)
  • Change to the main branch git checkout main
  • Merge the wip branch into main (since it will fast forward now) git merge wip
  • Delete the wip branch git branch -d wip

As with anything that I do more than a couple of times, I have automated this workflow. The scripts below are in the set that I source into my current terminal. When I git pull and it fails because it cannot fast forward (see the .gitconfig settings above), I can just repo_wip_rebase.

The script stops at the rebase step if there are merge conflicts to resolve. I use the normal git mergetool and get rebase --continue to handle those and then repo_wip_merge to finish up.

Note that when there are no merge conflicts, repo_wip_rebase does all the work.

function repo_wip_merge()
    git checkout main || return $?
    git merge –ff-only wip || return $?
    git branch -d wip || return $?

function repo_wip_rebase()
    git branch wip || return $?
    git reset –hard origin/main || return $?
    git checkout wip || return $?
    git rebase main || return $?
    # if there are merge conflicts, it stops here. Resolve them and then do this separately

It is possible to do this as get aliases instead so that the commands might be: git wip_rebase.

I tend not to create git aliases for two reasons. The most important is to keep custom stuff clearly custom. I do not want to get in the habit of using git xx short cuts and erode my memory of the raw git commands. Having scripts with the prefix repo_ makes it clear to my brain that this is a custom thing. The second reason is that having these in a script separate from my home folder that is under source control is easier for me to manage.


I know there are other options for both of these. This is what works for me.

I hold no strong opinions on how you should automate your work. I only hold that you should automate as much as you can in whatever way works for you.

Baking Cast Iron

7 Feb

Spent yesterday afternoon and will spend this afternoon baking most of my cast iron. I borked the square skillet last week cooking on the grill when it got too hot (>700ºF) for too long and most of the seasoning went up in smoke.

Since I was repairing that one, I decided to do them all. There was one cleaning bake (550ºF for 2 hours) for the square skillet and the tiny skillet that does not get used much.

This is the 2nd seasoning bake (350º for 1 hour) for all except the large round. That one is in great shape already and this is the first and only it will need. The others will get at least one more bake.

The giant Dutch Oven (not pictured) will wait for another day. It rarely get used and takes up most of the oven on its own (it is better suited for cooking in a fire pit).

Some Statements

14 Jan

Cheer up! Things could always be worse.

Context is everything.

Everything is much more complicated that you imagine, no matter how deep your knowledge of the topic.

Apple Pandemic

20 Dec

Back before Thanksgiving, I stumbled on a recipe for something called an Apple Pandowdy and I decided to make it for the feast (limited group, well within our bubble). It was incredibly easy to make. The hard part was finding dried apples and puff pastry.

I used to be able to find dried apples and other dehydrated fruits in bulk at most of the stores around. I finally found little containers of them at about the fifth store I checked. Same with the puff pastry. Where they used to be easy to find, I had to search them out before finding some. I am lazy, as I think I have mentioned, I am not going make puff pastry from scratch or dehydrate my apples on my own. I might do either sometime, but not for an experimental dish. It is fortunate that we live in a time and a place where most things can be bought from someone who makes them better and where most store-bought things like these are mostly good.

The picture attached shows the results. It was tasty. I’ll be making another for Christmas. The recipe is from The Takeout. I followed it as written except I substituted Maker’s Mark for the Applejack because I did not have any and forgot to go looking sooner.

We are calling it Apple Pandemic partly for the obvious reason and partly because my wife stumbled over the name once and said ‘pandemic’ instead of ‘pandowdy’. It stuck.

People are Mostly Good

19 Dec

I believe almost all people are good, caring, and generous. Of the others, most of them are indifferent or at least not motivated to do bad things. I also believe that the remaining, very small percentage, are unlikely to honor any law preventing them from doing whatever they will do.

I believe our legislative and regulatory regimes should operate with the above assumptions. Any regulation or legislation which is built on the assumptions that most people have bad intent, or are too stupid to manage their own lives, is inherently immoral and destined to cause more harm than good. Legislation and regulation should be there only to punish the use of force, in all its various forms. Courts should be there to adjudicate contractual disputes. Everything else is, at best, a waste or, more likely, harmful.

Set Up New Mac

18 Dec

I got a new Mac to go with the new job. Here’s rough notes on what I did to set it up.

Open the box and plug it in.

Get it booted.

Create a new apple id for the new job along the way. Get annoyed at Apple for not allowing a letter to be used more than 2 times in a row e.g. a password with ‘AAA’ anywhere in it is not allowed. Just let me use whatever password I want.

Upgrade the OS

Update the OS from Catalina to Big Sur.

Configure Some Things

  • Make the touchpad NOT click on finger taps
  • Get my standard set of images for the screen saver and set it up to show them
  • Put the power saver settings the way I like them

Install All the Things


Install Chrome and set it as the default browser. Don’t @ me. This is the browser I use because it is the browser I use. I am not interested in browser wars.)

Create two user profiles in Chrome. One for work using the work email and one for personal using the personal email. This makes it easier to keep things with things while still making it not-too-bad to get at all my common tools using the chrome-synced manus, toolbars, and settings.

Password manager

Install my favored password manager because remembering passwords is hard work that no human should do.


Install VSCode. Install the key extensions.

  • EditorConfig
  • C/C++
  • CMake Tools
  • Docker

Realised I did not have all the extensions I expected on my personal machine. There are many that I used on my old work machine that are not yet there either. Awesome. Let’s guess what they are and install some of them on both machines.

  • Python
  • shellcheck (this will need some other things installed below)

That’ll get the most likely ones. Others can be installed as I go along.

Configure VSCode to allow code on the command line to open files.


Install ITerm2 and make its configuration match what’s on my personal machine.

Set Shell

Recall as some point that the newer MacOS versions default to zsh. Nothing against it, but I am sticking with bash.

Big Sur still has bash in the /etc/shells so I just need to change the default shell

chsh -s /bin/bash

I will have to change this when I install the newer version of bash below.


Putting this here even though I actually did it after brew install pyenv because I realized I would need the command line tools pretty soon.

Use the App store to install XCode. Which required setting up the App store with the new Apple ID.

Start XCode to click all the agree buttons.

This version of XCode installed the command line tools by default so xcode-select --install did not have to do anything.

(Carry on with the Brew installs…)


Install homebrew.

brew install all the things I use on my personal machine that look to be useful on the work machine.

brew list to get the list the cut it down to likely things
These are the important ones. These will get installed and configured now.

brew install magic-wormhole

Wonderful tool for moving things securely from one machine to another

brew install pyenv

(stop here uninstall it and go back two steps to install XCode and then the command line tools)

use pyenv to install the most recent python (3.9.0 now) and set it as the global python

pyenv install 3.9.0

This failed with an ugly python error. After consulting the googles I found this that worked:

LDFLAGS="-L$(xcrun --show-sdk-path)/usr/lib" pyenv install 3.9.0 
pyenv global 3.9.0 

brew install bash

Big Sur comes with bash 3.2 installed. I want something at >= 4.x. The personal machine has 5.0. After the install add the new bash to the /etc/shells file and set it with chsh -s /usr/local/bin/bash

brew tap homebrew/cask-fonts
brew install --cask font-fira-code

I like ligatures in editors. This is the font for that. Install the package then configure VSCode to use it and update settings for fonts

Font Family: Fira Code

To enable ligatures, add this to the settings.json "editor.fontLigatures": true,

brew install git

Cannot live on a computer without it

brew install hub

hub makes working with Github nicer from the command line

brew install git-crypt

Which I use to encrypt secrets on some of my repositories

brew install shellcheck

shellcheck is a lint tool for bash scripts. I very much like running lint and other static checks on code I write in any language. shellcheck has proved itself in both catching subtle errors in my bash scripts as well as teaching me better ways to write bash. This package needs to be installed so the shellcheck extension of VSCode will work, which is where I use it most of the time. It also has a command line which lets it be added to build scripts. I highly recommend using it.

There are some others that I will install later or as I find I need them:

  • ccache
  • gcc
  • ninja
  • xz
  • cmake
  • gdbm
  • jq
  • kdiff3

Dot Files

I have a repo full of dot files to bootstrap a bunch of configurations. I’ll get that down and put them where they belong.

Create a ~/projects/ folder, because that’s what I do.

Clone the dotfile repository.

Which requires telling GitHub about my new machine. Which means creating a new ssh key and putting it in all the places.

mkdir ~/.sshcd ~/.sshssh-keygen -t ed25519 -C ""
eval "$(ssh-agent -s)"
# update the ~/.ssh/config file with a Host 
blockssh-add -K ~/.ssh/id_ed25519
# add the key to Github
git clone <dotfiles repo>`

From the dot files:

  • Copy the ssh config parts that a generic into the ~/.ssh/config file.
  • Copy The bash files that are useful. There might be bits in these that don’t apply yet because something is not install, but it should be harmless to have it there early.
  • .bash_profile
  • .bashrc
  • Copy all of the git config files that are useful (some are specific to old git repositories that are no longer needed)
  • Copy all the other dotfiles that are there (vim, input, kdiff)

There are also some VSCode settings files cached here, but I will look at those and probably manually echo the settings instead of risking copying them blindly.

Utility Scripts

I have a big pile of utility scripts, mostly in bash, in a git repository. Clone that repository down.

Sundry Tools

Rogue Amoeba Tools

  • Loopback
  • Hijack
  • SoundSource

I have found these to be very useful for managing sound and sound-devices on the Mac.

Enough for Today

That gets the machine into basic working shape. That took about 4 hours.

Still left to do are things like

  • get gcc installed (so I can keep working on my Advent of Code)
  • get java installed (i’ll probably wait to make sure I get the one needed for the client gig)
  • getting the desktop apps for some of the office tools (outlook, miro, etc.)

I’ll write about those if anything special happens during the installs.

Changes, Again

16 Dec

I guess one post every 10 years is alright, yeah?

When last I left you, I was in a pause between adventures.

Spoilers: The pause ended and a different adventure began. That adventure is over, and now another begins.

Yeah, sorry to leave you hanging. That’s the way it goes sometimes. I’ll give the the short version to catch you up.

After the pause, I joined about 60 folks at this company:

Pillar Technology

Some interesting work with quite a lot of learning about ways to build and support teams developing products ensued. I helped many clients build many products. I helped open a couple of Forges.

Pillar Technology wants the Forge to support Columbus tech innovation -  Columbus Business First

Particularly the one in Des Moines. I also worked on many projects at the Ann Arbor Forge and the Columbus Forge.

The Forge | MODUS
Des Moines Forge

Pillar grew to about 400 people doing some cool work in many industries. About 2.5 years ago, Pillar was acquired by this company.

Accenture Logo | The most famous brands and company logos in the world

This part of the adventure had some potential. I helped open a new Forge in Chicago.

Chicago Inno - Accenture Opens mHub Tech Studio to Help Clients Make  Physical Products
Chicago Forge

The Chicago Forge was nestled inside a very cool place called mHub

Pillar Technology

Many interesting things happened and much fun was had. There was, and is, great potential for exciting, interesting work finding much value for great good. It was Mostly Good. Other than the difficulties meshing with a Multinational Corporate Behemoth. Some of the edges were rough and the meshing was not especially smooth.

I decided a short while ago that it was time to move to something other.

So, here we are at a new juncture on the cusp of a new adventure. So, let’s see how this goes.

LeadingAgile SoundNotes: an Agile Podcast

Bacon Three

19 Oct

Another Huge Success. I cured the entire belly this time, again in two halves. I made one half With No Weird Stuff, as the Law demands. The other half had only added brown sugar. Both are really good. The brown-sugar cure definitely added some sweetness and seemed to bring out other flavors as well. Ruhlman notes that extra sugar will make the smoking add more flavor so I’m guessing that is what happened.

This belly was purchased at the local Costco. They had a lot of bellies there and the price was about the same as the butcher shop. I am hoping they will continue to carry them when I want to get them. The belly was a good bit thicker than the one I got before. It also already had the skin removed, which saved me quite a lot of work. It did deprive me of the skin for cracklins, but they were able to leave much more fat on the belly than I had in my earlier effort. Tradeoffs.

At some point, I will seek out higher quality pork. We have had great success and are very pleased with the results using these commercial bellies. It will be interesting to see whether a belly from a small-farm raised hog really does have the difference reflected in the cost to make it worth using for us. Being Food Enjoyers and not Food Connoisseurs might make it a cost not necessary.

I show the smoking setup I used in the photo attached (the two parts of the collage were taken on different days). I use a grill and some hacks to get it to smoke at the temperature I want and still have smoke. A couple of bricks and a rack made a two-level area just right for these half-bellies. The old pan with the wood chunks is sitting directly on the gas burner. You can’t see it here, but I have about 75% of the burner holes covered with foil to be able to keep the temperature below 200ºF. I only light the one burner, mostly covered, and then keep it turned almost as low as it will go to get that temperature. I really like this grill. It has fairly heavy steel, a gas side, a charcoal side, and a side smoke box on the charcoal side. I use the gas side for most smoking because it is less hassle (I am generally really lazy). One thing the gas side does really well is get really, really, really HOT. I have gotten it hot enough that my probe thermometers exceed their maximum possible reading. The, highly inaccurate, dial thermometer on the grill lid shows it going to 700ºF+. The drawback is that it is very difficult to get a temperature below 300ºF with hacks like I describe above. But you can, so there.

Field Notes:

12.32lbs total. Split 6lb3¾oz; 6lb1½oz.
One half cured with brown sugar added
Other half cured with just the cure mix
Cured 14 days
Smoked with apple chunks at 210º to internal temp of 145º
Smoking took about 3 hours.

Happy surprise: this belly from Costco is much thicker that the previous belly from Fergusons and has a much thicker layer of fat (which seems a good thing right now). It also came with the skin already removed which cut out about 80% of the effort for me.