ハングアップの日々

2004年 7月分

2004/07/31

 cm_rss の文字化けについて少し調べてみた。Perl 5.6 では文字化けはほとんど起きていないらしいが、Perl 5.8 では派手に文字化けが起こっている。おそらく原因は 5.8 で導入された Encode モジュールが関係しているのだろう。5.8 では、文字列の扱いが少し変更されて、utf8 フラグなるものが導入されたらしい。どうやら、utf8 フラグが立っている UTF-8 文字列を Jcode に与えると、文字コードが ascii1 として間違って認識されてしまうようだ。Encode::_utf8_off() を使って、UTF-8 文字列の utf8 フラグを落としてから Jcode に渡した場合は、文字コードを正しく判別できた。

2004/07/30

 cm_rss を文字化けしないように改造してみた。といっても、完全に文字化けがなくなったわけではないが。(改造版 cm_rss.pl)

2004/07/28

 Cygwin/X で日本語を扱うための情報が、Cygwin + X + 日本語アプリケーションにいろいろと書かれている。

 Cygwin/X の起動方法についてちょっと調べてみた。Cygwin/X の設定はインストール後、特に変更していない。startx, xinit, startxwin.sh の 3つのコマンドで X を起動できるが、これらの動作の違いをまとめると以下のようになる。(いずれも引数無しで起動した場合。)

startx multiwindow モード。xterm が起動する。xterm を終了すると X サーバも終了する。内部で xinit を呼び出している。
xinit X 自体のウィンドウが開き、その中に xterm が起動する。xterm を終了すると X サーバも終了する。
startxwin.sh multiwindow モード。xterm が起動する。xterm を終了しても X サーバはそのまま。

いろいろ調べてみたが、なぜ startxwin.sh で起動したときだけは xterm を終了しても X サーバがそのまま残るのかが分からなかった。
 multiwindow モードの Cygwin/X と、8bit色 fullscreen モードの Cygwin/X を同時に起動させる方法も調べてみた。fullscreen モードでは WM として WindowMaker を使うことにした。

startx &
startx /usr/X11R6/bin/wmaker -- :1 -fullscreen -depth 8 &

このようにすれば X サーバが 2つ同時に起動できる。最初の startx は、デフォルトの設定で X を起動する。2つ目の startx は、8bit色 fullscreen モードで、WM として WindowMaker を使って起動する。startxwin.sh を使った場合とは違って、WM を終了すれば X サーバも自動的に終了する。

startx /usr/X11R6/bin/wmaker -- :2 -fullscreen -depth 32 &

などとすれば、さらに別の X サーバを同時に起動できる。(ここでは、32bit色 fullscreen モード) ちなみに :1 や :2 はディスプレイ番号で、これらが重複しないようにする必要がある。無指定の場合は :0 と見なされる。

2004/07/27

 Jcode.pm が 0.87 にバージョンアップしていたので、PPM パッケージも更新しておいた。旧バージョンからバージョンアップする際には、以下のようにして旧バージョンをアンインストールしておく必要があるようだ。

> ppm remove Jcode

その後、以下のように入力すれば新バージョンがインストールできる。

> ppm install http://homepage3.nifty.com/k-takata/perl/Jcode-0.87-5.8.x.ppd

 Cygwin/X で色数を変更できないのか調べてみた。-bpp オプションの代わりに、-depth オプションというものを発見。しかしこれは、-fullscreen オプションを指定して、フルスクリーンモードにした時だけ有効なようだ。startxwin.sh を書き換えて、-fullscreen -depth 8 を指定したところ、8bit color でなければ動かないソフトが動作した。しかし、startxwin.sh を使った場合、最初に立ち上がる xterm を終了させても、X サーバがそのまま残る。そして、xterm の代わりに WindowMaker などのウィンドウマネージャ (WM) を起動するようにした場合でも、WM を終了させても X サーバがそのまま残るのが非常に困りものである。

