2008年5月アーカイブ

猫も杓子もMacな世の中で、未だに2004年に発売されたVAIO T90PSを使い続けています。
別に不満はなかったのですが、最近ハードディスクが変な音を出すようになってまずいなーとか思ってました。
んで、重い腰を上げてハードディスクの換装に乗り出したのですが、こいつにくっついてるのは巷で出回ってる2.5インチではなく、iPodとかで使われている1.8インチという事実上東芝しか作っていない特殊なやつ。
しかも、コネクタが現行のものは使えず、最大容量でMK8007GAHという80GBの物を最後にモデルが生産終了になってるんですね。
しかもこいつが高い。このご時勢で80GBで2万円前後。
とはいえ、生産終了ってことは在庫にあるものがはけたら入手困難必至になり、新しくノートを買う羽目になるので、背に腹は変えられんってことで購入したわけです。

VAIO HDD換装

とにかくちっちゃい。

で、本体ばらして乗せ換え。

VAIO HDD換装

途中、部品が余ったりして冷や汗でましたが、なんとなく完了。

んで、容量増えて密度が上がったので多少はパフォーマンス上がるかなと、とりあえずWinXP入れてみたら、何となく体感でわかる程度に上がった気がします。
少なくとも異音がしなくなったので快適。

っつーわけで、容量増えて20GBくらいWindowsに割けるようになったのでPCDJでも始めようかなとか思ってます。

正しい読み方 - Hatena::Diary::Neko::kak 500 Internal Server Error

nekokakの読み方についてなんか本人の居ないところで色々言われているようです。

人事ではない話題><

僕の場合、本人を目の前にして色々言われているわけです。
まーここのドメイン名から推察するとhide-kってことは「ひでき」ではないわけですよ。
で、ややこしいのがWebサービスによってはハイフンなんかがアカウントとして取れないことがままあり、そんな時はhidekにしてるので、そーすっと「ひでき」と読むのが普通らしいわけですね。

種明かし(ってほどのものではないんだけど)hide部が名前でk部が苗字なわけです。
超安直。
もともとの由来はDJネームからなんですけど、まー字面にすると誤解を招きまくるわけです。

ま、全くこだわりはないので
「ひで」
「ひでけー」
「ひでき」
好きなように呼んでもいいし、相手が不快にならない程度にフュージョンも自由です。

でも、似たようなハンドル名構成なのに座敷の置くから大声で「ひでけーだかひできだかわからないけど、とりあえずこっちこいや」的なことを言っておきながら「どちらさんでしたっけ?」ってのはやめてね。

泣くよ?

結論から言うと
「ハンドル名を決める時は計画的に」

Perl-users.jp - 日本のPerlユーザのためのハブサイト

以前より Shibuya.pm 界隈では、初心者や複雑な Perl の話題をキャッチアップ出来ない Perl 利用者をどうすくい上げるか、という議論を盛んに行っておりました。
Schwern の言う通り Perl で検索してもなかなかいい情報にたどり着けなかったりと、それは酷い現状をどうにかしたいという思いは YAPC::Asia 2008 のスピーカー陣に共通するものであると思っています。

Yappo++

前のエントリーでも紹介したSchwernのPerl Is unDeadに対するYappoスタンダードの答えがこれ。すばらしい。

前々からmiyagawaさんを初めとする最前線を張っている人たちと、レンタルサーバーで掲示板をインストールするのに四苦八苦してる人たちの間の隔たりがすごいなーとか思ってたので、その辺を埋めてくれるサイトに成長してくれたらいいなーって思います。

後は飽きずに継続させることが重要だなーって思うわけです。

っつーか、何か知らんけどコアメンバー候補に挙がってるので僕も何かしらアクションを起こさないとね。
人選の基準が「オヤジ」って気がするのは被害妄想ってことにしておこう。

品質保証だとか、リファクタリング時の精神安定剤だとか言われてるテストですが、実はもう一つ重要な使い道があります。

それは実践的なドキュメントとしてです。

