働くプログラマ

Growl 通知システム: シンプルなものほど優れている

Ted Neward

Ted NewardUI や UX に関するあらゆる議論の中で、最高の UI とは、HTML/CSS/JavaScript を使用した派手できらびやかな表示や目を見張るようなアニメーションではなく、画面の隅に隠れているシンプルなメッセージであるという事実を見失いがちです。企業システムで特によく使われるのは、UI を備えていない "ヘッドレス" 操作です。

とは言え、ユーザーにアクセスしてアクションの実行を依頼する方法は必要です。自分でシンプルで小さな UI ユーティリティを構築することはできますが、他人が既にビルドおよびデバッグした、おそらく自分で作成するよりも多くの機能が含まれているユーティリティを活用することも 1つの手です。

Growl の基礎

Growl (growlforwindows.com、英語) は、同名の Mac ユーティリティを Windows 用に移植したもので、「究極の通知システム」とうたわれています。基本的には簡単に理解できます。この通知システムはコンピューターに常駐し、Windows デスクトップ ビューの右下隅の通知トレイに収容され、通知をリッスンします。

メッセージが着信すると、小さなメッセージ ボックスをポップアップしてユーザーに知らせます。また、ネットワークの盗聴者にトラフィックを解読されないように、ネットワーク経由で送信されるメッセージを暗号化したり、パスワードで保護することもできます。Growl は、インスタント メッセージが流行し MSN Messenger がもてはやされた時代の "トースター" メッセージのようなもので、基本的には、ユーザーに通知メッセージを提示することが目的です。大筋はこんなところです。

開発者のユーティリティやソリューションがすべて、MSN Messenger のように驚くほど大規模で巨大なアーキテクチャになるわけではありません。事実、最もエレガントな問題解決策は、KISS (Keep it simple, stupid) 原則に従い、1 つの分野に特化した小さなコンポーネントになることもあります。Growl が適切に対応する 1 つの分野は、見逃しがちな出来事を 1 人のユーザー (または、ネットワークで全体に広げることを考え始めた場合は複数のユーザー) に通知することです。

たとえば、Growl が最初に導入されたのは Oak ビルド システムの一部としてでした。このビルド システムは、基本的には "継続的ビルド" システムでした。ソース ファイルが変更されると必ず、プロジェクトのリビルドがトリガーされます。Visual Studio で作業をしている開発者が知らないうちにそのリビルドがトリガーされたとすると、当然、その開発者がビルド エラーを知る方法が問題になります。ビルド システムから Growl に通知を送信すると、Growl はその開発者にビルド結果を目立たないように (注意を引かない、つまり作業の妨げにならない画面の隅に隠すように) 表示します。

Growl の通知: 社内外の開発者の立場になって考えてみるとこの機能が役立つ状況がすぐに思い浮かびます。開発者であれば、時間がかかる作業 (ビルド、データの読み込み、ETL プロセスなど) をバックグラウンドで実行しているときに、その作業の終了が通知されれば便利です。システム管理者であれば、すぐに人手による介入が必要であっても、運用を完全に終了することが認められない重大なエラーが発生した状況が通知されれば非常に役に立ちます。

ユーザーであれば、関心のある事項 (たとえば、現在取り組んでいる事項) の特定のデータ レコードが更新されるときや、ユーザーの目に留まるようにプッシュする必要があるイベント (起動、シャットダウン、システム全体のユーザー メッセージなど) がシステム内で発生したときなど、社内ネットワーク内のアプリの "プッシュ通知" システムのようなツールとして役に立ちます。ネットワーク ゲームにも利用でき、プレイヤーに自分の順番が回ってきたことを知らせることができます。

Growl は、他のコンピューターにメッセージを「転送」することもできます。昼食で外出中など、メッセージを確認できない場合は、Growl を構成して、携帯端末、タブレット、コンピューターのグループなどにメッセージを送信できます。あるアカウントに電子メール メッセージを送信したり、(パブリックにまたはダイレクト メッセージとして) ツイートすることもできます。ユーザーは Growl を構成して、登録したアプリ単位に音の再生をオンまたはオフにしたり、登録したアプリ単位に通知の優先度を設定することなども可能です。

