Tag: perl



2011 4月13日

やっと出来たのでメモ。
起動スクリプト mojo.cgiを

#!/usr/bin/env perl

use strict;
use warnings;
use lib "../lib";
use App;

app->start('cgi');
exit;

こんな感じで呼び出すと通常のCGIとしてならなんの問題もなく実行出来るのだけれど、SpeedyCGIで実行しようとすると初回実行時に不具合が出る(テンプレートが読み込まれない?)上記実行方法でも2回目以降(キャッシュ後)は動作している感じ。

FastCGIやmod_perlでのエントリーは見かけるんだけど、いかんせんマイナーなSpeedyCGI。結構便利なのにあまり使われていないのかなぁ。

で、とりあえず解決方法が見つかったのでメモ。結論から言えば起動スクリプトで Mojo::Server::CGI を使ってアプリを実行すればいいみたい。

ApacheでCGI(SpeedyCGI)としてデプロイする

起動用スクリプトを mojoアプリケーション本体と同じディレクトリに置く。これは必須ではないので公開するときには配置を変えたり出来る。
(例えば App/public/mojo.cgi として App/public を公開ディレクトリにするなど)

__DATA__セクションにテンプレートを書けるけど、ここではテストのため外部ファイル化している。

最小構成

App +
    - App.pm
    - mojo.cgi
    - templates +
                - index.html.ep

スクリプト

起動用スクリプト mojo.cgi

#!/usr/bin/env speedy

use strict;
use warnings;

use Mojo::Server::CGI;
$ENV{MOJO_APP} = 'App';
#$ENV{SCRIPT_NAME} = '';
Mojo::Server::CGI->new->run;
exit;

App.pm と 起動スクリプトが同じディレクトリの場合は use lib; しなくても大丈夫のようだ。別のディレクトリに起動スクリプトを置く場合、例えばApp/public/mojo.cgi とするなら use “../”; が必要になる。

mojoアプリケーション本体 App.pm

package App;

use strict;    # use Mojolicious::Lite;で自動でされるが明示的に
use warnings;  # しておく。
use utf8;
use Mojolicious::Lite;

# テンプレートへ渡すハッシュリファレンス
my $params = {};

# インデックスページ
get '/' => sub {
    my $self = shift;

    $params->{title}="Hello World!";
    $params->{messe} = "ようこそ 世界へ!";
    $self->stash(params => $params);
} => 'index';

# mojo.cgi/任意の文字に対応
get '/:foo' => sub {
    my $self = shift;

    $params->{title}= $self->param('foo');
    $params->{messe} = "このページは" . $self->param('foo') . "です";
    $self->stash(params => $params);
} => 'index';

テンプレートファイル templates/index.html.ep

<!doctype html>
<html>
    <head>
    <title><%= $params->{title} %></title>
    </head>
    <body>
    <h1><%= $params->{messe} %></h1>
    </body>
</html>

上記は最低限のファイル構成だけれど、テンプレートでレイアウト使っても動作していたのでSpeedyCGI化もこの方法なら大丈夫そう。

