Hatena::Groupdann

dann's blog このページをアンテナに追加 RSSフィード

Fork me on GitHub

2008-08-09

MooseX::Storage::Format::Storable でJavaのSerializableっぽくオブジェクトのシリアライズ

| MooseX::Storage::Format::Storable でJavaのSerializableっぽくオブジェクトのシリアライズ - dann's blog を含むブックマーク はてなブックマーク - MooseX::Storage::Format::Storable でJavaのSerializableっぽくオブジェクトのシリアライズ - dann's blog MooseX::Storage::Format::Storable でJavaのSerializableっぽくオブジェクトのシリアライズ - dann's blog のブックマークコメント

以下のように

with Storage('format' => 'Storable');

MooseのRoleをconsumeすると、そのクラスのオブジェクトをserialize, deserializeできるようになります。

JavaのSerializable interfaceをimplementsするような感じでつかえるのはいいですね。

package Point;
use Moose;
use MooseX::Storage;

with Storage( 'format' => 'Storable' );

has 'x' => ( is => 'rw', isa => 'Int' );
has 'y' => ( is => 'rw', isa => 'Int' );

1;

package main;
use Data::Dumper;
use Perl6::Say;
my $p             = Point->new( x => 10, y => 10 );
my $storable_data = $p->freeze();
my $p2            = Point->thaw($storable_data);
say $p2->x;

# FormatにはJSONなどもあるので、MooseのオブジェクトをViewに渡す際にJSON化して使うなんていうのもいいかもしれません。

2008-07-03

MooseX::Methodで引数チェック

| MooseX::Methodで引数チェック  - dann's blog を含むブックマーク はてなブックマーク - MooseX::Methodで引数チェック  - dann's blog MooseX::Methodで引数チェック  - dann's blog のブックマークコメント

perlcodesampleさんのをMooseX::Methodで書いてみました。

http://d.hatena.ne.jp/perlcodesample/20080702#seeall

MooseX::Methodだと、宣言的に書けて美しいですね。コード量もかなり短くなっています。

#!/usr/bin/env perl
use strict;
use warnings;

{

    package Foo;
    use MooseX::Method;

    method conf => named(
        mode => { isa => 'Int', required => 1 },
        warn => { isa => 'Int', required => 1 },
    ) => sub {
        my ( $self, $args ) = @_;

        print "called !!! \n";
    };
}

Foo->conf( mode => 1, warn => 0 );

# 引数名が間違ってる(引数が不足と同じだけれど)
eval { Foo->conf( moda => 1, warn => 0 ); };
if ($@) {
    warn $@;
}

# 引数の型が違う
eval { Foo->conf( mode => 'Hello', warn => 0 ); };
if ($@) {
    warn $@;
}

# 引数が不足
eval { Foo->conf( mode => 1 ); };
if ($@) {
    warn $@;
}

実行結果

called !!! 
Parameter (mode): Must be specified at moosex_method.pl line 23
Parameter (mode): Argument isn't (Int) at moosex_method.pl line 29
Parameter (warn): Must be specified at moosex_method.pl line 35

Mooooooooooooooooooose

とおりすがりとおりすがり2008/07/04 09:48モダンなとか言ってる時点で終わってる言語。

yappoyappo2008/07/04 12:16じゃぁモランボンで

danndann2008/07/05 00:51どんな言語でもモダンな書き方やライブラリというのはあると思いますよ。

na3na32008/07/05 09:22仕事だとモダンな書き方を許してもらえなかったりして悔しいです。

ponpon2008/07/05 13:16良く分からないけど、「モダン」ってPerl5.8.8で許されるようになった書き方とかっすか?

JohannJohann2008/07/05 16:36すごく為になる情報です。とおりすがりの茶々とか気にする必要無いですね。
ありがとうございました。

サルサル2008/07/05 23:00perlの問題点をまざまざと見せ付けてくれたという点ではすごくためになる情報だと思う。

perl48perl482010/08/27 19:42なるほど、Plaggerを学ぶと早いしモダンなんですね。ありがとうございます。

2008-06-29

XIRCDでのMooseX::POEの使い方

| XIRCDでのMooseX::POEの使い方 - dann's blog を含むブックマーク はてなブックマーク - XIRCDでのMooseX::POEの使い方 - dann's blog XIRCDでのMooseX::POEの使い方 - dann's blog のブックマークコメント

MooseX::POEの使い方の例として、XIRCDを少し見てみました。

http://coderepos.org/share/browser/lang/perl/XIRCD/trunk/

