私の Homebrew カタログ (2)

2019-09-20   #macOS 

前回の続き.今回も25個分 (c-g) です.このペースでいくと全7回の連載になりそうですが,さてどこまで続けられるでしょうか.

少しでも調査を楽にしたい意図もあって,完全に使っていないツールは気付き次第アンインストールすることにしました.知らなかったのですが,Homebrew には便利な機能があって

$ brew leaves

とするとインストールされている他のフォーミュラから依存されていないものを一覧にすることができます.つまり,このリストの中にあって「身に覚えのないもの」は消してしまっても大丈夫そうです.

この方式で少しプログラムを間引いているので,実際には初回に言ったように170超のカタログにはならないかもしれません.

crfsuite

条件付き確率場 (Conditional Random Fields; CRF) 機械学習アルゴリズムの高速な実装です.CRF というのは識別モデル(分類だけでなく確率を出力できる)かつ構造学習が可能なものであり,系列ラベリング問題を解くのに利用されます.ディープラーニングばかり取り沙汰される世の中ですが,固有表現抽出・チャンキング・形態素解析などで系列ラベリング問題が頻出する自然言語処理の分野ではまだまだ CRF も現役のはずです(たぶん).

CRFsuite はオープンソースな CRF 実装の中ではかなり高速で,CRF++ というツールと並んでよく使用されるようです.上述したような NLP の基本的なタスクは(少なくとも現時点では)私の研究とは直接関連していませんが,研究室で関わっているプロジェクトが使用するツールが CRFsuite 依存だったので手許の環境にも導入されています.

ところで,crfsuite フォーミュラは homebrew-core には含まれていないので,Homebrew でインストールするためには先に brewsci/science をタップする必要があります.

brew tap brewsci/science
brew install crfsuite

curl-openssl

macOS には標準で cURL がインストールされていますが,High Sierra 以降は OpenSSL 版 cURL から LibreSSL 版に移行しています.通常のコマンドラインツールとして cURL を利用する分にはバックエンドが何であれ特に使い勝手が変わることはなさそうなのですが,ライブラリ (libcurl) として使用するようなプログラムにとっては,話はそう簡単ではないようです.

Homebrew を用いて独自に導入する場合,バックエンドはインストール時に自由に選ぶことができます.昔から存在する curl フォーミュラでも

$ brew install curl --with-openssl

のようにすることによって OpenSSL 版 cURL を入手することができます.しかし,おそらく OpenSSL 版 cURL を必須とするフォーミュラの便宜のため,後になってオプションなしで OpenSSL 版を導入する本フォーミュラが追加されたものと思われます1

なお,curl にせよ curl-openssl にせよ,macOS に標準添付されているツールを導入するものなので,Homebrew でインストールしてもそのままではバイナリにパスが通りません(このようなフォーミュラは Homebrew の用語で “keg-only” といいます2).トラブル防止のためにもそのままパス追加しないことをおすすめしますが,コマンドラインで頻繁に自前導入した cURL を使いたいという場合は

$ brew info curl-openssl

で表示される指示にしたがって自力でパスを通す必要があります.

diffutils

macOS に添付する diff 関連ツールは GNU 系のもののようです.当然バージョンはとても古いです3.Homobrew で diffutils をインストールすると,より新しい GNU 系 diff 関連ツールを導入できます.具体的にインストールされるコマンドは次の4つです:

  • cmp: 2つのファイルをバイト単位で比較して,異なる所があればその位置を表示
  • diff: 2つのファイルの差分を表示
  • diff3: 3つのファイルの差分を表示
  • sdiff: 2つのファイルを対話的にマージ4

なお,diffutils に含まれるツールに関しては OS 標準添付のと GNU 系同士で互換性があるためか,coreutils の場合とは異なりデフォルトで g プレフィックスは付きません.

ed

