Linux Gazette 2002年8月号 #81
今月のLinux Gazette の主な記事
n今月のニュース
 ・法制化
 ・一般ニュース
 ・ディストリビューション関連ニュース
 ・ソフトウエア及び製品関連ニュース
nウイークエンドメカニック
n Alaプログラミングの手引き
n Office Linux:デスクトップディストリビューションに関するアイデア
n Linux上でDVDを再生
nメモリは異常でないか?
n Perlモジュールの探検−パート1:GDを用いるオンザフライ・グラフィック
n Rubyでのプログラミング:パート1
n Ptraceを用いるプロセス追跡
n 初等・中等学校用の安全で丈夫なコンピュータ
n 再利用可能ソフトウエア・ライブラリの作成
n SysRq:プロセス兵器
 
訳者注
原文を一括して一つのファイルでセーブするには、下記のリンクがあります。
TWDT 1 (gzipped text file)
TWDT 2 (HTML file)
前者はテキスト形式で、後者はHTML形式です。
 
Linux Gazette, http://www.linuxgazette.com/
Linux Gazetteの編集者、mailto:%20gazette@ssc.com
Copyright © 1996-2002 Specialized Systems Consultants, Inc.
 
 
 
今月のニュース
▼▼▼ 法制化 ▼▼▼
JPEG
オープンファイル・フォーマットと無料ソフトに関心のあるすべての人に取って残念なことが、先月起こった。JPEG画像圧縮計画が、特許料支払い対象になると言うことだ。Registerが報じたように、 Forgent Networks がJPEG画像の転換を含む特許権を最近取得しのみか、二つの会社に特許料を請求した。この特許が有効になると、ISOはJPEGを規格から外すと言う(Forgenntの強制する契約条項は、規格に関するISO規制に合わない)。特許が成立しないことを祈るのみだ。これを確実にするため、JPEG社会は、特許を無価値とみなし無効とする先行技術の例を求めている。最悪の場合でも、特許は2004年に期限切れとなる。
FFIIのソフトウエア特許作業グループ(Software Patent Working Group )は、既存のヨーロッパ特許でJPEG圧縮技術を内容のないものにするため使えるものがあると指摘する。Software Patent Free Europeへの参加で、ささやかな一歩を踏み出すことが出来る。

本件に関する多数のリンクをまとめたウエブペイジは新しい Burn All .JPEGs! ウエブサイトだ。Forgentのウエブサイトにもこのニュースに関する各社の様子のlist がある。

 

Perens and DM
Bruce Perens は、今月O'Reilly Open Source Conventionの舞台上のライブlive on stageでDMCAを脅かすことによる広報活動を始めた。DVDプレーヤに組み込まれた地域コード管理を削除する方法を示す計画The plan であった。しかし、Dan Gilmoreと Slashdotが報じたように、Bruceは雇い主HPの要求にしたがって、公然と法律を破ることから退却した。
この話に関する良いリンクがO'Reilly Open Source Convention Conference Coverage pageにある。
 
追加 DRM (溜息)
米国上院議員Bidenの提案する法案は、デジタル権利管理(Digital Rights Management)回避の一種を重罪felony(死刑相当)にするものである。ZDNet coverage ZDNet受信地域では、この法案はもともと大規模海賊行為(偽ウインドウズホログラムなど)を退治する目的であったが、こっそりとDRMも含むものに書き換えられたと言う。
 
オープンソース:EU、米国及びパキスタン
色々な場所(in The Register, on Slashdotin ZDNet)で、各種管理部門間及び各国間のソフトウエア交換を多くするため、最近のEUレポートがオープンソースの採用を広く呼びかけていると報じている。Slashdot story に、各種フォーマットで元のEUレポートに対するリンクがある。
別の話だが、O'Reillyネットの Sam Williamsが、米国内国外双方の政府におけるオープンソース・ソフトウエア影響を論じている。

Wiredは、駐ペルー米国大使がペルー国会議員Villanuevaの、政府コンピュータでオープンソース・ソフトウエアを使うべしとする法案に反対したと報じた reports。またビルゲーツもペルー大統領Alejandro Toleroに対し国立学校システムのため$550,000を個人的に寄付した。Villanueva法案の狙うのと同じ学校に金が行かないのは言うまでもない。 Villanuevaが言うには、マイクロソフトはペルーの小さい市場ではなく、むしろ他のラテンアメリカ諸国で起こるなだれ現象を心配している。アルゼンチン、メキシコ、ブラジルで同様の法案が審議中で、スペインのエストレマドラ地方も公立学校と役所の公式システムとしてLinuxを採用しているalready adoped Linux

パキスタンPakistan もまた、オープンソースゲームに参入している。GNU/Linuxを走らせる50,000個のペンチアムIIが、各100米ドル以下の価格で、パキスタン全国の学校に設置されている。「これらPC用の私有財産ソフトウエアは大した財産にはならない。コンピュータの費用の方が高い」

 
 
 
▼▼▼一般ニュース▼▼▼
資料用にLinux Journal 記事が利用出来る
Linux Journal は作者契約を変更してhas changed its author contract、記事が公刊された後、著者は誰でも自由に自分の記事を再頒布自由の資料として自由ソフトウエア・プロジェクト又は自由資料計画に含むことが出来ることとした。LJ創刊以来、著者は常にこの権利を持っていたが、気付かない人もいた。変更の動機は、プログラムのユーザーが情報を得られるようにし、プロジェクトが発展するとき記事を所望に応じて主資料として使い更新することが出来るようにするためである。
 
Linux Weekly News
今月がLinux Weekly Newsの最後の旅路になると思われる。8月1日号が最終号になると発表したからだ。この決定の根本的な原因は資金不足と、資金を生む計画が何もないことであった。発表に続いて、不満な読者が資金を積みLWNの寄付計画に寄付した。これは忽ち$120000に達し、LWNの将来を再考rethink of LWN's futureさせることになったが、雑誌の運命の最終決定は未だなされていない。
 
WalmartのMandrake
先月Wal-MartLindows をプレインストールしたPCを立ち上げた launch [NewsForge]のに続いて、Mandrake搭載版も入手出来ると新たに発表したnew announcement of 。Wal-Martカタログには、 LindowsMandrake両方のPC製品群の詳細と価格が載っている。
NewsForge はレジスタhas The Register と同じくこの話を報じた reported on this story。この製品のMandrake 版が、NewsForgeでは中途半端に受け取られた前のLindows 提案より良いといいのだが。
 
Ogg とReal

Ogg Vorbisプロジェクト、バージョン1.0のリリースreleased a version 1.0、おめでとう!LENからの from LWNリンクとして、1.0のリリースに関する沢山のニュースがOgg Vorbis Newsにある。この話は、レジスタやCENTも報告している(by The Register及びby CNET)。

Ogg Vorbis 及び Xiph.org はまた、オープンソース・フォーマットとRealNetworksの新Helix との間のリンクのため、ニュースになった。この発展はRealNetworksのソフトウエアの一部が「コミュニティとオープンソースライセンス」の下でリリースされるbeing releasedことを見込んでいる筈だ。続いてOgg VorbisコーデックがRealNetworks製品に組み込まれる筈だ。

Bruce Perens は、RealNetworks-Xiphリンクアップを囲む問題の突っ込んだ記事in-depth accountを書き、Realのコーデックが私有財産で、そのソフトウエアの一部使用のため(オープンソースでなく)コミュニティ・ライセンスであることなど、多くの取引形態を批判した。RealNetworksのRob Lanphierは、スラショット上でブルースに答え replied to Bruce、会社のオープンソース寄与に善意を示すことを求めた。Registerもまた、CENTと同様にas has CNET Realのオープンソース経験を報じたreported onHelix Community websiteが、RealNetworks Helixプロジェクトの将来開発と、ソフトウエアをリリースするlicences のコピイを報じる筈である。

 

GNU 科学ライブラリ(GSL) 1.2 のリリース
GNU 科学ライブラリのバージョン1.2が入手出来る。GNU 科学ライブラリはCで書いた数値計算用ルーチンのコレクションである。このリリースは、前の1.xリリースと逆互換が出来る。プロジェクトのホームペイジはhttp://www.gnu.org/software/gsl/にある。デベロッパのためのの情報は. http://sources.redhat.com/gsl/.にある。
 
 
 
▼▼▼ディストリビューション関連ニュース▼▼▼
Debian

Debian ワールドの今月のビッグニュースは、Debian GNU/Linux 3.0 (Woody) がリリースされたことだ been released。これでDebian GNU/Linux は、暗号ソフトウエアを特徴とするKDEとGNOMEデスクトップ環境を始めとして全部で11個のプロセッサ・アーキテクチャをサポートし、FHS v2.2と互換性があり、LSB用に開発されたソフトウエアをサポートする。これはRegisterも報じている reported by The Register。Debian Weekly Newsが報じるように reported by Debian Weekly News, 新試験ディストリビューションは「Serge」と呼ばれるwill be called "sarge"


Potato, 2.2r7の新版もまたリリースされたreleased。主な変更はセキュリティの更新と幾つかの修正である。


Debian Weekly Newsは、jpeg画像圧縮計画に対してなされている特許請求が、それに反してコピイされたlibjpeg62及びその他すべてが無料でないことを要求すると報じたDebian Weekly News reported

 
Gentoo
tinyminds.org が、Gentoo Linux の Daniel Robbins との会見interviewを公刊した。NewsForge に関する口答えはほとんどない。.

LinuxPlanet にGentoo Linux 1.2. に関する最近の見解 recent review がある.

 
RedFlag

Redflag Software Technologies Co., LtdOpera Software は戦略的発表をおこなった。両社は、中国市場に関し埋込ブラウザソリューションで協力する予定である。RedFlag は、中国埋込市場のため特別仕様Operaの合同開発と販売とともに、Opera再販業者として合同することを探求している。

Opera を含むことで、RedFlag は、OEMとハードウエア製造者に対し Red Flag の現有製品群に適合するため特注されたウエブ有効のソリューションを見積もることが出来る。

 
SuSE

SuSE Linux は、システム機能性を拡張した SuSE Linux eMail Server 3.1 が入手出来ると発表した。指名、課題、リソースの管理を助けるSuSEのe-メールソリューションは、特に中小企業と同時に作業グループ及び行政を狙っている。


SuSE Linux はまた、TSANet(Technical Support Alliance Network)への参画を発表した。TSANetは、150以上のハードウエアとソフトウエアプロバイダをホストする世界的サポートプラットホームである。TSANet の範囲内で、各種の製造者が、自分のアプリケーションとの関連でその企業顧客が遭遇した問題に関するソリューションの作製にに協力している。

SuSEのサポートの詳細情報については http://support.suse.de/en/

 
 
 
▼▼▼ソフトウエア及び製品関連ニュース▼▼▼
Opera
Opera Softwareは、Linux用Opera 6.02 のリリースを発表した。新版には、アジア文字の表示を特に強調したドキュメント及びユーザーインターフェイスに対する重大な修正が含まれる。これは全世界のLinuxユーザーに有用な更新である。Opera 6は、非西欧文字の表示能力を加えてアジア市場をOpera に開放したので、Linuxがこの地域で特に普及した。
Linux用Opera 6.02は、広告支援版が無料でhttp://www.opera.com/. から入手出来る。バンナのない版は39米ドルで、割引が適用される。

Opera Software ASA は、SuSE が、Linuxウエブブラウザ用OperaをそのLinuxディストリビューションで頒布すると発表した。取引はOperaの初めての大手Linuxディストリビューション契約である。OperaはSuSE Linux 8.0で利用することが出来る。

 
Random Factory

The Random Factoryは、天文学、化学、生化学を含む広範なLinux用科学ソフトウエアを有している。選択されたRandom Factory製品を搭載したLinuxワークステーションも入手することが出来る。

 
Magic Software
アプリケーション開発技術及びビジネスソリューションのプロバイダMagic Software Enterprisesは、Magic eDeveloper を中国市場に導入すると発表した。Magic Softwareは、製品群の幾つかがLinuxをサポートする support Linux
 
その他のソフトウエア

VariCAD は、Windows 及びLinux 両OS用の新 VariCAD 8.2.0.2 アップデートをリリースした。この機械的3D/2D CAD パケージは、3Dモデリング、2D ドラフティング、機械部品のライブラリ、計算、BOM、その他多数のためのツールを提供する。価格は399ドル。Windows 98/NT/200/XP 及びLinux (RedHat、Mandrake、 SuSE)用の無料試験版は、 http://www.varicad.com/からダウンロードすることが 。

