Linux Gazette 2003年2月号 #87
今月のLinux Gazette の主な記事
n今月のニュース
 ・法制化
 ・一般ニュース
 ・ディストリビューション関連ニュース
 ・ソフトウエア及び製品関連ニュース
n 究極のエディタ
n クイックスタート・ネットワーキング
n 到る処で働くKeep-Aliveプログラム
n Linuxベースの音声認識
n Perl:今月のワンライナ−気紛れアーカイブの冒険
n Simputerと埋込Linuxの楽しみ
n Yacc/Bison - パーサ・ゼネレータ- パート 1
n KnoppixからオードーメイドDebian CDを構築した
n OpenSSLの暗号ライブラリを用いる暗号化
 
(訳者注)
原文を一括して一つのファイルでセーブするには、下記のリンクがあります。
TWDT 1 (gzipped text file)
TWDT 2 (HTML file)
前者はテキスト形式で、後者はHTML形式です。但し、HTML版のリンクが働くとは限りません。
 
 
 
 
今月のニュース
▼▼▼ 法制化 ▼▼▼
 
何かが得られる・・・
CSS登録のDVDに関する或るDeCSSコンピュータ・コードに従事した結果、刑事責任に問われた facing criminal charges ノルウエー人プログラマJon Johansenが、すべての素因について無罪判決を言い渡された acquitted on all counts。Jonは、通常はハッカーが他人のコンピュータシステム入ろうとした場合に適用される他人の財産の侵害に関する法律の下で訴追された。この法律は被告が自分の財産を侵害したと訴追されたことはなく、本件で法廷は、自分の財産を使う消費者の権利を保護するノルウエー法を引用して、citing Norwegian law protecting a consumer's rights to use his own property検事に不利な判決を下した。判決は英訳 translation of the judgementは、 EFFがオンラインにした。
戦いは未だ終わっていない。ノルウエー検事は上訴した appeal the verdict。上訴が認められると、本件はもう一度ノルウエー上訴審で裁かれる。映像産業弁護士Charles Simsは、Jon Johansenと同じことを米国人がしたら、必ず法律違反になると断言したwas keen to assert
 
何かを失う
米国最高裁は、2年前に与えられた著作権の20年延長を認める判決を下した has ruled to support 。意見は7対2で分かれ、判事 StevensBreyerが少数意見であった。
この憲法訴訟は、パブリックドメイン書物をオンラインで配布するdistributes public-domain books online、Eric Eldredが、米国連邦議会が与えた延長により、著作権が復活したためこれら著作を幾つか除外remove some of these worksしなければならないと気付いたときはじまった。本件に関しては eldred.ccに大量の情報がある。Lisa Reinは、本件に関する報告と資料の抜粋 selection of reports and resources をまとめた。
Eldredの事件で問われた問題は、こんな方法で著作権を延長するのが連邦議会に取って合憲かどうかであった。この議論には(著作権作品に数百万ドルも持っているとして、公衆から援助される去れる望むかにつき)双方から強い意見があったが、裁判所は連邦議会がこの延長をする権利を有すると判決した。これは、すべてが失われたことを意味しない。民主主義国家の政府には、市民の希望を満たす責任があり、それにしたがって行動すると考えられている。だから、市民は自分達の選良に対しこれらの問題に関する意見をまとめるのが大切である。政府が単に法案を通過させることが出来ることは、法案を通過させることを意味しない。次の選挙の投票で高価な代償を払うと思うときは特にそうだ。
これは特に欧州の読者に関係する。欧州の著作権は50年だ。ここで重要なのは、50年前は近代音楽録音の始まった時期なので、今に至るまで、今でも有名な芸術家による程度の高い録音の流れがパブリックドメインに入って来ている。業界は著作権延長でロビー活動をしておりlobbying to have the terms of copyrights extended 、海賊行為などの言葉をまき散らしている。Dean Bakerが指摘するように pointed out、作品の過去に遡る著作権延長は、創作性を奨励もしないし「科学や有用な芸術の進歩を促進もしない」 "To promote the Progress of Science and useful Arts"。その代わり「消費者の負担を増やし、経済的効率を下げる」" raises costs to consumers and leads to increased economic inefficiency" 。簡明直截な結果は、業界の独占と、人間らしい労作を大衆から奪おうとして、全体のためにはこれが良いのだと言う telling us it was all for our own goodのを止めないことだ。
 
DMCA

毎月皆様にお届けしている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の四年間)だ。

 
 
 
 
▼▼▼一般ニュース▼▼▼
MEN Microの新M-モジュール
MEN Microから新しいデジタル入力M-モジュールがリリースされた。これらは環境と安全性に関する厳しい使用に合致する設計となっており、特に鉄道用に開発されたが、衝撃、振動、温度など過酷な条件が関わる広範囲の産業システム用に使うことが出来る。
M31及びM32と命名されたM-モジュールは、それぞ16このバイナリ・チャンネルをれ制御プラットホームに対し提供する。ANSI認証M-モジュール規格に合致しているので、CompactPCI、PXI、VMEbus、PCI等をはじめとする多数のバス・ベース・システムに搭載することが出来るし、小型事務用システムで使うことも出来る。
M31及びM32用のソフトウエア・ドライバは、Windows, Linux, VxWorks, QNX, RTX, OS-9用に利用することが出来る。
 
 
 
 
 
▼▼▼ディストリビューション関連ニュース▼▼▼
Ark
Ark Linux は、Red Hat の前職員Bernhard Rosenkraenzerが率いる新しいディストリビュータだ。Red Hat 7.3/8.0を基礎とし、無料アルファのダウンロード downloads入手出来る。
 
Debian
Debian Weekly Newsは、改良CDイメージのセットを作ったとのSteve McIntyreの発表 announcement を報じたreported 。これは、3.0r1からの新しい更新パケージを含む。

またDebian Weekly Newsからfrom Debian Weekly News新DebianパケージのRSSフィードRSS feed of new Debian packages入手に関する報道もある。


Debianプロジェクトの現リーダBdale Garbeeが、オーストラリア新聞Ageとインタビューしたhas been interviewed

 
Eagle
Eagle Linuxは、個人用埋込フロッピイと、CDベースのブート可能ディトリビューションを作るユーザの助けとなる完全なオープンソース文書を提供する手引き書ベースのLinuxディストリビューションだ。
 
