2004年1月12日月曜日

Debian GNU/Linux, kernel 2.2.x と 2.4.x とを共存させる

新カーネル導入設定と旧カーネルとの同居

今だに、Debian GNU/Linux では、カーネルの安定版としてバージョン2.2.x系を採用している。 (2003年7月現在) しかし、他の多くのLinuxディストリビューションでは2.4.x系が主流となっている。 各種USBデバイスを繋げられること、ALSAの新しいバージョン(ver.0.9)が使えるようになることなど、2.2.xから2.4.xへのアップグレード利点も多い。 そこで、 旧カーネル2.2.17も生かしつつ、新カーネル2.4.20を試していく ことにする。 旧カーネルと新カーネルはそれぞれ起動し分けることができるよう、LILOの設定も行いたいと思う。

Debianといえば、apt。 カーネルのソースも apt-get コマンドで持ってくるのだ。
root になってから以下のようにカーネルソースを頂戴してくる。

$ su -
Password:
# apt-get install kernel-source-2.4.20
すると /usr/src/kernel-source-2.4.20.tar.bz2 が置かれるので、これを展開してやることとする。 展開された kernel のソースは /usr/src/kernel-source-2.4.20 以下に置かれる。
そうしたら、例のごとく(?)カーネルの設定をグラフィカルなインタフェースで行なうため、make xconfig する。
# cd /usr/src/kernel-source-2.4.20
# make xconfig
下に、2.2.17 のときの xconfig の画像とそのときの設定項目、2.4.20 のときの xconfig の画像とそのときの設定項目を並べた。 設定の可能な項目がいろいろと増えたのが視覚的にも比べられる。
2.2.17のとき
2.2.17 での xconfig の様子
そのときの設定可能項目
  Code maturity level options
  processor type and features
  Loadable module support
  General setup
  Plug and Play support
  Block dvices
  Networking options
  Telephony Support
  SCSI support

  I2O device support
  Network device support
  Amateur Radio support
  IrDA (infrared) support
  ISDN subsystem
  Old CD-ROM drivers (not SCSI, not IDE)
  Character devices
  USB support
  Filesystems

  Console drivers
  Sound
  Kernel hacking
2.4.20 のとき
2.4.20 での xconfig の様子
そのときの設定可能項目
  Code maturity level options
  Loadable module support
  Processor type and features
  General setup
  Memory Technology Devices(MTD)
  Parallel port support
  Plug and Play configuration
  Block devices
  Multi-devie support (RAID and LVM)
  Networking options
  Telephony Support
  ATA/IDE/MFM/RLL support

  SCSI support
  Fusion MPT device support
  IEEE 1394 (FireWire) support (EXPERIMENTAL)
  I2O device support
  Network device support
  Amateur Radio support
  IrDA (infrared) support
  ISDN subsystem
  Old CD-ROM drivers (not SCSI, not IDE)
  Input core support
  Character devices
  Multimedia devices

  File systems
  Console drivers
  Sound
  USB support
  Bluetooth support
  Kernel hacking
  Library routines

カーネルの設定。 いっぺんにいろいろ設定するのは危険なので、必要最低限の設定だけにしておく。

カニさんチップの載った愛用のイーサネットカードを使うための設定。
Network device support → Ethernet(10 or 100 Mbit) → Realtek RTL-8139 PCI Fast Ethernet Adapter support を n から m へ。
こいつのモジュール名は、helpを表示させて確認した。 どうやら今度からは 8139too.o という名前になるらしい。

いろいろなファイルシステムを扱いたかったので、その辺の設定。
File systems → Ext3 journalling file system support を n から y へ
File systems → DOS FAT fs support を n から y へ
File systems → MSDOS fs support を n から y へ
File systems → VFAT(windows-95) fs support を n から y へ
File systems → Native Language Support → Japanese charsets(shift-jis, Euc-jp) を n から y へ


設定が終わったら保存して終了。

カーネルをコンパイル。(構築)

# pwd
/usr/src/kernel-source-2.4.20
# make-kpkg kernel_image
# cd /usr/src
# dpkg -i kernel-image-2.4.20_Custom.1.0_i386.deb
このあと、リブートを経て、晴れて新しいカーネルから起動する。
ここで、eth0 が消えていたので、新しいカーネルにネットワークカードを認識させる。
モジュール8139tooをinsmodし、ifconfigでIPアドレスを振った。 そしてルーティングの設定をrouteでしてあげれば、内ネットワーク、外ネットワークをちゃんと区別できるようになった。
具体的には以下のようなコマンドで解決した。
# insmod 8139too
# ifconfig eth0 192.168.0.4 netmask 255.255.255.0
# ifconfig eth0 up
# route -add -net 0.0.0.0 netmask 0.0.0.0 dev eth0 gw 192.168.0.1
見ての通り別段複雑なルーティングテーブルじゃあるまいに、内のネットワークにあるホスト、外のネットワークにあるホストそれぞれに ping を打って、ちゃんと返事が帰ってくればオッケーでしょう。
なお、今後は起動時に自動的に eth0 を認識してもらうため、 /etc/modules に 8139too を書き加えておいた。

まだまだやることはいっぱいだ(1) 「カーネルを起動し分ける」
LILOを使って、次の4つを起動し分けるようにしたい。

  1. 新しく構築したばっかりの最新の2.4.20カーネル
  2. そのいっこ前の2.4.20カーネル
  3. もう使わないかもしれないけど、いちおう2.2.17カーネル
  4. Windows98
まずは、
/boot/vmlinuz-2.4.20 を /boot/old.vmlinuz-2.4.20 にコピー。
そうしたら次のようなシンボリックリンクをはる。
/vmlinuz        →  /boot/vmlinuz-2.4.20
/vmlinuz.2.2.17 →  /boot/vmlinuz-2.2.17
/vmlinuz.old    →  /boot/old.vmlinuz-2.4.20
今後カーネルを再設定し、構築したものは /boot/vmlinuz-2.4.20 に上書きされるので、古い /boot/old.vmlinuz-2.4.20 も生かしておけるようになる。

次にこの3つのカーネルとwin98とを選んでブートできるように /etc/lilo.conf を書く。 /etc/lilo.conf の骨子は以下の通りだ。
lba32
boot=/dev/hda
# boot=/dev/fd0  ### installing LILO in a floppy
root=/dev/hda1
install=/boot/boot.b
map=/boot/map
delay=20
vga=normal

default=Linux

image=/vmlinuz
        label=Linux
        read-only

image=/vmlinuz.old
        label=LinuxOLD
        read-only
        optional

image=/vmlinuz.2.2.17
        label=Linux2.2.17
        read-only
        optional

other=/dev/hda3
        label=win
        table=/dev/hda
LILOでの起動プロンプトで Linux, LinuxOLD, Linux2.2.17, win の4つのラベルからそれぞれ 新2.4.20カーネル、旧2.4.20カーネル、2.2.17カーネル、Windows98 の4種の起動方法が選べるようになる。
なお、上記の boot=/dev/hda をコメントアウトし、 boot=/dev/fd0 のコメントをとり有効にしてから root で /sbin/lilo を実行すると、LILOをフロッピーディスクにインストールできる。 起動ディスク用にLILOディスクが一枚あると便利である。
そのまま書き換えずに root で /sbin/lilo を実行するとハードディスクの MBR に LILO が書き込まれる。
MBRとフロッピーにLILOを 書き込んだらリブート。 Shiftキーを押しながらブートすれば、3つのカーネルと1つの別の OS どれを起動するか選べるようになった。

まだまだやることはいっぱいだ(2) 「コンパクトフラッシュカード R/Wを使う」
コンパクトフラッシュカードリーダ(以下CFと表記するかも)の読み書きのできる REX-CF03F という製品を使うため、カーネル 2.4.x を再構築する。
USB CF R/W と USBプリンタ を利用できるにいたるまでの設定は ここここ で、もうすでに済ませてある。 今回行うのはカーネルレベルで USBデバイスを扱うための設定となる。
まずはこの製品の紹介webサイトに置いてあるパッチを手に入れ、これをあてる。 パッチは /usr/src/kernel-source-2.4.20/drivers/usb/storage ディレクトリに入っている transport.c と unusual_devs.h の2つのファイルにあてる。
~user/lib にメーカのwebサイトから手に入れたパッチを展開し、
root になってから以下のようにパッチを当てた。 もちろんパッチの当て方はパッチに同梱の説明書に詳しく書いてあるので、 実際にやる人はそちらをよく読むべきだと思う。

# cd /usr/src/kernel-source-2.4.20/drivers/usb/storage
# patch -p1 < ~user/lib/cf03/patch/redhat7-1/transport.patch
# patch -p1 < ~user/lib/cf03/patch/redhat7-1/unusual_devs.patch

