アーカイブ - 4月, 2013



2013年 4月 29

mojolicious

このエントリーには問題点があります(2013/5/5追記)

webアプリを作る上でセキュアな通信を強要するページとそうではないページを振り分けるにはどうすればいいのか悩んでいたのだけど、ルーターでリダイレクトさせる方法にしてみた。

全てのページをSSLでアクセスされても速度的にとか負荷的に困るので、ある決まったrouteのみSSLでアクセスして、メインのコンテンツは通常のhttp通信(非SSL)にredirectする仕様。

必ずhttpsでアクセスするルート
  • /login
  • /join
必ずhttpでアクセスするルート
  • /
  • /entry/1
  • /entry/2
  • /entry/….
httpでもhttpsでもいいルート
  • /mypage
  • /favorite/list/1

例ではログインページや登録ページではセキュアな通信をして、トップページとエントリーページは普通のhttpで通信する。httpsでもhttpでもどちらでもいいページは最後の Any routes の所で振り分けられる。

sub startup {
  $self = shift;
....

  # Routes
  my $routes = $self->routes;

  # SSL onry routes
  my $ssl_rotes = $routes->bridge->to(
    cb => sub{
      my $self = shift;

      my $req = $self->req;
      return 1 if $req->is_secure;
      
      $self->redirect_to($req->url->to_abs->scheme('https'));
      return;
    }
  );
  # スッキリ書くならこんな感じ?
  # my $ssl_rotes = $routes->bridge->to(
  #   cb => sub{
  #     return 1 if $_[0]->req->is_secure;      
  #     $_[0]->redirect_to($_[0]->req->url->to_abs->scheme('https'));
  #     return;
  #   }
  # );
  # Not SSL routes
  my $not_ssl_routes = $routes->bridge->to(
    cb => sub{
      my $self = shift;
      
      my $url = $self->req->url;
      return 1 if $url->base->scheme eq 'http';
      
      $self->redirect_to($url->to_abs->scheme('http'));
      return;
    }
  );

  # SSL onry route
  $ssl_rotes->route('/login')->to('login#index');
  $ssl_rotes->route('/join')->to('join#index');

  # not SSL routes
  $not_ssl_routes->route('/')->to('top#index');
  $not_ssl_routes->route('/entry/:id', id => qr/\d+/)->to('entry#index', id => 1 );

  # Any Routes
  $routes->route('/:controller')->to(action => 'index');
  $routes->route('/:controller/:action')->to();
  $routes->route('/:controller/:action/:id')->to();
}

考えついたのはこんな感じのコードだけど、もっといい方法があるかもしれません。知っている方いたら教えて下さい!


Filed under: Mojolicious

Trackback Uri






2013年 4月 28

SpamAssassin

SpamAssasinのみをインストールしたくなったのでメールサーバ再構築のついでに試してみる。メールサーバ構築のまとめ でPostfix+MySQL+postfixadminは構築済みとして想定しています。そちらではウィルスチェックも導入しているため今回はスパムチェックのみの導入。

また、学習機能があるようなので試してみる。スパム判定の精度が高まるみたい。

  • .Spam ディレクトリの作成
  • スパムメールの学習
  • 通常のメールの学習

コレに合わせて postfixadmin +procmailな環境でメールディレクトリの自動作成・削除 のメールディレクトリ作成スクリプトに .Spam を作るコマンドを追加。

SpamAssassinのインストール

yum install spamassassin

procmailの設定

  • バーチャルドメインでのメールアカウントを使用。
  • 保存ディレクトリは /mail/domain.tld/user@domain.tld とする。
  • $DOMAINと$USERは Postfixのmaster.cfで取得している。

/etc/procmailrc を新規作成する。SpamAssassinの起動条件は参考ブログより引用。

# vi /etc/procmailrc

SHELL=/bin/bash
PATH=/usr/bin:/bin
DEFAULT=/mail/$DOMAIN/$USER\@$DOMAIN/
LOCKFILE=/mail/procmail.lock
LOGFILE=/mail/procmail.log   # ログ出力先
#VERBOSE=ON   # 詳細ログ出力

# メールヘッダー中に「 X-Spam-*** 」の記述がなければ spamassassin を起動します
:0fw
*!^X-Spam.*
|spamassassin

# メールヘッダー中に「 X-Spam-Status: Yes 」の記述があれば、「 .Spam 」ディレクトリにメールを格納します
:0
* ^X-Spam-Status: Yes
$DEFAULT/.Spam/

ログの肥大化を防ぐため、ログローテーション設定ファイル新規作成する。

