interprism's blog

インタープリズム株式会社の開発者ブログです。

Homebrewで新しいソフトウェアを発見した時の発掘作業を改善したい

この投稿は インタープリズムの面々が、普段の業務に役立つ記事を丹精込めて書き上げる! Advent Calendar 2016 - Qiitaの24日目 の記事です。

hiranoです。私は新しいツールやコマンドや言語を知るのが好きです。 おお、なんだこれ、使ってみよう的なやつです。

それをやるには新しいものの存在に気付く必要がありますが、以下の方法を使っています。

  • Inoreader にサイトを登録して適宜チェックする
  • Explore GitHub をたまに見に行く
  • Homebrewbrew update の結果から発掘する

前者2つは得られる情報の偏りはあるものの、名前と説明がセットになって得られるので探索する時の効率に不満はありません。

Homebrewは全く興味がないものにも気付ける良い面がある反面、探索するプロセスが煩雑(後述します)で不満があります。

※Homebrewは悪くありません

ということでカイゼンすることにしました。

現在の探索プロセス

現在の探索プロセスはこうです。

  1. brew update を叩く f:id:interprism:20161224032052p:plain
  2. brew info {名前} で概要を知る
  3. 興味が湧いた場合 brew home {名前} でWebで詳しく知る
  4. 1の結果を再度見て2,3の手順を繰り返す

地道です。

大事なこと

brew update で出力される画面はその時に変わったものだけで、再度実行しても二度と同じものが見られない

これが非常に大切です。これがあるせいで次の不満点が生じてしまいます。

不満点

  • 2,3の手順を繰り返すと1の結果が上の方にスクロールしてしまって繰り返しにくくなる
    • brew info → スクロール → brew info → スクロール(さっきより長い)と、スクロールしてる時間の方が長くなってくる
  • 時間が足りなくて全部見られなかった時に中断、再開がしにくい
    • もはやどこのターミナルで実行したかすら憶えてないので再開できないことも多い

解決策

何度でも更新されたリストが見られればいいんじゃね?

ということで、スクリプトを書きました。

#!/bin/sh

if ! type gsed 2>/dev/null 1>/dev/null
then
  echo 'gsed is required.  "brew install gnu-sed"'
  exit 1
fi

RED="\x1b[1;31m"
GREEN="\x1b[1;32m"
YELLOW="\x1b[1;33m"
RESET="\x1b[0m"

BREW_FORMULA_BASE="/usr/local/Homebrew/Library/Taps"
BREW_FORMULA_REPOSITORIES="homebrew/homebrew-core homebrew/homebrew-php homebrew/homebrew-versions"

function GITLOG {
    git log --date=format:"%Y/%m/%d %H:%M:%S" --pretty=format:"%cd %s"
}

function EMPHASIZE {
  script=$(mktemp)
  touch $script
  echo "s/\(new formula\)/${YELLOW}\1${RESET}/g" >> $script
  for installed_pkg in $(brew list)
  do
    echo "s/\( ${installed_pkg} \)/${RED}\1${RESET}/g" >> $script
    echo "s/\( ${installed_pkg}:\)/${RED}\1${RESET}/g" >> $script
  done
  gsed -f $script < /dev/stdin
  rm $script
}

TMPOUT=$(mktemp)
touch ${TMPOUT}

_BAKDIR=`pwd`

for fdir in ${BREW_FORMULA_REPOSITORIES}
do
  BREW_FORMULA_DIR="${BREW_FORMULA_BASE}/${fdir}"
  if [ -d ${BREW_FORMULA_DIR} ]; then
    cd ${BREW_FORMULA_DIR}
    GITLOG >> ${TMPOUT}
  fi
done

cd ${_BAKDIR}

cat ${TMPOUT} | EMPHASIZE | sort -r

rm ${TMPOUT}

上記を適当なファイル名で保存(brew_history.sh)して実行すると、以下のように各パッケージの更新履歴的なものが表示されます。

f:id:interprism:20161224032213p:plain

一応以下の機能がついてます。

  • インストール済みのものは赤字で強調
  • 新しいやつは黄色で強調

こちらの記事を参考にさせていただきました。

interprism.hatenablog.com

なお、大量に出力されるので、以下のようにするといいかも。

  • ./brew_history.sh | less -R でちょっとずつ見たり(Rオプションつけないとエスケープシーケンスがそのまま出ちゃう)
  • ./brew_history.sh | grep hoge でフィルターしたり
  • ./brew_history.sh | peco でpecoったり(これやると強調表示が消えます)

正直やっつけなので色々おかしい点はマサカリお願いします。

結果

余は満足じゃ。

  1. brew update で発見
  2. brew info {名前} で概要を知る
  3. 興味が湧いた場合 brew home {名前} でWebで詳しく知る
  4. 再度見たい場合はスクリプトで履歴を追う ← NEW

より良い探索ライフを

たくさん探索していきましょう!

不満点

  • git のログを表示してるだけなので、余計な情報が多いが判別がむずいので諦めた
  • インストール済みのものは強調表示したけど完璧じゃない
  • TAPしたやつは未対応(ログがフリーダム過ぎて諦めた)
  • cask系も未対応(よく分からんかった)
  • 若干遅い
    • FORMULAのリポジトリが複数になってるんだけど、全部まとめて時系列に見せたいので一度ファイルに出力してるところで遅くなってるのは分かるんだけど解決方法が思いつかなかった

副産物

  • /usr/local/Homebrew/Library/Taps/homebrew/homebrew-boneyard は削除されたformula置き場だった。なんか悲しい
  • /usr/local/Homebrew/Library/Taps/homebrew/homebrew-dupesmac標準のコマンドと重複してるものらしい。今回は無視
  • /usr/local/Homebrew/Library/Taps/homebrew/homebrew-servicesmacのサービス(launchd)と関連してるものらしい。今回は無視

余談: んなことしなくてもぱっと考えて思い浮かぶ改善案があるだろ…

A. 1の結果をスクショしておく

保存しておけば確かに見返せるのですが、コピペできないのが痛いので却下

B. 1を実行したターミナルと2,3をやるターミナルを分ける

まあ確かに。だけどおお新しいのある!という感動で脳内麻薬が出ていると別ターミナル開こうとなる前にbrew infoしてしまうので結局ログが流れてしまうので却下。

インタープリズムの面々が、普段の業務に役立つ記事を丹精込めて書き上げる! Advent Calendar 2016 - Qiita25日目の記事

PAGE TOP