Linux Game Publishing が、Mindrover 1.07bのベータテスタを求めている。関心があれば、. betas websiteに登録のこと。当選者にはe-メールで通知する。

 
Copyright © 2002, Michael Conry and the Editors of Linux Gazette.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 81 of Linux Gazette, August 2002
 
 
 
ウイークエンドメカニック

By Thomas Adam

7月版へようこそ
簡単な紹介:Quotas
簡単な紹介:DansGuardian
Touchrec: ディレクトリ内のファイルへの繰り返しタッチ
GNU find:有効性を見直し
John M. Fiskとのインタビュー
7月版へようこそ

今日は。その後如何?LGを読み続けているね。そうあって欲しいな。この記事も色々代わるから。

今月のニュースだって?自分の家に移ったよ。大学を出たので Somersetにささやかな家を構えた。つまり、

新しい仕事についた。Waitroseと言うチェーン店のため8種類の贅沢なデザートを作る小さい工場で働いている。Waitroseは、John Lewis Partnership, plcの一部だ。高級食品を作っている。好奇心の強い人のため、作っているデザートを書いておこう:

・チョコレート・ムース
・ザバグリオニ (アモレッチビスケットベースのムース)
・レモン・デザート
・ルバーブ・シラバブ
・ブラックベリ・シラバブ
・クリーム・ブルーレ
・チョコレートとグランマルニエ付きクリーム・ブルーレ
・砂糖漬けラズベリ付きクリーム・ブルーレ

6時始業なのが唯一の不満だが、午後2-4時には終わる。

生活が現実味を帯びて来た。そろそろ専門の題材Linux.....に移る時期だと思う。

 

