FileHandleとIO::Fileのどちらを使うべきなのか悩んだ

perlのモジュールで悩んでみた。

オブジェクト指向を覚えてからはFileHandleモジュールを使うようにしている。今までソース読んだりして参考にしてきたモジュールが結構使っているからというのが理由なんだけど。

ただ、続初めてのperlとかはIO::File使ってるので、以前からIO::FileとFileHandleのどちらを使うのがいいのか疑問だったんだよね。

ググれば、なんかでてくると思ったんだが、それっぽい比較がでてこない。

おかしいなぁと思ってドキュメント読んだら

だって。

今まで通りFileHandleを使うことにした。

perlの次に習得するのはrubyかpythonか?

Should I Learn Python or Ruby next? (by Jeremy Zawodny)

I've been programming (when I do program) mainly in Perl for the last 10 years or so. But I've been itching to learn a new language for a while now, and the two near the top of the list are Ruby and Python.

僕は、会社にはpython本を、家にはrubyの本を置いてる。仕事として科学技術計算をするのにはpythonはいいなぁと思う。Rとの連携もいいし。でも、家での楽しみとか、興味としてのプログラミングの考え方を追求するにはrubyはchemrubyが身近な題材としてちょうどよかったので。

まぁ、最近はhaskellが面白いんですが。

モナドで躓く

ふつうのHaskellプログラミングも、とうとう11章へ。中盤も佳境をむかえております。

ProductName ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
青木 峰郎
ソフトバンククリエイティブ / ?円 ( 2006-06-01 )


モナドが~~

わかりません、さっぱり。他の言語での例があったので少し読んでみた。

檜山正幸のキマイラ飼育記 - 世界で一番か二番くらいにやさしい「モナド入門」

振り返れば我々は; 関数から副作用を取り除き(汚れ作業はCountupMainに押しつけ)、代わりに戻り値に副作用の意図を詰め込み、それによって失われた関数結合の自由さを関数の拡張により取り戻しました。

javascriptもperlのコードもなんとなくわかったような気にはなったんだけど、ふつうのHaskellプログラミングに戻ると混乱してしまうヨ。

週末にでも幾つかコードを書いてみてよく考えることにしよう。

http://del.icio.us/kzfm/haskell

Lightboxを使ってみた

Lightbox JSを触ってみた。やっぱいい感じ。でも右下にcloseのアイコンとか出るはずなのに出なかったりするのは、cssの設定が悪いのかな。

yuki hana

lightbox用に小さい画像と、大きい画像(クリックしたときに表示される画像)の二つを用意しないといけないが、この作業を、いちち手でやるのは面倒だということで、windowsでperlスクリプトを ドラッグドロップ化したのでお手軽になった。でもユッキー様をあやしながら書いたのでスクリプトはやっつけ。名前考えるのが面倒というありがちな理由で、とりあえずプロセス番号がファイル名で且つCドライブに吐き出すようにしておいた。

use strict;
use Image::Magick;

### image size
my $width = 480;
my $height = 360;
my $width_small = 160;
my $height_small = 120;

my $imgfile = shift or die "couldn't read ImageFile\n"; 
$imgfile =~ /\\(\w+).(jpg|JPG)$/;
my $filename = $1;

### output
#my $output = "C:/" . $filename .".jpg";
#my $output_small = "C:/" . $filename ."_small.jpg";
my $output = "C:/".$$.".jpg";
my $output_small = "C:/".$$."_small.jpg";

my $image = Image::Magick->new;
$image->Read($imgfile);
$image->Resize(width=>$width, height=>$height, blur=>0.8);
$image->Set(quality=>60);
$image->Write($output);

$image->Resize(width=>$width_small, height=>$height_small);
$image->Write($output_small);

undef $image;
exit;

ちなみに、Image::Magickモジュールのインストールは楽だった。imagemagickをインストールする際に「perlでモジュールとして使う」にチェックを入れるだけ。

実際は、もうちょっとちゃんと書いて、サーバーにftpしつつ、アップロードした画像をlightboxで扱うためのhtmlを吐き出すコードまで書いておけば申し分ないな。

いつも使っている画像アップロード用CGIをいじるという選択肢もあったんだけど、ドロップレット風味で実用っぽいものをひとつくらい作ってみたかったので今回はWindowsプログラミング。

