ユーザーインターフェースとデスクトップ

# X Window System
LinuxやUNIXでGUIを実現するために使用されてきたシステム。「XFree86」が多く採用されていたが、現在は「X.Org」が主流となっている。

+ **Xサーバ**
モニターやビデオカード、キーボードといったハードウェア管理を行う

+ **Xクライアント**
ユーザーアプリケーションでWebブラウザやオフィスアプリケーションなどが相当する。

![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/d5f40e0b-a4f9-2cbe-8f6f-95974ed94ede.png)

Xはネットワーク経由で利用でき、Xサーバが稼働しているのとは別のコンピュータで動作しているXクライアントを表示し、操作することが可能。

![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/50669559-5a0c-8ff4-133f-7fb09cc7eb52.png)

~~~ md
#remotepcのXクライアントがlocalpcのXサーバを許可する
[lpic@localpc]$ xhost +remotepc

#remotepcの環境変数DISPLAYでXサーバを指定し、エクスポート
[lpic@remotepc]$ DISPLAY=localpc:0
[lpic@remotepc]$ export DISPLAY

#remotepcでXクライアントを起動
[lpic@remotepc]$ rxvt $
~~~

+ **環境変数DISPLAY**
**書式:サーバ名：ディスプレイ番号.スクリーン番号**

| 変数の要素 | 説明 |
|:-:|:-:|
| サーバ名  | リクエストの送り先のXサーバを指定(省略するとlocalhostになる)  |
| ディスプレイ番号  | 同じキーボードとマウスを共有するモニタの集合に対して付けられる番号。通常は0  |
| スクリーン番号  | モニタにつけられる番号(0は1台目、1は2台目のモニタを指定)  |


### xhostコマンド
**書式:xhost [+-] ホスト名**
XクライアントがXサーバを利用できるように許可を与えるコマンド。引数なしで実行すると、現在の状態が表示される。IPアドレスでも指定可能
クライアントの認証は行わないので、使用環境によってはセキュリティ上の問題となる。

| オプション | 説明 |
|:-:|:-:|
| + ホスト名  | 指定したホストをXサーバ接続許可リストに追加する(**省略可能**)  |
| - ホスト名  | 指定したホストをXサーバ接続許可リストから削除する  |
| +  | 全てのホストがXサーバに接続することを許可する。アクセス制御は無効  |
| -  | Xサーバ接続許可リストによるアクセス制御を有効にする  |


### X11ポート転送
リモートのXクライアントホストのX11ポートをsshの通信路を利用してローカルのXサーバに転送することで、リモートで実行したXのアプリケーションをローカルホストの画面に表示、操作できる。

![キャプチャ8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/b0adf408-11af-c8b2-d6ad-a38112812fa0.png)
利用するにはSSHサーバ側とSSHクライアント側で以下の設定が必要になる

+ **SSHサーバ側**
`/etc/ssh/sshd_comfig`で「X11Forwatding yes」を設定する

+ **SSHクライアント側**
`/etc/ssh/ssh_comfig`で「ForwardX11 yes」を設定する




## X.Org
以前は`/etc/Xll/xorg.conf`ファイルで設定を行っていたが、現在は手動で設定する必要はほとんどない。
`/etc/Xll/xorg.conf.d`ディレクトリ以下に複数の.comfファイルとして配置されることもある

セクションは「Section"セクション名"」から「EndSection」までの範囲で記述されている
| セクション | 説明 |
|:-:|:-:|
| Files  | フォントやカラーデータベースファイルのパス名  |
| Module  | ダイナミックモジュールの設定  |
| InputDevice  | キーボードやマウスなどの入力装置の設定  |
| InputClass  | 入力装置の「クラス」に適用される設定  |
| Device  | ビデオカードの設定  |
| Monitor  | モニターの設定  |
| Modes  | ビデオモードの設定  |
| Screen  | ディスプレイの解像度、色深度(表示色数)や画面サイズの設定  |
| SeverLayout  | 入出力デバイスとスクリーンの指定  |

### Xorg -configureコマンド
コマンド実行すると、`xorg.conf`ファイルから`xorg.conf.new`という名前のファイルを自動生成してくれる。最近のディストリビューションにはファイルが存在せず、システム起動時に設定を行う場合もある。
それを`xorg.conf`という名前で`/etc/X11`ディレクトリ内にコピーする。

### startxコマンド
CUI環境（ランレベル3）で実行すると、X Window Systemが起動する。実体はスクリプトで、X Window Systemの環境を整えるのに必要なコマンドの実行、設定ファイルのパスが書かれている

#### startx実行時の流れ

1. startxコマンドの実行
2. xinitコマンドの実行
3. ホームディレクトリの`~/.xinitrc`を実行。ない場合は、`/etc/X11/xinit/xinitrc`を実行
4. GNOMEなどのウィンドウマネージャを起動 

