2006年05月31日 06:06

今格闘していること

以前のblog時代からHaloScan.comさんを利用させていただいている。チャージも支払いして(2回支払ったかな?一回だけでもよかったらしいけど)いる。で、HaloScan.comさんを利用してコメント・トラックバックを利用させていただいているわけですね。それに関連して考えていることがある。

HaloScan.comさんのページから、過去に頂いたコメントを全てxml形式でダウンロードすることができる(確かチャージした人だけ)。これを加工して.Macサーバーに置いた上で、ホームページ上から参照して表示する。リアルタイムにコメントが反映されるわけではないけれど、この方法だと、頂いたコメントを.Macサーバーへのアクセスだけで表示することが可能になるわけですね。
なんでこんな事を考えているのかというと、ときどきHaloScan.comさんが落ちる(もしくは反応が鈍くなる)と言うことを経験しているから。iBlogを使っていたときには各エントリにいくつのコメントがついたのかというのをHaloScan.comさんのJavaScriptを利用して表示させていた。で、この表示が引っかかるようになることが時々あったんですね。サーバーを増強したのか最近はあまりなくなったので、今さらという気がするのですが、一つのホームページを閲覧しているのに、複数のサイトからいろんなパーツを引っ張り込んでしまうとそれぞれのページ(それぞれのサーバー)の影響を受けて自ページのレンダリングが遅くなってしまうということがあり得るわけですね。なんかチョットそれっておかしいかなぁと思っているわけです。現在、HaloScan.comさんの他に、BlogPeople.netさんを利用しています。どちらかに障害があった場合、會澤のblogがうまく表示されない。もしくは表示が遅くなるっていうことになるわけですね。それは回避したいなぁ。ということ。
もちろん.Macサーバーの品質はどうなの?というのはこの際問題にしないことにします。実はあんまり品質高いとは言えないように思っています。

さて、その実現方法ですが、xmlファイルからコメントを描画するJavaScriptファイルを作成することです。一つのxmlファイルを一つのJavaScriptファイルにしてしまえばことは簡単。この(^^)v3というブログに移ってからはそれほど多くのコメントを頂いているわけではありませんので一つにしてもいいのですが、長く続けていると少しづつでも結構たくさんのコメントを頂けています。それらを一つのファイルにしてはロードするファイル容量が増える一方です。
ならばということで、各エントリごとにファイルを分けてやろうと考えています。これなら小さくコンパクトなJavaScriptファイルですので邪魔になりません。
xmlファイルからJavaScriptファイルへの変更はほぼできたのですが、問題は上記したようなファイルの分割で悩んでいます。実現方法はシェルスクリプトで(自動化させるならやはりシェルスクリプトが最適)行っているので、ファイルの分割ということなら「csplit」を使うことになると思います。で、実際に使ってみると次のような不具合がありうまく分割できないのです。
  • 分割回数を示す「{n}」オプションで、*を指定するとエラーになる。なぜ?
  • おそらく漢字コードの問題かと思うのだけれど、こちらが指定したところとはまったく別のところでファイルが分割されてしまう(ほとんどはうまく分割できるのに、ダメな部分が発生する)。
まぁ、それほど焦っているわけでもないので、試行錯誤をくり返してみます。
今回に限らず、NanoBloggerを使い始めて、まとまった処理を自動化させることができるようになりました。以前はシェルではなく、AppleScriptを使って自動化させていたのですが、AppleScriptって処理が大きくなると遅いんだよねぇ。シェルならかなり早い。特にblogって要するにテキスト処理に外ならないからそういうのはシェルは得意。もっとスマートな方法がきっとあるんだろうなぁと思いつつ。會澤環境特化型のスクリプトをいくつか組んで自動処理させています(全エントリ一覧とか、再生曲一覧とか)。
チョットずつ進化していると思ってます。歩みが遅いのはいつものことですけどねぇ。
このエントリに頂いたコメント。この表示は随時更新されます。

by OKAMURA(2006-05-31T03:22:06-05:00)

> 別のところでファイルが分割されてしまう

HaloScan の XML はマルチバイト文字の途中で切られるという問題が直っていないですから、それのせいかも知れませんね。


