携帯からメールでWikipedia
404 Blog Not Found:perl - mail to twitter gateway
をみて触発されて(?)、メールの本文にクエリを書いてメールするとWikipediaの内容が返信されてくるメールゲートウェイをPerlで書いてみた。ほぼ生まれて初めてCPANを駆使したから内容的にはかなり適当。まだ文字化けが残ってるけど一応ちょこっと調べたいときとかには使えそう。
ソースを公開しておく。
#!/usr/bin/perl -w use warnings; use strict; use Net::POP3; use Net::SMTP; use WWW::Wikipedia; use utf8; use Encode qw(from_to); use Encode; use MIME::Base64; my $smtp_server = 'SMTPサーバ'; my $pop_server = 'POPサーバ'; # POP before SMTP用 my $username = 'POPのユーザ名'; my $pass = 'POPのパスワード'; my $query = ''; my $from = ''; my $is_base64 = 0; my $charset = 'iso-2022-jp'; while(<>){ if (1 .. /^$/){ if (!$from && /^From:?\s+(\S+)/o){ $from = $1; } $charset = $1 if /^Content-Type:.*?charset=([A-Za-z0-9_\-]+)/io; $is_base64 = 1 if /^Content-Transfer-Encoding:\s+base64/io; }else{ $query .= $_; } } $query = decode_base64($query) if $is_base64; $query =~ s/\n.*//g; my $subject = $query; $query = decode($charset, $query); my $wiki = WWW::Wikipedia->new(language => 'ja'); my $entry = $wiki->search($query); my $msg = join "", $entry->fulltext(); $msg =~ s/-\s*\n#?\s*//g; # WWW::Wikiediaで癖がある部分を取り除く。 from_to($msg,"utf8","iso-2022-jp"); # POP before SMTP用 my $pop = Net::POP3->new($pop_server); if($pop->login($username, $pass) >= 0) { $pop->quit; }else{ die "can not login.\n"; } # SMTP my $smtp = Net::SMTP->new( Host => $smtp_server, Hello => $smtp_server, ); # 送信元の指定 my $from_server = '"Wikipedia Mail" <返信メールの差し出しアドレス>'; $smtp->mail($from_server); $smtp->to($from); # 今の時間 my $date = &date; $smtp->data(); $smtp->datasend("Date:$date\n"); $smtp->datasend("From:$from_server\n"); $smtp->datasend("To:$from\n"); $smtp->datasend("Subject:$subject\n"); $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); $smtp->datasend("Content-Type: text/plain;charset=\"ISO-2022-JP\"\n\n"); $smtp->datasend("$msg\n"); $smtp->dataend(); $smtp->quit; sub date { $ENV{'TZ'} = "JST-9"; my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); my @week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); my @month = ( 'Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec' ); my $d = sprintf("%s, %d %s %04d %02d:%02d:%02d +0900 (JST)", $week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec); return $d; }
単純にWWW::WikipediaでとってきてNet::SMTPで返信するだけのものです。まだWWW::Wikipediaでとってきたテキストの整形がうまくいかなくて文字化けすることがあるけど気がついたら直していきます。実用にはさほど問題ないはず。
メールヘッダを読み込むところは404 Blog Not Foundさんのところのを拝借しました。ただ、Fromを抽出する正規表現のところでFrom直後の「:」が抜けていたので付け加えました。ありがとうございました。
あとは上のスクリプトを775とかにして、qmailなら.qmailあたりに
| preline /path/wikipediamail.pl
とか書いておけば動くと思います。
Twitter Notiferいれてみた。
naan studioさんが公開しているTwitterNotifierを導入してみた。
ステータスバーにアイコンが表示されてクリックすると最後に読み込んだ最新5件の書き込みと書き込みフォームが表示される。設定した間隔で読み込みにいって、新しい書き込みがあると表示してくれるてかなり快適。
All-in-one Sidebarを入れてたせいかうちの環境だとtweetbarがうまく動かなかったのでとても満足。
Double.MIN_VALUEとDouble.NEGATIVE_INFINITY
同じようなもんだと思ってたら全然違うものだった。
Double (Java 2 プラットフォーム SE v1.4.0)
- MIN_VALUE
- double 型の正の非ゼロ最小値です。
- NEGATIVE_INFINITY
- double 型の負の無限大値を保持する定数です。
Arrays.fillでDouble.MIN_VALUEで埋めてから値を入れていって最大値を取り出したらMIN_VALUEがわらわら出てきて発覚。ほかのライブラリも見直しておかなきゃ。
ちなみにSystem.out.printlnで出力すると
System.out.println(Double.MAX_VALUE); System.out.println(Double.POSITIVE_INFINITY); System.out.println(Double.MIN_VALUE); System.out.println(Double.NEGATIVE_INFINITY); 結果 1.7976931348623157E308 Infinity 4.9E-324 -Infinity