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

For co-developers, I wish "devel_requires" fields in META.yml

META.yml*1にdevel_requiresフィールドがあればいいのに,と思った。このフィールドは,開発者にとってのみ必要なモジュールを指定する。ディストリビューションのテストを行っているとよくモジュールが足りなくてテストをスキップすることがある。これは普…

use Moose -extends => [@superclass];

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…

Released stashes could cause SEGV

(2010/11/22 追記: 5.12ではこの問題は解決され、SEGVはおきなくなっている。) Released CvGVs could cause SEGVの注で「シンボルテーブル GV間にも循環参照があるため同じ問題を抱えるのだが,こちらは真のウィークリファレンスを導入して解決した」と書…

[Psychology]知能検査を実施した

2009年8月4日,心理学類の授業(実習)の一環として,知能検査を検査者として実施した。この業界にいれば知能検査を実施するのはそれほど珍しくもないのだろうが,初体験ということで記録しておく。この実習はとても面白かった。知能検査はIQを測定する心理検…

YAPC::Asia 2009でPerl MAGICについて話します

YAPC::Asia 2009で「XS書きのためのPerl MAGIC 入門」というタイトルで話します。Perl MAGICの概要,XSレベルでの処理の仕方,MAGIC処理のテストの書き方を話す予定です。よろしくお願いします。 YAPC::Asia 2009 - Sep 10-11 in Tokyo, JAPAN XS書きのため…

A trap with qr/\Q ... \E/xms

qr/\Q $foo \E/xmsと書いたら思ったものにマッチせずハマった。 しばらく頭を抱えていたが,コマンドラインで出力を見ると原因が分かった。正規表現のx修飾子は正規表現内の空白を無視するように指示するものだが,\Qのほうはxの有無にかかわらず常に空白も…

A note about the method generator mechanism on Moose

