2013年12月28日土曜日

C++ 純粋仮想関数




今回はオーバーライドにまつわるお話
其の参 です。(^-^)


純粋仮想関数とは、基底クラスで内容を
定義せずに派生クラスで関数の内容を
定義する関数です。

ややこしくなってしまった...


使いどころとしては、必ず継承して使うようなクラスの場合です。(^^;)
そのような場合は、基底クラスで仮想関数の内容を決められないからです。

class Food
{
public:
    //最初に virtual と書き、最後に = 0 と書く
    virtual void SetPrice(int price) = 0;
    int GetPrice(void);
protected:
    int m_price;
};

基底クラスでは、このように呼び出し方だけを記載しておきます。
注意する点は、純粋仮想関数を含むオブジェクトは生成できないということです。

間違ってオブジェクトを作ろうとすると、当然コンパイルエラーです(*´Д`)
そう、こんな風に...

test.cpp: In function ‘int main()’:
test.cpp:59:10: error: cannot declare variable ‘myFood’ to be of abstract type ‘Food’
test.cpp:6:7: note:   because the following virtual functions are pure within ‘Food’:
test.cpp:10:18: note:        virtual void Food::SetPrice(int)

それと、ひっそりとメンバ変数が protected に変わっています...
もし、private のままだと、勿論コンパイルエラーです(*´Д`)
派生クラスからアクセスできませんので当然です。
まぁ、こんな風に...

test.cpp: In member function ‘virtual void Vegetable::SetPrice(int)’:
test.cpp:14:9: error: ‘int Food::m_price’ is private
test.cpp:31:5: error: within this context
test.cpp: In member function ‘virtual void Meet::SetPrice(int)’:
test.cpp:14:9: error: ‘int Food::m_price’ is private
test.cpp:43:5: error: within this context

派生クラスでは、継承した純粋仮想関数をオーバーライドして
何をするかを定義します。

それでは、サンプルプログラムです。
#include <iostream>
#include <string.h>

using namespace std;

class Food
{
public:
    //純粋仮想関数
    virtual void SetPrice(int price) = 0;
    int GetPrice(void);
protected:  //protectedにしておかないと、継承先で参照できない
    int m_price;
};

int Food::GetPrice(void)
{
    return m_price;
}

//派生クラスVegetable
class Vegetable : public Food
{
public:
    void SetPrice(int price);
};

void Vegetable::SetPrice(int price)
{
    m_price = price * 2;
}

//派生クラスMeet
class Meet : public Food
{
public:
    void SetPrice(int price);
};

void Meet::SetPrice(int price)
{
    m_price = price / 2;
}

int main(void)
{
    Food *pFood;
    Vegetable myVegetable;
    Meet myMeet;

    pFood = &myVegetable;
    pFood->SetPrice(500);    //VegetableクラスのSetPrice()を呼び出す
    cout << "Vegetable Price = " << pFood->GetPrice() << endl;
    pFood = &myMeet;
    pFood->SetPrice(1500);    //MeetクラスのSetPrice()を呼び出す
    cout << "Meet Price = " << pFood->GetPrice() << endl;

    return 0;
}

実行結果
# ./test
Vegetable Price = 1000
Meet Price = 750

ハマる楽しさオーバーライド これもC++のいいところです(^^)

今日の名言
不眠症で眠れないのは、不眠症を気にするからだ。
なぜ気になるかといえば、眠らないからだ。
                     フランクリン・ピアース・アダムス

忍耐はどんな悩みにも効く名薬である。
                     プラウトゥス

私は貧乏と病気のどん底を生き抜いてきました。「あらゆる人に振りかかる
悩みをあなたはどうやって切り抜けてきたのですか」と尋ねる人があれば、
私はいつもこう答えます。「私は昨日耐えました。今日も耐えることができます。
そして明日のことは決して考えないようにしています」
                     ドロシー・ディックス

2013年12月25日水曜日

C++ 仮想関数とオーバーライド


今回はオーバーライドにまつわるお話 其の弐 です。(^-^)

仮想関数とオーバーライドとは
派生クラスで再定義したメンバ関数を

基底クラスのポインタから呼び出すと

通常は再定義前のメンバ関数
(基底クラスのメンバ関数のこと)
が呼ばれます。



ここで再定義後のメンバ関数が呼ばれるようにするには、基底クラスで
その関数を仮想関数にしておく必要があります(^^;)

仮想関数にするには、予約語 virtual を指定します。
そして、仮想関数を派生クラスで定義し直すことをオーバーライドといいます。

では、仮想関数の使用例です。
class Food
{
public:
    virtual void SetPrice(int price);  //仮想関数を定義
    int GetPrice(void);
private:
    int m_price;
};
   :
void Vegetable::SetPrice(int price)  //派生クラスで
{                                                 //SetPrice()をオーバーライド
    Food::SetPrice(price * 2);           //倍返し価格設定
}
   :
