小道具の最近のブログ記事

漢詩詩語集を処理するに際して,Excel ファイルを CSV に一括変換するツール「Excel 一括 CSV」だと,JIS X 0212 のいわゆる JIS 第三・第四水準の文字の出力が「?」に化けてしまった。これをなんとかしたいと思い別のツールをいろいろ漁ってみたが,これというものが見当たらなかった。UNIX 系システムでの Excel ファイルのテキスト変換では,xlhtml というプログラムが昔から有名であるが,これとて日本語の扱いに関しては不十分なところがある。この調査の過程で,Windows でなくても動作する Perl Excel ファイルハンドリング・モジュール Spreadsheet::ParseExcel の存在を知り,これを使って一括変換ツールを自作することにした。このモジュールは標準ではないので,コマンドラインから cpan -i Spreadsheet::ParseExcel としてインストールする。

Excel は古いバージョンで作成したものだと,ファイル内の日本語文字コードが Shift_JIS なのか CP932 なのか UCS2 なのかよくわからない。おまけに私の目的として,出力すべきファイルは UTF-8 エンコードでなければならない。Spreadsheet::ParseExcelSpreadsheet::ParseExcel::FmtJapan という日本語処理のための下位モジュールを備えている。これらを併用すれば,日本語文字コードに煩わされずにすみ,JIS X 0212 文字もうまく処理でき,かつ UTF-8 で出力できることがわかった。Spreadsheet::ParseExcel のマニュアル(perldoc Spreadsheet::ParseExcel で閲覧できる)に API 解説とサンプルコードがあるので,参照いただきたい。

今回作成した Excel ワークシート一括 CSV 変換プログラム xlstocsv.pl を以下に掲げる。こんなに短いコードでできてしまうのなら,最初から自分の手を動かすべきであった。同じ課題をもつ方は必ずいらっしゃると思うので,以下のコードをコピって活用いただきたい。もちろん無保証,無サポートである。使い方は,コマンドラインで xlstocsv.pl 対象Excelファイル とする。引数に Excel ファイルを一つ指定する。すべてのワークシートが単一 CSV テキストストリームとして STDOUT に書き出される。ファイルに格納したいのならリダイレクトする。

