2010年 01月 07日

ひだまりスケッチ×☆☆☆ (みっつといわずに1000個の☆でゆのっち)

http://lowreal.net/2010/hidamari-sketch-hosimittsu.html

大晦日に上げるはずが、PC壊れてたせいで忘れてた

2010年 01月 01日

gerry++

2009年 12月 24日

Opera が唯一 javascript:for(;;)alert(''); に対抗できるブラウザ

Opera 10.50 から遂にダイアログ系が全てページごとに別々になった。ページ内ではちゃんとブロックするけど、ブラウザ全体はブロックしない。最も正しい挙動だと思う。

Opera は前々から、alert に script 実行を止めるチェックボックスがついていたり、Basic 認証のダイアログが大量に開いたとしても、同じ認証は1度入力すれば全て消える仕様になっていて、それなりにまともだったけれど、10.50 からは、もう煩わしい大量のダイアログに悩む必要がなくなった。素晴しい!

懸念されるようなこともないことはない。ページ内に Basic 認証のダイアログが表示される形になるので、フィッシィングサイトがでてくる可能性があるかもしれない。一応、Server という部分をクリックすると、ちゃんとダイアログがでて検証可能 (https の場合は証明書の確認・http の場合はフィッシングサイトではないか、という確認) になってる。まぁ知らないサイトの Basic 認証を入力することなんてないと思うけど……

現状の各ブラウザの挙動

javascript:for(;;)alert(''); したときの挙動 (Mac 版のみ)

Google Chrome (4.0.249.43)
OK のみのダイアログ、止める方法がない。該当タブを閉じることもできない。通常の方法で終了することもできない。
Safari (4.0.4)
OK のみのダイアログ、止める方法がない。該当タブを閉じることもできない。通常の方法で終了することはできる。
Firefox (3.5.6)
OK のみのダイアログ、止める方法がない。かなり頑張れば該当タブを閉じることができる。通常の方法で終了することはできる。
Opera (10.50)
OK + Stop executing scripts on this page のダイアログ。ページごとに独立。タブは普通に閉じられる。他のタブを見ているときには表示されない
2009年 12月 18日

差分取得して何かするスクリプト

というのが欲しい機会はなかなかに多くて、その度に「取得したデータはどこに保存しておこう?」と悩みます。MySQL にいれるほどでもない。/tmp においてしまうと消えてしまってこわい。

のでスクリプトファイル自体に書きこんでしまう、というのを考えてみました。ちょっとこわいですが簡単なスクリプトならこう書いて cron でぶんまわしてもいいかもしれないですね。

retrieve_updates には、文字列の配列リファレンスを返すルーチンを渡してやります。そうすると実行する度に前回との差分を返します。

2009年 12月 17日

最近の tig.rb (twitter irc gateway)

またいろいろいじくっていて、大きな変更をいくつか入れたりしています

  • lists に対応
    • @mzp さんがなんとなくやっていらっしゃったのを取り込みつつ
    • 今まで存在していた group 機能は廃止され、lists になりました
  • 発言者が follower かどうかがわかりやすく
    • 発言者が follower じゃない場合 (一方的に follow している場合)、その人に +o がつくので、だいたいのクライアントだと @ がつきます
  • 発言者が protected の場合わかりやすく
    • 発言者が protected の場合、+v がつきます。irssi だと % がつきます
  • /me reload を追加
    • 大抵の変更は tig.rb の再起動なしで反映できるようになりました
  • ratio を自動計算に
    • あまり賢くないのでまだどうにかしたいですが、ratelimit が緩和されてやる気がなくなったので放置気味
    • 更新頻度に応じてクロール頻度が変わります。
    • /me ratio で確認できます
    • (例: Intervals: #)
$ git clone git://github.com/cho45/net-irc.git
$ cd net-irc
$ ruby examples/tig.rb --debug
2009年 12月 15日

テストで result と exptected が違うときに色つき diff

結構長い文字列を比較させるとどこが違っているのかよくわからん…… ということがあるので、クソコードを書いて結果を読みやすくしました。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 は null 文字を Dump しない

全く知らなくて少しまえに大変にハマったのですが、Data::Dumper は普通に使うと \0 を Dump しないようです。(してるけど見えない?)

my $str = "\0";
Dumper $str; #=> ''

[ unpack("C*", $str) ]; #=> [ 0 ];

普段 p を Data::Dumper に展開するようにしてデバッグしているので本当にハマります。

個人的にはデバッグ用に

  • utf8 flagged 文字列かどうかが見た目でわかる
  • \0 がちゃんと出てくる
  • 表示できそうな文字 (英数字・ひらがなカタカナ程度) 以外は全部 \x{} に

みたいなのが簡単にできるモジュールが欲しいのですが既にあるのかな

gerry++

プロンプトをゆのっちから文乃さんに

2009年 12月 10日

gerry++