10月 272014
 

必要に迫られて perl でグラフを書くことになりました。 perl でグラフを書くためには以下のモジュールを利用すれば良いみたいです。

円グラフ: GD::Graph::pie
線グラフ: GD::Graph::lines
棒グラフ: GD::Graph::bars
棒と線の混ざったグラフ: GD::Graph::mixed

などを利用するとサクっとグラフが書けるし、ウェブで検索すると、そのためのサイトがちらほらとあるので非常に簡単にグラフが書けてよかったです。

しかし、GD::Graph の問題点もちらほら。

一個目
GD::Graph::mixed を利用したとき、グラフの右側が折れ線グラフの値のラベルで左側が棒グラフのラベルだとした場合、 y2_min_value の値が有効にならないみたいです。 y1_min_value の値と一緒になってしまうという、明らかにバグちっくな動作をしてしまう。利用している GD::Graph のバージョンの影響もあるのかな?

ちょっとサンプルコードを。

$graph->set(
        :
    types        => [ qw(bars lines) ],
    y1_max_value => 5,
    y1_min_value => 0,
    y2_max_value => 100,
    y2_min_value => 70,
        :
);

 

上記のようなコードにした場合、y1_min_value も y2_min_value も結局 “0” から始まってしまうので mixed グラフはあきらめて lines と bar のグラフを二個表示させるようにしました。orz

 
二個目
円グラフでグラフの中に文字を表示したい場合、その文字列が長いと悲しい状態になってしまいますなぁ・・。

以下、サンプルのグラフ。

test_pie0

でもって、これを回避するために GD::Text::Align など GD::Text 系を利用して色々編集できるらしいのですが、ウェブで探してもサンプルコードや、実際に表示できる成果物のグラフが無いので利用するのを断念しました。

php でグラフを書く場合には絵グラフの横に各フィールドの説明分を表示できるみたいなんですが perl ではそれができないみたいです。
表示しようとする文字列に “\n” を入れると改行はしてくれますが、センタリングしてほしいなぁ。とか、均等割付けしてほしいなぁ。と思う場合にはどうすんべな。とか思うのですが、それもあきらめました。
なので、 HTML で以下のように表示するようにしました。

test_pie1

これは簡単にできたのでコードを掲載してみます。

#!/usr/bin/perl

use strict;

use GD::Graph::pie;
use GD::Graph::colour qw( :files );
use GD::Text;

use Jcode;

GD::Graph::colour::read_rgb("./rgb.txt");

my @count  = qw(4 5 3 2 5);
my @color  = qw(OldLace OliveDrab OrangeRed PaleGoldenrod PaleTurquoise);
my @title  = (
    "1.長い文字列のデータ $count[0]",
    "2.長い文字列のデータ $count[1]",
    "3.長い文字列のデータ $count[2]",
    "4.長い文字列のデータ $count[3]",
    "5.長い文字列のデータ $count[4]",
);

#my @data = ([@title],[@count]);
my @data = ([@count],[@count]);

my $pie   = GD::Graph::pie->new(190,200);
$pie->set(title   => jcode("円グラフ")->utf8,
    axislabelclr  => 'black',
    dclrs         => [ @color ],
    pie_height    => 0,
    start_angle   => 180,
    transparent   => 0,
);

GD::Text->font_path("./");
$pie->set_title_font("ume-tgc4.ttf",8);
$pie->set_value_font("ume-tgc4.ttf",9);

my $image = $pie->plot(\@data);

my $graph = "./test_pie.png";
open( OUT,">$graph");
binmode OUT;
print OUT $image->png();
close OUT;

my $html = &make_title(\@title,\@count,\@color);

print "Content-type: text/html;charaset=utf-8\n\n";
print <<EOF;
<HTML>
<HEAD><META HTTP-EQUIV="Content-type" CONTENT="text/html;charset=utf-8"></HEAD>
<BODY>
<TABLE BORDER="0">
<TR><TD><IMG SRC="${graph}"></TD><TD>${html}</TD></TR>
</TABLE>
</BODY>
<html>
EOF

exit 1;

##
sub make_title {
    my ($title,$count,$color) = @_;

    my $c = 0;
    my $html = "<table bgcolor=\"#DCDCDC\" border=0 class=\"sen\">\n";
    foreach (@$title) {
        $html .= "<tr bgcolor=\"#FFFFFF\" class=\"font\">\n";
        $html .= "<td bgcolor=\"$color->[$c]\">$count->[$c]</td>\n";
        $html .= "<td>$title->[$c]</td>\n</tr>\n";
        $c++;
    }
    $html .= "</table>\n";

    return ($html);
}

 