int main(void)
{

    Food *pFood;
    Vegetable myVegetable;

    pFood = &myVegetable;
    pFood->SetPrice(500);    //VegetableクラスのSetPrice()を呼び出す
   :

実行結果
# ./test
Vegetable Price = 1000

「オーバーライド」と「オーバーロード」は言葉が似ています...
いつもごっちゃになるので注意したいところです(^^;)

今回のソース
#include <iostream>
#include <string.h>

using namespace std;

class Food
{
public:
    virtual void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

class Vegetable : public Food
{
public:
    void SetPrice(int price);
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};

void Food::SetPrice(int price)
{
    m_price = price;
}

int Food::GetPrice(void)
{
    return m_price;
}

void Vegetable::SetPrice(int price)
{
    Food::SetPrice(price * 2);
}

void Vegetable::SetFarmName(const char *farm)
{
    strncpy(m_strFarmName, farm, 32);
}

char *Vegetable::GetFarmName(void)
{
    return m_strFarmName;
}

int main(void)
{

    Food *pFood;
    Vegetable myVegetable;

    pFood = &myVegetable;
    pFood->SetPrice(500);    //VegetableクラスのSetPrice()を呼び出す

    cout << "Vegetable Price = " << pFood->GetPrice() << endl;

    return 0;
}

今日の名言
満面にこぼれるような笑みをたたえ、肩をそびやかし、大きく深呼吸しながら歌の
一節でも口ずさむことだ。歌でなくて口笛でも良い。口笛が駄目なら鼻歌でも良い。
早い話が、幸福に酔いしれているようにふるまいながら、同時に浮かぬ顔で沈み込んで
いることは肉体的に不可能だということだ!
                                   デール・カーネギー

頭を悩ませる問題にぶつかった時でも、私は一時間以内にそうした悩みを追放して、
「素晴らしきかな人生」と歌声を上げることができる。私のやり方はこうだ。自分の
書斎へ入り、目を閉じたままで私は本を一冊抜き出す。それがこのプレスコットの
「メキシコ征服記」であろうとスエトニウスの「ローマ帝王記」であろうと、いっこうに
構わない。なおも目を閉じたままで、行き当たりばったりにページを開く。それから
目を開けて一時間読みふける。読めば読むほど、私は、世界が常に苦悶にあえいで
きたこと、文化が常に破滅の一歩手前にあったことを、痛感するのである。歴史書の
各ページは、戦争、飢餓、貧窮、疫病、人間同士の非人道的行為について、あますところ
なく述べている。一時間歴史をひもといてのち私は、なるほど現状はひどいには
違いないが、過去に比べるならはるかに良くなっていることをしみじみと悟る。
これにより、大局的には世界はだんだん良い方向に向かっていることが把握でき、
また私の悩みも、そのありのままの姿から検討できる。
                                   ロジャー・W・バブソン

2013年12月23日月曜日

C++ メンバ関数の再定義


今回はオーバーライドにまつわるお話
其の壱 です。(^-^)

基底クラスのメンバ関数の再定義
基底クラスのメンバ関数は、派生クラスで
定義しなおすことができます。

この場合は、関数名、引数、戻り値が
同じでなければなりません。
定義しなおすと、そちらの関数が
呼ばれるようになります(^^)


ここでは、基底クラスFoodに対し、派生クラスVegetableで
SetPrice()関数を再定義してみます。

class Food
{
public:
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

class Vegetable : public Food
{
public:
    void SetPrice(int price);
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};
   :
void Vegetable::SetPrice(int price)    //SetPrice()の再定義
{
    Food::SetPrice(price / 2); //半額にする
}

派生クラスから、基底クラスの関数を呼ぶときは
スコープ解決演算子を使います(^^)

実行結果
# ./test
Food Price = 500
Vegetable Price = 250

どうでしょうか、関数名が被ってもいいってのは、名前に悩まされる問題が
軽減される気がします。
なぜなら、機能が同じなのでそういった名前が付けたいに違いない!
と思うわけでして...(^^;)

せっかくなので、一応全部載せときます...
#include <iostream>
#include <string.h>

using namespace std;

class Food
{
public:
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

class Vegetable : public Food
{
public:
    void SetPrice(int price);
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};

void Food::SetPrice(int price)
{
    m_price = price;
}

int Food::GetPrice(void)
{
    return m_price;
}

void Vegetable::SetPrice(int price)
{
    Food::SetPrice(price / 2);
}

void Vegetable::SetFarmName(const char *farm)
{
    strncpy(m_strFarmName, farm, 32);
}

char *Vegetable::GetFarmName(void)
{
    return m_strFarmName;
}

int main(void)
{

    Food myFood;
    Vegetable myVegetable;

    myFood.SetPrice(500);         //FoodクラスのSetPrice()
    myVegetable.SetPrice(500);    //VegetableクラスのSetPrice()

    cout << "Food Price = " << myFood.GetPrice() << endl;
    cout << "Vegetable Price = " << myVegetable.GetPrice() << endl;

    return 0;
}


今日の名言
問題を手際よく表現することによって、問題は半ば解決されている。
                                チャールズ・F.・ケタリング

一種類以上の問題を無理に抱えようとするな。世の中には三種類も問題を抱えている
人がある-過去の問題のすべて、現在の問題のすべて、未来の問題のすべてを。
                                エドワード・エヴァレット・ヘール

私たちが敵に憎しみを感じると、むしろ自分自身が敵に支配されることになる。そして
その支配力は私たちの睡眠・食欲・血圧・健康・幸福にまで及んでくる。敵について
思い悩み、苦悶し、何とか仕返しの機会を狙っていると知ったら、敵は小躍りして
喜ぶであろう!私たちの憎悪は少しも敵を傷つけないばかりか、かえって私たち自身が
日夜、地獄の苦しみを味わうことになる。
                                デール・カーネギー

2013年12月18日水曜日

C++ 派生クラスと基底クラス 其の弐


今回は、派生クラスのオブジェクトのアドレスを
基底クラスのポインタに代入するとどうなるのか、
について見ていきます(^^)

子オブジェクトのアドレスを親クラスのポンタに代入してみると
何と派生クラスのオブジェクトのアドレスを、
基底クラスのポインタに代入するといった
使い方もできます。





class Food  //基底クラス
{
public:
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

class Vegetable : public Food //派生クラス
{
public:
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};
   :
   :
int main(void)
{
    Food *pFood;         //Foodクラスのポインタ
    Vegetable myVegetable;  //Vegetableクラスのオブジェクト

    pFood = &myVegetable;  //Vegetableクラスのオブジェクトのアドレスを
                                        //Foodクラスのポインタに代入
    return 0;
}


使い方をもっと具体的に
基底クラスのポンタ配列に派生クラスからのオブジェクトのアドレスを代入しておくと、
派生クラスのメンバ関数を基底クラスのポインタから呼び出すことができます(^^)
以前のサンプルプログラムを以下のように変更します。

    :
class Meet : public Food    //新しい派生クラスMeetを追加
{
public:
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];
};
    :
int main(void)
{
    Food *pFood[2];
    Vegetable myVegetable;
    Meet myMeet;

    pFood[0] = &myVegetable;
    pFood[1] = &myMeet;

    for (int i = 0; i < 2; i++) {
        pFood[i]->SetPrice((i+1) * 100);
        cout << "Price[" << i << "]="<<  pFood[i]->GetPrice() << endl;
    }

    return 0;
}

実行結果
# ./test
Price[0]=100
Price[1]=200

継承に限らず、ポインタを駆使した処理というのは沢山でてきますので
ぜひとも身につけておきたいところです(^^;)


今日の名言
いらぬ取り越し苦労をするよりも、前もって考えたり計画する方が大事だ。
                                ウィンストン・チーチャル

大きな悲しみには勇気をもって立ち向かい、小さな悲しみには忍耐をもって立ち向かえ。
一日の仕事を終えたら安らかに眠れ。あとは神が守ってくださる。
                                ヴィクトル・ユーゴー

小さな事柄が人を悩ませるのだ。象が向って来れば身をかわして逃げられもするが、
ハエからは身をかわすことはできない。
                                ジョシュ・ビリングス

人間を殺すのは仕事ではない。悩みである。仕事は健康に良い。けれど自分の力の
限界以上に働くことはできない。悩みは歯車の錆である。機械が駄目になるのは、
絶えず回転するからではなく、絶えず摩擦するからである。
                                ヘンリー・ウォード・ビーチャー

2013年12月16日月曜日

C++ 派生クラスと基底クラス 其の一

今回は、派生クラスのオブジェクトを基底クラスへ代入するという
ことについて見ていきます(^^)

子オブジェクトを親オブジェクトに代入してみる
派生クラスのオブジェクトは、基底クラスのオブジェクトへ
代入することができます。
代入すると、派生クラスのメンバ変数の値が、
そのまま対応する基底クラスのメンバ変数にコピーされるのです(^^)/ さすがC++ 賢い!

かなり省略してますが、以前のプログラムを利用した例です。

class Food
{
    :               //基底クラスFoodの定義
};

class Vegetable : public Food
{
    :              //派生クラスVegetableの定義
};

    :

int main(void)
{
    Vegetable Pumpkin;  //Pumpkinオブジェクト生成
    Food myFood;         //myFoodオブジェクト生成

    Pumpkin.SetPrice(398);
    cout << "Price = " << Pumpkin.GetPrice() << endl;

    Pumpkin.SetFarmName("Pascal's Farm");
    cout << "Farm Name = " << Pumpkin.GetFarmName() << endl;

    myFood = Pumpkin;  //Pumpkinオブジェクトを代入
    cout << "myFood's price " << myFood.GetPrice() << endl;
  
    return 0;
}

実行結果はこうなります。(^^)
# ./test
Price = 398
Farm Name = Pascal's Farm
myFood's price 398

おぉ、Foodクラスの方では、SetPrice() を呼び出していないのに
価格が設定されているではありませんか!

親オブジェクトを子オブジェクトへ代入してみると?
一方で、基底クラスのオブジェクトを派生クラスのオブジェクトに
代入するとどうなるのでしょう。試してみます。(^^;)

int main(void)
{
    Vegetable Pumpkin;
    Food myFood;

    Pumpkin.SetPrice(398);
    cout << "Price = " << Pumpkin.GetPrice() << endl;

    Pumpkin.SetFarmName("Pascal's Farm");
    cout << "Farm Name = " << Pumpkin.GetFarmName() << endl;

    myFood.SetPrice(200);  //基底クラスに設定した値が   
    Pumpkin = myFood;      //派生クラスに反映されるのでしょうか?

結果は、コンパイルエラーです...(*´Д`)
派生クラスにしかないメンバ変数に値が設定できないのです。
これでは困るので、親から子へ代入ができないのです。

ちなみに、こんなメッセージが出ます。
test.cpp: In function ‘int main()’:
test.cpp:57:15: error: no match for ‘operator=’ in ‘Pumpkin = myFood’
test.cpp:57:15: note: candidate is:
test.cpp:15:7: note: Vegetable& Vegetable::operator=(const Vegetable&)
test.cpp:15:7: note:   no known conversion for argument 1 from ‘Food’ to ‘const Vegetable&’

実は、もっと後に出すつもりの演算子のオーバーロードという機能を使えば
このエラーそのものは、無くすことができます。
ただし、それはまた後ほど...(^^;)

今日の名言
ふとっちょ卵が塀の上、ふとっちょ卵が落ちちゃった。
王様の馬と王様の家来が皆出て来てくっつけたけど、元通りにはならないよ。
この古い童話にある通り、王様の馬と家来が全部束になってかかっても、過去は
元通りにはならない。一旦おがくずになったものをのこぎりで挽いても始まらない。
                                デール・カーネギー

私は実業界に入って間もなく、心配することのばからしさを思い知らされた。だから
私は、難問にはできる限り手を尽くすように心がけているが、もし目算が外れて、
収拾がつかなくなったとしても、あっさり忘れることにしている。
                                ジュリアス・ローゼンウォルト

私は他に気がかりなことがあるとしても、それに関連する事柄全てを忘れ去り、
当面の仕事に没頭することにしている。その効果は実に素晴らしい。
                                ヘンリー・ウォード・ビーチャー

2013年12月11日水曜日

C++ 多重継承

複数の基底クラスから一つの派生クラスを作ることができます。
これを多重継承といいます。(^^)
一方、一つの基底クラスから派生クラスを作ることを単一継承といいます。

多重継承の一例です。

Copyクラス Scannerクラス  Printerクラス Faxクラス
 Copy()         Scan()            Print()          Fax()
  Switch()       Switch()          Switch()        Switch()
 |_____|______|____|
               |
              MFPクラス

MFPとは、MultiFunctionPrinter Pは Procduct ということも...
要は複合機です。

MFPクラスは、他のクラスのメンバをすべて含んでいます。
すなわち、MFPクラスからCopyクラスに定義してある関数が
使用できるということになります。(^^)

多重継承の定義の仕方
多重継承の定義は、基底クラスを「, (カンマ)」で区切って記述します。

class MFP : public Copy, public Scanner, public Printer, public Fax
{
    :
    :
};

多重継承はメンバが曖昧になる
多重継承で、もし複数の基底クラスに同じ名前のメンバがあった場合、
派生クラスには同じ名前のメンバが複数出来てしまうことになります。

先の例では、すべてのクラスに 関数 Switch() があるため、
MFPクラスでは、4つの Switch()が出来るのです(^^;)

派生クラスからこれらの重複したメンバにアクセスするには、
スコープ解決演算子を使います。

class Copy
{
public:
    int GetSwitchStat(void) { return m_on; }
    void SetSwitch(int n) { m_on = n; };  //Copyクラスのメンバ関数SetSwitch()
private:
    int m_on;
};

class Scanner
{
public:
    int GetSwitchStat(void) { return m_on; }
    void SetSwitch(int n) { m_on = n; };  //Scannerクラスのメンバ関数SetSwitch()
private:
    int m_on;
};

class Printer
{
public:
    int GetSwitchStat(void) { return m_on; }
    void SetSwitch(int n) { m_on = n; };  //Printerクラスのメンバ関数SetSwitch()
private:
    int m_on;
};

class Fax
{
public:
    int GetSwitchStat(void) { return m_on; }
    void SetSwitch(int n) { m_on = n; };  //Faxクラスのメンバ関数SetSwitch()
private:
    int m_on;
};

class MFP : public Copy, public Scanner, public Printer, public Fax
{
public:
    int GetSwitchStat(void) { return m_on; }
private:
    int m_on;
};

int main(void)
{
    MFP mfp;
    mfp.SetSwitch(0);  //MFPクラスのオブジェクトからメンバ関数を呼び出す?
        :

これではコンパイラはどのSetSwitch()を使うか判断できません。
そのため、コンパイルエラーになります。(*´Д`)

# g++ -g -Wall -o test test.cpp
test.cpp: In function ‘int main()’:
test.cpp:52:9: error: request for member ‘SetSwitch’ is ambiguous
test.cpp:36:10: error: candidates are: void Fax::SetSwitch(int)
test.cpp:27:10: error:                 void Printer::SetSwitch(int)
test.cpp:18:10: error:                 void Scanner::SetSwitch(int)
test.cpp:9:10: error:                 void Copy::SetSwitch(int)
r
同名のメンバがあるときは、スコープ解決演算子を使って、
どのクラスのメンバを呼び出すのかを指定してください。

int main(void)
{
    MFP mfp;
    mfp.Fax::SetSwitch(0);  //Faxクラスの

    cout << "MFP switch1 " << mfp.Fax::GetSwitchStat() << endl;
    cout << "MFP switch2 " << mfp.GetSwitchStat() << endl;
        :

# ./test
MFP switch1 0
MFP switch2 34332

この例では、MFPクラスの m_on には値を設定していないので
不定値が出力されています。
このことからも、多重継承によって、メンバ変数 m_on が
5つあるということがわかります。(^^;)
 
今日の名言
明朗になろう。耐え切れぬほどひどい不幸など、ありえないのだから。
                             ジェイムズ・ラッセル・ローウェル

私はあきれ返った楽天家として通っているが、まさにそのとおりである。私は成功のこと
ばかり考え、決して失敗のことを考えないからだ。こうして、知らず知らずのうちに不幸に
背を向け、失敗を恐れる気持ちを消し去る。私はこうして自分の人生哲学を実行している。
どんな仕事も必ず十分に検討して、自分の力でやれるのはどの程度か、はっきり見極める
ことだ。それからこの目標をどうやって遂行するか計画を立てる。その際、他人の方法を
真似てはいけない、自分独自の方法を考え出して計画することだ。
                             フェルディナンド・フォシュ将軍

私たちの疲労は仕事によって生じたのではなく、悩み、挫折、後悔が
原因となっていることが多い。
                             デール・カーネギー

2013年12月9日月曜日

C++ 継承したメンバへのアクセス

今回は、継承したメンバのアクセス制限についての話です。

基底クラスでのpublicメンバの場合
基底クラスでpublicだったメンバは、派生クラスからは自分のクラスのメンバと
同じようにアクセスすることができます(^^)

class Food {
public:
    int GetPrice() { return price; }
};

class Vegetable : public Food {
public:
    void Vegetable::PricePrice() {
        cout << "Price = " << GetPrice() << endl;
    }
};

Vegetableクラスでは、基底クラスでpublicだったメンバ関数のGetPrice()に
アクセスしています。
基底クラスでpublicだったメンバは呼び出せるのです(^^)/


基底クラスでのprivateメンバの場合
基底クラスでprivateだったメンバは、派生クラスからはアクセスすることはできません。

class Food {
private:
    int m_price;
};

class Vegetable : public Food {
public:
    void Vegetalbe::PrintPrice() {
        cout << "Price = " << m_price << endl;
    }
};

基底クラスでprivateメンバにアクセスしようとすると、コンパイルエラーです。

そう、こんな風に(*´Д`)
test.cpp:12:10: error: extra qualification ‘Vegetable::’ on member ‘PrintPrice’ [-fpermissive]
test.cpp: In member function ‘void Vegetable::PrintPrice()’:
test.cpp:7:9: error: ‘int Food::m_price’ is private
test.cpp:13:31: error: within this context

基底クラスでprivateだったものは使えないのです(-_-;)


アクセス指定子のprotected
protectedを使用した場合は、派生クラスからアクセスできても
他のクラスやグローバルな関数からアクセスできなくなります。(^^;)

class Food {
protected:
    int m_price;
};

class Vegetable : public Food {
public:
    void Vegetable::PrintPrice() {
        cout << "Price = " << m_price << endl;  //これはOK
    }
};

int main(void)
{
    Vegetable vgt;
    vgt.PrintPrice();

    vgt.m_price = 200;
        :

例えば、こんな風に使おうとすると、コンパイルエラーになってしまいます...

そう、こんな感じで(*´Д`)
test.cpp:12:10: error: extra qualification ‘Vegetable::’ on member ‘PrintPrice’ [-fpermissive]
test.cpp: In function ‘int main()’:
test.cpp:7:9: error: ‘int Food::m_price’ is protected
test.cpp:22:9: error: within this context

アクセス指定子は、要注意ですね(^^;)
たまに、設計の意図を汲み取らず、これ public にしたいなぁという事はあるのですが...

今日の名言
心を傷つける鎖を断ち切り、悩みをきっぱりと捨て去った者は、幸福なるかな。
                           オウィディウス

明日を耐え抜くために必要なものだけ残して、あらゆる過去を閉め出せ。
                     サー・ウィリアム・オスラー

過ぎ去ったものは、もはや再び帰らない。賢者は現在と未来について考えるだけで
手一杯であるから、過ぎ去った事柄をくよくよ考えている暇がない。
                           フランシス・ベーコン

ジョージ・ハーバードは「夜は魂を脱ぎ捨てよ」と言っている。これは内省を
しろというのではなく、服を脱ぐようにすっぽりと魂を脱ぎ捨てるのだ。その
一日をなすこともなく過ごした罪も、誤りを犯した罪も、ともに脱ぎ捨てれば、
翌朝新しい命を持った新しい人間として、目覚めるだろう。
                     サー・ウィリアム・オスラー

恐ろしい悪夢に比べれば、現在の恐怖のほうがまだましだ。
                     ウィリアム・シェイクスピア

2013年12月3日火曜日

C++ 継承の利用

今回は継承したクラスのオブジェクトの使用例として、サンプルコードを掲載します(^^)
Foodクラスを継承したVegetableクラスの利用です。

#include <iostream>
#include <string.h>

using namespace std;

class Food
{
public:
    void SetPrice(int price);
    int GetPrice(void);
private:
    int m_price;
};

class Vegetable : public Food
{
public:
    void SetFarmName(const char *farm);
    char *GetFarmName(void);
private:
    char m_strFarmName[32];  //勝手に32文字制限
};

void Food::SetPrice(int price)
{
    m_price = price;
}

int Food::GetPrice(void)
{
    return m_price;
}

void Vegetable::SetFarmName(const char *farm)
{
    strncpy(m_strFarmName, farm, 32);
}

char *Vegetable::GetFarmName(void)
{
    return m_strFarmName;
}

int main(void)
{
    Vegetable Pumpkin;  //カボチャ

    Pumpkin.SetPrice(398);  //398円
    cout << "Price = " << Pumpkin.GetPrice() << endl;

    Pumpkin.SetFarmName("Pascal's Farm"); //生産者 ブレーズ・パスカル
    cout << "Farm Name = " << Pumpkin.GetFarmName() << endl;

    return 0;
}

実行例
# ./test
Price = 398
Farm Name = Pascal's Farm

どうでしょうか、継承に魅力に憑りつかれ、C++にハマってくる気がしませんか?(^^;)

今日の名言
時は悲しみと口論の傷を癒やす。人は皆変わる。
過去の自分はもはや現在の自分ではない。悩む者も悩ます者も、時が経てば別人になる。
                                 ブレーズ・パスカル

私は何か問題を考えたい時、心の引き出しを一つ開ける。問題が解決するとその引き出しを
閉め、また次には別のを開ける。眠りたい時には全部の引き出しを閉める。
                                 ナポレオン

今から一年も経てば、私の現在の悩みなど、およそくだらないものに見えることだろう。
                                 サミュエル・ジョンソン

私達の人生を彩る様々な事象のうち、およそ90パーセントは正しく、10パーセントは誤りで
ある。幸福を願うのなら、やり方としては、正しい90パーセントに力を集中し、誤った
10パーセントは無視すればよい。もし苦悩と悲惨を願い、胃潰瘍になりたいのなら、誤った
10パーセントに力を集中し、栄光に満ちた90パーセントを無視すればよい。
                                 デール・カーネギー

2013年11月29日金曜日

C++ 継承


継承とは、すでにあるクラスを利用して、新しいクラスを作ることです^^
基にするクラスを基底クラス、基底クラスを継承して作ったクラスのことを
派生クラスといいます。

例えば、親クラスとして Food クラスを定義します。
そして、このFoodクラスのメンバに、新たにメンバを追加したVegetableクラス
というものを作りたいとします。
ここで、継承の機能を使えば、Foodクラスのメンバを受け継いだ子クラスが作れるのです。
受け継いだということは、もちろん親クラスのメンバ自身も使用できます。(^^)

少々分かり難いと思いますので、ソースコードで表現してみるとこんな感じになります。

基底クラス(Food)
class Food {
public:
    void SetPrice(int price);
    int GetPrice( );
private:
    int m_price;
};

基底クラスを継承したクラス(Vegetable)
class Vegetable : public Food {
public:
    void SetFarmName(const char *farm);
    void GetFarmName(char *farm);
private:
    char m_strFarmName[32];
};

あるクラスを継承した派生クラスを作るには、派生クラスのクラス名の後に
「: public 基底クラス名」を記述します。
publicのところは、privateやprotectedも記述できますが、ほとんど見かけません(^^;)
おそらく、あまり使うべき場面がないからでしょう。難しくなりますし...

派生クラスのメンバは自分のクラスのメンバ + 基底クラスのとなります。
したがって、派生クラスには書いてないのですが、Vegetableクラスでは
SetPrice()とGetPrice()のメンバ関数を使うことができます(*^^)v
やりますな、継承...

また、派生クラスは、基底クラスからいくつでも作ることができます。
そして、派生クラスを継承して、さらに派生クラスを作るという使い方もできます。

Food クラス - Vegetable クラス - Pumpkin クラス
                 |
                 |_ Fruit クラス      -  Peach クラス
                 |            |_  Orange クラス
                 |                        |_  Banana クラス
                 |_ Meat クラス

//オレンジ、バナナ、とくれば、次はブドウ ロックシード... (*´Д`)




今日の名言
どんな不幸な人生からでも、利口者は何らかの利益を得る。一方、どんな幸福な
人生からでも愚か者は心を傷つけられる。
                                        ラ・ロシュフコー

繁栄は偉大な教師であるが、苦難はさらに偉大な教師である。富は心を豊かにする。
貧苦は心を鍛える。
                                        ウィリアム・ハズリット

敗北は骨を硬く鍛える。敗北は軟骨を筋肉に変える。敗北は人間を不敗にする。
                                   ヘンリー・ウォード・ビーチャー

敗北とは何か。それは教育にほかならない。それは一段と優れた段階に達するための
第一歩なのだ。
                                     ウェンデル・フィリップス

光の存在が物を見えるようにし、また見えなくもしている。けれどたとえこのうえなく気高い
創造物でさえ、暗黒と地上の影がなければ、いつまでも人の目にとまらない。
そして天空の星も見えなくなる。
                                     サー・トーマス・ブラウン

2013年11月27日水曜日

C++ 継承概要

「継承」は、オブジェクト指向プログラミングの特徴の一つです。

継承とはそのクラスが持っているメンバを別のクラスに受け継がせることを
いいます。この時、元のクラスを基底クラス、受け継いだ方のクラスを
派生クラスといいます。

派生クラスでは継承したメンバは再定義せずに使うことができ、
さらに派生クラス内で新たに独自のメンバを定義することもできます。^^
また、基底クラスのことを親クラス、派生クラスのことを子クラスと
いうこともあります。

ここで、二つを親子とみなし、基底クラスのメンバを親が所有する家、家具と
すると、子どもが家と家具一式をすべて相続するのが継承といえます。

独自のメンバ定義は、新たに家具を増やすイメージでしょうか(^-^)
家を買って、全部自分で一から買い揃えるよりかはずっとお手軽です。

イマイチな例えかもしれませんが、これが継承のメリットです。

継承したモノを加工してみる?
基底クラスから継承したメンバ関数は、派生クラスで内容を再定義できます。
C++ではさらに、「派生クラスでメンバ関数を再定義すること」を前提とした
メンバ関数を定義できます。これを仮想関数といいます(^^)

また、純粋仮想関数というメンバ関数もあります。純粋仮想関数とは
クラスに呼び出し方だけが記述してあり、実体のない空のメンバ関数の
ことです。純粋仮想関数の中身は、派生クラスで再定義するときに
具体的な処理を書きます。

なぜこの様に面倒なことができる様になっているのでしょう(^^;)
時には、一般的なクラスで細かい所まで定義せず曖昧なまま進めたい事も
あるのです。純粋仮想関数はこんな時に使えるのです。

使いどころも含め、実に分かり難いので、次回以降でもっと詳しく
見ていきたいと思います。

今日の名言
過去を忘れ、他のことに一心に取り組む。これが私の悩み解決法である。
                           ジャック・デンプシー

済んだことは済んだことだ。過去を振り返らず、希望を持って新しい目標に向かうことだ。
                       ジョージ・C・マーシャル将軍

過ぎ去ったことは決して気にかけるな。これも経験の一つと考えて、悩みは忘れ去ろう。
目の前は常に困難だらけだ。振り返って過ぎ去った困難まで省みる必要はない。
                         ハーバート・フーヴァー

もし我々が、ただ手をこまねいて、家に閉じこもってくよくよ考えてばかりいれば、
ダーウィンのいわゆる「ウィバー・ギバー」なる卵をどっさり孵化させてしまう。
「ウィバー・ギバー」とは、人間の体を蝕み行動力と意志力を骨抜きにしてしまう。
時代遅れの幽霊にほかならぬ。
                           デール・カーネギー

2013年11月18日月曜日

C++ コピーコンストラクタ その2

前回、何気ないところですが、重要と書いた点の続きになります。(^_^;)
やはり賢いC++、デフォルトのコピーコンストラクタでもメンバ変数のコピーをしてくれます。
それでも、コピーコンストラクタを定義しなければいけない場合というのがあります。
メンバにポインタ変数が含まれる場合に、次のような問題が起こってしまうのです。
次のような例を見てください。

class Person {
public:
    Person() {
        m_pName = new(std::nothrow) char[32];
    }
    ~Person() {
        if (m_pName != NULL) {
            delete [] m_pName;
            m_pName = NULL;
        }
    }
            :    //このままコピーコンストラクタを用意しないでいると...   
private:
    char *m_pName;        //ここにポインタのメンバ変数があります
};

int main(void)
{
    Person *psn1 = new(std::nothrow) Person;
    //psn2 の初期化 デフォルトのコピーコンストラクタを呼び出します
    Person *psn2 = new(std::nothrow) Person(*psn1);
        :
    if (psn1 != NULL) {        delete psn1;
        psn1 = NULL;
    }
    if (psn2 != NULL) {
        delete psn2;        //2つ目のオブジェクトを削除しようとすると
        psn2 = NULL;      //実行時エラーが発生してしまいます(>_<)
    }
        :

実行例
# ./test
*** glibc detected *** ./test: double free or corruption (fasttop): 0x00728018 ***
中止

これは、デフォルトのコピーコンストラクタを使用したからなのですが、なぜ double free となってしまったのでしょうか?

実はpsn1オブジェクトの m_pName と psn2オブジェクトの m_pName のポインタが指し示す
先が同じだからです。
psn1オブジェクトを削除したときに、m_pNameの指し示す先のメモリ領域も削除されました。
そのため、psn2オブジェクトの m_pName が参照するエリアがなくなってしまい
プログラムが異常終了していたのです。

では、先ほどのサンプルにコピーコンストラクタを用意し、
エラー終了しないよう改造してみます。

#include <iostream>
#include <string.h>

class Person {
public:
    Person() {
        m_pName = new(std::nothrow) char[32];
    }
    Person(const Person &psn);  //コピーコンストラクタを宣言します
    ~Person() {
        if (m_pName != NULL) {
            delete [] m_pName;
            m_pName = NULL;
        }
    }
private:
    char *m_pName;
};

//コピーコンストラクタを定義します^^
Person::Person(const Person &psn)
{
    //人名は31文字までと勝手に決めています(^_^;)
    m_pName = new(std::nothrow) char[strnlen(psn.m_pName, 31)+1];
    strncpy(m_pName, psn.m_pName, strnlen(psn.m_pName, 32));
}

int main(void)
{
    Person *psn1 = new(std::nothrow) Person;
    //psn2 の初期化 定義したコピーコンストラクタを呼び出します
    Person *psn2 = new(std::nothrow) Person(*psn1);

    if (psn1 != NULL) {
        delete psn1;
        psn1 = NULL;
    }
    if (psn2 != NULL) {
        delete psn2;
        psn2 = NULL;
    }

    return 0;
}

ちなみに、このプログラム実行しても、何も表示しないで終了します。(^_^;)
正しく動作するようにはなりましたので、気が向いたらSetName, GetName関数
など追加して試してみてください。

今日の名言
偉大な心はしっかりしたよりどころを持っている。矮小な心は願望しか持っていない。
小さい心は不幸に慣れて大人しくなっている。偉大な心は不幸の上にそびえ立つ。
                                     ワシントン・アーヴィング

人間の偉大さは、不運に対してどのように耐えるかによって、決まるものだ。
                                     プルターク

熱中を得る方法は、自分の手がけている事柄を正しいと信じ、自分にはそれをやり遂げる
力があると信じ、積極的にそれをやり遂げたい気持ちになることである。昼のあとに夜が
くるように、ひとりでに熱中がやってくる。

何かを成し遂げようという気持ちがなければ、世間のどこへいっても頭角を現せない。
                                     デール・カーネギー

それが人生なのだ。A弦が切れることも、三本の弦で弾き終えることも。
                                ハリー・エマーソン・フォスディック

2013年11月13日水曜日

C#ではじめた Windows8 Application minority report

早いもので、もう先月の話になってしまったが

セミナー参加強化月間の締めとして

いろいろ使える! という

Microsoft Innovation Center(MIC)で 受講したセミナーが

ほんとに無料 !

C# の実務へ向けた取っ掛かりとして、思いのほか良かったので

その記録を今更ながら残しておく。

写真は、同じに見えるかもしれないが

こっそりとUI編と機能編で違いがある(^_^;)




ここで、どうでもいい話を一つ。

仕事では、まったくIDEを使わないので、Visual Studioで開発するとなると

あまりに便利すぎて、こんなに楽していいのだろうかと、いつも思う。

大枠はウィザードを実行するだけで出来上がるし、

Eclipseのコンテンツアシストと同様のコード補完機能も、

高速コーディングに大いに役立つ。

おかげで!? C# をやってる気が全くしない。

bashのタブキー補完もそうだが、考えた人はホントに天才だな...


このセミナー、 C# 普及のためとはいえ、絶好の機会であった。

ただ、Exerciseについての苦言を呈しておきたい(-_-;)

会場では資料に書いてある通りに進めればいいので

あまり躓くことなく、こなすことができる。

理解した気にもなれる。

しかし、せっかく自宅で復習しようとしても、

もらったCDに入っているプログラムを実行しようとすると

参照するデータベースファイルがないので、実行できない...

CDにTokyoSubwaysを追加しておいてくれないと、

スタンドアロンで確認できないではないかぁーっ(*_*;

実に残念である。

あと、Visual Studio Ultimateは全部入りみたいだけど

なぜ無料版のVisual Studio Express の方は、for XXX と分けてるのだろうか。

初め、色々あるからどれを使えばいいか、迷ったではないかぁーっ!


もちろん、これらはアンケートに忌憚なき意見として、書いておいた。


まとめ
MIC主催のセミナー 内容自体は分かりやすく、ためになるのでおススメ度はかなり高い。


さらに、土曜開催とかあるともっと有り難いのだが...

企画物のスタンプラリーもコンプリートし易くなるしって、違うか(^_^;)




2013年11月12日火曜日

C++ new/delete演算子の応用

オブジェクト以外も動的にメモリ確保ができます。^^
new演算子とdelete演算子を使って、int型やchar型などもメモリ確保と解放ができます。

int型のメモリ確保と解放
new演算子とdelete演算子を使ってint型のメモリを動的に確保/解放する例を示します。
C言語のmalloc()関数より、new演算子のほうが若干簡単な記述になっています。

new, deleteを使用
int *pNum = new(std::nothrow) int;    //メモリ確保できなかったらNULLを返すように
if (pNum != NULL) {                          //NULLでない事を確認して解放
    delete pNum;                              
    pNum = NULL;                            //未使用になったらNULL代入
}

malloc(), free()を使用
int *pNum = (int *)malloc(sizeof(int));
if (pNum != NULL) {                          //NULLでない事を確認して解放
    free(pNum);
    pNum = NULL;             //未使用になったらNULL代入
}

new, deleteの方のstd::nothrowは前回確認した例外を発生させずにNULLを
返すようにするための記述です。
また、malloc, free版にも共通している解放時のNULLチェックおよび解放後の
NULL代入は忘れずに書くクセをつけるとよいでしょう。(^^)


配列用のメモリ確保と解放
new演算子を使って、配列用のメモリ確保もできます。

int *pNum = new(std::nothrow) int[100];

[ ]の中に必要な要素数を記述します。この例ではint型のメモリ領域を
100個用意してみました。

次はnew演算子で確保した配列用のメモリ解放についてです。
これは配列名の前に [ ] を記述します。
もし、[ ] を忘れると配列の最初の要素しか解放されませんので要注意です。(^_^;)

delete [] pNum;   //このとき、要素数は記述しません


オブジェクトの配列のメモリ確保と解放
最後はオブジェクトの配列を確保/解放する場合についてです。
この場合も書き方は同じです。以下に例を示します。

PeachBox *pPeachBox = NULL;
pPeachBox = new(std::nothrow) PeachBox[24];
        :
if (pPeachBox != NULL) {
    delete [] pPeachBox;  //要素数は記述しませんので注意してください
    pPeachBox = NULL;
}

動的なメモリ確保のためのnew, deleteバリバリ使ってみてください。^^

今日の名言
どうすれば物事に熱中できるだろうか。まず自分の手がけている事柄のどんなところが
好きか自分に言い聞かせて、嫌いな部分は捨てて、さっさと好きな部分へ移ることだ、
それから夢中になって行動する-誰かに自分の好きな部分について聞かせる。
なぜそうした事に興味があるのか、教えてやる。
                                    デール・カーネギー

我々は自分が胸に温めてきた計画の廃墟を積み重ねて、天へ向かう。失敗だと思って
いたものが、実は成功だったということに気づきながら。
                            エイモス・ブロンソン・オルコット

苦さの味を知らぬ者は、甘さも分からない。
                                    ドイツの格言

困難とは作業衣を着た好機会にすぎない。
                                ヘンリー・J・カイザー

2013年11月4日月曜日

C++ フレンド

クラスのメンバをprivateにすると、当然他のクラスからアクセスできなくなります。
しかし、別の特定のクラスからほんのちょっとだけ特別にアクセスしたくなることが
あるかと思います。(^_^;)

そんな時に便利なのが、フレンドクラスの機能です。
たとえば、次のようにするとTheOtherInfoクラスは、OneInfoクラスのフレンドクラスと
なります。

//TheOtherInfoクラスをOneInfoクラスのフレンドクラスに宣言します^^
class OneInfo {
friend class TheOtherInfo;
private:
    int some_info;
};

こうすると、なんとTheOtherInfoクラスからOneInfoクラスのpriveteメンバに
アクセスできてしまうのです!

class TheOtherInfo {
public:
    void Accessor(OneInfo anyInfo) {
        //OneInfoクラスのprivateメンバにアクセス可!!
        anyInfo.some_info = 1;
    }
};

フレンドクラスの宣言は、クラス定義の中のどこに書いてもOKです。^^
また、今回の例では、TheOtherInfoクラスはOneInfoクラスのフレンドクラスとなります。
しかし、OneInfoクラスはTheOtherInfoクラスのフレンドクラスではありません。
悲しきかな、フレンドの関係は片方向だけになります。(>_<) そ、そんな...

また、以下のように特定の関数だけをフレンドの関係にすることもできます。

//クラス外にある通常の関数GlobalAccessor()をフレンドにします。
class OneInfo {
    friend void GlobalAccessor(OneInfo anyInfo);
        :

実はこのようにフレンドクラスやフレンド関数を使うと、privateで設定したアクセス制限が
破られてしまうので、後のプログラム修正が煩雑になってしまうというデメリットがあります。

フレンドクラスやフレンド関数の使用には十分に注意してください^^;

今日の名言
悩み事は次の三段階の解決策によって克服することだ。
  1. まず最悪の事態を考えてみる。
  2. どうしても避けられないと分かったら、あっさり覚悟を決める。
  3. ついで、気を落ち着けて、事態の改善に取りかかる。
                                   デール・カーネギー

人生は砂時計のようなものだ。砂時計の二つの瓶はごく細い首で繋がっていて、一度に
砂粒一つしか通り抜けられない。
これが人生の真の姿である。たとえ多忙きわまる日でも、仕事のいっぱい詰まった時間は、
一度にわずかずつ姿を現わす。人生はすべてこの通りである。たとえ一日中に取り組む仕事
問題、心の緊張はおびただしくても皆、必ず一度に一つずつやってくる。
                                ジェイムズ・ゴードン・ギルギー

忙しい状態に身を置くという単純なことで、なぜ不安を拭い去ることができるのだろうか?
そのわけは、ある法則 - 心理学が明らかにした最も基本的な法則のためである。
その法則とは、どんなに優秀な頭脳の持ち主であっても、人間は一度に「一つのこと」しか
思考できないというものだ。
                                       デール・カーネギー

2013年10月27日日曜日

いくつかのITセミナーに関する minority report

CEATECやITpro Expoではクラウドのサーバ技術を学んだので、
それに対抗すべくオンプレミスのサーバ技術などについての
セミナーに参加した記録

ちなみに、on-premises(オンプレミス) とは情報システムを自社運用することである。


企業競争力をアップさせるICT基盤への進化 
~事例に学ぶ UNIXサーバ SPARC M10による新たな価値の創造~


戦利品のストラップはデジカメにつけて首から下げられるようにしてみた...

キーワードはモダナイゼーションからイノベーションへ
ためになる情報として、大量のデータを有効活用し、最適化された経営判断を
行う必要がある。また、限りある資源で、どこに注力して事業を進めるのかを
明確にすること、とあった。
そして、基幹システムでの導入事例の紹介があった。
あと、このサーバはLINUXではなく、UNIXを使っているところが大きな特徴らしい。 


Zynq-7000 All Programmable  SoC セミナ 2013



 このチップの説明で覚えているのは
 ARM, 28nm, 2コア, OpenCV代替事例

 一日がかりのセミナーは昼飯付きで
 オトク感がある。
 勉強にもなるし...



協賛各社のブースで、デバッガの出展が印象に残った。
リアルタイムでマルチコアの同時デバッグとか、普通にスゴくないだろうか...
欲しいなICE、一家に一台! (違うか、(-_-;))

あと、画像処理のデモを見たが、合成が不自然だったり、画像がコマ送りみたいに
なっているのがあった。鋭意製作中とのこと、これからに期待がかかる。(^^)
 

Windows プログラミング編 – ASP.NET MVC




スタンプラリーという、にくい演出で
他のセミナーへの参加を促すのだ(^_^;)

都合を付けて、全部埋めたくなる衝動に
駆られる...
 

ASP.NET におけるWebアプリケーションの開発で、新しいMVC
 (Model – View – Controller )パターンによる開発フレームワークも
提供されているという。
ASP.NET MVC でWeb Formとは異なるプロジェクト構造、
異なるコントロールの利用法、そして新しいビューエンジンであるRazorなど、
新しい要素が取り入れられたのだとか。
本セミナーで、ASP.NET MVCフレームワークの基礎と簡単なアプリケーションの
構築、そしてRazorビューエンジンを利用したViewのカスタマイズについて学ぶ。

C#を独学で少し勉強した程度、Windowsの開発業務は経験がないが、
知っておくに越したことはないと思い参加。
非常に分かりやすく、ためにはなったのだが、家で復習するには
環境が異なるので簡単にはいかず断念気味(>_<)
あと、Visual Studio Ultimateが自宅にあったら凄いわな...


HP Scale-Out Solution Day 2013
~無限大の可能性を切り拓く!

超スケールアウトソリューション最前線~


おもしろかったのが、 このHPの焼き印ドラヤキではないだろうか。(^_^;)
コンピュータメーカーと和菓子の異色コラボ...

それは冗談で、サーバラック2Uのサイズで、一枚一枚がサーバとなるカートリッジを
45枚も挿せ、消費電力と省スペースを実現するという発想は驚きだ。
結構ギッチリ詰まっている感があるのだが、冷却にも全く問題ないというのだから
技術の進歩には本当に驚かされる。これでSoftware defined server の具現化だとか。

また、一方でスケールアップを追及した8プロセッサー80コア、4TBのメモリ
16PCI-Expressというモンスターマシンも展示されており、こちらも興味深いところだった。
ただ流石に、CPUのホットプラグというところは技術的に難しく実現できていないとのこと。

あとベンチマーク詳細が分かっていないのだが、AMD社の公演であった
APU(Accelerated Processing Unit) CPU+GPUの統合が目新しいと感じた。

同じ画像処理の話しで、先ほどのカートリッジサーバが1枚で4サーバになって
さらに、DSPもつきますというスゴイ検討機?らしきものも見た。(撮影禁止)
こちらもベンチマークについて尋ねるも、今はデータなしのとこと。今後に期待(^^) 

それにしても、スケールアウトってちっともいい意味に聞こえないのは
私だけ...


総評
SoC、今はマルチコアが当たり前、画像処理なんかも載ったりして
小型、多機能、低消費電力、ますます発展していくので要注目といったところか。

サーバ導入まずは、クラウドとオンプレミスどっちでいくかを
検討するところが第一歩なのか?と思った。

2013年10月21日月曜日

C++ コピーコンストラクタ その1

なんだか怪しいフレーズが飛び出してきました(^_^;)
コピーコンストラクタとは、オブジェクトの生成時に初期化を行う場合に呼び出されます。
あるオブジェクトを生成するとき、既にあるオブジェクトの内容で初期化したい、という
状況があったとします。まさに、このときがコピーコンストラクタの出番になります。
したがって、コピーコンストラクタは引数に初期化元のオブジェクトを受け取ります。^^
では、例をみていきます。

Person psn1;             //Personクラスのオブジェクトpsn1を生成
        :
Person psn2(psn1);    //Personクラスのオブジェクトpsn2を生成
                               //ただし、内容はpsn1で初期化する

ここではpsn2の生成時に、コピーコンストラクタが呼ばれます。
初期化するオブジェクトと同じクラスのオブジェクトであることに注意してください。

別の記述方法として、この様に書くこともできます。

Person psn2 = psn1;    //Person psn2(psn1); と同じようにコピーコンストラクタが呼ばれます。

なお、既にあるオブジェクトに別のオブジェクトを代入する場合は、コピーコンストラクタではなく
operator=() というメンバ関数を呼び出します。 operator=()関数は後述します。(^_^;)

Person psn1;    //Personクラスのオブジェクトpsn1を生成する
Person psn3;    //Personクラスのオブジェクトpsn3を生成する
psn3 = psn1;    //psn1をpsn3に代入する

なんだかごっちゃになってしまいそうですが、要注意です。
初期化と代入は、別だということを理解し、しっかりと区別してください。

コピーコンストラクタの宣言と定義する例
コピーコンストラクタの引数の型は、自分のクラスと同じになります。
また、const形式の参照にします。
        :
class Person {
public:
    Person();
    Person(const Person &psn);    //コピーコンストラクタの宣言
    ~Person() {
        if (m_pName != NULL) {
            delete [] m_pName;
            m_pName = NULL;
        }
    }
private:
    char *m_strName;
};
        :
//コピーコンストラクタの定義
Person::Person(const Person &psn)
{
    //メモリの確保
    //このサンプルでは人名は終端のNULL文字を含め32文字までと決めている
    m_strName = new(std::nothrow) char[strnlen(psn.m_strName, 31) + 1];
  if (m_strName != NULL) {
        //メンバ変数(人名)のコピー する
        strncpy(m_strName, psn.m_strName, strnlen(psn.m_pName, 32));
    }
}
        :
このように、メモリを確保する必要があれは、それを記述しなければなりません(^_^;)
これは、何気ないところですが要注意ポイントです。

なお、コピーコンストラクタを記述しない場合は、デフォルトのコピーコンストラクタが
用意されます。

次回の記事は、要注意ポイントと関連してコピーコンストラクタが必要な場合についてです。

今日の名言
失敗は、ある意味では成功に向かう本街道である。どこが間違っているかわかるたびに
真実とは何であるかを熱心に追求するようになる。そして新しい経験をするたびに、何らか
の誤りが明るみに出てくるから、その後は心して失敗を避けるようになる。
                                     ジョン・キーツ

苦難に勝る教育なし。
                                     ベンジャミン・ディズレーリ

困難にあって倒れるようでは、汝の力はまだ弱い。
                                     旧約聖書の格言

人生でもっとも大切な事は利益を活用する事ではない。それなら馬鹿にだってできる。
真に重要な事は損失から利益を生み出すことだ。このためには明晰な頭脳が必要になる。
そして、ここが分別ある人と馬鹿者との分かれ道になる。
                                     ウィリアム・ボリソー

2013年10月16日水曜日

Windows Azure 概要 minority report

続 セミナー、展示会参加強化月間につき

ITpro expoでAmazonのクラウドサービスを散々みてきたので

今度はMicrosoftのクラウドサービスをみてみる。

というわけで、10/15(火) 19:00 Microsoft 品川本社へ潜入(笑)


台風が近づいているということので、駆け足で終了したセミナーの

ツルっツルの上質そうな紙の資料をさらっと紹介する。

ただし、まさかの筆記用具忘れでメモが取れなかった関係上
間違っているところがあるかもしれない。(^_^;)




若いビルゲイツ...(笑)

もはや、全ての家庭どころか一人一台といってもいいかもしれない。







そして時や場所、機器を選ばす、何でも
ネットワークに繋がる時代が到来した。










デバイスは今後10年ぐらいの間にさらに
急激に増加すると見込まれている。








個人的には目新しかった言葉 geo-redundancy
要は離れたデータセンタ間でもレプリケーション
します、ということらしい。

この場合は、都合6個ということか!?そんなに
あったらまずデータ消失することはないだろう。



 今回一番の衝撃だったのが、この一枚

Microsoftは3より小さいではなく、
Microsoft Open Source Love なんだそうだ。

一昔前なら全てMicrosoft謹製のモノで開発を
行わざるを得ないというイメージがあったが
今では、いろんな所で使えるようにしましょう、
という具合に方針転換したらしい。

何と素晴らしい取り組みか。
笑い話としては、あんなに仲の悪かったORACLEと提携したことだとか。




近頃は、aaSが付き過ぎじゃないだろうか...
何が何だか分からなくなってくる一枚







IaaS(Infrastructure as a Service) 今回イァースと言っているように聞こえた
もの凄くざっくり言うと、開発者側が自分の好きな仮想OSを載せて使うことらしい。

PaaS(Platform as a Service)パース
もの凄くざっくり言うと、開発者側が自分の好きなアプリを載せて使うことらしい。

SaaS(Software as a Service)サース
こちらはユーザ側が必要なサービスを使えるようにすることだ。

Azureでは、IaaS, PaaSを提供しており、ミックスしたのもあるようなことを
言っていた気がする。





で、できることはこんなにある、らしい。








Webサイトを作るデモはチラ見できたが、
ずいぶん簡単にコンテンツをアップしていた。

Windowsの機嫌が悪く!?モタモタしてはいたが。

繋げば、FTP, Visual StudioのDeploy, Gitとかで
いろいろアップロードできますと言っていた。





データベースは結構フェールオーバ
するんですよ~との話があった一枚。







一番熱が入ったプレゼンだった気がする一枚

例として自宅からActive Directoryにアクセス
すると、認証部分は自社のサーバにアクセス
して行い、あとはクラウド上のアプリを使って
仕事できます、シングルサインオンでということを
言っていた気がする。(多分)






 要は買ってください、のまとめ。







総評
台風接近の関係で、デモがかなり端折られたのが実に残念だ。(>_<)
しかし、Microsoft陣営もAmazonに負けず劣らずのいいサービスを提供していると理解。
また、Windows Azure最新情報は引き続きウォッチしていく必要性を感じた。



オマケ
ドリンクはご自由にどうぞという、太っ腹ぶり(笑)














あと、セミナールームは31階(驚)という、高層からのどうでもいい写真


2013年10月14日月曜日

ITpro EXPO 2013 minority report

セミナー、展示会参加強化月間につき

10月9日(水) ~ 10月11日(金)  ITpro EXPO@東京ビッグサイト

新しさに触れたが、まだ答えは見つけていない、の記録












 
このイベントは一言で表現すると

御社の問題解決に、ぜひぜひ我社のITをご検討いただけませんか?の会

である。

そして、クラウドでAWS活用というのが、いろいろなところで言われていた気がする。

世の中には3文字の略語がたくさんあるものだ。

AWSとは? Amazon Web Services のことのようだ。

曰く、クラウド上のサーバを必要な時に必要な数だけ貸してくれるので、

オンプレミスのインフラ構築より、断然オトク!に

自社サービスを展開できるメリットがあるらしい。

そんなわけで今、押さえておくべき旬なキーワードが次の3つである。
  • クラウド
  • ビッグデータ
  • SDN
これは、第3のプラットフォームとして、今後ますます注目されていくようだ。
クラウドはもうおなじみだが、他の2つを調べてみた。

ビッグデータ(ウィキペディア)

もはや従来のシステムでは扱うことが困難な程、巨大になってきているデータ。
MMORPGの一斉ログインやTwitterのバルス祭りも該当する。(笑)
これらの処理にクラウドのサービスを活用するというビジネスが必然の流れである。
ミニセミナーでは、ジョン・スノウの調査結果によるコレラ収束エピソードに紐付け
ビッグデータの活用を分かりやすく説明していた。


SDN(atmarkIT)

Software Defined Network といって、もちろんアイドルグループなどではない。
最後のNは、 他の文献をみると Networking となってたりもして、
Networking or Network の一体どっちやねん!
どうやら、ソフトウェアでネットワークインフラの一元管理を行うことらしい。
これまでは、サーバ追加一つにしてもネットワーク機器ごとの設定、物理構成を
変更していたので管理者はかなり大変だった。そこに仮想化も含めると尚更だ。
それが画面一つで、簡単に設定・変更できるというのだから、本当に驚きである。
まさにクラウド様様だ。

こうしてIT基盤が、クラウドへと進化していくパラダイムシフトの
真っ只中にいるのです、と力説していた。


その他に気になった語句
UEFI(Unified Extensible Firmware Interface)
従来のBIOSに変わる、新しい基本プログラムのこと。
起動高速化、2TBを超えるHDDブート可能、等々いいことずくめのようだ。

MDM(Mobile Device Management)
セキュリティの観点から、スマホやタブレットの一元管理を行うこと。

NIer(Network Integrator)
通信ネットワーク構築から運用、保守までを一括して請け負う業者のこと。
言葉として知ってはいたものの、エヌアイアーと略されたら???だった。

SIer(System Integrator)
情報システム構築から運用、保守までを一括して請け負う業者のこと。
言葉として知ってはいたものの、エスアイアーと略されたら???だった。

Gartner
この会社の調査結果があると、その製品はかなりの信頼性があるということのようだ。
IT分野の格付け会社のようなものか!?


スゴい、感じたこと
MITSUBISHIの参考出展でハンズフリー認証技術で、首から下げたタグで複合機が使える
というのがあった。従来のように複合機にわざわざカードをかざさなくて済むのだから、
まさに痒いところに手が届くサービスだと思った。
実用化済の入退室管理を応用、こうした何気ない一手間を省く工夫がいいね!である。

あと一歩、と感じたこと
別のブースでBYODで勤怠入力というサービスがあった。こちらはサーバが管理する
データには位置情報も載るので、法的にも有効な客観的データとして活用、不当な労働が
なくなるという類の説明があった、ような気がする。(あまり覚えていない)
まさに客先常駐でソフトウェア開発を行うような自身のスタイルに当てはめるとぴったり
という説明だった、と思う。 しかし、各自の端末のブラウザから入力するのなら、
自席で勤怠システムにアクセスして手入力するのとさほど変わりがないように感じた。
結局、最終的にどこかのマスタと照合するのは人チェックが必要なのだろうと思ったり
どうも先ほどのハンズフリー認証と組み合わせたり、さらに客先-自社間の勤怠管理
までもが連携すると、より良いサービスとしてアピールできる気がしてならない。


せっかくなので、参加したセミナー写真の一部を掲載。




Duncan Campbell(Vice President) のインフラ話

ランチボックスという名のお洒落な昼食付 !







 自動化≠スクリプト化

 重要なのは自動化のための共通化(標準化)







今やるべきはSDNへの移行ではなく、 

SDNへの準備を粛々と進めることが正解の様子





今回は展示会メインで攻めてみたので、セミナー写真は極端に少ない。。。
事前登録が遅かったため、ほとんどのセミナーはWebからの申し込みが終了していたが、
実は全部当日申し込みでも入れたりしたのではないか、と思った。
いくつかは断念したというのに!

あと、初日はももいろクローバー Zが来ていた。
17時30分ごろから、メインシアターで報道陣向けのインタビューをしていたので
それほど混雑していなかったこともありチラ見。おぉ、あれが芸能人か...
ちなみに、撮禁のため写真なし。
 
ipod miniやら、タブレットやら、プリンタやらメガネやら、たくさんの抽選会があって
ほんのちょっとだけ期待するも、何も当たらなかった(^_^;)

こうして、各社3日間で集めたアンケートというビッグデータは、提案している得意の
クラウドにある多数のサーバが分析し、また次のビジネスにつなげていくのだろう。
ふとそんなことを考えた。

それにしても、HPの大盤振る舞いがハンパない!!

  
総評
展示されている各ソリューション、たとえ自社で活用する機会がないとしても普段考えも
しない最新の様々な情報技術について学ぶことができる。
ついにここまで来たか、という技術の進歩を目の当たりにして、驚きのあまりゾクゾク
すること必至。^^
ただし、セミナーを受けるにも、ノベルティをもらうにしても、とにかく名刺が必要となることが
多く大量に用意しておかないと、すぐに無くなっていちいち手書きになる。かなり面倒(>_<)
名刺がないなら、ノベルティやんないもんねっというケースもあった。

あと超大量に配布されるパンフレットの類を持ち帰らせるべく、袋はたくさん手に入る。
しかし、コンパニオンの方々が美人だからと全てもらっていては荷物が増えて大変だ...

また、CEATECとは違い、ブースにいる彼らは商談の流れに持ち込む気満々だ。
あまり興味本位で近づいても、結構去り際のタイミングが掴みづらくなってしまう。
本当に用がある場合を除き、何かこの辺のことについてご興味でも、などど言われた時は、
早めに魔法の言葉 『いろいろな情報収集の段階です』 で立場を明確にしておくと吉。

かなりの重量になるパンフレット&ノベルティを持ちながら、会場内をグルグル歩き回る
体力が必要なのは言うまでもない。
まったくの余談であるが、幕張メッセのようにトイレの個室に困ることがないように思った。



オマケ
先日のCEATECで見かけた美人さんを本会場でも発見!!
これは運命か!?の勇気を振り絞っての一枚。(笑)
撮影条件が非常に悪く、素敵さが十分に伝わらない...(+_+)




  仕事柄いろいろな所に出没するそうです。^^

2013年10月13日日曜日

C++ コンストラクタの応用

クラスの中には、複数のコンストラクタを作ることができます。^^
こうすると、複数の方法でオブジェクトの初期化ができるようになります。
オーバーロードの機能を使って、クラスの中に複数のコンストラクタを定義する例を
見ていきます。

class PeachBox {
public:
    PeachBox();                           //引数の異なる二つの
    PeachBox(int num);                //コンストラクタを宣言する
        :
};
        :
PeachBox::PeachBox()               //引数のないコンストラクタ
{
    m_total = 0;                           //変数m_totalを0で初期化する
}

PeachBox::PeachBox(int num)    //引数を一つ持つコンストラクタ
{
    m_total = num;                       //渡された引数を変数m_totalに代入する
}
        :
        :
int main(void)
{
    PeachBox myPeachBox1;          //もちろん引数なしの方のコンストラクタが呼ばれる
    PeachBox myPeachBox2(5);      //こちらは引数ありのコンストラクタが呼ばれる
        :

つぎに、動的にオブジェクトを生成する場合の例です。
引数を持つコンストラクタを呼び出して、動的にオブジェクト生成する場合は
以下のようになります。

class PeachBox {
public:
    PeachBox();
    PeachBox(int num);
        :
};
        :
        :
int main(void)
{
    //どちらも引数ありのコンストラクタが呼ばれます^^
    PeachBox myPeachBox1(12);
    PeachBox *pPeachBox2 = new(std::nothrow) PeachBox(6);
        :

このように引数の型と数に対応したコンストラクタが呼びだされます。
さすがC++といったところでしょうか(^_^;)

デフォルトコンストラクタ
コンストラクタは必須ではありませんので、プログラム中にコンストラクタを記述しないという
ことも可能です。その場合は、何もしないコンストラクタが自動的に用意され
呼び出されています。これをデフォルトコンストラクタといいます。
なお、デフォルトコンストラクタは、引数を持ちません。

今日の名言
兄弟よ、困難は偉大な心を育てる乳母である。この厳しい乳母は、揺り籠を手荒く
揺すって、その養い児をたくましい、均整のとれた体の子に育て上げるのだ。
                                 ウィリアム・カレン・ブライアント

熱中は単なる上っ面だけのモノでなく、内面から働きかける。熱中は、自分の
取り組んでいる事柄の何かある一面に心底からほれ込む場合に、生まれてくる。
                                 デール・カーネギー

あらゆる失敗は成功に向かう第一歩である。どこが間違っているか判明するごとに、
我々は真実に向かって一歩ずつ進む。一回経験するごとに、うっかり犯してそうな
失敗が一つ姿を消す。それだけでなく、何かを企てて完全に失敗に終わる事は、
めったにない。また、じっくり考えて得た理論であれば、どんな理論でも完全に誤って
いるということはない。うっかり犯しそうな失敗にも、真実を探求して得られる魅力が
必ず潜んでいる。
                                 ウィリアム・ヒューエル

2013年10月8日火曜日

CEATEC JAPAN 2013 minority report

最先端IT・エレクトロニクス総合展 CEATEC に行った

数々の素晴らしい技術に感銘を受けたとともに、無限の可能性を感じ

ビジネスの本質を垣間見たような気がした記録


10/2(水) 雨
スマート社会のインフラとなる通信技術


IT・エレクトロニクス産業は自動車業界と並ぶ
日本の基幹産業である。

小型化から、高信頼性、複合化、薄型化へ

医療・ヘルスケア分野 市場規模の拡大が見込まれる事業

今後伸びそうな国:ブラジル、ロシア、インド


サービスの多様性とトラフィック量の増大
2007年から2017年でおよそ200倍程になると見積もられている

暮らしのあらゆる危機に通信機能が導入される
 ・AUTOMOTIVE(車車間通信、都車間通信)
 ・HEALTHCATE & MEDICAL
 ・ENERGY & ENVIRONMENT

MiraCAST スマホとナビの画像情報共有

人口増加に伴い、インターネット接続ツールも増大
センサと無線の融合


ソフトウェアの信頼性向上に向けた取組


様々なサービス・製品がつながり、何の不安もなく
自在に活用できる新たな社会を実現する。

拡大するリスクからの想定外のダメージを防ぐ
ために見える化、測る化  
実現すべき信頼性、セキュリティの
目標を共有する



ソフトウェアを含む情報処理システムの特徴
ソフトウェアは目に見えず、プロジェクトの状況も目に見えない。
そのため利用者はソフトウェアの品質を確認できない。

適切な開発プロセスと技術的な根拠を事実に基づき説明し、
品質目標を満足していると示す必要がある。

情報セキュリティ サイバー攻撃で急増するインシデント

組み込みソフトウェアとは、固有の機器の機能を実現するソフトウェアである。

開発の課題
設計品質向上、開発コスト低減、開発期間短縮、生産性向上

製品出荷後の不具合の47.6%がソフトウェアの品質不具合


ソフトウェア品質の見える化「PSQ認証制度」


ソフトウェア品質特性を満たしていることの
指標のひとつとして
PSQ認証を取得しませんか?という話であった。
これは日本発の取り組みで、
導入実績はまだ少ないようであった。





サイバーフィジカルとメニーコアが創出するイノベーション



人、機械、社会の調和

マルチコア:コアを数個並べる、周波数は上げない
メニーコア:コアを数百から数千個並べる、周波数は下げる

自動車の自動走行実験
ライフ、グリーンイノベーションを起こす


コンピュータ(ハードウェア)の遷移 ワンルーム→ワンボックス→ワンチップ
クラウド化、ビッグデータの取り扱い

メニーコアでの並列処理についてforの2重ループを実際にどのように
処理しているかを質問しそびれた...


組み込み系ソフトウェア開発の課題分析と提言
~日本の組み込み開発を成功に導くアーキテクトとは?~(JEITA調査結果報告)



いつ本題に入ったのかがわからない...アーキテクトという単語を連呼していたが、
そもそもアーキテクトとはという話があってもよかったのではないかと思う。
組み込みアーキテクトは重要です。アーキテクチャー設計をしないとプロジェクトが
うまく回りませんよ、という話だったような気がする。






で、帰りは雨もやんでおり、虹が出ていた。^^






10/3(木) 晴れ
IEEE GCCE基調講演「Future Directions of CE」 / 「時計か?めがねか?」



講演そのものは英語だが、同時通訳機でさらに
英語を聞いてリスニング強化を目論んだ。
スライドがあるとはいえ、
もちろん理解しきれるわけはない (^_^;)





My Car, My Way  スマホと連携したナビで Hybrid Cloudという構図が来るらしい。
Mobile Driver ←→ Internet Cloud
           ↑        ↑ 
           ↓        ↓ 
            Personal Cloud

Automated driving
Consumer Health

なぜか4K/8Kってどう思うみたいな、それは講演内容から逸れたことを聞いているのでは
という質問が出ていた。
少なくともスッゲェ魅力的という回答はしていたんじゃなかろうかとは思う。

The Future is Waiting for us!   だそうだ。

そして次に、沢山のウェアラブルデバイスを身につけている大学の先生の講演があった。
Wearable Computing展望
 ・Action Car           
 ・Bracelet type        activity tracker
 ・Google Glass        HMD
 ・Apple iWatch?   Smart Watch
 ・Another Genre      Life Log

課題
 ・痛くならない、熱くならない
 ・バッテリーは一週間以上長持ち
 ・耐久性 衝撃、防水
 ・充電のタイミング

大事そうな!?キーワード
デバイス連携
 スマホ、HMD、ウェアラブル、クラウド
Augmented Reality(拡張現実)

解決すべき課題
 ・安全性の問題 身につけることで注意力が散漫になりはしないか?
 ・社会問題    何でも映像で記録できる。撮られたくない人やモノに対してどうする?

個人的には時計だろうと思っていたが、結局どっちもというのなら、
時計か?めがねか?などという究極の選択を煽るような書き方は
やめてもらいたいですな。(見事に引っ掛かった)

今のスマホと時計の連携が、時計とめがねの連携に移り変わっていくだろうとのまとめ。


4Kソリューション:ローデ・シュワルツからの提案



ハイビジョンからスーバーハイビジョンへ
 ・4K2K(4096x2160) 12Gbps at 60fps
 ・8K(7680x4320) 48Gbps at 60fps
8Kもの映像という情報量の多いコンテンツを
どのように伝送するかという、
伝送方式が課題となっているようであった。
そして新しい圧縮技術として、HEVCの存在を知る。 
なんと、8Kの48Gbpsもあるデータが75Mbpsにまで圧縮されるようである。


iPhone5Sの指紋認証やコンテンツ保護に活躍するTrustzone



Trustzoneとは?
ペリフェラルのリソースにセキュアモード専用属性を持たせ、ユーザモード動作時の
アクセスに制限を加えることができるシステム

機器がネットワークにつながる時代になり、
セキュリティが重視されるようになった。


アプリケーション開発における問題点
 ・外部からの脅威 ウイルス、 不正アクセス 
 ・内部の脅威    不正コピー、 誤操作、 リバースエンジニアリング
 ・外部への流出  個人情報

ハイパーバイザー構成
例えば、LinuxとμITronという具合にそのシステムでOSを2つ動かし、セキュアな情報処理は
信頼性のあるμITronでのみ扱い、それ以外をLinux側が担当するというものであった。

実際にブースまで行き、車載メーターのデモを見た。
速度や燃料の残量といったデータ取得をμITron側が制御し、それをGUIで表示制御するのが
Linux側というものであった。たとえ、何らかのトラブルでLinux側が落ちたとしても、表示は
一時的にチープになるが、システムとしては生き残っているため、μITronがLinuxを再起動し、
計器類が正常な表示に戻るという仕組みを実現できるとの説明を受けた。

既に、似たようなシステム開発を経験していたが、そのときは気付かず、ただスゴいと思った。


10/4(金) 曇り
V-Lowマルチメディア放送 1day コンファレンス



何も知らずに参加したため、そもそもV-Lowとは何か?という疑問がずっとあった。 
後で調べて、超短波(VHF:Very High Frequency) のLowバンドのことであると判明した。
要は、地デジに移行が完了し、今までアナログで使用していた帯域を有効活用しようという
計画が進んでおり、大分準備も整ってきましたので、このビジネスに参入しませんか?
みたいな話だった。
V-Lowは地方ブロック向けのラジオのデジタル化をサービスとして
提供するらしかった。ちなみに、V-Highの方は既にNOTTVとしてサービスが提供されている。 
 
おもしろかったトラフィックの話 
技術開発で回線が太くなっても、いずれコンテンツが充実してくるとまた回線が詰まる。
その対策として、新しい技術を開発するが、もっとリッチになったコンテンツでまた回線は詰まる。
このいたちごっこが繰り返され進歩していく。

大事そうな!?キーワード
通信と放送の融合
放送の三要素(インフラ、ソフト、受信端末)


これ以上聞いてもどうかと判断し、午前中で退席、あとは展示会の方を楽しむ。
こうして、3日目にしてようやくブースをじっくり回ることができた。


総評
やはり目を惹くのが、大手各社のテレビ事業についてである。
あまりの映像美に魅了された。



スマホやタブレットをいじるのはもちろん、ジャイロセンサによる不倒ロボットを見たり、
ピエゾ素子のスピーカを手に当て音の出力を確かめてみたりもした。



また、セロファンのような極薄ガラスのロールや、見えないガラスの展示はとても興味深かった。
そして、これもビジネスになりえるのかと思う、よく分からない小さな部品やコネクタ、検査機構。
とにかく見どころ満載、 貴重な体験もでき、一日中居ても飽きることはないのではと思った。

コンファレンスはどちらかというと経営責任者向けの宣伝色が強いので、
技術者ならば参加するものを厳選し、展示会メインで攻めるのが吉。

魅力あるブースが多数あり、色々見て回るためには、一日ではとても時間が足りない。
それこそ、ディズニーランドのアトラクションを効率的に回るような計画性が必要かもしれない。

また、感動を記録するデジカメと広大な会場を歩きまわるための体力が必須である。




オマケ(^_^;)