その他/Tumblrに移行しました

今後のエントリはこちらに書いていくことにします。

http://monkeycoders.tumblr.com/

その他/エンジニアが信条によって生きるということ

Bret Victor氏の「Inventing on Principle」というプレゼンテーションが素晴らしく、また大変共感したので、その内容をすこし書いておきます。

Bret Victor - Inventing on Principle from CUSEC on Vimeo.




「Inventing on Principle」というのは、日本語で言うと「信条によって創造するということ」という感じでしょうか。

「信条」という言葉は、ソフトウェアエンジニアリングの世界ではそれほど目にしないというか、大事な言葉としては扱われていないように思います。


氏の信条とは、「モノを作る人は、作業とその結果が直に繋がっていなければならない」というものです。

このプレゼンテーションはJavascriptのビジュアルな編集環境から始まります。最初は、彼の意図は「WYSWYGな環境を極めるとこんなことが出来るよ!」という話かと思いましたが、それは本質ではありませんでした。

このプレゼンテーションは、冒頭に彼自身が言っていたように、どう生きるかということについてです。



Unity/UnityでビルドしたアプリケーションをVM上のLinuxで動かす

ゲーム開発環境のUnityでビルドしたアプリケーションをLinuxで動かす手立てがないものだろうかと色々検証してみたので、その結果を書き残しておきます。

結論から言うと、Unity3.5から、UnityでビルドしたアプリケーションをLinuxで動かすことが可能になりました。とはいえ、Unity自体はLinux用にアプリケーションを出力する機能は持っていません。では何を使うのでしょうか?
Unity3.5から、Google Chromeがネイティブ・アプリケーションとして動作する環境として提供を始めたNaCl という形式に対する出力サポートが入りましたが、Chrome+NaClはLinuxをサポートしているので、これを使う事で実際にLinux上でも動作するアプリケーションを作る事が出来るようになった、という訳です。

ホストOS:
- Macbook pro 17" Late 2011, 2.4GHz Corei7

host_machine_spec


検証した環境(VMソフトウェア+ゲストOS):
- VirtualBox+Ubuntu10.04(32bit): 動作せず
- VirtualBox+Ubuntu11.10(32bit): 動作
- VMWare Fusion+Ubuntu 11.10(32bit) : 動作


という訳で、イマイチ動作のための前提が出来ていないのですが、とりあえず重要なことを書いてしまうと、Ubuntu11.10(32bit)なら動く! ということです。

以下、動作に必要なことを追っていきます。
なお、VMWare Fusionの方がお手軽でパフォーマンスも良いようですが、無料で使えるということもあり、このコラムではVirtualBoxを中心に書いていきます。VMのセットアップ手順に若干の違いがありますが、インストール後に必要な作業にはほぼ違いはありません。



1. VirtualBoxとUbuntuのセットアップ


まず、Ubuntuのサイトから32bit版のUbuntu11.10(ubuntu-11.10-desktop-i386.iso)を取得し、次にOracleのVirtualBoxのサイトからVirtualBox自体をDLします。

- Ubuntuのダウンロード http://www.ubuntu.com/download/ubuntu/download
- VirtualBoxのダウンロード https://www.virtualbox.org/wiki/Downloads

次にVirtualBoxをインストールし、ダウンロードしたUbuntuのディスクイメージを使ってUbuntu 11.10(32bit)のVMを作成します。この辺、とくに突っかかることはないかと思いますが、詳しいやり方はこのコラムで書きたいことではないので割愛します。



2. Ubuntuの更新

Ubuntuのインストールが完了して起動したらば、Software Updaterを起動して、パッケージを最新の状態に更新します。(2012.03.14時点では) Ubuntuの状態を最新にしないと、Chromeのインストールを行おうとした時に、Ubuntu Software Centerで「Internal Software Error」というエラーが表示されて先に進めない(インストール出来ない)ので、このプロセスが必要になります。

ubuntu_update_mgr