Gentoo
Gentoo Linux は、Gentoo Linuxの来るべき1.4バージョンに関する第二リリース候補を発表した。1.4_rc2で新しいのは、Gentoo Reference Platformだ。これは、初期インストレーションinstallationを速くするためのバイナリターボール一式だ。x86アーキテクチャ及びppcアイーキテクチャ用のバイナリインストレーションとして現在 X, GNOME, KDE, Mozilla, OpenOfficeを入手することが出来、その他も続く。
 
Mandrake
最近、by The Register/NewsForgeby Open for BusinessがMandrake 9.0 を見直した。

Mandrakeが現在急激な経済問題に見舞われていることが、先月広く報じられた。その結果、会社経営者はChapter-11 style protection(二章型保護)を申請した。その目的は、休止期間を与えて、債権者からの圧力なしに経済再建が出来るようにするためである。フランス裁判所は計画を承認した approved the planので、この期間の後、当社はもっと良い状態になると思われる。

 
SCO
The SCO Group は、 Wincor Nixdorf と共同して北米小売業者にLinuxベースの小売りPOSソリューションを提供する計画を発表した。この関係は、Wincor Nixdorfのハードウエアの機能性と融通性を、SCOオペレーションシステムの安定性と信頼性に結合することにより、小売顧客に経済的で信頼性のある選択肢を与える。合同小売ソリューションは、Wincor Nixdorfの BEETLE POSファミリとSCOの Linux POS ソリューション、SmallFootを頼りにする。
 
SuSE
SuSE Linux は、ユーザーにMicrosoft Office アプリケーション一式の完全機能性を与えるデスクトップLinux製品が入手出来ると発表した。1月21日から入手出来るSuSE Linux Office Desktopは、廉価でコンギギュウア済みのデスクトップを求める小企業と同時に、Linux経験が全くか殆どない個人の使用を目論んでいる。
 
UnitedLinux
UnitedLinuxは、完全OSDL統合の計画を発表した。Carrier Grade Linux (CGL) 1.1は、UnitedLinux 1.0用設定を特徴としており、通信業者用アプリケーションを標準Linux環境内で開発し展開する能力を強化して配布される。
UnitedLinuxの統合パートナーSuSEがHP、IBM、Intelと一緒に開発した特徴−当初はIntelベースのハードウエア・プラットホームを目標−により、電気通信プロバイダは、標準のモジュラー通信プラットホーム上で新製品とサービスを開発して展開することが出来る。

Linux社会用専門認証プログラムLPI と、UnitedLinux LLCは、 UnitedLinux専門認証プログラム(professional certification program)の販売協力協定に署名した。
 
 
 
 
▼▼▼ソフトウエア及び製品関連ニュース▼▼▼
KDE
KDE 3.1 がリリースされた been released.。
 
Linux Kernelの理解、第二版
O'Reilly & Associatesは、Kernelバージョン2.4を含むため更新したUnderstanding the Linux Kernel (Linux kernelの理解)の新版をリリースした。2.4は、バージョン2.2とは大いに異なる。仮想メモリシステムが新しくなり、マルチプロセッサ・システムに関するサポートが改良され、ハードウエアの新しいクラスが追加された。
 
Aqua Data Studio 1.5
AquaFoldは、Oracle 8i/9i、DB2 7.2/8.1、Microsoft SQL サーバ2000/7.0、Sybase ASE 12.5、MySQL、PostgreSQL、JDBC ドライバをはじめとする主要データベース・プラットホームすべてをサポートするフリー・データベース・ツール Aqua Data Studio 1.5のリリースを発表した。 Aqua Data Studio はまた、Microsoft Windows, Linux, OSX 、Solaris1.5などSun MicrosystemのJavaプラットホームを走らせる設計の主要OS全部をもサポートする。Aqua Data Studio は、すべてのプラットホーム上で洗練された堅実なインターフェイスを提供することにより、開発者がデータベースとアプリケーションを開発する速度を上げる設計となっている。Aqua Data StudioのフリーダウンロードFree downloads とスクリーンショットscreenshots とを利用することが出来る。
 
OpenMFG
OpenMFG は、オープンソース・ソフトウエアを使って企業資源計画(ERP)アプリケーションを小製造業者に持ち込む会社であるが、オープン・パートナ計画に最初のメンバー十名を迎えた。
 
Copyright © 2003, Michael Conry. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February 2003
 
 
 
 
究極のエディタ
By Stephen Bint
 
我々の解放者となる宿命を持ったC++プログラマが何処かにいる
 
究極のエディタの時機が来た
linuxコンソールにまともなものが一つもない間に、Windowsユーザが優れたテキスト・エディタの選択に甘やかされたら、どうなるだろうか?Linuxは、お互いの利益のため良いツールの開発に献身する良いプログラマに支えられた良いOSだ。テキスト・エディタはプログラマの最も重要な頻繁に使われる道具だ。Linuxコンソールのエディタは、未だ下らない。これでどうなるのだ?
WindowsからLinuxに移った我々のような者は、最低限マウスを使うテキスト選択が出来てマウスで選べるメニューとダイアログを有するテキスト・エディタを待ち望んでいる。すべてのエディタの中で、Midnight Commanderディスクナビゲータに組み込まれたmceditだけがこれら特性を持つ。残りには、ダイアログもマウスインターフェイスもなく、あっても限られた変なものに過ぎない。
それでもmceditには致命的な傷がある。好きになれないその動作、又は欠けていて追加したい機能についての何かがあったとき、その問題を解くためのソース解析が、最初から自分でテキストエディタを書くよりも難しいことに気付くだろう。残念ながら、mceditは極めて基本的なので、追加機能を必要とするが追加は容易でない。
作者以外の誰かが入り込むのには、余りに複雑で資料が少なかったら、オープンソースがオープンである意味はないだろう?
これを正視しよう、我々は皆同じだ。コードは書くが文書を書くのは苦手だ。最高のアルゴリズムを書くのは面白いが、初心者にその働きを説明するのは、苦痛だ。それでも誰かが、メンテナンスを頭に置いてエディタを書く面倒を取り、C++ファンクションをそのメニューに加える簡単な方法で構築するなら、今まで書かれたエディタのうち最終的なものになるだろう。動作の変更が容易で任意のファンクションを追加出来るエディタが一つあれば、エディタを書く面倒をする者は、いなくなる。
 
