ひだまりスケッチ×☆☆☆ (みっつといわずに1000個の☆でゆのっち)
http://lowreal.net/2010/hidamari-sketch-hosimittsu.html
大晦日に上げるはずが、PC壊れてたせいで忘れてた
http://lowreal.net/2010/hidamari-sketch-hosimittsu.html
大晦日に上げるはずが、PC壊れてたせいで忘れてた
Opera 10.50 から遂にダイアログ系が全てページごとに別々になった。ページ内ではちゃんとブロックするけど、ブラウザ全体はブロックしない。最も正しい挙動だと思う。
Opera は前々から、alert に script 実行を止めるチェックボックスがついていたり、Basic 認証のダイアログが大量に開いたとしても、同じ認証は1度入力すれば全て消える仕様になっていて、それなりにまともだったけれど、10.50 からは、もう煩わしい大量のダイアログに悩む必要がなくなった。素晴しい!
懸念されるようなこともないことはない。ページ内に Basic 認証のダイアログが表示される形になるので、フィッシィングサイトがでてくる可能性があるかもしれない。一応、Server という部分をクリックすると、ちゃんとダイアログがでて検証可能 (https の場合は証明書の確認・http の場合はフィッシングサイトではないか、という確認) になってる。まぁ知らないサイトの Basic 認証を入力することなんてないと思うけど……
javascript:for(;;)alert(''); したときの挙動 (Mac 版のみ)
というのが欲しい機会はなかなかに多くて、その度に「取得したデータはどこに保存しておこう?」と悩みます。MySQL にいれるほどでもない。/tmp においてしまうと消えてしまってこわい。
のでスクリプトファイル自体に書きこんでしまう、というのを考えてみました。ちょっとこわいですが簡単なスクリプトならこう書いて cron でぶんまわしてもいいかもしれないですね。
retrieve_updates には、文字列の配列リファレンスを返すルーチンを渡してやります。そうすると実行する度に前回との差分を返します。
またいろいろいじくっていて、大きな変更をいくつか入れたりしています
$ git clone git://github.com/cho45/net-irc.git $ cd net-irc $ ruby examples/tig.rb --debug
結構長い文字列を比較させるとどこが違っているのかよくわからん…… ということがあるので、クソコードを書いて結果を読みやすくしました。Test::Builder::_is_diag を書きかえています
use Test::More;
use Algorithm::Diff;
use Term::ANSIColor;
sub colordiff {
my ($a, $b) = @_;
my $ret = "";
my $diff = Algorithm::Diff->new([ split /\n/, $a ], [ split /\n/, $b ]);
$diff->Base(1);
while ($diff->Next) {
if ($diff->Same) {
$ret .= " " . $_ . "\n" for $diff->Items(1);
}
elsif (!$diff->Items(2)) {
$ret .= colored("- " . $_, 'red'). "\n" for $diff->Items(1);
}
elsif (!$diff->Items(1)) {
$ret .= colored("+ " . $_, 'green'). "\n" for $diff->Items(2);
}
else {
my $lineDiff = Algorithm::Diff->new(
[ split //, "* " . join("\n* ", $diff->Items(1)) . "\n" ],
[ split //, "* " . join("\n* ", $diff->Items(2)) . "\n" ]
);
$lineDiff->Base(1);
while ($lineDiff->Next) {
if ($lineDiff->Same) {
$ret .= $_ for $lineDiff->Items(1);
} elsif (!$lineDiff->Items(2)) {
$ret .= colored($_, 'red') for $lineDiff->Items(1);
} elsif (!$lineDiff->Items(1)) {
$ret .= colored($_, 'green') for $lineDiff->Items(2);
} else {
$ret .= colored($_, 'red') for $lineDiff->Items(1);
$ret .= colored($_, 'green') for $lineDiff->Items(2);
}
}
}
}
$ret;
}
{
*Test::Builder::_is_diag = sub {
my ($self, $got, $type, $expect) = @_;
$self->_diag_fmt( $type, $_ ) for \$got, \$expect;
my $diff = colordiff($got, $expect);
no strict;
local $Test::Builder::Level = $Test::Builder::Level + 1;
return $self->diag(<<"DIAGNOSTIC");
got: $got
expected: $expect
$diff
DIAGNOSTIC
};
}あと、printable ではない文字を、そのままテスト結果に吐かれても困るので
{
no warnings 'redefine';
*Test::Builder::_diag_fmt = sub {
my ($self, $type, $val) = @_;
if ( defined $$val ) {
if( $type eq 'eq' or $type eq 'ne' ) {
$$val = dumper($$val);
$$val = "'$$val'";
}
else {
$self->_unoverload_num($val);
}
} else {
$$val = 'undef';
}
};
}
sub dumper ($) {
my ($str) = @_;
$str =~ s{([^\x0a\x20-\x7e\x{3040}-\x{309F}\x{30A0}-\x{30FF}])}{
sprintf('\\x%02x', ord $1);
}eg;
$str;
}とかやっています。見えない文字があるとかは切実に困るので割と便利です
全く知らなくて少しまえに大変にハマったのですが、Data::Dumper は普通に使うと \0 を Dump しないようです。(してるけど見えない?)
my $str = "\0";
Dumper $str; #=> ''
[ unpack("C*", $str) ]; #=> [ 0 ];普段 p を Data::Dumper に展開するようにしてデバッグしているので本当にハマります。
個人的にはデバッグ用に
みたいなのが簡単にできるモジュールが欲しいのですが既にあるのかな