# vi /etc/logrotate.d/procmail

/mail/procmail.log {
    missingok
    nocreate
    notifempty
}

Postfixとprocmailを連携させる

main.cf の設定

# vi /etc/postfix/main.cf

....最終行付近
# virtual_transport = virtual  ←コメントアウト
virtual_transport = procmail  ←追記
procmail_destination_recipient_limit = 1 ←追記

master.cf の設定

# vi /etc/postfix/master.cf

最終行に追記
procmail unix - n n - - pipe
  flags=R user=vuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

SpamAssassin起動

# service spamassassin start

SpamAssassin自動起動設定

# chkconfig spamassassin on

Postfixを再起動して設定を有効化

# /etc/rc.d/init.d/postfix restart

スパムメールの学習

スパムメールの判定制度を上げるために学習する事が出来る。また、迷惑メールではないメールの学習も可能。

スパムメールを学習するコマンド(全てのユーザのSpamフォルダを対象)
# /usr/bin/sa-learn --spam /mail/*/*/.Spam/cur
通常のメールを学習するコマンド(全てのユーザの受信フォルダを対象)
# /usr/bin/sa-learn --ham /mail/*/*/cur

参考ブログではcronに設定していたけど、Spamメールを確認してから手動でコマンドを実行するようにする。~/binにコマンドスクリプトを作成してsudoで実行できるようにしておく。

$ mkdir ~/bin
$ vi ~/bin/spam-learn 
#!/bin/sh

/usr/bin/sa-learn --spam /mail/*/*/.Spam/cur

