Home > Archives > 2008年01月

2008年01月

スレッドを特定のCPUコアに貼り付ける

Windows だと SetThreadAffinityMask で貼り付けたいコアに対応したビットだけ立てたビットマスクを指定すればよいらしい.でも,どのビットがどのコアに対応しているのかよくわからない.ビットマスクとかのフラットな構造でなく,CPUの接続の階層に従った構造体で指定できると楽なのだけど...

ひさびさにあなごる

Palindromic Quine を sed で 417bytes.

機械的に作っているのでなかなか縮まない.基本的には,「エスケープした文字列データをそのまま出力しなおす,エスケープ解除して出力する,今まで出力した部分の反転を出力する」,という3つの動作をするプログラムを書いて,そのプログラムをエスケープした文字列をそのプログラム自身に食わせれば望みのものが出来上がる.が,この3つの動作をするプログラムが100bytes近くかかっているので,全体で4倍の400bytes超えになってしまう.

もうちょっと頭使わないとだめかなぁ.中心のプログラムが palindrome ならデータ部分とあわせても3倍ですむのだが... むずい.ついでに,最後に必ず改行が出てしまうので,その分先頭に余計な改行が必要なのも...

Project Euler をやってみる

Project Eulerの問題を頭からいくらかといてみた.基本 Haskell 使ってるけど時々スタックがオーバーフローしたり遅かったりするので C++ を織り交ぜる.多倍長の演算とかはHaskelがとても楽でいい.まだまだ最初のほうなのであまり面白い問題ないけど順番にやっていこう.

SRM 388 DIV 1

目が覚めたので久々に参加.でも250点問題を即効で解いただけ.500点問題は計算量の見積もりが面倒になって寝た.

250点問題:素因数分解に含まれる素数が与えられた数以下であるような数を数え上げる.素数テーブルを持って割っていくのみ.6分で解いたらしい.

500点問題:グラフを何回被覆できるかという問題だけど… 被服のための基底を生成したあたりで計算量の見積もりが面倒になってやめた.どうやらメモ化したバックトラックでよかったらしい.

1000点問題:指定したハミング距離をもつ指定桁の16進数のうち小さいほうから指定番目を返せと.エラー訂正のほうの理論使って簡単に出来ると面白いなぁ.

メールの転送を

PCで受信しているメールを携帯でも受信したい.ただしパケット代が高いので,スパムは転送しない,添付ファイルはファイル名だけわかればいい,本文もある程度の長さで切れてしまえ,という仕様にしたい.

今回とった手段は,ひとまず Gmail に転送してスパムを高確率で殺す,そいつをレンタルサーバの転送専用メールアカウントに転送する,さらにそのアカウントで添付ファイルや本文の短縮の加工を行い携帯側へ転送する,とかいう摩訶不思議なリレー.

で,調べてみたらレンタルサーバのメール振り分けは maildrop とかいうのでやっているらしく,転送設定は通常の .forward ではなく.mailfilter とかいうものを書くらしい.つーことで,.mailfilter を転送用メールアカウントのディレクトリに置いて,中身を次のように指定.パーミッションを 600 とかにしておかないと動いてくれないので困る.

cc "| ../../mail_forwarding.pl"

そんで,次の転送用のプログラム mail_forwarding.pl を適当に配置.いわゆる .eml が添付されてきたときには再帰的に展開して本文にくっつけてしまう.他はテキスト以外の添付は切り捨て.

#!/usr/bin/perl
 
use MIME::Parser;
use MIME::Words qw(:all);
use Jcode;
#use encoding "7bit-jis";
 
