勿論、これら変更を考察するに当たって、この変更が好ましいかどうかを自問しなければならない。主導権を握る人はいるだろうが、欧州ソフトウエア特許に向かうこと動きに反対する幅広い団体がある。ソフトウエア特許に反対の非科学的対策は、「欧州ソフトウエア特許」に関するGoogleニュースの検索により得ることが出来る。見出しの大多数は、提案に敵対するか悲観的である。無条件の支持はない。これは個人やロビイ・グループ・ウエブサイトではなくニュースの研究であることが重要だ。多くのエコノミストに共通なのは懐疑論で、法律改正が発明とR&D費用のの減少減少を招くのをおそれている。これらの恐れは、殆どを失うことになる中小規模ソフトウエア会社では、極めて差し迫っている。同様にオープンソース開発者、この変更提案により、最も弱い立場に残されるだろう。米国でのソフトウエア特許運営で判っているように、特許制度は巨大な経済基盤を持つ当事者に有利に働く傾向がある。懐の深い組織は、特許の在庫を蓄積して、裁判で特許を防衛することが出来る。優れた特許であっても資金豊富な所有者は、同程度の防衛の効力により競争相手になりそうなものを威圧することが出来る。大会社よりも利益を受けそうなグループは、法律仲間だけである。
特許反対グループの組織する反対又はロビイ活動が有効であるか否かは判らない。ウエブサイト閉鎖 などの行動は、オンラインに衝撃を与えるけれども、実社会への影響は極めて小さい。Registerが指摘したように、オープンソースが偉大なコードを作っても、大きいロビイ活動が生まれるとは限らない。至るところのオープンソース・グループ、政治の世界で何が働き何が働かないかについての情報を共有し、その情報を将来の逃走に役立てるだろう。
SCO事件に対する反応は殆ど沈黙であるが、注意深い企業は、法廷事件の影の下で、これ以上オープンソースとフリーのソフトウエアに関わりたくないというものだ。もっと神経質なものは、SCOの要求する特許料を支払おうとしている。オーストラリア弁護士ジョン・コリンズの意見が、正しいと思われる:
SCOの行動の真の目的は、これらの開発が有した持ち分価格の効果に(殆ど積極的に)関わっていると推測する者もいる。これらの論争の例は、Tim Rushingの著作にあるが、結局誰も憶測しているに過ぎない。追加の解析がGrokLaw と sco.iwethey.orgとにあるが、紆余曲折を続けており、SCO経営陣の不合理な行動は述べないで、灰色の事件に重荷を負わせている。
この話の元の報告は以下で見出すことが出来る:
8月16日mDebianプロジェクトは、その創立10周年を祝った。Linux Planetは、この記念にDebian 10年の回顧 を発行した。
Siemens ビジネス・サービス は、世界中の17,000名以上の従業員の給与支払いを処理するそのmySAP HR管理システムをサポートすのに、SuSE Linux エンタープライズ・サーバ8を利用すると決定した。オープンソースOSと、SAP R/3 ソフトウエアのプラットホーム独立性により、オープンで強力且つ効率の良いIntelアーキテクチャへの移行が可能になる。Linuxに基づくアプリケーション・サーバは、既存のUnixに基づくサーバと一緒に独立で作動させることが出来る。したがって、RMシステムは、それを償却し、逐次Linuxサーバで置き換えるまで、走らせ続けることが出来る。
GNU Scientific Library(GNL)は、Cでの数値計算用ルーチンの集積である。このリリースは、以前の1.xリリースと後ろ向き互換性がある。GSLは、これでJason H. Stoverが貢献した累積分布関数(CDF)を含むこととなる。
主な特徴は:
Mod_python 3.1.0a は http://httpd.apache.org/modules/python-download.cgiで入手可能。
LGの「今月のニュース」 編集者はMick だ。
数年前にアイルランドで生まれたMichaelは、現在ダブリン大学医療工学部で博士論文に取り組んでいる。論文の題名はLamb wavesの非破壊検査への利用だ。この研究に GNU/Linux が極めて有用であったので、 Michael は他の工学にフリーソフトウエア・ソリューションを適用することに強い興味を持った。論文が出来上がったら、 Michael は長い徒歩旅行にでる予定だ。
マイクロ・コンピュータ・システムは何で作られているか?マイクロ・コンピュータ・システムは、マイクロプロセッサ装置(MPU)、バス・システム、I/Oシステム、全部品間のインターフェイスで作られている。これが一般の期待する答えだ。
これは、ハードウエアだけの話。どのマイクロ・コンピュータ・システムにも、各ハードウエアがそれぞれの役目を果たす間、それら各々に命令するソフトウエアが必要だ。コンピュータ・ソフトウエアは、システム側について(システム・ソフトウエア)と、ユーザ側について(ユーザ・ソフトウエア)考えられる。
ユーザ・ソフトウエアには、固有のライブラリとユーザ作成ライブラリが、実行用プログラム作成の際に必要となるサブルーチンの形で含まれている。
システム・ソフトウエアは、プログラム作成を助けるための、各種の高級言語トランスレータ、アセンブラ、テキスト・エディタ、及びその他のプログラム数種を含む。機械語、アセンブラ言語、高レベル言語と、三つのレベルのプログラム作成があることは知っている。
機械語プログラムは、コンピュータが直接理解して実行することの出来るプログラムである。アセンブラ言語命令は、多かれ少なかれ1対1の関係で機械語命令に一致するが、理解し易いように文字列で書かれる。高級言語命令は英語に近く、プログラムが考える方法に対応するような文書構造になっている。結局、アセンブラ言語又は高級言語プログラムは、トランスレータと言うプログラムを使って機械語に転換しなければならない。これらは、それそぞれ、アセンブラ、コンパイラ又はインタプリータと呼ばれる。
C/C++ など高級言語用のコンパイラは、高級言語をアセンブリ・コードに翻訳する能力がある。GNU C 及び C++コンパイラの -Sオプションは、対応するソースプログラムに同等のアセンブリ・コードを作成する。ループ、ファンクション呼出、変数宣言など、殆どの基本的構造がアセンブリ言語にマップされる方法を知ることは、C内部をマスターする目標を達成するための一方法である。さらに進む前に、ここで示す資料を理解するには、コンピュータ・アーキテクチャとIntel x86アセンブリ言語に慣れておかなければならない。
手始めに、hello worldをプリントするプログラムをCで書き、 -S オプションを使ってコンパイルする。出力は、規定の入力ファイル用のアセンブラ・コードである。GCCは規定値で、添字'c'を's'で置き換えてアセンブラ・ファイルを作る。アセンブラ・ファイルの終わりの数行を解釈して見ること。
Intel 80386 以降のプロセッサには、無数のレジスタ、命令、及びアドレス・モードがある。簡単な命令数個の基本的知識があれば、GNUコンパイラの作成するコードを理解するのに十分である。
一般的に、どのアセンブリ言語命令にも、ラベル(label)、ニーモニック(mnemonic) 及びオペランド(operands)が含まれる。オペランドの記法は、オペランドのアドレシング・モードを解読するのに十分である。ニーもニックは、オペランドに含まれる情報で演算する。事実、アセンブリ言語命令は、レジスタとメモリ位置上で働く。80386ファミリには、eax, ebx, ecx などと呼ばれる汎用レジスタ(32ビット)がある。二つのレジスタebpとesp は、スタックの操作に使われる。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 に記憶して呼出人に戻すだけである。
次のプログラムは 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
L1 とL2 はラベル。制御の流れが L2 に達したとき、ebx にはeaxに記憶された数の階乗が入っている。
複雑なプログラムを実行するとき、解決すべき問題を組織的な順序に分ける。問題毎にサブルーチンとファンクションを書いて、必要に応じて呼び出す。Listing 3はアセンブリ言語プログラムにおけるサブルーチン呼出と戻りを示す。
#Listing 3 .globl main main: movl $10, %eax call foo ret foo: addl $5, %eax ret
命令 call は制御をサブルーチンfoo に移す。foo の中のret 命令は制御を mainの中のcallの後の命令に移す。
一般的に、各ファンクションは、ルーチン呼出毎に使う変数の範囲を定義する。変数の範囲を維持するにはスペースを必要とする。ルーチン呼出毎に変数の値を維持するには、スタックを使うことが出来る。プログラムの実行における反復、循環、又はその他あり得る呼出のため、活動記録を維持することの出来る方法の基本を知ることが重要である。esp や ebp などのレジスタの操作方法及び、スタック上で作動するpush やpop などの命令の使用法を知ることは、サブルーチン呼出と復帰機構を理解する中心である。
プログラムのメモリの一区画がスタックとして使用するため保留されている。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 で終わり、これが制御をスタックの先頭から取ったアドレスの命令に移す。スタック先頭が有効な復帰アドレスを含まなければならないのは明らかである。
数百数千の変数を扱う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までのスタック位置を示す。ebp と esp に記憶された値は7000ト4000で、スタック位置3988 から3999は、mainの最初の命令が実行される前に任意の値219986, 1265789, 86を含むと仮定する。また main の中のcall foo の命令のアドレスを30000と仮定する。
表1
スタックは、パラメータをファンクションに引き渡すため使用することが出来る。ファンクションがeaxレジスタに記憶した値をファンクションの戻り値に採用されるとの慣例(Cコンパイラで使われる)慣例にしたがう。呼出プログラムは、パラメータの値をスタックにプッシュして、被呼出プログラムに渡す。Listing 5 はsqrと言う簡単なファンクションを用いてこれを示す。
#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バイトのオフセットでアクセスすることが出来る。
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
ここまで読めばgcc.で作ったアセンブラ出力は十分理解出来ると思う。Listing 8 は gcc -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
第二パラメータを先に渡しているのに注意。
スタックポインタを減少してローカル変数用のスペースが作られ、スタックポインタを増加するだけで割当済みスペースが返却される。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 foo を static int foo.に変更する。これがアセンブリ・コードでどうあらわされるか見よう。アセンブリ指令.globl がなくなったのに気付くだろう。色々な記憶クラス(double, long, short, const など)で試してみよう。
プログラムがアセンブリで何か数学計算手順だけをを実行するのでない限り、入力取得、出力作成、絵具ジットなどの事項を扱う。このたには、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システム呼出の更新文書を各試みが幾つかあったので、屋上屋を重ねることはしない。
GNU C はx86アーキテクチャを極めて良くサポートし、アセンブリ・コードをCプログラムに挿入する能力があるので、レジスタ割当は、規定するか又はGCCに任せるかのいすれかである。アセンブリ命令は勿論、アーキテクチャに依存する。
asm 命令により、アセンブリ目利例をC又はC++プログラムに挿入することが出来る。例えば命令
asm ("fsin" : "=t" (answer) : "0" (angle));
は、次のCステートメントをコードするx86固有の方法である。
answer = sin(angle);
元のアセンブリ・コード命令と異なり、asm ステートメントではC構文を用いて入力及び出力演算数を規定することが出来る。Asm ステートメントは見境いなく使ってはいけない。これを使ってよいのは?
#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は、幾つかの最適化を阻止することのある保守的な推測を強制される。
ネスト化ファンクションは、ファンクションの認知度の制御を助けるので、有用であることがある.
次に示す 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の生まれです。
先ず最初に、プラグインをダウンロードする必要がある。
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 から解放されました。
この記事は、Linux初心者に/etcサブルーチンの基本的理解を与えることを重点とする。
Linuxの新入生、特にWindows経歴のある人は、/etcディレクトリにあるファイルの理解を難しいと思うことが多い。この記事では、これらのファイルの幾つかとその用途を簡単に説明する。だが、/etcファイルに入る前に、これらのファイルの幾つかを変更すると、システムが不安定になったり、場合に依ってはブート出来なくなることを指摘したい。何かの変更をする前には、ファイルのバックアップを取っている筈なので、これを余り強調しない。.
このファイルは、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 で、英国とポルトガルに住んで働いている。
私だけでないのは明らかだ。今では このような 商品があるので、ラジオ をタイムシフトするプロジェクトを立てた人は極めて少ないようだ。手引き書もあって、スラッシュドットは 最近..大きいスレッドを書いた。
これらの記録は、基本的にRedHat Linux 7.3を使っているので、SuSe 又は Mandrakeを使うと効果が変わるかも知れない。アルファで出来上がっていると思うので、それらを既にインストールしている人は、それらのインストールの部分は飛ばされたい。
結局、基本的捕捉システムは次のようになった:
Alsa HW Interface -> [ ecasound ] -> < Wav Stream > -> [ lame encoder ] -> < mp3 >
サウンドカードで悪名高いスキップを生じるXなどを用いると、作業量が増える。しかし、私のシステムはファイル・サーバ専用なので、GUIを働かせるの長い間止めていた。これは、問題にはならなかったが、君のシステムでは覚えて置くと良い。
この仕事に適した低価格帯システムに付いてはcompgeeks 又はCSO をチェックのこと。
次の問題は、実際の録音をするのに使うものを考えることだ。sox やalsarecordなど色々探した末、Ecasoundを使うことに決めた。このプロジェクトには多分過大だが、好んだ特徴の幾つかは、埋込オーディオ転換ルーチン、ルートで走らせたときLinux下でのリアルタイム・スケジューリングを規定する能力、及びstdoutにデータを書き込むサポートだ。オーディオは、一定のスケジュール目的に合わせる際、ハードウエア要件を用いる全くリアルタイムの性格の仕事なので、これが出来ることは、Ecasoundの利点だ。Unixパイプもまた、ディスク要件を取扱可能な範囲まで下げて、大きい臨時ファイルの作成を回避する。
結局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'
tar jxvf alsa-driver-0.9.5.tar.bz2 alsa-driver-0.9.5/include/linux/workqueue.h
追加の注意として、規定値で、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
/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
この時点でもう一度リブートするのが多分最も易しいが、仕事に自信があれば、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]
少し最適化した構築をしたくて、進んだ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
alsamixer ツールを使って録音の前にボリュームを設定することだと見出した。これは、各種オーディオデバイスのスライダを調節し、特定サウンドカードに対し試行錯誤の方法を取らせるプログラムだ。基本的な仕組みは、関連デバイスを入力と出力モードにする。コマンド行インターフェイスを使ってコンフィギュアする良い方法があれば、ご教示願いたい。
alsamixer に入ると、0から100の値を持った多数のスライダが現れる。上にハイフォンが六つあるバーが、潜在捕捉源だ。各サウンドカードには、少し違ったDACがあると思われるので、録音を有効にするのにどれを起動すべきか分かるとは限らない。
試行錯誤とecasoundを使って、どのデバイスに録音能力があるかテストすることが出来た。このポートのスピーカ出力端子に一対のスピーカをつなぐのが大変役立つが、ここではヘッドフォンも役立つ。一般的に、line-inデバイスが欲しい。音量を70%位まで上げる。Video 4 Linux radioを使っているときは、オーディオの音源が得られるまで、ラジオ装置上で同調させるのに 'radio' を使うことが出来る。Dlinkラジオは、固定音量のライン装置なので、この音がどの位に聞こえるかは、 line-inボリュームをどう設定するかに直接関係する。
これをサウンドカードのline-inに正しく取り付けたら、何か音が聞こえる。歪まなくなるまでボリュームを調整する。歪んだオーディオはa)ひどい音でb)mp3cが全く変に聞こえる。耳で聞き分けて程々に明瞭で歪まない音にする。FMなので、転換により既に5kHzを失っているのを忘れないこと。奇跡を期待してはいけない。ノイズ源を探してアンテナを置き直す必要があるかも知れない。これはインストレーション毎に変化する。
#!/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"`
# 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
絶対に削除したくない録音、通常は週刊番組、があるので、単に.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
殆どが働いているので、これでそんなに困っていない。最近、長い路上旅行で沢山の録音を使った。だが、良いと思われる考えがある。第一にNPR番組をすくい取って各録音の詳細を入手し、各mp3のファイルに参照を付けるか又はid3コメントを番組表に一致するよう変更することだ。
第二は、専用スケジューラがあると良い。今は、録音装置を使っているとき、重なりがあって衝突が起こると、オーディオ装置が占有されているため第二の録音は失敗する。録音中枢になる専用スケジューラがあると、この問題が解決する。Tivo には類似のものがあるので、既知の解決策のある既知の問題に違いない。 Cronはこのための間違った解決策なので、迂回策は録音を故意に1分早く終わることだ。普通は、これで良い。
第三は、録音、録音番組の変更、録音済みの内容の締め出しなどでウエブベースの会話が出来ると良い。私には作る時間がないので、読者の挑戦に委ねたい。
構築についての良いニュースは、Asiaサウンドシステムを主流kernelに組み込んだため、物事が容易になったことだ。規定値で作るファイルは極めて大きいが、エンコード・ビット速度を私の規定値112kbpsより低く選んで小さくすることが出来る。ポータブル・プレーヤがないのでOGGその他のフォーマットで試していないが、逆向きへの変更は簡単な問題の筈だ。
Any ご意見 を歓迎する。私の時々悪くなる録音に解決策があれば、一言お知らせ名願いたい。
前にも述べたように、USENETニュースの取得とオンラインでの読取には、slrnpull と'slrn --spool' の組合せを用いることが出来る。ユーザが一人だけで、ダイアルアップ接続の時間料金に拘泥するとき、これは特に有用である。この問題を掘り下げて見よう。
第一に、ルートで作業するのを出来るだけ避けて、代わりにsudoを使う。visudo を使って /etc/sudoers を編集し、最後の次の行を追加する:
# we want to be specific here jane localhost=/usr/bin/slrnpull -h news.server.com
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 ~$
# 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
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
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"
1978年モスコー生まれです。12才のときから、色々な方法でコンピュータのコードをしたり、いじったりして来ました。1995年に *nix の王国に入りましたが、後悔したことはありません。現在は、ミネソタ大学化学部の Ph.D.学生です。
くだくだ説明するより、先ずは ここ に行って見られたい。コスタリカ近傍からの天候報告が少なくとも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 JournalとLinux Gazetteの発行者である。彼は、オリンピック半島の太平洋岸にある自宅から常に通信する夢を持っている。雇い主としては、多くのボスがそうであるように「凶暴で、邪悪で、吝嗇で意地悪だが、円熟している」。
CNN:最近あなたを標的にしたニュースが賑やかですが、背景を少しご説明願えますか?どこからこれらの考えを持たれたのでしょうか?
バリル:ある日、役員室で、次の5年間に何か金儲けをするのに弁護士のチャンスはないものかと話していた。闇で育った者達全部とフランス・チックラの設計者は、我々はこれらの研究開発に資金を出さなかっただけで、外の誰かからライセンスを受けなければならないなら競争することは出来ない。破滅だ。私はひどく落ち込んだ。家に帰って状況を忘れようとした。新しいオープンソースの本「目を塞ぐ:自分のブッシュとの冒険」を取り上げた。だが、集中出来なかったので、バイアグラを少し飲んだ。忽ち良くなて、読書に戻った。選挙の章の後で、考えが浮かんだ。9/11の部分に来たとき、確かな考えになった。「Browns & Marketingが石油戦争を爆撃」の章に来た時、我慢出来なくなった。米国人は何年もこの種のことに備えて来たのが分かった。出来る筈だ!
CNN:それから何が起こったのですか?
バリル: 直ぐに会長のプキンダ・ジェローを呼んだ「明日、弁護士を呼べ。考えがある」聴いた後で、素晴らしい、あなたは天才だと言った。良い協力者だ。翌日会って基本計画を練った。
コンドーム・パックに関するライセンス契約を弁護士に詳しく検討させた。そこに書いてある通りでは、君が我々の性病予防法の一つを使うと、君は、君が一生涯セックスするライセンスを我々が与えるのを暗黙で了承したことになる。知らずに金鉱の真ん中に座っていた訳だ。
基本的に、弁護士の解釈では、SCOコンドームを被せる度に、君は我々に支払う必要がある。そこで弁護士は夢中で働いて、「大変な」訴訟の考えに達した。そこで、我が社のコンドームの購入者を個別に見分けることは出来ないのが分かった。全体情報認識のことは未だ話題になっていなかった。そこで、万人を訴えるだけにした。全滅作戦だ。結局、誰もが皆済するか、永久にペニスをしまい込むかだった。
CNN:誰も反対しなかったのですか?
バリル: 一人いた。アプヒンダ・バウワウはこれを嫌って辞めた。余り役には立ず、要らない人間だった。
CNN:だが、実際にどうやって金儲けするのですか?人々はこの点を理解しようとしています?
バリル: それが素晴らしい点だ。ご承知の通り法廷で落着するまで数年掛かる。その間、Tバードの服用を減らすことが出来る。早く現金化する方法を見付けなければならない。ワールドワイド・インターコースの副社長ベグ・ラヘージを雇ったのを思い出した。勿論、殆ど仕事がなくて放置されていた。彼を会議に呼んだ。この関係の経験があるのが分かった、社員持株制度のやり方を知っていた。これは極めて簡単で、事情を知る我々全部にオプションを発行する方法を計画した。ご存知の通り上手く行った。発表と同時に株がなくなった。今は金がうなっている。安物を飲む気は全くない。
CNN:随分突飛に思われますが?
バリル: 最初は、私もそう思った。実の所心配だった。だが、バイアグラ、ペヨーテ、ツートの同じ混合をしただけで、まもなく全部上手く行くのに気付いた。主なことは、宣伝を続けること、大衆と職員に戸惑いながらもやる気を出させ続けることだ。
CNN:それには、どうしました?
バリル: 極めて簡単だと分かった。先ず最初に、専門脚本家を雇って全員がいつも言うことを覚えた。話し方の同期だ。次に、定期的に新聞と電話の会議をした。上級副社長クリスプ・ブロージョブが、この部門のリーダで、アルマニのスーツと新しいネクタイで身と固めた。彼がこの服装で現れると、誰もが彼の言うことを信じた。君も彼のTVを見たと思う。勿論、他の職員にはまだ問題があったが、私自身もその一人だった。皆が、SCOカフェテリアで食事をするので、格好の良い潜在意識ポスターを掲げ食事に私の混合物を入れた。皆にコークを振る舞う訳にはゆかないので、元のレシピから閉め出しカフェイン2,000ミリグラムで置き換えた。上手い仕事で、98%以下のロスだった。.
CNN:成功とは言えないと思いますよ。これら全部であなたが一番の大問題になっているのを、どう思いますか?
バリル: これまでのところ、米国内での船出なのは明らかだ。だらら庫のマーケットに集中している。我々は現実主義者なので、世界を征服していないのは分かっている。未だ用意が出来ていないはずだ。国内ではメディアが我々の仕事をやり易くしている。
一番の心配事は、殆どの人がマスターベーションに切り換えるだけだと言うことだ。今は、これを扱う方法に確信がない。だが研究中の脚本家がいる。正しい広告を見付ければ、多分殆どの人に、それが掌に毛が生え、盲目になる原因になると信じさせることが出来るだろう。
CNN:へーえ、驚きですね。最後に言うことがありますか?
バリル: そう、人々が愚かなのを神に感謝するだけだ。弁護士は、我々の製品(標識SCOC)を持っている人がSCOCサッカーと呼ばれるようになれば面白いなと思っている。