バッチファイルでPerlスクリプトを書く

Perlスクリプトによる実行ファイルを作るとき、Unix系OSでは拡張子が付けないことが多いのだが、Windowsでそれと同じことをやろうとしてもうまくいかない。Windowsではファイルの拡張子によってファイルタイプを判別するようになっているからだ。

Windowsで拡張子のないコマンド(勿論、バッチコマンドとかぶるコマンド名ではいけない)を実行しようとするとどうなるかというと、強制的に「.exe」「.com」「.bat」のどれかが補われる。Perlスクリプトの拡張子「.pl」のままじゃダメってことだ。

じゃあ拡張子「.bat」の中にPerlスクリプトを無理矢理埋め込めばいいんじゃないか?となるわけだ。

以下のファイルを「test.bat」という名前で保存して実行してみると……

#!/usr/bin/perl
use strict;
use warnings;
use Perl6::Say;
say "Hello World!";

Continue reading

DATEDIF関数の怪(Excel)

Excelについて、「二つの日付を比較して、その間の月数を数える関数ってない?」という質問があった。ググってみると「DATEDIF関数」というのがそれらしい。

Excel(エクセル)基本講座:日付の関数
http://www.eurus.dti.ne.jp/~yoneyama/Excel/kansu/today.htm#datedif

しかしこの関数、バグだらけである。年数と月数を調べるのは問題ないようだが、日数がひどい。試してみよう。

2010-02-03_125918.png

2008年12月15日から2010年2月2日までの月数及び日数を求める。結果は”13ヶ月と18日”になるはずだ。月数が”13″なのは問題ないとして、日数がむちゃくちゃである。

なぜこんなひどい実装になっているかについては、この10年の間にいろいろ考察がなされているみたい。(Excel2002の頃からバグりまくりらしい)

kt関数Ref:ktPeriodYMD
http://www.h3.dion.ne.jp/~sakatsu/ktfunc_ref0206.htm#DATEDIF

それでもMicrosoftは直さないんだから、もうこの関数は使うなってことなのだろう。正確に日付計算したいならVBでも使ってDateTimeオブジェクトに変換しろってことなんかね。

おまけ。
Perlで計算すると全く問題なかった。(当たり前だ)

#!/usr/bin/perl
use Perl6::Say;
use DateTime;
my $a2 = DateTime->new( year => 2008, month => 12, day => 15 );
my $b2 = DateTime->new( year => 2010, month => 2, day => 2 );
say( ( $b2 - $a2 )->delta_months . " months" );
say( ( $b2 - $a2 )->delta_days . " days" );
# 実行結果
# 13 months
# 18 days

Catalyst + Lighttpd + FastCGI なテスト

CatalystのテストサーバをLighttpdで立ててくれるヘルパースクリプト。

Catalyst::Helper::Lighty にリスタート機能つけた – masaki@catalyst – Catalystグループ
http://catalyst.g.hatena.ne.jp/ikasam_a/20080318/1205778147

ヘルパーがあるおかげで操作は簡単。

// 事前にLighttpdとFastCGIをインストールしておく必要がある
// アプリを作成
$ catalyst.pl MyApp

// ヘルパーを実行
$ cd MyApp/script
$ ./myapp_create.pl Lighty

// テストサーバを起動......アレ?
$ ./myapp_lighty.pl
Type of arg 1 to Parallel::SubFork::sub_fork must be block or sub {} (not null operation) at ./myapp_lighty.pl line 75, near "&spawn_fastcgi )"
Execution of ./myapp_lighty.pl aborted due to compilation errors.

と言うわけでちょっとバグがある。ヘルパーモジュールLighty.pmを次のように編集する。

Continue reading

Static::SimpleとFormValidator::Simple::Auto

Catalyst::Plugin::Static::Simple
と、
Catalyst::Plugin::FormValidator::Simple::Auto
は同時に使えない……?(つーかモジュール名長すぎ)
エラーの意味が全然わかりませぬ(‘A`)

$ ./myapp_server.pl 
[debug] Debug messages enabled
[debug] Statistics enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::ConfigLoader  0.27                                       |
| Catalyst::Plugin::FormValidator::Simple  0.13                              |
| Catalyst::Plugin::FormValidator::Simple::Auto  0.18                        |
'----------------------------------------------------------------------------'

  〜中略〜

[info] MyApp powered by Catalyst 5.80007
Couldn't load class (MyApp) because: Inconsistent hierarchy during C3 merge of class 'MyApp': merging failed on parent 'Catalyst::Plugin::FormValidator::Simple::Auto' at /opt/local/lib/perl5/5.10.1/darwin-2level/mro.pm line 27.
Compilation failed in require at /opt/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm line 98.
 at /opt/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP.pm line 102

  〜以下略〜

Continue reading

SyntaxHighlighter でTemplate Toolkitをハイライトする その2

前回の状態ではTT2構文のハイライトはうまくいくものの、本来の用途である、HTML中に埋め込んだ状態ではそれが反映されなかった。それは今回使用したプラグインにおける以下の仕様のためだ。

SyntaxHighlighter for Movable Type « kwLog

  • SyntaxHighlighterのconfigurationには対応していません

よってプラグインの構文を無理矢理拡張して対応。さらにカラフルになった。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use errors;

my $word = shift;
if ( $word =~ /orz/ ) {
    die "ズコー";
}

Continue reading

$c->uri_for_actionの引数

やっと理解できたのでメモ。uri_for_actionはドキュメントによると次のような構文になる。

$c->uri_for_action( $path, \@captures?, @args?, \%query_values? )

この“\@captures”と“@args”がそれぞれアトリビュートの“CaptureArgs”、“Args”に対応する。

例として、次のようなチェーンドアクションを考える。ユーザー情報を編集するようなページを想定している。

Continue reading

Image::Magickのインストール@Mac OS X

Movable Type の必要モジュールのうち、Image::Magick がなかなか入らなかった。結局これが一番手っ取り早いみたい。

Installing ImageMagick on OSX (Global Moxie)
http://globalmoxie.com/blog/imagemagick-install-osx.shtml

長々と書いてあるが、真ん中のこれでうまくいった。-no_x11 じゃなくて、+no_x11 でした。4 ヶ月も経って気づいたorz

$ sudo port install ImageMagick +no_x11 +perl

Image-Magick 本体と、Perl のバージョンが合わないから云々が理由だった由。