perl

Chain Of Responsibilityパターン

同じインタフェースを持つHandlerオブジェクトを鎖(Chain)のように繋いでおき、各Handlerオブジェクトは要求された命令を処理できなければ次のオブジェクトに処理を回すパターン。Handlerに渡される命令にはCommandパターンが使われることがある。 メリット …

Bridgeパターン

実装のクラス階層と機能のクラス階層を分離し、委譲を使って両者を橋渡し(Bridge)する。 機能と実装がごっちゃになってきたら、Bridgeパターンを使うタイミング。 プラットフォームやフォーマットの違いを実装側に隠蔽し、機能側では抽象メソッドを用意す…

覚えておきたいモジュール

List::Utils リストに対するユーティリティ DateTime 日付や時間を扱うためのOOPなモジュール http://perl-users.jp/modules/datetime.html http://blog.livedoor.jp/dankogai/archives/50708234.html Statistics::Descriptive 統計に関するユーティリティ …

全角⇔半角変換

Encode::JP::H2Zが使える。 ただ、EUCで渡すのが前提。 http://www.rwds.net/kuroita/program/Perl_unicode.html

Commandパターン

命令(Command)をメソッド呼び出しではなくて、オブジェクトとして実装するパターン。通常は命令したい内容に応じてメソッド引数を変えるが、Commandパターンはオブジェクトを渡す。 メリット 命令そのものに情報を持たせることができる 複数の命令を呼び出…

Decoratorパターン

