毎月皆様にお届けしているDMCA騒ぎの今回はガレージのドアだ。少なくとも一社は、万能ガレージドアを遠隔操作にするmaking universal garage door remotes のはDMCA違反なので、その考えには法律上のお金を払う用意がいると、考えているらしい。充分でないって?別の話がある。Lexmark は、プリンタ・カートリッジ・メーカーを困らせようとしてDMCAに違反した invoking the DMCA 。Edward Feltenは確信を持って、ここでの重要問題は相互運用の原理全体だ、と説明したconcisely explained。面白いのは、リサイクルが困難で高価との理由で、ヨーロッパ議会が「スマート」プリンタ・カートリッジを禁止する新法を可決したvoted in a new lawことだ。Bruce Schneierは貿易戦争を予想するがpredicts a trade war、そうならなくとも、結果には興味がある。もう一つBruceが強調し、読む価値があるのは、EFFのガイドUnintended Consequences: Four Years under the DMCA.(予想外の結果:DMCAの四年間)だ。
またDebian Weekly Newsからfrom Debian Weekly News新DebianパケージのRSSフィードRSS feed of new Debian packages入手に関する報道もある。
Debianプロジェクトの現リーダBdale Garbeeが、オーストラリア新聞Ageとインタビューしたhas been interviewed 。
Mandrakeが現在急激な経済問題に見舞われていることが、先月広く報じられた。その結果、会社経営者はChapter-11 style protection(二章型保護)を申請した。その目的は、休止期間を与えて、債権者からの圧力なしに経済再建が出来るようにするためである。フランス裁判所は計画を承認した approved the planので、この期間の後、当社はもっと良い状態になると思われる。
1. ソース・ファイルをエディタのsrc ディレクトリに移す。
2. main.cc の最初で、次のようにファンクションを宣言する:
int show_search_dlg();
3. 次のように、 main()に行(実際はコメントアウトされた行)を 追加する:
ed.add_menu_cmd( show_search_dlg, "Search", "Edit", F2_key, SHIFT_PRESSED );
...これは、シフト−F2を押すと直接起動する"Search"とラベルのついたコマンドを"Edit"メニューに追加する。
4. Makefileでは、ソースファイルに関するコンパイル規則を追加(アンコメント)し、その名称をリンクすべきオブジェクトのリストに追加する。
5. Make を走らせて、検索ファンクションがメニュー上にあるのを確認する。
この手順にしたがうと、全くの初心者にも自分のメニューファンクションを書く方法が解かるであろう。このエディタは、ユーザの書く任意のソースから、そのヘッダファイルを通じてアクセスすることの出来るのグローバル変数(C++オブジェクト)である。そのメンバー・ファンクションは、カーソル位置や選択領域などその内部変数全部の状態を報告する。編集中のファイルを含むテキストアレーには、メンバー変数としてアクセスすることが出来るので、ユーザファンクション内でファイルを走査して変更することが出来る。
生きた色
通常、カラー化の論理はユーザーに押しつけられる。エディタの中には、色を変更しキイワードを追加するダイアログを備えたものもあるが、論理は作者が書き込む。
究極のエディタは、自分のカラー化ルーチンをユーザが容易く書く方法を提供する。滅多にない異様な言語で色付けさせる代わりに、この特性はカラー化の隠された可能性を解き放つ。
ソースの色付けにどれだけの方法を選べるか、それが何なのかの解析にどんな手段があるかを考えて見よう。目的にしたがって、どのヘッダーファイルに対して宣言されているか、、又は自動か割当てかによる色識別子が欲しくなるか、又は、色をその適用範囲の表示に用いる。幾つかのカラー化計画インストールし、ホットキイを使ってそれらの間で切り替えることを選ぶだろう。
カラー化を簡単にするため、究極のエディタはそのファイルを、文字列のアレー二つ−一つはテキスト用で他はカラー用−を含むファイルアレーに記憶する。ファイルアレーは、これらアレーの中で、テキストアレー中に記憶された各文字について、その色をあらわすバイトがカラーアレー中の同じ座標に常にあるよう、文字列の大きさを同期して保つ。
エディタは、リフレッシュの際、常にカラーアレーを描くので、一定の座標にある文字に色を付けるためのプログラマが為すべきすべては、カラーアレー内の値を、同じ座標にあるものに変更して、表示をリフレッシュすることである。
九割はウィジェット
ユーザの立場からは、ダイアログ・ボックスはテキスト・エディタの小部分であると思われる。プログラマの予想では、あべこべだ。ダイアログに現れる編集可能なフィールドは、完全に機能する編集ウインドウで一つ二つの特性だけ無効になっている。だから、究極のエディタを書くことは、実は、究極のウイジェット・ライブラリを書くことになる。
良い文書が付いて旨く書かれたウイジェット・ライブラリは、拡張可能エディタのアクセサリ以上のものだ。エディタを改良するため、ユーザがライブラリを使い慣れると、簡単な質問を聞いてその希望をconfigファイルに書き込むことにより、非熟練者が別のソフトウエアをコンフィギュアするのを助けるコンフィギュレーション・ダイアログを作るのにそれを使うことが出来る。
Linuxconfは、極めて重要なコンフィギュレーション・ツールだが、使い難いため、廃れた言語のように消え去りつつある。使い難いので、改良の熱意を得るのが難しい。ユーザとプログラマの両方が、その代わりに別の方向、つまりディストリビューション固有のコンフィギュレーション・プログラム、に向かっている。Linuxconfが書き直されて、(X-ウインドウ・ダイアログのような)普通のダイアログのように動作するマウス作動のダイアログを示すようになっていれば、手掛かりのない初心者が任意の有名なパケージをコンフィギュアすることの出来るモジュールを含むよう成長していた筈だ。
Linux普及の主な妨げがその秘伝にあることに同意されるだろうか?言いたいのは、ソフトウエア熟練者だけがLinuxを使っていたので、初心者のためソフトウエアを書くのを誰も気にしなかった。Linuxの成長は、エリート主義者Catch-22に妨げられている。バカにも出来るコンフィギュレーション・プログラムがOSの大衆に取って重要でないなら、Microsoftは膨大な時間と費用を、そのため費やしただろうか?
Linuxconfを、簡単だが最新のウィジェット・ライブラリを持たせて書き直すことは、それをあるべき姿にする−終わることのない計画の、第一歩であろう。これは、モジュールを追加するにつれて、Linuxソフトウエアすべてが子供にもコンフィギュア出来るワンストップショップになるまで次第に成長している筈だ。
少しばかりの手助け
C++を知っている誰もがこの課題に挑戦するようオープンにしたい。Linuxの下でマウス、キイボード及びカラーテキスト画面を用いてインターフェイスすることは、低レベルの夢なので、Linuxの下でDOSの下のように簡単にするインターフェイス・ライブラリを作った。エディタを書く目的にそれを利用するためSlangに重ねて推薦するのには、幾つかの理由がある。
第一に、zip形式のSlangソースは(文書とデモ・プログラムを含めて)740kであるのに、私のライブラリのソースは42kにzipされること。第二に、Slangはマウスの動きを知らせないので、Slangプログラムはマウスを使ってドラッグ−選択することが出来ないこと。第三に、Slangの色付けシステムは複雑だが、私のものは、文字/色バイトの対のEGAスタイル・バッファとして画面をあらわすことだ。
Slangを使おうとして見て、その全プラットホーム能力が生じる負担が大き過ぎることと、Linuxコンソールの利点全部を利用していないこととの結論を得て、自分のライブラリを書いた。Slangの作者が、私より良いプログラマであることは疑わないが、Linuxコンソールに合った最初の適切なエディタを作ろうとするプログラマに特に役立つライブラリを作った。
それは http://members.lycos.co.uk/ctio/でダウンロードすることが出来る。
そこで、それをコンソールとインターフェイスするのは、DOSの下と同じようにLinuxの下でも簡単になり、DOSエディタと同じ特性を持たせてLinuxエディタの障碍が取り除かれた。今や、C++の分かるひとなら誰でも、何か偉大なことをすることが出来る。エディタとウィジェットのライブラリを作るため私の説明したことは、入門者レベルのプログラマの前に大道を開いて、フリー・ソフトウエアの歴史の歩みを変えることになるだろう。
一からやり直す
分かり切ったことを一からやり直す必要は無いと常に言われて来た。鼻息だけを動力にしても帆船は大西洋を渡ることが出来る。私は断言する、誰かが実際に「円滑に働くもの」を作った暁には、ラッパを吹きながら大通りを行進して大声で「分かり切ったことをやり直す必要はない」と触れ回る。
理論上は、どんなオープンソース・エディタでも、細工をして完全にすることが出来るが、我々は未だに、マウス感知のエディタでIQ170以下のプログラマが細工をして改良することの出来るもの求めている。適切なドキュメンテーションがないと、オープンソースは普通の人に取って「閉じた本」になる。
宿命
君は何だ、C++プログラマか?要約機械を作る力を持った者、これより前のあらゆる世代の発明人間の夢を打ち砕いた物質世界を超越した発明者である誰かか?角張った車輪で怪我をしたフリー・ソフトウエアの美しい街の市民であれば、彼らの問題を解くことが出来る筈だ。
君がたるんだ顔で「俺の仕事ではない」と言ったら、誰がそれをする?私ではない、私はホームレスだ。私はインターフェイス・ライブラリを書くため、随分長い間コンピュータにアクセスしたが、今はテントに住んでおり、コンピュータに近づくのは失業者のためのデイセンターで偶にインターネットにアクセスするだけだ。だから私には出来ない。君に出来ない理由はないだろう?
究極のエディタ、これまで書かれた最後のエディタ、の作者になるのは君の宿命だ。フリー・ソフトウエアの重要性が認識されStallmanの銅像がRushmore山の上に建ってから、一ヶ月も経たないうちに、ダイナマイトで吹き飛ばされてその代わり君の銅像が建つだろう。
参考資料
Slang、John E. Davis作。Slangは、殆どのプログラマが推薦するキイボード/マウス/カラー・インターフェイス・ライブラリとしては、陰が薄いと思われる。極めて賢い人なら、全くコンソール・インターフェイスに関する Midnight Commanderソースの一部であるSlangを使う方法を見出すだろう。これは小さく、Linuxコンソール上でテキスト選択が出来るけれども、telnet windowsであっても、能力の低いターミナル上で限られた機能を与えるに過ぎない。
CTIO、Stephen Bint作。私が今まで書いたうちで、遙かに簡単で最良のコンソール・インターフェイス。Linuxコンソール及びDOSにおける唯一の作品、rxvt/xtermでも telnet windows でもない(だが僅か42k)。これを書く上での苦労はここ here.を読まれたい。
emacs,、Richard Stallman作。フリー・ソフトウエア歴史上の一里塚。
ところで、以下での非対称はネットワーク作成固有又はLinux kernel の相違によるものではなく、486が或る日インターネットへの入口になるからである。それが知っている誰かに応答する以外のことをしてはなららない。他方、二つは互いに制約があってはならない。
その他に注意すべきは、これは出来るだけ速く立ち上がって働くことだけを目的としていることだ。その他全部は、殆ど無視した。これが、小さいが重要な第一歩と考える。これでは極めて中身がないので、次のステップは、関係のドキュメンテーションだ。
1.クイックスタート−Ethernet
PCMCIA問題(下記を参照)を除くと、Ethernetのインストールとコンフィギュアは分かり易い。物事を簡単にするためクロスオーバーケーブル、つまりポイントツーポイントから始め、他の全部が働くことが分かってから切り替えだけに移動した。
マシン毎にネットワークに接続する代わりに、接続するとき走らせるスクリプトが /root にある。二つのマシンからの関連スクリプトとファイルを示す(コメントとここに関係のない中身を除く)
Toshiba 486
/etc/hosts: 127.0.0.1 localhost
192.168.0.99 Toshiba486.Lohgo Lohgo486
192.168.0.100 ToshibaAMD.Lohgo LohgoAMD
192.168.0.101 PC.Lohgo LohgoPC
/etc/hosts.allow: sshd: 192.168.0.100, 192.168.0.101
/root/eth-up: #!/bin/bash
/sbin/ifconfig eth0 192.168.0.99 \
broadcast 192.168.0.255 \
netmask 255.255.255.0 up
Pentium 166
/etc/hosts: 127.0.0.1 localhost PC
192.168.0.99 Toshiba486.Lohgo Lohgo486
192.168.0.100 ToshibaAMD.Lohgo LohgoAMD
192.168.0.101 PC.Lohgo LohgoPC
/etc/hosts.allow: sshd: 192.168.0.100
portmap: 192.168.0.100
lockd: 192.168.0.100
rquotad: 192.168.0.100
mountd: 192.168.0.100
statd: 192.168.0.100
/root/eth-up: #!/bin/bash
/sbin/insmod rtl8139
/sbin/ifconfig eth0 192.168.0.101 \
broadcast 192.168.0.255 \
netmask 255.255.255.0 up
以下はマシン3台全部で同じである:
/etc/hosts.deny: ALL : ALL
/root/eth-down: #!/bin/bash
/sbin/ifconfig eth0 down
/root/eth-stat: #!/bin/bash
/sbin/ifconfig eth0; /bin/netstat -r
P166に関する /etc/hosts.allowへの余計なエントリは、nfsサポートのためである。 /root/eth-upの中のinsmodはPC内のEthernetカード対ノートブック上のPCMCIAによる。
SuSEには、インストレーションの際に /etc/hostsを「再構成(re-organize)」するオプションがあるのを承知されたい。これは/etc/rc.configの中でCHECK_ETC_HOSTS=yesを規定値にする。これが、再ブートのとき、 /etc/hosts にあるホスト自体のため192-IP-アドレスが127-アドレスで置き換えさせるものであるではないかと疑っている。頻繁に再ブートしないので、これを点検する気はないが、ネットワークへの説明し難いアクセス不能に出会ったら、このファイルの内容を点検されたい。
2.クイックスタート−Ssh
これは、ここで述べるLinux機能の中で疑いもなく最も複雑なものだが、極めて有用な幾つかの事柄のキイなので、便利と安全のため、絶対に設定しなければならない。
前提条件/定義:
sshの設定が面倒でないなら、しなければならないことは、これ:
Remote Local Comment
<リモートホストにも知られたユーザとしてログオン>
ssh <host>
warning:... SOMETHING NASTY
yes accept it
<password>
設定はこれ:
Remote Local Comment
<リモートホストにも知られたユーザとしてログオン>
/usr/bin/ssh-keygen
accept default: .ssh/identity
no passphrase
mount /floppy
cp .ssh/identity.pub /floppy/
umount /floppy
logon as <the same user>
mkdir .ssh if necessary
mount /floppy
cp /floppy/identity.pub .ssh/authorized_keys
cp /etc/ssh/ssh_host_key.pub /floppy/known_hosts
umount /floppy
mount /floppy
cp /floppy/known_hosts .ssh/
umount /floppy
vi .ssh/known_hosts
add <host> at start of line and
remove root@<host> at end
上の事柄を設定した後、ログオンするためしなければならないことはこれ:
Remote Local Comment
<リモートホストにも知られたユーザとしてログオン>
ssh <host>
hostキイは、システム・インストレーション(いずれにせよSuSE)の一部として作られることに注意。だから、ディレクトリ構造に相違がある(SuSEのkernel 2.2 には 'etc' の下に 'ssh' がない)。また、これは人をssh設定と運転に慣れさせない目的だけであることに注意。以前にsshを使ったことがあるなら、盲目的にこれらのステップを踏んではならない。ホーム・オフィスでは、違うマシン上で仕事をするのにpassphraseしたくはないが、したい人もいるかも知れない。
3.クイックスタート−Screen
Linux Gazetteで何度か述べ、実際にもそれを少し使っているが、画面の必要は私に良く分かっていない。6+ vtを与えられ、ウィンドウ・マネージャが何であろうそれが走らせている無制限ウインドウを持つ他の最低二つで、Xが働いているとして、これは別のレベルの複雑さに過ぎないと思われる。
ホームのネットワークが形を整え始めると必要性が明らかになる。画面の背後にある根本理由がこれを煮詰める。画面の下にあるremoteマシン上でセッションを始めると、remoteマシンがシャットダウンされない限り−通信リンク又はlocal マシン上で起こることに関わりなく−利用することが出来る。私のPCMCIA Ethernetカードの一つがWindows の下で働き、一時にノートブック1台だけしかPCに接続することが出来ないように、通常通りだが−486をシャットダウンする必要なく−AMDがLinuxを走らせていると、カードを排出して、AMDに入り、画面は後のアクセスのため486上でセッションを働かせ続ける。
画面をスタートさせるには:
screen -R 可能ならセッションを再スタート、さもなければ人がスタート
画面内では(全部は現れていない隠れたものもある)Ctrl-aに続いて次を使用する:
? ヘルプ
w ウインドウズのリストを表示
n 次のウインドウに切り替え
c 新規ウインドウを作る
d 切断
A ウインドウに表題を割り当てる
4.クイックスタート−ファイル転送
sshを使っているなら、rshを−またその件と同様に telnet と ftpも−乗り切るることが出来る。便利と思われる代案を示す。
Netcatは、catに似た巧みな小さいツールだ。一つのマシン上のファイル一つを受け取ることから始め
netcat -vv -l -p <port> > <file>
送ったものを別のマシンに告げる
netcat -vv -w 10 <hpopst> <port> < <file>
又は
tar -czvf - <directory> | netcat -vv -w 10 <host> <port>
netstat と /etc/servicesを用いて利用可能なポートを見出す。オプション "-w 10" は、送り手に、無活動の10秒後に接続を終了することを告げ、オプション "-vv" は、正しい数のバイトが送受信されたことを検証させる。
ホーム・ネットワークが次第に形を整えるとき、異なるマシンに対しバックアップするスクリプトに関する約束をnetcatが保持する一方で、Midnight Commanderには、人手で簡単におこなわなければならないことに関し驚くべき機能がある。
sshが正しく設定されると、コマンド行に入力した下記が、マシンのアクティブ・パネルを「別の」マシン上の同じユーザに向ける−残念ながら "#sh" で "#ssh" ではない。
cd /#sh:<host>
別の側が不明なftpを走らせていると、以下は自明であろう
cd /#ftp:www.tldp.org/
5.クイックスタート−NFS
nfsを扱うと働いたが、残念ながら、ノートがなくなった(基本的にはHOWTOのプリントに書き込んだチェックマークだけ)。思い出す限りでは、関係パケージをクライアントとサーバーにインストールした他に必要だったすべては、PC(サーバー)上で /etc/exports を次のように編集することだった:
/home 192.168.0.100(rw,root_squash,sync,insecure)
/tmp 192.168.0.100(rw,root_squash,sync,insecure)
インストレーションの際、SuSE には選ぶべき数多くのオプションがある。その多く(すべて?)は、/etc/rc.configに入る。これらnfsに対する関連の抄録を示す:
START_PORTMAP="yes" NFS_SERVER="yes" USE_KERNEL_NFSD="yes" USE_KERNEL_NFSD_NUMBER="4" NFS_SERVER_UGID="no" REEXPORT_NFS="no"
AMD (クライアント) 上で、/etc/fstabに対し次を追加した:
192.168.0.101:/home /Rhome nfs noauto,users,sync 0 0 192.168.0.101:/tmp /Rtmp nfs noauto,users,sync 0 0
この点で、mountコマンドが、/floppy 又はfstabの中の他のエントリと同様に、/Rhome などとともに働く。細かい悩みは、ユーザIDが、nfsを使うマシン全部の上で同じでなければならないことだ。私の場合、Linuxをインストールするとき、同じ順序で幾つかユーザを作ったので、これは問題で無かった。
6.クイックスタート−Samba
どれがWindowsの下でなされているのか、特に偽のスタート及び間違った又は単に無関係な方向に転じることの追跡が難しいのが示されているので、大きい話題を割く必要がある。関係あるときは、PCMCIA カード用のドライバが搭載されていると仮定する。また用語が少し曖昧であれば、それはWindowsのドイツ語版からの私の翻訳による。
以下は、Sambaの下のAMDからPCに、つまりWindows 98 からLinux 2.2.13 (SuSE 6.3)に、ログオンするのを可能にするため必要であったものである。必要な調整を加えると、同じステップが別の方向、つまりWindows 95 から Linux 2.4.18-4GB (SuSE 8.0)に対して働く。しかし、相違には注意すること:
Part 1 - Linux
edit /etc/smb.conf
[global]
workgroup = Lohgo
encrypt passwords = yes
smb passwd file = /etc/smbpasswd
password level = 8
username level = 8
socket options = TCP_NODELAY
domain logons = yes
domain master = yes
os level = 65
preferred master = yes
wins proxy = no
wins support = yes
hosts allow = 192.168.0.100 127.
[homes]
comment = Home Directories
read only = no
browseable = no
[netlogon]
comment = Network Logon Service
path = /usr/local/samba/netlogon
public = no
writeable = no
browseable = no
[profiles]
path = /home/%U/profile
guest ok = yes
browseable = no
有効性の検証、エラーなしの筈
testparm | less
パスワード付きユーザを作る
smbpasswd -a web
ユーザ有効を検証
smbpasswd -e web
Sambaのスタート
smbd -D
nmbd -D
この点でクライアント-- Linux下
Windowsでない --から、次の
有意義な応答を与える
smbclient -L LohgoPC
及び次がftp類似アクセスを
与える筈
smbclient //LohgoPC/web
Part 2 - Windows98
control panel | network | configuration
add | client for microsoft network
properties
Windows NT-domain: Lohgo
quick logon
add | protocol | microsoft | tcp/ip
properties | set IP-address
IP-address: 192.168.000.100
Subnet address: 255.255.255.000
primary network logon: client for Microsoft network
control panel | network | identification
computer name: LohgoAMD
workgroup: Lohgo
description: ToshibaAMD.Lohgo
control panel | passwords | user profiles
users can customize: both
reboot
PCMCIA を使っているときは、次が
タスクバー上に記号を示し、これを
使ってPCMCIA カードを削除出来る
<insert PCMCIA Ethernet card and wait for lights to settle down>
以下はTCP/IP設定後のみに働き
コンフィギュレーションを示す
start | run | winipcfg
dosボックスからの接続を試験
ping -n 5 192.100.0.101
c:\windows\hosts.samを編集
127.0.0.1 localhost
192.168.0.101 lohgopc
c:\windows\lmhosts.samを編集
192.168.0.101 lohgopc
ブート後のこの時点で、Windowsがログオンを聞いて来る。これによりSambaが知っているユーザでログオンするか又は、キャンセルして前のようにネットワーク無しでWindowsを使うかいずれかが出来る。しかし、ここではCtrl-Escを使って開かれたポップアップWindowsの底の近くにログオフするための行が含まれ、これが後で同じログオン・プロンプトをブーティングとして与える。その上で、タスクバーへのエントリが−いずれにせよホームディレクトリで−君が誰で何処にいるかを次のように告げる
"Explorer - <user> at <host>"
ここで "<host>" は、Linuxマシン上の /etc/hostsにあるLinuxマシンに関する第三カラムのエントリである。
シンボリック・リンクは極めて上手く働く。あるユーザのホーム・ディレクトリ内で以下を実行すると、Linuxマシン上の−別のパーティションであるものでも−ディレクトリをそのユーザがWindowsマシン上で利用することが出来るようにする:
ln -s /dos/f/pictures pictures
PC上のリソースが不足のためと、いずれにせよ私にはWindowsの使い道がないため、必要に応じてPC上の Samba デーモンをスタート・ストップするのに、次のスクリプトを使う:
/root/samba-up: #!/bin/bash
/usr/sbin/smbd -d3 -l /tmp/sbd.log
/usr/sbin/nmbd -D -d0 -o -l /tmp/sbd.log
/root/samba-down: #!/bin/bash
kill -s SIGTERM $(ps aux | grep mbd \
| grep -v grep | awk '{print $2}')
[printers] comment = All Printers browseable = no printable = yes public = no read only = yes create mode = 0700 directory = /tmp
control panel | printer | new printer
network printer | search
network environment | Pc
hpdj-a4-raw
manufacturer: HP
printer: HP OfficeJet
7.クイックスタート−PCMCIA
/etc/sysconfig/pcmcia の中の初期ブートの後に
PCMCIA_PCIC="i82365" PCMCIA_PCIC_OPTS="irq_list=10"
/sbin/cardctl config とidentからの出力を示す。
CONFIG:
Socket 0:
not configured
Socket 1:
Vcc 5.0V Vpp1 0.0V Vpp2 0.0V
interface type is "memory and I/O"
irq 10 [exclusive] [level]
function 0:
config base 0x0400
option 0x60 status 0x00 copy 0x00
io 0x0300-0x031f [auto]
IDENT:
Socket 0: no product info available Socket 1: product info: "D-Link", "DFE-650TXD", "Fast Ethernet", "Rev. A1" manfid: 0x0149, 0x0230 function: 6 (network)
8.追加の読み物
示した号の Linux Gazette の記事もまた読まれたい
36: Introducing Samba (Sambaの紹介)by John Blair
39: Expanding Your Home Network (ホーム・ネットワークの拡張)by J.C. Pollman
44: DNS for the Home Network by J.C. Pollman and Bill Mote(ホーム・ネットワーク用DNS)
47: Backup for the Home Network (ホーム・ネットワークのバックアップ) by J.C. Pollman and Bill Mote)
48: SAMBA, Win95, NT and HP Jetdirect by Eugene Blanchard
50: Sharing your Home(ホームの共有) by J.C. Pollman and Bill Mote
57: Making a Simple Linux Network Including Windows 9x (Windows 9x を含む簡単なLinuxネットワークの作成)by Juraj Sipos
61: Using ssh(sshの利用) by Matteo Dell'Omodarme
64: ssh suite: sftp, scp and ssh-agent (ssh一式:sftp,scp,ssh-agent)by Matteo Dell'Omodarme
67: Using ssh-agent for SSH1 and OpenSSH (SSH1及びオープンSSH用にssh-agentを用いる)by Jose Nazario
74: Play with the Lovely(可愛いNetcattで遊ぶ) Netcat (by zhaoway
Linux Gazette Answer Gang Knowledge Base under Network Configuration(ネットワーク構成の下のLinux Gazette Answer Gang知識ベース)には沢山のヒントがあるが、中でもRouting and Subnetting 101 は必読である。
System Administrationの主題による Linux Focus Index にも、読む価値のある記事がある。例えば:
Replacing a Windows/NT/2000 server using Linux and Samba (LinuxとSambaを用いるWindows/NT/2000サーバの交換)by Sebastian Sasias
Through the Tunnel (トンネルを抜けて)by Georges Tarbouriech
Samba Configuration (Sambaコンフィギュレーション)by Eric Seigne
Network File System (NFS) (ネットワーク・ファイルシステム)by Frederic Raynal
Home Networking, glossary and overview (ホームネットワーク作成、用語と概観)by Guido Socher
9.Windowsのない未来
前期TRS-80の時代から、私はDOS、Windowsの各種バージョン、OS/2のリリース最低3ヶ、Coherent、を経て、今はSuSE Linuxのリリース5ヶを少なくとも5年以上使っている。「比較検討」する立場にある人は誰でも、最良のWindowsがガラクタにすぎないことに同意すると確信する。ある時期の私の目標はWindowsからの脱脚であった。
だが、考えて見よう。ISDEN電話システムはRS-232を持っており、それを使うプログラムは−−お分かりの筈。プリンタの一つはノートブック用USBで、誰のドライバが利用出来るか考えて見よう。デジタル・カメラはスマートメディアとUSBスマートメディア・リーダを使う・・・。お分かりだろう。
私は、Sambaを一週間働かせただけで、点検しようとさえ思わなかったが、すべてが上手く働いたので、試す価値があると思えた。余りにも素晴らしかったので、この先祖伝来の素材のための代替品を見付けようとする努力に本当に価値があるか疑問に思った。どれだけの時間が掛かり、どれだけの経験をが積んで、成功の保障は何か?「下らないシステム」(Monty Python がこれをGPLの下に置くのを私は望む)の下でノートブックをブートし、残りのネットワークにSamba 接続を使う理由が分かるだろうか?少なくとも、最後のWindows遺産デバイスがそれを食うまでだ。
著者紹介:
EdgarはドイツのCologne/Bonn地域にいるコンサルタントだ。日常の仕事では、古いIBMアセンブラ・プログラム、時にはCOBOL、でなければ MVS の下で QMF, PL/1、DB/2 を保守しながら、給料計算で顧客を助けている。
xclock -digital -update 1 &
しかしこれは、偶々PC-Xware などを走らせてでもいない限り、古いWindows 95マシンでは働かない。
ここにリストを掲げた 'KeepAlive.java' プログラムは、何処でも働く設計となっている。これはJava 1.1 で書かれているので、Microsoftマシン上の 'jview' 仮想マシンでも扱うことが出来る。これは、遠隔マシン上の 'fortune'、'xclock'、その他のプログラムを探すのに頼らない。だから、別のISPを通じて接続するとき、何も変更する必要がない。
相手先の発見
しかし、何処かと通信しなければならない。そこで、通信を受ける相手先を見付ける方法だ。シェル・スクリプトとしてプログラムを書いているのであれば、ゲートウエイの場所を考え、それを適切な間隔で鳴らすだろう。任意の数のプラットホームで働くJavaプログラムではこれは、余り容易でない。何れの場合にも、ゲートウエイ・マシンを飛び越えて何処かに通信を送ることが出来れば、旨く行く筈だ。
殆どの種類のネットワーク契約で、参加マシンは一つ以上のネームサーバ・マシンの知識を持っている。だから、自分のJavaプログラムから出来ることは、これらネームサーバに定期的リクエストをすることだ。リクエストするホストのアドレスがホスト・テーブルの中でローカルには見付からないことを確認する必要がある。また、自分のネームサーバ・リクエストがローカルにキャッシュされないことを確認する必要もある。ここで一寸プログラムを見ると、アドレスをリスエスとするホストの名が、各リクエストのときクロック時間を秒で検査して作られているのが分かる。この結果、A1040689223909, A1040689229448, などの名が出来上がる。
これが、しなければならないことの全部だ。だが、起こっている何かを見られると良い。そこで、我々のプログラムは、二色ボタンをGUIウインドウ内に示す 'MessageFrame' クラスを定義する。これらの色が繰り返し毎に変化する。またGUIウインドウ上にタイトルを設定し、これを繰り返し毎に変える−だからウインドウを最小化したときも何かが起こっているのを見ることが出来る。また、「ウインドウ閉鎖」イベントを検出するリスナを設定するので、見事なシャットダウンをおこなう。
全体を取り纏める
ここに programを示す。次のようなコマンドを用いてコンパイルする必要がある:
javac KeepAlive.java
java KeepAlive
java KeepAlive
/* @(#) KeepAlive.java Trivial keep-alive program. Tries at 5-second intervals
* to find addresses for hosts with generated names. This
* ensures that messages are sent to nameserver(s).
* Copyright (c) 2002 Graham Jenkins <grahjenk@au1.ibm.com>
* All rights reserved. Version 1.06, August 15, 2002.
*/
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Date;
public class KeepAlive {
public static void main(String[] args) {
MessageFrame f=new MessageFrame(); // 繰り返し毎にボタン色を変える
int flag=0; // フレーム・タイトルも変えるので
while ( true ) { // アイコン化しても活動が見られる
f.statusMess(Color.red,Color.red); f.setTitle("==X==");
try {InetAddress addr=InetAddress.getByName("A"+(new Date()).getTime());}
catch (UnknownHostException ioe) {}
if(flag==0) {f.statusMess(Color.yellow,Color.green); f.setTitle("1.06");}
else {f.statusMess(Color.green,Color.yellow); f.setTitle("KeepAlive");}
flag=1-flag;
try {Thread.sleep(5000L);} catch (InterruptedException e) {}
}
}
}
class MessageFrame extends Frame implements ActionListener {
private Button b1, b2; // 二色ボタンの表示
public MessageFrame() {
Panel p=new Panel(); p.setLayout(new FlowLayout());
b1=new Button() ; b2=new Button(); p.add(b1); p.add(b2);
this.add("South",p); this.setSize(150,50); this.show();
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) { System.exit(0); }
});
}
public void statusMess(Color left, Color right) {
b1.setBackground(left); b2.setBackground(right);
}
public void actionPerformed(ActionEvent e) {}
}
Java 1.1 以降をお持ちで、Microsoft仮想マシンを使う必要がないなら、このクラスファイルを単一の 'jar' ファイルにアセンブルし、次いで下記のように '-jar' オプションを使って実行することが出来る:
echo "Main-Class: KeepAlive\015" >/tmp/MyManifest jar cmf /tmp/MyManifest /tmp/KeepAlive.jar *.class java -jar /tmp/KeepAlive.jar
持っていないとき
マシンにJavaがないときは、Sun MicroSystemsから入手することが出来る。Javaを用いるネットワーク・プログラム作成について、もっと知りたいときは "Java Network Programming and Distributed Computing" by David Reilly and Michael Reillyを見られたい。
著者紹介:
Graham は、オーストラリア IBM グローバル・サービスの Unix 専門家である。メルボルンに住み、幾つかのハードウエア・プラットホーム上で、各種の所有権及びオープン・システムを構築し管理した。
中国の観点からLinuxベースの音声認識プログラムを眺めて見よう。中国でコンピュータ製造を始めるのはLinuxコンピュータ・メーカにふさわしい。中国はハードウエアに関し低価格製造方法を提供し大市場を用意すると同時にそれらを世界の重要市場に輸出することが出来るからである。
Linuxコンピュータには、IBM ViaVoiceなどの音声認識システムに適合する能力がある。これは、特に中国語を話す人に利益がある。北京語も広東語も書くのは極めて複雑なので、Linuxプラットホーム上で走る音声認識ソフトウエアを通じてドキュメントを作ることが出来る。キイボードの使用も中国語には不可能に近い。タイプする文書に含まれる文字が多過ぎるからである。
他の言語もまた、音声認識ソフトウエアを使用するのは速度の目的で利点がある。手と目がふさがった専門家は、見出したことをドキュメントにするのに、マウスもキイボードも使う必要がないので、大いに利益を蒙る。音声起動、使用簡便な電話システムは、生活上であらゆる人に役立つ。車を運転する人は誰でも、車の取扱いと車からの連絡のため音声認識が遙かに効果的な方法である考えるだろう。
健康管理市場単独でも、Linuxベースの音声認識プロジェクトを正当化する沢山の理由がある。健康管理サービスは、10カ国グループの最大出費であると同時に、最大成長産業でもある。健康管理作業者は患者処理を説明する文書を作るのに音声を使うことから利便を受ける。音声認識により、手が空いて、特定の事例を容易に且つ迅速に解析、処理及び報告することが出来る。
無線LANを経由して電気的に接続された医療装置は、次の役に立つ:
この生命科学分野で、サーバ、タブレット、埋込デバイス及びデスクトップに関するLinuxの簡便さ、信頼性及び低価格は、最高である。Windows装置の扱い難さと信頼性がないため米国健康管理分野の文書で電子的に作られているのは僅か約10%しかない。健康管理費用の30%は文書の手書き作成の結果で、治療過誤の多くもまた、処方箋を見た人は誰でも証明出来るように、手書き診断書及び指令書の転写の不正確さによる。
明らかに、これら新技術の市場が存在する。残っているのは、熱心な販売員を抱えたハングリ精神のある会社がこの会社に食い込むことだけである。これら販売員が技術を広めると、多くの需要が満たされ、Microsoftの満たしていない新しい大量市場、補助技術(AT)、が開かれるであろう。実際、この市場は存在するが、身体的障害者及び機能的障害者の双方を含むよう拡張する必要がある。
左様、音声認識は将来に対する偉大な約束である。しかし、これは完全ではなく、改良の必要がある。一つの改良は読唇術を使用して精度を上げることである。別にマルチトーン音声入力がある。その他は、指向性マイクロフォンである。Linux用ハードウエアが大きく且つ強くなるにつれ、各世代の音声認識ソフトウエアが改良されるであろう。
春の真っ盛りで、Woomert Foonlyには別の意味でも素晴らしい日だった。それは1,000ノードLinuxクラスタの些細な易しいコンフィギュレーションで、手の込んだカレー料理が出たとき絶頂に達した。すべては平和だった。Frink Ooblickが、激しいショックを受けた男を抱えて飛び込んで来るまでは・・・。Frinkは、疲れ切った様子のその男を助けて椅子に座らせた。
−「Woomert、全く怪しからん話です。この人はResolv Dot Conf、詰まらない・・いや、兎に角システム管理者です。最近、意地悪い支配人のコンピュータにある種の古いOSを搭載するのを強制されました。分かりますね?そして、今、詳細は分かりませんが、殆ど不可能なことをするよう要求されました。貴方の評判を聞いて(知らない者はいないよ)助けて貰えるかとやって来ましたが、ショックのため疲れて玄関の前で倒れてしまいました。問題は・・・本人に話して貰いましょう」
話を聞きながらWoomert が面倒を見たので、客は落ち着いたようだった。Woomertの「システム管理者コーヒー」は、レシピは(色々の説があって)厳重な秘密だったが、ホモの世界では回復薬として有名だった。
さて、そこで有名な探偵の目が、仕事中の集中を示す光を帯びた。
−「問題を簡単明瞭に説明して下さい」
早くも回復したシステム管理者は、悲し気に頭を振った。
−「ええ、Foonlyさん・・・私が受け取ったのは、出張所が提出したデータを処理するスクリプトでした。問題は、全部雑多な形式で来ることです:私共は健康保健データ処理業者なので、各社でフォーマットが違います。それだけでなく、データの提出方法も違います。平文のデータファイルだけを送る者もいるし、'gzip' や、'compress' や、'bzip' や、'rar' や、'tar' と 'compress' (又は'gzip')及びその他−幸いこれら全部は平文データです−を使って、自分達の所有権アプリケーションから我々にデータ流を渡します。私共のプログラマは、仕様を貰うと直ぐに各種のフォーマット転換を扱いましたが、この勝手気儘な圧縮問題は私に押し付けられたので、お手上げになりました。」
話を止めて深く息を吸い、Woomertのコーヒーを一啜りした。さらに元気が出たようだが、前屈みになったまま、額に腕を置いていた。
「とにかく、この点ではまだ、全部を働かせるので人手が必要で、二人の人間が一日中ファイルの仕分けと解凍だけに掛かり切りになりました。それがなければ、システム全体を自動化出来るのですが、・・・そして同然、管理者からは『何故うまく行かないのか?コンピュータ専門家でないのか・・・』などなどと責められます」
最後に座り直してWoomertを見たとき、歯を食いしばっていた。どんなに恐ろしくても運命を諦めた顔だった。
「本当のところ、Foonlyさん、解決策はあるでしょうか、もう終わりでしょうか?勿論マントラ[1]は知っていますが、出来ればやって見たいのです。ユーザが私を必要としており、彼らを護るシステム管理者がいないと無邪気な魂によだれを流している黒い力を知っています」
弱い老武者の言葉が全く正しいのを認めてWoomertは頷いた。彼もまた黒い奴、一瞬でも餌食になるとユーザの気持ちを完全に引き離す生物、に遭遇して闘ったことがあり、無邪気なものを護る誓いを立てた勇敢なシステム管理者のギルド(http://sage.org/)を知っている(これは、神秘的で神聖なLART[2]の適用を通じて、自分自身を守ることが多いが)。
−「解決しましょう。幸い問題に対する解決策があります。利用出来るツールは研究済みで、Oskar Liljebladの作ったアーカイブマネージャ 'atool' を聞いたことがあると思いますが。」
頷くのを見て、更に続けた。
「よろしい。ならば、それが上のアーカイブ・フォーマット全部以上を扱うことも知っておられるでしょう。Perlで書いてありますが、貴方のスクリプトではそのコードは全く使いません−労力の無駄遣いです。代わりに、'atool'のユティリティの一つ 'acat' を、条件付きの優秀なフィルタとして、使います。為すべきことの全部は、貴方のスクリプトの初めに、次のように挿入することです:
#!/usr/bin/perl -w
# Created by Resolv Dot Conf on Pungenday, Chaos 43, 3166 YOLD
@ARGV = map { /\.(gz|tgz|zip|bz2|rar|Z)$/ ? "acat $_ '*' 2>/dev/null|" : $_ } @ARGV;
# スクリプトの残りが続く
...
−「Foonlyさん、どんなにお礼を言ったら良いか分かりません。言いますまい、だが私がいる場所では何時でも貴方の友達です。皆にこれを見せます……が、私の理解のため−これは何ですか?どんな働きをしますか?」
Woomert はちらとFrinkを眺めた。彼もまた椅子の端に腰掛けて説明を求めていた。
−「Frinkはどう思うかね−これを扱えるかね?ファンクション一つと演算子一つを使っただけで、後は自動的に進む。Perlがコマンド行上のファイルを扱う方法のお陰だけだ。」
Frink は少し赤くなって、神経質になったときいつもするように親指を噛んだ。
−「ええ、 'map' ファンクションの勉強をするよう言われましたが、仲々深いので早くから迷って、そしたらまた新しい問題……」
Woomert は微笑んで、頭を振った。
−「宜しい。. 'map' は、'perldoc -f map' からの情報によると、規定された表現又は表現のブロックを、リストの要素毎に評価する− 'for' に似た種類だが、多くの場合遙かに短く便利だ。私はまた、一時条件付き演算子 ('?:') を使った。これは "if-then-else" 構造と似たような作用をする:
# 3値条件付き演算子−$b がtrueなら $a を5に、でなければ10 に設定する
$a = $b ? 5 : 10;
# "if-then-else" 構造−同一作用
if ( $b ){
$a = 5;
}
else {
$a = 10;
}
/\.(gz|tgz|zip|bz2|rar|Z)$/
これは、ペリオド(文字のドット)に続く規定の拡張子いずれかで終わるすべてのファイル名と一致を調べる。
そこで、ファイル名がレゲーに一致しないときは、3値演算子はコロンの部分の後の '$_' を返す。これは元のファイル名を含むだけである。Perlは次いで、そのファイル名を@ARGVに含まれたものに普通にするように処理する:つまり、そのファイルに対するファイルハンドルを開いて、その内容がスクリプト内で利用出来るようにする。事実、これをおこなうと、PerlでファイルI/Oをおこなう多数の方法の幾つかの上での情報に関し、菱形演算子 ('<>') 上に読み出すこと、STDINファイル取扱い、ARGVファイル取扱いなど、データにアクセスする方法は多数ある」
「他方、現在の要素が一致するときは、3値演算子はコロンの前のコード、この場合は下記、を返す
"acat $_ '*' 2>/dev/null|"
ここで、Perl は現在のファイル名に対し上のコマンドを実行する。構文は少し変に見えるが、これはファイルを処理してエラー・メッセージを無視するのに 'acat' (つまり、この点に追加すると、それが使うアーカイブ・ユティリティ)が必要とするものである。コマンドがパイプ記号 '|' で終わることに注意。ここで起こることは、シェル内でパイプをおこなうのに大変良く似ている。コマンドが実行され、出力がメモリバッファに置かれ、そのバッファの内容は、Perlがそのファイルのため通常開くファイルハンドルの上で利用出来るようになる−アーラ不思議、全くの魔術だ [3]」
「だから、これを長い形に分解すると、次のようになる:
@ARGV =
map { #'map'の BLOCK 構文を使う
if ( /\.(gz|tgz|zip|bz2|rar|Z)$/ ){ # アーカイブ拡張子を探す
"acat $_ '*' 2>/dev/null|"; # 内容の圧縮を解き/パイプする
}
else {
$_; # でなければ、元の名に戻る
}
} @ARGV; # これは「歩き回る」リスト
−「これで解決だ。輝かしい未来が開けた。貴方の問題は解決し、支配人は喜び、ユーザは外から守られる。ささやかな祝賀会に参加するなら、干しブドウ入りプディングを用意した。−−おや、彼はどこに行った?旨いイングリッシュ・プディングなのだが、まあ、出来るだけ早く変更をしたいのだろう……」
脚注
[1] 「横向きでなく下向き」システム管理者マントラ(The Sysadmin Mantra)の気味悪い意味についてヒントの欲しい人は <http://groups.google.com>にあるalt.sysadmin.recoveryのアーカイブを検索すると分かる。分からなければ、知らなくて良いと言うことだ。
Luser Attitude Readjustment Tool(ルーザ性格調整ツール)……LARTクラシックは棍棒として使える2x4その他の大きい木片で、仕事上で出会う以上の面倒をシステム管理者に起こす迷惑メール発信者などの人の頭に付着される。真に効果的なLARTを構成するもの、こぶ付き棍棒、半自動武器、火炎放射器、戦術核兵器、を超える代替システム管理復旧に関し永い間の議論が騒がしく、それぞれに党派がある。 {clue-by-four}と比較せよ。
[3] ファイル・オープンに関する指導については "perldoc perlopentut"、今まで余りに多くのマジックを見て来た人は、@ARGVの中の 'magic' 及び"Dispelling the Dweomer" を参照されたい。
Benは1962年モスコーで生まれた。6才で、フォークをコンセントに突っ込んで火花を散らした時以来、電気に興味を持った。長じて、プリント板に部品を半田付けし4kメモリに合わせるプログラムをして以来、コンピュータの仕事をした。夜、うなされるのを治して呉れる心理学者がいれば、大金を払う。
この装置は、Intel StrongArm (SA-1110) CPUを備えている。フラッシュ・メモリ・サイズは、32Mb又は16Mbで、RAMは64Mb又は32Mbである。主な機能は次の通り:
これら機能のうち幾つかは、ベース装置に設けられた`docking cradle' を用いて可能になる。電源は、充電式電池及び外部交流電源から提供する。
Simputer はGNU/Linux を装備する− kernelバージョン2.4.18 は(多少の補修で)上手く働く。装置には、X-Windowシステム用バイナリと、少数の簡単なユティリティ・プログラムが結合されている。詳細は、http://www.simputer.org/ にあるプロジェクト・ホームペイジから入手することが出来る。
電源投入
「電源ボタン」を押す以外にすることはない。小さいタキシードの絵が現れて、数秒以内に、Xが立ち上がって走る。LCD画面は、触れると働き、小型の「ペン」(変人は爪を使う)を使ってアプリケーションを選びグラフィックインターフェイス内を動かすことが出来る。キイボード入力が必要であれば、ペンと、選ぶことの出来るアプリケーションから単一英文字その他の記号を選ぶGUIプログラム以外の何物でもない「ソフト・キイボード」を使う苦労を覚悟しなければならない。
bashを待つ
GUIは子供用だ。信じられる古いbashプロンプトを見るまで満足出来ないだろう。何度も試す必要はない。Simputerには−シリアルケーブルのつながった−シリアルポートがあり、他端はホストLinux PCの自由ポート(私の場合は/dev/ttyS1)に行く。そこで、通信プログラムを起動して(私は `minicom' を使う)−先ずプログラムを、115200に設定された通信速度(Simputerマニュアルの言うことで、類似の手持ち装置では違うことがある)と8N1フォーマットで /dev/ttyS1 を使うようコンフィギュアし、ハードウエアとソフトウエア・フロー制御を無効にする。minicomでこれをおこなうのは極めて簡単だ−次のようにこれを呼び出す:
minicom -m -s
コンフィギュレーションが終わったら−次のようにタイプするだけ:
minicom -m
驚くことにこれで終わりだ。直ちにログイン・プロンプトが出る。ユーザ名/パスワードを入力するとログオンする。`ls', `ps' など簡単なコマンドを走らせることが出来る筈、 `vi' も使える。
Linux上で通信プログラムを走らせるのに慣れていなければ、何が起こったのか分からないだろう。大したことではない−標準Unixの魔術だ。Simputer上にあるプログラムが、シリアルポート (ttySA0と言うシリアルポート)を監視している−Linux PC上でminicomを走らせると、プログラムとの接続が確立し、これが通信線を通してログイン・プロンプトを送る、応答を読んで認証し、通信線上で相互作用の出来るシェルを生み出す。
minicomがPC端上のシリアルポートを初期化すると、Simputerに対しインストラクションを「書く」(`script' する)ことが出来る。Simputer上で走っているプログラムがシリアル線を流れるデータを監視する考えを求めている−プログラムはminicom自体又はスクリプトから来るデータは問題にしない。次の実験を試すことが出来る:
USBネットワークの設定
SimputerにはUSBスレーブポートが付いて来る。自分のLinux PC とSimputerとの間のTCP/IPリンクをこのUSBインターフェイスを使って確立することが出来る。以下に、そのステップを示す:
usb.c: registered new driver usbnet hub.c: USB new device connect on bus1/1, assigned device number 3 usb.c: ignoring set_interface for dev 3, iface 0, alt 0 usb0: register usbnet 001/003, Linux Device
ここまで来た後、もう少しのコマンドを走らせなければならない:
ここで、kernelをコンフィギュレーションして構築する準備が出来た。その前に、トップレベルMakefile (/usr/local/src/linuxの下)を検査し、二つの変更をしなければならない−トップの近くに次の形の行があるので:
ARCH := <lots-of-stuff>
これを次のように、変える
ARCH := arm
もう一つ変更を加える必要がある。Makefile は次の定義をしている:
AS = ($CROSS_COMPILE)as LD = ($CROSS_COMPILE)ld CC = ($CROSS_COMPILE)gcc
記号 CROSS_COMPILE が空白文字列と等号でむすばれているのに気付く。正常コンパイルの間に、これは、望みの通りAS が`as' に対して定義され, CC が `gcc' に対して定義されるなどの結果となる。だが、クロスコンパイルをするときは、arm-linux-gcc, arm-linux-ld, arm-linux-as などを用いる。だから、CROSS_COMPILE を文字列 arm-linux-と等号で結ばなければならない、つまりMakefileに、次を入力する:
CROSS_COMPILE = arm-linux-
これらの変更をMakefileに加えると、`make menuconfig' を走らせてkernelのコンフィギュレーションを開始することが出来る。(これはMakefileを変更しないでも出来ることに注意。`make menuconfig ARCH=arm' を走らせる)。kernelを間違いなく構築するには、あちこちに少しばかりの細工がいる。ほとんどの事項は変える必要がない−規定値で満足出来る。
コンフィギュレーション手続きが済んだら、次を走らせることが出来る
make zImage
すると数秒で、arch/arm/bootの下に `zImage' と言う名のファイルを得る筈だ。これが、君の新 kernel.だ。
新kernelを走らせる
新kernelを立ち上げて走らせる最も易しい方法を述べる。
Linux PC用ブートローダとして働く LILO又はGrubと全く同じく、手持ちコンピュータもまたその非揮発性メモリに記憶されたブートローダを有する。Simputerの場合、このブートローダは、`blob' と呼ばれる(これは、Linux 最新ラジオ端末プロジェクト`Lart' のため開発されたブートローダだと思う)。マシンの電源を入れると直ぐブートローダが走り始める−Linux PC上で minicom をスタートするときは、`enter' キイを押したまま装置の電源を入れると、ブートローダは、装置のフラッシュメモリに記憶されたkernelのブートを続ける代わりに、次のようなプロンプトを通じる会話を開始する:
blob>
ブートローダ・プロンプトに、次をタイプする:
blob> download kernel
その結果、シリアルポートを通じてコード化されないkernelイメージを君が送るのをblobの中で待つ。そこでLinux PCで次のコマンドを走らせる:
uuencode zImage /dev/stdout > /dev/ttyS1
これは、COMポートを通じて、コード化されないkernelイメージを送り出す−これをブートローダが読み取って装置のRAMに記憶する。この処理が終わると、ブートローダ・プロンプトに戻る。次をタイプするだけで:
blob> boot
ブートローダがkernelを走らせ、それで、コンパイルとダウンロードが終わる。
若干の kernel 細工
kernelに細工しないと格好良くならない。新kernelをコンパイルして走らせた後のステップは、kernelモジュールがコンパイルして走る方法チェックだ。 `a.c' と言う簡単なプログラムを示す:
#include <linux/module.h>
#include <linux/init.h>
/* Just a simple module */
int
init_module(void)
{
printk("loading module...\n");
return 0;
}
void
cleanup_module(void)
{
printk("cleaning up ...\n");
}
次のコマンド行を使ってこれをコンパイルしなければならない:
arm-linux-gcc -c -O -DMODULE -D__KERNEL__ a.c -I/usr/local/src/linux-2.4.18/include
次を走らせて、出来上がった `a.o' をSimputerにftpし、それをkernelにロードすることが出来る:
insmod ./a.o
次を走らせてモジュールを削除することが出来る:
rmmod a
インタラプトの取扱い
上述のプログラムを走らせた後、ある種のハードウエア・アクセスを実証する最も簡単なコード部分を見出すためkernelソースの走査を始めた−そして、ハードキイ・ドライバにそれを見付けた。Simputerには、押すと矢印キイとして働く小さいボタンがある−これらのボタンは、ARM CPUの一般目的I/Oピン(これはまた、私のStrongArmマニュアルの読み方が正しければ、インタラプト源としても働く)に配線されていると思われる。これらのキイを押したとき応答するkernelモジュールを書くのは大変簡単なことで−ハードキイドライバのバージョンを修正し切り詰めただけの小さいプログラムをここ示す−右矢印キイに相当するボタンを押すと−インタラプトが発生しその結果ハンドラが実行される。我々のハンドラは、単にメッセージをプリントする他は何もしない。モジュールを挿入する前に、デバイス上で走っているkernelが規定値ボタンドライバコードを組み込んでいないことを確認しなければならない− /proc/interrupts の点検で充分。
下記のプログラムをオブジェクト・ファイルに(前のプログラムでしたのと同じように)コンパイルし、`insmod' を使ってそれをロードし、/proc/interrupts を探検して、インタラプト行が確保されたことを検証する。ボタンを押すと、ハンドラが呼び出される筈で−/proc/interrupts に表示されるインタラプト計数もまた変わる筈。
#include <linux/module.h>
#include <linux/ioport.h>
#include <linux/sched.h>
#include <asm-arm/irq.h>
#include <asm/io.h>
static void
key_handler(int irq, void *dev_id, struct pt_regs *regs)
{
printk("IRQ %d called\n", irq);
}
static int
init_module(void)
{
unsigned int res = 0;
printk("Hai, Key getting ready\n");
set_GPIO_IRQ_edge(GPIO_GPIO12, GPIO_FALLING_EDGE);
res = request_irq(IRQ_GPIO12, key_handler, SA_INTERRUPT,
"Right Arrow Key", NULL);
if(res) {
printk("Could Not Register irq %d\n", IRQ_GPIO12);
return res;
}
return res ;
}
static void
cleanup_module(void)
{
printk("cleanup called\n");
free_irq(IRQ_GPIO12, NULL);
}
将来の作業
Linuxベースの手持ちコンピュータには−装置について勉強するにつれ、楽しみな機会が沢山ある、見出したことを読者と共有したい。
参考資料
Yacc (Yet Another Compiler Compiler「更に別のコンパイラ・コンパイラ」) は、context-free grammar(文脈自由の文法)で書かれた言語の解析に用いられる。Yacc又はBisonで文脈自由の言語すべてが扱える訳でなくLALR(1)であるものだけ解析することが出来る。具体的に言うと、前を見るとの単一トークンの付いた入力文字列の任意の部分を解析する方法を告げることが出来なければならないことを意味する。この記事ではそれを詳しく説明する。
Bison はまたYaccスタイルのパーサ・ゼネレータである。これは、主としてRobert Corbettが書きRichard Stallman がそれをYacc コンパチブルにした。BisonとYaccの間には相違があるが、それはこの記事の目的ではない。
言語と文脈自由文法
文法は、意味のある文章を構築する規則として英語と結合することが出来る。おなじことが文脈自由文法についても言える。ほとんどのプログラム言語は文脈自由文法に基づいている。任意の文法の規則一式が、意味構造の構築に役立つ構文分類を扱う。具体的に言うと、一つ以上の構文分類を規定しその部品からこれらを構築するための規則を示すことを意味する。例えばCでは、`expression' がグルーピングの一種である。expression(式)を作るための規則の一つは「式はマイナス記号と別の式で作ることが出来る」である。別のものは「式は整数である」となるであろう。規則は循環的であることに気付いた筈だ。事実、このような文法はすべて、循環から導かれる規則を有しなければならない。
このような規則をあらわすための最も普通の公式システムは、Backus-Naur Form又は「BNF」である。BNF文法はすべて文脈自由文法である。
言語のための文法規則においては、グルーピングをシンボルと名付ける。シンボルで小さいコンストラクトに分割出来るものをノンターミナルと呼び、分割出来ないものをターミナルと呼ぶ。入力の断片が単一のターミナルであると、これをトークンと呼び、単一ノンターミナルであると、これをグルーピングと呼ぶ。`identifier', `number', `string' などはトークンとして区別され、`expression', `statement', `declaration', `function definition' などは、C言語のグルーピングである。ここで、完全な文法は追加の言語構造をノンターミナルシンボルの別の一式として使うことがある。
基本的解析技術
文法Gのためのパーサは、入力文字列 'w' が文章Gであるか否かを判定する。'w' が文章Gであれば、'w' に関する解析ツリーを作るり、そうでないと、エラーメッセージを出す。解析ツリーとは、文字列 'w' の構文をあらわすダイアグラムとの意味である。文脈自由文法用のパーサには基本的な型が二つある。bottom-up(ボトムアップ)と top-down(トップダウン)で前者が我々の関心の対象である。
ボトムアップ解析
これはShift-Reduce Parsing(シフト還元解析)とも言われる。こここでは、入力に関する解析ツリーの構築が枝葉(ボトム)から始まり、根(トップ)に向かって進む。言い換えると、これはその作成規則に基づいて、入力文字列をスタートシンボルまで「還元」する過程になる。例えば、次の文法を考える:
S -> aAcBe A -> Ab/b B -> d
w = "abbcde" とする。我々の目的は、文字列 `w' をSに還元することである。"abbcde" を走査して、あるプロダクションの右辺に一致する副文字列を探す。副文字列 `b' と`d' が的確である。さらに、検討すべきbが二つある。最も左の `b' で進もう。これをプロダクションA -> bの左辺 `A' で置換する。文字列は "aAbcde" となる。これで、`Ab', `b'、`d' がそれそれあるプロダクションの右辺に一致するのが分かる。今度は、`Ab' を、プロダクションA -> Abの左辺 `A' で置換する。文字列は "aAcde" となる。次いで、`d' を、プロダクション B -> d の左辺 `B' で置換すると "aAcBe" が得られる。文字列全部を S で置き換えることが出来た。
基本的には、プロダクションの右辺を左辺で置き換えており、この処理が還元と呼ばれる。極めて容易しいが、常にとは限らない。還元のため選んだ副文字列を、開始文字Sに分解出来ないことがある。
プロダクションの右辺である副文字列で、入力文字列にあるそのプロダクションの左辺で置き換えたとき最終的にスタートシンボルになるものを `handle'(ハンドル)と呼ぶ。そこで、ボトムアップ解析の手続きは「ハンドル」を見出して還元するものと見なされる。還元の手順を `handle pruning' (ハンドル刈り込み)と言う。
シフト還元解析のスタック実行
シフト還元解析を実行するのに便利な方法は、スタックと入力バッファを使用することだ。スタックのボトムと入力の右端に '$' 記号を使う。
中心になる考え方は、ハンドルbがスタックのトップに来るまで、入力シンボルをスタック上にシフトすることだ。ここでbを適切なプロダクションの左辺に還元する。パーサは、エラーが検出されるまで又は、スタックがスタート記号を含み入力が空になるまで、この循環を繰り返す。
事実、シフト還元解析がおこなうことの出来る作用が四つある。それらは:
これらの考え方が作用する有様を下記の例で見よう。
下記の文法を考える:
E -> E + E E -> E * E E -> (E) E -> id
入力文字列をid1 + id2 * id3とする。
図1
スタック 入力 作用 −−−−−−−− −−−−−−−− −−−−−−−− (1) $ id1 + id2 * id3$ シフト (2) $id1 + id2 * id3$ E->idによる還元 (3) $E + id2 * id3$ シフト (4) $E+ id2 * id3$ シフト (5) $E+ id2 * id3$ E->idによる還元 (6) $E+E * id3$ シフト (7) $E+E* id3$ シフト (8) $E+E* id2 $ E->idによる還元 (9) $E+E*E $ E->E*Eによる還元 (10)$E+E $ E->E+Eによる還元 (11)$E $ 承認 シフト還元解析作用 |
ボトムアップのツリー構築には二つの側面がある。
1.入力シンボルaをスタック上にシフトするとき、ラベルがbの1ノード・ツリーを作る。このツリーのルートとイールドの両方がaで、イールドがシンボルaに対する(ゼロ還元により)「還元」されたターミナルの文字列を真にあらわす。
LR 解析アルゴリズム
LALRの構築には、LRパーサの構築に関する基礎知識が必要である。LRパーサは、入力を左から右に走査して、最も右の誘導体を逆に構築するので、その名がある。
パーサは、文法用に解析表を作る。解析表は作用ファンクションACTIONとゴーツー・ファンクションGOTOの二つの部分から成る。
LRパーサには入力、スタック及び解析表がある。入力は、左から右に、一度に一つ宛、読む。スタックは、sm をトップとして、s0X1s1...Xmsm の形を取る。各 Xi は、文法シンボルで、si ステートと呼ばれるシンボルである。各ステート・シンボルは、その下に含まれる情報を要約し、シフト還元判定を案内するため使用される。
ファンクション ACTION は、スタック頂上にあって現在の入力シンボルであるsmに関する値を記憶する。入力 ACTION[sm, ai] 次の四つの値のうち一つを取る:
ファンクションGOTO は、ステートと文法シンボルを引数として取り、ステートを生じる。入力シンボルが文法のターミナルとノンターミナルである決定論的有限オートマトンの転移表にある程度似ている。
LRパーサの構造は、第一成分がスタック内容で、第二成分が未消費入力であるペアである:
(s0 X1 s1 . . . Xm sm, ai ai+1 . . . an$)
パーサの次の移動は、現在の入力シンボルaの読取値と、スタック頂上のステート sm により、次いでアクション表の入力 ACTION[sm, ai]を参考にして定まる。アクション表入力に関する上述の四つの値が、下記のように四つの異なる構成を生じる:
(s0 X1 s1 . . . Xm sm ai s, ai+1 . . . an$)
ここで、この構成が現在の入力シンボル ai をシフトするとスタックに対する次のステートs = GOTO[sm, ai]; ai+1 が新しい入力シンボルとなる。
(s0 X1 s1 . . . Xm-r sm-r A s, ai ai+1 . . . an$)
ここでs = GOTO[sm-r, A] で r はBの長さ、プロダクションの右側、である。ここで最初に飛び出す2r個のシンボル(ステートシンボルr個と文法シンボルr個)が、ステート sm-r を露出して、スタックをオフにする。パーサは次にプロダクションの左側Aと、ACTION[sm-r, A]に関する入力sを、スタック上にプッシュする。還元移動では、現在の入力シンボルは変更されない。具体的に言うと、一連の文法シンボルXm-r+1 . . . Xm はスタックに出され、常に還元プロダクションの右側Bと一致する。
LR解析アルゴリズムは、単純である。 s0 を最初のステートし a1a2...an 解析すべき文字列とすると、LRは初め(s0, a1a2...an$)の構成である。続いてパーサは、承認又はエラーに合間で移動を実行する。
前に、GOTOファンクションが本質的には、入力シンボル(ターミナルとノンターミナル)ステートが引数として取られたとき別のステートを作る決定論的有限オートマトンの転移表でると言った。したがってGOTOファンクションは、各ノード即ちステートが文法におけるプロダクションである要素を持った項目の一式である(方向を持った)グラフ様の仕組みを用いてあらわすことが出来る。この要素は、項目のコアを含む。転移をあらわす縁は、一つのステートから別のステートへの転移が予め定められたシンボルでラベルを付ける。
LALR (lookahead-LR)技術において、共通コアを持つLR項目は合体させられるので、解析作用は、作られた新GOTOファンクションに基づいて決定される。得られたテーブルは、LRテーブルより遙かに小さいが、殆どのプログラム言語の共通構文が、LALR文法を用いて表現することが出来る。
テーブルの構造には深入りしない。パーサ作製用の Yacc と言うツールの使用を説明する。
Yaccを用いる計算機
Yaccへの入力は三つの部分に分けられる:
数値の加減が出来る小型電卓を設計して、これを説明する。Yacc入力ファイル用定義セクションから始めよう。
/* File name - calc1.l*/
%{
#include "y.tab.h"
#include < stdlib.h >
void yyerror(char *);
}%
%%
[0-9]+ {
yylval = atoi(yytext);
return INTEGER;
}
[-+\n] {
return *yytext;
}
[ \t] ; /*空白を飛ばす*/
. yyerror("Unknown character");
%%
int yywrap(void) {
return 1;
}
Yaccはパーサを走らせたときファイル y.tab.cを作り、その他に別のファイル y.tab.h も作る。Lexはこれらのファイルをインクルードし、トークン値に関する定義を利用する。Lexはトークンに結合する値を変数 yylvalで返す。だが、トークンを手に入れるため、yaccは戻り値が整数の yylex を呼び出す。
yacc の入力仕様を下に示す:
/* file name calc1.y */
%{
int yylex(void);
void yyerror(char *);
%}
%token INTEGER
%%
program:
program expr '\n' { printf("%d\n", $2); }
|
;
expr:
INTEGER
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int main(void) {
yyparse();
return 0;
}
ここで、文法はプロダクションを用いて規定されている。プロダクションの左辺は、ノンターミナルに続いてコロン、次にプロダクションの右辺がある。括弧の中身は、プロダクションに結合する操作を示す。では、規則で決めていることは?
これは、プログラムがゼロ以上の式を含むことを決めている。各式は、新しい行でで終わる。新しい行が検出されると、式の値をプリントする。
ここでyaccを示されたように実行する:
yacc -d calc1.l
メッセージ "shift/reduce conflict"(シフト/還元競合) が出る。shift/reduce conflict(シフト/還元競合) は、文法が曖昧で、一つより多い誘導ツリーがある可能性のあるとき起こる。これを理解するには、シフト還元解析のスタック実行に示した例を考える。ステップ6で、シフトする代わりに、文法通り適切に還元することが出来た。このとき、加算は乗算より高い優先度を持つ。
これ以上進む前に、別の種類の競合、つまり還元-還元競合を理解しなければならない。これは、スタックシンボルの還元に一つより多い選択肢があるとき起こる。例えば、下の文法では id を T 又はEに還元することが出来る。
E -> T E -> id T -> id
Yacc は、競合が起こったとき既定値動作を取る。シフト−還元競合があると、yaccはシフトし、還元-還元競合があると、リスト内の最初の規則を使用する。yaccはまた、競合が起こったとき、警告メッセージを出す。警告は文法を曖昧でなくすると消える。
元に戻って、yaccは二つのファイルy.tab.c とy.tab.hを作る。注意しなければならない行の幾つかは、下記である。
#ifndef YYSTYPE typedef int YYSTYPE #endif #define INTEGER 257 YYSTYPE yylval
内部的には、yaccはメモリにスタック二つ、解析スタックと値スタック、を維持する。原稿解析ステートは、解析スタックに存在するターミナル及び又はノンターミナルにより判定される。値スタックは常に、解析スタックの仮名の各要素に値を結合するYYSTYPE 要素のアレーと同期しこれを保持する。そこで例えば、lexがINTEGERトークンを返したとき、yaccはこのトークンを解析スタックにシフトする。同時に、対応するyylval 値があたいスタックにシフトされる。これにより、任意の時期にトークンの値を見出すのが容易になる。
そこで、規則
expr: expr '+' expr { $$ = $1 + $3; }
を適用すると、"expr '+' expr" を追い出してそれを "expr". で置き換える。言い換えると、プロダクションの右辺を左辺で置き換える。プロダクションの右辺の第一項について値スタックは "$1" を含み、第二項については "$2" などなどを含む。 "$$" は、還元が起こった後のスタックの先頭を指定する。上の作用は、二つの式に結びついた値を加算し、三つの項をスタックから追い出して単一の和をプッシュし直す。こうして、二つのスタックは同期されたままで、新しい行に出会うと、expr に結合する値がプリントされる。
必要な最後の行は 'main' である。だが、文法が曖昧なので、yaccはシフト−還元警告を出して、規定値操作としてシフトを使って文法を処理する。
学ぶべきことがもっと沢山あるので、ここではそのファンクションを示さない。それらは次のパートで説明する。文法から曖昧さを除いて、そのための計算機を設計する方法もまた説明する。もっと良く理解するには、文法にもっと多くの機能性を組み込まなければならない。
著者紹介:
私は、インド、 Kerala州、Trichurの国立工科大学のコンピュータ科学最終学年の学生だ。Linuxの他に理論物理学の本を読むのを楽しみにしている。
Knoppix は、debian GNU/Linuxに基づく生のCDディストリビューションで、最小のハードウエア上でも扱い易い多数のアプリケーションを含んでいる。Knoppixは、多数のグラフィックカード、サウンドカード、SCSI及びUSB装置をサポートする。Linuxデモ、教育用CD、救済システムとして使うことが出来、商業製品デモ用プラットホームとして使うことも出来る。ハードディスクには何もインストールする必要がない。お好みなら、CD全体をハードディスクにインストールすることの出来るインストレーション・プログラムがある。完全なdebianインストレーションを20分で完了することが出来る。この記事では、knoppixから自家用の生のCDを構築した方法を述べる。このCDを作った主な動機は、好きなアプリケーションでCDに無いものを含むことだった。記事にエラーがあったら、ここhereにメールされたい。
始めるにはknoppix イメージをknoppix サイトからダウンロードしなければならない。毎週又は隔週リリースがある。イメージには、英語とドイツ語の二つがある。私は31-10-2002-ENリリースに基づいて設定した。
イメージを入手したら、下記のように最新のバージョンにrsyncするとよい。しかし、knoppixイメージは圧縮されているので、帯域幅の心配はない。knoppix cdromを持っているなら #dd if=/dev/cdrom of=knoppix.iso)を使ってイメージを作る。
Knoppix isoイメージの名前を付け直して、現在のリリース名を反映する
例
KNOPPIX_V3.1-23-10-2002-EN.isoをダウンロードした
KNOPPIX_V3.1-31-10-2002-EN.isoに更新したい
( knoppixの他の任意の rsync サイトを使うことが出来る。常に最新リリースをチェックすること)
膨大なハードディスク空間とメモリのあるコンピュータ。私は128 mb RAMの付いたPentium 3 950MHZマシンでおこなった。
.
沢山のディスクスペースを空ける。KNOPPIX・CDの作り直しには沢山の土地が必要だ。
私は20 GB ハードディスク上に新しいパーティションを二つ作った
swap用に2GB
作り直し作業用に5GBのhda3(充分な空間があれば既存Linuxパーティションを使ってもよ
ここでKnoppix cd を使ってマシンをブートする(knoppixをハードディスクにインストールした後でも作り直すことが出来る。インストールの方法はここ here にある)
ブートプロンプトでenterを押す。. Knoppix がGUIにグーとする。. 規定値は KDEだ。お望みならブートプロンプトで変えることが出来る。私はKDEにブートした間に作り直した。読者は Knoppixに慣れていると考える。ブートに関する情報は、CD上の Knoppixチート・コードを見られたい。
KDEメニューからルートシェルを開く(K/Knoppix/Root-shell)。#プロンプトが得られる。
cfdiskを走らせる
次に、必要なパーティションを作らなければならない。私は、2GBの hda2と5GBの hda3を作った。
2GBパーティション(私の場合 /hda2 )型をswapとする
5GB パーティション(ここでは/hda3)型をLinux native(ext2)とする
変更パーティション情報をセーブする
cfdiskを出る
圧縮ファイルを作るには沢山のswapスペースを必要とする。私は、以下を用いてswapを作った
# mkswap /dev/h
# swapon /dev/hda2
5GBパーティションを Knoppix ファイルシステムにmountする
# mount /dev/hda3 /mnt/hda3
作り直しのための基本設定はこれで終わり。
knoppix CDは、ほぼ下図のように組織されている(間違っていたら直して下さいWincows又は別のLinuxディストリビューションから見ると違っているかも知れません)。
/--デモ
|--トーク
|--index.html
|--autorun.bat
|--autorun.inf
|--knoppix.ico
|--KNOPPIX
|--KNOPPIX
|--boot.img
|--background.gif
|- (ここに幾つか別のファイル)
CD上の /KNOPPIXディレクトリにあるファイルKNOPPIX は約700MBだ。このファイルはファイルシステムの圧縮イメージcompressed image を含む。このファイルのみを修正しなければならないが残りのCDには(ブートイメージ開始ファイルなどを変えたいのでない限り)触らない。
このツリーの下でソフトウエアを搭載/削除しなければならない(ネットワークしていなければ、自分のソースを(例えば)/mnt/hda3/KNOPPIX/ にコピイする。していればそれらを/mnt/hda3/KNOPPIX/var/cache/apt/archivesにコピイする)
ここで、ファイルシステムのルートを/mn/hda3/KNOPPIX に変更する
#chroot /mnt/hda3/KNOPPIX
# プロンプトが戻る(ここで/dev/nullパーミッション否認メッセージが出たらcontrol Cを押すだけ)
/ ( chrooted to /mnt/hda3/KNOPPIX)にいる。
次に proc ファイルシステムをマウントする。
#mount -t proc /proc proc
を加える。( 面白い問題を経験した。/etc/resolv.confは /etc/dhcp/resolv.confに対するシムリンクだった。Ping は働かなかった。そのシムリンクを削除して、もう一度 /etc/resolv.conf を作ったら働いた。終わったらシムリンクの復旧を忘れないこと)
ここでifconfigを使ってipアドレスを検証する(chrootの外で持つのと同じ筈)。そして、ping google.comを試す。それが出来ればchrootの下のネットワーク設定は終わり。aptをアップデートする。
必要なソフトウエアは何でもaptを使ったインストール/アンインストールすることが出来る。元のCDには沢山のソフトウエアがインストールされているので、余り易しいことではない。以下は、私が削除したパケージの一部のリストだ。