わたしの名はフレイ 作家・デザイナー見習い
神々とともに生きる詩人 一等星シリウスの導きを信じて

X11

バイスとの通信とイベント駆動

X11はディスプレイ、キーボード、マウスなどのデバイスを管理し、それぞれの通信を処理して、2Dグラフィックスの「ウィンドウ」をディスプレイに表示し、マウスやキーボードなどでデバイスからの操作や要求があった場合は、「イベント」としてそれらを処理する。

X11の担当範囲はカーネルの担当範囲と重なることがある。特に、グラフィックチップ・グラフィックボードなどの設定は、X11で設定する必要がある。最近は、モジュールによって自動的に読み込まれることが多い。

ネットワーク透過とXサーバー・Xクライアント

X11ではネットワーク透過と呼ばれる、ネットワーク処理をXサーバーとXクライアントの間で行う。これをネットワーク透過と言う。Xサーバーは自分の使うマシンで動作するが、Xクライアントは自分のマシンではなくても、ネットワーク上にあるどのマシンのXクライアントとも、ネットワークと繋いで自分のXサーバーから表示・操作することが出来る。

マウス移動や文字入力などのイベントはXサーバーで処理されて、ディスプレイにマウスカーソルや(システムのフォントを用いた)文字を表示する。また、クリックなどのイベントは個別のXクライアントのウィンドウにイベント駆動で送られる。

Xプロトコルにより、Xはネットワーク透過な通信をXサーバーとXクライアントの間で行う。Xサーバーで発生したイベントは、マウスやキーボードなどのデバイスと、クライアントであるXアプリケーションの間でやり取りされ、その間で通信を行う。

X11のネットワーク透過は、グラフィックス操作におけるネットワーク分散処理を可能にする。これは古い技術だと思われることが多いが、コマンドラインSSHを実行するのと同様に、GUIでの操作や処理において早い段階からネットワーク通信をベースにした設計がなされているという点では、Windowsなどの競合システムよりも優れた点かもしれない。

XlibとGUIツールキット

Xlibは、クライアント向けのライブラリで、Xプロトコルの詳細を知らなくても、XクライアントがXサーバーと通信ができるようになっている。

Xlibでは、イベント駆動としてメッセージループと呼ばれる仕組みを使う。これはWindows APIなどと同等のシステムで、何かのイベントがそのプログラムに常に送られ続ける、というループを条件分岐で処理することで、メッセージを監視・処理することで、1つのループとしてクライアントプログラムを書くことができる。

また、XlibでXアプリケーションを書くことはできるが、Xlibにはボタンやメニューなどの「ウィジェットツールキット」が用意されていない。このため、通常はGTK+やQtのような、Xlibを用いて作られたGUIツールキットと呼ばれるボタンやメニューなどのウィジェットが用意された多重階層のライブラリを使ってウィンドウを表示するGUIプログラムを開発する。

ウィンドウマネージャとデスクトップ環境

X11におけるGUIの操作性は、ウィンドウマネージャと呼ばれるサードパーティのプログラムに任されている。プログラマは独自のウィンドウマネージャを作ることができる。これによって、X11ではどんな操作性を実現したウィンドウマネージャでも自由に開発できる。

また、ウィンドウマネージャはウィンドウの操作を担当するが、Windowsのような近代的なシステムでは、ファイルマネージャや端末エミュレータなどを、統一された操作性で実現する必要がある。また、設定やファイルシステムを仮想化する手段も必要であり、CORBAのようなコンポーネントの利用とその準備も実現する必要がある場合がある。これを統合デスクトップ環境、あるいはデスクトップ環境と呼ぶ。統合デスクトップ環境には、商用UNIXなどで用いられるCDEや、オープンソースKDEGNOMEなどが存在する。言ってみれば、WindowsMacのようなパソコンOSも、その主体となるシステムはデスクトップ環境(Windowsではファイルマネージャを兼ねたExplorerレジストリ・COMなどのGUIシステム)である。

X11の仕組み

X11は、ユーザーのコンピュータの入出力デバイス(マウス、キーボード、ディスプレイなど)を監視するXサーバーと、GUIアプリケーションであるXクライアントが、ネットワーク透過なXプロトコルを使って、要求などの応答を通して成り立っている。(HTTPDとは違い、ユーザーのコンピュータがサーバーで、リモートのプログラムがクライアントである、と言うところに注意が必要。ユーザーはサーバーであるXサーバーの画面を操作しながら、リモートのXクライアントをネットワークで操作する。)

