前回の続き。今回も25個分 (c-g) です。このペースでいくと全7回の連載になりそうですが、さてどこまで続けられるでしょうか。
少しでも調査を楽にしたい意図もあって、完全に使っていないツールは気付き次第アンインストールすることにしました。知らなかったのですが、Homebrewには便利な機能があって
$ brew leaves
とするとインストールされている他のフォーミュラから依存されていないものを一覧にすることができます。つまり、このリストの中にあって「身に覚えのないもの」は消してしまっても大丈夫そうです。
この方式で少しプログラムを間引いているので、実際には初回に言ったように170超のカタログにはならないかもしれません。
crfsuite
- CRFsuite: A fast implementation of Conditional Random Fields
- http://www.chokkan.org/software/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
- cURL (built with OpenSSL)
- https://curl.haxx.se/
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
- GNU File comparison utilities
- https://www.gnu.org/software/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
- ExifTool: Read, Write and Edit Meta Information
- https://www.sno.phy.queensu.ca/~phil/exiftool/
画像や動画のExif情報(メタデータ)を読み書き編集するツールです。対応ファイルタイプはかなり多いです(参考:公式サイト)。本体はperlライブラリのようですが、そのままexiftoolという名前のコマンドラインツールとして手軽に利用できます。実用用途からCTFまで幅広い場面で活躍しています。
findutils
- Collection of GNU find, xargs, and locate
- https://www.gnu.org/software/findutils/
GNU系のディレクトリ検索ツールを集めたものです。具体的にインストールされるコマンドは次の4つ:
gfind: ファイル・ディレクトリの検索glocate: ファイル名データベースからパターンにマッチするものを表示gupdatedb: ファイル名データベースを更新gxargs: 標準入力またはファイルから読み込んだリストからコマンドラインを生成・実行
macOS標準には、やはりこれらのBSD版6のfind類があるので、上に記した通りすべてのコマンドはデフォルトでgプレフィックス付きになります。
個人的にはgfindとgxargsは便利なので(普段はBSD版を使っていますが、状況に応じて)時々使っています。一方で、macOSにはSpotlightのコマンドラインインターフェースであるmdfindが備わっていて、データベースの更新についてOSがよしなにやってくれる分使い勝手が良いので、正直glocateとgupdatedbに関しては使用する場面がありません。
flex
- Fast Lexical Analyzer
- https://github.com/westes/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
- Command-line outline and bitmap font editor/converter
- https://fontforge.github.io
FontForgeは様々なプラットフォームで利用可能なフォント作成用ツールです。私自身はフォント作成はしたことがありませんが(機会があったら欧文フォントぐらいならば遊びで作ってみたいような気もします)、コーディング用フォントとして名高いRictyにパッチを当てるために導入したものが残っていたようです。
公式サイトからリンクされているDesign With FontForgeというドキュメントがかなり充実していて面白そうです。目次を見ると“What Is A Font?”というところから解説しているようなので単に読み物として読むにもいいかもしれません。
foremost
- Console program to recover files based on their headers and footers
- https://foremost.sourceforge.io/
これもCTF用にインストールしたものです。日頃実用していないので詳しくは知りませんが、ファイルのヘッダ・フッタおよび内部データ構造からファイルを修復するツールだそうです。
freetds
- Libraries to talk to Microsoft SQL Server and Sybase databases
- http://www.freetds.org/
主にLinux/UNIX搭載のマシンからMicrosoft SQLサーバに通信するためのライブラリのようです。TDSというのはTabular Data Streamの略で、SQLサーバとクライアントの通信を行うためのアプリケーション層プロトコルだそうですから、これはそのオープンソース実装ということになるのだと思います。
freetype
- FreeType
- https://www.freetype.org/
ここまでにも何度か言及しましたがFreeTypeはフォント描画ライブラリです。C言語で実装されており、様々なプラットフォームで利用可能なようです。Fontconfig, FontForge, popplerをはじめ、フォントのレンダリングやフォント付随情報の取得を必要とする多くのプログラムに利用されています。
fribidi
- Implementation of the Unicode BiDi algorithm
- https://github.com/fribidi/fribidi
GNU FriBidiはUnicodeの双方向アルゴリズム (Unicode Bidirectional Algorithm; bidi) の実装ライブラリです。双方向アルゴリズムというのは英語のような「左から右に進む」(LTR) 文字列とアラビア語やヘブライ語のように「右から左に進む」(RTL) 文字列が混在する場合に、文字の進行方向に曖昧性が生じないように処理するためにUnicodeの仕様で定義されているもののようです。詳しくはUnicodeの公式サイトが提供しているレポートを参照してください.
fzf
- Command-line fuzzy finder written in Go
- https://github.com/junegunn/fzf
ほとんどshort descriptionにある通りですが、コマンドラインでインタラクティブにあいまい検索を行うためのGo製ツールです。色々なコマンドの出力をパイプして使うのが基本のようです。例えば
$ find . | 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
- GNU Compiler Collection
- https://gcc.gnu.org/
説明不要という方がほとんどだと思いますが、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
- GNU database manager
- https://www.gnu.org/software/gdbm/
dbm (Database Manager) というのはツール名のようですが、データベースの分類の1つだそうです。SQLをはじめとする関係データベースと比べると単純な構造をしていて、基本的にはデータファイルにキー・データのペアを保存するしくみになっています。
macOSにはデフォルトでndbmという実装が(システム関数として)バンドルされているようですが、このフォーミュラがインストールするのはGNU版の実装です(gdbmはndbmへの互換性もあるようです)。
Homebrewで依存関係を調べる限りphp, python等のスクリプト言語処理系やVim、その他多様なアプリケーションがこのdbm実装を利用しているようです。
gettext
- GNU gettext
- https://www.gnu.org/software/gettext/
GNU gettextはソフトウェアの国際化 (i18n) とローカル化 (l10n) を支援するライブラリです。例えばTeX Liveのインフラの多言語化もgettextにより実現されています。
gettextを用いた国際化の具体的なしくみは、大まかには次のようになっています:
gettextコマンドでソースコードから多言語化すべき文字列を抽出し、テンプレート (*.pot) を生成msginitコマンドでテンプレートを元に各言語の対訳ファイル (*.po) を生成- 翻訳者が対訳ファイルを編集(
msgidの内容を翻訳しmsgstrの引数に書き込む) msgfmtコマンドで対訳ファイルをバイナリ化 (messages.mo)
翻訳作業者としては、編集完了後にmsgfmtに--check (-c) オプションを指定して実行するとファイル内容の検査ができます。
$ msgfmt --check ja.po
なおこのフォーミュラもmacOSに元々インストールされているBSD系のライブラリとの衝突を避けるため8にkeg-only扱いとなっており、必要な場合は手動でパスを通す必要があります。
ghc
- Glorious Glasgow Haskell Compilation System
- https://haskell.org/ghc/
有名なHaskellコンパイラです。私はHaskellプログラマではないですが、一部のHaskell製ソフトウェアのコンパイルや練習のためにインストールしています。
ghkw
- Search how many keywords in GitHub Code tool
- https://github.com/kyoshidajp/ghkw
指定したキーワードがGitHub上のコードで何回出現するかカウントしてくれるツールです。変数名を決めるのに迷った場合などに便利です。
このフォーミュラは本家には含まれていない所謂「野良フォーミュラ」なので、Homebrewを用いてインストールするためには先にkyoshidajp/ghkwをタップする必要があります。
$ brew tap kyoshidajp/ghkw
$ brew install kyoshidajp/ghkw
ghostscript
- Interpreter for PostScript and PDF
- https://www.ghostscript.com/
GhostscriptはPostScriptを処理することができる強力なツールです。このプロジェクトからはgsを中心に多くのコマンドが提供されています。TeXユーザであればdvipdfやps2pdfコマンドも大変重要です。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
- Library and utilities for processing GIFs
- https://giflib.sourceforge.io/
見ての通りGIF画像を取り扱うライブラリのようです。gif2rgbなどいくつかのコマンドも一緒にインストールされるようです。何の役に立つのかわかりませんが
$ gifecho -t "TeX" > tex.gif
などとすると、与えたテキストがGIF画像になります。giftextコマンドを使うと、引数に与えたGIFファイルについての情報を出力することもできます。GIFといえばアニメーションなので、そういうのが作れると良さそうですが、その用途にはImageMagickのconvertコマンドが用いられる場合が多い気がします。
gist
- Command-line utility for uploading Gists
- https://github.com/defunkt/gist
GitHubが提供するコードスニペット共有サービスGistのコマンドラインツールです。使い方はかなり単純で、必要なことはすべてヘルプに書いてあります。
$ gist -h
GitHub向けのhubユーティリティと同様、大変便利です。
git
- Distributed revision control system
- https://git-scm.com
言わずと知れたバージョン管理システムです。巷にgitの使い方を説明した文献は星の数ほどあるので、今ここであらためて何かを説明する気はまったく起こりません。毎日使っていますが、難解で実のところよくわりません。バージョン管理が(多くのニーズに応えようとすると)本質的に複雑だという面については仕方ない気もしますが、それとは無関係にコマンド体系が複雑怪奇です。その点については「神の思考は常人には理解不能なのだ」としか言いようがありません。まぁTeX言語の仕様みたいなものですね(えっ)
ところで、Linusによるgitの最初のコミットに含まれているREADMEは一読の価値があります:
glib
- Core application library for C
- https://developer.gnome.org/glib/
C言語用のクロスプラットフォームなユーティリティライブラリのようです。元々GTK+ プロジェクトの一部だったのでGLibという名前なのでしょうか。cairo, harfbuzz, wiresharkなど様々なソフトウェアが実装内部で利用しているようです。
今回はここまでです。第三弾に続くといいですね。
-
実際にcurl-opensllフォーミュラが追加された (commit 7d1b059)のは2018年11月と比較的最近のことで、High Sierraのリリース(2017年9月)よりも後です。 ↩︎
-
私も今回初めて知ったのですが、ケグ (keg) というのはビールの貯蔵や輸送に用いられる円筒形の容器のことだそうです(参考:Wikipedia)。Homebrewはまずソフトウェアの名前が「自家醸造」を意味する単語なので、その関連用語もしばしばビール醸造に関わるものになっており洒落ているのですが、ビール関係の英単語に詳しくないとちょっとわかりにくい気もします。チェコビール美味しかったなぁ(7月に学会で行きました) ↩︎
-
macOSに含まれるGNU系のツールが異常に古いのは、AppleがGPLv3の条件を満たせずGPLv2以下のライセンスで配布されているものしか同梱できないからのようです。 ↩︎
-
ただし対話的なマージを行うのは
-oオプションを指定したときで、それ以外の場合はside-by-side形式で差分を表示するだけのようです。 ↩︎ -
GNU sed, tarを導入するフォーミュラ名はそれぞれgnu-sed, gnu-tared、GNU Awkのフォーミュラ名はgawk、そしてedのそれはプレフィックスなしのedなので、一貫性がなくてちょっと困りますね。 ↩︎
-
実はmacOSに
updatedbというコマンドは存在しませんが、findutilsに含まれるものついては一貫性のためこれにもgプレフィックスが付いているのでしょう。 ↩︎ -
AWKというプログラム名は最初の提案舎であるA. Aho, P. Weinberger, B. W. Kernighanの頭文字から来ています。macOS標準の
awkもこの原作者らのオリジナル実装ではないようです。 ↩︎ -
ただしコマンドについてはmacOSのデフォルトのものとの衝突はないようです。 ↩︎