2004/07/25

 Windows の問題か ATOK の問題か分からないが、かなり昔(Win95 の頃?)から、ときどき ATOK パレットが表示されなくなってしまうことがある。そうなった時には、Win2k までなら、タスクトレイに表示されている赤いペンのアイコンをクリックしてメニューを表示させ、「ツールバーを表示」を何回かクリックすれば、元通り ATOK パレットが表示される。しかし、WinXP には、赤いペンのアイコンがない。ログオンし直せば ATOK パレットが表示されるようになるがもっと簡単な方法はないのだろうか。あるいはプログラムから制御する方法はないのかと IME 関連 API を少し調べてみたがよく分からない。
 ググってみたところ、ATOK17 のサポートページが引っかかった。いくつか対策が載っているが、この場合は、C:\Program Files\Justsystem\ATOK17\TBarSw.exe を実行すれば良さそうである。

2004/07/23

 Perl 5.8.4 で -Mencoding=cp932 の指定がうまく働かない件は、以下に示すように代わりに -Mopen=:encoding(cp932) を指定すればよいようである。これを指定すれば、STDIN, STDOUT だけでなく、すべての入出力のデフォルトエンコーディングが cp932 に変更される。

> perl -i.bak -MEncode -Mopen=:encoding(cp932) -pe "s/@/@/g" foo.html

 -Mopen=:encoding(cp932) の指定はソースコード中では、use open ':encoding(c932)'; となるわけだが、use open ':encoding(c932)';use encoding 'cp932'; を同時に指定する時には順番に注意する必要があるようだ。use open を先に指定すれば問題ないのだが、use encoding を先に指定してしまうと、use open が無効になってしまった。

 spam 対策のため、すべての html ファイルのメールアドレス部分を、数値実体参照や URL エンコードを使って、メールアドレスとは判別しにくいように書き換えた。少しでも spam やウィルスが減ってくれると良いのだが。

 Cygwin/X をいろいろといじくり回している。
 Cygwin で startx を実行したときに立ち上がる xterm は、文字の色が黒地に黄色になっているのだが、以前から気に入らなかった。調べてみると、/etc/X11/xinit/xinitrc に設定が書かれていた。-fg yellow となっている部分を -fg white に直したところ、文字色が白になった。(後で気付いたが、-fg white -bg black は、単に -rv としても同じことだ。)
 X サーバとして Cygwin/X を起動し、Cygwin 用の ssh を使って X をポートフォワードして、リモートマシンの X アプリを起動しようとしたのだが、一部のアプリが

  X Error of failed request:  BadAtom (invalid Atom parameter)
  Major opcode of failed request:  20 (X_GetProperty)
  Atom id in failed request:  0xee
  Serial number of failed request:  10
  Current serial number in output stream:  10

というメッセージを表示して起動できなかった。Cygwin + ssh の代わりに、PuTTY日本語版)を使った場合は問題なく起動できる。別のマシンでどうなるか試してみると、ssh 経由では同じメッセージが出て起動できなかったが、PuTTY 経由では FATAL ERROR という別のメッセージが出て起動できなかった。
 ssh 経由の方法に関しては、後でエラーメッセージでググってみたところ、すぐに解決方法が見つかった。ssh -X ではなく、ssh -Y (Enables trusted X11 forwarding) でポートフォワードすれば良いとのこと。確かにこれで起動できるようになった。PuTTY 経由でも起動できなかったマシンは、単に色数の設定の問題だった。16bit カラーから 32bit カラーに設定を変更したところ起動できるようになった。
 8bit Pseudo-color でなければ起動しない X アプリがあるのだが、Cygwin/X で動かすことは可能なのだろうか。以前 Cygwin/X は色数の指定ができないということを聞いたことがあったが、試しに xinit -- -bpp 8 として実行してみたところ、-bpp というオプションは理解できないとのエラーが表示された。やはり無理なのだろうか。

