2009年12月22日火曜日

ボトルネック

最近8coreのワークステーションを使う機会があったのですが、そのCPUのパワーを引き出すことの難しさを身をもって経験しました。大量のデータを処理したかったのですが、HDDがボトルネックになって、全然CPUが活躍させられないのです。

これからの時代、より大量のデータを処理する局面が増えてくると思うのですが、いかにデータをCPUに流してやるかが重要なんですね。SSDとかだともっとましになるだろうし、または分散ファイルシステムにしてMapReduce的なことをするのも向いてるのかなあという印象です。

以前までのやってた研究だと、データはほんの少しでほとんどがいかに計算を速くするかを問題にしていたので、新鮮な経験でした。

2009年12月18日金曜日

Fedora12のevinceで日本語表示

最近UbuntuだけでなくFedoraも使うようになったが、FedoraはUbuntuに比べると日本語対応が弱いようで結構苦労する。標準では日本語のPDFも見られないし、日本語のLaTeXもレポジトリにないし。

今日はFedora 12上のevinceで日本語を表示する方法が判明したのでメモとして書いておく。

  1. evinceのインストール: 多分標準で入る
  2. popplerのサイトからpoppler-data-x.y.z.tar.gzの最新版をダウンロード
  3. poppler-dataを展開
  4. Makefileのprefixを/usrに変更
  5. "prefix = /usr/local" => "prefix = /usr"
  6.  (rootで) make install
これで日本語フォントの埋め込まれたPDFは読めるようになった。ただ埋め込まれていないPDFに対応するにはさらに設定が必要な気がする。手元にそんなPDFファイルがなかったので確認していないけど。

2009年12月14日月曜日

ひさしぶりに

前回の投稿から結構経ってしまいました。この間に就職活動でさんざん苦労したものの、無職確定寸前でなんとか就職が決まって、その後関東に引越したりしました。

すっかりブログのことは忘れていましたが、先日研究室の後輩と飲んだときに、なぜか教えていなかったこのブログのことを知っているという話になって驚きました。そんなこんなで、読者がいるならまたボチボチ再開しようかなあという気がしてきました。

ただ、ネタをどうしようかなあという感じです。

2009年7月9日木曜日

C++によるrubyの拡張

現在研究中のプログラムをライブラリ化して簡単に使えるように ruby の binding がうまくいくかを試してみようと思った。README.EXT.ja や Programming Rubyを参考に簡単なものを作ってみたが予想外に苦労するはめになった。それは、クラスにメソッドを登録するところで、以下のようなコードでもエラーが出るのだ。

VALUE initialize(VALUE self){
return Qnil;
}
...
void Init_something(void){
....
rb_define_method(klass, "initialize", initialize, 0);
....
}


エラーメッセージ
error: invalid conversion from ‘VALUE (*)(VALUE)’ to ‘VALUE (*)(...)’


これは rb_define_method の引数の型が合わないことが原因で、reinterpret_cast を使って対処することにした。この方法が分かるまで本当に面倒だった。
#define RB_FUNC(f) reinterpret_cast<VALUE (*)(...)>(f)

void Init_something(void){
....
rb_define_method(klass, "initialize", RB_FUNC(initialize), 0);
....
}

2009年5月25日月曜日

C++の前方宣言

C++には前方宣言というのがあって、うまく使うとヘッダファイルのインクルード関係を整理できる。なんとなく使っていたが、今日一つはまった点をメモ。

下に例を載せているが、クラス定義の中で前方宣言したクラスの変数を定義する際は、ポインタやテンプレート変数ならばいいけれども、そのまま使うことはできない。vectorのテンプレート変数にする分には問題ない。

ここらへんはごまかして勉強したのでダメですね。


// case1: OK

class A; // 前方宣言

class B{
A *a;
};



// case2: OK

class A;

class B{
std::vector<A> a;
};



// case3: OK

class A;

template<class T=A>
class B{
T a;
};



// case4: NG

class A;

class B{
A a;
};