2006年声優言及数(11)言及数カウント・合計値算出

ようやく最終回。前回まではCのコードでカウント数まで出して、本当ならこのままカウント数の合計まで出したいところなのですが・・・やめることにしました。理由は以下の通り。

1. 日付の指定範囲が分からない
画像を解析すればわかるけど、ちょっと面倒すぎるということと、画像をダウンロードした時点で自分で分かるはず*1ということがあります。
2. URIデコードしたい
もちろんC言語でもできるけど。めんどくさい。
3. 他にも使いまわしたい
一応構造体に中身を入れてはいるので使いまわせるけど、LLから使いまわしたいということもあるかもしれない。ないかもしれない・・・

1の理由が99%なんですけどね。まあ、色々考えるとカウント数だけ出して、その後フィルターかけて言及数の合計値を出したほうがよいという結論に。

で、合計値の算出方法ですが。

画像から求めた合計値 * (日数/ピクセル数)

でいけるかと。日数はグラフの対象になった日数、ピクセル数はグラフの横軸のピクセル数。つまりカウントした数。1年カウントすると、ピクセル数よりカウント対象日数の方が多くなってしまうので、誤差は避けられないですね・・・。大雑把に傾向をつかむくらいしかできなそう。はてながこの辺の詳細データを取得するAPIを公開してくれればいいんだけど、そういうデータって売り物になるよね、多分。

use Time::Local;
use File::Basename;
use strict;

my ($file, $sday, $eday) = @ARGV;
my $days  = (timelocal(0,0,0,atotime($eday)) - timelocal(0,0,0,atotime($sday)))/(60*60*24);
my ($name, $name_dec);

open(F, $file) || die("open $file failed.");
while(<F>){
    if(/input file: /){
        chomp;
        $name = basename($_, ".*");
        $name =~ s/\..+//g;
        $name_dec = $name;
        $name_dec =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
    }
    if(/count:/){
        chomp;
        s/^count://;
        my @l = split(/ /);
        printf("%s\t%s\t%.1f\t%d\t%d\t%.1f\n", 
               $name_dec, $name, sum(\@l), $days, scalar(@l), sum(\@l) * $days/scalar(@l));
    }
}

sub sum{
    my $array = shift;
    my $sum=0;
    foreach(@$array){
        $sum += $_;
    }
    return $sum;
}

sub atotime{
    my $str = shift;
    my @l = unpack("A4A2A2", $str);
    return($l[2], $l[1]-1, $l[0]-1900);
}

こんなかんじですかね。

$ ./png ../l/%A4%A2%A4%AA%A4%AD%A4%B5%A4%E4%A4%AB.html.png | perl countkwgraph.pl - 20051227 20061222
あおきさやか    %A4%A2%A4%AA%A4%AD%A4%B5%A4%E4%A4%AB    201.7   360     362     200.6

Perl豆知識

openのファイル名に"-"を指定すると、標準入力をオープンします。これは楽ちんね。

いやあ

終わった終わった。無事書ききれてよかった。書いてるうちにPNGの勉強にもなったし、libpngもそれなりに使えるようになったし、バグも見つかったしいいことづくめですね。結構めんどくさかったけど・・・。

最終的にソースコードは400行程度と、あれだけ色々やった割にはコンパクト。一応ここにおいておきます。refererチェックしてるっぽいのでリンクからはたどれないかも。

*1:カウント値のmaxは自分で決められないので分からない