無知な僕は別のターミナルを立ち上げて作業をしていたんだが、
そんな馬鹿なことをしないでもバックグラウンドに回してやれば
よいということがわかったのでメモ。
ちなみにMojolicious/morboの知識とプログラムをバックグラウンドで実行する
知識はまったく別のもの
まあ詳しくは、下記のリンクを見てくれ。以上
いや、やっぱり一応書いておく。(上のリンクの内容とおなじだけど)
morbo app.pl
と実行すると、
Server available at http://127.0.0.1:3000.
となる。こうなるとコマンドを受け付けなくなるわけだが、ここでおもむろに
Ctrl + z
を押すと
[1]+ Stopped morbo app.pl
となる。 これで、morboは一旦停止状態。
こうしてから、
bg 1
とバックグラウンドで1番のプログラムを実行することを意味する
コマンドを打てば、morboは裏で稼働し続けてくれる。
もとに持ってきたかったら
fg 1
とやればいい。morboがフォアグラウンドに戻ってくる。
これでサーバーが吐き出すログがリアルタイムで見られる。
また、初めからバックグラウンドで起動したい場合は、
morbo app.pl &
バックグラウンドで起動しているプログラムの一覧は
jobs
と打てばみられる。以上。
]]>職場ではWindowsが多いので、WinとMacはSMBで共有している。
Winで作業して、できたものをMacの共有フォルダに投げておくということが
あるのだけど(NAS的、外部ストレージ的な使い方)、まれに、Macから
Winにファイルをコピーしようとすると、
「ファイルハンドルが無効です」
と出て、ファイルがコピーできないときがあった。
1年ぐらい放置してたのだけど、解決したので、書いておく。
パーミッションは問題ないけど、パーミッションの横に変な@がついてるのが
気になっていた。
-rwxr-xrwx@ 1 user staff 286862 10 2 2014 sample.pdf
この@はExtended Attributesに起因するものらしく、それが悪さしているようだった。
下記のページが非常に参考になった。
ためしに、「ls -l@」コマンドでどんなExtended Attributesがあるのか見てみると
user$ ls -l@
-rwxr-xrwx@ 1 user staff 286862 10 2 2014 sample.pdf
:ZONE.IDENTIFIER:$DATA 26
と、確かに「:ZONE.IDENTIFIER:$DATA」というなんじゃそりゃ?な
アトリビュートがついていた。
これを消す。
user$ xattr -d :ZONE.IDENTIFIER:$DATA sample.pdf
No such xattr: ZONE.IDENTIFIER:
失敗。$マークが悪さしてる?と思って、バックスラッシュでエスケープ。
user$ xattr -d :ZONE.IDENTIFIER:\$DATA sample.pdf
としたら、エラーがでず。試しにコピーしてみたらできた!
ということで、この @ を消せばよかった。
]]>それは以下のページにリンクを貼っておくのでそれを読めばよいとして、
納得いかないのは
これは声を大にして言いたい。
() # これは偽
[] #これは真
{} # これも真
まあ、オレがおバカだっただけなんだけど。
Perlにおいて厳密な真偽を意識することってあんまないので、
というか、非常によきに計らって対処してくれるので、
自分が偽だと勝手に思い込んでいたものが
真だと判定されて、期待通りにコードが動かないということが
これまでどれだけあったことか。
Perlを書くようになって何年も経って、
やっとはっきりとそのことが意識できるようになった。
そういえば昔、こういう記事を書いたけど、
いま読むと何が言いたいかよくわからなくなってる。
use Net::IMAP::Client;
my $imap = Net::IMAP::Client->new(
server => 'imap.gmail.com',
user => "gmailuser",
pass => "gmailpass",
ssl => 1, # (use SSL? default no)
#ssl_verify_peer => 1, # (use ca to verify server, default yes)
#ssl_ca_file => '/etc/ssl/certs/certa.pm', # (CA file used for verify server) or
#ssl_ca_path => '/etc/ssl/certs/', # (CA path used for SSL)
port => 993 # (but defaults are sane)
) or die "Could not connect to IMAP server";
# everything's useless if you can't login
$imap->login or
die('Login failed: ' . $imap->last_error);
# get list of folders
my @folders = $imap->folders;
$imap->logout;
SSLに関する設定はよくわかってなくて、よくわからないところをコメントアウトしても動いたので、それでいっております。
これはこのままやればできるんだけど、日本語のフォルダ名(ラベル名)の扱いに難儀する。IMAP UTF-7という文字コードを使っている。これを扱うためには、おなじみの「 use Encode」だけではダメで、「Encode::IMAPUTF7」というのもつかなわないとダメ。CPANでインストールしてください。
my @folders = $imap->folders;
use Encode 'decode', 'encode';
use Encode::IMAPUTF7;
binmode *STDOUT, ':utf8';
for(@folders){
print decode('IMAP-UTF-7', $_) ,"¥n";
}
こんな風にです。同様の目的のモジュールで「Unicode::IMAPUtf7」というのがありますが、こちらはうまくうごきません。
それから、添付ファイルを保存する場合はこんな感じです。
# 何とかして、添付ファイルのあるメールを指定して下さい
my $mail_list = $imap->search( 'ALL');
my $msg_id = $mail_list->[0];
#そのメールのなかから添付ファイルの情報を抜き出してください
my $sum = $imap->get_summaries([ $msg_id ]);
my $part_id = $sum->[0]{parts}[1]{'part_id'};
my $filename = $sum->[0]{parts}[1]{'disposition'}{attachment}{filename};
use MIME::Base64 'decode_base64';
my $data = $imap->get_part_body($msg_id, $part_id);
open my $fh, '>', $filename or die $!;
binmode($fh); #バイナリで書き込み
print $fh decode_base64($$data); #$dataはスカラーのリファレンス
close $fh;
ここでは、Base64でエンコードされている添付ファイルを「MIME::Base64」というモジュールを使って処理しています。
$imap->get_part_body($msg_id, $part_id)で返ってくるデータがスカラーのリファレンスなので、 $$data とやらないと実体データを参照できないので注意してください。
それから、バイナリでファイルに書き込んでいくために「 binmode($fh) 」としていますが、これは自分でもこれをかかないとダメなのかどうかイマイチわかっておりません。
]]>という一連の操作をSQLiteのデータベースに対して、 おこなうPerlのプログラムを書いていて、不具合が生じた。
まあちょっと考えれば気づきそうなものなのだが、 この一連の操作が2つの場所からほぼ同時に行われると、 あるプロセスがフラグがついていない行にフラグをつける前に、 別のプロセスがフラグ付きではない行としてデータを読み取ってしまう事態が生じる。
こういう時に使うのが Transaction というものらしい。
SQLiteのTransactionには3種類ある。
Deferred means that no locks are acquired on the database until
the database is first accessed. Thus with a deferred transaction,
the BEGIN statement itself does nothing to the filesystem. Locks
are not acquired until the first read or write operation. The first read
operation against a database creates a SHARED lock and the first
write operation creates a RESERVED lock. Because the acquisition
of locks is deferred until they are needed, it is possible that another
thread or process could create a separate transaction and write to
the database after the BEGIN on the current thread has executed.
その名の通り、ロックができるだけ延期されるTransactionで、読み取りの際はロックされない。書き込みの段になってはじめて 予約ロックがなされる。書き込みに入るまではロックされないので、その間のデータベース操作はできてしまう。
If the transaction is immediate, then RESERVED locks are acquired
on all databases as soon as the BEGIN command is executed,
without waiting for the database to be used. After a BEGIN IMMEDIATE,
no other database connection will be able to write to the database or
do a BEGIN IMMEDIATE or BEGIN EXCLUSIVE. Other processes
can continue to read from the database, however.
transactionが開始されるとすぐに予約ロックされる。その間は、書き込みがロックされると共に、別の Immediate transactionも禁止される。しかし、読み込みはできる。
An exclusive transaction causes EXCLUSIVE locks to be acquired
on all databases. After a BEGIN EXCLUSIVE, no other database
connection except for read_uncommitted connections will be able
to read the database and no other connection without exception
will be able to write the database until the transaction is complete.
この排他的transactionが始まると、 書き込みはおろか、読み込みに関しても read_uncommitted 以外の読み込みも禁止される。
あまりいい例ではないと思うが、今回自分が書いたのはこんな感じ。
Immediateは、書き込みだけではなく、他の Immediate transactionも制限されるところがポイントで、今回の問題は、当初はexclusiveなtransactionでないとダメだと思っていたが、 immediate transactionも禁止されるので、今回は immediate でも大丈夫そうだった。
$self->dbh->do('BEGIN IMMEDIATE');
# select
my $select = "SELECT user_id FROM $users_list
WHERE used = 'no' ORDER BY user_id asc";
my $sth = $self->dbh->prepare( $select );
$sth->execute();
my ($new_id) = @{$sth->fetch};
# update
my $str = q/used = 'yes' /;
for( keys %$param ){
my ($key, $val) = ( $_, $param->{$_} );
$str .= ', ' . $key. " = " . $val . " ";
}
my $update = "UPDATE $users_list SET $str WHERE user_id = ?";
$sth = $self->dbh->prepare( $update );
$sth->execute( $new_id );
$self->dbh->commit;
BEGIN IMMEDIATE してから commit までが一連の transaction で、その間に execute があっても transactionは終了しない。
プログラマーにはMac使ってるひとが多いと思うが、Macの人がExcel使ってCSVに吐き出しをすると、大抵これではまる。
かつての自分はこれでよくはまってた。
それでもいいと思うけど、たくさんCSVがある場合、いちいち手作業で変換し保存するのはめんどくさい。
ちなみに、文字コード・改行コードを明示的に指定して保存したい場合は、ミミカキエディットが便利です。
メニューバーをカスタマイズすると、こんなふうに直接的に文字コード・改行コードを変更するUIになります。
僕はSublime Textを使いはじめるまで、テキストエディタはずっとこの mi でした。
Sublime Textだと文字コードを指定して保存は、UTF-8が前提なので、日本語文字コードに関してはできないにひとしいし、改行コードは指定すら出来ないと思う。
それは一理あるけど、僕は sed とか awk とかわからない。
Perlのopen関数は、OSのデフォルトの区切り文字をファイルの読み込みの際に使う。ダイヤモンド演算子( <$fh> の <> )はファイルハンドルから一行読むものだけど、1行というのは、その区切り文字までのことを指す。
なので、この区切り文字を、一時的に書き換えてやればいい。
local $/ = "\r";
open my $fh, '<:crlf:encoding(Shift_JIS)', $file;
my @lines = <$fh>;
close $fh;
局所的に書き換えるために、 local を使う。
区切り文字は $/ という特殊変数がそれに該当する。
かつてのMacの改行文字(CR)をあらわすのが「 \r (または ¥r )」で、localで$/を一時的に \r に書き換える。
そしてopenする。今回はShint_JISなので、openの際にencodingを指定してやる。さらに、テキストモードで開くために :crlf も書く。
この :crlf は実は自分でもよくわかってない。普段、こんな指定をしなくてもファイルはopenできるのに、なんで書かなきゃいけないの?
普段、プログラムを書くときに
open my $fh, '<:encoding(EUC-JP)', $file;
というのはよく書くけど、:crlf や :bytes は書くことがないし、書かなくても目的は十分に達することができるので、そのあたりはよくわからない。
「バイナリで開く」か「テキストで開くか」を明示的に切り替えるときに使うようで、バイナリで開く場合は、 :bytes と書く。
ずっと、 :crlf があるなら、 :cr や:lf もあるのかと思っていたけど、それはない。:crlf か :bytes の二択。
追記:あれー、なんか :crlf を消しても普通に動いた。あれー?
改行文字が CR のファイルをPerl でopen する場合、上記の2点1点が必ず必要になるみたい。(どちらか片方だけじゃだめ)
かどうかは僕にはまだわからない。少なくとも、この方法ならできるとしか。
]]>を修正した
もやはり非推奨で、さらにそのラッパーである
も、当然非推奨になっている。
かわりに推奨されているのが
であり、より低レベルなAPIの
である。
もし、GmalでSMTP-AUTHで送信するのであれば、Email::Sender::Transport::SMTPSがそのまま使えて、作者のページのサンプルコードにあるように、
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTPS;
use Try::Tiny;
my $transport = Email::Sender::Transport::SMTPS->new({
host => 'smtp.gmail.com',
ssl => 'starttls',
sasl_username => 'myaccount@gmail.com',
sasl_password => 'mypassword',
});
use Email::Simple::Creator; # or other Email::
my $message = Email::Simple->create(
header => [
From => 'fromme@myhost.com',
To => 'toyou@yourhost.com',
Subject => 'Subject title',
],
body => 'Content.Email::Sender::Transport::SMTPS',
);
try {
sendmail($message, { transport => $transport });
} catch {
die "Error sending email: $_";
};
これで、メールを送信することができる。 「 Gmailの場合は 」
Gmailでメールを送る場合は上のコードでよいのに、さくらインターネット スタンダードプランのメールサーバで送るときは、うまくいかない。原因は、PLAINかLOGINの認証方式しか受け付けないから。
Email::Sender::Transport::SMTPS は便利なのだが、SMTP-AUTHの認証方式を指定してオブジェクトを生成できないっぽい。ので、より低レベルなNet::SMTPSを使って書くしかなさそう。
use Net::SMTPS;
my $ssl = 'starttls'; # 'ssl' / 'starttls' / undef
my $smtp = Net::SMTPS->new('myhost.jp', Port => 587, doSSL => $ssl);
my $auth_method = 'LOGIN';
$smtp->auth('userid', 'password', $auth_method);
$smtp->mail('fromme@myhost.jp');
$smtp->to('toyou@myhost.jp');
$smtp->data();
$smtp->datasend("Subject:A simple test message\n\n");
$smtp->datasend("A simple test message $auth_method\n");
$smtp->dataend();
$smtp->quit;
Net::SMTPSオブジェクトには、authというメソッドがあって、そのメソッドの3番目の引数が、認証方式になる。
$smtp->auth( USERNAME, PASSWORD [, AUTHMETHOD])
3番目の認証方式の引数は指定しなくてもいいが、その場合はデフォルト値のCRAM-MD5となる。
認証方式は
のいずれかの中から選ぶが、さくらインターネットのレンタルサーバのメールサーバは、受け付けられる認証方式が1か2なので、PLAINかLOGINを指定する。そうすれば、念願のSMTP-AUTHを利用したメールの送信ができる。
]]>use Encode 'encode';
use Email::Sender::Simple 'sendmail';
use Email::MIME;
use Email::Sender::Transport::SMTP;
my ($enc_h, $enc) = ('MIME-Header-ISO_2022_JP', 'ISO-2022-JP');
my $email = Email::MIME->create(
header => [
From => encode( $enc_h => '"from me" <from@xxx.jp>'),
To => encode( $enc_h => '"to you" <to@yyy.jp>'),
Subject => encode( $enc_h => 'subject'),
],
attributes => {
content_type => 'text/plain',
charset => $enc,
encoding => '7bit',
},
body => encode( $enc => 'New ip address here: '.$ip),
);
my $transport = Email::Sender::Transport::SMTP->new(
host => 'mymy.jp',
port => 587,
);
sendmail($email, { transport => $transport });
このコードはこの記事を参考にしました。
しかし、いろいろ試行錯誤したけどだめで、最終的に下記のようなコードになった。(もともとのコードの跡形なし)
use Net::SMTP::TLS;
my $mailer = new Net::SMTP::TLS(
'your.mail.host',
Hello => 'some.host.name',
Port => 25, #redundant
User => 'emailguy',
Password=> 's3cr3t');
$mailer->mail('emailguy@your.mail.host');
$mailer->to('someonecool@somewhere.else');
$mailer->data;
$mailer->datasend("Sent thru TLS!");
$mailer->dataend;
$mailer->quit;
これは、Net::SMTP::TLS - search.cpan.org のSYNOPSYSそのものなんだけど、Email::Senderのようなラッパークラスではだめで、もっと低レベルのクラスを使ってやっと書けた。
しかし、実はこのコードを実行するには、Net::SMTP::TLSを直接手直しする必要があった。Net::SMTP::TLSが使う IO::Socket::SSL のTLSのバージョンが合わないようで、Net::SMTP::TLSを下記のように書き換える
#SSL_version => "SSLv3 TLSv1")){ #182行目
SSL_version => "TLSv1")){
このような小細工をして、ようやく動いた。
SSLのバージョンがうまく噛み合わない件は、CPAN上ですでに報告されている。
しかし、それが修正される気配はない。そもそもNet::SMTP::TLSは更新日が2006年1月16日で、すでに長いこと放置されている。なので、こちらを使うことは推奨できない。
ちなみに、そもそもNet::SMTP::TLSをインストールするところでハマったという経緯もある。Net::SMTP::TLSにはNet::SSLeayが必要なのだが、これのCPANインストールでこけまくった。
openssl が足りないだの、ghostscriptが入らないだの言われて、MacPortsを試してみたり、tarボールを直接makeしてみたりいろいろやって、結局わけがわからなくなって、再度やってみたら、何故かNet::SSLeayがインストールできていたという、再現不可能な感じで、ここまで辿り着いた。
Net::SMTP::TLSはSMTP-AUTHでメールを送る低レベルなAPIだけど、これに対するラッパがじつはあって、それが Email::Sender::Transport::SMTP::TLS です。
こちらは、すでに長期間放置されているNet::SMTP::TLSの当該バグを、Net::SMTP::TLS::ButMaintained という別のモジュールで修正して、そちらを使用して動作するものです。
ここまで、長々と書いてきたけど、Net::SMTP::TLSにしろ、Email::Sender::Transport::SMTP::TLSにしろ、もう使わないほうがいいです。
代わりになるモジュールが
です。(つづく)
]]>そこから、SMTP-AUTHでメールを送信するための試行錯誤がはじまる。
メールを受信する際のPOP3がIDとパスワードで認証を行って 受信を行うのと同様に、SMTP-AUTHでも、IDとパスワードでの認証が必要になる。
その際に、IDとパスワードがそのままネットワークに流れると盗み見られてしまう可能性があるため、見られても大丈夫なような処理をほどこさないといけない。
見られても大丈夫にするやり方としては、
の2通りがある。
SMTP-AUTHの認証方式はいくつかあって、
の4つの方法があるようだ。
1,2は平文が送信されるので、通信経路の暗号化が必須で、3,4がIDとパスワードの暗号化に相当する(厳密にはハッシュ値の計算)
さくらインターネットは、上記の認証方式のうち、1,2 の PLAIN かLOGIN のみ可能なようです。(出典が見つけられないが、MD5系はだめだった)
一方で、GmailのSMTP-AUTHの場合はMD5系が使えるようだった。
詳しくは、別エントリーにするけれども、PerlでSMTP-AUTHを使うことができるCPANモジュールは下記のものがみつかった。
しかし、いずれもクセがあるので、注意。使い方注意を別エントリに書く。
]]>my $str_cat = sub { join '-', @_ };
print $srt_cat->( 'hoge', 'bar');
をやると
Use of uninitialized value $_[0] in join or string
と警告がでてしまう。
無名サブルーチン内で、@_が空かどうかの判定をしてから join をさせても警告が消えない。
いまのところどう対処するのがいいかはわからず、ひとまず no warnigs でお茶をにごしている。
参考になりそうなリンク:
]]>とりあえず公式のサイトに書かれている方法を試す。
メッセージフォルダの最適化だけして様子見。
グローバル検索の索引データベース(global-messages-db.sqlite)のファイルサイズが201MBあって、ちょっと大きすぎるのではないかと思うが、グローバル検索できないと不便だし、削除して再構築しなおすと時間かかりそうだからとりあえずこのまま。
ちなみにWindows 8.1 でThunderbird使っているけど、データは下記のような場所にある。
二か所にデータが分かれているけど、Roamingの方に目的のデータがある。
]]>で、ここ↑から持ってきました。
use Mojolicious::Lite;
use utf8;
# GETメソッドで「/hello」にアクセスしたときに行う処理を書く
get '/hello' => sub {
my $self = shift;
# パラメータ取得
my $name = $self->param('name');
# テンプレートに使う変数をセット
$self->stash('name' => $name);
# 描画
$self->render();
} => 'index';
# アプリ起動
app->start;
# 以下テンプレート(Mojo::Template)
__DATA__
@@ index.html.ep
<html>
<head>
<title>Hello, <%= $name %></title>
</head>
<body>
こんにちは、<%= $name %>さん
</body>
</html>
で、そこらのドキュメントには、CGIで動かすには拡張子を .cgi にすればいいですよ、って書いてある。それに従って .cgi に拡張子を変更して、ブラウザでアクセスする。そうするとエラーになって動かない。
いままでの自分はそこで挫折してMojoliciousを使うのを諦めてました。
でも、ほんのちょっと書き換えるだけでよかったのです。
use Mojolicious::Lite;
use utf8;
# GETメソッドで「/hello」にアクセスしたときに行う処理を書く
get '/' => sub {
my $self = shift;
# パラメータ取得
my $name = $self->param('name');
# テンプレートに使う変数をセット
$self->stash('name' => $name);
# 描画
$self->render();
} => 'index';
# アプリ起動
app->start;
# 以下テンプレート(Mojo::Template)
__DATA__
@@ index.html.ep
<html>
<head>
<title>Hello, <%= $name %></title>
</head>
<body>
こんにちは、<%= $name %>さん
</body>
</html>
どこが変わったかわかりますか?
get '/' => sub {
ここの部分です。 helloという文字がなくなりました。
これだけで、このcgiはアクセスできるようになります。
で、こっから先なんですが、 http://www.example.com/hello とか、 http://www.example.com/hoge とかやってアクセスに応じて、 挙動を振り分けたいじゃないですか。
で、
# app.cgi
get '/' => sub {
my $self = shift;
# パラメータ取得
my $name = $self->param('name');
# テンプレートに使う変数をセット
$self->stash('name' => $name);
# 描画
$self->render();
} => 'index';
# /hello
get '/hello' => sub {
my $self = shift;
# パラメータ取得
my $name = $self->param('name');
# テンプレートに使う変数をセット
$self->stash('name' => $name);
# 描画
$self->render();
} => 'index';
とやって、helloの部分をまるまる増やして、さあどうやって、この get 'hello' にアクセスしようかってことなんです。
結論は、こうなります。
http://www.example.com/myapp.cgi/hello
これで、hello で書いた関数の挙動にアクセスできるようになります。
わかっちゃえばなんてことないんですけど、でも、.cgiと拡張子が付いたあとにスラッシュをつけるっていう斬新な発想は普通うかばねーよと思うんですが。
とまあ、CGIでもこんなかんじでアプリケーションのルーティングができますというお話
]]>[Wed Apr 2 08:43:56 2014] [debug] Your secret passphrase needs to be changed!!!
[Wed Apr 2 08:43:56 2014] [debug] GET "/".
[Wed Apr 2 08:43:56 2014] [debug] Routing to a callback.
[Wed Apr 2 08:43:56 2014] [debug] Rendering template "index.html.ep" from DATA section.
[Wed Apr 2 08:43:56 2014] [debug] 200 OK (0.004035s, 247.831/s).
こんなのあらゆる正常なアクセスでErrorLogに書き込まれてたらErrorLogのファイルが肥大化してしまって仕方ないので、これを抑制する方法を探した。
app.cgiと同じ場所に log というディレクトリを作れば、そこにログが書き込まれる様になります。手っ取り早いといえば手っ取り早い
Mojoliciousのコードはコードの最後に app->start() ないしは $app->start() とやるので、この直前に、このアプリケーションはproduction(完成品)ですよーという旨を記述してやる。
app->mode('production');
app->start();
これで細かいログはでなくなる。これをやると後述するlog levelが info になるよう。
http://mojolicio.us/perldoc/Mojolicious#mode
The operating mode for your application, defaults to a value from the MOJO_MODE and PLACK_ENV environment variables or development. Right before calling "startup", Mojolicious will pick up the current mode, name the log file after it and raise the log level from debug to info if it has a value other than development.
デフォルトは「 development 」で、startupの直前にどのモードかの判定が行われる。
2番で書いたやりかたをもっと直接的にやってしまう。
app->log->level('warn');
app->start();
とか。
http://mojolicio.us/perldoc/Mojo/Log#level
Active log level, defaults to debug. Available log levels are debug, info, warn, error and fatal, in that order. Note that the MOJO_LOG_LEVEL environment variable can override this value.
ログレベルは以下の5つ。
それぞれがどの水準のログを吐くのかは・・・どこにかいてあるんだろう。まあその名前からだいたい想像はできる
]]>社内のWebサービスを、当面はApacheでの運用を続けたいので、CGIで動かせることが必須だった。で、ずっとMojoliciousはCGIでは動作しないと勘違いしていて、WAF全般に手を出せなかったんだけど、それは誤解で、MojoliciousでもApache/CGI を拡張子変えるだけで使えるというのを知った。
まえplack (PSGI?)を使おうとして、それをcgiとして動作させようとしたけど、それができなかったということと、MojoliciousはPerlのバージョンが5.10.1以上じゃないと使えなくて、本番環境が5.8だったので、Mojoliciousは諦めざるを得なかったというのと2つの要因があって、その2つがごっちゃになった結果、MojoliciousはCGIでは動かせないという誤解をしていたのではないかと思う。
実際、PSGIの仕組みはCGIをサポートしているので、plack (PSGIというべきか?)はCGIで動くはずなんだが、きっとオレが書いたコードがだめだったんだろうけど、しばらく試行錯誤してCGIでplacl/PSGIが動かせなかったので自分はまだそのレベルに達していないんだというので挫折。(もういちどトライしてみようかな・・・)
Amon2を試したこともあったんだけど、使い方がわからず、やはり挫折。
MojoliciousはPerl 5.8では動かせないと知って挫折。
そういう経緯があって自分にはWAFはまだ早いんだー!と手が出せずに涙を飲んでおりました。
plackとかAmon2とかMojoliciousとか、あまりドキュメント多くないし、自分みたいWAFの知識が乏しい人間にフレンドリーな記事も少ないので、もっと増やしてほしいです。
前の記事 に書いたけど、念願の本番環境のPerlをアップグレードできたというのが大きい。
これで既存のApacheのまま、Perlのバージョンを自在に変えられるぜ。
ずっとMojolicious は CGI で動かせないと思い込んでたけど、そしたら 木本さんがそうじゃないと言ってくれたのが転機になった。
いままでずっと、一人でコード書いてて、頼りはPerl関連の書籍とWebの情報だけで、そうやって、自分の誤解をピンポイントに解いてもらえるような機会がこれまでなかった。ゼロプロやっててよかった。木本さんありがとうございます。