Moose/MOPにおいて,メソッド生成に関わるクラスは以下の通り。 Instance オブジェクトインスタンスへのアクセスを抽象化するクラス インスタンスへアクセスするもっとも低水準なAPIを提供 Method メソッド一般を表すベースクラス Method::*(Method::Accesso…

Examples for Module::Install::XSUtil

Module::Install::XSUtilを利用するモジュールの例として,既存のモジュールを書きなおしてみた。XS::MRO::Compatは元のDevel::MROで,MRO::CompatをXSから使えるようにするXSモジュールで,XSからの利用を企図したメタXSモジュールである。これはXSUtilのヘ…

Module::Install::XSUtil - Manages XS modules

Makefile.PLを書くためのビルドユーティリティの一つであるModule::Installは非常に便利だが,XSモジュールのサポートが弱い。 そこで,Module::InstallのプラグインとしてModule::Install::XSUtilを書いてみた。 http://search.cpan.org/dist/Module-Instal…

About optimazation: inclusive time and exclusive time

NYTProfを使うと,inclusive time*1とexclusive time*2を調べることができる。XS化というのはこのexclusive timeを減らすためのものだと言える。実際私は,今までは高速化というとexclusive timeしか見ていなかった。ところが,実際にはexclusive timeが10%…

Devel::Declare is a source filter

Devel::Declareのフロントエンドモジュールでは「これはソースフィルタではない」と書いてあったりするので誤解があるようですが,Devel::Declareはソースフィルタです。 たとえば以下のコード: #!perl use strict; use MooseX::Declare; class Foo{ method…

Thinking about source filters

Do not use Devel::Declareの続き反応: http://d.hatena.ne.jp/charsbar/20090713/1247488795 http://d.hatena.ne.jp/tokuhirom/20090713/1247490768私がDevel::Declareを使うべきではないと考える理由は,何かを模しているとか実装が不安定であるとか効率…

Do not use Devel::Declare, a magical source filter.

モダンPerlの世界へようこそ 第11回でDevel::Declareが取り上げられていました。 このモジュールは確かに「スゴイ」のですが,個人的には使うべきではないと思っています。もちろん,Devel::DeclareのフロントエンドであるMethod::SignaturesやMooseX::Decla…

Perl 5.10.1 RC0 (but not formal release)

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…

Time loading modules, compareing the blead with the released

開発中のモジュールのロード時間を計るベンチマークスクリプト: #!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{ …

Which are faster, perls in gcc4 or perls in gcc3?

Multi-threaded perlとSingle-threaded perlの比較に加えて,gcc4とgcc3でも比較してみた。結果はgcc4の方が約1%ほど高速だったが,スレッドの有無ほどの差はないようだ。コンパイルオプションはcc以外は前回と同じ(スレッドはなし): $ gcc34 --version gcc…

Fixed memory leaks in Class::MOP

Class::MOP::Class->create_anon_class()がメモリリークを起こしていたので修正パッチを書いた。 https://rt.cpan.org/Ticket/Display.html?id=47480 create_anon_class()自体がメモリリークしていたのは以前から知っていたのだが,気が付いたらメモリリーク…

Multi-threaded perl vs. Single-threaded perl

perl5 ithread についての個人的な見解。そして Coro について。(tokuhirom)より ithreads を有効にしてコンパイルするだけで perl インタープリタの速度が低下する[要出典] これをちょうど試そうと思っていたところなのだった。ナイスタイミング。結論から…

Released CvGVs could cause SEGV

型グロブの内部表現であるGVは,そのシンボルで表現されるグローバルなスカラー(SV),配列(AV),ハッシュ(HV),サブルーチン(CV),ファイルハンドル(IO)などのオブジェクトを所有するオブジェクトである。 この「所有」とは,実際にSVへの参照(ポインタ)を持…

Using XS code template for Class::MOP

XS code template法を使ったアクセサジェネレータをClass::MOPに実装してみた。 #47031 Makes simple readers to install easily 現在(0.86)はアクセサを定義するためにprehashed_keysテーブルをはじめとしてソースコードのさまざまな部分を修正しなければな…

A note about Devel::PPPort 3.18_01

Devel::PPPortに大きなパッチを送り,3.18_01に取り込まれた。ppportはパッチの作り方が特殊なので記録しておく。まず,ppportにはHACKERSというドキュメントがあるので,パッチを書く際には目を通すのが望ましい。さてHACKERSによれば,ppport.hはparts/inc…

Don't write "HTTP::Engine::Response"

HTTP::Engine::Responseと書かなければならいのがなんだか煩わしい。 HTTP::EngineのSYNOPSISより: sub handle_request { my $req = shift; HTTP::Engine::Response->new( body => Dumper($req) ); } これを↓みたいに書きたい。 sub handle_request { my($r…

The history of wantarray()

void context + BEGIN の horror 的ななにかで指名されたので答えるよ。 疑問点をまとめると以下の二点ということでいいですか。 なぜ特殊コードブロックの呼び出しコンテキストは不定とされているのか なぜ特殊コードブロックが実際にはスカラーコンテキス…

pointless() in Perl

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…

Optimization of sort()

Perlの最適化器はかなり頑張ってsort()の最適化を試みている。具体的には,配列をその場で直接ソートする場合,数値または整数でソートする場合,ソートブロックの$aと$bを単純に入れ替えた場合において,最適化された高速なバージョンが使われる。 以下はす…

Data::Alias is fascinating!

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ハックによって実現されている。

Variable aliases in Perl

Perlで変数エイリアスをみることができるコードはいくつかあるが,それらはまず二つに大別できる。 真のエイリアス 疑似エイリアス 真のエイリアスは,別の名前を持つ変数が本当に一つのSVを指しているケースである。Perlの変数はXSからみれば単にSV*型の値…

Arbitrary controls of benchmarks

私はよくPerlスクリプトのベンチマークを記事にするが,ベンチマークスクリプトを書くのもその結果を評価するのも実は非常に難しいことに気付いた。そこでここでは,ベンチマークについての覚書を記しておく。 まず,ベンチマークの結果はある程度恣意的に操…

Yet another alias module: Scalar::Alias

Lexical::Typesを見て型つきレキシカル宣言の威力を知り,試してみたくなったので一つモジュールを書いてみた。 Scalar::Alias - search.cpan.org この型つきレキシカル宣言はうまく使うといろいろ面白いことができそうだ。しかもオーバーヘッドがコンパイル…

Cumulative methods using Sub::Attribute

Sub::Attributeを実際に使ってみる一例としてMethod::Cumulativeというモジュールを書いた。Damian Conway氏のClass::Stdにある:CUMULATIVEと同じ累積メソッドを作るためのアトリビュートを提供する。 なお,Class::Stdではさまざまなアトリビュートを提供し…