Hardscrabble 🍫

By Maxwell Jacobson

See also: the archives and an RSS feed

Traffic Altercation

April 2, 2023

This sketch from last night’s SNL made me laugh out loud:

It features host Quinta Brunson from Abbott Elementary and I don’t really want to describe it except to say it’s very funny and features quite a lot of shouting. Enjoy.

It seems like road rage may be in the zeitgeist. I’m very much looking forward to Beef, the new Netflix show starring Steven Yeun and Ali Wong about a traffic altercation that spirals out of control.

This is America

April 2, 2023

When there’s another mass shooting in America my mind often goes to this music video from Donald Glover’s Childish Gambino:

You’ve probably seen it before, but I don’t care, it’s so good. Watch it again.

Taylor Swift - Riptide

March 20, 2023

I’ve always loved this Taylor Swift performance of Riptide from 2014.

The original is quite corny and insincere, IMHO, but the words feel potent in Swift’s voice. In part this is because she didn’t touch any of the pronouns, and doesn’t shy away from lyrics like β€œI wanna be your left-hand man”, which brings to mind the Gaylor conspiracy theory.

Understanding your homebrew dependencies

March 8, 2023

As a programmer who uses macOS, I greatly appreciate Homebrew, the β€œMissing Package Manager for macOS”.

I just learned about the brew leaves subcommand and was glad to discover it. Here’s a bit about how and why I’m using it.

This may be neurotic, or it may be some PTSD from when I used Arch Linux for a few years, but I try to upgrade all of my homebrew-managed dependencies regularly.

Here’s how I do it.

First, I tell homebrew to phone home and update its local list of packages, which it can use to tell if any of my locally-installed packages have updates:

$ brew update

Then I ask homebrew to list out which packages have updates available, if any:

$ brew outdated

Then, typically, I’ll upgrade all of them1:

$ brew upgrade

Very often I’ll find that some of my outdated packages have names that I do not recognize. There are only about 30 packages that I explicitly install2, but most of those have dependencies which end up getting installed too, so I end up with way more than 30 packages total – more like 138.

For example, I use vim, and vim has several dependencies that homebrew installs when it installs vim:

$ brew deps vim --tree
vim
β”œβ”€β”€ gettext
β”œβ”€β”€ lua
β”œβ”€β”€ ncurses
β”œβ”€β”€ perl
β”‚   β”œβ”€β”€ berkeley-db
β”‚   β”‚   └── openssl@1.1
β”‚   β”‚       └── ca-certificates
β”‚   └── gdbm
β”œβ”€β”€ python@3.11
β”‚   β”œβ”€β”€ mpdecimal
β”‚   β”œβ”€β”€ openssl@1.1
β”‚   β”‚   └── ca-certificates
β”‚   β”œβ”€β”€ sqlite
β”‚   β”‚   └── readline
β”‚   └── xz
└── ruby
    β”œβ”€β”€ libyaml
    β”œβ”€β”€ openssl@1.1
    β”‚   └── ca-certificates
    └── readline

Wow, look at all of those! So, because I installed vim, I also necessarily installed 15 other packages, and I’ll be updating all of them as time goes on.

When homebrew tells me that, for example, xz is outdated, a few questions enter my mind:

  1. what the heck is that?
  2. ok, it’s surely a dependency of something, but what is it a dependency of?
  3. is it possible that it’s actually not even necessary to have installed any longer? Maybe it was a dependency of something that I later uninstalled, but it just lingered around…

Answering all of those questions is possible, but I didn’t actually know how to answer them until today. Let’s take them one-by-one.

What the heck is that?

To answer this, we can use brew info:

$ brew info xz
==> xz: stable 5.4.1 (bottled)
General-purpose data compression with high compression ratio
https://tukaani.org/xz/
/opt/homebrew/Cellar/xz/5.4.1 (95 files, 1.7MB) *
  Poured from bottle on 2023-01-16 at 04:20:15
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/xz.rb
License: Public Domain and LGPL-2.1-or-later and GPL-2.0-or-later and GPL-3.0-or-later
==> Analytics
install: 456,730 (30 days), 2,613,650 (90 days), 7,814,033 (365 days)
install-on-request: 22,257 (30 days), 150,853 (90 days), 422,948 (365 days)
build-error: 44 (30 days)

Which… sure, whatever. Sounds important.

What is this a dependency of?

This is a slightly tricky thing to answer. As far as I can tell, there’s no command such as brew why xz that could simply answer why is it installed (please get in touch if I’m mistaken).

What we can do is use the brew deps command to describe the relationships between packages, and then search through it to see exactly why it is installed. For me, that prints out 1,580 lines of output, which I’ll share in full behind a collapsible details widget here:

Full output of brew deps --full-name --installed --tree (click to expand)

aom
β”œβ”€β”€ jpeg-xl
β”‚   β”œβ”€β”€ brotli
β”‚   β”œβ”€β”€ giflib
β”‚   β”œβ”€β”€ highway
β”‚   β”œβ”€β”€ imath
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”œβ”€β”€ libpng
β”‚   β”œβ”€β”€ little-cms2
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   └── libtiff
β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚       └── zstd
β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚           └── xz
β”‚   β”œβ”€β”€ openexr
β”‚   β”‚   └── imath
β”‚   └── webp
β”‚       β”œβ”€β”€ giflib
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       β”œβ”€β”€ libpng
β”‚       └── libtiff
β”‚           β”œβ”€β”€ jpeg-turbo
β”‚           └── zstd
β”‚               β”œβ”€β”€ lz4
β”‚               └── xz
└── libvmaf

autoconf
└── m4

bash

bat

bdw-gc

berkeley-db
└── openssl@1.1
    └── ca-certificates

indirect/tap/bpb

brotli

ca-certificates

cairo
β”œβ”€β”€ fontconfig
β”‚   └── freetype
β”‚       └── libpng
β”œβ”€β”€ freetype
β”‚   └── libpng
β”œβ”€β”€ glib
β”‚   β”œβ”€β”€ pcre2
β”‚   └── gettext
β”œβ”€β”€ libpng
β”œβ”€β”€ libx11
β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── libxdmcp
β”‚   β”‚       └── xorgproto
β”‚   └── xorgproto
β”œβ”€β”€ libxcb
β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   └── xorgproto
β”‚   └── libxdmcp
β”‚       └── xorgproto
β”œβ”€β”€ libxext
β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   └── xorgproto
β”œβ”€β”€ libxrender
β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   └── xorgproto
β”œβ”€β”€ lzo
└── pixman

cloc

ctags

emacs
β”œβ”€β”€ gnutls
β”‚   β”œβ”€β”€ ca-certificates
β”‚   β”œβ”€β”€ gmp
β”‚   β”œβ”€β”€ libidn2
β”‚   β”‚   β”œβ”€β”€ libunistring
β”‚   β”‚   └── gettext
β”‚   β”œβ”€β”€ libtasn1
β”‚   β”œβ”€β”€ libunistring
β”‚   β”œβ”€β”€ nettle
β”‚   β”‚   └── gmp
β”‚   β”œβ”€β”€ p11-kit
β”‚   β”‚   β”œβ”€β”€ ca-certificates
β”‚   β”‚   └── libtasn1
β”‚   └── unbound
β”‚       β”œβ”€β”€ libevent
β”‚       β”‚   └── openssl@1.1
β”‚       β”‚       └── ca-certificates
β”‚       β”œβ”€β”€ libnghttp2
β”‚       └── openssl@1.1
β”‚           └── ca-certificates
└── jansson