ed といえば UNIX な世界では有名な古のエディタです.行指向で,編集中のテキスト全体を表示しながら使用するものではないので,現代のメジャーなエディタとはだいぶ性格が異なるものです…… というよりも,これをメインにファイル編集を行っていた時代があるというのが信じられません.

macOS には標準で BSD ed が添付していますが,この ed フォーミュラを用いると GNU ed を導入できます5.デフォルトではコマンド名は g プレフィックスが付いた ged です.例によって非推奨ですが,プレフィックスを取りたい場合は brew info ed の説明にしたがって自分でパスを通します.

きょうび手許の Mac で自発的に ed を使うことはまず考えられませんが,拾ったシェルスクリプトに GNU ed を前提としたものがある場合に備えてインストールだけしています.

exiftool

画像や動画の Exif 情報(メタデータ)を読み書き編集するツールです.対応ファイルタイプはかなり多いです(参考:公式サイト).本体は perl ライブラリのようですが,そのまま exiftool という名前のコマンドラインツールとして手軽に利用できます.実用用途から CTF まで幅広い場面で活躍しています.

findutils

GNU 系のディレクトリ検索ツールを集めたものです.具体的にインストールされるコマンドは次の4つ:

  • gfind: ファイル・ディレクトリの検索
  • glocate: ファイル名データベースからパターンにマッチするものを表示
  • gupdatedb: ファイル名データベースを更新
  • gxargs: 標準入力またはファイルから読み込んだリストからコマンドラインを生成・実行

macOS 標準には,やはりこれらの BSD 版6find 類があるので,上に記した通りすべてのコマンドはデフォルトで g プレフィックス付きになります.

個人的には gfindgxargs は便利なので(普段は BSD 版を使っていますが,状況に応じて)時々使っています.一方で,macOS には Spotlight のコマンドラインインターフェースである mdfind が備わっていて,データベースの更新について OS がよしなにやってくれる分使い勝手が良いので,正直 glocategupdatedb に関しては使用する場面がありません.

flex

字句解析器生成ツール lex の高速な後継実装とみなして良いようです.古い記事では “GNU flex” という表記を見かけることでき,実際 GNU のサイト内に専用ページがありますが,少なくとも現在は GNU プロジェクトの一部ではないようです(歴史的事情がありそうですが,そこまで調べていません……).

なお,macOS には flex が標準添付されているため,このフォーミュラも keg-only です.同じく macOS 標準の lex コマンドも,実体は flex のようです.

fontconfig

主に Linux で採用されているフォント設定のためのライブラリです.macOS 自身は別の(おそらく自前の?)機構を用いていますが,一部のグラフィクス系アプリケーション (cairo, harfbuzz, poppler, etc.) が fontconfig に依存しています.

fontconfig はアプリケーションにとってフォント設定の機構を一元化するライブラリであると同時に,ユーザがフォント設定を管理するための各種 CLI(コマンド)も備えています:

  • fc-cache: フォントファイルをスキャンし,キャッシュを更新
  • fc-cat: キャッシュからフォント情報を読み込み,結果を表示
  • fc-conflist: システムにインストールされた設定ファイルの一覧を表示
  • fc-list: 利用可能なフォントの一覧を表示
  • fc-match: 利用可能なフォントの中から,指定したパターンにマッチするものを表示
  • fc-pattern: 指定したパターンをパースして,結果を表示
  • fc-query: 指定したフォントファイルについて,フォントの詳細情報を表示
  • fc-scan: フォントファイルをスキャンし,結果を表示
  • fc-validate: 指定したフォントファイルが,指定した言語に対応しているか検証

また好みのフォント設定を ~/.config/fonts.conf 等に記述しておくと,Fontconfig に適用させることができるようです.

なお,Fontconfig はあくまでフォント設定を扱うソフトウェアなので,フォントのレンダリングを行う機能はありません(その部分は FreeType に依存しています).

fontforge

