Linux Gazette 2003年9月号 #94
今月のLinux Gazette の主な記事
n今月のニュース
 ・法制化
 ・一般ニュース
 ・ディストリビューション関連ニュース
 ・ソフトウエア及び製品関連ニュース
nCからアセンブリ言語へ
nエンコード済みDVDをXineで再生
n /etc の下で(簡単なガイド)
n Linuxベースのラジオ・タイムシフト
n ダイアルアップ接続のUSENETグループ、e-メール、sshトンネル
n Python測候所
n SCOインタビュー
 
(訳者注)
原文を一括して一つのファイルでセーブするには、下記のリンクがあります。
TWDT 1 (gzipped text file)
TWDT 2 (HTML file)
前者はテキスト形式で、後者はHTML形式です。但し、HTML版のリンクが働くとは限りません。
 
 
 
 
 
今月のニュース
▼▼▼ 法制化 ▼▼▼
ヨーロッパ・ソフトウエア特許
2003年9月1日、欧州議会はヨーロッパ連合内のソフトウエア産業と団体に困難な長い努力を強いる投票を実施する。この投票の中心議題はソフトウエアの特許性についてである。嘗て、欧州特許局のソフトウエア特許に関する姿勢は、やや曖昧であった。公式規制ではソフトウエア、数学、アルゴリズム及び事務処理方法は、 特許にならないように思われるが、EPOの実務慣行では、これらを含む目的の法的枠組みを回避して、それらを含みこれら発明が特許に含まれるのを認めていた。 コンピュータ実行発明の特許性 に関する新指令は、特許性に関する規則の規制によりこの混乱を解決する対策になると思われている。しかし、EUが宣伝しているのは、新指令の条項は現在ソフトウエア特許性を支配している法制を著しく変更するものである。現存の法的位置を正当化するのでなく、この立法はEPOの現運営のイメージを鋳直すものとなっている。これは FFIIがおこなった研究が実証している。FFIIは、悪名高いAmazon社の "one click" 特許が、提案の新規制で認められることを示すのを目的とした。この調査の過程で、Amazon.社には既にコンピュータ化贈答品配送法に密接に関連する特許を既に与えられていることが判明した。

勿論、これら変更を考察するに当たって、この変更が好ましいかどうかを自問しなければならない。主導権を握る人はいるだろうが、欧州ソフトウエア特許に向かうこと動きに反対する幅広い団体がある。ソフトウエア特許に反対の非科学的対策は、「欧州ソフトウエア特許」に関するGoogleニュースの検索により得ることが出来る。見出しの大多数は、提案に敵対するか悲観的である。無条件の支持はない。これは個人やロビイ・グループ・ウエブサイトではなくニュースの研究であることが重要だ。多くのエコノミストに共通なのは懐疑論で、法律改正が発明とR&D費用のの減少減少を招くのをおそれている。これらの恐れは、殆どを失うことになる中小規模ソフトウエア会社では、極めて差し迫っている。同様にオープンソース開発者、この変更提案により、最も弱い立場に残されるだろう。米国でのソフトウエア特許運営で判っているように、特許制度は巨大な経済基盤を持つ当事者に有利に働く傾向がある。懐の深い組織は、特許の在庫を蓄積して、裁判で特許を防衛することが出来る。優れた特許であっても資金豊富な所有者は、同程度の防衛の効力により競争相手になりそうなものを威圧することが出来る。大会社よりも利益を受けそうなグループは、法律仲間だけである。

特許反対グループの組織する反対又はロビイ活動が有効であるか否かは判らない。ウエブサイト閉鎖 などの行動は、オンラインに衝撃を与えるけれども、実社会への影響は極めて小さい。Registerが指摘したように、オープンソースが偉大なコードを作っても、大きいロビイ活動が生まれるとは限らない。至るところのオープンソース・グループ、政治の世界で何が働き何が働かないかについての情報を共有し、その情報を将来の逃走に役立てるだろう。

SCO
SCO訴訟に関する記事を書くのは、この関係の資料が膨大になったので次第に難しくなっている。その殆どは単なる雑音で、SCOの真の狙いを正しく判定する機会は、却下されるか法廷に持ち込まれるかした後までない。これは、SCOが彼らの知的財産権を侵したと主張するソースコードの発表を渋っている状況では、特にそうである(「SCO」と「知的」の言葉は、互いに両立しないように私には思われる)。多分投資家を感動させるため、SCOは年次再販業者ショウで2,3のサンプルを示そうと企んだのであろう。これは彼らに大変好都合で、「係争」コードをもっと発表するだろうと思わせた。 Linux Weekly NewsBruce Perens がおこなった解析では、コードの組織は完全に合法的でSCOの財産権を侵害していないことが示された。SCOのスポークスマンBlake Stowellのやや要領を得ない応答 は、典型的なSCO式の事実蔑視を示すもので「この点では我々に反し彼の(Peren)の言葉になろうとしている」ことを確かめるものであった。Blakeには気の毒だが、(Peren)の言葉は、コードを作って覚えている人々が未だ生きている事実を述べない検証可能な文書と歴史的記録で裏打ちされている。それはさておき、SCOの主張は、少なくともこの段階で、成り行き任せのため息に過ぎない。

SCO事件に対する反応は殆ど沈黙であるが、注意深い企業は、法廷事件の影の下で、これ以上オープンソースとフリーのソフトウエアに関わりたくないというものだ。もっと神経質なものは、SCOの要求する特許料を支払おうとしている。オーストラリア弁護士ジョン・コリンズの意見が、正しいと思われる:

「ソフトウエアの摂理と誰が著作権を持っているかに関して不確かな点があって、有効なライセンスを持っているかどうか判らないときは、訴えそうな人の前で裸になるのが、少し直感的で少々商業的でない探りになる」

SCOの行動の真の目的は、これらの開発が有した持ち分価格の効果に(殆ど積極的に)関わっていると推測する者もいる。これらの論争の例は、Tim Rushingの著作にあるが、結局誰も憶測しているに過ぎない。追加の解析がGrokLawsco.iwethey.orgとにあるが、紆余曲折を続けており、SCO経営陣の不合理な行動は述べないで、灰色の事件に重荷を負わせている。

 
 
 
 
 
▼▼▼一般ニュース▼▼▼
GNUサーバ侵害
GNU project のメインサーバが、悪意のクラッカにより三月中旬危殆に瀕したことが、先月明らかになった。侵害には7月になって気付いただけだが、不正操作されたソースコードはないようだ。それでも、危殆に瀕したサーバからダウンロードしたかも知れない個人及び組織は、受け取ったコードが安全で汚染されていないことを検証するのが大切だ。この事件は、パッチとソフトウエア更新を続けることと、セキュリティ手順を確立して適切にパックアップを取ることの重要性をユーザに思い知らせた。

この話の元の報告は以下で見出すことが出来る:

ZDNet UK: Free Software servers breached
SearchEnterpriseLinux.com: GNU dodges bullet after security breach
The Register: GNU servers 'owned' by crackers for months
 
Alan Coxが休暇
Kerneltrapは、 Alan Cox は1年間の休暇を取る予定と報告した。その年をMBAのための研究とWelshの学習に費やす。
 
GNU/Linuxセキュリティ証明
スラショットは最近、IBMが共通基準仕様の下でLinuxの認証取得に成功したとの話に焦点を当てている焦点を当てている。これは購買決定に当たって政府機関がLinuxを検討するのに密接な関係がある。Inquirerは、このことは、Red Hatに取って少々憂鬱な話だとと報じる。Red Hatの認証作業は、Red Hatが仕事をするため選んだ英国に基盤を置く研究所が引き延ばし、無期限に保留となっている
 
 
 
 
 
▼▼▼ディストリビューション関連ニュース▼▼▼
Ark
Tux ReportsがArk Linuxを取り上げた。このRPMに基づくディストリビューションは、包括的で有用なデスクトップ環境の提供を特にねらっている。
 
Debian
Debian Weekly News は、Debian GNU/LinuxをIndyに設定する方法を記述述したJan Ivar Pladsenのドキュメントにリンクした。

8月16日mDebianプロジェクトは、その創立10周年を祝った。Linux Planetは、この記念にDebian 10年の回顧 を発行した。

Knoppix
Klaus Knopperniに Knoppix背後の哲学の記述がある。.
 
Libranet
Linuxiranが、Libranet GNU/Linux 2.8を見直した。結局、「素敵」の一語で説明出来るとの印象を持った。(Linux Todayよる)
 
Mepis
DWN が強調する通りMepis Linux は、Debian GNU/Linuxから導き出された生のCDである。Linuxオンラインに、この生CDを含めて、このディストリビューションに関する記事がある。最初は概観で、詳説WarrenWoodfredの創始者Mepisとの記者会見と続く。
 
SuSE
SGISuSE Linux は本日、完全サポート企業グレードLinux OSを走らせる完全サポート64-プロセッサシステムの提供により、Linux OS を拡張性及び性能を新レベルに拡張する計画を発表した。10月から入手可能で、SGIは、SuSE Linux エンタープライズ・サーバ8をSGI Altix 3000 サーバとスーパークラスタに結合する。

Siemens ビジネス・サービス は、世界中の17,000名以上の従業員の給与支払いを処理するそのmySAP HR管理システムをサポートすのに、SuSE Linux エンタープライズ・サーバ8を利用すると決定した。オープンソースOSと、SAP R/3 ソフトウエアのプラットホーム独立性により、オープンで強力且つ効率の良いIntelアーキテクチャへの移行が可能になる。Linuxに基づくアプリケーション・サーバは、既存のUnixに基づくサーバと一緒に独立で作動させることが出来る。したがって、RMシステムは、それを償却し、逐次Linuxサーバで置き換えるまで、走らせ続けることが出来る。

 
 
 
 
▼▼▼ソフトウエア及び製品関連ニュース▼▼▼
BiscomがLinux FAXCOMサーバを発表
企業向けファックス管理ソリューションの提供者Biscomが、Linux FAXCOMサーバの市場解放を発表した。新製品は、Windows FAXCOMサーバの信頼性と効率をLinux OSの安定性とセキュリティに統合する。Linux FAXCOMサーバは、慎重にテストの上、市場に解放された。Linux FAXCOMサーバは、多数の多岐にわたる文書をオンザフライ文書転換を、ファックスサーバ上の96個までのポートを経由してサポートすることを特徴とする。入信ファックス用の拡張ルート決定宛先オプションには、ファックスポート、ダイアル数字、送信者送信識別子(TSID)、呼出人IDが含まれる。その上、該当する場合は、同一ファックスを、一つ以上のプリンタを含む多数宛先に送ることが出来る。
 
