入力行に時刻を付けて吐き出すフィルタ

  http://pmakino.jp/tdiary/20051205.html#p01

  なるほど!いいアイディア.でも,出力をファイルにリダイレクトするならば,
  バッファリングしてはいけない予感.

  で自分の趣味的に書き換えたのが,以下.

#!/usr/bin/env perl
use strict;
use warnings;
use POSIX qq(strftime);
$| = 1;
while (defined(my $line = <>)) {
    print strftime('%Y/%m/%d %H:%M:%S ', localtime), $line;
}

$ ping -s localhost | ./puttime.pl > ping-localhost.log

  とかして放置しておくと,

$ cat ping-localhost.log
2005/12/06 21:25:37 PING localhost: 56 data bytes
2005/12/06 21:25:37 64 bytes from localhost (::1): icmp_seq=0. time=0. ms
2005/12/06 21:25:38 64 bytes from localhost (::1): icmp_seq=1. time=0. ms
2005/12/06 21:25:39 64 bytes from localhost (::1): icmp_seq=2. time=0. ms
2005/12/06 21:25:40 64 bytes from localhost (::1): icmp_seq=3. time=0. ms

  ああ,これは便利だ.

Perl と ImageMagick を使って画像を HTML の table に変換

- ImageMagick で画像を HTML に変換
  http://blog.shebang.jp/archives/50279808.html

  というのをみて,そういえば大分前に似たようなのを作ったので紹介しておこう.

#!/usr/bin/env perl
# tableart - 画像ファイルからテーブルアートを作成

use strict;
use warnings;
use Image::Magick;

my $image = readImage();
my ($width, $height) = $image->Get('width', 'height');

print qq(<table border="0" cellpadding="0" cellspacing="0">\n);    
for (my $h = 0; $h < $height; ++$h) {
    my @colors = ();
    for (my $w = 0; $w < $width; ++$w) {
        my @pixel = split /,/, $image->Get("Pixel[$w, $h]");
        my ($r, $g, $b) = map { sprintf '%02x', ($_ > 0) ? int($_ / 256) : 0; } @pixel;
        push @colors, "#$r$g$b";
    }
    print qq(<tr>\n);
    map { print qq(<td width"1" bgcolor="$_"></td>\n); } @colors;
    print qq(</tr>\n);
}
print qq(</table>);

sub readImage {
    my $image = new Image::Magick;
    if (@ARGV >= 1) {
        # ファイルから画像を読む
        $image->ReadImage($ARGV[0]);
    } else {
        # 標準入力から画像を読む
        $image->ReadImage('-');
    }
    return $image;
}


  大分前に作ったので若干のダサさは残るけど,これでいわゆるテーブルアートを作ることができる.

- テーブルアート(HTML タグ) のページ
  http://hinoki.sakura.ne.jp/~okada/table/

Make を利用した JavaScript ファイルの結合・圧縮

  http://d.hatena.ne.jp/llamerada/20051204/1133674702

  GNU make と JavaScript を圧縮する Java プログラム Dojo's Compressor を用いて
  JavaScript ファイルを結合し圧縮する方法.

SRC = test1.js test2.js
COMB = test.js
COMP = small_test.js
all: $(COMP)
$(COMB): $(SRC)
    cat $(SRC) > $(COMB)
$(COMP): $(COMB)
    java -jar custom_rhino.jar -c $(COMB) > $(COMP)


  なるほど,こういう使い方もあったか.
  圧縮された JavaScript ファイルは,改行を削除しても大丈夫そうだったので
  Makefile の最終行を

java -jar custom_rhino.jar -c $(COMB) | tr -d "\n" > $(COMP)

  としてみた.結果はもちろん OK だった.

- via: Dojo's Compressor
  http://dojotoolkit.org/docs/compressor_system.html

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);

