Singleton ( デザパタPerl )

Singletonは結城さんの本の言葉を借りれば

  • 指定したクラスのインスタンスが絶対に一個しか存在しないことを保証したい
  • インスタンスが一個しかないことをプログラムで表現したい

ということになるわけですが、

perlではコンストラクタをprivateにしてしまうということが出来ないので、ココみたいにはいかないのは、おまえののログ に書いてある通りなのは理解できる。

でも、perlサンプルとかココみたいに、

package Singleton;
use strict;
use vars qw($singleton);

sub new {
    $singleton and return $singleton;
    my $class = shift;
    my $self = {};
    $singleton = $self;
    print "インスタンスを生成しました。\n";
    bless $self, $class;
}

1;

こんな感じで書くと駄目な理由がイマイチわからん。

ProductName Web+DB press (特別総集編)

技術評論社 / ?円 ( 2005-03 )


でも同じような書きかたしてたぞ。

このエントリは結城浩さんの本と、それに載っているサンプルをPerlで書いた例をみながら考えたことをメモってます。あとは、はてなの伊藤さんのjavascriptでの例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


Adaptor ( デザパタPerl )

結城さんの本には、委譲と継承の二通りの方法が記載されていたが、その二つの違い(メリット、デメリット)がイマイチ理解できなかったので、ググって見ると、YukiWikiに。

委譲 - Delegation

継承はそのインスタンスのなかの変数を使用するのに対し、委譲では委譲先のインスタンスの中の変数を使用する。(この説明は単に動作の違いを言っているだけかな。) 継承はインスタンスの振る舞い方を規定し、委譲はインスタンスの実装となる。 インスタンスの振る舞い方が変わると、そのインスタンスを利用するほうにも影響が出る。 インスタンスの実装は、使われ方で変わるが、利用するほうには影響が出にくい。

なんとなくわかったような、わからないような。

継承はそのインスタンスのなかの変数を使用するのに対し、委譲では委譲先のインスタンスの中の変数を使用する

というあたりをよく考えてみるといいのだろう。

perlで確認してみると、 サンプルは委譲を使っているので、僕はちょっと継承を用いたperlサンプルを書いてみた。

main.plとBanner.pmはサンプルのものをそのまま使用。interfaceにあたるprinter.pmは使わなかった。

package PrintBanner;
use strict;
use base qw(Banner);

sub new {
    my $class = shift;
    my $string = shift;
    my $self = $class->SUPER::new($string);
    bless $self, $class;
}

sub printweak {
    my $self = shift;
    $self->show_with_paren;
}

sub printstrong {
    my $self = shift;
    $self->show_with_aster;
}

1;

結局AdapteeとTargetの違いの大きさで使い分ければいいのかな?このサンプルだとメソッド名しか変わってないから、委譲を使ったほうがすっきりするのだろうか?

このエントリは結城浩さんの本と、それに載っているサンプルをPerlで書いた例をみながら考えたことをメモってます。あとは、はてなの伊藤さんのjavascriptでの例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


Iterator::Utilをつかってみた ( デザパタPerl )

イテレータのサンプルを実際にIterator::Utilモジュール使って書いてみたゾ。

今回、用意したのはBook,BookShelf,mainだ。インターフェースにあたる部分は省略ってことで。

Bookはサンプルのコードをそのまま使用してます。 BookShelfはbooksメソッドで配列返すようにしといた。

package BookShelf;
use strict;

sub new {
    my $class = shift;
    my $self = {};
    $self->{maxsize} = shift;
    $self->{books} = [];
    $self->{last} = 0;
    bless $self, $class;
}

sub appendbook {
    my $self = shift;
    my $book = shift;
    $self->{books}->[$self->{last}] = $book;
    $self->{last}++;
}

sub books {
    my $self = shift;
    $self->{books};
}

1;

mainでIterator::Utilを呼ぶ。

!/usr/bin/perl

use strict; use BookShelf; use Book; use Iterator::Util;

my $bookshelf = BookShelf->new(5); $bookshelf->appendbook(Book->new('Java言語で学ぶデザインパターン入門')); $bookshelf->appendbook(Book->new('憂鬱なプログラマのためのオブジェクト指向開発講座')); $bookshelf->appendbook(Book->new('かんたんUML')); $bookshelf->appendbook(Book->new('プログラミングPerl')); $bookshelf->appendbook(Book->new('オブジェクト指向Perlマスターコース'));