他には実際にやってみて思ったのは、縮小画像を載せるんじゃなくて画像を切り取りつつ、小さくしたものをアイコン的に表示させておくほうがいいなと思った。単なる拡大縮小じゃつまらん。とか考えると、gimp使ったほうがいいのか?

いやいや、これを敢えてCGI+javascriptでやるべきでしょう

みたいな禅問答のはじまりだ。手段が目的化しつつあることにはうすうす気付いているけどネ。

ドラッグ&ドロップできるperlスクリプト(Windows)

lightbox用に画像を手軽にリサイズするツールは作れないかと思ったところ、ドロップレットというものがあることを知った。

確かに、画像のサイズ変換とかちょっとした作業をドロップレットみたいにドラッグ&ドロップでできるツールで行なうと便利だ、そして、さらにperlスクリプトをドロップレットに出来たらもっとよい。MacだとできるっぽいんだけどWinだとあまり情報がなかった。

http://del.icio.us/kzfm/gui

PerlTkでいけるかなと思ってたんだけど引数の渡し方とかちょっとわからん。他にもWin32::GUIとかThe GUI Loftとかもあったんだけど、、、、

色々調べて、ドラッグで引数渡したいだけならbat書けばいいということを知って、それで対応することにした。

結局、ドラッグできるperlスクリプトではないが(細かいことは気にしない)

batは単純に引数を渡すためだけの必要最低限、、というか書き方よくわかってない。アイコン変えたりとかDOSプロンプト出さないといったこともできるのかな?

@ECHO OFF

c:\test.pl %1

perlはこんな感じでサンプルを。流れでWin32GUIを入れたので、テストに使ってみた。

use Win32;

my $mess = shift; 
MsgBox("Test", $mess, 48);

sub MsgBox {
    my ($caption, $message, $icon_buttons) = @_;
    my @return = qw/- Ok Cancel Abort Retry Ignore Yes No/;
    my $result = Win32::MsgBox($message, $icon_buttons, $caption);
    return $return[$result];
}

test.batにドラッグドロップすると、windowが開いてドラッグしたファイルのパスが表示される。あとはこれをperlmagickで画像のリサイズするスクリプトを書けばOK。リサイズしてftpでblosxom用の画像ディレクトリに送るとこまでをドロップレットにすれば使いやすくなるかな。

sewってのもあった。あとunix magazineにもまんまな記事があったらしいんだけどバックナンバーがない。

perlで高階関数とカリー化

先週は電車通勤+歩きで仕事場を行き来したので、電車の中で、英語漬けで英語のトレーニングしてみたり、普通のHaskellプログラミング読んだりと、電車通勤はなかなか有意義なことに気付かされた。特に普通のHaskellプログラミングは第一部を読み終えたことで、高階関数変数の束縛というものがわかったような気がした?

、、、、したのかどうかまだよくわからんので、自分の理解力を認識するために少し書いてみた。

まず、言葉の定義を。

  • 変数の束縛
  • (例えば)関数という値があり、それが変数名を束縛している
  • 高階関数
  • 関数を返したり引数にとったりする関数
  • 変数が関数に束縛されているから、関数を変数として扱うことが出来る?
  • それとも関数を変数として扱うことことが出来れば高階関数はつくれるのか?

perlでも変数を束縛することが出来れば高階関数など扱えるのかなと。クロージャ使えってことか?と思って調べて見ると面白そうなのが。

(って全部一度は見たことあるじゃん。でもワカンネとか言って放り出した気が、、、、)

ぱるも日記ではカリー関数を作る例が示されていたが、関数を返す高階関数の例ですな。カリー化に関しては、これなど面白かった。

torus solutions!は僕がblosxomをいじくるときにかなり参考にさせてもらったサイトです。

XML を Perl の高階関数で。 : torus solutions!

XML::LibXML で XML を作るときに、 いちいち createElement とか appendChild とか書くのに飽きてきたので、 高階関数版を作ってみた。
これも、関数を返すといってよいのでしょう。

関数を引数にとる高階関数をperlで書けるのだろうか?というのが気になるところだが、関数のリファレンスを引数にとる関数を書けばいいのかなと思ってこれまた調べてみた。