罰当たりな言葉
原理主義者はこの点で、emacsは拡張可能だと言うだろう。その通りだが、拡張するには第二の言語を学ぶ必要がある。その他に、基本的エディタのユーザインターフェイスは、未洗練で分かり難く、半端なモジュール追加で改良することは出来ない。
Linuxの使用を望む我々の中には、ソフトウエア・スーパーマンでない普通の人もいる。最初の言語の学習に格闘している人に、エディタを望みのままに働かせるには同時に第二の言語を学ばなければならないと言うのは酷であり不必要だ。
そんなことは決してしない。emacはツールではない。これは知能試験だ。賢くてemacsの学習などチャンチャラなエリートに対し愚か者が反撃する時機が来た。meditの使い方を学ぶ必要はない。期待通りのものではないから、学ぶ理由はない。
究極のエディタは、emacsのあるべき姿、直感的なマウス−メニュー・インターフェイスを備えた拡張可能のエディタになるであろう。[編集者注記:emacsはマウスとプルダウン・メニューが発明される前に生まれた]。第二言語で状況を複雑にする代わりに、拡張はC++で書く。自分自身のメニューコマンドを搭載する方法を説明したプログラマーの手引きを付け、ソースの解説をして、その基本的動作につき何かを変更したいとき、探しているモジュールを見出し易くする。これは日曜大工エディタ・キットになるだろう。
 
全く素晴らしいツール
究極のエディタが出来上がったら、皆が望むものになるだろう。それをダウンロードして構築すると、mceditの基本的機能性を持っていると思うだろう。これには、マウス選択があり、マウス選択メニューがあって、ディレクトリをダブルクリックしてディスクをナビゲートすることの出来るファイル・オープン・ダイアログボックスがある。
持っているファンクションは少なく、File Open, File Save, File Save As, Exit, Cut, Copy, Paste, Delete、Helpなどであろう。最初は検索ファンクションがないが、READMEで検索ファンクションを含むソースファイルを説明し、追加方法を簡単に説明する。ソースに追加する行は既にその場所にあるがコメントアウトしてあって、検索ファンクションの追加が容易になっている。
検索ファンクションを追加するには、次のようにする。

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山の上に建ってから、一ヶ月も経たないうちに、ダイナマイトで吹き飛ばされてその代わり君の銅像が建つだろう。

参考資料

SlangJohn E. Davis作。Slangは、殆どのプログラマが推薦するキイボード/マウス/カラー・インターフェイス・ライブラリとしては、陰が薄いと思われる。極めて賢い人なら、全くコンソール・インターフェイスに関する Midnight Commanderソースの一部であるSlangを使う方法を見出すだろう。これは小さく、Linuxコンソール上でテキスト選択が出来るけれども、telnet windowsであっても、能力の低いターミナル上で限られた機能を与えるに過ぎない。

CTIO、Stephen Bint作。私が今まで書いたうちで、遙かに簡単で最良のコンソール・インターフェイス。Linuxコンソール及びDOSにおける唯一の作品、rxvt/xtermでも telnet windows でもない(だが僅か42k)。これを書く上での苦労はここ here.を読まれたい。

emacs,、Richard Stallman作。フリー・ソフトウエア歴史上の一里塚。

 

著者紹介
Stephen は、森のテントに住むホームレス英国人。ゴミ箱の残飯をあさり、道で拾った吸い殻を吸っている。Cプログラマとして短期間働いたこともあるが、「全くの素人」と称している。

 

Copyright © 2003, Stephen Bint. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February 2003
 
 
 
 
クイックスタート・ネットワーキング
By Edgar Howell
 
緒言
休日中に家でネットワークに関する仕事をする充分な時間があった。だが、着手するのはいつも問題で、どのマシンで何をすべきかの決定に暇が掛かった。始めてから振り返ると、何でもなかった。
この記事は、実験中に取った私のノートより基本的に多く、正しくないことは除外した。再現のため、私の知り得る限り、為すべきことと参考になることを書いた。
長くならないようにするためと、私が経験ある初心者に過ぎないことから、説明は殆どしていない。関係記事を参照したが、標準文書の見つけ方はご存知と思う。
私の考えでは、二つ以上のコンピュータを持つ人が、それらをネットワークしない理由はない。私の第一歩は、PC用Ethernetカード、クロスケーブル、及びPCMCIA Ethernetカードで、全部で87.50ユーロだった。これらが働き始めてから、別のPCMCIAカード(値段から分かる通りWindows専用だった)、8-ポートスイッチ、及び3メートルケーブル全部で67.50ユーロを使った。約$160は、悪くなかった。2台のPCをポイントツーポイントで繋ぐのに更に$25位掛かった。
このホーム・オフィス・ネットワークの現状は次の通りだ:
 
・Toshiba 486 500MB/24MB, SuSE 8.0 (kernel 2.4.18-4GB) X無し
・PC Pentium 166 2x4GB/32MB, SuSE 6.3 (kernel 2.2.13)
・Toshiba AMD 4GB/64MB, SuSE 8.0 (kernel 2.4.18-4GB) 又はWindows 98

ところで、以下での非対称はネットワーク作成固有又は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機能の中で疑いもなく最も複雑なものだが、極めて有用な幾つかの事柄のキイなので、便利と安全のため、絶対に設定しなければならない。

前提条件/定義:

・"local" は、そのキイボードを使おうとするマシンである
・"remote" は、そのキイボードを使おうとしないいシンである
・"<user>" は両方のマシンに設定されている
・"<host>" は、"local" マシン上の /etc/hosts にある "remote" ホストに関するエントリの第三カラムである
・"local" マシンから、sshの "remote" マシン許可使用を、/etc/hosts.中のエントリが許可し /etc/hosts.中のエントリが否認する
・mount コマンドの使用は、必要に応じて二つのマシンの間でディスクジョッキイを再生することをな意味する
・以下は、SuSE 6.3 (2.2.13) と 8.0 (2.4.18-4GB)に基づく

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)

上記1.Ethernetの下の /etc/hosts.allow も参照されたい。

インストレーションの際、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)に対して働く。しかし、相違には注意すること:

・暗号化パスワード:98: yes; 95: no
・smb.conf: 2.4: /etc/samba; 2.2: /etcに対するパス
・smbpasswd: 2.4: /etc/samba; 2.2: /etcに対するパス
・netlogon: 2.4: /usr/local/samba; 2.2: /var/lib/sambaに対するパス

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}')

