わーあい

昨日はライブデモンストレーションでたくさんの患者さんを治療させて頂きました。全員成功裏に終了してとても嬉しいです。いったい何人の患者さんを治療したのか自分でも分かりません。ずっと立ちっぱなしですのでやはり疲れましたが、元気です。

まだ緊張しているのか 2:00AMに覚醒してしまいました。そして、眠りに再びつけるように、C++の関数オブジェクト(ファンクタ)について考えていました。何故それが必要なのだろうか? その必要性がある奥の深い世界に入りたい、そんなふうに考えていてふと疑問がおこりました。そして、テスト・プログラムを書いたのです

いやいやその前に色々と調べました、2つの大きな疑問が解決しました

  • Mac OSX Lionでバックスラッシュを打つにはどうすればよいか?

これに対しては、簡単に解決法が見つかりました Option +  \なのです \は円記号です

  • Mac OSX Lion + NetBeansでコンソール文字化けを解決するにはどうするか?

これは

・NetBeansのコンソール文字化け対策
/Applications/NetBeans/NetBeans 7.2.app/Contents/Resources/NetBeans/etc/netbeans.conf
のnetbeans_default_optionsに以下を追加

-J-Dfile.encoding=UTF-8
 ということだそうです 実際にこのようにして解決しました
そこでさっき書いたテスト・プログラムです
#include <iostream>

class biggerThanFour {
public:
  bool operator() (int val) {
    return (val > 4);
  }
};

bool btf(int val) {
    return (val > 4);
}

int main() {
  std::cout << "関数オブジェクト使用\n";
  biggerThanFour num;
  for (int i=0; i<10; i++) {
    std::cout << "[" << i << "]は";
    if (num(i)) std::cout << "4より大きい\n";
    else std::cout << "4と同じか小さい\n";
  }
  std::cout << "\n関数の使用\n";
  for (int i=0; i<10; i++) {
      std::cout << "[" << i << "]は";
      if (btf(i)) std::cout << "4より大きい\n";
      else std::cout << "4と同じか小さい\n";
  }
  bool (*functionP)(int) = btf;
  std::cout << "\n関数ポインタ使用\n";
  for (int i=0; i<10; i++) {
      std::cout << "[" << i << "]は";
      if (functionP(i)) std::cout << "4より大きい\n";
      else std::cout << "4と同じか小さい\n";
  }
結果は

関数オブジェクト使用
[0]は4と同じか小さい
[1]は4と同じか小さい
[2]は4と同じか小さい
[3]は4と同じか小さい
[4]は4と同じか小さい
[5]は4より大きい
[6]は4より大きい
[7]は4より大きい
[8]は4より大きい
[9]は4より大きい

関数の使用
[0]は4と同じか小さい
[1]は4と同じか小さい
[2]は4と同じか小さい
[3]は4と同じか小さい
[4]は4と同じか小さい
[5]は4より大きい
[6]は4より大きい
[7]は4より大きい
[8]は4より大きい
[9]は4より大きい

関数ポインタ使用
[0]は4と同じか小さい
[1]は4と同じか小さい
[2]は4と同じか小さい
[3]は4と同じか小さい
[4]は4と同じか小さい
[5]は4より大きい
[6]は4より大きい
[7]は4より大きい
[8]は4より大きい
[9]は4より大きい

実行 SUCCESSFUL (合計時間: 60ms)

さてここで疑問です あれっ? 当たり前かも知れないけど、結果は同じじゃん です。となると、どうしてこんなに複雑なことせねばならないのでしょうか? それについて考察が必要です。まあ今後調べましょう。

ただ、今分かったことは、関数オブジェクト、これはファンクタ (Functor)とも呼ばれるようですが、関数オブジェクトの場合にはあくまでもオブジェクトなので、その中に何らかのデータを内在できそうです。

では、関数ポインタの出番は何でしょうか? 何でもコールバック関数の引数として良く使われるそうですが、まだ僕には理解が難しいのです。勉強が必要ですね。

MacBook Pro (OS-X Lion)でのスクリーン・キャプチャ

次第に MacBook Proを使い込んでいると、と言ってもほとんど その上の Parallels Desktop上の Windows7でですが・・・、突然あれ Screen Captureどうするんだろう? と、思いました。
この環境の Windows7では難しいかもしれないけど、そもそも OS-X Lionではどうするんだろう? それで調べたところ、

Command + Shift + Control + 4

このキー・コンビネーションで良いと分かりました。4つもキーを同時に押さねばならないのが Windowsと比べて明らかに使い勝手が悪いですね。
もう一つ突然発見しました。このマシンには SD Cardコネクタが存在しないのです。デジカメからの読み込み面倒です。