select method のサーバ名を省略する

Gnus の select method の指定は

(setq gnus-select-method
      '(nnimap "imapサーバ"
	       (nnimap-authenticator cram-md5)))
(setq gnus-secondary-select-methods
      '((nntp "newsサーバ")))

こんな風に、ずっとサーバ名を指定して使っていた。

が、つい先日 info を読んでいて、「サーバ名は省略できる」ということに今更ながら気付いた。つまり、

(setq gnus-select-method
      '(nnimap ""
	       (nnimap-address "imapサーバ")
	       (nnimap-authenticator cram-md5)))
(setq gnus-secondary-select-methods
      '((nntp ""
	      (nntp-address "newsサーバ"))))

こうやってもいい、と。

こうするとなにが嬉しいかというと、secondary に属するグループ名が短かくなる。今までは "nntp+サーバ名:グループ名" だったのが "nntp:グループ名" になる。ちょっとしたことだが、グループバッファの表示はスッキリするし、j (gnus-group-jump-to-group) でアクセスする時など、いろいろと楽になる。

やり方は、

  1. Gnus を終了する
  2. ~/.gnus の select method の指定を変更する
  3. ~/.gnus 内の各種設定で "nntp+サーバ名" と指定している個所を変更する
  4. ~/.newsrc.eld の "nntp+サーバ名" を "nntp:" に変更する
  5. (必要があれば) ~/.gnus-registry.eld の内容や ~/News/*.SCORE のファイル名も変更する
  6. (agent 支配下にしているならば) ~/News/agent/method名/サーバ名 を ~/News/agent/method名/unnamed に rename する
  7. (agent 支配下にしているならば) ~/News/agent/lib/servers の内容を変更する

こんな感じでしょうか。(各種ファイルのバックアップは取っておきましょう)


ところで、

(setq gnus-secondary-select-methods
      '((nntp ""
	      (nntp-address "newsサーバ1"))
	(nntp ""
	      (nntp-address "newsサーバ2"))))

こういう場合はどちらかはサーバ名を指定してやらないとマズそうな気がしないでもないのだけど、面倒なので試してはいない。

実際のところどうなんだろう…。

auto-save で文字コードが変わったら警告を出す

auto-save-buffers 関連のお話。

ここに書いた現象には自分が認識していたよりも頻繁に遭遇していたようで、対策してから結構な回数助けられました。慣れってコワいね。もっと早くにやっときゃよかった。

ただ、僕が思うに auto-save がもたらす最凶の被害は

  • 知らないうちに意図しない文字コードで保存されている

これだと思ってます。めったに起こらないけど。バッファを消す前にモードラインの表示を見て気付けば `C-x RET f' で正しい文字コードを指定してやれば済むんですが、そんなことは稀な訳で。んで、再度ファイルを開いてみたら日本語が化け化けで「あわわわわ」といったことになる。

化け方から想像して `C-x RET c' で復旧を試みるんですが、運が悪かったり(日頃の行ないか?)勘が冴えてなかったり(そういう問題か?)するとどうにも復旧できなかったり。泣く泣くバックアップやリポジトリから書き戻すことになって激しい虚脱感に襲われます。

これじゃいかん。

そこで「保存した際に文字コードが以前と変わっていたら(auto-save を切りつつ)警告を出す」というのをやってみました。以前どっか(bookshelf さんあたり?)で見掛けた気がするんですが見つかんなかったので自前で。

--- auto-save-buffers.el	06  7月 2005 09:31:17 +0900	1.1
+++ auto-save-buffers.el	12  4月 2006 22:34:56 +0900	
@@ -24,7 +24,7 @@
 (defun auto-save-buffers ()
   "Save buffers if `buffer-file-name' matches `auto-save-buffers-regexp'."
   (let ((buffers (buffer-list))
-	buffer)
+	buffer orig-coding-system)
     (unwind-protect
 	(save-excursion
 	  (fset 'write-region 'auto-save-buffers-write-region)
@@ -39,9 +39,14 @@
 					  buffer-file-name))
 		       (string-match auto-save-buffers-regexp buffer-file-name)
 		       (file-writable-p buffer-file-name))
+	      (setq orig-coding-system buffer-file-coding-system)
 	      (basic-save-buffer)
 	      (set-visited-file-modtime)
-	      (set-buffer-modified-p nil))
+	      (set-buffer-modified-p nil)
+	      (unless (eq buffer-file-coding-system orig-coding-system)
+		(auto-save-buffers-toggle t)
+		(lwarn 'auto-save :warning
+		       "Coding system changed: %s" buffer-file-name)))
 	    (setq buffers (cdr buffers))))
       (fset 'write-region (symbol-function 'original-write-region)))))

us-ascii のみのファイルに日本語を書き込んだ時も警告が出ちゃうので欝陶しいといえば欝陶しいかなあ…。常用している文字コードだったら警告を出さないとか工夫の余地はあるかも。まぁとりあえずこれで生活してみようかな。

Jinnavi (人狼BBS Navigator for Emacs)

以下、以前の記事より引用

ところで Windows 環境だと専用ブラウザがいろいろあるようなんですが、Unix 系だと存在しなかったりします? GinroBrowser という GTK ベースのカッコイイやつは見つけたんですが、残念ながら閲覧だけで発言はできないようです。

という訳でボチボチ作ってみたりしています。w3m でのダンプ結果をえっちらおっちらパーズするっていうかなりアレな作りですけど。他の環境でも動くんだろうか。でも html パーズはやりたくないんだよねえ…。

こんな感じ

いまんとこ閲覧系はほぼ完成。送信系は発言と投票が出来るとこまで。ゲームへのエントリも出来るはずだけど、さすがにここから先は試してみないと判んない。んで一旦試しだす(=ゲームに参加する)と作ってる暇なんてないし、おまけに異常に時間(+体力)を消耗するっつージレンマ…。「人狼」とか「能力者」の特殊コマンドがどんなデータ送ってるかもその役に当たんないと判んないし。想像はつくんだけど。

って訳で一人でやってると完成までの道程はかなり長そう(苦笑)。フィールドテストをやってやるゼって狂人^H^H物好きな方の登場を期待してここいらに転がしておきます。→ Jinnavi (人狼BBS Navigator for Emacs)


送信データは他の専用ブラウザのソース漁るのが早いか? ってかあれってソース公開されてんのかなあ。

人狼BBS の RSS にキャラ画像を表示させる

友人から「人狼BBS」なる Web ゲームを教えてもらいました。結構以前から一部の人の間では流行っていたそうで。ルールを読んでみるとたしかに面白そうなのでちょっとやってみました。うん、面白いかも。なんか激しく消耗しますけど。時間とかいろいろ。慣れてないせいもあるんだろうな。

さて、いざゲームに参加すると他のプレイヤーの発言をチェックしないといけない訳ですが、今風に RSS が提供されていて最新の15メッセージをこれでチェックすることができます。私は Gnus の nnrss で講読していたんですが初体験ということもあり、情けないことにキャラの顔と名前が一致しない…。

そこでまた下らないものを作ってみました。gnus-jinroicon.el 人狼BBSRSS を Gnus で読む際にヘッダにキャラ画像を表示します。

いや、下らないんですけど慣れないうちは思いのほか便利なんですよ。まぁ gnus-muaicon.el をちょろっと改造したら出来たってのが一番の理由ですけど。そんなことやりながらプレイしてたら発言が少なくなって疑われまくり…。


ところで Windows 環境だと専用ブラウザがいろいろあるようなんですが、Unix 系だと存在しなかったりします? GinroBrowser という GTK ベースのカッコイイやつは見つけたんですが、残念ながら閲覧だけで発言はできないようです。みんなどうやってプレイしてるんだろう…。

yaskkserv を入れて server-completion してみる

最近ようやく三田さんの事例 (skk 5819, skk 5820 あたり) を参考に富豪的辞書サーバ環境を構築してみた。いろいろ引っ掛かったりしたのでそのあたりの話とか使用感は後日まとめてみたいな。

といった訳で、現在は rskkserv を使って skkserv2 + mecab-skkserv を串刺し、regex-skkserv はちょっと面倒なので未インストールといった状態。今回はここから更に server-completion をやってみる話。skk 5820 によると rskkserv のモジュールは現状では server-completion には対応していないらしい。むーん、残念。という訳で Emacs 側で小細工してみる。

ともかくサーバがないことには始まらない。server-completion に対応している辞書サーバは regex-skkserv と yaskkserv があるようだ。regex-skkserv は前述のようにインストールがちょっと面倒っぽいので yaskkserv を入れてみることに。フムフム、普通に ./configure make するだけね…

build unit_test_benchmark.cpp
(中略)
In file included from unit_test_benchmark.cpp:8:
./source/skk/skk_dictionary.hpp:811: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
For Debian GNU/Linux specific bug reporting instructions, see
<URL:file:///usr/share/doc/gcc-3.3/README.Bugs>.
make[2]: *** [unit_test_benchmark.o] Error 1
make[1]: *** [all] Error 2
make: *** [all] エラー 2

orz これ、結論から言うと、以下公式ページより引用

gcc-3.3 系 + メモリが少ない機械ではコンパイラのバグを踏んでビルドに失敗することがあります。(gcc-4 系では問題ありません。)

ということのようです。いやー上記注意書きを見付けるのが遅れて初っ端から結構ハマりました。これさえ回避すればあとはなんの問題もなくインストール完了。

[追記:2006-03-23] 上記注意書きが公式ページの上の方に移動していますね。まさかここを読まれた訳ではないんでしょうけど、これでハマる人が少なくなるといいですね。あらためて作者さんに感謝。ちなみに私んとこではメモリ 96M でビルド失敗、320M で成功といった感じでした。

ポートは 1178〜1180 を富豪辞書達が占有しているので 1182 で yaskkserv を動かしといて、netcat で動作確認。

% netcat localhost 1182
4まちだ 
1/まちだ/まちだえき/まちだおだきゅう/まちだかいどう/まちだかん/まちだがくえん/まちだし/まちだしみん/まちだてん/まちだほうめん/

こんな返事が来ればオッケーです。"4まちだ" の後に半角 SPC を入れるのを忘れないように。

さて、残る Emacs 側の設定方法は、skk-server-completion.el の Commentary に書いてあるのをそのまま丸写し。それに加えて、

(defadvice skk-server-completion-search-midasi
  (around substitute-server-connection-to-yaskkserv activate compile)
  (let* ((server skk-server-host)
	 (port 1182)
	 (skkserv-working-buffer (get-buffer-create " *skk-server-completion*"))
	 (proc (get-buffer-process skkserv-working-buffer))
	 (skkserv-process (or (and (skk-server-live-p proc) proc)
			      (open-network-stream "skk-server-completion"
						   skkserv-working-buffer
						   server port))))
    (set-process-query-on-exit-flag skkserv-process nil)
    ad-do-it))

こんなかんじの advice で server-completion の時だけ yaskkserv に接続することが出来ました。


これで server としては rskkserv, skkserv2, mecab-skkserv, yaskkserv の辞書サーバ群に加えて個人ユーズの bskk が上がっている環境となった。いずれは regex-skkserv もインストールしてみる予定なんだけど、いやーまさに富豪的ですな。なんだか書く文章の内容までレベルアップしたような。気のせいですねハイ。

98note をシリアルコンソールに仕立てる

ウチのサーバマシンにはモニタを継いでないので、ちょっと様子を見たい時にはデスクトップマシンを起動して ssh で入るか、モニタを継ぎ換えるしかなくて結構面倒。ちょうど HDD が壊れて退役した 98note (PC-9821Nd2) が手元にあるのでシリアルコンソールとして復活させてみた。

サーバ側の設定

Debian の /etc/inittab にはデフォルトで ttyS0 のエントリが準備されているようなので、そのコメントを外し

T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100

telinit q してシリアル用の getty を上げる。また、ブート時からシリアル経由で操作できるように /boot/grub/menu.lst に

serial
terminal --timeout=10 serial console

を追加。カーネルパラメータにも console=tty0 console=ttyS0 を加えておく。

ターミナルエミュレータを用意する

MS-DOS があればそれプラス hterm が定番なのかな? 「ディスク一枚作りゃいいだけやん」と安易に考えていたけど、今回ここが一番難儀した。

  • 買い置きしてた FD が古くて結構ダメになってる
  • Windows が入ってる PC98 の FDD が壊れてた
  • バックアップに取ってた MS-DOS のディスクが壊れかけ

とにかく安心してフロッピーディスクを読み書きできる環境を探すのに一苦労。対象が PC98 だってのも拍車を掛けた。どうにかこうにか DOS のシステムディスクを作るとこまでこぎつけたが、hterm のインストーラ (DOS のバッチファイル) を動かす環境がない*1。仕方ないんでバッチファイルが何やってるかを読む。ぐはー、もう全然ワカンネー。結局のところ

  • ヘルプファイル bin/jhterm.db (英語版なら ahterm.db) を hterm.db としてコピー
  • bin/hterm.98 (AT 互換機なら hterm.pc、J3100 なら以下略) を hterm.exe としてコピー
  • PC98 の場合は bin/hkey{,set}.98 を hkey{,set}.exe としてコピー
  • bin/a14k14.hft をコピー

してやればよいようです。AT 互換機なら hemacs という emacs like なエディタもコピーされるみたい。疲れた…。

継ぐ

あとは、両機をクロスケーブルで継いどいて 98note を FD 起動。hterm と叩いて (autoexec.bat を用意しとくのが DOS 流ですね) 無事 login: プロンプトが出てくれば成功。PC98 版の場合 STOP キーで hterm の終了、COPY キー で hterm の設定ができます。とりあえず文字コードだけ EUC に変更してやればあとはデフォルトのまま使えるんではなかろうか。


最終的に試したらボーレートは 19,200 までいけたので

/etc/inittab

T0:23:respawn:/sbin/getty -L ttyS0 19200 vt100

/boot/grub/menu.lst

serial --speed=19200
terminal --timeout=10 serial console

同ファイルのカーネルパラメータ

console=tty0 console=ttyS0,19200n8

に修正。まぁそれでも表示は遅いんだけど、メンテ用途なら充分使える。

*1:今気付いたが Windows マシンで一旦 HDD にインストールして、それを FD に書き込みゃよかったのか… orz