読者です 読者をやめる 読者になる 読者になる

Perl日記

PerlとかRubyとかPHPとかPythonとか

二重引用符中の認識されないエスケープシーケンス

二重引用符(ダブルクオート)の中にバックスラッシュを置くとき、 「\n」とか「\t」とかのエスケープシーケンスは展開されるけれど、 「\j」のような言語が認識できないようなものがどうなるか、言語間で差が出たのでメモ。 Perl print "$]\n"; print "\j\n…

PerlでPDFに他のPDFのページを差し込む

http://r9.hateblo.jp/entry/20120513/p1ScanSnapでスキャンしたPDFをページごとに回転する - Perl日記r9.hateblo.jpの続き。(もう3年も前だ) 本体PDFに表紙PDFのページを差し込む 漫画の単行本をスキャンして自炊するときには、白黒の本体部分と、カラー…

キャプチャした$1はもう一回m||すると消える

久しぶりPerl書いたらハマったのでメモ。こんな仕様だったか。 my $str = "hoge123fuga"; # 123をキャプチャ $str =~ m|hoge(\d+)fuga|; warn $1; # 括弧使わないで正規表現マッチ $str =~ m|hoge|; warn $1; # さっきの$1は消える 123 at - line 5. Warning…

carton execでGetopt::Long

自分もメモ。 コマンド実行時に「--」で明確に引数の終わりを示さないと、carton上のGetopt::Longが動かなかった。 # hoge.pl use Getopt::Long; my $verbose = ''; GetOptions ('verbose' => \$verbose); print "verbose: $verbose\n"; $ carton exec perl …

Perl勉強会で話した

3/8 18:40から約2時間、自分含め7人くらいで、Perlについて語り合った。いいね! 前回と違い、何も準備しなかったのがよかった 最初に内容を固定してしまうと、どうしてもそれに沿った内容を意識してしまって、柔軟性がなくなるからかな 参加者同士の質疑…

Redmine-Chanに「いつやるのか?」「いまでしょ!」機能を追加した

Redmine::Chan で IRC からプロジェクト管理を見て使わせていただいております。 https://github.com/onishi/Redmine-Chan 空前の「いまでしょ!」ブーム(職場限定)なので、minechanにもこのビッグウェーブに乗ってもらうことにしました。 優先度をMAXにして…

Commandパターン

CommandパターンをPerlでやってみた。 https://github.com/rightgo09/perl-headfirst-designpattern/tree/master/command/undo インターフェースとなるCommandクラスでexecute()とundo()を宣言する Commandクラスを具象化したクラスで上述の2つのメソッドを…

取置きとstateとMooseX::Singletonベンチマークした

Singletonパターンの前に、以前覚えたstateって最適化されて速いのかなとベンチマークしてみた。 myで外側にするのとMooseX::Singletonを比較に。 MooseX::Singletonが多機能っぽい分不利かなーとは思ってた。 20倍か。 MooseX::Singletonを外して比較。 Ben…

Stateパターン

Strategyパターンの双子であるところのStateパターンをPerlでやってみた。 本で読んだだけだとピンと来なかったけど、実際に手で書いてみると確かにやっていることは同じだった。 https://github.com/rightgo09/perl-headfirst-designpattern/tree/master/st…

Strategyパターン

読んでる。 Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本作者: Eric Freeman,Elisabeth Freeman,Kathy Sierra,Bert Bates,佐藤直生(監訳),木下哲也,有限会社福龍興業出版社/メーカー: オライリージャパン発売日: 2005/12/02メディ…

RubyistのためのPerlを書いてみてる話

Perl->Rubyと経験して、「Rubyを知っているけどPerlを知らないひと向け」のPerl資料を書いてみている。 https://github.com/rightgo09/Perl-for-Rubyist/blob/master/README.md まあもう少し書いてみよう。 ブラウザで簡単に書けるのが面白い。

Test::Specその3

they 単なるitのエイリアス 複数形の言い回しに向いてる xdescribe/xcontext/xit/xthey それぞれdescribe/context/itの代わりに使う 要はpending扱いにしてくれる TODOラベルを貼る必要がない spec_helper 各テストファイルで共通のものを書いておいて、spec…

Test::Specその2

元ネタ「RSpec の入門とその一歩先へ、第2イテレーション - t-wadaの日記」「RSpec の入門とその一歩先へ、第3イテレーション - t-wadaの日記」 第2、第3イテレーションも見ておく describeに説明を追加 describeの引数は2つが限界なので、文字列にして説…