これを仕上げると、ネットワークプリンタの設定には5分ほど掛かるだけである。以下の smb.confをアンコメント(つまり追加)する:

[printers]

   comment = All Printers

   browseable = no

   printable = yes

   public = no

   read only = yes

   create mode = 0700

   directory = /tmp

続いて、Windowsマシン上の古典的データ・エントリ・システムに一寸時間を使う:

control panel | printer | new printer

  network printer | search

    network environment | Pc

      hpdj-a4-raw

    manufacturer: HP

    printer:      HP OfficeJet

Samba をシャットダウンして再スタートすると仕事が始められる。

7.クイックスタート−PCMCIA

正直のところ、これが一般的に使えるかSuSE (8.0)に特有か私には分からない。それにPCMCIAで問題があったのは2.4 kernelだけで、奇妙なことに2.2にはなかった。また、それ自体ネットワーク作成には何の影響もなかった。だが、ネットワークを自分のネットワークに接続しようとすると、多分アルファベット怪物に出会うだろう。そしてPCMCIA Ethernet カードは、快適なドッキング・ステーションを作る。
詳細は省いて、最初はirq 5と10に関する不整合を見逃していて、このため後で膨大なえらー・メッセージを受け取った。しかし、これはLinuxインストーレーション開始前にPCMCIAカードを挿入したためだった。
私の場合、少なくとも、インストーレーション開始前にPCMCIAカードを挿入しないことにより、一つのirqだけを参照したので、次のようにした。

/etc/sysconfig/pcmcia の中の初期ブートの後に


	PCMCIA_PCIC="i82365"

	PCMCIA_PCIC_OPTS="irq_list=10"

を追加し、次いで、/sbin/SuSEconfig を走らせて再度ブートする。
しかし、これをおこなう前にPCMCIAソフトウエアをインストールすると、ノートブックがブートで呼び出せなくなる。ブートする唯一の方法は、LILOにパラメータNOPCMCIA=yesを与えることだ。その代わり、私はPCMCIAソフトウエアをSuSEconfigの後で再ブートの前にインストールした。
その後、PCMCIAをインストールすると、ビープが鳴って広告通りに働く。これは私の始めてのEthernet経験なので、代案は言えないが、D-Link DFE-650TXD PCMCIA Ethernetカードは良く働く、Linux-to-Linuxは兎も角として(哀れな「復元CD-Rom」がWindows 98をもう一度働かせる危険が起こる前に、ネットワークに中身を送るのに数時間掛かった)多数のLEDがあって進行状況を知らせる。

/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 を保守しながら、給料計算で顧客を助けている。

 

Copyright © 2003, Edgar Howell. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February 2003
 
 
 
 
到る処で働くKeep-Aliveプログラム
By Graham Jenkins
 
プードルとラプラドール
ダイアルアップ電話線で接続された遠隔マシンに新しいプログラムを半分だけタイプしたところ、家内の小さなプードルと隣家の巨大なラプラドールとの間の喧嘩を仲裁するため呼ばれた。戻って来たとき、接続は時間切れになっていた。
これに似た経験はないか?テレビゲームから引き離して外に出した子供が、帰って来ないか辺りを彷徨いたこともあるだろう。
 
金髪の解決策
上記のようなタイプ中断の間、電話線を繋いだままにしておく在来の方法は、'fortune' プログラムを小さいループで使って、30秒毎に勝手な言葉を画面に描かせるようにすることだ。これは、実際の問題を起こすことがある。金髪の人が画面を眺めて、次のような問答を見たときなどだ:
 問:金髪女性の目を輝かせる方法は?
 答:耳でフラッシュを光らせる
勿論 '-i' 又は同等のパラメータを使って 'fortune' を制限し、次のような差し障りのない言葉を作らせることも出来る:
 
 計算の定義
 連鎖形成−出力速度向上のため、プログラマをデスクに貼り付ける方法
 
' fortune' プログラムの最近の具体化では、ユーザーにもっと特殊なセットを提供する。アイルランド人、ゲイ、精神薄弱者などを攻撃するものの中から選ぶことが出来る。
 
端末で困っている人のために
メール受信を読むためだけにブラウザを使うのであれば、多分 'fortune' を走らせるためだけにターミナル・ウインドウを開くだろう。X11-適合ウインドウ・マネージャを使っていれば、次のようなクロック・プログラムを開始することも出来る:

  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仮想マシン上で実行される三つの「クラス」ファイルを作る。だから、これらのクラス・ファイルを、別のマシンのディレクトリにコピイし、次いで下記のようなコマンドを用いて実行する:

 java KeepAlive

Microsoft 仮想マシンをWindows ボックス上で使うには、次を用いる:

 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 専門家である。メルボルンに住み、幾つかのハードウエア・プラットホーム上で、各種の所有権及びオープン・システムを構築し管理した。

 

Copyright © 2003, Graham Jenkins. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February 2003
 
 
 
 
Linuxベースの音声認識
By Janine M Lodato
 

中国の観点からLinuxベースの音声認識プログラムを眺めて見よう。中国でコンピュータ製造を始めるのはLinuxコンピュータ・メーカにふさわしい。中国はハードウエアに関し低価格製造方法を提供し大市場を用意すると同時にそれらを世界の重要市場に輸出することが出来るからである。

Linuxコンピュータには、IBM ViaVoiceなどの音声認識システムに適合する能力がある。これは、特に中国語を話す人に利益がある。北京語も広東語も書くのは極めて複雑なので、Linuxプラットホーム上で走る音声認識ソフトウエアを通じてドキュメントを作ることが出来る。キイボードの使用も中国語には不可能に近い。タイプする文書に含まれる文字が多過ぎるからである。

他の言語もまた、音声認識ソフトウエアを使用するのは速度の目的で利点がある。手と目がふさがった専門家は、見出したことをドキュメントにするのに、マウスもキイボードも使う必要がないので、大いに利益を蒙る。音声起動、使用簡便な電話システムは、生活上であらゆる人に役立つ。車を運転する人は誰でも、車の取扱いと車からの連絡のため音声認識が遙かに効果的な方法である考えるだろう。

健康管理市場単独でも、Linuxベースの音声認識プロジェクトを正当化する沢山の理由がある。健康管理サービスは、10カ国グループの最大出費であると同時に、最大成長産業でもある。健康管理作業者は患者処理を説明する文書を作るのに音声を使うことから利便を受ける。音声認識により、手が空いて、特定の事例を容易に且つ迅速に解析、処理及び報告することが出来る。