メインルーチンはグラフを書くのに一生懸命になっていて、サブルーチンの make_title() では TABLE タグを利用していてダサいですが、円グラフのフィールドに書くべき文字列を別途表示するようにしました。
既に組み立てた配列のデータをそのまま利用しているので比較的容易に情報を別途表示することが可能になりました。
詳細についてはコードをじっくりと追ってみてください;-)。あ。 make_title() の中ではスタイルシートとかバシバシ書くと更に見栄えが良くなると思います。

とまぁ、こんな感じで文字列が長い円グラフもなんとか見栄え良く表示できるようになりました。めでたしめでたし;-)。

 
ちなみに上記のコード中で利用している rgb.txt は emacs や netpbm に含まれているモノを利用できます。フォントは ume-tgc4.ttf を利用していますが、これは ume フォントに含まれているモノを利用しました。

1月 312014
 

いやー。WordPress なブログを三つ持っているのですが、そのうち二つのブログで WordPress 3.7.1 から 3.8.0 そして 3.8.1 へ自動アップデートできなくて困っています。

/wp-admin/update-core.php から [今すぐ更新] ボタンを押すと以下の画面になって、 wordpress.com へのアクセスがタイムアウトしているようです。

WordPress_update

パケットキャプチャしたり、自分のサーバのログを見たのだけど、どうも原因が特定できない状態。しょーがないので自動アップデート(ボタンによる更新作業。か)は断念して、手動アップデートすることにしました。

以下はその作業ログです。あ。root もしくはシェルが利用できる環境が必須です。 ftp しか利用できない環境では、残念ながら無理かもしれません。

あと、この手順で手動バージョンアップを実施してブログがおかしくなっても筆者(それはつまりは僕のことですが)は責任は持てないので、自己責任でお願いします。

 
1). 作業前にバシっとバックアップを取りましょう。
ブログの DocumentRoot が /usr/local/www/blog/ だとして話を進めます。

$ sudo -s
# cd /usr/local/www/
# tar cvzfp blog-backup.tgz ./blog
# cd blog/
# cp wp-config.php wp-config.php.sv

 

バックアップが完了しました。まぁ、ほぼ全部を tar で固めたのでイザというときは解凍すれば良いだけですね。必要であれば MySQL などの DB もバックアップしましょう。僕はバックアップしませんでしたけどf(^^;;。

 
2). パーミッションの確認
ブログの DocumentRoot が /usr/local/www/blog/ だとして、その下の wp- で始まるファイル群ののオーナーとグループを確認します。 apache:apache とか www:www や daemon:daemon などでしょうかね?

 
3). WordPress のソースの展開
WordPress のサイトからダウンロードして来たインストールしたいバージョンのファイルを展開し、オーナーとグループを直します。

$ unzip wordpress-3.8.1-ja.zip
$ cd wordpress
$ sudo -s
# chown -R apache:apache ./*
#

 
4). バージョンアップ実施
インストール前にオーナーとグループをそろえたので後はドバっと行きます;-)。

# cd ~/wordpress/
# /bin/cp -pr * /usr/local/www/blog/
#

 
豪快に cp します。オプションに -pr を付けたのでパーミッションと全てのディレクトリをサクっとインストールしてくれます。

ダウンロードした wordpress を展開したディレクトリの中のディレクトリは wp-admin/ wp-content/ wp-includes/ の三つです。wp-content/ の中が気になるようでしたら別途保存しても良いかと思われます。

が、上記で一応ファイル群のインストールは完了しました。

 
5). データベースの更新
cp -pr の実行が完了したら http://FQDN/wp-admin にアクセスしログインします。ログインするとデータベースを更新する必要があります。と、言われるので[WordPress データベースを更新]ボタンを押します。

WordPress_update2

これが無事に終わるとアップデートは完了です。

手動でやるとしてもずいぶんと簡単ですねぇ。「WordPress の更新」の画面からボタンをぼちっとな。と、押してもダメな場合はバックアップの後に cp -pr ってことでしょうかねぇ。けど、せっかくならインストール用スクリプトも同梱してくれれば良いのになぁ。

8月 182013
 

ずいぶん前、それは多分 pgp2.6 辺りが流行っていたころだと記憶していた頃に聞いた話ですが、フランスでは民間人の暗号化された情報のやりとりは禁止されている。ってことらしいですが、それが本当の話か、はたまた全然間違いだったのか? というのは確認してないので定かではないのですが、そんな話を耳にしたことがあります。