exa
└── libgit2
    └── libssh2
        └── openssl@1.1
            └── ca-certificates

fd

fnm

fontconfig
└── freetype
    └── libpng

freetype
└── libpng

fribidi

gd
β”œβ”€β”€ fontconfig
β”‚   └── freetype
β”‚       └── libpng
β”œβ”€β”€ freetype
β”‚   └── libpng
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ libavif
β”‚   β”œβ”€β”€ aom
β”‚   β”‚   β”œβ”€β”€ jpeg-xl
β”‚   β”‚   β”‚   β”œβ”€β”€ brotli
β”‚   β”‚   β”‚   β”œβ”€β”€ giflib
β”‚   β”‚   β”‚   β”œβ”€β”€ highway
β”‚   β”‚   β”‚   β”œβ”€β”€ imath
β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”œβ”€β”€ libpng
β”‚   β”‚   β”‚   β”œβ”€β”€ little-cms2
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚   └── libtiff
β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚       └── zstd
β”‚   β”‚   β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚   β”‚   β”‚           └── xz
β”‚   β”‚   β”‚   β”œβ”€β”€ openexr
β”‚   β”‚   β”‚   β”‚   └── imath
β”‚   β”‚   β”‚   └── webp
β”‚   β”‚   β”‚       β”œβ”€β”€ giflib
β”‚   β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚       β”œβ”€β”€ libpng
β”‚   β”‚   β”‚       └── libtiff
β”‚   β”‚   β”‚           β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚           └── zstd
β”‚   β”‚   β”‚               β”œβ”€β”€ lz4
β”‚   β”‚   β”‚               └── xz
β”‚   β”‚   └── libvmaf
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── libpng
β”œβ”€β”€ libpng
β”œβ”€β”€ libtiff
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── zstd
β”‚       β”œβ”€β”€ lz4
β”‚       └── xz
└── webp
    β”œβ”€β”€ giflib
    β”œβ”€β”€ jpeg-turbo
    β”œβ”€β”€ libpng
    └── libtiff
        β”œβ”€β”€ jpeg-turbo
        └── zstd
            β”œβ”€β”€ lz4
            └── xz

gdbm

gdk-pixbuf
β”œβ”€β”€ glib
β”‚   β”œβ”€β”€ pcre2
β”‚   └── gettext
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ libpng
└── libtiff
    β”œβ”€β”€ jpeg-turbo
    └── zstd
        β”œβ”€β”€ lz4
        └── xz

gettext

gh

ghostscript
β”œβ”€β”€ fontconfig
β”‚   └── freetype
β”‚       └── libpng
β”œβ”€β”€ freetype
β”‚   └── libpng
β”œβ”€β”€ jbig2dec
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ libidn
β”œβ”€β”€ libpng
β”œβ”€β”€ libtiff
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── zstd
β”‚       β”œβ”€β”€ lz4
β”‚       └── xz
β”œβ”€β”€ little-cms2
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── libtiff
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       └── zstd
β”‚           β”œβ”€β”€ lz4
β”‚           └── xz
└── openjpeg
    β”œβ”€β”€ libpng
    β”œβ”€β”€ libtiff
    β”‚   β”œβ”€β”€ jpeg-turbo
    β”‚   └── zstd
    β”‚       β”œβ”€β”€ lz4
    β”‚       └── xz
    └── little-cms2
        β”œβ”€β”€ jpeg-turbo
        └── libtiff
            β”œβ”€β”€ jpeg-turbo
            └── zstd
                β”œβ”€β”€ lz4
                └── xz

giflib

git
β”œβ”€β”€ gettext
└── pcre2

git-delta

glib
β”œβ”€β”€ pcre2
└── gettext

gmp

gnutls
β”œβ”€β”€ ca-certificates
β”œβ”€β”€ gmp
β”œβ”€β”€ libidn2
β”‚   β”œβ”€β”€ libunistring
β”‚   └── gettext
β”œβ”€β”€ libtasn1
β”œβ”€β”€ libunistring
β”œβ”€β”€ nettle
β”‚   └── gmp
β”œβ”€β”€ p11-kit
β”‚   β”œβ”€β”€ ca-certificates
β”‚   └── libtasn1
└── unbound
    β”œβ”€β”€ libevent
    β”‚   └── openssl@1.1
    β”‚       └── ca-certificates
    β”œβ”€β”€ libnghttp2
    └── openssl@1.1
        └── ca-certificates

graphite2

