Linux Gazette 2003年4月号 #89
今月のLinux Gazette の主な記事
n今月のニュース
 ・法制化
 ・一般ニュース
 ・ディストリビューション関連ニュース
 ・ソフトウエア及び製品関連ニュース
n Laurel と Hardy が Cプログラムを書こうとする
n XSLT を使う作業
n Debian GNU/Linuxn を用いるセキュリティ管理
n 健康改善のための共同体Linux Extranet
n 今月のPerlワンライナ:四月は悲惨な月だ
n メッセージ待ち行列の調査:パート1
n 復活祭の卵
n Linux スケジューラ
n Linuxでワークステーションを複製
 
(訳者注)
原文を一括して一つのファイルでセーブするには、下記のリンクがあります。
TWDT 1 (gzipped text file)
TWDT 2 (HTML file)
前者はテキスト形式で、後者はHTML形式です。但し、HTML版のリンクが働くとは限りません。
 
 
 
今月のニュース
▼▼▼ 法制化 ▼▼▼
 
Jon Johensen が再度法廷へ
DeCSS コンピュータ・コードの作成と販売に係わった咎でJon Johansen が再度法廷に呼び出されることとなったと報じられた has been reported [The Register] 。周知のように、DeCSS コードは、DVD映画を買った人が自分の環境でそれを楽しむのを妨害するためDVD作成者が使用する秘密技術を回避するため使われる。ノルウエイ検事は、このような方法でDVDを再生するのは、誰かのウエブサーバに押し入るのと同じ、窃盗の形であるとした。規則はJohensenに有利であったが、上告のため猶予が与えられたので、夏にはもう一度事件を繰り返さなければならない。
この事件がこのように遅れたので、Jonが年を取って大衆の人気がなくなるのを検事が待っているのではないかと疑う者がいる。Jonは19才なので、「悩めるティーンエイジャ」のうたい文句には自ずから期限がある。

Lexmark とDMCA
インク・カートリッジの再使用を禁止しようとするLexmarkの企みが、環境に優しい製品を作っている会社に対し差し止め命令が発せられて、奇怪な後押しを受けた received an unsettling boost 。SCCは、Lexmark に対し独禁法を持ち出して反撃したhit back 。事件の解決には程遠いが、DMCAの策謀が見え隠れする。Wiredは(言葉の問題でなく本当の可能性の問題として)自動車製造者が重要部品全部にコンピュータチップを埋め込んだら、保守費用は一体どの位になるだろうかと、質問したasked the question

誰にも言ってはいけないが、 Linux Gazette はユーザの中に、内容へのアクセスと管理するため使っている暗号CRT/LCDを回避して、時々記事をプリントする人がいるのではないかと長い間疑っていた。我々の弁護士は訴訟の準備をしているが、この回避の企みにLexmark プリンタが使われているらしい。これらDMCAの資金を貰おうか。

LifeはRosenの寝床ではない
RIAAHilary Rosen が、P2Pネットワークの問題をまた論じている。Hilaryが長い間探していたEdith PiafKnees Up Mother Brown を歌った録音を見つけ出すのに、息子のTristram が成功したらしい。長い間探した音を聞いてHilaryは感激したけれども、Tristram が厄介な著作権問題をダウンロードして再生する前にキチンとしておかなかったので、感激が苦痛に変わった。 Hilaryは沈んだ気持ちで警察に電話してTristram を逮捕させた。

「息子に辛い思いをさせるのは悲しいが、彼の犯罪行為をしたのに較べれば何でもない。私はアメリカと世界の親達全部の模範になりたい。息子のしたことは卑劣な行為だ。息子は可愛いが、音楽産業を脅かした罪は償うべきだ。

さらに問いつめられたとき彼女は、別の歌手の歌詞「ちっとも後悔しない」を引用して答えた。彼女が歌詞を使う許可を得ていたか否かは詳らかでない。

SCO と IBM
インターネットのLinuxニュースサイトを見ておられれば、前はCaldera と云った会社SCOがIBMを訴えた sued IBM. のを、ご存じだろう。続いてSOCが最高級の法律専門家を雇うのでは、との憶測が数週間飛びかった。この進展には解説や論評が沢山あるので、ここで事件の詳細は述べない。Linux Weekly Newsには、主張の本質を鋭く突いた概説と論評 good overview and discussion がある。主な争点は、Linux環境の利益になるSCO所有の知的財産から取ったUNIX技術の知識を、IBMが使ったと言うものだ。これは、IBMが市販UNIXと埋込Linuxを殺そうとしたものだと言われているが、これらの主張が基づく「事実」についての論争 some debate を見ると、少し疑うのが普通だろう。Linux Journal のDoc Searls もまた説得力のある解析 cogently analysed the story, をしており、この処置で、SCOはオープンソース/クローズドソース分裂のどちらの味方かを結局明確にしたと言っている。SCO職員が数週間前9にダブリンでおこなった「パートナー−プレゼンテーション」を聞いた私にとって、これは不思議ではない。これ以上の議論は、 in the Slashdot thread. を読まれたい。

毎日がHollingの日
上院議員 Ernest "on the Fritz" Hollings は、政治家仲間の職務遂行環境改善のため面白いことを言い出した。Fritzの考えでは、議員は色々な Disney 衣装の一つで登院する機会を持とうと言うものだ。議事堂もまた、ディズニイランドで有名になった威勢の良い芸術をもっと盛り込んで作り直す。Hollingは提案に関しては、全く意気軒昂だ。

世界中にディズニイランドの休日ほど魅惑的なものはない。文化の頂点で、仕事をするのに最適の場所だ。しようとしているのは、上下両院議員の毎日の生活に魅力を持ち込むことだ。これで、上院議員もディズニイの魅力の中で毎日を過ごすことが出来る」
この提案が、重労働の政府職員の心を和らげるのは確かだ。Fritzは、この仕事には、娯楽大企業の人気をさらに高めるとのおまけが付くのも素早く指摘した。
この方策の宣伝と紹介を促進するため、Emetはこの仕事をディズニイの最高執行役員Michael Eisnerに下請けさせようとしている。 Eisnerは「日常業務が忙しい」と言っただけで、長い意見は差し控えた。
Hollingsの積極的な策略と思われ、彼は CBDTPAを持ち込んだ空想的原理主義者の典型である。実際、CBDTPA自体が、ディズニイ文化に根ざしている。多くの人が誤解しているが、この行為はディズニイのスローガン「魅惑の場所」にヒントを得て、日常使われる電子装置にディズニイ「魔術」を少しばかり持ち込む目的だ。
 
 
 
▼▼▼一般ニュース▼▼▼
 
SONY, IBM, Butterfly.net がLinuxベースのコンピュティング・グリッドを始動
Sony, IBM 及びグリッドの先駆者 Butterfly.net が、インターネット上でソニー・プレーステーション2のゲームを簡単且つ容易に走らせるLinuxベースのコンピューティング・グリッドの始動を発表した。充実した "Butterfly Grid" が、世界中のプレーステーション−オンライン・ユーザ数百万2を、一時にグリッド上に存在する人数に制限なく、サポートすることが出来ると言われる。 

Film Gimp が Cinepaint に
Film Gimp チームが、プロジェクト名をCinepaint に変更した changed the project name。変更は、最近のロスアンゼルスにおけるLinux映画会議の間の Film Gimp パネル討論会で決定された。

Appro HyperBlade
Appro HyperBlade B221X クラスタは、高性能コンピュータ(HRC)市場用の設計となっており、大規模複雑計算のため完全統合Linuxクラスタソリューションを提供する。必要x86コンポーネントを使用して、高密度アーキテクチャを単一クラスタ内に作る。30個までの計算ブレードをサポートして、Appro HyperBlade アーキテクチャは、IUサーバを使う

 
 
 
▼▼▼ディストリビューション関連ニュース▼▼▼
CollegeLinux
DesktopLinux社は、スイスのロバート・ケネディ高校校長David Costaと、最近発表した recently released当校のGNU/Linux 提供CollegeLinuxについて記者会見した interviews Prof. David Costa

Debian
Debian project は、新ライセンス条項を発表した。2003年4月1日から、ソフトウエア更新は、即金支払いとなる。こらは先ず、アクセスの前払いブロックを新らしいDebianオンライン・ストアiDebian で買わなければならないDebianミラーのユーザに影響する。次回の安定リリースから、インストール毎支払いになり、これには加入者が多いと予想される。各インストレーションには、システムを常時聴取してユーザが無邪気に単一インストレーション・メディアから2度インストールしないようにする管理者プログラム DebiWin がある。規定値Debianインストールで独特なのは、DebiWin クローズドソース・アプリケーションであることだ。これはアプリケーションの「独自品質」を保つためである。

最初の反響は色々だが、多くのユーザは打撃を受けていない:

「Debianのインストールには血と汗と涙を払ったから、数ドル位が何だ。分かったらインストールするだけだ。アップグレードに金が掛かるのは、・・へっ!」

Debian Kernel の口数のおおい指針 updating and compiling Debian kernels.


Anthony Towns は、Sargeの機能的リリースの仕事を助けるリリースマネージャを捜しているlooking for volunteers

Engarde
Guardian Digital は、Guardian Digital Secure Mail Suiteが入手することが出来ると発表したannounced the availability。これは、今日リリースされたGuardian Digitalの EnGarde Secure Linux v1.5と一緒に入手することが出来る。

SCO
SCO は、新教育プログラムeducation program、更新Linux、UnixWare 及びOpenServer 教材開発ソフトウエア、並びに新規UnitedLinuxコンフィギュレーション・プログラムを入手することが出来ると発表した。

Slackware
驚いたことに、Slackware プロジェクトが、次回のバージョン9.0でコンソール・ベースのインストール・ツール一切を除去すると発表した。大胆にも、これでインストレーションは、3DWM プラットホーム上で走るインストレーション・ツールを用いて完了することになる。グラフィックス最低要件は未だ発表されていないが、Doom 3 を再生するのに新カードを節約することが出来るとすると、間違っていない。

The Slackware Linux Project は、そのサイト上でSlackware 9.0-rc1の最新版について簡単な発表をおこなっている。

SuSE
デスクトップとサーバーのLinuxソリューションのプロバイダXimian, Inc.と、SuSE Linux は、SuSEのコンピュータ事業に関する提携を発表した。提携の一部として、SuSEは、XianからRed Carpet Enterprise を販売し、SuSE Linux とSuSE Linux Enterprise を走らせるデスクトップとサーバ上で、顧客がソフトウエアを展開して管理することが出来るようにする。両社はまた、有名なLinux用Ximian Evolution グループウエア一式をSuSE Linux OS と統合するため、Ximian コネクタ・ソフトウエアを提供する。加えて、両社は将来Linuxデスクトップに、Ximianデスクトップ技術を組み込むのを提案する機会を推進する。

UnitedLinux
UnitedLinux は、Oracle9i データベースとそのデータベース・クラスタ技術双方を持つUnitedLinux バージョン1.0の認証を完了したと発表した。

Yoper
Yoper (Your Operating System) は、そのディストリビューションのバージョン1.0をリリースした has released version 1.0

 
 
 
▼▼▼ソフトウエア及び製品関連ニュース▼▼▼
 
XFree86
XFree86バージョン4.3.0がリリースされた released。新リリースには、多くの新しいグラフィックカード改良、自動P32マウス・プロトコル検出、ランタイムmotウィンドウ・リサイズ、アルファ融合とアニメーションのカーソル、及び改良フォント・サーバが含まれる。
 
TextMaker
Linux用TextMakerベータを、今、入手することが出来るTextMaker for Linux beta now available。Linux用TextMakerは、書式や内容を失うことなく、マイクロソフトの Word 6/95/97/2000/XP ファイルの読取、書込が出来ると言うワープロである。

McObject - MntaVista 提携

