私の Homebrew カタログ (1)

2019-01-18   #macOS 

私が普段使用する macOS では,コマンドラインツールのほとんどを Homebrew というパッケージマネージャで導入・管理しています1.もともと macOS に同梱されているものを除いては,本当に大半のコマンドラインツールを Homebrew で管理しているので,私が直接利用するため,もしくは利用したいプログラムの依存関係で導入されたツールは

$ brew list

を叩くことにより,そのほぼすべてを一覧にすることができます.このように Homebrew で導入されたツールはずいぶんと増えてきて,その数は今では170を超えました.そのすべての詳細を把握することは困難ですが,なんとなく「自分のパソコンに導入されているツールにどんなものがあるのか,一応は把握しておきたい」という気持ちになったので,簡単に調べられる範囲で手許に導入されているコマンドラインツールについてカタログ化してみようと思います.

ちなみにですが,このような調査を行う際には Homebrew の機能を用いて

$ brew info <formula>

によってフォーミュラの基本情報を表示したり

$ brew home <formula>

で各フォーミュラの公式ホームページ2にアクセスしたりすると捗ります.また,フォーミュラ間の依存関係を調べるには brew depsbrew uses が使えます.これらのコマンドについては以下のブログ記事に詳しいです:

afflib

AFF (Advanced Forensic Format) というのはオープンで拡張可能なディスクイメージ(と関連するメタデータ)を格納するファイルフォーマットのようです.したがって,AFFLIBv3 は AFF 形式のファイルを扱うためのライブラリ(ユーティリティ)でしょう.

この Formula によってインストールされるバイナリはかなりたくさんあります.各1行で説明すると:

  • affcat: イメージファイルの内容を標準出力に表示
  • affcompare: AFF/ISO ファイルの中身を比較
  • affconvert: RAW ファイルを AFF ファイルに変換(逆変換も可能)
  • affcopy: AFF ファイルをコピー(同時に内容の並べ替えや再圧縮を行う?)
  • affcrypto: 暗号化関連の操作を行う(クラック機能まである)
  • affdiskprint: AFF 構造の diskprint3 を表示
  • affinfo: AFF ファイルの情報を表示4
  • affix: 破損 AFF ファイルの修復
  • affrecover: AFF の破損ページを修復
  • affsegment: セグメンテーションを取り扱うツール
  • affsign: 各セグメントにサイン(電子署名)をする
  • affstats: AFF ファイルの統計情報を表示
  • affuse: AFF コンテナにアクセスする
  • affverify: 電子署名の検証
  • affxml: AFF ファイルの情報を XML に出力する

余談ですが,そもそも私は AFF ディスクイメージというものを使ったことも見たこともなかったので,これらのコマンドの動作確認をするためには無理やり AFF ファイルを入手する必要がありました.affconvert を用いると RAW ファイルから AFF ファイルを作成できるので,以下のようにすると空の test.aff ファイルが手に入ります.

$ mkfile 1k test.raw
$ affconvert test.raw
convert test.raw --> test.aff
Converting page 0 of 0
md5: 0f343b0931126a20f133d67c2b018a3b
sha1: 60cacbf3d72e1e7834203da608037b1bf83b40e8
bytes converted: 1024
Total pages: 1  (1 compressed)
Conversion finished.

apr

Apache HTTP Server (httpd) のサポートライブラリで,様々なプラットフォームに対して共通の API を提供することを目的としたもの.C 言語用のライブラリなので,CLI は特にないようです.

もともと Apache の内部ライブラリだったものを独立ライブラリに切り出したものらしく,かなり低レベルな機能(動的なメモリ確保やファイル IO,スレッドやプロセスなど)をプラットフォーム非依存な API で提供しているようで,クロスプラットフォームなシステムプログラミングをしたい人には便利そうですね.個人的には,興味や研究テーマの関係でこの頃は低レイヤを触る機会がなく,思えば C 言語も学部2, 3年の実習で書いて以来全然使っていないです.最近人気の Go や Rust でシステムプログラミング再入門をしたい気もしますが,そのぐらいの優先度だと他にもやりたいことがたくさんあり,時間がいくらあっても足りなそう……

