May 17, 2020


Open Source

A couple of new releases of the concurrency package this week, thanks to Mitchell Rosen for opening the issues. I’ve added the getMaskingState and unsafeUnmask functions to MonadConc, and released new versions of dejafu supporting them too.

Mitchell tried to open a PR for one of the changes, but my Travis config turned out not to be very friendly towards outside contributions. So I migrated to using GitHub Actions for CI and Concourse for CD. More on that later.


I took this week off work to relax.


I did a lot of reading this week, and also thought about a what books I want to read in the future.

Books I Read

Books I Want to Have Read

I have (or had) a lot of lists of books to read: some were entries on my to-do list; many were scattered across my bookmarks; and still more were in various Amazon wishlists. And most of them I’d not reviewed since first noting them down 5+ years ago. In practice, I almost never looked at the lists, and just bought things which caught my eye. That’s not a bad way to buy books but, in that case, why not just delete the lists?

Relatedly, I had read a blog post a while ago about why you should have a reading plan, and I’d wanted to come up with one, but it felt like a daunting task.

This week I set out to tackle both problems.

First I unified all my book wishlists. Some of the lists I just deleted entirely without looking at (what are the chances I’ve lost something irreplacable? very slim), but most of them I read, and pruned books I no longer wanted, or already owned, or which I couldn’t find in print (unless it was an out-of-print book I really wanted).

This resulted in a single list of 300 or so books.

I then started to think about a reading plan. Many people read the classics, or biographies of statesmen, or histories of a certain period: these are all well-defined categories. So I felt that my reading plan should be more structured than just a list of 300 books I happened to like the sound of.

I could read the classics, that’s certainly a conventional approach, but also I don’t find it very appealing. Then it struck me. When I’m in a book shop and don’t know what to buy, I’ve found that a very safe bet is something in the SF Masterworks collection. Every book in that collection which I’ve bought, I’ve enjoyed.

So here’s my reading plan:

All collections of classics, but not the classics.

And now my list of books has 535 entries. That should keep me busy for the next decade or so.

CI and CD

At work, we’ve recently decided to start using GitHub Actions for CI, and to migrate away from our self-hosted Jenkins instances. There are a lot of advantages (which I won’t go into here, but here’s the RFC should you want to read it), and this decision put GitHub Actions on my radar.

For my own stuff, I’ve been using Travis, but I hadn’t been too happy about using it since May 2018, when it was announced that open source things would be migrating to The promised migration hasn’t happened yet, two years later, and I’ve been warily expecting all my CI to just break and require me to do some maintenance at some point. Uncertainty is not good.

GitHub Actions looked pretty good, so I decided to migrate dejafu’s CI to Actions and its CD to Concourse.

I think it went pretty well. I’ve not had an opportunity to actually test the CD side of it yet, but the CI has been working nicely. I’ve decided to migrate the rest of my Haskell libraries over—irc-ctcp, irc-conduit, irc-client, and both—they’re all deeply in maintenance mode, but consistency is good.