Test::Spec入門

元ネタ「RSpec の入門とその一歩先へ - t-wadaの日記」第一イテレーション。 PerlのTest::Specだとどうなるかやってみた。 message_filter_spec.t Perlのテストファイルの拡張子は*.t RSpecっぽくするために、*_spec.tにする とりあえずテストファイルをt/に…

日本語クラス名でClass::Accessorを使えるのは5.16からという話

試行メモ。 Perlはかなり前からuse utf8すれば、日本語(マルチバイト)をクラス名とか変数名とかに使えるけれど、 クラス名を日本語にして、use Class::Accessor(::Fast)すると、 5.14系ではエラーになるけど、5.16系では大丈夫だった。 ちなみにClass::Acces…

先日の勉強会の問題をPerlで解いた

出題された問題↓ http://mizti.hatenablog.com/entry/2013/01/26/011841作ったもの↓ https://github.com/rightgo09/crazy_gin 安直に全パターン網羅しようとすると絶賛爆死するので、アルゴリズムってやっぱり大事だなーと思った。 あと、初めてstateを使え…

eachの途中で止めると再開が途中からになる話

Rubyのeach_with_indexは添字と要素が一度に取れるのでとても便利なときがある。 Perlで同じことをするには、5.12までは、ループ外に変数を置いて、ループ内でインクリメントするのが一般的だったけれど 5.12からはeach()が配列に対しても使えるようになって…

Redmine-Chan使ってます

http://yapcasia.org/2012/talk/show/7b6375aa-bd29-11e1-ad51-b39f6aeab6a4https://github.com/onishi/Redmine-Chanfork https://github.com/rightgo09/Redmine-Chan IRCでチケット作成、更新、参照ができるととても捗ってよいです! AnyEvent::IRCとかも勉…

Rubyのクラス変数と同じ動きにはClass::Data::Inheritableを使う

まー基本的にはクラス変数使わずにインスタンス変数でなんとかするのですが、メモ。 言語のクラス変数は違うはなし - Perl日記 の続き。Rubyだと、 class Hoge @@hoge = 'hoge!!!' end class Fuga < Hoge def hoge @@hoge end end puts Fuga.new.hoge #=> 'h…

「RubyistのためのPerl」で発表した

毎週末の(Rubyメインの)勉強会で 「RubyistのためのPerl」というタイトルで90分くらい喋った。のどが疲れた。 発表資料 http://dl.dropbox.com/u/9152456/perl_for_rubyist/slide.html こういう発表みたいなのしたことなかったから勝手が分からなかった スラ…

livedoorブログの画像まとめからダウンロードするスクリプト書いた

https://github.com/rightgo09/p5-livedoorblog-pict-downloaderとりあえずMac用。$ENV{HOME}/Pictures に保存する。 carton用のファイルがもっと簡単に書けたらいいな。 Gemfileみたいな。

Perlの世代格差を感じた話

昨日ローカルな勉強会に参加してきた。 初回だったので、簡単なペアプロをすることになったのはいいものの、僕ともうひとかたのペアだけPerlであとのペアはRubyで実装ということになった。イエ-Perlで実装だぜーと思ってたけれど、以下の理由により、いろいろ…

2ch画像スレ風画像ビューア「Gazosure」作った

https://github.com/rightgo09/Gazosureデフォルトで、config/deployment.plに 'BASE_DIRECTORY' => File::Spec->catdir($ENV{'HOME'}, 'Pictures'), ってしてある。Mac用。startupで起動して http://localhost:9091/ にアクセス。こんな感じ。

Perlのいいところについて考えてみた。

変数 シジル(ファニー文字)で大体分かる 特殊変数も例に漏れない $ならスカラ変数 ->ならデリファレンスかメソッド(サブルーチン) @とか[]なら配列 %とか{}ならハッシュ &とか()ならサブルーチン ついてなくて小文字ならサブルーチン 大文字なら定数かファイ…

substrの開始番号

ハマったのでメモ。 Perlのsubstrは substr(文字,開始位置,長さ) の開始位置は0オリジンで、 SQLのsubstrも同じく SUBSTR(文字,開始位置,長さ) と同じ使い方ができるが、1オリジンである。 Perl print substr('string!!!', 2, 1); #=> 'r' SQL -- MySQL SELE…

podは式をぶったぎる(コードは死ぬ)