フットプリント、メモリ内データベース eXtremeDB を開発したMcObjectは、MontaVista Softwareと合同して、家庭用から通信業者用までのインテリジェント装置のためのGNU/Linux−ベース技術組合せを提供する。

eXtremeDBとともに、McObject は、インテリジェントな接続装置独特の性能要件とリソース制限に適合する形の新型データベースを提供する。100K以下のフットプリントで、 eXtremeDB は、重要データ管理特性を供しながら、RAMとCPUを割愛する。eXtremeDBの極小フットプリントと優れた性能により、装置製造者は価格の低いハードウエアを作り、材料費の節約で重要な経済利益を得ることが出来る。同様に、MontaVista Linuxツールとプラットホームを選ぶことにより、会社は、私有財産リアルタイムOSを超える節約をすることが出来る。McObject とMontaVista は一緒になって、開発、展開費用を下げ、市場での顧客位置決めを強化する。

This page written and maintained by the Editor of the Linux Gazette,
gazette@ssc.com
Copyright © 2003, Michael Conry. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003
 
 

 

Laurel と Hardy が Cプログラムを書こうとする
By Stephen Bint
 

・・・可愛い愚か者、Stan LaurelとOliver Haedyの記録

(Official L&H site)  (UK tribute page)

この記事は1月号の著者の「究極のエディタ」The Ultimate Editor と2月に受け取ったメールバッグ Mailbag letters (3通)の続きである。

 

Ollie がターミナルの前に座っており、Stan が本を持って入って来る

Ollie: どこにいた?

Stan: 本屋で君の言ったような本を買って来た。

Ollie: そうか、面白かったろう。明日朝までにこのCGIスクリプトを仕上げなければならない。何を買って来たか見せろ。.

Stan が Ollie に本を渡す。

Ollie: 「C プログラミング入門」何だこれは?

Stan: Cのプログラミングの入門だよ。

Ollie が−面白くなさそうに−カメラを見る。

Ollie: そんなことは分かっている。間抜けめ。Perlで書くと言った筈だ。

Stan: だけどビントさんが・・・.

Ollie: ビントさん?

Stan: 本屋にいた人。ビントさん。

Ollie: [イライラして] 「ビントさん」が何を言ったのだ?

Stan: Perl の本は売り切れたけど、C の本なら本棚一杯にある。運が良かった。と言った。

Ollie: どうしてそんなことを言ったのだ?

Stan: CGI プログラムにはCの方が良いと言った。 C は専門家のプログラム言語だが、Perlはオモチャの言語だと言った。Perlは先走りした泥縄のスクリプト言語だと言った。

Ollie: 本当に、そう言ったのか?

Stan: [うなづく] ビントさんが言うには、Cは、習い初めは難しい、結局習うことが少なくて済む。C には規則が少ないからだ。Perlは、殆どのことを代わってやってくれるけれども、自分のプログラムが何をしているかを理解するには、色々な場合についてPerlが何をするかを正確に知っておく必要がある。だから C の本が薄くてPerlの本は厚いのだと言った。売り切れになったのは、Perl の本が厚くて本棚に四冊しか入らないからだと言った。それだけでなく、重過ぎるのでトラックのタイヤがパンクしてPerlの本を運び損ねるとも言った。

Ollie: 本当か?

Stan: [うなづく] 正にビントさんが言ったことだ。Perlは文法が紛らわしくファンクション・インターフェイスを正しく定義し損ねていて、だらしなくなっている、と言った。

Ollie: その他に言ったことは?

Stan: C は、Perlに較べて危険が一杯で大失敗になるかもしれないものに書かれることが多いが、事実、Perlは共通の二三のバグに対する吟味が出来るだけで、読み難いためバグが起こり易いと言う。gccコンパイラは、書き損ねたC についての警告を与え、メモリリークのチェックが出来るツールと、その他の共通エラーをチェックするためLintもある、と言う。

Ollie: うむ、ビントさんはLintを薦めたのか?

Stan: うん。

Ollie は、カメラに、続いて Stan に苛立ったようだ。

Ollie: ぢゃ、「C」で書くとするか・・・「ビントさん」か・・・うむ!

Ollie はキイボードに向かってタイプの用意をする。

Ollie: よし、本を読んで呉れ、俺がプログラムをタイプする。


      while( ollie_waits ) {



         Stan_looks_at_book();

Stan_looks_at_Ollie();

Stan_looks_panic_stricken(); if( ollie_looks_around() )

ollie_waits = false; }

Ollie: おい、これは何だ?

Stan: [泣き出す] 済まん・・・泣く・・・直ぐには始められない・・・鼻をすする・・・先ず本を読んで、言語を勉強しなければならない・・・。

Ollie: 鼻をすするのを止めろ。難しくはないだろう?言語を勉強するだけでプログラムが書けるんだろう。

Ollie が Stan に目を向ける。

Ollie: よし、始める前にC について勉強しなければならないことは何か、言って見ろ。

Stan: この目次では、変数型、ユーザ定義型、型定義、静的変数、初期化対割当、コンテント、ステートメント、バイナリ演算子、単一演算子、算術演算子、ローカル演算子、ビット演算子、演算子優位、if、for、switch、while、continue、break、アレー・・・

Ollie カメラを見る−楽しくなさそう。

Stan: 多次元アレー、ポインタ、ポインタ計算、ファンクション・ポインタ、ファンクション宣言と定義、前処理命令とマクロ、printfフォーマット、自動及び割当メモリ、コマンド行引数、繰り返し・・・

Ollie が Stan の帽子を取って、マウスパッド(両側)で頬を叩く。丁寧に帽子を戻す。Stan が読むのを止める。

Ollie: 分かった、おめでとう。お前さんがはまり込んだ混乱はこれだ。.


   while( camera_is_running() )

      Stan_blubbers();

終わり

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

Copyright © 2003, Stephen Bint. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003
 
 
 
XSLT を使う作業
By Daniel Guerrero
 

eXtensible Stylesheet Language Transformations (XSLT) は、主に XML データを HTML データに転換するため使用されるが、XSLTを使ってXML(即ちRDFなどxmlネームスペースを使う何でも)を、xmlから平分など、何でも必要なものに転換することが出来る。

w3 は、XSL(eXtensible スタイルシート言語)が三つの部分:XSLT、 XPath (XML文書の部分にアクセスするためXSLTが使う表現言語)及び書式セマンティック用のXML語彙である第三の部分 XSL Formatting Objects, を定義する。

 
XSLTとの出会い
先ず最初に、ここで言うXML文書はXMLスタイルシート、及びXMLネームスペースであることを定義する必要がある。
<xsl:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
 
</xsl:stylesheet>
 

その後、我々が使用する主要エレメントは、xmlのノードの名称が xsl:template match: の値と一致するとき呼び出される xsl:template match となる。


<xsl:stylesheet version="1.0"

                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/"> <!-- '/' は、XPathから取ったのでルート・エレメント-->と一致する。

    <!-- ノード -->の属性を使って何かをする。

</xsl:template>

 

</xsl:stylesheet>

xsl:template match の内部では、エレメント xsl:value-of select を有するノードの属性と、属性の名称を得ることが出来る。先ず、幾つかの情報を用いてxmlの例を作ろう。


<!-- hello.xml -->



<hello>

   <text>Hello World!</text>

</hello>

するとこれは、ルート・エレメント(hello)の text を抽出するxsltとなる:


<!-- hello.xsl -->

<xsl:stylesheet version="1.0"

                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">



<xsl:template match="/"> 

  <html> 

    <head>

      <title>Extracting <xsl:value-of select="//text"/> </title>

       <!--  この場合 '//text' は: 'hello/text' だが、私は怠け者なので、XPath  -->を使って短くする 

    </head>



    <body>

       <p>

           ルートエレメントの <b>text</b> は:<b><xsl:value-of select="//text"/></b>

       </p>

    </body>

  </html>

</xsl:template>



</xsl:stylesheet>

HTML出力は:


<!-- hello.html -->



<html>

   <head>

      <meta http-equiv="Content-Type" content="text/html; arset=utf-8">



      <title>Extracting Hello World! </title>

   </head>

   <body>

      <p>

           ルートエレメントの <b>text</b> は : <b>Hello World!</b>

      </p>

   </body>

</html>

属性の選択
@att が属性 att に一致する。例えば:


<!-- hello_style.xml -->



<hello>

   <text color="red">Hello World!</text>

</hello>

であるとXSLT は:


<!-- hello_style.xsl -->

<xsl:stylesheet version="1.0"

         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">



<xsl:template match="/"> 

  <html> 

  <head>

    <title>Extracting <xsl:value-of select="//text"/> </title>

  </head>



  <body>

    <p>

      ルートエレメントの <b>text</b> は、<b><xsl:value-of select="//text"/></b>

      でこの <b>color</b> 属性は: <xsl:value-of select="//text/@color"/>

    </p> 

  </body>

 </html>

</xsl:template>



</xsl:stylesheet>

HTML 出力は:


<html>

  <head>

   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">



   <title>Extracting Hello World! </title>

  </head>

   <body>

      <p>

         ルート・エレメントの <b>text</b> は:<b>Hello World!</b> で

         その <b>color</b> 属性は:赤

      </p>

   </body>

</html>

この情報を、今の場合、赤色でテキストHello World! を出すのに使うには、変数を作ってそれをフォントの属性などに使うのと、 xsl:attribute エレメントを使うのと、二つの形でおこなうことが出来る。

変数

定数又はエレメントの値を収容するため変数を使うことが出来る。

定数の割当は簡単である:


<!-- variables.xsl -->



<xsl:stylesheet version="1.0"

                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">





<xsl:template match="/"> 



<!--  definition of the variable  -->

<xsl:variable name="path">http://somedomain/tmp/xslt</xsl:variable> 



  <html> 

    <head>

      <title>Examples of Variables</title>

  </head>

    

    <body>

       <p>

           <a href="{$path}/photo.jpg">Photo of my latest travel</a>

       </p> 

    </body>

  </html>

</xsl:template>



</xsl:stylesheet>

The html output:


<html>

   <head>

      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

   

      <title>Examples of Variables</title>

   </head>

   <body>

      <p><a href="http://somedomain/xslt/photo.jpg">Photo of my latest travel</a></p>

   </body>

</html>

ノードの値又は属性から選んで、変数の値を得ることも出来る:


<!-- variables_select.xsl -->



<xsl:stylesheet version="1.0"

                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">





<xsl:template match="/"> 

    <html>

       <head>

         <title>Examples of Variables</title>

        </head>

       <body>

           <xsl:apply-templates select="//photo"/>

       </body>

    </html>

</xsl:template>



<xsl:template match="photo"> 

    <!--  definition of the variables  -->

    <xsl:variable name="path">http://somedomain/tmp/xslt</xsl:variable>  

    <xsl:variable name="photo" select="file"/> 

     <p> 

       <a href="{$path}/{$photo}"><xsl:value-of select="description"/></a>

     </p>       

</xsl:template>



</xsl:stylesheet>

また xml ソースは (人を傷つけたくないので、自分の画像は入れない )


<!-- variables_select.xml -->



<album>

   <photo>

      <file>mountains.jpg</file>

      <description>me at the mountains</description>

   </photo>

   

   <photo>

      <file>congress.jpg</file>

      <description>me at the congress</description>

   </photo>

   

    <photo>

      <file>school.jpg</file>

      <description>me at the school</description>

   </photo>        

</album>

またhtml 出力は:


<html>

   <head>

      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

   

      <title>Examples of Variables</title>

   </head>

   <body>

      <p><a href="http://somedomain/tmp/xslt/mountains.jpg">me at the mountains</a></p>

      <p><a href="http://somedomain/tmp/xslt/congress.jpg">me at the congress</a></p>

      <p><a href="http://somedomain/tmp/xslt/school.jpg">me at the school</a></p>

   </body>

</html>

