2006-09-29

雑談。

昔(といっても数年前; なんせドッグイヤーなんで)、とあるコミュニティで活躍されていたとある方が、いま何をされているのか気になっていました。思いついたときに、その方のハンドル名でググってみたりしてたんですが、すっかり消息がわからなかったのです。

その方の当時活躍していたフィールドとは別のホビーを思い出して、それを検索語に絡めてみたところ、その方のものとおぼしき「はてなアンテナ」のエントリーが見つかりました。でもこのアンテナも登録されているサイトのほとんどが閉鎖されていて、使われている様子ではなかった。

ところが、きょうもまたふと思いたってそのハンドル名でググってみたところ、あるウェブログが見つかって、それがどうやら探していたその方の書いた記事だったようなのでした(そのページに掲載されてた写真から、人違いでないこともわかった)。そこはその方の個人のページではなかったのですが、そこ経由でその方のブログや、いま現在その方が活躍されているフィールドなんかがわかったのでした。結論としては、数年前とそう遠くないフィールドで引き続きお仕事されているようでした。一瞬暗い想像もしかけてたので、めでたしめでたしです。

それならそれで「あの○○さんがいまこんなところで活躍されている!」という雑談をここに書こうかと思ったのですが、なんとなく気が引けたのでこんなあいまいな書きかたにしてしまいました。というのはその方がブログで当時とぜんぜんちがうハンドルを名のられてたからです。

ハンドルを変えるというのはときどき(人によってはしょっちゅう)あることだと思いますが、それまでの経歴とか、リンクとかもまったく書かれていなかったので、心機一転したかったのかもしれません。とはいえその方が、かつて以前のハンドルについて「パソコン通信のころからずっとこれ(このハンドル)を使ってます。このおかげで音信不通になった人から忘れたころに思わぬ連絡をもらったりすることもあるんです」というようなことを書かれてたのが印象に残っていたので、なんだか意外な感じでした。

ウェブページを公開していると、あるとき突然、熱病のように「ウェブになんのしがらみのない生活」に戻りたくなることがありますが、そういう意味合いからかもしれませんし、もともとフットワークの軽い方なのでなんとなく思いついてそうされただけかもしれないのですが、もとのコミュニティからその方を知った身としてはちょっと複雑な心境。

(ちなみに、その方はネットでの活動経歴も長く、ウェブ・コミュニティの運営もこなせるような方で人付き合いもうまかった。だから最近よく聞くブログが炎上して逃げるように云々みたいなくだらない顛末でそうなったわけではないことは断言できる。)

あるサイト、ネット上のあるコミュニティに日常的に触れていると、そのサイトの運営者や常連ユーザたちと「面識がある」という感覚を持つようになる。会ったことないのに。だけどネットの上だけのつながりなら、各人はその気になればいつでもそこから消え去ることもできるわけです。

たとえば僕がいまemptypage.jpをいきなり閉鎖して、「いがぐり大臣」というハンドルで洋菓子のサイトをlivedoorブログではじめたら、だれも僕の心変わりについていける人はいない。みんなウェブページで移転のお知らせとかを礼儀だと思ってか載せてますけど、あれって礼儀どころかじつはほとんど生命線なわけです。

いったん「面識がある」という感覚を持ってしまうと、なんとなくその人がそのコミュニティを離れるときでも、どこに行くのか、くらいは知りたいと思ってしまう。たとえばいまやWZユーザでない人たちのサイトを僕がいくつかいまだに見て回ってるのはそういう心情からきてるんでしょう。で、そうした人たちがある日忽然とウェブから消えると不安になってしまう。

ウェブというのは、いったん参画してほかの人びとから認知されてしまうと、抜けるに抜けられないところがあって、抜けるとすわ「生きてるのか死んでるのかもわからない」存在になってしまいます。いやじっさいにはウェブなんてブログが更新されててもされてなくても、その人が生きてるのか死んでるのかなんて確実にはわかんないわけです。面識のある人以外は。ん? いや、なにを言おうとしてたんだっけ。

つまり人はウェブで一度「俺は生きてるぞ」と言ってしまうと、そう言いつづけることをやめたときに死ぬ存在になってしまうのです。明日も一週間後も一年後も何らかの形で「生きている」と言明し続けなければいけません。年をとってディスプレイの文字が読めなくなり、指にキーを打つ力がなくなっても、なにも言わずにブログの更新をやめてはいけません。少なくとも、「指に力が入らないのでブログを更新できません」というエントリだけは力を振り絞って投稿すべきです。そうして初めて、読者の while (alive) { write(blog); } という絶え間なく続く評価ループは少しだけ緩められるわけです。