無線LANを経由して電気的に接続された医療装置は、次の役に立つ:

・...病院管理職員
・器財の使用効率を改良
・規格化された良質の患者管理を達成
・記録(転写)エラーを劇的に減少
・低コスト
・必要に応じ任意の部屋をテレメトリ室にする(つまり、中央装置が何処にあろうと任意の部屋が試験室になる)
・...医療職員
・生命徴候データの24/7 完全セットを与えられる
・直接手を触れる介護に多くの時間を割ける
・患者状態の変化を直ちに診て迅速な処置が可能になる

この生命科学分野で、サーバ、タブレット、埋込デバイス及びデスクトップに関するLinuxの簡便さ、信頼性及び低価格は、最高である。Windows装置の扱い難さと信頼性がないため米国健康管理分野の文書で電子的に作られているのは僅か約10%しかない。健康管理費用の30%は文書の手書き作成の結果で、治療過誤の多くもまた、処方箋を見た人は誰でも証明出来るように、手書き診断書及び指令書の転写の不正確さによる。

明らかに、これら新技術の市場が存在する。残っているのは、熱心な販売員を抱えたハングリ精神のある会社がこの会社に食い込むことだけである。これら販売員が技術を広めると、多くの需要が満たされ、Microsoftの満たしていない新しい大量市場、補助技術(AT)、が開かれるであろう。実際、この市場は存在するが、身体的障害者及び機能的障害者の双方を含むよう拡張する必要がある。

左様、音声認識は将来に対する偉大な約束である。しかし、これは完全ではなく、改良の必要がある。一つの改良は読唇術を使用して精度を上げることである。別にマルチトーン音声入力がある。その他は、指向性マイクロフォンである。Linux用ハードウエアが大きく且つ強くなるにつれ、各世代の音声認識ソフトウエアが改良されるであろう。

 

Copyright © 2003, Janine M Lodato. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February 2003
 
 
 
 
Perl:今月のワンライナ
−気紛れなアーカイブの冒険
By Ben Okopnik
 

春の真っ盛りで、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;




# スクリプトの残りが続く


...


「Perlが適切な魔術の面倒を見て−それが問題を解決します」
システム管理者は立ち上がって、Woomertに熱心な握手をした。

−「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;

}


「上は両方とも同じことだが、初めの方が短くて便利なことが多い。スクリプトを一時に一ステップ調べて、私のしたことは、 @ARGVの中の各要素をテストしたことで、これは、下記の通常の表現と反対に、初めにはスクリプト名に続くコマンド行上のあらゆるものを含む:

