🔊

長い処理には通知音コマンドを仕込んでおくと捗るぞ

2024/12/05に公開3

こんにちは!
Magic Moment フロントエンドエンジニアの @morishin です。

この記事は、Magic Moment Advent Calendar 2024 4 日目の記事です。

はじめに

開発あるある

皆さん開発をしていて、コマンドの "待ち" が長いとき、こんな経験はありませんか。

「ビルドに時間がかかるなぁ」
(別の作業をする)
「もう終わったかな (ターミナルチラー」
「まだかー」
(以降無限ループ)

作業に集中できない!

逆に

「このインストール時間かかるなぁ」
「終わるまでちょっと休憩しようかな (スヤァ」
〜3 時間後〜
「...あっ、いつの間にか終わってた!」

処理の完了に気付かずついつい休憩しすぎた!

ありませんか?ありますよね?
まあ休憩しすぎたっていうのはないにしても、実はエラーで処理が中断していたのに気付かなかった、というのはあるあるな気がします。

そんなときは通知音を鳴らすコマンドを仕込んでおくと捗りますよ、というお話。

温故知新

これは昔々、私がサーバルームで長時間作業をしていた時代の tips です。
なのでもはや何番煎じか分かりませんが[1]、それでも今なお改めてこの tips をお伝えしたい。

ペアプロ中、冒頭のようなシチュエーションにあったとき、ターミナルを無限に気にし続けるドライバーが意外と多くて不憫に思いました。
横目でチラチラ見るくらいなら音が出るようにした方がラクじゃない?と伝えたところ、思っていたよりも喜ばれました。

自分にとっては当たり前のノウハウでも、他の誰かにとっては新しいハックかもしれない。
そう思って今回筆を取った次第です。

通知音コマンド

作り方

参考までに私の環境は以下の通りです。

  • デバイス: MacBook Air (M1)
  • OS: Sequoia 15.0
  • シェル: zsh

したがって本記事は Mac 向けの説明になりますが、Windows や Linux でも調べれば似たようなことはできるかと思います。[2]

Mac の場合、afplay という標準コマンドがあるのでこれを使います。

afplay <音声ファイルのパス>

/System/Library/Sounds/ に標準の音声ファイルが置いてあるため、こちらを鳴らしてみます。

afplay /System/Library/Sounds/Ping.aiff

「ティロン」みたいな音が聞こえたかと思います。

これだけだと使いにくいので alias に登録しておきましょう。

vim ~/.zshrc
.zshrc
alias beep='afplay /System/Library/Sounds/Ping.aiff'
source ~/.zshrc

これで beep と打つだけで音が鳴るようになりました。

音が短すぎて聴き逃しそうな場合はループにしておくと良いです。

.zshrc
alias beep='for i in {1..3}; do afplay /System/Library/Sounds/Submarine.aiff; done'

使い方

これだけだとただ単に「音が鳴って楽しい」で終わってしまうので、処理が終わったら鳴るようにします。
といっても大したことではなくて、コマンドの末尾に ;beep とつけるだけです。

sleep 10;beep
#=> 10秒後に処理が完了して通知音が鳴る

sleep はあくまで例なので、実際には make build;beep とか npm install;beep とかになる感じです。

「うっかり beep をつけずにエンターしてしまった!」

あるあるですな。でも落ち着いて。
いったん Ctrl-Z でサスペンドし、fg または bg コマンドで再開させる際に仕込めば大丈夫です。

sleep 10
^Z
#=> zsh: suspended  sleep 10
# ジョブを調べる
jobs
#=> [1]  + suspended  sleep 10
# ジョブ ID を指定してフォアグラウンドで再開する
fg %1;beep

おわりに

以上、通知音コマンドのススメでした。

余談ですが afplay 以外にも Mac 標準コマンドで通知音声を鳴らす方法はいくつかあります。[3]
お好みの方法で自分なりのコマンドをつくってみてください。

  • tput bel
    オーディオベルが鳴る (私みたいにオーディオベルを無効にしていたら鳴らないと思います)

  • say "おわったよ"
    テキストを読み上げてくれる

  • open -a "QuickTime Player" <音声ファイルのパス>
    Web 上の音声も再生できるのが強みだが、再生後に QuickTime Player が開きっぱなしになるのが玉にキズ

ちなみに私の場合、afplay コマンドを使うのは変わらないですが音声にはゼルダの謎解き音をお借りし zelda コマンドとして登録しています。
処理が完了すると「ティロリロリロリリン ♪」とお馴染みの音で教えてくれるのでテンションが上がります。

さて、次回のアドベントカレンダーは nagomiso さん の「LiteLLM を使って色々な LLM API サービスをいい感じに使いこなす」です。
お楽しみに!


脚注
  1. 偉大なる先人様たち
    https://qiita.com/hamada_posts/items/ec01b81c6db000e0f9b3
    https://qiita.com/mentos1212/items/0c51a426da3c8a1758e3
    https://qiita.com/s2mr/items/ed10bca41ab3ee88f3db ↩︎

  2. Windows とか Linux とか
    https://yaya.lsv.jp/sound/
    https://qiita.com/CyberRex/items/aa570c50e8f4c6d94130 ↩︎

  3. 色々できます
    https://ja.stackoverflow.com/questions/230/コマンドが終了したら音を鳴らしたい
    https://qiita.com/zakuroishikuro/items/0c17acb21f119647c205 ↩︎

Discussion

aosho235aosho235

同じようにafplay使ってbeepコマンド作ってますけど、fg;beepでできるのは知りませんでした!

yutkatyutkat

zsh使ってるならzsh-notify(他にもいろいろある)とかでデスクトップ通知に飛ばしてそっちでいい感じに制御するって方が自動でできて個人的には好きだったりします

https://github.com/marzocchi/zsh-notify

1円切手1円切手

その昔 telex でも、オフラインで編集して接続、送信して終わったら BELL(BEEP) を鳴らすという方法があったことを思い出しました。なにしろ 300bps とかでしたから。
bell を仕込み忘れて回線を切り損なうと高額課金が...