簡単な紹介:Quotas     始めに戻る
・Quotaとは?
遙かな昔13号に、Jim Dennisがディスクスペースをはみ出して書こうとすると (SLEW)警告するようLinuxマシンを設定する方法にについて小さい記事を書いた。この記事を読んで、いずれにせよ特定のユーザーが超えることの出来ないinode又はブロックの数を規定して設定ルールを強化することによりディスクスペースを超えて走らないを確実にすることが出来ると判断した。
しかしQuotaは、ユーザー毎のベースで扱われ、一時に一つのファイルシステムでだけ働く。そこで、ユーザーが一つ以上のファイルシステムにアクセスし、それら各々のquotaを強化したいときは、別個におこなうわなければならない。
簡単に言うと、quotaは、ユーザーが一時に使うことの出来る最大ディスクスペースを規定する方法だ。
・インストレーション
Kernelバージョン>=2.0のように、Quotaサポートはkernelに入っているので、古い年代のkernelバージョン<2.0を使っているときは、直ちに最新版を入手すること(http://www.kernel.org/)。
残りのGNU/Linux プラネットについては、kernel内の規定値によりQuotaサポートを持っているのを確かめる。持っていないときは、最新の安定なリリースを入手してリコンパイルする。その方法は、ソースディレクトリの下のINSTALLファイルを参照のこと。
因みに、SuSEボックスを走らせていると、Quotaはkernelにコンパイルされて来る。

しかし、Quotaはkernel自体から直接走らせられない(自己抑制でない)ので、面白い仕事は残っている。ソースファイル用にRPMをインストールしなければならない。

問題のRPMファイル(パケージ取扱いに関しこのシステムを使うディストリビューションをを使っている筈)は:

quota-1.70-263.rpm

及び And the tarball file is called:

all.tar.gz

と呼ばれるtarballファイルである。

両方とも次のFTPレポジトリから入手することが出来る:

ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/subsystems/quota/

RPMファイルをインストールするには

次のコマンドを発する:

su - -c'rpm -i /path/to/quota-1.70-263.rpm'

ソースファイルをインストールするには


1. su -

2. cd /path/to/tarball/

3. tar xzvfm ./all.tar.gz

4. ./configure

[ コンフィギュアスクリプトを走らせる ]

5. make && make install

6. logout

[ ルートの "su;ed" アカウントから出るため ]

これが、することの全部だ。これからが本当に面白い。

・Quotasの設定
これをコンフィギュアする第一段階は、これをどう組織するかについての論理的構想を孔間の中に持つことだ。Quotaは、単一ユーザーか、(特定ユーザーに指定された)グループか、両方かの選択肢を与える。大型ネットワークであるときは、多分二つの混合が好ましい。
すべてのユーザーをその特定グループに指定したときは、通常グループ版が良い。暮らしにゆとりが出来る。「違うか?」

しかし実際の第一段階は、システム全体の変更をすることだ。このため、ユーザーrootとしてログインする。だが、単に "su" と入れるのでは、有効UIDを変えるだけで、エキスポート変数などについては何もしない。

先ず、"/etc/fstab" を変更して、ファイルシステムマウントポイントがquotaサポートを利用することを、kernelが知るようにする。典型的な "/etc/fstab" ファイルは次のようになる:

/dev/hda1    /boot     ext2   defaults 1 2
/dev/hda2    swap     swap    defaults 0 2
/dev/hda3    /       ext2   defaults 1 1
/dev/cdrom   /cdrom     auto   ro,noauto,user,exec 0 0
/dev/fd0    /floppy     auto   noauto,user 0 0
proc      /proc     proc   defaults 0 0
usbdevfs    /proc/bus/usb  usbdevfs defaults 0 0
devpts     /dev/pts    devpts  defaults 0 0


#NFS clients....
#Updated: Thomas Adam, Tuesday 03:45am??? -- Can't remember.
server:/etc     /mnt/etc  nfs  rw,user,rsize=1024,wsize=1024,hard,intr
0 0
server:/home    /mnt/home  nfs  rw,user,rsize=1024,wsize=1024,hard,intr
0 0
server:/usr/doc/lg/lg/lwm      /mnt/lwm  nfs  rw,user,hard,intr 0 0
#server:/usr    /mnt/usr  nfs  rw,user,hard,intr 0 0
server:/cdrom    /cdrom   nfs  ro,user,rsize=1024,wsize=1024,hard,intr
0 0
server:/dev     /mnt/dev  nfs  ro,user,rsize=1024,wsize=1024,hard,intr
0 0
関心があるのは、ファイルの最終部分[ ** although quota can be used with nfs exported file types -- see "man rquota" ** ]ではなく、quotaサポートにマウントポイントを渡すため使われるものである。これは、ユーザーの $HOME ディレクトリが置かれている場所に左右される。このため別個のパーティション又はドライブを持っているのでない限り、一般的に使いたいマウントポイントは (/home が "/usr/local/home/" -- へのシムリンクであり、"/usr" が別個のドライブ又はパーティションにあるとき) "/" 又は "/usr" の何れかである。

ここで、この章の最初に提起した元の問題に戻る。ユーザーを管理する方法は?これをユーザー毎のベースでおこなうのであれば、fstabファイルに usrquota を追加する。グループででおこなうのであれば、grpquota を追加する。二つの混合を使うのであれば、両方を追加する。

こうして、第4フィールドに次を追加することとなる:


/dev/hda3	/	       ext2	defaults,usrquota,grpquota 1 1

変更はfstabに見合っている。どのquotaを使うか確信がないときは、両方をfstabファイルに含めることを薦める。これはswapを必要とすることを意味し、既に設定済みだからである。ここでファイルをセーブする。

され、次ぎにしなければならないのは、fstabファイルで変更したパーティションのルート上に必要なファイルを作るのに、どちらの選択肢を選ぶか(つまり usrquotagrpquotaか)を確認することだ。これをおこなうには、次のコマンドを入れる(未だユーザーrootとして)


touch /top/of/partition/quota.user && chmod 600

/top/of/partition/quota.user



touch /top/of/partition/quota.group && chmod 600

/top/of/partition/quota.group

最後に、システムがブートアップした時期を確かめなければならない。quotasはそれと同時に有効になるからだ。RPM/.DEBなどから Quota をインストールした人は、"quota" と言う名のスクリプト又は類似のものを "/etc/init.d/"の中に見出す筈だ。しかし、ソースからインストールすると見あたらないので、次のスクリプトを、すべてのファイルが "/etc/fstab" に取り付けた、主init-scriptに加えなければならない。


(text version)


#Check quotas
[ -x /usr/sbin/quotacheck ] && {
 echo "Checking Quotas (please wait)...
 /usr/sbin/quotacheck -avug
 echo "Done."
} || {
 echo "Checking Quotas FAILED"
}

[ -x /usr/sbin/quotaon ] && {
 echo "Initialising Quotas..."
 /usr/sbin/quotaon -avug
 echo " Done."
} || {
 echo "Turning Quotas On: FAILED
}

上でおこなっているのは、スクリプトの残りを処理する前に、ファイルが実行可能であることを確認するため点検することを意味する "-x"フラッグに関し、指定されたファイル上でテストを走らせている。これは点検して(もしあれば)どのquotaが定義されたかを理解し、それらを有効にする。

これを終わったら次を与える:


init 6

そしてコンピュータがリブートするのを待つ。

買い手への警告: kernelを再コンパイルしなければならないときは、新kernelイメージについて知らせるようリプートのに、走らせるブートローダとしてLILOを使っていることを確認のこと:

lilo

・一例

これで、マシンはQuotaを使おうとすることをマシンが認識した筈だ。未だしていないのは、最も重要なことで、誰又はどのグループがquotaルールを使うかだ。

ユーザー一人が使う例を用いて、その人のquota限界を設定する方法を示す。ユーザーlgを呼び出さなければならない。

システム上に既にlg があるとして、しなければならないのは、使うフォーマットに応じて、適切なファイルをエディットすることだ。この例の目的のため、ユーザー毎のベースでおこなう(つまり、usrquota フォーマットを使う、何もかも説明しなければならないが、これは grpquota オプションを使うときも全く同じである)。

ここで使うコマンドは "edquota" と呼ばれる。しなければならないのは次ぎコマンドを発してquotaをユーザーlg 用に編集することだ。


edquota -u lg

これがおこなうのは、エディタを立ち上げ、あららしいquotaを開くことだ。環境変数EDITOR="/usr/bin/jed" 又は同等エディタを設定していないときは、このコマンドは働かない。この変数を背艇するには、次を "~/.bash_profile" に追加する。


EDITOR="/usr/bin/jed"

export EDITOR

Vi, jed, joe, emacsなどに合わせてプログラムを変更する。次いで次のようにタイプして変更を有効にしファイルをソースにする:


source ~/.bash_profile

ユーザー lg のため次のようなものが見付かる筈だ:


Quotas for user lg:

/dev/hdb2: blocks in use 0, limits (soft = 0, hard = 0)

      	   inodes in use: 356, limits (soft = 0, hard = 0)

ここで、"err...." が気になるだろうが、心配ない。見掛けより簡単だ

Blocksは、ユーザーがパーティション上で使うブロックの総数を示す(KBで数える)。

Inodesは、ユーザーがパーティション上に有するファイルの総数を示す。注記:この数は変えられない。

気掛かりなのは、各行の右端にある括弧の中のビットだ。これは、quota全体を設定するキイだ。二つのオプション、soft 用と hard用、があるのに気付くだろう。

Soft limits は、lg が持つことの出来るスペースの最大量(KB)を示す。これは、grace period と一緒に設定されたときユーザー lg に対し限界を超えたことを示す境界として働く。

grace 限界は、soft 限界が強制されるまでの時間である。これは秒、分、時、日、週、月から設定することが出来る。これは次のコマンドを発して設定する。


edquota -t

次が得られるのが分かるだろう:

時刻単位は:日、時、分、又は秒
ユーザーにsoft限界を強制するまでのGrace period
/dev/hdb2: block grace period: 0 days, file grace period: 0 days
/dev/hdb2: block grace period: 0 days, file grace period: 0 days

blockfile に関する値は、合うと分かるものに変える。両者に14日(2週)を推薦するが、甘いかもしれない。

hard は、ユーザーが超えることの出来ないスペースの最大量を示す。これはgrace period を設定したときだけ働く。

これが、ここにあるもの全部だ。システム上のユーザー毎に同じquotaを割り当てるのは面倒だと思うだろう。lg についての例を追ったばかりなので、出来ることは、ユーザー lg をテンプレートとして使って、次のコマンドを発することだ:


awk -F: '$3 >= 500 {print $1}' /etc/passwd'

これがおこなうのは、499より大きいUIDから始まるユーザーすべて(つまり500以降)を篩にかけることだ。画面上のユーザーのこの組がOKなら、下に示すようにedquotaと関連させて、下にしめすように、上記を使うことが出来る。


edquota -p lg $(awk -F: '$3 > 499 {print $1}' /etc/passwd')

これは、lg について既に有効にしたquotaをテンプレートとして使って、それをawkスクリプトが書き出したユーザーの列に対し割り当てる。

これですべて終わりだ。quotaがユーザーを港に引き留めるのに優れたツールであることが分かった。私はこれを、ルートでないアカウントに用いる。ホームディレクトリでキレて、時々それを空にするのを止めるからだ。

 

簡単な紹介:DansGuardian     始めに戻る

DansGuardian とは ?

SquidSquidGuard を近似するLinuxワールドへの最近の小紹介文を読んだ人じは、一定のレゲーに合致する一定のウエブペイジを篩い分ける方法を示したのを覚えておられるだろうwill rememberDansguardianがすることは、篩い分けの考えを取り上げ、内容に基づいてウエブペイジを篩い分けるよう拡張することである。しかしDansguardianはまた、mime型を篩い分けてファイル拡張子を阻止し、M$-Windowsマシンを使う不幸な罰を受けるユーザーを篩い分ける。.exe, .com, .dll, .zip などのファイルを阻止することが出来る。

・インストレーション

Dansguardianは、http://www.dansguardian.org/ から入手することが出来る。ほやほやのDebian GNU/Linuxユーザーならいつでも、alien パケージを使ってRPMファイルをDEBファイルに転換することが出来る。実際にファイルをインストールするには、instructionsを参照すること。

Dansguardianがnb++ libraryの使用を必要とするのは、注目すべきである。Dansguardianの主要サイト上には、ダウンロードサイトへのリンクがある。このライブラリは、ウェブペイジの内容を見るために使われるので、Dansguardianの操作に不可欠である。

インストールに当たっては、Dansguardian、主プログラムが "/usr/sbin/dansguardian" としてインストールされる。しなければならないのは、"/etc/init.d/rc.local" 又は "/etc/init.d/boot.local" のいずれかに (どのディストリビューションを使っているかによる), 次を追加して、


/usr/sbin/dansguardian 

Dansguardian がinit上にロードされるようにすることだ。

・コンフィギュレーション

Dansguardianまで来ると、コンフィギュアすることはそんなに多くない。作業の全部は、全く正確な内容篩い分けのため構築しようとする各種レゲー表現である。

DansGuardianは、SquidGuardと関連して使って、既存のフィルタを置き換えないで済むことを指摘しなければならない。

だから、先ずおこなうのは、パケージがコンフィギュレーション・ファイルを置いた場所を調べることだ。"/etc/dansguadian"から出ており、今集中使用としているこのディレクトリに含まれるファイルであるのは驚くに当たらない。コンフィギュレーション・ファイル/etc/dansguardian/dansguardian.confを見ることから始める。

これがDansguardianの必要とする設定の全部だ。一般的に、変更しなければならない唯一のオプションを下記に示す。

#DansGuardian config file

[Reporting]
reportinglevel = 1 # 0 = 「アクセス否認」だけ報告
          # 1 = 理由は報告するが否認フレーズは除外
          # 2 = 完全に報告

[Network Settings]
filterport = 8080  # tDansGuardian が聴取するポート
proxyip = 127.0.0.1 # アドレスを一巡して局所的にsquid にアクセス
proxyport = 3128  # DansGuardian がsquid に接続するポート
accessdeniedaddress = "http://grangedairy.laptop/cgi-bin/dansguardian.pl"

[Logging] # 0 = none 1 = just denied 2 = all text based 3 = all requests
loglevel = 2

[Content Filtering]
bannedphraselist = "/etc/dansguardian/bannedphraselist"
bannedextensionlist = "/etc/dansguardian/bannedextensionlist"
bannedmimetypelist = "/etc/dansguardian/bannedmimetypelist"
exceptionsitelist = "/etc/dansguardian/exceptionsitelist"
exceptioniplist = "/etc/dansguardian/exceptioniplist"

[Phrase Scanning] # 0 = normal 1 = intelligent
scanningmode = 1
# normal は、原始 HTML上でフレーズチェックをおこなう
# intelligent は、normal チェックと HTML タグ及び
# 多重空白、タブなどの除去をおこなって、2回目のチェックをおこなう

[ ** 他に多数のオプションが編集される ** ]

ここで変更したのは、filterportproxyport 及び accessdeniedaddress タグだけで、"/etc/squid.conf"で使用したコンフィギュレーションを反映している。これに習ってオプションを変更してファイルをセーブすると、これを無視することが出来る:

さて、同じディレクトリに移動すると、次のファイル名のファイルに気付く筈だ:

・bannedphraselist
・bannedextensionlist
・bannedmimetypelist
・exceptionsitelist
・exceptioniplist

各ファイルを順に取り上げて、それぞれの役割を説明する。適切な場合には、ファイルの小部分を記載する。

bannedphraselist

このファイルは、明確な語句を含むので、ここでは内容を示さない。これは、HTMLペイジのどこかで見出されると阻止されるキーワードを保持するファイルであると言うだけで十分だろう。

お分かりのように、各単語は、次のように<>で囲まれる:


< sex >

これらの角括弧は、重要である。これらがないと単語が阻止されないからだ。

また、ファイル全部を通じて、角括弧のどちらかの側に空白を持つ単語があるのに気付かれるだろう。どちらかの側に空白が一つのものもある。これは、重要である。dansguardianに対し単語を阻止する方法を告げるからだ。


< sex >

は、単語sexが(そして単語sexのみが)、見付かったとき阻止すべきことを示す。それ以上ではない。


<sex>

は、センテンス又はフレーズの中で見付かった場所に関係なく単語sexを阻止すべきことを示す。つまり、hellosexyhowareyou?で見付かると阻止される。


< sex>

は、単語の左側にあるものは全部阻止される意味である。


<sex >

これは、上記の逆である。

ファイルを見て行くと、阻止される多数の各種単語が分かるだろう。既にその単語の一部を阻止したので、阻止されない例示の単語又はハイフォン付きフレーズに関する多数の注釈があるのに気付くだろう。例えば


<middlesex>

は、阻止する必要がない、フレーズ


<sex>

が既に sex を含む別の単語全部を阻止しているからだ。これは、後々、リストに追加するとき覚えておくべき、重要な事実である。

bannedextensionlist

dansguardianが禁止するファイル拡張子のリストを単純に含む。次のようになる:   #禁止拡張子リスト

.gz
.tar
.zip
.mp3
.mpeg
.mpg
.avi
.exe
.sys
.ini
.bat
.doc
.xls
.scr
これは自明であろう!!
bannedmimetypelist
# 禁止MIME タイプ

audio/mpeg
audio/x-mpeg
audio/x-pn-realaudio
video/mpeg
video/x-mpeg2
video/acorn-replay
video/quicktime
video/x-msvideo
video/msvideo
application/gzip
application/x-gzip
application/zip
application/compress
application/x-compress
application/java-vm
MIME タイプは、アプリケーションの各種マルチメディア部分の識別に用いられるので、e-メールを送るとき特に便利であるが、MIMEはHTMLにも用途がある。

ここでも、別のオプションを追加する。

exceptionsitelist

別の何かのファイルで規定されたルールにより元々阻止されていても、見るのが許されるサイトを記載する。次のようになる:

#Sites in exception list
# www. や
# http:// は気にしない

jadeb.com
付き合うサイトをもっと追加出来るのは明らかだ。
exceptioniplist
# 無視して素通りさせるだけのIP アドレス
#
# 更新のため篩い分けしないアクセスを必要とする
# サーバーがある。また
# プログラムをダウンロードし
# 阻止サイトを点検する必要のある
# 管理者ワークステーションをここに置く。
#
# ここにはIP アドレスだけ置く、
# ホスト名ではない。

192.168.0.1
192.168.0.2
192.168.42.2

# 上記は一例なので、
# これらを削除して、自分の望みのものをおくこと
この中のコメントが多くを語っている。当然ながら、どのマシンに対する無効アクセスを許すかは慎重に考えること。
また、短い説明でdansguardianの働きが分かる。言った通り本当に阻止するので、最初はイライラするだろうが、ドメイン名の全部をexceptionsitelistに放り込むと、かなり良い。
 

・Touchrec:ディレクトリ内ファイルへの繰り返しタッチ 始めに戻る

66号では、与えられたディレクトリへの繰り返しタッチの方法についてのスレッドが現れた。タッチのGNUバージョンは(未だ)オプションをサポートしないので、GNUを使う指針はほとんどなかった。

この考えには興味をそそられた。すべてのファイルやディレクトリに対する繰り返しタッチの特性が必要な状況になることが多かった。そのような例は、un-tarしたtarballに"m"フラッグを追加するのを忘れ、その結果ファイルに将来の修正日付を持った場合などである(66号参照)ディレクトリ全体を削除するのは、untarにageを要するので、苦痛である。そこで、次のシェルスクリプトを書くことにした

(tar.gz file)

-----------------

#!/bin/bash
##########################################################
#touchrec -- ディレクトリ内のファイルへの繰り返し"touches" #
#Ackn:   TAG (Linux Gazette)用に作成     #
#Version:  バージョン1.0 (第一草稿)      #
#Author:   Thomas Adam 作成           #
#Date:   2002年7月15日(土) 16:58pm BST   #
#Contact:  thomas_adam16@yahoo.com         #
##########################################################

#Declare Variables
bname=$(basename $0)  #プログラムの基礎名 (パスを省略)
curr_dir=$(pwd)    #カレント・ディレクトリCurrent dir
dironly=0       #-d off
filesonly=0       #-f off
quiet=0        #-q off
toplevel=        #-l off
redir=$(tty)      # 冗長(verbosity)宛名書き換えタグ
version="$bname: Created by Thomas Adam, Saturday 15 June 2002, 16:58pm BST,
Version 1.0"

# プロシージャ開始

# Help プロシージャ
help_user()
{
echo "
$bname usage: [-s directory path] [-q] [-d] [-f] [-t] [-h] [-v]

ここで:

-s (オプション開始ディレクトリ、規定値は 'pwd')
-q (静粛モード-- 冗長(verbosity)を抑制)
-d (唯一の touch ディレクトリ)
-f (唯一の touch ファイル)
-t (トップレベル・ディレクトリ、即ち'.' 、にタッチ)
-h (このメッセージをプリント)
-v (プログラムのバージョン)

完全ドキュメンテーションには、コマンド \"man \\1 touchrec\" を発する
"

exit 0
}

run_default ()
{
 for lists in $(find ${curr_dir} ${toplevel} -depth 2> /dev/null); do
  # ディレクトリであるとき....
  [ -d $lists ] && {
   # 全ディレクトリ-- yes
   [ $dironly = 0 ] && {
    # ファイルだけ ? -- そうであればloopの次のインスタンスに続く
    [ $filesonly = 1 ] && {
     continue
    }
    echo "touching dir $lists/" >$redir && touch -c $lists
    continue
   } || [ $dironly = 1 ] && {
    #then we are only checking for directories
    echo "touching dir $lists/" >$redir && touch -c $lists
   }
  #This time check for files...
  } || [ $dironly = 0 ] && {
   [ -f $lists ] && {
    [ $filesonly = 1 ] && {
     # ファイルについて点検のみ....
     echo "touching files $lists" >$redir && touch -c $lists
     continue
    } || [ $filesonly = 0 ] && {
      # ランタイムにフラッグが渡されなかった結果として、これは次を実行
      echo "touching files $lists" >$redir && touch -c $lists
    }
   }
  }
 done
}

#メイン

# コマンド行スイッチの存在をチェック
if [ "$#" = 0 ]; then
 echo "No command-line args given"
 curr_dir=$(pwd)

else

 while getopts ":hqlfvdts: " opts; do
  case $opts in
   d )
    # ディレクトリのチェックのみ
    dironly=1
   ;;

   q )
    #Quiet -- コンソールに対する冗長(verbosity)を抑制
    quiet=1
    redir="/dev/null"
   ;;

   f )
    # ファイルのチェックのみ、ディレクトリはチェックせず
    filesonly=1
   ;;

   t )
    # トップレベル・ディレクトリ "." のみ処理
    toplevel="-maxdepth 1"
    #echo $toplevel # デバッグ目的
    ;;

   s )
    # 規定通りのパスを取得
    # $optarg が空白であれば、help_user()をプリント

    [ $OPTARG = "" ] && {
     echo "No Parameter Given"
     help_user
    } || curr_dir=${OPTARG}

   ;;

   h )
    # ヘルプ・メッセージをプリント
    help_user
   ;;

   v )
    # バージョンをプリント
    echo $version
    exit 0
   ;;

   -* | * )
    # その他任意のオプション -- 無視
    help_user
   ;;

  esac
 done