graphviz
β”œβ”€β”€ gd
β”‚   β”œβ”€β”€ fontconfig
β”‚   β”‚   └── freetype
β”‚   β”‚       └── libpng
β”‚   β”œβ”€β”€ freetype
β”‚   β”‚   └── libpng
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”œβ”€β”€ libavif
β”‚   β”‚   β”œβ”€β”€ aom
β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-xl
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ brotli
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ giflib
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ highway
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ imath
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libpng
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ little-cms2
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚   β”‚   └── libtiff
β”‚   β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚   β”‚       └── zstd
β”‚   β”‚   β”‚   β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚   β”‚   β”‚   β”‚           └── xz
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ openexr
β”‚   β”‚   β”‚   β”‚   β”‚   └── imath
β”‚   β”‚   β”‚   β”‚   └── webp
β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ giflib
β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ libpng
β”‚   β”‚   β”‚   β”‚       └── libtiff
β”‚   β”‚   β”‚   β”‚           β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚           └── zstd
β”‚   β”‚   β”‚   β”‚               β”œβ”€β”€ lz4
β”‚   β”‚   β”‚   β”‚               └── xz
β”‚   β”‚   β”‚   └── libvmaf
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   └── libpng
β”‚   β”œβ”€β”€ libpng
β”‚   β”œβ”€β”€ libtiff
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   └── zstd
β”‚   β”‚       β”œβ”€β”€ lz4
β”‚   β”‚       └── xz
β”‚   └── webp
β”‚       β”œβ”€β”€ giflib
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       β”œβ”€β”€ libpng
β”‚       └── libtiff
β”‚           β”œβ”€β”€ jpeg-turbo
β”‚           └── zstd
β”‚               β”œβ”€β”€ lz4
β”‚               └── xz
β”œβ”€β”€ gts
β”‚   β”œβ”€β”€ glib
β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚   β”‚   └── gettext
β”‚   β”œβ”€β”€ netpbm
β”‚   β”‚   β”œβ”€β”€ jasper
β”‚   β”‚   β”‚   └── jpeg-turbo
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”œβ”€β”€ libpng
β”‚   β”‚   └── libtiff
β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚       └── zstd
β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚           └── xz
β”‚   └── gettext
β”œβ”€β”€ libpng
β”œβ”€β”€ librsvg
β”‚   β”œβ”€β”€ cairo
β”‚   β”‚   β”œβ”€β”€ fontconfig
β”‚   β”‚   β”‚   └── freetype
β”‚   β”‚   β”‚       └── libpng
β”‚   β”‚   β”œβ”€β”€ freetype
β”‚   β”‚   β”‚   └── libpng
β”‚   β”‚   β”œβ”€β”€ glib
β”‚   β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚   β”‚   β”‚   └── gettext
β”‚   β”‚   β”œβ”€β”€ libpng
β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”œβ”€β”€ libxext
β”‚   β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”œβ”€β”€ libxrender
β”‚   β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”œβ”€β”€ lzo
β”‚   β”‚   └── pixman
β”‚   β”œβ”€β”€ gdk-pixbuf
β”‚   β”‚   β”œβ”€β”€ glib
β”‚   β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚   β”‚   β”‚   └── gettext
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”œβ”€β”€ libpng
β”‚   β”‚   └── libtiff
β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚       └── zstd
β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚           └── xz
β”‚   β”œβ”€β”€ glib
β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚   β”‚   └── gettext
β”‚   └── pango
β”‚       β”œβ”€β”€ cairo
β”‚       β”‚   β”œβ”€β”€ fontconfig
β”‚       β”‚   β”‚   └── freetype
β”‚       β”‚   β”‚       └── libpng
β”‚       β”‚   β”œβ”€β”€ freetype
β”‚       β”‚   β”‚   └── libpng
β”‚       β”‚   β”œβ”€β”€ glib
β”‚       β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚       β”‚   β”‚   └── gettext
β”‚       β”‚   β”œβ”€β”€ libpng
β”‚       β”‚   β”œβ”€β”€ libx11
β”‚       β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚       β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚       β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”‚   β”‚   └── libxdmcp
β”‚       β”‚   β”‚   β”‚       └── xorgproto
β”‚       β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”œβ”€β”€ libxcb
β”‚       β”‚   β”‚   β”œβ”€β”€ libxau
β”‚       β”‚   β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”‚   └── libxdmcp
β”‚       β”‚   β”‚       └── xorgproto
β”‚       β”‚   β”œβ”€β”€ libxext
β”‚       β”‚   β”‚   β”œβ”€β”€ libx11
β”‚       β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚       β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚       β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚       β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚       β”‚   β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”œβ”€β”€ libxrender
β”‚       β”‚   β”‚   β”œβ”€β”€ libx11
β”‚       β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚       β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚       β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚       β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚       β”‚   β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”‚   └── xorgproto
β”‚       β”‚   β”œβ”€β”€ lzo
β”‚       β”‚   └── pixman
β”‚       β”œβ”€β”€ fontconfig
β”‚       β”‚   └── freetype
β”‚       β”‚       └── libpng
β”‚       β”œβ”€β”€ freetype
β”‚       β”‚   └── libpng
β”‚       β”œβ”€β”€ fribidi
β”‚       β”œβ”€β”€ glib
β”‚       β”‚   β”œβ”€β”€ pcre2
β”‚       β”‚   └── gettext
β”‚       └── harfbuzz
β”‚           β”œβ”€β”€ cairo
β”‚           β”‚   β”œβ”€β”€ fontconfig
β”‚           β”‚   β”‚   └── freetype
β”‚           β”‚   β”‚       └── libpng
β”‚           β”‚   β”œβ”€β”€ freetype
β”‚           β”‚   β”‚   └── libpng
β”‚           β”‚   β”œβ”€β”€ glib
β”‚           β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚           β”‚   β”‚   └── gettext
β”‚           β”‚   β”œβ”€β”€ libpng
β”‚           β”‚   β”œβ”€β”€ libx11
β”‚           β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚           β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚           β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”‚   β”‚   └── libxdmcp
β”‚           β”‚   β”‚   β”‚       └── xorgproto
β”‚           β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”œβ”€β”€ libxcb
β”‚           β”‚   β”‚   β”œβ”€β”€ libxau
β”‚           β”‚   β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”‚   └── libxdmcp
β”‚           β”‚   β”‚       └── xorgproto
β”‚           β”‚   β”œβ”€β”€ libxext
β”‚           β”‚   β”‚   β”œβ”€β”€ libx11
β”‚           β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚           β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚           β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚           β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚           β”‚   β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”œβ”€β”€ libxrender
β”‚           β”‚   β”‚   β”œβ”€β”€ libx11
β”‚           β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚           β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚           β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚           β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚           β”‚   β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”‚   └── xorgproto
β”‚           β”‚   β”œβ”€β”€ lzo
β”‚           β”‚   └── pixman
β”‚           β”œβ”€β”€ freetype
β”‚           β”‚   └── libpng
β”‚           β”œβ”€β”€ glib
β”‚           β”‚   β”œβ”€β”€ pcre2
β”‚           β”‚   └── gettext
β”‚           β”œβ”€β”€ graphite2
β”‚           └── icu4c
β”œβ”€β”€ libtool
β”‚   └── m4
└── pango
    β”œβ”€β”€ cairo
    β”‚   β”œβ”€β”€ fontconfig
    β”‚   β”‚   └── freetype
    β”‚   β”‚       └── libpng
    β”‚   β”œβ”€β”€ freetype
    β”‚   β”‚   └── libpng
    β”‚   β”œβ”€β”€ glib
    β”‚   β”‚   β”œβ”€β”€ pcre2
    β”‚   β”‚   └── gettext
    β”‚   β”œβ”€β”€ libpng
    β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── libxdmcp
    β”‚   β”‚       └── xorgproto
    β”‚   β”œβ”€β”€ libxext
    β”‚   β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ libxrender
    β”‚   β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ lzo
    β”‚   └── pixman
    β”œβ”€β”€ fontconfig
    β”‚   └── freetype
    β”‚       └── libpng
    β”œβ”€β”€ freetype
    β”‚   └── libpng
    β”œβ”€β”€ fribidi
    β”œβ”€β”€ glib
    β”‚   β”œβ”€β”€ pcre2
    β”‚   └── gettext
    └── harfbuzz
        β”œβ”€β”€ cairo
        β”‚   β”œβ”€β”€ fontconfig
        β”‚   β”‚   └── freetype
        β”‚   β”‚       └── libpng
        β”‚   β”œβ”€β”€ freetype
        β”‚   β”‚   └── libpng
        β”‚   β”œβ”€β”€ glib
        β”‚   β”‚   β”œβ”€β”€ pcre2
        β”‚   β”‚   └── gettext
        β”‚   β”œβ”€β”€ libpng
        β”‚   β”œβ”€β”€ libx11
        β”‚   β”‚   β”œβ”€β”€ libxcb
        β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
        β”‚   β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   β”‚   └── libxdmcp
        β”‚   β”‚   β”‚       └── xorgproto
        β”‚   β”‚   └── xorgproto
        β”‚   β”œβ”€β”€ libxcb
        β”‚   β”‚   β”œβ”€β”€ libxau
        β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   └── libxdmcp
        β”‚   β”‚       └── xorgproto
        β”‚   β”œβ”€β”€ libxext
        β”‚   β”‚   β”œβ”€β”€ libx11
        β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
        β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
        β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   β”‚   β”‚   └── libxdmcp
        β”‚   β”‚   β”‚   β”‚       └── xorgproto
        β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   └── xorgproto
        β”‚   β”œβ”€β”€ libxrender
        β”‚   β”‚   β”œβ”€β”€ libx11
        β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
        β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
        β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   β”‚   β”‚   └── libxdmcp
        β”‚   β”‚   β”‚   β”‚       └── xorgproto
        β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   └── xorgproto
        β”‚   β”œβ”€β”€ lzo
        β”‚   └── pixman
        β”œβ”€β”€ freetype
        β”‚   └── libpng
        β”œβ”€β”€ glib
        β”‚   β”œβ”€β”€ pcre2
        β”‚   └── gettext
        β”œβ”€β”€ graphite2
        └── icu4c