2004/07/19

 Perl 5.8.4 の Encode の挙動が不審だ。
 メールアドレスをロボットなどに収集されにくくしようと思い、html ファイルの中の @ を @ に置換しようと思った。しかし、@ は Shift_JIS (cp932) の 2バイト目にも含まれる文字なので単純に置換してしまうと文字化けが起こる。そのため Perl でこの文字を置換するにはちょっとした注意が必要である。そこで、コマンドラインから以下のようにして実行してみた。

> perl -MEncode -Mencoding=cp932 -pe "s/@/&#64;/g" < foo.html > foo2.html

これで foo.html の中の @ を &#64; に置換したものが foo2.html に出力される。もちろん文字化けは発生しない。ちなみにこれは、以下の内容のスクリプトを実行したものと同じである。

use Encode;
use encoding "cp932";

while (<>) {
    s/@/&#64;/g;
    print;
}

つぎに、-i オプションを使って、自動的にバックファイルを作るようにしてみた。

> perl -i.bak -MEncode -Mencoding=cp932 -pe "s/@/&#64;/g" foo.html

こうすると、foo.html の中の @ が &#64; に置換され、変更前のファイルは foo.html.bak という名前で保存されるはずである。しかし、foo.html を見てみると、Shift_JIS の 2バイト目の @ が &#64; に置換されていて、さらに一部の行が UTF-8 で出力されていた。
 この動作が、仕様かバグかは分からないが、普通に考えたらバグだろう。なお、Perl のドキュメントには、use encoding でエンコーディングを指定すると、STDIN, STDOUT はそのエンコーディングを使うようになるが、それ以外のファイルハンドルは影響を受けず open などで明示する必要があると書かれている。

2004/07/18

 Firefox を 0.9 から 0.9.2 にバージョンアップしたら、bsscroll が使えなくなってしまった。慌てて Firefox に対応させることにした。Firefox 用の拡張では install.rdf というファイルを準備する必要がある。install.rdf には、2か所ばかり ID というものを書く部分がある。1つは、すべての拡張に共通の ID (Firefox 自体の ID?)で、もう 1つは各拡張に固有の値となるようである。今回 ID は VC++ に付属の UUIDGEN を使って生成した。

 Jcode.pm で検索したら、Jcode.pmをWindows 2000でコンパイルするというページを見つけた。せっかくなら PPM 形式で公開してくれると良いと思うのだが。

 XML::RSS 1.04 のバージョン表記が 1.03 になってるな。なんでだろ。

2004/07/17

 cm_rss を使ってみた。EUC-JP の RSS を読み込ませてみたら、このエンコーディングには対応していないとのエラーが出た。エンコーディングを定義しているファイルは C:\Perl\site\lib\XML\Parser\Encodings\ にある。x-euc-jp-jisx0221.enc, x-euc-jp-unicode.enc のどちらかを euc-jp.enc という名前でコピーして、バイナリエディタでファイルの先頭部分にあるエンコーディング名を EUC-JP に書き換えると、とりあえずは EUC-JP を認識するようである。しかし、目的のサイトの RSS を読み込ませたところ、RSS のバージョンが認識できないとのエラーが出た。そのサイトの RSS の記述に問題があるようだ。
 次に、別のサイトの UTF-8 の RSS を読み込ませてみたら文字化けが発生した。Jcode.pm の文字コードの判別がうまくいっていないようである。ソースコードを書き換えて、入力文字コードを明示してやれば良さそうだが・・・。

2004/07/16

 INCM の RSS 用プラグイン (cm_rss) を試してみようと思った。cm_rss を動かすには ActivePerl 5.6 といくつかの追加モジュールが必要だと書いてあるが、これを ActivePerl 5.8 で動かせないか試してみた。HTML-Format と XML-RSS は、5.8 だと PPM でインストールすることはできないようなので、CPAN からモジュールをダウンロードしてきた。ppd ファイルを生成して PPM でインストールしようとしたところ、依存関係でトラブルが発生した。ppd ファイルを修正したところ無事インストールできるようになった。具体的には、HTML-Format は HTML-Element に依存していると書かれていたのだが、HTML-Element は HTML-Tree に含まれている。また、XML-RSS は、Test-More に依存していると書かれていたのだが、これは Test-Simple に含まれている。
 cm_rss には、Jcode.pm も必要である。Windows を使っている場合には、同梱の win_install.pl を実行すれば、一応インストールすることは可能なのだが動作が遅い。VC++ を使って XS モジュールをコンパイルすれば高速になるので、そのようにしてみた。Jcode.pm についても、PPM でインストールできるようにしてみようとしたが、こちらも依存関係で問題が発生した。MIME-Base64 に依存していると書かれていたのだが、ActivePerl 5.8 には最初からインストールされているので、その記述を削除したところインストールできるようになった。
 今回もこれらのモジュールを公開しておく。コマンドラインに以下のように入力すればインストールできる。