3. Chromeのインストール

その後、Firefoxを起動してChromeのダウンロードを行います。ダウンロードするのは、32bit .deb(For Debian/Ubuntu) です。ダウンロードが終了したら、.debファイルをダブルクリックすれば、Ubuntu Software Centerが起動して、インストールを促すボタンが表示されます。これに従ってChromeをインストールします。

chrome_linux_deb




4. Chromeの設定変更

これで、論理的にはNaClの実行環境が整った訳ですが、Chrome上の設定を幾つか変更しないと、このままではUnityのアプリは起動しません。(VM上で動かしている時のみの問題かもしれませんが…)
設定変更のためには、ChromeのURLボックスに "chrome://flags" と入力します。

chrome_flags


1. Chrome Web Store以外の経路でもNative Clientを動作するようにする
ローカルで出力したNaClアプリは当然のことながらWeb Storeを通して配布されたものではないので、そのままではChromeは実行を許可しません。なので、まずこの設定を変更します。

chrome_flags_native_client

このプロセスをやらないと、NaClアプリケーションを実行した時に、以下のような表示になってアプリケーションが起動しません。

nacl_not_allowed
"The Native plug-in is not Allowed."とおっしゃられましても…もうちょい説明して欲しいッス…


2. 描画デバイスのリストをオーバーライドし、選択肢を増やす
VMWare Fusionではこの設定を変更せずとも動作するのですが、Virtual Boxではこの設定を変更しないと、Unityが利用可能な描画デバイスをChromeが提供する事が出来ないようです。なので、この設定を修正します。

chrome_flags_rendering_list

この設定を修正しないと、VirtualBoxでは以下の様な表示になってまたまたNaClアプリの起動に失敗します。
nacl_no_gfx_device



上記2点のフラグを変更したら、Chromeを再起動して、テスト用のNaClアプリを開いてみます。

見事実行出来ました!パフォーマンスは激遅なようですが、とりあえず動くということが突破できれば、あとは浮かぶ瀬もありそうなものです。

ubuntu_nacl_angrybots





おまけ:3Dアクセラレーションを有効にする

Unityの動作に3Dアクセラレーション機能の有効化は必須ではありませんが、VirtualBoxは3Dアクセラレーションを有効にすることもできます。(VMWare Fusionでは、特に面倒なことをしなくても3Dアクセラレーションは有効になるようです。)
やり方としては、GuestAdditionsという拡張をUbuntu側にインストールすることで、VirtualBox側の設定項目に以下のような3Dアクセラレーション機能の有効化をするチェックボックスが追加されます。

GuestAdditions.isoの入手とインストールの方法: http://www.virtualbox.org/manual/ch04.html#idp11277648

3Dアクセラレーション関連の参考情報(上記と同一ページ): http://www.virtualbox.org/manual/ch04.html#guestadd-3d


ただ、上記のサイトはちょっと不親切で、「GuestAdditions.isoは結局どこでDLすんねん」という肝心の点についての案内がないというか・・とにかくよく分かりません。
で、virtualboxのダウンロードサイトに行ってみたら、ああ、ありましたね。GuestAdditions.iso
- virtualbox 4.1.8のDLサイト: http://download.virtualbox.org/virtualbox/4.1.8/

こいつを早速DLしてUbuntuのVMのCDドライブにセットすると、ダイアログが起動して、インストーラを走らせるかどうかを聞いてきます。これをOKすると、あとはお任せでインストールが進みます。インストールが終了したら、UbuntuのVMを一度シャットダウンして、VirtualBoxの設定ダイアログで、ディスプレイを選択します。

すると、ディスプレイの設定項目に3Dアクセラレーションに関する項目が増えています。

virtualbox_3d_accel

その他/linux RAID autodetectのHDDが片方だけ手元にある場合のマウント方法

