October 02, 2006
便利モジュールClass::Accessor
最近使い始めたのですが、Class::Accessorってかなり便利。
CPANのドキュメントにあるサンプルソースにこんな内容が書いてあるのですが、
Most of the time, writing accessors is an exercise in cutting and pasting.
You usually wind up with a series of methods like this:
(通常、アクセサを書くことはカット&ペーストの練習だ。
いつもこのように一連のメソッドを書くはめになる:)
sub name {
my $self = shift;
if(@_) {
$self->{name} = $_[0];
}
return $self->{name};
}
sub salary {
my $self = shift;
if(@_) {
$self->{salary} = $_[0];
}
return $self->{salary};
}
# etc...
まさにこのサンプルソースになるようなプログラムをこのモジュールを知るまでは書いていて、かなりイケなかったのですが、このモジュールを知った今はもうそんなダメなソースを書きませんよ。
手始めに会社でよく使う汎用フォームのソースをClass::Accessorを使って書き直す予定。
投稿者 nitoka : 07:12 PM | コメント (0) | トラックバック
September 28, 2006
flockの使い方
mixiのPerlコミュでも話題になっていたのですが(ちょっと前だけど)、flockで排他制御をかける際の正しい方法はみたいなことが書かれていて、そういえば僕もPerlCookBookに書いてあることを信じて、こういう使い方をしていたのですが
追記の場合:open(OUT, ">>data.txt") or die; flock(OUT, LOCK_EX); my $line = "hello world!\n"; print OUT $line; close(OUT);
どうもこれだけでは、不十分らしい。
open(OUT, ">>data.txt")で追記モードで開いた際に他のプロセスが書き込みをしていると、末尾がずれるそうでseek(OUT,2);を指定してprintする前に末尾にポインタを移動させる必要があるようです。
なので、正しくはこう、
open(OUT, ">>data.txt") or die; flock(OUT, 2); seek(OUT, 0, 2); my $line = "hello world!\n"; print OUT $line; close(OUT);
Bestなやり方はやっぱりLockFileと書き込むファイルは別々にすべきなのでしょうが。
- 参考にさせてもらったページ
- Perlの排他制御
- CGI(Perl)ファイル処理 その4:「ファイルロック:flock 後編」
- flock考
投稿者 nitoka : 10:25 AM | コメント (0) | トラックバック
September 08, 2006
Image::Magickが動かなくなった
昨日の夕方クライアントから1本の電話が、「MovableTypeで画像のアップロードをしてもサムネイルの作成ができないんですけど・・・」
いや予感、以前もオペミスで関係ないCPANモジュールのバージョンアップしてImage::Magickが動かなくなったんだよな。
そのときはPortsからImage::Magick入れなおしてなんとか解決できたけど。
ただ、今回はCPANなんかいじってないし、サーバーにも最近はFTPでしかログインしてないし、とりあえずクライアントには「ホスティング会社に確認をしてみます。最悪、1週間前のバックアップデータから復旧なんてこともありあえるので、Blogの記事データとかはバックアップをとっておいてください。」と伝え、調査開始。
ホスティング業者に連絡をしたのですが、いつものように「調査に時間がかかるので・・・」という調子で、あてにならないので自分で調査開始。
まずは、mt-check.cgiを走らせてMTに依存しているモジュールチェック。
やはり、Image::Magickがないと怒られる。でも「perldoc -l Image::Magick」するときちんとパスが返ってくるので、これまた不思議。
mt-check.cgiでImage::Magickのチェックをする際に、eval{ require Image::Magick }してエラーにならなければOKみたいなことをしていたので、僕もテストスクリプトを書いてみることに。こんな感じ。
#!/usr/bin/perl use Image::Magick; exit;
まあ、たいしたスクリプトじゃないですけどチェックには十分なので早速実行してみると、
Image::Magick object version 6.2.8 does not match bootstrap parameter 6.2.7 at /usr/local/lib/perl5/5.8.6/mach/DynaLoader.pm
こんなエラーメッセージが!どうもImage::Magickで使用しようとしているImageMagick(ややこしいこっちはPortsからいれたほうね)と、実際にサーバーに入っているImageMagickのバージョンが違う模様。
ということで、実際にサーバーに入っているImageMagickのバージョンを調べる。
#convert -version
Version: ImageMagick 6.2.7 06/22/06 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC
やっぱり、CPANのImage::Magickで使おうとしているImageMagickのバージョンと違う模様。
なんとなく原因がみえたのでMagick.pmの中身をみてみると33行目あたりに書いてある$VERSIONの値が「6.2.8」になっとる。やっぱりCPANだけが勝手にバージョンアップされてる。
おそらくこの値を直せば直るだろうと確信できたので、以前のトラブルのときにバックアップしておいたファイルに置き換えて、テストスクリプトを実行するとエラーが出なくなる。いける!
ということでMTにログインしてファイルのアップロードを実行するとちゃんとサムネイルが作れるようになっていた。
復旧完了!
ただ気になったのは、なぜCPANモジュールが勝手にバージョンアップされてたのか?
まあ、ホスティング会社がアナウンスなしてサーバーのソフトウェアをアップグレードしたんだろうけどさ。
全く人騒がせな。
投稿者 nitoka : 10:07 AM | コメント (1) | トラックバック
August 29, 2006
人にやさしいプログラマになります
Perlベストプラクティスを買いました。人にやさしいプログラムを書くためのガイドラインが500ページ近くにわたって書かれています。
この本に書かれているガイドラインはPerlに限らず、PHPやActionScriptなど他の言語にも適応できるすばらしい内容だと思います。
ダメな書き方:
my @lists=grep{$_>5}@number_lists;
よい書き方:
my @lists = grep { $_ > 5 } @number_lists;
この本をよく読んで人にやさしいプログラマーになろうと思います。
オライリー・ジャパン (2006/08/24)
投稿者 nitoka : 10:54 AM | コメント (0) | トラックバック
August 02, 2006
Template Toolkitのインストール
会社のFreeBSDサーバーにTemplate Toolkit(v1.5)をインストールしようと試みたのですが、なぜか「make test」でコケる。エラーメッセージには、
t/fileline............ok 8/11FAILED 9: - template text 3 did not match expected
t/fileline............FAILED test 9
Failed 1/11 tests, 90.91% okay
こんなメッセージが出ていたので、Google様に聞いてみたら、解決方法がTemplateToolkitのMLのアーカイブに載ってました。TarBallから展開したソース内にある「t/fileline.t」の記述が一部間違っている模様なので、書いてあると通りに修正して「make test」したらうまくいきました。
投稿者 nitoka : 01:48 PM | コメント (0) | トラックバック
July 06, 2006
Net::Deliciousの使い方
CPANモジュールの使い方のまとめ。タグを一覧取得する。
my $del = Net::Delicious->new({ user => $user, pswd => $pass });
my @tags = $del->tags();
foreach (@tags) {
my $ss = $_->tag();
$ss = encode("UTF-8", $ss); #日本語タグの文字化け対策
my $ss_enc = uri_escape($ss);
my $url = "http://del.icio.us/$user/$ss_enc";
print "url:$url,dics:$ss\n";
}
Bookmark一覧を取得する(タグで絞込み)
my $del = Net::Delicious->new({ user => $user, pswd => $pass });
my @posts = $del->recent_posts({tag => 'perl'});
foreach ( @posts ){
print "url:$_->href,dics:$_->description\n";
}
Ajaxなデモページも作ってみました。
Demo
投稿者 nitoka : 04:40 PM | コメント (0) | トラックバック
February 18, 2006
AjaxでDeliciousタグ一覧を取得
この間、Deliciousタグ一覧を生成するプラグインを作成しましたが、一つ問題がありました。
それは、MTでインデックスを再生成しないとDeliciousの更新情報が反映されないという問題で、コレをなくすために新規にDeliciousタグを取得・出力するCGIを作成し、Ajaxを使ってその情報を受け取って表示させるようにしました。
Ajaxの処理はprototype.jsを使って実装してみました。
時間ができたらFlickr版も作る予定。
read more "AjaxでDeliciousタグ一覧を取得"
投稿者 nitoka : 06:22 PM | コメント (0) | トラックバック
January 31, 2006
perlで多重ソート(sort関数)
SQLでは、多重ソートしたい場合、
order by date ,key
こんな感じてできると思いますが、テキストファイルの処理(たとえばCSVファイルの処理とか)の場合はSQLがつかえないので(DBI関連のモジュールでCSVをSQLで問い合わせることができるのがあった気がしますが)、sort関数をつかいます。
で、多重ソートをしたい場合は、こんな感じにすると期待した結果になります。
@args = sort {$b->{date} cmp $a->{date}
or $b->{key} <=> $a->{key} } @args;
投稿者 nitoka : 07:26 PM | コメント (0) | トラックバック
November 23, 2005
Perl & XML
MTで使用していることもあって、ちょっと本格的にPerl+XMLを学習し始めました。教科書はもちろんOreillyです。
まだパラパラと読め始めたばかりですが、入門書としてはなかなかよさそうです。
投稿者 nitoka : 11:51 AM | コメント (0) | トラックバック
November 10, 2005
グチ
他人が作ったプログラムってなんで、わかりづらいんでしょう?
特に、初級のCGIの入門書なんかで勉強したなんちゃってプログラマーの作ったプログラムは本当にメンテしづらいです。
デザインとプログラムが分かれていないし、use strict してないから「my $変数名」で変数宣言してないし、グローバル変数を使いまくりでちょっと関数を変更すると動かなくなるし、クラスを使わないから、突如として聞いたこともない関数名が出てくるし・・・
あげればきりがありませんよ。
なんでたかがフォームの入力項目一つ追加するのに、こんなにPGを修正する必要があるんですか?
クラス使ってよ。CPAN使えよ。テンプレートエンジン使ってHTMLとPGを切り離してくれよ。
世の中には僕なんかよりずっとずっと優秀なプログラマーはたくさんいますが、それよりもたくさんなんちゃってな人もたくさんいるのです。
運良く僕は日本でも最高レベルのプログラマーの方々と少し仕事をしたことがあるので、ソースの質の良し悪し足多少がわかるから本当に腹が立ちます。
本当になんちゃってプログラマーの皆さん、Oreilly本を読んで基礎からキチンと勉強してください。
僕は前職のプログラマーさんから言われましたよ、「日本人が書いたPerlの本は買うな。Oreilly本を買いなさい」と。
投稿者 nitoka : 01:14 AM | コメント (0) | トラックバック
November 07, 2005
PerlでSWF生成(SWF::Builder)
SWFを生成する面白いCPANモジュールを発見しました。サンプルソースはこんな感じ。
use SWF::Builder;
my $movie = SWF::Builder->new
( FrameRate => 15,
FrameSize => [0, 0, 400, 400],
BackgroundColor => 'ffffff'
);
my $shape = $movie->new_shape # red triangle.
->fillstyle('ff0000')
->linestyle(1, '000000')
->moveto(0,-11)
->lineto(10,6)
->lineto(-10,6)
->lineto(0,-11);
my $font = $movie->new_font('msgothic.ttc');
my $text = $movie->new_static_text($font)
->size(20)
->color('000000')
->text("hello world!")
->place;
my $instance = $shape->place;
for (my $x = 0; $x < 400; $x++) {
$instance->rotate(15)->moveto($x,200);
}
$movie->save('test.swf');
出力されるSWFはコレ微妙です。このモジュールを使いこなせるようになるより、Flashを使いこなせるようになるほうが確実に手っ取り早いです。
でも、ちょっと何かで使いたい。投稿者 nitoka : 10:38 PM | コメント (0) | トラックバック
October 26, 2005
GPSの計測
携帯で撮影した写真のGPS情報を計測するプログラムを作ってみました。
http://www.nitoka.net/search_gps/search.html
投稿者 nitoka : 12:55 AM | コメント (0) | トラックバック
October 16, 2005
DBI
DBがらみの案件はお手軽にできるので、これまではPHPで開発していたのですが、
Perlのすばらしさを知ってしまったわたくしは、初のPerl+MySQLの環境で開発することにしました。
PerlでDBの処理をするといえば、やはりDBIモジュール(まあ本当はClass::DBIなんだろうが敷居がたかそうだったので・・・)。
CPANのマニュアルなんかもあるのですが、O’reillyマニアなので「入門Perl DBI」を買ってサンプルソースを見ながら開発を進めています。
投稿者 nitoka : 05:40 PM | コメント (0) | トラックバック
October 14, 2005
HTML::Template
Perlで開発をする際、必ず使っているお気に入りのCPANモジュールのひとつであるHTML::Template。自分の中では、「結構使いこなしているぜ。」と思っていたのですがあまかったです。まだまだ奥深かった、というかCPANドキュメントをちゃんと見てなかった。
それは、入力フォームで入力された値を次の確認画面で表示させる際に、これまでは
my $template = HTML::Template->new(filename => $html);
$template->param(key => param('key') );
$template->param(date => param(date') );
$template->param(text => param(text') );
こんな感じにわざわざPOSTされたデータをすべて指定してあげていたのですが、associate をつかえばもっとシンプルにできたのですね・・・
my $query = new CGI;
my $template = HTML::Template->new(filename => $html,
associate => $query);
今までなんて無駄な処理を書いていたのだろう。やはりCPANドキュメントは全部きちんと読んでおく必要があると再認識されました。
投稿者 nitoka : 10:06 AM | コメント (0) | トラックバック
October 12, 2005
ImageMagick
とある案件でImageMagickを使って画像をぼかして表示させたいという要望があったので、ちょっとサンプルプログラムを作ってみました。画像をリサイズしたりするのは昔やったことがあったのですが、ぼかし処理は初めてだったので、ちょっと苦戦。
以下はソース、
#!/usr/bin/perl
use Image::Magick;
use CGI qw(url_param);
$infile = "test.jpg";
$param = url_param("f");
$i = Image::Magick->new;
$i->Read($infile);
$i->Blur($param);
print "Content-type: image/gif\n\n";
binmode(STDOUT);
$i->Write("jpeg:-");
exit;
参考URL:convertコマンドの日本語ドキュメント(サンプル画像付でわかりやすい)
http://hashi4.civil.tohoku.ac.jp/soft/node43.html
CPANのImage::Magickのドキュメント(サンプルが少ないのでちょっとわかりづらい)
http://search.cpan.org/~jcristy/PerlMagick-6.24/Magick.pm