注意すると、xsl:apply-templates のため photo エレメント一致が3度呼び出されているのが分かるだろう。それに一致するエレメントをxsltが毎回見出している。これは、それに一致する xsl:template match と呼ばれる。

こんな調子で hello_style.xmlのテキストを赤色で示すのがもどかしいなら、変数を使ってやって見よう。出来なければ misc/danguer/hello_style_variables.xslの頁を開かれたい。

ソート

XSLT は、<xsl:sort select="sort_by_this_attibute"> を用いてxmlをソートすることが出来る。このエレメントは、xsl:apply-templates エレメントの中に置がなければならない。xmlエレメント又は属性によって、上昇順又は下降順でソートすることが出来る。大文字小文字の順で規定することも出来る(大文字が小文字の前、又はその逆)。

アルバムの例を用いて、ソートエレメントだけを追加する:


 <xsl:apply-templates select="//photo">

	<xsl:sort select="file" order="descending">

 </xsl:apply-templates>

これは、写真がhtmlの中に置かれる順序だけを変える。事実、xsltは、xmlのエレメント photo 全部を先ず並べ、その順で template-match エレメントに送る。 xsl:sort エレメントが xsl:apply-templates 内部になければならないのは、それが理由である。

xslとhtmlのファイルは例にあるので、次のリンクから入手することが出来る:

misc/danguer/sort.xsl. StyleSheetのソート
misc/danguer/sort.html. HTML 出力のソート

if ステートメント

xmlエレメント(又は属性)があらわれたとき、又はあらわれないとき、何かテキストを置く必要がある場合がある。xsl:if エレメントがこれをおこなう。何が出来ることを示すため、文書を持つ頁があり、この文書からソースがPDF、PS又はHTMLに転換されたか否かを知り、その情報はxmlの中にあるとする(この例はTLDP-ES プロジェクトの「テスト」から取った)。PDFファイルが作られたか否かをテストすることが出来るようにするには、次のリンクを置く:


     <xsl:if test="format/@pdf = 'yes'">

	   <a href="{$doc_path}/{$doc_subpath}/{$doc_subpath}.pdf">PDF</a>

	 </xsl:if>

この例のように、文書のpdf属性が「イエス」であれば:


   <document>

     <title>Bellatrix Library and Semantic Web</title>

     <author>Daniel Guerrero</author>

	 <module>bellatrix</module>

	 <format pdf="yes" ps="yes" html="yes"/>

   </document> 

このとき、PDFフォーマットの文書にリンクを置く。属性が「ノー」であるか、xmlのDTDが許す何かの値であれば、リンクは置かれない、xsl及びxml文書全部をチェックしたければ、次の場所にある:

misc/danguer/documents.xml. 文書情報
misc/danguer/documents.xsl. 文書スタイルシート
misc/danguer/documents.html. 文書 HTML 出力

for-each ステートメント

下記のxml文書をチェックすると、最初の文書にコンマで区切られた3人の著者名があるのが分かる。著者を別々の <author> タグに入れるのが最良なのは、言うまでもない:


   <document>

     <title>Donantonio: bibliographic system for automatic distribuited publication. Specifications of Software Requeriments</title>

     <author>Ismael Olea</author>

	 <author>Juan Jose Amor</author>

	 <author>David Escorial</author>

	 <module>donantonio</module>

	 <format pdf="yes" ps="no" html="yes"/>

   </document>

そこで、xsl:apply-templates と a xsl:template match を作って、各名前を別々の行に入れることが考えられる。これをすることは出来るが、 xsl:for-each ステートメントを用いることも出来る。


     <xsl:for-each select="author">

	    <tr>

	       <td>

		      Author: <xsl:apply-templates />

           </td>

	    </tr>

	  </xsl:for-each>

この場合、プロセッサは文書にある著者全部を調べる。著者の処理にどんなテンプレートを作ったかと思われるだろうが、テンプレートは作っていない。プロセッサは、テキストの「プリント」のように、for-each エレメントが選んだ apply-templates エレメントを取り上げる。

choose ステートメント

最後に示すxsltエレメントは、chooseエレメントである。これは、Cなど良く知られた言語の switch のような働きをする。

先ず、xsl:choose エレメントを宣言死なない。その後、xsl:when エレメントの中に全てのオプションを入れる。エレメントがwhenのどれかを満足しないときは、 xsl:otherwise エレメントを置くことが出来る。


  <xsl:variable name="even" select="position() mod 2"/>



  <xsl:choose>

     <xsl:when test="$even = 1">

          <![CDATA[<table width="100%" bgcolor="#cccccc">]]>

	 </xsl:when>

     <xsl:when test="$even = 0">

	     <![CDATA[<table width="100%" bgcolor="#99b0bf">]]>

	 </xsl:when>

     <xsl:otherwise>

        <![CDATA[<table width="100%" bgcolor="#ffffff">]]>

	 </xsl:otherwise>

  </xsl:choose>

position() は、処理されたエレメントの数を返す。文書の場合、この数は文書の数にしたがって増える。この場合、どの文書が偶数か奇数かを知りたいだけなので、偶数番に付いては色のテーブルをおき、奇数番には別のものを置く。 xsl:otherwise は、その用法を示すためだけに置いたが、実際はこれが我々のライブラリにある空白バックグラウンドを持つテーブルになることはないと考える。

CDATA セクションを置いた理由は、これを置かないと、プロセッサが自分のターミネーションタグ(</table>)を聞いて来るだろうが、そのターミネーションはボトムなので、ターミネーションタグもまた CDATA セクションを必要とするからである。

ここでも、コードを短くしなければならない。コード全部を見たければ、以下の文書を見られたい。

misc/danguer/documents_choose.xsl. 文書StyleSheet
misc/danguer/documents_choose.html. 文書HTML 出力

XSLT プロセッサ

Saxon

Saxon は、JAVAで書かれたXSLT プロセッサである。私はバージョン6.5.2を使っている。以下の説明はこのバージョンについてのものなので、他のバージョンについては、Saxonと走らせるのに適切な情報をチェックする必要がある。

インストレーション

saxon zipをダウンロードした後、解凍しなければならない:


[danguer@perseo xslt]$ unzip saxon6_5_2.zip

その後、クラスパスの中にsaxon.jar ファイルを入れる。-cp path オプションを使ってjavaに対するjarのパスを通過することが出来る。私は saxon.jar を xslt ディレクトリの下に置いた。使うクラスをJava に書き込まなければならない。私の saxon バージョン(6.5.2)の場合、クラスは: com.icl.saxon.StyleSheet で、また引数として、xml中の文書と使用するXSLT StyleSheet を渡す。例えば:


[danguer@perseo xslt]$ java -cp saxon.jar com.icl.saxon.StyleSheet document.xml tranformation.xsl

これで転換出力を標準出力に送る。次を使ってファイルに送ることが出来る:


[danguer@perseo xslt]$ java -cp saxon.jar com.icl.saxon.StyleSheet document.xml tranformation.xsl > file_processed.html

例えば、saxon を使って最初の XSLT の例を転換するには:


[danguer@perseo xslt]$ java -cp saxon.jar com.icl.saxon.StyleSheet cards.xml cards.xsl > cards.html

また、前に言ったように、xsltを用いて処理した結果は:


[danguer@perseo xslt]$ java -cp saxon.jar com.icl.saxon.StyleSheet hello.xml hello.xsl > hello.html

xsltproc

xsltproc は、主要ディストリビューション全てについて来る。そのシンタクスはsaxonに似ている:


[danguer@perseo xslt]$ xsltproc hello.xsl hello.xml > hello.html

sablotron など他のxslt プロセッサもあるが、使ったことがないので、意見はない。

参考資料
Technical Report for XSLT from the w3 consortium
XSL homepage
Saxon homepage
・例 ('card' 例は、この文書を書く前に私が書いたものなので、役立つと思う):
misc/danguer/cards.html
misc/danguer/cards.xml
misc/danguer/cards.xsl
misc/danguer/hello.html
misc/danguer/hello.xml
misc/danguer/hello.xsl
misc/danguer/hello_style.html
misc/danguer/hello_style.xml
misc/danguer/hello_style.xsl
misc/danguer/hello_style_variables.html
misc/danguer/hello_style_variables.xsl
misc/danguer/variables.html
misc/danguer/variables.xsl
misc/danguer/variables_select.html
misc/danguer/variables_select.xml
misc/danguer/variables_select.xsl
misc/danguer/sort.xsl
misc/danguer/sort.html
misc/danguer/documents.xml
misc/danguer/documents.xsl
misc/danguer/documents.html
misc/danguer/documents_for.html
misc/danguer/documents_for.xml
misc/danguer/documents_for.xsl
misc/danguer/documents_choose.xsl
misc/danguer/documents_choose.html
 
著者紹介:
私は、メキシコ、プエブラ市のBUAPで修士課程を終わるところだ。TLPD-ESプロジェクトに従事しており、この技術について全てを学ばせて貰っている。今のところSemanticウエブを学んでいる。
 
Copyright © 2003, Daniel Guerrero. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003
 
 

 

Debian GNU/Linuxn を用いるセキュリティ管理
By Jose Salvador Gonzalez Rivera

目次
1.緒言
2.Debianのインストール
3.脆弱性解析
4.セキュリティ管理
1.パーミッションと属性
2.Sticky Bit
3.Umask
4.割当と限界
5.ユーザ活動
6.ログとサービス
 
緒言
Debian には、従属問題を自動的に解決するパケージ・マネージャ(DPKG)がある。これは、更新プログラムが新パージョンをインターネット上で捜し、パケージが要求するファイルとライブラリの従属性を解決して完成し、、システム管理を容易にし新しいセキュリティ変更で更新を維持するのを助ける。これはまた、商業目的を持たない重要で本質的なセキュリティ特性を幾つか示し、商人のしつこい要求もない。エラーを上手く追求し、48時間以内に問題を解決し、最優先にしているのは、完全で信頼性のあるOSを開発することである。

インストールの前に

セキュリティと信頼性の観点から、大型の文書に関しては別のハードディスク・パーティションを持つのが良く、特に頻繁に変更するものは、ソフトウエア(/usr)をインストールするときを除いて読取専用で取り付けるのもの(/tmp と/var) とは別にするのが良い。人によっては、/home と /usr/localにも別のパーティションを作る。別のパーティションとは、一つが汚染したとき、別のものは影響を受けないことを意味する。システム管理のとき以外は読取専用でパーティション(特に /usr と /boot)を取り付けられることも意味する。これは、汚染や間違いを著しく減少する。ディストリビューション規定値を使わないこと。これは通常、何も彼も一つのパーティションに入れてしまう。勿論、パーティションを作り過ぎるとはみ出してしまうことがあるので、サイズの見積もりを誤ると、一つのパーティションではスペースが不足し、他では余ることになる。この場合は、ファイルをバックアップしてパーティションをし直すか、別のパーティションからスペースを盗むためシンボリック・リンクを使わなければならない。両方とも望ましくないので、あらかじめこのマシンにはどれだけのパーティションが適切かと、置き換え出来ないデータをどのディレクトリに入れるかを考えて、後々の予期しない追加のため、余裕を持っておくのが良い。

Debian のインストール         この記事の初めへ

Debian iインストール、テキストモードは二つのフェーズを含む。第一は、ベースシステムのインストールで、第二では、幾つかのコンフィギュレーションと、追加パケージのインストールをすることが出来る。システムが提供するサービスも確認する必要がある。ポートを開いたり不要のサービスを提供するパケージは意味がないので、ベースシステムだけのインストールから出発し、提供するサービスは後でインストールする。

脆弱性解析                 この記事の初めへ

