5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ビルド中にERRORやWARNINGが出る度におっさんが「エラー」「ウォーン」って言ってくれるプログラムを作った

Last updated at Posted at 2019-02-24

ビルド中に流れる大量のERRORやWARNINGを眺めていて「これに合わせておっさんが『エラーエエエエエラエラー』って言ってくれたら楽しいだろうな」と思ってしまったので作りました。Goで。

その名も、ザ・ErrorWarner

デモ↓

あまりちゃんと調べてないのでもしかしたらすでにそういうツールがあるかもしれませんが、Go言語の勉強も兼ねて。

じゅんぼ

対応OS

  • Windows
  • macOS
  • Linux
  • その他OtoがサポートしてるOS(たぶん)

インストール

Goをいい感じにインストールしてパスを通し、以下のコマンドを実行すればおっけー。

go get -v github.com/Bakudankun/ErrorWarner/errwarn

お好みでewなどをerrwarnへのエイリアスに設定しておきましょ。
Goはプログラムのインストールが楽でいいですね。

Linuxとかはライブラリのインストールが必要になるかもしれません。詳しくはOtoのREADMEで。

サウンドファイルの配置

今のところサウンドはついてこないのでご自分で用意してください。
というかバンドルしたとしてインストール後にそれを探し当てるのがちょい面倒……。どうするのが良いのかしら。
とりあえずは適当にTTS downloadとかでググって出てきたサイトで読み上げさせたのを使うと良いと思います。

サウンドを用意したら以下のコマンドを実行します。

errwarn ""

このコマンドは失敗しますが、Windowsなら%APPDATA%の中、macOSなら$HOME/Library/Application Supportの中、Linuxなら$HOME/.configの中にErrorWarnerフォルダが作成されます。
そのフォルダの中にerror.wavwarn.wavを置いたり置かなかったりしてください。

ファイル形式はWAV以外にもMP3・FLAC・Ogg Vorbisにも対応してるといいな。
ただ、自分が試した中で「From Text To Speech」というサイトのMP3はバージョンが低い?とかでgo-mp3が対応していなかったので、結局WAVにデコードしておくことになったのでした。

つかう

つかいかた:
  errwarn [OPTIONS] [--] <cmdline>
  <cmdline> | errwarn [OPTIONS]

OPTIONS
  -e <regexp>
        errorの行にマッチする正規表現を指定します。
  -p <preset>
        プリセットを指定します。
  -s <soundset>
        サウンドセットを指定します。
  -stdout
        標準エラー出力の代わりに標準出力を読みます。
  -w <regexp>
        warningの行にマッチする正規表現を指定します。

おためし

errwarn -e error -w warning

と実行すると標準入力を待機するので、試しにerrorまたはwarningと書いてエンターを押してください。
ちゃんと音声ファイルが設置されていればそれが再生されるハズです。

これだけでも楽しいですが、次に進むためCtrl-Cで終了します。

ErrorWarnerにコマンドを渡す

errwarn [OPTIONS] [--] <cmdline>

errwarn<cmdline>を実行し、その出力を読みます。
出力の中にオプション-e-wで指定した正規表現にマッチする行が出てきたらサウンドを鳴らしてお知らせします。

errwarn自身が異常終了しない限り、終了ステータスは<cmdline>の終了ステータスを返します。

デフォルトでは標準エラー出力を読みます。ビルドログが標準出力に出てくる場合は-stdoutを指定してください。

ErrorWarnerにパイプする

<cmdline> | errwarn [OPTIONS]

最初にerrwarnを書き忘れた場合はパイプさせることもできます。

ただし普通標準エラー出力はパイプされないので、ビルドログが標準エラー出力に出てくる場合はどうにかしてパイプに流し込む必要があります。

また、この場合errwarncmdlineの終了ステータスにかかわらず基本的に正常終了することにも注意。

プリセット

いちいち正規表現を書くのも面倒なのでプリセットを作れるようにしました。TOMLで。
TOMLは初見ではなんか冗長だなあという印象でしたが、設定ファイルを書くという観点ではインデントなどの制約が少なくて適当に書けるので良さげ。

上で作成されたErrorWarnerフォルダにconfig.tomlという名前でテキストファイルを置いておけば、-pオプションでプリセットを呼び出せるようになります。
プリセットの名前がコマンドの名前に一致した場合、自動でそのプリセットを選択してくれます。
デフォルト設定を弄りたくなったので、空文字列を名前としたプリセットで弄られるようにしました。

設定例
# デフォルト値
[preset.""]
stdout = true               # 標準エラー出力の代わりに標準出力を読む
errorFormat = '(?i:error)'  # errorの行にマッチする正規表現
warningFormat = '(?i:warn)' # warningの行にマッチする正規表現
soundset = 'akane'          # サウンドセット

# `errwarn -p gcc`でこの設定を呼び出せる
[preset.gcc]
stdout = false
errorFormat = '^\S+:\d+:\d+: error: '
warningFormat = '^\S+:\d+:\d+: warning: '
soundset = 'aoi'

# `errwarn go build`で自動的に選択してくれる
[preset.go]
stdout = false
errorFormat = '^.*: '
warningFormat = '' # 空の場合は使われない

サウンドセット

当たり前のように喋ってくれる人を切り替えたくなったので、ErrorWarnerフォルダの下にsoundsets/*フォルダを作ることでサウンドセットを作成することができるようにしました。

ErrorWarnerフォルダの構造
ErrorWarner
|-- config.toml
|-- error.wav
|-- warn.wav
|-- ...
|
+-- soundsets
    +-- akane
    |   |-- error.ogg
    |   |-- warn.ogg
    |   |-- ...
    |
    +-- aoi
        |-- error.flac
        |-- warn.flac
        |-- ...

作ったサウンドセットは-sオプションやコンフィグのsoundsetパラメータで指定できます。
指定しなかった場合や空文字列を指定した場合はErrorWarnerフォルダ直下のサウンドファイルが使われます。

もっと賑やかに

どうせなのでerror時やwarning時だけでなく色々なタイミングで音声を流せるようにしました。
以下のファイル名のサウンドが使われます。

  • error.*
    errorが見つかったときに再生されます。
  • warn.*
    warningが見つかったときに再生されます。
  • start.*
    コマンドの開始時に再生されます。
  • finish.*
    errorやwarningがあったもののコマンドは正常終了した場合に再生されます。
    パイプ渡しの場合はコマンドの終了時に常に再生されます。
  • success.*
    errorもwarningも無くコマンドが正常終了した場合に再生されます。パイプ渡しの場合は使われません。
  • fail.*
    コマンドが失敗した場合に再生されます。パイプ渡しの場合は使われません。

まだ作ったばかりなので、少なくともv0.xの間はバンバン仕様が変わる可能性があります。初めてGoで作ったツールなので悪いところがあったらどしどしお便りくださいな。

Happy Erroring!!

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?