2013年6月29日土曜日

VMware player と Oracle Virtual Box の比較

いままで,ずっと VMware を使ってきたけど,
フリーのVMとして,どっちがいいんやろうってことで調べてみた.

ホストのマシンは,
Core i7 860 (Sandy bridge 世代で4コア,ハイパースレッディングで8コア)
8GB メモリ
Windows 7 Professional

ゲストは,Ubuntu で試してみた.
比較として,ゲストの起動・終了時間,自分で作った画像処理プログラム(OpenMPで並列化したもの)の実行時間を計測した.

VMware player


Playerの制限としては,CPUは4コア以上は設定できない.
そのため,4コアのCPUでメモリ4GBのマシンを作成.
ホストは8コアあるため,ゲストでCPU利用率100%のとき,ホストは利用率50%となっている.
OSはUbuntu 12.04 と13.04 で試した.

VMware の利点として,Ubuntu がクイックインストールできることがある.
この機能は,インストール時間が短縮されてとてもありがたい.


さて,計測結果だが,

Ubuntu 12.04
  起動:35秒
  終了:17秒
  画像処理:676秒

Ubuntu 13.04
  起動:26秒
  終了:14秒
  画像処理:442秒


Virtual Box


Virtual Box には,CPUのコア数の制限はない.
なので,ホストのCPUをフル稼働することができる.これが,そもそも試してみようと思ったきっかけである.
8コアのCPUでメモリ4GBのマシンを作成.
VMware と違い,細かいことまで設定できるので,ビデオメモリは最大に(といっても128MB)しといた.
OSは,Ubuntu 13.04.
インストールは,通常インストールなので,VMwareよりも時間がかかる.


計測結果は,
  起動:165秒
  終了:16秒
  画像処理:420秒


結果


画像処理の時間は,Ubuntu をバージョンアップするだけで高速化した.これは予想外であった.
Virtual Box は8コア使って VMware の倍のCPU利用率があるのにもかかわらず,処理速度にそれほどの向上はなかった.これは,そもそも画像処理のコーディングが並列での問題をほとんど考慮せず,for 文をパラレルにしただけだからかもしれない.Virtual Boxのオーバーヘッドが大きいのかもしれない.この辺りの問題は切り分けられていない.
というか,高速な画像処理したいならちゃんとしたアルゴリズムを設計したり, GPGPU とかを使えということはある.

操作感だが,Virtual BoxのUbuntuは動作が鈍い.カーソルが遅れてついてくる.ビデオメモリをもうちょっと多く取れれば良いのかもしれないけど,どうしようもない.それに,インストールと,ゲストの起動に時間がかかりすぎており,とても耐えられない.


というわけで,私の中では VMware の勝ちとして,これからも使い続けようと思う.

2013年6月8日土曜日

Excel で特定のセルの値に基づいて行全体の書式を設定する

例えば,つぎのようなデータがあったとする.


このとき,B列のセルの値に応じて,A列とB列を同じ書式設定にしたいという状況がある.たとえば,6分40秒を切れば,青色,45秒を切れば水色,50秒を切れば緑色...という感じにしたいとする.

こういう時は,条件付き書式を使うと,簡単に実現することができる.
まず,書式設定したい範囲を選択する.この場合では,A4からB19を選択する.
次に,「ホーム」タブの「条件付き書式」から,「新しいルール」をクリックし,ダイアログを表示する.

「数式を使用して,書式設定するセルを決定」を選択して,ルールの欄に条件判定式を記入する.
ここで入力する式は,一番左上のセルをどのように設定するかを表す式になることに注意する.この式が相対的な位置関係を保ったまますべてのセルにコピーされるので,常にB列の値を見るためにはBのまえに$マークを付ける.同様に,基準値は常に同じセルの値を利用しているので,行・列ともに$マークを付けて絶対参照する.

次に,書式ボタンからセルの書式を設定しOKすると,実現できる.


この動作をすべての条件に対して作成し,条件の適用順を「ホーム」「条件付き書式」「ルールの管理」から調節してやると,望みの書式が完成する.フィルター機能と合わせると,トライアルの度に毎回わずらわしい作業をしなくても,簡単に色つきのランキングが実現できる.

2013年6月7日金曜日

Windows で Ubuntu の gedit 環境が使いたくて...

gedit って特段使いやすいわけではないんだけど,ずっと使ってると,休みの日にWindowsで作業するときにいつもの環境でやりたくなったりするわけで.で,できないかなーと探してみたら,Windows版のgeditが存在してた.

さっそく,gnome のページから,Windows版のgeditをダウンロードしてインストールしてみる.
http://ftp.gnome.org/pub/gnome/binaries/win32/gedit/

どうも,動作はもっさりしているが,いつもの環境が実現できた.
Alt キーでメニューは選択できないけど.まあいっか.

フォントの見た目が違うよなーってことで,Ubuntu の標準フォントである,Takao Gothic に設定してみたんだけど,英数が等幅じゃない.調べてみると,フォントはちゃんと等幅なんだけど,void とかが色づけとともに太字になっているからずれていたみたい.

なので,キーワードが太字にならないように設定を変更する.
C:\Program Files(x86)\gedit\share\gtksourceview-2.0\styles
にある,classic.xml を開いて,
bold="true" となっているところを false にかえる.ついでに,italic も false にしておく.


よっしゃ,完璧.これで,いつもの環境がWindowsでもつかえるやん.



2013年6月2日日曜日

OpenCV で16bitのカラー画像の画素値を取得・設定する(C言語)

8ビットカラー画像の画素値へのアクセスは公式マニュアルのとおり, IplImage->imageData で直接アクセスできる.また,グレースケール画像の場合は,ビット数や型に関係なく,cvGetReal2D 関数で取得できる.

では,16ビットカラー画像で画素ごとにアクセスするにはどうしたらいいのか.その取得方法や設定方法を紹介する.方法としては,CvScalar型を経由し,Get*D,Set*D関数を使うのが簡単である.CvScalar型は,double val[4] のみを持つ構造体で,各色の輝度値を格納している.以下がサンプルコードである.なお,この方法は16ビットだけでなく他の型の画像でも適用可能である.

画素値の取得


IplImage* img; // img は16ビットカラー画像とする

CvScalar pixel = cvGet2D(img, y, x);
double b = pixel.val[0];
double g = pixel.val[1];
double r = pixel.val[2];

画素値の設定


CvScalar pixel = cvScalar(b, g, r, 0);
cvSet2D(img, y, x, pixel);