Ajax も Flash もトラックできる!?Google Analytics の脅威

  http://www.fladdict.net/blog-jp/archives/2005/11/ajaxflashgoogle.php

  これは,すごいですね.JavaScript の場合は以下で OK.

<a href="javascript:void(0);" onclick="javascript:urchinTracker('/folder/file');">


  むむむ,組み込んでみるかな.

- How do I track JavaScript events?
  https://www.google.com/support/analytics/bin/answer.py?answer=27244&topic= ...

コメントスパム対策

  やたらとコメントスパムが目立つようになってきたので,対策.
  日本語が全く含まれない場合,コメントが書き込まれないようにした.

if (!preg_match("/[\x80-\xff]/", $comment)) {
    // エラー: コメントに日本語が含まれない
}

Google Analytics へ自動ログインするスクリプト

var IE = WScript.CreateObject("InternetExplorer.Application");
IE.Visible = true;
IE.Width = 1000; IE.Height = 800;
IE.Navigate("https://www.google.com/accounts/ServiceLoginBox?"
 + "service=analytics&nui=1&hl=ja-JP&"
 + "continue=http://www.google.com/analytics/home/%3Fet%3Dreset");
while(IE.busy) ;
while(IE.Document.readyState != "complete") ;
IE.Document.forms[0].Email.value = "YOUR MAIL ADDRESS";
IE.Document.forms[0].Passwd.value = "YOUR PASSWORD";
IE.Document.forms[0].submit();



- ref.: たつをの ChangeLog
  http://nais.to/~yto/clog/2005-11-06-1.html

Samba スイートの smbtar で Windows の共有フォルダをまるごとバックアップ

  • サーバ名: server
  • 共有フォルダ: share
  • ユーザ名: user
  • パスワード: password
  •   の場合

    % smbtar -s server -x share -u user -p password -t - | tar xvf -

      もしくは

    % smbclient //server/share password -U user -Tc - | tar xvf -

      smbtar は内部で smbclient を呼び出しているので上記どちらでもいい.
      Solaris 8 で確認したけど,Linux,FreeBSD でもいけると思う.

      smbmirror として ~/bin に保存

    #!/bin/sh

    SERVER=server
    SHARE=share
    USER=user
    PASSWORD=password
    LOGFILE=~/.smbmirror.log

    SMBTAR=/usr/local/samba/bin/smbtar
    TAR=/usr/bin/tar

    echo `date` >> $LOGFILE
    $SMBTAR -s $SERVER -x $SHARE -u $USER -p $PASSWORD -t - | $TAR xvf - >> $LOGFILE


    - smbtar
      http://www.samba.gr.jp/project/translation/3.0/htmldocs/smbtar.1.html

    Boost C++ Libraries

      http://boost.org/

    - Boost Software License
      http://boost.org/more/license_info.html

    - 文字列の分割

    #include <iostream>
    #include <string>
    #include <boost/tokenizer.hpp>

    int main() {
        std::string s = "This is a test";
        boost::tokenizer<> tok(s);
        for (boost::tokenizer<>::iterator t = tok.begin(); t != tok.end(); ++t) {
            std::cout << *t << std::endl;
        }
    }


    - 出力

    This
    is
    a
    test

      むむむ,これはいいじゃないか.
      ただ,Solaris 8 + gcc 2.95.3 な環境では,tokenizer は Boost 1.30.2 じゃないと使えなかった.

    JavaScript で配列に値があるかチェックするメソッドを Array オブジェクトに定義する

    Array.prototype.include = function(v) {
        for (var i in this) {
            if (this[i] == v) return true;
        }
        return false;
    }


    - 使用方法

    [1, 2, 3, 4, 5].include(1); // 配列 1, 2, 3, 4, 5 の中に 1 があるかどうか


      もう少し,すっきりしないかな.

    - ref.: 最速インターフェース研究会 :: 実践JavaScriptリファクタリング
      http://la.ma.la/blog/diary_200510060733.htm