/\.(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;                                  # これは「歩き回る」リスト

 

「Perlはこの時点から取り扱う。コマンド行又は標準入力の上で有用なものを渡すと、実際、為すべきことだけを理解する。」彼がFrinkを厳しく眺めたので、また赤くなった「PerlがI/Oをする方法を理解したい人には誰にも、'perldoc perlopentut' の勉強を薦める。これには、ファイル、パイプ、子プロセスの分岐、フィルタ構築、バイナリファイルの取扱い、ファイルハンドルの複製、'open' の単一引数版、そのた多くの事柄が含まれる。色々な意味で、これはPerlと一緒に来る文書のうち最も重要なものと言える。これは、急いでいるとき極めて重要な問題になる、不安全な可能性のあるプロセスに安全な(優先度の低い)パイプを開くことなどをはじめとする、多数の関連問題を扱う。

−「これで解決だ。輝かしい未来が開けた。貴方の問題は解決し、支配人は喜び、ユーザは外から守られる。ささやかな祝賀会に参加するなら、干しブドウ入りプディングを用意した。−−おや、彼はどこに行った?旨いイングリッシュ・プディングなのだが、まあ、出来るだけ早く変更をしたいのだろう……」

脚注

[1] 「横向きでなく下向き」システム管理者マントラ(The Sysadmin Mantra)の気味悪い意味についてヒントの欲しい人は <http://groups.google.com>にあるalt.sysadmin.recoveryのアーカイブを検索すると分かる。分からなければ、知らなくて良いと言うことだ。

[2] 戯語ファイルから:

Luser Attitude Readjustment Tool(ルーザ性格調整ツール)……LARTクラシックは棍棒として使える2x4その他の大きい木片で、仕事上で出会う以上の面倒をシステム管理者に起こす迷惑メール発信者などの人の頭に付着される。真に効果的なLARTを構成するもの、こぶ付き棍棒、半自動武器、火炎放射器、戦術核兵器、を超える代替システム管理復旧に関し永い間の議論が騒がしく、それぞれに党派がある。 {clue-by-four}と比較せよ。

[3] ファイル・オープンに関する指導については "perldoc perlopentut"、今まで余りに多くのマジックを見て来た人は、@ARGVの中の 'magic' 及び"Dispelling the Dweomer" を参照されたい。

 

著者紹介
BenはLGの寄稿編集者でAnswer Gangのメンバーだ。

picture Benは1962年モスコーで生まれた。6才で、フォークをコンセントに突っ込んで火花を散らした時以来、電気に興味を持った。長じて、プリント板に部品を半田付けし4kメモリに合わせるプログラムをして以来、コンピュータの仕事をした。夜、うなされるのを治して呉れる心理学者がいれば、大金を払う。

Benの次の経験は、十数個の言語によるプログラム、ネットワーク台風接近中のデータベース維持、及び航海雑誌から技術誌に渡る記事執筆である。帆船による七年間の大西洋/カリブ海の航海を最近終わった。今はバルチモアに停泊しており、サン・マイクロシステムの技術インストラクタとして働いている。
Ben は1997年以来Linuxの仕事をしており、全くの私費で北西太平洋の一部の核戦争への興味に関わっている。
Copyright © 2003, Ben Okopnik. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February 2003
 
 
 
 
Simputerと埋込Linuxの楽しみ
By Pramode C.E
Simputer とは、Linuxを走らせる手持ち装置に基づくStrongArm CPUである。元々はバンガローのインド科学大学の教授が開発したもので、この装置は、田園地帯の手の届く範囲内にコンピュータと接続性も持ち込むとの社会的目的を有する。この記事では、Simputer(及び同様のARM装置−市場には沢山ある)のプログラム作成に対する指導的紹介をする。Linuxのプログラム作成になにらかの経験のある読者を期待する。私のSimpute上で問題なくおこなったことを述べる−この指導にしたがって手持ち装置が燃えたら−責任を持つ。
 
ハードウエア/ソフトウエア

この装置は、Intel StrongArm (SA-1110) CPUを備えている。フラッシュ・メモリ・サイズは、32Mb又は16Mbで、RAMは64Mb又は32Mbである。主な機能は次の通り:

1.USBがマスターと同時にスレーブ
2.標準シリアル・ポート
3.赤外線通信ポート
4.スマートカード・リーダ

これら機能のうち幾つかは、ベース装置に設けられた`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自体又はスクリプトから来るデータは問題にしない。次の実験を試すことが出来る:

1.コンソール二つを開く (Linux PC上で)
2.一つのコンソールでminicom を走らせsimputerにログオンする
3.別のコンソールで `echo ls > /dev/ttyS1' とタイプする
4.最初のコンソールに戻るSimputer上でコマンド `ls' が実行されたのが分かる

USBネットワークの設定

SimputerにはUSBスレーブポートが付いて来る。自分のLinux PC とSimputerとの間のTCP/IPリンクをこのUSBインターフェイスを使って確立することが出来る。以下に、そのステップを示す:

1. 最新のLinux ディストリビューションを持っていることを確かめる− Red Hat 7.3 で充分。
2.USB ケーブルの一端を SimputerのUSBスレーブスロットに差し込み, Simputerをブートする。
3.自分のLinux PCをブートする。このときUSBケーブルの他端はPCに接続しない。PC上ルートとしてログインする。
4.コマンド`insmod usbnet' を走らせて、Linux PC上のUSBネットワークを有効にするkernel モジュールをロードする。`lsmod' を走らせてモジュールのロードを検証する。
5.ここでUSBケーブルの他端をLinux PCのUSBスロットに差し込む。Linux kernelのUSBサブシステムがデバイス追加を登録する筈。私のLinux PCでは、USBケーブルを差し込むと同時に、次のkernelメッセージが出た(コマンド `dmesg' を走らせると見ることが出来る):

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

ここまで来た後、もう少しのコマンドを走らせなければならない:

1.`ifconfig usb0 192.9.200.1' を走らせる−これはLinux PC上のUSBインターフェイスにIPアドレスを割り当てる。
2.`minicom' と支給されたシリアルケーブルを用いて、Simputerにルートとしてログオンする。次いで、Simputer上でコマンド `ifconfig usbf 192.9.200.2' を走らせる。
3.Linux PC上で `ping 192.9.200.2' を試す。音がしたら成功。 TCP/IPリンクが出来上がった。
ここで、TCP/IPリンクを通じてSimputerに対しtelnet/ftpをすることが出来る。
 
ハロー Simputer
 
仕事を始める時期が来た。皆様のCコンパイラは普通 `native'コード、つまりgcc自体の走るマイクロプロセッサ−インテルCPU(又はクローン)−上で走るコードを作る。自分のプログラムを(StrongArmマイクロプロセッサに基づく)Simputer上で走らせたければ、gccコードの発生するマシンコードをStrongArm CPUが理解する筈だ−皆様の `gcc' はクロスコンパイラの筈だ。`binutils' と一緒にgccソースコードをダウンロード(2.95.2が好適)すると、(arm-linux-gccなどで呼び出すことの出来る)クロスコンパイラが得られる方法で、それをコンフィギュアしてコンパイルすることが出来る筈だ。これは、始めてする人には少し手が込んでいるかも知れない−手持ちコンピュータの販売業者が、必要なツールをコンパイル済みの形で含むCDを呉れる筈だ−これを使うのを推奨する(だが、真面目に埋込開発に入るなら、このツールをダウンロードして自分で構築して見なければならない)。
arm-linux-gccを立ち上げて走らせたとすると、簡単な `Hello, Simputer' プログラムが書き、それを `a.out' にコンパイルして、Simputer にftpし、実行することが出来る(Linux PC上の一つのコンソールでftpを走らせ、別のものでtelnetを走らせるのが良い−−コードをコンパイルしたら直ぐに、それをアップロードしてtelnetコンソールから走らせることが出来る−− Simputer上で `chmod u+x a.out' をおこなって、ftpしたコードにパーミッション授与を実行しなければならないことに注意)。
 
Arm Linux kernelに関する覚書
 
Linux kernelは移植性が極めて高い−機械依存性すべてが `arch' サブディレクトリの下のディレクトリ(kernelソース・ツリーのルートの下にあるディレクトリ、言うなれば/usr/src/linux)に隔離されている。`arch' の下に `arm' と言うディレクトリが見付かるだろう。これがLinux kernel用 ARM CPU 特有コードを含むディレクトリである。
Linux ARM ポートは、Russell Kingと親しくしている。ARMアーキテクチャは、埋込世界では有名で、Itsy, Assabet, Lart, Shannonなどの素晴らしい名の各種マシンがあり、それら全部がStrongArm CPUを使っている。これらマシンの間には少し相違があり、kernelをそれぞれの上で働かせるには「マシン特有の細工」を必要とする。殆どマシンのための細工は、標準kernel自体の中にあるので、すべてを上手くおこなうためには、kernelコンフィギュレーションの間に実際のマシン型を選ぶ必要があるだけである。だが、Simputerでややこしいのは、初期Simputer仕様のための細工が、ARM kernelコードに入ったことで−だがデバイスを実際に作って売っている販売業者は、修正仕様にしたがって構築していると思われ− ARM kernel をこれら修正コンフィギュレーションで働くようにするため必要な補正は、未だメインkernelツリーに組み込まれていない。しかし、これは、販売業者が補正も含めて提供し、間もなく公式kernelに含まれるので、本当の問題ではない。
 
kernelソースと入手と構築
 
2.4.18 kernelソースを近くのLinux kernel ftp からダウンロードすることが出来る。`patch-2.4.18-rmk4' が必要になる(これは、ARM Linux FTP サイトftp.arm.linux.org.ukから入手することが出来る)。販売業者供給の補正、`patch-2.4.18-rmk4-vendorstring'も必要になるだろう。これらのファイルすべてを/usr/local/srcディレクトリにコピイしたとする。
1.先ず、`tar xvfz kernel-2.4.18.tar.gz' を走らせて、メインKernelディストリビューションをuntarする
2.`linux'と言う名のディレクトリが得られる。そのディレクトリに変更して、`patch -p1 < ../patch-2.4.18-rmk4' を走らせる。
3.ここで、販売業者供給の補正を加える。`patch -p1 < ../patch-2.4.18-rmk4-vendorstring'を走らせる。

ここで、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を間違いなく構築するには、あちこちに少しばかりの細工がいる。ほとんどの事項は変える必要がない−規定値で満足出来る。

1.システム型をARM システムに基づく SA1100 に設定し、次いで`Simputer(Clr)' にするためSA11x0を選ばなければならない(又は、マシンによっては何か別のこと)。私は、SA1100 USB機能サポート、SA11x0 USB ネットリンク・サポート、SA11x0 USB char デバイス・エミュレーションもまた有効にした。
2.Character devices->Serial ドライバの下で、私は、SA1100 シリアルポート・サポート、シリアルポート・サポート上のコンソールを有効にし、規定値ボー速度を115200に設定した(マシンによっては別の設定が必要であろう)。
3.文字デバイスの下で、SA1100 リアルタイム・クロック及びSimputer リアルタイム・クロックを有効にする。
4.コンソール・ドライバの下で、VGA テキスト・コンソールを無効にする。
5.一般設定の下で、規定値kernelコマンド文字列を`root=/dev/mtdblock2 quite' に設定する。これは、自分のマシン用に定義することもできる。

コンフィギュレーション手続きが済んだら、次を走らせることが出来る

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ベースの手持ちコンピュータには−装置について勉強するにつれ、楽しみな機会が沢山ある、見出したことを読者と共有したい。


参考資料

1.Simputer Project ホームペイジ。
2.SimputerlandPicoPeta - 製品を製造し販売する会社からのSimputer 開発活動についての情報。.
3.Arm Linux プロジェクト・ホームペイジ
4.Lart Project ホームペイジ。ここには素晴らしい内容が沢山ある。このサイトの `Clock Scaling' リンクをチェックすると良い。Clock scaling により、進行中にクロック速度を変えることが出来る−電池電力の節約に役立つ。
 
著者紹介:
私は、インド、Kerala州のICソフトウエアで働くインストラクタです。有機化学者に鳴りたいと思っていますが、第二の候補もあると思っており、それはLinuxをいじくりプログラム作成を教えることです。
 
Copyright © 2003, Pramode C.E. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February 2003
 
 
 
 
Yacc/Bison - パーサ・ゼネレータ - パート 1
By Hiran Ramankutty
緒言

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を適切なプロダクションの左辺に還元する。パーサは、エラーが検出されるまで又は、スタックがスタート記号を含み入力が空になるまで、この循環を繰り返す。

事実、シフト還元解析がおこなうことの出来る作用が四つある。それらは:

1. シフト 作用において、次の入力シンボルをスタックのトップにシフトする。
2. 還元 作用において、パーサがハンドルの右辺がスタックのトップにあるのを識別する。次にスタック内でハンドルの左端を探し、どのノンターミナルをハンドルを置換するかを判断する。
3. 承認 作用において、パーサは、解析が成功して終わったことを宣言する。
4. エラー 作用において、パーサは、構文エラーが起こったことを発見し、エラー修復ルーチンを呼び出す。

これらの考え方が作用する有様を下記の例で見よう。

下記の文法を考える:


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に対する(ゼロ還元により)「還元」されたターミナルの文字列を真にあらわす。

2. X1X2... XnA に還元するとき、ラベルがAの新しいノードを作る。その子は、左から右へ、 X1,X2,...,Xnに関するツリーのルートである。すべての ii について Xi がイールドxi を有するときは、新しいツリーに関するイールドは x1x2...xnである。この文字列は、現在のもので最高点に到達した一連の還元により事実 A に還元された。特殊な場合として、EA に還元すると、ラベルがE の子一つを有するラベルがA のノードを作る。

LR 解析アルゴリズム

LALRの構築には、LRパーサの構築に関する基礎知識が必要である。LRパーサは、入力を左から右に走査して、最も右の誘導体を逆に構築するので、その名がある。

パーサは、文法用に解析表を作る。解析表は作用ファンクションACTIONとゴーツー・ファンクションGOTOの二つの部分から成る。

LRパーサには入力、スタック及び解析表がある。入力は、左から右に、一度に一つ宛、読む。スタックは、sm をトップとして、s0X1s1...Xmsm の形を取る。各 Xi は、文法シンボルで、si ステートと呼ばれるシンボルである。各ステート・シンボルは、その下に含まれる情報を要約し、シフト還元判定を案内するため使用される。

ファンクション ACTION は、スタック頂上にあって現在の入力シンボルであるsmに関する値を記憶する。入力 ACTION[sm, ai] 次の四つの値のうち一つを取る:

1.シフト s
2.還元 A -> B
3.承認
4.エラー

ファンクションGOTO は、ステートと文法シンボルを引数として取り、ステートを生じる。入力シンボルが文法のターミナルとノンターミナルである決定論的有限オートマトンの転移表にある程度似ている。

LRパーサの構造は、第一成分がスタック内容で、第二成分が未消費入力であるペアである:

(s0 X1 s1 . . . Xm sm, ai ai+1 . . . an$)

パーサの次の移動は、現在の入力シンボルaの読取値と、スタック頂上のステート sm により、次いでアクション表の入力 ACTION[sm, ai]を参考にして定まる。アクション表入力に関する上述の四つの値が、下記のように四つの異なる構成を生じる:

1.ACTION[sm, ai] = シフト sであるとき、パーサは次の構成に入ってシフト移動を実行する。

(s0 X1 s1 . . . Xm sm ai s, ai+1 . . . an$)

ここで、この構成が現在の入力シンボル ai をシフトするとスタックに対する次のステートs = GOTO[sm, ai]; ai+1 が新しい入力シンボルとなる。

2.ACTION[sm, ai] = 還元 A - > Bであると、パーサは次の構成に入って還元移動を実行する。

(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と一致する。

3.ACTION[sm, ai] = 承認であると、解析は終了する。
4.ACTION[sm, ai] = エラーであると、パーサはエラーが発見したのでエラー復旧ルーチンを呼び出す。

LR解析アルゴリズムは、単純である。 s0 を最初のステートし a1a2...an 解析すべき文字列とすると、LRは初め(s0, a1a2...an$)の構成である。続いてパーサは、承認又はエラーに合間で移動を実行する。

前に、GOTOファンクションが本質的には、入力シンボル(ターミナルとノンターミナル)ステートが引数として取られたとき別のステートを作る決定論的有限オートマトンの転移表でると言った。したがってGOTOファンクションは、各ノード即ちステートが文法におけるプロダクションである要素を持った項目の一式である(方向を持った)グラフ様の仕組みを用いてあらわすことが出来る。この要素は、項目のコアを含む。転移をあらわす縁は、一つのステートから別のステートへの転移が予め定められたシンボルでラベルを付ける。

LALR (lookahead-LR)技術において、共通コアを持つLR項目は合体させられるので、解析作用は、作られた新GOTOファンクションに基づいて決定される。得られたテーブルは、LRテーブルより遙かに小さいが、殆どのプログラム言語の共通構文が、LALR文法を用いて表現することが出来る。

テーブルの構造には深入りしない。パーサ作製用の Yacc と言うツールの使用を説明する。

Yaccを用いる計算機

Yaccへの入力は三つの部分に分けられる:

1.トークン宣言と "%{" and "}%"で囲まれたCコードからなる定義セクション。
2.規則セクションにあるBNF 文法
3.サブルーチン・セクションにあるユーザ・サブルーチン

数値の加減が出来る小型電卓を設計して、これを説明する。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で、シフトする代わりに、文法通り適切に還元することが出来た。このとき、加算は乗算より高い優先度を持つ。

これ以上進む前に、別の種類の競合、つまり還元-還元競合を理解しなければならない。これは、スタックシンボルの還元に一つより多い選択肢があるとき起こる。例えば、下の文法では idT 又はEに還元することが出来る。


E -> T

E -> id

T -> id

Yacc は、競合が起こったとき既定値動作を取る。シフト−還元競合があると、yaccはシフトし、還元-還元競合があると、リスト内の最初の規則を使用する。yaccはまた、競合が起こったとき、警告メッセージを出す。警告は文法を曖昧でなくすると消える。

元に戻って、yaccは二つのファイルy.tab.cy.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の他に理論物理学の本を読むのを楽しみにしている。

 

Copyright © 2003, Hiran Ramankutty. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 87 of Linux Gazette, February 2003
 
 
 
 
 
KnoppixからオーダーメイドDebian CDを構築した
By Sunil Thomas Thonikuzhiyil
 
緒言

Knoppix は、debian GNU/Linuxに基づく生のCDディストリビューションで、最小のハードウエア上でも扱い易い多数のアプリケーションを含んでいる。Knoppixは、多数のグラフィックカード、サウンドカード、SCSI及びUSB装置をサポートする。Linuxデモ、教育用CD、救済システムとして使うことが出来、商業製品デモ用プラットホームとして使うことも出来る。ハードディスクには何もインストールする必要がない。お好みなら、CD全体をハードディスクにインストールすることの出来るインストレーション・プログラムがある。完全なdebianインストレーションを20分で完了することが出来る。この記事では、knoppixから自家用の生のCDを構築した方法を述べる。このCDを作った主な動機は、好きなアプリケーションでCDに無いものを含むことだった。記事にエラーがあったら、ここhereにメールされたい。

要件

a) ソフトウエア

始めるには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 サイトを使うことが出来る。常に最新リリースをチェックすること)

b) ハードウエア

膨大なハードディスク空間とメモリのあるコンピュータ。私は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チート・コードを見られたい。

a) KDE メニューからネットワークをコンフィギュア

