Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-05-03

複数のroleを満たしていることのチェック.

複数のroleを満たしていることのチェック. - dann@catalyst を含むブックマーク はてなブックマーク - 複数のroleを満たしていることのチェック. - dann@catalyst 複数のroleを満たしていることのチェック. - dann@catalyst のブックマークコメント

以下のような感じ.

my $type = type where { $_->does('Foo::Bar') && $_->does('Baz::Quux') && ... };

isa => $type

教えてもらった。もう少し上手く英語でかけると、正確に意図を伝えられるんだけどな。地道に。

perl programming with vim

perl programming with vim - dann@catalyst を含むブックマーク はてなブックマーク - perl programming with vim - dann@catalyst perl programming with vim - dann@catalyst のブックマークコメント

よく使ってるのは、prove, perltidy, ファイル保存時のsyntax check(with perl-support)かなぁ。

書くときは、autocomplpop+ctags。これないとvimで書くのはしんどい。ファイル移動は、fuzzyfinder。

perlのftpluginは以下のような感じ.

http://github.com/dann/dotfiles/tree/master/.vim/ftplugin/perl.vim

" auto syntax check with Perl support
au BufWritePost * call Perl_SyntaxCheck() | call Perl_SyntaxCheckMsg() | redraw!

" prove
noremap ,t <Esc>:!prv -lv t/%<CR>
noremap ,T <Esc>:!prv -lv t/% \| less <CR>
 
" perltidy
noremap ,pt <Esc>:%! perltidy -pbp<CR>
noremap ,ptv <Esc>:'<,'>! perltidy -pbp<CR>

Moose使うとコンパイルが遅いのかファイル保存時のsyntax checkを使うのは少しきつい。けど、コンパイルに失敗すると,ptでperltidyするときに困るから、どうしたもんかねと。

vimにもflymakeがあるといいなぁ. sav時にチェックってことがナンセンスな気がする。もっと、早い段階でチェックしたいんだなぁ。syntax checkと整形は人間がやるんじゃなくてツール側で勝手にやってほしいなぁと。

EclipseでやってるときはIDE側でリアルタイムでsyntax checkやって、SaveOnFormatプラグインでsav時に自動で整形ルールに従って整形されるから、人がそれらの作業をする必要がなくて、あれくらい楽になるといいんだけどなぁと。

あまりvim+perlな人をみないんだけれど、便利なtipsがあったら教えてほしい!emacs+perlな人はよくみるんだけれど。

# flymake, yasnippet, anything をvimにも!

Moose勉強するのに役立ったもの

Moose勉強するのに役立ったもの - dann@catalyst を含むブックマーク はてなブックマーク - Moose勉強するのに役立ったもの - dann@catalyst Moose勉強するのに役立ったもの - dann@catalyst のブックマークコメント

この3つにMooseの使い方のエッセンスがつまっている気がした。

は殆ど同じ機能範囲で使ってる。

Devel::REPLのPluginとしてのRoleの使い方は少し特徴があるし面白い。Catalystの次期版のPlugin機構もおそらく似た形になる。

Reactionはキーワード作るところとType定義してるところが少し違う。

ReactionのMoose(+X)の使い方はもう少し勉強できるところがあるかも。

moose版Catalyst

moose版Catalyst - dann@catalyst を含むブックマーク はてなブックマーク - moose版Catalyst - dann@catalyst moose版Catalyst - dann@catalyst のブックマークコメント

http://dev.catalyst.perl.org/repos/Catalyst/Catalyst-Runtime/5.80/branches/moose/

runtimeの実行速度を高めるためにmake_immutableをしてるっていうのがわかる。さっきのベンチ結果とも一致してるなぁ。mod_perlとかで使うときには、これでClass::Accessor::Fastとも大差ないから、気にしなくてもいいかもね

プラグインはRoleになるってことで、Devel::REPL形式になりそうだなぁ

Mooseのパフォーマンス測定 Class::Accessor::Fast vs Moose

Mooseのパフォーマンス測定 Class::Accessor::Fast vs Moose - dann@catalyst を含むブックマーク はてなブックマーク - Mooseのパフォーマンス測定 Class::Accessor::Fast vs Moose - dann@catalyst Mooseのパフォーマンス測定 Class::Accessor::Fast vs Moose - dann@catalyst のブックマークコメント

http://code2.0beta.co.uk/moose/svn/Moose/trunk/benchmarks/caf_vs_moose.pl

  • setterは実行回数たりねーと怒られた.
  • getterは大差なし
  • インスタンス生成は、かなり差がある。最大100倍くらい遅い
  • Destructionもかなり差がある

現状だとインスタンス作る場合には、mata->make_immutableしておいたほうがいいってこと。CGIで使うには無理がありそうだけど、そうじゃなきゃいけそうだなぁと。

