• このエントリーをはてなブックマークに追加

2010-12-18 11:30頃追記
typesterさんにご指摘をいただいたので,「インストール」の部分に追記しました.

ss-2010-12-17-01

はじめに

今年も佳境に入ってきた JPerl Advent Calendar 2010,「hacker」トラック16日目 typesterさんのエントリや Yappoさんのエントリでオモシロソウなモジュールが紹介されていました.

typesterさんのエントリを一部引用すると.

でもperlbrewで64bit perlいれてるからMac::Growlがうまくインストールできないし…

そんな風に思っていた頃が僕にもありました。
Perl から Growl をちゃんと使おう – JPerl advent calendar 2010 hacker Track

そんな不満を打破するべく僕は Cocoa::Growl を書いた。

XS で Objective-C をつかい、直接 Growl.framework を使う Growl モジュールだ。
Perl から Growl をちゃんと使おう – JPerl advent calendar 2010 hacker Track

最近の64bitなMacでも,「PerlでGrowl」ができてしまうモジュールです.(まぁ以前試して以来,Mac::Growlに触っていなかったため,64bitマシンへのインストールできない(難しい?)ことも知りませんでしたが><)

サンプルのコードを見るに,かなりシンプルのようで,私でもすぐに触れそうかな,などと思い,実際に試してみました.

以下,これらの基本的な使い方についてざっと書き上げてみました.ちなみに,typesterさんの先のエントリと同日にリリースされたみたいですね.

あ,なお,試してみたバージョンについては次のとおりです.

% pmver Cocoa::Growl
0.01
% pmver AnyEvent::Impl::NSRunLoop
0.02
%

pmver については次あたりを.

インストール

Cocoa::Growl と AnyEvent::Impl::NSRunLoop をインストールします.

これらをインストールする際に,Module::Install::XSUtilModule::Install::AssertOS も必要なので,これらを入れておきます.まぁ既に入ってますかね.

なお,デフォルトでは,同梱の「Growl.framework」を利用するようになってますが,自分の環境の同フレームワーク(ライブラリ?)を利用することもできるようです.ここでは省略.

2010-12-18 11:30頃追記

typesterさんよりご指摘をいただきました.ありがとうございます.

@issm エントリ拝見しました。ありがとうございます。一点だけ、Module::Install::* はCPANからインストールする場合は特にインストールする必要ありません。パッケージに同封されています。それらはレポジトリから直接インストールする場合のみ必要です。
Twitter / @Daisuke Murase: @issm エントリ拝見しました。ありがとうございま …

CPAN経由でのインストールであれば,Module::Install::* 系のモジュールを自分で入れる必要はないのですね.

当初,CPANに上がる前にGitHubのものをcloneして入れようとしていたので,perl Makefile.PL でエラーが出るたびにその対策をしていた,という感じです.現在はもうCPAN経由で入れればよいでしょう!

基本

use Cocoa::Growl qw/:all/;

すると,growl_registergrowl_notify,他いくつかのサブルーチンが使えるようになります.

Growlに「アプリ」を登録する


Growl通知を利用するには,まず,「アプリを登録する」必要があります.

これには,growl_register を使います.

growl_register(
    app           => 'Cocoa::Growlのさんぷる',
    icon          => '/Users/issm/Dropbox/profile/issm/issm-20101103-160sq.jpg',
    notifications => [qw/いち にい さん しい ごお ろく/],
);

「環境設定」はGrowlの項目内,「アプリケーション」のタブにて,Growlに登録されているアプリケーションの一覧を確認することができます.

次が before.

ss-2010-12-17-02

次が after.

ss-2010-12-17-03

パラメータ notifications で指定したリストリファレンスは,「Growlに登録されたアプリ」の「設定」で表示されるパネルの「通知」タブにある,「通知」という項目に反映されます.

ss-2010-12-17-04

うーん,順序は五十音順(アルファベットならその順?)になるのですね.この図を確認したときに気づきましたw

通知する

growl_notify を使います.パラメータ name には,先の growl_registernotifications パラメータであるリストリファレンスの要素のいずれかを指定擦る必要があります.

growl_notify(
    name        => 'いち',
    title       => 'たいとるたいとる',
    description => 'ぐろうるつうちのさんぷるだよ!',
    icon        => '/Users/issm/Dropbox/profile/issm/issm-20101103-160sq.jpg',
    sticky      => 1,
    priority    => 1,
);

すると,冒頭のスクリーンショットのようなGrowl通知が表示されます.(もちろん,スタイルは設定状況によって異なりますよ.)

ss-2010-12-17-01

イベント連動

さらに,

use AnyEvent;
use AnyEvent::Impl::NSRunLoop;

することで,Growl通知に対するクリックや,時間経過に伴う消滅に関するイベントを取得することもできてしまいます.これは便利!

イベントハンドラの設定には,growl_notify サブルーチンの on_clickon_timeout の各パラメータに,コードリファレンスを持たせることで行います.

my $cv = AnyEvent->condvar;
 
growl_notify(
    name        => 'いち',
    title       => 'たいとるたいとる',
    description => 'ぐろうるつうちのさんぷるだよ!',
    icon        => '/Users/issm/Dropbox/profile/issm/issm-20101103-160sq.jpg',
    sticky      => 1,
    priority    => 1,
 
    on_click => sub {
        warn 'クリックされたよ!';
        $cv->send;
    },
    on_timeout => sub {
        warn '自然消滅!';
        $cv->send;
    },
);
 
$cv->recv;
ss-2010-12-17-05

通知をクリックすると,on_click で指定したサブルーチンが実行されます.

ss-2010-12-17-06

「sticky」を解除して,一定時間後に消えるようにしてみます.

my $cv = AnyEvent->condvar;
 
growl_notify(
    name        => 'さん',
    title       => 'たいとるたいとる',
    description => 'ぐろうるつうちのさんぷるだよ!',
    icon        => '/Users/issm/Dropbox/profile/issm/issm-20101103-160sq.jpg',
    sticky      => 0,
    priority    => 3,
 
    on_click => sub {
        warn 'クリックされたよ!';
        $cv->send;
    },
    on_timeout => sub {
        warn '自然消滅!';
        $cv->send;
    },
);
 
$cv->recv;
ss-2010-12-17-07

消滅後,on_error で指定したサブルーチンが実行されます.

ss-2010-12-17-08

詳しくは...

CPANのドキュメントをご覧になるのがよいでしょう.

また,Perlの猛者な方たちがオモシロイアプリなどサクっと作りそうな予感なので,それに期待してみましょう.

おわりに

以上,Cocoa::Growl と AnyEvent::Impl::NSRunLoop がオモシロそう!というお話でした.

何らかのイベントにひも付けてGrowlで表示!というのはいろいろ応用が効くものなので,私もまずは自分が便利と思えるような何かから初めてみるとします.まぁまずは AnyEvent の基礎からやらんといかんですがね ><

amazonさん