$forward_addr = 'hugahoge_tekitou@docomo.ne.jp';
$sendmail = '/usr/sbin/sendmail';
$length_limit = 512;
 
 
sub extract_body {
    my ($entity) = @_;
    my $body = $entity->bodyhandle;
    my $head = $entity->head;
    my $type = $head->mime_type();
    my $str = "";
    my $nm = $head->recommended_filename;
 
    #print "type = $type\n";
    if( $type eq "multipart/mixed") {
    #if($entity->is_multipart()) {
            my $count = $entity->parts;
            for(my $i = 0; $i < $count; $i++){
                    my ($st, $n) = extract_body($entity->parts($i));
                    if($n ne "") {
                if($nm ne "") { $nm .= ", "; }
                           $nm .= $n;
            }
                    if($st ne "") { 
                if($str ne "") { $str .= "===\n"; }
                $str .= $st;
             }
            }
    } elsif( $type eq "text/plain") {
        $str = $body->as_string;
    } elsif( $type eq "text/html") {
        $str = $body->as_string;
    } elsif( $type eq "message/rfc822") {
        # should be recursively decoded
        my $io = $body->open("r");
           my $et = $parser->parse($io);
        my ($st, $n) = extract_body($et);   
        $str = $st;
                   if($n ne "") {
            if($nm ne "") { $nm .= ", "; }
                       $nm .= $n;
        }
    } else {
    }    
    return ($str, $nm);
}
 
sub extract {
    my ($head, $attr) = @_;
    my $dat = $head->get($attr);
    my @decs = decode_mimewords($dat);
    my $ret = "";
    foreach $data (@decs){
        my ($target,$charset) = @$data;
        if($charset ne "") {
            Jcode::convert(\$target, $charset, 'jis');
        }
        $target =~ s/\n//g;
        $ret .= $target
    }
    return $ret;
}
 
sub stlip_bracket {
    my ($dat) = @_;
    $dat =~ s/(^|,)[^>]*<([^<>]*)>/\1\2/g;
    return $dat;
}
 
$parser = new MIME::Parser;
$parser->output_to_core(1);
$parser->extract_nested_messages(0); 
 
$entity = $parser->parse(\*STDIN) or die "parse failed\n";
$head = $entity->head;
$from = &extract($head, 'From');
$to   = &extract($head, 'To');
$cc   = &extract($head, 'CC');
$subj = &extract($head, 'Subject');
 
$from = stlip_bracket($from);
$to = stlip_bracket($to);
$cc = stlip_bracket($cc);
 
$body = "";
($body, $files) = extract_body($entity);    
 
$mes = "";
$mes .= "From: $from\n";
$mes .= "To: $to\n";
if($cc ne "")    { $mes .= "CC: $cc\n"; }
$mes .= "Subj: $subj\n";
if($files ne "") { $mes .= "File: $files\n"; }
$mes .= "$body";
 
if(length $body > $length_limit) {
    $body = substr($body, 0, $length_limit);
}
 
$modbody = $body.($to ne "" ? "\nTo: ".$to : "").($cc ne "" ? "\nCC: ".$cc : "").($files ne "" ? "\nFs: ".$files : "");
 
#$esub = encode_mimeword($subj);
$top = MIME::Entity->build(Type    =>"text/plain",
                           From    => $from, 
                           To      => $forward_addr,
               Data    => $modbody,
                           Subject => $subj,
               Encoding => "7bit",
               Charset => "ISO-2022-JP",
                          # Subject => $esub);
              # CC      => $cc,
              # Encoding =>"quoted-printable",
            );
 
#print $mes;
$top->print(\*STDOUT);
#exit(0);
 
open(MAIL, "| $sendmail -t") or die "seinding a mail failed";
$top->print(\*MAIL);
print MAIL "\n\n.\n";
 
#$top->head->replace('To', 'debug_output@hugahoge_tekitou.com');
#open(MAILLOG, "| $sendmail -t") or die "seinding a mail failed";
#$top->print(\*MAILLOG);
#print MAILLOG "\n\n.\n";
 
 
 

とりあえず動いてるけど HTML メールのときにタグをなくしてテキスト化したいなぁ.そして perl で書いたけど別の言語で書いたほうが楽だったかなぁ.perl なんて久々に使ったから perl として普通のプログラムなのか怪しいし.

Home > Archives > 2008年01月

Search
Feeds

Page Top