GNU科学ライブラリ1.4をリリース
GNU 科学ライブラリのバージョン1.4が:
ftp://ftp.gnu.org/gnu/gsl/gsl-1.4.tar.gz
及び世界中のミラー (http://www.gnu.org/order/ftp.html参照)でリリースされた。

GNU Scientific Library(GNL)は、Cでの数値計算用ルーチンの集積である。このリリースは、以前の1.xリリースと後ろ向き互換性がある。GSLは、これでJason H. Stoverが貢献した累積分布関数(CDF)を含むこととなる。

Mod_python 3.10 Alpha
Apacheソフトウエア基金とApache HTTPサーバプロジェクトは、 mod_pythonの3.1.0 ALPHA リリースを発表した。

主な特徴は:

・メモリ又はdbmベースを用いるサーバ側セッション及びセッション・ロック・サポート
・HTML内にPytonコードを埋め込むことの出来るフレックス・ベースのスキャナ−PSP 。
・土着クッキイサポート、自動暗号化クッキイ署名及びマーシャリングを含む。
・Python 2.3との互換性と同時に、多数の強化。
・アルファ・リリースは、安定とは見なされないので、最初のベータ・リリースまでに機能変更があるかも知れない。

Mod_python 3.1.0a は http://httpd.apache.org/modules/python-download.cgiで入手可能。

 
Samba
Linux Todayに、Samba-3.0.0 RC2がダウンロード用に入手可能と報じたとのニュースがある。

 

LGの「今月のニュース」 編集者はMick だ。

[Picture] 数年前にアイルランドで生まれたMichaelは、現在ダブリン大学医療工学部で博士論文に取り組んでいる。論文の題名はLamb wavesの非破壊検査への利用だ。この研究に GNU/Linux が極めて有用であったので、 Michael は他の工学にフリーソフトウエア・ソリューションを適用することに強い興味を持った。論文が出来上がったら、 Michael は長い徒歩旅行にでる予定だ。

 

Copyright © 2003, Michael Conry. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 94 of Linux Gazette, September 2003
 
 
 
 
 
Cからアセンブリ言語へ
By Hiran Ramankutty

1. 概観

マイクロ・コンピュータ・システムは何で作られているか?マイクロ・コンピュータ・システムは、マイクロプロセッサ装置(MPU)、バス・システム、I/Oシステム、全部品間のインターフェイスで作られている。これが一般の期待する答えだ。

これは、ハードウエアだけの話。どのマイクロ・コンピュータ・システムにも、各ハードウエアがそれぞれの役目を果たす間、それら各々に命令するソフトウエアが必要だ。コンピュータ・ソフトウエアは、システム側について(システム・ソフトウエア)と、ユーザ側について(ユーザ・ソフトウエア)考えられる。

ユーザ・ソフトウエアには、固有のライブラリとユーザ作成ライブラリが、実行用プログラム作成の際に必要となるサブルーチンの形で含まれている。

システム・ソフトウエアは、プログラム作成を助けるための、各種の高級言語トランスレータ、アセンブラ、テキスト・エディタ、及びその他のプログラム数種を含む。機械語、アセンブラ言語、高レベル言語と、三つのレベルのプログラム作成があることは知っている。

機械語プログラムは、コンピュータが直接理解して実行することの出来るプログラムである。アセンブラ言語命令は、多かれ少なかれ1対1の関係で機械語命令に一致するが、理解し易いように文字列で書かれる。高級言語命令は英語に近く、プログラムが考える方法に対応するような文書構造になっている。結局、アセンブラ言語又は高級言語プログラムは、トランスレータと言うプログラムを使って機械語に転換しなければならない。これらは、それそぞれ、アセンブラ、コンパイラ又はインタプリータと呼ばれる。

C/C++ など高級言語用のコンパイラは、高級言語をアセンブリ・コードに翻訳する能力がある。GNU C 及び C++コンパイラの -Sオプションは、対応するソースプログラムに同等のアセンブリ・コードを作成する。ループ、ファンクション呼出、変数宣言など、殆どの基本的構造がアセンブリ言語にマップされる方法を知ることは、C内部をマスターする目標を達成するための一方法である。さらに進む前に、ここで示す資料を理解するには、コンピュータ・アーキテクチャとIntel x86アセンブリ言語に慣れておかなければならない。

2. 手始め

手始めに、hello worldをプリントするプログラムをCで書き、 -S オプションを使ってコンパイルする。出力は、規定の入力ファイル用のアセンブラ・コードである。GCCは規定値で、添字'c'を's'で置き換えてアセンブラ・ファイルを作る。アセンブラ・ファイルの終わりの数行を解釈して見ること。

Intel 80386 以降のプロセッサには、無数のレジスタ、命令、及びアドレス・モードがある。簡単な命令数個の基本的知識があれば、GNUコンパイラの作成するコードを理解するのに十分である。

一般的に、どのアセンブリ言語命令にも、ラベルlabel)、ニーモニック(mnemonic) 及びオペランド(operands)が含まれる。オペランドの記法は、オペランドのアドレシング・モードを解読するのに十分である。ニーもニックは、オペランドに含まれる情報で演算する。事実、アセンブリ言語命令は、レジスタとメモリ位置上で働く。80386ファミリには、eax, ebx, ecx などと呼ばれる汎用レジスタ(32ビット)がある。二つのレジスタebpesp は、スタックの操作に使われる。GNUアセンブラ(GAS)構文で書いた一般的な命令は、次のようになる:

movl $10, %eax

この命令は、値10をeaxレジスタに記憶する。レジスタ名に対する接頭辞 `%' と直接値に対する `$' は、最も重要なアセンブリ構文である。アセンブラ全部が同じ構文にしたがうとは限らないことに注意。

first.sと云う名のファイルに記憶された我々の最初のアセンブラ言語を、 Listing 1に示す。

#Listing 1
.globl main
main:
  movl $20, %eax
  ret

