Perlの小ネタ集

備忘録。単独記事に書くまでもない小ネタ。


Perl 5.10で追加された予約語(“say”、“given ~ when”、“state”)などをワンライナーで使うときは“-e”の代わりに“-E”を使う。

$ perl -E 'say "Hello, World!"'
Hello, World!

Perl 5.8だか5.10だかわからんときは、“-l”オプションを付けておくとprintsayに変身するので便利。

$ perl -le 'print "Hello, World!"'
Hello, World!

スクリプトの一行目(shebang)にオプションを書いても良い。

#!/usr/bin/perl -l
print "Hello, World!";

これは「$\ = $/;」を本文に含むことと等価だ。そのため、「$/」特殊変数をいじるオプション(“-0”など)と共に利用するときは順番に注意しないといけない。

$ perl -e '$\ = $/; print "Hello, World!"'
Hello, World!

Continue reading

【Catalyst】HTML::Tidyを使って出力を整形する

いろんなテンプレートをインクルードしまくったせいか生成されるHTMLが非常に汚かったので、HTML::Tidyを使って整形してみた。

HTML::Tidyのインストール

これは前の記事を参照。

【MovableType】Tidy を使って HTML を整形するプラグイン | blog.delphinus.dev
https://blog.delphinus.dev/2010/03/tiding-movabletype.html

簡単に手順だけ書いておく1

$ sudo yum install tidy libtidy libtidy-devel
$ sudo cpan -i P/PE/PETDANCE/HTML-Tidy-1.08.tar.gz

Continue reading

【MovableType】Captcha画像の生成に異様な時間がかかる件について

MT5をFastCGIで動かしているとmt-comments.fcgiによるCaptcha画像の生成に時間がかかりまくり。おまけに一度アクセスしただけでプロセスが際限なく増えていく。ググってもこんな症状見つからなかったんだけど、うちの変態環境(Mac OS X + Perl5.10.1)が原因なのかな?

Apacheのログ

[notice] Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.8l DAV/2 mod_fastcgi/2.4.2 configured -- resuming normal operations
[notice] FastCGI: process manager initialized (pid 23678)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23692)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23724)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23732)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23736)
[warn] FastCGI: (dynamic) server "/pato/to/mt/mt-comments.fcgi" started (pid 23766)
[warn] FastCGI: scheduled the start of the last (dynamic) server "/path/to/mt/mt-comments.fcgi" process: reached dynamicMaxClassProcs (6)
[warn] FastCGI: (dynamic) server "/path/to/mt/mt-comments.fcgi" started (pid 23769)

このログの後、30秒待ってやっとCaptcha画像が表示される。これがなかなか直せないのでずっと悩んでいた。症状は違うものの、Captchaのトラブルとしては定番らしいハックを試してみる。

Continue reading

HTML::Tidyについて追試

先日、
【MovableType】Tidy を使って HTML を整形するプラグイン | blog.delphinus.dev
を書いたが、littlebuddhaさんからうまくインストールできないという話を受けてこちらでも追試。

すると……、あれ?こけた?

$ make test

~省略~

