Linux で動かしてみる Mono (「C# で作る Prolog 処理系」付録)

2006.12.6 (鈴)

1. Mono 1.2.2 の Plamo Linux 4.03 への導入 -- バイナリ・インストーラの使用

Microsoft .NET Framework 2.0 の互換実装である Mono 1.2.2 を Plamo Linux 4.03 になるべく手軽にインストールしてみる。

Mono のダウンロード・ページには,SuSE, Red Hat, Fedora Core の各 Linux ディストリビューション用 rpm ファイルが用意されている。 Debian に対しては同ページに "Other Downloads" と題してリンクが用意されている。

では,それ以外の Linux はどうしたらよいのか?

手間がかかるが,正攻法としては, ダウンロード・ページからソースコードを入手して自分でコンパイルすればよい。 しかし,同ページには,汎用のバイナリ・インストーラも用意されており, それを使えば,ほとんどどんな Linux ディストリビューションでもルート権限不要すぐ mono をインストールできる。 ここでは,おそらく Mono の作者にとって全くの想定外であると想像される Plamo Linux 4.03 (カーネル 2.4.31), さらに X11 環境として最も原始的なものの一つである twm 環境で実際に Mono を動かしてみる。 これにより,その汎用性が実証されるであろう。

  1. Mono のダウンロード・ページ http://www.mono-project.com/Downloads の中で Linux 用 rpm ファイルの項目の次にある "Linux Installer for x86 (All distributions)" の項目の Mono 1.2.2_1 Installer (Stable) のリンクから mono-1.2.2_1-installer.bin をダウンロードする。
  2. 同項目から Instructions to use the Installer としてリンクされているページは 2006年 12月 6日現在, 古い mono-1.1.17.1_2-installer.bin 向けの記述のままである。 しかし,その内容は mono-1.2.2_1-installer.bin にも適用できる。

mono-1.2.2_1-installer.bin に実行パーミッションを与えて X11 環境で実行する。 下図のように GTK ベースのインストーラが起動する。

インストーラは License Agreement に続いて Installation Directory (つまり,mono をインストールするディレクトリ) と Add Mono to your Path (つまり,Mono に PATH が通るようにシェルの設定ファイルを変更するかどうか) を尋ねる。

普通はデフォルトどおりインストール場所として自分のホームディレクトリ直下に mono-1.2.2 を指定すればよい。 mono-1.2.2 以下に mono 用の bin/, etc/, include/, lib/, share/ が作られる。 mono-1.2.2/html/ にはインストーラ自身の簡単な自己紹介ページが置かれる。 mono-1.2.2/uninstall はアンインストーラである。 GNOME 用の *.desktop ファイルも用意される (が,この例のような twm 環境では無用である)。

インストーラでデフォルトどおりシェルの設定ファイルを変更させたところ, 筆者の環境ではホームディレクトリ直下の .tcshrc.bashrc の末尾に環境変数 PATH, PKG_CONFIG_PATH, MANPATH, LD_LIBRARY_PATH の設定が追加された。 (ただし,後でアンインストーラ mono-1.2.2/uninstall を実行したとき, mono-1.2.2 以下は消去されたが,この追加設定は元に戻されなかった。 手で編集して元に戻してもよいが, インストーラを起動する前に .bashrc と .tcshrc をバックアップしておくとよい。 上図では cp -a .bashrc .bashrc~~ のようにしてバックアップを作成している)。

インストール後,シェルを再起動して環境変数への変更を有効にする。 たとえば下図のように単に exec bash をすればよい。 それまで C# 2.0 コンパイラ gmcs への PATH が通っていなかったのが, 事後は PATH が通っている (type gmcs が成功する) ことが分かる。

2. Prolog の実験 -- コンソール・アプリケーションの例

本編で述べたソースを適当な場所に置く。

本編での OS X での例と全く同様に make できる。 たとえば下図のように make test_qsort を行うと, (もしまだならば tiny_prolog.cs をコンパイルして tiny_prolog.dll を作成してから) test_qsort.cs をコンパイルし,test_qsort.exe を実行する。

3. System.Windows.Forms の実験 -- GUI アプリケーションの例

未完成ではあるが,現在の Mono は Microsoft System.Windows.Forms API を実装している。 サンプルのソース一式 (を表示している emacs エディタ) と, それをコンパイル&実行している (kterm 上の) bash コマンド行と, サンプルの GUI (である hello world ウィンドウ) を下図に示す。

ここで注意点が二つある。

  1. コンパイラ gmcs にオプション /r:System.Drawing/r:System.Windows.Forms を陽に与えること。
  2. 画面部品のテキスト (例では「了解」) を UTF-8 で与えること (EUC-JP は文字化けを起こす模様)。

4. C# のための Emacs の設定

Plamo Linux 4.03 は emacs 21.3 を持っているから, Emacs で C# を編集するために, 「Cygwin で行こう」 11.2節 の 「Meadow の設定」 がほぼそのまま流用できる。

  1. D. Haney 氏csharp-mode.el を /usr/share/emacs/site-lisp/ またはそこに適当にディレクトリを作ってその中に置く。
  2. ホームディレクトリの .emacs に下記を追加する。 ここでは csharp-mode-hook で c-basic-offset を 4 にして基本的な字下げ幅を 4 にし, tab-width を 4 にして 1 タブ文字を 4 文字幅にし, indent-tabs-mode を nil にして字下げをタブ文字でなく空白文字に展開するようにしている。
(add-hook 'csharp-mode-hook (lambda ()
                              (setq c-basic-offset 4
                                    tab-width 4
                                    indent-tabs-mode nil)))
(autoload 'csharp-mode "csharp-mode" "C# editing mode." t)
(nconc auto-mode-alist '(("\\.cs$" . csharp-mode)))

参考のため,現在筆者が使っている ~/.emacs ファイルを dot-emacs.tar.gz として, ~/.Xdefaults ファイルを dot-Xdefaults.tar.gz として与える。 ただし,Unicode のための (require 'un-define) には MIYASHITA 氏とSHIRAI氏の Mule-UCS 0.85 RC3 以降が必要である。 「Cygwin で行こう」 16.2節 を参照されたい。

付録: BeOS ライクな twm

筆者が使っている ~/.twmrc ファイルを dot-twmrc.tar.gz として与える。上述の画面キャプチャは,ウィンドウマネージャに X11 標準の (というより,むしろ X11 に簡単なサンプルとして標準添付されている) twm を使用したものであるが,このファイルをホームディレクトリに置くことにより, 少しだけ,かつての BeOS を思い起こさせる雰囲気の環境が得られる。 ウィンドウの左上のタブにあるボタンの意味は概ね現在の OS X とも一致する。 実際の BeOS (および Mono が本来想定している GNOME 環境) との最大の違いは Desktop フォルダの欠如である。

背景色と右上の時計は ~/.xinitrc での以下の記述による (ただし,厳密には,この背景色はオリジナルの BeOS に比べてやや青みが強い)。

xsetroot -solid '#46A'
xclock -geometry 85x85-0+0 -bg AntiqueWhite &



Copyright (c) 2006 OKI Software Co., Ltd.