最近の出来事としてはマルウェアだかトロイの木馬だかで情報がごっそり、特定のサーバに送られてしまう。なんて話も聞きますが、FreeBSD は安心さー。みたいな感じで。あぁ、確かに利用者数からしても Linux や Solaris よりは圧倒的に少ないとは思うのですけどね。それでも Mac OSX でも最近はちらほらと話は聞くので、 ID やパスワードを書いたテキストファイルをデスクトップに置いといてもちょっとアレですね。

と、いうことで、そーいう重要なファイルなどは暗号化して持っていることにしましょう。と、いうのが今回のエントリの趣旨です。

利用するのは openssl で暗号化形式は des3。 パスワードとか住所とか書かれているファイルを普段は暗号化して持っていましょう。って感じでちょっとスクリプトを書いてみました。

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin/:/usr/local/bin
export PATH

desfile=`echo "${HOME}/.data/Encryption_txt.des3"`
orgfile=`echo "${HOME}/.data/Encryption_txt"`
oldfile=`echo "${HOME}/.data/Encryption_txt~"`

case $1 in
'-d' )
    if [ -f $orgfile ]; then
	openssl des3 -salt -in $orgfile -out $desfile
	if [ -f $oldfile ]; then
	    /bin/rm -f $oldfile
	fi
	if [ -f $desfile ]; then
	    /bin/rm -f $orgfile
	fi
    else
        echo "$orgfile is not found.";echo ""
    fi

    ;;
'-u' )
    if [ -f $desfile ]; then
	openssl des3 -d -salt -in $desfile > $orgfile
    else
	echo "$desfile is not found.";echo ""
    fi
    ;;
* )
    echo "usage : Encryption.sh { -d(des) | -u(undess) }"
    ;;
esac

exit 1;

 
こんな感じでどうでしょうかねぇ?

色々人に見られたくない情報が書かれたファイルは ${HOME}/.data/Encryption_txt というヤツです。
上記のスクリプトを例えば Encryption.sh という名で保存してオプションに -d を指定すると openssl des3 で暗号化するためにパススレーズを二回入力します。

Encryption_txt と、いうファイルは ${HOME}/.data/Encryption_txt.des3 という名で保存されます。その時、 emacs で編集していれば ${HOME}/.data/Encryption_txt~ ファイルは削除します。

解凍するときは -u オプションを指定してパスフレーズを入れると解凍されます。

これで個人情報はそこそこ守れるかな?

あとは逆に、辞書攻撃しかけて des3 の強度と CPU パワーの確認。なんてのにも使えそうです;-)。

まぁ、気休めかもしれませんが、ベタなテキストファイルで持っているよりは『安心』と、いうことで。

もし、上記スクリプトを利用して大切な情報がどうか(ファイル自体が消えたり、あっという間に解読されたとかその他諸々)なっても僕は一切責任を持ちませんので自己責任でお願いします。

ちなみに動作的には FreeBSD と Mac OSX で確認しています。僕は Linux はデスクトップでは利用してないので;-)。

7月 072013
 

今回 MovableType-3.3.3(以降 MT と記述) から WordPress-3.5.2(以降 WP と記述) に乗り換えたのですが、その顛末をちょと書いてみます。合わせて WordPress のテーマの日本語化の情報も書いてみます。
まず、今回 MT から WP に置き換えたドメインは以下の通り。後ろのカッコ内は WP で利用したテーマです。

http://icmpv6.org/blog/ (Atahualpa)
http://motsuyaki.org/ (Gray and Square)
http://running-dog.net/ (Suffusion)

FreeBSD の場合 WP は ports になっているのでインストールが簡単です。バージョンアップ時は ports から行うか WP の機能で行うかは自分の判断で。ただ ports からインストールした場合は /usr/local/www/wordpress/ にインストールされるのでサーバルートを違うところにしている場合には ports は最初の一回だけで良いかもですね。

以下に MT から WP に移行したときのはまり道をちょっと書いてみます。

 
1. MT からデータをエクスポート
MT からのエクスポート時にヘッダ情報を付加するために lib/MT/ImportExport.pm を編集する。ってのは色々なブログで書かれているのでここでは割愛します。

ただ、WP 側で「パーマリンク設定」をするのであればそのデータを取得しやすいように、自分の好みに改修したほうが良いかもしれません。

僕の場合は WP でのエントリ表示のためにカスタム構造で以下のようにしました。