よくpackageの途中で改行されてるのを見る。 Try::Tiny package # hide from PAUSE Try::Tiny::ScopeGuard; でもこれをpod形式でぶったぎると死ぬ。つまりトークンとトークンの間。 package =pod hide from PAUSE =cut My::Module; Invalid version format (…

どこまで分割する?

「PerlのWebプログラミング効率化のTips」を読んだ感想 - サンプルコードによるPerl入門 http://d.hatena.ne.jp/perlcodesample/20120609/1339246531 短くて再利用性がなく、細かくしてもメリットがないような処理は、処理2のように直接書いてしまっても良い…

()の中に何かいる

一度勉強した覚えがあるけど忘れてたので、プログラミングPerlを参照したメモ。 $x = (7, 7, 7); #=> 7 $x = () = (7, 7, 7); #=> 3 <6/8追記> $x = (7, 7, 7); #=> 3 となっていたのは誤りです! @akajiro thanks! </追記>下はなぜ3なんだろう? プロ…

Amon2にStreaming機能をつけようとした話

PSGIのStreamingなやり方がわかったので、一番触ってたAmon2でもできないかと思ってforkして書いてpull requestまでしてみた。 イメージとしては、 any '/' => sub { my ($c) = @_; $c->render('index.tt'); }; といういつものスタイルを壊さないような感じ…

Perlのバージョン毎のqr//速度

久しぶりにモダパー読み直してたらqr//と文字列の正規表現マッチ速度が出てたので、新しい5.16とかも出てきてるし、やってみた。 Mac OS X 10.7.4 (Intel Core i7) perl-5.8.9 perl-5.10.1 perl-5.12.4 perl-5.14.2 perl-5.16.0 perl-5.17.0 use strict; use…

サブルーチンプロトタイプ(&)にしたらサブルーチンを渡せと怒られた