FontForge は様々なプラットフォームで利用可能なフォント作成用ツールです.私自身はフォント作成はしたことがありませんが(機会があったら欧文フォントぐらいならば遊びで作ってみたいような気もします),コーディング用フォントとして名高い Ricty にパッチを当てるために導入したものが残っていたようです.

公式サイトからリンクされている Design With FontForge というドキュメントがかなり充実していて面白そうです.目次を見ると “What Is A Font?” というところから解説しているようなので単に読み物として読むにもいいかもしれません.

foremost

これも CTF 用にインストールしたものです.日頃実用していないので詳しくは知りませんが,ファイルのヘッダ・フッタおよび内部データ構造からファイルを修復するツールだそうです.

freetds

主に Linux/UNIX 搭載のマシンから Microsoft SQL サーバに通信するためのライブラリのようです.TDS というのは Tabular Data Stream の略で,SQL サーバとクライアントの通信を行うためのアプリケーション層プロトコルだそうですから,これはそのオープンソース実装ということになるのだと思います.

freetype

ここまでにも何度か言及しましたが FreeType はフォント描画ライブラリです.C 言語で実装されており,様々なプラットフォームで利用可能なようです.Fontconfig, FontForge, poppler をはじめ,フォントのレンダリングやフォント付随情報の取得を必要とする多くのプログラムに利用されています.

fribidi

GNU FriBidi は Unicode の双方向アルゴリズム (Unicode Bidirectional Algorithm; bidi) の実装ライブラリです.双方向アルゴリズムというのは英語のような「左から右に進む」(LTR) 文字列とアラビア語やヘブライ語のように「右から左に進む」(RTL) 文字列が混在する場合に,文字の進行方向に曖昧性が生じないように処理するために Unicode の仕様で定義されているもののようです.詳しくは Unicode の公式サイトが提供しているレポートを参照してください.

fzf

ほとんど short description にある通りですが,コマンドラインでインタラクティブにあいまい検索を行うための Go 製ツールです.色々なコマンドの出力をパイプして使うのが基本のようです.例えば

$ find . | fzf

のような感じですね.コマンドライン上でパイプして使うだけでなく,シェルのヒストリー検索 () を fzf によるものに置き換えるような使い方もできます.詳しくは brew info fzf 等としてメッセージを読むべきですが,こうしたシェル向けの便利キーバインドを有効化するには /usr/local/opt/fzf/install を実行してセットアップを行う必要があります.また Vim からの利用もサポートされています.

gawk

macOS にデフォルトでインストールされている awk は,より一般には nawk として知られる AT&T の New AWK 実装です7.それに対して,この gawk フォーミュラは GNU 版の AWK 実装 (gawk) を導入するためのものです.

基本的には gawk の方が nawk より多機能で上位互換と言えるようです.具体的な違いについては以下のブログ記事にまとめられていました.

gcc

説明不要という方がほとんどだと思いますが,GCC はおそらく全世界で最も有名なオープンソースの C/C++ のコンパイラ群です.

これまでも何度か言及してきたように,macOS にデフォルトで導入されている gcc コマンドは実は「いわゆる GCC」(GNU Compiler Collection) ではなくて clang です.GCC とは明確に異なるコンパイラがなぜ「gcc のフリをしている」のか公式な説明を見たことはありませんが,おそらく gcc コマンドを決め打ちで発行するプログラムに対応するためでしょう.

さて,この Homebrew の gcc フォーミュラは正真正銘 GNU のコンパイラコレクションをインストールするためのものです.コマンド名 gcc は例の「gcc のフリをした clang」と被ってしまうので,これによって導入される GCC はバージョン名が後ろについて gcc-<version> という形のものになります.g++ コマンド等も同様です.当然のことながらバージョン番号は変化していきますが,2019年9月現在は gcc 9 がインストールされるので

$ gcc-9
$ g++-9

などが使えるはずです.バイナリは他にもインストールされますが,そのすべてをうまいこと把握する方法がなかなかありません.愚直にフォーミュラの bin ディレクトリを覗きに行くぐらいでしょうか:

