Fork me on GitHub

2011/04/18


このエントリーをはてなブックマークに追加
MacにはGrowlがあり、WindowsにはGrowl For Windowsがあります。LinuxにもNotify-OSDがあるじゃないかという人もいますが、Linuxユーザは皆こう思ってる。「これGrowlじゃないもん!」
mumblesというpython+DBusで書かれたGrowl Systemもありましたが、どうやらプロジェクトが消え去った様子。

これはまずい。

と、僕は「Growl For Linux」を作り始める事を決めた

C言語でGTKを使ったGUI。プロトコルは今後、MacのGrowl 1.3でもサポートされる予定であるGNTP(Growl Network Transfer Protocol)を使う事にした。
本来ならば今日あたりにバージョン0.1あたりをリリースする予定だったんだけど、色々と立て込んでいて実はまだ出来てない。でもGNTPを受信して、Growlポップアップが出て、ディスプレイが数種類動く所まではこぎつけた。
今のところ
display1
こんなのや
display2
こんなのや
display3
こんなのが動きます。「キャプチャが思いっきりWindowsじゃねぇか!」と思われるかもしれまんが、ちゃんとLinuxで動作確認してます。
GNTPなので通常のGrowl送信ツールではなくGNTPをサポートした物が必要です。
などなど、この辺みてもらえれば色々あります。
残課題としては
  • 通知音再生
  • ディスプレイの充実/設定変更
  • subscriberアプリケーションの作成
などなどあります。一応、MD5/SHA1/SHA256のパスワードハッシュと、AES/DES/3DESの暗号通信をサポートしてます。
まだ始まったばかりのプロジェクトなので色々と問題がありますが、ぜひpatch書いて送って下さい!
いい物出来たら、きっと世界中から使って貰えます。君も一緒に開発やらないか?ウホッ
Posted at 01:55 in ソフトウェア
Tagged as: C, growl, gtk, linux
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2010/10/10


このエントリーをはてなブックマークに追加
PerlのGrowlライブラリって色々ある訳ですが、誰かが書いたGrowlするアプリのコードを実行しようとした際にWindowsやLinuxで動かないと少し悲しくなります。
そこでGrowl::Anyってのがあればいいんじゃね?って事で書いてみました。
Mac::Growl、notify-send、Desktop::Notify、Net::GrowlClient、Growl::GNTPのどれかがインストールされていれば使えます。
mattn's p5-Growl-Any at master - GitHub

perl module that provide any growl application

http://github.com/mattn/p5-Growl-Any
今日はこれを使って、twitterのhome_timelineをGrowlするスクリプトを書いてみました。
#!perl

use strict;
use warnings;
use Config::Pit;
use Encode;
use Growl::Any;
use Net::Twitter::Lite;

my $config = pit_get("twitter-growler");
unless ( $config->{access_token_secret} ) {
    $config = pit_get(
        "twitter-growler",
        require => {
            consumer_key    => "YOUR_CONSUMER-KEY",
            consumer_secret => "YOUR-CONSUMER-SECRET",
        }
    );
    my $nt = Net::Twitter::Lite->new( %{$config} );
    $| = 1;
    print "Authorize this app at:\n ", $nt->get_authorization_url,
      "\nAnd enter the PIN: ";
    my $pin = <STDIN>;
    chomp $pin;
    my ( $access_token, $access_token_secret, $user_id, $screen_name ) =
      $nt->request_access_token( verifier => $pin );
    $config->{access_token}        = $access_token;
    $config->{access_token_secret} = $access_token_secret;
    pit_set( "twitter-growler", data => $config );
    exit;
}

my $nt = Net::Twitter::Lite->new( %{$config} );
$nt->access_token( $config->{access_token} );
$nt->access_token_secret( $config->{access_token_secret} );

my $growl = Growl::Any->new();
$growl->register( "Growl/Twitter", ["tweet"] );

my $last_id = undef;
while (1) {
    my @sl;
    if ($last_id) {
        @sl = $nt->friends_timeline( { count => 200, since_id => $last_id } );
    }
    else {
        @sl = $nt->friends_timeline( { count => 5 } );
    }
    for my $s ( @{ $sl[0] } ) {
        $last_id = $s->{id} unless $last_id;
        $growl->notify(
            "tweet",
            encode_utf8( $s->{user}{screen_name} ),
            encode_utf8( $s->{text} ),
            $s->{user}{profile_image_url},
        );
        sleep(4);
    }
}
上に書いたモジュールのどれかが入っていれば(notify-sendはコマンド)、MacでもLinuxでもWindowsでも動くはずです。