Xlibは、XクライアントがXプロトコルの詳細を知らなくてもXサーバーと通信出来るようにしたライブラリ。Xlibによるプログラミング処理を見ると、Windowsプログラミングのようなメッセージループによるプログラムになる。

だが、普通、Xlibを直接に操作することは無い。ボタンやメニューのようなグラフィックス・ツールキットが用意されていないからである。あらかじめ作られたボタンやメニューを使うためには、GTKやQtなどのツールキットなどを使う。

X11は、最近ではWaylandと言うものにとってかわられようとしている。

ネットワーク透過とはメッセージのやり取り

X11では、ハードウェアを操作しグラフィックを表示するXサーバーと、ウィンドウフォームを描画しGUIプログラムを実行するXクライアントが、「ネットワーク透過」というネットワークプロトコルで繋がっている。

なぜこんな設計にしたのか。それは、僕はウィンドウシステムとウィンドウの間でメッセージをやり取りする上で、それをネットワーク通信にするのが自然だから、だと思う。

ウィンドウシステムの役割とは、大きく3つある。それはハードウェアの操作、グラフィックスの表示、そしてメッセージのやり取りである。

サーバーとしてハードウェアの操作とウィンドウ描画を行うXサーバーと、ウィンドウの内部のグラフィックスの表示を行うXクライアントが、メッセージをやり取りする。このメッセージをネットワーク透過で行うことで、サーバーはSSHのようにネットワークに繋がった他のクライアントとも、「遠隔通信のようにメッセージをやり取りできる」のである。

ただ、これは僕の勝手な意見だから、設計者がこのように考えて設計した、というものではない。僕が勝手に、「X11のネットワーク透過はこんな意味があるのではないか」と考えた、推測にすぎない。

中央処理コンピュータ・X端末のモデルと分散システムとしてのX

実際のところ、X11のネットワーク透過は、端末と中央処理コンピュータが分かれていたごろの名残りであると同時に、一種のネットワークを通じた分散システムであると考えられる。

UNIXの端末のように、Xアプリケーションのプロセスを大きな処理能力のある中央のワークステーションで行いながら、そのプログラムをたくさんのX端末からネットワークを通じて操作することができる。

また、一種の分散システムとして見れば、さまざまなコンピュータのホストにあるXクライアントを、Xサーバーがそれぞれのコンピュータに役割を持たせながら遠隔操作することができる。

これをより発展させたのがWindowsのCOMやGNOMEのCORBAで、さまざまなホストにあるネットワーク上のコンポーネントが連携して、「ネットワーク通信上のさまざまなオブジェクトが相互にメッセージをやり取りしてひとつのシステムとして実行する」ことができる。

CORBAではWindowsのオブジェクトとLinuxのオブジェクトがネットワークで別々の言語で相互に通信することもできる。

後日注記:X11の優れた点は、ひとつのモニターから遠隔地にある複数のコンピュータを操作できるということ。モニターやキーボードがついていないコンピュータでも、X端末から遠隔操作できる。モニターがついているコンピュータはひとつだけで良い。そのひとつのX端末から、ネットワークで繋がった全てのコンピュータを遠隔操作できる。もちろんX11のアプリケーションが入っている必要はあるが、さまざまな場所に分散したコンピュータをひとつのX端末から遠隔操作することで、コンピュータがどこにあったとしてもひとつの端末から遠隔操作し、遠隔地にあるコンピュータシステムを管理することができる。

コマンドとXアプリケーションの違い

コマンドプログラムとXアプリケーションの違いは、コマンドはターミナルに文字を出力し、シェルからコマンドで実行するが、XアプリケーションはXサーバーにウィンドウを表示し、Xサーバーから操作して実行する、ということが異なる。

コマンドプログラムは、文字ベースの入出力で操作が完結しているが、Xアプリケーションは「Xサーバー」を介して実行・操作する。Xサーバーが無ければ動かないし、操作もできない。

ウィンドウマネージャの役割

Xにおいては、「ウィンドウマネージャ」と呼ばれる特別なプログラムが、ウィンドウの操作と実行を管理する。

このウィンドウマネージャの役割は大きく2つ。それは「ウィンドウの管理」と「アプリケーションの実行」である。

X11におけるウィンドウをどのように管理するかという「ウィンドウマネージメント」の機能と、アプリケーションを実行する「ランチャー」の機能を、ウィンドウマネージャは持っている。

X11においてはウィンドウマネージャからXアプリケーションを実行し、ウィンドウマネージャの機能を使って実行されたウィンドウを破棄・表示を切り替えする。

つまり、コマンドラインにおける「ターミナルとシェル」が、X11における「Xとウィンドウマネージャ」となる。