my $it = iarray ($bookshelf->books);

while (my $book = $it->value) { print $book->getname."n"; }

実行結果はこんな感じ。最後のIterator is exhaustedがちょっと気持ち悪い。

$ perl main.pl 
Java言語で学ぶデザインパターン入門
憂鬱なプログラマのためのオブジェクト指向開発講座
かんたんUML
プログラミングPerl
オブジェクト指向Perlマスターコース
Iterator is exhausted at main.pl line 18

増補改訂版Java言語で学ぶデザインパターン入門あなたの考えを広げるためのヒント(ここがおもろい)には、

実装とは切り離して数え上げできることが重要

とか書いてあるので、まぁ、これでいいのかな。

このエントリは結城浩さんの本と、それに載っているサンプルをPerlで書いた例をみながら考えたことをメモってます。あとは、はてなの伊藤さんのjavascriptでの例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


Iterator ( デザパタPerl )

Perlの例だとインターフェースのクラスをdieしているので、最初これはどういう意味があるのかわかんなかったが、

naoyaのはてなダイアリー - prototype.js でデザインパターン - Iterator

デザパタ本のコードでは Java の interface をまず用意して、となるのですが例によって JavaScript は動的な言語かつ型がないのでサブクラスに実装を強制させるメカニズムがない。ということで、ここでは interface に相当するものは用意せずに Concrete クラスだけで実装します。

と書いてあったのを見てサブクラスで実装されてない場合によばれた場合のためのちょっとした仕組みなのだとわかった(あがきにちかいような気もするが)。で、試しにjavaで実際にインターフェースを実装してるクラスのメソッド名変えてみたらコンパイルできなかったし、をを~、javaのインターフェースって束縛としては便利だよなと思ったり。言語の違いってなかなかおもろいなぁと感じた瞬間だったり。

あと、こういうやり方もあるらしい。

オブジェクトをハッシュデータ構造と透過に扱う際に、tie ハッシュのインターフェースで NEXTKEY() というメソッドを実装しますが、これがまさに iterator なので、

って部分がイマイチ飲み込めなったので、実用PerlプログラミングのTieのとこと型グロブの章をよく読んでなんとなく理解した。(理解した気になった?)

ProductName 実用Perlプログラミング
スリラム スリニバサン
オライリー・ジャパン / ?円 ( 1998-11 )


で、CPANもいくらか調べてみたところ、Iterator::Utilというのがよさげなのかな?この場合はiappendを使えばいいのかな?

明日コードを書いてみよう。

このエントリは結城浩さんの本と、それに載っているサンプルをPerlで書いた例をみながら考えたことをメモってます。あとは、はてなの伊藤さんのjavascriptでの例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


Perlでデザインパターン

HeadFirstみても、なかなかperlでのデザインパターンが飲み込めないぁと悩んでいたら、結城 浩さんの本をいろんな言語で書いてるのを見つけた。 で、その中にPerlでデザインパターンも発見。はてなのえらいヒト?だよね。

というわけで、買ってみた。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


AbstractFactoryくらいまで読んだが、名著の予感。

だって面白いんだもん

そして、perlのサンプル素敵、全部消化してから次のパターンに移ってる。で、もちろんjavaも書いて実行している(eclipseで)。

当分、この本の追っかけメモになるかも。本に関して一言いうならば、イタリック体はもうちょいイタリックっぽくして欲しかったね。いまんとこそれだけ。

h2xs

去年最も多く世話になった本はこれ。いつも持ち歩いていた気がする。で、oopをなんとなくは理解できるようにはなった。そして、お気に入りのモジュール読み解いてくのも楽しい作業になったネ。

ProductName 続・初めてのPerl - Perlオブジェクト、リファレンス、モジュール
Randal L.Schwartz
オライリー・ジャパン / ?円 ( 2003-12 )


特に、

h2xs -AXn

で始めて、ある程度書いたら、subversionで管理する癖がついたのは、効率上素晴らしくよろしくなった。家からでも職場からでも同じようにco,ci出来るし。

と同時に足りないものもわかってきた。

それはテスト

テスト書くの苦手だニャぁ。で、無駄にはまることも多い(だめなのわかってるんだが)