fi

# プロセス・オプション・コマンド...
shift $(($OPTIND - 1))

# メイン・プロシージャ開始-- オプションすべてが処理されたとき
run_default
                -----------------

BASH プログラムに対する全くの初心者は、LG52号にあるBen Okopnikの優れた講義を参照されたい。経験者は、私が古い "if..then..else..fi" 法の代わりに "[ ..... ] && {} ||" 構造を使っているのに気付かれるだろう。後者がexitステータスをもっと良く制御するので、私が好きだからだ。Perlもまたこの記法を必要とする。

スクリプト自体は極めて簡単だ。起こるのは基本的に、変数全部を初期化することだ。ここで、BASHはこれを必要としないが、そうすると進行具合を知るのが楽になる。

各種変数を設定する。そのほとんどは、只のスイッチ識別子で、コマンド行スイッチを発したか(及びどの)が分かるようなっている。別の変数bname を設定する。これは、help_user() ファンクションで使ったプログラム名を、PATHを省略して、返す。

定義した別の変数は、redir 変数である。これは、最初スクリプトを呼び出したttyを設定して、"-q" オプションを指定しなかったとき、画面上にメッセージが現れるようにする。ファイル/ディレクトリが見付かったときはいつでも、次のコマンドを発するので、これは賢明な方法だと思う。


echo "touching $lists/" >$redir

これは、前述のように呼び出したttyに設定する。(/dev/tty1)???。しかし、"-q" フラッグを規定すると、$redir が"/dev/null" に等しくなって、メッセージは現れない。

コマンド行スイッチに関しては、getopts コマンドをうまく使った。詳細は man 1 touchrec を参照されたい。

マニュアルが書けるほどこれに関わった。単に tar.gz ファイルをダウンロードして、untarし、"install.sh" を走らせるとよい。"man touchrec" を参照されたい。役立つ筈だ。

 

・GNU find:有効性を見直し      始めに戻る

一体何人の人が、"<ALT><SHIFT><?>" の順でキイを叩きダイアログボックスを埋め必要なファイルを見出すためmc(夜間コマンダ)を使っただろう。誰もがすることだ。このダイアログボックスの全部はコマンド find(1) に対する受付だ。この記事は、このコマンド行ダイアログボックスから離れるのを助ける。mcの検索機能に悪いことはないけれども、複雑な検索に完全には役立たない。GNU find は、極めて強力なツールだ。

特定ファイル一つを見出す

findの最も普通の使い方は、ファイルの在り場所を知ることだ。通常、バイナリファイルであれば、コマンドwhichwhereを使って見出すが、etherh.cと言う名のファイルを探すにはどうするか?次のコマンドを発する:


cd /

find / -name etherh.c -print 2>/dev/null

ここで混乱してはいけない。findコマンドの構文は次の通りだ:


find {/path/} [name_of_file/expression] [options...]

だから、コマンドがおこなうことは、"/" (パーティションのブートディレクトリ)で始まり、etherh.cと言う名のファイルを検索し、見付かるとstdout に -print する。(この場合 2>/dev/nullは、エラーの宛先を変えて忘れる−−ここで使ったのは、私がユーザー root にいないからだ。私は確かに"/"からファイルを見る許可をもっているが、"/"は気にしない)

上の -name フラッグは、ここに示した用途だけではない。これは、検索するファイル名に対しシェルメタキャラクタを渡すことができる。この点は次の章で述べる。

kernelソースをインストールしていれば、このファイルは次の場所で見付かる筈だ:


/usr/src/linux/drivers/acorn/net/etherh.c


シェルメタキャラクタを使ってファイル名を見出す


検索するファイルの正確な名称が分かっていれば物事が簡単になる。だが正確な名所を知らないときは、どうするか?


その場合は、ワイルドカードを使うか、詳細に言うとシェルメタキャラクタを使う。次のような文字がある:


*

?

[]

{} -- [ 後で分かる世にこれらにはそれぞれの用途があるけれども]

極めて簡単に、次のようなものを試してみる:


find /usr/bin -name 'xa*' -print

これが返すのは、


/usr/bin/xargs

だ。目の鋭い人は、作用を含めて見出したことに気付かれただろう。

作用を含むFind

Findに対し見出したファイル上のプログラムを走らせることを命じることも出来る。これは極めて有用な機能で、何度も使うことになるの驚くだろう。

例えば$HOMEに沢山のファイルがあり、その中で、例えば "#!/bin/bash"の規則的表現を探したいとしよう。次のようにすることが出来る:


find $HOME -name '*' -print -depth -exec egrep -n '#!/bin/bash' {} \;

最後の部分の構文は、奇妙に見えるだろうが、起こっているのはフラッグ


-exec

が最初のコマンドを受け、次いで、走らせたとき、Findパラメータが返すカレントファイル名(それが規則的表現であっても、特定ファイル名であっても−この場合はすべてのファイル名(*))に対し拡張される括弧{}の続く追加オプション(この場合は、規則的表現)があればそれを受ける。バックスラッシュ (\;)でコマンドが終わる。、

したがって、短く言うと、構文は:


find -path -name {pattern/regex} -exec {name_of_program} [options] {} \;

となる。この原理を特定の型を見出すため使えると思う任意のコマンドに対し応用することが出来る。


特定の型を見出す

ここでもまた、Findは特定のファイル型を見出すのを楽にして呉れる。ここでは、


ls, test, find

の組合わせを使って同じことが出来ると考えるだろうが、分かり切ったことをもう一度する必要はない。例を示す:

find / -name '*' -print -depth -type d

-- これはディレクトリだけをプリントし、


find / -name '*' -print -depth -type f

-- これはファイルだけを見出し、


find / -name '*' -print -depth -type l

-- はシンボリックリンクだけを見出す。

例えば、トップレベル・ディレクトリだけで検索し下に行きたくないときは:


-maxdepth {number}

スイッチを使うことが出来る。例えば、$(pwd) -- (カレント作業ディレクトリ) を検索したいだけのときは:


find / -name '*' -type d -maxdepth 1 -print

とする。これは私のコンピュータ(ノート型)では下記を返す:


/

/lost+found

/boot

/proc

/var

/tmp

/etc

/sbin

/bin

/lib

/root

/usr

/cdrom

/floppy

/home

/mnt

/opt

/dev

/chess

/pavement

数字は、検索中に下ってゆきたいサブディレクトリの数を示す。

だが、楽しみはこの小記事に止まらない。find は、必要ないと思われる程多くのオプションを持っている。私が使い切っていないに過ぎないのだが。h

絶対にコマンド

man find


をチェックすること。


 


John M. Fiskとのインタビュー

[この雑誌の創刊し、ウィークエンドメカニックを始めたIJohn Fiskと、この記事の著者 Thomas Adamとの往復e−メール ] (新規技術なし)省略

 


終わりの時間


次回まで、お元気で。



著者紹介:Thomas Adam

Thomas Adamです。年は18才で、A-レベル (=大学入試)を勉強中です. イングランドのDorsetカウンティの農場に住んでいます。 Linux のファンで学校では Linux 代理人を助けました。Linuxを使って6年になります。Linuxを使わないときは、ピアノを弾いたり、散歩やサイクリングをしています。
Copyright © 2002, Thomas Adam.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 81 of Linux Gazette, August 2002
 
 
 
Alaプログラミングの手引き

By Thomas Adam

緒言

コンピュータに関して私は全く古風だった。GUIよりコマンド行で働かせるのを好む一人だった。私が習ったプログラミングがテキストの入出力だったのだから無理もない。AdaPerl, Bash, Sed, Awk, C, などと同様、例外ではない。

数年経って、Linux Gazetteで論じられるプログラム言語はほとんど無かった。Ben OkopnikがPerlBasについて二つの良い講義をおこない、他の人がSmalltalk, C++, Pythonなど別の言語の記述に貢献した。これから2−3ヶ月Adaでプログラムをする一連の記事を書く。

 

Adaとは?
Adaは元々米国政府(DoD)開発のプログラム言語だった。規格は元々Ada83として知られていたが、これはもう陳腐で、「総点検」の上最近Ada95として生まれ変わった。これがAdaプラグラム言語の好適規格として使われている。
1983年に、ANSIがAdaを規格化した。これで公式動議を始め、その年に第1版がリリースされた。4年経って1987年に、ISOが同等規格をリリースした。だがこの時は、所謂るOOP(オブジェクト指向プログラム)の考えは、一般的な概念ではなかった。
しかしAdaは、委員会では背計されなかった。元の設計は言語設計コンペに優勝したJean Ichbiahが完成した。次いで1995年に、Tucker Taft がデベロッパの小グループを率いてAda95が生まれた。前のバージョン(Ada83)と異なり、Ada95(時にAda9Xと言われる)の完成は、公開「ベンチマーク」テストを受けた。この言語の試験者が意見を述べ、構文及び辞書編集設計をもっと効果的にする指導をおこなった。
Ada の名は、世界最初のプログラマと思われるAda Loveless (1815-1852)と言う女性に由来する。Adaは、あらゆる種類の状況に用いられ、同時プログラム言語なので埋込システムに共通して使われる。Adaは以下の幾つかで使われている。
・航空機
・航空路管制システム
・金融システム
・電気通信システム
・医療装置

リストに記載されたものに限らない。

 

Adaコンパイラ

他の手書き言語(Perl, Bash, Python, tcsh, など)と異なり、AdaはCのように、インタープリートでなくコンパイルされる。これは、プログラムを走らせる人がそれを使うのにインタープリータを搭載する必要がないことを意味する。Adaプログラムは、Adaパケージを何もインストールしない独立型である。[プログラムをCのように他の言語と接続して使わない限り、この場合はライブラリを持っている筈だが、後でもっと追加する -- TA]

私の推薦するAdaコンパイラは、GNATと呼ばれる。これはGNU NYU (New York University) Ada Translatorの略だ。これは無料(GNUライセンス)で、これに関する沢山の情報がある。これは、Ada構文を押し込んだgcc コンパイラに基づいている。

これは、GNATコンパイラにリンクのある次のウエブサイトで入手することが出来る。

www.gnuada.org/alt.html

一つ注意がある。GNATとコンパイル済みバイナリ版をダウンロードし、.DEB .RPM .TGZ などに転換する必要のあるときはパケージ alien を使用されることを薦める。理由は、コンパイラをブートストラップするには gcc (gnatccと言うことが多い)のAdaバージョンが必要だからだ。GNATを初めてインストールするのであれば、ソースコードからのコンパイルは出来ないだろう。

そうは言っても、前に進んでダウンロードしたパケージをインストールする。GNATのRPMバージョンには、単一RPM: "GNAT-3.13p-7.rpm" がある筈だ。これに、この言語でプログラムを始めるのに必要な一切が含まれている。

 

AdaのIDE

Adaでプログラムを始める前に、IDE's (Integrated Development Environment統合開発環境)を幾らか知っておくのが良いと思う。これらは、次のような機能をにより特定の言語によるプログラムを助けるプログラムである。

・構文の強調
・コンパイラのサポート
・キイワードの定義
・所定のテンプレート

私が推薦する二つは:−

TIA (TIny Ada) −Adaで書かれGNAT使用を回って構築されたコンソールベースのIDE

GRASP −言語のうち、とりわけAdaをサポートする X11 IDE

EMACSファンのため、Glade と言う拡張がある。これは主GNATディストリビューションの一部としてインストールされている。これはGNATコンパイラ、構文強調、などををサポートするEMACS拡張である。詳細情報は、gnuada ウエブサイトで。

GNATを使いこなすには、IDEを使うのが必須ではない。私がコンソールにいるのであれば、代わりに jed を使い(これはAda構文強調をサポートしていないが)X11にいるのであれば Nedit する(これはAda構文強調をサポートしている)。

 
Adaの特徴
Ada95は、Ada83を大きく強化している。最大の改良はオブジェクト指向で、これは多くの人は有用と感じる。Adaの特徴の幾つかは:
・パケージ (モジュール)、関連型、オブジェクトを定義することが出来る
・パケージとデータ型を包括的にすることが出来る
・データ表現がシステムプログラミングをサポートする手段を与える
・オブジェクト指向プログラミングをサポート
・エラーを捕らえて明確に取り扱う
・タスク(多重平行スレッド)を作って使うことが出来る。この能力はAda95特有で他のほとんどの言語では稀れにしかない
・他の言語とのインターフェイス (C、フォートラン、COLBOLなど) を言語に含むことが出来る
・Adaは、テキスト及び機械的入出力の双方のため、データのをサポートする。その結果、Adaは複雑なシステムの執筆と維持に適している。