これに加えて、デスクトップ環境では、ファイルマネージャや端末エミュレータなど、さまざまな「GUIアプリケーション」を提供し、一貫した操作法を実現する。

MotifとLinuxGUIツールキット

UNIXにおけるGUI環境では、XサーバーをコアにXlibによるプログラミングを行うが、ここではボタンやスクロールバーのような「ツールキットライブラリ」は提供されていない。

UNIXでは、長らくMotifというGUIツールキットが標準的で、商用のUNIXワークステーションには、プロプライエタリのXとGUIツールキットのMotif、そしてCDEなどのMotifで書かれた統合デスクトップ環境を乗せるのが一般的だった。初期のGIMPもMotifで書かれていた。

だが、最初期のLinuxから見ると、Motifには問題があった。Motifはオープンソースでなく、有償で提供されていたため、Motifで作られたXアプリケーションは、それ自体がフリーでもMotifに依存し、そのため「Motifを購入しなければ使えない」という酷いものだった。

最初期のLinuxX11には標準的なツールキットが無く、Motifに代わるツールキットが必要だった。

標準的なツールキットのないX11に、Trolltechという会社がQtと呼ばれる優れたツールキットを提供した。QtはKDEという「CDEのCをKに変えたデスクトップ」で採用されたが、ここでも問題が起きた。Qtも(当時は)フリーソフトウェアではなかったのである。

これに問題を感じたGNUでは、GNUの協力者でプログラマであるミゲル・デ・イカザにより、QtではなくGIMPGTK+を採用した独自の統合デスクトップが開発された。これがGNOMEである。

Harmonyという「Qtのオープンソース代替」も作っていたGNUだが、GNOMEの方が成功した。GNOMEでは、CORBAを使うことで、WindowsのCOMのようなコンポーネント分散通信システムを作った。これが、商用Linuxディストリビュータなどに「GNOMEを採用させるきっかけ」を与えた。ミゲルは「UNIXをもっとマシなものにしよう」と提唱した。

GTK+はシンプルなC言語のツールキットで、QtがC++を採用しているのとは対照的に、単純なC言語によるツールキットを提供し、C言語オブジェクト指向を行えるGLib・Gobjectという仕組みを採用している。その上で言語バインディングを提供することにより、さまざまな言語で開発が行える。Windowsでも.NETでC#/VBで開発ができるように、GTK+ではC/C++/Python/Ruby/JavaScriptなど、「多くの言語でGUIプログラミングができる」というところが売りである。そのため、RubyistなどにはGNOMEはとても良い環境である。

メタファーと環境の実現

X11のデスクトップ環境について言えることは、「メタファーの実現」である。

メタファーとは隠喩のことで、コンピュータを現実のものに喩えた「デスクトップ」あるいは「ワークスペース環境」を提供する。

GNOMEKDEは、既存のWindowsmacOSのようなデスクトップOSの操作環境と基本的には同一の、デスクトップ環境を構成するGUIアプリケーションをひとまとめに開発しており、一定の共通性のあるルック・フィールでデスクトップを操作できる。

メタファーの実現は重要で、コマンドラインでは「シェルとコマンドとファイル」によって実現されていた「コマンドライン環境」が、GNOMEKDEではファイルマネージャやランチャーやウィンドウマネージャによって全く違う「GUI環境」に変貌する。

LinuxGUIの分野ではコマンドラインほどの目立った成果は得られていないが、そのためにかかる開発のコストや手間はコマンドラインより大きく、さまざまなGUIアプリケーションをウィンドウマネージャや基礎のアーキテクチャ(ライブラリやフレームワーク)の基に実現している。またGNOMEや最近のKDEなど一部の環境はCORBAやD-Busのような分散ネットワークシステムを基盤にしており、Plan 9のように分散ネットワーク上でGUIアプリケーションを実行できる。

GNOME

Linuxで実行出来る巨大なデスクトップ環境の1つ。シンプルで使いやすい、一般ユーザーに分かりやすい操作性と、CORBAを使用したネットワークオブジェクト指向アーキテクチャを提供する。ただし、巨大なコンポーネント指向のデスクトップであるため、昔から動作が遅く「もっさり」しており、またデザインがのっぺりとしていてダサい。動作が遅いだけではなく、何をするにも到達するまでのステップが一息遅い。だが、一般ユーザー、時にパソコン初心者のことを良く考えており、余計なものがなく簡単に使える、シンプルなデスクトップを目指している。