今年はテスト周りをもうちょっとちゃんとするのと、できれば、なんかをCPANに登録してみたいなぁ(ささやかな野望ということで)

PerlMagickで画像の縁を丸める

blosxomで使っている画像はPerlMagickを使ってアップロードしてリサイズするCGIを使っているので画像の角をついでに丸めるようにスクリプトを書き換えた。コマンドラインからでも、コマンドラインからのグラフィックス操作 第2回 にあるように、角丸め用の画像を用意しなければいけないので、Gimpをつかって、10px X 10pxの画像を用意した。

あとはPerlMagickリファレンス をみながら、スクリプトを修正。

# 角丸め用の画像を読み込む $rne = Image::Magick->new; $rne->Read("/var/www/html/images/rne.png"); $rnw = Image::Magick->new; $rnw->Read("/var/www/html/images/rnw.png"); $rse = Image::Magick->new; $rse->Read("/var/www/html/images/rse.png"); $rsw = Image::Magick->new; $rsw->Read("/var/www/html/images/rsw.png"); # 画像をリサイズしつつ角を丸めて書き出す $i = Image::Magick->new; $i->Read("$Temp/$filename"); $i->Scale(width=>160, height=>120); $i->Composite(gravity=>NorthEast,image=>$rne); $i->Composite(gravity=>SouthEast,image=>$rse); $i->Composite(gravity=>NorthWest,image=>$rnw); $i->Composite(gravity=>SouthWest,image=>$rsw); $i->Write("$IMGDIR/$newimg");

という感じで、リサイズしつつ、縁を丸めてアップロードするスクリプトの出来上がり。ちなみに角丸め用の画像はココからダウンロードできます。

道の駅あらいのひだなんの天蕎麦でテスト。ちょっとは見栄えがするようになったかも。あとは、そのうち綺麗な影でも落とそうかと思っている。

SOAPsh.pl

SOAP::Liteをインストールすると、もれなくSOAPsh.plがついてくることをいまさら知った。

webmonkeyのSOAPを使ってスッキリサッパリの乱数生成サンプルを対話的に処理してみると

$ SOAPsh.pl http://localhost/cgi-bin/random.cgi http://localhost/Random Usage: method[(parameters)] > choose() --- SOAP RESULT --- '1'

こんな感じで、対話的に処理できるようになるのでデバッグとか便利。あとはシェルからちょこっと叩きたいときか。

IDとかの手で打てるぐらい短い文字列を入力にして、ちょっとした数字とか文字が帰ってくるようなツールだったらなんでも便利に使えそうな気がする。

物性の予測とかSOAPにしてあるので、smilesなげてやると結果が戻ってきたりとか。rule of 5とかrule of 3戻したりでもいいなぁ。

MFPM SEARCH

最近perlのモジュールチェックしたり、ソースを眺めたりすることが多い僕は、しょっちゅうMFPMを使うので、CISCO同様firefox用の検索フォームを作りましたゾ。

MFPM Search

MFPM Search

こんな感じで、Firefoxの検索フォームに追加されるヨ。

それにしても、Perl暦10年って、、、無駄に年だけとった感じがスルナァ。実際3,4年ってとこか。

Debug::EchoMessage

かま田さんに教えてもらったDebug::EchoMessageですが、Class::DBIみたいに環境変数でログのレベルを変えたいなぁということで、こんな感じで使っています。

#!/usr/bin/perl

use strict;
use warnings;
use Debug::EchoMessage;

my $self = bless {}, "main";
my $debug_level = $ENV{"Debug_Echo_Level"} || 0;
$self->debug($debug_level);

# The level 3 message will not be displayed
$self->echoMSG("This is level 1 message.", 1);
$self->echoMSG("This is level 2 message.", 2);
$self->echoMSG("This is level 3 message.", 3);  

環境変数で設定しておいても、実行する前に変数入れてもOKなかんじ

$ export Debug_Echo_Level=1
$ ./debugtest.pl 
This is level 1 message.

$ Debug_Echo_Level=2 ./debugtest.pl 
This is level 1 message.
This is level 2 message.

$ Debug_Echo_Level=3 ./debugtest.pl 
This is level 1 message.
This is level 2 message.
This is level 3 message.

これで、ファイルをいじらずにデバッグレベルを変えられるし、はかどるはずだ。で、余力はbloglinesのチェックにまわすと。