$ ls /usr/local/Cellar/gcc/<version>/bin

実用上は gcc- まで入力して Tab 補完に頼る運用をしています.

なお Homebrew では,一部のソフトウェアについて,あえて古いバージョンのものをインストールするためのフォーミュラが用意されている場合があります.そうしたフォーミュラは一般に <name>@<version> という形をしています.GCC についても古いバージョンをインストール可能です.具体的にどんなバージョンがサポートされているかは

$ brew search gcc

で確認してみてください.

gdbm

dbm (Database Manager) というのはツール名のようですが,データベースの分類の1つだそうです.SQL をはじめとする関係データベースと比べると単純な構造をしていて,基本的にはデータファイルにキー・データのペアを保存するしくみになっています.

macOS にはデフォルトで ndbm という実装が(システム関数として)バンドルされているようですが,このフォーミュラがインストールするのは GNU 版の実装です(gdbm は ndbm への互換性もあるようです).

Homebrew で依存関係を調べる限り php, python 等のスクリプト言語処理系や Vim,その他多様なアプリケーションがこの dbm 実装を利用しているようです.

gettext

GNU gettext はソフトウェアの国際化 (i18n) とローカル化 (l10n) を支援するライブラリです.例えば TeX Live のインフラの多言語化も gettext により実現されています.

gettext を用いた国際化の具体的なしくみは,大まかには次のようになっています:

  1. gettext コマンドでソースコードから多言語化すべき文字列を抽出し,テンプレート (*.pot) を生成
  2. msginit コマンドでテンプレートを元に各言語の対訳ファイル (*.po) を生成
  3. 翻訳者が対訳ファイルを編集(msgid の内容を翻訳し msgstr の引数に書き込む)
  4. msgfmt コマンドで対訳ファイルをバイナリ化 (messages.mo)

翻訳作業者としては,編集完了後に msgfmt--check (-c) オプションを指定して実行するとファイル内容の検査ができます.

$ msgfmt --check ja.po

なおこのフォーミュラも macOS に元々インストールされている BSD 系のライブラリとの衝突を避けるため8に keg-only 扱いとなっており,必要な場合は手動でパスを通す必要があります.

ghc

有名な Haskell コンパイラです.私は Haskell プログラマではないですが,一部の Haskell 製ソフトウェアのコンパイルや練習のためにインストールしています.

ghkw

指定したキーワードが GitHub 上のコードで何回出現するかカウントしてくれるツールです.変数名を決めるのに迷った場合などに便利です.

このフォーミュラは本家には含まれていない所謂「野良フォーミュラ」なので,Homebrew を用いてインストールするためには先に kyoshidajp/ghkw をタップする必要があります.

$ brew tap kyoshidajp/ghkw
$ brew install kyoshidajp/ghkw

ghostscript

Ghostscript は PostScript を処理することができる強力なツールです.このプロジェクトからは gs を中心に多くのコマンドが提供されています.TeX ユーザであれば dvipdfps2pdf コマンドも大変重要です.Ghostscript の詳細については,とてもこの記事で解説できるような規模感ではないので,他の記事に譲ることにします.

ところで,このフォーミュラは MacTeX ユーザにとっては非常に厄介な存在となります.MacTeX は TeX Live の他に,しばしば TeX とともに用いられる Ghostscript のようなプログラムを同梱しています.それ自体は別に構わないのですが,そうした TeX Live 外部の種々のプログラムを独自のパス位置ではなく,一般的なバイナリの配置位置 /usr/local/bin/ 等にばら撒いてしまうのが問題です.そのため MacTeX がインストールされた状態で

$ brew install ghostscript