twitter-growler1
なお、実は現在Growl::Anyのパラメータをutf8フラグ付きにしようかどうか迷っているので、もしかするとその修正を入れた後にこのスクリプトを動かすと文字化けしてしまうかもしれませんので注意です。

今後ネットに転がっていたスクリプトを何も修正せずにGrowlする事が出来る様になれば、素敵な事だなと思います。

ちなみに上記のスクリプトですが、初回に実行するとconsumer_key/consumer_secretを聞かれます。ブラウザでPINを貰って入力するとConfig::Pitで設定を保存して終了するので、再度起動すると動き出します。
streamなAPIでもやってみたのですが、更新が多くGrowlの表示数が激しすぎたので一定間隔で取得する様にしてあります。お好みで修正してみて下さい。
Posted at 02:44 in ソフトウェア::lang::perl
Tagged as: growl, oauth, perl, twitter
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2010/06/18


このエントリーをはてなブックマークに追加
Go言語のWindows版はまだnetやhttpのパッケージが機能しないため、Windows自身で実行出来ないですが、LinuxからWindowsに通知する事は出来るかと思います。(えっそんな人いない?

mattn's go-gntp at master - GitHub

GNTP for golang. http://www.growlforwindows.com/gfw/help/gntp.aspx

http://github.com/mattn/go-gntp
使い方は極力簡単にしました。
client := gntp.NewClient();
client.Register();
client.Notify("ぐろーる!", "こんにちわ!");
こんな感じ。いまはWindowsでは使えないのでSetServer()メソッドでGrowl For Windowsが動いているPCを指定する事になりますね。

ところで...golang-nutsというMLでこんな会話見つけた。
> i saw a tweet that there has been a success of running godoc under
> windows. Does it mean you can use packages net and http in windows? If
> yes, how can I go about it.

It's not ready yet, but I think all the necessary pieces
will be in the next release.
そのツィートがこれ。
Twitter / Andrew: A #golang developer just s ...

go_nuts go_nuts: A #golang developer just sent me a screenshot of godoc running under Windows. Getting excitingly close to having stable Windows support!

http://twitter.com/go_nuts/status/15832858455
次のリリースあたりでWindowsからもnetやhttpパッケージが使えるって事でいいんかな?
ちなみに最近は、Windows版を定期的にリリースしてくれてる人がいるので、試してみたい方はいかがでしょうか。
Posted at 01:12 in ソフトウェア::lang::go
Tagged as: gntp, golang, growl
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2010/01/14


このエントリーをはてなブックマークに追加
なんとなくテーブルにデータがINSERTされたらGrowlされる...なんて仕組み作って見ようと思った。それだけ。
sqliteでextensionを作る。growlはWindowsのGNTPにも対応したmattn謹製gntp-sendを使う。
mattn's gntp-send at master - GitHub

command line program that send to growl using GNTP protocol.

http://github.com/mattn/gntp-send
gntp-sendはコマンドラインプログラムだけど、外部からライブラリとしても使える様にしてあります。
#include <stdlib.h>
#include <sqlite3ext.h>
#include <growl.h>

SQLITE_EXTENSION_INIT1
static void growl_func(sqlite3_context *context, int argc, sqlite3_value **argv) {
    if (argc == 1) {
        const char *text  = (const char *)sqlite3_value_text(argv[0]);
        growl("localhost", "sqlite3", "sqlite3-trigger", "database-update", text, NULL, NULL, NULL);
    }
}
__declspec(dllexport) int sqlite3_extension_init(sqlite3 *db, char **errmsg, const sqlite3_api_routines *api) {
    SQLITE_EXTENSION_INIT2(api);
    return sqlite3_create_function(db, "growl", 1, SQLITE_UTF8, (void*)db, growl_func, NULL, NULL);
}
こんなコード書いて
# gcc -shared -dll -I c:/sqlite3 -I headers growldb.c lib/libgrowl-static.a -lws2_32 -o growldb.dll
こんな風にコンパイル(Windowsの例)。
あとはテーブルにトリガー張って
sqlite> create table foo(comment text);
sqlite> select load_extension('growldb.dll');
sqlite> create trigger tri_foo
   ...> before
   ...>   insert on foo
   ...> begin
   ...>   select growl(new.comment);
   ...> end;
試してみよう!



sqlite> insert into foo values('hasegawa! xss xss');


sqlite3-growl
xssキター!

ただしinsertする側は必ずload_extension('growldb.dll')しとかないといけないので、oracleの様には行かない。
真面目な話、この方法をうまく使えばsqliteでネットワークレプリケーションとか出来そう。
えっ?誰得?.......知りません!
Posted at 00:17 in ソフトウェア::lang::c
Tagged as: c, DB, growl, sql, sqlite
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip