9-Laboratory

090630小言。

29.06.2009 (9:02 pm) – Filed under: temp ::

C++を触れない状態なのに、「C++FAQ」を読み直していた。
仮想関数のポリモフィックさが同じに保たれない場合があるみたい。

/**/
class Base
{
public:
	virtual ~Base()
	{
		puts("~Base()");
		Func();/*これは何を呼ぶ?*/
	}
	virtual void	Func()
	{
		puts("Base::Func()");
	}
};
/**/
class Deri1 : public Base
{
public:
	virtual ~Deri1()
	{
		puts("~Deri1()");
		Func();/*これは何を呼ぶ?*/
	}
	virtual void	Func()
	{
		puts("Deri1::Func()");
	}
};
/**/
class Deri2 : public Deri1
{
public:
	virtual ~Deri2()
	{
		puts("~Deri2()");
		Func();/*これは何を呼ぶ?*/
	}
	virtual void	Func()
	{
		puts("Deri2::Func()");
	}
};
/**/
int main()
{
	Deri2 d;
	d.Func();/*これは間違いなくDeri2::Func()を呼ぶ*/
	puts("start destruct");
}

子のデストラクタが呼ばれた時点で、その子は仮想関数のリストから削除されているという事らしい。
そりゃあ、子が消えた状態で子を呼べてしまったら不味いですね。
#別にこんなことは知らなくても良さそうではありますが。

090629小言。

29.06.2009 (12:34 am) – Filed under: temp ::

今に始まったことではないけれど、このブログ、reblogが多すぎでないかと。
ので、reblog的行為は今後減らします。参照とかはするけど。

090628小言。

28.06.2009 (2:48 am) – Filed under: temp ::

bionic_commando_new

リスタートの位置は確かに腹が立つが、それを補って余りある程丁寧に作られた作品。
BionicComando」のキャンペーン、クリアしました。イージーだけど。

以下、多分ネタバレの可能性があるので注意。
more »

090627小言。

27.06.2009 (3:08 pm) – Filed under: temp ::

ためになりそうなので紹介。

・直感的である。
・シンプルである。
・間違った使い方をしづらい。
・副作用が無い。
・矛盾が無い。
・よく枯れている。
API Principles:LightSleeper

あと考えられるのは、
・書式やコンセプトが統一されている。
・間違って使っても何とかしてくれる。
(090628追記:一概にそうとも言えないか。なんらかの方法で、間違いを指摘してくれるとかの方が適切か。)
とかか。

090625(2)小言。

25.06.2009 (2:08 pm) – Filed under: temp ::

飽きっぽい人達: オタク商品研究所plus
わかります。
自分の適応力の問題もあるんだけど、この手の潮流の変化はどうも目まぐるし過ぎるような気がする。
作り手側がこれと決めたものを、ずっと丹念に作り続ければそのうちみんなわかるかも知れないと妄想。

供給が追いついちゃう(いろんなものを簡単に出せちゃう)から、「真新しさ」に対しての消費側の感覚が薄れちゃって
浮動層ができてしまうのかなぁ?と今思った。

#例えばゲームとかだとアニメ作品などに比べればホイホイとはだせないから、
#結果的に大体同じような潮流がずっと続いているとか?

090625小言。

25.06.2009 (1:04 pm) – Filed under: temp ::

mmioとか滅多につかわないのだけれど。
PlaySound(xxx, SND_MEMORY | SND_ASYNC) is almost always a bad idea.
Windows 7 fixes the PlaySound(XXX, SND_MEMORY|SND_ASYNC) anti-pattern

PlaySound(,SND_MEMORY | SND_ASYNC );はよろしくないらしい。

SND_MEMORYは、メモリから再生するのだけれど、WaveのAPIから読んだものでなくても、
良くてAPIユーザのメモリのポインタを渡すこともできる。
SND_ASYNCは、非同期で再生を行う。例え前の音声を再生中でも呼び出しを即座に帰す。
つまり実際の終了タイミングを知る方法もない。

で、この二つを同時に使ってしまうと、実際に再生が終了するタイミングがわからないものに
メモリを渡しているので、運が悪いと再生中の音源のメモリを解放してしまいクラッシュしてしまう。
解決策としては、PlaySound(NULL,0,0)をそのメモリの解放前に呼べば
本当に再生が終わるまでブロックしてくれるので、これから戻ってきたときに解放すればいいらしい。