K/Knoppix/network-Internet/Network-card-configuration とクリック
Lanに接続されてから、IPアドレス、ネームサーバ、ゲートウェイをコンフィギュアした。このステップは、自家用中身が何処からでもインストールされるようにするので、極めて重要だ。

b) 設定パーティション

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 パーティション上にext2 ファイルシステムを作る
#mke2fs /dev/hd

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には(ブートイメージ開始ファイルなどを変えたいのでない限り)触らない。

a) Knoppix ファイルシステムをハードディスクにコピイする

Knoppix CD がブートされたとき圧縮イメージファイルは /KNOPPIXにマウントされる。これを自分の目標パーティションにコピイしなければならない。私は
# cp -Rp /KNOPPIX /mn
をおこなった。( -R オプションは繰り返しコピイ用、 -pは所有者時刻スタンプなど)こでで自家用CDを作るに必要なファイルすべてがハードディスク上の/mnt/hda3/KNOPPIX/ ディレクトリに置かれる。見て見るとよい。

b) Chroot

このツリーの下でソフトウエアを搭載/削除しなければならない(ネットワークしていなければ、自分のソースを(例えば)/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

c) ネットワークの設定

/etc/resolv.conf に
nameserver ip-of-ur-nameserver

を加える。( 面白い問題を経験した。/etc/resolv.confは /etc/dhcp/resolv.confに対するシムリンクだった。Ping は働かなかった。そのシムリンクを削除して、もう一度 /etc/resolv.conf を作ったら働いた。終わったらシムリンクの復旧を忘れないこと)