Apache 本体は当然として,バージョン管理システムの Subversion などもこのライブラリに依存しているそうです.

apr-util

上述 apr の同伴ライブラリ.具体的には,XML を始めとするデータベース関連のインターフェースや URI パーサなどの追加機能を提供しているとのこと.ここまでくるとそこまで低レイヤという感じではないですね.

argon2

Argon2 というのは2015年のパスワードハッシュコンテスト (PHC) で優勝したアルゴリズムだそうです.プロジェクトの README によれば,このアルゴリズムには3種類のバリアントがあるらしく,それぞれ

  • Argon2i: サイドチャネル攻撃耐性があるが,低速
  • Argon2d: サイドチャネル攻撃耐性がない代わりに高速.GPU クラッキング攻撃に耐性あり
  • Argon2id: 上記2種のコンビネーションで,いいとこ取り

という特徴をもっていると説明があります.

この実装は C 言語用ライブラリ (libargon2) と CLI (argon2) の両方を提供しているようです.私の環境では,このライブラリを利用しているのは PHP のみのようでした.

aspcud

解集合プログラミング (ASP) に基づく実験的なパッケージ依存関係ソルバ.このソルバを利用するためには,依存関係は Common Upgradability Description Format (CUDF) という形式で記述されている必要があるようです.詳細は原著論文を参照してください:

この実装は Linux の著名なパッケージマネージャ apt-get のバックエンドとして利用可能なようですが,デフォルトのソルバよりは低速とのこと.macOS 向けのフォーミュラが存在するのは,一部のフォーミュラのビルドに際して必要だからと思われます.

aspell

古典的な UNIX 用スペルチェッカ Ispell の代替として開発されたスペルチェッカ.(La)TeX のコマンドを無視する機能もあるらしく,TeX Wiki にも記事がありました.

私個人は Vim のスペルチェック機能をデフォルト設定で利用しているので,aspell を直接コマンドラインで叩く機会はないのですが,PHP などが依存しているらしく手許にインストールされたようです.TeX Wiki によれば近年は Hunspell というスペルチェッカの方がよく用いられるそうですが……

autoconf

近年はまさに Homebrew のようなツールのおかげで,C や C++ で書かれたプロジェクトを自分の手で直接ビルドするという機会も減っていると思いますが,仮にそういうことをしようと思うと

$ ./configure
$ make
$ make install

という一連の儀式を行うと思います(Homebrew のログ出力を見れば,brew を使っても結局裏でそういうことは頻繁に行われているわけですが).

例によって私は低レイヤプログラミングをすることがほぼないので使ったことはありませんが,autoscan・automake・autoconf 等のコンボ(総称して autotools というらしい)でプロジェクトの配布用ファイル群を作るのは定石のようなので,一度ぐらい経験しておくべきかもしれませんね.

autopsy

私は最近 NCIS という米ドラマを視聴しているのですが,このドラマの主要キャラクタの1人が監察医なので “autopsy”(検死)という単語は頻繁に出てきます.なかなか洒落たネーミングです.

このプログラムは The Sleuth Kit というフォレンジクス用コマンド群の GUI です.まったく導入した記憶がないですが,おそらく CTF 用にインストールしたのだと思います.コマンドラインで

$ autopsy