DIコンテナでScopeSingletonにしといて、startupタイミングでインスタンス作っとけば、実用上は問題ないかな。

hasとかで委譲したときに、どうなるかとかは測っておいたほうがいいかも。

SETTING
Benchmark: timing 100000 iterations of ClassAccessorFast, Moose, MooseImmutable, MooseImmutableNoConstructor...
ClassAccessorFast: 0.102277 wallclock secs ( 0.11 usr +  0.00 sys =  0.11 CPU) @ 909090.91/s (n=100000)
            (warning: too few iterations for a reliable count)
     Moose: 0.109756 wallclock secs ( 0.11 usr +  0.00 sys =  0.11 CPU) @ 909090.91/s (n=100000)
            (warning: too few iterations for a reliable count)
MooseImmutable: 0.110045 wallclock secs ( 0.11 usr +  0.00 sys =  0.11 CPU) @ 909090.91/s (n=100000)
            (warning: too few iterations for a reliable count)
MooseImmutableNoConstructor: 0.108017 wallclock secs ( 0.11 usr +  0.00 sys =  0.11 CPU) @ 909090.91/s (n=100000)
            (warning: too few iterations for a reliable count)
                                Rate MooseImmutableNoConstructor MooseImmutable Moose ClassAccessorFast
MooseImmutableNoConstructor 909091/s                          --             0%    0%               -0%
MooseImmutable              909091/s                          0%             --    0%               -0%
Moose                       909091/s                          0%             0%    --               -0%
ClassAccessorFast           909091/s                          0%             0%    0%                --

GETTING
Benchmark: timing 100000 iterations of ClassAccessorFast, Moose, MooseImmutable, MooseImmutableNoConstructor...
ClassAccessorFast: 0.0776682 wallclock secs ( 0.08 usr +  0.00 sys =  0.08 CPU) @ 1250000.00/s (n=100000)
            (warning: too few iterations for a reliable count)
     Moose: 0.0701921 wallclock secs ( 0.07 usr +  0.00 sys =  0.07 CPU) @ 1428571.43/s (n=100000)
            (warning: too few iterations for a reliable count)
MooseImmutable: 0.0723972 wallclock secs ( 0.08 usr +  0.00 sys =  0.08 CPU) @ 1250000.00/s (n=100000)
            (warning: too few iterations for a reliable count)
MooseImmutableNoConstructor: 0.0714548 wallclock secs ( 0.08 usr +  0.00 sys =  0.08 CPU) @ 1250000.00/s (n=100000)
            (warning: too few iterations for a reliable count)
                                 Rate MooseImmutable MooseImmutableNoConstructor ClassAccessorFast Moose
MooseImmutable              1250000/s             --                         -0%               -0%  -13%
MooseImmutableNoConstructor 1250000/s             0%                          --                0%  -12%
ClassAccessorFast           1250000/s             0%                          0%                --  -12%
Moose                       1428571/s            14%                         14%               14%    --

CREATION
Benchmark: timing 100000 iterations of ClassAccessorFast, Moose, MooseImmutable, MooseImmutableNoConstructor...
ClassAccessorFast: 0.455661 wallclock secs ( 0.46 usr +  0.00 sys =  0.46 CPU) @ 217391.30/s (n=100000)
     Moose: 50.7327 wallclock secs (50.71 usr +  0.03 sys = 50.74 CPU) @ 1970.83/s (n=100000)
MooseImmutable: 0.509074 wallclock secs ( 0.52 usr +  0.00 sys =  0.52 CPU) @ 192307.69/s (n=100000)
MooseImmutableNoConstructor: 7.42216 wallclock secs ( 7.41 usr +  0.01 sys =  7.42 CPU) @ 13477.09/s (n=100000)
                                Rate  Moose MooseImmutableNoConstructor MooseImmutable ClassAccessorFast
Moose                         1971/s     --                        -85%           -99%              -99%
MooseImmutableNoConstructor  13477/s   584%                          --           -93%              -94%
MooseImmutable              192308/s  9658%                       1327%             --              -12%
ClassAccessorFast           217391/s 10930%                       1513%            13%                --

DESTRUCTION
Benchmark: timing 100000 iterations of ClassAccessorFast, Moose, MooseImmutable, MooseImmutableNoConstructor...
ClassAccessorFast: 0.0550349 wallclock secs ( 0.04 usr +  0.00 sys =  0.04 CPU) @ 2500000.00/s (n=100000)
            (warning: too few iterations for a reliable count)
     Moose: 0.299493 wallclock secs ( 0.30 usr +  0.00 sys =  0.30 CPU) @ 333333.33/s (n=100000)
            (warning: too few iterations for a reliable count)
