2009-01-01から1年間の記事一覧
META.yml*1にdevel_requiresフィールドがあればいいのに,と思った。このフィールドは,開発者にとってのみ必要なモジュールを指定する。ディストリビューションのテストを行っているとよくモジュールが足りなくてテストをスキップすることがある。これは普…
Mooseでコンパイル時にextends()できたらいいのに、と思いエクスポートコマンド化してみた。http://github.com/nothingmuch/moose/tree/topic/extends_export_command package Foo; use Moose; package Bar; use Moose -extends => 'Foo'; package main; use…
(2010/11/22 追記: 5.12ではこの問題は解決され、SEGVはおきなくなっている。) Released CvGVs could cause SEGVの注で「シンボルテーブル GV間にも循環参照があるため同じ問題を抱えるのだが,こちらは真のウィークリファレンスを導入して解決した」と書…
2009年8月4日,心理学類の授業(実習)の一環として,知能検査を検査者として実施した。この業界にいれば知能検査を実施するのはそれほど珍しくもないのだろうが,初体験ということで記録しておく。この実習はとても面白かった。知能検査はIQを測定する心理検…
YAPC::Asia 2009で「XS書きのためのPerl MAGIC 入門」というタイトルで話します。Perl MAGICの概要,XSレベルでの処理の仕方,MAGIC処理のテストの書き方を話す予定です。よろしくお願いします。 YAPC::Asia 2009 - Sep 10-11 in Tokyo, JAPAN XS書きのため…
qr/\Q $foo \E/xmsと書いたら思ったものにマッチせずハマった。 しばらく頭を抱えていたが,コマンドラインで出力を見ると原因が分かった。正規表現のx修飾子は正規表現内の空白を無視するように指示するものだが,\Qのほうはxの有無にかかわらず常に空白も…
Moose/MOPにおいて,メソッド生成に関わるクラスは以下の通り。 Instance オブジェクトインスタンスへのアクセスを抽象化するクラス インスタンスへアクセスするもっとも低水準なAPIを提供 Method メソッド一般を表すベースクラス Method::*(Method::Accesso…
Module::Install::XSUtilを利用するモジュールの例として,既存のモジュールを書きなおしてみた。XS::MRO::Compatは元のDevel::MROで,MRO::CompatをXSから使えるようにするXSモジュールで,XSからの利用を企図したメタXSモジュールである。これはXSUtilのヘ…
Makefile.PLを書くためのビルドユーティリティの一つであるModule::Installは非常に便利だが,XSモジュールのサポートが弱い。 そこで,Module::InstallのプラグインとしてModule::Install::XSUtilを書いてみた。 http://search.cpan.org/dist/Module-Instal…
NYTProfを使うと,inclusive time*1とexclusive time*2を調べることができる。XS化というのはこのexclusive timeを減らすためのものだと言える。実際私は,今までは高速化というとexclusive timeしか見ていなかった。ところが,実際にはexclusive timeが10%…
Devel::Declareのフロントエンドモジュールでは「これはソースフィルタではない」と書いてあったりするので誤解があるようですが,Devel::Declareはソースフィルタです。 たとえば以下のコード: #!perl use strict; use MooseX::Declare; class Foo{ method…
Do not use Devel::Declareの続き反応: http://d.hatena.ne.jp/charsbar/20090713/1247488795 http://d.hatena.ne.jp/tokuhirom/20090713/1247490768私がDevel::Declareを使うべきではないと考える理由は,何かを模しているとか実装が不安定であるとか効率…
モダンPerlの世界へようこそ 第11回でDevel::Declareが取り上げられていました。 このモジュールは確かに「スゴイ」のですが,個人的には使うべきではないと思っています。もちろん,Devel::DeclareのフロントエンドであるMethod::SignaturesやMooseX::Decla…
5.10のメンテナンスリリースである5.10.1のリリースに向けて,RC0が出たようだ。http://www.iabyn.com/tmp/perl-5.10.0-GitLive-maint-5.10-1551-gadd0c32.tar.gzもっとも,まだバージョンは5.10.0のままなので本当にスナップショットに過ぎないようだが。pe…
開発中のモジュールのロード時間を計るベンチマークスクリプト: #!perl -w use strict; use Benchmark qw(:all); my $module = 'Moose'; cmpthese timethese 10 => { released => sub{ system($^X, '-e', "require $module") == 0 or die; }, blead => sub{ …
Multi-threaded perlとSingle-threaded perlの比較に加えて,gcc4とgcc3でも比較してみた。結果はgcc4の方が約1%ほど高速だったが,スレッドの有無ほどの差はないようだ。コンパイルオプションはcc以外は前回と同じ(スレッドはなし): $ gcc34 --version gcc…
Class::MOP::Class->create_anon_class()がメモリリークを起こしていたので修正パッチを書いた。 https://rt.cpan.org/Ticket/Display.html?id=47480 create_anon_class()自体がメモリリークしていたのは以前から知っていたのだが,気が付いたらメモリリーク…
perl5 ithread についての個人的な見解。そして Coro について。(tokuhirom)より ithreads を有効にしてコンパイルするだけで perl インタープリタの速度が低下する[要出典] これをちょうど試そうと思っていたところなのだった。ナイスタイミング。結論から…
型グロブの内部表現であるGVは,そのシンボルで表現されるグローバルなスカラー(SV),配列(AV),ハッシュ(HV),サブルーチン(CV),ファイルハンドル(IO)などのオブジェクトを所有するオブジェクトである。 この「所有」とは,実際にSVへの参照(ポインタ)を持…
XS code template法を使ったアクセサジェネレータをClass::MOPに実装してみた。 #47031 Makes simple readers to install easily 現在(0.86)はアクセサを定義するためにprehashed_keysテーブルをはじめとしてソースコードのさまざまな部分を修正しなければな…
Devel::PPPortに大きなパッチを送り,3.18_01に取り込まれた。ppportはパッチの作り方が特殊なので記録しておく。まず,ppportにはHACKERSというドキュメントがあるので,パッチを書く際には目を通すのが望ましい。さてHACKERSによれば,ppport.hはparts/inc…
HTTP::Engine::Responseと書かなければならいのがなんだか煩わしい。 HTTP::EngineのSYNOPSISより: sub handle_request { my $req = shift; HTTP::Engine::Response->new( body => Dumper($req) ); } これを↓みたいに書きたい。 sub handle_request { my($r…
void context + BEGIN の horror 的ななにかで指名されたので答えるよ。 疑問点をまとめると以下の二点ということでいいですか。 なぜ特殊コードブロックの呼び出しコンテキストは不定とされているのか なぜ特殊コードブロックが実際にはスカラーコンテキス…
js/scheme/perl/ruby/C - この世で最も役に立たない関数をPerlで: #!perl use strict; use warnings; sub pointless{ printf "Turning off myself = 0x%X\n", \&pointless; undef *pointless; }; pointless; pointless; 結果: Turning off myself = 0x8CEA…
Perlの最適化器はかなり頑張ってsort()の最適化を試みている。具体的には,配列をその場で直接ソートする場合,数値または整数でソートする場合,ソートブロックの$aと$bを単純に入れ替えた場合において,最適化された高速なバージョンが使われる。 以下はす…
Data::Aliasが驚異的だ。 use Data::Alias; alias my $a = $x; # $aは$xのエイリアス alias{ my $a = $x; # $aは$xのエイリアス }; alias push @a, $x; # @aに$xのエイリアスをプッシュ このマジックはPL_checkハックによって実現されている。
Perlで変数エイリアスをみることができるコードはいくつかあるが,それらはまず二つに大別できる。 真のエイリアス 疑似エイリアス 真のエイリアスは,別の名前を持つ変数が本当に一つのSVを指しているケースである。Perlの変数はXSからみれば単にSV*型の値…
私はよくPerlスクリプトのベンチマークを記事にするが,ベンチマークスクリプトを書くのもその結果を評価するのも実は非常に難しいことに気付いた。そこでここでは,ベンチマークについての覚書を記しておく。 まず,ベンチマークの結果はある程度恣意的に操…
Lexical::Typesを見て型つきレキシカル宣言の威力を知り,試してみたくなったので一つモジュールを書いてみた。 Scalar::Alias - search.cpan.org この型つきレキシカル宣言はうまく使うといろいろ面白いことができそうだ。しかもオーバーヘッドがコンパイル…
Sub::Attributeを実際に使ってみる一例としてMethod::Cumulativeというモジュールを書いた。Damian Conway氏のClass::Stdにある:CUMULATIVEと同じ累積メソッドを作るためのアトリビュートを提供する。 なお,Class::Stdではさまざまなアトリビュートを提供し…