いや渡したんですどね。 サブルーチンプロトタイプ(&)を定義してるサブルーチンに 無名サブルーチンを変数に入れて渡したら怒られたんですよ。 use strict; use warnings; use utf8; sub run(&@) { my ($cb, @list) = @_; @list = map ++$_, @list; $cb->(@l…

shift,shiftの罠

おやと思ったのでメモ。 sub point { my $x = shift; my $y = shift; ... } point(20, 30); #=> $x = 20, $y = 30 これはいい。 sub point { my ($x, $y) = (shift, shift); ... } point(20, 30); #=> $x = 20, $y = 30 これもまだわかる。 sub run { shift-…

なんでもPSGIで考えるのはやめようという話【5/25追記しました】

昔作ったCGIでこんなのがあった。(あの頃は若かった) #!/usr/bin/perl use Furl; my $furl = Furl->new; use CGI; print CGI->header; print "<html>\n"; print "<head>\n"; print "<title>image</title>\n"; print "</head>\n"; print "<body>\n"; for my $i (1..10) { # 画像ファイル名 $image_fi</body></html>…

__PACKAGE__::hoge()は間違い

タイトルで終わった。 __PACKAGE__->hoge()の__PACKAGE__はコンパイラがカレントパッケージ名に置換してくれるけれど、 「::」をつかって完全修飾でサブルーチンを呼ぶと__PACKAGE__::hoge()の左側は「__PACKAGE__」というパッケージ名ととられるのでエラー…

ScanSnapでスキャンしたPDFをページごとに回転する

ScanSnapを使ってコミックスをスキャンしてPDFにしている。 縦に紙をセットするよりも、横にした方がスキャンが早く終わるのでそうしているけれど、 そうするとPDFが横向きになって、向きも表裏でばらばらになる。 ScanSnapを買うとAdobe Reader Professiona…

UNITCHECKと他復習

Perl5.10からBEGIN、CHECK、INIT、ENDの特別ブロックにUNITCHECKが追加されていたのを昨日知ったのでメモ。 あとそのほかまとめ復習。 perlmodにあったのを並び替えてみた。 #!/usr/bin/env perl # use 5.010; # begincheck BEGIN { print " 1. BEGIN blocks…

読み込んだモジュールを全削除するClass::Unload::Allというのを書いてみた

前回の若干続き。 @aloelightさんからClass::Unloadなるものがあることを教えてもらった。 http://search.cpan.org/~ilmari/Class-Unload-0.07/lib/Class/Unload.pm podに use Class::Unload; use Class::Inspector; use Some::Class; Class::Unload->unload…

別の場所で読み込んだモジュールが他でも無条件に使えるのはイヤなところである

まあPerlに限らずなんだけど。 Cacooで画像作ってみた。 ここでB.pmはCに関してまったく無関係のはずなんだけど、実際にはCパッケージの関数を使用できる。 どうも他人の庭の道具を無断使用しているみたいで気持ち悪い。 このへんも完全にスコープ切り分けで…

Text::Hamlの実行コードをキャッシュして高速化した話

Text::Haml - search.cpan.org Perl版HamlのText::Hamlだが毎回$haml->render_fileで 構文解析→出力用package作成→出力用サブルーチン実行 という手順を踏んでいるので、Hamlファイルが大きくなればなるほど、 実行速度がどんどん遅くなっていやだなーと思っ…

ごく一部の頭のいいアホにしか読めない文章のつくりかた

$str =~ tr/TIESAO/713540/; ごく一部の頭のいいアホにしか読めないらしい on Twitpic

コンパイル時にリテラルだと最適化してくれる組み込み関数

length('rightgo09')みたいにすると、コンパイルの時点で9にしてくれていることを知った。 my $len = length('rightgo09'); $ perl -MO=Deparse len.pl my $len = 9; len.pl syntax OK演算結果なんかはしていると聞いてたけど、関数でもなるのかーへーと思っ…

printとstatでつまづいた話

statの挙動なんだっけーと思いつつ以下のようにしたらエラーになった。 $ perl -le 'print (stat("test.pl"))[9]' syntax error at -e line 1, near ")[" え、statは配列を返すからそのスライスってことであってるでしょーと文句を言いたくなったけれど、 右…

Text::Hamlでできること、できないこと

RubyのHamlのつもりでPerlのText::Hamlを使うとつまづいてしまうメモ。 http://search.cpan.org/~vti/Text-Haml-0.990104/lib/Text/Haml.pm インデントは半角スペースのみ インデントにタブは使用できず、常に半角スペースでインデントしないとだめ。 いきな…

Mo.pmを読んだ

こんばんは。 面白そうだったのでMoを読んでみた。 http://search.cpan.org/~ingy/Mo-0.30/lib/Mo.pod Moとは Moose is huge. Moose led to Mouse led to Moo led to Mo. M is nothing. Mo is more. Not much.Moose、Mouse、Mooからできたlessなやつ。 VERSI…

SUPERは@ISAを探ってくれてるわけではない

これが動かなかったので調べたメモ。 strictはなしで。 *{"Foo::aiueo"} = sub { print "aiueo.\n" }; # Fooクラスのaiueoメソッド *{"Bar::new"} = sub { bless {}, "Bar" }; # Barクラスのコンストラクタ push @Bar::ISA, "Foo"; # BarはFooを継承 *{"Bar:…

"package"の代わりに"class"を使うclass.pm作った

再発明かな。 use strict; use warnings; use class; class "Foo" => ( bar => sub { my $self = shift; if (@_) { $self->{bar} = shift; } $self->{bar}; }, ); my $foo = Foo->new(bar => 'baz'); print $foo->bar, "\n"; #=> 'baz' $foo->bar('hoge'); p…

マスタデータを取り扱う

DBに入れるまでもないマスタデータをアプリケーションで取り扱うときの最近やってること。 DBに入れないからといって、設定ファイルには相応しくないデータ。 ハッシュで入れるだけだと、たとえばそのデータでセレクトボックスを作るときに取り出し順が保証…

評価の+は何個つけてもよい

適当にやってたら動いてびっくりしたのでメモ。 よくある評価用の+は無名ハッシュのあれである。 sub foo { +{ bar => 'baz' } } この+は++にしない限り何個でも置ける。 sub foo { + + + + + +{ bar => 'baz' } } ところで、数値の正負を逆にしたいとき…

Teng::Schema::Loaderを使ったらTengオブジェクトが返るので

その後Teng->newする必要なかった。 0.14から0.14_01での変更点みたい。 以下Amon2での使用の例。 MyApp.pm use Teng; use Teng::Schema::Loader; use Test::DB; my $schema; sub db { my $self = shift; if ( !defined $self->{db} ) { my $conf = $self->c…

Digest::SHAはマルチバイト文字列でも大丈夫だけどDigest::MD5だとエラーになる

同じDigest::*だと思ったら大間違いという話。 -MDigest::SHA=sha512_hexだと use Digest::SHA qw/ sha512_hex /; use utf8; use Encode qw/ encode_utf8 /; print sha512_hex("あいうえお"),"\n"; #=> ed8ad6b03b7cb459... print sha512_hex(encode_utf8("…