ここでifconfigを使ってipアドレスを検証する(chrootの外で持つのと同じ筈)。そして、ping google.comを試す。それが出来ればchrootの下のネットワーク設定は終わり。aptをアップデートする。

d) インストール/アンインストール

必要なソフトウエアは何でもaptを使ったインストール/アンインストールすることが出来る。元のCDには沢山のソフトウエアがインストールされているので、余り易しいことではない。以下は、私が削除したパケージの一部のリストだ。

Ga

falconseye-data
rocks-n-diamonds
amor
nethack-x11
gnome-games-locale
xboard
gnocatan-client
imaze
kmahjongg
gnome-gnibbles
freeciv-gtk
ktuberling
gnocatan-help
ksirtet
gnome-gnobots2
jumpnbump
ksnake
xgalaga
lskat
katomic
kshisen
konquest
chromium
ktux
moon-buggy
kmoon
ksame
gnuchess
ktron
frozen-bubblekjumpingcube
fortune-mod
kodo
gnocatan-ai
gnocatan-server-console
gnocatan-server-data
nethack
821
fortunes
searchandrescue
xbill
kspaceduel
libkdegames
tipptrainer-data-dexconq
gcompris
gnome-chess
tuxracer-data
abuse-frabs
gnome-gnotski
frotz
kblackbox
gnome-games
gnome-gtali
gnome-iagno
gnome-stones
gnocatan-server-gtk
lxdoom-x11
maelstrom
kabalone