脆弱性の検証つまりシステム内のセキュリティ監査をするソフトウエアツールがある。これらのツールは、良く知られたセキュリティ問題を検出し、見出した大方の問題の解決策に関する情報を提供する。この種の解析もまた、侵入者がするようにサーバーに忍び込む方法をチェックすることが出来るので、「エセカル・ハッキング」と呼ばれる。その主な利点は、最新のアタックに対し、プラグインの形で含む可能性を持たせて、全面的に近代化されていることである。これはいずれのUNIX類に関してもウエブサイト http://www.nessus.org/ から入手することが出来る。二つのプログラムから成っている:

Nessusd

サーバが探索をおこなう。ルート優先権を用いて開始し、ポート1241と3001を使って、nessus cliantのリクエストを聴取する。インストールするには、次のコマンドをタイプする必要がある:


# apt-get-install nessusd

これはUNIXでだけ働き、クライアントは nessus-adduser コマンドが提供する各種オプションを用いてシステム内で起動しなければならないログインとパスワードを使って認証されなければならない。

Nessus Client

これは、nessusd と交信するクライアントである。このプログラムには、管理目的のため自分自身のグラフィック・フロントエンドがある。UNIX用だけでなくWindows用でもある。その役目の一つは、探索の終わりに、見出した脆弱性と可能な解決策を示したレポートを作ることである。インストールするには次のようにタイプする:


# apt-get install nessus

Nessus は、ユーザのHOMEに置かれた .nessus.keys ディレクトリに記憶された幾つかのキイを利用する。これらは nessusd との交信に用いられる。

セキュリティ管理             この記事の初めへ

ハウツーやマニュアルを繰り返す気はないので、余り論じられない特殊な着眼点と状態、限界の使用、及びファイルの属性に絞る。

パーミッションと属性

Linuxのパーミッションと属性のシステムにより、認証されないユーザに対しファイル・アクセスを制限することが出来る。基本的パーミッションは、読取 (r)、書込 (w) と実行 (x) である。

ディレクトリ・パーミッション構造体を見るには ls -lとタイプする。


total 44


drwxr-xr-x 2 root root 4096 May 27 2000 backups


drwxr-xr-x 4 root root 4096 Jul 17 14:36 cache


drwxr-xr-x 7 root root 4096 Jul 17 09:30 lib


drwxrwsr-x 2 root staff 4096 May 27 2000 local


drwxrwxrwt 2 root root 4096 May 27 2000 lock


drwxr-xr-x 5 root root 4096 Jul 17 14:35 log


drwxrwsr-x 2 root mail 4096 Jun 13 2001 mail


drwxr-xr-x 3 root root 4096 Jul 17 14:36 run


drwxr-xr-x 3 root root 4096 Jul 17 14:34 spool


drwxr-xr-x 5 root root 4096 Jul 17 14:35 state


drwxrwxrwt 2 root root 4096 May 27 2000 tmp

パーミッション列には4グループに分けられた10文字がある:


- rw- rw- r--


 

初めの部分はファイルタイプを示す:

- ‥‥‥‥共通ファイル
d ‥‥‥‥ディレクトリ
l ‥‥‥‥シンボリック・リンク
s ‥‥‥‥ソケット

その他の文字は、オーナー。オーナー・グループ及びその他すべてが、ファイルの読取、書込、実行のパーミッションを有するか否かを示す。chmodコマンドは - + = 演算子を用いてパーミッションを、削除、追加又はパーミッション割当の変更をするため用いられる。例えば:


$ chmod +x foo

は、fooに対し実行属性を割り当てる。グループメンバー似たいし実行パーミッションを削除するには、次のようにタイプする:


$ chmod g-r foo

パーミッション・スキーマ変更の別方法は、各数字がオーナー、グループ及びその他のための場所依存パーミッションをあらわす8進数システムを使うことである:

0‥‥‥‥パーミッション無し
1‥‥‥‥実行
2‥‥‥‥書込
3‥‥‥‥書込と読取
4‥‥‥‥読取
5‥‥‥‥読取と実行
6‥‥‥‥読取と書込
7‥‥‥‥読取、書込及び実行

例えば次のようにタイプすると:


$ chmod 751 foo

読取、書込及び実行パーミッションをファイルオーナー(7)に与え、グループはそれを読み取って実行することが出来(5)、その他だれでも実行することが出来る(1)。

chatterを用いてファイル属性を変えることも、lsattr用いてリストすることも出来る。これにより、ファイルとディレクトリのセキュリティを増すことが出来る。属性は次のように割り当てる:

A‥‥‥‥ atime ファイル属性を更新しないで、ディスクへの入出力を制限することが出来るようにする。
a‥‥‥‥ファイルを更新モードでのみ開く。
c‥‥‥‥ファイルが自動的に圧縮される。
d‥‥‥‥ファイルを作るのでダンププログラムはタッチしない
i‥‥‥‥ファイルを削除、名称変更、修正又はリンクすることが出来ない。
s‥‥‥‥消去したファイルブロックを0で埋める。
S‥‥‥‥ファイル内の変更が直ちに記録される。
u‥‥‥‥ファイルを消去するときファイル内容がセーブされる。

ファイルを修正、消去、リンク又は名称変更が出来ないよう"immutability"を割り当てる方法は、


lsattr foo.txt


-------- foo


chattr +i foo.txt


lsattr foo.txt


----i--- foo.txt

Sticky bit                この記事の初めへ

あるディレクトリへの書込パーミッションを持つユーザは誰でも、オーナーでも優先権を持たなくとも、そのディレクトリに含まれる任意のファイルを消去することが出来る。どのユーザも別のユーザのファイルを消去することが出来ないようディレクトリにパーミッションを与えるには、chmodを用いてsticky bit を割り当てる;


ls -ld temp


chmod +t temp


ls -ld temp

Umask                   この記事の初めへ

ファイル又はディレクトリを作るとき、それらはファイルに関しては664でディレクトリに関しては775と共通の、所定のパーミッションを持つ。これはumask値がおこなう。ファイルに関しては666でディレクトリに関しては777のもっと制限的なパーミッションを割り当てるには、/.bash_profile の中にある各ユーザのプロフィルでumask値を077に設定するのが良い。


# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))


# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).


PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"


if [ "$BASH" ]; then


 PS1='\u@\h:\w\$ '


else


 if [ "`id -u`" -eq 0 ]; then


 PS1='# '


 else


 PS1='$ '


 fi


fi


export PATH PS1


umask 022

割当と限界                  この記事の初めへ

LinuxはマルチユーザOSなので、何人かのユーザがハードディスクを満たし又はディスクの資源を使い果たすことが出来る。だからディスク割当をするのが良い。それには、usrquotaを加えて /etc/fstab ファイルを修正し、quota.user とquota.grup の二つのファイルを作るので十分である:


touch /home/quota.user


touch /home/quota.group


chmod 660 /home/quota.user


chmod 660 /home/quota.group

続いてシステムを再起動すると、指定の割当をedquotaで修正することが出来る。ユーザを制限する、つまりCPUの使用時間、オープンファイルの数、データセグメントのサイズなどを制限することも出来る。それには、ulimitコマンドを用いる、このコマンドは、/etc/profileの中に置き、ユーザがシェルを得る毎にこれらのコマンドが実行されなければならない。オプションは次の通り:

−a‥‥‥‥現在の限界を示す
−c‥‥‥‥最大コア・ファイル・サイズ
−d‥‥‥‥最大処理データ・セグメント・サイズ
−f‥‥‥‥シェル・サイズが作る最大ファイル
−m‥‥‥‥最大ロックド・メモリ・サイズ
−s‥‥‥‥最大スタック・サイズ
−t‥‥‥‥秒であらわいした最大CPU時間
−p‥‥‥‥パイプ・サイズ
−n‥‥‥‥最大オープン・ファイル数
−u‥‥‥‥最大プロセス数
−v‥‥‥‥最大仮想メモリ・サイズ

コア・ファイル・サイズ(ブロック)‥‥‥‥‥0
データ・セグメント・サイズ(キロバイト)‥‥無制限
ファイル・サイズ(ブロック)‥‥‥‥‥‥‥‥無制限
最大ロックド・メモリ・サイズ(キロバイト)‥無制限
最大メモリ・サイズ(キロバイト)‥‥‥‥‥‥無制限
オープン・ファイル‥‥‥‥‥‥‥‥‥‥‥‥‥1024
パイプ・サイズ(512バイト)‥‥‥‥‥‥‥‥8
スタック・サイズ(キロバイト)‥‥‥‥‥‥‥8192
CPU時間(秒)‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥無制限
最大ユーザ・プロセス‥‥‥‥‥‥‥‥‥‥‥‥256
仮想メモリ(キロバイト)‥‥‥‥‥‥‥‥‥‥無制限

ユーザ活動                  この記事の初めへ

ユーザのコマンド記録は ~/.bash_history の中に記憶される。ユーザは、方向キイ(上下)を用いhistoryコマンドで問い合わせることが出来る。しかし、これを避ける幾つかの方法がある。例えば、history-cコマンドは、今の記録を消去する。環境変数 HISTFILE の内容を0で置き換えるのも別法である。さらに別の方法は、 kill -9 又は kill -9 0を用いてセッションを没にすることだ。

ユーザの行動を記録するには、snoopy と言うツールがあり、これが活動を記録するが、これはプライバシイの問題と考えられるので、実行するには方針をしっかり立てて、ユーザに活動が記録されるのを知らせておくのが賢明であろう。これは apt-get install snoopy を使ってインストールすることが出来る。今の最新版はバージョン1.3-3である。

ユーザのファイルを使うプロセスを確定するには、fuserコマンドを用いる。これは、一定のファイルシステムの取り外しを許さないファイルを、どのユーザが開いたかを知るため極めて有用である。知っていて役に立つ別のコマンドは lsof である。特定のソケットがどのプロセスを使っているかを知るには、例えば次のようにタイプする:


lsoft -i -n -P | grep 80| grep LISTEN

ログとサービス                 この記事の初めへ

failloglastlog ファイルは、最後の成功及び失敗接続をを登録する /var/log の中にある。これは侵入者検出セクションの中で解析されるが、誰でもアクセスすることが出来るので、次を用いてアクセスを制限するのが良い:


chmod 660 /var/log/faillog

及び


chmod 660 /var/log/lastlog

lilo.conf ファイルもまた、皆がアクセル出来る。これはLinuxローダコンフィギュレーションを持っており、このことが、次を用いてアクセスを制限するのが良い理由である:


chmod 600 /etc/lilo.conf

setuidは、プログラムがシステム呼出をするとき自分に UID を割り当ててプロセスを識別する。setuid を用いて記録されたプログラムは、オーナ又は適切な優先権を得たプロセスが実行することが出来る。どのファイルがsetuid 及び setgid されたかを判定するには、次を用いてサーチする:


$ find / -perm -4000 -print

インストールすると、各UNIXは多くのサービスを開くが、それらの多くは、構築されるサービスの種類により、不要である。例えば私のLinuxボックスには、次のサービスがある:


$ netstat -pn -l -A inet

インターネット接続を起動する(サーバのみ)


Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name


tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 200/sshd


tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN 193/lpd


tcp 0 0 0.0.0.0:113 0.0.0.0:* LISTEN 189/inetd


tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 189/inetd


tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN 189/inetd


tcp 0 0 0.0.0.0:13 0.0.0.0:* LISTEN 189/inetd


tcp 0 0 0.0.0.0:9 0.0.0.0:* LISTEN 189/inetd


tcp 0 0 0.0.0.0:1024 0.0.0.0:* LISTEN 180/rpc.statd


tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 116/portmap


udp 0 0 0.0.0.0:9 0.0.0.0:* 189/inetd


udp 0 0 0.0.0.0:1024 0.0.0.0:* 180/rpc.statd


udp 0 0 0.0.0.0:780 0.0.0.0:* 180/rpc.statd


udp 0 0 0.0.0.0:111 0.0.0.0:* 116/portmap