Growl はかなり便利なツールで、プログラミングは非常に簡単です。Growl をインストール後、Growl for Windows フォルダーにインストールされるコマンドライン "growlnotify" ツールを使用して、(たとえば、バッチ ファイルまたは Windows PowerShell スクリプトから) Growl の通知を送信できます。コマンドラインでは、以下のコマンドを使用して "growlnotify" ツールを起動します。PATH に既定の Growl インストール ディレクトリ (C:\Program Files\Growl for Windows) を指定しているものとします。

growlnotify "This is a test message"

Growl のインストールに成功していれば、コマンドラインに「Notification sent successfully」(通知の送信に成功しました) という応答が返ります。デスクトップの隅に小さな青いメッセージ ウィンドウがポップアップ表示されます。システム通知トレイの Growl アイコンを開き、他のコンピューターにメッセージを転送する機能、"/?" コマンドライン パラメーターを使用してネットワーク間で Growl 通知を送信する方法を調べる機能など、構成オプションをテストします。ここで確認できるオプションは、Growl の通知をコーディングするときに利用できる API にほぼ直接対応しているため、先を読み進める前にここで試しておきます。

Growl SDK

Growl SDK は Growl Network Transport Protocol (GNTP) を覆う薄い層といえます。HTTP の TCP/IP ネットワークプロトコルを思い浮かべてください。Growl が以前から存在していたことを考えれば、このプロトコルの詳細を抽象化するために作成されたライブラリが複数存在することは驚くにあたりません。このようなライブラリをまとめて、「Growl 接続」ライブラリと呼びます。

Growl-for-Windows を入手したのと同じ Web サイト (growlforwindows.com、英語) には、Growl 用 Microsoft .NET Framework ライブラリへのリンクだけでなく、C++、COM、さらに SQL Server に対応する Growl ライブラリのリンクもあります (最後の SQL Server 対応の Growl ライブラリに触れておきます。これは、SQL Server のスクリプトを使用して DBA のグループなど、関心のあるグループに接続し、通知を送信できるようにするパッケージです)。

Growl .NET ライブラリをダウンロードして、.zip ファイルを開きます。ファイルには C# と Visual Basic .NET のサンプル アプリが含まれていますが、今回の目的は "libraries" フォルダーにある Growl.CoreLibrary.dll と Growl.Connector.dll という 2 つの .NET アセンブリです (SDK をどこにダウンロードしたかわからない場合は、Growl の一部として Growl のホーム ディレクトリにもインストールされています)。任意の .NET プロジェクトで、これら 2 つをライブラリ アセンブリとして参照するだけで、作業を進めることができます。

接続と登録: Growl クライアントから通知を送信するには、Growl クライアントを Growl に登録する必要があります。Growl は、未登録のアプリから受信したすべての通知を無視します。さいわい、登録は 1 回だけで、SDK を利用して簡単に実行できます。GrowlConnector オブジェクトを作成するだけです。リモート コンピューターにアクセスする場合は、必要に応じてターゲットのホスト名とポートを含めます。オブジェクトを作成したら、登録するアプリに関する簡単な情報をいくつか含めます。

var connector = new GrowlConnector();
var thisApp = new Application("GrowlCL");
thisApp.Icon = @".\app.png";

アイコンにはファイル名、URL、またはバイトの配列を指定することができます (この 2 つのクラスはどちらも GrowlConnector 名前空間に所属します)。

Growl では、通知が種類によってグループ化されているものとします。Web ブラウザーでは、「ファイルのダウンロードを開始しました」、「ファイルのダウンロードが完了しました」といった通知を送信する可能性があります。ゲームでは、「新しいゲームが提供されました」、「プレイヤーが登録されました」、「あなたのターンです」、「他のプレイヤーのターンが完了しました」といった通知を送信する可能性があります。Growl では、アプリがこのような通知の種類を登録して、ユーザーが通知の各種類の処理方法を構成できるようにしていることを想定します。新しい Growl クライアントは、通知の種類を定義後、GrowlConnector.Register メソッドにその定義を渡して登録を完了する必要があります。