/%year%/%monthnum%/post_%post_id%.html

 
http://URL/yyyy/mm/post_ID.html

ID というのは MT から取得できるのですが、そもそも MT が URL に勝手に post_ID.html って付けている場合が多くて、たまに hoge_hoge.html って URL で作成しているんですね。 WP 側では「パーマリンク設定」で MT が生成した URL の /yyyy/mm/post_ID.html の形式にしたので /yyyy/mm/hoge_hoge.html は全て mod_rewrite でぶっ飛ばす。ようにします。

で、私の場合は ID: ヘッダは PERMALINK を持って来ました。あとでスクリプトで不要な URL の文字列と “post_” と “\.html” を削除して ID: としました。

 
2. MT からエクスポートしたデータの編集
せっかく全記事の内容がテキストファイルになっているので一括して色々変更します。テキストで行なったのは以下の通り。

1). ID: を URL から
上にも書きましたが ID を PERMALINK から持ってきて変更します。
hoge_hoge.html の場合は post_ID.html にするのですが、MT からエクスポートした中身の最後の ID から順番に振りなおしてあげます。

使い捨てスクリプトで美しくないんだけど変換時のスクリプトはこんな感じ。

#!/usr/bin/perl
my $f = shift;
my $c = 234;
open(IN,"<$f");
while(<IN>) {
    if (/^ID:/) {
        my @tmp = split("/",$_);
        $tmp[5] =~ s/\.html//;
        if ($tmp[5] =~ /post_/) {
            $tmp[5] =~ s/post_//;
        } else {
            print "ID: $c\n";
            $c++;
            next;
        }
        if ($tmp[5]  =~ /^[0-9]*$/) {
            print "ID: $tmp[5]";
        } else {
            print "ID: $c\n";
            $c++;
        }
        next;
    }
    print;
}
close(IN);

 
$c には MT のエクスポート時の最後の post_ID.html で使われていた数値に +1 した値を書きます。 ID が一意になれば順番はどうでも良いのでこれで行けます;-)。hohe_hoge.html でも新規に WP では新規に ID を割り当てるのでその ID を利用して post_ID.html 形式にしました。

2). <br /> タグの追加
実際に WP にデータを突っ込んでみると改行が自分の思い通りにならないことが多々あるのでテキストファイルのうちにスクリプトで一括追加しました。
二行改行したい場合には <br />& nbsp;; とすると良いみたいです。

3). その他
自分で気に入らない部分をテキストファイルの内がガンガン変更してしまいましょう。あ。 そーいう環境がある人には。ですが。

4). この段階で RewriteRule が解るのであれば生成してしまう
まぁ、以前の URL を引き継ぎたい。という場合が多々あります。全エントリのテキストファイルがあるので .htaccess に書く RewriteRule もスクリプトで出力したほうが楽でしょうなぁ。
PERMALINK: と新規に生成した ID: から RewriteRule を生成すると良いです。

 
3. WP へエクスポート
“Movable Type and TypePad Importer” というプラグインを利用する。というのはあちこちに書かれているので詳細はここでは割愛します。

一点だけ書くと、 MT からエクスポートして編集したファイルをアップロードして MySQL に入れた場合、 ID をせっかく 1 からにしても 上記プラグインは WP 側の MySQL の 1 を勝手に利用してしまって ID が 2 からになってしまいます。つまりは RewriteRule をせっかく書いても一個ずれてしまうことになるんですね。あたたた。

なので、ウェブブラウザからアップロードするのではなく、ちゃんと wp-content/mt-export.txt に設置してからアップロードするほうが良いでしょうなぁ。ちなみに MySQL 内のポストテーブルとコメントテーブルを初期化するだけで何回でもアップロードできます。

MySQL の SQL 文は以下の通り。これをしたあとにインポートするとデータが無事に入ると思います。

mysql> delete from wp_posts;
mysql> delete from wp_comments;
mysql> alter table wp_posts auto_increment=1;
mysql> alter table wp_comments auto_increment=1;

 
何回か試行錯誤して試していると WP の中で ID がどうしてテキストファイルの ID とずれるのか解るようになるかと思います;-)。

 
4. .htaccess の RewriteRule
hoge_hoge.html を post_ID.html に mod_rewrite でぶっ飛ばす設定をツラツラと書いていきます。これについてもウェブ上に色々あるので詳しくは書かないですが、一点だけ。マッチしない場合は先頭の “/” を取ってみてください。ということでしょうか。

以下はサンプルです。

