Perlの最近のブログ記事
数多くのスパムメールが飛び交う昨今、近年ではメールサーバ側でスパムフィルタを適応することがよくありこの hatotech.org でも SpamAssassin が適応されています。会社でも適応したいねえと ITEMAN とも話しているのですがなかなか時間が取れないということで導入至らずな現状なもののどうにかしたいと思い MDA レベルで導入してみることに。cygwin で。
まずは SpamAssassin の導入。perl で動いているプログラムですが、CPAN で導入することができます。
CPAN> install Mail::Spamassassin
以上。cygwin ながらもアッサリ導入できました。素晴らしい。構築に若干時間はかかりました。
続いて適応。私は fetchamil + procmail の黄金パターンでメール取り込みを行っており、procmail にてフィルタリングする形になります。.procmailrc で以下のような感じ。
# procmail 初期セッティング PATH=/usr/bin:/usr/local/bin:/bin MAILDIR=$HOME/Mail DEFAULT=$MAILDIR/inbox/. LOGFILE=$MAILDIR/from-log LOCKFILE=$HOME/.lockmail # Spamassassin 適応 :0fw | /usr/bin/spamc # spam と認定されたら spam へ :0 * ^X-Spam-Status: Yes* spam/.
SpamAssassin 側で各メールの Header に
X-Spam-Checker-Version:
X-Spam-Level:
X-Spam-Status:
というラインが追加されますので、その値を使ってあとはお好きなようにという感じです。X-Spam-Status: の Yes/No で判断するのが良さそうです。
あとは spamd コマンドで SpamAssassin デーモンを立ち上げておきます。
spam も日々進化していますので spam と認識できないメールもあるでしょうし、逆に Spam と判断されてしまったメールもあるかと思います。そんなときのために sa-learn というコマンドが別途準備されています。これを使うことで SpamAssssin に勉強させることができます。
目的のメールを仮に ~/Mail/spam-learn に置いたとして、
メールを spam として勉強させる
sa-learn --spam ~/Mail/spam-learn
メールを非 spam として勉強させる
sa-learn --ham ~/Mail/spam-learn
あとは /etc/mail/spamassassin/local.cf に別途 spam ワードとして登録できる模様。実際やってないですが、日本語も JIS コードに変換した状態で記載すれば適応できるようです。
1/11 の PC ソフトウェア更新の際に cygwin の perl も 5.8.6 になったようですが、そこで配布されている perl の @INC が以前から変わっているようです。
5.8.5 までの @INC は perl -V でみると そのバージョンのディレクトリを掘ってそこにある module を読みに行く形になってました。したがって CPAN などで導入した module は perl のバージョンが変わると読みにいかない状態となっていました。毎回 -l オプションをつけたり スクリプト毎に @INC に push して path を追加するのもメンドくせえってことで今まではバージョンがかわる毎に CPAN shell を叩いて再度 module を導入していたのですが。
今回配布されている perl から、@INC が 5.8 というまとまったディレクトリ名でコンパイルされています。したがって今後 5.8 系統のバージョンアップが行われた際には module の再導入はいらないということになります。地味ながらもこれは嬉しい。というかようやく気付いたかコノヤロウというエラソーなことを言いつつ毎度お世話になっております今後ともどうぞ宜しくお願いします。
active perl で CPAN を利用する方法のまとめ。
んで出来た。まともに動作させようとしたら思ったより太ったコードになってしまいましたね。動作は至ってサクサクですが。
ステップは前回のエントリで上げたとおり、
1. iTunes 情報取得
2. Amazon アフィリエイトリンク作成
3. java script ファイルへ出力
4. FTP で java script を Upload
です。active perl で実装。
さて実際に自分で目的の機能を果たそうと試していたところ1つの事実が発覚したのであります。Amazon ってば、中途半端に日本盤のアルバムタイトルをカタカナ表記にしちゃってるのね…そりゃ一部アルバム引っかからないわけだわ。
まあリンク精度よりもジャケット写真のほうが個人的には重きに置きたいところなので、リンク生成する際国内の amazon.co.jp の商品に向けて生成するものの、もしその CD のジャケット写真がなかった場合は amazon.com の方も検索をかけて画像リンクのみ引っ張ってくるという流れを作ってみました。洋盤ならではの作戦なり。
以下ソース。
このブログのサイドバーに iTunes で演奏中のトラックを音ログ.jp を用いて表示させていますが、聴いている HM/HR に対してのリンク精度がお世辞にも良いとは言えません。Amazon アフィリエイトも海外盤へのリンクになるし、amazon.co.jp の海外盤ジャケットイメージがブランクとなっているため嬉しさが半減なんですね。
Music でもやっぱりマイナー分野に該当する以上仕方がない話です。ちゅーことでこりゃもう自前でやるしかないなと思ったわけです。そのついでに自分のアフィリエイトにしてアサマシもやっちゃいましょう。
perl にて iTunes の情報を COM を利用し取得、その情報を元に Net::Amazon を使ってアフィリエイトリンクを作成。これを java script ファイルを作成した後、Net::FTP を使って Upload。よしこれだ。現在のトラック以外に過去5件分くらいのアルバムもリストすることにしよう。
んで cygwin perl でやろうとしたら perl はおろか cygwin の version が古くて Ver.UP。これがどうにも終わらなくって、先にエントリーが先行してしまったというオチです。
さらに、cygwin で Win32 パッケージが見事導入失敗に終わったので、おとなしく Active Perl でやることにしよう…うわー何となくこうなることは分かってたけど凄いションボリだ。寝る前にガリガリ検証しようと思ったけどもういいや。
キヌガサの友達リストを出力する仕組みを CGI から毎アクセスごとに引っ張ってきていたのですがあまりにも index 表示が重くなってしまったので、perl で javascript へ一度変えておいて index からはその javascript を読み込む仕組みへ変えてみました。サクサク表示になったぞ。
kinugasa-link.pl
#!/usr/bin/perl
use strict;
use HTML::Template;
use WebService::Kinugasa;
my $Skey = 'InputYourSKEY';
my $count = 3;
my $html_head = '';
my $html_foot = '';
my $kinugasa = WebService::Kinugasa->new(
skey => $Skey,
num => $count
);
my $links = $kinugasa->link();
my $lists = $links->feeds();
my $output;
for (my $i = 0; $i < $count; ++$i) {
$output->[$i]->{IMAGE} = $lists->[$i]->{mediumimage};
$output->[$i]->{FRIEND_URL} = $lists->[$i]->{url};
$output->[$i]->{HANDLENAME} = $lists->[$i]->{handlename};
$output->[$i]->{COMMENT} = $lists->[$i]->{comment};
}
my $template = HTML::Template->new(filename => 'kinugasa-link.tmpl');
$template->param(KINUGASA_LINK => $output);
$template->param(HTML_HEAD => $html_head);
$template->param(HTML_FOOT => $html_foot);
js_output($template->output());
exit;
sub js_output {
my @lines = split /
/, shift;
for (@lines) {
s/x27/'/g;
print "document.writeln('$_');
";
}
}
kinugasa-link.tmpl
<TMPL_VAR NAME=HTML_HEAD>
<table>
<TMPL_LOOP NAME=KINUGASA_LINK>
<tr>
<td><img alt="<TMPL_VAR NAME=HANDLENAME>"
src="<TMPL_VAR NAME=IMAGE>" border="0" /></td>
<td align="left"><a href="<TMPL_VAR NAME=FRIEND_URL>"
target="_blank"><TMPL_VAR NAME=HANDLENAME></a></td>
</tr>
<tr>
<td colspan="2" align="left"><TMPL_VAR NAME=COMMENT></td>
</tr>
<tr>
<td colspan="2"><hr color="#003060" width="80%"></td>
</tr>
</TMPL_LOOP>
</table>
<TMPL_VAR NAME=HTML_FOOT>
あとは cron で kinugasa-link.pl を実行して kinugasa-link.js を定期的に吐き出すように。このあたりの方法は Blog Hacks に記載されてますのでそちらも一緒に参照をどうぞ。
キヌガサ では現在一部キヌガサが保持する情報などを利用できる Kinugasa WebService というものがテストで稼動してます。
早速扱いやすいように perl module として WebService::Kinugasa を作ってみました。WebService の仕様がシンプルなのでこちらも非常にシンプルにまとめてます。LWP::Simple と XML::Simple を使ってますのでこちらもお忘れなく。
で一応うちのサイトでも使ってみたものの…なんか凄い晒しあげみたいなことになってるけど、いいのかこれは。
んでもって自分自身のステータスがないのね。