Test Summary Report
-------------------
t/ignore-text.t    (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t/ignore.t         (Wstat: 256 Tests: 7 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
t/levels.t         (Wstat: 256 Tests: 3 Failed: 1)
  Failed test:  3
  Non-zero exit status: 1
Files=20, Tests=80,  1 wallclock secs ( 0.09 usr  0.08 sys +  0.65 cusr  0.16 csys =  0.98 CPU)
Result: FAIL
Failed 3/20 test programs. 3/80 subtests failed.
make: *** [test_dynamic] Error 255

前に試したときはうまくいったと思ったが、どうやら気のせいだったらしい。エラーも訳がわからないので放置していたところ、littlebuddhaさんから更に情報があった

Bug #29593 for HTML-Tidy: [PATCH] fixing coredumps in 1.08

http://rt.cpan.org/Public/Bug/Display.html?id=29593

このパッチを当てると上記のエラーも消え、すんなりインストールが完了した。

Catalyst::Model::Adaptor + TheSchwartz

TheSchwartz.pmCatalyst::Model::AdaptorでModel化して扱う時のメモ。次のURLを参考にして設定を行ったのだが問題発生。

Catalyst::Model::AdaptorでTheSchwartzをModel化 – hide-k.net#blog

http://blog.hide-k.net/archives/2008/02/catalystmodelad_1.php

MyApp::Model::TheSchwartz

package MyApp::Model::TheSchwartz;
use strict;
use warnings;
use base 'Catalyst::Model::Adaptor';

1;

myapp.yml(部分)

Model::TheSchwartz:
    class: "TheSchwartz"
    constructor: "new"
    args:
        databases:
            -
                dsn: "dbi:mysql:myapp_db:localhost:3306"
                user: "ユーザー名"
                pass: "パスワード"

実行しようとすると、

$ sudo /etc/rc.d/init.d/httpd start
httpd を起動中: Syntax error on line 54 of /etc/httpd/conf.d/perl.conf:
Couldn't instantiate component "MyApp::Model::TheSchwartz", "unknown options HASH(0xae3ee38) at /usr/local/lib/perl5/site_perl/5.10.1/Catalyst/Model/Adaptor/Base.pm line 27"Compilation failed in require at (eval 2) line 3.\n
                                                           [失敗]

などというエラーが出てうまくいかないのだ。調べてみると、TheSchwartz->new()に渡す引数で怒られてるらしい。とりあえずTheSchwartz.pmを次のように修正して解決した。

*** /tmp/TheSchwartz.pm.orig    2010-02-18 10:06:45.000000000 +0900
--- /usr/local/lib/perl5/site_perl/5.10.1/TheSchwartz.pm        2010-02-18 10:17:20.000000000 +0900
***************
*** 27,33 ****

  sub new {
      my TheSchwartz $client = shift;
!     my %args = @_;
      $client = fields::new($client) unless ref $client;

      croak "databases must be an arrayref if specified"
--- 27,33 ----

  sub new {
      my TheSchwartz $client = shift;
!     my %args = ref $_[0] ? %{ $_[0] } : @_;
      $client = fields::new($client) unless ref $client;

      croak "databases must be an arrayref if specified"

【MovableType】Tidy を使って HTML を整形するプラグイン

以前、「外部リンクを明示するMovableTypeプラグイン | blog.delphinus.dev」で紹介したプラグインで、MovableType で生成する HTML をちょっとだけ整形してみた。今度は本格的なツールを使ってみよう。

HTML Tidy による整形

HTML Tidy は整形ツールとしては一番著名で強力なツールだ。歴史も古く、最初のバージョンは前世紀まで遡る。

HTML Tidy Project Page
http://tidy.sourceforge.net/

現バージョンの `HTML::Tidy` では tidyp というツールが推奨されているようだ。tidyp を使うならば、後述の `HTML::Tidy` のバージョン違いによるエラーは起こらない。詳しくはこちら。
【Perl】HTML / XML の 整形には tidy“p”? | blog.delphinus.dev

そしてそれを Perl から利用するためのモジュールが HTML::Tidy

HTML::Tidy – search.cpan.org
http://search.cpan.org/~petdance/HTML-Tidy-1.50/lib/HTML/Tidy.pm

更に HTML::Tidy を利用して、MovableType で生成する HTML の整形を行ってくれるのがこれ。

Movable Type Monday: Etelos Partnership, Plugin Development, HTML Tidy, and More | The Blog Herald
http://www.blogherald.com/2009/04/07/movable-type-monday-etelos-partnership-plugin-development-html-tidy-and-more/

3つもインストールしなければならない上、一つ一つがかなり曲者だった(Mac OS X を使っていることが主因なんだけれども)。

Continue reading

【Perl】ユーザーにプロンプトから入力して貰うスクリプト

モジュール「Term::ReadKey」を使うと出来る。これはUnix系OSだけじゃなくてWindows(ActivePerl 5.10.1 build 1007で確認)でも動く。

Term::ReadKey – search.cpan.org

http://search.cpan.org/dist/TermReadKey/ReadKey.pm

例1:文字列を入力して貰う

#!/usr/bin/perl
use Term::ReadKey;
print "type some keys : ";
ReadMode "normal";
chomp( my $line = ReadLine 0 );
print "you typed '$line'\n";

chompしないと最後に改行が付いたままになってしまうので注意。

例2:画面に文字を表示しないで入力

#!/usr/bin/perl
use Term::ReadKey;
print "enter your password : ";
ReadMode "noecho";
chomp( my $line = ReadLine 0 );
ReadMode "restore";
print "\nyou typed '$line'\n";

パスワード入力に使えるだろう。

例3:1文字だけ受け付ける(選択肢を選んで貰う)

#!/usr/bin/perl
use Term::ReadKey;
print "are you Hungry? (y/n)\n";
ReadMode "cbreak";
my $char = ReadKey 0;
ReadMode "restore";
print "you typed '$char'\n";

このスクリプトはWindowsにおいて挙動がおかしい。なぜかエンターキーだけを認識しないのだ(他のキーは全く問題ない)。そのときはTerm::Getchを使おう。

Term::Getch – ReadKeyライクなインターフェースのMSWin32用の代替

http://okilab.jp/document/japanate/perldoc/html/Term-Getch-0.20/Term/Getch.htm

#!/usr/bin/perl
use Term::Getch;
print "are you Hungry? (y/n)\n";
my $char;
1 while ! ( $char = getch );
print "you typed '$char'\n";

例4:文字入力をn秒待つ

#!/usr/bin/perl
use Term::ReadKey;
print "please press key within 3 seconds.\n";
ReadMode "cbreak";
my $char = ReadKey 3;
ReadMode "restore";
print "you typed '$char'\n";

ReadKey関数に正の数字を渡すとその秒数だけ待つ。この例だけはWindowsでうまく動かせなかった。