Linux –XScreenSaverへの活用

Linux –XScreenSaver への活用–
理工学部 数理情報学科
T020074 田端真也
指導教員 池田 勉
概要
パソコンを使用している人は、一度は見たことがあるであろうスクリーンセーバーにも
様々なものがある。一般的によく見かけるものは画面上をアニメーションで動くものであ
る。また、現在の時刻を表示させるもの、今の表示されている画面を利用し変化させるも
のなど非常にたくさんある。最近のパソコンには必ずといっていいほど、スクリーンセー
バーのプログラムが入っている。特に、Linux では XScreenSaver というアプリケーショ
ンで様々なアニメーションスクリーンセーバーを実行していることが多い。本研究では、
XScreenSaver でのスクリーンセーバー作成を目的として、Linux の基礎知識や基本的操作
方法を学び、その実行例を Linux を使用したことがない人でもわかるように示した。
簡単にスクリーンセーバー作成といっても、ただアニメーションを作成すればそれで実
現可能というわけではない。Linux は X Window System と呼ばれるウィンドウシステムを
用いて、画像を表示するアプリケーションなどを実行している。そこでスクリーンセーバー
は、主にその X Window System が持つ関数ライブラリ Xlib を用いてアニメーションを作
成していかなければならない。つまり、XScreenSaver は X Window System 用に書かれた
プログラムならスクリーンセーバーにすることが可能であるということである。本研究で
は Xlib を用いた簡単なアニメーションを作成し、そのプログラムを実際に XScreenSaver
に加える。もともと、Xlib を用いたプログラミングはデスクトップ画面の一番根の部分の
ルートウィンドウに描画することが可能である。しかし、ルートウィンドウに描画するだ
けではいわゆる背景の部分でしか描画されない。そこで、スクリーンセーバーにするため
には仮想のルートウィンドウを用意して、ある一定時間立てばその仮想ウィンドウ上にア
ニメーションを実行し、画面全体を覆うことにする。仮想ルートウィンドウをルートウィ
ンドウとして認識させるために vroot.h というヘッダファイルを Xlib で書いたプログラム
でインクルードした。そして、完成した実行ファイルを XScreenSaver に加えた。結果は、
簡単なプログラムだがスクリーンセーバーとして実行可能となった。
本研究は、複雑なプログラムこそ書けなかったが、Linux 初心者の私が初心者なりに勉
強した結果をまとめたものである。習熟している方にとってはおもしろくないかもしれな
い。しかし、Linux を知らない人や、これから勉強しようとする人、XScreenSaver を使っ
てみようとする人にとっては、必要最低限の基礎知識を書いておいたので参考になれば良
いと思う。
2005年度特別研究
Linux
–XScreenSaver への活用–
理工学部 数理情報学科
T020074 田端 真也
指導教員 池田 勉
目次
1
2
はじめに
1.1
研究の動機
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.2
流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3
本研究の論点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
Linux
Linux とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2
カーネルを構築するディストリビューション . . . . . . . . . . . . . . . . .
4
2.3
Linux の特徴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.4
ディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.4.1
ディレクトリツリー . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.4.2
root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
X Window System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.5.1
X Window System とは . . . . . . . . . . . . . . . . . . . . . . . .
9
2.5.2
X サーバ・X クライアント . . . . . . . . . . . . . . . . . . . . . . . 10
2.5.3
デスクトップ環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.6
CUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.7
端末操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
スクリーンセーバー
3.1
3.2
3.3
3.4
4
4
2.1
2.5
3
2
15
XScreenSaver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1.1
デーモン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1.2
xscreensaver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1.3
xscreensaver-demo . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.4
xscreensaver-command . . . . . . . . . . . . . . . . . . . . . . . . . 17
xscreensaver をインストールし使用してみる . . . . . . . . . . . . . . . . . 18
3.2.1
xscreensaver のインストール . . . . . . . . . . . . . . . . . . . . . . 18
3.2.2
xscreensaver の使用方法 . . . . . . . . . . . . . . . . . . . . . . . . 18
スクリーンセーバーを作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3.1
X 用のプログラム (Xlib) . . . . . . . . . . . . . . . . . . . . . . . . 22
3.3.2
vroot.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3.3
xscreensaver に追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
XScreenSaver を効率よくする方法 . . . . . . . . . . . . . . . . . . . . . . . 27
終わりに
28
1
はじめに
1
1.1
研究の動機
私が本研究の Linux 上でのスクリーンセーバー作成というテーマにしたのは、研究室で
使用している OS が Linux(VineLinux3.1) であったとう簡単な理由からである。私も最初
は周りの人と同じ OpenGL を利用したアニメーションを作成し、スクリーンセーバーとい
う形の作品に仕上げようとしていた。しかし、私が使用している OS が Windows ではな
かったため特別研究当初から壁に当たっていた。スクリーンセーバー作成のため OpenGL
を利用してプログラムを作成することは同じであったが、何より Linux を普段全く使用し
ていなかった私にとってまずは Linux という OS について勉強することが始まりだった。
Linux については全く知識がなかったが、4 年前期が終わる頃にはある程度の Linux の基
本的な知識を身に着けることが出来た。
そこで次は、アニメーションを作成し始めたが、作るならば本格的にアニメーションだ
けではなく PC 上でスクリーンセーバーとして実用したいと考え、今度は Linux ではど
のようにすれば完成したアニメーションをスクリーンセーバーにすることが出来るのかと
いう根本的な疑問を持つようになった。単に完成したプログラムを適当なスクリーンセー
バーがあるファイルに貼り付ければよいのか、また、設定ファイルなどを変更しなければ
ならないのか、具体的にはどうすれば良いのか調べ始め、アニメーションを作成すること
と平行で作業していった。調べていく上で、Linux のシステムを理解しながら作業するこ
とには時間と労力が懸かったので、後期終盤には悔いが残るがアニメーション作成を諦め
て Linux の理解とスクリーンセーバー作成方法をメインに学習することにした。こうした
ことがきっかけで、研究テーマが自然と決まっていった。
1.2
流れ
本研究の流れとして、まずスクリーンセーバー作成方法習得を目標に Linux の仕組みを
図書やインターネットで学習した。Linux の情報は現在では多く、どのような OS なのか、
どのようなプログラムで成り立っているのかを調べられ、また簡単なターミナル (GNOME
端末) での操作方法を身に付けていくことができた。
次に、本題のスクリーンセーバー作成方法を調べ始めた。具体的に言うと、OpenGL で
作成したアニメーションを Linux 上でスクリーンセーバーとして用いる方法である。しか
し、Windows でのスクリーンセーバー作成の情報はあったが、私が目標としてあげてい
る Linux での正確な情報は英語が多く、また日本語での解説も 10 年前など古いものばか
りで日本語での正確な方法は載っていなかった。そこで、私が研究で使用していた PC に
は、標準で xscreensaver(図 1) というスクリーンセーバーを設定できるアプリケーション
がインストールされていたためこれから調べ始めた。xscreensaver も公開してるサイト [1]
は英語であり、まずはサイトの翻訳から始め、自分の PC の xscreensaver のフォルダにあ
2
る README やソースファイルなどを参考にしていった。この xscreensaver は今も更新さ
れているので、現在の PC のスペックに合ったスクリーンセーバーを実行可能にさせるの
は良かった。ここで、研究の目的はこの XScreenSaver で動作できるスクリーンセーバー
プログラムの作成に決定した。
図 1: xscreensaver
1.3
本研究の論点
私が考えるスクリーンセーバーの原理は、キーボードやマウスの動きを監視し、ある一
定時間動作がなければ画面全体をウィンドウとしたアニメーションを実行するというもの
である。このためには、そのキーボードやマウスの動きを何で監視するのか、アニメーショ
ンはどういったプログラミング言語で書く必要があるのか、画面全体をどのようにウィン
ドウで覆うのかといったことが研究の本題となると考える。また、本研究を実現するため
には Linux におけるどのような知識・操作が必要であるのかも Linux を知らない人がわか
るように具体的に示していきたい。
3
2
Linux
2.1
Linux とは
Linux は [2] によると、狭義では、OS(オペレーティングシステム) の一種にすぎないと
ある。つまり、コンピュータシステムのソフトウェアのうち、ハードウェアを制御する部
分である。わかりやすくすると、OS とは、アプリケーションソフトウェア (文章処理プロ
グラムなど) に、ハードウェア機構 (プリンタや CD ー ROM ドライブなど) へのアクセス
を可能にするシステムである。広く使われている PC ハードウェアを制御する OS には、
他にも OS/2、Novell NetWare、SCO、Windows NT などがある。DOS や Windows も
OS には違いないが、これらのシステムではアプリケーションがハードウェアを直接アク
セスすることが許されているので、これらを上記のようなシステムと同列に扱っていいか
どうかは疑問である。
また [2] によると、広義には、Linux はより大きな存在とある。一般に Linux といえば、
非常に多くの UNIX の機能を集めたものであり、様々なアプリケーションプログラムを提
供するシステムのこととある。多くの会社や団体が、それぞれ異なった長所を持つディス
トリビューション (配布パッケージ) を作成していて、それらはユーザーやユーザーグルー
プの要求に合わせて作られている。最も一般的に必要とされるツールだけを収めたディス
トリビューションから、完全な開発環境と大量のフリーなアプリケーションを提供するディ
ストリビューションにも及ぶ。
2.2
カーネルを構築するディストリビューション
Linux の本来の姿は「vmlinuz」(/boot ディレクトリ内) という名前の一つのファイル
に過ぎない。これが「Linux カーネル」つまり Linux の核という意味である。この Linux
カーネルが Linux の持つマルチタスク (複数の処理を同時の行うこと)、メモリや CPU の
制御、その他ハードウェアの管理を担っている。
Linux カーネルは無料で配布されており、かつ用途を限定しないので Linux カーネル開
発グループは、カーネル開発以外の作業に干渉することはないのである。つまりは、基盤
は全て開発グループで用意されているので、後はそれをもとに構築していくかなど自由に
使用することができる。Linux の多様性はこのスタンスから生まれたものである。
しかし、カーネルファイルだけでは核しか持っていない状態なのでマシンを起動するこ
とさえ出来ない。これでは一般の利用者は困ってしまう。そこでこの問題を解決するため
に、ディストリビューションが存在しているのである。つまり、[6] によると Linux カーネ
ルを中心に構成された GNU/Linux オペレーティングシステムをインストールしたり、利
用できる形にまとめ上げたものをディストリビューションと呼ぶ。GNU/Linux オペレー
ティングシステムとは Linux カーネルを中心にそのほかのソフトウェアを追加して一般の
OS と呼べる機能を持たせたものである。これを単に Linux と呼ぶが、Linux を OS とし
4
て構成するには Linux カーネルと GNU ソフトウェアのいくつかが最低限必要になるため
このように GNU/Linux オペレーティングシステムと呼ぶ場合もある。
Linux ディストリビューションは [2] に従って説明すると一般的に、
Linux カーネル+フリーソフトウェア+シェアウェア+商用ソフトウェア
の集合体であり、ディストリビューションは大きく分けて次の3つに分類できる。
RPM 系 RPM(RPM Package Manager) は Red Hat 社が開発したソフトウェアのパッ
ケージ (プログラムやデータなどをひとまとめにしたフォルダ構造) を管理するため
のシステム、及びコマンドである。主に Linux のディストリビューションのうち、
Red Hat 社が提供するものだけでなく、独自のカスタマイズを含む SUSE Linux、
Vine Linux などが RPM 系ディストリビューションで使用される。ファイルの配布
形態は rpm である。
Debian 系 非営利のユーザーコミュニティである Debian Project が開発配布しているディ
ストリビューションである。非営利だからといって決して悪くはなく、セキュリティ
のアップデート、コミュニティの活動も行われているので安心して使用できるディ
ストリビューションである。ファイルの配布形態は deb である。
Slackware 系 数ある Linux ディストリビューションの中でも特に歴史の長いものの一つ
である。かつては、Linux といえば Slackware といわれたほどの優れたディストリ
ビューションである。ただし、パッケージ管理機構を持たないため、ユーザーにそ
れなりの知識が求められる。逆に知識のあるユーザーにとっては一から構築・管理
することが可能なので現在でも根強く人気がある。ファイルの配布形態は UNIX 標
準の tar+gzip である。
2.3
Linux の特徴
Linux の特徴を [3] を参考にまとめると
• Linux はフリー (無料) であり、経済的である。フリーということは、システムのソー
スコードを誰でもアクセスできる。このため、改良を施したり、エラーを排除した
り、単にシステムのしくみを勉強することができる。システムは電子的なマニュア
ル (/usr/doc ディレクトリ内) と man page によって、非常によく文章化されており、
Linux を扱った本も数多く出版されている。もし、ドキュメントを読んでもわから
ないことがあれば、最後の手段として、いつでもソースコードそのものを見ること
ができる。
• Linux は UNIX 系のシステムであり、UNIX の柔軟性を全て備えている。
5
• Linux は、 POSIX([6] によると UNIX システム間のアプリケーションの互換性を実
現するために定義された標準的な UNIX のシステムインターフェイス) や ANSI(米
国規格協会) などの国際標準に準拠している。これによって数多くの UNIX プログ
ラムの移植が促進されている。
• 複数のソフトウェアを同時に実行するマルチタスク OS である。Windows や Max
OS もマルチタスク OS だが Linux の場合はその処理が各平均的に行われるので一つ
のソフトウェアが CPU パワーを 100% 使えないようにリミッタがかかっている。一
つのソフトウェアが 100% 近い CPU パワーを使いたいのであれば Windows が圧倒
的に有利である。これらの違いは、どちらが優れているのではなく用途の違いによ
るものであると考えられる。
• 専用のフリーソフトで行っているようなことであっても、技術を必要とされるが既
存のコマンドを互いに組み合わせて、より汎用的な手法で実行可能になる。
• Linux は TCP/IP ネットワークに柔軟に参加できる。また、他のプロトコルもサポー
トしている。
• Linux は、RAM が 4M バイトの 386PC でも、まだ実行可能である。16M バイトの
システムであれば、X Window System が動くワークステーションとして使える。つ
まり、ハードウェアに対する要求が低い。
• 企業では Linux の安定性で商品品質向上、顧客に提案が可能。
• マルチタスクやネットワーク対応、安定性などの機能面においては Linux 以外にも
優れているものがたくさんある。しかし、PC や UNIX の入門として、Linux 情報
は多く、ディストリビューションは初心者でもわかりやすく入り込める。さらには、
今なお Linux 初心者に合わせた情報が非常に多いので次へのステップアップにつな
がりやすい。
• ハードウェアの対応状況があまりよくない。近年は徐々にハードウェアメーカーに
よる情報の公開やデバイスドライバの提供で改善されて来たが、昔は Linux の場合
は基本的にボランティアが少ない情報をもとにデバイスドライバを開発していたの
である。Window の場合はあらかじめハードウェアのデバイスドライバを持ってい
るのでユーザーはあまり意識する必要がない。
2.4
ディレクトリ
ディレクトリとは Windows でいうフォルダのことである。ディレクトリには、データ
ファイルはもちろん、実行ファイル、コマンドファイルなど Linux における動作するシス
テムは全て必ずどこかのディレクトリに格納されている。
6
ディレクトリツリー
2.4.1
ここでは、Vine Linux3.1 のディレクトリを簡単に説明する。Linux のディレクトリはツ
リー (木) 構造をしているので、他のディレクトリの移動などもスムーズに行うことが可能
であり、わかりやすい。まず一番根本にあるのが、ルート (/) ディレクトリである。ルー
トディレクトリは、Linux ファイルシステムの最上位に位置するディレクトリである。
以下 [5] に従ってルートディレクトリに配置されているディレクトリ (表 1) の概要を説明
する。
bin/ dev/ home/ lib/
misc/ opt/ root/ tmp/ var/
boot/ etc/ initrd/ lost+found/ mnt/ proc/ sbin/ usr/
表 1: ルートディレクトリに配置されているディレクトリ
bin/ ls や cp など、root ユーザーや一般ユーザーが使う利用度の高い基本コマンドが配
置されているディレクトリ。
boot/ Linux カーネルや initrd ファイルなど、Linux の起動時に使われるファイルが配置
されているディレクトリ。
dev/ デバイス・ファイルが配置されているディレクトリ。Linux カーネルは、デバイス・
ファイルを介してハードウェアを制御する。なお、デバイス・ファイルは特殊なファ
イルなので、テキストエディタなどで内容を変更することはできない。
etc/ Linux システムやサーバ・プログラムの設定ファイルが多く格納されているディレ
クトリ。システム管理者にとって、/etc はもっとも重要なディレクトリである。
initrd/ Linux が起動するときに initrd ファイルが配置されるディレクトリ。起動後、こ
のディレクトリは空になる。
lib/ システムの動作に必要なライブラリや、/bin および/sbin ディレクトリに格納され
ているコマンドの実行時に必要とされるライブラリが配置されている。また、この
ディレクトリ以下の/lib/modules ディレクトリには、システム起動時にカーネルに
組み込まれるドライバ・モジュールが配置されている。
lost+found/ ファイルの編集中に電源が切断された後再起動すると、ファイルとデータ
の対応関係が崩れ、システムはそのファイルをどのディレクトリに保存すればよい
かわからなくなる場合がある。その際、ファイルシステムの整合性をチェックする
fsck コマンドを実行すると、このディレクトリにそうしたファイルが保管される。
7
misc/ このディレクトリには、他に配置する場所がない雑多なデータが置かれている。
Vine Linux では空になっている。
mnt/ CD-ROM をマウントするための/mnt/cdrom ディレクトリや、フロッピーディス
クをマウントするための/mnt/floppy ディレクトリなど、一時的にマウントするファ
イルシステム用のマウント・ポイント (ディレクトリ) が配置されるディレクトリ。
opt/ インストールに大きな空き容量を必要とするアプリケーションを配置するディレク
トリ。このディレクトリには、おもに商用アプリケーションがインストールされる。
ただし、あまり利用されてはいない。
proc/ CPU 情報が記述された「/proc/cpuinfo」や、メモリの使用状況が記述された「/proc/meminfo」
など、Linux カーネルの状態を表すファイルが配置されるディレクトリ。
root/ システム管理者 (root) のホーム・ディレクトリ。root ユーザーの設定ファイルや
データを保存する。
sbin/ shutdown、fdisk、fsck、init、など、Linux システムの管理用コマンドが配置され
るディレクトリ。このディレクトリのコマンドは、一般ユーザーでは実行できない
(root だけが実行できる) ものが多い。
tmp/ ファイルを一時的に保存するためのディレクトリ。通常、/tmp ディレクトリ以下
のファイルは、システムの再起動時に自動的に削除される。ただし、Vine Linux で
は、システムを再起動しても/tmp ディレクトリ以下のファイルが削除されないよう
に設定されている。
usr/ 基本コマンドやシステム管理コマンド、およびプログラムのマニュアルなどが配置
されるディレクトリ。より重要度の高いコマンドは、/bin や/sbin ディレクトリに配
置される。
var/ アプリケーションのキャッシュ・データやスプール・データ、Linux システムやサー
バ・アプリケーションのログ・ファイルなど、内容が頻繁に更新されるデータが配
置されるディレクトリ。
home/ 一般ユーザーのホーム・ディレクトリが配置されるディレクトリ。Web サーバ用
のデータもこのディレクトリの下に置かれる (/home/httpd ディレクトリ)。なお、
システム管理者 (root) のホーム・ディレクトリは/home の下ではなく、/root ディ
レクトリである。
8
2.4.2
root
root とはコンピュータの機能を全て使用できるユーザーである。全ての機能を使用でき
るというのが root の強力なところと同時に恐いところでもある。もし、root になっている
ときに操作ミスで大事なファイルを消してしまうと OS が二度と立ち上がらなくなること
さえありえる。また、他のユーザーになりすましたり、データを許可なしにコピーしたり
することが可能になる。Linux のセキュリティや安全性は、root の前では全く意味がない
のである。よって、普段日常的な作業は必ず一般ユーザーを追加作成して、そのユーザー
でログインして作業する。しかし、root の権限 (su:super user) でないと実行できない操
作もある。例えばユーザーを追加する、マウント操作をする、ファイルの属性を変えるな
どは root 権限でないと実行できないのである。
一時的に root の作業が要求され root 権限を得るときには、ターミナル上で表 2のように
実行する。
$su
←− su と入力
Password:
←− root のパスワードを入力
#
←− root になると $ が# に置き換わる
#略
←− root の作業をする
#exit
←− 必ず exit で root を終了する
表 2: su の実行例
root での作業が終了すると、必ず exit と入力して root を終了する必要がある。Linux
において root のパスワードほど大事なものはない。
2.5
2.5.1
X Window System
X Window System とは
X Window System(以下、X と略す) とは、Linux などの多くの Unix 系 OS の標準ウィ
ンドウシステムでグラフィカルな画面 (GUI:Graphical User Interface) 表示するための
プログラムである。特に、ソースが無償で配布されたこともあって、Unix 系 OS では標準
とされている。また、X が多くのコンピュータメーカーに採用されるとともに、X に対応
したアプリケーションが各社から寄贈されている。普段から Windows を利用する人やこ
れから Linux を始める人にとって、この X は非常に Linux を使いやすくさせる。なぜな
ら、Linux を扱いにくいと感じている人はその操作方法がネックとなっている人もいるだ
ろう。しかし、この X における GUI 表示は Windows と同じ様なフォルダの操作などの画
面を可能にするからである。X を使う上で注意しなければならないのは、サポートされた
ビデオカードでなけらばならなく、そのため対応状況を確認する必要がある。普段、学校
9
などで Linux がすでにインストールされている場合はよいが、新しく自分で Linux をイン
ストールするときには注意しなければならない。
X を使うためのアプリケーションは、Xlib と X ツールキット (図 2[4]) を利用して作成
する。
• Xlib は、ウィンドウの生成・消滅・描画したデータやフォントの管理、マウスやキー
ボード入力データの管理など、ウィンドウの基本管理機能を提供する。後に説明す
るが、xscreensaver を作成するためにはこの Xlib に関する基本知識が必要であると
考えられる。
• X ツールキットとは、ウィンドウを構成するメニュー、ボタン、マウスのポインティ
ング操作を簡単に扱える機能など、Xlib を利用して実現できる高機能な部品である。
さらに、X ツールキットはウィンドウマネージャ(ウィンドウのインターフェースを管
理するプログラム) のインターフェースに依存した表示部品の資源を提供する Widget
と、スタイルに依存しない機能を提供する Intrinsic 部に分けられる。
lib
図 2: X ウィンドウプログラムでのソフトウェア階層
X の最新バージョンはリリース 6(/X11R6)(図 3) である。この X のディレクトリは
/usr/X11R6 に保存されている。このディレクトリには X で動作する GUI アプリケー
ションの実行ファイルが配置されている。また、X は数年おきに仕様が変更されたり、機
能が追加されたりしている。リリース番号は 3、4、5、6 と進むにつれてフォントの扱い
方や国際化対応が改善されている。
2.5.2
X サーバ・X クライアント
X の基本は、ネットワーク環境を前提とした「X サーバ」と「X クライアント (X アプ
リケーション)」である。
• X サーバとは、人間に対するインターフェイスを管理するソフトウェアであり、キー
ボードやマウスによる入力の受け付け、GUI 画面の表示を行うプログラムである。
• X クライアントとは、X サーバから送られてきたユーザーの入力内容を受け取って
処理を行い、処理結果を X サーバに送り返すプログラムである。
10
;<>=
?A@<BC8D;<E=
! "$#%$&' (*),+- .
(xlogo,xterm...)
!$/$.10 ' 2 3*)$+1- .
(kterm,Canna,kinput2...)
(xfs)
(Xt,Xaw...)
(Xlib)
4568719:
図 3: X11R6 の内容
これらは対話的な処理をサポートしている。これによって、複雑な処理を高性能な PC
で行い、表示だけを安価な PC で行うことが可能になる。一般のサーバ・クライアントモ
デルと比べて、ユーザーサイドのプログラムがサーバになっている点に注意しなければな
らない。
X サーバにはいくつかの製品があるが、Linux の場合はフリーの XFree86 や X.Org が使
用されることが多い。また、X クライアントは X のアプリケーションである。アプリケー
ションの例として、kterm や Mozilla、XMMS などがあげられる。X のサーバ XFree86 と
X.Org を [5] を参考に説明すると、
XFree86 x86 用 UNIX 系 OS 用に開発されたフリーソフトウェアの X サーバ。現在、ほ
とんどの PC UNIX / Linux に付属している。さまざまなビデオカード/ビデオチッ
プに対応しており、機能面も充実しているが、一部のビデオチップには対応していな
いこと、チップによってドライバの完成度に差があること、インストールやトラブ
ルシューティングにある程度の専門知識が必要となるといった点から、商用 X サー
バの市場も成立している。
X.Org 機能実装にかかわる開発メンバーの対立やライセンスの問題で、XFree86 から分
離し、X.Org Foundation が設立され現在は XFree86 よりも X.Org が主流である。
2004 年度 4 月にライセンスの問題のない XFree86 4.4RC2 および X.Org X11R6.6
をベースに、X Window System Version 11 Release 6.7(X11R6.7) がリリースされ
ている。現在の最新版は、X11R6.8.2 である。
X は基本的には GUI を構築するための基礎技術であり OS としての機能はない (X Windows という意味ではない)。特徴は、X サーバと X クライアントがやり取りをするため
に通信プロトコルを用いていることである。例えば、クライアントからサーバには文字や
図形の表示を依頼し、サーバからクライアントにはキーボードやマウスの入力を通知する
必要がある。この X のためのプロトコルを X プロトコルと呼ぶ。(図 4[5]) にこの関係を
示す。この X プロトコルは TCP/IP の四つの層 (ネットワークインターフェース層、イン
11
ターネット層、トランスポート層、アプリケーション層) の中でアプリケーション層に属
するプロトコルである。
他の通信プロトコルと同じように、ソフトウェアさえ対応していればやりとりが可能で
ある。そのため、手元のマシンの表示と、遠隔マシンとの表示で、表示方法に差がない。
このことは、ネットワークを利用した、UNIX ワークステーション群で GUI 表示を行うの
に便利であり、UNIX マシンの普及と共に、X も普及していったのであると考えられる。
( !#"$%"&'&(
)
!#"$%"
)
"*&",+
-/.0
( )
図 4: X サーバと X クライアントの通信
2.5.3
デスクトップ環境
ウィンドウシステムにおいて、各ウィンドウやメニューなど、ユーザーインターフェー
スを統一するためのソフトウェアやそのデザインのことをデスクトップ環境という。そも
そも、一つの画面上に複数の作業用の「窓」を開いて使用するインターフェースは、ウィ
ンドウシステムと呼ばれる。開かれた窓の中では、それぞれが別の作業が実行できる。昔
のウィンドウマネージャでは、「窓」の周りは単なる「壁」であり、その作業スペースは
使用されなかった。しかし、ウィンドの周りの部分にも機能を持たせた方が効率がよいと
いう観点から「デスクトップ」へと発展していったのである。
デスクトップ環境には主に GNOME や KDE といったものから構成されている。それ
ぞれ独自のウィンドウマネージャを備えており、ウィンドウマネージャやファイルマネー
ジャのほかにもたくさんのアプリケーションを提供する。例えば、テキスト・エディタや
メーラ、CD プレイヤーさらには画面上下のパネルなどがある。こういうアプリケーション
類や、統一されていたインターフェースやデザインなど全てのことをまとめてデスクトッ
プ環境という。私の PC のデスクトップ環境は GNOME である。
以下、[5] を参考に GNOME と KDE を説明する。
12
GNOME GNU Network Object Model Environment の略。X で使用可能なデスクトッ
プ環境。GUI ツールキットである GTK +を用いて開発されている。同種のデスク
トップ環境である KDE よりも後から開発が始まったため、完成度の低い部分が多
かったが、現在は KDE と比べて同等のレベルに達している。以前は KDE のツール
キット Qt が GPL ライセンスでなかったため、GNOME を好んで利用するユーザー
も多い。
KDE The K Desktop Environment の略。X で使用可能なデスクトップ環境。GUI ツール
キットである Qt を用いて開発されている。デスクトップ環境は、デスクトップ上で
利用される基本的な GUI ソフトの見栄えに一貫性をもたらし、操作性を高めるプロ
グラム。KDE は、ウィンドウマネージャ(kwm)、ファイルマネージャ(Konqueror)、
ヘルプ・システム、GUI アプリケーションの実行環境などで構成される。
2.6
CUI
アプリケーションを利用したり、サーバを設定する手段には今述べた X の GUI 表示を
利用する方法がある。しかし、GUI 表示が可能でも Linux ユーザーには CUI:Character
User Interface を利用することが役立つと考えられる。その理由は、
• GUI より CUI の方が一つの仕事をこなすのに高速である。
GUI では習熟による効率向上に限界がある。HCI(Human Computer Interacion) と
呼ばれる研究分野で古くから議論されているみたいだが、GUI でマウスなどを用い
て指定点をクリックする時間は、いくら訓練してもある程度以上は向上しないので
ある。また、同じ処理を手軽に出来るのでプログラムを作成する人にとっては便利
である。
• GUI はシステムによって操作方法が異なる
GUI の多くは、Turbolinux 専用、Red Hat Linux 専用、GNOME デスクトップ専
用、KDE デスクトップ専用といった、各ディストリビューションやデスクトップ環
境に依存する。その反面、CUI 操作はほとんど Linux システムで共通である。
• GUI は使えないケースもある
GUI のほとんどは X のプログラミングを基盤に動作する。しかし、全てのシステム
で X が動作しているとは限らない。特にサーバの場合、通常は管理者のみが操作を
行い、一般の利用者は操作しないし、サーバ上で不要なサービスを起動していると
それがセキュリティの問題となることもある。そのため、X を動作せていないこと
が多いのである。つまり、サーバシステムを運用するサーバ管理者は CUI 操作は必
須とも言える。
13
• リモートマシンを操作する
サーバマシンは PC 利用者から離れた場所にあるケースがほとんどである。そういっ
たリモートマシンにあるマシンの操作に GUI を利用することも可能である。しかし、
GUI は CUI に比べて送受信するデータ量が非常に大きくなる。それが原因でサー
バ・サービスの運用の妨げになることもあり、場合によっては GUI の動作が鈍くな
り、操作に支障を来たすこともある。CUI の方が汎用性があってよいのである。
以上の理由などから普段から CUI 操作を利用することが後に GUI の内容の理解にもつ
ながるので大変有効であると考えられる。(X だから GUI といったわけではなく、X はキー
ボードの管理も行うのでその基盤も担っている。)
2.7
端末操作
Linux での基本操作といえるのがターミナル (端末) 上で CUI でコマンドを実行する方
法である。表 2もコマンド入力の一つである。コマンドは次のように成り立っている。
コマンド 区切りの空白 引数 1 区切りの空白 引数 2 ・
・
・
(付録に述べる)
私が使用したのは下記 (図 5) の GNOME 端末 (ターミナル) である。
図 5: GNOME 端末
CUI は PC の初期から使われていたことから、多くの機能がある。これらの機能はシェ
ルと呼ばれるアプリケーションによって提供される。シェルとは主にユーザーからの入力
を受け取り、解釈してから OS へコマンドを送る機能である。シェルにも種類があり、現
在 Linux などでは bash が標準に使われ、ユーザー自らシェルを作ることができる。シェ
ルの機能として、コマンド入力を楽にするために、編集機能、補完機能、履歴機能がある。
編集機能とは、文字の入力や削除、カーソルの移動などの基本機能のことである。補完
機能とは、コマンド名やファイル名などを途中まで入力すると、残りの候補をあげて補完
してくれる機能である。ターミナル上では、ディレクトリやファイル名を入力するときに、
ファイル名を途中まで入力し、[tab キー] を押すと候補が出てくる。履歴機能とは、一度入
力した過去のコマンドを再び呼び出して利用する機能のことである。プログラムのコンパ
14
イルなどは同じコマンドで何度も実行するのでより早く、正確に実行することができる。
ターミナル上では [↑ キー] でコマンドの履歴が表示される。
Linux を扱うならば最低限覚えておかなければならないのがこのターミナルの操作方法
だといえる。
スクリーンセーバー
3
スクリーンセーバーとはディスプレイの焼き付けを防ぐために考えられたソフトウェア
である。焼き付けとは、ディスプレイに長時間同じ画像を表示し続けたため,その画像の
表示されていた場所が焼き付いて色むらを起こす現象のことである。一般的にスクリーン
セーバーはコンピューターを使わない状態、つまり、キーボードを操作せず、マウスにも
触らない時間が一定時間以上継続すると、自動的に起動するような仕組みになっている。
最近では、焼き付けを防ぐ目的だけではなく、鑑賞用やパスワードによる PC のセキュリ
ティ向上など従来とは異なった目的で使われている。
Linux における標準のウィンドウシステムは X である。これには単に画面が真っ暗にな
るものやランダムな大きさのX糢様の静止画が現れるようなスクリーンセーバーが標準で
入っている。しかし、単に真っ暗なものは電源が off になっていると勘違いしたり、静止
画が現れるだけでは全く面白くない。また、画面の変化の少ないアニメーションは焼き付
き防止になるかどうかは疑問である。そこで XScreenSaver という様々なアニメーション
スクリーンセーバーを持つアプリケーションソフトについて考えていく。
3.1
XScreenSaver
私が研究で使用した PC には、xscreensaver4.14(25-Oct-2003)[1] アプリケーションが
標準でインストールされている。(最新版を xscreensaver のホームページから入手可能)
xscreensaver は X のコンピュータならば動作が可能である。X はほとんどの UNIX 系 OS
に組まれているのでつまりは、UNIX 系ならば xscreensaver は実行できるということであ
る。しかも、最近の UNIX 系のほとんどのモデルにはこの xscreensaver がすでに組まれて
いる。ただし、xscreensaver は Windows には対応していないことには注意。
ソースプログラムはルートウィンドウに描ける X 用のプログラムならば、いかなるプロ
グラムで書かれていようが、いかなる言語で書かれていようが、どのライブラリを使用し
ようが、xscreensaver として使用できる。もともと xscreensaver は、キーボードやマウス
から入力無し状態の監視、画面ロック、ロック時のパスワードのチェックを扱うデーモン
というものである。また、このアプリケーションはモニタの省電力機能を設定したり管理
できるようにもなっている。
XScreenSaver には三つのメインプログラムがある。その三つとは、xscreensaver、xscreensaverdemo、xscreensaver-command である。それぞれターミナルでコマンドとして実行できる。
15
以下にそれぞれを説明する。
3.1.1
デーモン
ではまず、そもそもデーモンとは一体どのようなものだろうか。
[5] によると、デーモン (daemon) とは、システムを立ち上げる時に自動的に起動し、メモ
リに常駐して、バックグラウンドで稼働し続けるプログラムのことである。ターミナル上
で実行される一般的なコマンドは、処理を終えるとすぐに停止するが、デーモンはメモリ
上に残り続けるのである。例えば、かな漢字サーバ、Web サーバやメール・サーバ、ディ
スクの自動マウント、ハードウェアの自動認識、プリント実行、ログ管理など起動時の初
期化に時間がかかり、頻繁に起動されるプログラムなどをデーモンとして動作させるとよ
いと考えられる。
今回の場合、xscreensaver デーモンとは、キーボードとマウスが一定時間使用されなく
なるまで待ち、ランダムに選んだグラフィックデモを実行する。特に、キーボードとマウ
スの入力の監視を xscreensaver デーモンと考える。
3.1.2
xscreensaver
xscreensaver はデーモンとしてバックグラウンドでキーボードとマウスを監視すると述
べた。ターミナルで xscreensaver と実行すると xscreensaver デーモンがバックグラウンド
で動作し始める。
また、入力のない時間があらかじめ指定した時間に達すると、スクリーン全体を真っ黒
にし、ランダムに選んだグラフィックデモを実行する (スクリーンセーバーが実行される)。
このデモは、マウスまたはキーボードに何らかの動きがあると直に終了する。さらには、
スクリーンセーバー開始から一定時間もしくは開始直後に自動的に画面をロックする機能
(図 6) もある。
図 6: xscreensaver のロック
これは自分が使用している PC の電源を切り忘れたときなどに他人に使われないように
するものである。スクリーンセーバーに目がいってしまうが、私はこの画面をロックする
機能をスクリーンセーバーと同時に行えることは便利であると考える。もちろん、この画
面ロック機能はスクリーンセーバーを起動させなくても実行可能である。Windows にあ
16
るログオフ機能とはまた少し異なるが、これはユーザーの画面が今の状態のままロックを
かけられるといったメリットがある。
3.1.3
xscreensaver-demo
xscreensaver-demo プログラムは、様々なグラフィックデモを実行したり、バックグラウ
ンドの xscreensaver デーモンで使用するパラメータを設定するためのツールである。ターミ
ナルで xscreensaver-demo と実行すると、Screensaver Preferences というデモ設定画面 (図
7) が表示される。このプログラムはホームディレクトリにある、作成された.xscreensaver
ファイルを GUI 表示したものであり非常にわかりやすい。このツールのおかげで、毎回
スクリーンセーバーを確認するために時間を待たなくてスクリーンセーバーのデモを見る
ことができる。メインのウィンドウには、メニューバーと 2 種類のタブ付きのページがあ
る。最初のページはデモの一覧を編集するためのページであり、次のページはスクリーン
セーバーや電源管理など様々なパラメータを編集するページである。xscreensaver で GUI
設定が可能であるのがこの xscreensaver-demo である。
図 7: xscreensaver のデモ
3.1.4
xscreensaver-command
xscreensaver-command は、実行中の xscreensaver デーモンのプロセスにターミナルか
ら処理を送り管理するものである。ターミナルからの命令では後にオプションをつけて実
行すると設定を変化させたデモの操作を可能とする。xscreensaver-command とターミナ
ルで実行してもオプションが必要であると表示される。つまり、オプションをつけなけれ
ばならなく xscreensaver-demo と比べると少しわかりにくいので他の二つと比べるとそこ
まで使用しない。つまり、この xscreensaver-command は xscreensaver のデモを CUI で操
作したいときに使用する。
17
3.2
xscreensaver をインストールし使用してみる
ダウンロードサイトは英語なので、以下では xscreensaver の最新版をインストールし、
その使用方法を簡単に説明する。
3.2.1
xscreensaver のインストール
先ほど述べたように私の PC には xscreensaver は標準でインストールされているが最新
版を入手することにする。そこで、今回は xscreensaver-4.23 をダウンロード・インストー
ルする。ここではその方法を説明する。(インストールには C のコンパイラ、X11 のヘッ
ダファイルとライブラリが必要であるが、最近の Linux にはほとんど標準にある。)
1. Jamie Zawinski 氏のホームページ XScreenSaver のメインぺージで Download ボタ
ンをクリック
2. xscreensaver-*.**.tar.gz のファイルを任意のディレクトリにダウンロード
3. ダウンロードしたファイルを展開する。(表 3)
$tar -vxzf xscreensaver-*.**.tar.gz ←− 展開する
$cd xscreensaver-*.**/
←− ディレクトリ移動
$./configure
←− make 環境を整える
$make
←− make する
$su
←− root 権限になる
Password:
#make install
←− インストールする
表 3: xscreensaver のインストール例
このダウンロード・インストールされた xscreensaver には、xscreensaver デーモンの他
にスクリーンセーバーで使用するために巧妙に作成されたグラフィックプログラムが多数
付属 (xscreensaver-*.**/hacks 内) している。これはソースも同時に公開されているので
自分でそこからプログラムを学習できる。また、OpenGL が PC にインストールしてあれ
ば、xscreensaver をインストールしたときに xscreensaver-*.**/hacks/glx に OpenGL を
用いた様々なアニメーションプログラム作成される。
3.2.2
xscreensaver の使用方法
私の PC では、タスクバーの [アプリケーション] から [デスクトップの設定]‐[拡張設定]
‐[スクリーンセーバー] で xscreensaver のデモ設定画面 (図 7) を表示することができる。
18
この操作はいわば GUI からデモ画面を起動している。CUI 操作でデモ設定画面を起動す
る場合は、ターミナルを開いて表 4のように入力する。
$xscreensaver &
$xscreensaver-demo
表 4: xscreensaver の実行
もし、xscreensaver & を実行したときに、
xscreensaver: **:**:**: already running on display :0.0
と表示されたならば、すでに xscreensaver がバックグラウンドで動作されている状態であ
るのでそれは無視しても構わない。(ほとんどの場合、インストールしたとき、Linux を立
ち上げると同時に xscreensaver が動作すようになっているので表示される。)
一度 xscreensaver のデーモンを止めたいならば、xscreensaver-demo を開いてタスクバー
の [File] で [Kill Daemon] をクリックするか、ターミナル上で xscreensaver-command -kill
と入力し実行するとデーモンが止められる。この xscreensaver デーモンが実行されていな
い状態でデモを実行すると Warning(図 8) と表示され、デモが実行されない。これを試し
てみてから xscreensaver & を実行すると理解しやすいかもしれない。
図 8: Warning
ここで [OK] を選ぶと xscreensaver デーモンが再び実行される。[キャンセル] を選ぶと
xscreensaver は実行されない。
つまり、まとめると、xscreensaver プログラムはバックグラウンドで動くデーモンであ
り、フォアグラウンドの xscreensaver-demo や xscreensaver-command プログラムで対話
的 (クライアント・サーバ) に管理するプログラムである。
先ほど、タスクバーから選択するか xscreensaver-demo プログラムを実行するとデモ設
定画面 (図 7) が現れて、スクリーンセーバーの設定や表示モードを選択できると述べた。
xscreensaver を設定するのに最も簡単でわかりやすい方法はこの GUI を使用して設定す
ることである。
19
GUI 表示であるデモ (図 7) を簡単に説明すると、[Display Modes] 画面の [Mode] の選
択では、次の 4 つの Mode がある。
• Disable Screen Saver
スクリーンセーバーを実行しない
• Blank Screen Only
アニメーション無しの真っ黒なスクリーンセーバー
• Only One Screen Saver
1 つのアニメーションスクリーンセーバーを選択して実行
• Random Screen Saver
数個の選択したアニメーションスクリーンセーバーをランダムに実行
そして、基本的な使い方として、Blank After でスクリーンセーバー実行までの待ち時
間、Cycle After でランダム時の次のスクリーンセーバーに切り替えるまでの時間が設定
できる。また、Lock Screen After のチェックを入れると画面をロックできるようになり、
スクリーンセーバー実行から画面をロックするまでの時間を設定できる。
では CUI 操作でスクリーンセーバーを設定するときはどのようにすればよいのだろう
か。CUI で設定するためには、ユーザーのホームディレクトリにある.xscreensaver ファイ
ルもしくは標準で X にあるデータ (/usr/lib/X11/app-defaults:システムによって異なる)
の XScreenSaver ファイルを書き換える。この書き換えは後に xscreensaver 作成のときに
必要になる。もし、ホームディレクトリに.xscreensaver ファイルが存在しないときは標準
の X にあるデータから設定を行うのだが、一度 xscreensaver を実行すると.xscreensaver
ファイルが自動的に作成される。
(注意:この. から始まるファイルはドットファイルと呼ばれコマンド ls では表示されない。
ls -a などオプションをつければ表示される。)
ホームディレクトリに.xscreensaver ファイルが存在すれば、他のどのファイル (/usr/lib/X11/app-
defaults/XScreenSaver など) の設定も読まれないので、基本的にこの作成されたホーム
ディレクトリにある.xscreensaver を書き換えて表示モードの設定する。/usr/lib/X11/app-
defaults/XScreenSaver などはバックアップのために書き換えないことにする。また、デ
モ設定画面 (図 7) で設定を変更するとホームディレクトリの.xscreensaver が常に変更され
更新される。
以下に.xscreensaver ファイルの簡単な設定項目を説明する。
• timeout
スクリーンセーバー実行までの待ち時間
20
• cycle
次のスクリーンセーバーに切り替わるまでの時間
• lock
True で画面のロック
• lockTimeout
スクリーンセーバー実行から画面をロックまでの時間
• passwdTimeout
画面ロック時のパスワード入力画面の表示時間
3.3
スクリーンセーバーを作成
xscreensaver のマニュアルにはプログラムをスクリーンセーバー用に使う場合、必要条
件が二つあると明記されている。一つ目はそのプログラムがルートウィンドウ、つまりは
X の root に描画すること。そして二つ目は、tvtwm のような仮想ウィンドウマネージャで
使われている、仮想ルートウィンドウが認識できることである。仮想ルートウィンドウが
認識するようにするためプログラムのソースにヘッダーファイル vroot.h を付け加え、イ
ンクルードするだけで実現できるとある。ルートウィンドウとは個別のウィンドウの下の
全体に広がる背景の部分のことで X-Window の概念であり一般的ではない。仮想ルート
ウィンドウは文字どおり仮想であり、スクリーンセーバーを実行するために作られるルー
トウィンドウである。普段の作業はルートウィンドウ上に X のアプリケーションが開いた
ウィンドウである。
xscreensaver に新しく作成したアニメーションプログラムを追加するのは、画面のルー
トウィンドウに描画するやり方で記述されたプログラムなら何でもスクリーンセーバーに
使用できる。何かを再コンパイルしたり、再インストールする必要はなく、設定ファイル
を変更するれば良いだけである。
スクリーンセーバーが機能し始めると、画面全体を黒いウィンドウがディスプレイに作
られる。作成されるウィンドウは、この後生成される vroot.h をインクルードしたプログ
ラムには、仮想ルートウィンドウのように見えるわけである。つまり、ルートウィンドウ
に描画するように書かれたプログラムなら、いかなるものでもスクリーンセーバーに利用
できるということである。簡単にウィンドウのサイズを全画面で実行すればいいという考
えでは、ウィンドウマネージャによって装飾 (画面の最大化や最小化、閉じるのボタン) さ
れる。しかし、だからといってルートウィンドウに直接描くと、プログラム終了後に跡が
残る。この跡を残さないために仮想ルートウィンドウが必要であると考えられる。
簡単にスクリーンセーバーの動作原理を順に述べると、
21
1. ルートウィンドウに描かれるプログラムを用意
2. vroot.h をインクルードしてルートウィンドウを仮想ルートウィンドウと認識させる
3. デーモンでキーボードやマウスの入力を監視
4. 入力が無ければ画面全体を仮想ルートウィンドウで覆う
5. 仮想ルートウィンドウ上でアニメーションを実行
6. スクリーンセーバーとなる
3.3.1
X 用のプログラム (Xlib)
[4] によると X はほぼ c 言語で開発されている。つまりは、GUI 表示は全てもとは c 言
語から成り立っているということである。GUI 表示のためのプログラム作成には Xlib と
いうライブラリを使用してプログラミングしていく。Xlib は、X アプリケーションに対
して、X サーバと通信するために用意された基本的なライブラリである。このライブラリ
の機能を用いることで、X プロトコルを仲介とするクライアントサーバモデルが形成され
る。このため、ボタンやメニューといった GUI を構築するためにはかなりの労力が必要
とされる。この解決策として、X の章でも述べた X ツールキットと呼ばれる GUI 構築用
の難易度の高いライブラリが出回っている。最近では、対話的に GUI を設計できるよう
なソフトウェアもあり、作成するプログラムによっては、Xlib を知らなくても X ツール
キットだけでプログラミングが可能となっている。しかし、Xlib を学ぶことでツールキッ
ト自体の理解にもなり、応用も可能となる。一般的には、ツールキットと Xlib を併用する
(図 2[4]) ことが多い。
簡単に言うと Xlib は、OpenGL を使用するために<GL/glut.h>をインクルードして
OpneGL 用のライブラリ関数を使用できるといったものと同じである。つまり、Xlib の場
合は<Xlib.h>をインクルードし Xlib 用のライブラリ関数を使用する。このインクルード
ファイルは基本的には/usr/include/X11 におかれている。
Xlib では描画ウィンドウをルートウィンドウに指定してプログラミングできるので、ス
クリーンセーバープログラムを作成するには Xlib を用いたプログラムで記述しなければ
ならない。
(図 9[4]) に X ウィンドウを用いた典型的なプログラミングスタイルを示す。
22
!#" $
for(;;)
{
}
! %&
!(' )*+-,/.0
$12345678 (569 break)
:;
<=
図 9: Xlib プログラミングスタイル
次に、Xlib でスクリーンセーバーを描くために必要と思われるプログラム [7] を参考に
しながら説明する。
<X11/Xlib.h>
<X11/Xutil.h>
X Window System 上で動作するプログラムを作成するために必要なヘッダファイルをイ
ンクルードする。これら二つは必須である。
Display ∗d;
Display 型のポインタ d は、X サーバとの通信を行うときに必要な Display 構造体へのポ
インタである。
Window w;
Window 型の変数 w は、作成したウィンドウを識別するためのウィンドウ ID と呼ばれる
変数である。
GC gc;
GC(グラフィックコンテキスト) とは、線や四角、メニューやボタンなどの複数の部品か
らなるウィンドウに表示する内容をひとまとめにするもので、X サーバ側に確保されたメ
モリ領域と考る。表示した内容を X サーバ側の GC においておくことで、画面を描画する
際の通信量を押さえることができ、結果として動作が速くなる。
d=XOpenDisplay();
23
XOpenDisplay 関数で X サーバとの通信を確立し、Display 型のポインタを設定している。
この関数の引数は通常は NULL である。Xlib 関数の多くがディスプレイポインタを引数
とするのでそれらを使用する前にこの関数を実行する必要がある。
w=XCreateSimpleWindow();
ウィンドウを作成する。XCreateSimpleWindow() 関数は 9 個の引数をとる。第 1 引数は
Display 型のポインタであり、X サーバとの通信をするために必要である。第 2 引数はルー
トウィンドウの ID である。ルートウィンドウの ID は、RootWindow() という関数を用い
ることで得ることができる。第 3、4 引数は作成するウィンドウの表示位置で、画面全体
の左隅を原点とし、ウィンドウの左隅のピクセルの位置で指定するものである。同様に第
5、6 引数は、ウィンドウの幅と高さをピクセル数で示したものである。第7引数はウィン
ドウの枠の幅を指定し、第 8、9 引数はそれぞれウィンドウの枠と背景の色を色コードを
用いて指定する。関数 XCreateWindow() は返値としてウィンドウ ID を返す。作成した
ウィンドウは、今後ウィンドウ ID を用いて識別する。
gc=XCreateGC();
XCreateGC 関数を用いて GC を作成する。XCreateGC 関数の第 1 引数は Display ポイン
タ、第 2 引数はウィンドウ ID である。第 3、4 引数は処理方法により変わるが 0 であるこ
とが多い。
XSelectInput();
XSelectInput 関数は、そのプログラムが取り込むイベントを設定する。第 1、2 引数はそ
れぞれ、ディスプレイポインタ、ウィンドウ ID である。第 3 引数は取り込みたいイベン
トを指定する。
XMapWindow();
XCreateSimpleWindow で ウィンドウを作成し、その ID を w に代入させたがこのままで
は表示できない。ウィンドウは作成した後で、XMapWindow 関数を用いてディスプレイ
に対応させる必要がある。XMapWindow 関数の第 1 引数でウィンドウの対応先 (Display
ポインタで指定) を、第 2 引数で対応するウィンドウ (ウィンドウ ID で指定) を指定する。
XCloseDisplay();
XCloseDisplay 関数は X サーバとの接続を切断する。
作成したプログラムは X 用のコンパイルが必要がある。例えば sample1.c といったプロ
グラムのコンパイル方法は表 5の通りである。
24
$gcc sample1.c -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
表 5: コンパイルのコマンド
また、他のヘッダファイルをインクルードしたときはこのコマンドの後ろに適当なオプ
ションをつける必要がある。しかし、毎回この長いコンパイルコマンドを実行するのは面
倒である。そこで参考までに表 6に makefile を書いておく。
CC = gcc
LDLIBS = -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
.c:
$(CC) [email protected] $(LDLIBS) -o $@
表 6: makefile
このような makefile を一度作成しておくと後に便利である。
3.3.2
vroot.h
vroot.h ファイルは新しくダウンロードした xscreensaver プログラム xscreensaver*.**
内のディレクトリ/utils/vroot.h にある。自分で作成したプログラムは vroot.h をインク
ルードしなければルートウィンドウに描かれても仮想ルートウィンドウに描かれないので
スクリーンセーバーとしては実行できない。スクリーンセーバーのためには必ず vroot.h
を実行しなければならない。
この具体的な方法は、X 用に作成した c 言語のアニメーションプログラムに#include
<vroo.h >を加えて、インクルードするだけで実現可能である。その作成したプログラム
をコンパイルし実行ファイルとすれば完成である。この実行ファイルは vroot.h をインク
ルードする前と後では実行したアニメーションには差が感じられない。しかし、実際は
vroot.h をインクルードした方は仮想ルートウィンドウに描かれているというわけである。
つまり、vroot.h は Xlib に標準で定義されている root window を virtual root window に
置き換えるためのものである。逆に考えると、xscreensaver は virtual root window を用い
てスクリーンセーバーを実行していると考えられる。この vroot.h というヘッダファイルの
ソースは Xlib.h と Xatom.h、X.h のライブラリ関数を使用して作成されている。Xatom.h
は名前づけられ、型付されたデータの集合が定義されており、X.h は X ウィンドウの基本
的な構造体、定数が定義されている。
私は任意に作成されたヘッダファイルを含めたプログラムのコンパイルが苦手であった。
そのための make ファイルを作成してもよかったが、毎回プログラムを作成するたび make
ファイルを更新したり、作ることは時間を費すと考え、vroot.h をインクルードするため
25
に、他の標準のヘッダファイル (stdio.h や math.h など) が置かれているディレクトリに直
接 root 権限ででコピーし#include <vroo.h >とプログラム上で書くことだけで実現させ
た。具体的な方法は表 7に示す。
$su ←− ダウンロードした vroot.h があるディレクトリで実行
Password:
#cp vroot.h /usr/include/ ←− /include ディレクトリにコピー
表 7: vroot.h を標準のヘッダファイルとさせる
とターミナル上ですると普段使用している stdio.h などと同じ様なプログラムの書き方
で vroot.h をインクルードすることができる。
3.3.3
xscreensaver に追加
作ったスクリーンセーバーのアニメーションを xscreensaver に追加するためには、次の
二つのことを行う必要がある。
• アニメーションの実行プログラムを適当なディレクトリに移す (コピーする)
• ディレクトリに移した実行プログラムに xscreensaver のパスを通す
まずは、適当なディレクトリに移す。
xscreensaver のアニメーションが保存されているのはデフォルトだと/usr/local/libexec/xscreensaver
である。ここに自身が作成した実行プログラムを移す。
例えば、X用に書かれたプログラムを sample.c という名前とし、コンパイルして実行ファ
イルを sample とする。そして、ターミナル上で、表 8のように実行する。
#cp sample /usr/local/libexec/xscreensaver ←− root で実行
表 8: 実行ファイルを移す
これで実行ファイルは適当なディレクトリ (/usr/local/libexe/xscreensaver) に移された。
次に、この移されたプログラムのパスを通す (xscreensaver とつなげる)。
xscreensaver でアニメーションプログラムの選択・実行は xscreensaver-demo 以外でホー
ムディレクトリの.xscreensaver ファイルによって指定できると述べた。この.xscreensaver
ファイルを開いてその中の programs:の所に、他のプログラムと同様、例えば表 9のよう
に記述する。
基本的に ’\n’ で区切られた行に一つのプログラムを記述する。’\’ は折り返しの意味で
あり、次に続くことになる。このソースは読みやすいようにエディタ上で改行する。
26
#XScreenSaver Preferences File
//略
programs: \
”Qix (solid)” qix -root -solid -segments 100
\n\
”Qix (transparent)” qix -root -count 4 -solid -transparent \n\
/* など他のスクリーンセーバーのデモのパスが書かれている */
//略
/* programs:内ならばどこにでもいいので次の行を記述する*/
”sample” sample -root
\n\
//略
表 9: 実行ファイルを移す
以上によって、作られたアニメーションを xscreensaver-demo 画面で選択可能となる。
注意:X 用に書かれていない普通のアニメーションプログラムで上記のことを実行すると
デモには追加されるが、スクリーンセーバーとしては実行できない。
3.4
XScreenSaver を効率よくする方法
私が考える、OpenGL でスクリーンセーバーを作成するための効率の良い方法として、
まずは、XScreenSaver の最新版をダウンロードする。ダウンロードした
xscreensaver*.** 内のディレクトリ xscreensaver*.**/hacks/(glx) にあるプログラムを学
習する。このダウンロードしたプログラムは標準のスクリーンセーバーとして採用されて
いるためプログラム難易度が高く勉強するのに大変時間がかかる。しかし、この Xlib を
使用したプログラムを学習し、少し自分なりに変更することで c 言語の復習にもなり、す
でに X 用のプログラムで書かれているのですぐにスクリーンセーバーとして実行できる
のである。また、hacks/glx ディレクトリ内の X 用プログラムは OpenGL を用いた c 言語
で書かれている。OpenGL がインストールされている環境ならば hacks/glx に様々なアニ
メーションがインストールされる。つまり、Xlib を用いたプログラムは OpenGL と同時
に扱うことも可能であるということである。OpenGL を利用したプログラムは作成できな
かったが、[8] などを参考にしていけばプログラミングができると考える。
アニメーションスクリーンセーバーを作成するだけならば、この方法だけで十分である
と考えられる。後は作成したプログラムに vroot.h ファイルをインクルードすればそれで
完成するので Linux に関する知識はあまり必要がない。
27
しかし、XScreenSaver は Linux など X が入っているものでないと実行できないので、
最低限 Linux の基本操作方法は知らなければならない。そして、スクリーンセーバーの動
作システムから勉強する場合は Linux のシステムから勉強し、XScreenSaver のソースファ
イルを徹底的に勉強しなければ実現は難しいと考える。
4
終わりに
普段の娯楽用や特にコンピューターのシステムを理解してまで使用しない人にとっては
Windows で十分であり、逆に Linux を利用すると対応するドライバの問題やアプリケー
ションソフトなどの利用が難しいなど困惑する。しかし、コンピュータープログラマーな
どコンピューターを専門とする人にとっては非常に有効であり、低コストで効率良く作業
が可能になるので Linux は大変便利なものである。
私は、流れでこの研究テーマが決まってしまった。しかし、結果的にスクリーンセーバー
の動作を学ぶためにはある程度プログラムのソースが必要であると考えられ、そのソース
を調べるためには Windows より Linux の方がはるかに勉強しやすいと感じた。途中から、
Windows の PC を使用できる機会があったが最後まで Linux だけで特別研究に取り組め
た。Linux の初心者の私でも年間通せば何とかなるものだと身をもって実感した。
特別研究に情報・プログラミング系の学習になり、数理情報学科で学んだ数学の知識を
活かせられなかったことや分かりやすく何か結果として表われるモノを作ることが出来な
かったことが非常に残念である。現時点では、OpenGL を使用したアニメーションをスク
リーンセーバーにすることが出来なかったが、簡単なプログラムでもスクリーンセーバー
にできたのでその点には満足している。
28
謝辞
本論文作成に当たって、当初から同じ Linux で取り組んだ研究室の竹原君には大変感謝
します。
参考文献
[1] xscreensaver
http://www.jwz.org/xscreensaver/
[2] ぱぱんだ 著、「Linux 怒涛の Q&A」 AI エーアイ出版 2000 年
[3] Jochen Hein 著、Linux システム管理 株式会社アスキー 2000 年
[4] 細江亮 著、UNIX X ウィンドウプログラミング (Xlib) HBJ 出版 1992 年
[5] 「月刊リナックスワールド」 IDG ジャパン
[6] フリー百科事典『ウィキペディア (Wikipedia)』
http://ja.wikipedia.org/wiki/
[7] X Window System でのグラフィックプログラミング
http://infux03.inf.edu.yamaguchi-u.ac.jp:8080/nakata/class/
[8] Mark J. Kilgard 著、OpenGL programming for the X Window system 星雲社 1997 年
29
付録
以下 [2] を参考に、基本的なファイル・ディレクトリ操作のコマンドを説明する。
• cd コマンドはカレントディレクトリ (現在ユーザーが作業しているディレクトリ) を
移動するためのコマンドである。
$cd sample←− カレントディレクトリ sample に移動
$cd .←− カレントディレクトリのまま
$cd ..←− 一つ上のディレクトリに移動
$cd /sample←− ホームディレクトリにある sample ディレクトリに移動 ( /はホー
ムディレクトリ)
• cp コマンドは、ファイルやディレクトリをコピーするためのコマンドである。
$cp a.c b.c←−a.c ファイルを b.c ファイルにコピーする (b.c が存在すれば上書きさ
れる)
$cp -r sample ensyu←− ディレクトリ sample を ensyu にコピーする
• locate コマンドは、ファイルを検索して条件にあったファイルの一覧を表示する。
$locate sample ←− ファイル名の一部に sample を含む一覧
• ls コマンドは、ディレクトリのファイルを一覧表示する。
$ls←− カレントディレクトリのファイル一覧
$ls -l←− 詳しいファイルの一覧
$ls -a←−. や..、.bashrc などのドットファイルも含めて一覧
• mkdir コマンドは、ディレクトリを作成するコマンドである。
$mkdir sample←− カレントディレクトリに sample を表示
• mv コマンドは、ファイルやディレクトリの移動、名前の変更を行う。
$mv a.c b.c←−a.c のファイル名を b.c に変更 (b.c が存在すれば変更し上書きされる)
$mv sample ensyu←−sample ファイルを ensyu ディレクトリに移動
• rm コマンドは、ファイルやディレクトリを削除する。$rm a.c←− ファイル a.c を削
除
$rm -r sample←−sample ディレクトリをファイル含め完全に削除
30