次にカーネルのコンフィグを行う。 /usr/src/kernel-source-2.4.20 にカレントディレクトリを移し、例によって # make xconfig で設定をする。
  • USB Support → Support for USB を y から m にする
    (モジュール名は usbcore.o)
  • USB Support → UHCI Alternate Driver (JE) Support が m になっているか確認する
    (モジュール名は uhci.o、 2.2.17カーネルのときとは違う名前になったので注意か
  • USB Support → USB Mass Storage Support が m になっているか確認する
    (モジュール名は usb-storage.o)
  • USB Support → USB Printer support を n から m にする
    (モジュール名は printer.o)
同梱の説明書には
Code maturity level options → Prompt for development and/or incomplete code/drivers
も有効にせよとあるが、有効にしなくても現に動いているので筆者はこれを無視した。
それと、上記にわかるとおり、CF R/Wの設定といっしょに usb プリンターの設定もこっそりと行っている。

旧バージョンのカーネル用のモジュールの名残がまだ詰まっている /usr/src/modules を /usr/src/modules2.2.17 と名前を変えてから、カーネルを再構築、そして、リブートを行う。
リブート後からは root権限で # depmod -av の後に、uhci, usb-storage, printer を modprobe してやれば、CF R/W も usb プリンターも利用できるようになった。

まだまだやることはいっぱいだ(3) 「音楽演奏」
これは手短に紹介。
alsaのソースを apt で頂いてくる。

# apt-get install alsa-source
するとここで debconf 設定の画面となる。 ここで isapnp 、 デバッグ用メッセージ、サウンドカードに載っているチップにあうドライバ(筆者のものでは sb8 (Sound Braster Pro用)) まで対話的に選択していける。 つぎに /usr/src/alsa-driver.tar.gz を展開する。
# cd /usr/src
# tar xvzf alsa-driver.tar.gz
そうしたら /usr/src/kernel-source-2.4.20 へ行き、
# cd /usr/src/kernel-source-2.4.20
# make-kpkg modules_image
そして /usr/src にできている alsa-modules の debパッケージをインストール。 その後、alsaconf で設定を行った。
# cd ..
# dpkg -i alsa-modules-2.4.20_0.9.2-7+Custom.1.0_i386.deb
# alsaconf
以上で終わり。 音楽演奏も可能となった。
以前使っていたバージョン0.4の alsa で演奏をさせると、マクロメディアフラッシュ等で画像の再生に演奏が追い付かなかった。 だがこのバージョン0.9 ではその問題はかなり解消された。 よかったよかった。

Debian GNU/Linux, woody から sarge へのアップグレード

Debian安定版からテスト版への移行とそれに伴うトラブル

安定版にしがみついてばかりいないで冒険をしようと思い立ち、Debian GNU/Linux の安定版である woody から テスト版の sarge へとアップグレードした。

アップグレードをするため、/etc/apt/sources.list の中の woody という文字をすべて sarge へ置き換えて保存。 ちょうど、こんな /etc/apt/sources.list の中身を

http://・・・(URL)・・・・・.jp/ woody main contrib nonfree
ftp://・・・(URL)・・・・・.jp/ woody main contrib nonfree
こういう風に置換しただけ。
http://・・・(URL)・・・・・.jp/ sarge main contrib nonfree
ftp://・・・(URL)・・・・・.jp/ sarge main contrib nonfree
そうしたら root 権限で
# apt-get update
# apt-get dist-upgrade
以上のコマンドでアップグレードは完了。 筆者の debian box では 396個のパッケージがアップグレードされ、405個のパッケージが新たにインストールされ、9個のパッケージが削除され、3個のパッケージが今とバージョンがわからないままとなった。
アップグレードに際し、消されるのパッケージは以下だった。
alsa-modules-2.2.17, alsautils, libpng-dev, libwings-deb, libwraster2-dev, openoffice.org, org-debian-files, openoffice.org-l10n-ja
これは # apt-get dist-upgrade のコマンドを打つと表示されるので、後々のためにもメモをとっておくべきであろう、うん。

大量のパッケージをダウンロードし、それらのインストールが終わったら晴れて sarge への移行は終了だ。
この後、いくつか再設定をしなくてはならない項目がある。

トラブル(1) 「eth0 が使えない」
さすがにカーネルを移行したわけじゃないんだから、eth0 を認識しなくなったというわけではない。 ifconfig -a を実行するとちゃんと eth0 は存在する。
とりあえず eth0 を利用できるようにしてやるなら以下のようにコマンドを打ってあげる。

# ifconfig eth0 192.168.0.4 netmask 255.255.255.0 up
そして、OSの起動時に eth0 を自動で上げたいので、
# ln -s /etc/init.d/networking /etc/rc2.d/S20networking
をしてやる。 なぜか /etc/rc2.d にあったはずの S20networking が消えていたのが原因のよう。
アップグレード時に勝手に消されてしまったのだろう。

トラブル(2) 「どうも画面がチカチカする」(Xwindow)
どうも落ち着かないので /etc/X11/XFree86Config-4 を編集した。
現在使っているグラフィックカードに合わせて以下のように編集した。
Section "Device"

Chipset    "mgag200"
を追加。
それから、Section "Monitor"
Modeline "1152x864" 92.00 1152 1208 1368 1474 864 875 895 915
のように、結構いい加減に記述。 "1152x864" より後ろの数字はなんなのか、気になるところだが、
$ man XF86Config-4
に載っている。
dot (pixel) clock (MHz), hdisp, hsyncstart, hsyncend, htotal, vdisp, vsyncstart, vsyncend, vtotal
だそうだ。 しかしまあ、改めて見るといい加減な数値にしてるな…。
書き換えたら X を上げ直してみて、様子を見る。 とりあえずこれでチカチカしなくなったので、よしとした。

トラブル(3) 「どうしても kochi(東風) や Osaka といったスケーラブルフォントの表示が出来ない」
XFree86-4.x ならば xfs や xfs-tt などのフォントサーバを上げなくても truetype フォントなどの表示が出来るのだと聞いて喜んでいたのに、これらの文字が表示されない。 具体的には先ほども出てきた /etc/X11/XFree86Config-4 の中の Section "Module" の中で

Load    "xtt"
についているコメントをとってやるのだ。 しかし筆者の debian box ではこのように xtt のモジュールを組み込んでやっても truetype のフォントの表示がされなかった。 色々悩んだが、結局 xserver-xfree86 のバージョンを 4.2.x から 4.1.0 へとダウングレードすることで乗り切ることにした。

トラブル(4) 「man の表示が変」
manでマニュアルを見ると表示が妙なことになる。 以下がその例。

$ man XF86Config-4
XF86Config-4(5x)                                              XF86Config-4(5x)



^[[1mNAME^[[0m
       XF86Config-4 - Configuration File for XFree86 4.x server

^[[1mDESCRIPTION^[[0m
       ^[[4mXFree86^[[24m  uses  a  configuration  file called ^[[1mXF86Config 
^[[22mfor its initial
       setup.  This configuration file is searched for in the following places
       when the server is started as a normal user:

           ^[[4m/etc/X11/^[[24m<cmdline>
           ^[[4m/usr/X11R6/etc/X11/^[[24m<cmdline>
           ^[[4m/etc/X11/^[[24m^[[1m$XF86CONFIG^[[0m
           ^[[4m/usr/X11R6/etc/X11/^[[24m^[[1m$XF86CONFIG^[[0m
           ^[[4m/etc/X11/XF86Config-4^[[0m
           ^[[4m/etc/X11/XF86Config^[[0m
           ^[[4m/etc/XF86Config^[[0m
           ^[[4m/usr/X11R6/etc/X11/XF86Config.^[[24m<hostname>
           ^[[4m/usr/X11R6/etc/X11/XF86Config-4^[[0m
           ^[[4m/usr/X11R6/etc/X11/XF86Config^[[0m
XF86Config-4(5x):

見にくいことこの上ない。 原因はページャ(PAGER) lv のせいのようだった。 このページャを違うものに変えたところ、表示に問題はなくなった。 man の引数 -P の後に lessなどの違うページャを指定するか、環境変数 PAGER で less を指定するかで解決気味。
$ man -P less XF86Config-4
XF86Config-4(5x)                                              XF86Config-4(5x)



NAME
       XF86Config-4 - Configuration File for XFree86 4.x server

DESCRIPTION
       XFree86  uses  a  configuration  file called XF86Config for its initial
       setup.  This configuration file is searched for in the following places
       when the server is started as a normal user:

           /etc/X11/<cmdline>
           /usr/X11R6/etc/X11/<cmdline>
           /etc/X11/$XF86CONFIG
           /usr/X11R6/etc/X11/$XF86CONFIG
           /etc/X11/XF86Config-4
           /etc/X11/XF86Config
           /etc/XF86Config
           /usr/X11R6/etc/X11/XF86Config.<hostname>
           /usr/X11R6/etc/X11/XF86Config-4
           /usr/X11R6/etc/X11/XF86Config
           /usr/X11R6/lib/X11/XF86Config.<hostname>
 Manual page XF86Config-4(5x) line 1

Debian GNU/Linux, USB接続のプリンタの利用とネットワーク印刷 @ kernel 2.2.17

hp deskjet 5551 動作報告とSamba利用のプリントサーバ

先日、 hp のインクジェットプリンタ、 deskjet 5551 を購入した。 「パソコンから紙に印刷をしたい」という家族からの要望により、代わりに買ってきた次第だ。 家族からは、WinME 搭載のノート型コンピュータからこのプリンタを使って印刷ができればよい、と言われていた。 だが、スペースの関係上、このプリンタを私の部屋に設置しなくてはならなくなった。 部屋に設置するというなら、私もプリンタの恩恵にあやかりたいと思い、

  • Linux からも印刷をできるようにする。
  • home LAN 経由で印刷データをプリンタに転送できる(印刷できる)
という環境を目指した。
なお、LinuxPrintingで、どのプリンタを買おうか吟味してから電機屋へ買いにいった。 YドバシCメラにて、2,2800円だった。

なお、まだまだ不備もある。 今まだ残っている問題を以下に挙げておく(投げやり)

  • Linux からテキストを直接印刷できない。(フィルタの不備です)
  • 例えば Windows での印刷の際の「印刷進渉表示」や「インク残量表示」などのプリンタからの情報がパソコンまで届かない。
  • 世界中のクラッカーが私の部屋のプリンタで印刷ができてしまう。

下地となる環境詳細

  • OS = debian GNU/Linux
  • Kernel version = 2.2.17 (USB backport パッチ済み[詳細]
  • イーサネットLAN[詳細]により、同一ネットワーク上に筆者の debian box と ノート型コンピュータ(WinME搭載)がある。

何をしたいか。

  • Linux box と プリンタをUSBで直接つなぎ、Linux からプリンタで印刷をする。(PS形式データのみ)
  • samba を Linux上で走らせておき、WinMEから印刷データを受けとってプリンタに流す。

そもそも Linux がインクジェットプリンタで印刷する手順がわからなかったので、適当に以下のように解釈。

プリントしたいデータ(すべてPS形式とする)をプリンタスプーラに送る。

スプーラはそのデータに対して、ちょっと処理をかましておく。(フィルタ処理)

フィルタ処理の仕事は、プリントしたいデータを ghostscript(gs)hpijs(hp inkjet server)を通して hp deskjet 5551 が印刷可能なデータに変換すること。

変換されたデータを usb デバイスへと流す。

とりあえず、gsとhpijsなるものをインストールしておく。 もちろん、筆者は debianパッケージを使い、dpkgコマンドを使って楽々インストールをする。(ぉ
ちなみに、これは後々判明することなのだが、現在(2003 Mar)安定版としてインストールできる hpijs(ver 1.0.4-1)では deskjet5551 が動かなかったので、テスト版の hpijs (ver 1.3.2) を使用した。

USBのプリンタを使う、ということで、カーネルコンフィグ。

# cd /usr/src/kernel-source-2.2.17
# make xconfig

  設定画面が上がるので、
  USB support → USB Printer support の m にチェックを入れて
  保存して終了

# make-kpkg kernel_image
# cd ..

  /usr/src に kernel-image-2.2.17_Custom.1.000_i386.deb などの
  カーネルパッケージができているので、それを組み込む

# dpkg -i kernel-image-2.2.17_Custom.1.000_i386.deb
# reboot

  再起動

# depmod -av

  depmod -av の出力の中に printer.o があるのを確認(何
  以下のコマンドで printerモジュールをカーネルに組み込めるようになった

# insmod printer
これでハードウェア面での設定はおおよそ終わった。
プリンタを使うときは、上で示したように # insmod printer コマンドや # modprobe printer コマンド*1でモジュールを組み込んでおかないと当然動かない。 modprobeコマンドは、モジュールの依存関係をも考慮してその他必要なモジュールも一緒に組み込んでくれるから便利。

*1(「# insmod modprobeコマンド」と書いていたのを訂正、modprobeという名のモジュールを組み込むわけではありません、ごめんなさい Apr 3)

LPRng(バークレーLPRの拡張)を入れる。 やっぱり # apt-get install lprng で楽してインストール。 この方法だと、ブート時にLPDを上げるか聞かれるので、景気よく y と答えておいた。 見ると、 /etc/rc2.d/S20lprng ができていた。

次に、ソフトの設定を進めていく。
hpijsのサイトの説明によれば、gs の ver 6.53以上から hpijs に対応しているとのこと。
$ gs -h というコマンドを打ち、その中に ijs という出力があればよいらしい。 また、hpijsの使用例として

  • $ gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="DESKJET 990" -r300x300 -dNOPAUSE -dSAFER -sOutputFile="/dev/lp0" file.ps -c quit
  • $ lpr -Plp0 tiger.ps
などと載せていた。 特に上の例のコマンドは長過ぎ。 特に、急いでいるときなどには打ちたくない。

deskjet 5551 をプリント出力先として /etc/printcap ファイルに書き加える。 (この辺は他サイト等の情報を元にしている。)

hp_deskjet_5551|hp deskjet 5551:\
:lp=/dev/usb/lp0:\
:sd=/var/spool/hp_deskjet_5551:\
:lf=/var/spool/hp_deskjet_5551/log:\
:af=/var/spool/hp_deskjet_5551/acct:\
:if=/usr/bin/hp_deskjet_5551-if:\
:mx#0:\
:sh:
上記のように書いてしまったので
  /dev/usb/lp0というキャラクタデバイス
  /var/spool/hp_deskjet_5551/log などのディレクトリ
  /usr/bin/hp_deskjet_5551-if というフィルタの役割をするシェルスクリプト
の3点セットを作っておく。
# mkdir /dev/usb
# mknod /dev/usb/lp0 c 180 0

# mkdir /var/spool/hp_deskjet_5551
# chgrp lp /var/spool/hp_deskjet_5551
/dev/usb/lp0 にアクセスされたらメジャー番号180、マイナー番号0番のキャラクタ型デバイスをセットする、という。 いまいちよくわからなかったが、/proc/devices 内の記述を参考してみた。
プリンタからの情報を得るには、この辺が重要になるのかな。 そして、/usr/bin/hp_deskjet_5551-ifというシェルスクリプトだが、これもまた他サイトの情報を参考にしている。
#! /bin/sh
#
# filter for hp deskjet 5551

/usr/bin/gs -q -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5551" -r300 -dNOPAUSE -dSAFER -sOutputFile=- -
上記の最後の1行は、先ほど見かけたあの長いコマンドを deskjet5551 風にアレンジしたもの。 まずはこの長い gs コマンドを普通にターム上で打ち込んでみて、ちゃんと ps ファイルがプリンタから出力されるのを確認してから、スクリプトに組み込む。 こんな風に(以下)打つと、name.ps がプリンタから出力される。
# gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5551" -r300 -dNOPAUSE -dSAFER -sOutputFile="/dev/usb/lp0" name.ps -c quit
やっぱり、改行文字をバックスラッシュでエスケープしたほうが見やすくてかっこいと思った・・・。

試し印刷。 こんどは lpr コマンド使用で ユーザでも印刷ができるか確かめる。

$ lpr -Php_deskjet_5551 name.ps
筆者の場合は、lprコマンドで psファイルを指定した場合にのみ印刷ができるようになった。 もじらなどでの印刷はできるが、$ lpr hoge.txt などのコマンドを打つと印刷に失敗する・・・。 magicfilter なるものを使うとこの辺を処理してくれるらしいのだが、それって自分で filter を書き直せば出来そうな気もするけど・・・。
以下次号にご期待・・・。(ぉ
とりあえず、これでLinuxからの印刷に関する設定をいったん中断する。

Sambaをインストール
やっぱり

# apt-get install samba samba-common
でインストール。すると、 debconfで初期設定ができる。 以下はこのdebconfで聞かれることをおおざっぱに訳したものと、設定例。
  1. debconfでsmb.confの設定をしますか? ---- ok
  2. Workgroup/Domain name? ---- home.pr.jp(※ WinMEのネトワク名に合わせること)
  3. 最近の窓は暗号化パスワードを使います。もし生テキストのパスワードがいいっていうなら、窓のレジストリを書き換えて、/etc/samba/smbpasswd というファイルで、各ユーザごとに smbpasswdコマンドでちゃんと設定してください。で・・・、暗号化パスワードを使いますよね? ---- yes
  4. nmbd と smbdのログの場所が /var/log から /var/log/samba に別々の名で保存されるようになりましたのでよろしく。 ---- ok
  5. サーバは daemon か inetd から上げられます。どっちがいいですか。なお、daemonが推奨されますよ。 ---- daemons ok
  6. パスワードについて、手動で smbpasswd コマンドを打ってメンテナンスしてください。 ---- ok
  7. /etc/samba/smbpasswd ? ---- yes
このあと、/etc/samba/smb.conf にプリンタ周りの設定を書き加える。 主だって変更した設定についてのみ、以下に挙げる。
[global]
 workgroup = MSHOME

[homes]
 変更無し

[printers]
 comment = All Printers
 path = /var/spool/samba
 create mask = 0700
 printable = Yes
 browseable = No

[printer1]
 path = /tmp
 guest ok = Yes
 printable = Yes
 print command = cat %s > /dev/usb/lp0 ; rm -f %s
 printer name = hp_deskjet_5551
[printer1] 以下が deskjet 5551 周りの設定である。 WinME 機から送られてくるデータはプリンタが扱える形式のデータのはずなので、デバイス /dev/usb/lp0 に cat コマンドで直接流し込んでいる。 なお、 %s は印刷データのファイル名に変えられる。

ユーザをつくる。
# smbpasswd -a username コマンドで username というユーザを作る。 このとき、 Linux 側にも username さんというユーザがいなくてはならない。

WinME に、deskjet 5551 のドライバを「ネットワークプリンタ設定」でインストールする。 その際、ネットワークプリンタとして hp_deskjet_55 を追加してやればいい。 なお、なぜ窓上で hp_deskjet_55 と尻切れとんぼに表示されるのかは謎である。

おまけ情報。
YドバシCメラのプリンタコーナーでは、hpやキヤノンの社員が接客をしてくれる。 売場には「競合他社との闘い」「客の取り合い」という見えない火花が散っている。 プリンタに関しては、さすがに相手は社員さんなので、何を聞いても正確に答えてくれる。 だが、YドバシCメラ1階の店内にはびこる Yahoo BB! の勧誘員はどうだかは知らない。

Debian GNU/Linux, KDE3.1 を Debパッケージからインストール

KDE3.1のインストール

Windowmaker はテーマを持ち、メニューを持ち、日本語化もでき、軽く、あのドックアプリを広めるのに貢献したXウィンドウマネージャだ。 しかし、 Windowmakerに少し飽きてきた+KDE3.1がリリースされた+スケスケ(透過)メニューに憧れていた ということで、debianパッケージを利用して楽にKDEへ移行してみたいと思ったわけだ。

管理者権限でインストール作業をするため、suコマンドでrootになる。 (sudoコマンドを使ってもよいかと。) まず、 /etc/apt/sources.list に以下を書き加える。

# for kde ver.3.1
deb http://download.kde.org/stable/3.1/Debian stable main
そうしたら、このKDE本家のdebianパッケージ置場(?)を apt line に加えるため以下のコマンドを叩く。
# apt-get update
これで apt-get install kde のようなコマンドで kde を入れられるのかと思いきや、
root@jaga[/etc/apt]# apt-get install kde
Reading Package Lists... Done
Building Dependency Tree... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.

Since you only requested a single operation it is extremely likely that
the package is simply not installable and a bug report against
that package should be filed.
The following information may help to resolve the situation:

Sorry, but the following packages have unmet dependencies:
  kde: Depends: kdelibs3 but it is not going to be installed
       Depends: libkmid or
                libkmid-alsa but it is not going to be installed or
                libkmid-bin but it is not installable
       Depends: kdebase but it is not going to be installed or
                kdebase3 but it is not installable
       Depends: kdebase-audiolibs but it is not going to be installed or
                kdebase3-audiolibs but it is not installable
       Depends: kdebase-libs but it is not going to be installed or
                kdebase3-libs but it is not installable
       Depends: libkonq3 but it is not going to be installed or
                libkonq4 but it is not going to be installed
       Depends: konqueror but it is not going to be installed or
                konqueror3 but it is not installable
       Depends: kate but it is not going to be installed or
                kate3 but it is not installable
       Depends: konsole but it is not going to be installed or
                konsole3 but it is not installable
       Depends: kdebase-doc but it is not going to be installed or
                kdebase3-doc but it is not installable
       Depends: kscreensaver but it is not going to be installed or
                kscreensaver3 but it is not installable
       Depends: kuser but it is not going to be installed
       Depends: ksysv but it is not going to be installed
       Depends: kcron but it is not going to be installed
       Depends: kpackage but it is not going to be installed
       Depends: secpolicy but it is not going to be installed
       Depends: kghostview but it is not going to be installed
       Depends: kview but it is not going to be installed
       Depends: kmail but it is not going to be installed
       Depends: korn but it is not going to be installed
       Depends: ark but it is not going to be installed
       Depends: kab but it is not going to be installed
       Depends: karm but it is not going to be installed
       Depends: kcalc but it is not going to be installed
       Depends: kcharselect but it is not going to be installed
       Depends: kdepasswd but it is not going to be installed
       Depends: kdf but it is not going to be installed
       Depends: kedit but it is not going to be installed
       Depends: kfind but it is not going to be installed
       Depends: khexedit but it is not going to be installed
       Depends: kjots but it is not going to be installed
       Depends: knotes but it is not going to be installed
       Depends: kpm but it is not going to be installed
       Depends: kpaint but it is not going to be installed
       Depends: kiconedit but it is not going to be installed
       Depends: kfract but it is not going to be installed
       Depends: ksnapshot but it is not going to be installed
       Depends: kruler but it is not going to be installed
       Depends: kdict but it is not going to be installed
       Depends: kit but it is not going to be installed
       Depends: knode but it is not going to be installed
       Depends: ksirc but it is not going to be installed
       Depends: koffice but it is not going to be installed
       Depends: knewsticker but it is not going to be installed
       Depends: ktimer but it is not going to be installed
       Depends: kcoloredit but it is not going to be installed
E: Sorry, broken packages
激しくエラー・・・・。
エラー出力を睨みつつ、依存関係を満たすようにこんなコマンド(長いけど1行)を打ってみるも・・・
root@jaga[/etc/apt]# apt-get install kde kdelibs3 libkmid-alsa kdebase3 kdebase3-audiolibs kdebase3-libs libkonq3 konqueror3 kate3 konsole3 kdebase3-doc kscreensaver3 kuser ksysv kcron kpackage secpolicy kghostview kview kmail korn ark kab karm kcalc kcharselect kdepasswd kdf kedit kfind khexedit kjots knotes kpm kpaint kiconedit kfract ksnapshot kruler kdict kit knode ksirc koffice knewsticker ktimer kcoloredit kde-i18n-ja
上のコマンドに対する出力。
Reading Package Lists... Done
Building Dependency Tree... Done
Package kdebase3 has no available version, but exists in the database.
This typically means that the package was mentioned in a dependency and
never uploaded, has been obsoleted or is not available with the contents
of sources.list
W: Couldn't stat source package list file: stable/non-free Packages (/var/lib/apt/lists/_cdrom_dists_stable_non-free_binary-i386_Packages) - stat (2 No such file or directory)
W: Couldn't stat source package list file: stable/non-free Packages (/var/lib/apt/lists/_cdrom_dists_stable_non-free_binary-i386_Packages) - stat (2 No such file or directory)
W: You may want to run apt-get update to correct these problems
E: Package kdebase3 has no installation candidate
やっぱり・・・。 結局エラーメッセージに振り回され撃沈。
どうやるんだ、インストール?

やっぱり改めてネットで方法を調べるか、と思い直し、 Xttp://davidpashley.com/debian-kde/faq.html こんな資料あるやんか。
結局以下のコマンドでOKらしい。

root@jaga[/etc/apt]# apt-get install arts kdelibs kdebase kdenetwork kdepim kdegraphics kdeadmin kdemultimedia
でも依存関係により、 wine (窓エミュレータ)が消されてしまった。 あとついでに、
# apt-get install kde-i18n-ja
とかもやったら、rootでの作業は終わり。

root から 「KDEを使うユーザ」に戻ったら、さっそく startkde コマンドを打つ。 と思ったら Windowmaker を起動したままだった。 まあとりあえずそのままで 操作や挙動、GUIの設定を行う。 最後に、xdm ログイン時に Windowmaker ではなく、kde が上がるように設定する。
startkde の PATH を調べてから、~/.xsessionを書き換える。
~/.xsession ファイルの骨子は以下のようしてある。

WINDOW_MANAGER=/usr/bin/startkde
export WINDOW_MANAGER

kinput2-canna-wnn  -jserver localhost &
LANG=ja_JP.eucJP
export LANG
PATH=$HOME/bin:$PATH

if [ -x "$WINDOW_MANAGER" ]; then
  realstartup=$WINDOW_MANAGER
elif [ -x /usr/bin/x-session-manager ]; then
  realstartup=x-session-manager
elif [ -x /usr/bin/x-window-manager ]; then
  realstartup=x-window-manager
elif [ -x /usr/bin/x-terminal-emulator ]; then
  realstartup=x-terminal-emulator
fi
exec $realstartup
これでめでたく xdm からログインすると KDE が上がるようになった。

ひとりスクリーンショット自慢大会

  1. 全体図(420KB)
    メニューが透けてるよ(; ´Д`)ハァハァ
    KDE3.1の透過メニューを開いた図)
  2. Konqueror(86KB)
    画像・動画ファイル、テキストデータとわかるものを勝手に展開表示するファイラ。 ファイラだけでなく、webブラウザにもなる。
    KDE附属のソフト(概して、k から始まる名称が多い)はかなり重い・・・。 Konquerorってすごいね、の図

Debian GNU/Linux, X や Mozilla で TrueTypeフォントを使う

TrueTypeフォントに奮闘(もじらで使おうTTフォント)

今まで筆者は xfs(X Font Server かな?) を使いビットマップフォントだけを使用していた。 だが、もじらでTrueTypeフォントを使いたくなってしまったため、急きょTrueTypeフォントの東風フォントを導入することにした。

まずフォントファイル(*.ttf)をもらってこなくてはならない。 とりあえず yasu さんのホームページ(Xttp://www.on.cs.keio.ac.jp/~yasu/jp_fonts.html)から東風明朝フォントと、東風ゴシックフォントの二つを頂いてくる。
次にそれを解凍して、 *.ttf ファイル(フォントファイル)と fonts.dir.xtt ファイルを /usr/lib/X11/fonts/truetype_jp というディレクトリへコピーした。 その際、fonts.dir.xtt を fonts.dir と名称変更をしておく。
このパスを見れば想像がつくかもしれないが、ファイルのコピーにはrootの権限が必要になる。 個人的に楽しむ目的ならばroot権限でフォントを導入する必要は全くないだろうから、一般ユーザのホームディレクトリ以下にこれらを置いておいても問題はないだろう。
ここでは /usr/lib/X11/fonts/truetype_jp にフォントファイルを置いたと仮定して話を進めていく。

$ tar jxvf kochi-mincho-0.2.20020727.tar.bz2
$ tar jxvf kochi-gothic-0.2.20020727.tar.bz2
# cp kochi-mincho/fonts/kochi-mincho.ttf /usr/lib/X11/fonts/truetype_jp/
# cp kochi-gothic/fonts/kochi-gothic.ttf /usr/lib/X11/fonts/truetype_jp/
# cp kochi-gothic/examples/fonts.dir.xtt /usr/lib/X11/fonts/truetype_jp/fonts.dir
$ cat /usr/lib/X11/fonts/truetype_jp/fonts.dir
16
kochi-mincho.ttf -kochi-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:kochi-mincho.ttf -kochi-mincho-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ai=0.15:kochi-mincho.ttf -kochi-mincho-medium-i-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:ai=0.15:kochi-mincho.ttf -kochi-mincho-bold-i-normal--0-0-0-0-c-0-jisx0208.1983-0
bw=0.5:kochi-mincho.ttf -kochi-mincho-medium-r-normal--0-0-0-0-c-0-jisx0201.1976-0
bw=0.5:ds=y:kochi-mincho.ttf -kochi-mincho-bold-r-normal--0-0-0-0-c-0-jisx0201.1976-0
bw=0.5:ai=0.15:kochi-mincho.ttf -kochi-mincho-medium-o-normal--0-0-0-0-c-0-jisx0201.1976-0
bw=0.5:ds=y:ai=0.15:kochi-mincho.ttf -kochi-mincho-bold-o-normal--0-0-0-0-c-0-jisx0201.1976-0
bw=0.5:kochi-mincho.ttf -kochi-mincho-medium-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ai=0.15:kochi-mincho.ttf -kochi-mincho-medium-i-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ds=y:kochi-mincho.ttf -kochi-mincho-bold-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ds=y:ai=0.15:kochi-mincho.ttf -kochi-mincho-bold-i-normal--0-0-0-0-c-0-iso8859-1
kochi-gothic.ttf -kochi-gothic-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:kochi-gothic.ttf -kochi-gothic-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ai=0.15:kochi-gothic.ttf -kochi-gothic-medium-i-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:ai=0.15:kochi-gothic.ttf -kochi-gothic-bold-i-normal--0-0-0-0-c-0-jisx0208.1983-0
bw=0.5:kochi-gothic.ttf -kochi-gothic-medium-r-normal--0-0-0-0-c-0-jisx0201.1976-0
bw=0.5:ds=y:kochi-gothic.ttf -kochi-gothic-bold-r-normal--0-0-0-0-c-0-jisx0201.1976-0
bw=0.5:ai=0.15:kochi-gothic.ttf -kochi-gothic-medium-o-normal--0-0-0-0-c-0-jisx0201.1976-0
bw=0.5:ds=y:ai=0.15:kochi-gothic.ttf -kochi-gothic-bold-o-normal--0-0-0-0-c-0-jisx0201.1976-0
bw=0.5:kochi-gothic.ttf -kochi-gothic-medium-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ai=0.15:kochi-gothic.ttf -kochi-gothic-medium-i-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ds=y:kochi-gothic.ttf -kochi-gothic-bold-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ds=y:ai=0.15:kochi-gothic.ttf -kochi-gothic-bold-i-normal--0-0-0-0-c-0-iso8859-1

次に、TrueTypeフォントを扱うためのxfs-xttサーバが入ってない(!)ので、インストールする。 今後は xfs に代わって xfs-xtt を介してフォントを表示させていくこととなる。

# apt-get install xfs-xtt

インストール中にいろいろメッセージが出るのだが、おそらく一番重要なのは3番目にでるものだろう。 以下にそれらのメッセージを挙げる。

  +-------------------------- Configuring Xfs-xtt ---------------------------+
  x                                                                          x 
  x xfs-xtt serves fonts using 100 dpi resolution                            x 
  x                                                                          x 
  x You should be aware that, by default, xfs-xtt (the X Font Server with    x 
  x X-TrueType) preferentially delivers fonts to clients using a resolution  x 
  x of 100 dots per inch.  This affects the visible font size.  Another      x 
  x common default is 75 dpi; some font rasterizers do not deal well with    x 
  x other dpi settings.                                                      x 
  x                                                                          x 
  x This setting can be changed by editing /etc/X11/fs-xtt/config.  See the  x 
  x xfs-xtt(1) manual page for more information.                             x 
  x                                                                          x 
  x                                  <Ok>                                    x 
  x                                                                          x 
  +--------------------------------------------------------------------------+
                                                                               
  +-------------------------- Configuring Xfs-xtt ---------------------------+
  x                                                                          x 
  x xfs-xtt does not listen on TCP port by default                           x 
  x                                                                          x 
  x Because xfs-xtt (the X Font Server with X-TrueType) is a daemon that     x 
  x runs with superuser privileges, by default it runs with TCP port         x 
  x listening disabled as a security measure.  This means that, as shipped,  x 
  x xfs-xtt is not reachable via the network and is unable to to serve       x 
  x fonts to X servers running on remote hosts.  Most people do not need to  x 
  x enable TCP port listening in xfs-xtt; it can serve fonts to local X      x 
  x servers without this functionality enabled.                              x 
  x                                                                          x 
  x xfs-xtt can be configured to remote X servers by appropriately editing   x 
  x /etc/X11/fs-xtt/config.  See the xfs-xtt(1) manual page for more         x 
  x information.                                                             x 
  x                                                                          x 
  x                                  <Ok>                                    x 
  x                                                                          x 
  +--------------------------------------------------------------------------+
                                                                              
  +-------------------------- Configuring Xfs-xtt ---------------------------+
  x                                                                          x 
  x xfs-xtt use 7110 port insted of 7100                                     x 
  x                                                                          x 
  x xfs-xtt would use 7110 insted of 7100 default, xfs-xtt does not          x 
  x conflict original xfs. So, if you installed xfs-xtt (1.3.0.1-15 or       x 
  x earlyer) previous and will not install xfs, you should modify font path  x 
  x in XF86Config, like this:                                                x 
  x                                                                          x 
  x FontPath "unix/:7100" ->  FontPath "unix/:7110"                          x 
  x                                                                          x 
  x                                  <Ok>                                    x 
  x                                                                          x 
  +--------------------------------------------------------------------------+
  
  +-------------------------- Configuring Xfs-xtt --------------------------+
  x                                                                         x 
  x xfs-xtt use /etc/X11/fs-xtt for config files                            x 
  x                                                                         x 
  x Older version of xfs-xtt (1.3.0.1-15 or earlyer) used /etc/X11/xfs for  x 
  x config files. Now this version uses /etc/X11/fs-xtt directory. So, you  x 
  x can use both xfs and xfs-xtt at the same time on the same machine.      x 
  x                                                                         x 
  x                                 <Ok>                                    x 
  x                                                                         x 
  +-------------------------------------------------------------------------+

3番目のメッセージでは、
「xfs-xttはポート7100からポート7110を使うようになるのでXF86Configファイルを編集しておくよう」注意を促している。
筆者の環境では /etc/X11/XF86Config-4 が X の起動時に使われるファイルとなっているので、それを編集した。
その他にも、フォントパスを追加したり、モジュールとしてxttを組み込むよう書き込んでいる。
以下に筆者の /etc/X11/XF86Config-4 の内容(一部)を示す。 強調部分が編集対象部分だ。

     :
     :
Section "Files"
#       FontPath        "unix/:7100"                    # local font server
        FontPath        "unix/:7110"                    # for XTTserver
        # if the local font server has problems, we can fall back on these
        FontPath        "/usr/lib/X11/fonts/misc"
        FontPath        "/usr/lib/X11/fonts/cyrillic"
        FontPath        "/usr/lib/X11/fonts/100dpi/:unscaled"
        FontPath        "/usr/lib/X11/fonts/75dpi/:unscaled"
        FontPath        "/usr/lib/X11/fonts/Type1"
        FontPath        "/usr/lib/X11/fonts/Speedo"
        FontPath        "/usr/lib/X11/fonts/100dpi"
        FontPath        "/usr/lib/X11/fonts/75dpi"
        FontPath        "/usr/lib/X11/fonts/japanese"
        FontPath        "/usr/lib/X11/fonts/truetype_jp"
EndSection

Section "Module"
        Load    "GLcore"
        Load    "bitmap"
        Load    "ddc"
        Load    "dri"
        Load    "extmod"
#       Load    "freetype"
        Load    "xtt"
        Load    "glx"
        Load    "int10"
        Load    "pex5"
        Load    "record"
        Load    "speedo"
        Load    "type1"
        Load    "vbe"
        Load    "xie"
EndSection
     :
     :

編集が終わったら、

$ /etc/init.d/xfs stop
$ /etc/init.d/xtt-xfs restart

などでxtt-xfsデーモンを立ち上げてみよう。

xfontselで kochi が加わったか確認してみる。
xfontselは、xfontselとシェルに打ち込めば上がるはずだ。
xfontselイメージ
文字が表示されていれば、他の場所(もじらなど)でも表示できるはずだ。

よくわからないけど・・・・。
xdmを使う際、
/etc/X11/xdm/Xservers というファイル内に
:0 local /usr/X11R6/bin/X vt7 -deferglyphs 16
のように書くと X に -deferglyphs all オプションつきで起動ができるとのこと。 これがないと X が固まるとの噂が・・・・。 だが筆者は特にこれを有効にしていないが、問題なく xdm から X が上がるのだが・・・・。

見くらべてみよーう。
ビットマップフォントのモナーフォント、TrueTypeフォントの東風フォントを使った際の例を以下に示す。

(フォント画像1) モナーフォントのとき
文字を縮小すればつぶれてしまい、
拡大すればカクカクが目立ってしまう
(フォント画像2) 東風フォントをそのまま指定
フォントサイズによっては
意外と荒さが目立ってしまう
(フォント画像3) 東風フォントにアンチエイリアスをかけた場合
より美しく表示、実にきれい(下記参照)

さらにもじらでこだわってみた。(上画像参照) せっかくTrueTypeフォントを使っているのだから、フォントにアンチエイリアスをかましてよりきれいに表示させてみたい。 なにやら、アンチエイリアスをかますことで、文字色の中間色を使用し文字曲面などのギザギザを目立たなくしてくれるというのだ。
なお筆者は mozilla ver.1.0.1(日本語化パック)を使用している。

$HOME/.mozilla/user_name/random.slt/user.js に次のように書き込んだ。(とはいえ、これもどっかからの写しで恐縮だが・・・・(ぉぃ))

// it is best to leave hinting off
user_pref("font.FreeType2.autohinted", false);
user_pref("font.FreeType2.unhinted", false);
// below a certian pixel size anti-aliased fonts produce poor results
user_pref("font.antialias.min",        8);
user_pref("font.embedded_bitmaps.max", 100000);
user_pref("font.scale.tt_bitmap.dark_text.min", 32);
user_pref("font.scale.tt_bitmap.dark_text.gain", "0.1");
// sample prefs for TrueType font dirs
user_pref("font.directory.truetype.1", "/usr/X11R6/lib/X11/fonts/Type1");
user_pref("font.directory.truetype.2", "/usr/X11R6/lib/X11/fonts/truetype_jp");

最後のほうにある /usr/X11R6/lib/X11/fonts/truetype_jp の下にはTrueTypeフォントが入っている。 この部分は、人それぞれに違うであろうから、丸写しをしても意味はないかと思われる。
### もちろん、もうすでにFontPathにこのディレクトリが指定されている。
書き込んで以降、もじらを起動すると、フォントのアンチエイリアスが可能となる。

メニューバー → 編集(E) → 設定(E)...

を選択し、設定ダイアログをあげる。

設定ダイアログ内のカテゴリから「表示」をダブルクリック → カテゴリの「フォント」をクリックする

とフォント変更ができるようになる。

東風フォントの場合では

Take-kochi gothic-jisx0208.1990-0
Take-kochi mincho-jisx0208.1990-0

のような、フォントが選択できるようになっている。
この最初の一文字が大文字のフォント「アンチエイリアス可」を表しているらしいのだ。 これらのフォントをいつも通り選択してやればよい。 実に楽々だ。

追記(8.Jan 2003)
もじらでフォントにアンチエイリアスをかけると、 フォントを太字にしたり斜体にしたりしても反映されない。
しかしアンチエイリアスをかけないようなフォントを選ぶと、 ちゃんと太字や斜体がちゃんと選択され、表示されたりする。
TrueTypeフォントと同じディレクトリにある fonts.dir の書き方がおかしいのか。
はたまた、これがもじらの限界なのだろうか。
情報求む。

追記(17.Jan 2003)
もじらで、東風フォントにアンチエイリアスをかけずに使用したとき、 全角文字は太字・斜体を表現できるのだが、半角(アスキー)文字は太字・斜体にならない。
しかし、なぜか fonts.dir を以下のように書き換えたらそれなりにうまくいった。
この fonts.dir は東風フォント+和田研フォント+渡辺明朝フォントのフォントデータといっしょに /usr/X11R6/lib/X11/fonts/truetype_jp/ の中に置いてある。
書き換えたら xset fp rehash コマンドでも打てばすぐに反映されるかも。

36
wadalab-gothic.ttf -wadalab-gothic-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
wadalab-gothic.ttf -wadalab-gothic-medium-r-normal--0-0-0-0-c-0-iso8859-1
wadalab-gothic.ttf -wadalab-gothic-medium-r-normal--0-0-0-0-p-0-jisx0208.1983-0
wadalab-gothic.ttf -wadalab-gothic-medium-r-normal--0-0-0-0-p-0-iso8859-1
wadalab-gothic.ttf -wadalab-gothic-medium-r-normal--0-0-0-0-m-0-jisx0208.1983-0
wadalab-gothic.ttf -wadalab-gothic-medium-r-normal--0-0-0-0-m-0-iso8859-1
watanabe-mincho.ttf -watanabe-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
watanabe-mincho.ttf -watanabe-mincho-medium-r-normal--0-0-0-0-c-0-iso8859-1
watanabe-mincho.ttf -watanabe-mincho-medium-r-normal--0-0-0-0-p-0-jisx0208.1983-0
watanabe-mincho.ttf -watanabe-mincho-medium-r-normal--0-0-0-0-p-0-iso8859-1
watanabe-mincho.ttf -watanabe-mincho-medium-r-normal--0-0-0-0-m-0-jisx0208.1983-0
watanabe-mincho.ttf -watanabe-mincho-medium-r-normal--0-0-0-0-m-0-iso8859-1
kochi-mincho.ttf -kochi-mincho-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:kochi-mincho.ttf -kochi-mincho-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ai=0.15:kochi-mincho.ttf -kochi-mincho-medium-i-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:ai=0.15:kochi-mincho.ttf -kochi-mincho-bold-i-normal--0-0-0-0-c-0-jisx0208.1983-0
eb=y:kochi-mincho.ttf -kochi-mincho-medium-r-normal--0-0-0-0-p-0-jisx0201.1976-0
eb=y:ds=y:kochi-mincho.ttf -kochi-mincho-bold-r-normal--0-0-0-0-p-0-jisx0201.1976-0
eb=y:ai=.2:kochi-mincho.ttf -kochi-mincho-medium-i-normal--0-0-0-0-p-0-jisx0201.1976-0
eb=y:ds=y:ai=.2:kochi-mincho.ttf -kochi-mincho-bold-i-normal--0-0-0-0-p-0-jisx0201.1976-0
bw=0.5:kochi-mincho.ttf -kochi-mincho-medium-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ai=0.15:kochi-mincho.ttf -kochi-mincho-medium-i-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ds=y:kochi-mincho.ttf -kochi-mincho-bold-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ds=y:ai=0.15:kochi-mincho.ttf -kochi-mincho-bold-i-normal--0-0-0-0-c-0-iso8859-1
kochi-gothic.ttf -kochi-gothic-medium-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:kochi-gothic.ttf -kochi-gothic-bold-r-normal--0-0-0-0-c-0-jisx0208.1983-0
ai=0.15:kochi-gothic.ttf -kochi-gothic-medium-i-normal--0-0-0-0-c-0-jisx0208.1983-0
ds=y:ai=0.15:kochi-gothic.ttf -kochi-gothic-bold-i-normal--0-0-0-0-c-0-jisx0208.1983-0
eb=y:kochi-gothic.ttf -kochi-gothic-medium-r-normal--0-0-0-0-p-0-jisx0201.1976-0
eb=y:ds=y:kochi-gothic.ttf -kochi-gothic-bold-r-normal--0-0-0-0-p-0-jisx0201.1976-0
eb=y:ai=.2:kochi-gothic.ttf -kochi-gothic-medium-i-normal--0-0-0-0-p-0-jisx0201.1976-0
eb=y:ds=y:ai=.2:kochi-gothic.ttf -kochi-gothic-bold-i-normal--0-0-0-0-p-0-jisx0201.1976-0
bw=0.5:kochi-gothic.ttf -kochi-gothic-medium-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ai=0.15:kochi-gothic.ttf -kochi-gothic-medium-i-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ds=y:kochi-gothic.ttf -kochi-gothic-bold-r-normal--0-0-0-0-c-0-iso8859-1
bw=0.5:ds=y:ai=0.15:kochi-gothic.ttf -kochi-gothic-bold-i-normal--0-0-0-0-c-0-iso8859-1

東風フォントの中でも、半角文字の jisx0201.1976 をプロポーショナルフォントとして名付ける感じ(?
上の例の東風フォント(明朝・ゴシック)の jisx0201.1976 のとこだけ p とし、他は c (等倍たっけ?)になってしまった。 全角文字の jisx0208.1983 のほうも p としてもよいが、表示がすごく遅くなってしまった。
ああ、アンチエイリアスのかかったきれいなフォントを使いたいなあ。

なお、そもそも xfontsel で東風フォントを表示させたときに pxlsz のところの選択肢が * と 0 と 17 の3つしかなかった、ということが判明。
学校(そらりす2.6)のモリサワフォントを xfontsel で見てきたところ、pxlszのところの選択肢が多くて、下は 2 、上は 48 くらいまで選べるではないか。 この問題には xserver やらが関わってきてとってもめんどそう。
→xttp://search.luky.org/vine-users.3/msg04150.html(参照)
xfontselの pxlsz選択肢 が全部選択可能でない限りは、アンチエイリアスどころではないのかもしれない。
ヽ(`Д´)ノウワーン

Debian GNU/Linux, bashシェルスクリプトでファイル名の一括変更

 ファイルをまとめてリネームするためのシェルスクリプトpowercp(in bash) 

2002-11-28版

既存のファイル file に対して mv file hogefile を実行するのみ。 ワイルドカードを使うと、複数個のファイルをいっぺんにリネームできる。
ただ現行ファイル名の頭に文字列をくっつけるだけにすぎない。 まだあまり柔軟性はない。
しかし、リネーム+他のディレクトリへの移動の際には上のhogeのところを特に /home/username/hoge のように書けばいい(あまり便利ではないが)。

ソース

#!/bin/bash
for h in $*
do
  if [ ! -f "$h" ]; then
    echo '***以下のファイルは本当に存在しますか?'
    echo $h
    exit 1
  fi
done

for j in "$*"
do
  echo '***以下のファイルについて処理を行います'
  echo $j
done

echo ''
echo '***文字列を入れてください'
read i

echo ''
echo '***以下のコマンドを実行します'
for j in $@
do
  echo mv $j $i$j
done

echo ''
echo '***よろしいですか? (y/n)'
read k
if [ "$k" = "y" -o "$k" = "Y" ]; then
  for j in $@
  do
    mv -vi $j $i$j
  done
else
  echo '***中断します'
fi

実行例

$ powercp 0*.mpg
***以下のファイルについて処理を行います
01.mpg 02.mpg 03.mpg 04.mpg 05.mpg 06.mpg 07.mpg 08.mpg 09.mpg

***文字列を入れてください
2p_not_so_good

***以下のコマンドを実行します
mv 01.mpg 2p_not_so_good01.mpg
mv 02.mpg 2p_not_so_good02.mpg
mv 03.mpg 2p_not_so_good03.mpg
mv 04.mpg 2p_not_so_good04.mpg
mv 05.mpg 2p_not_so_good05.mpg
mv 06.mpg 2p_not_so_good06.mpg
mv 07.mpg 2p_not_so_good07.mpg
mv 08.mpg 2p_not_so_good08.mpg
mv 09.mpg 2p_not_so_good09.mpg

***よろしいですか? (y/n)
y
`01.mpg' -> `2p_not_so_good01.mpg'
`02.mpg' -> `2p_not_so_good02.mpg'
`03.mpg' -> `2p_not_so_good03.mpg'
`04.mpg' -> `2p_not_so_good04.mpg'
`05.mpg' -> `2p_not_so_good05.mpg'
`06.mpg' -> `2p_not_so_good06.mpg'
`07.mpg' -> `2p_not_so_good07.mpg'
`08.mpg' -> `2p_not_so_good08.mpg'
`09.mpg' -> `2p_not_so_good09.mpg'

Debian GNU/Linux, Win98, イーサネットによるホームLAN とインターネット

LANとADSLインターネット

ISDNからADSLに回線を変更することになった。 いままでは、ISDNターミナルアダプタAtermITX80DのITMUXなる機能を利用して2台のコンピュータを同時にインターネットに繋ぐようにしていた。 もちろん、回線変更に伴いISDNターミナルアダプタは使えなくなる。 何も手を打たなければ、2台のコンピュータが同時にインターネットに繋げなくなってしまう。

そこで、家のコンピュータでプライベートなネットワークを組むことにした。 インターネットに出るときは、そのネットワーク内にあるゲートウェイに問い合わせをするようにする。 ゲートウェイ役を、とりあえず『レンタルモデム(ルータタイプ)』に任せることにする。
このモデム(ルータタイプ)はHUB機能こそついてないものの、 DHCP、NAT、IPマスカレードなどなどの多彩な機能をもつ。 これらのモデムの機能はWebブラウザから設定することができ、本当にこれはモデムなのか?、と疑うほどの簡単さなのだ。
なおそのモデムはFLASHWAVE 2040 M1(富士通)である。
なお、上記にあげたモデム(FLASHWAVE 2040 M1)の取扱説明書を手に入れるのならここにいくとよいだろう。

LANの構成、ADSLの詳細をまとめてみたい。

  • プロトコルはPPPoE(PPP over Ethernet)だとプロバイダに言われた。
  • モデム(ルータタイプ)のIPマスカレード機能を使うことにする。
    プライベートネットワーク内のパソコンの代わりにモデム(ルータタイプ)がインターネットに繋ぐ。
    ゲートウェイとなってもらうのだ。
  • モデム(ルータタイプ)と3台のパソコンは、192.168.0.0/24(192.168.0.0/255.255.255.0)というプライベートなネットワーク内にいる。
  • ゲートウェイ=モデム(ルータタイプ)は192.168.0.1/24を名乗る。
  • WinMEを搭載したノートパソコンは192.168.0.2/24を名乗る。
  • Win98を搭載したデスクトップパソコンは192.168.0.3/24を名乗る。
  • Debian GNU/Linuxを搭載した筆者のパソコンは192.168.0.4を名乗る。
  • WinMEもWin98もDebianもネットワークの設定はほぼ同じである。
    ゲートウェイを192.168.0.1にするだけだ。

買い物に行く。
買ってくるのは、パソコン用のNICと、LANケーブル(必要本数)、そして、Ethernetハブ(1つ)だ。
まだレンタルモデムが家に郵送されていなくても、これだけあればとりあえずLANだけは楽しめる(?)はずだ。

NICのインストール on Debian
筆者が買ってきたのは、RealTek RTL8139というチップののったNICだった。 NIC基板上のチップのところにカニの絵が描かれていたので、これはおそらく世間一般に言われているカニさんチップであろう。

NICをPCIスロットに挿してもOSが勝手に自動認識してくれなかったNICを挿しただけでちゃんと動いたと言う人のカーネルは相当膨らんでいるのだろうな、と憂えてしまう瞬間である。 (負け惜しみ)
そんなわけで、デバイスを認識してくれないということはカーネルまわりをいじらないといけないのだろう。
カーネル2.2.17の

Network device support → Ethernet(10 or 100 Mbit) → RealTek 8129/8139(not 8019/8029!) support

を n から m へと設定を変える。

ドライバをモジュールとして扱うことで得られる利点は多い。
ドライバをカーネルに完全に組み込んでしまうとカーネルは肥大化する。 カーネルは物理メモリにロックされるので、ディスクにスワップアウトされない。 つまり肥大化した分だけRAMを圧迫しつづけるというのだ。

逆に、モジュールならば、別のチップのNICを扱うときにカーネルを再構築したり、再起動したりする必要はなくなる。 実際には、今カーネルに組み込んでいるモジュールをrmmodコマンドで消して、新たなモジュールをinsmodコマンドで組み込んでやればよい。 さらに、modprobeコマンドを使えばモジュールの依存関係までも考慮して組み込んでくれる。
さらに、NICを複数枚挿す際、各々のNICに対するドライバの指定方法も簡単になるのだ。

システム管理者というのはここまで深く考慮しなければならないらしい・・・。 嗚呼、大変だ・・・。

次に/etc/modules.confというファイル内に

alias eth0 rtl8139

の1行を付け加え、NICに対してモジュールを指定。 なお、同様にして2枚目のNICのeth1に対するモジュールの指定も可能である。

その後なぜかノリでカーネルを再構築する。 とはいえ、リブートをしたら、NICをeth0として認識してくれていた。 起動時のメッセージや、ifconfigコマンドの結果などからそれを確認できるはずだ。
今思えば、再構築までしなくてもよかったな。

なお、今回、Debianのバージョンを2.2から3.0へと上げてから初めてのカーネル再構築となった。 最初、make-kpkgでエラー(arch/i386-none/Makefile が見つからないよ、というエラーだった)が出て止まってしまったが、以下のようにしてなんとか乗り切った。

# cd /usr/src/kernel-source-2.2.17
# mkdir ./arch/i386-none
# echo '' > ./arch/i386-none/Makefile
# make-kpkg clean
# make-kpkg --revision Custom.1.000 kernel_image
# cd ../
# dpkg -i kernel-image-2.2.17_Custom.1.000_i386.deb

しかし、dpkgでカーネルパッケージをインストールする際も、カーネルのバージョン(make-kpkg kernel_image する際に --revision のあとに続けて書くことでバージョンをつけられる)を下手に動かすとALSAが文句を言い出すためこれまたインストールが止まってしまう。
バージョン番号を振り変えるだけでエラーってのもすごいが、
とりあえずALSAユーザは要注意(?)。
筆者の場合、カーネルのバージョンを1.00から動かせなくなってしまった。 今後は1.000、1.0000、1.00000.....のように 0 を増やして対応していこうかと思っている。

Debianのネットワーク設定(IP割り振り、ルーティングテーブル)
ifconfigコマンドでeth0というデバイスが認識されていればあとはもう楽だ。 このeth0というネットワークインターフェースに対して、IPアドレス、ネットマスクを振り、ゲートウェイがどこにあるのかを教えればよいのだ。
とりあえず手動でコマンドを打って設定を行う。 もちろん、このようなネットワーク設定を起動時に自動的に行わせる方法もあるが、それは後述する。

NICにIPアドレスを振るifconfigコマンドの最低限の使い方

デバイス(eth0など)の設定を見るなら

ifconfig デバイス

デバイスに特定のIPアドレスを振り、ネットマスクをかけた状態でインターフェースを使用できるようにするには

ifconfig デバイス IPアドレス broadcast ブロードキャストアドレス netmask ネットマスク up

のようにコマンドを打つとよい。
eth0に192.168.0.4/24を名乗ってもらうようにするには以下のように打つ。 upを指定しているため、このコマンドを打っただけでインターフェースが利用できるようになる。

# ifconfig eth0 192.168.0.4 broadcast 192.168.0.255 netmask 255.255.255.0 up

現在の設定を確認するには以下のように打ち、出力を眺めればよい。

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0A:79:04:E9:4F  
          inet addr:192.168.0.4  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:93531 errors:0 dropped:0 overruns:0 frame:0
          TX packets:72978 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:73196745 (69.8 MiB)  TX bytes:8174396 (7.7 MiB)
          Interrupt:11 Base address:0xec00

2行目の出力部分にインターフェースのIPアドレスなどが書かれている。
3行目はいくつかのフラグが見える。

  • UP:そのインターフェースが利用可能でパケットの送受信ができる状態であることを表す
  • BROADCAST:全てのブロードキャストを受信できる
  • RUNNING:このインターフェース用のドライバが動いている
  • MULTICAST:マルチキャストが可能
  • MTU:このインターフェースが出すパケットの最大バイト数(Maximum Transfer Unit)
  • Metric:優先度みたいなもの、よくわからん、同じ設定のものがあっても、この値の小さい方を優先的に使うらしいのだが・・・

そのほかにも、インターフェースから見えるネットワーク上の全てのトラフィックを受け入れることを表すPROMISCというフラグもある。 これが今、週刊B春で流行りの「ネットワークスニファ」機能につながるのだ。

ルーティングテーブルを作るrouteコマンド

ルーティングテーブルはパケットの処理方法を制御するのに役立つ。 パケットの宛先を参考にしてそれを次にどこへ飛ばすかを決めるのだ。
ルーティングテーブル自体はメモリ上にあるらしい。 確認するには以下のコマンドを打つといい。

# route -n

-n をつけると、IPアドレスの名前解決をさせないようにできる。

どのようなルーティング規則にするかを考えなければならない。 とはいえ、筆者の家のネットワーク構成がそれほど複雑ではないため、それほど難しくはない。

  1. 家庭内のネットワーク(192.168.0.0/24)にあるホストへパケットを飛ばす際はブロードキャスト(FF:FF:FF:FF:FF:FF)を使い、返事をしてきたホストに送る。 つまり、イーサネットをそのまま使うのだ。
  2. それ以外の宛先にパケットを送る際はゲートウェイ(デフォルトゲートウェイ)192.168.0.1/24に送り、代わりに届けてもらう。

という風にする。

ルーティングテーブルに経路を追加/削除するにはrouteコマンドを使う。

route add -net ネットワークアドレス netmask ネットマスク gw ゲートウェイ dev デバイス

デフォルトゲートウェイとして 192.168.0.1 を指定するには以下のようにした。

# route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0 gw 192.168.0.1

これで、自ネットワーク以外の宛先へパケットを送る際には192.168.0.1に送るようになった。 ゲートウェイ(モデム ルータタイプ)側ではIPマスカレードにより、ローカルIPを伏せて代わりに通信をしてくれるので、パソコン側にこれ以上の設定をする必要はないはずだ。
最終的にルーティングテーブルは以下のようになった。

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0

そういえば、ループバックアドレスはどこへ行ってしまったんでしょうね?(ぉ

Winのネットワーク設定
Win系ではマニュアルをもとにCD-ROMからNICのドライバをインストールすれば楽だろう。 マイコンピュータを右クリックし、プロパティだかを選ぶと、パソコンのシステム画面が出たと思う。 その中の左から2番目のタブをクリックし、デバイスの接続状況を見る。 NICがうまくインストールされているかどうか(アイコンに?マークや×マークが付いていない)、さらにプロパティを開けてみて、そのNICデバイスに使用可能のチェックマークが入っているかを確認したい。
うまくインストールされていなければ、デバイスドライバの削除/再インストールをしなくてはならない。
使用可能のチェックマークが入っていなければチェックをいれなくてはならない。

ネットワークの設定はDebianと同じで、

  1. 家庭内のネットワーク(192.168.0.0/24)にあるホストへパケットを飛ばす際はブロードキャスト(FF:FF:FF:FF:FF:FF)を使い、返事をしてきたホストに送る。 つまり、イーサネットをそのまま使うのだ。
  2. それ以外の宛先にパケットを送る際はゲートウェイ(デフォルトゲートウェイ)192.168.0.1/24に送り、代わりに届けてもらう。

のようにすればいい。 唯一 異なるのは各々のホストパソコンに名乗らせるIPアドレスだけだろう。
手順はだいたい次のようになった

  1. コントロールパネルを開き、ネットワークをダブルクリック
  2. TCP/IP→(使っているNICの名前)を選択し、プロパティボタンをクリック
  3. IPアドレスタブを開け、「IPアドレスを指定」にチェックをし、割り振りたいIPアドレスを書きこむ
  4. ゲートウェイタブを開け、ゲートウェイのIPアドレス(192.168.0.1)を書きこみ、追加ボタンをクリック
  5. WinME機のみの設定
    DNS設定タブを開け、「DNSを使う」にチェックをし、ゲートウェイのアドレス(192.168.0.1)を書き込む。 ホスト名も(適当に)書かなければならない。
    WinMEでは、この設定がないと名前解決をちゃんとやってくれなかった。
  6. OKボタンを押して、ダイアログを全部閉じようとすると「再起動しますか」などと恐ろしいことを聞かれるので、言う通りにする

あとはコントロールパネル→ネットワークオプション→接続タブあたりに残っている、今まで使っていたISDNでの設定を消し、ダイアルしないでLANから繋がせるようにすればいい。

クリックマンセーである。

Ping打!
物理的にホスト同士をハブで繋いだら、 自ネットワークの全てのホスト(自分自身も含め)に向けpingを打ちあってみて、返事がちゃんと返ってくるか確かめよう。
pingコマンドはLinuxにもWinにも入っているはずだ。
もちろん、WindowsではMS-DOSプロンプトを使ってコマンドを打とう。 LinuxでもWinでも以下のようにpingの引数に宛先を指定すればいい。 Linux版では Ctrl-c を押して止めないと延々 ping を送出し続けるので気をつけよう。

# ping 192.168.0.1
# ping 192.168.0.2
# ping 192.168.0.3
# ping 192.168.0.4
# ping 192.168.0.255

自ネットワーク192.168.0.0/24内のホストに向けてpingを打っているのに、ゲートウェイを抜けて外に出てしまった、なんてことは絶対にないようにしたい。
自ネットワーク内で全ホスト同士がちゃんとpingを受け取り合うことができれば、次に外のインターネットワーク上のホストに向けて打ってみよう。

以下の例は www.google.com へ ping を打つときの例である。

# ping 216.239.33.101
# ping www.google.com

なお、traceroute(tracertコマンド)も有用だ。 これは経路の途中に通過したルータを表示してくれる。
こちらはWin用のものしか試したことはない。 Linux用もあるらしい。
Win用のtracertコマンドはpingコマンド同様に以下のようにして使う。

> tracert 216.239.33.101



ネットワークインターフェースの定義を起動時に自動的に行う方法。
/etc/network/interfaces というファイル内にネットワークインターフェースの設定をまとめて書いておくことができる。 /etc/init.d/networking が起動時に実行されれば、このファイルの設定を行ってくれる。
以下に例をあげる。

auto lo eth0                    #自動起動の定義
iface lo inet loopback          #loインターフェースにloopback127.0.0.1を定義
iface eth0 inet static          #eth0インターフェースに
        address 192.168.0.4     #  静的なIPアドレスを定義
        network 192.168.0.0     #  ネットワークアドレスを定義
        broadcast 192.168.0.255 #  ブロードキャストアドレスを定義
        netmask 255.255.255.0   #  ネットマスクを定義
        gateway 192.168.0.1     #  ゲートウェイのアドレスを定義

もしスイッチングハブではなく、ダムハブ(バカハブ)を買っていれば、家庭内でネットワークスニファ(監視)ができた。 今思うと残念でならない。
ちなみに最近、週K文春で「ねっとわーくすにふぁ怖イヨ怖イヨ怖イヨプぷらいべーとナめーるモうぇぶモミーンナ丸見エダヨヽ(`Д´)ノウワーン」みたいに(なんと11/7から2週連続で)掲載していた。
ある意味、「パケットなんだから、見えて当り前」だ、と納得。 全く見えなかったら相手に届かないしね☆

参考文献
Linuxルータの導入とネットワークの設計
トニー・マンシル著
河村政雄訳
ピアソンエデュケーション出版

整然と設置されていると第三者が触ったりいじってみようという気を起こしづらいので、ルータは整然と設置すべきだ とまで書いてあるシステム管理者向けの面白い本。 システム管理者って大変だ。
学校図書室で発見。N教授の本のそばにあった。(ワラ

Debian GNU/Linux, WindowMaker をよりよく使うためのユーザ設定

WindowMakerを使いこなしたい

WindowMaker(以下wmakerと略すかも)はXウィンドウマネージャの一種である。 ここではwmakerの「見た目」を追求していく上でのポイントを述べるだけにする。 筆者がdebパッケージ生活をしているためwmakerのインストールからの話が書けないだけであることをお詫びしておく。
筆者の使用しているのはversion0.80、その前は0.6X系であったと思われる。

日本語を使うためにしたこと
~/GNUstep/Defaultディレクトリ内にwmakerの設定のためのファイル群がある。

WMGLOBAL, WMRootMenu, WMState, WMWindowAttributes, WindowMaker

これらがあると思う。

WMGLOBAL

WMGLOBALの中身は

{
  MultiByteText = YES;
  SystemFont = "-*-helvetica-medium-r-normal-*-%d-*-*-*-*-*-*-*,-*-*-medium-r-no
rmal-*-%d-*,-misc-fixed-medium-r-normal-*-%d-*-jisx0208.1983-*";
  BoldSystemFont = "-*-helvetica-bold-r-normal-*-%d-*-*-*-*-*-*-*,-*-*-medium-r-
normal-*-%d-*,-misc-fixed-medium-r-normal-*-%d-*-jisx0208.1983-*";
}

のようになっている。 MultiByteTextをYESにすることにより日本語のような2バイト文字をタイトルバーやメニューに使用するのが許可されるのだ。
なおSystemFontやBoldSystemFontはいまいちよく分からない。 だが、これらのフォントが「アイコンやドックの設定ウィンドウ内のフォント」「WPrefsの表示に使われるフォント」「ポップアップバルーン内のフォント」として使われている。 WPrefsでは大きめ(16ポイントくらい)の日本語フォントを使うと設定ウィンドウ内の日本語文が切れてしまい(文字の表示領域をはみ出してしまうみたい?)悲しいことになるのでご注意を。

※WprefsはwmakerのためのGUI設定ソフト

WMRootMenu

次にWMRootMenuの中身はだいたいこうである

"/home/my_login_name/GNUstep/Library/WindowMaker/menu.ja"

menu.jaは日本向けのルートメニューの初期設定ファイルである。 筆者の環境では/etc/X11/WindowMakerなどに各国のユーザー向けのメニュー設定ファイルが詰まっている。 これを~/GNUstep/Library/WindowMaker/menu.jaとしてコピーした。 ただこの方法だと、手元にコピーしたmenu.jaをエディタで編集することによってルートメニューに新たな項目などを加えていく方法をとらざるをえない。 WPrefsによりGUIからメニューを編集するという方法もあるが筆者は試したことはない。

menu.jaの例はこちら。 筆者の普段使っているものをほぼそのまま載せた。 何かの参考になれば幸いである。

WMWindowAttributes

次はWMWindowAttributesだが、これはwmakerが自動で編集する類のものであるらしい。 これの手動編集を勧める輩は世の中にそう多くはないようで、筆者もこれに倣うことにしたい。 どのアプリケーションにどのアイコンを設定するか、タイトルバーなどをつけないアプリケーションはどれかなどの情報が記録されている。 例えばkinput2+canna使用時にモジラのウィンドウの下部分にくっつく[ あ ]ウィンドウ(名前を知らない)などは

  "mozilla-im-status.MozillaImStatus" = {
    NoResizebar = Yes;
    NoCloseButton = Yes;
    NoTitlebar = Yes;
    NoMiniaturizeButton = Yes;
    Unfocusable = Yes;
  };

のように記述されていた。
ちなみにその昔Netscape4.7を使っていた頃、 日本語入力をしようとC-oを押すと [ あ ]ウィンドウ(名前を知らない)とNetscape自身との フォーカスの取り合いが起こり入力が非常にしづらくなる、 という現象があったため/usr/share/WindowMaker/Defaults/WMWindowAttributesというファイルに以下のように書き足した(外側のカッコ{}の中にはいれてあげるわけだが・・)記憶がある。

Kinput2 = { 
  NoTitlebar = Yes; 
  NoResizebar = Yes; 
  NotClosable = Yes; 
  NotMiniaturizable = Yes; 
  KeepOnTop = Yes; 
  Omnipresent = Yes; 
  SkipWindowList = Yes; 
  NoHideOthers = Yes; 
  NoKeyBindings = Yes; 
  NoMouseBindings = Yes; 
  KeepInsideScreen = Yes; 
  NoAppIcon = Yes; 
  Unfocusable = Yes; 
  DontSaveSession = Yes; 
};

なにやら~/GNUstep/Default/WMWindowAttributesにも書き込む必要がある場合もあるらしい・・・。 ただ、これを記述してもフォーカスを取り合ってしまう場合があるらしい。
なんともはや・・・

WindowMaker

そしてWindowMakerというファイル。 これがタイトルバーにどの色を使うかどのフォントを使うか、背景はどうするか・・・などの「見ため」関する記述が連なっている。 何か「テーマ」を適用したあとはこのファイルが即座に書き換えられるらしく、 ダウンロードしてきたテーマを適用してみたが付属の背景が気に入らなかったといった場合にはこのファイルを編集するだけで背景だけを変えたりできるので(テーマの作者さんには悪いけれども)何かと便利だ。 テーマのデータファイル自体に影響はないのでおすすめかと・・・(何

日本語フォントを一括設定するwsetfontコマンド

ちまたでダウンロードできるテーマはたいていASCII文字に対する設定しかなされていない。 ただ、そう感じるのは日本人が2バイトのひらがなや漢字を普段つかうからであって、ASCII文字しか使用しない某国の連中にとってはそんな設定は不必要でありむしろ邪魔なのだ(ろう)。 よってダウンロードしてきたテーマを適用した途端タイトルバー、メニュー、アイコン、クリップetcのフォントが変わってしまうことがしばしばある。 日本語フォントの設定はないため、日本語フォントは解読不能なコードとなって表示されたりしてしまう。 (wmakerのversion0.80くらいともなると、日本語フォントを何とか表示しようとがんばってくれる、ビットマップフォントをモトにしているので、あまりきれいな文字にはならなくて悲しいのだが・・)
あらかじめ『タイトルバーはこのフォント、メニューのタイトルはこのフォント・・・』という感じで決めておき、テーマを変更した際などに文字が化けたときそれを呼び出すことができる。 筆者の場合~/GNUstep/Defaults/WMGLOBALと、/usr/share/WindowMaker/Defaults/WindowMakerという二つのファイルにフォント設定を書いた。
~/GNUstep/Defaults/WMGLOBALは上記にある通りである。 SystemFontBoldSystemFontはここで指定されているわけだ。

/usr/share/WindowMaker/Defaults/WindowMakerの中の一部を

WindowTitleFont =
"-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-iso8859-1,-*-fixed-medium-r-normal-*-
14-*-*-*-*-*-jisx0208.1983-*";
MenuTitleFont =
"-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-iso8859-1,-*-fixed-medium-r-normal-*-
14-*-*-*-*-*-jisx0208.1983-*";
MenuTextFont =
"-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-1,-*-fixed-medium-r-normal-
*-14-*-*-*-*-*-jisx0208.1983-*";
IconTitleFont =
"-*-helvetica-medium-r-normal-*-8-*-*-*-*-*-iso8859-1,-*-fixed-medium-r-normal-*
-10-*-*-*-*-*-jisx0208.1983-*";
ClipTitleFont =
"-*-helvetica-bold-r-normal-*-10-*-*-*-*-*-iso8859-1,-*-fixed-medium-r-normal-*-
10-*-*-*-*-*-jisx0208.1983-*";
DisplayFont =
 "-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-1,-*-fixed-medium-r-normal
-*-14-*-*-*-*-*-jisx0208.1983-*";

のように書きかえた(らしい)。←ずいぶんと昔のコトなので忘れ気味・・・
大抵名前を見れば分かると思うが

  • WindowTitleFont ではウィンドウのタイトルバーで使うフォントを指定、
  • MenuTitleFont ではメニューのタイトル部分で使うフォントを指定、
  • MenuTextFont ではメニューの各項目内で使うフォントを指定、
  • IconTitleFont ではアイコン(ウィンドウを最小化したときに表示される)上で使うフォントを指定、
  • ClipTitleFont ではクリップ(ダブルクリックするとランチャー?が出たり消えたりする、デフォルトでは画像ファイルをドロップすると背景に設定してくれたかな・・・、)上で使うフォントを指定、
  • DisplayFont ウィンドウの現在位置(+200, +621とか)などを表示するとき(ウィンドウを移動させるときなどに見られる)に使うフォントを指定する。
  • あとついでにLargeDisplayFontというのもあり、これはどうやらワークスペースの移動の際に今いるワークスペース名をテレビのテロップのように一時的に表示させる際に使用するフォントの指定だと思われる。
    たぶんこれも指定しないとテロップが化ける可能性があるので要設定だろう。

フォントは " で囲んだ中に , でASCII文字用のフォント名と日本語文字用のフォント名を区切って書くようだ。 前のバージョン(0.6系?)ではワイルドカードを書かずにフォント名に多用されるハイフンを続けて書くと、どうもうまくフォントをロードしてくれなかったような気がする。 皆様ご注意を・・・。

かくのごとくファイルを編集したら

$ wsetfont japanese

と打つことにより、設定したフォントが適用されるようになる。

じつは筆者は『テーマのデータファイル(styleというファイル)の中で全てのフォントを指定』しているため、wsetfont を全然使用していない・・・。 だからLargeDisplayFontを指定しなくても涼しい顔をしているわけだが・・・。

Debian GNU/Linux, PPxP オンデマンド接続 on kernel 2.2.x

PPxPオンデマンド on kernel2.2.x(スクリプト作成)

PPxPというのは、オンデマンド接続に対応している。 外に出ようとする通信があると、それを察知し、勝手に繋いでくれるという機能だ。 ちょうど「イソターネットエクスプローラを起動したら自動的にインターネットに繋いでくれて、M$Nのトップページを表示してくれるんだよ 便利だよね」というのとだいたい一緒だろう。

ところが、この便利な機能は、カーネル2.1.xの後半くらいからそれ以降のものではちょっと調子が悪いのである。 びっくりである。 ちなみに筆者のDebian BOX、カーネルのバージョンは2.2.17である。 ジャストミートした。 筆者は、懸賞などの抽選に洩れなかったことは今までに一度もないくせに、こういうのにはよく洩らさず当たる。 森永チョコボールのエンゼルマークに、人生のうちのすべてのツキを捧げているのだからしようがあるまい。
それはいいとして、この機能がどう調子が悪いのか述べよう。
オンデマンド(オートモード)をONにすると、インターネットに繋ごうとしても、プロバイダ外への通信ができなくなり、この症状はppxpdを切るまで(quitするまで)ずっと続く、というもの。 (公式ホームページの詳細情報
なお、公式ホームページにある「対処方法」にある通り

仮アドレスとして127.0.0.xを使わない。 例えば、一度手動で接続し、その時のIPアドレスを仮アドレスとしてIP.LOCALに設定する。

という方法を用いると確かにうまくいくのだ。 具体的には

  1. 手動で接続する
  2. そのときのIPアドレスを/sbin/ifconfigや、ターム上でppxpのプロンプト(ppxp>)を出し、printと打って変数IP.LOCALに入っている値を見る
  3. 切断する
  4. ターム上でppxpのプロンプト(ppxp>)を出し、変数IP.LOCALにさきほど調べたIPアドレスを代入する(set IP.LOCAL xxx.xxx.xxx.xxxのようにすればよいだろう)
  5. オートモードをONにする
  6. オンデマンド準備完了、また繋ぐ

.............面倒だ。 筆者は面倒なことは好きではないのだ。

PPxPには「接続確立時と切断時にスクリプトを実行する」ことができるという機能がある。 人によっては「インターネットに繋いだときにニュースグループからニュースを取ってくるようにした」とか「インターネットに繋いだときに日本の時計サーバーに繋いでPCの時計と同期させる」といった使い方をしている。 たしかにこれは便利な機能かもしれない。 筆者は今までこの機能をずっと眠らせていた。 PPxPオンデマンド接続機能を実現するにはこれを利用しない手はない。

どうやってスクリプトを扱うのか。 主にユーザ権限でこの機能を利用する場合を紹介する。

実行させたいスクリプトは、~/.ppxp/rc/に置いておく。 筆者は~/.ppxp/rc/ondemand.rcというスクリプトを書いた。 書いたスクリプトはchmodコマンドで実行形式にすることを忘れないようにしよう。

次に~/.ppxp/ip/にテキスト形式のファイルをつくる。 筆者は~/.ppxp/ip/reconnectというファイルを作った。 これのほかに、~/.ppxp/ip/というディレクトリが無かったのでmkdirで作ったりもした。

最後に~/.ppxp/conf/fooなどのppxpでプロバイダなどへ繋ぐ際の設定が書かれたファイル内を編集する。

スクリプト~/.ppxp/rc/ondemand.rcは以下のようにした。 # 筆者は家じゃbash関白である(謎

#!/bin/sh
export PATH="/usr/bin:/bin:/sbin:/usr/sbin"

case "$1" in
    up)
 case "$PPXP_PHASE" in
     Dead)
  ;;
         *)
  ONDEMAND1=`ppxp foo -C show mode`
  case `echo $ONDEMAND1 | grep AUTO` in
      "")
          ONDEMAND2=`ppxp foo -C print IP.LOCAL`
   ONDEMAND3=`expr "$ONDEMAND2" : "IP.LOCAL=\(.*\)"`
   ppxp foo -C disconnect
   ppxp foo -C disconnect
   ppxp foo -C set IP.LOCAL "$ONDEMAND3"
   ppxp foo -C auto on
   ppxp foo -C connect
      ;;
  esac
      ;;
 esac
 ;;
    down)
 ;;
esac

もしPPxPで接続(手動)したら、そのときの変数IP.LOCALの値(IPアドレス)をとっておく。
そうしたら切断する。 切断のためのコマンドが連続して2つあるのは、すぐに切断したいからである。
切断すると、変数IP.LOCALは最初の127.0.0.1/0.0.0.0という値に戻ってしまう。 よって、変数IP.LOCALにさきほどとっておいたIPアドレスを代入する。
代入してからオートモードをONにする。
また接続する。
するとまたこのスクリプトを実行することになる。
現在のモードがオートモードかどうかをチェックし、オートモードならスクリプトではなにも実行させずに終えるようにする。
これでオンデマンド接続を行える状態になる。

ただ単に「自動でオンデマンド接続OK状態に持っていかせる」だけだが意外に苦労した。 今までスクリプトはほとんどやったことがなかったので、何度もスクリプトをループさせてしまったりした。 接続させるたびにスクリプト内の切断コマンド、接続コマンドを実行してしまうので、繋いだり切ったりをえんえんと繰り返すのである。
とても面白い光景だったが、それでは人を楽しませること以外なんの役に立たないので改良を重ねた。

ファイル~/.ppxp/ip/reconnect
このファイルは以下のようになっている。

start ondemand

これだけ、1行だけ。 ondemandというのは、上記のondemand.rcのことだ。 拡張子は書かないのだ。
もっとその他のスクリプトを~/.ppxp/rc/に作り、それも実行したいのなら

start ondemand
start foo
start fooo
start foooo

のように書けばいい。
なお、スクリプトondemand.rc、foo.rc、fooo.rc、foooo.rcは~/.ppxp/rc//etc/ppxp/rc/などに置く。

設定ファイル~/.ppxp/conf/foo
これは普段PPxPでプロバイダにつないでいるときに使っているものを利用すればいい。 以下は筆者が普段使っているもの(修正あり)である。

source qdial
set MODE active
set AUTH.PASSWD foo
set LOG.FILE foo.log
set LINE /dev/ttyS0
set DIAL.TYPE Isdn
set DIAL.LIST 0123456789PA/10
set AUTH.PROTO PAP
set SERIAL.MODEM aterm
set IDLE.INIT 0
set IP.VJ yes
set IP.RESOLV yes
set IP.DNS xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy
set Initialize "ATH0E1Q0V1X3$N9=10$N1=1&D0&C1"
set IP.START reconnect    # ここでスクリプトを指定している

最後の1行だけ加える。 変数IP.STARTにセットされたものをPPxP起動時に実行する。 同様にして変数IP.STOPをつかえばPPxP終了時に行いたいスクリプトの指定ができる。

お願いとか
こんな強引な方法ではなくもっといい方法があるぞという方は、掲示板もしくはメールでよろしくお願いします。
#はじめてのスクリプトなものでして....(^^;

Debian GNU/Linux, Windows98 も インストール

そういやデュアルブートしました

最近PCをあまりいじっていない、 かと思っていたが、そういえばこのあいだマルチブート(DOS/V)に挑戦したので 少しだけ記しておこう。 筆者が行ったのはLILOを用いたLinuxとWindows98の同居であった。

ハードディスク構成はもともと、次のようであった。

0        10        20       30        40 (GB)
|--Linux--|------------FREE------------|

40GBのハードディスクの後半の3分の1はガラ空きなのだ。 もったいないこと限りないので、残りの領域には窓の98にでも入ってもらうことにした。

普通、マルチブートをする際は、ハードディスクの一番最初の基本領域を窓のCドライブとして使うのがいいとされている。 あと、ペンギンと窓のデュアルブートをする際などは、「窓を先にインストールしておく」のが望ましいとされている。
そう、それはいきなりの苦境(w)だった。 筆者の環境では、一番最初の拡張領域はLinuxに使われている。 もちろん、Linux BOX に窓を入れなくてはならない。
debianをインストールしたころはこのようなマルチブートの知識は皆無だった。 後悔である。
気を取りなおして、パーティションの構成を見ていこう。

+-------------------------------------+
|  +-------------------------------+  |
|  |          Linux ext2           |  |
|  |              /                |  |
|  |          (/dev/hda1)          |  |
|  |            1.5GB              |  |
|  |           Primary             |  |
|  +-------------------------------+  |
|                                     |
|  +-------------------------------+  |
|  |  +-------------------------+  |  |
|  |  |      Linux ext2         |  |  |
|  |  |          /usr           |  |  |
|  |  |      (/dev/hda5)        |  |  |
|  |  |           3GB           |  |  |
|  |  |         Logical         |  |  |
|  |  +-------------------------+  |  |
|  |                               |  |
|  |  +-------------------------+  |  |
|  |  |       Linux ext2        |  |  |
|  |  |           /var          |  |  |
|  |  |       (/dev/hda6)       |  |  |
|  |  |          3.25GB         |  |  |
|  |  |         Logical         |  |  |
|  |  +-------------------------+  |  |
|  |                               |  |
|  |  +-------------------------+  |  |
|  |  |       Linux ext2        |  |  |
|  |  |          /home          |  |  |
|  |  |       (/dev/hda7)       |  |  |
|  |  |         1.75GB          |  |  |
|  |  |         Logical         |  |  |
|  |  +-------------------------+  |  |
|  |                               |  |
|  |  +-------------------------+  |  |
|  |  |        Linux swap       |  |  |
|  |  |          swap           |  |  |
|  |  |       (/dev/hda8)       |  |  |
|  |  |          0.5GB          |  |  |
|  |  |         Logical         |  |  |
|  |  +-------------------------+  |  |
|  +-------------------------------+  |
|                                     |
|  +-------------------------------+  |
|  |            FAT32              |  |
|  |          Win98 C:             |  |
|  |         (/dev/hda3)           |  |
|  |             3GB               |  |
|  |   Primary Bootable(Active)    |  |
|  +-------------------------------+  |
|                                     |
|  +-------------------------------+  |
|  |            FAT32              |  |
|  |           Win98 D:            |  |
|  |         (/dev/hda4)           |  |
|  |          残り全部GB           |  |
|  |            Primary            |  |
|  +-------------------------------+  |
+-------------------------------------+

のようにしようということにした。
4つしか作ることの許されていない基本領域を2つも窓に捧げるとは、窓に優遇しすぎである。

窓98のインストールを始める前にすること
ベタだが、「バックアップは取ろう」とかそんな話だろう。 筆者はもちろんとらなかったが.....。
筆者が思うに、バックアップに匹敵する程大事なことがある。 それはLinuxを起動させるための手段を用意しておくことである。 悪名高き「HDのMBRを窓起動専用に上書きされてしまうトラップ」に対抗するためである。 もし仮にWindowsのインストールに成功してしまえばハードディスクからはWindowsしか起動できなくなる。 このとき、Linuxの起動フロッピーがなければもう二度とLinuxを起動できなくなるかもしれないのである。 (ぇ?loadlin.exe使うって?それは失礼しました)
Linux起動用フロッピーをもう既に持っている人もあろうかと思う。 これは直接カーネルにアクセスするものである。 できればWin98も一緒に起動できるようなフロッピーができたら嬉しい。 これを叶えるには、LILOをフロッピーにインストールするのがよいと思う。
筆者の環境では、/etc/lilo.confがliloの設定となる。 rootで以下のようにファイルを書き換え、/sbin/lilo -vを実行した。

  lba32
# boot=/dev/hda    # MBRにLILOをインストールせよ、という意味
  boot=/dev/fd0    # フロッピーにLILOをインストールせよ、という意味
  root=/dev/hda1
  install=/boot/boot.b
  map=/boot/map
  delay=20
  vga=normal
  default=Linux

  image=/vmlinuz
        label=Linux
        read-only
  image=/vmlinuz.old
        label=LinuxOLD
        read-only
        optional
  other=/dev/hda3
        label=win
        table=/dev/hda

これにより、フロッピーディスクをドライブに入れたままPCを起動すると、LILOが上がるようになる。 2秒待つと勝手にlinuxが上がり、シフトを押してLILOのboot:プロンプトを出して"win"と打てばwindowsが起動するという次第である。

窓98のインストールを始めることにする。 窓98のインストールディスクはあるのだが、これを読むためのフロッピーディスクがないので作ることにする。 窓98のインストーラ起動のためのディスクを作る際のポイントはCD-ROMを扱えるようにすることのようである。
Win98起動用フロッピーディスクは通常2枚要るのだが、これは1枚で済むのがよい。 (ただ、要らないファイルを消すだけだが.....) まず、だれかからWin98マシンを借り、「コントロールパネル」の「アプリケーションの追加と削除」からフロッピーディスクを起動専用でフォーマット。 (マイコンピュータ→Cドライブ→右クリック・フォーマットで「起動専用」フォーマットをしても失敗した) フォーマット完了後にフロッピー内の要らないファイルを消し、必要なファイルをWin98マシンからコピーする。 とりあえず必要なファイルを記す。

ank16.fnt     biling.sys    config.sys    format.com   jfont.sys    mscdex.exe
ank19.fnt     btcdrom.sys   drvspace.bin  himem.sys    jkeyb.sys    msdos.sys
command.com   edit.exe      io.sys        jkeybrd.sys  oakcdrom.sys
autoexec.bat  fdisk.exe     jdisp.sys     kanji16.fnt

ただし、autoexec.batとconfig.sysは自分で編集をしたもの、oakcdrom.sysはWin98マシンのCD-ROMドライブのドライバである。 お使いのCD-ROMドライブのドライバを使用することをすすめる。 ただ、CD-ROMドライブの仕様に各社大差がありそうもないので、案外他社のドライバでも動いたりしてしまう。

次に、実際に用いたautoexec.batとconfig.sysの中身を紹介。

autoexec.batの中身

  @echo off
  LH MSCDEX.EXE /D:MSCD001 /L:Q

config.sysの中身

  FILES=60
  BUFFERS=20
  DOS=HIGH,UMB
  LASTDRIVE=Z
  SHELL=A:\COMMAND.COM
  DEVICE=HIMEM.SYS
  DEVICEHIGH=BILING.SYS
  DEVICEHIGH=JFONT.SYS /MSG=OFF
  DEVICEHIGH=JDISP.SYS /HS=LC
  DEVICEHIGH=JKEYB.SYS
  DEVICEHIGH=OAKCDROM.SYS /D:MSCD001
  REM DEVICE=BTCDROM.SYS /D:CDROM001

autoexec.batでは、CD-ROMをQドライブとしてアクセスするように書いた。
config.sysでは、DEVICEHIGH=OAKCDROM.SYS /D:MSCD001のように書いてCD-ROMドライバを指定している。 なお、REMで始まる行はいわゆる「コメントアウトされる」のと同じ状態になる。 よって、最後の行はコメントアウトされているわけである。
最後に言うのも何だが、このファイルの文字コードはShift-jisにしよう。

起動フロッピーができたら、ドライブに挿してPCを起動する。 フロッピー内に必要ファイルがあり、上記2つのファイルが適切に書かれているようなら

Starting Windows 98 ....

などと表示され、command.comが動き出す。 ただ言っておくが、ここでWindows 98が本当に起動したわけではない。 善良なユーザはこのメッセージにだまされないようにしたい。 ちなみに、ここでうまく"Windows 98"があがらず

PRESS A KEY TO REBOOT

といわれてしまい止まってしまう場合は、今度からSHIFTキーを押しながらPCをブートするとうまくいく場合があるようである。

さて、うまくWindows 98が起動したら、以下のようなプロンプトが出ているに違いない。 autoexecを実行しているのは、こうしないとCD-ROMドライブを認識してくれないからである。 うまく認識しないとき(以下の例の場合ではQドライブへ移動できない場合など)はこのautoexecを実行してみるといいかもしれない。

A:\> fdisk
A:\> format D:
A:\> format C:
A:\> autoexec
A:\> Q:
Q:\> setup

fdiskでパーティションを整え、ドライブのフォーマットを行い、CD-ROM上のsetup.exeを実行するのが基本的なセットアップ方だろう。 窓98のfdiskは機能があまりよくなく、ドライブDを複数の論理ドライブとして切ることを許さなかった。 なお、setupにいろいろな引数を付けて実行することもできる。 どんな引数があるのか見るには普通にQ:\> setup /?でよい。 とりあえずこれで、Win98のインストールが開始する。

インストールが終わったら、窓起動専用に書き換えられてしまった哀れなMBRを救済しよう。 Linuxの起動ディスクや、LILOをインストールした起動ディスクなどを用いてLinuxを起動させる。 lilo.confを書き換え、LILOをMBRにインストールしてしまえば、MBRからLinuxもWindowsも起動できるようになる。

おまけ情報1
筆者の環境では、ドライブDが正常に扱えないという悲しい自体に陥った。 LBAの設定がダメなんだよゴルァ、とWindowsから言われてしまったので、 マザーボードにくっついてきた「PertitionMagic6.0」を使用してみた。 なんとかD:にアクセスできるようにはなったが、いまだ恐ろしくてドライブDはあまり使用していない。 Win98に3GBしか使っていないのはちょっと恥ずかしい。

おまけ情報2
なぜCドライブだけbootableのフラグが上がっているのだろう。 筆者もすこし再考してしまった。
Windowsの起動ディスクを用いてWindowsを起動したいときに、Windowsのインストールされたパーティションを発見させるためだったと思う。 DOS/V自体が窓のために作られたハードであったことの名残であろう。 Windowsのブートでは、最初に見つけた「bootフラグのついているパーティション(Active)」をWindowsのインストールされたパーティションだと頭ごなしに決めつけてしまう。 (だからwin9x同士の同居もしづらいんでしょうね、NTローダとかいうのはもうちょっと高機能らしいのだが....)
それからWindows9xのfdiskであるが、これは2つ以上の論理領域がつくれないとかいう噂を聞いた。
┐(´ー`)┌これだからげいつOSは.....、と思ったものの、Linuxのcfdiskでもできなかった.......。 linuxのfdiskはどうだろうか、今度試そうと思っている。

Debian GNU/Linux, ライブラリの恐怖(もし、ldconfigとlddが消えたら...)

ライブラリの恐怖(もし、ldconfigとlddが消えたら...)

ヤツはあまりにも、強く、そして、レアだった。
筆者にDebianの再インストールすら考えさせるほどの強敵であった。 ヤツとはだれか? それはライブラリであった。

IRC狂の筆者にとって、IRCボットというのはとても魅惑的に見えた。 もちろん、今も使っている。 それはplumである。(たぶんココ>http://plum.madoka.org/)
指定された人に対し勝手になるとは配るは、伝言は預るは、特定の語に対して勝手に返事をしてくれるは、ログを盗り続けてくれるは........まさしくボット導入はIRC狂の夢である。 (次なる筆者の夢は、家庭でirc鯖(ircd)を上げて.....とかだったり.....) もちろん、クライアントソフト単体で自動でなるとを配ってくれたりログを盗ってくれたりする、そういうよくできたソフトもあるが、 plumならば、クライアントソフトに何を使おうが、上記の役目を果たしてくれる。
かくして、筆者は「自動オペレータ機能」を求め、plumを導入することを決める。 しかし、だいぶ後になってから、irchat-PJ(http://irc.fan.gr.jp/pj/)という、自動オペがクライアント単体で実現されているものを見つけてしまったりする。
まあ、世の中そんなもんだろう........。
ただし、必要なものはPerl(ver.4.036以上)@linuxである。 MS-DOSならばネットワーク対応のPerlをわざわざ使わねばならない。 (筆者はwin版を使ったことはないが、どうやらwin版だと、わざわざDOS窓上げてコマンドを打たねばならんらしい、まあ、当り前か)

話が脱線しかけた。 筆者は上記の理由で、plumを導入することにした。 バージョンは2.33.1-9。 このバージョンのplumをいれるには、libc6の2.2.4-7が必要だということなので、 後先考えず、筆者はlibc6を2.1.3-10から2.2.4-7へアップグレードしてしまう。

それが苦労の始まりとなるとは、当時、思いもしなかった。

libc6というのはその名の通り、ライブラリである。 当時の筆者にとってライブラリというものの認識はまったくもって低く、 今でもこの軽はずみな行動を悔いている。

ライブラリをアップグレードして、まずエラーを吐いたのは、 日本語漢字変換のcannaであった。 boot時にcannaサーバと繋げないというエラーが出るのだ。 もちろん、そんな状態では、まともに日本語を打つことはできない。 kinputでひらがなの入力はできても、cannaと繋がらないため、 漢字に変換することができないのである。 そのため、ircではひらがなでしか喋ることができず、まわりに迷惑をかけてしまった。 ひらがなだけで喋れば、それは大変読みにくいものである。
その後、wmaker、kterm、mozilla、netscapeなどでも異常が発生することが判明した。 wmakerでは日本語が使えなくなり、日本語が表示されるはずの場所が全て 化けてしまい、どうしようもなくなる。 ktermでも同様。 mozilla、netscapeでは「ロケールがサポートされてない」というエラーが吐かれた。

多くのアプリケーションは、かくのごとく、ライブラリというものに依存している。 当のライブラリを勝手に変えてしまっては、動くものも動かなくなるのは当然のことである。
そこで筆者はlibc6(ライブラリ)を前のバージョンに戻すことを決意するのであった。

悲劇のはじまり
筆者はlibc6のダウングレード(2.2.4-7から2.1.3-10)を行う。 だが、このダウングレードも$ dpkg -Cというコマンドを打つと、「完璧にインストールされていない」と認識されていた。
とりあえずplumの2.33.1-9を消して、2.33.1-2.1をいれようとしたときだった。

dpkg: 'ldconfig' not found on PATH
dpkg: 1 expected program(s) not found on PATH
NB: root's PATH should usually contain /usr/local/sbin, /usr/sbin, and /sbin

このようなエラーがdpkgの最中に出て、dpkgの実行が止まってしまうのだ。 そこで、上記のエラー出力の中の3つのPATH、/usr/local/sbin、/usr/sbin、/sbin を調べてみると、確かにldconfigというコマンドが存在しない。 さらに調べてみると、ldconfigのみならず、lddというコマンドも消えていた。 dpkg関連のコマンド、つまり、ソフトのインストールやアンインストールを行いたいときには必ずこのldconfigが存在しないというエラーが出てしまい、作業が止まってしまうのである。
ライブラリをダウングレードしようにも、ldconfigが消えたため、手も足もでない。
アンインストールもインストールもldconfigが存在しないというエラーによって止まってしまう。 もちろん、ldconfigとlddの入っているパッケージ(ldsoという)をインストールする、ということもできはしない。 筆者はこんな八方塞がりの状態に陥ってしまったのだ。
#こういう状態も でっどろっく っていうんでしょうかね?

筆者はDebianの再インストールを考えた。 もちろんそうすればまっさらな、正常な状態から始められる。 しかし、いままで積み上げてきた「Xの設定」「日本語の設定」「PPxPの設定」「ウィンドウマネージャの設定」.....そういった全てを失ってしまう.....。 再インストールと言う道は、一番手っ取り早い逃げ道ではあるが、その逃げた先には再設定という茨の道が待っているのだ。


一から出直すのはいくらなんでも嫌である。

なんとしても、ldconfigとlddを復活させなくてはならない。

第1の方法
Linuxを使っている人に、「ldconfigくれ」と言ってみた。 しかし、気持ちが伝わらなかったらしい。 もらうことはできなかった。

第2の方法
ネット上から探してみる。 それらしきものはあるのだが、BSD用っぽく、コンパイルすら通らなかった。

第3の方法、ついに.....
debianインストールCDをマウント、そして、超強引に ldsoパッケージを探す。

$ mount /cdrom
$ find /cdrom -iname 'ldso*'

結果として、ldso_1.9.11-9.debというものが見つかった。 これを# dpkg -i --force-bad-pathコマンドで インストールをする。
結果的には強引なこの方法で/sbin/ldconfigと/usr/bin/lddが復活する。 ヤツを打破した瞬間であった。

原因
なぜ、二人(ldconfigとldd)はいなくなってしまったのか、その原因を追求してみた。 すると、このようなホームページ(MLだろうけど.....)を発見した。
https://linux.rice.edu/pipermail/rlug-discuss/2000-October/001009.html
訳せって?
ldsoパッケージからldconfigとlddの2つが、バージョン2.1.93のlibc6に移された。 (ついでに、若いバージョンのlibc6 2.1.93 はldconfigを持っていないらしい。)

筆者の環境に置き換えてみると.....

  1. ircボット駐在ソフトのplumインストールのため、libc6のバージョンを上げた。
  2. 新しいlibc6のldconfig、lddが使えるようになる?
  3. libc6のダウングレードをしようとする。
  4. その途中、ldconfigとlddもダウングレードに従って、消える?
  5. だけどldconfigがないとアンインストールなどがまともにできない。
  6. よって、ダウングレードがうまくできない。<$ dpkg -C の出力より
  7. いろんなアプリケーションが正しいライブラリを参照できなくて、異常をおこしまくる。

こんな感じだろうか? よくわからん。 だが、この「ldsoからlibc6へと二人(ldconfig、ldd)が移された」という仕様に問題がありそうではある。

もし、あなたのパソコンからldconfigとlddの二人が消えたら、 libc6のバージョンとldsoパッケージをチェックしてみてほしい。

Debian GNU/Linux, コンパクトフラッシュカードを使う

Debian カーネル2.2.17 でコンパクトフラッシュカードを使う

いきなり最近の話となる。 最近とはいつなのかと言えば、2002年の3月である。

ダIクマというディスカウントストアにてコンパクトフラッシュカード(以下CFと省略するかも)を購入した。 買ったのは32MBのものだ。 もともとSharpのZaurus(MI-P2)を持っており、こいつでCFを読めるということで、便利かなと思い、買った。 ただし、説明書にはZaurus MI-P2で32MBのCFを読めるとは書いてはいなかった。 この時点でメーカー保証外である。 今回はメーカー保証外の事ばかり載せている。 もちろん筆者も保証はしないが。
さて、話をもどすことに。 実はそこらの電気屋よりこのディスカウントストアでの方が安くCFを売っていた。

だけどこれまた、CFなんか買ってはみたものの、まだZaurus本体のメモリがいっぱいになったワケでもないし、パソでCF読めるわけでもないし、全っ然CFを使わなかったのである。 これでは何のために買ったのかわからないではないか。 これではいけないと思い、とりあえずパソコンでCFを読めるようにすることに挑戦するのであった。

まず、筆者は一台のWin95機を所有している。
だが、どのCF R/W(リーダ/ライタ)もUSBでパソに繋ぐ仕様だ。 Win95しかもPC98シリーズのマシンに、USBを扱わせるのは残念ながら不可能だった。 CFを使える環境はWin・Macユーザには広く問戸を開いてはいるが、ネット上で探した限りはLinuxでCFを読めるようにしてくれるような道具を見つけることが出来なかった。 CFを使うためにWin98以降のどれかをインストールせねばならないかとあきらめかけていたそのとき、ビxクカメラにて不思議な商品に出会ったのである。 名前はREX-CF03F。ラトックシステムの製品である。 パッケージにはLinux Readyとある。
linux ok のロゴ画像 ←このロゴ
店員に聞けば、ネットからCF R/Wのドライバを落として、それをインストールしてもらう形になる、とのこと。 メーカーホームページにはいくつかのLinuxディストリビューションでの動作報告(?)があったが、この製品に関してはRedHatとLaser5だけだった。 おそらくRHLもLaser5も新しめのバージョンに限ってのようだった。 (RHLなら7.1と6.2と6.1、Laser5なら6.2とのこと、2002.3現在のメーカーホームページより)
もちろんLinuxでこの商品を使うのはメーカーの保証外。 今の時代、これは当り前のことなのかもしれない。 WinやMacの独壇場のCF R/Wの世界にLinuxで殴りこみにいっているようなものだと己に言い聞かせる。 その日はすぐに商品を買わずに帰宅した。 いま一度、購入を検討してみたかったのだ。

やっぱり買う事に決めた。 もし今使っているDebian GNU/LinuxでCF R/Wが動かなかったとしてもしようがない、WinかRHLかどっちかをパソにインストールしよう、と思った次第だ。
まず説明書であるテキスト文書によれば、カーネルのバージョンなどにより大きく2種のインストール方法があるようである。
カーネルにドライバが組み込まれているか、いないかで大きく分かれるようである。 RHLの7.1にはすでに組み込み済みであるらしい。 これがカーネルのバージョンによる違いらしく、RHL7.2のカーネルは2.4.Xで、その他のRHL6.1や6.2やLaiser5 6.2では2.2.Xであるとのこと。 筆者の環境はカーネル2.2.17であるからして、後者の方である。 その場合はBackportパッチというものを当てて、カーネルを再構築しなければならない。 Backportパッチを当てることによりカーネル2.4.X並のUSB対応環境を得ることができるという。 なにやらむつかしいが、カーネルをどう構築するかをmake xconfigやmake menuconfigなどで設定するときに、USB関連の設定項目がパッチ当てる前よりも増えている、ということのようだ。 とりあえず筆者の落としたのはusb-2.4.0-test2-pre2-for-2.2.16-v3.diff.gzというもの。 (ここからDLした) このパッチファイルを落としたら準備は万端である。 インストール方法をざっと見ていく。
カーネル2.4.X系の方のインストール法は割愛。 だってこっちはやってないし。

説明書を参考にしたインストール方法。カーネル2.2.X系の場合。もちろんDebianでのお話。

  1. 基本的にrootで作業を行うのでrootでログイン。別に一般ユーザでログインしてからsuしてもよいかとは思う。
  2. まず落としてきたパッチを当てる。
    とりあえずカーネルソースを展開したディレクトリ(筆者の環境ならば/usr/src/kernel-source-2.2.17/)へとBackportパッチのファイルを持って行く。 このディレクトリはカーネルソースのインストールをしたことがない場合には現れないので注意(?)。 そしてそのディレクトリへとcdコマンドで移動した後
    # gzip -dc usb-2.4.0-test2-pre2-for-2.2.16-v3.diff.gz | patch -p1
    を実行しパッチを当てる。 だがおそるべき事に説明書によればここでパッチを当てている最中に3つのファイルに対するパッチを当てるかどうかについて聞いてくるプロンプトが出るらしいのだが、我が家の環境ではそれはなく、ノンストップでパッチ当てが終わってしまう。 説明書によれば、ここで聞かれる3つのパッチに対してはスキップするように書かれているのだ。 たぶんうちの環境では3つのファイルに対してパッチを当ててしまったに違いない。
  3. # make distcleanをひきつづき実行
  4. /usr/src/kernel-source-2.2.17/arch/i386/config.inというファイルの中を見る。
    source drivers/usb/Config.in
    という行が#でコメントアウトされていたら#を消しておく。 ここはほぼ説明書通り。
  5. この製品に合わせ、モジュールを変更する。
    /usr/src/kernel-source-2.2.17/drivers/usb/usb-storage.cというファイルを編集する。 とりあえずこういう作業の際にはバックアップをとることをお忘れなく。
    説明書通り3箇所に書き込む。 これに関しては説明書見ろよ、と言いたいところだが説明書をコピペしておく。 「-->」で始まる行を付け加えるのである。 「-->」無しで始まる行はもうすでにファイル内にある。 もちろん「-->」はファイル内に書き込まない。
    ☆☆☆編集一箇所目☆☆☆
    
       if ((us->protocol == US_PR_CB) && 
         (result == USB_STOR_TRANSPORT_GOOD) &&
         ((srb->sense_buffer[2] & 0xf) == 0x0))
      srb->sense_buffer[0] = 0x0;
    
    --> /* Some device need the time for setup media. */
    --> if ((us->protocol == US_PR_BULK) &&
    -->      (srb->sense_buffer[0] == 0x70) &&
    -->      ((srb->sense_buffer[2] & 0xf) == 0x2) ) { // Not ready
    -->   /* 3A - Medium not present */
    -->   if ((srb->sense_buffer[12] == 0x3a) ||
    -->   /* 0401 - in progress of becomming ready */
    -->       (srb->sense_buffer[12] == 0x04 &&
    -->        srb->sense_buffer[13] == 0x01) ) {
    -->         srb->result = srb->result | (DID_ERROR << 16);
    -->    srb->allowed = 1000; // Max retry count 1000
    -->   }
    -->  }
        }
    
    
    
    ☆☆☆編集二箇所目☆☆☆
    
     { 0x07af, 0x0005, 0x0100,
       "Microtech USB-SCSI-HD50", US_SC_SCSI, US_PR_BULK, US_FL_ALT_LENGTH}, 
    -->  { 0x0584, 0x0001, 0x0100,
    -->    "RATOCSystems,Inc. USB Compact Flash Adapter", US_SC_SCSI,
    -->    US_PR_BULK, US_FL_SINGLE_LUN | US_FL_ALT_LENGTH | US_FL_START_STOP},
    -->  { 0x0584, 0x0001, 0x0101,
    -->    "RATOCSystems,Inc. USB Compact Flash Adapter", US_SC_SCSI,
    -->    US_PR_BULK, US_FL_SINGLE_LUN | US_FL_ALT_LENGTH | US_FL_START_STOP},
    -->  { 0x0584, 0x0001, 0x0102,
    -->    "RATOCSystems,Inc. USB Compact Flash Adapter", US_SC_SCSI,
    -->    US_PR_BULK, US_FL_SINGLE_LUN | US_FL_ALT_LENGTH | US_FL_START_STOP},
     { 0x0000, 0x0000, 0x0,
       "", 0, 0, 0}
    
    
    
    ☆☆☆編集三箇所目☆☆☆
    
      /* now register  - our detect function will be called */
      ss->htmplt.module = THIS_MODULE;
        -->  /* some device need bulk-reset process */
        -->  if (ss->protocol == US_PR_BULK)
        -->   ss->transport_reset(ss); /* BULK RESET */
      scsi_register_module(MODULE_SCSI_HA, &(ss->htmplt));
      
  6. /usr/src/kernel-source-2.2.17/へcdしてから# make xconfigとか# make menuconfigなどでカーネルをどう再構築するかの設定をする。 前者はGUIで後者はCUIである。 主にUSB関連の設定をここでは行う。 とりあえずここでは説明書通りの設定を行うことにした。 これに関しても説明書見ろよ、と言いたいところだが説明書をコピーしておく。 うーむ、大サービスだな、これは。(ぉぃ
    # make xconfig# make menuconfigの画面で以下のところをチェックする。 [*]はカーネルに組み込む、<M>はモデュールとして扱うことをいう。
    • Code maturity level options → [*] Prompt for development and/or incomplete code/drivers
    • USB support → <M> Support for USB
    • USB support → [*] USB verbose debug messages
    • USB support → --- Miscellaneous USB options → [*] Preliminary USB device filesystem
    • USB support → --- USB Controllers → <M> UHCI (Intel PIIX4, VIA, ...) support
    • USB support → --- USB Controllers → <M> UHCI Alternate Driver (JE) support
    • USB support → --- USB Controllers → <M> OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
    • USB support → --- USB Devices → <M> USB Mass Storage support (EXPERIMENTAL)
    設定が終わったら保存してxconfigやmenuconfigを終える。
  7. カーネルの再構築。(適当)
    場所は変わらず/usr/src/kernel-source-2.2.17/のままで
    # make-kpkg modules
    # make-kpkg kernel_image
    # cd ../
    # dpkg -i kernel-image-2.2.17_Custom.1.00_i386.deb←/usr/src/に勝手に作られているdebパッケージを指定
  8. 構築も終わり、BOOT DISKも作り終わり、LILO設定も終わったらリブート。
  9. つぎはマウントの仕方。起動後、rootになってから
    # depmod -av
    # mkdir /cf0←マウントポイント、一度作ったら今後もう二度と作る必要はない
    # modprobe usbcore←説明書通り
    # modprobe usb-uhci←説明書通り
    # modprobe usb-ohci←説明書通り
    # modprobe usb-storage←説明書通り
  10. マウントできるかな。
    # mount -t msdos /dev/sda1 /cf0
    これで/cf0のなかにCF内のデータがマウントされていたら成功、なんだけど・・・。 もちろんこのとき、USBでCF R/Wとパソは物理的につながっていないとダメ。
    ちなみにアンマウントはumount /cf0となる。

基本的には以上のようにインストールした。 結果的には我が家の環境においては成功であった。

おまけ情報1。
今回のCF R/Wインストールに際して、実はmsdosファイルシステムとSCSI generic support と SCSI logging facility の3つをカーネルに組み込んだ。 この製品の説明書のテキストファイルにあるのだが、SCSIドライブとしてUSBのCF R/Wを認識させているらしい。 何か関係あるかなと思い、SCSI関連の設定もいじってみたりした。 この設定と何も関係がないともいえないので一応報告しておく。

おまけ情報2。
筆者は面倒なことはあまり好きではない。 まず、CFのマウントが一般ユーザに許されていない。 これでは少し面倒なので一般ユーザにもマウントを許可すべきだ。 それと、マウントするのにいちいち$ mount -t msdos /dev/sda1 /cf0とか長々と打ちたくない。
よって/etc/fstabというファイルに以下の1行を書き込んでみた。

/dev/sda1       /cf0            msdos   defaults,user,noauto            0      0

とはいえ、やっぱり一部のユーザやグループだけにマウントを許すようにしないと危ないかなあ。
ちなみにこのように書くと、
$ mount /cf0
とコマンドを打つだけでマウントができる。 幸せだね。

おまけ情報3。
リブートするたびに
rootになる → # depmod -av# modprobe usbcore# modprobe usb-uhci# modprobe usb-ohci# modprobe usb-storage
といったコマンドを打たないとCFのマウントできないのはちょっとだるい。
なので、usbcoreとusb-uhciとusb-ohciとusb-storageを/etc/modulesというファイルに書き込んでみた。

しかし、残念ながらこれだとusb-storageがうまくいかない。
よって現在はブート後はusb-storageだけrootでinsmodしている有り様である。 まあ4つのモデュールのところを1つに減らしたんならまあいいか??

おまけ情報4。
CFをパソで扱えるようになり、Zaurusライフも充実し始めた。 今までは完全にスタンドアロン状態でZaurusを使っていた。 契約していないので、Zaurusから直接ネットにこそ繋げないものの、Zaurus用のmoreソフトというアプリケーションプログラムをパソコンに落とし、それをさらにCFに移動させ、それをさらにZaurusへ移動させるという、なかなか面倒なことをすることでZaurusの機能拡張をはかっている。

筆者の勝手なおすすめmoreソフト紹介(筆者のZaurusはMI-P2)

ペンヤード:別のPDAではスタイラスっていうけど、Zaurusではタッチペンとかいいませんかね?とりあえずタッチペンをキューに見立てたビリヤードゲーム。これはタッチペンの特性を見事に利用したすばらしいゲームだと思います、はい。(ここでDL、うーむ、カラー画面がうらやましい)

かえで:テキストファイルの閲覧、編集が可能。テキストファイルの編集って、意外とZaurus(MI-P2)単体ではできない作業なのである。ここでDL

関数電卓:数学の授業などで使ったりする機会が最近多い関数電卓。ヨドバシとかで買わなきゃ、と思っていた矢先に見つけたソフト。買う手間省けたぞ。でもテストでZaurusは使えないっすね。(ここの関数電卓サンプルソフトをそのまま使用)

Debian GNU/Linux, PPxP によるインターネット接続 (ISDN)

IRC依存症発症(PPxPによるイソターネットの設定)

今までやる気のないdebian導入記や日本語環境構築記を読んでくださった方、どうもありがとう。 実はここからが本題。PPxPの導入、インターネット接続編である。 PPxPはモデムやTAと繋いでPPP通信するのに必要なソフトである。(以下文中で「モデム」とTAを同一に呼んでいる) まあとりあえず、PPxPのダウンロードはこちらへ。実はPPxPの他にもuserlinkモジュールというのも必要なので、上記のPPxPの公式ホームページにてuserlinkも手にいれよう。
筆者の場合は、カーネルの再構築を一度やってからインストールを行った。(再構築の必要はないのだが、/usr/src/kernel-source-2.2.17がなかった)
apt-get install でppxp関連のファイル(ppxp, ppxp-x11, ppxp-tcltk)をインストール(と設定)し、userlink-sourceも同様にインストールした。(以下略)

PPxPを動かす。インストール方法は省略。 Debianゆえに、dpkgとか使って楽させてもらったし、おそらく一般的なインストール方法は公式ホームページを参照にしたもらった方がいいはず。 なので、筆者の使用しているTA、NECのAtermITX80Dでどうやって繋いだかを報告。 ちなみに、回線はISDNである。
まずはppxpを起動してみる。すると

SysIfOpen:No such device

というエラーを出力してうまく起動しないことがある。 こう言うときは

# depmod -a
# modprobe userlink

を実行してからだとppxpがちゃんと起動する。 しかし、これだと、rebootをして、またppxpを起動する際にも同じエラーが出るので上記コマンドをまた(ルートで)実行しなければならない。
だるい、これは。
なので、/etc/modulesというファイルにuserlinkを加えると、ブートした後始めてppxpを動かすたびに上記2つのコマンドを打つ手間が省ける。 それは筆者の環境が悪いのか? よくわからないが同じ症状(?)で面倒だと思う方はお試しあれ。

$ more /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file should contain the names of kernel modules that are
# to be loaded at boot time, one per line.  Comments begin with
# a #, and everything on the line after them are ignored.
nfs
nfsd
smbfs
vfat
autofs
ipv6
serial
userlink    #ADDED

まず、一般的に「外付モデム」はLinuxで使える可能性がとても高いと言われている。 なぜなのかはわからん。 どうやら外付ではない、パソの中にすっぽり入ってしまうようなモデムの中にはWINMODEMと風刺されるような、Windowsとしか会話のできないモデムが多いといわれている。 もちろんドライバなんて公開してくれないから、そういうモデムをLinuxで使うことはほぼ不可能に近いらしい。
お宅のモデム、大丈夫?(何
そういうわけで、筆者の家のTAを見てみる。 よかった、外付だ。廊下にそいつは転がっていた。

モデムとの会話方法は、言わずと知れた今はなきヘイズ社のATコマンドがある。 ほとんどのコマンドがATから始まるからATコマンドなどと呼ばれるらしい。 そのまんまだな。 まあいい。 NECのAtermITX80DについてきたドライバCD-ROMの中に入っているATコマンドの資料(pdfファイル)を引っ張りだしてみることにする。 なんだかんだいって、製品独自のATコマンドというのもいっぱいあるものだ。
じゃあまずは、ATコマンドでモデムと会話をしてみよう!
なにやらkermitとかcuというモノを使ってもモデムと会話ができるのだが、実はppxpだけでも十分モデムとお話ができるのである。 terminalモードである。 Windowsの「ハイパーターミナル」みたいなものだ。

$ ppxp serial
ppxp>set line /dev/ttyS0
ppxp>terminal
AT
OK
ATI4
AtermIT NEC Corporation
term>disconnect
ppxp>bye
$ 

ちなみに、/dev/ttyS0は1つめのシリアルポートである。いわゆるCOM1。 /dev/ttyS1ならCOM2に相当する。 この場合、COM1にモデムが繋がっているという事を前提とする。
terminalと打つと、ターミナルモードに突入する。 この状態でATと打つと、モデムからOKと返事が返ってきている。 AtermITX80Dでは、ATI4と打つと、AtermIT NEC Corporationとかいう返事を返してくれるらしい。
このterminalモードから抜けるには、CTRL-\ のあとに、大文字のCを打つ。
普通はこのように、簡単にモデムとお話ができるものなのだ。

拒絶。 terminalモードに突入しても筆者の場合、ATと打ってもモデムからの返事はなく、ただIgnore until "AT"という結果が表示されるだけ。
そしてこの異常事態の原因として怪しいと睨んだのがsetserialであった。 我がパソのシリアルポートが安物で自ずからUART(Universal Asynchronous Receiver Transmitter=マザーやモデムカードにのっているシリアル用のチップ)の型名を名乗れないのではないか。 と意味不明な心配をしてみる。 (実はsetserial -g /dev/ttyS0などでもちゃんとUARTを名乗っていた。)
このsetserialというのはシリアルポートのI/Oアドレスのポートのハードウェアに設定されている割り込み(IRQ)、使用しているUARTの種類などのデバイスドライバのソフトウェアに伝えられるようにするプログラム、だという。 なにがなにやら、である。 IRQは言わずと知れた「割り込み順位」を決めるやつでBIOSなんかでもよく設定ができたりする。 時計やキーボードが割り込み順位が高いという。 なんとなく分からないでもない、割り込み。 CPUに対する割り込み。 /proc/interruptsというファイルを覗いてみると、どのデバイスにいくつのIRQの値が設定されているかとか、どれだけの割り込みが発生しているかが分かってちょっと面白いだろう。

$ more /proc/interrupts 
           CPU0       
  0:    2203691          XT-PIC  timer
  1:      65870          XT-PIC  keyboard
  2:          0          XT-PIC  cascade
  3:          6          XT-PIC  serial
  4:     181534          XT-PIC  serial
 12:     297114          XT-PIC  PS/2 Mouse
 13:          1          XT-PIC  fpu
 14:     161631          XT-PIC  ide0
NMI:          0
ERR:          0

左はじの数値がIRQの値。 その右隣は割り込み発生回数。見ての通りtimerがとても多い。 一般的なIRQの割り当ては次のようなものらしい。

0:タイマチャネルor割り込みなし
1:キーボード
2:コントローラ2へのカスケード
3:シリアルポート2
4:シリアルポート1
5:パラレルポート2、サウンドカード
6:FDD
7:パラレルポート1
8:リアルタイムクロック
9:IRQ2にリダイレクト(IRQ2に同じ)
10〜12:割り当てなし
13:数値コプロセッサ
14:HDコントローラ1
15:HDコントローラ2

このうち、2、3、4、5、7、10〜12、15は自由に使えるもの

このIRQとI/Oアドレスをあわせてリソースという。 I/Oアドレスは/proc/ioportsというファイル内を覗くとその割り当てがわかる。

$ more /proc/ioports 
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
01f0-01f7 : ide0
02f8-02ff : serial(set)
03c0-03df : vga+
03f6-03f6 : ide0
03f8-03ff : serial(set)
d000-d007 : ide0
d008-d00f : ide1

たとえば、次のように/dev/ttyS0がどのようなリソースを持っているのかがわかる。

$ setserial -g /dev/ttyS0
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4

ただし、このようなIRQとシリアルポートとの問題が発生するのは、シリアルポートが4つも5つもあるようなそういう環境に多いという。 当時筆者のマシンには2つのシリアルポートしか存在しなかった。 なので、このような問題が発生するとは思えなかったが、とりあえず起動メッセージにあるシリアルポートに関するメッセージを取り出して読んだりしていたものだ。
dmesgというコマンドがあるが、これは実際の起動時の全てのメッセージを出力してくれるとは限らない。 あまり信用ならないコマンドであると言う。 なので、やはり生の起動メッセージを見たいものだ。 そのためには、最初のBIOSのメッセージをPAUSE(BREAK)キーで止めたり、SHIFT+PAGEUPなどでどんどん画面に流れて行く起動メッセージを逆流して見てみたりしよう。 シリアルポートに関する出力は2箇所あるはずだ。 最初はハードウェアによるシリアルポートの設定メッセージ、次はソフトウェアによる(setserialによる)設定メッセージになる。 これらのIRQ値に相違があると、動作が遅くなったり、動作していないように見えたりすると言う。 もちろんシリアルポートをたかだか2個しか持っていないようなパソにはあまり関係のないことだったのかも知れないが、筆者は一生懸命/etc/serial.confを書き換え、起動時に実行されるsetserialのための設定を換えたりいろいろやった。 それでも出るIgnore until "AT"というエラーメッセージは消えず、モデムと全く通信できないことを示唆していた。このときせっせと見ていたsetserial関連、シリアルポート全般に関する資料

そして次に筆者が注目したのはモデム初期化のATコマンドであった。 ppxpでは最初にモデムを使う前に初期化をする。 どういう風に初期化するかというと

  • エコーバックしない
  • リザルトコードを返す
  • リザルトコードを文字で返す
  • CD信号を上げたままにしない
  • DTR信号を無視しない
  • ハードフロー制御(RS-CSフロー制御)をする

という風に初期化するのがポイントなんだそうだ。
ここで気になるのが○○信号というものだ。

モデムが通信をする流れ。www.netlaputa.ne.jp/~hijk/study/nw/glossary.htmを勝手に参照

Carrier Detect(CD信号)

データチャネル受信キャリア検出、相手側のモデム(今回はISPのモデム)からキャリアを検出するとCDランプが点灯する。

  1. 端末、モデムの電源をONにすると、まずER信号をONにし、DR信号をONにして信号を待つ
  2. 送信データが発生すると、端末はRS信号をONにする。モデムはこれを受けて最初のキャリアとしてトレーニング信号を送信する。
  3. 受信側モデムはトレーニング信号を受けると自動等化器の調整を始める。V.29ではこの調整時間を253ミリ秒としている。
  4. 調整後、送信側モデムはCS信号をONにして、それ以降のデータを送信データSD(Send Data)とみなし、変調してアナログ回線に送出する。
  5. 調整後受信側モデムはCD信号をONにして、RD(Receive Data)のデータ受信線から送られてくるデータを受信データとして認識する。

Clear to Send(CS信号)

送信可、トレーニング信号送信後一定時間(253ミリ秒)でONとなる。 それ以降のデータは送信データとみなして送出される。

Data set Ready(DR信号)

端末、モデムの電源投入後、ER信号のONにひき続いて、データ受信準備可能状態としてONになる。

ER信号

データ端末レディ信号

Receive Data

受信側モデムはトレーニング信号を受け、等化器を調整すると、CD信号をONにして、以降はRD信号線から送られて来るデータを受信データとして処理する。

Request to Send(RS信号)

送信要求

そういうわけでだいたいわかった○○信号。 しかしその日、とうとうあることにきづいたのだった。
例えば、パソとパソを直接シリアルポートで繋ぐ(ゲームボーイ同士を通信対戦で繋ぐように)場合、使用するRS232Cケーブルはクロスケーブルでなければならない。 ところが、モデムとパソを繋ぐときは、ストレートケーブルを使わなければならない。 電極をケーブル(メス−メス ケーブル)の片方のはしの3と書かれた穴に刺す。 ケーブルのもう片方のはしの2と書かれた穴にも電極を刺して、通電させてみよう。 見事電流が流れれば、それはクロスケーブル、パソとモデムを繋ぐのには使えない!
筆者はとうとうケーブルに疑問を抱いた。 小さな疑問、まさかこのケーブルがクロスケーブルだった、なんてオチはないだろう、そう思っていた。
上記の2の穴と3の穴とを通電させると、繋いでいた豆電球にパッと明りがともったのだった。

犯人が発覚し、筆者は電器屋ですぐにストレートケーブルを買ってきた。 いそいそとストレートケーブルでモデムとパソを繋ぎ、ppxpのterminalモードに突入。
するとそこにはIgnore until "AT"のエラーはなく、普通にモデムとの楽しい会話がスタートしたのだった! PPxPの公式ホームページの掲示板に筆者と同様の症状(Ignore until "AT")に悩んでいた人が数名いた。

汝、ケーブルを疑うべし!

以上、モデムと会話をするという目標を達したのであった。

つかおう、ITMUX機能。
AtermITX80Dの特徴的機能、それはITMUX機能だ。 簡単に言えば、一度に同じISP相手ならば2台のパソが同時にインターネットができるというルータみたいな機能。 家にパソがゴロゴロしているような人にはとうてい物足りない機能だが、筆者レベルのユーザにはちょうどよい機能だ。 案の定普通に繋いでいたら同居人に「俺のパソがネットに繋げないことがある」と苦情を言われた。 あたりまえだ、こっちはppxpで回線を一人占めしてるんだから、、、、。(ぉ
そんなわけで、ITMUX機能を使おう。 これはAtermの説明書にある通り、ISPにダイヤルする際に、電話番号の後ろにPAという2文字を無造作にくっつけるだけ。 ISPのアクセスポイントの電話番号が123-4567なら、ppxpの設定を123-4567PA/1(最後の/1は、1回ダイヤルするという意味です、よね?)のようにくっつける。 うむ、これだけか。

公開、現在使用しているInitialize文字列。
Initialize文字列を変えることにより、モデムの初期化ATコマンドを変えることができる。 筆者の使っているのはAtermITX80D、回線はISDNである。 2002年2月現在の初期化文字列は以下のようになっている。

ATH0E1Q0V1X3$N9=10$N1=1&D0&C1

ひょっとすると、自動切断タイマが働いている設定である。 (IRCにずっと繋いでいると、鯖からちょくちょくPINGが飛んでくるためか、ちょくちょく通信しているように察知されるらしく、安心して(?)自動切断タイマONにしている) とりあえず、Atermの中には、「エコーオンが他のモデムと逆(E1とE0)」という噂がある。(笑) Atermユーザはお気を付けて。 ちなみに、筆者はとても面倒臭がりなので、/etc/ppxp/modem/aterm のファイルを直接編集してしまった。 場所的にもわかるとおり、rootにならないと編集できないであろうに、、、、。

ATコマンドおまけ。
AT\SというATコマンドで、モデムのステータスを見ることができる。 当初これでネット切断中にモデムのステータスをみてみたところ、ER、CD、DR、RS、CS信号がすべてONになっていて驚いたことがあった。 このとき、相手(=ISP)から切断された場合、PPxPがそれに気づかずずっと繋いでいるフリをし続けていた。 つまり、チャットから落ちたことがわからないのである。 これでは困る。
CD信号というのは、上記に説明した通り、相手モデムと繋いでいる間だけ検出されるものだ。 もちろん、Initialize文字列を急いで修正したのは言うまでもない。(AT&C1)