のようなことをすると衝突を起こし,大量のエラーをお見舞いされます(明示的に ghostscript をインストールしなくても,依存関係でインストールが試行されてしまう可能性もあります).残念ながら MacTeX を一度でもインストールしてしまうと,このようにばら撒かれたバイナリをすべて削除することは困難になってしまいます(恐ろしいことに,公式には完全なアンイストールを行う方法が提供されていないようです).そのため,個人的には macOS で TeX 環境を構築する際は,MacTeX は使用せず,TeX Live の公式インストーラ (install-tl) を利用して TeX Live を導入し,Ghostscript 等の追加で必要なプログラムは Homebrew 等で独自に入れることをおすすめしています.

giflib

見ての通り GIF 画像を取り扱うライブラリのようです.gif2rgb などいくつかのコマンドも一緒にインストールされるようです.何の役に立つのかわかりませんが

$ gifecho -t "TeX" > tex.gif

などとすると,与えたテキストが GIF 画像になります.giftext コマンドを使うと,引数に与えた GIF ファイルについての情報を出力することもできます.GIF といえばアニメーションなので,そういうのが作れると良さそうですが,その用途には ImageMagick の convert コマンドが用いられる場合が多い気がします.

gist

GitHub が提供するコードスニペット共有サービス Gist のコマンドラインツールです.使い方はかなり単純で,必要なことはすべてヘルプに書いてあります.

$ gist -h

GitHub 向けの hub ユーティリティと同様,大変便利です.

git

言わずと知れたバージョン管理システムです.巷に git の使い方を説明した文献は星の数ほどあるので,今ここであらためて何かを説明する気はまったく起こりません.毎日使っていますが,難解で実のところよくわりません.バージョン管理が(多くのニーズに応えようとすると)本質的に複雑だという面については仕方ない気もしますが,それとは無関係にコマンド体系が複雑怪奇です.その点については「の思考は常人には理解不能なのだ」としか言いようがありません.まぁ TeX 言語の仕様みたいなものですね(えっ)

ところで,Linus による git の最初のコミットに含まれている README は一読の価値があります:

glib

C言語用のクロスプラットフォームなユーティリティライブラリのようです.元々 GTK+ プロジェクトの一部だったので GLib という名前なのでしょうか.cairo, harfbuzz, wireshark など様々なソフトウェアが実装内部で利用しているようです.

今回はここまでです.第三弾に続くといいですね.


  1. 実際に curl-opensll フォーミュラが追加された (commit 7d1b059) のは2018年11月と比較的最近のことで,High Sierra のリリース(2017年9月)よりも後です. [return]
  2. 私も今回初めて知ったのですが,ケグ (keg) というのはビールの貯蔵や輸送に用いられる円筒形の容器のことだそうです(参考:Wikipedia).Homebrew はまずソフトウェアの名前が「自家醸造」を意味する単語なので,その関連用語もしばしばビール醸造に関わるものになっており洒落ているのですが,ビール関係の英単語に詳しくないとちょっとわかりにくい気もします.チェコビール美味しかったなぁ(7月に学会で行きました) [return]
  3. macOS に含まれる GNU 系のツールが異常に古いのは,Apple が GPLv3 の条件を満たせず GPLv2 以下のライセンスで配布されているものしか同梱できないからのようです. [return]
  4. ただし対話的なマージを行うのは -o オプションを指定したときで,それ以外の場合は side-by-side 形式で差分を表示するだけのようです. [return]
  5. GNU sed, tar を導入するフォーミュラ名はそれぞれ gnu-sed, gnu-tared,GNU Awk のフォーミュラ名は gawk,そして ed のそれはプレフィックスなしの ed なので,一貫性がなくてちょっと困りますね. [return]
  6. 実は macOS に updatedb というコマンドは存在しませんが,findutils に含まれるものついては一貫性のためこれにも g プレフィックスが付いているのでしょう. [return]
  7. AWK というプログラム名は最初の提案舎である A. Aho, P. Weinberger, B. W. Kernighan の頭文字から来ています.macOS 標準の awk もこの原作者らのオリジナル実装ではないようです. [return]
  8. ただしコマンドについては macOS のデフォルトのものとの衝突はないようです. [return]