車輪を再発明 / koba04の日記 このページをアンテナに追加 RSSフィード Twitter

2013-05-21

grunt watchをIRCから操作する

何?

IRCでgrunt watchのログが見れたり、watchの開始、再起動、終了が出来るものをさくっと作ってみました。


使い方

  • node grunt-watch-irc.jsを実行すると指定したチャンネル(default: #grunt)にbot(default: hostname-grunt)がjoinします
  • joinしたbotにprivate messageで !run と発言するとgrunt watchが起動します
  • うまく動いてなくて再起動したい時は、 !restart と発言します
  • 終了する時は !exit と発言します

いつ使うのか

普通はターミナルでgrunt watchしてそのまま標準出力を見ることが多いと思うので使わないと思います。

ですが、サーバー上でgruntが動いている環境があって黒い画面苦手な人がFTPでファイルアップして使うような場合に、IRCでログが見れてうまく動いていないときにIRC経由で再起動出来たりすればいいかなと思いさくっと書いてみました。

grunt自身のプロセスを制御するのでgrunt pluginじゃなくて単純なscriptになっています。

あるといいなという場面があったのでさくっと書いただけなので、必要な人がいそうならもうちょっとちゃんと書いてみます。

2013-04-20

Perl5.14でeval内の$@の挙動が変わっていた

Try::LiteとException::Tinyで例外処理をやろうと導入していたのですが、どうやらネストさせてTry::Liteを使った場合に外側でうまく例外をキャッチ出来ないという現象が発生して悩んでました。


Try::Liteで外側で例外を取得出来なかった例

こんなコードです。

自分が使っているPerlのバージョンは5.14より古いものでしたので、ここにある通り外側で例外がキャッチできない状態でした。

die $@でも、$@->rethrowでもException::Tiny->throwでもダメでした。


Twitterで解決

その時には5.14以上で動くことは知らなくて悩んでいたところ、@hide_o_55さんが

と教えてくださり、試したところ確かにgistにある通り意図した通りに動きました。。


5.14からeval内の$@の挙動が変わった!?

というわけで5.14のどの変更が影響しているのかなぁと思ったところ、ここに書かれているのが影響してそうだなということがわかりました。

同様に eval の中の local $@ はスコープ内の例外を上書きすることは なくなりました。 以前は、巻き戻しによる $@ の復元によって、投げられた例外が 上書きされることがありました。 今では例外はとにかく eval に渡されます。 そのため、die の前の local $@ は安全です。

http://perldoc.jp/docs/perl/5.14.0/perl5140delta.pod#Exception32Handling


というわけでevalにして検証コードを書いてみました。evalの中でlocal $@ で値を入れてその後にdieしてみた動作です。

#!perl
use 5.010;

eval {
    local $@ = "foo";
    die "hoge";
};
say "throw Exception [$@]" if $@;

# perl 5.12 (何も出力されない)

# perl 5.14
throw Exception [hoge at try.pl line 14.
]

5.12ではevalを抜けた時に$@が巻き戻されて(?)、undefになってるんですかね...。ちなみにevalの前にlocal $@ = "init";などとしても結果は同じでした。


というわけで

5.14より前の環境でevalの中でlocal $@とやったり、Try::Liteをネストさせて使いたい場合は注意が必要かなと思いました。

Try::Liteが5.14より古い環境でもネストさせても動くようになると嬉しいので、pull req出来たらしたいなと思ったりしています。

2013-04-19

Amon2::Plugin::Web::Rawというのを書いてみた

Amon2::Plugin::Web::Rawというのを書いてみました。


追記ModuleをWeb::ImageからWeb::Rawに変更


https://github.com/koba04/Amon2-Plugin-Web-Raw


まぁ見ての通り、Pluginを読み込むとrender_rawっていうメソッドが生えてデータのtype(gif, png, jpeg, swf, zip)とバイナリデータを渡すとPlack::Responseにして返してくれるだけのものです。

Pluginにするほどではないのですが毎回書くのは面倒なのでPluginにしてみました。

用途

画像は通常は静的サーバーで配信すると思うのですが、アプリで合成して画像を出力したり、画像にもアプリと同様の認証をしたいという時に使えるかなと思っています。


Dist::Milla便利

今回はモジュール作るのにDist::Milla使ったのですが、Dist::Milla自体のインストールには時間かかりましたが本当に簡単にモジュールを作れたのでとても便利で良かったです。モジュール作るのどうすればいいのか悩まずにアプリのコード書くこと集中できました。



こういうのってCPANにあげたりしていいのかな。。PrePANとかにまずあげればいいのかな。