### xdpyinfo(X Display Infomation)コマンド
Xサーバについての情報を表示するコマンド。

+ depth of root window
色数を確認することが出来る。表示欄は2のn乗で計算を行う

| 表示 | 説明 |
|:-:|:-:|
| 1 planes  | 2の1乗=2色(モノクロ)  |
| 8 planes  | 2の8乗=256色  |
| 24 planes  | 2の24乗=16777216色  |

### xwininfoコマンド
クリックした特定のウィンドウの情報を表示する。「-root」オプションによりルートウィンドウの情報を表示することが出来る。


### xauthコマンド
Xサーバへの接続に使用される資格情報を表示したり、クライアント認証ファイルを編集するコマンド。ユーザ単位でXサーバへのアクセスを制限する


## Wayland
Xに代わる新しいディスプレイサーバのことで、CentOS8ではデフォルトのディスプレイサーバになっている。
クライアントとサーバはWaylandプロトコルで通信をする。ディスプレイサーバは個々のクライアントアプリケーションのウィンドウを合成(composite:コンポジット)してスクリーンイメージを生成する。Waylandの主要な機能であり、compositor(コンポジッタ)と呼ばれる。


# グラフィカルデスクトップ

### ディスプレイマネージャ
ランレベルが5の時にユーザにグラフィカルログイン画面（GUI環境のログイン）を提供し、ログイン認証、ログイン後のデスクトップ環境の準備を行うソフトウェアのこと。複数のデスクトップ環境がインストールされている場合、切り替えることが可能。

