« 痕跡を残さない Mac OS X への攻撃 | Main | MobileMe + Ubiquity の不具合をいつも回避するには »
Mono をご存知だろうか? Windows の .NET Framework 互換のマルチプラットフォームな開発/実行環境を提供するオープンソースプロジェクトだ。これを試してみた。
本文はもっぱら開発者よりの話です。
最近仕事で Windows 上のアプリを C# で開発している。こういう場合は当然 .Net Framework という Microsoft 提供のフレームワークを利用する。
とは言え、C# を使い始めてまだ一年未満だ。C# を使い始めた切っ掛けはプロトタイプを C++ で作っていたのだが、面倒なので実版は C# に乗り換えたことだった。10 年くらい使っていた C++ よりも未経験の C# の方が楽だったのだ。それくらい C# + .Net Framework という組み合わせは楽なのだ。何しろ C# や .Net Framework のために勉強なんかせずに乗り換えられたくらいなのだ。
だから大分前から Mono は気になっていた。この組み合わせで Linux や Mac OS X のソフトウェアも作れたら、未経験だったり不慣れな言語や開発環境を使わずになんか色々楽しめそうだからだ。
昨日、いつも購読している RSS 経由で見た記事にちょこっと Mono という単語が出てきた。そう言えば気になっていた Mono はほったらかしにしていたなあと思い出し、ダウンロードしてみた。Mac OS X 用のバイナリパッケージが出ているのでインストールという前座で悩むことはない。
結論から言うと最新版 Mono 2.2 は Mac OS X ではまだちゃんと使えない。ちゃんとビルドもできるのにだ。なぜならば Mono の統合開発環境 MonoDevelop でどうやっても日本語が文字化けするからだ。/Applications/MonoDevelop.app/Contents/MacOS/monodevelop というシェルスクリプトに LANG=C; export LANG という行を入れて日本語環境を打ち消せば英語のインターフェースになってちゃんと使える。でもこうするとファイルの中の日本語は文字化けのままになる。
MonoDevelop でちゃんと日本語が使える最も新しい Mono は 1.9.1 だ。これなら「FaithCreates Labs - Mono を Mac へのインストール」に書いてある「MonoDevelop の文字化け対策」をすればインターフェースは日本語ばっちりになる。その少し前の 1.2.6 だとメニュー等は大丈夫だがファイル選択ダイアログで日本語が化けてしまう。また日本語が書いてあるファイルを文字化けせずに開くには MonoDevelop の設定で内蔵エディタが使用するフォントを日本語対応のもの - 例えば Osaka - に変更すればよい。
というわけで Mono 1.9.1 をインストールすることになる。これは「Mono 1.9.1 Downloads」の一番下にある Mac OS X インストーラのリンクからディスクイメージをダウンロードし、それをマウントして、インストールパッケージを開いてインストールすればよい。あと MoMA.app と MonoDevelop.app は /Applications にコピーする。これでインストール終わり。
MonoDevelop をインストールしても C# 用のプロジェクトのタイプにフォームアプリが出てこない。さてこれは困ったと思ったのだが、C# で作るアプリなら Visual Studio で開発しているものがあるからそれのソリューションを丸ごとコピーしてみた。なんとソリューションファイルが MonoDevelop でそのままオープンできるのだ。つまり、Visual Studio でフォームのデザインをしたり必要なコンポーネントをくっつけたりしたプロジェクトを含むソリューションが、そのまま MonoDevelop のソリューションになる。
ただし注意することがある。
日本語のコメントが文字化けするのなら別によいのだが、文字列定数の値がちゃんと扱えないから Shift_JIS のままではいけない。
UTF-8 では円マークとバックスラッシュは別な文字である。このため LF や CR などの文字定数をエスケープ付きで書いた部分は円マークのままだとおかしなことになってしまう。
なぜか殆どのファイルが UTF-8 だったのに Shift_JIS のファイルが混じっていたのでこの点で一発でビルドできなかったのだが、ちゃんとファイルのエンコードをコンバートすれば一発でビルドが通ってしまった。Windows のパス(例えば C:\foo\bar)がアプリで使用されているので設定を色々書き換えないと動作確認ができないが、ちゃんとフォームアプリが起動できた。
でもよくないこともある。
キーバインドは設定で変更できるのだが、コピーに command-C を割り当てようとして command-C をタイプすると設定パネルがスコンと消えてしまう。何か他のものに割り当てられているようだ。片っ端から Mac OS X 風に変更しないと駄目ということだ。面倒だからいっぺんでやる気がなくなった。
クリップボードの仕組みが違うのだと思う。
とにかく入力系は Mac OS X の普通の仕組みとは別系統のように見える。ペーストもできないから別なエディタで日本語を書くしかない。
MonoDevelop のウィンドウ内のメニューで「ファイル」-「終了」しないと終了しない。一瞬ハングしたかと勘違いしてしまう。どうも X Window System のアプリを X サーバなしで表示させていると考えるとちょうどよさげだ。実際そうなのだと思う。
Mono は C# + .Net Framework で開発されたものを Windows 以外のプラットフォームに持ってくるだけでなく、他の言語もサポートされているクロスプラットフォームな開発環境なのだ。しかしそもそもの動機が既に使えて楽な C# + .Net Framework で他のプラットフォーム用の開発をしてみたいというものなので他の言語は当面使いそうもない。使いそうもないのだが、使ってみるだろう C# + .Net Framework だけでも十分使い物になりそうだ。
MonoDevelop は日本語周りで難があったり、アプリの操作が Mac OS X のアプリらしくなかったりしてどうにも使いづらいが、Windows の Visual Studio で開発してそれをそのまま持ってきてビルドすればいいのだから致命的に困ることはない。しかもバイナリやソースをパッケージ化することもできるし、Mac OS X のアプリケーションにすることだってできる。
マルチプラットフォームで動くアプリにするときはファイルのパスなどプラットフォーム毎に異なるリソースに注意を払う必要がありそうだ。この辺は実用するときに工夫することにしてみようと思う。
こんなことを普通寝る頃に始めるから不健康なんだよなあ…
Mono と MonoDevelop のバージョンをとっかえひっかえしたか add-in マネージャを開いたり閉じた後(どちらが原因かよくわかってない、両方だと思う)で MonoDevelop がコンソールに次のようなメッセージを吐いて起動できなくなってしまった。
Unhandled Exception: System.InvalidOperationException: Could not read add-in description at Mono.Addins.Addin.get_Description () [0x00000] at Mono.Addins.AddinSessionService.CheckHostAssembly (System.Reflection.Assembly asm) [0x00000] at Mono.Addins.AddinSessionService.ActivateRoots () [0x00000] at Mono.Addins.AddinSessionService.Initialize () [0x00000] at Mono.Addins.AddinManager.Initialize (System.String configDir) [0x00000] at MonoDevelop.Core.Runtime.Initialize (Boolean updateAddinRegistry) [0x00000] at MonoDevelop.Startup.SharpDevelopMain.Main (System.String[] args) [0x00000]
add-in 関連の個人設定が壊れたということで、~/.config/MonoDevelop と ~/.config/mono.addins を削除したら直った。消すのは両方である必要はないかもしれない。Mono のバグ管理システムに同じ現象が登録されているが、情報が足りないからと放置されてしまっていた。それでソースまでちょこっと見たがトリガーになる Mac OS X での具体的な設定のパスがよくわからず、これを発見するのにかなり苦労した。なぜなら Parallels も ~/.config/Parallels を作って設定を置いていて ~/.config が元々あったからだ。