RewriteCond /2008/02/2_4.html !-f
RewriteRule 2008/02/2_4.html  /2008/02/post_847.html [L,R]

 
RewriteCond はパターンが “/” で始まっているのですが RewriteRule のほうは先頭の “/” を取ります。
どうしてもリダイレクトしてくれない場合、最後の手段として “/” を取って試してみてください。あと。右側の飛ばし先は http://domain.name を付けてみるのも良いかもしれないです。

そして、本文の記事の他にカテゴリの RewriteRule も書いて準備完了。
ブログには 1,000 エントリもあって RewriteRule は 300 行書かねばならん。なんてのはもはや手でやってられないですよね。なので MT からエクスポートしたデータを参考にしてスクリプトで RewriteRule を出力する必要があるんですね。その場合に利用するのが PERMALINK: から生成する ID: なんですね。

あとは SNS 用プラグインのインストールだとかカテゴリをソートするプラグインだとかをインストールして自分好みのものにして行きます。

 

MT からのデータをインポートしたあとに表示の確認をするかと思いますが気をつける点としては、僕のあ場合、コマンド系、表示系、設定系で table タグと pre 、 code タグを使っているのですが、それらの表示がおかしい場合はだいたいがテーマのスタイルシートでタグの宣言が書かれていることが多いのでそれを削除したりして、自分の思う通りに表示してくれるようにします。

 

さてさて。せっかくなので今回色々かいた WP のテーマの日本語ファイルを公開しましょうかね;-)。一応、日本語でブログ本文のほうは表示できると思います。wp-admin 側の日本語化はまだ出来ていませんし、多分しないのではないかなぁ。と思います。それでも良ければダウンロードしてみてください。
ちなみにどれも 2013/07/01 時点の最新バージョンです。

Atahualpa: http://icmpv6.org/Prog/ja.po/atahualpa-20130701-ja_JP.po
Suffusion: http://icmpv6.org/Prog/ja.po/suffusion-20130701-ja_JP.po
Gray and Square: http://icmpv6.org/Prog/ja.po/gray-and-square-20130701-ja_JP.po
Techozoic Fluid: http://icmpv6.org/Prog/ja.po/techozoic-fluid-20130701-ja_JP.po

僕は WP の翻訳だけでなく、フリーソフトウェア系アプリを色々翻訳してきているのでアレですが、 LANG は基本的に ja_JP です。WP の場合には wp-config.php の WPLANG に設定してあるファイル名にしてください。多分 default は ja.po になると思うんですけども。

あと、場所とかそれぞれのテーマによって格納場所が変わってきますし、msgfmt コマンドで po ファイルから mo ファイルに変換してあげる必要があります。

 # msgfmt -o ja.mo ja_JP.po

 
今回はこれくらいにしておきましょうかねぇ。僕が体験した MT から WP への移行です。一番難儀したのは MT からエクスポートしたファイルの ID が WP にインポートしたらずれてしまう件かな。ここを回避できたら随分と作業は捗るのではないかと思われます。

Gray and Square なテーマはカスタマイズオプションが少ないので実際に手で CSS を変更してしまいます。例えば、 default ではビビットな色しかないのでもっと地味な色にしたい場合には gray-and-square/css/color/ の下に色に対応した CSS ファイルがあるので aqua.css などを自分好みの色に編集すると、設定メニューで Aqua を選択していても色が変えられます;-)。

 

何を今更感が十分に感じられる今回のエントリですが、今後移行していく人の参考になればと思います;-)。

10月 152012
 

ウェブの作成に携わっていると「アクセスカウンタ欲しい。」とか思うことが多々あるとおもいます。で、このブログにも右上にあるんですけどもね。このブログのカウンタは wwwcount というのを利用しています。 FreeBSD の ports では www/wwwcount になりますが、 ports からインストールされるバージョンは 2.5 なんですね。けど、ウェブページを見に行くと 2.6 が存在しているようです。

そもそも wwwcount の IPv6 対応パッチとはなんぞや? ということになるのですが、 wwwcount では同一アドレスから連続してアクセスがあったときにはカウントをアップしないという機能があります。要はリロードしてもカウントがアップしない機能ということになるんですけども。

で、その処理をするために data/count.dat ファイル内にカウンタ数と直前にアクセスがあった IP アドレスを保持しています。直前にアクセスがあった IP アドレスは IPv4 にしか対応してないんですね。それもそのはず。カウンタ数と IP アドレスの区切り文字が “:” だからなんですね。アタタタ。orz。