オブジェクトを包み込み、機能を装飾していくパターン。 メリット 複数クラスを自由に組み合わせできる 実行時に動的に機能を追加できる つまり、継承よりも柔軟性がある 実装例 元になるクラス: Text package Text; sub new { my $class = shift; my $text …

Algorithm::Diff

Algorithm::Diff - Compute `intelligent' differences between two files / lists 'インテリジェント'に2つのファイル/リストの違いを算出する 試してみる。 use Algorithm::Diff qw(sdiff); use Data::Dumper; my @diffs = sdiff( [qw( <html> <body>test</body> </html> )], [qw( <html> <body>T</body></html>…

Factory Methodパターン

状況によって生成されるオブジェクトを変更したいケースで使う。 メリット オブジェクトの生成に必要な手続きを利用側から隠蔽できる サブクラスを返すことで利用側は型制約から解放される 実装例 Factory PenとKnifeをつくる package Factory; use Product:…

Singletonパターン

唯一のオブジェクトを生成をしたいケースで使う。 クラス package Singleton; use strict; my $instance; sub instance { my $class = shift; return $instance ||= bless {}, $class; } 1; 呼び出し use Singleton; my $instance1 = Singleton->instance();…

Template Methodパターン

スーパークラスで処理の枠組みを決め、実装の詳細をサブクラスに任せるパターン。呼び出し手順や共通処理をスーパークラスに実装する。ニュアンスとしては「だいたい同じだけど、細かいところでいくつか違う」ものを実装するのに使える。 例: 支払処理 packa…

デザインパターン

コードを読めば分かるが、適切に使いこなすことはできていない。 いい機会なので地道に実装をしてみる。 デザインパターンとは 借り物ではなく自分の言葉で書くと「プログラミングにおけるベストプラクティス」である。定石と言い換えることもできる。あくま…

Best Practice of Subroutine Design

大げさなタイトルだけれども、最近の思うところを。 引数に関して ウィッシュリストを返すルーチンwishを作ったとする。 package Foo; sub wish { my ($person, @wish_list) = @_; return "$person wants " . join(',', @wish_list) . ".\n"; } 1; これに対…

Advanced Testing!

Test::Moreのis(), ok()だけで終わらせていたらもったいない! ってことでいろいろ使ってみる。 Test::Moreをもう一歩踏み込んで使う is_deeply 構造レベルまでチェックしたい時に使う。 my $ref_hash; $ref_hash->{key} = 'val'; is_deeply($ref_hash, {key…

Cache::FileCacheのHowto

Cacheの実装として、ローカルのファイルシステムを使うもの。使ってみての所感をまとめたい。 導入により享受できる恩恵 当然ながら、DBへの負荷を減らせる ファイルなので複数プロセスで共有可能 ローカルにあるのでネットワークトラフィック発生しない 注…

MyBench.pm

ハイパフォーマンスMySQLの著者がつくったベンチマークツール wget http://jeremy.zawodny.com/mysql/mybench/mybench-1.0.tar.gz tar zxvf mybench-1.0.tar.gz cd mybench-1.0/ perl Makefile.PL make sudo make install でOK。 付属のbench_exampleは設定…

undefに注意

以下のテストコードではTRUEが出力される!!! if (my @tmp = undef) { print "TRUE\n"; } else { print "FALSE\n"; } サブルーチンでundef返すことがあるケースでは、wantarrayで呼び出し側のコンテキストを確認することが望ましそう。

memcachedのベンチマーク

MySQLから取得するのと、memcachedから取得するのとどっちが速くなるのかベンチマークしてみた。 テーブルスキーマ Create Table: CREATE TABLE `data` ( `id` int(10) unsigned NOT NULL, `user_id` int(10) unsigned NOT NULL, `post_date` int(10) unsign…

h2xsとmake

単体テストをきちんとやりたい、と思って色々探していたらこんな記事を発見。 http://www.sixapart.jp/techtalk/2007/02/how_to_make_perl_module.html まずMakeFile関連をきちんと調べておく。 h2xs -X -a -n Foo::Bar::Baz を実行すると、カレントにFoo-Ba…

fetchrow時の使用メモリ

topコマンドで調べてもよく分からんので、http://www.drk7.jp/MT/archives/000803.htmlを参考にDevel::Size::Reportを使って調べてみる。上記サイトによれば SCALAR 型のデータは、Integer 型である場合、最小で16byte のメモリを必要とする。以後、32bit 単…

暗号化モジュール

そもそも暗号化に詳しくないので調べるところから。 http://x68000.q-e-d.net/~68user/net/crypt-1.htmlが入門にはわかりやすかった。 超ばっくり基礎知識 共通鍵方式 暗号化/復号化に同じ鍵を使う 通信に使う際は、鍵を共有する方法が問題になる アルゴリズ…

特殊変数$@と$!

$@はdie、$!はシステムコールのエラー eval {die "test";}; print "\$\@: $@\n"; eval { `not exists` }; print "\$!: $!\n"; $@: test at test.pl line 6. $!: No such file or directory

ディレクトリ

opendir, readdir, closedirを使う。 以下はカレントディレクトリの.logファイルをすべて探してくる例 opendir(THISDIR '.') or die "cannot open dir . $!"; my @allfiles = grep { /\.log$/ and -f } readdir THISDIR; closedir THISDIR;

時間関数

Time::Pieceが便利。 標準関数のlocaltimeをオーバーライドし、Time::Pieceオブジェクトを返してくれる。 後方互換なので標準関数的な書き方でもOK。例えば、その日の00:00:00のunix timeが欲しいときはこんな感じで。 use Time::Local; use Time::Piece; my…

fork & Parallel::ForkManager

fork 標準関数のfork()の使い方。 use strict; if (my $pid = fork()) { # parent print "here is parent proces.\n"; } elsif ($pid == 0) { # child sleep(3); print "child process ends.\n"; exit 0; } else { die "fork error: $!" } print "parent pro…

MySQL maxconnections

CentOSだと設定場所は/etc/my.cnf [mysqld] max_connections=100 perlからDBI使って、DBハンドル取得&SELECTした時にどういう挙動をするのか調べてみた。 実験に使ったプログラム。 #!/usr/bin/perl use strict; use DBI; use Parallel::ForkManager; #適当…

プレースホルダ

複数の値を列挙することができない。 具体的には以下のケース。 $ids = '1,2,3,4,5'; my $sth = $dbh->prepare(<<'SQL'); delete from tableA where id in (?) SQL $sth->execute($ids); 以下なら実行可能。 $ids = '1,2,3,4,5'; my $sth = $dbh->prepare(<<…

時間系の関数

エポック(1970/1/1 00:00:00 UTC)からの秒数を返す time(); 現地時間からエポックタイムを返す(あくまでも1970/1/1 00:00:00 UTCからの秒数) use Time::Local; timelocal(0, 30, 17, 5, 10-1, 2009-1900); time関数が返す形式をローカル時間のリストに変…

FileBaseName

File::Basenameは標準モジュールで、basename関数でスクリプト名を取得可。 use strict; use File::Basename; use TmpKotaro; print "$0\n"; print basename($0)."\n"; print TmpKotaro::test()."\n"; 特殊変数$0にはあくまで実行しているスクリプト名が入る…

シングルクォートとダブルクォート

ダブルクォートは変数展開と逆スラッシュを解釈する。シングルクォートは文字として扱う。 my $test = 'This is test'; my $single = '$test\t'; my $double= "$test\t"; print $single; print $double; #出力. #$test\tThis is test

改行とリストコンテキスト

改行を含む文字列をリストコンテキストで代入すると、改行でスプリットされる。 my ($aaa, $bbb, $ccc) = "aaa\nbbb\nccc"; print $aaa; print $bbb; print $ccc; aaa bbb ccc が出力される。 my ($aaa, $bbb, $ccc) = split("\n", "aaa\nbbb\nccc"); と同等…