ブログのテーマと少々異なり、LinuxのソフトウェアRAIDの扱いについて書いておきます。あまり詳しい領域ではないので間違いもあるかも知れませんが、備忘録も兼ねつつ、同じ問題に当たった人がいたら参考になればと思っています。

発端は、最近解体したサーバー(RAID1構成)をMacでマウントしてデータをコピーする必要が発生したのですが、これをいかにして解決したかというところです。同サーバーは2台構成のRAID1なのですが、2台とも繋げて復旧するのは正直だるいので、1台だけでやろうという、そういう魂胆です。(RAID1なら可能なはずなので)

当初は、mountでファイルシステムとパーティションさえ指定すれば適当にマウントできるんじゃないか、なんて思っていたのですが、当然そう言う訳でもなく…。とはいえ、mdadmを利用すれば1台しかHDDがなくともマウント自体は可能ということが分かったので、正面から行くことにしました。


0.VMWareの用意

まず、Linux RAIDのドライブはMacではマウントできないので、バーチャルマシンを使用します。自分の場合はVMWare Fusion上にUbuntu-linuxの仮想マシンが作ってあったので、これを使用しました。

1. デバイスを接続し、ボリュームを確認
HDDデバイスをSATA-USBコネクタ等で接続します。

自分が使ったのはコレ↓
ノバック SATA HDDつなが~るKIT Super Speed USB3.0 NV-TS110U3

VMWare側で、USBデバイスの中のそれらしいデバイスをLinux側につないでやります。
「仮想マシン>USBとBluetooth> <デバイス名>に接続」のメニューを選べば接続されます。
ちなみに、ここでのデバイス名は接続中のHDDではなく、SATAのブリッジ・コントローラ名で認識されます。私のところでは「Fujitsu MB86C30A-REB」と出ました。HDDのメーカー名が出る訳ではないので、注意して下さい。

接続したら、Ubuntuの場合はSystem>Administration>Disk Utility を使うと、接続中のデバイスのマウントポイントやフォーマット、パーティション構成が直ぐに把握できてお手軽です。Macのディスクユーティリティみたいなもんですね。


1. mdadmをインストール
apt-get等でmdadm(Linux software RAID 管理ツール)をインストールします。コレがないと始まりません。


sudo apt-get install mdadm


2. RAIDボリュームを構成、実行
次に、接続したデバイスを使ってRAIDを構成する必要があります。ここで、私が使いたいデバイスは/dev/sdc3だったので、これをmd0とします。
また、RAID1の最小構成単位はデバイス2個です。1個では足りないのでデフォルトではRAID自体はスタートしません。なので、明示的にこのデバイスを開始させます。


sudo mdadm --assemble /dev/md0 /dev/sdc3
sudo mdadm --run /dev/md0



デバイスをマウント
RAIDが開始したら、このデバイスをマウントすることが出来るようになります。


sudo mount /dev/md0 /media/hoge


これで、開始したRAIDドライブが、hogeにマウントされました。

あとは、VMWare上のファイルとMac上のやりとりなので、D&Dでコピーしたりとか、好きなようにデータをサルベージすれば完了です。

最後に、使い終わったら


sudo umount /media/hoge
sudo mdadm --stop /dev/md0


として、さらにDisk Utilityから「Safe device removal」ボタンを押し、デバイスを外せば完了です。

プログラミング/MagicReflection v0.7

NADECに直接参加された方々、Ustreamで視聴された方々、お疲れ様でした。
定員35名弱、一人持ち時間15分という短く小規模な勉強会ながら、どのセッションも大変濃い内容でとても楽しく、かつ勉強になりました。
@mnagakuさんの設定された15分縛りというプレゼン時間は自分にとっては初めての経験で、本当に15分で要点を紹介出来るのだろうかと心配していましたが、逆に余計なモノがそぎ落とされた事でよりよい結果になったと思っています。

NADECで私が紹介させて頂いた「C++で開発されるゲームのためのRTTIを使用しない高速なReflection(仮)」ですが、嬉しいことに概ね好評を頂いたようでホッとしています。また、自分が思った以上に注目・期待している人がおり、大変嬉しく思っています。