上に加えて次の特色もある:

・パケージ
・ファンクション
・プロシージャ
・タスク単位
・レコード
・アレー

その他多数....

 
Hello World!
ここで、最初のデータプログラムを書いて見る。由緒ある伝統にしたがって、 Hello World の例を書く。テキストエディタを開いて次のようにタイプする。
 
 with text_io;
 use text_io;

 procedure hello_world is 

 begin

  put("Hello World!");

 end hello_world;
 

易しいものだ。プログラムを走らせる前に、セーブする。だがそれには、正しい添字を付けなければならない。GNU/Linuxは規則として添字(ファイル拡張子)を何も必要としないが、AdaでプログラムをしGNATコンパイラを使うときは必須である。有効な拡張子は:

・.ads - Ada パケージ仕様
・.adb - Ada パケージ本体又はプログラム

パケージ以外のものを書くときは(暫くはおこなわない)、ファイル名に"adb"拡張子を加えなければならない。これは、コンパイルするファイルがプログラムでパケージ仕様でないことを、コンパイラに知らせるためである。

そこでファイルを hello_world.adb としてセーブする。

これでプログラムのコンパイル/構築の準備が出来た。これをしないとAdaプログラムを走らせることが出来ない。

ファイルをセーブしたディレクトリに変えて、次のコマンドを発する:


gnatmake hello_world.adb

これがAdaコードを、コンパイルし-> リンクし-> 構築して、コンパイル済みプログラムにする。

ここで:


./hello_world

とタイプすると:


hello world!

の応答が画面に現れ、プログラムから出る。

コマンドを発したとき次の出力が出たのに気付かれただろう:


gnatgcc -c hello_world.adb

gnatbind -x hello_world.ali

gnatlink hello_world.ali

望みなら、上のコマンドの各々を順にタイプしてプログラムを(それぞれ)コンパイル、バインド及びリンクすることが出来る。幸い gnatmake が立派な自動化をしてくれる。ここでディレクトリを覗くと、GNATが主プログラムと一緒に別のファイルも作っているのが分かる。それらは:

・hello_world.ali
・hello_world.o

.aliファイルは、主プログラムのためのデバッグとリンクに関する情報を含む GNATリンクファイルだ。

.o ファイルは、プログラム・デバッガ gdbと一緒に使うことの出来るオブジェクトファイルだ。

簡単に言うと、プログラムのデバッグを計画していない限り、これらのファイルは削除してよい:

 
説明:Hello World
Perlでは、print("Hello"); などのコマンド発することが出来るので、それが(she-bang行を除く)プログラム中の唯一の行でも、走る。
しかしAdaでは、VDUにステートメントをエコーするような最も簡単なコマンドであっても、実行する前に、使おうとするパケージを正確に命令しなければならない。 package は、特定のタスクを実行するファンクションとプロシージャのコレクションである。プログラム開始の際にこれらを明確に宣言しないと、GNATは、プログラムをコンパイルするに到ったとき、忽ち拒絶する。
したがって、スクリーンターミナルに入出力を読取書込したいときは、これを宣言しなければならない。入出力機能すべては、パケージ text_ioの中にあるので、我々のhello_world 例の最初の2行が決定的に重要である....。
 

  with text_io;

  use text_io;

Adaのwith ステートメントは、指定したパケージ、この場合は text_io、の使用を必要とすることを示す。パケージが一つ以上必要なときは、各パケージ名をコンマ(,)で区切って、追加することが出来る。終わったら、Prelと同じく行末にセミコロン(;)を追加しなければならない。with ステートメントは、プログラムを働かせるためプログラムの始めに、常に存在すべき強制コマンドである。

パケージtext_io は、既述のようにI/Oファンクション/プロシージャを与える。これには、ユーザーが入力などを入れることの出来る画面に対するプリントメッセージも含まれる。これは、Adaで書く各プロブラムで実質的に使用されるパケージである。

use ステートメントは、with ステートメントをした後にのみ、必ず使用しなければならない。これは、他のパケージからプロシージャ及びファンクションに対し無資格の問い合わせが出来るようにする。このステートメントを使わないと、プロシージャ又はファンクションに対する各呼出には、その前にそれが所属するパケージ名にペリオド(.)を付けたものを置かなければならない。例えば下記は、use ステートメントを使わなかったときのhello_worldプログラムの様子である。

with text_io;
 
 procedure hello_world is 

 begin

  text_io.put("Hello World!");

 end hello_world;
 

use ステートメントを使わないと、タイプしなければならない情報の量が増えるのが分かるだろう。同じプロシージャ又はファンクションを有する一つ以上のパケージを使うときコンパイラは、渡されたパラメータに基づいて引用するパケージを告げることが出来る。

3行目:

procedure hello_world is  

は、hello_world と言う名の新しいプロシージャを書くことを宣言する。ステートメント語is は、それに続けて、プロシージャの説明部分を開始することを告げる。

次のキイワード

begin

は、プロシージャの実行可能部分−つまり、すべてのステートメントが現れて実行される場所−を開始することを告げる。この場合は:

put("Hello World!")

で、プロシージャ put をパケージ text_io から呼び出して、メッセージ Hello World! を画面上にプリントする。

最後の行:

end hello_world;

は指定されたプロシージャを終わるだけだ。

簡単に言うと、Adaプログラムの基本構造は次のようになる:

with text_io;
use text_io;

procedure program_name is

   [ ここは宣言部分 ]

begin

   [ ここは実行可能部分 ] 

end program_name;

text_io の中にはまた、以下などのコマンドもある:

put

put_line

get

get_line

new_line

その他多数...

put は、これまで見たことをおこなう
put_lineput と同じことをおこなうが、新しい行を開始する
new_line は自分に発するコマンドで、新しい行を開始する。これを使うときは、次ぎのように、最後にセミコロンを置く:

new_line;

事実、セミコロン(;)の付いたステートメントは、Adaせ作る各コマンドに用いられる。

来月は、次の項目を見る:

・text_io ( get ステートメント経由のデータ入力)
・データ型
・単純算術表現
・列挙型
 
演習
これで今月分は終わり。説明が十分でなかったかも知れないが、全部を余すところなく説明するのは難しいので、少し自習をして頂く。

1. 自分の名を画面上にプリントする。

2. putnew_lineだけを使って、自分の住所を画面上にプリントする。

3. 今回は put_lineを用いて演習2を繰り返す。

私宛に送って下されば、この記事の次回分に掲載します。

この記事全部についてと同様、疑問、提案、お叱り、お褒め(苦情はお断り)は、通信されたい!!



with text_io, ada.integer_text_io;

use text_io, ada.integer_text_io;



procedure happy_programming is



loop_number : integer :=0;



begin



  while loop_number /= 10 loop

    loop_number := loop_number + 1;

    put("Happy Programming in Ada");

    new_line;

  end loop;



end happy_programming; 

 

著者紹介:Thomas Adam

Thomas Adamです。年は18才で、A-レベル (=大学入試)を勉強中です. イングランドのDorsetカウンティの農場に住んでいます。 Linux のファンで学校では Linux 代理人を助けました。Linuxを使って6年になります。Linuxを使わないときは、ピアノを弾いたり、散歩やサイクリングをしています。
Copyright © 2002, Thomas Adam.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 81 of Linux Gazette, August 2002
 
 
 
Office Linux:デスクトップディストリビューションに関するアイデア

By Matthias Arndt

緒言
数年前のLUGの会合を思い出す。Linuxとそのデスクトップに対する対応に付いて論じた。Linuxは少なくともソフトウエアに関する限りではデスクトップに対応していると意見が一致した。関連の事柄を論じたが、それでディストリビューションに付いて考えさせられた。
この記事では、エンドユーザー、特にセクレタリなど終日事務所にいる人のための、特殊デスクトップディストリビューションを提案したい。
GNU/Linuxの別のディストリビューションが必要な理由
考え方をまとめると:
SuSEDebianRed Hat などほとんどの現行ディストリビューションには利用出来るソフトウエアが沢山付いて来る。これには多くの利点があるが、新規ユーザーは混乱する。彼らは聞く「 ....をしたい。沢山のソフトウエアをCDからインストールした。だがどれを使ったら良いのだ? 」それなら、必要な仕事に合うパケージだけをインストールしたらどうだ。
・事務所及びエンドユーザ向けディストリビューションは、インストールが容易で管理が楽でなければならない。ユーザはバグを直したりコンフィギュレーションをいじったりしないで使用する。.
・少ないが折り紙付きのコンポーネントだけを含むディストリビューションの方が、使用を促進し易い。
Office Linux 宣言
Office Linux は、CD6枚にも膨れ上がったプログラム満載のディストリビューションでなく、GNU/Linuxを用いる生産性の高い環境を作るに必要なアプリケーションとツールをCD1枚に入れたものでなければならない。

Office Linux の要件は、

・事務所にあるような標準PCハードウエアで走る
・使用が簡単
・インストールが容易
・厳選されたアプリケーションと環境のみから構成される
・ CD1枚に入る
・更新が容易
・ワークステーション設定用に設計されている−単一サーバーアプリケーションは含まない
・任意選択開発パケージを含み、ユーザーがソフトウエアをコンパイルすることが出来る
・予定するユーザーが親しみを感じるような、M$ Windows &#8482に匹敵する標準外観を有する
・ワープロ、表計算ソフト、印刷ユティリティなど、事務所作業に必要なアプリケーションとツールすべてと一緒に来る。
・Linux 及びM$ サーバーへのネットワークが容易
・遠隔地からの管理が容易
Mozillaなど、規格適合インターネットソフトウエアを持つ
・ディスクのないワークステーションでもネットワークインストールが出来る

Office Linux は、無料ソフトウエアのみで構成することが出来るが、これは要件ではない。

裸のシステム
Office Linux は、 Linux kernelの厳選された安定バージョンとのみ来なければならない。kernelは、ネットワーク及びプリントなどのとき一般的に事務所ハードウエアをサポートするボックス外の標準ハードウエアを走らせる構成としなければならない。マルチメディアサポートは結構だが不要だ。
Bash、sed、awk、find などの GNU tools 標準セットは Office Linux に付いて来なければならない。しかし、Office Linux は、ツールの膨大なリストをユーザ又は信奉者に示してはならない。標準サブセットのインストールだけで十分だ。

Office Linux は、セクレタリや他の事務員に、コンソール用アプリケーションは沢山来ない筈だと強調する。エディタは一人か二人で十分だ。

デスクトップ環境
Office Linux は、使い易くなければならない。したがって厳選された安定な多分速度の速いデスクトップ環境が必要となる。The K Desktop Environment がこれに適合する。しかし、これは最速のソリューションではない。
Pro KDE Contra KDE

・使用が容易
・GNU/Linux コミュニティで有名で、良くサポートされている
・M$ Windows &#8482のような感じに構成することが出来る;
・ファイルマネージャとパネルのあるデスクトップ環境
・エンドユーザが容易にこ構成することが出来る
・完全に国際化されて来る

・立ち上げに膨大な時間を要する
・RAM 及びハードディスク双方に膨大なメモリ範囲






 

個人的にはKDE は好きでないが、Office Linux.用には推薦する。

オフィス生産性

これは重要な分野で、Office Linux はその名の通りこの分野に集中しなければならない。Star Office やOpenOffice のような、信頼性があって広く受け入れられた事務用一式を揃えなければならない。

予定ユーザが古いファイルを移植して再使用できるよう、M$ Office &#8482との互換性が必要である。この互換性は、外部ツールではなく事務用の一式を通じて達成されなければならない。GUIを備えるだけでなく、使い易くしなければならない。最悪の筋書きはコマンド行ツールのためGUIシェルを呼び出すことだ。

Office Linux 用にはKOffice を推薦しない。M$ Office &#8482; に似た一式よりも予定ユーザーの抵抗が大きいそうだからだ。f

ディストリビューションは、信頼性のあるPDF リーダーとコンバータを備えなければならない。Office Linux 用にインストールすることの出来る PDFプリンタは、多分良い考えだ。するとユーザは PDFを多くのアプリケーションからプリントすることが出来る。

ぷりんと・サブシステムは、SAMBA プリンタや標準Unix プリンタを含むあらゆる種類の既存ネットワークプリンタと通信することが出来なければならない。このサブシステムは、インストールと使用が容易でなければならない。BSDプリントシステムに似せてUnix慣習と互換性がなければならない。CUPSが良いソリューションなので、Office Linux にこれを使うことを推薦する。

インターネット