最近ではSunがやっていたように、UNIXワークステーションの環境でもGNOMEが使われることが多くなってきている。GNOMEKDEよりも標準的に採用されることが多い理由は、こうしたUNIXワークステーションベンダーが会社としてGNOMEを支持する傾向が強いからである。なぜか、明らかにKDEの方が優れているのに、馬鹿なGNOMEを標準的に採用する。

だが、GNOMEが決して馬鹿なわけではなく、最近はGNOME 3はWindows 8よりも先んじて投入された、「全画面インターフェース」の先駆けであり、GNOME 3はオリジナル要素が強い。逆にKDEは個性を失い、美しくなったように見えてWindowsと全く同じものになった印象がある。

KDE

Linuxで実行出来るもうひとつの巨大なデスクトップ環境。機能性とQt/C++による整理されたフレームワーク、美しくて使いやすくカッコいいデスクトップ環境が特徴。美しい代わりメモリを食うことで知られており、またGNOMEに比べて不安定なところがある(GNOMEは遅くても起動するが、KDEは起動すらしない場合が多い)。「本当のLinuxのデスクトップ」を目指しているが、Qtを採用しているため、FirefoxのようなGTK+アプリケーションと調和せず、「美しいようでそんなに美しくない」デスクトップ環境である。

CDE

UNIXワークステーションで使われることの多い統合デスクトップ環境。Motifをツールキットとして採用する。KDEはそもそもはこのCDEを模倣して作られた。

Xfce

Xfceは意外と人気がある。僕は、みんなが使う時のことを考えると、UbuntuXfceかMATEを使ってもらうのが一番良いと思う。

昔使っていたところで考えると、本当に軽くて使いやすいのだが、何かがチープで、シンプル過ぎて一人前のデスクトップ環境として使えないような、そんな印象を受ける。

UNIXのメタファーを尊重し、それぞれを単機能で小さなプログラムにする、という発想は、とても良い発想だと思う。

LXDE/LXQt

軽量さを目指しているデスクトップ環境。ただ、僕は機能性を考えるとMATEの方が良いと思う。

3ボタンマウスでコピー・ペースト

伝統的なUNIXX11では、Macの1ボタンやWindows/PCの2ボタンではなく、3ボタンマウスを使っていた。

この3ボタンマウスは、現在のホイール用の中ボタンがあるマウスでは、エミュレートして使うことができる。

X11では、伝統的に、選択して右クリックメニューからコピーを選択しなくても、文字列を選択しただけでコピーできる。そして、中ボタンのクリックでペーストができる。

ただし、今ではGNOMEKDEでも右クリックメニューからコピー・ペーストを行うのが一般的である。

X11でも使うのはターミナル

X11でも、UNIXの基本はターミナルです。X11では、端末エミュレータというソフトウェアを使って、X11からコマンドシェルを用いてコマンドを実行することができます。

ただし、アイコンで操作したい、という人は多いでしょう。GNOME/KDEには、ターミナル以外に「ファイルマネージャ」というソフトウェアが用意されています。これは起動時のGNOMEKDEで既に起動しており、ユーザーはデスクトップのアイコンをクリックしたり、ファイルマネージャを新しく起動して深いディレクトリ階層を辿ったりすることができます。

いわば、「WindowsUNIXもどちらの形式の操作もできる両刀使い」です。GNOMEUNIXコマンドラインを上手く使い分けることで、デスクトップLinuxの真価が発揮するでしょう。

GUIWebブラウザがあればLinuxでも何とかなる

また、インターネットも同じで、wgetのようなコマンドとMozillaのようなGUIWebブラウザを使い分けます。現代のパソコンでは、クラウド化が進み、何でもローカルのアプリケーションよりもブラウザから見る場合が増えました。これはLinuxにとって朗報です。というのは、Linuxには優れたアプリケーションが多くなくても、ブラウザのMozilla FirefoxGoogle ChromeなどはWindowsと全く同じように操作することができるからです。僕はLinuxを使ってYouTubeを見ることの多いYouTube利用者です。最近はAndroidからもYouTubeの音楽を良く聴きますが、ネットワークやクラウドが行き着く先は、きっとWindowsよりもLinuxのはずです。

Xサーバーをなぜサーバーと言うか

Xサーバーでは、ローカルのマシンをXサーバーと言い、ネットワーク上のマシンをXクライアントと言います。これは、マイクロカーネル的なOSの考え方に基づいています。マイクロカーネルOSでは、プロセスやメモリ管理やプロセス間通信などを除いて、ファイルシステムやネットワーク、デバイスドライバは、ファイルシステムサーバーのようなデーモンで行います。Xサーバーもこれと同じで、グラフィック専門のマイクロカーネルサーバーのようなものだと考えることができます。