直前にアクセスのあった IP アドレスが IPv6 アドレスの場合、正しく動作しないのでリロードするとカウンタがどんどん上がっていくのが今のところの仕様です。なので、IPv6 に対応したパッチを書きました。以下の URL に置いときます。

http://icmpv6.org/Prog/wwwcount2.6-IPv6.patch.gz

このパッチを適用するとカウンタ数と IP アドレスの区切り文字が “;” になるので IPv6 でアクセスがあった場合でもリロードでカウントアップするのが防げます。

上にも書きましたが FreeBSD の ports の wwwcount は 2.5 です。このパッチは 2.6 用です。ソースから make してください;-)。

5月 122011
 

ちょっとわけあってカレンダーをホゲっているんですが、祝日管理というのが大変に面倒であることが判明した。 perl でホゲっているのでウェブで探したり、モジュールを検討したんだけど、どうもしっくり来ない。祝日が変更になるとソースコードを改変したり、モジュールをインストールしなければならなかったりで、ずっと保守がつきまとう・・。orz。

何かないかなぁ?とか探していたら google カレンダーの API を叩いて祝日をゲットして来る。ってのを見つけたけど XML のパースとか、どーもやることが多すぎる。他に何か無いかなぁ。とか探したり、手段を見つけようとしてます。あ。そー言えば、僕、ical サーバ作ったじゃん。てのを思い出したので、ical サーバから情報持って来られないか調べたけど、ちょっとダメっぽい。

それならば。と思いついたのが、ics ファイルをパースするサブルーチン作ってしまえ。ってことで非常にオオチャクな発想をしてしまったのであります;-)。

まず、Apple のサイトから日本の休日カレンダーを取ってきます。MacOSX のアプリとして iCal があり、それ用に提供している ics ファイルがたくさんある URL があります。

iCal カレンダーライブラリ

ここから日本の祝日用カレンダーを2,3ヶ月に一度 cron で持ってくるようにします。祝日はそーそー更新されることは無いと思うので頻度は低くて大丈夫。

そして、Apple が提供している情報は多分 iCal アプリがある間は公開し続けてくれるだろうと勝手に思っているので安心感がある;-)。

% ftp -a http://ical.mac.com/ical/Japanese32Holidays.ics

  さてと。これで絶えず最新の祝日情報がゲットできました。あとはこれをパースして祝日を抽出すれば良いだけですね;-)。
僕の書いたサンプルコードはこんな感じ。もっと美しくかける方いましたら絶賛募集中;-)。
 
#!/usr/bin/perl
use strict;
use Date::Manip;
# ## main # my $date = shift; if ($date) { my $data = &holiday_check($date); print $data ."\n\n"; } else { for (my $mm = 1;$mm < 13;$mm++) { for (my $dd = 1;$dd < 32;$dd++) { my $date = "2011" . sprintf("%02d",$mm) . sprintf("%02d",$dd); my $data = &holiday_check($date); print $data ."\n" if ($data); } } } exit 1;
# ## 祝日のチェック # sub holiday_check { my $date = shift; my $name = ""; my $day = ""; my $f = 0;
open(CAL,"<./Japanese32Holidays.ics"); while( my $line = <CAL> ) { $line =~ s/\r\n//g; chomp $line; $f = 0; if ($line =~ /^BEGIN:VEVENT/) { while( my $line = <CAL> ) { $line =~ s/\r\n//g; chomp $line; last if ($line =~ /^END:VEVENT/); # 日付が決まっている祝日の場合はそれを利用する if ($line =~ /^(DTSTART;VALUE=DATE:)/) { $line =~ s/$1//; $day = $line; $f = 1 if ($day eq $date); } # 祝日名を取得 if ($line =~ /^(SUMMARY:)/) { $line =~ s/$1//; $name = $line; } # 祝日法で決まっている祝日の情報の取得 if ($line =~ /^RRULE:/) { my $yy = substr($date,0,4); my $mm = ""; my $dd = ""; my @tmp = split(";",$line); foreach my $a (@tmp) { # BYMONTH は何月かの情報 $mm = $1 if ($a =~ /BYMONTH=(.*)/); # BYDAY は月曜日が祝日の時の計算 # 今のところは月曜日しか無いので MO の狙い撃ち # 祝日法が変わったら改修しようね;-)。 if ($a =~ /BYDAY=(.*)MO/) { $dd = $1 ; my @a = ParseRecur("*$yy:$mm:$dd:1:0:0:0"); my $d = substr($a[0],0,8); #print "@a,$a[0] : $date,$d\n"; if ($date eq $d) { $f = 1; last; } } } # BYDAY が無い RRULE の場合は DTSTART の月日を利用する unless ($line =~ /BYDAY=/) { my $datesv = $date; my $d = substr($datesv,4,4); if ($day =~ /$d$/) { $f = 1; last; } } } } last if ($f); } } close(CAL);
my $data = ""; if ($f) { $data = "$date : $name "; } return($data); }

 
このプログラムを CheckHoliday.pl として保存して、実行する場合は以下のような感じ。

 % ./CheckHoliday.pl 20110718