gts
β”œβ”€β”€ glib
β”‚   β”œβ”€β”€ pcre2
β”‚   └── gettext
β”œβ”€β”€ netpbm
β”‚   β”œβ”€β”€ jasper
β”‚   β”‚   └── jpeg-turbo
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”œβ”€β”€ libpng
β”‚   └── libtiff
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       └── zstd
β”‚           β”œβ”€β”€ lz4
β”‚           └── xz
└── gettext

guile
β”œβ”€β”€ bdw-gc
β”œβ”€β”€ gmp
β”œβ”€β”€ libtool
β”‚   └── m4
β”œβ”€β”€ libunistring
β”œβ”€β”€ pkg-config
└── readline

harfbuzz
β”œβ”€β”€ cairo
β”‚   β”œβ”€β”€ fontconfig
β”‚   β”‚   └── freetype
β”‚   β”‚       └── libpng
β”‚   β”œβ”€β”€ freetype
β”‚   β”‚   └── libpng
β”‚   β”œβ”€β”€ glib
β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚   β”‚   └── gettext
β”‚   β”œβ”€β”€ libpng
β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── libxdmcp
β”‚   β”‚       └── xorgproto
β”‚   β”œβ”€β”€ libxext
β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ libxrender
β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ lzo
β”‚   └── pixman
β”œβ”€β”€ freetype
β”‚   └── libpng
β”œβ”€β”€ glib
β”‚   β”œβ”€β”€ pcre2
β”‚   └── gettext
β”œβ”€β”€ graphite2
└── icu4c

heroku/brew/heroku
└── heroku/brew/heroku-node

heroku/brew/heroku-node

highway

htop
└── ncurses

icu4c

imagemagick
β”œβ”€β”€ freetype
β”‚   └── libpng
β”œβ”€β”€ ghostscript
β”‚   β”œβ”€β”€ fontconfig
β”‚   β”‚   └── freetype
β”‚   β”‚       └── libpng
β”‚   β”œβ”€β”€ freetype
β”‚   β”‚   └── libpng
β”‚   β”œβ”€β”€ jbig2dec
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”œβ”€β”€ libidn
β”‚   β”œβ”€β”€ libpng
β”‚   β”œβ”€β”€ libtiff
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   └── zstd
β”‚   β”‚       β”œβ”€β”€ lz4
β”‚   β”‚       └── xz
β”‚   β”œβ”€β”€ little-cms2
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   └── libtiff
β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚       └── zstd
β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚           └── xz
β”‚   └── openjpeg
β”‚       β”œβ”€β”€ libpng
β”‚       β”œβ”€β”€ libtiff
β”‚       β”‚   β”œβ”€β”€ jpeg-turbo
β”‚       β”‚   └── zstd
β”‚       β”‚       β”œβ”€β”€ lz4
β”‚       β”‚       └── xz
β”‚       └── little-cms2
β”‚           β”œβ”€β”€ jpeg-turbo
β”‚           └── libtiff
β”‚               β”œβ”€β”€ jpeg-turbo
β”‚               └── zstd
β”‚                   β”œβ”€β”€ lz4
β”‚                   └── xz
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ libheif
β”‚   β”œβ”€β”€ aom
β”‚   β”‚   β”œβ”€β”€ jpeg-xl
β”‚   β”‚   β”‚   β”œβ”€β”€ brotli
β”‚   β”‚   β”‚   β”œβ”€β”€ giflib
β”‚   β”‚   β”‚   β”œβ”€β”€ highway
β”‚   β”‚   β”‚   β”œβ”€β”€ imath
β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”œβ”€β”€ libpng
β”‚   β”‚   β”‚   β”œβ”€β”€ little-cms2
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚   └── libtiff
β”‚   β”‚   β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   β”‚       └── zstd
β”‚   β”‚   β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚   β”‚   β”‚           └── xz
β”‚   β”‚   β”‚   β”œβ”€β”€ openexr
β”‚   β”‚   β”‚   β”‚   └── imath
β”‚   β”‚   β”‚   └── webp
β”‚   β”‚   β”‚       β”œβ”€β”€ giflib
β”‚   β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚       β”œβ”€β”€ libpng
β”‚   β”‚   β”‚       └── libtiff
β”‚   β”‚   β”‚           β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚           └── zstd
β”‚   β”‚   β”‚               β”œβ”€β”€ lz4
β”‚   β”‚   β”‚               └── xz
β”‚   β”‚   └── libvmaf
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”œβ”€β”€ libde265
β”‚   β”œβ”€β”€ libpng
β”‚   β”œβ”€β”€ shared-mime-info
β”‚   β”‚   └── glib
β”‚   β”‚       β”œβ”€β”€ pcre2
β”‚   β”‚       └── gettext
β”‚   └── x265
β”œβ”€β”€ liblqr
β”‚   └── glib
β”‚       β”œβ”€β”€ pcre2
β”‚       └── gettext
β”œβ”€β”€ libpng
β”œβ”€β”€ libraw
β”‚   β”œβ”€β”€ jasper
β”‚   β”‚   └── jpeg-turbo
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”œβ”€β”€ little-cms2
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   └── libtiff
β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚       └── zstd
β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚           └── xz
β”‚   └── libomp
β”œβ”€β”€ libtiff
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── zstd
β”‚       β”œβ”€β”€ lz4
β”‚       └── xz
β”œβ”€β”€ libtool
β”‚   └── m4
β”œβ”€β”€ little-cms2
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── libtiff
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       └── zstd
β”‚           β”œβ”€β”€ lz4
β”‚           └── xz
β”œβ”€β”€ openexr
β”‚   └── imath
β”œβ”€β”€ openjpeg
β”‚   β”œβ”€β”€ libpng
β”‚   β”œβ”€β”€ libtiff
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   └── zstd
β”‚   β”‚       β”œβ”€β”€ lz4
β”‚   β”‚       └── xz
β”‚   └── little-cms2
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       └── libtiff
β”‚           β”œβ”€β”€ jpeg-turbo
β”‚           └── zstd
β”‚               β”œβ”€β”€ lz4
β”‚               └── xz
β”œβ”€β”€ webp
β”‚   β”œβ”€β”€ giflib
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”œβ”€β”€ libpng
β”‚   └── libtiff
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       └── zstd
β”‚           β”œβ”€β”€ lz4
β”‚           └── xz
β”œβ”€β”€ xz
└── libomp

imath

jansson

jasper
└── jpeg-turbo

jbig2dec

jpeg-turbo

