UbuntuのGrubとMBMを共存させる方法

ブートローダのGrubとMBMを共存させる方法を書き記しておきます。

UbuntuにはブートローダにGrubが標準搭載されています。しかし、デフォルト起動OSの切り替え手段がテキストベースなので、頻繁に切り替えたいときに不便です。代替手段として、MBMのようなサードパーティ製ローダを好んで使用している人もいるのではないでしょうか。そこで次のような構成を想定した手順を示します。

hda(ドライブ1):MBM/Windows
hdb(ドライブ2):Grub/Ubuntu

通常は、Ubuntuのインストール時にGrubの保存先を訊かれますので、上記構成であれば、hdbを指定して下さい。

もし、上手くいかずエラーがでるようなら、Grubの保存先を初期設定にしたままインストールを済ませてしまいましょう。その後、インストールに使用したライブCDのUbuntuを起動し、そこからGrubのインストール作業を行います。コンソールから以下のインストールコマンドを打ち込んで下さい。

$ > sudo grub #sudoによって権限を昇格していないと以下のコマンドが失敗する可能性があります
grub > root (hd1,0) #2番目のHDD,第1パーティション(0からカウント)をrootに指定
grub > setup (hd1,0) #install開始, MBRにstage1, hd(1,0)にstage2が書き込まれる(stage1.5は他のファイルシステム用なので失敗していても無問題)
grub > quit

再起動後、hdaの先頭にMBMをインストール。これで、MBMからGrub経由でUbuntuを起動できるようになりました。

もし、Grubのメニューが必要ない場合は、/boot/grub/menu.lstを編集してください。hidemenuをonにするかtimeoutを0にすれば、Grubの存在を隠蔽できるでしょう。ちなみにmenu.lstはroot権限でないと見えません。編集時にはコマンドの前にsudoと打って、スーパーユーザに昇格してください。

$ > sudo gedit /boot/grub/menu.lst

また、未確認ですが、わざわざライブCDを使わなくても、HDD内のUbuntuからGrubの操作が行えるかもしれません。

Irrlicht1.4はconst修飾子で関数厳格化されている

Irrlicht1.4から関数の修飾子が厳格化されます。例えば、get系の値取得関数は、メンバ変数の値を変更しないように、インターフェースクラスの段階からconst修飾子に縛られているのです。もちろん、不都合があるならメンバ関数をconst修飾子無しでオーバーライドしてしまえば、従来と変わりなく既存ソースを流用できます。

そこで、Irrlichtを使用している人も、その他の人も、ここでC++のconst修飾子についておさらいしましょう。

const char* foo(const char* str) const;

最初のconstから順番に説明していきます。

  1. 戻り値の値はfoo関数外部で変更されない
  2. 引数strの値はfoo関数内部で変更されない
  3. メンバ変数の値はfoo関数によって変更されない

プログラマが明示的に宣言することで、関数の挙動がある程度分かるようになります。そのため、後々の保守作業において効果を発揮します。うっかりメンバ変数の値を変更してしまい、謎の不具合に悩まされる事も少なくなるでしょう。

しかし、const修飾子は問題がない訳ではありません。特に上記例の3番目のconst宣言は厄介です。関数内でメンバ変数に手を加えるような実装がなされていると、コンパイルが通りません。関数設計を見直そうにも時間がない。バグ混入も恐ろしい。お手上げです。

そこで、mutable修飾子の出番です。これを用いてメンバ変数を宣言すると、特別にconst関数内でも値の変更が認められます。このアンチconstとも言うべき修飾子の存在は、本来期待される制限を歪めてしまう為、何だか本末転倒な感じではあります。最終手段として使うにとどめるのがいいでしょうね。

話は戻りますが、Irrlicht1.4βでもmutable修飾子が使われているところがありました。多少やりすぎなところもあり、IReferenceCounted::grub()にまでconst宣言がされてました。果たして、そこまで必要なのか疑問に思ってます。

Irrlichtの日本語対応カスタムGUIテスト

Irrlicht.dllに手を加えず、各国語対応するテスト第一弾。1.4βで試しています。

Official Irrlicht with Custom GUI

IGUIFileOpenDialogの派生クラスを作る事により日本語表示が可能。コードはIrrlichtMLからコピペしただけです。ただし、これだけでは表示するGUIオブジェクトの管理が面倒になるかと思います。なので、GUIElementFactoryに登録してしまったほうがいいでしょう。

ちなみに、このテストはirrTTを使わなくても、日本語ビットマップフォントを作成して読み込ませれば成功するはず。

参考文献:Custom GUI Development(Irrlicht Forum)

Irrlicht.dllのソースを書き換えずとも、IGUIElementを継承して新しいGUIを作成できる。既に登録されているGUIを複合的に組み合わせる事も可能。詳しくは各GUIエレメントのソースか、GUIエディタのプロジェクトを参照のこと。もし、GUIエディタで自分が作成した新GUIを編集したいのなら以下のようにするといい。

  1. IGUIElementのserialize/deserializeAttributes/getTypeをオーバーライドすること。そうすれば、編集、読み込み、書き込みが可能になる。
  2. 子エレメントはsetSubElement(true)を呼び出し、親の管理化であることを宣言する。
  3. 名称からGUIオブジェクトを生成できるように、カスタムエレメントを新規IGUIElementFactoryに登録する。