20110718 : 海の日 (Marine Day)

 
スクリプトの引数に YYYYMMDD を指定します。その日が祝日であった場合にはその名前を表示します。日付を指定しない場合は 2011 年の祝日全てを表示します。メインのほうは皆さんの環境に合わせて作ってください。今回はサブルーチンのほうがメインになります。

このスクリプト、ちょっと解説すると以下になります。

1. 基本的には VCALENDAR 形式の ics ファイルをパースします。
2. 振替休日 など、日付が固定しているデータは DTSTART を参照します。
3. 海の日 など、第二、三月曜日が休みな場合は RRULE の BYDAY を見ます。
4. RRULE に BYDAY が無いヤツは国が日付を決めた祝日なので DTSTART の MMDD のみを参照します。

これで祝日の情報を取得します。Date::Manip モジュールの ParseRecur は第何週の日付を返してくれるモジュールでこれが非常に助かりました。

と、言うことで、日付を与えればその日付が祝日であれば値を返す。と言うサブルーチンの完成です。

速度的にみると 20110101 から 20111231 までを調べるとだいたい 1.5 秒くらいかかりますかねぇ。ちょっと重いか?

良かったら参考にしてください。あ。もっと綺麗なコード、絶賛募集中です;-)。

5月 132009
 

前回書いた続編と言うか・・。

一応、apache を Proxy として利用できるようになり、コメントで hagyさん から、mod_mem_disk と mod_mem_cache の両方を書いたときの動作確認してよー。って言われたので、そのテストをしようと思った矢先・・。

テスト環境では、キャッシュしようと思っていたデータがベーシック認証の中にあったのでありました。つまり、キャッシュしてはいけないデータなので apache Proxy はデータをキャッシュしてくれないんですね・・。

フリーソフトウェアのほとんどの Proxy サーバはベーシック認証やダイジェスト認証の中にあるコンテンツについて、セキュリティの観点によりキャッシュサーバでは絶対にキャッシュしない。と言うポリシーのもとで作成されているみたいです。apache の場合、ドキュメントにちゃんと書いてあります。

http://httpd.apache.org/docs/2.2/ja/mod/mod_cache.html#cacheignorecachecontrol

NetApp 社の NetCache もしかりですが、設定が用意されているみたいで on no-cache とか on uncond-cache がそれにあたります(当然、設定 GUI からもできるとは思いますが;-)。

さてと。どーすんべなぁ。とか思って、一応 apache のソースを眺めたらわりと簡単にソース修正できそうだったので変更してしまいました。以下はそのパッチです。

