ヤター! コマンドラインからNotification Centerにメッセージが送り放題 ダヨー!!

Mac OS X Mountain Lion以降の機能であるNotification Centerは、通知の外部インターフェイス化です。もともとiOSの機能だけあって、通知だけを一箇所に集めて管理してくれるので、ここにメッセージを出せればユーザーからのアクセスが簡単で確実になります。

ぼくはコマンドライン環境のプログラムが気楽で大好きなんですが、コマンドライン環境というのは昔からの文字だけのやりとりを小さいウィンドウの中でちまちま実行することに他ならないので、そこで実行されるプログラムがいくら大きなインパクトを持っていても、つまり、巨大なデータを扱ってたり、膨大な計算を実行したりしていても、ユーザーとのインターフェイスは、このウィンドウの中に表示される文字と、キーボードでちまちま入力するものに限定されています。

入力の方はファイルを直接読み込ませたり、他のプログラムの出力を直接取ったりできるので(というか、それが一般的なので)むしろ問題は無いんですが、データ以外の出力、つまり「お知らせ」、すなわち実行が終了したとか、あとどれくらいかかりそうだとか、そういったユーザーへの情報提供手段がターミナルの画面に限定されており、後ろに回してあったターミナルを前に出して、実行結果など他の情報に埋もれているかもしれないそれを能動的に見つける必要があるというのは問題があると、ずっと思っていました。面倒だしミスの元だから嫌いですし、sayコマンドが使えるようになってからはシェルスクリプトをどんどん喋らせるようになりました。しかし、音声というのは聞き逃す危険が大きいし、静かなところやうるさいところなど、使えない場所もすくなくありません。

去年の夏前に新しいMacbook Airを買ってから、twitterでメンションされたりするたびに右上に何か出てくるのは気付いてました。なかなか便利な感じだけど、これってターミナルから使えないかな…と思うようになって半年、やっと調べてみました。

Notification Centerをターミナルから使う

基本的には3つの方法があります。

  1. AppleScriptを使う
  2. terminal-notifierを使う
  3. growlnotifyを使う
AppleScript

使い方は非常にシンプルです:


$ osascript -e 'display notification "お知らせ内容" with title "タイトル" '

利点:

  • Mavericksなら何もインストールせずに使える
  • UTF-8な日本語メッセージOK

欠点:

  • Mavericksでないと使えない
  • お知らせをクリックするとApplescript Editorが立ち上がる

マシンはMavericksなのですが、クリックするとApplescript Editorが立ち上がっちゃうのがダサすぎて死にそうです。なんらかの変数を設定すれば他のアプリケーションを見に行くように出来ると思うんですが、とりあえずまだ機能を見つけられません。

terminal-notifier

インストール:

  1. https://github.com/alloy/terminal-notifier/downloads からダウンロード
  2. 解凍して出てきたterminal-notifier.appをアプリケーションフォルダに入れます。
  3. /Applications/terminal-notifier.app/Contents/MacOS/ にパスを通します。

使い方:


$ terminal-notifier -message "お知らせ内容" -title "タイトル"

利点:

  • Mountain LionとMavericksの両方で使える
  • オプション '-activate ID' でクリックした時にアクティベートするアプリケーションを指定可能
  • オプション '-sound NAME' で音とともに通知できる

欠点:

  • インストールが面倒

'ID'はBundle Identifierというアプリケーション固有IDで、/Application/名前.app/Contents/Info.plistのCFBundleIdentifierというkeyのstring値です。Mail.appならcom.apple.mailになります。
インストールは面倒ですが、入れてしまえばあとは一番楽に使える感じなので、これを使っています。

growlnotify

使ってみてませんが一応書いておきます。
インストール:

利点:

  • Mountain Lionよりもさらに古いOSでも使えるっぽい

欠点:

  • インストールが必要


さて、terminal-notifierが使いやすかったので、シェルスクリプトでポモドーロタイマーを作ってみました。

#!/bin/bash
name="Pomotimer"
ratio=$1
width=$2
if [ -z $ratio ]
    then ratio=5 # ratio for work:rest = 5:1.
fi
if [ -z $width ]
    then width=60 # work duration is 60 minutes.
fi

rest=$(($width/($ratio+1)))
work=$(($width-$rest))
restsec=$(($rest*60))
worksec=$(($work*60))

while :
do timenext=`date -d "+$work min" +%R`
    terminal-notifier -message "開始です。$timenext まで $work 分の集中をお願いします。" -title $name > /dev/null
    sleep $worksec
    timenext=`date -d "+$rest min" +%R`
    terminal-notifier -message "休憩です。$timenext まで $rest 分休んでください" -title $name > /dev/null
    sleep $restsec
done

使い方は、引数を指定せず


$ pomotimer
とやると、50分働いて10分休むためのノーティフィケーションを永遠に出し続けるというものです。
第1引数は活動時間と休み時間の割合で、休み時間を1とした時の活動時間の割合で指定します。3と指定すれば1:3で、全体が60分なら労働45分の休み15分となります。
第2引数は1ポモドーロの長さ(活動時間+休み時間)で、単位は分です。デフォルトは60分になっています。
第1引数だけ指定することもできますが、第1引数を省略して第2引数だけ指定することはできません。逆の方が良い気がしないでもないです。


このくらい手軽にノーティフィケーションが使えると、何とも言えないほど便利ですね。osascriptで起動アプリを選ぶ方法がわかれば以後のMacで便利なので、後で調べようと思います。