11062008 sake
いわせさんのエントリ見て飲んでみたかったのだけど、先日やっと購入。

たしかに、なめらかで旨い。
11062008 sake
10062008 Gainer
富士市の「グリル ふらいぱん」を見て以来気になっていたのだけど、やっと行く事ができた。

ハンバーグの日替わりのセットがおすすめなのかな。

なかなかおいしかった。
ステーキもかなりおいしそうだった。
今度また行こうかな。
package Trouble;
use Moose;
has number => ( isa => 'Str', is => 'ro');
sub getNumber {
my $self = shift;
return $self->number;
}
sub toString {
my $self = shift;
return "[Trouble " . $self->number . "]";
}
package Support;
use Moose::Role;
use Perl6::Say;
requires 'resolve';
has name => (isa => 'Str', is => 'rw', required => 1);
has next => (isa => 'Support', is => 'rw');
sub setNext {
my ($self, $next) = @_;
$self->next($next);
return $next;
}
sub support {
my ($self, $trouble) = @_;
if($self->resolve($trouble)) {
$self->done($trouble);
}
elsif(defined($self->next)) {
$self->next->support($trouble);
} else {
$self->fail($trouble);
}
}
sub toString {
my $self = shift;
return "[" . $self->name . "]";
}
sub done {
my( $self, $trouble ) = @_;
say $trouble->toString() . " is resolved by " . $self->toString . ".";
}
sub fail {
my( $self, $trouble ) = @_;
say $trouble->toString() . " cannnot be resolved.";
}
package NoSupport;
use Moose;
with 'Support';
sub resolve { return 0; }
package LimitSupport;
use Moose;
with 'Support';
has limit => (isa => 'Int', is => 'rw', required => 1);
sub resolve {
my ($self, $trouble) = @_;
if($trouble->getNumber() < $self->limit) {
return 1;
}
else {
return 0;
}
}
package SpecialSupport;
use Moose;
with 'Support';
has number => (isa => 'Int', is => 'rw', required => 1);
sub resolve {
my ($self, $trouble) = @_;
if($trouble->getNumber() == $self->number) {
return 1;
}
else {
return 0;
}
}
package OddSupport;
use Moose;
with 'Support';
sub resolve {
my ($self, $trouble) = @_;
if($trouble->getNumber() % 2 == 1) {
return 1;
}
else {
return 0;
}
}
package main;
use Perl6::Say;
my $alice = NoSupport->new(name => "Alice");
my $bob = LimitSupport->new(name => "Bob", limit => 100);
my $charlie = SpecialSupport->new(name => "Charlie", number => 429);
my $diana = LimitSupport->new(name => "Diana", limit => 200);
my $elmo = OddSupport->new(name => "Elmo");
my $fred = LimitSupport->new(name => "Fred", limit => 300);
$alice->setNext($bob)->setNext($charlie)
->setNext($diana)->setNext($elmo)->setNext($fred);
for(my $i=0;$i<500;$i+=33){
$alice->support(Trouble->new( number => $i));
}
実行
[Trouble 0] is resolved by [Bob].
[Trouble 33] is resolved by [Bob].
[Trouble 66] is resolved by [Bob].
[Trouble 99] is resolved by [Bob].
[Trouble 132] is resolved by [Diana].
[Trouble 165] is resolved by [Diana].
[Trouble 198] is resolved by [Diana].
[Trouble 231] is resolved by [Elmo].
[Trouble 264] is resolved by [Fred].
[Trouble 297] is resolved by [Elmo].
[Trouble 330] cannnot be resolved.
[Trouble 363] is resolved by [Elmo].
[Trouble 396] cannnot be resolved.
[Trouble 429] is resolved by [Charlie].
[Trouble 462] cannnot be resolved.
[Trouble 495] is resolved by [Elmo].
本に忠実な感じで、visitorクラスを。
package Visitor;
use Moose::Role;
requires 'visit';
package ListVisitor;
use Moose;
use Perl6::Say;
with 'Visitor';
sub visit {
my ($self, $entry) = @_;
my $currentdir = "";
if(ref($entry) eq "File"){
say $currentdir . "/" . $entry->toString();
}
elsif (ref($entry) eq "Directory"){
say $currentdir . "/" . $entry->toString();
my $savedir = $currentdir;
$currentdir = $currentdir . "/" . $entry->getName();
my $it = $entry->iterator();
while($it->has_next){
my $e = $it->next;
$e->accept($self);
}
$currentdir = $savedir;
}
}
package Element;
use Moose::Role;
requires 'accept';
package Entry;
use Moose::Role;
use Perl6::Say;
with 'Element';
requires 'getName';
requires 'getSize';
sub add {say "method add";}
sub iterator {say "method iterator";}
sub toString {
my $self = shift;
return $self->getName() . " (" . $self->getSize() . ")";
}
package File;
use Moose;
with 'Entry';
has name => (isa => 'Str', is => 'rw');
has size => (isa => 'Int', is => 'rw');
sub getName {
my $self = shift;
return $self->name;
}
sub getSize {
my $self = shift;
return $self->size;
}
sub accept {
my ($self,$v) = @_;
$v->visit($self);
}
package Directory;
use Moose;
use MooseX::Iterator;
with 'Entry';
has name => (isa => 'Str', is => 'rw');
has directory => (isa => 'ArrayRef', is => 'rw', default => sub{[]});
sub getName {
my $self = shift;
return $self->name;
}
sub getSize {
my $self = shift;
my $size = 0;
my $it = $self->iterator();
while ( $it->has_next ) {
my $e = $it->next;
$size += $e->getSize();
}
return $size;
}
sub add {
my ($self, $entry) = @_;
push @{$self->directory}, $entry;
return $self;
}
sub iterator {
my $self = shift;
return MooseX::Iterator::Array->new( collection => $self->directory );
}
sub accept {
my ($self,$v) = @_;
$v->visit($self);
}
package main;
use Perl6::Say;
say "Making root entries";
my $rootdir = Directory->new( name => "root" );
my $bindir = Directory->new( name => "bin" );
my $tmpdir = Directory->new( name => "tmp" );
my $usrdir = Directory->new( name => "usr" );
$rootdir->add($bindir);
$rootdir->add($tmpdir);
$rootdir->add($usrdir);
my $vi = File->new( name => "vi", size => 10000 );
my $latex = File->new( name => "latex", size => 20000 );
$bindir->add($vi);
$bindir->add($latex);
my $visit = ListVisitor->new();
$rootdir->accept($visit);
実行
Making root entries
/root (30000)
/bin (30000)
/vi (10000)
/latex (20000)
/tmp (0)
/usr (0)
javaのコードだとvisitメソッドをオーバーロードしてんだけどMooseでもできるのかどうかはわからなかった。
withとextendsの使い分けが微妙にわかってなさげ。このパターンだとsuperが必要ないからか?
directryクラスでのみ必要なメソッドは抽象クラスでエラーにしたい場合どうすべきかちょっとわからない。
デザパタ本のvisitorパターンはインターフェースを抽象クラスで実装していたので、Mooseでもできるかなと試してみた。
package Element;
use Moose::Role;
requires 'accept';
package Entry;
use Moose::Role;
extends 'Element';
requires 'getName';
requires 'getSize';
sub add {
print "method add";
}
sub toStoring {
my $self = shift;
return $self->getName . " (" . $self->getSize . ")";
}
Moose::Roleはextendsできない。
Moose::Role does not currently support 'extends' at
/opt/local/lib/perl5/site_perl/5.10.0/Moose/Role.pm line 53
Moose::Role::extends('Element') called at moose_visitor.pl line 12
ドキュメントにも書いてあった。
という流れで。
差分をとって10足して、そのあと10の余りをとって、さらに '0'を足せばキャストしなくていい。
for(j=k-1;j>-1;j--) a[i][j]=(a[i+1][j]-a[i][j+1]+10)%10+'0';
こんな感じ
Mooseでデザパタとデザパタ本を読みながらメモっていく。
型による制約とMoose::Roleでインターフェースや抽象クラスが作れるのがよいのかな。