2003年10月分。
いろいろやりたいことはあるのに、眠くなってしまうのがかなしい今日この頃。
blosxomサイトの日本語訳でblosxomについて調べているうちに、ページの静的表示に興味が湧く。今まで徒書の個別記事は、かなり無理矢理な方法で動的に表示していたのですが、サーバの負担を考えると静的表示に利があるように思えてきたのでした。そんなわけでスクリプトを作成し、現在個別記事は静的表示になっております。
blosxomが使いやすそうだったら徒書もblosxomに移行して「徒花」という名前にしようか、などと密かに企んでいたりもしましたが、移行する余裕が今のところないのでひとまず棚上げ。
和製漢字の辞典 掲示板に書かれていたとある質問。
「女」偏に「豆」と書いてなんと読むのですか?教えてください。
普通に答えていいものかどうか迷うところ。
真面目に答えると、音読みはトウ。大漢和辭典では「どもる」という訓を載せているけど、その大漢和辭典で引用されている集韻の字義では「不能言也」となっているのでどちらかというと「喋れない」という意味になるような。Unihan Databaseの定義でも、"can not speak"
と書かれていました。
一応真面目な答えを書き込んでみました。
(2003年10月15日)
tb-standaloneとSSIを使ってTrackBackを受信できるようにしてみました。使われる機会があるかはともかく。寧ろ、手書きHTMLで既存のweblogツールにどこまで迫れるかの挑戦と言うか何と言うか。目指せ似非Blog(©のりさん)。
特徴:
Encodeモジュールは、エンコード先の文字コードに含まれていない文字を数値文字参照にする機能があるのが有難いところ。扱いはJcodeモジュールよりややこしいけど(正しく使えているかはかなり疑問ですが)。
配布されているtb-standaloneはどうも入力データを
追記: 「常にサニタイズする癖を」の記事は、現在securecatのMTに移行されています。
(2003年10月17日)
その後ありみかさんもTrackBackを実装されたとのこと。しかしコミューン(?)はやはりalib.jpの元に集結するのか、などとひとりで勝手に感慨に耽ってみたり。というのも以前いわいさんがTrackBackをalib.jpで動かしていたのを見かけていたもので。こちらでのTrackBack実装にあたっては、いわいさんのTrackBackの使い方も参考にしていました。
で、その実装されたすぐ後に、ねこめしにっき宛てに概要文の大きなTrackBackが送られていた(今は訂正されてます)のを拝見し、また検索で色々なMovable TypeのTrackBackを拝見しても、ときおり結構な量の概要文があるのをちらほらと見かけまして、自分のところもちゃんとTrackBackの量の制限をせねばと思ったのでした。送る方である程度制限されるのかなと期待していたのですが、そうでもないようで、やはり外から来るデータを信用してはならない、というのはサニタイズの場合にも同様に言える原則であります。
さてどうやって文字数を制限するかというのが考えどころで。ねこめしにっきのTrackBack を実装してみたなり (2) でも触れられているように、一定バイト数で切ってしまうとマルチバイト文字の断片が末尾に残ってしまう可能性があるのが非英語圏在住者のつらいところ。しかしながらPerl 5.8だと、use utf8
とすればPerlの関数が文字をきちんとUTF-8文字列として扱ってくれるようなので、UTF-8に変換し、長過ぎた場合にはsubstr
で一定数の文字を抜き出す、という楽な方法に乗っかることにしました。
そんなわけで現在のスクリプトは、exerptは80字、title, blog_nameは20字(→40字に変更)、urlは1000字で切るようにしております。
時々 CGI が無反応になる事が。日本語文字列の切り落としをキレイにヤるために Jcode.pm の
jfold()
を使うようにしてるとそうなる時があるみたい。そゆ時は Jcode.pm 内でスクリプトエラー発生てなログがたくさん残るんだけど、なぜか Internal Server Error にはならない。謎。
jfold()で山ほど出てくるエラーは、スクリプト先頭行にある"
の"-w"を取っ払えば出なくなるかも……と、一応手前の環境でも確認。サーバエラーにならないのは警告レベルでのメッセージだからだと思います。#!/usr/bin/perl -w
"
バイト数で切った時に出るマルチバイト文字の断片も、正規表現を使えばうまく削れそうな気がしますが、さて。
追記: いわいさんが以前使われていたTrackBackについて"tb-standalone"と書いていたのを訂正しました。tb-standaloneではなく「Net:TrackBack を使って書いた
」ものとのことです。
追記: NiAOUさんによるUTF-8文字列カット時の処理方法
(2003年10月21日)
ついでにというか何というか、RSS出力スクリプトについても見直し。
T00:00:00+09:00
をくっつけるようにした。RSS用のアプリケーションはまだFeedReaderしか持っていないので、何となくそれに合わせたい欲求が働いたのでした。
(2003年10月21日)
……を先日考えていたところ、NiAOUさんよりサンプルスクリプトを提示して頂きましたが、面白そうなので自分でも他のやり方がないか考えてみました(Perlクイズばりに)。
# hint: uft-8 の一文字の正規表現 # [\x00-\x7F]| # [\xC0-\xDF][\x80-\xBF]| # [\xE0-\xEF][\x80-\xBF][\x80-\xBF]| # [\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]| # [\xF8-\xFB][\x80-\xBF][\x80-\xBF][\x80-\xBF][\x80-\xBF]| # [\xFC-\xFD][\x80-\xBF][\x80-\xBF][\x80-\xBF][\x80-\xBF][\x80-\xBF]
実のところ知りたかったのはこの部分で、最高何バイトまであり得るのかとか、各バイトは範囲がかぶったりしないのかというところが分からなかったので棚上げにしていたのでした。改めて検索してみるとManpage of UTF-8にも似たようなことが載っていたわけで、しばし黙読。なるほど、UTF-8を使ったUCS文字の符号化では最大6バイトになるけど、Unicode規格の範囲であれば最大4バイトなのか。であれば実用向けには4バイトまでとして考えてもよさそう。
Corrigendum #1: UTF-8 Shortest Formによると、2バイト文字の場合、正確には先頭バイトは[\xC2-\xDF]となるようです。
で、UTF-8の正規表現をじっくり見つつ考えたところ、完全な1文字にならないバイト列が余った時について場合分けしてみればいいかと思いつきまして、
my $utf8 = "「UTF-8文字列末尾の余りbyteをcut」";
for (my $i = 0; $i <= 42; $i++) {
my $a = substr($utf8, 0, length($utf8) - $i);
print round_utf8($a), "\n";
}
sub round_utf8 {
my $str = shift;
return $str if ($str =~ /[\x00-\x7F]$/);
$str =~ s/[\xC0-\xFD]$//; #1バイト余った場合
$str =~ s/[\xE0-\xFD][\x80-\xBF]$//; #2バイト余った場合
$str =~ s/[\xF0-\xFD][\x80-\xBF]{2}$//; #3バイト余った場合
# $str =~ s/[\xF8-\xFD][\x80-\xBF]{3}$//; #4バイト余った場合
# $str =~ s/[\xFC-\xFD][\x80-\xBF]{4}$//; #5バイト余った場合
$str;
}
……としてみましたがどうでしょう。
(2003年10月23日)
編集人が言うのもなんですが、「短編」第15期は面白いです。14期は何と言うか渋めの作品に人気が集まっていて、けれども実のところ自分には今ひとつぴんとこなかったところがあったのですが、15期は全体的に読んでいて面白かったです。作品が面白いのみならず、バラエティに富んでいてどれに投票するかが読み手として思案のしどころでありそれが楽しく、結果どの作品が勝ち残るか、という勝負の行く末が楽しみでもあったりもします。
ひと通り読んでみて気に入った作品をメモ。
(2003年10月30日)
{(今/酉)隹}の字はUnicodeのCJK Unified Ideographs Extension Aに収容されています。コードはU+4A04です。
フォントとしてはArial Unicode MSにも入っていないので今のところWindowsでの表示は無理そうですが……。
※追記: 猪川さんより、SimSun-18030というフォントならCJK Extension Aの文字を含んでいるとのこと。試しに手元のWindows 2000にSimSun-18030をインストールしたところ、Mozillaでなら{(今/酉)隹}の字の表示ができました。文字参照 → 䨄
(2003年10月30日)