#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
# Excel to CSV
# $Id: xlstocsv.pl 12 2012-02-05 16:57:06Z isao $
use strict;
use utf8;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
binmode STDOUT, ":utf8"; binmode STDERR, ":utf8";
($#ARGV < 0) && die "Usage: $0 xls-file\n";
my $fnm = $ARGV[0]; # Excel file name
my $ct = 0;         # 出力行数
# Excel object
my $xls = Spreadsheet::ParseExcel->new();
my $fmt = Spreadsheet::ParseExcel::FmtJapan->new(); # 日本語あり
my $bko = $xls->parse($fnm, $fmt); # Excel Book object
my @wsa = $bko->worksheets();      # Worksheet object 配列
utf8::decode($fnm);
# ワークシート毎の処理
foreach my $ws (@wsa) {
    my $wsnm  = $ws->{"Name"};
    my $mxrow = $ws->{"MaxRow"};
    my $mxcol = $ws->{"MaxCol"};
    print STDERR "*** $0 $fnm - sheet: $wsnm start.\n";
    if ((defined $mxrow) && (defined $mxcol)) {
        # 行毎の処理
        for (my $row = 0; $row <= $mxrow; $row++) {
            my $line = "";
            # 列毎の処理
            for (my $col = 0; $col <= $mxcol; $col++) {
                # セル値をセット
                my $cell = $ws->get_cell($row, $col);
                $line .= $cell->value() if (defined $cell);
                $line .= ",";
            }
            print "$line\n";
            $ct++;
        }
    }
}
print STDERR "*** $0 from $fnm wrote $ct lines\n";

もしワークシート毎にファイルをばらしたいのなら,foreach my $ws (@wsa) のブロック(ワークシート単位のループ)部分の始めと終わりに独自ファイル処理(「ファイル名+シート名」でファイルハンドルを割り当てる等)を入れればよい。また,このコードは CSV をカンマ区切り形式とし,かつセルの内容に半角カンマが含まれない前提である。もし半角カンマが含まれてもよいようにするなら,得られたセル値を出力時にダブルクォーテーションマークで括る,等の処置を施していただきたい。

これで,一つの Excel ファイルに夥しいワークシートがあろうが,いちいち Excel を開いて CVS として保存しなくても,コマンドラインから一発で CSV 変換ができるようになった。おまけに FreeBSD でも Linux でも Mac OS X でも動くのである。もちろん Windows でも動くし,Excel がインストールされていなくても Excel ファイルを処理出来る,というメリットがある。

私の課題 — いただいた詩語集の処理に関しては,71 の Excel ファイルそれぞれに何十ものワークシートがあって,Excel をひとつひとつ開いてワークシート毎に CSV エクスポートするのはとてもやっていられないが,xlstocsv.pl を使えば次のコマンド操作だけで二字詩語,三字詩語の CSV(2c.csv, 3c.csv)をまとめることができた。

isolde [1001] % foreach i (2c-xls/*.xls)
foreach? set BS=`basename $i .xls`
foreach? (xlstocsv $i > 2c-$BS.csv) >& 2c-$BS.err
foreach? end
...
isolde [1002] % foreach i (3c-xls/*.xls)
foreach? set BS=`basename $i .xls`
foreach? (xlstocsv $i > 3c-$BS.csv) >& 3c-$BS.err
foreach? end
...
isolde [1003] % env LC_ALL=C sort 2c-*.csv | uniq > 2c.csv
isolde [1004] % env LC_ALL=C sort 3c-*.csv | uniq > 3c.csv

xlstocsv.pl は引数に Excel ファイルを一つしか指定できないが,複数の Excel ファイルを扱いたいなら,上の tcsh 操作のようにループで回せばよい。次のシェルスクリプトは,カレントディレクトリにあるすべての Excel ファイルを,「xls と同じファイルベース名+拡張子 csv」という名の CSV ファイルに書き出す。

#!/bin/sh
for i in *.xls
do
    BS=`basename $i .xls`
    xlstocsv.pl $BS.xls > $BS.csv
done

新年のスパムメール

|

自宅サーバでメールサーバを運用し,DynDNS で取得したドメイン名でメールをやり取りしている。当然ながらスパムメール・チェッカ SpamAssassin やメール振分ソフト Procmail を稼働させて,メールボックス配信時にスパムメールを取り除けている。一般に,スパムと判断されたメールは,これを /dev/null 行きにする管理者が多いのではないだろうか。/dev/null は UNIX のスペシャルファイルのひとつで,これを出力先にすると削除と同じ操作となる,言わば宇宙空間のブラックホールのようなものである。

しかし,私はスパムをブラックホール送りにしないで専用ディレクトリに入れている。もちろん,きちんとしたメールがスパムと誤判断される場合を考慮したからであるが,たまにスパムの文面をみて大笑いするためでもある。この際,FreeBSD サーバ上の GNU Emacs 環境の MUA Mew を使って閲覧する。Windows では Outlook Express などでプレビュー表示しただけで感染してしまうウィルスが知られているが,UNIX 上のテキストベースの Mew なら,いかがわしいスパムを閲覧してもウィルス感染する心配はあんまりない(だから Windows ユーザは私の真似をしてはいけない)。

私はサイトのあちこちに自分のメールアドレスを晒しているので,ロボットに収集されて,いろんなところからスパムが私のところに来る。これらスパムは,かつては英語のものが圧倒的に多かったが(ほとんどが「あなたの dick を三倍に」,「Rolex 高級時計を格安で」に類するものであった),この二週間ほどの傾向では,日本語が約 50%,中国語が約 30% である。英語のものは 10% 程度である(米国は何か対スパムの法整備をしたのか?)。ウクライナ/ロシアからも 3% 程度ある(ウクライナはアタックも多く,ならず者計算機使いが多いと私はみている)。中国語が目立つようになったけれども,やっぱり懲りない奴らは日本語を話すのが多いらしい。エロサイト,「金持ちマダムのお相手しませんか」的出会いサイト,裏ビデオ取引への勧誘がほとんどである。サーバアタックは米国,ウクライナ,中国からが多かった(ちょっと前の調査による)のだけれども。もちろん,これは「私のところに来たもの」(しかも二週間のデータ)がベースなので,スパムメール事情の全体的傾向とは判断できない。

年明け,こんなスパムが来た。「パックリおまんこ開けましておめこでしょう」。「あけおめコ」というのもあった。「あけましておめでとう,ことしもよろしく」というのを若い人たちは「あけおめことよろ」と略したりする。このスパムメール,そのなかに卑猥な言葉が隠れていることを利用していて,大笑いさせられた。このスマパー,きっと関西人に違いない。メールヘッダを確認すると,どの IP から送付されて来たかがわかる。この「あけましておめこでしょう」メールヘッダは,次のようなものだった。

From info@027ab.cdefg.info  Thu Jan  5 14:19:11 2012
Received: from 027ab.cdefg.info ([175.106.71.27])
	by beatrice.yasuda.org (8.14.4/8.14.4) with SMTP id s055R94k001229
	for isao@yasuda.homeip.net; Thu, 5 Jan 2012 14:19:10 +0900 (JST)
	(envelope-from info@027ab.cdefg.info)
Message-Id: <201201050519.s055R94k001229@beatrice.yasuda.org>
MIME-Version: 1.0
Content-Type:text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

IP は 175.106.71.27(スパマーの IP アドレスは晒してやってもかまわない?)。人間ではなく機械が自動的にバラまいたスパムであることがわかる(当然といえば当然)。人間がパソコンから出すメールはたいていプロバイダのメールゲートを通過し,そのたびに Received: 行が追加されるので,ヘッダにはこれが必ず複数行ある。上記ヘッダには 1 行しかないので,MUA が直接私のメールサーバに接続したことがわかり,つまりスパム発送プログラムのしわざだと考えられるのである。じゃ,いったいどこが発信源か。whois コマンドで調べてみる。

isolde:/Users/i-yasuda[1004] % whois 175.106.71.27
...
inetnum:        175.106.64.0 - 175.106.127.255
...
person:         jung bxung wxx
address:        Gyexnggi-dx Gwxnsexn-dxng
address:        1056-XX XX  JNDINFO.CX
country:        KR
phone:          +82-31-226-XXXX
e-mail:         comnetxx@hanmir.xxx
mnt-by:         MNT-KRNIC-AP
changed:        hostmaster@nic.xr.kr
source:         KRNIC
...

内容は xxx などと少し改変し,情報量もはしょってある。発信源は韓国だったニダ。関西じゃありませんでした。このメール本文には,スパムとしては当然ながら,誘導したいエロサイト URL がしるされているが,この URL から引いた IP アドレスは米国のサイトのようである。この日本語スパマーは韓国,米国を隠れ蓑にして商売していやがったわけだ。

と,ま,時折りこのようにスパムを眺めて楽しんでいるのであります。下品なネタですみませんでした。

銀塩写真のデジタル化

|

このお休み,銀塩カメラで撮った写真をせっせとスキャンしてデジタルデータにしていた。バカ息子も二十歳になり,少しアルバムの整理でもしようと思い立ったのだ。

うちのスキャナは CANON 製 CanoScan LiDE 90 というモデルで,四年前に購入したものである。確か,一万円しない最安値の製品を選んで決めた記憶がある。A4 原稿を 300dpi で走査でき,一般家庭で使うには充分の機能をもっている。ところがここ二年ほどエラーが出てうまくスキャンできない場合があり,何度かやっているうちに成功するので,問題を放置していた。今回の銀塩写真デジタル化作業でも頻繁にエラー(「スキャナ本体にエラーが発生しました。操作説明書に従った処理を実行してください。スキャナドライバを終了します」)が出て,その度に Photoshop やスキャナを初期化したりした。あまりに頻繁なので,きちんと対処することにした。メッセージマニュアルには,次のいずれかが原因とあった。1. スキャナが接続されていない。2. ソフトが正常にインストールされていない。3. 本体が故障している。もういちど基本に則って,接続を確認したら USB コネクタの接続が少し甘かったようである。原因は 1. ということだった。繋ぎ直しをきちんとすればエラーが出なくなった。困ったときは基本に立ち返ってマニュアルの指示に従うこと。

アルバムの写真を年 8 枚くらい選ぶ。一度にスキャン出来るのが 4 枚なのでそうたくさんはやっていられない。子供が写っているのを中心に選ぶわけであるが,その仕分け中に,これ何の写真だったかな,ああそうだ,そうだ,みたいなノリになり,ついつい懐かしさに浸ってしまう。そして,写真が見る人の記憶を引き出すよすがであることに改めて感謝する。Adobe Photoshop CS を使って,スキャンした 300dpi 画像を Web 画面などでの閲覧にも適するように 72dpi に変換し,コントラストなどの画質を調整して,年別のフォルダに JPEG 形式で格納した。

アルバムを整理していると,私や妻の若かったころの写真もごそっと出て来る。妻は「おとーさん,こんな瘠せてたっけー? これ病気してた頃かしら」と大爆笑しやがる。「何か,使用前・使用後って感じね」。私はというと,あの頃は若かったなぁという感傷よりも,一緒に写っている父母や義父母のいまの老けように思い至ることのほうが多かった。

作業の途中,飯を食いにダイニングに行くと,娘が倖田來未のモノマネをしていた:「赤ちゃんできてもうたー,うちホンマどないしよー」。「子供が少ないいま,できちゃった婚でも何でも,ちゃんと生もうってんだから倖田來未えらいよな」(最近では,子供を生む女を誉めてはいけないことになっているんだけど)てなことを言うと,「いまアタシが赤ちゃんできてもうたーって言ったらどうする?」と娘。「フザきんなー」と一喝。「おめぇが小さいときの写真をいっぱいパソコンに入れたから,見てね」。そうそう,写真を整理していちばん思ったこと — ガキは大きくなればなるほどムカツクものである。

娘のパソコン・トラブル

|

今日,娘のパソコンが届いた。Lenovo G570 43347GJ というモデル。36,000 円しかしなかったが,15.6 型ワイド液晶(1,366 × 768 ドット),Intel Core i3 2330M/2.2GHz CPU,750GB HDD,2GB メモリ,DVD スーパーマルチドライブ搭載というスペック。テンキーまで付いている結構大きなノート型であった。OS は Windows 7 Home Premium 64bit をプレインストールしている。Web で予備校の VOD 授業を受講することがもっぱらの用途なので,これで充分。

わが家には宅内 LAN が敷設されている。14 年前に家を建てるに当たって,私自身で敷設設計を行い,部材を揃え,設置工事だけ電器屋にしてもらったのである。その詳細はここに書いたとおりである。当時はこんなことをする人はよほどの好き者だったろう。電器屋さんははじめての経験なので,イーサネット 10 Base-T のモジュラーの成端方法など,こちらからあれこれ指示しなければならなかった。もちろんいま現在では無線 LAN が当たり前になったので,自宅にイーサネット回線を宅内配線する人はいないだろう。でもカテゴリー 5 のイーサネットで可能な 100 Mbps 安定高速通信の LAN 接続は,無線 LAN でもいまだに難しいのではないだろうか(最近では 600 Mbps なんてのもあるんだけど)。

そういうわけで,自宅の全ての部屋にはカテゴリー 5 のモジュラーコンセントがあり,屋根裏部屋・書斎にハブと 100 Mbps 光回線終端(要するに外部ネットワークへのゲート)を設置して,放射状のネットワークを構成している。新しいパソコンも娘の部屋のモジュラーコンセントに接続した。ところが。ping に書斎のサーバが応答しない。要するに繋がらない。切り分けのため,私の Macbook Pro を接続してみたがダメ。パソコンではなさそう。次に,ずっと使っていなかった LAN ケーブルで間に合わせたのが悪いのかと考えて,このケーブルで書斎のハブに直づけして ping 疎通させてみるとアウト。よし。確実に繋がるケーブルに差し替えて,娘の部屋でリトライ。でも,やっぱりダメ。「え? もしかして宅内ケーブルがまずいのか?」と最悪の事態が頭をよぎる。それじゃまた電器屋に依頼しなければならない。でないと,娘の部屋から使えず何のためにパソコンを買ったのか半ば意味が失せてしまう。落ち着け。落ち着け。結局,娘の部屋から来ている書斎側のコンセントが間違っていたことが判明。息子の部屋から来ているコンセントに繋いでいたのだった。新たに LAN ケーブルを正しいコンセントに繋いで,やっとネットワークの疎通がOKになった。これで自宅の 5 部屋全てに端末が接続されている状態になった。

ところが。IE で予備校の VOD がきちんと動くか娘に確認させたら,今度は予備校サイトのエラーメッセージが出て,授業のビデオが再生されない。メッセージには「Windows 7 では,A なので B を実行しなければならず面倒ですが,C のアップデートと D の削除も有効だと思われます。この二つのアップデートをしてみてください」云々とある。「二つのアップデートをせよ」というのが何と何のアップデートなのかわかりますか? D はどうもアップデートとはかかわりないようにみえる。「以下三点を順次すべて実行してみよ。1. B を実行する。2. C のアップデートを行う。3. D を削除する」と何故書かないのか。「このコンピュータバカ野郎のバカ文章め!」と頭に来た。プログラマは独り善がりな文章を書くやつが意外と多い。自分がわかっていることを他人にもわかるように書くことがホントへたくそなんである。仕様書や取扱説明書のレビューで呆れることしばしばなのだ。そして,仕様書の書き方がいい加減なプログラマに限ってプログラムそのもののバグも多い。これらは私の SE としての経験である。

結局,エラーメッセージにあるキーワードのひとつひとつを調べて Windows 7 セキュリティアップデートを実施したら動くようになった。セキュリティアップデートをやってみて,これ自体に二種類のものがあって,ようやく「二つの」の言わんとしていることが理解できた。D の削除(いまとなっては何だったのか忘れた)なんてやらなくても,B(IE の管理者権限での実行)と C(セキュリティアップデート)だけで動いた。世の中にはソフトウェアの仕様書・取説をきちんと読むやつがほとんどおらず,コンピュータの素人はどいつもこいつも「教えてクン」であるわけだが,書かれてあるものがきちんとしていないこともかなりある。

娘は大喜び。お父さんスゴイ。さて,お礼に肩を揉ませようか,腰を指圧させようか,お使いをさせようか,いま思案中である。
 

寝正月。この年末年始は,堕落の一言。大掃除の手伝いもせず,芭蕉の俳句と北村薫『街の灯』を少し読むばかり。さすがに愛用の Mac くらいはキレイにすることにした。買ったばかりの Mac は,まるで美人の皓歯か雪肌のような眩しい白で持主をうっとりとさせてくれるが,使い倒すとヤニで汚れた歯でニタニタされるくらい鬱陶しく変貌してしまう。

Mac US キーボードをウェットティッシュでゴシゴシ拭きながら CD を聴いた。門光子の演奏による現代日本のピアノ曲集『風の記憶』。M·A Recordings レーベルから 2002 年に出たレコード。吉松隆,三木稔,武満徹,西村朗,藤森守,柴山拓郎のピアノ小品が納められている。門光子はここで,知る人ぞ知るイタリア製ピアノの名器 Fazioli F278 (猫も杓子もコンサートグランドピアノは Steinway & Sons,じゃ困ります)を弾いている。

『風の記憶』という題名に相応しく,夢の中で海浜に坐ってただひたすら風に吹かれて遠い彼方を見つめている,そんな,まるで映画のインプレッシブなシーンにいる感覚にさせてくれる。何と言っても,吉松隆『プレイアデス舞曲集』からの 5 曲がめっぽう愛らしい。Fazioli ピアノの特長なのか,門光子のタッチの気品なのか,柔らかく優しく朧な音像が絶品である。門光子演奏のピアノ曲集は,私にとって最高の現代の音の風景である。夢見るような気分にさせてくれるんである。

この CD は残念ながら品切れもしくは廃盤になってしまっており,アマゾンマーケットプレイスでも出品がない。オークションサイトや中古レコード店で探し出して,ぜひ聴いていただきたい。
 

20120102-kazenofukei.jpg
 

Mac のキーボードもキレイになりました。
 

20120102-macg5.jpg

20120102-macbook.jpg

Facebook バグ多し

|

Facebook をよく閲覧している。 friends のほとんどが日本に関心をもつ海外の人である。東日本大震災や福島原発事故について気遣ってくれるので,日本も捨てたものじゃないなという感を深くすることもしばしばだった。彼らは日本の伝統文化を大いに尊敬していて,それはそれで日本人として嬉しいわけだけど,それでも現代の日本人が心を惹かれているものにも関心をもってもらいたいという思いもあり,私はもっぱら日本の現代の音楽や日本画,アニメなどの情報を流している。もちろん,私の知らなかった興味深い情報が friends から得られて,Facebook はいまや手放せないサイトである。

Facebook は頻繁に仕様変更され,それゆえ極めてバグが多い。Mac OS X Safari だととくに気になるんである。ま,コミュニケーション・ツールなのでバグといっても痛みを感じない部類のものである。私のこのバカ・ブログを Facebook にも feed していたんだけど,これまでも atom.xml を取りに来なくなるバグに少々辟易していた。ところが,最近まったく feed されなくなり,昨日よくよく調べてみると,最近の仕様変更によりいつの間にか外部サイト記事の feed 取込を停止してしまったようである。マシン・パワーが馬鹿にならないのと記事が増えて困るのとがその理由だろう。

Facebook のバグで苛立たせられるものとして,YouTube 動画をシェアしようとするとリンクが追従出来ないことが時折りある。でも,これは次のようにすれば回避できる。YouTube 動画画面で「共有」ボタンをクリックして現われる「長いリンク」と「開始位置」とをチェックし,「開始位置」に "0:01" のように差し障りのない時間を指定してから,動画リンクのテキストをコピーし,これを Facebook の "What's on you mind?" のテキストボックスにペーストする。すると動画のサムネイルも Description もきちんと持って来る。百発百中を保証するわけではないが,ダメなとき私はこれですべてうまく行った。

サイバー戦争

|

朝日新聞 11 月 7 日の朝刊 1 面トップに『サイバー戦に備えよ』との見出しで,中国山東省済南市の技術学校・山東藍翔高級技工学校が紹介されていた。この学校は中国軍のコンピュータ技術者を養成していると目されているという。

記事がわざわざ朝日のトップを飾るのには背景がある。昨年 Google が受けたサイバー攻撃の発信源が山東省済南市に特定され,さらにここ最近では衆議院や三菱重工などの国家機関・防衛産業企業へのサイバー攻撃が相次いで発覚し,その際中国のサーバが使用され中国政府ないし中国軍が事実上関与していたことは間違いないとされた — もう中国による「電脳」無法行為がいよいよ看過出来ない状況になった,という事情である。先頃刊行された平成 23 年版防衛白書・第一部・概説「国際社会における安全保障上の主な課題」項では,北朝鮮の核問題,ロシアと韓国との領土問題,中国による日本領海侵犯問題,テロ問題よりも前に,サイバー空間・宇宙空間における破壊工作問題について述べられている。

衆議院,総務省,防衛産業,新聞社その他,日本企業における被害は多く「標的型攻撃メール」によるものとされている。トレンドマイクロ社の「インターネット脅威マンスリーレポート - 2011年10月度」によれば,「10 月は,日本国内で複数の企業・団体へのサイバー攻撃が報道されました。国内における標的型攻撃の多くは不正プログラムを添付したメールを個人に送付し,バックドア型の不正プログラムに感染させることで攻撃者が外部から侵入し,個人情報や機密情報など目的の情報を窃取します。特定の対象に継続的に攻撃が繰り返される『持続的標的型攻撃』は,事前に攻撃対象を調査することや,セキュリティソフトで検出されないことを確認してからメールを送付するなど,攻撃者の手口が巧妙と言えます」。私の会社でもこの問題への注意喚起がなされている。

くだんの朝日新聞には,記者に送られて来た攻撃メールが掲載されていた。受信者の関心を惹き付けそうな内容とともに,受信者の名前が本文に書かれ,さも「専門家のあなたに判断してもらいたい」ということで添付ファイルを閲覧させるようになっている。しかし,その日本語は文体・表記・助詞用法において日本人が書いたにしては明らかにおかしいものである:「先生の中国航空母艦についでニュスを拝読したいことがあります。[ ... ] 先生の頑張るにしたがて,私たち日本人は中国海軍の実力がわかりになることがあります」。これなら大企業のたいていの社員ならば違和感を覚えて,これは何かの企みだと判断し,情報セキュリティ部門に報告するはずで,いわんや添付ファイルを開くなんて行動は起こさない。事実それで発覚したわけなのだが,それでも添付ファイルをオープンしてしまう人がいて,PC がウイルス感染し,知らないうちに PC の中味がすべて攻撃者に渡っていたわけである。

米国はサイバー攻撃に関して中国とロシアを名指しで非難した。米国だってそのスジのプロフェショナルであって,人のこと言えんのかてなもんやけど,サイバー攻撃の性格によっては宣戦布告の理由には充分である。というか,もうサイバー戦争は始まっていると考えるべきなんだろう。ま,自宅に来る迷惑メールは,おまんこメールか中国語の意味不明のメールばかりで,何の心配もないんだけど。あ,ついでにひとこと,メール・ヘッダの Subject 欄の MIME コードに gb2312 文字列が含まれるものはすべて,私は procmail レシピによってこれらをスパムとして弾いている。私に送りつけられて来る中国語簡体字のメールはすべてスパムだからである。

ハガキ宛名差込印刷

|

あと少しすればもう年末。年賀状を書かなければならない時期が来る。住所録から LaTeX を用いてハガキ宛名印刷用 PDF を生成するツールを作ってみた。これは昔 UNIX 系の雑誌にあった記事の工夫なので,ネットで探せば同様のツールが見つかるかも知れないが,私自身の好みでレイアウトをカスタマイズできるよう,スクラッチから(すべてを一から)自作してみた。mkpostaddr-201111102344.tar.gz アーカイブを掲載しておくので,関心のある方はダウンロードしてお使いください。無保証です。

処理方式は次のとおり。住所録 CSV ファイル(address.csv),LaTeX プリアンブル・ファイル(preamble.tex),ハガキ差込フォーム・ファイル(form.tex),ハガキレイアウト定義ファイル(post.conf)を読込んで,住所録の宛名の数だけハガキ宛名組版の LaTeX ソースコードを出力する。この際,日本語は OTF パッケージを用いて Adobe-Japan1-6 コードの広範囲の漢字を出力出来るようにする。この処理は Perl スクリプト mkpostaddr で行う。出来上がった TeX ファイルを eplatex 及び dvipdfmx で処理して PDF を生成する。これらのファイルはすべて UTF-8 エンコーディングでなければならない。サンプルの住所録 CSV ファイルで組版した結果 PDF 画像を以下に示す。
 

20111110-hagaki.jpg
 

住所録 CSV ファイルは,項目をカンマ区切りで記述した,いわゆる CSV ファイルである。このツールでは,1:宛名-姓, 2:宛名-名, 3:宛先郵便番号, 4:宛先住所(番地まで), 5:宛先住所(ビル,マンション情報), 6:会社名, 7:部署名, 8:宛名連名-姓, 9:宛名連名-名 の 9 項目からなるデータを前提としている。5 〜 9 は無ければ空データもしくは空白としておいてよいが,カンマは必ず全部で 8 必要である。Microsoft Excel などで住所録を作成し,区切り文字カンマ,文字コード UTF-8 指定で CSV 出力すればよい。このデータはハガキ差込フォーム・ファイルで記述された所定の変数位置に埋め込まれ,ハガキ宛名 LaTeX コードとなる。郵便番号の出力位置と差出人情報をハガキレイアウト定義ファイルに書いておく。郵便番号の出力位置については,日本郵便社お年玉年賀ハガキ向けにすでに調整してある。掲載ファイルにはサンプルが記述されているが,差出人は変更するか,不必要なら空にしておく。

住所に英文字以外の外国語,たとえばロシア語を使いたい場合は,{\selectlanguage{russian}キリル文字} と書いておけばよい。両端のブレースは必須である。Babel パッケージをプリアンブル・ファイルに宣言してあり,仏・独・露語が使用可能である。もちろん利用者で追加・訂正してよい。

少し長大になるが,各ファイル内容を掲載しておく。
 

住所録 CSV ファイル(サンプル)

あくまでサンプル。必ず,自分用に CSV 形式で作成してください。

# -*- coding: utf-8; mode: text; -*-
# 住所録CSVファイル(サンプル)
# 1:宛名姓,2:宛名名,3:郵便番号,4:住所1,5:住所2(建物),
#     6:会社名,7:部署名,8:宛名(連名)姓,9:宛名(連名)名
\CID{13706}田,太郎,1020082,東京都千代田区一番町一—二—三,一番ビルヂング地下一階,株式会社 ヨシダ商事,営業部,,花子
鈴木,花子,1020072,東京都千代田区飯田橋四—五—六,,,,,
高橋,一郎,2100808,神奈川県川崎市川崎区旭町一—二三—四,大日本マンション一〇一号,,,,\hspace*{.5zh}桜\hspace*{.5zh}
 

ハガキ差込フォーム・ファイル

LaTeX コードにおいて住所録の数だけ繰返し出力される宛名印字頁整形用の雛形である。:数字: の部分が,住所録 CSV ファイルの情報で書換えられる。印字の位置,文字の大きさなど,気に入らなければ適宜修正ください。基本的には弄る必要はない。

% -*- coding: utf-8; mode: latex; -*-
% ハガキ差込フォーム・ファイル(TeX form 原稿)
% $Id: form.tex 9 2011-11-10 13:41:03Z isao $
% 2011 (c) isao yasuda.
\begin{picture}(100,148)(3,3)
 
    %% 宛先郵便番号
    \Huge
    \put(\cntTOX,\cntTOY){\makebox[6mm][c]{:1:}}%第1桁
    \advance\cntTOX by \cntTOW
    \put(\cntTOX,\cntTOY){\makebox[6mm][c]{:2:}}%第2桁
    \advance\cntTOX by \cntTOW
    \put(\cntTOX,\cntTOY){\makebox[6mm][c]{:3:}}%第3桁
    \put(\cntTTX,\cntTTY){\makebox[6mm][c]{:4:}}%第4桁
    \advance\cntTTX by \cntTTW
    \put(\cntTTX,\cntTTY){\makebox[6mm][c]{:5:}}%第5桁
    \advance\cntTTX by \cntTTW
    \put(\cntTTX,\cntTTY){\makebox[6mm][c]{:6:}}%第6桁
    \advance\cntTTX by \cntTTW
    \put(\cntTTX,\cntTTY){\makebox[6mm][c]{:7:}}%第7桁
 
    %% 住所
    \put(70,30){%
      \makebox(20,94)[rt]{%
      %\framebox(20,94)[rt]{%
        \begin{minipage}<t>[t]{94mm}
            \Large
            :8:\\%住所1
            \vspace*{1mm}%
            \hspace*{5mm}%
            :9:%住所2
        \end{minipage}
      }%
    }%
 
    %% 会社名・部書名・連名
    \put(45,30){%
      \makebox(30,88)[rt]{%
      %\framebox(30,88)[rt]{%
        \begin{minipage}<t>[t]{88mm}
            \hspace*{3mm}%
            \vspace*{-7mm}%
            {\large :10:\\}%会社名
            \hspace*{7mm}%
            \vspace*{-3mm}%
            {\large :11:\\}%部署名
            \vspace*{-3mm}%
            \def\lastname{:00:}%
            \settowidth{\namelen}{\lastname}\addtolength{\namelen}{1zw}%
            \makebox[\namelen][l]{\lastname}:01:~様\\%宛名
            %\hspace*{20mm}%
            \makebox[\namelen][l]{:12:}%
            :13:%連名
        \end{minipage}
      }%
    }%
 
    %% 差出人住所・氏名
    \put(10,32){%
      \makebox(30,58)[rt]{%
      %\framebox(30,58)[rt]{%
        \small
        \begin{minipage}<t>[t]{58mm}
          {\large :20:}\par%住所1
          \vspace*{3mm}%
          {\Large
          \hspace*{5mm}%
          \makebox[3.5zw][l]{:21:}\qquad :22:\\[2pt]%差出人姓名
          \hspace*{5mm}%
          \makebox[3.5zw][l]{:23:}\qquad :24:}\par%連名姓名
          \vspace*{3mm}%
          \hfill{\large :25:}%
        \end{minipage}
      }%
    }%
 
    %%% 差出人郵便番号
    \large
    \put(\cntFOX,\cntFOY){\makebox[4mm][c]{:30:}}%第1桁
    \advance\cntFOX by \cntFOW
    \put(\cntFOX,\cntFOY){\makebox[4mm][c]{:31:}}%第2桁
    \advance\cntFOX by \cntFOW
    \put(\cntFOX,\cntFOY){\makebox[4mm][c]{:32:}}%第3桁
    \put(\cntFTX,\cntFTY){\makebox[4mm][c]{:33:}}%第4桁
    \advance\cntFTX by \cntFTW
    \put(\cntFTX,\cntFTY){\makebox[4mm][c]{:34:}}%第5桁
    \advance\cntFTX by \cntFTW
    \put(\cntFTX,\cntFTY){\makebox[4mm][c]{:35:}}%第6桁
    \advance\cntFTX by \cntFTW
    \put(\cntFTX,\cntFTY){\makebox[4mm][c]{:36:}}%第7桁
 
\end{picture}
 

ハガキレイアウト定義ファイル(サンプル)

Perl プログラムの変数定義の形式で記述する。差出人情報は必ず修正しなければならない。宛名面に差出人情報を印字したくない場合は,ごっそり削除すればよい。郵便番号を出力する位置は,ミリ単位,整数で指定しないといけない。すでに日本郵便社お年玉年賀ハガキ向けに私が調整してあるので,修正する必要はないと思う。

# -*- coding: utf-8; mode: cperl -*-
# ハガキレイアウト定義ファイル
# $Id: post.conf 9 2011-11-10 13:41:03Z isao $
# 2011 (c) isao yasuda.
# 宛先郵便番号
$POSTNUMT1POSX =  46;  # 1桁目X位置
$POSTNUMT1POSY = 131;  # 1-3桁目Y位置
$POSTNUMT1WIDTH =  7;  # 1-3桁目送り幅
$POSTNUMT2POSX =  67;  # 4桁目X位置
$POSTNUMT2POSY = 131;  # 4-7桁目Y位置
$POSTNUMT2WIDTH =  7;  # 4-7桁目送り幅
# 差出人郵便番号
$POSTNUMF1POSX =  10;  # 1桁目X位置
$POSTNUMF1POSY =  26;  # 1-3桁目Y位置
$POSTNUMF1WIDTH =  4;  # 1-3桁目送り幅
$POSTNUMF2POSX =  23;  # 4桁目X位置
$POSTNUMF2POSY =  26;  # 4-7桁目Y位置
$POSTNUMF2WIDTH =  4;  # 4-7桁目送り幅
# 差出人
$FROMADR = '横浜市港北区綱島一—二—三'; # 住所
$FROMPCD = '1234567';   # 郵便番号
$FROMLN1 = '田 中';     # 姓
$FROMFN1 = '達夫・律子';  # 名
$FROMLN2 = ' ';        # 連名・性
$FROMFN2 = '一郎・次子'; # 連名・名
$FROMOTH = '012-345-6789'; # その他(下寄せ)
 

LaTeX プリアンブル・ファイル

生成されるハガキ宛名印刷 LaTeX コードの先頭に出力されるコードである。もしフォントなどを変更したい場合は,パッケージ,デフォルト・ローマン書体の指定を追加すればよい。Babel パッケージが指定されているが,外国語が不要なら削ってもよい。

% -*- coding: utf-8; mode: latex; -*-
% LaTeX プリアンブル・ファイル(TeX preamble 原稿)
% $Id: preamble.tex 6 2011-11-10 01:44:50Z isao $
% 2011 (c) isao yasuda.
\documentclass{jsarticle}
\special{papersize=100mm,148mm}%はがき大きさページサイズ
\usepackage[T2A,T1]{fontenc}%
\usepackage[utf8x]{inputenc}%
\usepackage{plext}%pTeX縦組ツール
\usepackage[russian,english,french,german,japanese]{babel}%多国語
\usepackage[deluxe,expert,multi]{otf}%
\setlength{\textwidth}{100mm}%ハガキ幅
\setlength{\textheight}{148mm}%ハガキ高
\setlength{\oddsidemargin}{-25.4mm}%左横マージン0
\setlength{\topmargin}{-25.4mm}%上マージン0
\setlength{\headheight}{0mm}%
\setlength{\headsep}{0mm}%
\setlength{\unitlength}{1mm}%picture環境単位mm
\pagestyle{empty}%ページ番号なし
\newlength{\namelen}%宛名幅用
\parindent=0pt\relax
 

mkpostaddr はがき印刷用住所差込 Perl コード

Perl プログラム。現在の Perl 処理系ならモジュール追加なしに実行できるはずである。よほど印刷様式が気に入らない限り,修正は不要のはずである。

#!/usr/bin/perl
# -*- coding: utf-8; mode: cperl; -*-
#
#  mkpostaddr はがき印刷用住所差込
#  $Id: mkpostaddr 9 2011-11-10 13:41:03Z isao $
#  2011 (C) isao yasuda, All Rights Reserved.
#
#  SUMMARY
#  ------
#  アドレスCSVファイルを読込み,はがき宛名印刷用TeXファイルを生成する
#
#  DESCRIPTION
#  -----------
#  1. preamble ファイルを読込み,出力する
#  2. コンフィグファイルを読込み,TeX 形式で出力する
#  3. 明細フォームファイルを読込み,form 配列に行展開する
#  4. アドレスcsvファイルを一行ずつ読込み,form パターンに差込み,出力する
#
#  USAGE
#  -----
#  1. address.csv, post.conf, preamble.tex, form.tex は UTF-8 であること
#  2. コマンドラインは以下のとおり
#     % mkpostaddr -c post.conf -f form.tex -p preamble.tex \
#       < address.csv > hagaki.tex
#     % eplatex hagaki.tex
#     % dvipdfmx hagaki.dvi
#
use strict;
use utf8;
use Getopt::Std;
use File::Basename;
 
binmode(STDOUT, ":utf8");
# コマンドライン引数処理
my %opts = (
            'c' => 'post.conf',    # configuretion
            'f' => 'form.tex',     # form.tex
            'p' => 'preamble.tex'  # preamble.tex
           );
Getopt::Std::getopts('c:f:p:', \%opts) || usage();
 
# プリアンブル出力
open(INP, "<:utf8", $opts{'p'}) ||
    die $opts{'p'} . " file not found.\n";
print $_ while (<INP>); close(INP);
 
# コンフィグ初期値 単位 mm
# 宛先郵便番号
my $POSTNUMT1POSX =  48; # 1桁目X位置
my $POSTNUMT1POSY = 132; # 1-3桁目Y位置
my $POSTNUMT1WIDTH =  6; # 1-3桁目送り幅
my $POSTNUMT2POSX =  68; # 4桁目X位置
my $POSTNUMT2POSY = 132; # 4-7桁目Y位置
my $POSTNUMT2WIDTH =  6; # 4-7桁目送り幅
# 差出人郵便番号
my $POSTNUMF1POSX =  10; # 1桁目X位置
my $POSTNUMF1POSY =  16; # 1-3桁目Y位置
my $POSTNUMF1WIDTH =  4; # 1-3桁目送り幅
my $POSTNUMF2POSX =  24; # 4桁目X位置
my $POSTNUMF2POSY =  16; # 4-7桁目Y位置
my $POSTNUMF2WIDTH =  4; # 4-7桁目送り幅
# 差出人
my $FROMADR = ''; # 住所
my $FROMPCD = ''; # 郵便番号
my $FROMLN1 = ''; # 姓
my $FROMFN1 = ''; # 名
my $FROMLN2 = ''; # 連名・性
my $FROMFN2 = ''; # 連名・名
my $FROMOTH = ''; # その他(下寄せ)
 
# コンフィグ定義読込
open(INC, "<:utf8", $opts{'c'}) ||
    die $opts{'c'} . " file not found.\n";
eval($_) while (<INC>); close(INC);
 
print <<"EOM";
\\newcount\\cntTOX \\cntTOX=$POSTNUMT1POSX
\\newcount\\cntTOY \\cntTOY=$POSTNUMT1POSY
\\newcount\\cntTOW \\cntTOW=$POSTNUMT1WIDTH
\\newcount\\cntTTX \\cntTTX=$POSTNUMT2POSX
\\newcount\\cntTTY \\cntTTY=$POSTNUMT2POSY
\\newcount\\cntTTW \\cntTTW=$POSTNUMT2WIDTH
\\newcount\\cntFOX \\cntFOX=$POSTNUMF1POSX
\\newcount\\cntFOY \\cntFOY=$POSTNUMF1POSY
\\newcount\\cntFOW \\cntFOW=$POSTNUMF1WIDTH
\\newcount\\cntFTX \\cntFTX=$POSTNUMF2POSX
\\newcount\\cntFTY \\cntFTY=$POSTNUMF2POSY
\\newcount\\cntFTW \\cntFTW=$POSTNUMF2WIDTH
\\begin{document}
EOM
 
my @frompcd = ("", "", "", "", "", "", "");
if ($FROMPCD) {
    @frompcd = split(//, $FROMPCD);
}
 
# フォーム入力/行展開
open(INF, "<:utf8", $opts{'f'}) ||
    die $opts{'f'} . " file not found.\n";
my @form = <INF>; close(INF);
 
# 住所CSVファイルを読み込み,行毎にはがき整形する
while (<STDIN>) {
    utf8::decode($_);
    # コメント行(\#),空行は読み飛ばす
    next if /^#/; next if /^\s*$/; chomp;
    my @addr = split(/,/, $_);
    next if ($addr[0] eq "");
    my @postnum = split(//, $addr[2]);
    my @formwk = @form;
    foreach my $corln (@formwk) {
        # 宛名1姓00
        $corln =~ s/:00:/$addr[0]/;
        # 宛名1名01
        $corln =~ s/:01:/$addr[1]/;
        # 郵便番号 1-7
        for (my $i = 1; $i <= 7; $i++) {
            $corln =~ s/:$i:/$postnum[$i-1]/;
        }
        # 住所1: 番地まで
        $corln =~ s/:8:/$addr[3]/;
        # 住所2: ビル・アパート・部屋
        $corln =~ s/:9:/$addr[4]/;
        # 会社名
        $corln =~ s/:10:/$addr[5]/;
        # 部署名
        $corln =~ s/:11:/$addr[6]/;
        # 宛名2連名姓
        $corln =~ s/:12:/$addr[7]/;
        # 宛名2連名名
        my $ren = $addr[8];
        $ren .= "~様" if ($ren);
        $corln =~ s/:13:/$ren/;
        # 差出人
        $corln =~ s/:20:/$FROMADR/;
        $corln =~ s/:21:/$FROMLN1/;
        $corln =~ s/:22:/$FROMFN1/;
        $corln =~ s/:23:/$FROMLN2/;
        $corln =~ s/:24:/$FROMFN2/;
        for (my $i = 30; $i <= 36; $i++) {
            $corln =~ s/:$i:/$frompcd[$i-30]/;
        }
        $corln =~ s/:25:/$FROMOTH/;
        print $corln;
    }
    print "\\newpage\n";
}
print "\\end{document}\n";
 
sub usage {
    my $prog = basename($0);
    die <<"EOM";
Usage: $prog -c config-file -f form-file -p preamble-file
       \< address-csv-file \> postcard.tex
  -c   configuration file (default: post.conf)
  -f   form TeX file with variables (default: form.tex)
  -p   preamble definition file (default: preamble.tex)
EOM
}
 

掲載したアーカイブには Makefile を添付しており,UNIX 系ユーザなら make とすればサンプル PDF が生成される。dvipdfmx OTF パッケージ用マップファイル otf-ptex-noembed.map も添付してあるが,これは日本語フォントを埋込まない。フォント埋込み PDF を生成したい場合は,ユーザで修正してほしい。コマンドラインを手入力する場合は,以下のとおりとすればよい。

% ./mkpostaddr -c post.conf -f form.tex -p preamble.tex < address.csv > hagaki.tex
% eplatex hagaki.tex
% dvipdfmx -f otf-ptex-noembed.map hagaki.dvi

宛名情報の出力様式(フォント,空き,出力位置)などをカスタマイズしたい場合は,form.tex を確認して,ご自分用に修正していただきたい。

Subversion post-commit

|

FreeBSD サーバ beatrice 復旧がやっと終わったと思ったら,バージョン管理システム Subversion の commit がエラーになってしまった。サーバに Subversion のリポジトリがあり,クライアント PC から自作プログラムや Web ページのバージョン管理を行っている。Web ページについては commit (新バージョンの登録) 操作を行うと,Subversion の post-commit スクリプト(commit の延長で実行される Subversion の付加スクリプト。これを改造して独自処理を追加できる)により,新しい HTML を Web 公開ディレクトリにコピーし,namazu 検索インデックスを更新する,という一連の更新作業を自動的に行うようになっている。

エラーはこの実行環境を復旧し忘れていたためだった。このリカバリには少し悩んだ。自分で組込んだのにその仕組みを完全に忘却してしまっていた。メモを残しておかないとこういうハメになる。そういうことで,改めてここで記しておくことにする。

自動更新の手続きは次のようなものである。

  1. post-commit スクリプトは Web ページ更新シェルスクリプト webupdate スクリプト(自作)を呼び出す。
  2. webupdate は作業ユーザ user のホームディレクトリにある Subversion 管理下の Web サイトソースにおいて,svn update を実行し,新しい版を取り出す。
  3. webupdate は,前回 Web 更新実行時刻のタイムスタンプをもつタイムスタンプファイルよりも新しいファイル群だけを纏めて一時アーカイブファイルを作成する。
  4. webupdate は Apache22 ドキュメントルートにおいて一時アーカイブファイルを解凍し,公開 Web ドキュメントツリーを更新する。
  5. webupdate はタイムスタンプファイルを現在の時刻で更新する(touch コマンドによる)。
  6. webupdate は namazu 検索インデックス更新スクリプト mkwebidx(自作)を呼び出す。
  7. mkwebidx は,前回インデックス更新実行時刻のタイムスタンプをもつタイムスタンプファイルよりも新しく,かつインデックス作成対象のファイル群だけを,namazu インデックス更新用作業領域にコピーする。
  8. mkwebidx は,コピーしたファイルのうち UTF-8 エンコード文書を EUC-JP にコード変換する(namazu が EUC-JP 前提のため)。
  9. mkwebidx は namazu 検索インデックス更新プログラム mknmz コマンドで検索インデックスを更新する。
  10. mkwebidx はタイムスタンプファイルを現在の時刻で更新する(touch コマンドによる)。

この手続きは Web 環境で実行されるため,ユーザ権限は www のパーミションである。しかし,一連の操作において user, root 権限が必要なオペレーションがあり,www がこれらに成り代わる仕掛けが必要になる。もちろん関連するリソースすべてを www の所有とすればよいのだけれども,その他運用事情で www 専用とするわけにも行かなかった。このため,スクリプト内で対話操作を実現するために expect を利用する。www ユーザが expect コマンドで他のユーザでシステムにログインしてその権限の必要なオペレーションを実行するわけである。expect は FreeBSD ports /usr/ports/lang/expectmake install clean を行い組込んでおく。

ただし,このためには www のアカウント設定を通常の nologin からログイン可能ユーザに変更しておかなくてはならない。www アカウント設定(vipw で編集)を以下のようにした。

www:パスワード:80:80::0:0:World Wide Web Owner:/nonexistent:/bin/tcsh

/nonexistent はもともとダミーなんだけど,www オーナで同名ディレクトリを作成しておく。これで一度,www ユーザとして userslogin しておき,ssh が通るようにしておく。

beatrice:/home/user % su -
xxxxxxx
# mkdir -p /nonexistent
# chown -R www:www /nonexistent
# exit
beatrice:/home/user % su - www
xxxxxxx
> slogin user@beatrice 
The authenticity of host 'beatrice (192.168.1.4)' can't be established.
RSA key fingerprint is 62:35:a2:d5:e6:20:8f:91:6e:ce:e6:d2:a4:2b:5c:a7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'beatrice,192.168.1.4' (RSA) to the list of known hosts.
Password: xxxxxx
beatrice:/home/user % 

post-commit スクリプトは,Web ページソースの Subversion リポジトリが /usr/local/var/svn/website/ だとすると,/usr/local/var/svn/website/hooks/ 下に格納する。

以下に post-commit を示す。Subversion によって,引数としてリポジトリディレクトリ名とリビジョンが渡されて起動される。このスクリプトは /var/log/svnupdate.log に実行ログを出力するようになっているので,あらかじめ www オーナ属性でこのファイルを touch しておく。

#!/bin/sh
REPOS="$1"
REV="$2"
LOG=/var/log/svnupdate.log
/bin/echo "*** post-commit STARTED at `/bin/date` $REPOS $REV" >> $LOG
/home/user/bin/webupdate >> $LOG
/bin/echo "*** post-commit ENDED at `/bin/date` $REPOS $REV" >> $LOG

以下に,順次実行される webupdate, mkwebidx の両スクリプトも掲載しておく。

#!/bin/sh
#
#   webupdate
#
#   * HTML install for Beatrice
#   * will be called by post-commit of Subversion
#   Copyright (c) 1998-2011, isao yasuda, All Rights Reserved.
#
DATADIR="/home/user/src/noxinsomniae"
STAMP="$DATADIR/stamp"
EXPECT="/usr/local/bin/expect"
echo "*** Web install start at `date` ***"
# 新しい HTML の取り出し
$EXPECT -c '
    set timeout -1
    spawn slogin user@beatrice
    expect "Password:" 
    send "xxxxxx\r"
    expect "% " 
    send "cd /home/user/src/noxinsomniae\r"
    expect "% " 
    send "/usr/local/bin/svn update\r"
    expect "% " 
    puts "End"
    exit
    '
# 更新ページのアーカイブ
cd $DATADIR
echo "*** $DATADIR archiving & Beatrice installing ..."
find -L . \( -newer $STAMP \! -name .svn \! -name prop-base \! \
    -name text-base \! -name props \! -name tmp \! -name all-wcprops \
    \! -name entries \! -name "*svn-base*" -type f \) | \
    xargs tar zcf /tmp/webarc.tar.gz
echo "*** archive gen done. *** "
ls -las /tmp/webarc.tar.gz
# 公開 Web ツリーへの展開
$EXPECT -c '
    set timeout -1
    spawn slogin user@beatrice
    expect "Password:" 
    send "xxxxxx\r"
    expect "% " 
    send "su\r"
    expect "Password:" 
    send "xxxxxx\r"
    expect "# "
    send "tar zxvf /tmp/webarc.tar.gz -C /usr/local/www/apache22/data\r"
    expect "# " 
    puts "End"
    exit
    '
echo "*** extraction done. ***"
rm -f /tmp/webarc.tar.gz
echo "*** removed archive. ***"
echo "*** Web install ended at `date` ***"
# タイムスタンプの更新
touch $STAMP
#
# namazu 検索インデックスの更新
#
echo "*** Search index generation ***"
$EXPECT -c '
    set timeout -1
    spawn slogin user@beatrice
    expect "Password:" 
    send "xxxxxx\r"
    expect "% " 
    send "su\r"
    expect "Password:" 
    send "xxxxxx\r"
    expect "# "
    send "/home/user/bin/mkwebidx\r"
    expect "# " 
    puts "End"
    exit
    '
echo "*** done. ***"
 
#!/bin/sh
#
#   mkwebidx
#
#   * namazu Web 検索インデックス更新
#   Copyright (c) 1998-2011, isao yasuda, All Rights Reserved.
#
LANG=ja_JP.eucJP
export LANG
SRCDIR=/usr/local/www/apache22/data
TMPIDX=/tmp/webidx
MKNMZRC=/usr/local/etc/namazu/web/mkwebidxrc
IDXDIR=/usr/local/var/namazu/index/web
MKNMZ=/usr/local/bin/mknmz
STAMP=/tmp/webidx/stamp
LIST=/tmp/UTF8LIST
if [ `whoami` != "root" ]; then
    echo "Invoke as a superuser, `whoami`."
    exit
fi
# 更新ページの抽出
cd $SRCDIR
find -L ./*.html ./bbs ./dl ./izhltndoc ./japlit ./lan \
    ./oldslav ./profile ./pushkin ./rus2 ./russify ./slavonic \
    ./tex ./misima ./cyr ./usconcord ./concordance  \
    \( -newer $STAMP \) -and \
    \( -name "*.html" -or -name "*.shtml" -or -name \
    "*.pdf" -or -name "*.txt" \) | \
    xargs tar cf - | \
    ( cd $TMPIDX; tar xvf - )
# UTF-8 to EUC-JP コード変換
find -L ./*.html ./bbs ./dl ./izhltndoc ./japlit ./lan \
    ./oldslav ./profile ./pushkin ./rus2 ./russify ./slavonic \
    ./tex ./misima ./cyr ./usconcord ./concordance \
    \( -newer $STAMP \) -and \
    \( -name "*.html" -or -name "*.shtml" \) | \
    xargs grep -H -e "charset=[Uu][Tt][Ff]-8" | \
    cut -d : -f 1 > $LIST
for i in `cat $LIST`
do
    iconv -c -f UTF-8 -t EUC-JP $i | \
    sed 's/charset=[Uu][Tt][Ff]-8/charset=EUC-JP/g' > $TMPIDX/$i
done
# インデックス更新
$MKNMZ -f $MKNMZRC -a -O $IDXDIR -k $TMPIDX
# タイムスタンプの更新
touch $STAMP
rm -f $LIST
echo "*** done. ***"

馬込文士村散歩

|

Movable Type 5.1 RC が出たので,ちょっと試してみた。でもカスタマイズをもう一度反映するのにひどく手間がかかりそうだったので,Ver. 4 に戻すことに。ところが,とってあったバックアップからの復元がエラーになり,ハマリまくった。Movable Type のバックアップ・ツールは信用しないほうがよい。Web 環境全体をごっそりコピーするほうがシンプルにして確実である。

Facebook でロシアの現代女流詩人オリガ・セダコヴァからメッセージをもらった。彼女の詩集や紀行文,プーシキン関係論文,教会スラヴ語関連学術書を読んで,私は彼女の作風に強く惹かれていたので,信じられないくらいうれしかった。インターネット時代となり,友達の友達を六段階くらい辿るとたいていの人が繋がり合うという話があるけれども,ひと昔前ならこんなことは考えられなかった。

また,同じく Facebook で,ロシアの作曲家ガリーナ・グリゴーリエヴァから,すみだトリフォニーホールで開催される東京カンタート・クロージング・コンサートへの招待があった。彼女はこの催しに招かれて来日するという。そこで彼女の合唱曲『生の夜』が演奏されるんである。「ぜひお会いしましょう」とのこと。こちらもうれしくてならない。だけど,当日はすでに別の用事が入っており,どうしようか悩んでいるところである。
 

* * *

連休に入り,妻と馬込文士村周辺を散歩した。大田区馬込・大森山王界隈は,かつて,萩原朔太郎,室生犀星,北原白秋,日夏耿之介,吉屋信子,三好達治,北園克衛,和辻哲郎などなど,錚々たる作家・詩人たちが住まったことで,馬込文士村と呼ばれている。若き日の川端康成,三島由紀夫も住んでいたらしい。大田区郷土博物館で,文士ゆかりの品々を見学した。北原白秋や日夏耿之介,萩原朔太郎の自筆原稿,初版本など,興味深かった。
 

20110501-bunshimura.jpg

左は大森駅山王口すぐにある馬込文士村の作家・詩人たちのレリーフ。ちょっとゾンビみたいで怖い。夜にはこの前を歩きたくないものである。右は博物館にあった日夏耿之介の雑誌『戯苑』のカバー。
 

20110501-hinatsu-tanka.jpg

この詩歌集にあるような活字の質感は,いまや失われてしまった。日夏耿之介の『黒衣聖母』の黝い浪漫主義には,あの凹凸感のある旧字体活字こそが相応しい。彼の詩は,紋切型のおどろな物語性がなんとも鼻に付くのだが,それゆえにこそ私にとっては堪らない魅力がある。

怕る怖る眺めあげる
黄金色の礼拝壇の中央には
端厳美麗の永貞女彳みたまふ
その眼前の赤蠟燭の大柱の
とぼとぼと燃えさぐる灯の睛のいろは
眼疾を疾んだのか
気弱い灯影疼みただれて
白い泪はしめじめと
紅艷の燭柱の素肌を泫れる
悪 いかほど淫慘な柔肌か
日夏耿之介『蠱惑の人形』—『日本の詩歌』12,中公文庫,1976 年,115 頁。

佐藤惣之助のコーナーに,『六甲颪』,そう,あの阪神タイガースの応援歌の詞が掲げられていた。佐藤の作詞によるもの。プロ野球がやっと開幕,楽しみがまた増えたわけであるが,残念ながら,どうやら今年もわが真弓阪神タイガースはダメ虎のようである。おまけに金本アニキの連続出場記録も,どっちらけの終焉。アニキを温存せぇとは言わんけどやで,配慮が足らなさ過ぎやおまへんか。「意を決して」,ではなく,「判断ミス」で記録が途絶えた,なんていったいなんなんだ。アニキがカワイソ。なんの覚悟もない,ブレーン任せの判断誤りばかりで,まったく存在感,リーダシップが感じられないこと — 真弓監督,菅総理の共通点である。

その他,博物館展示品では,坪田譲治宛萩原朔太郎書翰の,罫を無視した大胆な筆跡が印象的であった。それにしても,昔の詩集・小説本は装丁が奇抜で,工芸的意匠に溢れているんである。

文士村散歩といっても,周辺は細い道が入りくねった閑静な高級住宅街であって,地図を片手に歩いても,番地をたよりに道を探すのに苦労し,お金持ちの家が眼につくばかりで,なんの面白みもなかった。北園克衛が住んでいたという場所を探したのだけれども,まるでわからなかった。12,000 歩ばかり歩いて適度な運動をして来たという感じ。

大森駅に着いたらハラがペコペコ。喜多方ラーメン坂内食堂を見つけ,ラーメンと餃子を食った。アサヒ・スーパードライが腹に沁みて旨かった。
 

後を囘顧みたれば

|

「ロト,ゾアルに至れる時日地の上に昇れり ヱホバ硫黃と火をヱホバの所より卽ち天よりソドムとゴモラに雨しめ 其邑と低地と其邑の居民および地に生ふるところの物を盡く滅ぼし給へり ロトの妻は後を囘顧みたれば鹽の柱となりぬ」。

「創世記」19 章 23−26,罪と頽廃の街・ソドムとゴモラが神の劫火に滅び,ただロトの家族のみが神の救済に与るくだりである。引用は日本聖書協会による文語訳からのものである(『舊新約聖書』日本聖書協会, 1991 年, p. 21)。クライシスとそこからの救済というモチーフ。震災ゆえかなにか心に迫るところがあり,読み返してみた(もちろん震災被災地はソドムでもゴモラでもない)。ロトの妻は,後ろを振返るなと天使から諭されていたにもかかわらず振返ってしまい「鹽の柱」と化す。これが恐ろしい象徴として胸を打つ。「後」とは過去のことを言うのだろうか。滅びて行くものに後ろ髪を引かれ,それゆえに己をも滅ぼす。私も振返って己を滅ぼすクチだと思う。それにしても,この後ろを振返ることで本意が遂げられないというモチーフは,オルフェウスとユーリディケーの逸話にもあって興味深い。

泉鏡花の怪異短編小説『黒壁』(明治二十七年)に「予も何となく後顧(うしろぐら)き心地して」という表現が出て来る。「後ろ暗い」が「後ろを顧みるような」と等価の関係で捉えられている。「後ろ暗い」とは「気掛かり,心配だ」のほかに「ふた心がある」という意味もある。つまり,心に覚悟がなく,信念に反する邪念があるの謂いである。神はロトの妻のそういう心の奥底を「振返るな」との命により試したのかも知れない。

「創世記」のこのくだりを教会スラヴ語訳聖書でも読んでみた。「鹽の柱」は «столпъ сланъ»「霜の柱」という訳になっている。拙作 OldSlav 教会スラヴ語 LaTeX パッケージ (See also OldSlav: An extension of SlavTeX for Old Church Slavonic typesetting) を使って,タイプセットしてみた。

bytie19-23-26.jpg

LaTeX の原稿は以下のとおり。

% -*- coding: utf-8; -*-
% Ветхая Библия 19:23-26
\documentclass[b5paper]{article}
\usepackage[pdftex]{color}
\usepackage[T2A,T1]{fontenc}
\usepackage[russian,oldchurchslavonic]{babel}
\languageattribute{oldchurchslavonic}{utf8,slavdate}
\setlength{\textwidth}{11cm}
\DeclareFontFamily{LST}{cmr}{}%
\DeclareFontShape{LST}{cmr}{m}{n}{<-> s * [1.12] fslavrm}{}%
\definecolor{bibc}{rgb}{0.40,0.44,0,20}%
\begin{document}
\color{bibc}
\Large
С'олнце вз'ыде над\ъ з'емлю,
л'ѡтъ же вн'иде въ си\-г'ѡръ.
\И г|сдь <ѡдожд`и на сод'омъ \и
гом'орръ ж'упелъ, \и "ѻгнь ѿ г|сда
съ небес`е.
\И преврат`и гр'ады сї^ѧ, \и вс`ю
<ѡкр'естную стран`у, \и вс'ѧ жив'ущыѧ
во град'ѣхъ, \и вс^ѧ прозѧб^ающаѧ
ѿ земл`и.
\И <ѡзр'ѣсѧ жен`а єг`ѡ всп'ѧть,
\и б'ысть ст'олпъ сл'анъ.
 
\vspace{.4em}
\hfill БЫТЇ`Е ГЛАВ`А \slnum(19).:
\slnum(23).{\selectlanguage{russian}--}\slnum(26).
\end{document}
 
* * *

震災の影響で国産煙草が品薄になっている。一週間ほど前,会社からの帰途にある煙草屋に寄るも,どこもハイライトが品切れだった。帰宅して,近所を探しまわったがやはり品切れ。しようがなく昔住んでいた平間の煙草屋に行ってみるとかろうじて自販機に残があり,店のオヤジにタスポを借りて4箱手に入れた。それ以後,もう入手できない。ま,煙草なんて生活必需品ではないのだから,どうでもいいことではある。
 

* * *

まったく関係ありませんが,麻雀ゲームで清老頭を上がってしまいました。
 
20110417-tinroto.jpg

家族でラーメン・片付け

|

娘がうるさくせがむので,家族で外食。JR 鹿島田駅近くの「原製麺所」なるラーメン屋に行った。黒胡麻担々麺,カレーラーメンの旨い私のお勧めの店。皆満足。

統一地方選挙が終わったところ。大学生にもなって AKB48 に現を抜かす息子が — 別にいいじゃねぇか — ラーメンを食いながら,AKB 総選挙のことを話題にした。「なんじゃ総選挙って?」— うじゃうじゃいる AKB ガールの,ファンによる人気投票らしい。テレビで歌って躍っているこの女の子たちに対して,私にはただただ自分の子供を見るような保護者的視線しか持ち合わせていない。CM の「当り前田アツコ」でやっと前田敦子さんの名前を覚えたくらいなんである。へぇー,芸能界にも民主主義のトレンドか。あるいは,芸能界の厳しい臆面のない序列化潮流なのか。AKB48 のファンはこの選挙権を得るために彼女たちの CD を買うんだそうである。血道を上げるファンのなかには 1 CD 当り得られる 1 投票権のために何枚も同じ CD を買うらしい。最近 CD が売れないという話を聞くけれども,おかげで AKB の CD は近年稀にみるミリオンセラーを記録した。この女の子たちは政令指定都市の首長と同じくらいの規模の投票でしのぎを削るわけである。凄い。一番人気の者と同時にドンジリも明らかになり,民主主義ゆえの残酷がここにはある。顧客(ファン)の意思を最重要視するという発想が顧客の参画意識を刺激し顧客の思い入れを増大させ,これにより彼女たちの人気をさらに上げることが出来る。商売の巧みに感心。これビジネス特許ものではなかろうか。それにつけても,AKB 総選挙に比べりゃ,統一地方選挙有権者の真剣度合いの貧弱さが想像され,笑ってしまう。

家の片付けをした。壊れたプリンタ,パソコン,オーディオを廃品回収業者に,ダンボール四箱の本をブックオフに,引き取らせた。床にぶちまけていた岩波日本古典文学体系本 102 巻をやっと書架に収めた。喪失してしまっていた私の ZIPPO 50 年モデルを妻が見つけた。学生時代に購入した懐かしい一品。老斑のような拭えない傷・錆。その後新たに購入した 50 年モデルと比べると,古いの(写真左)はエッジの丸みが強く,やっぱりこちらのほうが古色がある。オイルを注入しフリンツを装填したら,勢いよく点火した。

20110416-zippo.jpg

Unicode msearch 導入メモ

|

私のメインサイトでは namazu 2 でサイト内全文検索ができるようになっている。namazu 2 は UNIX 環境日本語全文検索エンジンの定番になって久しいが,基本的に ISO-2022-JP, Shift_JIS, EUC-JP の日本語文字コードを前提としており,多国語文書には適さない。ロシア語に限って言えば,Unicode ロシア語文書も検索できるのだけど(JIS の智慧のおかげ)。

最近ではサイト内検索エンジンをブログ管理システムに任せるか,Google のドメイン指定の検索窓を設けることで,自らインデックス管理自体をしないですむようになっており,独自に検索エンジンを設置する必要性は薄くなって来ている。ちなみに,Google のドメイン指定で自分のサイト内だけを検索するための検索窓は,以下のようなコードを自サイトのページに埋め込めばよい。

<form method="get" action="http://www.google.com/search">
<input type="text" name="q" size="30" maxlength="255" value="">
<input type="hidden" value="検索対象ドメイン" name="as_sitesearch">
<input type="hidden" name="hl" value="ja">
<input type="hidden" name="ie" value="UTF-8">
<input type="submit" value="Google 検索">
</form>
このサイト内なら—

私は受信したメールを MHonArc でアーカイブし,パスワードで文書セキュリティを保護することで,Web でどこからでも自分のメールを見られるようにしている。このような用途では,Google を使うわけには行かず(非公開なんだから当然),どうしても独自に検索エンジンを設置しなければならない。

Katsushi Matsuda,毛流麦花両氏による msearch は Unicode 文書からインデキシングが可能である。よって多国語文書も本来の文字列で検索が可能である。そこで私も Unicode 版 msearch Ver. 1.52 を導入してみた。これで柔軟な多国語検索とメールアーカイブ検索が両立できるというわけだ。http://yasuda.homeip.net/msearch.html から私のサイト内の検索ができるようにしてみた(メール検索は当然ながら非公開)。検索結果画面は msearch のお仕着せをそのまま使っている。まだ画面右上の namazu 検索は生きている。そのうち整理するつもりである。

msearch は,茶筌で日本語検索対象語を抽出してインデキシングを行う namazu とは異なり,おそらく n-gram で全文インデックスを抽出している。これは検索モレを防ぎかつ高速化を実現するのに有効な方法である。ただし,msearch は多国語文字を取り扱うことができるとはいえ,いわゆる語形変化に追随できるようなインデキシング解析をしているわけではなさそうである。Google なら,нести (「携える」という意味のロシア語不規則変化動詞不定形) を入力すると,несут (三人称複数現在) などの変化形をも検索できる。さすがである。

msearch は PDF, Microsoft Word, Microsoft Excel, Microsoft PowerPoint をインデキシングするためのフィルタを持たないため,そのままでは原則 HTML 文書だけを扱うことになる。私自身は .doc, .xls, .ppt ファイルをプライベートで扱うことはないので,まったく困らないのだが,PDF だけはなんとしても検索できるようにしたい。以下,PDF も取り扱うことができるように msearch 環境を調整するメモをしるしておく。環境は Mac OS X Snow Leopard (インデックス作成) 及び FreeBSD 8.1-RELEASE (公開 Web 環境) である。掲載内容は無保証である。

Unicode 版 msearch インストール

Unicode msearch のダウンロード,インストールは「サイト内全文検索エンジン ― Unicode版msearch」に毛流麦花氏による懇切丁寧な解説があるので,そちらを参照する。アーカイブを解凍し,cgi-bin/msearch にリソースを格納するだけである。Perl 5 が必要である。/~user/ などの Web ユーザディレクトリ下で msearch を運用する場合は,public_html/cgi-bin/msearch のパーミッションが 644 あるいは 755 (他ユーザの書込権限なし) になっていないと,Premature end of script headers のエラーが出て動作しないので注意。

私の場合,PDF 処理その他でサイトのドキュメント・ツリーを書き換えてしまうオペレーションが発生するため,Apache22 の公開エリアとは別に ~/var/webindex ディレクトリ (以下「ワークツリー」) を作成し,そのなかにサイト・ドキュメント・ツリーをコピーするとともに,msearch リソース・ディレクトリをも設置した。ここで検索インデックスをローカル作成(msearch では,Web ブラウザからインデックス作成操作が可能であるが,これを使わず,サーバ・ローカルの端末でコマンド操作によりインデックス作成を行うことを「ローカル作成」と呼んでいる)し,できたものを Apache22 の公開エリア /usr/local/www/apache22/cgi-bin/msearch にコピーするという運用である。

msearch のサイト用独自設定は default.cfg で行う。本稿の試行では,とりあえず set $home= の右辺を私のサイト URL に書き換えただけである。

PDF インデキシング

msearch で PDF ファイルのインデックスを作成するには,いくつか注意事項があり,少し工夫が必要である。そのままで PDF をインデックス作成対象に指定すると,インデックス・ローカル作成プログラム genindex.pl (本稿で「インデクサ」とあるのはこれのこと) は異常終了する。

PDF はテキスト変換した上でインデクサに掛けるのが基本である。UNIX X11 PDF ビュア XPDF のユーティリティ pdftotext で PDF -- テキスト変換を行った上でインデキシング実行すればよい。このときテキスト化されたファイルを元の PDF ファイルと同じ名称にしておかないと,検索結果のリンクで当該ファイルを参照できないので,テキスト変換結果で元 PDF ファイルを上書きしておく必要がある。PDF 以外でも wvWare (Microsoft Word 用),xlHtml (Microsoft Excel 用),pptHtml (Microsoft PowerPoint 用) の各 UNIX ソフトウェアを利用し HTML ないしテキスト形式に変換することで,msearch インデキシングが可能である。

第二の注意点として,HTML / XML 以外のファイルに対して msearch は BOM で Unicode エンコードを判断していることがある。BOM がないと,Web 検索結果画面上の当該ヒットエントリの文字が化けてしまうのである。普通,UTF-8 でテキストファイルを作成するとき,BOM を付けたりしないので,インデクサに掛ける前に UTF-8 BOM (十六進コード "EFBBBF") をワークツリーのテキスト変換後ファイルの先頭に書き込んでおく。これは echo, cat コマンドなどで簡単にできるのだけれども,私は,PDF に混在した不要な制御コード文字を取り除く目的と合わせて,これを行う簡単なプログラム chkucntlchr を書いた。PDF 以外のテキストファイルも同様の処置が必要である。

以上の処理を自動で行うシェルスクリプトのコード例を以下に示す。これを含んで,msearch インデックス作成の全体シェルスクリプト例を最後に掲げてある。

# PDF format conversion
$WRK=ワークツリー
$UCK=chkucntlchr # 制御コード削除・BOM 付加ツール
$STP=タイムスタンプファイル (前回実行時の日付属性をもつ空ファイル)
echo "*  Convert PDF to TEXT by pdftotext (XPDF)."
cd $WRK
for i in `find -L . -newer $STP -name "*.pdf"`
do
    pdftotext -enc UTF-8 -nopgbrk $i $i.txt
    if [ $? -eq 0 ]; then
        echo "**  pdftotext $i OK."
        $UCK < $i.txt > $i
        if [ $? -eq 2 ]; then
            echo "**  $i is empty. Ignore."
            rm -f $i
        fi
    else
        echo "**  pdftotext $i NG. Ignore."
        rm -f $i
    fi
    rm -f $i.txt
done

また,chkucntlchr ツールの Perl コードは以下の通りである。

#!/usr/bin/perl -w
# -*- coding: utf-8; mode: cperl; -*-
# chkucntlchr
# 2011(c) isao yasuda.
# - delete words including control characters (U+0001--U+0020, U+007F--U+00A0)
# - Add UTF-8 BOM (x'efbbbf') for msearch indexer
# - Return code 0: normal; 1: suppressed; 2: imput empty;
use strict;
use utf8;
binmode STDOUT, ":utf8";
my $flg = 0;
my $lc = 0;
my $utf8_bom = "\xEF\xBB\xBF";      # BOM for UTF-8
utf8::decode($utf8_bom);
print $utf8_bom;
while (<STDIN>) {
    chomp($_); $lc++;
    utf8::decode($_);
    my @line = split(/\s/, $_);
    foreach my $wd (@line) {
        if ($wd =~ /[\x{0001}-\x{0020}\x{007F}-\x{00A0}]/) {
            $flg = 1;
        } else {
            print "$wd ";
        }
    }
    print "\n";
}
if (! $lc) {
    print STDERR "*** $0: input empty.\n";
    exit 2;
}
if ($flg) {
    print STDERR "*** $0: suppressed control characters.\n";
} else {
    print STDERR "*** $0: no problem.\n";
}
exit $flg;


segmentation fault 対策

msearch インデクサに PDF を食わせるに際して,もっとも悩んだのはテキスト化した PDF でも,インデクサが segmentation fault エラーで異常終了する場合があることであった。インデクサからコールされる indexing.pl に罠を仕掛けて調査したところ,問題が二つ判明した。

まず第一には,サイトのインデックス対象ファイル数が多いと,UNIX の ulimit のファイルオープン数の制限に引っ掛かり,異常終了してしまう。ulimit -a で制限値を確認し,インデックス対象ファイル数よりも open files の設定値が小さければ,ulimit -n 数値 で値をファイル数よりも大きな値に設定する。

第二には,msearch インデクサは正規表現 s 演算子によって HTML タグの除去処理を行っているが,これをすべてのファイルに適用しており,テキスト変換された PDF ファイル中の文字列如何によっては誤動作してしまう。私のサイトの PDF は,LaTeX 多言語文書を dvipdfmx で処理した生成物が多い。LaTeX フォント・パッケージの enc ファイル(エンコーディング定義ファイル)によってはヘンな文字の羅列になることがあり,これでタグ判定の正規表現がぶっとんでしまったらしい。indexing.pl 791 行目を,HTML / XML でないときは実行しないように,以下の改変を行うと,アボートしないようになった。

#    $contents =~ s/<(?:[^"'>]|"[^"]*"|'[^']*')*>/ /g;  # オリジナル
    $contents =~ s/<(?:[^"'>]|"[^"]*"|'[^']*')*>/ /g if ($html_xml); # 対策

XPDF 多国語化

XPDF pdftotext の多国語対応について簡単にしるしておく。FreeBSD Ports,Mac OS X MacPorts では XPDF Japanese port が用意されており,これをインストールすれば日本語 PDF については扱うことが出来るようになる。しかし,多国語 PDF はダメ。

XPDF のサイトでは中国語,ギリシア語などいくつかの言語設定追加リソース・パッケージが公開されている。これらを用いて多国語対応設定ファイルを作成する。以下のシェルスクリプトを実行すれば,パッケージをダウンロード・展開した上で,カレントディレクトリに xpdfrc を生成する。これを $HOME/.xpdfrc として格納する。次に,パッケージのリソース xpdf-japanese 等を XPDF 管理ディレクトリ (FreeBSD なら /usr/local/share/xpdf) にコピーする。これで,pdftotext により,日本語のほか簡体中文,繁體中文,韓国語,ロシア語,ギリシア語,アラビア語,ヘブライ語などの Unicode テキストが出力できるようになる。ただし,この実行で生成された xpdfrc には PDF 表示の際に必要となるフォント定義がないので,あくまで pdftotext テキスト変換用途と理解いただきたい。表示も含めた設定は XPDF ドキュメントを参照して displayNamedCIDFontTT 定義に好みの TrueType, OpenType フォントを指定するなりして調整してほしい(私は UNIX 環境での PDF 表示は Adobe Reader を使っているのでこのへんは放置している)。

#!/bin/sh
# Download XPDF language packs
WGET="wget -nH -nd "
XPDFSITE="ftp://ftp.foolabs.com/pub/xpdf"
# XPDFETC は xpdfrc があるディレクトリに変更する
XPDFETC="/usr/local/etc"
$WGET $XPDFSITE/xpdf-arabic.tar.gz
$WGET $XPDFSITE/xpdf-chinese-simplified.tar.gz
$WGET $XPDFSITE/xpdf-chinese-traditional.tar.gz
$WGET $XPDFSITE/xpdf-cyrillic.tar.gz
$WGET $XPDFSITE/xpdf-greek.tar.gz
$WGET $XPDFSITE/xpdf-hebrew.tar.gz
$WGET $XPDFSITE/xpdf-japanese.tar.gz
$WGET $XPDFSITE/xpdf-korean.tar.gz
$WGET $XPDFSITE/xpdf-latin2.tar.gz
$WGET $XPDFSITE/xpdf-thai.tar.gz
$WGET $XPDFSITE/xpdf-turkish.tar.gz
# Expand archives
for i in *.tar.gz; do tar zxvf $i; done
# make xpdfrc
cp $XPDFETC/xpdfrc .
for i in `find . -name "add-to-xpdfrc"`
do cat $i >> xpdfrc; done

インデキシング用シェルスクリプト

最後に私が自サイト用に作成したインデキシング用シェルスクリプトを掲載しておく。Mac OS X Snow Leopard 環境である。HTML ソース Subversion 管理エリアからワークツリーに更新ファイルをコピーし,ワークツリーでインデキシングしたのち,Mac 上の Apache22 cgi-bin 試験環境にインデックスファイル default.idx をコピーする。これでできた Mac 上の default.idx をそのまま FreeBSD サーバの msearch 環境に転送して公開するという運用形態である。

私は自サイトの HTML 等公開コンテンツを Subversion でバージョン管理しており,ソースを commit すると Subversion の commit スクリプトが動作して,自動的に更新コンテンツを Apache22 のドキュメント・ツリーにコピーするようにしている。このスクリプトを変更し,commit のタイミングで msearch インデクス作成スクリプトを呼び出して,検索インデクスを自動的に更新することもできる。crontab に登録して定時自動実行するのもよいと思う。

上記の PDF テキスト変換以外にも,HTML の iso-2022-jp to UTF-8 変換なども実行内容に含まれている。シェル内の各パス設定,サイト設定は私の環境そのままなので,もしこれを活用する方がいらっしゃるのなら,自分の環境に応じて書き換えないといけない。もちろん,中味をよく確認し,私のいい加減なコードにヘンなところがあれば手直しいただいたほうがよい。

#!/bin/sh
# -*- coding: utf-8; -*-
# msearch index generator for ISOLDE
# - coded by isao yasuda, 1 Apr. 2011
#
# DESCRIPTION
# -----------
# 1.前回タイムスタンンプより新しいページをSRCからWRKに格納する。
# 2.JISコードのページをUTF-8に変換して格納する。(nkf, sed)
# 3.PDFをテキスト変換してWRKに格納する。
#     rc OK: .pdf の内容はテキストファイル 
#     rc NG: .pdf, .pdf.txt を削除する
# 5.テキスト変換 OK のものの制御コードを削除する。(chkucntlchr)
# 4.WRKでインデックスを生成する。(genindex.pl
# 5.インデックスをWRKからPUBに格納する。
#
# CAUTION
# -------
# 1.初期作成時はファイル数が多いのでWRKにsite treeをコピーしておく。
#
 
# SRC: ページソースエリア
# WRK: ワークエリア
# PUB: 公開エリア (ここでは触らない)
WWW=/usr/local/www/apache22
SRC=/home/isao/src/noxinsomniae
PUB=$WWW/data
CGI=$WWW/cgi-bin/msearch
WRK=/home/isao/var/webindex/website
MSE=/home/isao/var/webindex/msearch
STP=/home/isao/var/webindex/stamp
TMP=/home/isao/var/webindex/tmp
UCK=$MSE/chkucntlchr
NKF=/usr/local/bin/nkf
PDFTOTEXT=/usr/local/bin/pdftotext
 
echo "********************************************************"
echo "*  msearch Index Generation Start `date '+%Y/%m/%d %H:%M:%S.'`  *"
echo "********************************************************"
# Copy SRC to WRK
echo "*  New Files Archiving."
cd $SRC
find -L . -newer $STP -type f | grep -v '.svn' |\
xargs tar cf - | ( cd $WRK; tar xvf - )
cd $WRK
 
# Convert iso-2022-jp to utf-8
echo "*  Convert ISO-2022-JP pages to UTF-8 pages."
cd $SRC
for i in `find -L . -newer $STP -name "*.html"`
do
    $NKF -w $i |\
    sed -e 's|charset=[Ii][Ss][Oo]-2022-[Jj][Pp]|charset=UTF-8|g' > $WRK/$i
done
 
# PDF format conversion
echo "*  Convert PDF to TEXT by pdftotext (XPDF)."
cd $WRK
for i in `find -L . -newer $STP -name "*.pdf"`
do
    $PDFTOTEXT -enc UTF-8 -nopgbrk $SRC/$i $i.txt
    if [ $? -eq 0 ]; then
        echo "**  $PDFTOTEXT $i OK."
        $UCK < $i.txt > $i
        if [ $? -eq 2 ]; then
            echo "**  $i is empty. Ignore."
            rm -f $i
        fi
    else
        echo "**  $PDFTOTEXT $i NG. Ignore."
        rm -f $i
    fi
    rm -f $i.txt
done
 
# add BOM to text files
echo "*  Add BOM to TEXT files."
cd $WRK
for i in `find -L . -newer $STP -name "*.txt" -or -name "*.tex"`
do
    $UCK < $i > $i.tmp
    if [ $? -eq 2 ]; then
        echo "**  $i is empty. Ignore."
        rm -f $i
    fi
    mv $i.tmp $i
done
 
# rm svn control
cd $WRK
find . -name ".svn" -or -name ".#*" | xargs rm -fr
 
# Indexing
echo "*  Execute Indexing by genindex.pl. PARAM:"
echo "*   1 インデックス名前:        default"
echo "*   2 インデックス対象DIR:     $WRK"
echo "*   3 インデックス対象URL:     http://yasuda.homeip.net/"
echo "*   4 インデックス対象拡張子:   .html,.txt,.pdf,.tex"
echo "*   5 非インデックス対象DIR:   admin,common,css,archives"
echo "*   6 非インデックス対象拡張子: (指定無し)"
echo "*   7 非インデックス対象KWD:   (指定無し)"
echo "*   8 ランキング方法:         最終更新日時降順(1)"
echo "*   9 alt属性の文字:         指定しない(0)"
cd $MSE
./genindex.pl <<EOM
default
/home/isao/var/webindex/website
http://yasuda.homeip.net/
.html,.txt,.pdf,.tex
admin,common,css,archives
 
 
1
0
EOM
 
if [ $? -eq 0 ]; then
    echo "*  Index Generation Succeeded."
    ls -l $MSE/default.idx
    echo "*  Now Copy default.idx to $CGI."
    cp -p $MSE/default.idx $CGI
    # STAMP modify
    SDT=`ls -l $STP`
    echo "*  Previous Update: $SDT"
    touch $STP
    SDT=`ls -l $STP`
    echo "*  Now Updated:     $SDT"
else
    echo "*  Index Generation Something bad."
    ls -l $MSE/default.idx
fi
 
echo "*  Procedure Ended. `date '+%Y/%m/%d %H:%M:%S.'`"
# end of script
        

大掃除

|

今日は年末恒例,我が家の大掃除。リビングまわりはテレビが来た時にやったので,今日の私の担当は妻の使っているパソコン周辺。家族はパソコンやオーディオ関係はヘタして壊すとパパが怒るというので,まったく掃除をしない。私は私で暢気な性格なので,パソコンまわりはひどい状態になる。

先日,妻の Windows PC,プリンタが壊れてしまい,その始末もかねて整理・清掃をした。PC ラックの後ろ側はケーブルが錯綜して,うんざりさせられる。このサイトを設置しているサーバなど,すべて電源を落として,ほこりを払い雑巾できれいにした。EIZO 製の 2 台のモニタなど,古色蒼然とした機械には,ほこりがたまりまくって,清掃中くしゃみが止らなかった。

壊れたプリンタは,妻が内職で必要な A3 カラー印刷ができ,FreeBSD Ghostscript ドライバが対応していた一品として選んだのだが,年賀状を印刷するくらいでお陀仏になってしまったものである。処分。

妻の使っていた PC は私が組み立てたもので,電源が入らなくなってしまっていた。そのため,Linux で遊ぶために捨て置いてあったいま一台の古い PC-AT マシン (JCS 製 Vintage Pentium 1GHz) を,今は使っている。こいつもディスク容量が不足気味になっているので,HDD くらいは再利用できるだろうと思い,分解して内臓を取り出すことにした。Matrox Millenium G200 Video, Adaptec 2940 SCSI, Gigabyte ATX Mother board, Quantum HDD, Hitachi HDD など,アキバのショップで仕入れた懐かしいバルク品が出て来た。かつては FreeBSD を動かすためにパーツを綿密に選んで自前で組み立てるのが常だったが,もうそんな気合いはとても出ない。PC を自分で組み立てるなんておそらく二度としないだろう。

HDD だけは Vintage マシンに増設してみようと考えたけれども,Vintage 筐体を開くとすでに EIDE HDD が 2 台付いていた。昔の IDE って 3 台目の接続はアウトじゃなかったかなどと,不安になって来た。5 インチベイへの搭載も狭苦しくて入りそうもない。データシート(バルク HDD のジャンパー設定説明書)もどこにあるのかもわからない。256 MB 133 SIMM の流用も,メモリは相性が極めてデリケートなので,危険すぎる。やめ。AMD Athlon 1GHz プロセッサともども,こいつらも全部処分。

というわけで取り出した贓物を,クリスマスプレゼントにもらったマトリョーシカ,リラックマとともに記念撮影。
 

20101230-osoji1.jpg

20101230-osoji2.jpg

20101230-osoji3.jpg

息子の PC に取り憑いた不埒なプログラム(エロサイトの金額請求画面が出まくる迷惑プログラム)は,Spybot の検査では果たして検出されなかった。これは,スパイウェアというよりも,「ワンクリック不正請求詐欺」というものだそうである。いかにエロサイトを見ているといえども,さすがにいかがわしいプログラムを実行したりしない私は,こんな経験はなかったので,バカ息子のおかげで勉強になった。これを「ワンクリウェア」と呼んでいるサイトもあった。ワンのクリするなんとかなんて,イヤらしさの気が利いている。だから私も以下「ワンクリウェア」と称することにする。

多くのワンクリウェアの手口は,「この動画を見たい人はコレを実行」とかなんとか唆して,スクリプトをエロ閲覧者にダウンロード・実行させるというもの。スクリプトは,mshta.exe を自動起動するようにレジストリを書き換えてしまう。すなわち,システム起動と同時に mshta.exe(これ自体は Windows 付属のきちんとした HTML 解釈器らしい) が指定サイトの請求画面をデスクトップに貼付けるような動作を引き起こす。そういうのが代表的な振舞いのようである。

対策方法は "mshta ワンクリック" ででも検索すればわしゃわしゃ得られる。参考までに今回私が採った対策をメモしておく。ただし,ワンクリウェアはモノによっては追加的工夫をしていて,ひとつの手順であらゆる亜種に対抗できるわけではなさそうである。それを考慮した上で以下の対策を参考にしていただきたい。

msconfig(「スタート」→「ファイル名を指定して実行」から msconfig と入力して実行する)のスタートアップ一覧を子細に確認すると,mshta.exe http://www.dhfksfundsd.biz/reg2.php?... なるものが登録されていた。レジストリエディタ(「スタート」→「ファイル名を指定して実行」から regedit と入力して実行する)でも,mshta を検索すると ...\Shared Tools\MSConfig\startupreg\system_boot_...mshta http://www.dhfksfundsd.biz/reg2.php?... のようなコマンドが登録されているのを発見した。msconfig スタートアップ一覧で停止させるか,レジストリのこのエントリをごそっと削除すれば,起動時にこいつが動くのを停止できるはずである。レジストリエディタの操作は,ヘタすると取り返しのつかない障害に陥るので注意してほしい。責任は持てません。また,ワンクリウェアによってはレジストリキー(登録場所)が違う場合がある。msconfig で停止させるので充分だと思う。これでワンクリ対策が終わる場合が多いようである。

しかし,今回はこれだけではなかった。以上の対策をして再起動しても,しばらくするとまた症状が出る。システム停止時に再登録するウィルスでも併用しているのかと,大いに悩んだ。しかし,そんな迂遠な手法を採るだろうかとしばらく考えるうちに,タスクスケジューラに気付いた。このワンクリウェアはスタートアップに登録するだけでなく,タスクスケジューラに定期的に同じコマンドを実行させる工夫をしていた。タスクスケジュール一覧(これは「コントロールパネル」→「タスク」などから確認できる)を開いて,そのタスクを削除した。これでウチのワンクリウェアはやっとおとなしくなった。

プリンタが壊れた。インクを買い足したところだったのに。年賀状を作る季節が近づいたというのに。プリンタというものは肝心なときに壊れるものである。これまでもそうであった。しようがないのでまた安い製品を買うことにした。ウォーキングを兼ねて川崎ヨドバシカメラに行った。適当に物色し歩いて,キヤノン製 PIXUS iP4830 というインクジェットプリンタに決めた。15,800 円也。このモデル,なんと自動両面印刷が可能で,重宝しそうである。

最近はコンピュータのハードやソフトを買って来ても,何のわくわく感も覚えなくなってしまった。むしろ,ハードの組立て,ソフトのインストール・設定などなどの面倒がまず頭に浮かんで,うんざりしてしまう。私の家にはいくつも PC があり,Mac OS X 2 台,FreeBSD 1 台,Windows 7 1 台,Windows 2000 1 台でプリンタ共有するためには,Mac OS X の cups の設定やら,各マシンのプリンタドライバの設置やら,気が重くなってしまう。そうはいってもやるしかない。

ところが,プリントホストとしている Mac OS X Tiger マシンに接続して,Acrobat から PDF を印刷しようとしたら,ドライバが考え込んでしまってうまく印刷できない。これまで使っていた iP4300 のドライバが悪さをしているのかと思い,これを削除してみたが,状況は変わらず。ユーティリティからテストプリントするとうまく動作したので,試しに別のアプリから印刷してみるときちんと出力できた。ん? Acrobat 7 だとだめなのはなんで? これ,キヤノンに聞くべきなのか,Adobe に聞くべきなのか? おそらくどっちに聞いても相手にされそうもない。これだから Mac はダメなんだ,とブツブツ。

大学生になる息子はレポートなどでプリンタをよく使う。彼の Windows 7 ミニノートのプリンタ共有設定だけは早いうちにやっておいてやろうと,PC を起動した。ところが,息子がエロサイトを閲覧していて余計なことをしたのか,何もオペレーションをしていないのに,「アンタはもう X ヶ月使ったんで 9 万円払え」との請求画面が勝手に出まくって,うるさいことこの上ない。タスクマネージャからいくら終了させても,繰返し,繰返し,オバンの見たくもない裸とこの請求メッセージが出て来る。エロサイトで何かをクリックしたおかげで,スパイウェアがインストールされてしまったようである。このバカ息子め! とりあえずプリンタドライバ設置とリモートプリンタ登録を済ませてから,スパイウェア対策をすることにした。スパイウェア ... 世の中には暇なバカがあまりに多過ぎる。この世間知らずのサイト管理者がいったいどんな奴なのか知りたいものである。でも,こんなのにいちいち反応して「警察に通報してやる」と息巻くほどオレは暇じゃない。クソ。これだから Windows はダメなんだ,とブツブツ。

「プログラムの追加と削除」や msconfig のスタートアップ一覧を確認してみたが,ヘンなプログラムを特定することはできなかった。息子がフリーのゲームソフトをふんだんにインストールしていやがるんで,何が何やらさっぱりわからない。スパイウェア検疫ソフトウェア Spybot をダウンロードし,これでシステムを検査してみることにした。いま,その検疫が走行中である。当分終わりそうもない。検疫が首尾よく終了したら,ブラウザを子供向けのセキュリティの掛かったもの(「Yahoo! あんしんネット」のようなガキ用ブラウザ)に入換えて,このバカ息子を困らせてやるつもりである。

ま,インターネットを使うと誰だってエッチサイトを見てしまうものである。お子ちゃま向けブラウザに入換えて有害サイトをフィルタリングしたところで,子供たちはそういう壁だけは根気よく突破するものである。娘の話だと,中学のころ,技術の時間(いまはコンピュータの使い方を学校で教えている)のあとで男子がエロサイトを見ようとしたらしい。検索サイトで「マンコ」とキーワードを入れて検索したら,ウルトラマンコスモスが大量にヒットしてどっちらけだったそうである。さすがに教育の現場では,プロキシーがきちんと設定されていたということか。
 

※ 11.14 付記:上記問題は翌日に解決した。こちらをご覧ください。

VNC をいじったついでに,かねてからやろうやろうと思っていた Xvfb の導入もやった。Xvfb はディスプレイのないサーバ機などで X Window System の画面入出力をシミュレートする X11 のサーバ・ソフトウェアである。例えば,あるサイトのリンクにそのページ画面のサムネイル画像を掲げているのをよく目にするが,これをサーバで自動的にやろうとすると,JavaServlet などでサイトのページを取得し,ブラウザと同様にレンダリングし,画面イメージを生成するわけだ。このとき Awt などの「ディスプレイ」の存在を仮定するライブラリを使うのが常である。そこで,ディスプレイ・レスの UNIX サーバ機でもそれをエミュレートする,仮想フレームバッファなるインタフェースを提供するのが Xvfb である。

私はサイト・ページのアクセスカウンタを自作の JavaServlet WebCountServlet で取得している。このサーブレットは,カウンタ画像を生成する関係で Java Awt クラスライブラリを使っており,ディスプレイ環境を必要とする。これまで,普通にメインコンソールで X11 を起動して使っていたのだけれど,Tomcat 再起動のたびにディスプレイのある場所に行かねばならなかった(というのも,Tomcat が DISPLAY:0.0 を当て込んでいるので,:0.0 の端末から操作しなければならなかったから)。リソース的にも X11 を常駐させるのは好ましくなかった。Xvfb ならこのあたりの不都合が減らせる。

FreeBSD の ports を使って Xvfb をインストールした。cd /usr/ports/x11-servers/xorg-vfbserver && make install clean で完了。

# Xvfb :5 -screen 0 1024x768x24 &

を投入して Xvfb サーバを起動させておき,Tomcat が参照する環境変数 DISPLAY に,この場合は :5.0 を設定しておけばよい。通常はディスプレイ.スクリーン番号を :1.0 とするようだが,うちでは ssh,VNC その他でもアクセスするので,:5.0 とした。私のように FreeBSD Tomcat5.5 で使うなら,Tomcat 起動スクリプト /usr/local/etc/rc.d/tomcat55 のどこか,起動時に動く関数のはじめのほうに,次を入れておくとよいと思う。各オペランド指定の仕方は man Xvfb で確認いただきたい。

DISPLAY=:5.0
export DISPLAY
/usr/local/bin/Xvfb :5 -screen 0 1024x768x24 > /dev/null 2> /dev/null &

サーバ設置場所に行かなくても,Tomcat 再起動の必要な作業を書斎(自称)でできるようになったのが,私にとっては何よりうれしい。

VNC の利用

|

FreeBSD 8.0-RELEASE を稼働させている IBM ThinkPad X40 のキーボードが故障した。それ以外はまだなんとか動く。キーボードだけの問題であれば,他のマシンからリモートログインして,作業ができる。ssh でもよいのだけれど,デスクトップの操作ができると嬉しいので,VNC を使うことにした。FreeBSD 上に vncserver を起動し,Mac OS X の VNC Client からこれに接続し FreeBSD を操作するわけである。

FreeBSD での VNC プログラム vnc-4.1.3 のインストールは cd /usr/ports/net/vnc && make install clean でできる。Mac OS X の VNC クライアントはフリーウェア Chicken of the VNC を使うことにした。こちらも dmg パッケージを落として来てマウントし,アイコンをアプリケーションフォルダにドラッグすれば,組込みは完了である。

サーバ側で vncserver :1 -geometry 1024x768 -depth 24 などとして VNC Server を起動し,初回にパスワードを応答しておく。クライアント側では Chicken of the VNC の connection --> open connection メニューから,ホスト名,パスワード,ディスプレイ(この場合 1)を指定して接続を実行すると,Mac 上に FreeBSD のデスクトップが現われる。

vncserver を実行するユーザの $HOME/.vnc/xstartup に X クライアントや X ウィンドウマネージャ等の起動コマンド列を記述しておく。.xinitrc の内容とだいたい同じである。ただし,Emacs などのアプリを使おうとすると,次のようなエラーが出て異常終了してしまうことがある。

Xlib:  extension "RANDR" missing on display ":1.0".
Xlib:  extension "Generic Event Extension" missing on display ":1.0".
Undefined color: "black"

これには結構悩まされたのだけれど,計算機と戯れる日々:2009-05-31 記事に救っていただいた。ありがとうございました。rgb.txt を vncserver に指示してやればよいとのこと。というわけで,次のとおり再起動すれば,Emacs もきちんと動いた(Xlib のエラーは解消しないけれど,実害はなさそうである)。

% vncserver -kill :1
% vncserver :1 -geometry 1024x768 -depth 24 \
  -co /usr/local/share/emacs/23.1.91/etc/rgb

また,X スクリーンセーバーが働くとにっちもさっちも行かなくなるので,止めておいたほうがよい。xset s off を端末から投入するか,xstartup に書いておく。

これで,X40 のキーボードがダメでも,Mac から FreeBSD Mew on Emacs を使ってメールチェックする,などの作業ができるようになった。スクリーンショットはこんな感じ。ちなみに X ウィンドウマネージャは Enlightenment DR-16 である。X40 とまったく同じ画面で FreeBSD が使えるのである。

vnc_screen.jpg

OldSlav-1.3-beta, Spam 対策

|

OldSlav-1.3-beta を公開した。古ルーマニア正教会で用いられた二文字の追加,その他バグ fix を行った。

新しい文字は \OCSDZHE \OCSdzhe\OCSYN \OCSyn,またそれぞれ \DZ \dz\YN \yn でも入力ができる。前者は UTF-8 で Џ џ を直接入力することができる。後者は Unicode U+A65E,U+A65F という拡張領域にあり,今回は直接入力のサポートを見送った(このブロックを表示・編集できるエディタは少ないと思う)。

OldSlav-1.3-beta はダウンロードサービスから取得できる。

* * *

最近,頼子さんやら,恵子さん,美香さんなどから,艶っぽいメールをたくさんいただく。とくに頻繁なのがロシア娘 Olga である。要するにスパムメールの話。たいていはスパム丸出しで SpamAssassin が取り除けてくれるのだけど,Olga の英文スパムだけは差出人が私のメールアドレスを詐称しているため,Whitelist 扱いで堂々とメールボックスに入って来てくれる。このオリガ,ロシア語をしゃべってくれるのなら,少しは相手をしてやってもよいのだが,英語で "many beauties" やら "my pussy" やらとウザったい上に,あまりにも出没頻度が高い。その都度手動で MHonArc Web メーリングアーカイブからパージするのにも疲れてしまった。いい加減手を打つことにした。

詐称された自分のメールアドレスを Whitelist から外すという策もあるわけだけど,今回は procmail レシピを追加した。私は自分の出すメールは自分にも cc する習慣であって,それらが SpamAssassin にスパム扱いされかねないのも煩い。

私のアカウントを詐称するメールは,私自身が送信したものではない点をチェックすればよい。その特徴は,当然,私の MUA,プロバイダを通過せずに来るので,メールヘッダの Receive 行に localhost やプロバイダメールホストの来歴がない。ここをチェックして弾くようにした。

:0:
* ^From:.*watasi.no.address.*
* ! ^Received:.*my.provider.smtp.server.jp.*
* ! ^Received:.*localhost.*my.mail.server.jp.*
spam/.

しばらく様子見。おお,Olga が引っ掛かってる,引っ掛かってる。

※ 2010.4.30 付記

それはそうと,ロシア女性名のイメージとなるとオリガというのはなぜなんだろうか? しかもどこか淫微であったり,おつむが弱かったり,という不幸なイメージにおいて。これはどうも伝統的である。プーシキンの『エヴゲーニイ・オネーギン』のオリガは,思慮の浅い女性のタイプになっている。

横光利一の『上海』にも,落ちぶれた亡命貴族女性オリガが登場する。彼女と同棲することになった主人公は,オリガからひっきりなしにアレを迫られ,ヘタってしまう。これはオリガの個性というよりも,ロシア女性一般の情熱に近いらしい。ロシアの男は週に 16 回妻を満たさないと一人前の亭主とは認められない,と佐藤優がどこかで書いていた。横光の観察には感銘を受ける。

10 年程前,錦糸町で顧客と呑み歩いたあと,とうに終電を過ごしてしまった真夜中,ひとり駅前をぶらついてタクシーを探していた時,私はキャバクラの外国人袖引きに誘われたことがある:「えっちナろしあノ女ノ子イマスヨ! はんがりーノキレイナ子モイルヨ! 遊ンデイキマセンカ」。私は「そのロシア人,オリガですか?」と聞いたら,「ヨク知ッテルネ」と言われた。

私は昔,新潮文庫で『上海』を読んだのだけれど,最近,岩波文庫から手頃な版が出たので,以下にその Amazon リンクを付けておきます。
 

PTA 会報を LaTeX で作る

|

うちは娘の中学校の PTA の役員をやらさせられている。文化祭をテーマとした PTA 会報を出すというので,妻がその作成を担当し,私がパソコンで文書データを作るということになった。これまでの会報文書データに雛形はなく,好き勝手に作ってよいとのことだったので,LaTeX で制作することにした。

私にとって,LaTeX 文書作成はもちろん趣味の領域でもあり,ロシア語,パッケージドキュメントの組版以外は,まじめに実用文書を組んだ試しが数えるほどしかない。そもそも LaTeX というソフトウェアは科学技術論文,一般書籍の組版に最適化されており,いわゆる DTP 要素の強い会報には向かない,とわかっていた。それでも LaTeX が好きなので,敢えて LaTeX で挑戦。multicolumn でスッキリしたレイアウト設計を基本とした。掲載写真とそれに付加するコメントとを整列させる命令や,未入手原稿のエリアを指定文字数分確保する命令など,いくつかマクロを書いた。外部からの要請で文書を作るとなると,これまであまり注力しなかったグラフィックス関係の組方で悩むことが多く,インターネットの情報を探索しつつ解決し,結構勉強になった。

過去の会報は A3 用紙の表にページ 1 と 4,裏にぶち抜きのページ 2 と 3 を配置する和綴イメージだった。これを中折にすると 1 枚だけの右綴小冊子となるわけだ。今回の版面設計も,これに合わせることにした。A3 横 2 ページ(見開きで 4 ページ)のファイルを作るのに,まず A4 縦の 2 ページ,A3 横の 1 ページ(見開き 2 ページ)を個別に LaTeX で組版し,PDF を生成した。Adobe Acrobat 7.0 を用いて,A4 縦 PDF の余白編集をしたあと A3 横見開きに合成した(2 UP 印刷)。A4 縦見開き合成 PDF と A3 横 PDF を,A3 横 2 ページ(見開きで合計 4 ページ)の PDF 1 ファイルに纏めて成果物とした。dvipdfmx による個別 PDF ファイルの合成には,pdftk ユーティリティを用いた。Acrobat 7.0 にも PDF 合成機能があるが,これだと文字の欠落が出てしまったので使わなかった(この原因が dvipdfmx にあるのか Adobe Acrobat にあるのかは不明)。

画像に文字をオーバーレイさせる方法を知ったのは今回の収穫。簡単にそのメモをここでしるしておく。

写真にコメントなどを上書きしてレイアウトしたいとき,Microsoft Word ではテキストボックスを画像の上に作成してテキストを入力し,枠と塗りつぶしを消去すればこれができる。LaTeX の場合は overpic パッケージにより実現可能である。teTeX ならはじめからインストールされているようである。

overpic.sty は graphicx パッケージを前提とする。プリアンブルには,次のように指定しておく。

\usepackage[dvips]{graphicx}% dvipdfmx なら dvipdfm オプション
\usepackage[abs]{overpic}

overpic 環境のなかで,ベースとなる画像ファイルを指定し,それに重ね打ちする文字を \put 命令でレイアウトする,というのが使い方の基本である。\put 命令にテキストを位置づける座標を指定する。その値の調整がやっかいではあるが,overpic 環境のオプションに grid を指定すれば,位置グリッドが確認できるので,これをもとに,\put(x 座標, y 座標) を決める。y 座標は文字ボックスのベースラインをポイントすることに注意。

簡単な例として,楽譜を背景にした合唱発表会の曲目一覧を作ってみた。背景画像は,デジカメで撮影した楽譜(バッハ・無伴奏パルティータ 2 番)の写真を Adobe Photoshop, Illustrator で加工し,EPS 形式で保存したものである。テキストの着色には color.sty を使用した。グリッド付と,それを外した本来の組版成果を示す。

overpic_test.jpg

原稿は以下のとおり。\put 命令で重ねる文字列は,複数の段落をなす場合を想定し,\parbox 命令に入れている。

% -*- coding: utf-8; -*-
% 合唱発表会曲目一覧(overpic.sty の試験)
%                      (c) 2009, Isao YASUDA, All Rights Reserved.
\documentclass[b5paper]{jsarticle}
\usepackage[dvips]{graphicx,color}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[abs]{overpic}
\pagestyle{empty}
\definecolor{blue}{cmyk}{0.94,0.54,0,0}% NavyBlue
\def\baselinestretch{0.8}%
\begin{document}
\parindent=0pt\relax%
\begin{minipage}[t]{80mm}
  \begin{overpic}[width=80mm]{musicnote.eps}% 画像指定。試験時 grid を指定
    \put(35,245){% 文字テキストの座標を指定
    \parbox[t]{6cm}{% 重ね打ちする内容
    \parindent=0pt\relax%
    \hspace{5zw}{\gtfamily 合唱発表会曲目}\\[1.1zw]
    \small\bfseries\color{blue}%
    \makebox[9zw][l]{1学年\quad 夢の世界を}\\
    \makebox[9zw][l]{\qquad 1--1\quad 夜汽車}\\
    \makebox[9zw][l]{\qquad 1--2\quad この地球のどこかで}\\
    \makebox[9zw][l]{\qquad 1--3\quad Let's search for tomorrow}\\[.5zw]
    \makebox[9zw][l]{2学年\quad COSMOS}\\
    \makebox[9zw][l]{\qquad 2--1\quad 明日に渡れ}\\
    \makebox[9zw][l]{\qquad 2--2\quad 遠い日の歌}\\
    \makebox[9zw][l]{\qquad 2--3\quad 時の旅人}\\
    \makebox[9zw][l]{\qquad 2--4\quad 予感}\\[.5zw]
    \makebox[9zw][l]{3学年\quad 信じる}\\
    \makebox[9zw][l]{\qquad 3--1\quad 君とみた海}\\
    \makebox[9zw][l]{\qquad 3--2\quad IN TERRA PAX}\\
    \makebox[9zw][l]{\qquad 3--3\quad 虹}\\[.5zw]
    \makebox[9zw][l]{昼休み合唱団}\\
    \makebox[9zw][l]{\qquad 青いベンチ}\\
    \makebox[9zw][l]{\qquad 瑠璃色の地球}\\
    \makebox[9zw][l]{\qquad 手紙}\\[.5zw]
    \makebox[9zw][l]{PTA\,\&\,職員}\\
    \makebox[9zw][l]{\qquad 君をのせて}%
    }}%
  \end{overpic}
\end{minipage}
\end{document}

今回 LaTeX で作成した文書は,おおむね妻の眼に適うものになった。とはいえ,LaTeX で文書を作ると,和文の斜体がないなどの事情について,ワープロのマナーに慣れた人から「え,どうして?」テキな不満をぶつけられることがある。和文には斜体という組方の伝統がないからと説明しても,どうも納得してもらえない。まあよい。LaTeX の版面の素晴らしさに惚れ込んでしまうと,吹出しやら,和文の斜体強調やら,波形下線やら,倍角文字やら,ボックス枠線やらが下品な装飾に見えて来るから不思議である。

Moon Calendar

Profile

ISAO YASUDA。システムエンジニア。神奈川県在住。昭和 30 年代を懐かしむオヤジ。ロシアに興味があります。
[more], [About our site]

Notice

この文書はフィクションであり,実在する個人,団体等とは一切関係ありません。

R-18 指定サイトです。そのうち「18 歳以上ですか」の認証を入れる予定です。

文書の記述内容は無保証です。不適切な表現があればコメントにてご指摘ください。

コメント,トラックバックは,現在,運用を停止しています。ご意見等ありましたら isao@yasuda.homeip.net 宛電子メールにてお願いします。

Links

About this archive

All Entries of Category 小道具

Previous: 一言居士

Next: 政治・動物園

Recent Entries in Main Index.
All Entries in Archive Index.

February 2012

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      
Powered by Movable Type 4.1 blog counter