X Window System の続きです。X の場合、サーバー側はユーザーの入力処理とクライアントが要求したグラフィックをディスプレイに描画するだけで、ウィンドウの外観や操作方法などのユーザーインターフェース (UI) を担当しているわけではありません。UI を担当しているのはクライアント側のプログラムで、これを「ウィンドウマネージャ (window manager)」といいます。
Cygwin/X には 4 つのモードがあります。
1 は Windows 10 の画面の中で X クライアントのウィンドウが描画されますが、これは X サーバーに Multiple windows 用のウィンドウマネージャが用意されていて、それが動作することで実現しています。それ以外のモードでは何かしらのウィンドウマネージャが必要になります。たとえば、3. One Window で Cygwin/X を起動した場合、コンテンツが黒い大きなウィンドウが一つ表示されます。この状態では、コンテンツ上でマウスカーソルは表示されません。
また、Cygwin や WSL の端末で xeyes を実行すると、コンテンツの左上隅に xeyes は表示されますが、ウィンドウのタイトルや枠などは表示されません。ウィンドウを閉じたり、最大化、最小化、移動などの操作もできません。表示する位置も左上隅からしかできないので、xeyes のあとに xclock を実行すると、xeyes の上に xclock が上書きされてしまいます。
X サーバーを起動したあとウィンドウマネージャを実行すると、いわゆる GUI での操作が可能になります。いちいちウィンドウマネージャを実行するのは面倒なように思えますが、ウィンドウマネージャを入れ替えることで、ユーザーが自分の好みに合わせて自由に GUI 環境を構築することが可能になります。
Cygwin/X (X11 カテゴリ) にはいろいろなウィンドウマネージャが同梱されています。
Fluxbox, FVWM, Openbox, WindowMaker は スタートボタン -> Cygwin-X から起動できますが、いわゆる「ディスクトップ環境」ではないので、その操作方法に戸惑われるかもしれません。
たとえば、Openbox にはパネル (タスクバー) がありません。マウスの右クリックでメニューが表示されるのはいいのですが、ウィンドウを最小化すると画面から消えてしまいます。M.Hiroi は元に戻す方法がわからず、途方に暮れてしまいました。ネットで調べてみると、Openbox は tint2 などのパネルと組み合わせて使うのが一般的なようです。
ところで、Cygwin には GNOME, KDE, LXDE, Xfce といったカテゴリも用意されています。M.Hiroi はまだ試していませんが、それらをインストールすればディスクトップ環境を利用できると思います。興味のある方は試してみてください。
ウィンドウマネージャは X クライアントの一つなので、WSL 側で実行することもできます。ネットを検索すると、LXDE や Xfce などをインストールする記事も見つかりますが、ここでは twm を使ってみましょう。twm は X11 の初期からある小さくて軽量なウィンドウマネージャです。古風な UI なので、初めて使う方は面食らうのではないでしょうか。
Ubuntu の場合、twm は次のコマンドでインストールすることができます。
sudo apt install twm
あとは One Window モードで X サーバーを起動して、WSL から次のコマンドを入力するだけです。
$ twm &
twm はユーザーによるカスタマイズが可能です。設定はファイル ~/.twmrc に記述します。ファイルが存在しない場合、デフォルトのファイル (Cygwin ならば /usr/share/X11/twm/system.twmrc, Ubunts ならば /etc/X11/twm/system.twmrc-menu) が参照されます。Ubunts の場合、デフォルトの設定が非常に使いにくいので、M.Hiroi は Cygwin の設定ファイルを ~/.twmrc にコピーしました。この設定で参考 URL 3 を読むと、twm の基本的な使い方がよくわかると思います。作者様に感謝いたします。
マウスの右ボタンを押したままにするとメニューが表示されます。xterm を立ち上げて xeyes や xclock を実行する、または WSL 側から GUI アプリを実行することもできます。拙作の Tcl/Tk ミニゲームも動作します。興味のある方はいろいろ試してみてください。
WSL の続きです。Unix 系 OS では GUI の構築に X Window System を使うのが一般的です。X とか X11 (X Version 11) と呼ばれることもあります。X はクライアントサーバーモデルになっています。ユーザーが使うキーボード、マウス、ディスプレイなどを管理するサーバー (X サーバーという) があり、それを複数のアプリケーション (X クライアントという) が利用する方式になります。
1 台の PC で Linux (たとえば xubuntu など) を動かす場合、X サーバーと X クライアントは同じマシンで動作することになります。X サーバーと X クライアントはネットワークを経由して通信することもできます。たとえば、遠隔地にあるマシンでアプリを実行し、手元のマシンで結果をグラフィック表示したり、アプリを GUI で操作することも可能です。この場合、手元のマシンがサーバーになるので、一般的なクライアントサーバーモデルと同じように考えるとちょっと混乱するかもしれません。
WSL の場合、基本的には CUI (Character User Interface) ですが、Windows 上で動作する X サーバーを用意すれば、WSL でも GUI アプリケーションを動かすことができます。フリーで利用できる X サーバーには Xming, Cygwin/X, VcXsrv などがあります。これらの X サーバーについては X Windowの利用について (農林水産研究情報総合センター) が参考になると思います。
インターネットで検索すると、WSL と VcXsrv で GUI 環境を構築する記事が多いようですが、ここでは Cygwin/X を使うことにします。なぜならば、M.Hiroi は Cygwin で Tcl/Tk や Python/Tkinter などを動かすため Cygwin/X を導入済みだからです。Cygwin/X は Cygwin がないと動作しません。Cygwin と Cygwin/X をインストールするのはけっこう時間がかかります。Cygwin は不要という方は、Cygwin/X 以外の X サーバーを選択することをおススメします。
Cygwin と Cygwin/X のインストールについては、拙作のページ Tcl/Tk GUI Programming: インストール方法, Cygwin で簡単に説明しているので参考にしてください。起動方法ですが、WSL で使用するときはサーバーの起動時にオプション -listen tcp の指定が必要になります。スタートボタン -> Cygwin-X -> XWin Server を実行しても、WSL と X サーバーを接続することはできません。ご注意くださいませ。
X サーバーを Cygwin Terminal で起動する場合、次のコマンドを実行してください。
run xwin -multiwindow -listen tcp
いちいち Cygwin Terminal でコマンドを入力するのは面倒という方は XLaunch を使いましょう。スタートボタン -> Cygwin-X -> XLaunch を実行します。
最初の Select display settings と次の Select how to start clients はそのままでいいでしょう。3 番目の Extra settings の項目 Additional parameters for X sever に -listen tcp を追加します。そして、最後の Configuration complete で Save Confiuration をクリックすると、今まで設定した内容がファイル (デフォルトは config.xlaunch) に保存されます。このファイルをダブルクリックすると、その設定で X サーバーが起動されます。
あとは WSL 側で環境変数 DISPLAY の設定が必要になります。
$ export DISPLAY=:0.0
bash の設定ファイル .bashrc に書き込んでおくとよいでしょう。
動作確認のため、パッケージ x11-apps をインストールして xeyes や xclock を動かしてみてください。ちなみに、WSL と Cygwin の両方で GUI アプリケーションを動作させることもできます。たとえば、WSL で xeyes を実行し、Cygwin で xclock を実行すれば、同じ画面上に xeyes と xclock が表示されます。Tcl/Tk と Noto フォントをインストールすれば、拙作のゲーム (Mini Games, Mini Games 2) も動作します。興味のある方はいろいろ試してみてください。
最近、M.Hiroi は Tcl/Tk の再入門みたいなことをやっています。Tcl/Tk の場合、C言語で書かれた関数をリンクするのは簡単で、その動作確認を xubuntu (VirtualBox) や Cygwin で行っています。VirtualBox はとても便利なのですが、以前に比べて動作がちょっと重くなったような気がしたので、たらい回し関数で実行時間を計測してみました。
リスト : たらい回し関数 (C言語) int tak( int x, int y, int z ) { if (x <= y) return z; return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y)); }
tak(22, 11, 0) の実行時間 gcc -O2 (ver 7.3.0): 1.24 (バージョン 5 詳細は不明 2018/10) gcc -O2 (ver 7.4.0): 2.99 (バージョン 6.0.14) 実行環境: xubuntu 18.04 on VirtualBox, Intel Core i5-6200U 2.30GHz
結果を見てびっくりしました。バージョン 6 になってから遅くなったのか、それとも M.Hiroi の設定に何か問題があるのかもしれません。設定はいろいろ試してみたのですが、現バージョンではこれより速くすることはできなかったので、残念ながらあきらめました。そこで、前から興味があった Windows Subsystem for Linux (WSL) を使ってみることにしました。
WSL は Linux の実行ファイル (ELF フォーマット形式) を Windows で動かすための仕組みです。Windows で Linux カーネルが動いているわけではなく、LXCore と呼ばれる「サブシステム」が Linux カーネルへのファンクションコールを Windows カーネルへのファンクションコールに変換することで動作します。なお、LXCore はすべてのカーネルファンクションコールに対応しているわけではありません。WSL では動作しないコマンドもあるようですが、多くのコマンドはそのまま実行することができます。
Windows 10 に WSL をインストールするのは簡単です。
2 回目以降の起動はスタートから Ubunts を選択する、またはコマンドプロンプトや PowerShell でコマンド wsl を実行します。あとは必要なパッケージを apt でインストールしてください。gcc は入っていなかったので、さっそくインストールしました。
たらい回し関数の実行時間は次のようになりました。
tak(22, 11, 0) の実行時間 gcc -O2 (ver 7.4.0): 1.28 実行環境: Windows 10 WSL, Intel Core i5-6200U 2.30GHz
WSL も速いですね。I/O 処理が絡むと実行速度は遅くなると思いますが、Linux やプログラミング言語の学習には十分すぎる速度です。Linux の学習には Cygwin という選択肢もあるのですが、パッケージのインストールは apt に慣れると Ubuntu のほうが簡単です。しばらくは WSL でいろいろ試してみたいと思います。
ジオシティーズの転送サービスは 2019 年 9 月 30 日で終了します。10 月以降になるとジオシティーズ (http://www.geocities.jp/m_hiroi/ と http://www.geocities.co.jp/SiliconValley-Oakland/1680/) にアクセスしても、今のホームページ (http://www.nct9.ne.jp/m_hiroi/) に転送されることはありません。よろしければブックマークの変更をお願いいたします。
Noto フォントは Google によって開発されたオープンソースのフォントです。Linux ディストリビューションの 1 つである Ubuntu は、今まで日本語フォントに Takao フォントが用いられてきましたが、Ubuntu 18.04 からは Noto フォントになりました。Noto Sans CJK JP がゴシック体で、Noto Serif CJK JP が明朝体になります。
もちろん、Windows にインストールすることも可能です。そこで、実際にインストールして Python/Tkinter で表示してみました。プログラムと実行結果を示します。
リスト : 游ゴシックと Noto Sans CJK JP の表示 import tkinter as tk import tkinter.font as font root = tk.Tk() str = 'Hello, world, こんにちは世界' for x in ["Light", "Regular", "Medium", "Bold"]: tk.Label(root, text=str, font=('游ゴシック {}'.format(x), 20)).pack() for x in ["Thin", "Light", "DemiLight", "Regular", "Medium", "Bold", "Black"]: tk.Label(root, text=str, font=('Noto Sans CJK JP {}'.format(x), 20)).pack() root.mainloop()
上の 4 つが游ゴシックで、残りの 7 つが Noto フォントです。游ゴシックと Noto フォント、どちらも綺麗なフォントだと思います。M.Hiroi's Home Page のメインフォントとして、Noto フォントを使ってみるのも面白いかもしれません。なお、Noto フォントは Web フォントとして利用する方法もあるようです。Web フォントはよくわかっていないので、これから勉強しようと思っています。
昨日、M.Hiroi' Home Page の転送設定を行いました。http://www.geocities.jp/m_hiroi/ と http://www.geocities.co.jp/SiliconValley-Oakland/1680/ のアクセスは移転先 (http://www.nct9.ne.jp/m_hiroi/) に転送されます。なお、転送サービスの期限は 2019 年 9 月 30 日までです。よろしければブックマークの変更をお願いいたします。また、メールアドレスに変更はありません (アドレスは Profile をご覧ください)。何か不具合などありましたら、メールでご連絡いただけると助かります。
ジオシティーズ様には長い間大変お世話になりました。厚くお礼申しあげます。そして、ここまで長い間続けることができたのも M.Hiroi's Home Page に来てくださる皆様のおかげです。本当にありがとうございました。これからもがんばりますので、よろしくお願い申しあげます。
M.Hiroi's Home Page の移転先は こちら です。ジオシティーズでの更新は今月末で停止しようと思っています。来月になりましたら、ホームページの転送設定を行う予定です。移転先でも M.Hiroi's Home Page をよろしくお願い申し上げます。