jpeg-xl
β”œβ”€β”€ brotli
β”œβ”€β”€ giflib
β”œβ”€β”€ highway
β”œβ”€β”€ imath
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ libpng
β”œβ”€β”€ little-cms2
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── libtiff
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       └── zstd
β”‚           β”œβ”€β”€ lz4
β”‚           └── xz
β”œβ”€β”€ openexr
β”‚   └── imath
└── webp
    β”œβ”€β”€ giflib
    β”œβ”€β”€ jpeg-turbo
    β”œβ”€β”€ libpng
    └── libtiff
        β”œβ”€β”€ jpeg-turbo
        └── zstd
            β”œβ”€β”€ lz4
            └── xz

jq
└── oniguruma

krb5
└── openssl@1.1
    └── ca-certificates

libavif
β”œβ”€β”€ aom
β”‚   β”œβ”€β”€ jpeg-xl
β”‚   β”‚   β”œβ”€β”€ brotli
β”‚   β”‚   β”œβ”€β”€ giflib
β”‚   β”‚   β”œβ”€β”€ highway
β”‚   β”‚   β”œβ”€β”€ imath
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”œβ”€β”€ libpng
β”‚   β”‚   β”œβ”€β”€ little-cms2
β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   └── libtiff
β”‚   β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚       └── zstd
β”‚   β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚   β”‚           └── xz
β”‚   β”‚   β”œβ”€β”€ openexr
β”‚   β”‚   β”‚   └── imath
β”‚   β”‚   └── webp
β”‚   β”‚       β”œβ”€β”€ giflib
β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚       β”œβ”€β”€ libpng
β”‚   β”‚       └── libtiff
β”‚   β”‚           β”œβ”€β”€ jpeg-turbo
β”‚   β”‚           └── zstd
β”‚   β”‚               β”œβ”€β”€ lz4
β”‚   β”‚               └── xz
β”‚   └── libvmaf
β”œβ”€β”€ jpeg-turbo
└── libpng

libde265

libevent
└── openssl@1.1
    └── ca-certificates

libheif
β”œβ”€β”€ aom
β”‚   β”œβ”€β”€ jpeg-xl
β”‚   β”‚   β”œβ”€β”€ brotli
β”‚   β”‚   β”œβ”€β”€ giflib
β”‚   β”‚   β”œβ”€β”€ highway
β”‚   β”‚   β”œβ”€β”€ imath
β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”œβ”€β”€ libpng
β”‚   β”‚   β”œβ”€β”€ little-cms2
β”‚   β”‚   β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚   └── libtiff
β”‚   β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚   β”‚       └── zstd
β”‚   β”‚   β”‚           β”œβ”€β”€ lz4
β”‚   β”‚   β”‚           └── xz
β”‚   β”‚   β”œβ”€β”€ openexr
β”‚   β”‚   β”‚   └── imath
β”‚   β”‚   └── webp
β”‚   β”‚       β”œβ”€β”€ giflib
β”‚   β”‚       β”œβ”€β”€ jpeg-turbo
β”‚   β”‚       β”œβ”€β”€ libpng
β”‚   β”‚       └── libtiff
β”‚   β”‚           β”œβ”€β”€ jpeg-turbo
β”‚   β”‚           └── zstd
β”‚   β”‚               β”œβ”€β”€ lz4
β”‚   β”‚               └── xz
β”‚   └── libvmaf
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ libde265
β”œβ”€β”€ libpng
β”œβ”€β”€ shared-mime-info
β”‚   └── glib
β”‚       β”œβ”€β”€ pcre2
β”‚       └── gettext
└── x265

libidn

libidn2
β”œβ”€β”€ libunistring
└── gettext

liblqr
└── glib
    β”œβ”€β”€ pcre2
    └── gettext

libnghttp2

libomp

libpng

libraw
β”œβ”€β”€ jasper
β”‚   └── jpeg-turbo
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ little-cms2
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── libtiff
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       └── zstd
β”‚           β”œβ”€β”€ lz4
β”‚           └── xz
└── libomp

librsvg
β”œβ”€β”€ cairo
β”‚   β”œβ”€β”€ fontconfig
β”‚   β”‚   └── freetype
β”‚   β”‚       └── libpng
β”‚   β”œβ”€β”€ freetype
β”‚   β”‚   └── libpng
β”‚   β”œβ”€β”€ glib
β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚   β”‚   └── gettext
β”‚   β”œβ”€β”€ libpng
β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── libxdmcp
β”‚   β”‚       └── xorgproto
β”‚   β”œβ”€β”€ libxext
β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ libxrender
β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ lzo
β”‚   └── pixman
β”œβ”€β”€ gdk-pixbuf
β”‚   β”œβ”€β”€ glib
β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚   β”‚   └── gettext
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   β”œβ”€β”€ libpng
β”‚   └── libtiff
β”‚       β”œβ”€β”€ jpeg-turbo
β”‚       └── zstd
β”‚           β”œβ”€β”€ lz4
β”‚           └── xz
β”œβ”€β”€ glib
β”‚   β”œβ”€β”€ pcre2
β”‚   └── gettext
└── pango
    β”œβ”€β”€ cairo
    β”‚   β”œβ”€β”€ fontconfig
    β”‚   β”‚   └── freetype
    β”‚   β”‚       └── libpng
    β”‚   β”œβ”€β”€ freetype
    β”‚   β”‚   └── libpng
    β”‚   β”œβ”€β”€ glib
    β”‚   β”‚   β”œβ”€β”€ pcre2
    β”‚   β”‚   └── gettext
    β”‚   β”œβ”€β”€ libpng
    β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── libxdmcp
    β”‚   β”‚       └── xorgproto
    β”‚   β”œβ”€β”€ libxext
    β”‚   β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ libxrender
    β”‚   β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ lzo
    β”‚   └── pixman
    β”œβ”€β”€ fontconfig
    β”‚   └── freetype
    β”‚       └── libpng
    β”œβ”€β”€ freetype
    β”‚   └── libpng
    β”œβ”€β”€ fribidi
    β”œβ”€β”€ glib
    β”‚   β”œβ”€β”€ pcre2
    β”‚   └── gettext
    └── harfbuzz
        β”œβ”€β”€ cairo
        β”‚   β”œβ”€β”€ fontconfig
        β”‚   β”‚   └── freetype
        β”‚   β”‚       └── libpng
        β”‚   β”œβ”€β”€ freetype
        β”‚   β”‚   └── libpng
        β”‚   β”œβ”€β”€ glib
        β”‚   β”‚   β”œβ”€β”€ pcre2
        β”‚   β”‚   └── gettext
        β”‚   β”œβ”€β”€ libpng
        β”‚   β”œβ”€β”€ libx11
        β”‚   β”‚   β”œβ”€β”€ libxcb
        β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
        β”‚   β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   β”‚   └── libxdmcp
        β”‚   β”‚   β”‚       └── xorgproto
        β”‚   β”‚   └── xorgproto
        β”‚   β”œβ”€β”€ libxcb
        β”‚   β”‚   β”œβ”€β”€ libxau
        β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   └── libxdmcp
        β”‚   β”‚       └── xorgproto
        β”‚   β”œβ”€β”€ libxext
        β”‚   β”‚   β”œβ”€β”€ libx11
        β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
        β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
        β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   β”‚   β”‚   └── libxdmcp
        β”‚   β”‚   β”‚   β”‚       └── xorgproto
        β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   └── xorgproto
        β”‚   β”œβ”€β”€ libxrender
        β”‚   β”‚   β”œβ”€β”€ libx11
        β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
        β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
        β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   β”‚   β”‚   └── libxdmcp
        β”‚   β”‚   β”‚   β”‚       └── xorgproto
        β”‚   β”‚   β”‚   └── xorgproto
        β”‚   β”‚   └── xorgproto
        β”‚   β”œβ”€β”€ lzo
        β”‚   └── pixman
        β”œβ”€β”€ freetype
        β”‚   └── libpng
        β”œβ”€β”€ glib
        β”‚   β”œβ”€β”€ pcre2
        β”‚   └── gettext
        β”œβ”€β”€ graphite2
        └── icu4c