# スパムメール保存ディレクトリの中身を強制的に消去してよいのなら以下の記述を追加
/bin/rm -f /mail/*/*/.Spam/cur/*
echo 'All Spam Mail Deleted.'

$ chmod 700 ~/bin/spam-learn
$ sudo chown root:root ~/bin/spam-learn

スパムメール学習コマンドを使う時

メーラーでSpamフォルダに迷惑メールしか無いと確認してから以下のコマンドで学習&スパムメール削除

$ sudo spam-learn

入れなおしたらかなりの確率でスパムメールを排除してくれる!

参考:


Filed under: postfix,メールサーバ

Trackback Uri






2013年 4月 3

オープニング

主宰の@ytnobodyさんによるオープニングで始まりました。表番組が同日に開催されていたのでこちらは裏番組と言う事みたい。今回のPerl Beginnersはなんと一周年!という事で、おめでとうございます。パチパチ。

スライド中に登場していたザクとうふ、あれ作っているの群馬の会社(とーーーふはさがみやっ!ってCMの)なのですが、少しだけ群馬に関係したものが出てきて親近感を感じつつ始まりました。写真はザクの頭(等身大?)が会社に飾られていた時に撮ったもの。頭の中に入れたそうです。

相模屋に飾られたザクの頭

ビギナーズセッション

エントリがなかったらしく、急遽募集。@CLCLCLさんによる質問がありました。

  • Mojolicious::Liteでwebsocketを使ったアプリ
    • Any::Eventのイベントが拾えなくなる問題
    • morboの場合は大丈夫
    • hypnotoadになると問題が発生

Mojo::Server::Hypnotoad

morboで動いてhypnotoadで問題が出るということなので、workerの数が問題なのかな?と思いました。workers で指定できるみたいだけど、configで指定しないとダメなのかな。コマンドラインオプションで渡せないっぽい。

ライトニングトーク

@CLCLCLさん
  • 印刷屋から転職
    • 東京来て半年
  • 時間ごとにtweetするアプリ
    • Twitterアカウント8個
    • YAMLで設定
    • Any::Event
    • daemonとして動く
  • 業務アプリの話
    • 宅配荷物の確認
    • 件数が多いと難しい
    • 自動化で解決
  • 家で開発->CPANおk
    • WebService::KuronekoYamato(|SagawaKyubin|NiigataUnyu)
    • cronで巡回
  • 黄色い本からスクレイピング
    • 会社名とか社長名とか…
    • 読み出せないものも
    • jpeg…orz
    • でも大体スクレイピングできる
    • お手紙だそう!
  • 業務用もウェブアプリ化しよう!

色々やばい(?)話もありつつ、業務で使うものも自動化して効率をあげようというお話。個人的には佐川さん使ったりしているのでとても気になりました。参考にしてなにか書いてみようかな。

@toku_bassさん

ライブコーディング。まずは簡単なPSGIアプリを書き始めて、次第に肉付けしていく形でRouter::Simpleを使ったPSGIアプリへと仕上げていく感じ。最初の方は写経しつつ見ていたのですが、途中で諦めました(汗。タイムアップ時に動かないというオチがありましたが、ライブでコーディングとかシビレますね。こういうの出来るようになったら面白いだろうな。

途中まで書いたコードはこんな感じ。

#!/usr/bin/env perl
use strict;
use warnings;
use Router::Simple;
use Router::Simple::Declare;

my $router = router {
  connect '/api/post/{id}', { c => 'MyApp::Api', a => 'post'};
};
my $app = sub {
  my $env = shift;
  my $p = $router->match($env);
  my $controller = $p->{c};
  my $action = $p->{a};

  my $res = $controller->new($env)->$action;
  

  # [200, [], ['hello']];
};
@dokechinさん
  • Mojolicous
    • Bootstrap付いてない
    • ダウンロード面倒くさい
    • コマンドあるよ!
    • Mojolicous::Command::generate::bootstrap
    • $ mojo generate app MyApp
    • $ cd MyApp
    • $ mojo generate bootstrap
    • (゚д゚)ウマー
  • Bootstrap Form Builder
    • フォーム生成
    • ドラッグ&ドロップで出来る
    • HTMLソース吐く
  • MojoHel
    • Bootstrap Form Builderのfork
    • .epテンプレートのソースを吐く
    • バリデーションはForm::Validator::Lite
    • 手軽に使える

ボクもMojolicious + Bootstrapで作ったりするのでMojoHel便利そう!って思いました。意外とフォーム周りは書くのが面倒なので。使わせて頂きます。今後はこういう役に立つツールも作って行かないとね。

@ytnobodyさん
  • 無料ホームページ
    • 懐かしい
    • 単純なPSGIアプリ動作させる
  • TOK2.com
    • cgiおk
  • github
    • TOK2PSGI-examle
    • コマンド叩ける
    • plack入れる
    • notest必要
  • サーバスペック
    • i386
    • CentOS5.8
    • HDD500GB
    • perl5.8.8
    • 文字コードeuc-jp
    • 大抵のモジュール入りそう
  • 悪用厳禁w
  • Beginnersでの発表としては難しい内容になってしまった
    • cgi => webアプリの一つ
    • psgi => すごいcgi(のようなもの)

レンサバ環境でPSGIアプリを動かすというHackというかTipsというか、のお話。コマンドを叩くcgiを作るところから始めるというすごく面白い発想です。確かに悪用厳禁ですが(笑 こういう面白い発想最近全然してないと反省しました。

@moznionさん
  • perl入学式ある
    • でも一杯
  • Acme::24
    • 大好き
  • metacpan
    • 超見やすい
    • metacpanのリンク貼らないとdisられる。
    • apiあるよ
    • 便利
  • Bundle::Acme::Everything
    • Acmeモジュール全部欲しい。
    • $ bundle_acme_everything
    • Acme以下のモジュールをガッと全部インストール
    • metacpanのAPI叩く
  • Bundle::Namespace::Everything
    • 改良版
    • $ bundle-namespace-every Net
    • Net以下のモジュールを全部インストール

metacpanの話。ググっている時にたまたま見ている(と思う)けど、CPANよりmetaCPANの方が見やすい&便利かも。これぞLTって感じのテンポの良い話し方・スライドの送り方でした!非常に参考になります。こういうテンポのLTが出来るようになりたいな。

懇親会

別名ガチホモ合コンというらしいです。帰りの時間とかギリギリになりそうだけど、早めに切り上げれば何とかなりそうだったのでエントリ。せっかく東京まで来たんだしね。

普段Perlな人と触れ合うこともないので、エラー時の行番号の話とか、テストの話とか、ピザ.pmの話とか、etc…。いろいろな話が聞けたのでやっぱり参加してよかった。静岡まで帰る@dokechinさんのお陰であと30分居ようという誘惑に勝てました。もっと飲みたかった!

その他

今回のテーマは「webアプリ(CGIでも可)」という事で、行きたい衝動は大きいのだけれど月末金曜というスケジュール。ギリギリまで迷った挙句、勢いでエントリー。東京の勉強会とか初めてだし、Perl書いているけどPerlの勉強会って初めてなのでとにかく勢いで。

始まる前に電波悪いので窓際がいいよ!って話でしたが、iPhone5(SB)のテザリングで快適に過ごせました。初めて会う方の前でLTも出来たし、少しでも世界が広がったので行ってみてよかったです。

また機会があれば行きたいな。


Filed under: 勉強会

Trackback Uri