以下、メモです

  • Component
    • MooseX::POEを使う
    • new時にPOCO::XXXをspawan
    • POE系の冗長な記述を簡易に書く仕組み
      • Sub::Exporterでpostなどなどをexportする使い方はとても綺麗
      • get_argsも同様に短く書けていい
  • Moose
    • MooseX::Daemonize, MooseX::POE, MooseX::POE::Aliased

ポイントは、以下の3点かなと思いました。 

  • MooseX::POEを使うことでPOE::Sessionうんぬんの記述を無くす事
  • ComponentでPOEの冗長な記述を簡易に記述できるように関数をexportすること
  • MooseX::Daemonizeでdaemonの記述が簡易になっている点

これだけコードがシンプルにできると、POEのコードも少し書いてみようかなぁなどと思えてきます。

id:mikihoshi++

まだ、MooseX::POEは全然触ってないのですが、ぱっと見た感じでは先ほどのやつをMoose化するのは、さほど難しいところはなさそうです。MooseX::POEのコードが読み終わったら移植してみます。

MooseX::AttributeHelpersでArrayRef、HashRefのアクセッサを簡単に作成する

|  MooseX::AttributeHelpersでArrayRef、HashRefのアクセッサを簡単に作成する - dann's blog を含むブックマーク はてなブックマーク -  MooseX::AttributeHelpersでArrayRef、HashRefのアクセッサを簡単に作成する - dann's blog  MooseX::AttributeHelpersでArrayRef、HashRefのアクセッサを簡単に作成する - dann's blog のブックマークコメント

Moose標準だと、ArrayRefのattributeを作ってそれをラップするメソッドを書く事になりますが、これは面倒です。そんなときに、使うのがMooseX::AttributeHelpersです。

attributeを拡張してくれます。これで、arrayrefにaliasのようなものを追加できるようになります。以下は、urlsのaccessorにurladdするメソッドを提供する例です。

providesに書いたadd_urlというメソッドがarray refのpushに対応します。HashRefなども同様の形で簡単に追加できるので、array, hashへのラッパメソッドを書いている人は、これを使ってみるといいかと思います。


ArrayRefの場合

#!/usr/bin/env perl
use Data::Dumper;

{
  package Crawler;
  use Moose;
  use MooseX::AttributeHelpers;

  has 'urls' => (
      metaclass => 'Collection::Array',
      is        => 'ro',
      isa       => 'ArrayRef[Str]',
      default   => sub { [] },
      provides  => {
          'push' => 'add_url',
      }   
  );  
}

my $crawler = Crawler->new;
$crawler->add_url('http://www.google.co.jp');
$crawler->add_url('http://www.yahoo.co.jp');

warn Dumper $crawler->urls;

実行結果

$VAR1 = [
          'http://www.google.co.jp',
          'http://www.yahoo.co.jp'
        ];

HashRefの場合

#!/usr/bin/env perl
use Data::Dumper;
use Perl6::Say;

{
  package Stuff;
  use Moose;
  use MooseX::AttributeHelpers;
  
  has 'options' => (
      metaclass => 'Collection::Hash',
      is        => 'ro',
      isa       => 'HashRef[Str]',
      default   => sub { {} },
      provides  => {
          'set'    => 'set_option',
          'get'    => 'get_option',            
          'empty'  => 'has_options',
          'count'  => 'num_options',
          'delete' => 'delete_option',
      }
  );
}

my $stuff = Stuff->new;
$stuff->set_option('option1' => 'value1');
$stuff->set_option('option2' => 'value2');

say 'option1 value: ' . $stuff->get_option('option1');
say Dumper $stuff->options;

$stuff->delete_option('option1');
say Dumper $stuff->options;

say 'option nums: ' . $stuff->num_options;
say 'has option?: ' . $stuff->has_options('option2');

実行結果

option1 value: value1
$VAR1 = {
          'option1' => 'value1',
          'option2' => 'value2'
        };

$VAR1 = {
          'option2' => 'value2'
        };

option nums: 1
has option?: 1

dayflowerdayflower2008/07/02 09:53>CPANモジュール作成の手順
先生! テストまわりについて書いてありません :)
あと make disttest とか distclean とか realclean とか。

danndann2008/07/02 22:24エントリに追記してみました。間違っている点があれば是非コメントお願いします!

dankogaidankogai2008/07/03 06:51- prove -lv t/hoge.t
+ prove -bv t/hoge.t # でないとXSに対応しない

danndann2008/07/04 03:02ありがとうございます。エントリに追記してみました。