+ X.Org 標準の**XDM(X Display Manager）**
+ GNOMEで利用される**GDM（Gnome Display Manager）**
+ KDE Plasmaで利用される**SDDM（Simple Desktop Display Manager）**
+ Ubuntu で標準採用されている**LightDM**
+ KDEで利用される**KDM**

::: note info
**・GNOME(GNU Network Object Model Environment)とは？？**
UNIX系OSでよく利用されるデスクトップ環境の一つ。X Window System上で動作するソフトウェアのパッケージで、商用OS製品に似た美しく機能的なデスクトップ環境を構築することができる。オープンソースソフトウェアとして公開されているため誰でも自由に入手、利用、改変、再配布などすることができる。

**・KDE(K Desktop Environment)**
UNIX系OSでよく利用されるデスクトップ環境の一つ。X Window System上で動作するソフトウェアのパッケージで、Microsoft Windowsなどの商用OS製品に似た美しく機能的なデスクトップ環境を構築することができる。
:::

ディスプレイマネージャを起動するシーケンスはSysV initとsystemdそれぞれのシステムで異なる

+ **SysV initの場合**
ランレベル5で立ち上げた場合、あるいはほかのランレベルから5に切り替えた場合、initから起動されるシェルスクリプト**prefdm(Preferred Displau Manager**)がディスプレイマネージャを起動する。
環境変数DISPLAYMANAGERによりディスプレイマネージャを指定する。

+ **systemdの場合**
シンボリックリンクファイル`display-manager.service`のリンク先のディスプレイマネージャを起動する。systemctlコマンドにより使用有無を切り替えることが出来る。


ディスプレイマネージャはユーザー認証が完了すると、Xサーバ(X.Org)とXクライアントを起動する。

![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/ce66aea5-bb63-d3a3-c446-716d94f01bcc.png)


#### XDM(X Display Manager）
X.Org標準のディスプレイマネージャ。XDMCPプロトコルを使用して、ネットワーク上にあるX端末にもグラフィカルログイン画面を提供する。XDMの設定ファイルは`/etc/X11/xdm`ディレクトリに格納されています。

| ファイル名 | 説明 |
|:-:|:-:|
| xdm-config  | XDMの設定ファイル  |
| Xresources  | XDMログイン画面のデザイン設定  |
| Xaccess  | ホストからXDMのアクセス許可の設定  |
| Xsetup_0  | XDMログイン画面表示前に実行されるスクリプト  |
| Xsession  | XDMのログイン後に実行されるスクリプト  |


### ウィンドウマネージャ
Xの外観を制御しているソフトウェアのことで、ウィンドウの外観、メニュー、アイコンなどを提供するXクライアント。ウィンドウのオープン、クローズ、移動、リサイズなどを管理するプログラム。

| ウィンドウマネージャ | 説明 |
|:-:|:-:|
| twm  | 最小限の機能を備えた基本的なウィンドウマネージャ  |
| FVWM  | 軽快でシンプルなウィンドウマネージャ  |
| Enlightenment  | 高度なカスタマイズが可能なウィンドウマネージャ  |
| Mutter  | GNOME2の標準ウィンドウマネージャ  |
| Metacity  | GNOME3の標準ウィンドウマネージャ  |
| Fluxbox  | 軽快でカスタマイズ性の高いウィンドウマネージャ  |
| WindowMaker  | 簡素で軽量なウィンドウマネージャ  |
| Compiz  | 立体的な画面効果が華々しいウィンドウマネージャ  |
| KWin  | KDEの標準ウィンドウマネージャ  |


## 統合デスクトップ環境
ウィンドウマネージャ含めて、アプリケーションまで揃えて統一的な操作が提供されるもの。代表的なものは、GNOMEとKDE Plasma。

| 種類 | GNOME | KDE Plasma |
|:-:|:-:|:-:|
| テキストエディタ  | gedit  | KEdit  |
| 端末  | GNOME端末  | Konsole  |
| ファイルマネージャ  | Nautilus  | Dolphin  |
| ディスプレイマネージャ  | GDM  | SDDM  |
| ウィンドウマネージャ  | Mutter  | KWin  |


### Xfce
メモリやCPUの消費量が少ない軽量のデスクトップ環境。GNOMEやKDEに比べて軽快に動作し、見た目も良く、使いやすい。

## リモートデスクトップ
ネットワーク経由でリモートコンピュータのデスクトップを操作する技術で、離れた場所のデスクトップを操作することが出来る。

### VNC(Virtual Network Computing)
Windows、Linux、MacOSなどクロスプラットフォーム対応のリモートデスクトップソフトウェアのこと。
ディスプレイがないと発動しない。操作しているのが相手に見えてしまう。
デスクトップを操作される側のコンピュータに**VNCサーバ**を、操作する側のコンピュータには**VNCクライアント**をインストール

~~~ md
#VNCサーバを起動させる。:1はディスプレイ番号
$ vncsever :1

#終了するとき
$ vncserver -kill :1
~~~

### RDP(Remote Desktop Protocol)
Windows標準のリモートデスクトッププロトコルで、標準的に利用が出来る。WindowsのデスクトップをLinuxデスクトップに表示させたい場合に利用する。Windows側でアクセスを許可する必要がある。
専用のセッションで動かしているため、操作している様子はわからない。同時セッションは1つのみ。


### SPICE(Simple Protocol for Independent Computing Environment)
RDPと同様のOSSの画面転送プロトコル。VNCと異なり、**4画面までのマルチモニタ**や**ネットワーク経由でのUSB転送**など、VNCがサポートしていない多くの機能をサポートしている。


### XDMCP(X Display Manager Control Protocol)
ディスプレイマネージャをネットワーク越しに利用できるプロトコルで、Xサーバとディスプレイマネージャの間で使用される。通信経路が暗号化されていないため安全性に問題がある。




# Accessibility(アクセシビリティ)
ユーザー補助機能全般のことをさし、障碍者を支援するためのソフトウェア技術であるAT(Assistive Technology)を利用することが出来る。

### 音声認識
音声入力をコンピューターが認識し、文字に変換したり操作を行う。Linuxで音声認識の機能を使用するには、Julius（音声認識エンジン）やKaldi（音響モデルの作成を行う）などのソフトウェア、単語辞書などが必要になる。

### gok(GNOME Onscreen Keyboard)
GNOME2のオンスクリーンキーボード(ソフトウェアキーボード)のこと。gokコマンドで表示することが出来る。

### emacspeak
Emacs環境に統合されたスクリーンリーダーのアプリケーション。Emacsに読み込んだテキストや電子メールなどを音声で読み上げることができる。

### 点字ディスプレイ
文字データを点字に変換して専用点字ディスプレイに出力

### 点字キーボード
点字の一文字を表す6つの点にそれぞれ対応する6点キーで入力

### スティッキーキー(固定キー)
有効にすると、別のキーを入力するまでの間、修飾キー(Shift,Alt,Ctrl,Metaキーなど)が押されたままの状態になる。この状態のことを**ラッチ**と呼ぶ。
修飾キーを連続で押すとロックされる。修飾キーをもう一度押すまでロック状態が維持される。

### スローキー
キー押下を認識する時間を調整したり、キー押下に合わせてビープ音を鳴らしたりすることが出来る機能

### バウンスキー
誤って立て続けに同じキーを押してしまっても、連続した入力とみなされないよう、素早く何度も押したり押し続けたりした場合のみ入力を無視することが出来る。

### トグルキー
NumLockキー、CapsLockキー、ScrollLockキーなどを押して機能が有効になるとビープ音が1回、無効になったときはビープ音を2回鳴らす機能

### マウスキー
マウスの代わりにテンキーを使ってマウスポインタを移動させたり、クリック操作をしたりすることが出来る機能