標準慣習インターネット一式もOffice Linux.の別の重要部分だ。
ここには良いプログラムが沢山あるけれども、Office Linux.はコンフィギュア済みで働く方法でのみ設けなければならない。安定な Mozilla リリースが、完全なインストールで Macromedia Flash及び Java VMなどの必要プラグインを有する。

セキュリテイに細工した規定値コンフィギュレーションを含まなければならない。

ヘルプ・システム
Office Linux を使い易くするには、使い易いヘルプシステムを含まなければならない。

このヘルプ・システムは次を備えていなければならない。

・新規ユーザのための指導
・デスクトップ環境に関する指導/ヘルプ・システム
・ソフトウエア・アプリケーションに対するアクセス
・ユーザが果たしたいタスクに応じたアプリケーション選択のためのウィザード
・ Unix コンセプトに対する一般的手引き
・インターネットセキュリティの案内書
・事務所用一式又はインターネットソフトウエアなどの主アプリケーションに関する規定値コンフィギュレーションをインストールするためのウィザード。

ヘルプシステムはHTMLで構成することを薦める

結言
これらの考えでディストリビューションを作ることは可能だと考える。労力と忍耐が必要だが不可能ではない筈だ。
少数だが厳選されたコンポーネントだけを備えたディストリビューションはM$ Windows &#8482;のように使い易い。それにGNU/Linuxはデスクトップに備えている。時間と、労力と、忍耐の問題だが可能だ。

著者紹介:Matthias Arndt

私は北ドイツの Linux ファンです。分かり易い古き50年代のロックンロール音楽、小説を書くことが好きです。Linux Gazette に書くことも勿論。今は経済との関連でコンピュータ科学を勉強中です。

 

Copyright © 2002, Matthias Arndt.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 81 of Linux Gazette, August 2002
 
 
 
Linux上でDVDを再生

By Tunji Durodola

読者の皆さん今日は
Tunji Durodola と申します。地球上で最も黒人の多い西アフリカのニジェールから書いています。
この記事の目的は、今ウエブ上で容易に手に入る一つ以上のツールを使ってLinuxでDVDが再生出来るようにする方法をお知らせすることです。DVD再生の基本が忽ち分かり、後の章で詳細を述べます。
序言
DVD鑑賞のキイは、暗号化された映画を解読するハードウエア又はソフトウエアの能力にある。DVDは、ディスクに含まれる内容の不法複写を防止するため、CSS(Content Scrambling System)と言うアルゴリズムを用いて暗号化されている。このアルゴリズムは、秘密ではないが、そのコピイを装置(ハードウエア又はソフトウエア)に取り込むには特許料を払ったで、アルゴリズムを他者に洩らさないとの契約書に署名しなければならない。
各DVDには、それぞれのドアを開けるには別のキイが要るように、それ自体のキイがある。キイ自体はWindowsで秘密に保たれている。
商業用Windows DVDプレーヤは、中にアルゴリズムを含んでいるが、そのソフトウエアに関する費用などとして支払を受けるか、又は購入するDVD装置の価格に埋め込まれているので、事実上、セットになったソフトウエアプレーヤの費用を払っている。
Linux全体の主義は自由であるが、Linux DVDが有料になると、この主義が壊される。所有主からアルゴリズムを手に入れようとした者もいるが、Windowsの人と同じ手続を踏まなければならないといけないといわれた。
DeCSS とは何かについて手掛かりのない人のため、簡単にまとめて見よう。
数年前、ある若者が、合法的に買った自分のDVDをLinuxで鑑賞したくなって、Linux用プレーヤを開発しようと思った。誰もいなかったとき、Xingと言う今は死んだWindowsのプレーヤの弱点に出会った。これはキイをプログラム自体の中に残すとの不幸な癖を持っていた。そこで、彼は自分の数学知識を使ってコードを模倣しアルゴリズムを作成した。
その仕事をするため彼の書いたソフトウエアは、DeCSSと呼ばれた。彼はそこで、数人の友人と、MORE(Masters Of Reverse Engineering )と言うチームを作って、Windows上でDVDリッパーを開発し、暗号化されていファイルを見るためLinuxベースのユティリティを開発した。
料金は取られなかったが、Linuxで自分のDVDを見たいとの同じ希望を持つ人のためネットに載せた。MPAAが見付け出され、続いて米国サイト全部がDeCSSを受け入れるのを禁止する裁判所命令を受けた。これは勿論、LinuxベースDVDプレーヤに対する世界中の関心を集めた。この事件は今でも、自由の国で係争中である。詳細な情報はここ here.をクリック。
今日では、Linuxで利用することの出来る別の解読ソフトウエアがあり、これは元のDeCSSコードを使っていないが、同じ仕事をし、法律には抵触しない。これらに重点を置く
そのもの!
諸君を暖めるだけのために、私の小屋で手に入れたシステムをお教えしよう

ハードウエア
CPU: Pentium III 750 (古いのは分かっている。Athlon XP 1900+にする予定)
RAM: 1GB PC 133 SDRAM (私が買ったとき、ramは安かった)
ボード: MSI BX マスター、
     IDE スロット4個 (2 個はオンボードPromiseコントローラ上)
ケース:ATX 拡張タワー型、スロット9 5.25 個
サウンド:SoundBlaster Live! 5.1 Platinum (良いカードだ!)
VGA: NVidia TNT2, 32MB SDRAM
HDD: 2x WD400 7200 RPM, 40GB ドライブ, 2MB キャッシュ(自慢の品)
スピーカ::80W Kenwood スピーカ、カードに直接接続した
        Technics 80Wパワーアンプで駆動
     :中級価格の20W RMS コンピュータスピーカ
     中央: 上に同じ
     サブ: 無銘柄 40W サブ、木製枠入り
モニタ:18" NEC TFT フラットパネル

ソフトウエア
OS: SuSE Linux 8.0 Professional
サウンド:ALSA 0.9.0rc2、emu10k1 SoundBlaster ドライバで働く。これは、SB Live 5.1のサラウンドの能力を使うことの出来る唯一のLinux用オーディオ。Windouwsのドライバとソフトウエアであってもこのドライバの機能の半分もない。Linuxドライバは、このカード8枚までを1システム上で扱う。Windowsは2枚を扱うことが出来ないない(心配ご無用、試してある)。ALSAチームに脱帽!
ビデオ
1.   Xine 0.9.12 (プラグイン能力を備え、Xineがビートし難くなるt)
2.   Ogle 0.8.2 (迅速なDVD専用プレーヤであって、DVDメニューをサポート)
3.   Mplayer 0.90 (一風変わったオプションの組合せを有する主としてコンソールベースのプレーヤ。Mplayer は、VOB, VIVO, ASF/WMV, QT/MOV, Xanim, AVI, DiVX, VCD, SVCDを含む今日利用することの出来るほとんど全部の型のファイルフォーマット及び勿論DVDを再生する。スキンの付いたGUIオプションを有する.)
Xine とMplayer は双方とも、全多重チャンネル(5.1)サラウンド・オーディオを提供する。

mplayerをコンパイルするには:
要件
libdvdread 0.8 及びlibcss (libdvdcssではない)
又は
libdvdread 0.9 及び libdvdcss 0.0.3 (libcss でもlibdvdcss 1.0でもない)
すべては、 www.dtek.chalmers.se/groups/dvdで入手することが出来る
libdvdcss はDVD を解読するため、libdvdread はその内容を読むため、及びチャプターサポートに使われる。
SoundBlaster Live! 5.1シリーズなどのモデモサウンドカードをお持ちなら、オーディオ用にALSA 0.9.0rc2を使うことを薦める。残念ながら私は持っていない。
すべてのパケージの INSTALLREADME ファイルを読むこと。

ステップ1
libdvdcss
./configure
"make && make install && ldconfig" を用いてこれをコンパイルしインストール
ステップ2
libdvdread
上の用にコンパイルしてインストール
ステップ3
mplayer 0.90
./configure -help
make && make install
これで自動的に、/usr/local/bin の中に mplayerとしてインストールされる
ステップ4
(a) /dev/hdc がdvd ドライブにあるときは、リンク ln -s /dev/hdc /dev/dvdを作る
(一度だけする必要がある)
mplayer -dvd 1 -ao ossとタイプする
ソフトウエアは、DVDに関する暗号化キイなどの情報を示し、次いで「暗号化」映画を再生する。
数億兆ものオプションがあって、ここで深く立ち入るには多過ぎるが、多チャンネルオーディオは、xをスピーカの個数2、4、6としてチャンネルxを用いて可能になる。基本2チャンネルカードを使っているとき、これは無意味であることに注意。これらの多チャンネルカードは今日無理なく買えて、甘やかすので、1枚だけにすること。

