Electronic Frontier Foundation にこの件 this case.に関する資料が調っている。特に興味があるのはノールウエイ法の下で反対がなかった理由についての法律論some legal argumentsとDMCA(2000年7月20日)ニューヨークにおける2600 Magazine 裁判におけるJon Johansenの証言の写しtranscripts だ。
残念なのは、将来こんな事件が頻繁に起こりそうなことだ。政府は、3月に発効する著作権条約 the WIPO copyright treaty のような著作権法で国際的に歩調を合わせている。その結果、知的所有権の保護とアクセス制限をおこなうDMCAのような法制化が結局すべての国でおこなわれることになる。この傾向に抵抗する国を歓迎する。Slashdotは最近ウクライナがブランクCDとCDレコーダに関して「光媒体王国」を使わない米国貿易聖域に入ると報告した reported recently。個人レベルでの抵抗は、声を大にしてロビー活動を行うことと、投書をすることだ。
上院議員リック・バウチャCongressman Rick Boucher は、デジタル権利及びDMCAなどの問題に関して取った姿勢につき多くの圧力を受けている。ダクトム・スクープDotcom Scoopは最近上院議員バウチャが、コピイ保護コンパクトディスクの導入に関する懸念を表明して最近RIAAに記事を書いたwrittenと報告したreported。このような展開は「1992年音響家庭録音法(Audio Home Recording Act of 1992)」に該当するレコーダやメディアを用いる消費者家庭での録音を禁止する」と言う。同じ件に関するレジスタの報告report は 、しかし、コピイ保護対策は合法であると述べている。新CDの合法的個人コピイをレコードラベルで訴えることはないだろうが、簡単にコピイ出来るようにすることを求めてはいない。ZDnetは、バウチャがDMCAの「配布禁止」条項を削除する法案を出そうとしていると言うreported [Reuters] 。議員がこれらの問題につき明らかに消費者寄りの姿勢を取るのを見ると元気付けられる。
少し解っていると思われる議員は、下院法務委員会のダレリ・イサだ。リナックスジャーナルのドン・マルチにSSSCAは「着いたとき死んでいた」と語った。これは励ましにはなるが、実際に墓場に葬るまでは安心出来ない。ドンが言うには、イサはこの問題(DMCAなど)についての情報を豊富に持っているようだ。
懸念される問題のキャンペーンが始まったら、良いニュースにも悪いニュースにも気を付ける必要がある。議員達は大衆の支持が必要で、世論に極めて敏感なのだ。バウチャやイサにメールを送るのは差し支えないだろう。
●UCITA
LWNによるとUCITAが戻って来た。無料ソフトウエア社会の問題は、UCITAに尽きるだろう。これが現状のままUS法に入ると、保証なしでソフトウエアを消費者に届けるのが禁止されるだろう。これは、無料ソフトウエアを配布すると、製品のあらゆる欠陥に責任を持たなければならないことを意味する。この問題は、この記事 this article にリンクしたTheRegisterでも "Why We Must Fight UCITA" の題名で論じている。
●立法リンク
未成年者が公衆の場所で暴力的なビデオゲームをしないようにしようとのインディアナポリスの試みは、憲法に反すると$318,000の損害賠償をする羽目になった。
色々な分野の人が、立法の必要性を述べている。
マイク・ゴドウィンがデジタル権利管理及びコンピュータ会社とエンターテイメント会社との間の闘争について書いた小論文Essay がある。
● LinuxWorld コンファレンスとエキスポ (IDG)
2002年1月30日 - 2月1日 ニューヨーク
● Athlon/DuronとLinuxバグ
● Linuxの採用
TheRegister.co.uk は、最近韓国が12万人の公務員にLinuxデスクトップを使わせることにしたと報じた reported 。これは現地のHaansoft (Hancom LinuxとHancomOfficeの作者)の巻き返しと報じられているが、良いニュースには違いない。
別の展開では、インドRed Hatがインド教育システムのソフトウエア需要に応じる計画の一部としてGNU/Linuxの導入を助けているとNewsForgeが報じている reports 。この計画はソフトウエアの導入だけでなく、実行のため無料トレーニングの助けも借りる。
世界に目を転じると、中国では、沢山のペンギンが行進している。Linux Todayの報じるところでは report、中国でLinuxが注目を浴びている。中国科学院はマイクロソフトの代わりにLinuxを利用する経費節減を強調した報告を刊行した。これに続いて、マイクロソフトが最近主要IT企業を失った一方で、Red Flag Linux など土着の企業が得をしている。
● ペンギン・アート
http://www.thelinuxreview.com/TUX/ で、TUX (ターミネータUnit X)オンラインコミックの新版が入手出来る。TUXの死の報告が大いに誇張された。
芸術の観点では、IBM がリナックス漫画 Linux Cartoons ページを更新した。Flash 又は Real Player が必要である。
● Linux Trojanを発見
qualys.com は野生のLinux Trojan を発見したと報じた announced。これは昨年同様のLinux Trojan をqualyが発見したのに続く。この話はNewsbytes.comが取り上げたもので、そこからSlashdotが行動を起こした got in on the act。感染するには、Trojanをルートとして走らせる必要があるので、これの蔓延にはある種の社会工学が必要と思われる。殆どの人が搭載媒体のバイナリを信用するので、Linuxディストリビューションのバイナリが感染しないかが主な危険だ。少なくともルートとして利用するものには、くれぐれも注意を払うこと。
● DOSSIER、ドキュメンテーション・ソース
DOSSIER は、無料でオープンソースのソフトウエア用にプリント文書を得る便利な方法だ。現在の話題には「e-メール」「ファイルシステム」「Kernel」「PostgreSQL」「Pyton」「テキスト」が含まれる。大量印刷要求はBSDMallから注文できる。DOSSIERの動機と存在理由はDaemon Newsの " DOSSIER and the Meta Project (Part 1)"に述べられている。
BrlSpeakは、埋込のbraille とspeech に関するサポートを携えたLinuxの新しいミニ・ディストリビューションだ。目的は、目の悪い人が目の見える人の助けを得ないでコンピュータにLinuxディストリビューションを搭載するための解決策の提供にある。BrlSpeakは、Linuxスタート前にあらかじめBrlTty Makefile をコンフィギュア出来るよう埋込プレコンフィギュアラを提供する。次のステップは、braille装置のコンパイルと自動起動で、ディストリビューションのブート時に実行される。BrlSpeakはMatthew campbellのZipSpeak に基づいているが、これはスピーチシンセサイザのサポートのため、SpeakUp スクリーンリーダーを含む理由でもある。BrlSpeak は各国語で入手することが出来る。ダウンロードするにはBrlSpeak Projet Home Pageを訪ねること。
作者: Osvaldo La Rosa、無料配布可能、UMSDOS ミニ・ディストリビューション、サイズ:36MB、zip 又は isoで入手可能、ウエブサイト: en, fr, nl.。協力歓迎!
Debian Weekly Newsによれば reported CD" ウエブペイジ上で新Debian が立ち上がったlaunched。これらは cdimage.debian.org上の「何かと訪問者の批判が多かった」旧ペイジに置き換わる。新ペイジは、文書の改善、画像、CDベンダーリストの直接ダウンロードを特徴とする。拡張FAQとは別に、新ペイジは画像、CDベンダーリスト、アートワーク及び、CD画像を通常のDebianミラーからダウンロードするための新ディストリビューション計画 jigdoに関する情報などの直接ダウンロードを提供する。
Linux Today は、55,000,000以上の物理SLOを含むDebian 2.2のサイズに関する報告 report に重点をおいている。COCOMOモデルはDebian 2.2の開発費用が19億米ドルに達すると見込んでいる。
Linux Today が他にも報じているのは、弱点通知とDebian社会契約を述べたバグ報告bugreportである。「ここ数ヶ月、GNU/Linux社会はゆっくりと、マイクロソフトが昨年提案したセキュリティ問題をエンドユーザーから少なくもしばらくは隠すセキュリティ取扱法を採用している。Debian保守者のある者は、これに加担しており、セキュリティ対策を遅らせ、外部のDebianに無関係の事件が起こるのを待っていると思われる。」
Linux Planet が、ディストリビューション監視セクションに 'Month Later' の追加を開始した。このsecond look を受ける最初のディストリビューションはMandrake 8.1米だ。概観では、このディストリビューションが日常出会う凸凹をならす過程を論じている。
Command Prompt はDocPro 0.2.0.のリリースを発表した。. DocPro は、専門技術文書作成のため大量のSGML/XML ベース文書を保管するツールである。DocPro は任意のDocBook 文書をユーザー定義フォーマット(Postscript, HTMLなど)に転換する。
DocPro は、多数の文書を多数の出力フォーマットに正しく転換する。フォントサイズ、余白、呼出定義などをGUIインターフェイスを介して任意に設定する能力をも備える。
DocProは現在 x86 Linux 上のみで働くが、YellowDog Linux (PPC) 及びMacOS X 用も近くリリースする。DocPro のデラックスバージョンはには、HTML をDocBookに転換する有名なDocParse ツールが付いてくる。
Adobeシステムが、ウエブサイト開発用フラッグシップ製品GoLive 6の新リリースに、ZendのPHPデバッガを包含する。これにより、GoLive 開発者は、頑強でダイナミックなウエブサイト用の最新PHPデバッグに、スクリプト言語を用いて統合アクセスをすることが出来る。
CxProtect は、Linuxメールサーバー用ウイルス対策だ。コマンドAntiVirus APIを使用するバイナリベースのソリューションだ。このソフトウエアは、Linuxメールサーバー経由で転送中の検出とアタッチメントの感染防止を提供する。既存Sendmail.cf に加える変更は、CxProject をMDAとして登録するだけだ。搭載後のコンフィギュレーションは、ウエブブラウザ経由で行われる。ダウンロードは http://www.calibretechnologies.com/downloads/CxProtect.tar.gz
Mahoganyが新たにリリースされた。Mahoganyはオープンソース・クロスプラットホ−ムのメール・ニュース・クライアントで、X11/Unix 及びMSウインドウズ・プラットホームで利用出来る。これはPOP3, IMAP4, SMTP, NNTPなど多数のインターネット・プロトコル及び標準をサポートする。MahoganyはまたMIME及び多くの共通Unixメールボックスフォーマットをサポートする。
Linuxシステム用とUnixシステム用のバイナリ及びWin32用のバイナリが入手出来る now available.
Brotherインターネット・プリント・プロトコル
「インターネットプリント−別の方法」"Internet Printing - Another Way"と題する最近の記事で、Brother プリンタで使うことの出来るプリント・プロトコルを述べた。これによりウインドウズ・マシンのユーザーが、e−メイル経由で直接Brotherプリントサーバーにマルチパートベースー64でコードしたプリントファイルを送ることが出来る。
この記事はさらに、定期的にPOP3サーバーを呼び出してパーツが全部到着したジョブを点検する簡単なPerlプログラムにおいて、Brotherプリントサーバーの機能性を実現する方法を示した。このようなジョブが検出されると、パーツを順次ダウンロードして、プリントのため解読する。
次の記事「Brotherインターネット・プリント・プロトコル用Linuxクライアント」 "A Linux Client for the Brother Internet Print Protocol" では、入力流をパーツに分けて、引き続くエンコードと送信のためスクラッチ・ディレクトリに置く、簡単なクライアント・プログラムを示した。
それ以来、入力流をオンザフライで(送出中に)処理し一次記憶を必要としないPerlプログラムを開発した。この方が余程スマートだ。下流側では、最後のパーツの処理が始まるまで全体パーツ計数を確かめる方法がない。サーバープログラムを修正して、空の「全体パーツ」フィールドを、最終パートを除くすべてに収容する必要がある。
トラックで通れる程大きい穴
上に概説した全体配置を私の処で数ヶ月使用したところ、時間の短縮と事故の減少に役立った。しかし、ある人が指摘したように、トラックで通れる程巨大なセキュリティの穴があった。世界中の人が、プリンタに祝いの絵を送ったとき、プリンタ側では何の処置も出来ない。
他の人は、先ず圧縮しようとしないで、大きいジョブをパーツに分ける手間を掛ける理由を聞いた。圧縮によりサイズを著しく小さく出来るジョブは沢山ある。
移植性のため全体をPerlで書くべきと考えたウインドウズユーザーがいた。ジョブのパーツはRFC 2046にしたがう'message/partial'として送るべきと考える人もいた。
アンデルセンの絵を描いているのは誰だ?
上述の問題すべての中で、最も重要なのはクライアント証明の余地がないことだ。今利用出来るパブリックキイ暗号化機構を使っていない。ここで必要なのは、送り手に取ってプライベートキイを使ってメッセージ全部にデジタル署名をすることだ。受け手が受信したとき、送り手のパブリックキイを使ってメッセージを証明することが出来る。サーバー側ではキイエントリの儀式を選ぶ必要がないので、サーバーの全作業を自動化出来る。
このような方法で署名されたメッセージには、「ハッキリした」形でサインすることが出来、メッセージ自体をそのまま、文末に付けられたデジタル署名と一緒に送ることが出来る。「ハッキリした」署名を選ばないときは、メッセージは圧縮されて署名がそれに組み込まれる。これは我々の必要に近い。
必要な署名と認証手続きを実行することの出来るPerlモジュールのセット(著作権:OpenPGP)があるので、移植可能な型でクライアント・サーバー・プログラム全体を書くことが出来る。これらを搭載するには、多数のモジュールの搭載を必要とし、'PARI-GP'数学パケージも必要なので、一寸面倒だった。代わりに pgp-2.6.3iaを使用することにした。GnuPG-v1.0.6 もまたこの記事のプログラムを使って働く。
pgp-2.6.3iaとその同等エクゼクタブルを呼出すのに使用することの出来るPerlモジュール(著作権:PGPSimple とPGP:署名)も二つあるが、それぞれ一時ファイルを作る。これは出来るだけ避けたいところだ。
標準 Nazis の規定
RFC 3156 (OpenPGPを用いるMIMEセキュリティ)には、MIMEセキュリティ充足型を用いてプライバシイと認証とを作るのにOpenPGPメッセージ・フォーマットを使う方法が説明してある。詳細には、秘密キイで暗号化してメッセージに署名した後、複数パート暗号化(multipart/encrypted)メッセージとして送らなければならない。最初のパートに、バージョン番号を平文で示すアプリケーション/pgp-暗号化(application/pgp-encrypted)を含み、第二のパートに実際のPGPメッセージを含まなければならない。
これは少し限度を超えるが、手数は少なく、以下の 'SEPclientPGP.pl' に示すように、Perl MIME::Liteモジュールを用いて容易に処理することが出来る。
そこで問題は、中継メールサーバーを通じてパーツに分ける必要のある長いメッセージを送る方法は何かと言うことだ。RFC 3156は、MIME 'message/partial' (RFC 2046) を使えと言う。本当の意味は「も同時に」との意味だと考える。そこで、 'SEPclientPGP.pl' からの我々の出力は、'SplitSend.pl' に送られ、そこで "To:" と "Subject:" 行のメッセージを抽出して、それらを引き続き発生する番号付き 'message/partial' 成分 に写す。
クライアント・プロブラム
クライアント・プロブラム client programを示す。'SplitSend.pl' プログラムへのパイプを出力用に開く。コマンド行上にパスフレーズを与える(危険だが、時に必要)と、環境変数に植え付けられる。
次いで、その第二本体部分をPGPエクゼクタブルが送るパイプから取って、前述のような複数MIMEメッセージを構築する。エクゼクタブルは、適当な環境変数の中に適切なパスフレーズを見出さないときは、ターミナル・ウインドウに請求する。
#!/usr/local/bin/perl -w
# @(#) SEPclientPGP.pl e-メール・プリント・プログラムRef: RFC 3156を確保
# 入力流を取ってPGP-署名メッセージを作る。これらは
# サーバーへのe-メール送信のためsplit-and-send
# プログラムにパイプされる。 'pgp' プログラムが必要
# Graham Jenkins, IBM GSA, Dec. 2001. [Rev'd 2001-12-30]
use strict;
use File::Basename;
use MIME::Lite;
use IO::File;
use Env qw(PGPPASS);
die "Usage: ".basename($0)." kb-per-part destination [passphrase]\n".
" e.g.: ".basename($0)." 16 lp3\@pserv.acme.com \"A secret\" < report.ps\n".
" Part-size must be >= 1\n"
if ( ($#ARGV < 1) or ($#ARGV > 2) or ($ARGV[0] < 1) );
my $fh = new IO::File "| /usr/local/bin/SplitSend.pl $ARGV[0]";
if( defined($ARGV[2]) ) {$PGPPASS=$ARGV[2]}
if( ! defined ($PGPPASS)) {$PGPPASS=""} # 環境にパスフレーズを植え
my $msg = MIME::Lite->new( # 署名メッセージを作る
To => $ARGV[1],
Subject => 'Secure Email Print Job # '.time,
Type => 'multipart/encrypted');
$msg->attr ( "content-type.protocol" => "pgp-encrypted");
$msg->attach( Type => 'application/pgp-encrypted',
Encoding=> 'binary',
Data => "Version: 1\n");
$msg->attach( Type => 'application/octet-stream',
Encoding=> 'binary',
Path => "/usr/local/bin/pgp -fas - |");
$msg->print($fh); # 署名メッセージを分割・送信プログラムにパイプ
__END__
分割・送信
分割・送信プロブラムsplit-and-send programを示す。最後のメインループが上述の働きをする。即ち、宛先フィールドと主題フィールドを抽出し、パラメータとして渡されるメッセージサイズ限度を超えるまで行を堆積し、次いで送るべきものを出力ルーチンに送る。
出力ルーチンは、宛先及び主題フィールドを再挿入し、またメッセージ識別子、パーツ番号及びパーツ全数を挿入する必要がある。パーツ全数は、最終パートでのみ必要である。次のパートを見付けるまで、今のパートが最終パートであるか否か分からない点を除いて、すべては容易である。そこでダブルバッファ配置を用いてこの問題を回避する。ここには次のバッファを手に入れるまでバッファの内容を出力しない。
MIME::Simple をこのプログラムで使用するのは大袈裟過ぎるかも知れない。しかし、やろうとすることは、プラットホームが何をしようと、適切なメーラープログラムを見出すことである。
#!/usr/local/bin/perl -w
# @(#) SplitSend.pl e-メールメッセージを分割して送信する(Ref: RFC 1521, 2046)
# Graham Jenkins, IBM GSA, December 2001.
use strict;
use File::Basename;
use MIME::Lite;
use Net::Domain;
my ($Id,$j,$Dest,$Subj,$part,$InpBuf,$OutBuf,$Number,$Total);
die "Usage: ".basename($0)." kb-per-part\n".
" Part-size must be >= 1\n" if ( ($#ARGV != 0) or ($ARGV[0] < 1) );
$Id=(getlogin."\@".Net::Domain::hostfqdn().time) or $Id="unknown_user".time;
$Number = 0; $Total = ""; $OutBuf=""; $InpBuf=""; print STDERR "\n";
sub do_output { # 出力サブルーチン
die basename($0)." .. destination undefined!\n" if ! defined($Dest);
$Subj = "" if ! defined($Subj);
if ($OutBuf ne "") { # 出力バッファにデータがあるときは
$Number++; # 数字を増やして、最終バッファか
$Total=$Number if $InpBuf eq ""; # 否かをチェック
print STDERR "Sending part: ", $Number,"/",$Total,"\n";
$part = MIME::Lite->new(
To => $Dest, # 出力バッファ内容を含む
Subject => $Subj, # メッセージを構築
Type => 'message/partial',
Encoding=> '7bit',
Data => $OutBuf);
$part->attr("content-type.id" => "$Id");
$part->attr("content-type.number" => "$Number");
$part->attr("content-type.total" => "$Total") if ($Number eq $Total);
$part->send; # メッセージを送信
}
$OutBuf = $InpBuf; # 入力バッファ内容を
$InpBuf = "" # 出力バッファに送ってエクジット
}
while (<STDIN>) { # メイン・ループ
if ( (substr($_, 0, 3) eq "To:") && (! defined($Dest)) ) {
$Dest = substr($_, 4, length($_) - 4); chomp $Dest; next }
if ( (substr($_, 0, 8) eq "Subject:") && (! defined($Subj)) ) {
$Subj = substr($_, 9, length($_) - 9); chomp $Subj; next }
if ( (length($InpBuf . $_)) > ($ARGV[0] * 1024) ) {do_output}
$InpBuf = $InpBuf . $_
}
foreach $j (1,2) {do_output} # バッファを洗い流してエグジット
__END__
ジグソー組立の技術
プリント・ジョブの部分がクライアントを出発したときの順序でサーバーに到着するとの保証はない。途中のメッセージ送信エージェントがメッセージ/パーシャル入力を自分が適切と思うように組み立て直すことが出来るので、セグメント番号が同じであるとの確信もない。だからサーバー側で持っているものは、パズルの各片が共通メッセージ識別子により関連付けられ、パズル内の位置がパート番号を用いて決められる1組のジグソーバズルである。
'SEPserverPGP.pl' の全リストについては、付属text version.を見られたい。「インターネット・プリンティング−別の方法」("Internet Printing - Another Way")で示したプログラムと殆ど同じなので、ここに書き写しはしない。
基本的に、このプログラムの目的は、'/etc/inittab' への入力を通じる呼出と、その後のループにある。各ループの中間に30秒の休止を置く。各ループの間に、POP3サーバー上にある一つ以上のプリンタ入力のメールボックスを訪ね、残りの記事のメッセージIDとパート番号とを表にする前に、そこにある古い記事を削除する。 message/partial のフルセットを見出したら、それらをパート番号順にサーバーから取り込み、内容をパイプに入れる。以下のプログラム抜粋に、それから起こることを示す。
関係メッセージ内容は、第一パートの "-----BEGIN.."行から始まると見なす。引き続くパートについては、 "id=.." 行を見た後の第一空白行の後、始まる。
パイプに入ると、複合メッセージ内容は検証/暗号解読のためPGPエグゼクタブルに渡り、次いで適切なプリンタに渡される。検証出力はスクラッチファイルに渡されて、そこからロギングのため回収される。検証に失敗するとプリンタに出力されない。
for ($k=1;$k<=$tp{$part[0]};$k++){ # 全パーツを入手したかチェック
goto I if ! defined($slot{$part[0]."=".$k});
}
$fh=new IO::File
"| /usr/local/bin/pgp -f 2>$tmp | lpr -P $user >/dev/null" or goto I;
for ($k=1;$k<=$tp{$part[0]};$k++){ # パーツをパイプにアセンブル
$message=$pop->get($slot{$part[0]."=".$k});
$l=0; $buffer=""; $print="N";
while ( defined(@$message[$l]) ) {
chomp @$message[$l]; # パート1:"-----BEGIN"で開始
if( $k == 1 ) { # 第二空白行の前でストップ
if( @$message[$l]=~m/^-----BEGIN/ ) { $m=-2; $print="Y"}
if( $print eq "Y" ) {
if( @$message[$l] eq "" ) { $m++; if( $m >= 0) {last} }
$buffer=$buffer.@$message[$l]."\n"
}
} #パート2,3,..:空白行1行を飛ばす
else { # "id="の後、スタート、ストップ
if( $print eq "Y" ) { # 次の空白行の前
if( @$message[$l] eq "" ) {last}
$buffer=$buffer.@$message[$l]."\n"
}
if( @$message[$l]=~m/id=/ ) {$print="R"}
if((@$message[$l] eq "") && ($print eq "R")) {$print="Y"}
}
$l++;
}
print $fh $buffer or goto I;
}
$fh->close || goto I;
open $fh, $tmp;
while (<$fh>) { chomp; syslog('info', $_) }
close $fh;
for ($k=1;$k<=$tp{$part[0]};$k++){
$pop->delete($slot{$part[0]."=".$k})
}
goto I;
}
J: }
}
I:}
模倣犯
上に概説した計画には、認証メッセージ全体をコピイして再生する確信犯を防止する手段がない。この可能性を避けるには、各ログ入力を1週間位保持して、対応する署名と署名日を有する入力メッセージを拒否する必要がある。
さらに、プリンタに送られている実際のデータが、インターネット上で見られるのを防止したいのであれば、クライアント側のPGPエグゼクタブルを変更して、データが署名と同時にサーバーの公開キイを用いて暗号化されるようにする必要がある。またサーバー側のPGPエグゼクタブルにパスフレーズを送る必要がある。
GNUプライバシイ・ガード
これを読んだ人が「不要な一時ファイルが嫌いなら、何故pgp-2.6.3ia を使うことにしたのか?」と呟くのが聞こえる気がする。良い疑問だ。pgp-2.6.3ia は暗号化と解読中の両方で一時ファイルを使うからだ。
これを避けるか、ある国で有効な法律に合致するためには、代わりにGnuPG-v1.0.6(又はその最新版)を使うとよい。クライアント・プログラムの中で、エクゼクタブルを呼び出すのに用いるパラメータを変える必要がある。そうするとパスフレーズを環境変数に移植することが出来なくなる。
興味ある方のため 'Lite' GPG client program を添付した。これは'out-of-the-box' ActiveState Perl 又は IndigoPerlを用い、余分なモジュールなしでウインドウズ・マシン上で実行される。
パイプへの複写の間、'gpg' エクゼクタブルが、問題にぶち当たるまで(場合によっては後で)データを実際にパイプに出力する。だから、出力をスクラッチファイルに送り、次いで、暗号解読が満足に終わったとき、そのスクラッチファイルをプリンタに送る必要がある。
前回、コンピュータのゴッドファーザCharles Babbageの業績を述べた(2001年11月号)。Babbageは、機械的手段を用いて数学処理を迅速に誤り無く繰り返すことが出来ると考えて実証して、コンピュータ科学の分野での理解に、大きい飛躍をもたらした。簡単な発想だが、意味するところは偉大な着想だった。Babbageは、数学者が使う計算表に忍び込む重大なエラーに苛立った。計算表を作る過程でこれらのエラーを無くするのが計算機械を作る動機だった。Babbageは、時代を先取りした。19世紀の先駆者だった。彼の仕事が再発見されなかったら、20世紀に入って機械を通じる自動計算の考えが生じたとき、彼の業績は忘れ去られただろう。
このような自動、機械式、計算器の提唱者の一人は、ケンブリッジ王立学校の数学者 Alan Turingだ。バベージのほぞ輪頭脳(cog wheel brains) からアラン・ターニングの理論考察機械( theoretical thought machines)に進むのは自然な進行だ。彼の時代に最も重要だった数学問題に答える必要から、ターニングは近代コンピュータ科学及び暗号學の分野になる道を辿りはじめた。第二次世界大戦の潮流を助けた者の一人として、彼は英雄だ。デジタル・コンピュータに付いての元のアイデアの開発者として及びヒルバートの数学の有限問題の解決を助けるに当たって、彼は天才であった。人としての彼の生涯は、色々なことに見舞われて、恵まれなかった。
この記事は、「ターリング機械」の発明を含むアラン・ターリングの生涯に焦点を当てる。次号では、第二次大戦中の暗号学の業績、デジタルコンピュータのアイデア、及びこの英雄の悲劇的な死に至る論争事件を述べる。
際立った精神の兆候
アラン・ターニングは、1912年7月23日に英国で生まれた。父はインドの官僚で、辺境の任地で育てるのを恐れて、家族を英国の友達に預けた。
バベージと同じく、ターニングは、技術の数学の天命に導く私の好きな「個人的不調」の兆候を早くから示した。アランの好奇心は「いたずら」と混同されることが多かった。壊れたオモチャが直らないかと「植えた」のは「証拠隠滅」と誤解された。幼い頃、3週間だけ読み方を習って、数字が読めるようになると、街角毎に番地を読むため立ち止まったと言われている。7才のとき、スコットランドの小学校で、アランは、午後のお茶のため野生の密を集めようと思った。蜜蜂の後をつけて巣を見付け、家族に珍味を供した。
ニール・ステファンソンの小説「The Cryptonomicon,」に似た逸話がある。アランの持っていた自転車のチェーンに問題があったらしい。アランは一定数の回転の後チェーンがギヤから外れるらしいのに気付いた。アランは先ず、チェーンが外れるまでの回転数を数えた。自転車を降りてチェインを調整した。それが面倒なので、結局、回転数を測定し続けて自分でチェインを調整する機構を作り上げた。問題解決のため新しいチェインを買うとの考えは全く起こらなかったらしい。チェーンの問題はターリングの心に独特の問題を与えたと思われる。考えることを彼に強いた。それは面白かったが、チェーンを買うのは面白くも何ともなかった。
教育を受ける
6才のとき、ラテン語を習わせるため、母親が聖ミカエルの学校に入れた。14才までここで才能を磨いた。英国教育組織は、ターリングの感性と衝突もしたが調和もした。調和の面では、規律の遵守と偉人への尊敬の念を養った。この考えは、母親が「巡礼の旅」の一部を飛ばしたとの逸話に現れている。一つの章が神学的に子供には難し過ぎると考え、子供の負担を軽くするため音読中に飛ばした。アランはこれに反対し、物語が傷ついたと感じて、読み方の規則に抵抗した。
英国学校組織との衝突は、一部は、自分が常に正しいとのアランの信念に根ざす。個人的意見は、出来るだけ事実に近づくよう保たれた。彼は「何かを知っていて、それらに付いて考えたり、感じたりしない」人種だった。この型の精神は、伝統の上に築かれ、任務遂行に最良のことを知っていると確信する教育組織の中では外れ者であった。
聖ミカエルの校長は、早くから、アランに「天才」のレッテルを貼った。数年後の易者の予言と一致した。このような予言にも関わらず、アランは英国学校組織の秩序にしたがうことを要求されたので、聖ミカエルを卒業すると、兄の後を追って、ヘイゼルハーストからマルボーロ公立学校に進んだ。公立学校は、「ボールを無視」するため早く走ることを習ったと苦情を言って英国教育の悪い面を示した。
科学との接触
アランはエドウィン・ターネー・ブリュースターの「子供のための自然の驚異」から科学を学んだ。ブリュースターの本は、子供に、自分達が住んでいる世界、共通に持っているもの、他の生物とどう違うかなどを教えた。この発見と数学の発見に、ターニングは生涯魅せられた。科学の発見と法則は、彼の感性に合った。そこには秩序があって、合理的に探求することが出来る。正しい方法を守れば、感性は生命から作られる。ブリュースターの本は、人体が生命維持の義務と煩瑣な仕事を行う複雑な過程を持った複雑な機械であることを説明して、アランの心で機械と生物の概念を結びつけた最初のものだろう。
学校は拷問でもあったが、知識の世界を開いてくれた。彼は、言葉特にフランス語に興味を持ち才能を示して、それを、意志が疎通出来るようにするためのコードとして扱った。また常に、各種のプロセス指向活動に魅力を感じ、化学に身を置いて一時あこがれた。ターリングは余生で化学を趣味とし、地下室と客間を化学実験室に提供した。色々な化学溶液を混ぜ合わせる癖が、最後の死に一部の役割をすることになる。
シェルボーン
13才でシェルボーン寄宿学校に入った。1926年の夏休みに、英国で最初のゼネストが起こった。バスも汽車も止まった。ターニングは、サザンプトンからシェルボーンまで途中一泊しながら60マイルを自転車で走って、新聞種になるほどの話題を提供した。
シェルボーンとアレンは必ずしも合わなかった。シェルボーンは、当時の他の英国学校と同じく、市民と学者の養成に関心があった。アラン入学時の校長は、学校は元々小型社会になるべく作られたとの考えを信奉していた。学生は学校生活のパワープレイを通じて将来の複雑な社会生活を生き抜く知恵を学ぶ。権威と服従は「考えの自由な交換」や「精神の開放」より重要だ。到着後暫くして、元々人見知りだったターニングは引っ込み勝ちになった。
アランは書物と課題作業を慰めとした。1927年に、 tan1/2x (tan-1x = x - x3/3 + x5/5 - x7/7 ...)に関する三角式から「逆正接関数」の無限級数を、基本計算の助けなしに(アランは未だそれに直面していた)見出すことが出来た。これは、少年の才能を制限した者の名簿に彼の数学教師を入れるのに十分な重要業績であった。学校もこの制限に近かった。業績は偉大だったが、科学に興味の無かった校長は、時間を無駄に費やしており教養人でなく科学専門家になる危険があると感じた。科学に対するこの無理解は、学校に珍しいことではなかった。アランの秋の学級主任は、ラテン語に惚れ込んだ古典学者で、科学問題を「低級な知識」と呼び、独逸が第一次世界大戦に負けた唯一の理由を、科学と技術に重点を置き過ぎ、宗教的考えと礼儀に重きを置かなかったためだと考えていた。
こんな低級問題の対するアレンの頑固な固執は、結局少し見逃された。学校の形式主義に少し妥協する限り、思うようにさせて貰った。1928年に、相対性理論に魅せられアインシュタインの「相対論:特殊及び一般理論」の英訳に我を忘れた。16才でアインシュタインの理論を理解した極少数の一人であろう。ターニングは、ガレリイ−ニュートンの法則の正確さに対するアインシュタインの疑いを完全に把握することが出来た。本を読んだだけで(そこには書いてない)アインシュタインの運動法則(粒子の履歴における二つの出来事の間の間隔は、その世界線に沿って測定したとき、最大又は最小になる)を導き出しさえした。1929年にアランは、量子物理学を学びはじめた。これはシュレディンガーなどが「死んだ」科学から転向しはじめた時期だ。シュレディンガーの量子理論から3年しか経たないで、アレンとその友人クリストファー・モルカムは、この新規発見に浸った。アランは、本領を発揮した。
王立学校
ターニングは最初ケンブリッジのトリニティ・カレッジに行く積もりだった。彼に関する限り、これが英国の科学的数学的思想の中心なので、入学したかった。「古典」の勉強を控えたため、最終試験に何度か失敗した後、トリニティへの奨学金を失ったが、第二志望の王立学校に受かった。
王立学校はアランに合っていた。社会的にはやや疎外されていたが、彼の学問と公立学校生活の拷問からの解放で楽になって自分のリズムを取り戻した。王立学校ではまた、彼の学科の性格の点でも合っていた。ターリングの数学教授は、当時最も著名な数学者G.H. Hardyで、オックスフォードからケンブリッジに移ったばかりだった。シェルボーンでは一人か二人だった科学を学ぶ仲間が、ここでは85名に増えた。最近の高校と同じく、カレッジではアランに殻から出て自分のしたいことで世界と付き合う機会を与えた。
1920年代の間に、ケンブリッジは新数学の分野で世界2位になった。学科と学生が量子論と純粋数学の王国の発展に尽くしたので、ジョン・フォン・ノイマンを生んだ独逸のゲッチンゲン大学に次ぐ地位を確立した。
フォン・ノイマンとターリングは生涯に何度も巡り会っている。1932年に、ターリングはノイマンの「量子力学の数学的基礎」(Mathematische Grundlagen der Quantemechanik) を読んで強い影響を受けた。量子論への興味は、シュレディンガーやハイゼンベルグのような権威の業績に学習につながる。新しい分野は若いターリングを捕らえ、彼らの発見が起こした疑問を探求し始めた。ターリングがヒルバートの「数学の三つの疑問」(Three Questions of Mathematics)に会ったのが新たな興味の中心となった。
数学の疑問とターリング機械
1928年に、純粋数学の発展が場の基礎を解明するように思われた。世界は数学の本当の基礎の鍵を開ける尖端にいると思われた。間もなく中心原理に手が掛かり、数学こそが、あらゆる問題の解決を直接、必然的に導くため容易に応用される法則の組であると思われた。数学で手の届く範囲を越える問題は何もない。適切に応用された数学は、世界を幸せにする(インターネットを囲む事情に似ていないかな?)
ヒルバートがヒルバート量子空間の開発で有名のなったのもこの時期、1928年、だった。数学の中心に多くの疑問を起こし、その解答が場を揺るがし、発見と解明の王国に押しやると思われた。ヒルバートの論題は、すべての数学的疑問に答えるための一般算法手順を見出すこと、又は少なくともこのような手順の存在を証明することであった。
1928年には、ヒルバートを含めてこれらの疑問に対する解答を与えることが出来なかったけれども、ヒルバートは、各疑問に対する答はイエスであると確信していた。彼の考えでは、解けないことが証明されるだけであっても、あらゆる問題には答がある筈だ。解けないことの証明は、数学者が袋小路をさまよう無駄な努力するのを救うので、解答には違いない、数学的事項なのだ。
問題は、数学が完全で、無矛盾で、決定可能であることを証明することだった。同じ集団の若い数学者クルト・ゴッデルは、証明も反証も出来ない主張があることを示して、数学は不完全であることを示して、この疑問の線に痛烈な一撃を加えた。「この主張は証明不能である」との主張は、数学的形式で記号化すると、この困った特性を示す。真であるとの証明も偽であるとの証明も否認される。少なくともヒルバートが提起した質問の形では、ゴッデルは算法が不完全であることを証明した。これには、勿論、中傷ではないとのニュアンスがある。ゴッデルはまた、数学は無矛盾且つ完全ではあり得ないことも示した。しかし、算法の決定可能性に関してはヒルバートの疑問への答を揺さぶることは出来なかった。
アランの教授ハーディは、ゴッデルがヒルバートの最後の疑問を倒すことが出来なかったのを喜んだ一人だった。彼の考えでは、すべての数学問題への解答を実行することの出来る機械的処理が、真面目な数学者の仕事を無くし、全部をやってくれる。
学生が教授の指導を、少なくとも一部は、受ける時期だった。心を清めるとアランが見出した一日のランニングの後に、簡単だが、あらゆる種類の問題を取り上げることの出来る機械を思い付いた。強力な機械は、0と1だけを理解する。最初のバイナリコンピュータだった。これは、これら数値の無限テープを読取/書込する機構を動かし、その特別の配置に基づいて、各種の型の問題を解く。アランの解決策は、専門用語でグローバル・アルゴリズムと彼が定義したものだった。構築したときターニングマシンと呼ばれたマシンは、アルゴリズムの将来を体系化する実験であると考えられた。この機械が鼓舞した素晴らしい考えの探求中に、ターニングは、アルゴリズムの簡単で一般的な性質に関わらず、解けない問題が有ることに気付いた。この発見は、ヒルバートの主張が正しくないことを証明した。ヒルバートの最終疑問、決定問題(Entscheidungsproblem)は、「否、数学は決定可能でない」であった。
ケンブリッジ王立学校の若い数学者は、23才で当時の偉大な数学者の一人に打ち勝った。業績に対する喝采を博し「天才」の言葉がまた浴びせられた。これを行っただけで、彼は歴史書に残り、高等数学生はある点で彼を尊敬しただろう。多かれ少なかれ歴史に残った筈だが、人の歴史のコースを変えたのは次ぎに彼がなしたことだった
次号では、ターニングマシンの仕事を探求し、戦時中のアランを追いかける。一人の人間の才能が如何に戦の潮流を変えるかを見て、英雄の信じられない恥辱と究極的な死に、頭を傾げる。乞うご期待。
緒言
システムが弱体であると、ハッカー、クラッカー、トロージャン、ウォームなどに、裏口コード又は敵対的なコードでシステムファイルを置き換えたたり、新しいものを搭載したりするチャンスを与える。ログインプログラムが置き換えられると、マジックパスワードを使って誰かがルートに入って来たり、sshクライアントに忍び込んで、使ったときサーバー、ユーザー及びパスワード情報を誰かにe-メールする。
ファイル完全性チェッカーは、チェックサム又はハッシュ、及びデータベースにあるファイルのサイズ、オーナー、パーミッションなどファイルの各種アトリビュートを保って、後に定期的にこの情報の変化をチェックする助けになる。だから、ログインバイナリが置き換えられたり、/tmp/.hidden/backdoordが搭載されると、警報が出る。
この記事では、ホストベース型の侵入検出システム(IDS)、つまり完全性チェッカー、AIDEの搭載方法を説明する。AIDEウエブサイトから引用する。
「AIDE (Advanced Intrusion Detection Environment)はTripwireの無料代替品である。半無料Tripwireと同じことと、それ以上のこととをおこなう」
全体システムの搭載はフロッピイディスク上でおこなう。少し神経質に、各種ファイル及びディレクトリの変化をチェックする。時間が掛かり、偽の警報が出ることもあるが、物事は簡単になり、安全な筈だ。自分のコンフィギュレーションを設定すると、私の例を用いてスタートすることが出来るので、その後一、二週間使用して見れば、変更すべき箇所が解る筈だ。毎回ディスクを取り付けると、チェックの準備が出来る。多くのステップが必要だが、アタッカが入っても、(A)データベースを変えることは出来ないし、(B)システムが定期的にAIDEでチェックされているのさえ気付かれない。
インストレーション
先ず、フロッピイディスクにファイルシステムを作る(私のはDOSの下:ドライブA:、/dev/fd0の上、DOSの下でB:を使っていれば、ここで /dev/fd1 を使う)
root@pc2:~# root@pc2:~# mkfs /dev/fd0 mke2fs 1.22, 22-Jun-2001 for EXT2 FS 0.5b, 95/08/09 Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 184 inodes, 1440 blocks 72 blocks (5.00%) reserved for the super user First data block=1 1 block group 8192 blocks per group, 8192 fragments per group 184 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 37 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. root@pc2:~#
root@pc2:~# root@pc2:~# mount /dev/fd0 /mnt/floppy root@pc2:~# root@pc2:~# mkdir /mnt/floppy/aide root@pc2:~#
これで、AIDEのソースを入手し、これらを一時ディレクトリにコンパイルし、システムをフロッピイディスクに搭載し(コンフィギュアを走らせるとき--prefixオプションに注意)、インストールをおこなう前にaideバイナリをストリップし、最後に一時ディレクトリを削除する。
root@pc2:~#
root@pc2:~# mkdir /tmp/aide
root@pc2:~#
root@pc2:~# cd /tmp/aide
root@pc2:/tmp/aide#
root@pc2:/tmp/aide# wget http://www.cs.tut.fi/~rammer/aide-0.7.tar.gz
--12:54:47-- http://www.cs.tut.fi/%7Erammer/aide-0.7.tar.gz
=> `aide-0.7.tar.gz'
Connecting to www.cs.tut.fi:80... connected!
HTTP request sent, awaiting response... 200 OK
Length: 219,837 [application/x-tar]
0K .......... .......... .......... .......... .......... 23% @ 34.84 KB/s
50K .......... .......... .......... .......... .......... 46% @ 50.97 KB/s
100K .......... .......... .......... .......... .......... 69% @ 65.45 KB/s
150K .......... .......... .......... .......... .......... 93% @ 46.38 KB/s
200K .......... .... 100% @ 7.17 MB/s
12:54:52 (50.40 KB/s) - `aide-0.7.tar.gz' saved [219837/219837]
root@pc2:/tmp/aide#
root@pc2:/tmp/aide# tar xvfz aide-0.7.tar.gz
aide-0.7/
aide-0.7/Makefile.in
[...]
aide-0.7/include/compare_db.h
aide-0.7/include/gnu_regex.h
root@pc2:/tmp/aide#
root@pc2:/tmp/aide# cd aide-0.7
root@pc2:/tmp/aide/aide-0.7#
root@pc2:/tmp/aide/aide-0.7# ./configure --prefix=/mnt/floppy/aide
creating cache ./config.cache
checking for a BSD compatible install... /usr/bin/ginstall -c
[...]
creating aide.spec
creating config.h
root@pc2:/tmp/aide/aide-0.7#
root@pc2:/tmp/aide/aide-0.7# make
make all-recursive
make[1]: Entering directory `/tmp/aide/aide-0.7'
[...]
make[2]: Leaving directory `/tmp/aide/aide-0.7'
make[1]: Leaving directory `/tmp/aide/aide-0.7'
root@pc2:/tmp/aide/aide-0.7#
root@pc2:/tmp/aide/aide-0.7# strip src/aide
root@pc2:/tmp/aide/aide-0.7#
root@pc2:/tmp/aide/aide-0.7# make install
\Making install in src
make[1]: Entering directory `/tmp/aide/aide-0.7/src'
[...]
make[2]: Leaving directory `/tmp/aide/aide-0.7'
make[1]: Leaving directory `/tmp/aide/aide-0.7'
root@pc2:/tmp/aide/aide-0.7#
root@pc2:/tmp/aide/aide-0.7# cd ..
root@pc2:/tmp/aide# cd ..
root@pc2:/tmp# rm -r aide
root@pc2:/tmp#
最後に、極めて簡単なコンフィギュレーションファイルを作る。これはパーミッション、inode番号、リンク数、ユーザーオーナー、グループオーナー、サイズ、更新時刻、作製時刻及びmd5チェックサムを各種ディレクトリファイル(及びその下の全ファイルを含む)においてチェックし、データベースを作成する。
root@pc2:/tmp# root@pc2:/tmp# cd /mnt/floppy/aide/bin/ root@pc2:/mnt/floppy/aide/bin# root@pc2:/mnt/floppy/aide/bin# cat aide.conf database=file:/mnt/floppy/aide/bin/aide.db database_out=file:/mnt/floppy/aide/bin/aide.db.new /vmlinuz R /boot R /etc R /bin R /usr/bin R /usr/local/bin R /sbin R /usr/sbin R /usr/local/sbin R =/var/log R /tmp R /var/tmp R root@pc2:/mnt/floppy/aide/bin# root@pc2:/mnt/floppy/aide/bin# ./aide --config=./aide.conf --init root@pc2:/mnt/floppy/aide/bin# root@pc2:/mnt/floppy/aide/bin# mv aide.db.new aide.db root@pc2:/mnt/floppy/aide/bin#
定期的使用(チェックと更新)
ここまでで、作成したデータベースのあるフロッピイディスクが出来たので、これを定期的に使って、監視するファイルの変更を点検することが出来る。/tmp ディレクトリの中にファイルを作って、AIDEが告げる方法の例を示す。
root@pc2:/# root@pc2:/# cat > /tmp/.hidden hidden root@pc2:/# root@pc2:/# mount /dev/fd0 /mnt/floppy/ root@pc2:/# cd /mnt/floppy/aide/bin/ root@pc2:/mnt/floppy/aide/bin# ./aide --config=./aide.conf --check AIDE found differences between database and filesystem!! Start timestamp: 2002-01-21 15:22:56 Summary: Total number of files=1443,added files=1,removed files=0,changed files=1 Added files: added:/tmp/.hidden Changed files: changed:/tmp Detailed information about changes: File: /tmp Mtime: old = 2002-01-21 13:36:25, new = 2002-01-21 15:22:03 Ctime: old = 2002-01-21 13:36:25, new = 2002-01-21 15:22:03 root@pc2:/mnt/floppy/aide/bin#
root@pc2:/mnt/floppy/aide/bin# root@pc2:/mnt/floppy/aide/bin# ./aide --config=./aide.conf --update AIDE found differences between database and filesystem!! Start timestamp: 2002-01-21 15:28:58 Summary: Total number of files=1443,added files=1,removed files=0,changed files=1 Added files: added:/tmp/.hidden Changed files: changed:/tmp Detailed information about changes: File: /tmp Mtime: old = 2002-01-21 13:36:25, new = 2002-01-21 15:22:03 Ctime: old = 2002-01-21 13:36:25, new = 2002-01-21 15:22:03 root@pc2:/mnt/floppy/aide/bin# root@pc2:/mnt/floppy/aide/bin# mv aide.db.new aide.db root@pc2:/mnt/floppy/aide/bin# root@pc2:/mnt/floppy/aide/bin# ./aide --config=./aide.conf --check root@pc2:/mnt/floppy/aide/bin#
最後に...まとめ、ファイル、リンク、など
AIDE内容全部をフロッピイディスクに収容、使用後それを取り出し、自分の必要に合うように例を変更し、AIDEを使っていることをアタッカが知る情報をシステムに残さないのを忘れないこと。AIDEのマニュアルとmanual.html を読むことをお薦めする。これは極めて融通性のあるプログラムである。最後に、AIDEマニュアルの「セキュリティに関する一般指針」を引用する:
「何も仮定したり推定しないこと
誰も何も信じるな
安全なものはない
セキュリテイは使い易さと交換だ
妄想症は君の友達だ」.
aide.conf コンフィギュレーションファイルの例:misc/maiorano/aide.conf.txt
AIDEプロジェクトのホーム:http://www.cs.tut.fi/~rammer/aide.html
AIDE tarballのダウンロード: http://www.cs.tut.fi/~rammer/aide-0.7.tar.gz
Tripwire、有名なAIDE代替品のホーム: http://www.tripwire.org/
追加して読む論文と記事:
securityfocus.com にある「もうハックされているかも知れない」(You may already be hacked)との題名の面白い記事: http://www.securityfocus.com/columnists/12
linuxsecurity.comにある「Tripwireを使って開始」(Getting Started with Tripwire)(オープンソースLinux版)との題名の記事:http://www.linuxsecurity.com/feature_stories/feature_story-81.html
ISSからの「ネットワーク対ホストベースの侵入検出−侵入検出技術への案内」(Network- vs. Host-based Intrusion Detection - A Guide to Intrusion Detection Technology)も面白い読み物だ http://secinf.net/info/ids/nvh_ids/
NetworkWorldFusionからの「ネットワーク侵入者に水を掛けろ」(Getting the drop on network intruders)は商業的観点: http://www.nwfusion.com/reviews/1004trends.html
時には、事業の観点から、隠れた価値を有する製品を創作することが出来るよう、財産を作ることの出来るソフトウエアを手に入れたいことがある。価値あるソフトウエアのソースをクローズして、その変更が価値を持つと、ソフトウエアを自分で作ることが出来ない人、又は作るのが難しくて時間の掛かる人に代金を請求することが出来る。このような場合にはBSD型のライセンスに注目する。
別の筋書きで、ソフトウエア製品よりもサービスが気になるときは、GPLライセンスを恐れることはない。例えば、IBMはLinuxを各種のサーバーに使用している。GPL化ソフトウエアの上にビジネスモデルを開発したとき、心配することは何もない。加えて、走り書きから開発したソフトウエア又はBSD型ライセンスで使用するものは、GPLソフトウエアの上でクローズドソースに保つことが出来る。事業に脅威を与えないでGPLソフトウエアを使う方法は沢山ある。カスタマは、物事の過程を気にすることなく、したいことをすればよい。良い例は、殆どの普及型デスクトップOSで作られる低級ソフトウエアだ。こんなソフトウエアを使うカスタマの99%は、詰め込まれたガラクタを知らず、気にもしない。OSの「最も安定で信頼性のある版」の手直しを喜ぶ人を見ると、論理が逆向きになっている。はじめから安定でなく信頼性もなかったのではないか?もし現行版が最も安定で信頼性のあるもので、尚故障したり沢山のバグを持っているなら、元の版はゴミだったのか?と言うことになる。私は、人々に、ガラクタより安定で信頼性のあるものは、未だ一寸だけ安定で信頼性のあるガラクタに過ぎないと強調しようとしている。これには余り意味がない。仕事では、売るのは製品の品質ではなくて、使う人の最低要求を満たすか−−又はそうでないことを知りながら、広告とお金を使って自分のソフトウエアが最良であると、独占したり人々や委員会を洗脳したりすることが出来ると、大量市場で安く売ることが出来る。最低限、ビジネスの理由でGPLライセンスに脅かされているなら、多分自分のビジネスモデルを熱心に考えたことがないからだろう。米国で最も普及しているLinux OSは世界の最良ではなく、優秀なLinux OSが持っている筈の特徴の多くを欠いているが、それでも普及しているのは、マーケットシェアを有しバージョン毎に改良して、カスためがどれほど良いソフトウエアか知らなくても満足させているからだ。
BSD型 ライセンスとは何か?
無料BSD著作権情報FreeBSD Copyright Information には各種のライセンスがある。一般的に、自分の働いているプロジェクトから来るのを認める限り、ソフトウエアを使ってしたいことをする自由がある。ある点では、もっと自由度を有するが、変更を加えたときは、修正したソフトウエアを受け取る人の自由度を「制限」することが出来る。
BSD型ライセンスには「通り抜け」の自由はない。受取人の「自由」は促進しない。これは他の人が開発したソフトウエアを取り上げ、少し変更を加えて、製品を販売し、又は他の人が自分のしたことを理解しないようにしたい人には有利である。
プログラマでない人が、ソフトウエアがおこなうことのみは理解するが、働き方は知らないとき、ソフトウエアを作る仕事は何も知らなくとも、営業能力があればその人にそのソフトウエアを売ることが出来る。最も普及したデスクトップ用OSを取り上げると、プログラム技術は何もないが、ソフトウエアに関するゴミの販売能力に優れている会社を思い浮かべる。加えた変更を明らかにすることなく他の開発者(何をしたか知っている)からのソフトウエアを含む能力を持つことは、有用又は無用のプログラムをする力が無くとも販売能力さえあれば非常に有力になる。ビジネスの観点から、金儲けが目的の人は(多くのビジネスと同様)、BSD型ライセンスに属するソフトウエアを使うことが出来るなら、そうするとよい。自分のOSをうまく管理して、販売可能な製品のコピイを防止することが出来る。デスクトップ用OS二つが、これをおこなっている。
事実、BSDプログラマは良い仕事をしているので、BSDプログラマのソフトウエアがゴミだとは言わない。私の懸念は、ソースコードに関する限り、何時でも変更出来るのでゴミではないが、クローズドソースになるや否や、実際の働きが解らないのでゴミになる。BSD型ライセンスのソフトウエアからのオープンソース内容は素晴らしい。
君にはどちらが良いか?
一つ以上のライセンスの下で君のソフトウエアを提供されたい。例えば、PerlはGPLと Artisticライセンスの下でライセンスされる。君のソフトウエアが他の無料ソフトウエアと共に使われることと望むなら、GPLだけでないライセンスをしなければならない。GPLは他の無料ソフトウエアとは一緒にはうまく働かない。
無料ソフト社会の一つの批判は、GPLが適用される限り、彼らは自由の語を「盗んでいる」である。質問:独裁者には独裁者になる自由があるか?イエス。自由は「社会」に何の意味も持たない。自由とは、何時でも何でもどのようにもしたいことが出来るとの意味だ。自由でない自由もある。うんざりするのは、政治的観点からそれをする理由は解っているのに、FSFとGPLが自分の好みのままに自由を定義し直す振りをしているが、自由全体ではなく、自由のほんの一部だけを見ていることだ。彼らの興味はオープンソース・ソフトウエアを共有人々と社会で、個人がソフトウエアに−GPLソフトウエアのクローズドソース版を作るなど−したいことをする自由ではない。したがって、GPLは真の意味で自由の語を使っているのでなく、社会がソフトウエアを使うための自由を言っているに過ぎない。私は自由の彼らの再定義が好きでないし、「無料」と「自由」の彼らの使い方を理解するのでない限りその語を使うのも好まない。然し、人々に自由について考えさせるので、政治的観点からは良いことだと思う。
ここで、BSDについては、これも良くない。これはクローズドソース・ソフトウエアを作るのを好むプログラマに意味がある。だから魅力があると理解する。ある人には重要であることを理解するが、BSDについて哲学的観点からは解らない重要な点を指摘する。
人が、BSDライセンスの下でソフトウエアを開発すると、他の人はライセンスの下で作られた仕事全部を取り、クローズドソース版を作っても、加えた変更を明らかにする必要はない。だから、開発者の全グループが何年も掛けて良いソフトウエアを作った場合、一人の人又は会社が、少し違うクローズドソース版を作ってソフトウエアを「盗み」、それを標準として宣伝して、本当のプログラマがそれから利益を得る機会を失わせることが出来る。他人を百万長者にするため一生懸命働く理由が解らない。GPLはこれを防ぐ。ソフトウエアを使う人の機会を均等にする。万人が公平な分け前を持つ。
BSDライセンスが明らかに危険なのは、ウイルスが世界中にばらまかれるのを促進する場合である(一流だが、2-ビットのプログラミング会社の不愉快なOS)。この災害については、with Kerberosを見られたい。恐るべきことだ。私自身については、汚らわしい会社がソフトウエアを汚して、残りの社会に協力させる法的手段が無かったとき、そのソフトウエアのすべての版をボイコットした。互換性のない他のバージョンがあらゆる場所に飛び回る心配に我慢ならなかった。Kereberosは破滅し、二度と使うことはなかった。何故破滅したか?汚れたバージョンが世界に与えた影響が大き過ぎた。将来のバージョンが完全にクローズドソースで、今のバージョンとの互換性を損なうことを知りながら同じソフトウエアを使う気にはなれない。政策に気を払わない他のビジネスと互換性があることの脅威は、私がこのソフトウエアを使うには大き過ぎた。
GPLとBSDについて私の持つ便益と苦情の全部から、使うのにはどちらが良いだろうか?いずれもだめか、両方か。ライセンスの作用を理解して、結果を気にしないなら、OKだ。私の使用には、BSDからライセンスが嫌いだが、他の人が君のソフトウエアを取って、売れるクローズドソース版を作るのを気にしないなら、BSD型ライセンスが良いだろう。
私にはどちらが良いか?
長い評論を書いて反響に備えたが、殆ど読者は要約だけを評価するだろう: GPL ライセンスはソフトウエア自由化の伝導者 BSD ライセンスは人々の自由化の伝導者だ GPL ライセンスにより、ソフトウエアはその作者のプログラマより多くの自由度を保つ BSD ライセンスにより、プログラマは誘導コードを用いて得られるより多くの自由度を保つ
まとめとして、一つのライセンスが他より良いと言う人は、自分だけでなく人のためにも判断することが出来ることを理解しない、狭量な洞穴の巨人だ。こんな人は、そのDNAが広まって、生活の他の問題に付き人のために判断するのを好む政治家、将軍、裁判官を作らないよう、去勢する必要があることを強調したい。私は、ソフトウエア・ライセンスに付き他人のために判断する人を完全に軽蔑し、自分のため人々に判断させる人を少し軽蔑する。私はライセンスが社会に与える影響には興味がない、だが一方が他より良いとは主張しない。一定の価値に基づく選択肢であって、事実ではないからだ。君の考えるものが君に取って最良のライセンスであることを認めるが、君が考えることに付いての君の意見が他の人にも最良とは思わない−それは意見で理論だ。
GPLを憎むBSD人は10倍いると思われる。Linuxが10倍普及しているからだと思うが、確信はない。無料BSDがLinuxより10倍普及していたら、GPLでうめく人がBSD人の10倍いたと思う。個人的には、日常ベースのBSDソフトウエアを良く知らないし、また、自分の意見を大声で言う理由もない。他のライセンスについて宣伝活動をする人は、二つの理由で好まない。
結構だ。.
ドリル Tony Pepin
昔、未だ20メガバイト・ハードディスクが、容量でもサイズでも巨大だった頃のことだ。友人が20メガドライブを、5台のPCで共有して、小さい製造会社の経理部で働かせていた。経営者は友人の働きにも、コンピュータ化経理処理にも満足していた。
ある日、月末処理中にCorvusのモーターが焼け切れた。給料と未収金をその日のうちに処理しなければならないが、バックアップデータファイルは無かった。Corvusが故障したことは無かったので、面倒がってバックアップを取らなかったのだ。
何も失わないように、ケースを開けて焼け切れたモーターを取り出した。変速モーターのついたドリルを取り出して、直接ハードディスクに噛み合わせた。
データの1セクタを読み取るプログラムを急いで書いて、うまく読み取ったらメッセージが出るようにした。友人はドリルの引き金を引きながら、うまく読み取るまでこのプログラムを走らせた。
正しい速度になったとき、ブラックテープを使って、動かないように止めた。
ドリルとハードディスクとして使って、月末処理は終わった。友人は数週間ドリルで駆動した。その後、データのバックアップに気を付けたのは言うまでもない。
これは作成中のコンピュータに私がしたことだ。
前には、新しいハードウエアを買う金とと、幾つかの部品を持っていた。一つは電源付きの古いXTケースだ。マザーボードとDX4-100チップを買う金はあったが、ケースと電源は当時高かったので、手持ちのXTケースを使うことにした。XTマザーボードは取り付け穴が標準ではなくマザーボードと揃わないので、頭を使って、静電防止バッグの上に取り付けた。「静電防止だから安全」と考えた。走らせたら、ブートはするがキイボードコントローラが不具合だった。買った場所に返しにいって、静電防止バッグが実際は電気を通じてボードを焼いてしまったと説明した。幸い半額を返してくれた。今度は別の方法でボードとケースをくるんだ。ボードをケースの穴以外に取り付けるときは、絶対に絶縁物である木などに取り付けるべきだと、学んだ。
無題 Kirk
Palm IIIの間抜けな使い方をした話だ。
中古 Sparc Classic を買ったらハードドライブ、RAM、キイボード、マウスが付いていた。モニタは無かった。サーバーにする計画だったので、モニターがないのは、何をしているか見ないと私がLinuxをインストール出来ない点を除いて、問題でなかった。
Palm III が助けになる!オスの足に接続されたPalnpilotの底に挿してあるシリアルケーブルを、DB25 <-> DB9 ケーブルに接続してSparcのシリアルポートに挿した。実際にはSparcのシリアルポートは /dev/ttyS0 と/dev/ttyS1 の両方に配線されているが、第一シリアルポートはPCと同じ配線なので、うまく働いた。最後にキイボードを抜いた。
これでハードウエア側は済んだ。Palmpilot 用にフリーウエア vt100 をダウンロードして、正しいボーレート、ストップビットなどにコンフィギュアした。Sparcのスイッチを入れたとき、キイボードを探そうとして失敗した。次いでシリアルポート上のvt100ターミナルを見付け、Pilotをコンソールとして使用した。この小さい画面を使って RedHat 6.2 をSparcにインストールした。
インストールの後、PCから再ブートしてテレネットした、全部完璧に働いた。
試験済みで真正のソフトウエアを用いて単一ボックスを走らせているとき、ソフトウエアのバージョンを追跡するのに頭は要らない。つまり、必要なパケージを見出すか構築出来れば、Red Hatだろう Debianだろうと、Sun だろうと何でも使える(そう、ここではLinux以外の問題を扱う)。だが、待ってくれ。同じマシンを何年も使っていて、最新のEmacにしたいだけならどうか?自分のソフトウエアを開発していて、バージョンを区切る毎にRPMやDebian dpkgを作りたくなかったらどうか?14年も前に遠い国で不安定な政府が欠いたソフトウエアを信用しないときはどうか?短く言うと、Obi-Wan Kenobeの助言に気を付けていて、そのソースを使っていたらどうか?将来置き換えたいこれらのコンフィギュレーションファイル、バイナリ、ライブラリなどを取り去るのを、どのような方法で容易にするか?
さて、一寸考えると、Unixにはその為の材料がシンボリックリンクつまりsymlinkの形で備わっている。 Symlinks は、実行が必ずしもインターフェイスに直接つながらないようにソフトウエアをコンフィギュアするので、強力なツールである。少しズボラな定義を使った、これは、例えばpostfix mimics sendmailのとき、実際におこなわれるのだ。実行、つまりpostfixは、sendmailと同じインターフェイスを示し、これがUnixメール転送エージェント (MTA)に対する事実上のインターフェイスとなる。
symlinksの場合、/opt/bin/catにリンクされたプログラム /opt/bin/new_cat を持つ筈だ。だから、リンクを見るとどのバージョンが走っているか分かるが、同じ慣れたプログラムだと思われる。このようにして、さらに良い実行(アルゴリズムなど)が開発されたとき実際に走っているプログラムを変更することが出来る。そう、スクリプト内で使うような環境変数によりこれが出来るが、事実を追ってプログラムを指す変数すべてを変更しようとする。これはそう簡単ではない。Symlinks がその答えになる。例えばSymlinks は、一般的にソースからlndirユティリティを経由して motif を構築するのを容易にするため用いられる。勿論中身のこのシムリンクは即座におこなわれるので誤用してはならないが、考え方は分かる筈だ。GNUプロジェクトにいる人達のしたことは、ユーザーに与えたいインターフェイスをするため使うコードをシムリンクする全過程を自動化する小さなPerlスクリプトを書くことだった。ハードリンクとは微妙に違うことに注意されたい。オリジナルファイルとリンク(inodeを共有するので実際は第二の名称で、同じもの)との間に差別がないからだ。ハードリンクの使用は最低限にすべきだと思う。検出して保持すべきファイル名の追跡を失い易くなるからだ。
Stowの紹介
先ず、stow は完全パケージ管理データベースの代替ではなく、小さいPerlスクリプトから複合パケージ管理システムの多くの利便を得られるようにするだけだ、と言うことを強調したい。副産物として、ソースをSlackware、RPM又はDebianデータベースに入れることの出来るcheckinstall と呼ばれるパケージがある。例として、stowをインストールするステップ全部を述べ、次いでnailと呼ばれるメール (MUA)代替物をインストールするステップに進む。これは、前の版と予期しない衝突をすることのある多数のファイルを含むので、良い例である。またnailは、同じ基本機能を提供する一方で、バイナリアタッチメントをコマンド行でおくることが出来るので、標準Berkeleyメイルの強化になる。
Stow は、インストールが簡単なので、詳しい論議は不要だ。Perl 5.005(このバージョンはSolaris 8 AFAIK上にある)以降があれば働く。ウエブサイト又は地方ミラー mirrorにあるGNUからソースをダウンロードする。 tar xzf のあるディレクトリにソースを抽出して例の ./configure , make 及び make installの順を繰り返す。見掛けによらず、何もコンパイルされないが、マニュアルのような少数のものは構築される。make installステップで、stow が /usr/local/bin ディレクトリに入る。これは規定値の位置なので、簡単のためこの設定を選ぶ。理由はこの記事の最後に明らかになる筈だ。インストールしたstowエグゼクタブルの位置は、下のサンプル出力の最終行に示す。type コマンドを使ったが、 which 又は多分 whereisを使ってもよい。
| [zippy@mybox zippy]$ cd src/ [zippy@mybox src]$ gunzip -c ../stow-1.3.3.tar.gz | tar xf - [zippy@mybox src]$ ll total 8 drwxrwxr-x 2 zippy zippy 4096 Jan 6 06:19 stow-1.3.3 [zippy@mybox stow-1.3.3]$ ./configure creating cache ./config.cache checking for a BSD compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for mawk... no checking for gawk... gawk checking whether make sets ${MAKE}... yes checking for a BSD compatible install... /usr/bin/install -c checking for perl... /usr/bin/perl updating cache ./config.cache creating ./config.status creating Makefile creating stow [zippy@mybox stow-1.3.3]$ make make: Nothing to be done for `all'. [zippy@mybox stow-1.3.3]$ sudo make install make[1]: Entering directory `/home/zippy/src/stow-1.3.3' /bin/sh ./mkinstalldirs /usr/local/bin /usr/bin/install -c stow /usr/local/bin/stow /bin/sh ./mkinstalldirs /usr/local/info /usr/bin/install -c -m 644 ./stow.info /usr/local/info/stow.info /bin/sh ./mkinstalldirs /usr/local/man/man8 /usr/bin/install -c -m 644 ./stow.8 /usr/local/man/man8/stow.8 make[1]: Leaving directory `/home/zippy/src/stow-1.3.3' [zippy@mybox stow-1.3.3]$ type stow stow is /usr/local/bin/stow |
この時点で stowが /usr/local/binの下にインストールされる。このディレクトリを $PATHに含むのを確認すること。.
Hood の下で
stow を説明するには、先ずconfigure スクリプトを理解しなければならない。これら二つのスクリプトは一緒に働くからだ。configure がソフトウエア成分を構築し、それらをマシンにインストールする。configure スクリプトは大変便利だ。システムを嗅ぎ回って必要な各種ソフトウエアをチェックする。これらテストの結果が Makefiles のセットを設計するのに使われ、これがシステムコンフィギュレーションに合うようにソフトウエアを構築してインストールする。コンフィギュアには沢山のオプションがあり、事実、このスクリプトの代替版もあるが、我々の目的に最も関係があるのは--prefix アーギュメントである。第二アーギュメントに注目されたい、--exec-prefix により実際のインストレーション過程の微細調整が出来るが、このオプションに付いては詳しく述べない。
ここで configureがコードを構築するスクリプトを構築することと、インストールされたコードの位置がconfigureの --prefix コマンド--行アーギュメントを通じて規定されることが分かった。ソースコード全部をインストールする単一のスポットを取り上げると、stow はインストールされたコードに対するsymlinksを、ソースツリーが明らかになって置換及び削除が出来る方法で、作成するのを自動化する。例えば、configure スクリプトを、./configure --prefix=/opt/stow/foo-1.2.1 として呼び出すと、パケージを/opt/stow/foo-1.2.1の下にインストールする。
未だ混乱している。このprefixとexec-prefixの中身は何だ?
ここは飛ばして、この記事の残りを読んだ後で戻っても構わない。プログラムの実際のインストール場所が見掛けの位置とは別であるとの観念を受け入れると、この理想的筋書きに合わないパズルの部分を考えることが出来る。すべてが、シムリンクされて($PATH又は$MANPATHに見付かる)見掛けの位置から隔離されたディレクトリのツリーにインストールされた多数のマシンに渡って、ソフトウエアをインストールする場合を考えて見よう。目的により、これはしたいことではないかも知れない。アプリケーションが複数のアーキテクチャ用に構築された状況を考えよう、例えば、ソースコードがSolaris及びlinuxシステムのため次のように構築することが出来る(ソースツリーは同様にクロスマウントされているが、ディレクトリは別に構築されている)。
sun$ cd sunsparc sun$ ../foolib-1.1/configure --prefix=/usr/local \ > --exec-prefix=/usr/local/sunsparc sun$ make sun$ make install
sun$ ssh pengie
pengie$ cd linux
pengie$ ../foolib-1.1/configure --prefix=/usr/local \
> --exec-prefix=/usr/local/linux
pengie$ make
pengie$ make install
最終行は、開発者がどのファイルをアーキテクチャ依存で、どれがそうでないかを決めなければならないもので、君は同意しないだろう。明らかにドキュメンテーション、及び多分コンフィギュレーションファイルは、アーキテクチャ無関係の筈と考える。それでも、stowを使うと、ファイルを"unstowing" してシムリンクを外す自由がある。これは更新により旧ソースが上書きされないで、リンクを破るだけなので、人手でコンフィギュレーションファイルをコピイし直すことができる。パケージを"restow" しもう一度試すだけで、正しい更新が出来る。個人的には、特別に扱いたい少数のコンフィギュレーションファイルを人手でリンクして更新の後壊れたリンクを直すのが好きなので、余り--exec-prefix を使わない。私の考える限り、私が出会った簡単な状況には良い方法だと考える。
stowを用いてソフトウエアをインストール
数年前、stow の使用をはじめたとき、既にそれなしでシステム(HP-UXサーバー)の設定を初めていたので、少し不満だった。infoファイルとマニュアルがしばしば衝突し、皮肉にもこれはemacで多かった。当然だが、簡単なパケージについての進行は容易だった。MUAソフトウエアnailは、エグゼクタブル、ドキュメンテーション及びconfig files から成っているので( /etc BTWにリンクしたいだろうが)入手と同じく簡単だ。
| [zippy@mybox src]$ gunzip -c ../nail-9.29.tar.gz | tar xf - [zippy@mybox src]$ cd nail-9.29/ [zippy@mybox nail-9.29]$ ./configure --prefix=/opt/stow/nail-9.29 creating cache ./config.cache checking for a BSD compatible install... /usr/bin/install -c checking for iswprint... yes ... ..... lots of stuff ... updating cache ./config.cache creating ./config.status creating Makefile creating config.h [zippy@mybox nail-9.29]$ |
ここでしていることは、configure にファイルを/opt/stow/nail-9.29の下に置くが(stowに関する限り暗示的に)インストールしたパケージがランタイムファイル用に /opt の下に現れるよう命令することだ。(好奇心があったら、作られた Makefile を見てprefix 変数が--prefix オプションを通じて設定されていることを見ることが出来る)
| [zippy@mybox nail-9.29]$ [zippy@mybox nail-9.29]$ make gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c version.c gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c aux.c ... more stuff ... gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c tty.c gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c vars.c gcc -g -O2 -o nail version.o aux.o base64.o cmd1.o cmd2.o \ cmd3.o cmdtab.o collect.o dotlock.o edit.o fio.o getname.o \ head.o v7.local.o lex.o list.o main.o mime.o names.o popen.o \ quit.o send.o sendout.o smtp.o strings.o temp.o tty.o vars.o [zippy@mybox nail-9.29]$ |
これですべてをコンファイルしたので、ソフトウエアをインストールすることが出来る。
| [zippy@mybox nail-9.29]$ sudo make install make[1]: Entering directory `/home/zippy/src/nail-9.29' /bin/sh ./mkinstalldirs /opt/stow/nail-9.29/bin mkdir /opt/stow mkdir /opt/stow/nail-9.29 mkdir /opt/stow/nail-9.29/bin /usr/bin/install -c nail /opt/stow/nail-9.29/bin/nail /bin/sh ./mkinstalldirs /opt/stow/nail-9.29/man/man1 mkdir /opt/stow/nail-9.29/man mkdir /opt/stow/nail-9.29/man/man1 /usr/bin/install -c -m 644 ./nail.1 /opt/stow/nail-9.29/man/man1/nail.1 test -f /etc/nail.rc || \ { /bin/sh ./mkinstalldirs /etc; \ /usr/bin/install -c -m 644 ./nail.rc /etc/nail.rc; } make[1]: Leaving directory `/home/zippy/src/nail-9.29' [zippy@mybox nail-9.29]$ |
前のリストから、望み通りファイルが /opt/stow/nail-9.29 の下に押し込められたのは明らかだ。Stowは次いで、パケージの全部のサブディレクトリが、r --prefix (又は、Makefileを見るなら ${prefix})の下の対応するロケーションにシムリンクされ /opt/stow/nail-9.29/bin が /opt/binになるようになっていると仮定する。同様に、/opt/stow/nail-9.29/man/man1 は /opt/man/man1 となる。この習慣は、使用したファイルがインストール位置から隔離されるのを極めて容易にする。残った唯一のステップは、stowを走らせて実際にシムリンクを作ることである。
| [zippy@mybox nail-9.29]$ cd /opt/stow/ [zippy@mybox stow]$ sudo stow -vv nail-9.29/ Stowing package nail-9.29... Stowing contents of nail-9.29 Stowing directory nail-9.29/bin LINK /opt/bin to stow/nail-9.29/bin Stowing directory nail-9.29/man LINK /opt/man to stow/nail-9.29/man [zippy@mybox stow]$ ls -ltr /opt/ [zippy@mybox stow]$ ls -ltr /opt total 4 drwxr-xr-x 3 root root 4096 Jan 9 16:33 stow lrwxrwxrwx 1 root root 18 Jan 9 16:33 man -> stow/nail-9.29/man lrwxrwxrwx 1 root root 18 Jan 9 16:33 bin -> stow/nail-9.29/bin stow/nail-9.29/bin [zippy@mybox stow]$ PATH=/opt/bin:$PATH type nail nail is /opt/bin/nail |
説明が必要だろう。stowディレクトリ(${prefix}/stow by default)をCDに入れ、単純に stow -vv プラスサブディレクトリ名をタイプして、繰り返しシムリンクするようにした。-vvは、表示目的でくだくだしい出力を単に付け加える。これでなすべきすべてのことは、$PATH 変数を修正することだけで、ファイルがインストールされる。stowは必要なリンクすべてを作った。ファイルをアンインストールする(それでリンクを切る)には、単にこれらを unstow する。これは、インストールしたバイナリの接続を切るが、どのファイルも削除しないので、全くの安全ネットだ。
| [zippy@mybox stow]$ pwd /opt/stow [zippy@mybox stow]$ ls -l total 4 drwxr-xr-x 4 root root 4096 Jan 9 16:33 nail-9.29 [zippy@mybox stow]$ sudo stow -Dvv nail-9.29/ Unstowing in /opt UNLINK /opt/bin UNLINK /opt/man [zippy@mybox stow]$ |
これでインストールされたファイル全部が道から外れる。勿論、ファイルを restow するには、前のコマンドを単に繰り返すだけた。これは余分な作業が多いように思えるが、使い慣れて、アンリンク出来る便利さを経験すると、全パケージが役立つと思う。最後に、nailを自分でインストールして、alias又はshellファンクションを通じ、メイルリプレースメントとして使いたいと思うだろう。だがそれは、それ自体で記事になる。
参考資料
ik (Install Kernel)は http://freshmeat.net/projects/ik と http://www.ramdown.com/war/ik.で入手出来る。
2000年12月、Linuxを4年使った後、kernelのコンパイルとインストールが時間の無駄になった。自分のkernelインストレーションを書いてInstall Kernel と言うスクリプトを設定した。他になかったからで、Linux Kernelをインストールしてユーザー介入なしに自動的にブートローダ・コンフィギュレーションファイルを作る何かが必要だったからだ。Install Kernel はファイルを移動し編集してLinux OSとインターフェイスする。ikを使わないと、Kernelを更新するとき殆どの時間が設定コンフィギュレーションファイルの周りでファイルを移動のに費やされる。ikスクリプトには、三つの主要部分、依存性チェック、kernelコンパイルと正しい位置へのファイル移動、ブートローダ・コンフィギュレーションファイルの編集、がある。ikは、新たにkernelをインストールする人、時間を有効に使いたい人の役に立つことを目的とする。
あらゆるOSにはある型のkernelがある。kernelはOSの核心だ。これを書いているとき最新のkernelはLinux 2.4.17だ。殆どのユーザーは、kernelをコンパイルし直すか又はアプグレードする。アプグレードの目的はコンピュータに付加されたデバイスのサポートを追加することだ。例えば、USBスキャナを買ったら、kernelコンフィギュレーションファイルに適切な変更を加え、新しいkernelを再コンパイルしてインストールしなければならない。kernelアプグレードの目的には、仮想メモリサブシステムの改良、重要セキュリテイの設定が含まれる。良い例は、Linux kernel バージョン2.4.11で、これはサービスアタックのシムリンク拒絶に弱いので、 2.4.12への更新を宣伝している。これらが再コンパイル又はアプグレードの基本的理由だ。
Install Kernel は、コンパイル及びインストレーションプロセスを自動化する一連のファンクション又はコマンドのグループを走らせて、Linux OSとインターフェイスする。これは、依存性のチェック、kernelの構築とファイルの移動、及びブートローダ・コンフィギュレーションファイルの編集、の三つの機能グループから成る。機能をこれら三つにまとめることにより、スクリプトの保守と変更が容易になる。Install Kernel はまた、チェックと選択をおこなうプログラムとも考えられる。スクリプトは通常、ロジックを考えない一定数のコマンド含むファイルである。したがって、ikは技術的にはスクリプトだが、プログラムとも呼ぶことが出来る。
依存性チェックは、kernel構築に進む前に現行のシステム構成と設定が正しく設定されていることを確認する。七つの依存性チェックがある。ルート・チェック、スペース・チェック、リンク・チェック、ブート・チェック、ブートローダ・チェック、コンフィギュレーション・チェック及びモジュール・チェックである。先ずルート・チェックで、ユーザーがスーパーユーザーであることを確かめる。これはルートアカウントにアクセス出来る重要システムファイルのみをエディとする能力があることを意味する。スペース・チェックは、最低200メガバイトが利用出来ることを確かめる。今日のkernelソースはソースコードだけで約150メガバイトある。コンパイルすると50メガバイト以上増える。そこでikは、支障なくkernelのコンパイルを進めるため、最低200MBが利用できることを確かめる訳だ。次ぎに、必要ではないが、/usr/src/linuxのシンボリックリンクに/usr/src/linux-x.y.zを指させるのが標準である。4番目のチェックは、ユーザーが /bootディレクトリを持っているのを確かめる。これはLinux kernelファイルがインストールされる場所だ。5番目のチェックは、使用されるブートローダを決定する。LinuxにはLILOとGRUBの二つのブートローダーがある。このチェックは、どちらのブートローダーが最後に使用されたかを点検して、kernelがLILOとGRUBのいずれからブートされたかを実際に見出す。次いで、これにしたがって、残りのスクリプトに正しいものをエディットするよう命令する。6番目のコンフィギュレーション・チェックは、Linux kernel構築の過程で使用される正しいkernelコンフィギュレーション・ファイルを作ったことを確認する。最後のチェックは、モジュール・チェックで、モジュールが切れているときは、スクリプトがこれを判定して、モジュールのサポートなしでおこなうようインストレーション過程を変更する。依存チェックの背景の考えは、何かの不正があって、ユーザーがシステムを破壊することのないことを確かめることである。
インストレーション過程もまた七つのファンクションを含む。インストレーション過程には通常幾つかのコマンドがある。しかし、ユーザーのコンフィギュレーション・ファイルに起こる相違のため、構築処置の各部分をチェックして構築過程を変更する必要がある。第一ファンクションは、kernelソースツリー内のすべてのファイルについて依存性が慎重に設定されていることを確かめる。第二ファンクションは、陳腐なまたは古いkernelファイルを削除する。次の第三ファンクションは、Linux kernelを構築するコマンドを走らせるkernel構築ファンクションである。次のファンクション4と5は、ユーザーがkernelコンフィギュレーション・ファイル内に特定のモジュールサポートを持っているとき、モジュールを作ってインストールする。6番目のファンクションは、Linux kernel 及びそのシステム依存性マップをブート・パーティションに移動する。構築過程の最後のファンクションは、モジュールが決まると、新kernelに関するモジュール依存性を設定する。インストレーション過程にはまた、kernel構築過程の各部分について小さいエラーチェックをおこなう。kernel構築過程がいずれかの部分で不具合であると、スクリプトは止まって、どのブートローダー・コンフィギュレーション・ファイルも変更しない。これは重要である。もし、止まらないと、ブートローダー・コンフィギュレーション・ファイルが変更されて、システムがブート出来なくなる。このスクリプトを広範に使用するため、いずれのLinuxコンフィギュレーション・ファイルもサポートするため重要である。
ブートローダーのコンフィギュレーションと設定の過程は多分新kernelインストールの最も重要な側面だ。ブートローダーのコンフィギュレーションが適切でないと、システムがブートしないか又は新kernelをブートしない。また、二つ又はそれ以上のブートローダーをインストールしているシステムもあるので重要である。このプロセスのため定義されたファンクションが四つある。第一のファンクションは、コンフィギュレーション・チェックの間に定義されたブートローダーを用いる。第二のファンクションは、LILO 又はGRUBコンフィギュレーション・ファイルが置かれる場所を定義する。次ぎに、どのブートローダーが見出されたかによって、LILO 又はGRUBコンフィギュレーション・ファイルのいずれかsedにより自動的にエディットされる。sedは、ユーザーの介入なしでファイルをエディットするストリーム・エディタである。ユーザーの介入が必要であれば、ユーザーはkernelインストールの一定の部分を示さなければならない。ikを用いると、インストール過程全部を終了するのにコマンド一つだけを入力すれば良いので、ユーザーの時間を効率的に使用することが出来る。
Install Kernel は、新たにLinuxを使う人、kernelを頻繁に再構築する人、時間の惜しい人に有用である。kernelインストールのためのコマンドの数をほぼ13分の1に減らす。新たにLinuxを使う人は、これに魅力を感じるだろう。全過程が自動化され、何かが正しくないと、殆どの場合に何が間違ったかと、それを正す方法を通知する。他方、時間の惜しい経験者に取っては、これは便利である。Install Kernel はユーザー介入がなく時間の節約になるので、効率が良く、新たにLinuxを使う人には、kernelの更新のための選択肢として効率的である。
"DocBook -- The Definitive Guide'' (最後の Further Reading を参照)から引用すると、DocBook は、SGML 又は XML pを用い構造化された文書書くシステムを提供する。以下では、DocBook のXML変形に重点を置く。SGML変形は消えたからだ。
DocBook は、既に述べた二つの記事と少し異なる考え方で開発された。
DocBook 特有の上述の特性は、 DocBook がPOD又はLaTeX文書と一緒には使えないか又は少なくとも極めて難しいことを意味する。
例えば、ある目的で作られたXML適合文書にアクセスするため XML::DOM モジュールをPerlにロードし、Pythonが xml.dom モジュールを用いて外に出す。
世界的ウエブコンソーシアム(W3C, http://www.w3c.org)/ が、XSLT (例えば http://www.w3.org/TR/xslt 及び http://www.oasis-open.org/cover/xsl.html). を参照)と呼ばれるXML翻訳用の言語を定義した。XSLT自体は、SGMLの枠内で定義された言語で、XMLとXSLを極めて似た角括弧のロードにする。
普及している転換ツールには下記がある:
必要な DSSSL stylesheets 又は XSL stylesheets を含む両ツールのインストレーションは極めて難しいので、初心者には deb 又は .rpm パケージからのインストレーションを薦めたい。
万能トランスレータとして、両ツールとも DocBook 文書の翻訳には限られない。これらに正しい型のシートを与えると、その他の翻訳もおこなう。
文法
DocBook/XML文法は HTMLに似ている。二つの基本的な相違は、文法重視の厳密さにある。多くのHTMLは未終結要素には極めて寛大で、未知の要素又は属性を黙って無視することが多い。DocBook/XMLトランスレータはDTDに合致しない入力は、詳細なエラーメッセージを付けて拒絶し、この場合は何も出力を作らない。
DocBook/XMLに幾つかの変形で話され、この変形は要素の終結タグの解釈が異なる。殆どの動詞的表現は常に <tag> を </tag> で閉じる。別の変形では、終結タグを</>と略すのを許すが、別の変形では、空白要素に付いては終結タグを全部落とすことが出来る。私は終結タグを書くのを好む。この方が、ネストされたリストなど、何重にもネストされた構造にに利点がある。そこで、この記事では、<tag> ... </tag> の形だけが現れる。
特殊文字は、HTMLと同じように、アンバサンド−セミコロン慣例で書く。最も頻繁に使われる特殊文字は
&''
<''
>''.
コメントは、'' <!--'' と '' -->''.との間の括弧で囲む
文書構造
既述のように、DocBookはDTDで定義された構造に執着する。各文書は特定のDTD選択から開始される:
<!DOCTYPE (1)
book (2)
PUBLIC "-//OASIS//DTD DocBook XML V4.1//EN" (3)
"/usr/share/sgml/db41xml/docbookx.dtd" (4)
[ ] (5)
>
ここで、表現('' <'' から'' >''まで)を、解析の便のため幾つかのブロックに分け、参照用に括弧で番号をつけた。
パート(1)でシステムに、自分のDTDを選ぶことを告げる。パート(2)で自分の文書のルートエレメントとなるエレメント book を定義し、パート(3)パブリック識別子が使用するDTDを選ぶ。パブリック識別子は引用符内の文字列である。システム識別子パート(4)は、ローカルコンピュータシステム上でDTDを見出す場所を翻訳ツールに告げる。角括弧パート(5)の中に、いわゆる入力定義を置くことが出来るが、この紹介では入力の詳細には踏み込みたくないので、空白のままとする。
ここで、ルートエレメント、今の場合は book、を用いてテキストはじめる。どのエレメントが book に入るかはDocBook DTD で定義する。これらは、bookinfo や chapterなどである。許されるエレメントの包括的リストは" The Definitive Guide'' で調べること。bookinfo や chapter の中で許されるエレメントもまた、 DocBook DTD の中ですべてのエレメントと同様に定義される。有効文書を作る唯一の方法は、DTDで規定したルールに従うことである。
文書にプログラム的になアクセスを開くキイはルールである。文書はDTDに合致しているので、すべての後処理はそれに準拠する。プログラマに取っては便利だ。数多くのエレメントとエレメント間の相互関係がピックアップに強い点を称賛する。しかし、関係は論理的である。chapter には、一つ以上の(導入)paragraphs と一つ以上のLevel 1 sectionsが含まれる。他方chapterを含むsectionはない。" The Definitive Guide''をキイボードの横に置いておくと DocBook. の学習に役立つ。以下に、普通用いられるタグの編集を示す:
極めて短いが、完全なDocBook 文書である。
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1//EN"
"/usr/share/sgml/db41xml/docbookx.dtd" []>
<book>
<bookinfo>
<title>XYZ (version 0.8.15) User's Manual</title>
</bookinfo>
<chapter id = "chapter-introduction">
<title>Introduction</title>
<para>
This chapter provides a quick introduction to XYZ.
</para>
<sect1 id = "section-syntax">
<title>Syntax</title>
<para>
In this section we present an outline of the
syntax of the XYZ language.
</para>
</sect1>
<sect1 id = "section-core-library">
<title>Core Library</title>
<para>
Even if no additional libraries are loaded to a
XYZ program, it has access to some core library
functions.
</para>
</sect1>
</chapter>
<chapter id = "chapter-commands">
<title>Commands</title>
<sect1 id = "section-interactive-commands">
<title>Interactive Commands</title>
<para>
...
</para>
<sect2 id = "section-interactive-commands-argumentless">
<title>Argumentless Commands</title>
<para>
...
</para>
</sect2>
</sect1>
<sect1 id = "section-non-interactive-commands">
<title>Non-Interactive Commands</title>
<para>
...
</para>
<sect2 id = "section-non-interactive-commands-argumentless">
<title>Argumentless Commands</title>
<para>
...
</para>
</sect2>
</sect1>
</chapter>
</book>
有用なタグ
DocBookを書く人に、エレメント役割、DocBook標準の定義の感覚を掴んで貰うため、頻繁に使用される有用なタグを編集した。
Root section タグは、任意の文書の最外側エレメントを定義する。
book