libtasn1

libtermkey
└── unibilium

libtiff
β”œβ”€β”€ jpeg-turbo
└── zstd
    β”œβ”€β”€ lz4
    └── xz

libtool
└── m4

libunistring

libuv

libvmaf

libvterm

libx11
β”œβ”€β”€ libxcb
β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   └── xorgproto
β”‚   └── libxdmcp
β”‚       └── xorgproto
└── xorgproto

libxau
└── xorgproto

libxcb
β”œβ”€β”€ libxau
β”‚   └── xorgproto
└── libxdmcp
    └── xorgproto

libxdmcp
└── xorgproto

libxext
β”œβ”€β”€ libx11
β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── libxdmcp
β”‚   β”‚       └── xorgproto
β”‚   └── xorgproto
└── xorgproto

libxrender
β”œβ”€β”€ libx11
β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── libxdmcp
β”‚   β”‚       └── xorgproto
β”‚   └── xorgproto
└── xorgproto

libyaml

little-cms2
β”œβ”€β”€ jpeg-turbo
└── libtiff
    β”œβ”€β”€ jpeg-turbo
    └── zstd
        β”œβ”€β”€ lz4
        └── xz

lua

luajit

luv
└── libuv

lz4

lzo

m4

mpdecimal

msgpack

ncdu
└── ncurses

ncurses

neovim
β”œβ”€β”€ gettext
β”œβ”€β”€ libtermkey
β”‚   └── unibilium
β”œβ”€β”€ libuv
β”œβ”€β”€ libvterm
β”œβ”€β”€ luajit
β”œβ”€β”€ luv
β”‚   └── libuv
β”œβ”€β”€ msgpack
β”œβ”€β”€ tree-sitter
└── unibilium

netpbm
β”œβ”€β”€ jasper
β”‚   └── jpeg-turbo
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ libpng
└── libtiff
    β”œβ”€β”€ jpeg-turbo
    └── zstd
        β”œβ”€β”€ lz4
        └── xz

nettle
└── gmp

oniguruma

openexr
└── imath

openjpeg
β”œβ”€β”€ libpng
β”œβ”€β”€ libtiff
β”‚   β”œβ”€β”€ jpeg-turbo
β”‚   └── zstd
β”‚       β”œβ”€β”€ lz4
β”‚       └── xz
└── little-cms2
    β”œβ”€β”€ jpeg-turbo
    └── libtiff
        β”œβ”€β”€ jpeg-turbo
        └── zstd
            β”œβ”€β”€ lz4
            └── xz

openssl@1.1
└── ca-certificates

openssl@3
└── ca-certificates

p11-kit
β”œβ”€β”€ ca-certificates
└── libtasn1

pango
β”œβ”€β”€ cairo
β”‚   β”œβ”€β”€ fontconfig
β”‚   β”‚   └── freetype
β”‚   β”‚       └── libpng
β”‚   β”œβ”€β”€ freetype
β”‚   β”‚   └── libpng
β”‚   β”œβ”€β”€ glib
β”‚   β”‚   β”œβ”€β”€ pcre2
β”‚   β”‚   └── gettext
β”‚   β”œβ”€β”€ libpng
β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── libxdmcp
β”‚   β”‚       └── xorgproto
β”‚   β”œβ”€β”€ libxext
β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ libxrender
β”‚   β”‚   β”œβ”€β”€ libx11
β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   β”‚   β”‚   └── libxdmcp
β”‚   β”‚   β”‚   β”‚       └── xorgproto
β”‚   β”‚   β”‚   └── xorgproto
β”‚   β”‚   └── xorgproto
β”‚   β”œβ”€β”€ lzo
β”‚   └── pixman
β”œβ”€β”€ fontconfig
β”‚   └── freetype
β”‚       └── libpng
β”œβ”€β”€ freetype
β”‚   └── libpng
β”œβ”€β”€ fribidi
β”œβ”€β”€ glib
β”‚   β”œβ”€β”€ pcre2
β”‚   └── gettext
└── harfbuzz
    β”œβ”€β”€ cairo
    β”‚   β”œβ”€β”€ fontconfig
    β”‚   β”‚   └── freetype
    β”‚   β”‚       └── libpng
    β”‚   β”œβ”€β”€ freetype
    β”‚   β”‚   └── libpng
    β”‚   β”œβ”€β”€ glib
    β”‚   β”‚   β”œβ”€β”€ pcre2
    β”‚   β”‚   └── gettext
    β”‚   β”œβ”€β”€ libpng
    β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── libxdmcp
    β”‚   β”‚       └── xorgproto
    β”‚   β”œβ”€β”€ libxext
    β”‚   β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ libxrender
    β”‚   β”‚   β”œβ”€β”€ libx11
    β”‚   β”‚   β”‚   β”œβ”€β”€ libxcb
    β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ libxau
    β”‚   β”‚   β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   β”‚   β”‚   └── libxdmcp
    β”‚   β”‚   β”‚   β”‚       └── xorgproto
    β”‚   β”‚   β”‚   └── xorgproto
    β”‚   β”‚   └── xorgproto
    β”‚   β”œβ”€β”€ lzo
    β”‚   └── pixman
    β”œβ”€β”€ freetype
    β”‚   └── libpng
    β”œβ”€β”€ glib
    β”‚   β”œβ”€β”€ pcre2
    β”‚   └── gettext
    β”œβ”€β”€ graphite2
    └── icu4c

pcre

pcre2

perl
β”œβ”€β”€ berkeley-db
β”‚   └── openssl@1.1
β”‚       └── ca-certificates
└── gdbm

pixman

pkg-config

postgresql@14
β”œβ”€β”€ icu4c
β”œβ”€β”€ krb5
β”‚   └── openssl@1.1
β”‚       └── ca-certificates
β”œβ”€β”€ lz4
β”œβ”€β”€ openssl@1.1
β”‚   └── ca-certificates
└── readline

pure
└── zsh-async

python@3.11
β”œβ”€β”€ mpdecimal
β”œβ”€β”€ openssl@1.1
β”‚   └── ca-certificates
β”œβ”€β”€ sqlite
β”‚   └── readline
└── xz

rbenv
└── ruby-build
    β”œβ”€β”€ autoconf
    β”‚   └── m4
    β”œβ”€β”€ pkg-config
    └── readline

rcm

readline

redis
└── openssl@1.1
    └── ca-certificates

ripgrep
└── pcre2

ruby
β”œβ”€β”€ libyaml
β”œβ”€β”€ openssl@1.1
β”‚   └── ca-certificates
└── readline

ruby-build
β”œβ”€β”€ autoconf
β”‚   └── m4
β”œβ”€β”€ pkg-config
└── readline

