chalow にタグ (カテゴリ) の一覧を視覚化する機能をつけてみた

  トップページ右側のカレンダーの下に設置してみた.
  よくある感じの,タグの視覚化.

  タグの視覚化

  タグの個数から偏差値を算出してフォントサイズ及び前景色を決定しています.
  フォントサイズを算出するところの数式がよく分からなかったので某田上氏に聞いたらあっさり
  解決してくれた.感謝.

  このサイトの傾向が少しでもわかるかもしれないけど,タグを設定していないエントリも多々あるので
  あまり意味はないかもしれませんね.

  ソースは汚い上に,なんか適当すぎて無駄も多いので出したくないんだけど,ここまで書いておいて出さないのも
  あれなので,いやいやながら公開しておきます.

sub create_tag_list {
    my @tags = ();
    my ($max_font_size, $min_font_size) = (24, 9);
    my ($sum, $sum_sq) = (0, 0);
    my ($max, $min) = (0, 9999); # 超 adhoc
    my $i = 0;
    # 平均値と標準偏差を算出
    foreach my $cat (keys %{$cl->{CAT}}) {
        my $n = $cl->{CAT}->{$cat};
        $sum += $n;
        $sum_sq += $n ** 2;
        $i++;
    }
    return if ($i <= 1);
    # 平均値
    my $avrage = $sum / $i;
    # 標準偏差
    my $stdev = sqrt(($sum_sq - $sum ** 2 / $i) / ($i - 1));

    # 偏差値の最大値と最小値を算出
    foreach my $cat (sort keys %{$cl->{CAT}}) {
        my $dev = $cl->{CAT}->{$cat} - $stdev / $stdev * 10 + 50;
        $max = $dev if ($max < $dev);
        $min = $dev if ($min > $dev);
    }

    # フォントサイズと色を決定
    foreach my $cat (sort keys %{$cl->{CAT}}) {
        my $n = $cl->{CAT}->{$cat};
        my $dev = $n - $stdev / $stdev * 10 + 50;
        my $font_size = sprintf('%.1f', ($max_font_size - $min_font_size) * ($dev - $min) / ($max - $min) + $min_font_size);
        my $color;
        if (($max_font_size + $min_font_size) / 3 * 2 < $font_size) {
            $color = '333';
        } elsif (($max_font_size + $min_font_size) / 3 < $font_size) {
            $color = '666';
        } else {
            $color = '999';
        }
        push @tags, sprintf('<a href="%s" style="color: #%s; font-size: %.1fpt;">%s</a>', get_category_filename($cat), $color, $font_size, $cat);
    }
    return join("\n", @tags);
}


  これを適当な位置,例えば,

write_category_list_file();    # カテゴリ一覧を作る
my $tag_list = create_tag_list();


  のように,write_category_list_file() の下辺りで呼び出しておいて,
  各ページを組み上げるところで,以下のようにテンプレート変数に渡してあげれば,使えるようになります.

$t->param(tag_list => $tag_list);