Hatena::Groupsubtech

NaN days

2012-02-08

プログラムの出力をコメントとして埋め込んでくれる Perl モジュールを書きました

| 21:08 | プログラムの出力をコメントとして埋め込んでくれる Perl モジュールを書きました - NaN days を含むブックマーク はてなブックマーク - プログラムの出力をコメントとして埋め込んでくれる Perl モジュールを書きました - NaN days

簡単なテストスクリプトやベンチマークを実行したときなどその結果をファイルに書き足したいときがありますが、それを自動でやってくれるモジュールを書きました。

motemen/Acme-Annotate-WithOutput - GitHub

動作例

基本的には use するだけです。

use strict;
use warnings;
use Acme::Annotate::WithOutput;
use Data::Dumper;

print 1+2; 
print Dumper { a => 1 };

use Benchmark 'cmpthese';

cmpthese(100, {
    foo => sub { 1+1 },
    bar => sub { 1*1 },
});

というスクリプトを実行するとファイルの内容が書き変わり、以下のように標準出力に出力された内容がコメントとして埋め込まれます。モジュール自身の use はコメントアウトされます (thanks to @suzak)。

use strict;
use warnings;
# use Acme::Annotate::WithOutput;
use Data::Dumper;

print 1+2; # => 3
print Dumper { a => 1 };
# $VAR1 = {
#           'a' => 1
#         };

use Benchmark 'cmpthese';

cmpthese(100, {
    foo => sub { 1+1 },
    bar => sub { 1*1 },
});
#             (warning: too few iterations for a reliable count)
#             (warning: too few iterations for a reliable count)
#                     Rate bar foo
# bar 100000000000000000/s  --  0%
# foo 100000000000000000/s  0%  --

以下のようにすることで、標準エラー出力を埋め込むこともできます。

use Acme::Annotate::WithOutput handle => \*STDERR;

しくみ

STDOUT を適当に tie() したオブジェクトで置き換え、その PRINT メソッドが呼ばれる時に出力される内容を溜め込んでいます。caller() でスクリプトの何行目から呼ばれたかが分かるので、あとからその場所にコメントを挿入すれば終わり。

2012-01-31

KeyRemap4MacBook を使って Google Chrome で Ctrl-W が効くようにする

| 23:39 | KeyRemap4MacBook を使って Google Chrome で Ctrl-W が効くようにする - NaN days を含むブックマーク はてなブックマーク - KeyRemap4MacBook を使って Google Chrome で Ctrl-W が効くようにする - NaN days

Ctrl-W って単語削除にかなり使う (アドレスバーで1階層上るときとか) のになぜか Chrome で効かないみたい (自分だけかもしれないけど) で困っていたので KeyRemap4MacBook でなんとかした。Ctrl-W を Opt-Delete にマップする。

private.xml にこう書いたらいける。

<?xml version="1.0"?>
<root>
    <list>
        <item>
            <name>Ctrl-W to Opt-Delete (Chrome)</name>
            <only>GOOGLE_CHROME</only>
            <identifier>private.ctrl_w_to_opt_delete</identifier>
            <autogen>--KeyToKey-- KeyCode::W, ModifierFlag::CONTROL_L, KeyCode::DELETE, ModifierFlag::OPTION_L</autogen>
        </item>
    </list>
</root>

常用に近づきました。

2012-01-20

標準入力をブラウザで tail -f できる htmlcat というのを書いた

| 00:32 | 標準入力をブラウザで tail -f できる htmlcat というのを書いた - NaN days を含むブックマーク はてなブックマーク - 標準入力をブラウザで tail -f できる htmlcat というのを書いた - NaN days

GNU screen 使っているとはいえ開発中に諸々のログを流しておくのにウィンドウ使うのに慣れてなくて、タブ開きまくるならやっぱりブラウザを使いたいってことで、標準入力をブラウザに出してくれるツールを書きました。

motemen/App-htmlcat - GitHub

この htmlcat というスクリプトで、くだらない例ですが

% (while :; do; date; sleep 1; done) | htmlcat

このように実行すると

/Users/motemen/perl5/perlbrew/perls/perl-5.14.2/bin/htmlcat: http://0.0.0.0:46007/

と出力され、この場合 46007 番ポートで HTTP サーバが立ち上がっているので、これにブラウザでアクセスすると 1 秒ごとに現在時刻がブラウザに流れてくるのが確認できます。複数同時のアクセスにも対応しているので他人に見せるようなこともできると思います。