rust
β”œβ”€β”€ openssl@1.1
β”‚   └── ca-certificates
└── pkg-config

shared-mime-info
└── glib
    β”œβ”€β”€ pcre2
    └── gettext

sl

sqlite
└── readline

terminal-notifier

tig
β”œβ”€β”€ ncurses
β”œβ”€β”€ pcre2
└── readline

tmux
β”œβ”€β”€ libevent
β”‚   └── openssl@1.1
β”‚       └── ca-certificates
β”œβ”€β”€ ncurses
└── utf8proc

tree

tree-sitter

unbound
β”œβ”€β”€ libevent
β”‚   └── openssl@1.1
β”‚       └── ca-certificates
β”œβ”€β”€ libnghttp2
└── openssl@1.1
    └── ca-certificates

unibilium

utf8proc

vim
β”œβ”€β”€ gettext
β”œβ”€β”€ lua
β”œβ”€β”€ ncurses
β”œβ”€β”€ perl
β”‚   β”œβ”€β”€ berkeley-db
β”‚   β”‚   └── openssl@1.1
β”‚   β”‚       └── ca-certificates
β”‚   └── gdbm
β”œβ”€β”€ python@3.11
β”‚   β”œβ”€β”€ mpdecimal
β”‚   β”œβ”€β”€ openssl@1.1
β”‚   β”‚   └── ca-certificates
β”‚   β”œβ”€β”€ sqlite
β”‚   β”‚   └── readline
β”‚   └── xz
└── ruby
    β”œβ”€β”€ libyaml
    β”œβ”€β”€ openssl@1.1
    β”‚   └── ca-certificates
    └── readline

watch
└── ncurses

webp
β”œβ”€β”€ giflib
β”œβ”€β”€ jpeg-turbo
β”œβ”€β”€ libpng
└── libtiff
    β”œβ”€β”€ jpeg-turbo
    └── zstd
        β”œβ”€β”€ lz4
        └── xz

wget
β”œβ”€β”€ libidn2
β”‚   β”œβ”€β”€ libunistring
β”‚   └── gettext
└── openssl@3
    └── ca-certificates

x265

xorgproto

xz

yarn

youtube-dl
└── python@3.11
    β”œβ”€β”€ mpdecimal
    β”œβ”€β”€ openssl@1.1
    β”‚   └── ca-certificates
    β”œβ”€β”€ sqlite
    β”‚   └── readline
    └── xz

zsh
β”œβ”€β”€ ncurses
└── pcre

zsh-async

zsh-syntax-highlighting

zstd
β”œβ”€β”€ lz4
└── xz


As we can see… tons of things depend on xz.

This output is slightly overwhelming, but if you want to be even more overwhelmed, you can run brew deps --full-name --installed --graph to produce a visual graph representation, which I’ll present to you here:

graph of brew dependencies

You can click on it to see it in more detail.

Maybe I’m not much of a visual learner, but I’ll take the plain text representation any day.

How do I know if I even need this package any longer?

One easy way to figure out if you need a package any longer is to just try uninstalling it and seeing what happens:

$ brew uninstall xz
==> Downloading https://formulae.brew.sh/api/cask.jws.json
######################################################################## 100.0%
Error: Refusing to uninstall /opt/homebrew/Cellar/xz/5.4.1
because it is required by aom, gd, gdk-pixbuf, ghostscript, graphviz, gts, imagemagick, jpeg-xl, libavif, libheif, libraw, librsvg, libtiff, little-cms2, netpbm, openjpeg, python@3.11, vim, webp, youtube-dl and zstd, which are currently installed.
You can override this and force removal with:
  brew uninstall --ignore-dependencies xz

As you can see, homebrew refuses to uninstall it because it’s a dependency of a bunch of stuff. So, I guess, I do need this one.

It would be tedious to do this one-by-one, going through all ~100 or so of the packages I have installed that I don’t recognize the name of, just to free up some space on my hard drive.

Thankfully, it turns out that homebrew has another command, brew leaves, which will solve this problem.

If I run brew list, homebrew prints out 138 packages, many with names I don’t recognize.

If I run brew leaves instead, it prints out 38 packages, most of which I recall asking homebrew to install.

Let’s learn more about this subcommand:

$ brew leaves --help
Usage: brew leaves [--installed-on-request] [--installed-as-dependency]

List installed formulae that are not dependencies of another installed formula.

  -r, --installed-on-request       Only list leaves that were manually
                                   installed.
  -p, --installed-as-dependency    Only list leaves that were installed as
                                   dependencies.
  -d, --debug                      Display any debugging information.
  -q, --quiet                      Make some output more quiet.
  -v, --verbose                    Make some output more verbose.
  -h, --help                       Show this message.

In other words, running brew leaves will print out all of the things that can be uninstalled, because nothing depends on them. In my case, that includes vim, but not xz.

So, if there’s anything in the brew leaves output that you don’t think you need, you can probably safely uninstall it.

There are two flags there that are particularly handy: --installed-on-request and --installed-as-dependency, which filter the output based on why exactly that package is installed on your system.

If you run brew leaves --installed-as-dependency, it will print out all of the things that:

  1. were installed as a dependency of something else
  2. but are no longer a dependency of anything

That sounds eminently uninstallable if anything does.

Note that when you uninstall a package, homebrew does not uninstall that package’s dependencies. That means that many of that package’s dependencies, which were previously not uninstallable become uninstallable. In other words, they become leaves.

So, for example, if I run brew uninstall imagemagick and then check on my leaves, here’s what I see:

$ brew leaves --installed-as-dependency
ghostscript
libheif
liblqr
libraw

I still have ghostscript, libheif, liblqr, and libraw hanging around, and I can use this command to identify that they are not actually needed anymore and continue trimming my hedge.

  1. If homebrew wants to upgrade vim, I’ll usually quit any running vim processes, because it sometimes gets wonky when you upgrade it while it’s already running.Β 

  2. Which I can see spelled out in my BrewfileΒ 

Configuring ALE to only run rubocop in projects that use rubocop

March 6, 2023

I usually use rubocop to help maintain consistency and catch bugs in my Ruby codebases.

When I’m using Vim, I can see the feedback inline via Asynchronous Lint Engine, aka ALE, the terrific vim plugin.

Here’s what it looks like:

Screenshot of rubocop offenses showing up in vim via ALE

Nice!

I could run rubocop from the command line and see my offenses there, but it’s a really nice workflow to see the offense right away, in context, when I introduce it in the editor.

Before I used this vim plugin, I’d just run the rubocop CLI on the command line, which looks like this:

Screenshot of rubocop offense showing up on command line

It’s clear enough what’s happening, but you’d need to open the file to see the context, and there’s some noise, so I think the editor integration is a real improvement.

But! There’s one problem… not every ruby codebase uses rubocop.

For example, the RSS reader I use, Feedbin, is an open source rails app, and when I clone it and open it in vim, here’s what I see:

Screenshot of rubocop offense showing up in vim via ALE when you don't want them to

Yikes!!!

This codebase doesn’t even use rubocop, so of course there are a lot of β€œoffenses”.

This is so annoying that it almost makes me want to disable ALE, but that would make my experience worse when I’m working on codebases that do use rubocop.

What to do?