udp 0 0 0.0.0.0:68 0.0.0.0:* 112/dhclient-2.2.x


raw 0 0 0.0.0.0:1 0.0.0.0:* 7 -


raw 0 0 0.0.0.0:6 0.0.0.0:* 7 -

これはプロトコル型、アドレス、ポートと同時に状態を示す。lsof を用いて、もっと詳細で要約した情報を得ることが出来る。


$ lsof -i | grep LISTEN



portmap 116 root 4u IPv4 73 TCP *:sunrpc (LISTEN)


rpc.statd 180 root 5u IPv4 118 TCP *:1024 (LISTEN)


inetd 189 root 4u IPv4 126 TCP *:discard (LISTEN)


inetd 189 root 6u IPv4 128 TCP *:daytime (LISTEN)


inetd 189 root 7u IPv4 129 TCP *:time (LISTEN)


inetd 189 root 8u IPv4 130 TCP *:smtp (LISTEN)


inetd 189 root 9u IPv4 131 TCP *:auth (LISTEN)


lpd 193 root 6u IPv4 140 TCP *:printer (LISTEN)


sshd 200 root 3u IPv4 142 TCP *:ssh (LISTEN)

これは、サービス、ポート、持ち主、及び使用プロトコルを示す。inet.d されたデーモンをリストするには、/etc/inetd.confにあるコンフィギュレーション・ファイルを改訂することが出来る:


$ grep -v "^#" /etc/inetd.conf | sort -u



daytime stream tcp nowait root internal


discard dgram udp wait root internal


discard stream tcp nowait root internal


ident stream tcp wait identd /usr/sbin/identd identd


smtp stream tcp nowait mail /usr/sbin/exim exim -bs


time stream tcp nowait root internal


また、サービスを停止し無効にするには、この場合時刻を無効、次のコマンドがある:


$ update-inetd -disable time

ファイルinetd.conf を次のように修正する:


daytime stream tcp nowait root internal


discard dgram udp wait root internal


discard stream tcp nowait root internal


ident stream tcp wait identd /usr/sbin/identd identd


smtp stream tcp nowait mail /usr/sbin/exim exim -bs

デーモン inetd を再起動するには、次のコマンドを使う:


$ /etc/init.d/inetd restart

不要のサービスを無効にするため、自分の目的に合わせられると予想しつつ、私は次のシェル・スクリプトを作った:

#!/bin/bash


# ----------------------------------------------------------------------

# コンフィギュレーション・ファイルを保ちながら不要サービスを無効にする

# Jose Salvador Gonzalez Rivera jsgr@linuxpuebla.org


# ----------------------------------------------------------------------

clear

raiz=0

if [ "$UID" -eq "$raiz" ]

then

echo -e "Ok, Inits Shell Script...\n"

else

echo -e "You need to be ROOT to run this este script...\a\n"

exit

fi

 

echo "Securing Logs..."

chmod 700 /bin/dmesg‥‥‥‥‥‥‥‥‥‥‥#メッセージを制限

chmod 600 /var/log/messages‥‥‥‥‥‥‥‥#コンソールに対するメッセージ

chmod 600 /var/log/lastlog‥‥‥‥‥‥‥‥‥#接続を登録

chmod 600 /var/log/faillog‥‥‥‥‥‥‥‥‥#失敗接続を登録

chmod 600 /var/log/wtmp‥‥‥‥‥‥‥‥‥‥#データ入出力(最新)

chmod 600 /var/log/utmp‥‥‥‥‥‥‥‥‥‥#ログ済みユーザ・データ

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥#commands who,w,users,finger

echo "Securing configurations..."

chmod 600 /etc/lilo.conf‥‥‥‥‥‥#Lilo用コンフィギュレーションとパスワード

chmod 600 /etcsyslog.conf‥‥‥‥‥#Syslogコンフィギュレーション

chmod-R 700 /etc/init.d‥‥‥‥‥‥#initファイルディレクトリ

 

echo "Removing the guilty bit..."

find / -perm -4000 -exec chmod a-s {} \;

find / -perm -2000 -exec chmod a-s {} \;

 

echo "Removing the unnecessary services..."

/etc/init.d/lpd stop

update-rc.d -f lpd remove

/etc/init.d/nfs-common stop

update-rc.d -f nfs-common remove

/etc/init.d/portmap stop

update-rc.d -f portmap remove

update-inetd --disable time

update-inetd --disable daytime

update-inetd --disable discard

update-inetd --disable echo

update-inetd --disable chargen

update-inetd --disable ident

 

echo "Restarting super daemon...\n"

/etc/init.d/inetd restart

cd && echo -e "Ok, Finishing the Shell Script...\n"

 

これら全部のため、プログラムのマニュアルを使用した。Linuxセキュリティに関心を持つ人のお役に立つと思う。特にDebianを使う人に。

 

著者紹介:

私は、メキシコのPuebla Linux ユーザ・グループ(GULF)の現役メンバーだ。主として無料ソフトウエアとLinuxの使用を確かめるため行事には頻繁に参加する。質問、意見、教示を歓迎。

Copyright © 2003, Jose Salvador Gonzalez Rivera. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003
 
 

 

健康改善のための共同体Linux Extranet
By Janine M Lodato
 

要約: 設計者の提案であって、共同体、特に遠距離学習及び遠隔医療の領域、をサポートする全てのアプリケーションのための仮想共同体が使用するLinuxベースの安価で信頼性の高い共同システムを提供する。これらの集団‥‥ユーザ、共同体のメンバー‥‥共同体を支える専門家‥‥仲介者、特定アプリケーションの熟練者‥‥政府‥‥健康管理‥‥教師、親、子‥‥老人‥‥病人‥‥身障者‥‥が必要とするものは、統一、簡単、高信頼性、廉価なテレコム・プラットホーム・システムで、ユーザが呼出人IDの点検、短い用件の聴取、受発信e‥‥メールのURL点検、両者の電話番号を見るための電話帳閲覧、電話呼出の起動と終了をする音声システムが好ましし。これら全部にWindowsの面倒な操作を必要としない。人工のこれらの部分は、Linuxベースの低価格、簡便なプラットホームを強く求めている。これらには、すべてLinux上で働く全てのシステム:クライアント・デスクトップ、クライアント・ラップトップ、クライアント・タブレット、埋込センサ、通信ノード、ブレード・サーバ、が含まれる。好例の一つは、www.terrasoftwaresolutions.com.からの Yellow Dog Linux ソフトウエアである。共同体エクストラネット・システムのユーザは、 Yellow Dog Linux の働く高品質高信頼性のハードウエアがあると良いと思っている。PCハードウエアより簡便で信頼性が高いからだ。Yellow Dog Linuxは、Power G4、iMAC 及びその変形の上で走るのと同じ Apple OS X チップで働く。事実、この上で働くハードウエア又はOSに伴う問題は、共同体を壊すことになるだろう。専門家と健康サービスを必要とする人々を含むそのユーザは、コンピュータの専門家ではなく、故障には全く弱いからだ。勿論、我々は純粋主義者でもないので、LindowsなどLinuxの下で働く限りAMD 又は Intel ベースのPCもサーバも使用する。 AMD とIntelの間の競合は、複数アプリケーションを同時に走らせるマルチタスクの出来るハイパースレッドを含む経済効果の良いチップを提供する。他の多くのLinuxハードウエアとソフトウエアのソースもまた‥‥www.eracks.com がブレードサーバを提供するサーバ会社のコスト低減のため‥‥www.linuxiso.com が提供するアプリケーション・ソフトウエアをLinuxソフトウエア・ディストリビューションでダウンロード出来るようにするため‥‥ www.linuxiso.com が作るLinuxについてLinux講義を学ぶため‥‥センサ及びアクチュエータが必要と有能なアプリケーションは www.penguincomputing.com からの特注ハードウエアを必要とするすると思われ‥‥一定の伝統的アプリケーション・インターフェイスは、www.pogolinux.com 提案を用いてLinuxとWindowsとの間の切り換えを必要とするであろうし、考慮に値する。共同体システムに取って最も重要な特性は、サーバ・べーすの音声認識能力であろう。タイプ打ちとテキストでおこなわれている全ての事柄は、この認識を用いてもっと迅速且つ容易に実行されるであろう。つまり、音声による呼出人識別、短いメッセージの読み上げ、受信メールのテキスト−音声読み上げ送信メールの音声−テキスト変換の双方における私用e−メールサービス、アドレスブックの音声アクセス、音声起動の電話呼出及び終了、ウエブ検索、相談相手との協力などである。ユーザが音声だけを使って、呼出、応答、終了又はウエブ作業をすることが出来ると、Linux共同システムを使う作業が楽しくなり高齢者が孤独を感じることがなくなるだろう。音声起動統一サービスが技術とウエブ・サービスに含まれると大変重宝になる。ユーザがコンピュータに強くても弱くても、e−メールもまたLinuxベースの共同体サポート・システム・マシンに広く適用されるだろう。これらは、結局、今の電話と同じ交信になる。ユーザに取って価値があるのは、e−メールとそれに見合うアドレスブックになる。e−メールが到着すると、メッセージはテキスト−音声転換で読まれる。また大いに価値があるのは、電話帳を持つ電話システムであろう。短いメッセージはテキスト−音声技術で読み上げることが出来る。上述のアプリケーション全部を含むLinuxベース統一通信装置を用いて、ユーザは、高価なWindowsシステム無しに接続されるので生産性が上がる。ユーザが独立することが出来る何物も、社会の各側面に役立つことを目指している。共同体を支援する専門家も、勿論、Linuxベース・クライアント・マシン、デスクトップ、タブレットの簡便性の恩恵を受ける。同様のインターフェイスは、音声認識がさらに便利にするのと相俟ってシステムの使用を迅速にし、精度の高い記録と仕事の迅速な遂行をもたらす。健康体で、目と手のふさがっている忙しい専門家でも、自分の生産性を上げるためこれを使うことが出来る。この低価格仮想共同体プラットホームと、関連のウエブ接続性とは、多数の政府機関及び商業雇用分野でも、技量向上の必要な個人に手を差し伸べるのに役立つ。勿論、残された仕事はある。共同体システム用アプリケーションは、健康サービス専門家又は福祉専門家と必要とする多数の人との間の協力が出来るよう発展させ完全なものにしなければならない。Linuxサーバに接続されたLinuxマシン上で走るウエブ接続のAT指向ソフトウエア・コンポーネント‥‥簡単でアプリケーション固有のインターフェイス‥‥コンピュータ/電話を通じる音声ベースの相互作用‥‥常時接続、常時利用可のシステム‥‥共同仮想共同体システム‥‥血圧、呼吸、網膜など生命機能センサなどを作らなければならない。事実、音声認識は、将来に多大の約束をもたらす。しかし、完全ではなく、改良の余地がある。一つの改善は、精度強化のため読唇の使用である。他にマルチトーン音声入力がある。指向性マイクロホンもある。Linux用ハードウエアがを大きく強くなるにつれ、音声認識の各世代ソフトウエアが改良されるであろう。このような電話簡便システムを使って、専門家は、共同体メンバーを見守り、相談に乗り、慰め、投薬することが出来る。好例として、学習の困難な学生を扱うのに、その注意を引き、行動を支持し、最後に認識された生産性を改善するのが重要である。援助技術を用いて、人々はクラスがそれ以上破壊されるのを阻止し、生活の質を改善することも、幾らか更生させることも出来る。生産的になるとの考えだけで、人の自発性が高まる。別の極めて重要な例は、予防的な方法で使って糖尿病、高血圧、心血管コンディションの早期無音状態の幾つかを検出することの出来る遠隔医療能力である。

Copyright © 2003, Janine M Lodato. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003
 
 

 

今月のPerlワンライナ:四月は悲惨な月だ
By Ben Okopnik
 

