2009-01-01から1ヶ月間の記事一覧

XS code template

perl-users.jpにXS code templateという記事を書きました。

モジュールをロードする方法がありすぎる

Module::LoadやらUNIVERSAL::requireやら,モジュールをロードする方法がありすぎる。純粋にロードするだけではないモジュールまで含めるとClass::Inspector,Class::C3::Componentised,Class::MOP,base.pm,parent.pmなどなど,数え切れないほどある。 も…

make_immutable()の考え方はすばらしい

MooseやMouseの__PACKAGE__->meta->make_immutable()はそのクラスのメソッドをコンパイルして高速化する機能なのだが,この時点でメソッドやアクセサをXSに置き換えるということにすれば,MooseにせよMouseにせよ,現在のShika.xsよりもずっと高速にできる気…

Re: XSの勉強を始めるためのエントリーポイントは?

Re: XSの勉強を始めるためのエントリーポイントは?あまり参考にならないかもしれませんが,私がXSを勉強するにあたっては,CPANのモジュールのソースコードを読むより実際に書いてみるのが一番だと思います。ただし,何か特定の目的があって,そのために関…

strict無効化の誤謬

シンボルテーブルを操作するときに"no strict 'refs'"で一時的にstrictを無効化することはよくあるが,デバッグしにくいバグが紛れ込む可能性がある。 たとえば,以下のようにアクセサを動的に生成するコードはCPANのそこかしこにある。 sub make_accessor{ …

テストのないモジュールに手を加えるのは大変だ

Class::MOPはわりとテストがしっかりしているので,拡張作業はわりと容易だった。一通りコードを書いたらmake testして,テストに失敗した項目があればそれを見て,という一連の作業をすればいいだけ。自分でモジュールを書くときはテストを書くのがまた大変…

CPANモジュールの速度改善(作業メモ)

たまっていたパッチをいくつかRTに送りつけたのでメモしておく。 Class::Method::Modifiers Data::Utilを使うようにした 採用されれば,beforeとafterが劇的に高速になる Class::MOPのMethod::Wrapped (method modifiers) Data::Utilを使うようにした 採用さ…

Tsukuba.R#4

R

2009/3/1 Tsukuba.R#4 R言語の勉強会らしい。3/1までに話すネタを思いついたら行こう。

先の記事のList::Utils::firstの使い方は間違っている!

先の記事の「List::Util::firstは遅い」でのfirst{expr}の使い方が間違っていました orz first{expr}は+(grep{expr} ...)[0]に等しく,ブールコンテキストでのscalar(grep{expr}...)に等しいのはList::MoreUtils::any{expr}です。ただしパフォーマンスについ…

List::Util::firstは遅い

(追記:この用途ではList::Util::firstを使うのは誤りで,List::MoreUtils::anyが意図されたコードです。効率についての結論は変わりません)List::Util::first{expr}は組み込みのgrep{expr}に似ているが,exprが最初に真になった段階でその値を返すので,gre…

DBD::SQLiteに新たなco-maintainerが名乗りでる

DBD::SQLiteのメンテナに名乗りでようかなと思った矢先*1,Darren Duncan氏がco-maintainerに名乗りをあげたようだ。これでDBD::SQLiteの諸問題も解決するといいな。 *1:実際,その記事を書いた数分後に

DBD::SQLiteの問題点を考える

本家DBD::SQLite*1 1.14は2007年9月リリースでSQLite*2のバージョンは3.4.2。 DBD::SQLite::Amalgamation(DBD::SQLite 1.14ベース)は2008年8月リリースで,SQLiteのバージョンは3.6.1。 SQLiteの最新バージョンは2009年1月リリースの3.6.8。問題は,DBD::SQL…

DBIx::Classのmany_to_manyは冗長だ

package MySchema::Actor; # ... __PACKAGE__->has_many(role_actor => 'MySchema::RoleActor'); __PACKAGE__->many_to_many(roles => role_actor => 'role_id'); # ... many_to_many()は必ずhas_many()を伴うし,中間テーブルへのアクセサはユーザーレベル…

DBIx::Classのmany_to_manyが難しい

珍しくアプリケーションを作る必要に迫られて,DBIx::Classをいじっているわけだが…難しい。DBIx::Classは多くのモジュールに機能が分割されているので全体像も把握しにくいし。これはまいった。

MooseのTypeConstraintsのインターフェイスがよくない

Moose::Util::TypeConstraintsのSYNOPSISより: use Moose::Util::TypeConstraints; type 'Num' => where { Scalar::Util::looks_like_number($_) }; subtype 'Natural' => as 'Int' => where { $_ > 0 }; subtype 'NaturalLessThanTen' => as 'Natural' => …