実際に使うときには --exec=program というオプションを指定すると HTTP サーバの起動直後に programURL を渡すので、これを使ってたとえば Mac ユーザなら htmlcat --exec=open とすることでブラウザを自動で起動するようにするのが便利です。以下のようなシェルスクリプトを browsercat とかいう名前で保存しておくとよいかと思います。

#/bin/sh
exec htmlcat --exec=open $*

あとコンソールの色付けにも対応してるので

% GIT_PAGER=browsercat git log -p

などとするとこんな画面が見られます。などなどどうぞご利用ください。

f:id:motemen:20120120002038p:image

参考文献

  • コード中で使用している mxhr.js は mala さんの https://gist.github.com/286747 です。
    • mala さんに早速 pull request をいただきましたので、これを適用し、EventSource を使う実装となりました (ありがとうございます)。
  • 空いているポートの取得には tokuhirom さんの Test::TCP を参考にしました。

2011-10-17

YAPC::Asia 2011 に参加してスイーツエリアで話してきました #yapcasia

| 01:23 | YAPC::Asia 2011 に参加してスイーツエリアで話してきました #yapcasia - NaN days を含むブックマーク はてなブックマーク - YAPC::Asia 2011 に参加してスイーツエリアで話してきました #yapcasia - NaN days

Teto というツールを作って、自分ではそれなりに便利に使っているのですが、それだけではいかんよなということで、いろいろと作っていく過程で得た知識や作ったモジュールについてまとめて、YAPC::Asia 2011 のスイーツエリアで発表いたしました。聞いてくださった皆さま、ありがとうございます。

スイーツエリアはメイン会場の出入口付近に机が並べられているエリアで、そこのモニタを使っての発表というかたちでした。聴衆との距離も近いのでふつうの会場とはまた違った雰囲気があり、辻プレゼンって感じです。オープンな場所での発表なので、通りがかった人が興味を持って立ち止まって聞いてくれる、ということもあるのではないかと思います (緊張しまくって何も覚えてないので、実際にそういうことがあったかどうかは分かりません)。


発表する前はうまくいく気がまったくしなくてトークのある2日目の夕方までずっと鬱々としていたのですが、話し終わって後夜祭では、こちらからは気後れしてしまうような方々にも「おもしろかったですよ」と声をかけていただけて、よかったというか、ほんとうに嬉しかったです。去年参加した同僚たちが楽しそうに話していたのを見て羨ましく思っていたので、今年は参加できて素直によかったです……。


聞く側としてもいろいろ会場を廻りましたが、黙って座っているだけでも多岐にわたるトピックに関する話を聞けて興味をかき立てられ、その後のモチベーションにもつながるので、最低でも年に一度くらいはこういう場にいたいものだと思いました。それにしても皆さんスライドもプレゼンも上手くて、なんというか、すごかった。

トークの中では AnyEvent, Coro, IO::AIO - a good team, Monads in Perl なんかがもともと好きな話だったので、楽しかったです。せっかく同業のエンジニアが多く集まるイベントなので、もうちょっと運用系の話を聞きにいけばよかったかなあとも思っています。


Teto については、個人的に今後も使っていくしいろいろと改善点もありますので、ぼちぼち開発を続けていくつもりです (Web 側が中途半端なのでなんとかしたい)。

2011-10-03

Test::Class と Test::Base を同時に使う

| 19:34 | Test::Class と Test::Base を同時に使う - NaN days を含むブックマーク はてなブックマーク - Test::Class と Test::Base を同時に使う - NaN days

Test::Base はたくさんのテストを書かなきゃいけない時にとても便利だし Test::Class はテストをメソッドで小分けできて、また散らばったテストファイルを一つのプロセスでまとめて実行できるので、重宝してます。

で Test::Base は便利さのためにいろいろなことをやっているので、当然そのままでは Test::Class から使うことはできないのだけど、いくつか工夫すればとりあえず使えそうな感じになった。

https://gist.github.com/1258834

やっていることは

  • Test::Base が自動で plan() しないように Test::Builder::plan() を呼ぶ
  • __DATA__ が読めないので spec_string で指定する

plan() のあたりが無理してる感あります。

__PACKAGE__->runtests if $0 eq __FILE__ は単独のテストファイルとして呼ばれた場合はテストを実行して、require された場合は何もしない (あとで Test::Class->runtests とかでまとめて実行される) というねらいです。