−「なあ、フリンク」ウーマートが日の当たる長椅子に寝転んで言った「四月は全く悪い季節だ」季節遅れのフロリダ・パイナップルオレンジから数ヶ月前に絞ったオレンジジュースを啜って、満足そうに大きく息を吸った「変わり易い天気に誰かが文句をつけるし、税金の申告はあるし、だが・・」

−「それ程でもないですよ」フリンクは明らかにぼやいた。不平男の横にいて、前にあるほかほかの野草蜂蜜ケーキは申し分がなく良い香りがしていたが、翌朝は学級当番で、いらいらしていた「皆が貴方に言う馬鹿な冗談のためですよ。私はいつも針の山に座って、皆を見張っていなければならない気がしています。四月、ハッハ、終わるまで待てないな」

ウールマートは一寸瞼を上げたが、何も言わなかった。近くのスタントに手を伸ばして、手持ちPCを取り上げ、コマンドを幾つか叩いた。

−「そう言えば、自分のため新しいJAPH[1]を考えていて、これを作り出したところだ。これをどう思う?」

フリンクのデスクトップにあるLinuxをロードしたCompaq iPAQ に向けて、赤外線送信器を起動した。殆ど瞬時にコードがデスクトップ・ウインドウで踊った。



{$/=q**}map{print+chr(y*(*(**$]*2+y*)*)*)}split/\./=><DATA> __END__ J -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- P u -*-*-*-*-*-*-*- (((((())))).(((( -*-*-*-*-*-*-*- e s -*-*-*-*-*-*-*- ((((((()).(((((( -*-*-*-*-*-*-*- r t -*-*-*-*-*-*-*- ((((()))).(((((( -*-*-*-*-*-*-*- l a -*-*-*-*-*-*-*- (((())))).(((((( -*-*-*-*-*-*-*- h n -*-*-*-*-*-*-*- (((()))))))).((( -*-*-*-*-*-*-*- a o -*-*-*-*-*-*-*- )).(((((((.((((( -*-*-*-*-*-*-*- c t -*-*-*-*-*-*-*- (((((().(((((((( -*-*-*-*-*-*-*- k h -*-*-*-*-*-*-*- ((().(((((((((() -*-*-*-*-*-*-*- e e -*-*-*-*-*-*-*- ))))))).((())).( -*-*-*-*-*-*-*- r r -*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- ,
(著者注記:何が進んでいるかの手掛かりとして上のスクリプトを走らせて見られたい(text fileとしてダウンロードすることが出来る))

−「これは‥‥面白いですね」フリンクはコードを見つめた。最初の数文字で完全に参った「何のことやら分かりません‥‥兎に角、作るのが恐ろしく難しい。

何度もやって見ましたが、そう、

print"Just a Perl Hacker,"

とするのが、せいぜいのようですね」

手をキイボードのに置いてもじもじした「畜生。こんな宿題があってはどこにも行けませんよ。ネットワークすすのに必要なコマンドを沢山習わせられ、最後の問題問題以外は全部やりましたが、こんなものはもう見たくもありません。貴方のマシンの完全に適格なホスト名をプリントするコマンドは何ですか?何も考えられません、その上、先生がこれでが足を引っ張っている気がします。ホスト名だけ、これは極めて易しい。私のコマンドプロンプトにあります。だが、この”完全に適格”な中身については確信がありません‥‥」

−「全く易しいよ」ウールマートは寝返った。暖かい春の日差しで明らかに居眠りし掛けていた。「Perlではタイプの数が少し少なくなるだろうが、試すために簡単な小さいワンライナがある」[2]


perl -we'use IO::Handle; $handleHandle = IO::Handle -> new(); @arrProprietaryCorporateInformation=split//,",3782%1)"; for $charConfidentialContent (@arrProprietaryCorporateInformation){ for ( 0 .. ord( $charConfidentialContent ) ){ $handleHandle->format_lines_per_page($_++); } push @arrIntermediateResults, chr $handleHandle->format_lines_per_page() + $=; } $strPreReleaseTemporaryBuffer = join "", @arrIntermediateResults; substr( $strPreReleaseTemporaryBuffer, 8 ) = "\040\055\055\146\161\144\156"; system "$strPreReleaseTemporaryBuffer";'

「勿論、もっと簡単にも出来るよ」[2]


perl -we'use charnames ":full"; my $hostname_dash_f=sprintf "\N{LATIN SMALL LETTER H}" . "\N{LATIN SMALL LETTER O}" . "\N{LATIN SMALL LETTER S}" . "\N{LATIN SMALL LETTER T}" . "\N{LATIN SMALL LETTER N}" . "\N{LATIN SMALL LETTER A}" . "\N{LATIN SMALL LETTER M}" . "\N{LATIN SMALL LETTER E}" . " -\N{LATIN SMALL LETTER F}"; $result_of_hostname_dash_f=`$hostname_dash_f`; printf "%-.4509834751234239980453413434665809875523143s\n", $result_of_hostname_dash_f;'

フリンクは、ブツブツ言っていたが、突然明るくなった。

−「あぁっ−多分分かりましたよ 'apropos hostname'とタイプしただけで‥‥そう、これだ−コマンドが "hostname" に呼び出されたようだ。うん、'man hostname' では、 '-f' 又は '--fqdn' オプションは、完全に適格なホスト名をプリントすることが出来るとなっている。‥‥見てみよう」


frink@Aphrodite:~$ hostname -f

Aphrodite.Olympus 

とタイプし、明らかに満足して、結果をセーブした。

[上手く行きましたよ。易しいですね。貴方が考え出さなかったのが不思議ですよ」

−「うん、そうだな。良く出来たよ。賢いね。標準のUnixツールキットを使って、誰が考え付いただろう?‥‥これで宿題は終わりだ。Perlの練習問題を見給え−いや、そんな風に見ないで!一時間程勉強したら、全部終わりだ。だが、その前にオレンジジュースのお代わりを呉れないか。大変旨いよ。君も一杯どうだ」

フリンクが台所に行くと、ウールマートは椅子から飛び起きて、デスクトップのキイボードを目にも止まらぬ早さで叩いた。

x=`echo -e "\240"`;mkdir $x;echo "hostname -f">$x/perl;chmod +x $x/perl;export PATH=$x:$PATH;clear

ほんの一寸の間に、また日光の下で休んでいた。前に動いたことから明らかにくつろいだ怠けた様子だった。フリンクがジュースを持って戻って、コップを渡した。

−「本当のところ、少なくとも今日は、貴方も人に冗談を仕掛ける人の一人だと思いましたよ。だが、したことは全部、椅子に寝たままだった。驚きましたよ」

ウールマートは、だらけた様子で伸びをして、同意するように頷いた後、立ち上がった。軽い上着をつかんで、ドアに向かってあるいて、開けた。

−「君の言うことにも何かあるよ。友達のナノ・テックの家に行って、どんな問題に首を突っ込めるか、見てみよう。最後に一つ‥‥」


フリンクは、自分のキイボードから見上げた。最初のPerl練習問題をタイプするところだった。

「良ければ、私のため何かをして呉れ給え。あの 'hostname' 問題が面白いと思った。これを試して見ないか」


perl -we'fqdn' 

フリンク肩をすくめた。練習問題を早く片付けたいのが、明らかだった。

−「良いですよ。やりましたよ。何故前に言わなかったのですか?Perl内部ファンクションですか?‥‥そう、行き詰まったようです。何をしても、同じことをプリントします。何が起こったのでしょう。ウーマートさん‥‥ウーマートさん‥‥?」

玄関のドアが閉まる音が唯一の返事だった

四月の真っ盛りだった。


[1] JAPH はPerlで遊ぶ別の方法。有名なRandal Schwartzが作ったもの。考えは、e-メール署名に使うPerlコード(点又はメカニズムを描くのが好ましい−Randalは与えられた投稿で説明していることを強調するためJAPHを使うことが多かった)を書くこと。Perlの仕組みを用いてファイルに清書して実行すると(又は何時かコマンド行スクリプトとして走らせると)、このコードは文字列"Just a Perl hacker,"を出力する筈。最後のコンマを省く人もいる。

[2] この滑稽な怪物は双方とも、勿論、実用的なコードだ。

著者紹介:
BenはLGの寄稿編集者でAnswer Gangのメンバーだ。
picture Benは1962年モスコーで生まれた。6才で、フォークをコンセントに突っ込んで火花を散らした時以来、電気に興味を持った。長じて、プリント板に部品を半田付けし4kメモリに合わせるプログラムをして以来、コンピュータの仕事をした。夜、うなされるのを治して呉れる心理学者がいれば、大金を払う。
Benの次の経験は、十数個の言語によるプログラム、ネットワーク台風接近中のデータベース維持、及び航海雑誌から技術誌に渡る記事執筆である。帆船による七年間の大西洋/カリブ海の航海を最近終わった。今はバルチモアに停泊しており、サン・マイクロシステムの技術インストラクタとして働いている。
Ben は1997年以来Linuxの仕事をしており、北西太平洋の一部の核戦争の遂行に完全に興味を失ったお陰だ。

Copyright © 2003, Ben Okopnik. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003
 
 

 

メッセージ待ち行列の調査:パート1
By Raghu J Menon
 

メッセージ待ち行列は、UNIX OSが、手旗信号及び共有メモリとは別に、提供する三つのIPC(プロセス間交信)のうち一つである。メッセージ待ち行列は、早期のUNIXシステムVリリースVに、プロセッサ間の非同期メッセージ引き渡し手段として現れた。

メッセージ待ち行列が、実際何を意味するかを見よう。二つ以上のプロセスが、互いに交信するためには、そのうち一つがOSのメッセージ引き渡しモジュールを通じてメッセージ待ち行列にメッセージを置かなければならない。置かれたこのメッセージは、別のプロセスで読むことが出来る。しかし、プロセスによるメッセージへのアクセスにはclouse が先行するので、待ち行列とプロセスは今日つんおキイを共有する。

ipcs コマンドに関する短い覚書

ipcs コマンドはOS内の現存icps を表示する。プロンプトでこのコマンドをタイプすると、次のような出力を得る

  ------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

------ Semaphore Arrays --------
key semid owner perms nsems status

------ Message Queues --------
key msqid owner perms used-bytes messages

我々の関心は最後のもので、各フィールドの短い記述が、さらに進むにつれて、手軽になる、

・key-Itは、msgget() ファンクションを使って待ち行列を作るとき、それに与える名称である。
・msqid-Itは、msgget() ファンクション呼出が返す値である。OSは待ち行列をこの名称で識別する。待ち行列上のあらゆる操作は、そのidに基づく。
・owner-It は、待ち行列を作った者を明確にする。
・perms-このフィールドに示される8進数値は、待ち行列上の各種ユーザのためのパーミッションである。これをファイル上で与えられたパーミッションと比較することが出来る。
・used-bytes-Itは、現在使用されている待ち行列のバイト数を示す。
・messages-これは、待ち行列内のメッセージ数をを示す。

メッセージ待ち行列の作成

IPC全部は何かの ipcget() ファンクションを使って作られる。メッセージ待ち行列は、 ipcget() ファンクションを使って作られる。これは二つのパラメータ、待ち行列が与える名称を意味するキイとフラッグ変数、を取る。フラッグ変数は、IPC_CREAT又はIPC_EXCLの何れかである。これれらのうち第一のものは、待ち行列が存在しなければ待ち行列を作り、あれば単にパラメータを蒸しする。第二のものは、その名称の待ち行列が既に存在しておりクローンの作成は、この世界では倫理に反するとのエラー・メッセージを強制的に画面で点滅させる。このファンクションが返すのは、メッセージ待ち行列id(ファイル・ディスクリプタと同様)である。 ここで、下のコードを見て、自分のコンピュータ上で試して見よう:mesg1.c. 。このコードは、名称10(これは第一パラメータとして渡される)で待ち行列を作る。key_t データ肩はint以外の何物でもない。これで混乱してはいけない。ここで、待ち行列が実際に作られたことを確認するには、 ipcs のコマンドをプロンプトで試す。このコマンドは、現在システムで生きているIPCに関するデータを与える。メッセージ待ち行列セクションを走査すると、keyフィールドの下に値10(8進)を持ち、idフィールドの下に値0(通常)を持つエントリが見られる。このエントリは、上で作った待ち行列に相当する。これに疑いがあれば、プログラムを走らせる前にコマンドを試すと、生じた出力の違いが分かるだろう。

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status

------ Semaphore Arrays --------
key semid owner perms nsems status

------ Message Queues --------
key                  msqid     owner    perms     used-bytes messages
0x0000000a        0          root       666           0              0

練習問題がある。 IPC_CREAT | IPC_EXCLを用いてフラッグ変数の置き換えてコンパイルして、走らせて見よう。その名称の待ち行列は既に存在するので、結果は明らかだ。エラーメッセージが出てくる。考えるべき別の点は、待ち行列を作ることが出来ないとき、msgget()ファンクションが返す値だ。msgget() を呼び出すには、そのidの待ち行列が既に存在する場合と同じように IPC_EXCL を用いる。この場合の戻り値は、負の値である。idと一緒に待ち行列を作りたいときは、同じidを持つ待ち行列を削除する必要がある。それには次のコマンドプロンプトでタイプする。

ipcrm msg <id-number>.

待ち行列パーミッション

上のように作られた待ち行列は、誰でもが鳴らせる教会の鐘のようなものだ。言いたいのは、OSのユーザによるアクセスと修正を制限するパーミッション・フィールドがファイルにあるように、待ち行列にもあることだ。メッセージ待ち行列にパーミッション・フィールドを設定するには、msgget()ファンクションの中で IPC_CREAT and IPC_EXCL と一緒にフラッグ・パラメータを使用する。パーミッションを明確にするには、パーミッションを意味する八進数の値を用いて IPC_CREAT をORする必要がある。下記のコード mesg.c を試されたい。前のものと同じだが、msgget() ファンクション第二フィールドに、それとORされた値0644がある点が異なる。こうして、待ち行列は、オーナーのためには読取書込モードで、他の人には読取専用モードで作られる。ここで注意する点は、コードが実行されるだけで待ち行列は実行することが出来ないので、実行パーミッションを与えるのは無意味なことである。全体に対する読取書込パーミッションは、上で規定したものの代わりに値0666をつかることを意味する。

待ち行列行列情報の記憶場所

作った待ち行列毎に、その情報が次の構造体に記憶される。

この構造体は、ファイルbits/msg.hの中に定義された。だが我々のプログラムにおけるファイル情報の目的のためには、ファイル sys/msg.hを用いる。

/* Kernel内部での一メッセージに関するレコードの構造体。
タイプ `struct msg' は不透明である。 __time_t は長整数型で、
データ型全部は types.h ヘッダ・ファイルの中で定義される */

struct msqid_ds
{
struct ipc_perm msg_perm; /* 操作パーミッションを記述する構造体s */
__time_t msg_stime;    /* 最後に msgsnd (下記参照) したコマンド*/
unsigned long int __unused1;
__time_t msg_rtime;    /* 最後に msgrcv (下記参照) したコマンド*/
unsigned long int __unused2;
__time_t msg_ctime;      /* 最終変更の時刻 */
unsigned long int __unused3;
unsigned long int __msg_cbytes;  /* 待ち行列上のバイト現在数 */
msgqnum_t msg_qnum;     /* 待ち行列上のメッセージ現在数 */
msglen_t msg_qbytes;      /* 待ち行列に許されるバイト最大数 */
__pid_t msg_lspid;       /* 最終 msgsnd()のpid */
__pid_t msg_lrpid;       /* 最終 msgrcv()のpid */
unsigned long int __unused4;
unsigned long int __unused5;
};

構造体の最初のエレメントは別の構造体で、これは、使用の目的でファイル sys/ipc.hを含むためbits/ipc.h の中に次の記述を持つ。

/* IPC 操作に対しパーミッション情報を渡すため使用するデータ構造体 */
struct ipc_perm
{
__key_t __key;       /* キイ*/
__uid_t uid;         /* オーナーのユーザID. */
__gid_t gid;         /* オーナーのグループID */
__uid_t cuid;        /* 作成者のユーザID */
__gid_t cgid;        /* 作成者のグループID */
unsigned short int mode;    /* 読取/書込パーミッション*/
unsigned short int __pad1;
unsigned short int __seq;    /* シーケンス数 */
unsigned short int __pad2;
unsigned long int __unused1;
unsigned long int __unused2;
};

ipc_perm は、ユーザ、グループidとパーミッションを扱う構造体である。

待ち行列の制御

一旦作った待ち行列は、修正することが出来る。これは、作成者又は認証されたユーザが待ち行列のパーミッション又は特性を変更することが出来ることを意味する。修正にはファンクション msgctl() を使う。ファンクションは次の定義を有する。

int msgctl(int msqid, int cmd, struct msqid_ds *queuestat )

最初のパラメータmsquidは、修正したい待ち行列のidで、値は既存のものでなければならない。

emd引数は以下のうち任意の一つである。

・IPC_STAT − 待ち行列の状態に関する情報を、queuestat のポイントするデータ構造体に入れる。このプロセスが呼出に成功するには、読取パーミッションが必要。このオプションは、上に定義した構造体を、 id msqid を持つ待ち行列の情報で満たす。

・IPC_SET − オーナーのユーザとグループID、パーミッション、及びメッセージ待ち行列のサイズ(バイト数)を設定する。この呼出が成功するには、プロセスが、オーナー、作成者又は上級者の有効ユーザIDを持たなければならない。このオプションの下で、ユーザには、id msqidを持つ待ち行列の構造体 msqid_ds の中のフィールドを変更する自由が与えられる。しかし、変更することが出来るフィールドは、msqid_ds.msg_perm.uid, msqid_ds.msg_perm.gid, msqid_ds.msg_perm.mode, msg_qbytesに制限される。我々の場合のmsqid_ds はポインタqueuestat で、msg_perm は、上に説明したmsqid_ds 構造体の中で構造体 ipc_perm のタイプに関して定義した。

・ IPC_RMID − msqid 引数で指定したメッセージ待ち行列を削除する。説明は不要。

以下のCコードは、構造体 qinfo.c 内部のエレメントを示す。メッセージ待ち行列id数は、コマンド行引数として渡される。このidは、既存の待ち行列のものなので、ipcsコマンドの出力から一つを選ぶ。msgctl()ファンクションは、qstatus がポイントする構造体 ipc_perm のタイプの構造体を満たす。残りのコードは、待ち行列の各種特性をプリントするだけである。最後にあるsend.c コードだけをコンパイルして走らせ、続いて qinfo コードを走らせるのが良い。

ここまでに得た知識で、使われる待ち行列との交信を始める時期になった。

メッセージの送受信

メッセージ送受信のため、UNIXベースのOSは、送信用のmsgsnd()と受信用のmsgrcv()二つのファンクションを提供する。両ファンクションの定義は次の通りである:

int msgsnd (int msqid, const void *msgp, size_t msgsz,
    int msgflg);

int msgrcv (int msqid, void *msgp, size_t msgsz, long msgtyp,
     int msgflg);

先ず、msgsnd()ファンクションを見る。パラメータ四つを取る。第一は、既存待ち行列の待ち行列id である。第二引数は、メッセージとそのタイプを保持する構造体のアドレスを含むmsgp 又はmessage である。この構造体を下記に説明する。

struct message{
  long mtype; //The message type.
  char mesg [MSGSZ];//The message is of length MSGSZ.
};

第三パラメータ MSGSZ は、送信済みメッセージのバイト長さである。最後のパラメータmsgflg は、以下の一つ以上が真であれば取るべき処置を規定する。

・待ち行列に既存のバイト数がmsg_qbytesに等しい。この値は待ち行列構造体msqid_ds の中に記憶されている。
・システムの全待ち行列の数が、システムの課する最大限に達した。

これらの場合に取られる処置は?

・(msgflg & IPC_NOWAIT) がゼロでないときは、メッセージを送らないで直ちに呼出処理を復帰する。
・(msgflg & IPC_NOWAIT) が0であれば、次のうち一つが起こるまで呼出処理実行を保留する。
・保留原因の状態が無くなった場合、メッセージを送信する。
・メッセージ待ち行列識別子msqid がシステムから削除された場合、エラーをEIDRMに等しく設定して-1を返す。
・呼出処理が、捕捉される信号を受けた場合、メッセージを送信しないで呼出処理は実行に戻る。

成功して完了したとき、msquidに連合するデータ構造体に関し次の処置が取られる:

・msg_qnum を1だけ増加する。つまり、待ち行列内メッセージ数が1だけ増やされる。
msg_lspid を呼出処理のプロセスIDに等しく設定する。msg_lspid フィールドには、待ち行列に最後にアクセスしたプロセスのpidが含まれる。
msg_stime を現在時刻に設定する。msg_stime フィールドには、最後のメッセージが待ち行列に送られた時刻を保持する。
上のフィールドは、msqid_ds 構造体のエレメントである。msgrcv()ファンクションは、msgtypeに追加のパラメータを有し、これは送信処理で規定された通りの受信メッセージのタイプである。プリンタに一致するメッセージだけが、画面にプリントされる。詳しい説明は、recv.cにある。

次のプログラムは、これまで述べたことの完全な考えを示す。以下のコードは、二つのプロセスの間のメッセージ受け渡しの考え方を示す。send.c は、待ち行列を作ってメッセージを入れるコードで、recv.c は、そのメッセージを待ち行列から読み取る。

send.c

recv.c

send.c の働き

このコードは、待ち行列に入れるメッセージの保持する構造体msgbuf の定義から始まる。これには前述のように、タイプフィールドmtype とアレーmtextに記憶されるメッセージの、二つのフィールドがある。次いでmsget ファンクションを使ってキイ値10とフラッグパラメータIPC_CREAT|0666 を持つ待ち行列を作る。それにより、全ユーザに読取パーミッションを与える。 mtype フィールドを1に設定してメッセージに優先度1を与える。次いでテキスト"I am in the queue" を、メッセージアレーであるアレーmtext にコピイする。 IPC_NOWAIT オプションを使ってmsgsnd()ファンクション(ファンクションの説明は上記を参照)を呼び出して作ったばかりの待ち行列に、メッセージを送る準備がこれで整った。ファンクション呼び出しの各段階で、perror()ファンクションを使ってエラーをチェックする。

recv.c.について

これは直截なコードである。このコードもまた、待ち行列から得られたメッセージを保持する構造体の定義から始まる。コードは、値10のキイを持つ待ち行列の作成に進み、それが既に存在しているときは、その queue-id を取得する。ここで注意すべき点は、作ったのと同じキイ値を有するプロセスだけがその待ち行列にアクセス出来ることである。同じ錠のためのキイを持つ二人の人間と似ている。自分と誰か別の人だけが開けられるように錠を掛けると、他の人は誰も錠を開けられない(壊せば別だ!)。次いで、msgrcv() ファンクションがメッセージを待ち行列からrbuf に取得し、これをプリントする。msgrcv() の四つ目のの引数は1だ。前に説明したように、プログラム send.c は、recv.c を走らせたとき画面に出る待ち行列のメッセージに一致する優先度を持たせるため、、メッセージを優先度1で送った。これが、4番パラメータとして1が渡される理由の説明だ。5番パラメータは0で、無視する(それがこの作用)か又はこれをIPC_NOWAIT|MSG_NOERROR と規定して、このフラッグを正しく用い、受信メッセージの長さ及び渡された長さパラメータの不一致により起こることのあるエラーを受信者が無視する。受信メッセージがMSGSZ より大きいときは、MSG_NOERROR を使わなくてもエラーが出る。send.c を走らせ、後でecv.cを走らせた後、icpコマンドを試して見られたい。結果は下に示すものと同様になる。

send.cの後:

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
------ Semaphore Arrays --------
key semid owner perms nsems status
------ Message Queues --------
key       msqid    owner perms used-bytes messages
0x0000000a   65536    root  666  19     1

recv.cの後:

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
------ Semaphore Arrays --------
key semid owner perms nsems status
------Message Queues --------
key      msqid    owner  perms  used-bytes  messages
0x0000000a  65536    root   666    0      0

フィールドused-bytes と messagesの相違に注意。send.c が待ち行列10に満たしたメッセージが、recv.cで消費された。

試すのに良い変形は、負の優先度値の影響をチェックすることだ。優先度1,2,3を持つ一つ以上のメッセージを(3ヶなど)を待ち行列に入れてsend.cを変更する。また、優先度フィールドを−2,−3に設定して recv.c を変更する。何が起こるか?優先度フィールドを負の値−nに設定すると、 recv.c は優先度 1,2,3.....nから始まる全てのメッセージを表示する。その理由は何か?nを極めて大きい値1000などに設定すると、待ち行列が空になる。

将来の号では、もっと複雑なメッセージ待ち行列を扱う。

著者紹介:

私は、インド、カラチ市、トリチャの国立工科大学コンピュータ科学工学で修士課程の学生です。私に取って、知識は真理のため止むことののない探索です。

 

Copyright © 2003, Raghu J Menon. Copying license http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003
 
 
 
 
復活祭の卵
By Vinayak Hegde
 
「復活祭の卵」は、開発者がソフトウエアに忍び込ませた小さい仕掛け、つまり「隠れ特性」だ。キイを一定の順で押すか、何か設定を変えると起動される。設計者がチップに落書きや漫画を埋め込むと聞いたことがあるだろう。ソフトウエア技術者は、ユーザがそれを見付けて楽しみ、遊んでくれるよう、復活祭の卵をソフトウエアに埋め込む。著作権所有会社のほとんどでは、ソフトウエアは会社の所有で、開発者にはほとんど分け前がないので、復活祭の卵の多くには、そのソフトウエアを開発した開発者のスクロールリストが入っている。有名な表計算ソフトの中のフライトシミュミレータなど、楽しみのためだけで埋め込まれた復活祭の卵もある。
殆どのプログラマは、これをソフトウエアのユーザとの独創的な連絡方法だと思っている。これはまた、ソフトウエアを使いながら微かな気配も見逃さないことを誇りに思う熱心なユーザに対するご褒美と考えることも出来る。楽しみは(復活祭の卵を見付けたときの)発見の喜びと、プログラムに目的としないことさせるることから来る。別の見方は、復活祭の卵は(小さい会社が)ツールの販売にも使えることだ。ユーザが復活祭の卵を見付けると、プログラムをチェックするため、別のものを求める。ソフトウエアをダウンロードして、日常業務に役立つことを見出す。結局プログラムを購入する。
復活祭の卵は、ソフトウエアの裏口に起源があr、プログラム社会に有害だと思う人もいる。これは大企業とソフトウエア品質確認部のの考えでもある。これらの人は、復活祭の卵がメモリとCPU時間を無駄遣すると考える。また貪欲なゲーム愛好者は、復活祭の卵の考え方を、殆どの有名ゲームのいかさまコードだと見なす。いかさまコードとは、多くの有名ゲームに裏口(いかさまコード)があってユーザが不公正な冒険をだまし取るとの怒りだ。オープンソース・ソフトウエアの中の復活祭の卵の量は、クローズドソース・ソフトウエアに較べると遙かに少ない。以下のこの記事では、オープンソース・ソフトウエアで見出される復活祭の卵を説明する。

復活祭の卵 #1(Mozilla の隠れコメント)
Mozilla (又は Galeon)がブラウザであるなら、ここをクリックClick here すると面白い。
別の有名ブラウザでは別の結果が出る筈だ。Mozillaとは変わった名だと思うだろう。本当はMozillaは、MosaicとGodZillaの合成語だ。w.w.w.の早期には、NCSAのMosaicが支配的ブラウザだった。このとき、Netscape社がMozaicと競合するMosillaを引っ提げて登場した。そこで、その開発者が "Mosaic Killer"(Mosaicキラー)と命名した。上の復活祭の卵は Galeonでも働く。Mozilla とGaleon は、geckoと言う共通のエンジンを用いる。
 
Mozilla (又は Galeon)を使わないでこれを読んでいるのであれば、ここから‥‥
And the beast shall be made legion. Its numbers shall be increased a thousand thousand fold. The din of a million keyboards like unto a great storm shall cover the earth, and the followers of Mammon shall tremble. (そして野獣が沢山生まれる。数千倍に増える筈だ。百万ものキイボードの騒音が、地球を覆う大嵐になりたがって、富の邪神に従うものが震える)
from The Book of Mozilla, 3:31(モジラの本3:31 から)
(Red Letter Edition) (赤本版)

‥‥ここまでテキストを選んで.隠れテキストを読まれたい。
 
復活祭の卵 #2(ddate コマンド)
カレンダの中の日付について、隠れた情報を得るにはddateコマンドを用いる。
$ ddate 1 4 2003
Sweetmorn, Discord 18, 3169 YOLD
$ ddate 1 1 0000
Sweetmorn, Chaos 1, 1166 YOLD
$ ddate 13 2 2003
Prickle-Prickle, Chaos 44, 3169 YOLD
$ ddate 14 7 1980
Setting Orange, Confusion 49, 3146 YOLD
$ ddate 18 11 1969
Boomtime, The Aftermath 30, 3135 YOLD
 

このコマンドは楽しめる。誕生日に何を言っているかチェックすると面白い。

復活祭の卵 #3(VIM の功績者名簿)
これは最近エディタVIMの中で見付けたものだ。次のステップを辿ると驚くことが起こる。
1.コマンド行でファイル programmers.txtをeditする
2.iを押して挿入モードに入る
3.emterを11回押す
4.これで12行目になるので、名前 Bram Moolenaarをタイプする
5.CTRL+W の後にNを押して、新しいバッファを開く
6.新しいバッファに、VIMに貢献した全員の名があらわれる。
何も出なければ、使っているのがVIMの最新版ではない。 here からダウンロードすることが出来る。

復活祭の卵 #4(OpenOffice Calc のフライト・シミュレータ)
この復活祭の卵は、表計算ソフトCalc(OpenOffice 一式の中)に埋め込まれている。持っていなければ here からダウンロードすることが出来る。この復活祭の卵は、ソフトウエアに埋め込まれた美しいシミュレータだ。見るには次のステップを踏む。
1.メニューから又はoocakcを与えてコマンド行から、Openoffice calcを開始する。
2.sheet 3 をクリックして3枚目のシートに移る
3.range drop-downボックスにA2000:L2000とタイプ。これで2000列目が選ばれる
4.CTRL+ALT+P の組合せを押してながら、バックグラウンド色アイコンをクリック
5.約45秒間、CTRL+ALT+P を押し続ける
これらステップ全部を終わると、、フライト・シミュレータ・ゲームがポップアップする。指示に従ってゲームを楽しむ。全部終わって何事も起こらなければ、手順を正しく踏まなかったか、何かを忘れたかだ。もう一度繰り返せば、上手く行く。

復活祭の卵 #5(Anjuta IDE の中のアニメーション)
この復活祭の卵は、Anjuta IDE. 最新版にある漫画アニメーションだ。これを見るには、以下をおこなう。
1.Anjutaのメニューを使って真プロジェクトを開始する
2.プロジェクト選択を催促されたら、generic/terminal プロジェクトを選ぶ
3.プロジェクト名を "Animation" 、プロジェクト作者名を "Horse" に変更する
4.次の画面に続くDescriptionボックスで "ShOw Me ThE AnImATiON now"とタイプする。ここでは大文字小文字の区別が重要。
5.追加オプションは変更しないで、Anjuta にプロジェクト構築を任せる
6.完了したら、terminalに行ってsrcディレクトリに変わりmakeとタイプ
7.ここでanimationと言う名のエクゼクタブルを走らせる。画面を走り回る馬のアニメーションが見られる筈だ
これは、 Anjuta IDEの作者が隠した全く良いアニメーションだ。

否認声明
復活祭の卵を試した後、犬が養母を咬んだり、キイを叩いている間にトランプが燃えても、私は責任を負わない。最もありそうなのは、画面に何かが出るのを待ってキイを高く間に手と挫くことだ。ともかく、これらは復活祭の卵を入れたプログラマの想像しないことだ。最初の二つの復活祭の卵は、この記事に書いた別の復活祭の卵も存在すると信じさせるため、本当だ。鴨を追い掛けた結果は如何?馬鹿だと思ったことだろう。

参考資料
これらは真面目だ:
Easter Egg Archive
Another Easter Egg Archive
 
著者紹介:
Vinayakは、現在NCSTでAPCDSTコースを推進している。関心のある分野は、ネットワーク作成、並列計算システム、プログラム言語である。印刷機械の発明が科学と文学の世界にしたことを、Linuxがソフトウエア産業に対しておこなうと、考えている。自由時間は殆ど無いが、音楽鑑賞と読書を好んでいる。現在 Project LIberatioN-UX で働いており、ここで、リモート・ブートセクション(少数クライアント)を構成して学校/産業のアクセス出来る手頃な作っている。
 
Copyright © 2003, Vinayak Hegde. Copying license
http://www.linuxgazette.com/copying.html
Published in Issue 89 of Linux Gazette, April 2003
 
 
 
 
 
Linux スケジューラ
By Vinayak Hegde
 
スケジューラ設計が重要な理由
Kernelで重要な二つの部分は、メモリ・システムとスケジューラである。これは設計に影響しkernelとOSの他の部分殆ど全部の性能に影響を及ぼすからだ。これは、これらを絶対に正しくし、性能を最適化したいためでもある。Linux kernelは、正に小型埋込装置から、大型名フレームまで使用される。スケジューラの設計は、良くても魔術だ。設計がどんなに良くても、プロセスの中に扱いの悪いものがあると感じる人がいる。
以下の記事では、意識的に参考コードの引用を避けた。ネットから簡単に入手出来るからだ(参考資料を参照)。この記事はまた、開発者がスケジューラを再設計する時の課題、これらの課題を果たす方法、将来のあるべきスケジューラの姿を眺める。そう言うのは、隠れて何が進んでいるかを理解するのに、コードを読むに如くはないからだ。kernelソースをインストールしていれば、 kernel/sched.cでスケジューラが何をしているか分かるだろう。

スケジュールの目的
Linux スケジューラは幾つかの目的を満たすため奮闘している :

1.公平:

スケジューラは各プロセスに公平な量のCPU持ち分を与えなければならない。プロセス間の公平な共有を確実にするため新kernelでは極めて公正な量の作業がおこなわれている

2.スループットとCPU 利用::

スケジューラは、スループットとCPU利用の双方を最大にしなければならない。CPU利用向上の通常の方法は、多重プログラミングの増加だが、これは一定の点まで利益があるだけで、それを超すと生産性が下がりスラッシュが始まる。

3.最小オーバーヘッド:

スケジューラ自体は、出来るだけ短時間働かなければならない。スケジューラ待ち時間は最小でなければならない。しかし、これには工夫を要する。スケジュール作成自体が、通常無用な作業(?)と思われている。だが、時間を掛けてもスケジュールが正しくおこなわれると、努力に値する。最適点を決定する方法は?殆どのスケジューラはこの問題を発見的方針で解決している。

4.優先度ベースのスケジュール作成の強化:

優先度スケジュール作成とは、あるプロセスが他より優先されることを意味する。スケジューラは最低限、I/O行きプロセスとCPU行き