--- modules/cache/mod_cache.c.ORG       2009-05-02 10:40:03.000000000 +0900
+++ modules/cache/mod_cache.c   2009-05-02 10:39:25.000000000 +0900
@@ -95,9 +95,12 @@
/* First things first - does the request allow us to return
* cached information at all? If not, just decline the request.
*/
+
+    /* Authorization pass.
if (auth) {
return DECLINED;
}
+    */
/* * Try to serve this request from the cache.

 
認証を通った後の判断を調べてリターンしている所をそっくりコメントアウトするパッチです。これにより、ベーシック認証通過後のコンテンツもキャッシュすることができるようになります。

ふぅ。これでキャッシュ用 Proxy サーバはなんとかでき上がりました。では続いて懸案であった、mod_mem_disk と mod_mem_cache の両方を書いたときの動作確認をしたいと思います。

が・・。どう言うわけか mod_mem_cache の設定を書いていると httpd が Segmentation fault(11) してしまいます(今回は prefork で make したので一個のプロセスが Segmentation fault を起こすのみで、全ての httpd は死んではいないため port:80 では LISTEN が可能状態です)。一番最初、キャッシュしていない状態でアクセスがあった場合はマスターサーバから、仮に「A」と言うコンテンツを取ってきてキャッシュして、そしてクライアントに返します。

次に別のクライアントがコンテンツ「A」を取りに来たとき、httpd がこの時に Segmentation fault(11) で落ちてしまう。と言う状態に陥ったのでありました。なので、コンテンツは DISK 上(もしくはメモリ上)に溜まるけど、利用されることは無い。と言う感じですね。

#ちなみに mod_mem_cache で溜まったキャッシュの情報ってどうやって確認するのだろう・・。メモリ利用量のみで判断するのかなぁ?

mod_mem_cache を削除して mod_mem_disk の設定のみを書いたときは正しくキャッシュできて、 Segmentation fault(11) もせず、キャッシュされたデータも再利用できることを確認しました。なので運用的にはキャッシュデータは DISK のみに保存する。と言う方向で行きたいと思います。

ごめんねー。hagyさん。

それにしても、色々詳しく調べるまで、ベーシック認証配下のコンテンツはキャッシュしない。と言うのを知らなかったなぁ。まぁ、考えてみれば当たり前だよなー。認証の奥にある情報が実は Proxy キャッシュサーバの中に残っていた。なんてのは怖いことだもんなぁ。

12月 132007
 

前回のブログで iPod Touch を JailBreack したと書いた。でもってメールソフトは iPhone のファームから抜いて iPodTouch にインストールした。

メールソフトも利用できて大変嬉しいのだけど、うちのメールサーバは ssl に対応していないので POP もしくは IMAP4 の時に生パスワードが流れてしまう。

iPod Touch の性格上、野良 AP (そこいらに落ちているアクセスポイントのこと)を利用する場合も多々有るわけで、そう言うのを利用するとアクセスポイントを置いた人が tcpdump を仕掛けていないとも限らないし、ポートスキャンしてくるかもしれない。なので、POP/IMAP4 の時は是非とも暗号化して利用したいものです。

幸い、JailBreack した iPod Touch には ssh が入っているのでこれを利用して POP サーバ、もしくは IMAP4 サーバに ssh トンネルを掘ることが可能です。

と、言うことで簡単に ssh トンネルを掘るスクリプトを書いてみました。利用方法は以下の通り。

1. POP/IMAP4 サーバ上に自分のアカウントが存在し ssh ログインできること。
2. メールのアカウント設定で POP/IMAP4 サーバではなく localhost に接続するようにすること。
3. ターミナルから stun.sh が実行できること。

これだけです。まぁ、1. はちょっと敷居が高いかも。けど、それがクリアできれば特に問題は無いでしょう。以下の URL からダウンロードできます。

http://www.icmpv6.org/Prog/MacOSX/stun.sh

利用方法ですが、以下の通り。

1. コマンドオプションは三つ。s(start) t(stop) c(check)。
2. s オプションで Mail を kill してから ssh トンネルを掘りますが、接続できた時はパスフレーズを聞いて来るので入力。
3. t オプションで Mail と ssh トンネルのプロセスを殺します。
4. c オプションで Mail と ssh のプロセス番号を表示します。

注意点としては、ssh トンネルを掘る前に Mail が起動していると POP/IMAP4 サーバに接続できません。なので、s オプションの時に Mail を kill しています。c オプションで ssh プロセスの番号が Mail より若いことを確認します。
後、一回スリープしたら ssh セッションが切れるので毎回 t して s してあげる必要があります。

こんな所でしょうか。ダウンロードしたら stun.sh の上の環境変数にサーバ名とユーザ名を指定してください。default で localhost の port:143 を使うようにしています。

もしダウンロードした人がいたらコメントなど頂ければと思います。

6月 052007
 

ウェブページのカウンターとしては Count.cgi と言うのが有名なんですが、まぁ、以下の URL のプログラムです。

http://www.muquit.com/muquit/software/Count/Count.html

僕もその昔、ASP にいた頃良くメンテしていました。

で、このカウンター、同一のアクセスもとから何回もアクセスがあるとカウンターが上がらないようにするオプションがあるんだけど、conf/count.cfg の count_reload=No かな。リロードしてもカウンタ-アップしないうにするオプションです。

しかし、IPv6 のアドレスからアクセスすると、この設定が有効にならないのねぇ・・。

カウンターの元データとなる Counter/data/file.dat にはカウンター数と最後にアクセスのあった IPv4 アドレスを保持します。このファイルに掲載されている IPv4 アドレスからアクセスがあるとカウンタアップしないんだけど、IPv6 アドレスからのアクセスだと count_reload=No が有効にならないのでガンガンカウンター値が上がってしまうX-(。

こらー、IPv6 対応させる必要があるかなぁ・・。どなたかチャレンジして、FreeBSD の ports でええので対応しませんか?:D:D