ここまでの関数を返す関数とか関数を引数にとる関数を考えると、perlでの(関数による)変数の束縛ってのは、関数のリファレンスを変数として扱うことでなされると考えてよいのかな。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 5692円 ( 2005-03-28 )


Higher-order Perlも気になる

Inline::Java

Inline::Javaおもろい。毎度コンパイルするので気持ち遅いが、Javaのコード扱えるのは便利。

正直Java使う必要あんの?と問われると

ケモインフォでは必要、それはCDKがあるからダ

化合物の二次元座標の発生なんかはPerlMolはまだまだだし、ChemRubyもサポートしとらん。というわけで、smi2molをやるにはCDKがいいし、構造の画像変換も楽。

という経緯もあってpythonのjava実装であるjythonなどに心惹かれた事もあったが、SWIG,XSとなにやら、グルーなノリで、Inline::Javaの方向で試してみることにしたヨ。モジュール化しとけば、Javaを気にせず使いまわせるし。クイックハックにちょうどいい。

さらに、Inline::Rubyも試してみたいし、、、、、

でも、結局Inlineなんだよなぁ

JavaでもRubyでもある程度のコード書けないとあかんのよね。

そういうわけで、ChemRubyの作者の方に教えてもらったプログラミングRubyなども読み読みせなあかん。今のとこ3章で止まってるナァ。

ProductName プログラミングRuby―達人プログラマーガイド
デビット トーマス
ピアソンエデュケーション / ?円 ( 2001-09 )


でも、Ruby学ぶと絶対Railsにはしりたくなっちゃう。

悩みは尽きない。

初めてのXS

SWIGついでにXSも。YAPCでDaisuke MakiさんのGetting Your Feet Wet With XSを聴いてから、一度やりたいと思ってたんだけど、最後のほうわかんなかったんだよね、SVとかからあやしくなってベンチマークでまたついていけるようになったという(実は)。

というわけで、相変わらず、実用Perlプログラミング初版を片手に。20章はperlの内部構造で、60ページぐらい割いてます。XSの説明とか書いてあるけど、まだちゃんと読んでないけど、HVとかAVとかSVとか詳しく書いてある(第二版にはないヨ)。

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


というわけで、mandel.cとmandel.hはSWIGで使ったソースを。

$ h2xs -x -n FractalXS mandel.h
Defaulting to backwards compatibility with perl 5.8.3
If you intend this module to be compatible with earlier perl versions, please
specify a minimum perl version with the -b option.

C::Scan required if you use -x option.
To install C::Scan, execute
   perl -MCPAN -e "install C::Scan"

C::Scanをインストールして再度。

作成されたMakefile.PLを少し修正、LIBSに-lgdを付加するのと、OBJECTにmandel.oとFractal.oを。

あとはmake,make test,make installで。

Smart::Comments

perl hacks読んでたらHack #54:Debug with comments Smart::Commentsが便利そう。

と思ったら、Elementaryエントリになってたヨ。

perl hacksには書いてないけどElementaryで紹介されてた

プログレスバーいい!

初心者気味の他人のコードのデバッグすんのにDebug::EchoMessageすすめるんだけど、プリントデバッグみたいじゃないのでいまいち浸透しない。(あと、Debug::EchoMessageは標準じゃなかったはずなので、モジュールインストールしてないマシンだとエラー吐くし。)

Smart::Commentsだったら、

プリントデバッグした残骸を###付けて残しとけヨ

って指示するだけで、use Smart::Commentsしてなくても、

とかやるだけで、デバッグできるし、ループの部分に

### [===>   ] % done

とか入れるといい感じになるので、面倒見られるほうも見るほうも効率的かなぁ?

ProductName Perl Hacks: Tips & Tools for Programming, Debugging, And Surviving
Damian Conway
Oreilly & Associates Inc / 2303円 ( 2006-05-30 )


というわけで、職場に浸透するかどうか試してみよう。

Perl Hacks届いた

アマゾンで予約してたPerl Hacksが届いた。

ProductName Perl Hacks: Tips & Tools for Programming, Debugging, And Surviving
Damian Conway
Oreilly & Associates Inc / 2303円 ( 2006-05-30 )


パラパラめくった感じではハック満載って感じ。

うそです、ほんとはよくわからん。明日、じっくり読んでみるヨ