しかしそれでもほとんどの読者はあなたのウェブログをRSSリーダーから外しはしない。「もしかしたら」「いつか」更新があるかもしれないと、あなたが本当に死んだことを確実に知るときが来るまで(そんな日は来ないかもしれないというのに)、かれらはフィードをリロードし続けるのです。たとえあなたがかつて書いていたブログのことなどすっかり忘れてしまっていたとしても!

や、こんなことを書くつもりではなかった。よくわからなくなってきましたんでこのへんでやめます。あした朝早いし。

2006-09-24

wzmbox.py

WZ MAIL で「標準 MBOX」形式にエクスポートしたメールボックスを、Mozilla Thunderbird などで使われている mbox 形式に変換するスクリプト。

操作例。

  1. WZ MAIL でエクスポートしたいフォルダを選択し、[フォルダ]-[エクスポート]。
  2. [エクスポート] ダイアログで [形式] を「標準MBOX」にして保存する。ここでは wzmail.mbox として保存したとする。
  3. コマンドラインから wzmbox.py wzmail.mbox > wzmail する。結果は標準出力に出るのでリダイレクトして保存している。
  4. Thunderbird のメール保存フォルダ([アカウント設定] の [メールの保存先] に保存先フォルダのパスが表示されている)を開き、前項で変換したファイル (wzmail) をそこに移動する(拡張子はつけない)。この作業の間は Thunderbird は起動していないこと。
  5. Thunderbird を起動させると変換したメールボックスが認識されているはず。

変換速度は遅いです。-v オプションでも付けてのんびり待ってね。

WZ MAIL でエクスポートしたメールボックスは、SubjectFrom がデコードされた状態で格納されてしまってるし、Content-Type: text/plain; charset=iso-2022-jp とか書いてあってもエンコーディングは Shift_JIS になってるしで、あれでまともにインポートできるメーラーはないんじゃないかという気がします。

けっきょくスクリプトでは、Content-Type の情報から元のメッセージを再構築するという方法を取らざるをえなかった(遅いのはそのせい)。なので、ヘッダの出現順や表現形式などは変換前と同じではありません。どうせ受信時そのままのはもはや再現できないんだから、まあ仕方ないよ。

自分のメールボックスでテストしただけなので、かならずしもあなたの環境ですべてのメールボックスをうまく変換できるとは限りません。あしからず。

オライリー 乗り換え WZ MAIL

2006-09-21

ftpsite.pl にまつわる雑談の続き。

本当のことをいうと、ネットワークにパスワードを平文で流す FTP は時代遅れなので使わないほうがいいんですよね。ウェブサイトの更新にローカルとの同期をしたいというのであれば rsync とか Unison などを使ってするほうがいい。とくに Unison は便利そうなので移行したいのです。

とはいっても、SSH でログインできたり sftp が使えたりするホスティングサービスというのはまだ一般的ではないんじゃないかと思うし(調べてませんが)、まだ置いておいてもいいか。さくらインターネットは先進的すぎるんだ。

FTP クライアントというのは、いまはすっかり廃れてしまったんじゃないでしょうか。パーソナルなページならいまやプロバイダがブログのためのスペースを用意してるから、それを使えばたいていのことはできてしまう。日記はもちろん、写真を載せたい人にも使えるし、コメント機能があるからコミュニケーションツールも兼ねている(これはスパムで虫の息ですが)。「ほーむぺーじをつくるには」みたいな記事で、FTP クライアントをインストールさせたり Perl の CGI を書かせて「とっても簡単!」とか虚偽の記載を並べていた欺瞞の時代はなんだったのだろう、とか、思います。

そう考えるとウェブも少しは使いやすいものになっているのかもしれません。ブログの偉かったところはトラックバックとか RSS なんかじゃなくて人を FTP から解放したところですよね。

ウェブログもコミュニケーションスペースもないサイトを FTP で更新している自分ですけど。

Free Podcasts from National Geographic

ナショナル・ジオグラフィックのポッドキャスト。ビデオ・ポッドキャストがたくさんある。

Audio and Video Podcasts from National Geographic
http://www.nationalgeographic.com/podcasts/

「Atmosphere」が新機軸すぎです。

