( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

java,scalaからGrowlに通知を送る方法

macなみなさん、Growl使ってますか?


TwitterのTLやらSkypeチャットやらなにやらがぴよんぴよんポップアップして、とっても楽しいですよね!


Growlがあると、LTやってる最中にSkypeチャットに「チンコ」とか書き込まれたのがGrowlでポップアップしてプロジェクタに表示されたりしてとってもオイシイですよね!


そんな素敵なGrwolですが、javascalaから呼び出して通知を送ることが出来るんです!
まぁ素敵!


で、その方法ですが、GrowlのSDKに付属しているGrowl Java Bindginを利用する方法*1と、growl-javaというライブラリを利用する方法*2の2種類があるんですが、ここではgrowl-javaを使うやりかたを紹介しちゃいますね!

growl-javaのインスコとbuild

javaからGrowl呼び出す為のライブラリがすでにあるんでコレを利用すればオッケーです。


Growl Java API


まずは、ソースを以下のリンクからダウンロードします。
http://forums.cocoaforge.com/download/file.php?id=25&sid=4b28f69b01fec1e11f202f2df26c207b


tar.gzを解凍して出来たディレクトリにbuild.xmlがあるので、antでビルドします。
すると、build/distディレクトリ以下にGrowl.jarとlibgrowl.jnilibができる筈です。


Growl.jarはclasspathに設定します。libgrowl.jnilibはネイティブライブラリなので、vmの引数の-Djava.library.pathに配置されているディレクトリを設定します。

apiを呼び出す。

Growl.jarはclasspathに、libgrowl.jnilibが配置されているディレクトリをvmの引数の-Djava.library.pathに指定することでAPIを呼び出すことができます。


ただ、俺の環境では-Djava.library.pathに指定してもうまくロード出来なかったので、仕方なくjava(scala)コマンドを実行するディレクトリにlibgrowl.jnilibを配置しました。


まずはアプリケーションとNotificationNameを登録します。
NotificationNameは一つのアプリケーションで複数設定することが出来るようです。

GrowlUtils.getGrowlInstance( appName )
growl.addNotification(notificationName , true)
growl.register()


次に、Growlに通知を送ります。

growl.sendNotification(notificationName ,  "タイトル",  "本文", icon)

さきほど取得したGrowlインスタンスのsendNotificationを呼び出すだけです。


第1引数は登録時に指定したnotificationNameです。
第4引数はアイコン画像です。java.awt.image.RenderedImageのインスタンス(java.awt.image.BufferedImageでおけ)を渡します。省略可能です。



これがサンプルコードです。
Githubに置いておきますね。
yuroyoro/scala-growl-sample · GitHub

package com.yuroyoro.scalagrowl

import info.growl.{Growl, GrowlUtils}
import java.io.File
import javax.imageio.ImageIO

object GrowlTest extends Application{

  val appName = "How do you like wednesday Growl"
  val notificationName = "How do you like wednesday Growl"
  val growl:Growl  = GrowlUtils.getGrowlInstance( appName )
  growl.addNotification(notificationName , true)
  growl.register()

  val icon = ImageIO.read(new File("icon.png"))

  val message = List(
      ("腹をわって話そう","藤村D"),
      ("ギアいじったっけロー入っちゃってもうウィリーさ","大泉洋"),
      ("屁ぐらいこかせなさいよ","大泉洋"),
      ("荒くれ者だけにそっち方面に荒くれられたらえらい目に会いますからね","大泉洋"),
      ("あぁーそうかそうか今年も四国かぁ","大泉洋"),
      ("お前は俺より若いんだから俺より高く翔べ","鈴井貴之"),
      ("四国でクリームパン食ったろお前","藤村D"),
      ("まっ直ぐ運転しろって借金野郎","藤村D"),
      ("ひょうおぅ","鈴井貴之"),
      ("多少はペーソスを効かせなさいよ","藤村D"),
      ("マヌケな顔で寝てなさいよ","大泉洋"),
      ("案ずるな受験生","大泉洋"),
      ("もう帰ろふよ寒いんだよ何処へ行かふと","大泉洋"),
      ("しもまるこちゃん","大泉洋"),
      ("八十八ヶ所回ってきましたハイ地獄へ行ってください","大泉洋"),
      ("弾劾を受けてる時点でこらぁ藤村くん反省でしょ","大泉洋"),
      ("船長これ吐く時は海かい","藤村D"),
      ("目が覚めたらロザンナの家だった","大泉洋"),
      ("ここをキャンプ地とする","藤村D")
      )

  message.foreach({ x => growl.sendNotification(notificationName ,  x._2,  x._1, icon)})

}


実行するとこんな感じでGrowlで通知できます!

f:id:yuroyoro:20090724193424p:image


すばらしいですね!

*1:cocoa-javaなのでオススメしません

*2:こっちはjniなのでまだマシ?