タグ

ブックマーク / gfx.hatenadiary.org (10)

  • Perlでコールスタック上のサブルーチンの引数を得る - Islands in the byte stream (legacy)

    @DB::args でできます。 use strict; use warnings; use Data::Dumper; sub foo { bar(1, 2, 3) } sub bar { package DB { our @args; my $i = 0; while (() = caller $i) { print "$i: ", ::Dumper \@args; $i++; } } } foo('a', 'b', 'c'); outout: 0: $VAR1 = [ 1, 2, 3 ]; 1: $VAR1 = [ 'a', 'b', 'c' ]; もともとデバッガAPIの一部なので使い方はかなりマジカルで、DBパッケージ内でcaller()に引数を与えてかつリストコンテキストで評価すると@DB::argsにそのコールスタックでの引数がセットされるというものになっています。 以下pe

    Perlでコールスタック上のサブルーチンの引数を得る - Islands in the byte stream (legacy)
    hitode909
    hitode909 2013/09/30
    便利そう
  • strict無効化の誤謬 - Islands in the byte stream (legacy)

    シンボルテーブルを操作するときに"no strict 'refs'"で一時的にstrictを無効化することはよくあるが,デバッグしにくいバグが紛れ込む可能性がある。 たとえば,以下のようにアクセサを動的に生成するコードはCPANのそこかしこにある。 sub make_accessor{ my($class, $property) = @_; no strict 'refs'; # simple read-only accessor *{$class. '::' . $property} = sub{ my($self) = @_; return $self->{$property}; } } このようなコードによって生成されたメソッドを,正しくオブジェクトに対して使う分には問題ない。しかし,このメソッドをクラスメソッドとして呼び出すと,グローバル変数${$self}を参照し,その値をハッシ

    strict無効化の誤謬 - Islands in the byte stream (legacy)
    hitode909
    hitode909 2011/10/05
  • Re: モダンPerl連載第43回 - Islands in the byte stream (legacy)

    モダンPerlの世界へようこそ#43がXslateの話だと思ったらノイズ呼ばわりされたでござる、の巻。 著者であるid:charsbarさんの捕捉によれば以下のとおり モダンPerl連載第43回 - Charsbar::Note 「TTの代用品としての」Template::AlloyとText::Xslateについて簡単にまとめてみました。 ということですが、Catalystをビジネスに使うチームこそがPerlのスタンダードであり「周辺」はスタンダードを重んじるべきという論調には違和感を覚えました。 独自プロジェクトではなく家の改善にリソースを貸すべきという批判はたしかにMouseについては当てはまるのかもしれませんが、XslateはTemplate-Toolkitを代表とする既存のプロジェクトとは全く関係ない文脈で開始したプロジェクトです。TTプロジェクトに関わるという選択肢は考えもし

    Re: モダンPerl連載第43回 - Islands in the byte stream (legacy)
    hitode909
    hitode909 2011/07/24
  • 常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream (legacy)

    TwitterのTLで知ったのだが、少し前に海外掲示板で"sleep sort"というソートアルゴリズムが発明され、公開されたようだ。このアルゴリズムが面白かったので紹介してみる。 Genius sorting algorithm: Sleep sort 1 Name: Anonymous : 2011-01-20 12:22 諸君!オレは天才かもしれない。このソートアルゴリズムをみてくれ。こいつをどう思う? #!/bin/bash function f() { sleep "$1" echo "$1" } while [ -n "$1" ] do f "$1" & shift done wait example usage: ./sleepsort.bash 5 3 6 3 6 3 1 4 7 2 Name: Anonymous : 2011-01-20 12:27 >>1 なん…だと

    常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream (legacy)
    hitode909
    hitode909 2011/05/20
    すごい
  • Don't use base.pm, use parent.pm instead! - Islands in the byte stream (legacy)

    「使っちゃいけない標準モジュール」*1の反響を見ていると、baseが非奨励ということに驚かれた方が少なくありませんでした。そこで、baseについて補足します。 まずbase.pmのドキュメントの最初の文は以下のようになっています。 Unless you are using the fields pragma, consider this module discouraged in favor of the lighter-weight parent. (拙訳: fieldsプラグマを使用しているのでないかぎり、このモジュールは勧められない。かわりに軽量なparent.pmを使う方がよい。) fieldsプラグマは、ハッシュリファレンスのキーを固定したオブジェクトを作成するための機能ですが、あまり一般的ではないためここでは解説しません。特に理由がない限り、ここは素直に忠告に従った方がいいでし

    Don't use base.pm, use parent.pm instead! - Islands in the byte stream (legacy)
    hitode909
    hitode909 2011/05/04
  • Parallel module testing in Perl - Islands in the byte stream

    Twitterにて: たしかあったはず*1と思って探してみると*2、Test::Harness にHARNESS_OPTIONSというオプションがありました。以下のようにすると並列でテストで時間を大幅に短縮できます。 $ HARNESS_OPTIONS=j2 make test 実際、Xslateでこれを試してみるとテストの時間が2/3程度になりました*3。これはかなり効果があると考えていいでしょう。 ただし、モジュールが並列実行に対応してないケースがありえるので、すべてのケースで利用出来るわけではありません。すなわち、これはモジュールの作者が指定するのが望ましいオプションだと言えます。そして、Module::Install::TestTarget があればそれが簡単にできるのです。 # Makefile.PL # ... default_test_target env => { HARN

    Parallel module testing in Perl - Islands in the byte stream
    hitode909
    hitode909 2011/03/19
    気になる
  • Test::LeakTraceのnot_leaked() - Islands in the byte stream (legacy)

    Test::LeakTrace 0.02でnot_leaked()がそこそこまともに動くようになった。与えられるブロックを一度実行した後にトレースするようにしたので,内部でキャッシュを使うシステムを考慮したうえで検証してくれる。 たとえばClass::Monadic 0.01を用いたコード: #!perl -w use strict; use Test::More tests => 1; use Test::LeakTrace 0.02; use Class::Monadic; # v 0.01 not_leaked{ my $o = bless{}; Class::Monadic->initialize($o); }; このコードを実行するといくつかのメモリリークがあると報告される。実際,ループ内でClass::Monadic->initialize()を実行するとメモリ消費量が増えてゆ

    Test::LeakTraceのnot_leaked() - Islands in the byte stream (legacy)
    hitode909
    hitode909 2011/01/14
  • Test::LeakTraceをCPANにあげた - Islands in the byte stream (legacy)

    Test::LeakTraceというアイデアを形にした。 http://search.cpan.org/dist/Test-LeakTrace/ 使用例: #!perl -w # example/leaked.pl use strict; use Test::LeakTrace; use Data::Dumper; my @refs = leaked_refs{ my %a; my %b; $a{b} = \%b; $b{a} = \%a; }; print Data::Dumper->Dump([\@refs], ['*leaked']); __END__ 結果: @leaked = ( \{ 'a' => { 'b' => ${$leaked[0]} } }, {}, \${$leaked[0]}->{'a'}, {} ); leaked_refs()はリークしている値のリファレンスを

    Test::LeakTraceをCPANにあげた - Islands in the byte stream (legacy)
    hitode909
    hitode909 2011/01/14
  • 2010年を振り返る - Islands in the byte stream (legacy)

    今年を振り返ると、私生活では就活と卒論が忙しかった。開発関係ではMouseとXslateの開発に大きく力を注いだ。来年はいよいよ社会人となる。遅い社会人デビュー*1だが、まあこんなものだろう。今はただ、働き始めるのが楽しみである。 一方反省点としては、まず英語でのコミュニケーションがやや疎かであった。2009年の反省でも同様であったので、来年こそもっと積極的になりたい。次に、あまりネタに走れなかったことが悔やまれる。Acme::Don't 2.0のように、思わずニヤリとするようなネタはそうそう思いつくものではないが、ハッカーが遊び心を失ってはならない。今年はあまり余裕がなかったのも確かなので、来年はもっと余裕を持ちたいものである。 以下、2010年の主な記事を取り上げてみた。振り返ってみると、そこそこブログは書いていたようだ。 File::Spec::MemoizedはPath::Clas

    2010年を振り返る - Islands in the byte stream (legacy)
    hitode909
    hitode909 2010/12/31
  • XSでメモリークを避けるたった一つの方法 - Islands in the byte stream (legacy)

    XSでメモリリークを避ける基原則は、それほど難しくない。すなわち、作ったSV(およびSVファミリ)はすぐsv_2mortal()するのである。mortalなSVはスコープ*1から抜けるときに解放されるため、メモリリークは起こらない。つまり、あるスコープ内で新しく作ったすべてのSVをmortalな状態にしておくということだ。 この原則のもとでコードを書くと、誤ってリファレンスカウントを増やさなかったケースでは警告が頻繁に起きる。しかし、少なくともメモリリークは起こらない*2。メモリリークの検出は難しいので、警告が出るのは福音であろう。 もちろんこれは原則で、メモリリークにまつわることで覚えなければならないことは決して少なくない。 たとえば、XSUBの戻り値をSV*にするとき、sv_2mortal(RETVAL)してはいけない。これはPerlの仕様ではなくxsubppが勝手にsv_2mort

    XSでメモリークを避けるたった一つの方法 - Islands in the byte stream (legacy)
  • 1