// Two kinds of messages: insults and compliments
var insultType = new NotificationType("INSULT", "SICK BURN!");
var compType = new NotificationType("COMPLIMENT", "Nice message");
connector.Register(thisApp, new NotificationType[] { insultType, compType });

最初のパラメーターは、コードが通知の種類を示すために使用する文字列です。2 つ目のパラメーターは、通知するときにユーザーの Growl アプリに表示する文字列です。Application オブジェクトと同様、NotificationType にも Icon プロパティがあります。そのため、通知の種類単位にメッセージのテキストとアイコンを変えることができます。これは必須ではありませんが、製品の最終的な外観をより洗練されたものにできます。

上記のコードを実行すると、登録するアプリから最初にこのコンピューターの Growl アプリと接続するときに、Growl は「GrowlCL has registered」(Growl クライアントが登録されました) というメッセージをポップアップ表示します。

通知: Growl にアプリと通知の種類を登録すると、簡単に通知を送信できるようになります。アプリ名、通知の種類を表す文字列、通知を一意に識別するオプションの ID (これについては後ほど説明します)、および送信するメッセージのタイトルと本文を渡して Notification オブジェクトを作成し、Notify メソッドを使用して Growl に Notification オブジェクトを送信するだけです。

var notification = new Notification("GrowlCL", "INSULT", null, 
  "YO MAMA!",  "Your mama is so fat, she dropped an apple " + 
  "and it entered orbit around her.");
connector.Notify(notification);

Growl アプリがメッセージを受信すると、(既定で) 画面の下隅にポップアップを表示します。

実に簡単です。

メッセージ確認の有無: 通知に対するユーザーの行動について知りたい場合があります。ユーザーはメッセージを確認しないで閉じたでしょうか、それとも実際にメッセージを読んだでしょうか。これは、コールセンターなどで、上司の指示通り社員が本日の推薦商品の特別セールを実際に確認しているかどうかを把握したい場合に便利です。

Growl では、コールバックを登録することによってこれを可能にします。コールバックには、.NET イベント ハンドラー メソッドまたは WebHook のいずれかを設定できます。WebHook とは、Growl が送信する通知の ID パラメーター (前述) などのデータを含む HTTP POST 要求として送信する宛先 URL です。イベントでは、Growl Connector ライブラリからターゲットの Growl インスタンスにアクセスできずエラーが発生しますが、クライアント コードが GrowlConnector オブジェクトのイベント ハンドラー (ErrorResponse) を登録すればアクセスできます。

イベント ハンドラー メソッドは、HTTP エラー コードとエラーの説明によく似たわかりやすいエラー コードとエラーの説明を受け取ります。Growl Connector ドキュメント (ダウンロードした SDK の .zip に含まれている「Growl for Windows Application Integration Guide」) には、このようなエラーの一覧が記載されていますが、「200 - TIMED OUT」(200 - タイムアウト)、「201 - NETWORK FAILURE」(201 - ネットワーク障害) などのように、すべて簡単に理解できるものです。

実に簡単

Growl は「最も複雑なアーキテクチャ」という賞を受賞するつもりはないようです。Growl を 1 回のコラムでほぼ完璧に説明できるとすれば、間違いなく、かなりシンプルで簡単な特定の分野に特化したツールと言えます。簡潔に言えば、これが Growl の最大の強みです。率直に言って、Growl はあらゆるテクノロジストから最も称賛を受けるライブラリまたはツールであり、実に簡単に使用できます。それでは、コーディングを楽しんでください。

Ted Neward は、コンサルティング サービス会社の iTrellis で CTO を務めています。これまでに 100 本を超える記事を執筆している Ted は、さまざまな書籍を執筆および共同執筆していて、『Professional F# 2.0』(Wrox、2010 年、英語) もその 1 つです。C# MVP であり、世界中で講演を行っています。彼は定期的にコンサルティングを行い、開発者を指導しています。彼の連絡先は ted@tedneward.com (英語のみ) または ted@itrellis.com (英語のみ) です。彼がチームの作業に加わることに興味を持ったり、ブログをご覧になったりする場合は、blogs.tedneward.com (英語) にアクセスしてください。

この記事のレビューに協力してくれた技術スタッフの Brian Dunnington (独立系コンサルタント) に心より感謝いたします。