この手の「APIの実装に依存するコード」はかっこよくないと考えたのかは知りませんが、
Windows7の実装からは、バッファのコピーをAPI内部で持つようにしたので安心安心。

というWindows7の宣伝。

090624小言(2)。

24.06.2009 (10:52 pm) – Filed under: temp ::

体調が思わしくなさ過ぎるので、紹介だけして寝る。
Dan Kogai さんの404 Blog Not Found にてLua本が紹介されている模様。
なんてめんこい言語 – 書評 – 入門Luaプログラミング

090624小言。

24.06.2009 (6:33 pm) – Filed under: temp ::

fatal error: method definition not in @implementation context – macosx.com
「method definition not in @implementation」とか出るんだけど意味がわかりません。
→循環参照じゃね?
→id使えば解決さ
→お前ら、idで誤魔化さずにちゃんと型つけて返せよ。。。

なんかgccが出すObjectiveCのエラーは問題の本質がわからなくするようなエラーばかり出す気がする。
確かに循環参照しているときは面倒なのでidにしたら何も考えずには済みますが。

Hoge* hoge = [[[Hoge alloc]init]autorelease];
id*hoge2 = hoge;
[hoge2 func];/*Hogeにfuncがあったらこれでいけちゃう*/

この手のダックタイプ的なコードとかって個人的には好きではないのです。
・protcolが実装されていない場合。
・implementsがちゃんと入っていない場合。
・型に存在しないプロパティ、関数を呼ぶ場合
は問答無用でコンパイルを止めて欲しいものです。

BestSoftwareWriting では、動的言語であろうが、静的言語であろうが関係なくて、
テストをいかに堅牢に作成するかが鍵です。みたいなことを書いていましたが今は
あんまり信用していなくて、関数のシグネチャが変わったとき等はちゃんとコンパイラは
全てに対して警告を出すべきだと思うようになりました。
シグネチャが変わった際にそれが影響を受ける実装部は宣言部分からは明らかではないから。
結局記憶力便りになってしまっている気がする。

オチ無し。

追記:
じゃあどうやって解決しているのさ?という話です。
余りキレイだとは思えないかもしれませんが、
・ヘッダには構造体orプロトコルをimportする場合に限りimportを書く
・そうでない場合は全て前置宣言で済ます。
・ヘッダのimportは.m内でのみ行う。
こうすると各.mがimportだらけになってしまいますが、
大してコンパイル速度が落ちるということは無いのでひとまずこれでといったところ。

090620小言。

20.06.2009 (10:29 pm) – Filed under: temp ::

mein_fuhrerimge7fddccdzikfzj

DEFIANCE」と、「わが教え子、ヒトラー」を観て来ました。

〇わが教え子、ヒトラー
・Adolf Grünbaumって知ってる?という内容。
確かにググッても同姓同名の心理学者しか出てこないなぁ。
・残骸(セット?)がすげぇぇぇ。画としてキレイ。
・ちょっと可愛くし過ぎでしたが、要所要所でメリハリが利いていた。
〇DEFIANCE
・ユダヤ人の戦闘力の高さに笑った。

#実はこのあと、能楽を観に行ったので、一日で合計6H近く「座って観てた」と。疲れるわけだ。

090619小言。

20.06.2009 (12:41 am) – Filed under: temp ::

5124qyiZE2L

OO用語に、SRPというのがあるけれど、それを判定する怪しげな方法が
HeadFirst オブジェクト指向分析設計」にあったので紹介。
クラス宣言が次のようなものだとする。

class Enemy
{
	/*走り出す*/
	void Run();
	/*ダメージをを受ける*/
	void Dameged();
	/*レベルアップする*/
	void LvUp();
};

このとき、「[クラス名]は自分自身で/を[メンバ関数名]する」と読めることができたらそれはSRPを満たしているそうな。
Enemyは自分自身を走らせる。 OK
Enemyは自分自身をレベルアップする。 OK
Enemyは自分自身をダメージを受ける。 NG?
う~ん。。。微妙かも。
#この書籍の内容の数割が、プロパティをstd::map<string,string>にして
#オールオッケイでしょ的なノリだったり今一信用できないんだよなぁ。