Thankfully, after some poking around, I found out that it is possible to improve the situation with some ALE configuration. Here’s a bit about how I worked that out.

Here’s what I had in my .vimrc:

let g:ale_linters_explicit = 1

let g:ale_linters= {'ruby': ['rubocop']}

let g:ale_fixers = {'ruby': ['rubocop']}

let g:ale_ruby_rubocop_executable = "bundle"
let g:ale_fix_on_save = 1

I thought this would be sufficient. I ran :help ale-ruby and read through the docs there, and found this relevant bit:

g:ale_ruby_rubocop_executable                   *g:ale_ruby_rubocop_executable*
                                                *b:ale_ruby_rubocop_executable*
  Type: |String|
  Default: `'rubocop'`

  Override the invoked rubocop binary. Set this to `'bundle'` to invoke
  `'bundle` `exec` rubocop'.

So, because I configured that ale_ruby_rubocop_executable global variable to "bundle", that means that ALE is going to invoke bundle exec rubocop instead of simply rubocop.

That has a few nice benefits:

  1. You can feel confident that you’ll use the version of rubocop specified in your Gemfile.lock
  2. If rubocop is not included in your Gemfile.lock, the bundle exec rubocop command will fail, and therefore no offenses will be found

So… wait a second, why was I seeing any rubocop offenses in the feedbin codebase if feedbin doesn’t use rubocop?

Hm, let’s try searching the codebase with ripgrep for references to rubocop:

$ rg rubocop
Gemfile.lock
517:    rubocop (1.42.0)
524:      rubocop-ast (>= 1.24.1, < 2.0)
527:    rubocop-ast (1.24.1)
529:    rubocop-performance (1.15.2)
530:      rubocop (>= 1.7.0, < 2.0)
531:      rubocop-ast (>= 0.4.0)
572:      rubocop (= 1.42.0)
573:      rubocop-performance (= 1.15.2)

Hmm, what the heck, rubocop is in the bundle, even though feedbin doesn’t actually use it. How is it getting in there?

If bundler had a subcommand like npm explain, we could use that to find out exactly why it’s in our bundle. Alas, it doesn’t, so we must resort to reading through Gemfile.lock and figure it out. If we look closely, we’ll see this clue:

standard (1.22.1)
  language_server-protocol (~> 3.17.0.2)
  rubocop (= 1.42.0)
  rubocop-performance (= 1.15.2)

Aha! The feedbin codebase uses standard, which is kind of like an opinionated wrapper around rubocop.

So, because feedbin has this line its Gemfile:

gem "standard"

We get the standard gem and we also get its dependencies in the bundle, which includes rubocop. That means that when ALE tries running bundle exec rubocop, rubocop will run.

If we take a look at standard’s docs, we can find a page about integrating standard with vim which recommends this:

The recommended method for running standardrb within vim is with vim-ale.

To set Standard as your only linter and fixer for Ruby files and thereby preventing conflicts with RuboCop, add these lines to your .vimrc file:

let g:ale_linters = {'ruby': ['standardrb']}
let g:ale_fixers = {'ruby': ['standardrb']}

For automatically fixing on save, add this to your .vimrc:

let g:ale_fix_on_save = 1

Nice! ALE also supports standard, and can be configured to use standard instead of rubocop.

But that’s not exactly what I want…

To recap, here are my goals:

  1. When working in a codebase that uses rubocop, I want ALE to use rubocop to lint and fix
  2. When working in a codebase that uses standard, I want ALE to use standard to lint and fix, and not use rubocop directly
  3. When working in a codebase that uses neither, I want ALE to do nothing

Thankfully, this can be achieved.

Here’s what we can do:

let g:ale_linters_explicit = 1
let g:ale_linters= {'ruby': ['rubocop', 'standardrb']}

let g:ale_fixers = {'ruby': ['rubocop', 'standardrb']}

let g:ale_ruby_rubocop_executable = "bin/rubocop"
let g:ale_ruby_standardrb_executable = "bin/standardrb"
let g:ale_fix_on_save = 1

We’re no longer setting ale_ruby_rubocop_executable to "bundle", because it proved to be insuffient in codebases like feedbin.

Now we’re configuring it to point to the rubocop binstub1. And likewise, we’re configuring it to point to the standard binstub. If a codebase has a binstub for a tool, that’s a pretty good sign that it uses that tool.

This way, ALE will use rubocop in a codebase that has a rubocop binstub and it will use standard in a codebase that has a standard binstub. There should never be a codebase that has both binstubs2, so you don’t need to worry about activating both of them. Just run bundle binstubs rubocop or bundle binstubs standard and commit the generated file and you’re good to go.

  1. Here’s a nice primer on binstubs for the unfamiliar.Β 

  2. Of course it’s possible that both will be there if you run bundle binstubs --all and commit them all, but… please do not do that!Β 

Patrick Willems - How To Analyze Movies

February 22, 2023

This analysis of Home Alone is a tour de force:

It covers quite a lot of ground, from formalist film theory to Auteur Theory demonstrating how they can enrich your experience of filmgoing.

It’s pretty long, but is broken up into nice chapters. I watched it over several days.

NewJeans - OMG

February 19, 2023

I am a sucker for a catchy pop song and a high concept music video and this has both.

(If you don’t speak Korean, turn on the closed captions. The dialogue is funny.)

NewJeans is a new K-pop girl group and I am going to assume that I’m hip for having heard of them.

REJECTED with commentary

February 10, 2023

You may or may not be familiar with REJECTED, the classic animated short film by living genius Don Hertzfeldt. If not, go watch it and let it burn itself into your brain and make you laugh very hard every time you rewatch it for the rest of your life. Then seek out his longer works like It’s such a beautiful day and World of Tomorrow which are much more serious while still being deeply silly…

For everyone else…

Hertzfeldt did a very funny β€œtext commentary” version, which I just stumbled on. Here it is:

I learned a lot, but also laughed a lot. It’s so dumb lmao.

Enjoy!

Out of Sight

February 8, 2023

I loved this animated short film by Yu Ya-Ting, which visualizes what it’s like for a young blind girl to get around with and without her companion dog.

How wondrous.

It is kind of bold to name a movie Out of Sight when that’s already a great Soderbergh movie, though.

Via kottke.

Whole of the moon

February 2, 2023

Check out this cover of Whole of the Moon by Fiona Apple:

(I particularly like when the wandering camera lingers on her boot, stomping to the beat)

I wasn’t familiar with the original song by The Waterboys from 1985 (I never even heard of The Waterboys).

I wandered out in the world for years

While you just stayed in your room

I saw the crescent

But you saw the whole of the moon

This reminds me of that Pinegrove song with a very similar title, Size of the Moon:

That one has these lines:

I got caught

you got those caravaggio moves

We had some good ideas but we never left that fucking room

And later:

I remember that too

In your living room, right?

When we began to fight but then we both got confused

Then we were laughing & crying in awe of the size of the moon

In both songs we’re comparing ourselves to others, we’re trapped in rooms, we’re thinking about the moon.

I love when songs are in conversation with each other and I didn’t even know it. Finally hearing that other part of the conversation after only hearing one side for a while expands something about both.

Something about being in a room when the moon is up there is profane, maybe?

Via Merlin Mann on twitter.