2006-09-13

(追記あり。)

問い:
別のところで定義されている文字 $A, $B があったとする。文字列 $s 中にある $A をすべて $B に置き換えたい。Perl でこれを処理するにはどう書けばよいでしょう。

$A, $B というのはようするにグローバル変数です。

さて、$A, $B が文字なので、文字を入れ替える tr 演算子を使うだろう、と考えるわけです。

$s =‾ tr/$A/$B/;

ブー。これはうまくいかない。tr 演算子は変数展開をしない。なんなんだこれは。$s =‾ tr/X/Y/; と書いて XXXYYY にすることはできるけど、$X = "X"; $Y = "Y"; tr/$X/$Y/; はできない。どうするのかというと、こうしろと。

eval "¥$s =‾ tr/$A/$B/;";

ありえん。eval て。個人的には eval というのは最後の手段的なものだと思ってましたが。デバッグできないし。しかもこれは正しく動かない。$A‘/’$B‘Y’ だったらどうなりますか。eval されるのは “$s =‾ tr///Y/;” というわけでエラーになります。

なので事前に文字をエスケープする必要があります。$A, $B はグローバル変数なので勝手に置換してしまうわけにはいかないので、ローカルにコピーして使います。

my $a;
my $b;
($a = $A) =‾ s/(¥¥|¥/)/¥¥$1/g;
($b = $B) =‾ s/(¥¥|¥/)/¥¥$1/g;
eval "¥$s =‾ tr/$a/$b/;";

これでいちおう正解(のはず)。たのしいね。

こんなのやってられないので正規表現置換することにします。s 演算子は変数展開もしてくれるし。

$s =‾ s/$A/$B/g;

もちろんこれもアウト。今回は $A ないし $B‘¥’ だと正規表現のメタ文字として解釈されておかしなことになります。というわけでエスケープ。今回も $A, $B はローカルにコピーします。

my $a;
my $b;
($a = $A) =‾ s/¥¥/¥¥¥¥/g;
($b = $B) =‾ s/¥¥/¥¥¥¥/g;
$s =‾ s/$a/$b/g;

これで正解(のはず)。ぜんぜん行数減ってない。

追記。

上のコードは間違っていました。$B‘¥’ のときに間違った結果になります。正しくは以下のようにする必要がある。

my $a;
($a = $A) =‾ s/¥¥/¥¥¥¥/g;
$s =‾ s/$a/$B/g;
$s;

エスケープ処理するのは $A のほうだけでいい。置換文字列のほうは正規表現じゃないからか。なんか正規表現リテラルがあるとかえって混乱するな……。

‘X’‘¥’ に置換。 ‘¥’‘X’ に置換。
直接指定 変数を経由 直接指定 変数を経由
Perl
$s =‾ s/X/¥¥/;
$a = "X";
$b = "¥¥";
$s =‾ s/$a/$b/;
$s =‾ s/¥¥/X/;
$a = "¥¥¥¥";
$b = "X";
$s =‾ s/$a/$b/;
Python
re.sub('X', '¥¥', s)
a = 'X'
b = '¥¥'
re.sub(a, b, s)
re.sub('¥¥¥¥', 'X', s)
a = '¥¥¥¥'
b = 'X'
re.sub(a, b, s)
TX-C(笑)
regular(s, "X", "¥¥", 0);
a = "X";
b = "¥¥";
regular(s, a, b, 0);
regular(s, "¥¥¥¥", "X", 0);
a = "¥¥¥¥";
b = "X";
regular(s, a, b, 0);

↑これでよい? 強調部分の非対称性が罠か。

さて、Perl で正規表現のエスケープに使うメタ文字、¥Q, ¥E中村さんから教えてもらいました。

$s =‾ s/¥Q$A¥E/$B/g;

ありがとうございました。これがどうも Perl での「いちばん正しい」書きかたみたいですね。

じつはもうひとつ、1行で書けるのも考えました。

join '', map { $_ eq $A ? $B : $_ } split //, $s;

でもこれはかなり遅いみたいです。それにべつにわかりやすいわけでもありませんし。

ところでこの処理を Python で書くとこうなります。(べつに Python でなくてもまともな文字列操作メソッドがある言語ならおんなじでしょうけど。)

s.replace(A, B)

あと Perl でもっと簡単に書ける方法をご存知の方は教えていただけるとありがたいです(というか単純な replace はないのでしょうか)。