NADECでのプレゼンテーションスライドと、同プレゼンで実装例として紹介したMagicReflectionのプロジェクトホームは、以下になります。プレゼンを見逃した人や、キーワードで何となくこのページにたどり着いた人は、興味があったらご覧下さい。


■NADEC(2010.10.9) プレゼンテーションスライド
- http://www.slideshare.net/pigeon6/nadec-magicreflection-20101009


■MagicReflection プロジェクト ホーム(sourcecode download)
- http://code.google.com/p/magicreflection/


さて、いよいよ一般公開してしまったMagicReflectionですが、現状ではまだまだ中途半端な状態で、
「コンセプトは分かるけど実用にはちょっと」というレベルのシロモノです。
以下に、今後version 1.0のリリースまでに行われる予定のタスクを列挙しておきます。google codeのBTSを使う気になったら、いずれそちらにも入れておきます。

1. 中途半端なセレクタの部分を書き上げる
現状では、メソッドセレクタの実装がいい加減でチェックが足りません。また、セレクションの速度を向上させるためのセレクション・キャッシュも実装していません。

2. typeidの発行ポリシーが中途半端
T* と T* constを同一視する旨は設計方針ですが、T*とconst T*は分けようと思いつつ、現状では特に確認していません。このあたりのポリシー決めをハッキリして、「こうなるよ!」と名言する必要があります。

3. メモリアロケーションの改善
現在は中で無遠慮にnewを使ってしまっています。MRが独立したヒープで動作するようにするための改善と、幾つかの初期化ポリシーへの対応、インスタンス生成時のアロケータ指定といったメモリ確保に関する改善が必要です。

4. 必要なメモリ量の計算
 MRのシステム初期化(MRの起動)に何byteのメモリが必要なのか、事前計算する機能を入れたいと考えています。


5. スタティック関数、グローバル関数への対応
現在は対応するメソッドはメンバ関数のみですが、グローバル関数やスタティックメンバ関数にも対応した方が便利です。

6. std::vectorの除去
 現在は一カ所だけstd::vectorを使っている場所がありますが、本質的には不要なので除去します。これによりMagicReflectionは外部依存するシステムがほぼなくなります。

7. ライセンスの整理
MITライセンスでの提供を現在考えていますが、条件を子細把握している訳ではないので整理確認の上、条文付ける必要があるならそれを行ったりと言った作業が必要と考えています。

8. VisualStudio.NETプロジェクトの作成
VisualStudio.NETのプロジェクトを作っていなかったことに気がついたので、それに対する対応です。私が所有しているのは2008のみなので、対応はVS2008によるものとします。
特に、VisualStudio.NET2003はC++コンパイラに問題が多いためMRのコードはビルド出来ないと思いますが、対象外とします。

ここまでが、version 1.0と僕が呼ぼうと思っているものまでのタスクです。
無論、これに追加してバグフィクスとテストコード実装が入ります。


■それ以降に考えていること
以降は、version 1.0以降にやろうかな、と考えている事です。

. プロパティアクセス代行
メンバーに対するGet/Setのインターフェイスの付与と、それらを利用するためのオペレーションを簡単に実現するための仕組みを導入します。

. マクロ・コードジェネレータ
MRをより快適に使うための、CppUnitの子河童/子馬(cocuppa/couma)のようなコードジェネレータ・コードモディファイアやVisualStudioのマクロなど。(作ってくれる方、大歓迎です!)

. luaやpythonなどへの汎用バインディングの実装
せっかくだから汎用バインディング例でも一つ実装してみようかしら、という感じです。

. サンプルコード
セミナーで例として挙げた、動的な設定のロードを行うサンプルコードなど実装してみようかしら、という感じです。


以上です。
現在本業が忙しくゆっくりしたペースでの更新となりますが、気長にお付き合い頂ければと思います。