参考

  • Perl-Mojolicious/ApacheにCGIでデプロイ – yanor.net/wiki
  • Mojoことはじめ – Perl日記
  • Mojoを使ってみた – Charsbar::Note






  • 2011 4月5日

    id:tokuhirom氏作の Email::MIME::MobileJP::Template を発見したので使ってみる。

    PODにあるコードは動作しないので注意。renderメソッドのAPIが変わったのかな?ソースを見ると引数の最初に送り先のメールアドレスを指定しないとダメみたい。

    それと、Email::MIME::MobileJP にあるソースも間違えているので注意。syntax=>’TTerse’ は newする時に引数で指定する事。

    use Email::MIME::MobileJP::Template;
    use Email::Sender::Simple;
    
        my $token='123';
        my $to_email = '<foo@hoge.jp>'; # <>で囲わないとdocomoで受信したときToがおかしなことに。
    
        my $mail_maker = Email::MIME::MobileJP::Template->new(
                        'Text::Xslate' => {
                                syntax => 'TTerse',
                                path => ['email_tmpl/']     # テンプレートの保存場所
                        }
        );
    
        my $mail = $mail_maker->render(
                        $to_email,                  # 送信先
                        'signup.eml',               # テンプレートファイル
                        {token => $token}    # テンプレートで利用する変数
        );
        # メールを送信
        Email::Sender::Simple->send($mail);

    テンプレートファイル

    path で指定したディレクトリにテンプレートファイルを作成する。MIMEヘッダはテンプレートでしか指定できない。Fromは記述しないと致命的なエラーとなるので注意。

    ./email_tmpl/signup.eml

    Subject: [Example] サインアップ!
    From: <name@hoge.com>
    
        以下をクリックせよ
        http://example.com/signup/[% token %]

    携帯電話宛のメールが正しく送れない?

    …つづきを読む







    2011 4月1日

    perlスクリプトをSpeedyCGIスクリプトとして動作させる場合、グローバル変数の値は保持され続ける。なので、一度接続したデータベースハンドルを使い回すことでデータベースへの接続コストを削減できる。

    テスト用スクリプト …つづきを読む







    2011 3月9日

    perlのWAF(ウェブアプリケーションフレームワーク)である Mojolicious(Mojolicious::Lite)をアップロードだけで使えるのか試してみる。

    簡単に使えるフレームワークとして、とりあえず Linux+Apacheで動けばおkという前提で。

    なにせフレームワーク初心者の戯事なのでそのあたりは察してください。

    …つづきを読む







    2011 3月8日

    メール送信に便利な Mail::Sendmail
    大変便利なモジュールだけど、RFCに違反しているメールアドレスでは内部のエラーチェックに引っかかり送信出来ない。

    例えばこんなメールアドレスには送信出来ない。
    例)read_rfc822.@docomo.ne.jp

    元ソースの正規表現部分

    # regex for e-mail addresses where full=$1, user=$2, domain=$3
    # see pod documentation about this regex
    
    my $word_rx = '[\x21\x23-\x27\x2A-\x2B\x2D\x2F\w\x3D\x3F]+';
    my $user_rx = $word_rx         # valid chars
                 .'(?:\.' . $word_rx . ')*' # possibly more words preceded by a dot
                 ;
    my $dom_rx = '\w[-\w]*(?:\.\w[-\w]*)*'; # less valid chars in domain names
    my $ip_rx = '\[\d{1,3}(?:\.\d{1,3}){3}\]';
    
    $address_rx = '((' . $user_rx . ')\@(' . $dom_rx . '|' . $ip_rx . '))';
    ; # v. 0.61

    @EXPORT_OK に $address_rx が設定されているので、$Mail::Sendmail::address_rx の正規表現を変更すればエラーチェックに引っかからないようになる。

    my $word_rx = '[\x21\x23-\x27\x2A-\x2B\x2D\x2F\w\x3D\x3F\.]+'; # \.を追記する
    my $user_rx = $word_rx . '(?:\.' . $word_rx . ')*' ;
    my $dom_rx = '\w[-\w]*(?:\.\w[-\w]*)*'; # less valid chars in domain names
    my $ip_rx = '\[\d{1,3}(?:\.\d{1,3}){3}\]';
    my $address_rx = '((' . $user_rx . ')\@(' . $dom_rx . '|' . $ip_rx . '))';
    $Mail::Sendmail::address_rx= $address_rx;

    正規表現を無効にした場合、当然の事ながらその前にメールアドレスの正当性をチェックしておく必要があると思う。(携帯メールアドレスを有効にするなら Email::Valid::Loose 等)

  • 関連記事:perl でメールアドレスの有効性をチェックするモジュール
  • モダンなperlモジュール

    メール送信系のモジュールは山ほどあるので何がいいか悩むところ。Mail::Sendmail のエントリーだけど、 Email::Sender がモダンなモジュールとして紹介されているのでリンクを載せておく。

  • モダンPerlの世界へようこそ:第20回 Email::Sender:メールを送信する|gihyo.jp … 技術評論社
  • [Email::Sender]Perlでメールを送信するときはEmail::Senderを使いましょうというお話 – punitanのメモ
  • 気になる点は Moose に依存しているという事。

  • Perl5 によるメール送信 – 実践的な Email::Sender の利用方法