その他の有用なオプション:
-title x         - DVD タイトルの選択
-chapter y        - 上で規定した中でチャプタを選択
-ss hh:mm:ss       - 特定時点にジャンプ
-vcd x         - play vcd チャプタを再生
-channels 4 - 4 個の個別チャンネルを通じて再生 (前と後)
On-screen ディスプレーもまた利用出来るが、普通でないDVDサブタイトルは駄目
Mplayer は、その音節周囲音が大きいため、急速に最も広くダウンロードされるLinuxソフトウエアなった(信用出来ないならhttp://freshmeat.net/stats/#popularity を見よ)が、apps.0のコンパイルが嫌なら、設定はXineほど楽ではない。

5分丁度でXine を立ち上げて走らせる
ステップ 1
xineの最新版を xine.sourceforge.net からダウンロードする。
コンパイルが嫌いなら、次のRPMが必要になる。x86 は自分の Pentium プロセッサの型を意味する、Pentium III以上ならi686、Pentium 及びAMD K6ならばi586となる
xine-lib-0.9.12-x86.rpm;
xine-lib-0.9.12-oss-x86.rpm;
xine-lib-0.9.12-oggvorbis-x86.rpm;
xine-lib-0.9.12-xv.rpm;
xine-lib-0.9.12-x86.rpm
xine-ui-0.9.12-x86.rpm;
xine-lib-dvdnav-0.9.10-x86.rpm
他にもあるが、これらは最低限不可欠である
ステップ2
RPM全部を空のフォルダにコピイして、ルートとしてログインした場所から、次を走らせる
   rpm -Uvh xine*.rpm
コンソールを使うのが嫌なら、代わりにkpackage 又はgnorpmを呼び出してそれらをインストールする
ステップ3
GUIで、コンソールを開き(純粋にプレイヤからの出力を見るため、設定に満足したら、コンソールは必要ない)、次をタイプする(大文字小文字の別に注意すること)
xine -pq -A oss -V xv -u0 dvdnav://
暗号のように見えるが、説明は簡単だ。このスイッチの目的は、自分のフォルダの
".xine/config" に記憶されたconfig ファイルに
オーディオとビデオに規定値を設定することだ。
-pq は、直ちに再生して、終わったら切る。
-A oss は、oss をオーディオ・ドライバとして使う。
-V xv は、xv をビデオ・ドライバとして使う。
-u0 は、は第一サブタイトルを選ぶ(通常は英語、u1 はフランス語を意味するなど)
dvdnav:// は、実際にDVDを演奏する任意選択のプラグインである。これはまた、メニュー機能も持っており、数字キイボードの9/3を用いて、チャプタからチャプタに飛ぶことが出来る。
詳細は "xine --help" とするか、又はxine マニュアルにある。
前に言ったように、メニューでskinが変わる。多チャンネルオーディオを始めとするすべての設定がメニューで出来る。
Xine は、あらゆる種類のメディア:DVD、VCD、 CD、ogg、mp3、wav、DiVX... などなどを再生する。

URL
xine: xine.sourceforge.net
ogle: www.dtek.chalmers.se/groups/dvd
mplayer: www.mplayerhq.hu/homepage
ALSA: http://www.alsa-project.org/
xinedvdnav プラグイン(DVDの解読には、DVDメニューを用いる):
   http://dvd.sourceforge.net/d
近いうちに、ヒントや秘訣など詳細をお知らせしたいと思う。
また後で

著者紹介:Tunji Durodola
Tunji は、ラゴスに事務所を置くコンサルタントでLinuxソリューションを専門とする。
Copyright © 2002, Tunji Durodola.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 81 of Linux Gazette, August 2002
 
 
 
メモリは異常でないか?

By Madhu M Kurup

目的
この記事の目的はメモリリーク検出を理解して頂き、現在利用出来るツールの概略を述べることにある。また、各種ツールのうち自分の必要に合ったものを選ぶことが出来るに十分な知識を提供することにある。
リークと計算
ここでは配線ではなくソフトウエアが対象だ。大型で、些細ではないプログラムには、メモリやリークの問題を持つとの宿命がある。
問題の起こる場合
第一に、リークなどのメモリ問題が起こらない言語がある。これらの言語は、メモリ管理は重要なので、その言語のユーザが絶対に扱ってはならないと考えている。それは言語設計者が扱うのが良い。このような言語の例は、Perl、Javaなどである。
しかしその他の言語(とりわけCとC++)では、言語設計者がメモリ管理は重要なので、言語のユーザーが面倒を見なければならないと感じている。リークは、メモリを動的に割り当てた後、それを戻すのを忘れたとき起こると言われている。プログラマがメモリを自分で管理するとき、リークに加えて、他のメモリ問題、buffer overflows, dangling pointersなど、もまた起こる。これらの問題は、プログラムが考えるメモリ状態と、その反対の実際の状態との間に不一致がある場合に起こる。
何が問題か?
コンパイルの時サイズの分からないデータを、プログラムが扱えるようにするためには、プログラムがランタイム環境(OS)にメモリを要求する必要がある。しかし、メモリの塊りを受け取って、使用の後、プログラムが環境に返さないことがある。入手したブロックのアドレスを失ったときは、もっと状態が厳しくなり、割り当てられたメモリの識別が最早不可能になる。別の問題としては、戻した後にそのメモリにアクセスしようとすること(dangling pointers)がある。普通に起こる別の問題は、元々要求したよりも大きいメモリにアクセスしようとすること(buffer overflow)などである。
これらの問題で悩まされる理由
リークは、短時間で作業を終わる短命のプログラムに関しては問題でない。残念乍ら、多くのプログラムは、長時間に渡り終わることなく機能する設計となっている。良い例は、 現在君達にこのペイジを提供しているApache ウエブサーバーだ。このような場合、多機能の漏れやすいプログラムでは、システムにメモリを要求し続けて、返すことをしない。
その結果、システムのメモリがなくなって、そのマシン上で走るプログラム全部が喘ぐことになる。これは明らかに良くないことだ。プログラムが多くのメモリを要求するのに加えて、リークもまたプログラムの動きを遅くする。メモリロードが増すと、プログラムのコンテキストスイッチ・イン及びアウトの速度が落ちることがある。マシンの機能停止を起こすほど厳しくはないが、マシン上での過剰なメモリロードは、データをあちこち行き来させてマシンが、のた打ち回る。
Dangling pointers は、極めて異常で、隠れており解決が困難な、微かな変造とバグをおこすことがある。Buffer overflowは、メモリ問題の三つの形のうち多分最も危険なものであろう。これは、既に読んだ[SEC]ほとんどのセキュリティ問題を引き出す。上述の問題に加えて、メモリの同じ塊を何度もシステムに返すこともある。これは明らかに、プログラムエラーを示す。プログラマは、バグを見出して対策を講じるため、プログラムの寿命ぜんたいに渡ってメモリ要求の様子を調べることとなる
これらの問題への対抗策
メモリ問題に対抗するには、ランタイム機構がある。リークは、防御プログラム[OOM].を周期的に停止して再スタートすることにより解決することが出来る。Dangling pointers は、OS戻されるメモリすべてをゼロにすることにより、反復可能にすることが出来る。Buffer overflows は、各種の解決策があるが、その幾つかを詳細にここで述べる。
一般的に、ランタイム又は開発の終期にこれらの問題に対抗するのは、労力が大きいので、プログラムの段階で問題を見付けて修正するのが最も適切な解決策である。

オープンソース
GCCベースの代案
今の gcc ツールセットには、多くのメモリ問題の検出と排除を容易にするゴミ集め(garbage collector)が含まれている。これらをリークの検出に使うことは出来るけれども、これを作った主要目的は、良いゴミ集め[GC]だった。この作業は、HPの Hans-J. Boehm が指導している。
技術
ここで使う技術は、割り当てメモリを常に追跡するBoehm-Demers-Weiser 技術である。メモリ割当は、標準メモリ割当ファンクションのアルゴリズム版を用いておこなう。次いでプログラムをこれらファンクションとともにコンパイルするので、実行のとき、アルゴリズムがプログラムの行動を監視することが出来る。このアルゴリズムは仲々有名で、良く理解されている。スレッドセーフにすることも、多プロセッサシステムに増倍することも出来る。
性能
予想通りの速度低下を伴う良い性能だ。コードは極めて移植可能で、gccを用いて直接入手することが出来る。gccと一緒に渡されるバージョンは、少し古いが、更新することが出来る。
インターフェイスはない−これは使用が難しく、有用にするためには大変な労力が必要だ。既存システムには、このコンパイラ構成がないので、働かせるには追加の作業を必要とする。加えて、呼出を捕らえるにためは、メモリ呼出すべて(malloc() 及びfree()など )を、ゴミ集めを備えた環境で置き換えなければならない。マクロを使うことも出来るが、融通性に欠ける。また、この方法は、メモリの恩恵を受ける部分すべてに関するソースコードが、実際のファンクションから提供されたものに移る能力を持つことを暗黙のうちに要求する。
判定
関係ソース全体のコントロールを有する多重プラットホーム(アーキテクチャ、OS)に渡るソリューションを必要とするときは、これがそれになる。
Memprof
Memprof は、Red HatのOwen Talyor が作った、使い易く魅力的なパケージである。このツールは、Boehm-Demers-Weiserゴミ集めに対する綺麗なGNOMEフロントエンドである。
技術
利点の重要部分で、memprofは上述のツールセットと変わらない。しかし、これがその機能を実行する方法は、プログラムからのメモリ要求すべてを捕らえて、ランタイムに、ゴミ集めに対し向け直すことである。スレッド及び多重プロセッサ上ではgcc代案のように機能的ではないけれども、起こったときプログラムに分岐にしたがうことを要求することが出来る。
性能
このツールの性能はとても良い。GUIの設計が良く、応答が早く情報が多い。このツールは、実行可能プログラムで直接働くので、ソースに変更を加える必要なしで働く。このツールはまた、プログラムが実行するときメモリプロフィールをグラフィックで示すので、プログラムの寿命の間のメモリを要求を理解するのに役立つ。
このツールは現在、Linux上のx86及びPPCアーキテクチャ用にだけ利用することが出来る。他のプラットホーム上で助けが必要なときは、別のものを探す必要がある。このツールはGTKアプリケーションではない。これは、本格的なGNOME環境を必要とする。これは何処ででも満足されるとは限らない。最後に、このツール上での開発は、静的(暫くはバージョン0.4.1.)であると思われる。要求されたことをうまくおこなうことは出来るけれども、このツールにリーク検出だけ以上のことが出来るとは思えない。
判定
GUIツールがお好みでGNOME及びLinuxを気にしないなら、これが適している。
Valgrind
Valgrindは、メモリ問題全体の解決を試みるプログラムである。リークは、そのうち一つに過ぎない。このツールは、(bzip2cacheprof で有名な) Julian Seward の作品である。自ら「x86 linux用オープンソース・メモリデバッガ」と称しおり、確かに額面通りだ。加えて、GPUキャッシュの輪郭を書くことが出来、このようなものは全く有用だ。
技術
このプログラムで使われている技術は、全く複雑でうまく文書化されているwell documented。プログラムが割り当てたメモリの各バイトを、九つのステータスビットが追跡し、これらを運営目的に使って、何が進んでいるかを識別する。実行プログラムのメモリロードが非常な勢いで増加する代償として、このツールは、遙かに多くのチェックを可能にする。読取・書込のすべてが傍受されるので、CPUの各種Lキャッシュのキャッシュプロフィーリングもまたおこなうことが出来る。
性能
このツールは、明らかな理由で、ここで詳細説明したもののうち最も遅かった。しかし、速度低下の代わりに、このツールが与える情報は三つのうちで最も詳しい。通常の疑いに加えて、このツールは各種の他のメモリ及びある種のPOSLX pthread 問題さえも識別する。キャッシュ情報は多分ほとんどのアプリケーションを過剰に殺すだろうが、アプリケーションの性能を見るのには面白い方法だ。Valgrind最大の利益は、専門積極的開発者及び積極的なコミュニティにより急速に発展していることだ。事実、Valgrindのウェブペイジは、著者からの次の宣言を載せている「Valgrindについて問題があったら、黙っていないでメールを下さい」
このツールはしかし、x86に傾き過ぎている。多分x86Linuxに限られるだろう。インターフェイスは純粋にコマンド行駆動で、役立つには多すぎる過ぎる情報を呉れることがある。このツールはまた、直接バイナリでも働くので、再コンパイルが不要な一方で、自分が探しているものを見付けるにはこのツールの出力全部を見る労力が必要になる。抑制ファイルを作って各種システムライブラリに関するメモリプロフィーリングを抑制することが出来るが、これらのファイルを書くのは容易でない。加えて、このツールはMozilla、OpenOffice及び同様の大型スレッドプログラムで使われたに拘わらず、スレッドのサポートが完全でない。このツールがGUIフロントエンドを持っていると、文句なしに勝つだろう。
判定
x86を使っていて、コードが良く判っており、CLIインターフェイスを気にしないなら、このプログラムでレベルが上がるだろう。

その他のオープンソース・ツール
皆様の好みのツールを述べなかった罰を受ける前に、これら三つを、それらが提供するデータの点で比較したものはないことを認めなければならない。もっと包括的なリーク検出ツールはここ here. で入手することが出来る。

市販のもの
これらのツールは完全性だけの目的でここに述べる
Purify
メモリツールの親方 big daddy だ。Linuxでは働かない 、ので質問は止めた方が良い。

Geodesic
この分野に遅れて参入したGeodesic は、そのツールを使ってMozillaコードべースでのメモリ問題発見を助けた、Mozilla デモのお陰でLinux社会で良く知られている。Mozillaチームがこれをどれだけ使ったかは、未だ計られていないが、これがオープンソースに馴染むことは損なわれない。完全な機能テストでSolaris/Linuxのため働く、Windowsでも働く。
Insure++
C++専用のツールだが、大変有名だ。Parasoftの Insure++ は、全く完全なメモリプロフィーリング/リーク検出ツールだ。加えて、C++特有のエラーも検出するので傷つけられない。このツールは各種のコンパイラやOSで働く。無料体験版も利用出来る。
 
雑件:
確実なプログラミング
確実なプログラミングには沢山の成分が含まれるが、最も重要なのは、メモリの慎重な使用である。詳細はここhere
OOMキラー
新しいLinux kernelのいくつかは、メモリ超過(OOM)キラーとして知られるアルゴリズムを採用する。このコードは、kernelが完全にメモリをはみ出したとき呼び出される。その時、働くプログラム/プロセスが選ばれて実行される。詳細はここ、here.。
ゴミ集め
ゴミ集めが、好ましいソリューションであると限らないのは、実行が難しいからだ。ここでhere.適切に説明されているように、セルフリファレンシアル構造(つまり、自分自身にリンクする構造)に伴う難しい問題を持っているからだ。
 

著者紹介:Madhu M Kurup

私は、インドのBangaloreから来た CS エンジニヤで ILUG Bangalore の家族である。暫くはLinuxで作業をして遊んでいたが.プログラム作成が第一に好きなことである。Linuxは、その次だ。私は Yahoo! 社でデータ発掘の仕事し、そこでアルゴリズム、拡張性及びAPIの仕事をした。Linuxメッセンジャクライアントの内職をし、暇があると(いつもだが)各種ソフトウエアプロジェクトを囓っている。

そして、C++, vi, mutt, Windowmaker、Mandrake を使っている。論争しましょう。

 
Copyright © 2002, Madhu M Kurup.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 81 of Linux Gazette, August 2002
 
 
 
Perlモジュールの探検−パート1:
GDを用いるオンザフライ・グラフィック

By Pradeep Padala

 

「Perlモジュールの探検」へようこそ!!

Perlモジュールは、Perl成功の最強力なものの一つと考えられている。これらは、再使用可能なコードを沢山含んでおり、勿論無料である。これは掘出物を見付ける試みである。CGI、DBI などについての講義や書物は沢山ある。余り有名でないモジュールについては、ユーザは、曖昧で時には不完全な文書だけで放置されている。

この一連の記事で、余り有名でないが有用なモジュールを説明する積もりだ。昨年中、沢山のPerlモジュールに出会ってプログラムした。私の経験から沢山の有用な例を用いてこのモジュールを説明する。一度に一つのモジュールを取り上げて各種用途を探検する。

先ず読むべきもの

さて、先ずPerlを知らなければならない。Perlの基本を徹底的に調査する。Perlについては沢山の文章、記事、書物がある。初心者には Learning Perl が推薦されることが多い。経験を積んだらProgramming Perl.に取り組むことが出来る。

平均的Perlプログラマで余り多くのモジュールを使っていなければ、ここが最適の場所だ。モジュールは、コードを再使用して、効率的で小型のアプリケーションを書く沢山の方法を提供する。各記事は、簡単な例から複雑な例に段階を追って進み、然るべき場合には実世界のアプリケーションで終わる。

モジュールの紹介

モジュールはコードを移植して利用するため効率の良い機構を与える。次の行が、モジュールを移植して、アクセスすることの出来るファンクションにする。


    use module;

例えばGDを使いたいときは、次のように書く:

    use GD;


モジュールの発見とインストール


プログラムの詳細に入る前に、モジュールの発見とインストールに関する指針を示す。各種のモジュールを使うが、そのほとんどは規定値ではインストールされていない。ある種のモジュールはインストールされていないこともあるライブラリを必要とする。然るべき場合にはいつでも必要な事項を述べる。モジュールのダウンロードとインストールに必要な一般的事項を示す。


モジュールをインストールする簡単な方法は、CPANを使うことである。会話モードで次のようにCPANを走らせる。


    perl -MCPAN -e shell

これで、モジュールのダウンロード、解凍、インストールなど色々の課題をおこなうことが出来る。例えば、GDをインストールするには、次を使う。


    install GD

私のように、configure, make, make install methodに慣れた人なら、次のステップでモジュールをインストールする。

・全モジュールのCPANの list でモジュールを見付け出す
・モジュールの最新版をダウンロードする。例えば、最新GDモジュールは、次ぎの場所からダウンロードするhttp://www.cpan.org/authors/id/LDS/GD-1.40.tar.gz
・モジュールをunzip する

    tar zxvf GD-1.40.tar.gz

・モジュールを構築する

    perl Makefile.PL 

        (又は)

    perl Makefile.PL PREFIX=/my/perl/directory 

        (/my/perl/directoryにインストールしたいとき)

    make

    make test (オプション)

・Install the module

    make install

準備完了…

好きなモジュールをインストールしたので、準備は完了した。この記事では、GDモジュールを探検する。これは GD libraryへのインターフェイスを与える。ウエブインターフェイス用にCGIモジュールもまた使用する。この記事を理解するのにCGIについて多くを知る必要はない。必要なときは説明を加える。

GDを用いるグラフィック

簡単で効果的な例から始めよう。

ファイルのテキスト版はここにある here.

#!/usr/local/bin/perl -w

# 上の行を自分の実際のperl バイナリへのパスに変更binary

use GD;

# 新しいイメージを作る
$im = new GD::Image(100,100);

# 何か色を割り当てる
$white = $im->colorAllocate(255,255,255);
$black = $im->colorAllocate(0,0,0);
$red = $im->colorAllocate(255,0,0);
$blue = $im->colorAllocate(0,0,255);

# 背景を透明でインターレースにする
$im->transparent($white);
$im->interlaced('true');

# 絵の周りに黒枠を置く
$im->rectangle(0,0,99,99,$black);

# 青い楕円を描く
$im->arc(50,50,95,75,0,360,$blue);

# その中を赤で満たす
$im->fill(50,50,$red);

# 書込用ファイルを開く
open(PICTURE, ">picture.png") or die("Cannot open file for writing");

# バイナリ・ストリームで書くことを確認
binmode PICTURE;

# イメージをPNGに転換して、ファイルPICTUREにプリントする
print PICTURE $im->png;
close PICTURE;

これは、GD man page に示された例に少し変更を加えたものである。この手順は、境界が青色の赤い楕円形を持つ小さい四角を作る。プログラムを分析しよう。.

GD ライブラリを使って先ずおこなうことは、それを使って作業を扱うイメージを作ることだ。次の行


    $im = new GD::Image($width, $height)

が、規定の幅と高さを持つイメージを作る。既存イメージからイメージを作ることも出来る。既存イメージを扱うのは役に立つ。その例は、この記事の後の部分で示す。

次ぎに、色を割り当てなければならない。予想されるように、色を初期化するにはRGB強度を指定しなければならない。沢山の色を使うので、使用のため、一団の色を初期化する小さいファンクションを書こう。


ファイルのテキスト版はここにあるhere.

# これをinit_colors.pl としてセーブする

# 他のスクリプトがこのファンクションを呼び出す



sub InitColors {

    my($im) = $_[0];

    # 色を割り当てる

    $white = $im->colorAllocate(255,255,255);

    $black = $im->colorAllocate(0,0,0);

    $red = $im->colorAllocate(255,0,0);

    $blue = $im->colorAllocate(0,0,255);

    $green = $im->colorAllocate(0, 255, 0);



    $brown = $im->colorAllocate(255, 0x99, 0);

    $violet = $im->colorAllocate(255, 0, 255);

    $yellow = $im->colorAllocate(255, 255, 0);

}

素晴らしいrgb組合せのため何度もこの page を引用する。

次の数行は、簡単なので自明であろう。ファイル作成に関する最後の行には、特別の説明が必要だ。ファイルにイメージを書こうとしているので、次を用いてファイルハンドルを置く必要がある


    binmode MYFILEHANDLE;

これは、実際にはほとんどのUNIX様システムでno-op(操作不能)である。

次いで、通常のプリントコマンドを用いてファイルに書き込む。GDはイメージを各種のフォーマットでプリントすることが出来る。例えば、pngでなくjpegでプリントしたいとき必要なのは、次のようにすることだけである。


    print MYFILEHANDLE $im->jpeg;


簡単な描画


GDは、描画原始技法を幾つか提供し、これを組み合わせて複雑なグラフィックスを作ることが出来る。以下のスクリプトを調べると、これら簡単な原始技法を、大急ぎで掴むことができる。


ファイルのテキスト版はここにあるhere.

#!/usr/local/bin/perl

# 上の行を自分のPerlバイナリへのパスに変更



use GD;

do "init_colors.pl";



# 新しいイメージを作る

$im = new GD::Image(640,400);



# 何か色を割り当てる

&InitColors($im);



# 背景を透明でインターレースにする

$im->transparent($white);

$im->interlaced('true');



$x1 = 10;

$y1 = 10;

$x2 = 200;

$y2 = 200;



# 境界を描く

$im->rectangle(0, 0, 639, 399, $black);

# 直線

$im->line($x1,$y1,$x2,$y2,$red);

# 点線

$im->dashedLine($x1 + 100, $y1, $x2, $y2, $blue);

# 長方形を描く

$im->rectangle($x1 + 200, $y1, $x2 + 200, $y2, $green);

# 塗りつぶし長方形

$im->filledRectangle($x1 + 400, $y1, $x2 + 400, $y2, $brown);

# 円

$im->arc($x1 + 100, $y1 + 200 + 100, 50, 50, 0, 360, $violet);



# 多角形

# 多角形を作る

$poly = new GD::Polygon;

$poly->addPt($x1 + 200, $y1 + 200);

$poly->addPt($x1 + 250, $y1 + 230);

$poly->addPt($x1 + 300, $y1 + 310);

$poly->addPt($x1 + 400, $y1 + 300);

# それを描く

$im->polygon($poly, $yellow);



# 書込用ファイルを開く

open(PICTURE, ">picture.png") or die("Cannot open file for writing");



# バイナリ・ストリームで書くことを確認

binmode PICTURE;



# イメージをPNG に転換してファイルPICTUREにプリント

print PICTURE $im->png;

close PICTURE;

出力はこのようになる this

上のスクリプトは自明だ。多角形は少し説明を要する。多角形を描くためには、先ず多角形を作ってから描く。多角形には、勿論、最低三つの頂点がなければならない。

テキストを書く

そこで、テキストに付いて。テキストは、GDが提供する簡単なフォントの幾つかで、又は自分のシステムで利用出来るTrue Type フォントを使って書くことが出来る。テキストを書くのに利用することの出来る簡単なファンクション二つを示す。


    # テキストを書く

    $im->string($font, $x, $y, $string, $color);



    # 90度回転したテキストを書く

    $im->stringUp($font, $x, $y, $string, $color);



以下のスクリプトは、GDが提供する簡単な各種フォントを示す。T

ファイルのテキスト版はここにあるhere。

#!/usr/local/bin/perl

# 上の行を自分のPerlバイナリへのパスに変更



use GD;

do "init_colors.pl";



# 新しいイメージを作る

$im = new GD::Image(200, 80);



# 何か色を割り当てる

&InitColors($im);



# 背景を透明でインターレースにする

$im->transparent($white);

$im->interlaced('true');



# イメージを囲む教会を作る

$im->rectangle(0, 0, 199, 79, $black);

$x1 = 2;

$y1 = 2;



# 小フォントでテキストを書く

$im->string(gdSmallFont, $x1, $y1, "Small font", $blue);

$im->string(gdMediumBoldFont, $x1, $y1 + 20, "Medium Bold Font", $green);

$im->string(gdLargeFont, $x1, $y1 + 40, "Large font", $red);

$im->string(gdGiantFont, $x1, $y1 + 60, "Giant font", $black);



# 書込用ファイルを開く

open(PICTURE, ">picture.png") or die("Cannot open file for writing");



# バイナリ・ストリームで書くことを確認

binmode PICTURE;



#イメージをPNG に転換してファイルPICTUREにプリント

print PICTURE $im->png;

close PICTURE;

この出力画は次のようになる。
Output image of above script

ご覧の通り、これらのフォントは極めて限られており余り魅力的でない。次の章でCDとともにTrue Type Fonts を使う方法を示す。

True Type Fonts

自分のシステムで利用することの出来るTrue Type Fontsを使って素晴らしいテキストを書くことが出来る。TTFフォントを描くにはファンクション stringFT を用いる。


    # $fontname は、TrueType fontに対する絶対又は相対パスである。

    stringFT($fgcolor,$fgcolor,$fontname,$ptsize,$angle,$x,$y,$string);

利用法を示すサンプルを示す


ファイルのテキスト版はここにあるhere。

#!/usr/local/bin/perl

# 上の行を自分のPerlバイナリへのパスに変更



use GD;

do "init_colors.pl";




# 新しいイメージを作る

$im = new GD::Image(270, 80);



# 何か色を割り当てる

&InitColors($im);



# 背景を透明でインターレースにする

$im->transparent($white);

$im->interlaced('true');



$im->rectangle(0, 0, 269, 79, $black);



$x1 = 10;

$y1 = 20;



# TTF フォントでテキストを描く

$font = "/usr/X11R6/lib/X11/fonts/TTF/luxisri.ttf";

$im->stringFT($red, $font, 15, 0, $x1, $y1, "A TTF font");



$anotherfont = "/usr/share/fonts/default/TrueType/starbats.ttf";

$im->stringFT($blue, $font, 20, 0, $x1, $y1 + 40, "Another one here !!!");



# 書込用ファイルを開く

open(PICTURE, ">picture.png") or die("Cannot open file for writing");



# バイナリ・ストリームで書くことを確認

binmode PICTURE;



# イメージをPNG に転換してファイルPICTUREにプリント

print PICTURE $im->png;

close PICTURE;

出力は次のようになる.
Output image for above script

オンラインに行こう

GDの基本的用法が判ったところで、ウエブグラフィックスに目を向けよう。そこで、CGIを通じてイメージを出力する方法だ。次の行を、ファイルへのプリントの代わりに、スクリプトに付け加える。


    # イメージ内容のバッファリングを働かなくする

    select(STDOUT);

    $| = 1;

    undef $/;



    print "Content-type: image/jpeg\n\n";

    print $im->jpeg(100);

今のところ、これがCGIについて知る必要のあることの全部だ。CGIを既にご存じなら、コードを強化して複雑なウエブ相互作用を扱うことが出来る。小さなプログラムを書いて、イメージを読み込ませた上そのサイズを変えて表示させよう。これはサムネイルを示すのに役立つ。


ファイルのテキスト版はここにある here.

#!/usr/local/bin/perl -wT

# 上の行を自分のPerlバイナリへのパスに変更



use CGI ':standard';

use GD;



# 新しいイメージを作る

$image_file = "images/surfing.jpg";

$im = GD::Image->newFromJpeg($image_file);

($width, $height) = $im->getBounds();

$newwidth = $width / 3;

$newheight = $height / 3;

$outim = new GD::Image($newwidth, $newheight);



# 背景を透明でインターレースにする

$outim->copyResized($im, 0, 0, 0, 0, $newwidth, $