MooseImmutable: 0.149003 wallclock secs ( 0.16 usr +  0.00 sys =  0.16 CPU) @ 625000.00/s (n=100000)
            (warning: too few iterations for a reliable count)
MooseImmutableNoConstructor: 0.142484 wallclock secs ( 0.14 usr +  0.00 sys =  0.14 CPU) @ 714285.71/s (n=100000)
            (warning: too few iterations for a reliable count)
                                 Rate Moose MooseImmutable MooseImmutableNoConstructor ClassAccessorFast
Moose                        333333/s    --           -47%                        -53%              -87%
MooseImmutable               625000/s   87%             --                        -13%              -75%
MooseImmutableNoConstructor  714286/s  114%            14%                          --              -71%
ClassAccessorFast           2500000/s  650%           300%                        250%                --

MooseX::App::Cmd

MooseX::App::Cmd - dann@catalyst を含むブックマーク はてなブックマーク - MooseX::App::Cmd - dann@catalyst MooseX::App::Cmd - dann@catalyst のブックマークコメント

http://search.cpan.org/~nuffin/MooseX-App-Cmd/lib/MooseX/App/Cmd.pm

MooseX::Getopt + App::Cmd。これは明示的にオプションが書けていいなぁ。

opt_specの実装をするんじゃなくて、以下のように明示的にオプション設定を書く。

    has blortex => (
        isa => "Bool",
        is  => "rw",
        cmd_aliases   => "X",
        documentation => "use the blortext algorithm",
    );

これから分かることは、契約を明示したほうがわかりやすいものと組み合わせるのは、綺麗にかける可能性があって、そこにはDSL的な設定があうかもしれないってことかなぁ。

早速CLI用のベースクラスをこれに変えてみよう。

# ちょっと思ったのは、Validation系とMooseの組み合わせは結構相性がいいやもしれないなぁということ。

hasのrequired

|  hasのrequired - dann@catalyst を含むブックマーク はてなブックマーク -  hasのrequired - dann@catalyst  hasのrequired - dann@catalyst のブックマークコメント

これも仕様を明記するという点でいいなと思う。そのインスタンス変数が必須なのかオプショナルなのかっていうのが見れば分かる。

required => (1│0)

This marks the attribute as being required. This means a

defined value must be supplied during class construction, and

the attribute may never be set to "undef" with an accessor.

後はBread::BoardでDIするときにもいいかなぁと。このインスタンス変数にDIしわすれたとかいうのを防ぐことができる。

buildじゃなくてhasの+で上書き

|  buildじゃなくてhasの+で上書き - dann@catalyst を含むブックマーク はてなブックマーク -  buildじゃなくてhasの+で上書き - dann@catalyst  buildじゃなくてhasの+で上書き - dann@catalyst のブックマークコメント

hasの+でsubclassでdefaultを上書きできる。ってことで、実はbuildなくても殆どのケース困らない気がしてしまった。buildがどうしても必要になるケースってあんのかな。

メリットがあるとすれば、明示的にbuildだけを上書きすればいいっていうのがわかるってことくらいなのかなぁ。

             package Foo;
             use Moose;

             has ’message’ => (
                 is      => ’rw’,
                 isa     => ’Str’,
                 default => ’Hello, I am a Foo’
             );

             package My::Foo;
             use Moose;

             extends ’Foo’;

             has ’+message’ => (default => ’Hello I am My::Foo’);

ka-nachtka-nacht 2008/05/04 23:11 ftpluginにしているならば:autocmdのパターンは*でなく<buffer>を指定し、各種:mapには<buffer>を指定すべきです。
今の記述では'filetype'がperlなバッファを開かれた際に各種設定が全バッファに対して有効になります。特に:autocmdは'filetype'がperlなバッファを開くたびに同じものが追加されていくのでバッファの保存時に同じ動作が複数回行われることになります。

danndann 2008/05/05 02:29 おぉ、ありがとうございます。

SevenSeven 2011/12/30 11:35 Good to see real expertise on dipslay. Your contribution is most welcome.

lnuadjvlnuadjv 2011/12/30 19:29 8VZuNg <a href="http://xdgfwxgfsesx.com/">xdgfwxgfsesx</a>

atabaoatabao 2011/12/31 22:27 AejGt0 , [url=http://jzqszuxdfpva.com/]jzqszuxdfpva[/url], [link=http://qadlawxatmqq.com/]qadlawxatmqq[/link], http://udyntwmlzejv.com/

iumuxzhfiumuxzhf 2012/01/02 02:59 NXCef8 , [url=http://bqzxitpxnvhn.com/]bqzxitpxnvhn[/url], [link=http://khtunmodqxym.com/]khtunmodqxym[/link], http://iovvsttbnacz.com/

ゲスト