まぁ、もともとTDD(テスト駆動開発)なんかだと仕様の代わりとして扱われるのだから、当たり前って言えば当たり前なんですけどね。

CPANモジュールには大体POD(Perl Old Document)が付いててSYNOPSIS(使い方)が最初のほうにドンと書いてあるのですが、大雑把過ぎたり機能のごく一部だけだったりでちょっと物足りないという貴兄や、英語で長々と説明されるよりも実際の使われ方見たほうが早いっていう貴兄にはテストを眺めるのがもってこいです。

Perlモジュールのテストを見るにはアーカイブを展開してt/以下をのぞいてみてください。まともなモジュールなら山ほどテストが見つかるはずです。運がよければ探してる機能が見つかるはず。

実際のテストを見るには、アーカイブを持ってきて展開して見るのもいいけど、cpanシェルならもっと簡単にできます。

[hide@localhost hide]# cpan
...
cpan[1]> look Moose
...
[hide@localhost Moose-0.44-4RfUBu]#

こんな感じでパッケージが展開されたビルドディレクトリに入れるので後はt/以下を探検するといいと思います。

ちなみにMooseでは
t/000_recipes
t/200_examples
など見ると初歩的な使い方がたくさん載ってていいと思いますョ。

YAPCでのMichael Schwernのトーク、"perl is unded"を聞いて、Perlは確かに死んじゃいないけど新しい人材は必要だよねって思ったわけです。
で、今年のYAPCには会社の若い子たちを誘って行ったんだけど、口を揃えて言うのが難しい上にさらに英語だからたまらんと。
気持ちは分からんでもないんですよ。僕もあまり得意な方じゃないし。

で、未熟な僕でも何かできないかなーと思ったのがpod(マニュアルね)の翻訳。
しかもMooseなら、敬遠されがちなPerlのややこしいオブジェクト指向プログラミングを分かりやすく書けるので、他の言語の人にも受け入れられやすいかなーと。
まぁ単に今はやりだってだけだけどね(Yapooさん曰く来年にはないらしいけど)。

で、やったもん勝ちってことで、つたない翻訳だけどとっとと始めちゃいました。
とりあえず、日本人が多いってことでcodereposに上げてます。


http://coderepos.org/share/browser/docs/moose-ja

本家の方には話を通してあって、近いうちに本家のtrunkにも放り込んでいくのでじゃんじゃん添削・追記してください。

tokuhiromさんやYappoさんは日本独自でCookbook書いてくれるそうなので、そっちも乞うご期待。

Perlは怖くないよ。楽しいよ。

今年もYAPC::Asiaに参加してきたよ。
今年は前夜祭からHackathonまで猛烈に堪能してきました。
各セッションの感想は山ほど上がってると思うので個人的な感想を書くよ。

YAPC::Asia 2008

YAPC::Asia 2008

去年辺りから積極的に勉強会やカンファレンスで周りに声をかけるようになったせいで、今年は顔見知りも多くなり、また違った空気を楽しめました。

タバコミニケーションではYusukebeさんとオッパイDetect論をしたり、弾さんとSQLをdisったり、飲み会ではオヤジクラスタのZigorouさんやcharsbarさんと新橋的なノリで話したりと本編以外のとこでもかなり楽しませてもらいました。

あと、毎度のこと感動するのがスタッフのホスタビリティ。takesakoさんを初めとするスタッフの方々には足を向けて寝れないっす。本当にありがとうございました。

typesterさんに誘ってもらったHackathonでは酒も一滴も飲まずに12時間くらいひたすらコードを書きまくっててあまり会話には参加できなかったのがちょっと残念。
明け方にMooseでちょっと詰ってnothingmuchに質問したら、あっという間に解決方法を書いてくれて超感動した。おまけにcommitbitまでくれた。っていうかnothingmuchは本当にいいやつ。

YAPC::Asia 2008

来年までの課題はもうちょっとまともに英会話できるようにしておくこと。
来年はネタがあればSpeakerで是非参加してみたいな。