このファイルは、コマンドcc first.sを与えてアセンブルしリンクして a.out を作ることが出来る。拡張子 `.s' を、GNUコンパイラ・フロントエンドがアセンブリ言語ファイルとして識別し、コンパイル段階を飛ばして、アセンブラとリンカを呼び出す。

プログラムの1行目はコメントである。.globl アセンブラ指令は、記号 main をリンカに対しビジブルにするのに役立つ。これは、このプログラムが mainに対する呼出を含むCスタートアップ・ライブラリを用いてリンクされるので、重要である。この行がないと、リンカは「シンボルmainに対する未定義引用(undefined reference to symbol main)」と文句を言う(試して見よ)。このプログラムは、値20をレジスタeax に記憶して呼出人に戻すだけである。

3. 計算、比較、循環

次のプログラムは Listing 2 で、eaxに記憶された数の階乗を計算する。階乗はeaxに記憶される。

#Listing 2
.globl main
main: 
	movl $5, %eax
	movl $1, %ebx
L1:	cmpl $0, %eax		// 0 をeaxの中の値と比較
	je L2			// if 0==eax (je - jump if equal)でL2にジャンプ
	imull %eax, %ebx  	// ebx = ebx*eax
	decl %eax		// eaxを1だけ減らす
	jmp L1			//  L1へ無条件ジャンプ
L2: 	ret

L1L2 はラベル。制御の流れが L2 に達したとき、ebx にはeaxに記憶された数の階乗が入っている。

4. サブルーチン

複雑なプログラムを実行するとき、解決すべき問題を組織的な順序に分ける。問題毎にサブルーチンとファンクションを書いて、必要に応じて呼び出す。Listing 3はアセンブリ言語プログラムにおけるサブルーチン呼出と戻りを示す。

#Listing 3
.globl main
main:
	movl $10, %eax
	call foo
	ret
foo:
	addl $5, %eax
	ret

命令 call は制御をサブルーチンfoo に移す。foo の中のret 命令は制御を mainの中のcallの後の命令に移す。

一般的に、各ファンクションは、ルーチン呼出毎に使う変数の範囲を定義する。変数の範囲を維持するにはスペースを必要とする。ルーチン呼出毎に変数の値を維持するには、スタックを使うことが出来る。プログラムの実行における反復、循環、又はその他あり得る呼出のため、活動記録を維持することの出来る方法の基本を知ることが重要である。espebp などのレジスタの操作方法及び、スタック上で作動するpushpop などの命令の使用法を知ることは、サブルーチン呼出と復帰機構を理解する中心である。

5. スタックの利用

プログラムのメモリの一区画がスタックとして使用するため保留されている。Intel 80386以降のマイクロプロセッサにはスタックポインタと言うレジスタespがあり、これがスタックの先頭アドレスを記憶する。下の 図 1 は、スタックの先頭アドレスを保持するespレジスタを用いてスタックに記憶された三つの整数値、49,30,72(各整数は4バイトを占有)を示す。

図1

煉瓦積み類似のスタックが上向きに成長するのと異なり、Intelマシンのスタックは下向きに成長する。図2は命令pushl $15を実行した後のスタック配置を示す。

 

図2

スタックポインタ・レジスタが4だけ減少し、数15は4バイトして1988, 1989, 1990, 1991に記憶される。

命令 popl %eax は、スタック先頭の値(4バイト)を eax レジスタにコピイし、espを4だけ増やす。スタック先頭の値を何処にもコピイしたくないときは?スタックポインタを増加するだけの命令addl $4, %esp を実行する。

Listing 3では、命令 call foo が、呼出プログラム内の呼出後の命令のアドレスをスタックにプッシュして、fooに分岐する。サブルーチンは ret で終わり、これが制御をスタックの先頭から取ったアドレスの命令に移す。スタック先頭が有効な復帰アドレスを含まなければならないのは明らかである。

6. ローカル変数用スペースの割当

数百数千の変数を扱うCプログラムを作ることが出来る。Cプログラムに対応するアセンブリ・コードにより、変数を収容する方法と、得ようとする最終結果で何らの競合も起こさないで変数を扱うためレジスタを使用する方法を、理解することが出来る。

レジスタは、数が少ないのでプログラムの中の変数全部を保持するため使用することは出来ない。ローカル変数には、スタック内のスペースが割当られる。Listing 4 にその方法を示す。

#Listing 4
.globl main
main:
	call foo
	ret
foo:
	pushl %ebp
	movl %esp, %ebp
	subl $4, %esp
	movl $10, -4(%ebp)
	movl %ebp, %esp
	popl %ebp
	ret

先ず、スタックポインタの値をベースポインタ・レジスタebpにコピイする。ベースポインタは、スタック上の他の位置にアドレスするための固定基準として使用される。プログラム内でebpは、 foo の呼出人が使用するので、その値は、espの値で上書きされる前にスタックにコピイされる。命令 subl $4, %esp が、スタックポインタを減少して整数を保持するのに十分なスペース(4バイト)を作る。次の行で、値10を、ebpの内容から4を引いて得られたアドレスの4バイトにコピイする。命令movl %ebp, %esp が、スタックポインタを、fooの1行目実行後に持っていた値に復元し、popl %ebp がベースポインタ・レジスタを復元する。これでスタックポインタは、fooの1行目実行前に持っていたのと同じ値になる。下の表は、mainに対するエントリポイント及びListing 4 の(mainからの復帰を除く)各命令実行後のレジスタebp, esp の内容と3988 から3999までのスタック位置を示す。ebpesp に記憶された値は7000ト4000で、スタック位置3988 から3999は、mainの最初の命令が実行される前に任意の値219986, 1265789, 86を含むと仮定する。また main の中のcall foo の命令のアドレスを30000と仮定する。

表1

6. パラメータの引き渡しと値の戻し

スタックは、パラメータをファンクションに引き渡すため使用することが出来る。ファンクションがeaxレジスタに記憶した値をファンクションの戻り値に採用されるとの慣例(Cコンパイラで使われる)慣例にしたがう。呼出プログラムは、パラメータの値をスタックにプッシュして、被呼出プログラムに渡す。Listing 5sqrと言う簡単なファンクションを用いてこれを示す。

#Listing 5
.globl main
main:
	movl $12, %ebx
	pushl %ebx
	call sqr
	addl $4, %esp       //adjust esp to its value before the push
	ret
sqr:
	movl 4(%esp), %eax
	imull %eax, %eax    //compute eax * eax, store result in eax 
	ret

sqrの1行目を注意深く読まれたい。呼出ファンクションは ebx の内容をスタックにプッシュしてから、callファンクションを実行する。callは戻りアドレスをスタックにプッシュする。だから、sqr内部では、パラメータをスタック先頭から4バイトのオフセットでアクセスすることが出来る。

8. C とアセンブラの混合

Listing 6 は、Cプログラムとアセンブリ言語のファンクションを示す。Cのファンクションはmain.c と言うファイルで定義し、アセンブリ言語のファンクションはsqr.sで定義する。 cc main.c sqr.s.とタイプすればファイルを一緒にコンパイルしリンクする。

逆もまた簡単だ。Listing 7 は、C ファンクション・プリントとそのアセンブリ言語呼出人を示す。

#Listing 6
//main.c
main()
{
	int i = sqr(11);
	printf("%d\n",i);
}

//sqr.s
.globl sqr
sqr:
	movl 4(%esp), %eax
	imull %eax, %eax
	ret
#Listing 7
//print.c
print(int i)
{
	printf("%d\n",i);
}

//main.s
.globl main
main:
	movl $123, %eax
	pushl %eax
	call print
	addl $4, %esp
	ret

9. GNU C で作ったアセンブラ出力

ここまで読めばgcc.で作ったアセンブラ出力は十分理解出来ると思う。Listing 8gcc -S add.cで作った add.s ファイルを示す。 add.s は多数のアセンブラ指令(殆どはalignment用で、その他の殆どはsort)を除去するため編集されたことに注意。

#Listing 8
//add.c
int add(int i,int j)
{
	int p = i + j;
	return p;
}

//add.s
.globl add
add:
	pushl %ebp
	movl %esp, %ebp
	subl $4, %esp		//整数 pのためスペースを作る
	movl 8(%ebp),%edx	//8(%ebp) は iを指す
	addl 12(%ebp), %edx	//12(%ebp) は jを指す
	movl %edx, -4(%ebp)	//-4(%ebp) は pを指す
	movl -4(%ebp), %eax	//戻り値をeaxに記憶
	leave			//即ちto movl %ebp, %esp; popl %ebp ret

このプログラムは、Cステートメントadd(10,20) を理解すると分かる。これは次のアセンブラコードの翻訳することが出来る:

pushl $20
pushl $10
call add

第二パラメータを先に渡しているのに注意。

10. グローバル変数

スタックポインタを減少してローカル変数用のスペースが作られ、スタックポインタを増加するだけで割当済みスペースが返却される。GNU Cで作った同等物は何だろうか? Listing 9 に答えがある。

#Listing 9
//glob.c
int foo = 10;
main()
{
	int p foo;
}

//glob.s
.globl foo
foo:
	.long 10
.globl main
main:
	pushl %ebp
	movl %esp,%ebp
	subl $4,%esp
	movl foo,%eax
	movl %eax,-4(%ebp)
	leave
	ret

ステートメント foo: .long 10 がfooと云う名の4バイトのブロックを定義し、そのブロックを0で初期化する。 .globl foo 指令が、fooを他のファイルからアクセス出来るようにする。ここで、これを試して見よう。ステートメントint foostatic int foo.に変更する。これがアセンブリ・コードでどうあらわされるか見よう。アセンブリ指令.globl がなくなったのに気付くだろう。色々な記憶クラス(double, long, short, const など)で試してみよう。

11. システム呼出

プログラムがアセンブリで何か数学計算手順だけをを実行するのでない限り、入力取得、出力作成、絵具ジットなどの事項を扱う。このたには、OSサービスを呼び出す必要がある。事実、アセンブリ言語でのプログラム作成は、OSサービスに触らない限り、異なるOSで殆ど同じである。

Linuxでシステム呼出をプログラムするにはCライブラリ(libc)wrapper,又はdirectlyを通じる二つの方法がある。

Libc wrappers は、プログラムを可能なシステム呼出慣例変更から保護し、kernelにPOSIX互換インターフェイスがないときは、ある呼出のためそれを作るように作られている。しかし、UNIX kernelは通常多少なりともPOSIX適合となっている。これは、殆どのlibc「システム呼出」の構文が、正確に本当のkernelシステム呼出の構文と一致することを意味する(逆も真)。しかし、libcを投げ出す主な欠点は、printf(), malloc() 及び類似のsyscall wrapperだけではない幾つかのファンクションを失うことである。

Linuxでのシステム呼出は int 0x80を通じておこなう。Linuxは通常のUnix呼出慣例と異なり、システム呼出用 "fastcall" 慣例を特徴とする。システム・ファンクション番号がeaxに渡され、アーギュメントがスタックではなくレジスタを通して渡される。したがって、ebx, ecx, edx, esi, edi, ebpと六つのアーギュメントがある。もっと多くのアーギュメントがあるときは、構造体を通じて第一アーギュメントとして渡されるだけである。結果は、eaxにもどされるので、スタックには全く触れない。

下に示すListing 10 を考える。

#Listing 10
#fork.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
	fork();
	printf("Hello\n");
	return 0;
}

cc -g fork.c -static を用いてこのプログラムをコンパイルする。gdb ツールを使ってコマンドdisassemble fork をタイプする。プログラムの中のforkに使われるアセンブリ・コードをる見ることが出来る。-static はGCCのstaticリンカオプションである(マニュアル参照)。別のシステム呼出にこれを試して、実際のファンクションの働き方を見ることが出来る。

Linuxシステム呼出の更新文書を各試みが幾つかあったので、屋上屋を重ねることはしない。

11. インライン・アセンブリ・プログラム作成

GNU C はx86アーキテクチャを極めて良くサポートし、アセンブリ・コードをCプログラムに挿入する能力があるので、レジスタ割当は、規定するか又はGCCに任せるかのいすれかである。アセンブリ命令は勿論、アーキテクチャに依存する。

asm 命令により、アセンブリ目利例をC又はC++プログラムに挿入することが出来る。例えば命令

asm ("fsin" : "=t" (answer) : "0" (angle));

は、次のCステートメントをコードするx86固有の方法である。

answer = sin(angle);

元のアセンブリ・コード命令と異なり、asm ステートメントではC構文を用いて入力及び出力演算数を規定することが出来る。Asm ステートメントは見境いなく使ってはいけない。これを使ってよいのは?

・Asm によりプログラムがコンピュータ・ハードウエアに直接アクセスすることが出来る。これにより実行の早いプログラムを作ることが出来る。ハードウエアと直接相互作用する必要のあるOSコードを書くとき使用することが出来る。例えば、/usr/include/asm/io.h は、入出力ポートに直接アクセスするアセンブリ命令を含む。
・インライン・アセンブリ命令もまた、プログラムの最も内側のループをスピードアップする。例えば、同一角度のsinecosinefsincos x86 命令の中にある。多分、次に示す二つのlistingがこの要因の理解に役立つだろう。
#Listing 11
#Name : bit-pos-loop.c 
#Description : Find bit position using a loop(ループを用いるビット位置検索)

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
	long max = atoi (argv[1]);
	long number;
	long i;
	unsigned position;
	volatile unsigned result;

	for (number = 1; number <= max; ; ++number) {
		for (i=(number>>1), position=0; i!=0; ++position)
			i >>= 1;
		result = position;
	}
	return 0;
}
#Listing 12
#Name : bit-pos-asm.c
#Description : Find bit position using bsrl

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	long max = atoi(argv[1]);
	long number;
	unsigned position;
	volatile unsigned result;

	for (number = 1; number <= max; ; ++number) {
		asm("bsrl %1, %0" : "=r" (position) : "r" (number));
		result = position;
	}
	return 0;
}

二つの変形を、次に示すように完全最適化でコンパイルする:

$ cc -O2 -o bit-pos-loop bit-pos-loop.c
$ cc -O2 -o bit-pos-asm bit-pos-asm.c

timeコマンドを使い、コマンド行アーギュメントとして大きい数を規定して、それぞれの変形の計算時間を測定し、それぞれの変形が走るのに数秒を要することを確かめる。.

$ time ./bit-pos-loop 250000000

及び

$ time ./bit-pos-asm 250000000

結果はマシンにより異なるが、インライン・アセンブリを使う変形が遙かに早いことを見出すであろう。

GCC のオプチマイザは、 asm 表現があっても、プログラムを配置し直し書き尚して実行時間を最短にしようとする。オプチマイザが、asmの出力値を使わないと決定すると、asmとそのアーギュメントとの間にキイワードvolatile が起こっていない限りその命令は省略される。(特殊な場合として、GCCはループの外に出力演算数のないasmは動かさない)。どのasmも、予想し難い方法で、ジャンプをまたいででも、動かすことが出来る。特定のアセンブリ命令順を作る唯一の方法は、命令全部を同一 asmに含むことである。

asmを使うと、オプチマイザの効率的使用が制限されることがある。コンパイラは asmの構文を知らないからだ。GCCは、幾つかの最適化を阻止することのある保守的な推測を強制される。

12. 演習

1.Listing 6のCプログラムをアセンブリ・コードに翻訳せよ。-Wall オプションを用いてアセンブリ・コードを作るとき起こるエラーを除去するよう、それを修正せよ。二つのアセンブリコードを比較して、どんな変化を観測したか?.

2.最適化オプション(-O2など)を付けたのと付けないのとで、小さいCプログラム幾つかのをコンパイルせよ。出来上がったアセンブリ・コードを読んで、コンパイラが使った共通の最適化技術を幾つか見出せ。

3.switch ステートメントをアセンブリ・コードに翻訳せよ。

4.インラインasm ステートメントを用いて小さいCプログラム幾つかのをコンパイルせよ。そのプログラムのアセンブリ・コードにどんな違いを見出したか?

5.ネスト化ファンクションは別のファンクション(包囲ファンクション)の内側で定義されるので、
・ネスト化ファンクションは包囲ファンクションの変数に対するアクセスを有する。
・ネスト化ファンクションは包囲ファンクションに対してローカルである、つまり、包囲ファンクションがネスト化ファンクションに対するポインタを与えない場合は、どこからでも呼び出すことが出来る。

ネスト化ファンクションは、ファンクションの認知度の制御を助けるので、有用であることがある.

次に示す Listing 13 を考察せよ。

#Listing 13
/* myprint.c */
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int i;
	void my_print(int k)
	{
		printf("%d\n",k);
	}
	scanf("%d",&i);
	my_print(i);
	return 0;
}

cc -S myprint.cを用いてこのプログラムをコンパイルし、アセンブリコードを翻訳せよ。また、cc -pedantic myprint.cを用いてこのプログラムをコンパイルせよ。どんな違いを観測したか?

 
著者紹介:

私は コンピュータ科学技術の最終學年B技術試験を受けたばかりで、インドKeralaの生まれです。

Copyright © 2003, Hiran Ramankutty. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 94 of Linux Gazette, September 2003
 
 
 
 
 
エンコード済みDVDをXineで再生
By LeaAnne Kolp

先ず最初に、プラグインをダウンロードする必要がある。

xine_d4d_plugin-0.3.2.tar.gz

xine-d5d-0.2.7.tgz

xine-lib-0.9.12.tar

xine-ui-0.9.12.tar

これらのプラグインはxine-lib と xine-ui-0.9.12を用いてのみ働く。. 0.9.13 を入手しても役に立たない。

これらをダウンロードした後、ルートに切り換える。

[tux@linux tux]$ su
Password: *****

続いて、ダウンロードしたばかりのファイルを自分の /root/ ディレクトリに移す。これは次をコマンド・プロンプトでタイプしておこなう。

mv *.tar.gz /root/

これで駄目なら、次をタイプする:

mv xine-lib-0.9.12.tar.gz /root/

これをファイル毎におこなう。終わったら、次をタイプして自分の /root/ ディレクトリに切り換える:

cd /root/ type: ls

すると、 /root/ ディレクトリのファイル全部が表示される。これで殆どだ。

And you'll get a listing of all the files in your /root/ directory. Now for the good part :)

ここで gunzip して untar する:

これをおこなうには、次をタイプする:

gunzip -d xine-lib-0.9.12.tar.gz

次をタイプして、そのディレクトリに切り換える:

cd xine-lib-0.9.12

ここで:

ls

とタイプする。これでディレクトリに入る。ここに、READMEファイルとINSTALLファイルがある。READMEファイルは必ず読むこと。前にこれをしたことがあっても、何かが変わっている。

READMEに何もなければ、INSTALLファイルを読む。

それには:

more README 
とタイプする。
more INSTALL

通常、次のコマンドをタイプすると典型的なインストレーションがおこなわれる:

./configure 
make 
make check 
make install

ここでも、必ずREADMEを読むこと。ディストリビューション毎にLinuxが異なるので、インストレーション方法も異なることがある。

四つのファイルをインストールし終わるまで上の手順を繰り返す。

続いて、次をタイプする。

tar -xvf xine-lib.0.9.12.tar

ここで:

ls

とタイプすると、

xine-lib-0.9.12

と言う名のディレクトリが(暗青色で)見えるので、次をタイプしてドライブを更新する。

updatedb

これは、ドライブによっては時間が掛かる。終わったら、xineをlocate しなければならない。それには、

locate xine

とタイプする。普通は /usr/local/bin/ にあるが、安全のためlocate する。

locate したら、メニューに加えるまで、それのあったディレクトリをタイプする。

/usr/local/bin/xine にあるときは、/usr/local/bin/xine とタイプする。

これでプログラムがスタートする。

用心しなければならない部分がある。xineが出たとき、下にd4d 及びd5d ボタンがある。dvdをdvdromドライブに入れたとき、エンコード済みdvdを再生するには、d4d 又はd5d のいずれかをクリックしなければならない。

残念ながら、入れたdvdにどちらが役立つかは、私には分からない。d4d で働くものもd5dで働くものもある。経験で正しい方を見出す外ない。

私の場合は、dvdを入れたとき(d4d, d5dの)どちらのプラグインが働くかを見付けて、書き留めた。これを使ったゲームを再生したことはない。

これでプラグインが働く筈、楽しみ給え。

 

著者紹介:

今日は、LeaAnne です。2003年3月以降、Windows から解放されました。

 

Copyright © 2003, LeaAnne Kolp. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 94 of Linux Gazette, September 2003
 
 
 
 
 
/etc の下で(簡単なガイド)
By AmirAli Lalji

 

要約:

この記事は、Linux初心者に/etcサブルーチンの基本的理解を与えることを重点とする。

緒言

Linuxの新入生、特にWindows経歴のある人は、/etcディレクトリにあるファイルの理解を難しいと思うことが多い。この記事では、これらのファイルの幾つかとその用途を簡単に説明する。だが、/etcファイルに入る前に、これらのファイルの幾つかを変更すると、システムが不安定になったり、場合に依ってはブート出来なくなることを指摘したい。何かの変更をする前には、ファイルのバックアップを取っている筈なので、これを余り強調しない。.

飛び込もう....

/etc/exports

このファイルは、NFS(ネットワーク・ファイル・システム)をロードするためのパーティション・コンフィギュレーションを収容する。パーティションの取付方法と他のLinux/UNIXシステムとの共有方法を述べる。

/etc/ftpusers

このファイルは、FTP経由でのログインを許されないユーザのログイン名を収容する。安全のためこのファイルをユーザ・ルートに追加することを勧める。

/etc/fstab

このファイルは、多数のドライブ又は別のパーティションにまたがって広がるファイルシステムを自動的にマウントする。このファイルは、システムブートのときと、ファイルシステム・マウントのときチェックされる。

/etc/hosts.[allow, deny]

これらのファイルを使って、ネットワークにアクセスすることが出来る。ネットワークへのアクセスを与えたいホストをhosts.allowファイルに、又はそうでないホストをhosts.deny ファイルに追加することが出来る。

/etc/inetd.conf or /etc/xinetd.conf

inetd ファイルは、ネットワーク・サービスの父と呼ぶことが出来る。このファイルは、FTP, TELNETなどのサービス開始を担当する。Linuxディストリビューションによっては、xinetd.confが付いて来るが、これは拡張インターネット・サービス・デモン(Extended Internet Services Daemon)の意味で、inetdの機能性と能力全部を提供するだけでなく、それを更に拡張する。.

使用しないサービスをコメントするのが望ましい。

/etc/inittab

このファイルは、ブートアップのとき、又は別のランレベルで、起こること即ちどのプロセスがスタートするかを記述する。ランレベルは、現在Linuxが置かれている状態と定義される。Linuxには 0-6の七つのランレベルがある。

/etc/motd

「本日のメッセージ(message of the day)」を意味するこのファイルが実行されると、ログインが成功したときその内容が表示される。

/etc/passwd

このファイルは、ユーザ情報を収容する。新規ユーザを追加する毎に、ログイン名、パスワードなどを含む登録がこのファイルに追加される。このファイルはシステム上の誰でも読める。パスワード・フィールドに "x" があると、ユーザルートによってのみアクセス可能な/etc/shadowファイルに暗号化パスワードが記憶されている。

/etc/profile

ユーザがログインするとき、/etc/profileを含む多数のコンフィギュレーション・ファイルが実行される。このファイルは、bashシェルのための設定とグローバル・スタートアップ情報を収容する。

/etc/services

このファイルは、/etc/inetd.conf 又は /etc/xinetd.confファイルと結合して働く(上述参照)。このファイルは、inetd.confで述べたサービスがどのポートを、FTP/21, TELNET/23 などのため使用するかを決定する。

/etc/securetty

このファイルは、ログインのためルートが許されるttyをリストする。安全のため、tty1だけをルートログインに保つのを勧める。

/etc/shells

このファイルは、システムにインストールされたシェル全部の名を完全パス名で収容する。

終わりに....

この記事を楽しまれ、/etcディレクトリの理解に役立ったことを望む。/etcディレクトリの下には他のサブディレクトリもある。これらはアプリケーション固有のもので/etc/httpd, /etc/sendmail はそれぞれ apacheとsendmail用である。

ご意見があれば aalalji@bcs.org.ukにe-メールされたい。

 

著者紹介:

AmirAli Lalji はシステム管理者/DBA で、英国とポルトガルに住んで働いている。

 

Copyright © 2003, AmirAli Lalji. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 94 of Linux Gazette, September 2003
 
 
 
 
 
Linuxベースのラジオ・タイムシフト
By Yan-Fa Li

1.0 緒言

多くの機械狂と同様、私も居間に Tivo を持っている。聴きたくもないClear Channelが横行すると文句を言うが、未だに公衆ラジオがある。運転中にNPRを沢山聴くが、面白い番組を聴き損ねたり、目的地に着いて聴取を中止しなければならないことがある。そこで、時間と労力を掛けてPRR(個人用ラジオレコーダ)を作ろうと思った。

私だけでないのは明らかだ。今では このような 商品があるので、ラジオ をタイムシフトするプロジェクトを立てた人は極めて少ないようだ。手引き書もあって、スラッシュドットは 最近..大きいスレッドを書いた。

これらの記録は、基本的にRedHat Linux 7.3を使っているので、SuSe 又は Mandrakeを使うと効果が変わるかも知れない。アルファで出来上がっていると思うので、それらを既にインストールしている人は、それらのインストールの部分は飛ばされたい。

基本

今まで見たプロジェクトの多くには共通点がある。それらは、次の3種類の設定のうち一つを使っている:
・自分のPCの line-in に接続した単一局に同調した通常のアナログラジオ。長所:廉価で容易。短所:単一局のみ。
・ラジオ機能と埋め込みオーディオ装置の付いたプログラム可能チューナ・カード。長所:自己充足ソリューション、サウンドカード不要。短所:PCが電気的にノイズが大きい、多分Linuxドライバがないため。
・プログラム可能外部ラジオとline-in、D-linkからの普及しているが製造中止の DSB-R100 に類似。長所:PCでプログラム可能、アンテナ交換可能、コンピュータの外側。短所:ドライバがない可能性と、他の選択肢より多分高価。
私は当然USBラジオを取り上げた。ラジオを簡単に交換出来る融通性が欲しかったのと、Linux API用Videoの下でこの装置用のLinux kernelの中にそのドライバがあるのを知っていたからだ。

3. アーキテクチャ

幾つかの要件があった:
1.mp3に直接出力し、中間waveファイルの作成を避ける。2時間の番組は44KHz waveファイルとして12GBになるので、出来るだけ避けるべきだ。
2.適切なID3タグを付けてファイルにファイル名以外の有用な情報を持たせる。
3.沢山のディスク量を食うのを避けるため、規則的間隔でファイルを切り取る自動システムにする。NPRは目先のもので新らし過ぎるので私が長い目で手に入れようとするものではない。

結局、基本的捕捉システムは次のようになった:

Alsa HW Interface -> [ ecasound ] -> < Wav Stream > -> [ lame encoder ] -> < mp3 >
素晴らしくて簡単だ。これらをまとめるには、少し糊が必要だ。放送中にVBR mp3をエンコードしたかったのでCPUの用法が少し心配だった。また、これをメイン・ファイル・サーバにインストールする予定だった。常時オンでなので理想的な候補だったからだ。850MHz celeronを使ったテストでは、捕捉とエンコードの間のロードは40-50%だった。これはファイルのセーブ、ssh及びhttpなどその他の仕事用に十分なCPUを残した。

サウンドカードで悪名高いスキップを生じるXなどを用いると、作業量が増える。しかし、私のシステムはファイル・サーバ専用なので、GUIを働かせるの長い間止めていた。これは、問題にはならなかったが、君のシステムでは覚えて置くと良い。

FM を MP3 としてリアルタイムでエンコード

FM mp3に関する情報が優れているのに驚いた。第一に、FMは送信で15kHz以上の周波数全部に厳しいカットオフがあるので、それ以上の情報はエンコード中に安全に無視される。第二に、FMの最適ビットレートは、96kHzと112kHzの間のどこかにあると思われる。これは音楽は少量だけで殆ど音声で、既にその周波数レンジで5kHzをともかくセーブしているからだ。したがって、忠実なエンコードには十分以上のビットが残っている。第三に、Lameエンコーダを使う予定なので、ジョイントステレオが必須だった。Lameジョイントステレオのモードが優れているだけでなく、エンコード用にもビットを残す。

ハードウエアの制約

この仕事には、最低でも450MHz Pentium IIIより遅いものは勧めない。だが、平均ビットレートに切り換えて私が使ったものより少し遅いエンコード速度で良いときは、良く調整された350MHz PIIで逃げることが出来る。システム上にディスクを持つこともまた自由である。これは~112kbpのデータにプラスしてネットワーク・オーバーヘッド又はその記録全部をネットワークに戻してダンプしたフラッシュカードを維持する必要があるだけだからだ。

この仕事に適した低価格帯システムに付いてはcompgeeks 又はCSO をチェックのこと。

4.0 Linux下のオーディオ録音

これは思ったより大仕事だ。多数のオーディオ・カードを再生用にLinuxがサポートしているが、録音用はそれ程多くない。大きい情報源がAlsa プロジェクト ウェブサイトにある。Alsaは多数のシステムで利用されているので、私のPRRプロジェクトの使うことにした。既に2.6 kernelになったLinuxオーディオの将来を忘れてならない。

次の問題は、実際の録音をするのに使うものを考えることだ。sox やalsarecordなど色々探した末、Ecasoundを使うことに決めた。このプロジェクトには多分過大だが、好んだ特徴の幾つかは、埋込オーディオ転換ルーチン、ルートで走らせたときLinux下でのリアルタイム・スケジューリングを規定する能力、及びstdoutにデータを書き込むサポートだ。オーディオは、一定のスケジュール目的に合わせる際、ハードウエア要件を用いる全くリアルタイムの性格の仕事なので、これが出来ることは、Ecasoundの利点だ。Unixパイプもまた、ディスク要件を取扱可能な範囲まで下げて、大きい臨時ファイルの作成を回避する。

Alsa サウンド・システム設定の準備

先ず最初に、持っているサウンド・カードの種類を確認して、Alsaがサポートしているかどうかを調べる。前に言ったように、全てのサウンド・カードが録音に適している訳ではない。面白いことに、使うことに決めたサウンド・カードは最も安いものだったが、全く良く働いた。

結局Cirrus Logic 46XX (Hercules Fortissmo) シリーズのカードを使うことにした。シスコのベイエリアで~35USDで買った。どこでもそんな値段だろう。Alsaのサポートは良く、FM録音に立派に働く。私はもっと安いカード ~20USD位のCMI8738で始めたが、哀れな泣き声と貧弱な利得しかないオーディオ録音しか出来なかった。再生用には良いが、録音装置としては使えない。

Alsa設定についての詳細情報は、カードに記載のウェブサイトにある。だが開始の前に少し注意事項がある。第一に、Alsaはそれに対してコンパイルするkernelソースをを必要とするので、走っているkernelが同じものでなければならない。例えば、普通のRedHatインストレーション例えば2.4.18-26.7では、自分の/usr/src/linux-2.4/ ディレクトリに同じkernelソースがインストールされている必要がある。規定値では、そうなっていない。RedHatは、余計なバージョン文字列 "custom"を使うため、特別にkernelソースの命名を変えているからだ。

この問題を避けるには、Alsaをインストールする前に、新しいRedHat kernelをコンパイルし直し、インストールし直してブートし直す。これをする方法が分からないときは、良い説明書が沢山ネットにあるので、先に進む前に見ることを勧める。規定値RedHatオプションが欲しいときは、簡単に次のようなものを使う:

cd /usr/src/linux-2.4
make mrproper && \
make oldconfig && \
make dep clean bzImage modules MAKE='make -j2'
これで、kaernelソースが構築し直される。これをインストールし、これを使ってブートし直す必要がある。する方法は、lilo を使っているか grubliolを使っているかに左右され、この説明書の範囲を超える。

RedHat Kernel ユーザのための構築の追加の注意

RedHat 2.4.20 kernelで起こると思われる別の、全く腹立たしい問題もある。これは2.5シリーズ以降パックで移植して来たスケジューラ修正全ての故だと思う。兎に角、これはconfigureを走らせるときはいつでも、ファイルinclude/linux/workqueue.h 作業ディレクトリから削除する。これはコンパイルを綺麗に進ませるとの嘆かわしい副作用を有するが、未知の記号であるの理由でロードを拒否する。一番困るのは、修復が簡単なことだ。configureを走らせ、走る前にもう一度コンパイルし、workqueue.h ファイルをもう一度tarballからun-tarする。次のようになる:
tar jxvf alsa-driver-0.9.5.tar.bz2 alsa-driver-0.9.5/include/linux/workqueue.h
これが 0.9.5 リリースに働く。従属性が損なわれるためモジュールをインストール出来ないとの、嫌な苦情を、これが阻止する。

Alsa の構築とインストレーション

kernelを走らせており、Alsaドライバ・パケージをダウンロードし、それをルートとしてコンパイルしインストールしたとする。次に、Alsaライブラリ・パケージをダウンロードし、これをコンパイルしインストールする。最後に、最低限Alsaユティリティを必要とする。さもないとオーディオをミュートでなくするなど有用なことが出来なくなる。ツールとOSSコンパクトは、あれば良いが、この点では不要である。

追加の注意として、規定値で、Alsaの最近のバージョンは、自分を規定値システムパスにインストールする。古いバージョンは自分を /usr/localにインストールし、RedHatシステム上では、ダイナミックローダがそこでライブラリを探すようコンフィギュアされていなかったので、これが問題を生じた。これはコンフィギュアスクリプトがライブラリを見出し損ね一般的にコンパイルされないる結果となる。修復は簡単だ。/etc/ld.so.conf に /usr/local/libパスを追加してldconfig.を再度走らせる。これで、そこにインストールされたldキャッシュとダイナミックlibが走るよう更新される。ご参考までに言うと、これは沢山のオープンソースがRedHat上でコンパイルするのに失敗する主な理由である。

新しいドライバは、今走っているkernelディレクトリにインストールする。新しいサウンドカード設定を反映するにはmodules.confをコンフィギュアし直す必要がある。これには通常、kudzuが追加したエントリの削除又は、 '#' 記号を用いてこれらを無効にし、次いで新しいドライバを追加することを含む。私のCS46XX設定からのものを示す:

# ALSA portion
alias char-major-116 snd cards_limit=1 device_mode=0660
post-install snd alsactl restore
alias snd-card-0 snd-cs46xx
# module options
# OSS/Free portion
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0
# card #1
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
post-install指令に注意されたい。これはドライバをロードすると直ちにrebootにオーディオ設定を復元させる。/etc/rc.local を修正してもこれを起動することが出来るが、私はドライバをアンロードする場合にこの方法を好む。サウンドモジュールをアンロードする前に変更した設定をセーブしたいときは、pre-remove指令を追加することも出来る。私は既知の規定値に復元することを好む。

次に、rc.local ファイルにエントリを追加する必要がある。理由は何であれ、OSSエミュレーション・ドライバは自動的にロードされない。KDEは、artsdとスタートするときなどにサウンドシステムがロードしようとしているのに初期化されないと苦情を言う。rc.localの終わりに、次を追加してOSSを強制的に pre-loadすることが出来る:

modprobe snd-pcm-oss
setpci -s 01:09 latency_timer=60
最初のエントリが、pcm oss ドライバをロードしOSS従属のアプリケーションをウイザードなしでそこに止まらせる。第二エントリは、サウンドカード用PCIタイマーを調整して、それにバス上で少し多くの時間をあたえる。この部分はオプションである。私は、PCIバスの微調整が、オーディオのパリパリカリカリをなくするのに役立つのを見出した。PCI潜在時間のこの方法での微調整を選ぶときは、 lspci を使って自分のカードのため正しい数を見付けるのを忘れないこと。ここに掲げたものは、私のシステムバス用で、別のシステム用には違うものになる。

この時点でもう一度リブートするのが多分最も易しいが、仕事に自信があれば、rmmod を使ってOSSドライバを手で削除し、

modprobe snd-pcm-oss
をおこなう。lsmod を使ってフォローアップすると、新alsaがロードされた沢山の明るい輝きが見られる:
Module                Size  Used by    Not tainted
snd-pcm-oss            45668   0
snd-mixer-oss          16536   0  [snd-pcm-oss]
snd-cs46xx             79156   0  (autoclean)
snd-rawmidi            18656   0  (autoclean) [snd-cs46xx]
snd-seq-device          6316   0  (autoclean) [snd-rawmidi]
snd-ac97-codec         44640   0  (autoclean) [snd-cs46xx]
snd-pcm                83264   0  (autoclean) [snd-pcm-oss snd-cs46xx]
snd-timer              19560   0  (autoclean) [snd-pcm]
snd-page-alloc          8520   0  (autoclean) [snd-cs46xx snd-pcm]
gameport                3412   0  (autoclean) [snd-cs46xx]
snd                    43140   0  [snd-pcm-oss snd-mixer-oss snd-cs46xx _ 
                                   snd-rawmidi snd-seq-device _ 
                                   snd-ac97-codec snd-pcm snd-timer]
soundcore               6532   6  [snd]
これは稼働中のシステムから取ったものである。mpg123など手持ちの任意のオーディオを使ってテストされたい。RedHatシステムでは、自分で実際にダウンロードしてコンパイルしインストールしなければならない。彼らは Fraunhofer と Philipsの特許問題のため、最早mpegデコーダを出荷していないからだ。

5.0 ダウンロードする追加パケージ

ECASOUND のダウンロードとコンパイル

Alsaサウンドシステムをインストールして働かせたので、それを働かせなければならない。ecasoundをダウンロードして働かせる時期だ。最初のインストレーションには2.2.1を使ったが、今は、沢山のバグ修理を、特にalsaでの使用について、した2.2.3に改善した。これは、GNU autoconf に基づくので、構築は直截的だ。

少し最適化した構築をしたくて、進んだx86最適化をサポートするGCC(gcc 3.2以降)を使っているときは、PIIでの次のコンフィギュア行を勧める。これには特に新らしいFPGA2 Celeronsを含む。

CXXFLAGS='-O2 -march=i686' CFLAGS='-O2 -march=i686' ./configure
又はもっと積極的に:
CXXFLAGS='-O2 -march=i686 -msse -mmmx' CFLAGS='-O2 -march=i686 -mmmx -msse' ./configure
しかし、この第二変形は正しくコンパイルしなくて、もっと悪い問題を起こすことがあるのを警告する。他方、自分のシステムで違いを生じるか試行錯誤をする限り害はない。私の場合は、これらの最適化で2-4%の利得があった。

Lame のダウンロードとコンパイル

ここでLame 3.93.1をダウンロードしてコンパイルする。これもgnuに基づくので、上で使ったのと同じフラッグを用いることが出来る。これをインストールする。テストとインストレーションに役立つので、 xmms 又は mpg321 など好みのmp3をダウンロードしてインストールすることを勧める。

6.0 録音装置の構成

全部を働かせるのに、多分ここが最も苦労する部分だ。最も易しいのは、alsamixer ツールを使って録音の前にボリュームを設定することだと見出した。これは、各種オーディオデバイスのスライダを調節し、特定サウンドカードに対し試行錯誤の方法を取らせるプログラムだ。基本的な仕組みは、関連デバイスを入力と出力モードにする。コマンド行インターフェイスを使ってコンフィギュアする良い方法があれば、ご教示願いたい。

alsamixer に入ると、0から100の値を持った多数のスライダが現れる。上にハイフォンが六つあるバーが、潜在捕捉源だ。各サウンドカードには、少し違ったDACがあると思われるので、録音を有効にするのにどれを起動すべきか分かるとは限らない。

試行錯誤とecasoundを使って、どのデバイスに録音能力があるかテストすることが出来た。このポートのスピーカ出力端子に一対のスピーカをつなぐのが大変役立つが、ここではヘッドフォンも役立つ。一般的に、line-inデバイスが欲しい。音量を70%位まで上げる。Video 4 Linux radioを使っているときは、オーディオの音源が得られるまで、ラジオ装置上で同調させるのに 'radio' を使うことが出来る。Dlinkラジオは、固定音量のライン装置なので、この音がどの位に聞こえるかは、 line-inボリュームをどう設定するかに直接関係する。

これをサウンドカードのline-inに正しく取り付けたら、何か音が聞こえる。歪まなくなるまでボリュームを調整する。歪んだオーディオはa)ひどい音でb)mp3cが全く変に聞こえる。耳で聞き分けて程々に明瞭で歪まない音にする。FMなので、転換により既に5kHzを失っているのを忘れないこと。奇跡を期待してはいけない。ノイズ源を探してアンテナを置き直す必要があるかも知れない。これはインストレーション毎に変化する。

ノイズに注意

音源がアナログなので、電気的なノイズ源に注意しなければならない。他のコンピュータやモニタなどは電気的なノイズが多い。例えば、私は最近私の設定からパルス性のうるさい静電音を拾っているのを発見した。オーディオ・ケーブルの配置が電力線に近過ぎた。配線を変えるだけで問題は解決したが、沢山のオーディオでは、新しい干渉源がないか定期的に点検する必要がある。

7.0 全部をまとめる

これで基本的インフラが整ったので、全部をまとめるお膳立てをしなければならない。必要な機能をおこなう簡単なスクリプトを書いた。最初のものは、実際に録音をおこなうものである。これはcron作業から始まる。頭にecasound尻に lameのある大きく太いパイプの中にプログラム全てを呼び出すだけだ。良く働く。作るべきファイルと関連パラメータの名は、Cronを通じて渡す。bashで書いてあるので、理解し易い。

録音ショー2: 捕捉スクリプト

#!/bin/bash
echo "Recordshow2 (c)2003 Yan-Fa Li (yanfali@best.com) under GNU LGPL"
# FREQUENCY TIMEINMINS "PROGRAM NAME"
#set -x

tune_channel()
{
	echo -n "Tuning to FM Channel $1..."


	#  同調ラジオのリセットとスイッチを入れる
	$RADIO -qm 2>/dev/null && sleep 1 && $RADIO -qf $1
}

record_program()
{
	echo "Recording $TITLE for $1 Minutes ($TIME seconds) to:"
	echo -e "\t$FILENAME"

	# Lameへの録音とパイプ
	TITLE2=${TITLE#*/}
	$ARECORD $APARMS | $LAME $LPARMS - "$FILENAME" \
		--tt "$TITLE2 on $DATE" \
		--ta "KQED/NPR" \
		--ty `date +"%Y"` \
		--tg 101 \
		--tc "$COMMENT"

	if [ $? -ne 0 ]
	then
		echo -n "Error Recording - Check the Soundcard Isn't Recording"
		echo " Already"
		turn_radio_off
		exit 1
	fi
}

fix_permissions()
{
	# パーミッションの収集
	if [ -f "$FILENAME" ]
	then
		chown $OWNER "$FILENAME"
   		chmod 664 "$FILENAME"
	fi
}

turn_radio_off()
{
	echo -n "Turning off Radio..."
	# ラジオのスイッチを切る
	$RADIO -qm
}


#
# Main program
#

# Arg Chek
if [ $# -ne 3 ]
then
	echo "usage: `basename $0` FREQUENCY TIME_IN_MINS \"NAME_OF_PROGRAM\""
	exit -1
fi

DEST=/mnt/music/radio
declare -i TIME=$2
TIME=TIME*60
OWNER="yan:music"

RADIO=/usr/bin/radio

ARECORD=/usr/local/bin/ecasound
APARMS="-b 512 -i alsahw,default -o:stdout -t $TIME"

LAME=/usr/local/bin/lame
LPARMS="-r -x -mj -s44.1"	# required for ecasound
# -r raw pcm input
# -x swap bytes
# -mj join stereo
# -s incoming sample rate

LPARMS=$LPARMS" -V5 --vbr-new -q0 -b112 --lowpass 15 --cwlimit 10"
# Thanks to: http://www.jthz.com/mp3/ for the settings
# -V5 encoding speed 
# --vbr-new
# -q0 highest quality
# -b112 bitrate of 112Kbps
# --lowpass 15 filter all frequencies above 15KHz (FM cutoff)
# --cwlimit 10 acoustic model

DATE=`date +"%a %b %d %Y (%k:%M)"`
SIMPLEDATE=`date +"%Y-%m-%d-%a"`

FILENAME="$DEST/$3-$SIMPLEDATE.mp3"
TITLE="$3"
COMMENT="$1 MHz"

echo "`basename $0`: Recording Started on "$DATE
# Call it twice to avoid radio coming up mute
tune_channel $1
tune_channel $1

record_program $2

fix_permissions 

turn_radio_off

echo "`basename $0`: Recording Ended on "`date +"%a %b %e, %Y  %k:%M"`

Crontab の例

# usage: recordshow2 FREQUENCY TIME_IN_MINS "NAME_OF_PROGRAM"
# leave a minute at the end otherwise you'll overlap the audio
# device and fail to record
#
# Weekdays
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/etc/radio
MAILTO=root
HOME=/

# Daily
0 9 * * Mon-Fri 	recordshow2 88.5 59 "Forum/Forum H1"
0 10 * * Mon-Fri 	recordshow2 88.5 59 "Forum/Forum H2"
0 11 * * Mon-Fri 	recordshow2 88.5 59 "Talk of the Nation/Talk Of The Nation H1"
0 12 * * Mon-Fri 	recordshow2 88.5 59 "Talk of the Nation/Talk Of The Nation H2"
0 13 * * Mon-Fri 	recordshow2 88.5 59 "Fresh Air/Fresh Air"
0 16 * * Mon-Fri 	recordshow2 88.5 29 "Market Place/Marketplace"
30 16 * * Mon-Fri  recordshow2 88.5 119 "All Things Considered/All Things Considered"
0 21 * * Mon-Fri 	recordshow2 88.5 59 "BBC World Service/BBC World Service"

# Weekly Recordings
# Thursday
30 18 * * Thu	 recordshow2 88.5 29 "Pacific Time/Pacific Time"
# Saturday
0 11 * * Sat	 recordshow2 88.5 59 "WaitWait/Wait Wait Don't Tell Me"
0 12 * * Sat	 recordshow2 88.5 59 "This American Life/This American Life"
0 18 * * Sat	 recordshow2 88.5 119 "Prarie Home Companion/Prarie Home Companion"
# Sunday - in case you messed up saturday

# Sunday
0 11 * * Sun	 recordshow2 88.5 119 "Prarie Home Companion/Prarie Home Companion"
# Maintenance
0 1 * * Sun	weekly_file_cleanup.rb

ファイル管理

第二のスクリプトは追加のユティリティ・スクリプトである。一定時間後にファイルを削除するとの私の要件を思い出されたい。このスクリプトがすることは、ファイルが作られた日付をスキャンして、所定時間、私の場合は2週間、の後それらを削除する。私はrubyを使った。それを勉強中なので、プログラムを書くのが容易かったからだ。bushで書き直しても良いが、rubyの方が遙かに易しい。試されよ。

絶対に削除したくない録音、通常は週刊番組、があるので、単に.donotreap ファイルをディレクトリに 書いてディレクトリを無視する能力を追加した。見出した時は、このディレクトリを繋ぎ止める。二次的な安全対策として、mp3 ファイルだけを削除する。その他は全部無視する。極上ではないが役には立つ。

#!/usr/bin/ruby -w
=begin
Timeshifted Radio Directoriesをクリーンアップする簡単なスクリプト
2週間以上経ったファイルを見付けてそれを削除
=end

puts "Timeshifted Radio File Cleaner v0.1"
puts "(c) 2003 Yan-Fa Li (yanfali@best.com) under GNU LGPL"

Dir.chdir("/mnt/raid5/music/radio")
TWOWEEKS = 60 * 60 * 24 * 7 * 2

file_list=Dir["**"]

# Find All Directories
dir_list = []
file_list.each { |x| dir_list << x if File.ftype(x) == "directory" }

topdir = Dir.pwd

# Recurse through all directories
dir_list.each do |x|
	Dir.chdir(topdir + "/" + x)

	# Do Not Reap Flagged Directories
	next if File.zero?(".donotreap")

	puts "Entering Directory: #{x}"

	# Build File List and Filter on name mp3
	file_list=Dir["**"]
	puts "\tFound #{file_list.length} Files Total"
	file_list.each { |y| file_list.delete(y) if not y.include?("mp3") }
	puts "\tFound #{file_list.length} MP3 Files"

	# Find Files Older than 2 Weeks
	del_list = []
	file_list.each { |y|
		del_list << y if (Time.now - File.stat(y).mtime) > TWOWEEKS }

	puts "\t#{del_list.length} Files Scheduled For Deletion"

	next if del_list.length == 0
	del_list.each { |z| File.delete(z) }
end

8.0 バグとなすべきこと

私が修正することの出来ない問題の一つは、時々録音が歪んで音が少し外れることだ。何が原因か分からない。録音は殆どの時間、綺麗だが、しばしば外れる。聴くことは出来るが、調子外れか安っぽい。オーディオを直接録音ソフトウエアに流し込んでから圧縮しているので、その中の部品のどれかが、大きいwaveファイルを保つのがオプションにないのかも知れない。最新の最大バージョンに更新しても効果はなかった。サウンドカード自体かも知れない。それ程のバグではないので、修正使用とは思わないが、こうして幾つかの録音を失う。ご存知の方があれば、手を挙げて頂くと有り難い。

殆どが働いているので、これでそんなに困っていない。最近、長い路上旅行で沢山の録音を使った。だが、良いと思われる考えがある。第一にNPR番組をすくい取って各録音の詳細を入手し、各mp3のファイルに参照を付けるか又はid3コメントを番組表に一致するよう変更することだ。

第二は、専用スケジューラがあると良い。今は、録音装置を使っているとき、重なりがあって衝突が起こると、オーディオ装置が占有されているため第二の録音は失敗する。録音中枢になる専用スケジューラがあると、この問題が解決する。Tivo には類似のものがあるので、既知の解決策のある既知の問題に違いない。 Cronはこのための間違った解決策なので、迂回策は録音を故意に1分早く終わることだ。普通は、これで良い。

第三は、録音、録音番組の変更、録音済みの内容の締め出しなどでウエブベースの会話が出来ると良い。私には作る時間がないので、読者の挑戦に委ねたい。

9.0 まとめ

ご覧の通り、Linuxをタイムシフトラジオに設定するのは一寸苦労だが、それ程難しくはない。6ヶ月ほど使っているが、注意を惹いた番組を車の運転中にミ聞き逃さないのは喜びだ。PBSには色々な材料があるので、ローカル局をサポートされるのを勧める。iPodなどのポータブル・プレーヤと組み合わせると、長い自動車旅行が楽しくなる。

構築についての良いニュースは、Asiaサウンドシステムを主流kernelに組み込んだため、物事が容易になったことだ。規定値で作るファイルは極めて大きいが、エンコード・ビット速度を私の規定値112kbpsより低く選んで小さくすることが出来る。ポータブル・プレーヤがないのでOGGその他のフォーマットで試していないが、逆向きへの変更は簡単な問題の筈だ。

Any ご意見 を歓迎する。私の時々悪くなる録音に解決策があれば、一言お知らせ名願いたい。

 

Copyright © 2003, Yan-Fa Li. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 94 of Linux Gazette, September 2003
 
 
 
 
 
ダイアルアップ接続のUSENETグループ、e-メール、sshトンネル
By Nokolay Zhuralev
 
勤務中でないとき、私はネットワークの必要のためダイアルアップ・モデモを使用しなければならない。しかし、Linuxの備える力と融通性は全部残したい。もっと重要なのは、職場で使うのと同じツールを家でも使いたい。つまりUSUNETニュースにslmを、e-メールダウンロードにfetchmailを家でも使いたい。この記事では、ニュースとe-メールののダイアルアップ接続を通じる効率的で確実な配信のためのsshトンネルと圧縮の利用を論じる。

前にも述べたように、USENETニュースの取得とオンラインでの読取には、slrnpull と'slrn --spool' の組合せを用いることが出来る。ユーザが一人だけで、ダイアルアップ接続の時間料金に拘泥するとき、これは特に有用である。この問題を掘り下げて見よう。

第一に、ルートで作業するのを出来るだけ避けて、代わりにsudoを使う。visudo を使って /etc/sudoers を編集し、最後の次の行を追加する:

# we want to be specific here
jane   localhost=/usr/bin/slrnpull -h news.server.com
ここで、jane は、コマンド slrnpull -h news.server.com をローカルホストから走らせる権限のるユーザ名である。 Janeがニュースを取得したいときはいつでも、sudoを走らせる:
jane@localhost ~$ sudo slrnpull -h news.server.com
Password:
jane@localhost ~$ slrn --spool

各種UNISETグループから多数の記事を取得するには、大変時間が掛かる。Janeがインターネットとマシンに対するsshアクセスを持ってる場合を考える。マシンは職場でも、学校でも外国でも構わない。他のマシンがnews.server.comへのアクセスを持っていて、別の障害(厳重なファイアウオールなど)がないとすると、ダイアルアップ接続をしたとき、圧縮付きsshトンネルを極めて高速なニュース取得に使用することが出来る。トンネルは月の設定される:

jane@localhost ~$ ssh -C -N -f -L 8081:news.server.com:119 janedoe@work.some.com
jane@localhost ~$
ここで、 -C は圧縮のためで、-N と -f は、リモートコマンドの実行とsend sshがバックグラウンドになるのを回避する。ここで、 /etc/sudoers の中の行をトンネル使用に調整しなければならない:
# we want to be specific here
#jane   localhost=/usr/bin/slrnpull -h news.server.com
# notice the use of backslash
jane   localhost=/usr/bin/slrnpull -h localhost\:8081

これでJaneはslrnpullを走らせることが出来る。news.server.com に直接接続するようタイプする代わりに、slrnpullがローカルポート8081に接続するので、通信はsshを通じてローカルホストとwork.some.com.との間を往来する。

jane@localhost ~$ sudo slrnpull -h localhost:8081
Password:
jane@localhost ~$ slrn --spool

二つのマシン、つまりニュース・サーバ news.server.com とwork.some.comは、高速ネットワーク上にある。これらの間の接続は平文なので圧縮されない。しかし、ローカルホストはダイアルアップを通じてwork.some.comに接続されている。後の二者間の通信は、暗号化され圧縮される。圧縮はgzipで用いるものと同じである。ASCII通信の圧縮はダウンロード時間を著しく短縮する。これは沢山のUSENETグループに加入したいとき特に役立つ。提案の方法はJaneのプライバシイをある程度保つ。彼女のマシンとwork.some.comとの間の交信は暗号化されるからである。

最後に、トンネル設定のため長いsshコマンドをタイプするのを避けるため、Janeは自分の.ssh/config ファイルに、次のようなものを入れることが出来る:

Host work
HostName work.some.com
LocalForward 8081 news.server.com:119
IdentityFile /home/janedoe/.ssh/id_dsa
Protocol 2
User janedoe
CompressionLevel 6
上のLocalForward行にコロン記号が一つだけなのに注意。これで、次だけを用いてトンネルを設定することが出来る:
jane@localhost ~$ ssh -C -N -f work

新しいsshトンネルを設定する前に古いものを消すのを忘れないこと。疑いがあれば、netstat -tupan | grep LIS を使って、進行状態を見る。コマンドの正確な構文は、自分が持っているSSHの種類に左右される。上は私(RH 9, openssh-3.5p1-1)のため働いた。 ssh-agent 上の記事もまた参照されたい。これはsshの扱いを苦労のないものにする。

同様の方法で、sshトンネルをfetchmail と組み合わせて使い、サーバからe-メールを回収することが出来る。.ssh/configファイルに新LocalForwardエントリを追加するだけだ:

Host work
HostName work.some.com
LocalForward 8081 news.server.com:119
LocalForward 8082 pop3.some.com:110
IdentityFile /home/janedoe/.ssh/id_dsa
Protocol 2
User janedoe
CompressionLevel 6
また、これにしたがって、fetchmailrc を編集する:
poll localhost with proto POP3 port 8082
user 'Doe0001' there with password "blah" is 'jane' here options fetchall
そこで、コマンド ssh -C -N -f work が二つのトンネルを設定する。一つは、ニュース用で、一つはpop3メール用だ。その働き方を見るにはfetchmailをファイヤする:
fetchmail -e 50 -m "/usr/sbin/sendmail     -oem     -f     %F     %T"
fetchmailとe-メールシステムをもっと学習するにはLGの 最近号 (#92、七月号「Linuxのおけるメールサブシステムの設定」)を参照されたい。私の経験では、平均して、メールとニュースは、在来の方法に比べほぼ二倍の速度でダウンロードされた。これはモデモ回線でだ。まとめると、圧縮と一緒にsshトンネルを使用すると、毎日の通信が効率よく且つ安全になる。使って、可愛がって、知識を伝えられたい。
 
著者紹介:

1978年モスコー生まれです。12才のときから、色々な方法でコンピュータのコードをしたり、いじったりして来ました。1995年に *nix の王国に入りましたが、後悔したことはありません。現在は、ミネソタ大学化学部の Ph.D.学生です。

 

Copyright © 2003, Nokolay Zhuralev. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 94 of Linux Gazette, September 2003
 
 
 
 
 
Python測候所
By Phil Hughes
 
このプログラムは、世界中の測候所からのMetarデータ出力からウエブペイジを構築することの出来る簡単なインターフェイスである。素晴らしいとは言わないが役には立つ。

くだくだ説明するより、先ずは ここ に行って見られたい。コスタリカ近傍からの天候報告が少なくとも5件見られる筈だ。つまり、このプログラムには、五つの測候所のリストがあり、それらの全部の報告を点検して表示する。

システム構造

このシステムの心臓部はここで手に入るPymetarパケージだ。これはここに説明されているMetarデータを取得するPython だ。Pymetarはコマンド行ツールだが、面倒な仕事全部をしてくれる。

目標は、この情報をウエブペイジで利用出来るようにすることだ。大きいプログラム作成計画にしたいとは思わないが、分かり易くしたい。最も基本的な方法は、プログラムを各リクエストのためCGIスクリプトとして走らせることだ。しかしこれは、CGIリクエストがある度にプログラムが全データを掴む必要があるので、極めて効率が悪くなりそうだ。さらに重要なのは、ユーザはこれら要件全部の完了を待つ必要があることを意味する。

最良の妥協は、cronジョブを設定してデータを捕捉し、気象ペイジを構築することだと決心した。各ペイジ・リクエストは静的なペイジを表示するだけだ。気象データはそんなに頻繁に変わるものではないので、これで相当沢山の現在情報が与えられる。

実行

先ず、コードを示す:

#!/usr/bin/env python

import sys
import time
sys.path.insert(0, "/home/fyl/pymetar-0.5")
import pymetar

def stations(args):
    for arg in map(lambda x: x.strip(), args):
        try:
            weather = pymetar.MetarReport(arg)
        except IOError, msg:
            # uncomment the following and remove pass line to see the errors
            # sys.stderr.write("Problem accessing the weather server: %s\n" % msg)
            pass
        else:
            if weather.valid:
		print "<h3>"
                print weather.getStationName()
                print " ( Lat: %s, Long: %s, Alt: %s m)" % \
		  weather.getStationPosition()
		print "</h3>"
		print "<table border=\"2\">"
                print "<tr><td>Updated</td><td> %s</td></tr>" % \
		  weather.getTime()
                if weather.getWindDirection() is not None:
		    print "<tr><td>Wind direction</td><td> %sー</td></tr>" % \
		      weather.getWindDirection()
                if weather.getWindSpeed() is not None:
                    print "<tr><td>Wind speed</td><td> %6.1f m/s</td></tr>" % \
		      weather.getWindSpeed()
                if weather.getTemperatureCelsius() is not None:
                    print "<tr><td>Temperature</td><td> %.1fーC (%.1fーF)</td></tr>" % \
		      (weather.getTemperatureCelsius(), \
		      weather.getTemperatureFahrenheit())
                if weather.getDewPointCelsius() is not None:
                    print "<tr><td>Dew point</td><td> %.1fーC (%.1fーF)</td></tr>" % \
		      (weather.getDewPointCelsius(), \
		      weather.getDewPointFahrenheit())
                if weather.getHumidity() is not None: 
                    print "<tr><td>Humidity</td><td> %.0f%%</td></tr>" % \
		      weather.getHumidity()
                if weather.getVisibilityKilometers() is not None:
                    print "<tr><td>Visibility</td><td> %.1f Km</td></tr>" % \
		      weather.getVisibilityKilometers()
                if weather.getPressure() is not None:
                    print "<tr><td>Pressure</td><td> %.0f hPa</td></tr>" % \
		      weather.getPressure()
                if weather.getWeather() is not None: 
			print "<tr><td>Weather</td><td> %s</td></tr>" % \
			  weather.getWeather()
                if weather.getSkyConditions() is not None: 
			print "<tr><td>Sky conditions</td><td> %s</td></tr>" % \
		          weather.getSkyConditions()
		print "</table>"
            else:
                print "Either %s is not a valid station ID, " % arg
		print "the NOAA server is down or parsing is severely broken."


print "<html>"
print "<head>"
print "<title>Costa Rica weather from PlazaCR.com</title>"
print "</head>"
print "<body>"
print "<h1>Costa Rica weather from PlazaCR.com</h1>"
print "<p>Latest reports as of %s CST" % time.ctime()
gm = time.gmtime()
print "(%d.%02d.%02d %02d%02d UTC)" % (gm[0], gm[1], gm[2], gm[3], gm[4])
print '<p><a href="images/costa_rica.gif" target="_blank">Costa Rica map</a>'

stations(["MROC", "MRLM", "MRCH", "MRLB", "MRPV"])

print "</body>"
print "</html>"

HTMLペイジを作るのではなくpymetar.py コードをwrapperにインポートするだけにした。このため、Pythonが検索するパスに Pymetarディレクトリを追加した。

次にstationsを定義する。これはPymetarコードを用いて測候所に質問し、続いてその出力をHTMLにフォーマットするファンクションである。不格好なのは、これが、実際にデータを入手したか否かを見るため渡されてifステートメント幾つかを使ってHTML文字列を作る長いプリント・ステートメントであるためだだ。重要な点は、これに測候所名のリストをウエブペイジ本文が返されることだ。

最後に、コードの終わりの15行はHTML大枠を構築し、測候所を呼び出して中身を作る。

テストとインストレーション

設計のせいで、テストは容易だ。設計にはウエブに基づく従属性がないので、コマンド行からプログラムを走らせるだけだ。

私の場合、プログラムwcrを呼び出したので、 ./wcr とタイプするだけでプログラムが走ってHTMLを標準出力に表示する。全て上手くいったら、出力をファイルにリダイレクトしてもう一度プログラムを走らせる。例えば:

./wcr > /tmp/weather.html

これでウエブブラウザをファイルにポイントして、思った通りにペイジを現しているかを見ることが出来る。そうでないときは、wcrを変更してテストを続ける。

出力に満足したら、コードを自分のウエブサーバにアップロードして、それを走らせるようcronジョブを設定する。通常、crontab -e によりcrontab エントリを編集することが出来る。

私はプログラムを1時間に、5分過ぎと35分過ぎの、2回走らせることにした。crontabエントリはプログラムを実行してその出力をウエブサーバが入手することの出来る位置に出力ファイルを書かなければならない。私は:

5,35 * * * * /home/fyl/pymetar-0.5/bin/wcr > /var/www/htdocs/weather.html

を使った。四つの*印は、5分と35分の時間を毎日の毎時に対し適用することをcronに命令する。次のフィールドは、走らせるプログラムの名だ。最後に、リダイレクト演算子(>)に続けてHTMLファイルを記憶する場所を指定する。.

パーミッション全部を正しく設定したとすると、つまりプログラムがファイルを書くことが出来、ウエブサーバがそれを読むことが出来れが、全部終わりだ。このファイルをポイントすつろ、気象ペイジが見られる。

まとめ

完全主義者と取っては、もっと凝ったソリューションが欲しいだろう。HTMLファイルの内容が有効でないときに丁度時間になることがあるかも知れないからだ。cronがジョブを打ち切ったときファイルは切り捨てられる。続いてプログラムは走って新しいファイルを構築する。

プログラムが働く方法のため、この時間は幾つかのPythonコードの短い実行時間だけではない。プログラムは色々な測候所に質問をし応答を待たなければならないからだ。私が呼び出す五つの測候所について、経過時間は1秒から10秒の間であるのが分かった。30分毎に最大10秒だけサイト上に悪いデータがあるのを認めるときは、全てが上手く行く。そうでないときは、出力を一時ファイルに書き込んでから、全部が終わったとき実際のファイルに移動する。まだ完全ではないが、それに近い。

これで、早いが汚い気象ペイジが手に入った。楽しまれたい。--Phil Hughes, fyl@a42.com Phone/FAX: 506-483-1265 Aptdo. 89-4060, Alajuela, Costa Rica。

 

著者紹介:

Phil Hugheは、Linux JournalLinux Gazetteの発行者である。彼は、オリンピック半島の太平洋岸にある自宅から常に通信する夢を持っている。雇い主としては、多くのボスがそうであるように「凶暴で、邪悪で、吝嗇で意地悪だが、円熟している」。

 

Copyright © 2003, Phil Hughes. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 94 of Linux Gazette, September 2003
 
 
 
 
 
SCOインタビュー
匿名記事
ここにいるのは、チャンプス・ニュース・ネットワーク社長のボブ・チャンプスだ。我々は、今日のセクシイ・コンドーム運営会社社長のバリル・オハブリとのワシントン・インサイダー記者会見のためここにいる。

CNN:最近あなたを標的にしたニュースが賑やかですが、背景を少しご説明願えますか?どこからこれらの考えを持たれたのでしょうか?

バリル:ある日、役員室で、次の5年間に何か金儲けをするのに弁護士のチャンスはないものかと話していた。闇で育った者達全部とフランス・チックラの設計者は、我々はこれらの研究開発に資金を出さなかっただけで、外の誰かからライセンスを受けなければならないなら競争することは出来ない。破滅だ。私はひどく落ち込んだ。家に帰って状況を忘れようとした。新しいオープンソースの本「目を塞ぐ:自分のブッシュとの冒険」を取り上げた。だが、集中出来なかったので、バイアグラを少し飲んだ。忽ち良くなて、読書に戻った。選挙の章の後で、考えが浮かんだ。9/11の部分に来たとき、確かな考えになった。「Browns & Marketingが石油戦争を爆撃」の章に来た時、我慢出来なくなった。米国人は何年もこの種のことに備えて来たのが分かった。出来る筈だ!

CNN:それから何が起こったのですか?

バリル: 直ぐに会長のプキンダ・ジェローを呼んだ「明日、弁護士を呼べ。考えがある」聴いた後で、素晴らしい、あなたは天才だと言った。良い協力者だ。翌日会って基本計画を練った。

コンドーム・パックに関するライセンス契約を弁護士に詳しく検討させた。そこに書いてある通りでは、君が我々の性病予防法の一つを使うと、君は、君が一生涯セックスするライセンスを我々が与えるのを暗黙で了承したことになる。知らずに金鉱の真ん中に座っていた訳だ。

基本的に、弁護士の解釈では、SCOコンドームを被せる度に、君は我々に支払う必要がある。そこで弁護士は夢中で働いて、「大変な」訴訟の考えに達した。そこで、我が社のコンドームの購入者を個別に見分けることは出来ないのが分かった。全体情報認識のことは未だ話題になっていなかった。そこで、万人を訴えるだけにした。全滅作戦だ。結局、誰もが皆済するか、永久にペニスをしまい込むかだった。

CNN:誰も反対しなかったのですか?

バリル: 一人いた。アプヒンダ・バウワウはこれを嫌って辞めた。余り役には立ず、要らない人間だった。

CNN:だが、実際にどうやって金儲けするのですか?人々はこの点を理解しようとしています?

バリル: それが素晴らしい点だ。ご承知の通り法廷で落着するまで数年掛かる。その間、Tバードの服用を減らすことが出来る。早く現金化する方法を見付けなければならない。ワールドワイド・インターコースの副社長ベグ・ラヘージを雇ったのを思い出した。勿論、殆ど仕事がなくて放置されていた。彼を会議に呼んだ。この関係の経験があるのが分かった、社員持株制度のやり方を知っていた。これは極めて簡単で、事情を知る我々全部にオプションを発行する方法を計画した。ご存知の通り上手く行った。発表と同時に株がなくなった。今は金がうなっている。安物を飲む気は全くない。

CNN:随分突飛に思われますが?

バリル: 最初は、私もそう思った。実の所心配だった。だが、バイアグラ、ペヨーテ、ツートの同じ混合をしただけで、まもなく全部上手く行くのに気付いた。主なことは、宣伝を続けること、大衆と職員に戸惑いながらもやる気を出させ続けることだ。

CNN:それには、どうしました?

バリル: 極めて簡単だと分かった。先ず最初に、専門脚本家を雇って全員がいつも言うことを覚えた。話し方の同期だ。次に、定期的に新聞と電話の会議をした。上級副社長クリスプ・ブロージョブが、この部門のリーダで、アルマニのスーツと新しいネクタイで身と固めた。彼がこの服装で現れると、誰もが彼の言うことを信じた。君も彼のTVを見たと思う。勿論、他の職員にはまだ問題があったが、私自身もその一人だった。皆が、SCOカフェテリアで食事をするので、格好の良い潜在意識ポスターを掲げ食事に私の混合物を入れた。皆にコークを振る舞う訳にはゆかないので、元のレシピから閉め出しカフェイン2,000ミリグラムで置き換えた。上手い仕事で、98%以下のロスだった。.

CNN:成功とは言えないと思いますよ。これら全部であなたが一番の大問題になっているのを、どう思いますか?

バリル: これまでのところ、米国内での船出なのは明らかだ。だらら庫のマーケットに集中している。我々は現実主義者なので、世界を征服していないのは分かっている。未だ用意が出来ていないはずだ。国内ではメディアが我々の仕事をやり易くしている。

一番の心配事は、殆どの人がマスターベーションに切り換えるだけだと言うことだ。今は、これを扱う方法に確信がない。だが研究中の脚本家がいる。正しい広告を見付ければ、多分殆どの人に、それが掌に毛が生え、盲目になる原因になると信じさせることが出来るだろう。

CNN:へーえ、驚きですね。最後に言うことがありますか?

バリル: そう、人々が愚かなのを神に感謝するだけだ。弁護士は、我々の製品(標識SCOC)を持っている人がSCOCサッカーと呼ばれるようになれば面白いなと思っている。

Copyright © 2003, Anonymous. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 94 of Linux Gazette, September 2003
 
 
 
 
END