> ppm install http://homepage3.nifty.com/k-takata/perl/HTML-Format-2.04-5.8.x.ppd
> ppm install http://homepage3.nifty.com/k-takata/perl/XML-RSS-1.04-5.8.x.ppd
> ppm install http://homepage3.nifty.com/k-takata/perl/Jcode-0.86-5.8.x.ppd

(2004/07/27 追記: Jcode のバージョンアップに伴い、Jcode-0.86-5.8.x.ppd は Jcode-0.87-5.8.x.ppd に変更。)

2004/07/11

 どういう訳か、ビデオキャプチャボードを挿した ST6E の時計が半日以上狂っていた。そのせいで予約録画に失敗した。Win2k の net time /setsntp:ntpservers コマンドと Windows Time サービスを使って、自動的に時刻を校正するようにしてあったはずなのだが・・・。代わりに SNTP クライアントとして TClock Light を使ってみることにした。なかなかいい感じだ。

2004/07/10

 CF-R2C (WinXP) で無線 LAN の接続がよく切れるのが気になっていた。ググって見たところ、ワイヤレスネットワーク接続のプロパティから辿っていって「このネットワークで IEEE 802.1X を有効にする」のチェックを外せばよいということが分かった。早速試してみたところ、接続が切れないようになった。

 c:\tmp に UIDbgMon.out という見慣れないファイルがあった。削除しようとしたら、別のアプリが開いているので削除できないと言われた。しかしどのアプリが開いているのかが分からない。OS を再起動したら削除できたが、しばらく使っているうちにまた同じファイルが生成されていた。念のためウィルスチェックを掛けてみたがウィルスは検出されなかった。このファイル名でググってみたら1件しか引っかからなかった。もう一度再起動したところ、今度は生成されていない。謎だ。

 Unicode::Japanese モジュールをコンパイルして PPM 形式にしてみた。ActivePerl 5.8.x をインストールした状態で、コマンドラインから、

> ppm install http://homepage3.nifty.com/k-takata/perl/Unicode-Japanese-0.18-5.8.x.ppd

と入力すればインストールできる。

2004/07/05

 ActivePerl 5.8.4 build 810 をインストール。MSI 版を使って旧バージョンに上書きインストールしてみたところ、以前と同じように「アプリケーションの追加と削除」の一覧に現バージョンと旧バージョンの両方が表示された。やはり、旧バージョンをアンインストールしてから新バージョンをインストールした方が良いようだ。(ZIP 版だとそのまま上書きしてしまえば良いのかもしれないが。)
 Perl のバージョンアップのついでに cm_@nifty-FORUM-perl.pl を動かすための暗号処理モジュール (Crypt::SSLeay) も入れ直すことにした。まず http://www.openssl.org/ から openssl-0.9.7d.tar.gz を DL し、http://www.ring.gr.jp/archives/lang/perl/CPAN/modules/by-module/Net/ から Crypt-SSLeay-0.51.tar.gz を DL する。
 OpenSSL のコンパイルとインストールは以下のように行う。コンパイラとアセンブラには、VC++ 6.0 と MASM 6.15 を用いた。インストール先は、Crypt::SSLeay のデフォルト設定に合わせるため、c:\openssl にした。また、ここではスタティックリンクライブラリを作成するようにしている。(コンパイル方法に関する詳細は、INSTALL.W32 に書かれている。)