オマケ:
懇親会のクジで当たったモバ指的なナニか。
使い道が良く分からないけどありがとうございます。

YAPC::Asia 2008

AOPが騒がれ始めた辺りでJavaを辞めたので、AOPをよくわかってない。
で、AOPに関する記事を斜め読みしてたら「Separation of Concerns」ってのと「Crosscutting Concern」ってのが出てきたのでMooseでやってみた。

良くありがちな銀行口座クラスをMooseで作ってみる。

package BankAccount;

use Moose;

has 'balance' => (is => 'rw', isa => 'Int', default => 0);

sub deposit {
    my ( $self, $amount ) = @_;
    $self->balance( $self->balance + $amount );
}

sub withdraw {
    my ( $self, $amount ) = @_;
    $self->balance >= $amount
        ? $self->balance( $self->balance - $amount )
        : confess 'account overdrawn';

1;

基本的なMooseによるクラス定義。一応説明しておくと

has 'balance' => (is => 'rw', isa => 'Int', default => 0);

balance(残高)という属性を持っていて$self->balanceがgetter。
$self->balance($amount)がsetter。
型チェックが行われてIntのみ受け付ける。
デフォルトはは0。

メソッドは二つで、depositが入金でwithdrawが出金。
これは普通のPerl OOのメソッドと同じ。

このクラスは普通に

my $account = BankAccount->new;
warn $account->balance;
$account->deposit(10000);
warn $account->balance;

みたいに使えて結果は

0
10000

で、ここに要件として

「depositの後にいくら入金されたかログとして表示しなさい」

ってのが追加されたとする。

普通は

sub deposit {
    my ( $self, $amount ) = @_;
    $self->balance( $self->balance + $amount );

    warn "log: deposited $amount ";
}

とかやるんだけど、これだと
1. 本質的な処理(ここで言うと入金された金額を残高に足す)って処理に本来関係ない処理(いくら入金されたか表示する)が含まれて見通し悪い。
2. 更に、ロギングとかって他にも使い道あるんだからまとめたい。

1.のようにコードの関心事を切り分けることをAOPでは「関心事の分離(Separation of Concerns)」っていう。
2.のようにいくつものクラスにまたがって利用される関心事をAOPでは「横断的な関心事(Crosscutting Concern)」っていう。

これをMooseで実装するにはどうするかというとMoose::Roleを使う。RoleはJavaで言うとこのInterfaceに実装を加えられるようなもの。

package BankAccount::Role::Logable;

use Moose::Role;

requires qw(deposit withdraw);

after 'deposit' => sub {
    my ($self, $amount) = @_;

    warn "log: deposited $amount ";
};

1;
requires qw(deposit withdraw);

は、このRoleを使うにはdepositメソッドととwithdrawメソッドを実装する必要がある、という意味で、
で、

after 'deposit' => sub {...

は、depositメソッドを呼ばれた後に以下のコードを実行するって意味。

で、

package BankAccount;

use Moose;

with 'BankAccount::Role::Logable';

has 'balance' => (is => 'rw', isa => 'Int', default => 0);

sub deposit {
    my ( $self, $amount ) = @_;
    $self->balance( $self->balance + $amount );
}

sub withdraw {
    my ( $self, $amount ) = @_;
    $self->balance >= $amount
        ? $self->balance( $self->balance - $amount )
        : confess 'account overdrawn';

1;

ってする。

with 'BankAccount::Role::Logable';

は、BankAccount::Role::Logableを使うよっていう宣言。Javaで言うとimplementsみたいなもん。これをすることによってRoleで宣言されているメソッドを実装する必要が出てくる。

で、さっきのを実行すると

0
10000
log: deposited 10000

って見事ログが表示されてdepositメソッドを変更することなく要件は満たした。

つまり関心事を分離したことによって本来の関心事(Core Concern)に変更を加えることなく新たな関心事を付け加えることが出来るのでコードが見やすい。

ちなみにafterの他に当然beforeもあって、もう一つaroundってのもある。

「出金の前後にログを表示しなさい」

ってな要件が加わったらBankAccount::Role::Loggableに

around 'withdraw' => sub {
    my ($next, $self, $amount) = @_;

	print "log: before withdraw $amount:\n";
	$next->($amount);
	print "log: after  withdraw $amount: \n";

}

的なことを加えればいい。BankAccountには何も変更なし。

ちょっといい例が思いつかないけど、同じようにBankAccount::Role::Loggableをwithしてdepositとwithdrawを実装したら同じようにログを吐いてくれる。

とにかく、こーゆーことをすることによってコードは見やすくなり、クラスの再利用しやすくなる…って理解してる。

今、超熱いMoose始めたよ。
で、Moose理解するにはClass::MOP理解しなきゃいけなくて、Class::MOP理解するにはMOP理解しなきゃいけないので、ircでえろい人たちに色々教わったのでメモ。

メタプログラミング メタプログラミング - Wikipedia
ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法
んで、これを実現するために必要なのがメタクラスとMOP。

MOP(メタオブジェクトプロトコル)
メタクラスを通してオブジェクトシステムへアクセスするAPI

メタクラス
クラスの振る舞いを定義したクラスでイントロスペクション(introspection)とインターセッション(itercession)を備える

イントロスペクション
オブジェクトの属性を得る能力 ex) 何のクラスを継承しているかとか、何のメソッドを持ってるかとか

インターセッション
オブジェクトの振る舞いに変更を加える能力 ex) 親クラスを変更するとか、メソッドを追加するとか。

で、Class::MOPはPerl 5のオブジェクトシステムに対してのMOPを提供してくれるモジュール。
Class::MOPには大きく分けて4つのモジュールでプロトコルが提供されてる。

Class::MOP::Class - クラスに対するプロトコル
Class::MOP::Attribute - アトリビュートに対するプロトコル
Class::MOP::Method - メソッドに対するプロトコル
Class::MOP::Instance - クラスのインスタンス生成に対するプロトコル

で、これらを使うとこんな風に書けちゃう。

use strict;
use warnings;

use Class::MOP;

{
    package Hoge;
    use metaclass;
}

my $meta = Hoge->meta;
my $meth_hello = Class::MOP::Method->wrap( sub { print "hello\n"; } );
my $attr_foo = Class::MOP::Attribute->new( '$foo' => ( accessor => 'foo' ) );
my $attr_bar = Class::MOP::Attribute->new( '$bar' => ( accessor => 'bar' ) );
my $hoge = Class::MOP::Instance->new($meta)->create_instance;

$meta->add_method( 'hello' => $meth_hello );
$meta->add_attribute($attr_foo);

$hoge->hello; # hello
$hoge->foo('FOO');
warn $hoge->foo; # FOO

eval { warn $hoge->bar; };
warn $@; # Can't locate object method "bar" via package "Hoge"

$meta->add_attribute($attr_bar);

$hoge->bar('BAR');
warn $hoge->bar; # BAR

で、MooseはClass::MOPをラップして使いやすくしてくれる+α的なモジュール。
use strict;
use warnings;

{
    package Hoge;

    use Moose;

    has 'foo' => (is => 'rw');
    sub hello {
        my $self = shift;

        print "hello\n";
    }
}

my $hoge = Hoge->new;
$hoge->hello; # hello
$hoge->foo('FOO');
warn $hoge->foo; # FOO

もちろんメタクラスにアクセスできるので

$hoge->meta->add_attribute('$bar', accessor => 'bar');
$hoge->bar('BAR');
warn $hoge->bar; # BAR

てなこともできる。

すっげー便利。

参考:
Class::MOP - A Meta Object Protocol for Perl 5 - search.cpan.org
Moose - A postmodern object system for Perl 5 - search.cpan.org
meta-object-protocol
meta object protocol について考えてみる - TokuLog 改め だまってコードを書けよハゲ

プロフィール

このアーカイブについて

このページには、2008年5月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年4月です。

次のアーカイブは2008年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。