RAKSUL TechBlog

ラクスルグループのエンジニアが技術トピックを発信するブログです

Macなら ビルド終了 声で知る

こんにちは。文字化けおじさんです。暑くなって参りましたが、皆さんお元気でしょうか? 最近は、私は社内業務で使うMacアプリ(時々Windowsアプリ)の開発を担当しており、Swiftを書いたり、TypeScript + React でElectronアプリとして作ったりしています。元気です。

さて、今回の記事は文字化けの話題ではなくて、Macにおける開発生産性を向上させるための小ネタをご紹介したいと思います。この記事のことを私が実践していたところ、若手の同僚の数名から「かわいい🥰」とお褒めの言葉を頂戴したので、改めて記事として紹介することにしました。

解決したい課題

何か時間のかかる処理が終了したときにはその通知が欲しいと、多くの開発者の方が思ったことがあると思います。ビルドしたとき、unit test を実行したとき、パッケージマネージャでインストール操作をしたとき、などです。この課題は、開発する言語やプラットフォームによらず、多くの環境で存在することでしょう。これらのタスクが短い時間で終わるように取り計らうというのはとても重要な取り組みなのですが、それには限界があります。 これらのタスクが動いている間ずっと画面を見つめていても良いのですが、自分自身の生産性のためには、待っている間はSlackのメッセージのチェックなどの他の作業を進めたいものです。この欲求を尊重した結果、画面を他のアプリに切り替えて作業していると、ビルド等の作業が終了したことに気付かないまま別の作業を継続してしまうという問題があります。

解決策の案

実現の難易度には一旦目を瞑りつつ、ぱっと思いつくところでは以下のような解決策(ビルド等終了の通知方法)が考えられます。

  • 音声で通知する
  • Notification Centre で通知を出す
  • Dockアイコンを跳ねさせる
  • Slack等のメッセージアプリ経由でmentionを飛ばす
  • ビルドが終了するとCPU使用率が下がって冷却ファンの回転が止まることを利用して、ファンの音に耳を澄ませつつ作業する(ファンのあるMacのみ)

様々なものがありますし、他にも手段があるかもしれませんが、この中で最も実現が簡単なのは、実は「音声で通知する」なのです! そう、Macならね😉

sayコマンド

ご存知の方も多いかもしれませんが、Macには say というコマンドが付属しており、引数として与えた文章を読み上げてくれます。このコマンドの詳しい使い方は、ターミナル等で man say を見て下さい。例えば日本語環境で say 東京特許許可局 とすると、噛むこと無く綺麗に読み上げてくれます。 この say コマンドの声の主は -v オプションで指定することができます。声の主ごとに対応している言語が異なり、例えば Kyoko さんは日本語、 Daniel さんはイギリス英語を喋ってくれます。デフォルトの音声は、OSの言語が日本語であれば Kyoko さんになっているはずですが、システム環境設定の「アクセシビリティ」の「読み上げコンテンツ」で変更することができます。このデフォルト設定を変えていたりOSが他の言語になっている場合は、先ほどのメッセージを読み上げるには say -v Kyoko 東京特許許可局 とする必要があるでしょう。 声の主のリストは say -v ? で得られますので、見てみて下さい。

コマンドの成否に応じて発言内容を変える

あるコマンドが終了したときにメッセージを読み上げてもらうには、ビルド用のコマンドの後にセミコロン ; を続けて、その後に say コマンドを呼び出すのが最も簡単です。例えばビルド用のコマンドが make build であるなら make build; say -v Kyoko 'ビルド終わったよ' とします。

これでも十分に有効に機能しますが、正常終了のときは喜ばしいメッセージを、そして異常終了の時は悲しいメッセージを読み上げて欲しいという需要もあります。そのような時は &&|| を用いて make build && say -v Kyoko 'ビルド終わったよ' || say -v Kyoko 'ビルド失敗しちゃったテヘペロ'

とするのが良いでしょう。ビルドのコマンドのstdout(標準出力)を破棄して良い場合は、こう書くこともできます。 say -v Kyoko $(make build > /dev/null && echo 'ビルド終わったよ' || echo 'ビルド失敗しちゃったテヘペロ')

Xcodeの Build Phases に組み込む

MacアプリやiOSアプリ等をXcodeでビルドする際は、終了したことは Notification Centre でも通知されますが、美しい声を聞きたいのであれば Build Phases の最後に Run Script を仕込むことで、ビルド終了時に say コマンドを動かすことができます。

Xcodeの Run Script 設定

私の手元では、ビルド失敗時の読み上げ手法を確立できておりませんが、もしかすると世の中の偉大なる先人たちの誰かが同様のことを確立済みかもしれません。 なお、CI環境など、手元のマシンではない場所でもビルドすることがある場合は、読み上げた結果として何が起きるのか?に気にかけておくと良いでしょう。

npm script に組み込む

Electronアプリのビルドの際、そしてWebフロントエンドのアプリのビルドの終了通知にも、 say コマンドを用いることができます。package.jsonの scripts のところのコマンドに、前述の「コマンドの成否に応じて発言内容を変える」にあるようにコマンドを書けば良いでしょう。 こちらも CI に注意する必要があります。Mac以外の環境(WindowsやLinux等)で動かすことへの配慮が必要な場合は run-script-os を用いて、darwinの時とそれ以外の時とで実行するコマンドを切り替えるのも良いでしょう。

最後に

ラクスルでは、一緒に開発してくれる仲間を募集しています! say -v Daniel Rebuild the Industry. の声を在宅勤務中の自室、いえ、それだけではなく世界中に轟かせていきましょう! 詳しくはこちら

補足:動作確認環境

  • Xcode 12.5.1 on Big Sur 11.4
  • bash 3.2.57(1) on Big Sur 11.4 & Mojave 10.14.6
  • zsh 5.8 on Big Sur 11.4
  • NodeJS v14.17.2 / npm 6.14.13