Perl で書いてみました。XML は真面目に処理せずに正規表現でやったのでかなり速いと思います。次のコメントにコピペします。

by OKAMURA(2006-05-31T03:22:48-05:00)

#!/usr/bin/perl -w


use strict;

use utf8;

no encoding;


use vars qw(

%Thread

);


%Thread = ();


{

my $id = '';

my $contents = '';


while (my $line = <>) {

if ($line =~ m/<threads+id="([^"]*)"s*>/) {

$id = $1;

$contents = '';

}

elsif ($line =~ m/</threads*>/) {

$Thread{$id} = '' unless (exists $Thread{$id});

$Thread{$id} .= $contents;

}

else {

$contents .= $line;

}

}

}


while (my ($id, $contents) = each %Thread) {

my $fh;

my $fname = sprintf('%s.xml', $id);


if (open $fh, ">$fname") {

print $fh <<"EOF";

<?xml version="1.0" ?>

<comments>

<thread id="$id">

EOF

print $fh $contents;

print $fh <<'EOF';

</comment>

</thread>

</comments>

EOF

close $fh;

}

else {

printf STDERR "%s: %sn", "$?", $fname;

}

}

by OKAMURA(2006-05-31T03:24:28-05:00)

あ! 一部スマイリーになってしまいました。バックスラッシュも消えてしまいました。


なぞなぞということにしておきます。 :lol:

by OKAMURA(2006-05-31T03:30:05-05:00)

あ、後ろから 10 行目の

</comment>

の行は余計でした。


度々済みません。

by 會澤(2006-05-31T12:51:13-05:00)

うげっ!なんかすごいことになっている。

perlはなかなかうまいこと使いこなせないのですが、参考にさせていただきます。

NanoBloggerへの実装方法についてもまだトライしている最中です。はたしてうまくいくでしょうか。


毎度^2。ありがとうございます。

コメントを書き込むためには、下の「Comments」リンクをご利用下さい。
このエントリに頂いたコメント。この表示は随時更新されます。

by OKAMURA(2006-05-31T03:22:06-05:00)

> 別のところでファイルが分割されてしまう

HaloScan の XML はマルチバイト文字の途中で切られるという問題が直っていないですから、それのせいかも知れませんね。


Perl で書いてみました。XML は真面目に処理せずに正規表現でやったのでかなり速いと思います。次のコメントにコピペします。

by OKAMURA(2006-05-31T03:22:48-05:00)

#!/usr/bin/perl -w


use strict;

use utf8;

no encoding;


use vars qw(

%Thread

);


%Thread = ();


{

my $id = '';

my $contents = '';


while (my $line = <>) {

if ($line =~ m/<threads+id="([^"]*)"s*>/) {

$id = $1;

$contents = '';

}

elsif ($line =~ m/</threads*>/) {

$Thread{$id} = '' unless (exists $Thread{$id});

$Thread{$id} .= $contents;

}

else {

$contents .= $line;

}

}

}


while (my ($id, $contents) = each %Thread) {

my $fh;

my $fname = sprintf('%s.xml', $id);


if (open $fh, ">$fname") {

print $fh <<"EOF";

<?xml version="1.0" ?>

<comments>

<thread id="$id">

EOF

print $fh $contents;

print $fh <<'EOF';

</comment>

</thread>

</comments>

EOF

close $fh;

}

else {

printf STDERR "%s: %sn", "$?", $fname;

}

}

by OKAMURA(2006-05-31T03:24:28-05:00)

あ! 一部スマイリーになってしまいました。バックスラッシュも消えてしまいました。


なぞなぞということにしておきます。 :lol:

by OKAMURA(2006-05-31T03:30:05-05:00)

あ、後ろから 10 行目の

</comment>

の行は余計でした。


度々済みません。

by 會澤(2006-05-31T12:51:13-05:00)

うげっ!なんかすごいことになっている。

perlはなかなかうまいこと使いこなせないのですが、参考にさせていただきます。

NanoBloggerへの実装方法についてもまだトライしている最中です。はたしてうまくいくでしょうか。


毎度^2。ありがとうございます。

コメントを書き込むためには、下の「Comments」リンクをご利用下さい。

Posted by kaizawa | TrackBacks