> perl Configure VC-WIN32
> ms\do_masm
> nmake -f ms\nt.mak
> md c:\openssl
> md c:\openssl\include
> md c:\openssl\include\openssl
> copy inc32\*.h c:\openssl\include\openssl
> md c:\openssl\lib
> copy out32\*.lib c:\openssl\lib

 Crypt::SSLeay のコンパイルとインストールは以下のように行う。

> perl Makefile.PL
> nmake
> nmake install

 なお、VC を持っていないが、ActivePerl 5.8.x に Crypt::SSLeay をインストールしたいという場合には、コマンドラインから、

> ppm install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd

と入力すれば良いらしい。こちらは、OpenSSL をダイナミックリンクしているようだ。(参照 : Perlモジュール/LWP

 自分で Crypt::SSLeay の PPM パッケージを作ってみた。意外と簡単だった。Crypt::SSLeay のソースディレクトリで、

> nmake ppd
> tar cvzf Crypt-SSLeay.tar.gz blib

とすると、パッケージの説明が書かれた Crypt-SSLeay.ppd と、パッケージ本体である Crypt-SSLeay.tar.gz が生成される。あとは Crypt-SSLeay.tar.gz が置いてある URL を Crypt-SSLeay.ppd に書き込めばよい。これらの作業を行ったものをアップロードしておいたので、

> ppm install http://homepage3.nifty.com/k-takata/perl/Crypt-SSLeay-0.51-5.8.x.ppd

と入力すればインストールできる。(2004/07/10: 上記の URL を変更) アンインストールは、

> ppm remove Crypt-SSLeay

とすればよい。上記の物とは違い、OpenSSL をスタティックリンクしているので、サイズは大きいが、インストールは楽である。

2004/07/04

 Mozilla メーラーの操作性を改善するためのパッチを、エクステンションに変更してみた。XUL ファイルが大量にあって、どの XUL ファイルをオーバレイするべきなのかなかなか分からなかった。

2004/07/03

 Mozilla 1.7 で 2ch が見れなくなったのは、セキュリティー上の問題による仕様変更が原因だったらしい。Multiple Browsers Frame Injection Vulnerability Test で確認できる。"docshell.frameloadcheck.disabled" は true にはしない方が安全なようだ。なお、Firefox は 0.9 で既にこの問題は修正済みだそうで、true にしても大丈夫らしい。Nightly ではまた仕様が変更されているそうだが。

 最近自宅のテレビの写りがおかしい。電波状態が悪いのかと思っていたが、どうも違ったようだ。アパートにケーブルテレビが引かれることになり工事が行われたのだが、工事後もやっぱり写りがおかしかった。業者にはテレビの問題だと言われた。テレビだけでなく、ビデオの調子も最近おかしかったので、思い切ってビデオキャプチャボードを買おうと思った。PC-MV5DX/PCI(限定特価品)を \13,499 で購入。ハードウェアエンコードでこの値段はかなり安い部類だろう。結構きれいに写っている。

2004/07/02

 BackSpace で逆スクロールができるようにする XPI ができた。JavaScript では、ある関数を別の関数に差し替えることが簡単にできてしまうのがおもしろい。

2004/07/01

 先月の spam メールの集計結果。着信拒否になった spam が少なくとも 3592通。着信拒否にならなかった spam が 584通。そのうち Spam Mail Killer で削除できた spam は 555通(95.0%)。SMK で削除できなかった spam が先月以上に多かった。Mozilla メールの Junk Mail Controls の精度も相変わらず良くない。困ったことだ。

 ダウンロードマネージャを Ctrl+W で閉じれるようにするためのパッチを XPI 形式に変更した。XUL も XPI もほとんど理解していないので結構苦労した。これで Mozilla のバージョンアップがあっても、XPI をインストールするだけで Ctrl+W が使えるようになるはず。BackSpace で逆スクロールができるようにするパッチや、Space で未読を読み進めるためのパッチも XPI 化したいところである。


Copyright (C) 2004 K.Takata