を叩くとローカルサーバ(デフォルトでは http://localhost:9999/autopsy)が立ち上がるので,ブラウザで開くと次のような画面になっており,GUI 操作可能です:

Autopsy Forensic Browser 2.24

調査プロジェクトを “case”(症例)と呼ぶなど,どこまでもこだわりが感じられますね.まぁ私は CTF 等をやる際にはコマンドラインツールを使う気がするので GUI の出番はあまりないと思いますが……

bash

言わずとしれたシェルの1つです.私は普段 zsh を使っているので常用していないですが,macOS (10.13.6) のデフォルトシェルが bash 3.2 系とかなり古いので,Homebrew で新しいものを入れています.

bastet

コマンドラインで遊べるテトリスです.暇つぶしにはもってこいなのですが,私はテトリスは苦手でなかなかハイスコアが出せません……

Playing Bastard Tetris

binwalk

CTF 界隈では定番らしいファームウェアイメージ解析ツールです.具体的なユースケースとしては,特定の動画や画像などのファイルに別のファイルが埋め込まれていないか解析・抽出することが挙げられます.詳しい使い方については,公式の Wiki がとても充実しているようです:

実装言語は Python で,CLI としてもライブラリとしても利用できるプロジェクトとしてかなりしっかりとした作りになっていそうなので,そのようなプロダクトを自分で開発する際には参考にできそうです.

boost

よく知られた C++ の先鋭的なライブラリです.世間には Boost を解説した書籍やブログ記事が多数あるので,ここでは詳細の一切を省略しても構わないでしょう.

例によって brew uses を使って boost に依存するフォーミュラを調べると,かなり多くの有名プロジェクトが採用していることがわかって面白いです5

$ brew uses --recursive --installed --include-build --include-optional boost

極めて個人的な所感としては,C++ 自体がかなり高機能な言語のはずなのに,それをさらに激しく拡張するライブラリとはなんとも恐ろしい…… 理想論はまた別ですが,現実には「よく使われる言語」というのは言語仕様そのものの善し悪しよりも,むしろ「資産」の多寡が影響する部分が大きく,なんだかんだ言われながらも C とか C++ とか Perl とか Python とか TeX とかが至るところで使われているのは,要するにそういうことなんじゃないかと(おっとかなり話が逸れました)

brotli

Brotli は Google が開発したデータ圧縮アルゴリズムおよびその実装です.gzip よりも圧縮率が高く,また処理が高速であることを売りにしているようです.アルゴリズムとしては LZ77 とハフマン符号化を組み合わせたもののようですが,最大の特徴は HTML や JavaScript に頻出の文字列を考慮した巨大な辞書を仕様に内包することで,その高いパフォーマンスを実現している点でしょう.いかにも「実用」向きのアルゴリズムですが,昨今の Web 業界はこうした技術に支えられている部分が大きそうではあります.

コマンドラインでも brotli コマンドが利用できます.ヘルプを見る限り,オプションの指定方法などは gzip とかなり互換性があるように設計されているようです.

bsdgames-osx

BSD 系の OS で利用可能だったらしい古典的なゲーム群です.このフォーミュラによりインストールされるゲームは全部で40種類あるようで,その一覧は README にあります.個人的には,暇な時に「英語の勉強」と称して hangman でよく遊びます.ただしこのゲームのお題は,/usr/share/dict/words というマニアックなものを含めて20万もの英単語を収録する辞書ファイルなので非英語ネイティブの私にはあまりにも難易度が高いのが難点です6

bsdmake

macOS 標準のコマンドラインツールは多くが BSD 系なのですが7,なぜか make は GNU Make です(例によって,かなり古いバージョンのものではありますが).BSD 系の Make が使いたい場合は,このフォーミュラを利用するのが手っ取り早いです.個人的には,わざわざ好んで bsdmake を使用することは一切ないのですが,上述の bsdgames-osx をビルドする際などに必要になります.

c-ares

名前の通り非同期的に DNS リクエストを行うための C ライブラリのようです.cURL (curl) やその下敷きになっている libcurl のために開発が始まったそうですが,IPv6 に対応するなど高機能で,対応プラットフォームも多いので様々なネットワーク関連のプロジェクトに採用されています.

c2048

2014年ごろにスマートフォン向けゲームとして一世を風靡した「2048」をコンソールで遊べるようにしたものです.フォーミュラの名前は c2048 ですが,インストールされるコマンドは単に 2048 です.スマホ版はスワイプで操作しましたが,コンソール版は基本的に矢印キーで操作を行います.実は Vim ライクなキーバインドにも対応していて,矢印キーの代わりに j, k, h, l で操作することもできます.

Playing 2048

cairo

デバイス非依存の 2D グラフィックス描画ライブラリのようです.アンチエイリアスによる滑らかな画像描画や透過色にも対応しているため出力の美しさに定評があり,GTK+ や Firefox でも採用されています.C 言語ライブラリながら様々な言語にバインディングが存在し,特に Ruby バインディング rcairo については『るびま』に日本語で読める丁寧なチュートリアルがありました:

組版技術周りでも fontforge, harfbuzz, poppler などが採用しているようなので,TeX ユーザも間接的に恩恵を受けているものと思われます.

camlp5

もともと camlp4 という,通称 “P4”(PreProcessor-Pretty-Printer の4つの P が由来らしい)と呼ばれる OCaml のマクロ・文法拡張システムがあって,camlp5 はそのフォークプロジェクトのようです(camlp4 という Homebrew フォーミュラも別に存在しています).このあたりの事情や P4 の概説については以下のブログ記事が有益でした:

私自身はいまのところ OCaml ユーザではないので,camlp4 も camlp5 も直接は使用していませんが,後述する定理証明支援系 Coq が P5 に依存しているため導入されています.

clingo

解集合プログラミング (ASP) ソルバだそうですが,具体的に何ができるのかはきちんと把握できていません.先述の aspcud のバックエンドとして用いられています.

cmake

CMake は名前の通りクロスプラットフォームにビルド自動化を実現するためのツールです.バックエンドはプラットフォームごとに適切なものを選択して利用するようで,例えば macOS では Xcode,Windows では Visual Studio,Linux では Make が用いられます.しかし,CMake ユーザはこうした違いを意識することなく,とにかく CMakeLists.txt と呼ばれるビルド手順記述ファイルを作成するだけで様々なプラットフォームでプログラムをビルドできるということです.その目的から明らかなように,CMake はクロスプラットフォームなプロジェクトでの採用率が高いようです.

colordiff

その名の通り diff を色付きにしてくれるやつです.かなり見やすくなるので私は重宝しています.

設定ファイル (~/.colordiffrc) を置くと,使用する色などを制御できます.GitHub リポジトリを覗くと,いくつか .colordiffrc のサンプルが置いてあります.

  • colordiffrc: デフォルト設定
  • colordiffrc-gitdiff: 暗い背景を利用している向けの git diff っぽい色設定
  • colordiffrc-lightbg: 明るい背景を利用している人向けのテンプレート設定

また,colordiff の出力をパイプで less に渡す場合は -R オプションを付けないとうまくいかないので注意が必要です(環境変数を export LESS='-R' と設定してしまうのも手のようです).

$ colordiff <args> ... | less -R

coq

有名な定理証明支援系です.とりあえず使ってみたいと思って導入してはあるのですが,なかなか重い腰が上がらず試せていないので,私には詳細を語る見識も資格もありません.

対話的に証明を行うものらしく Emacs のプラグインを利用することが多いと聞きました.Vim についてもサポートプラグインがあった気がしますが,個人的な感触としては Vim と他の対話的なシステムはあまり相性がよくない気がしていて,どうなんでしょう……

coreutils

上述したように,macOS に同梱されている UNIX コマンドのほとんどは BSD 系です.GNU 系と BSD 系のどちらがいいということは一概に言えませんし,やや宗教戦争じみている部分もありますのでここではそういう議論は避けますが,世の中の(特に Linux 向けの)多くの文献が GNU 系のツールを前提としているのは事実なので,macOS 上にも GNU コマンドを一通り揃えておくと便利です.

Homebrew フォーミュラとしては,GNU 系コマンドはいくつかのサブセットに分割されています.具体的にどのようなサブセットがあるかということについては下記のブログ記事によくまとまっています.

coreutils は中でも特に OS の基本的な操作(ファイル,シェル,テキスト関連)を扱うものをまとめたものです.

$ brew install coreutils

をするだけでそうした基本操作を扱う GNU コマンドが多数インストールされます.具体的にインストールされるコマンドの一覧は以下を参照してください.

ただし,上記の方法でインストールした場合,すべてのコマンドが g プレフィックス付きになります.例えば GNU ls コマンドを使いたい場合は

$ gls

とする必要があります.macOS 向けのツール(標準添付のものを含む)の中には,こうした基本コマンドは BSD 系であることを前提に呼び出しを行うものがある可能性があるので,私はこの g プレフィックスを取らないことをおすすめしますが89,どうしてもプレフィックスなしで使えるようにしたい場合は brew info coreutils で表示される説明にしたがって PATH を設定します.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

cowsay

有名な Perl 製ジョークツールです.引数に与えた文字列をウシが喋るアスキーアート (AA) を表示させられます10

$ cowsay Hello!
 ________
< Hello! >
 --------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

使いどころが謎ですが,cowthink というバリエーションもあります.

$ cowthink Hmm...
 ________
( Hmm... )
 --------
        o   ^__^
         o  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

なおデフォルトでは日本語は利用できないので,ウシに日本語を喋らせたい場合はちょっと工夫が必要です.

また,実はウシ以外の AA も多数用意されていて,-f オプションでデザインを指定することでウシ以外の動物(?)にも色々喋らせたり考えさせたりすることができます.

$ cowsay -f daemon '\expandafter'
 ______________
< \expandafter >
 --------------
   \         ,        ,
    \       /(        )`
     \      \ \___   / |
            /- _  `-/  '
           (/\/ \ \   /\
           / /   | `    \
           O O   ) /    |
           `-^--'`<     '
          (_.)  _  )   /
           `.___/`    /
             `-----' /
<----.     __ / __   \
<----|====O)))==) \) /====
<----'    `--' `.__,' \
             |        |
              \       /
        ______( (_  / \______
      ,'  ,-----'   |        \
      `--{__________)        \/

このように利用可能な AA の一覧は cowsay -l で確認できます.

さらに,こうした AA を自分で用意することもできます.GitHub リポジトリの cows ディレクトリを覗くと例がたくさんあるので,参考にして *.cow ファイルを作ります.cow ファイルを作ったら -f オプションでそのパスを指定します.私もゆきだるまの cow ファイル (snowman.cow) を作ってみました.

$ cowsay -f ./snowman.cow "Jan 18 is the World Day of Snowman\! Let's celebrate\!"
 _____________________________________
/ Jan 18 is the World Day of Snowman! \
\ Let's celebrate!                    /
 -------------------------------------
   \
    \ _[_]_
       (")
    >-( : )-<
     (__:__)

今回はここまでです.次回があるといいですね.


  1. Homebrew は macOS 専用ですが,最近ではこれを Linux 向けに移植した Linuxbrew というツールもあります.Linux の多くのディストリビューションには専用パッケージマネージャがありますが,sudo 権限のないサーバでホームディレクトリ以下に色々なツールをインストールしたいような場合には私も Linuxbrew を重宝しています. [return]
  2. 「ウェブサイト」の意味で「ホームページ」という用語を使うのは厳密には誤りで,私も普段は決して使わないのですが,Homebrew の用語で「フォーミュラの公式ウェブサイト」は「ホームページ」と呼称しているので,本稿ではそれに従いました (cf. brew help home). [return]
  3. コンテンツのハッシュ (md5, sha1) を XML 形式で並べたもののようです. [return]
  4. man ページに記載はないですが,RAW ファイルの情報も表示できるようです. [return]
  5. --installed オプションを外すと Homebrew 公式にフォーミュラの存在するすべての boost に依存するプロジェクト(800超)を一覧にできますが,実行にはかなり時間がかかります. [return]
  6. 調べた限り,この出題元の辞書ファイルを変更するオプション等は存在しないようです. [return]
  7. gcc コマンドすら実は本物の GCC (GNU Compiler Collection) ではなく,GCC のフリをした Clang (LLVM) だったりします. [return]
  8. 特定のコマンドについて,GNU 系のものを優先的に使いたい場合は,ログインシェルの設定ファイル(.bashrc.zshrc)に alias ls="gls" 等のエイリアスを作る方がまだ安全でしょう. [return]
  9. 個人的には,BSD 系コマンドと GNU コマンドは状況に応じて使い分けているので,後者を利用する場合は明示的に g プレフィックス付きで利用しています. [return]
  10. 完全な余談ですが,LaTeX で同様のことをする ducksay というパッケージがあり,TeX Live にも含まれています. [return]