[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/14 14:02 / Filesize : 217 KB / Number-of Response : 865
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part71



1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part70
pc12.2ch.net/test/read.cgi/tech/1244942050/l50

34 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 21:52:10 ]
C++の入門書の通り、mainに
cout<<"Hello, world"
って書いたらいきなりコンパイルエラーがでて笑った。
ちょっと調べたらusingでstd::を省略できることはわかったけど、
そうすると全てのstd::の名前空間が含まれてしまうらしいなw

C++って仕様がちょっとマヌケすぎないか?

35 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 21:58:59 ]
その入門書がマヌケなだけ

36 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 21:59:11 ]
using std::cout;でおk

37 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 22:18:27 ]
ろくに知らないのに馬鹿な発言して恥をかく典型。

38 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 22:21:25 ]
>>34
背伸びをするのも時には必要だもんね。



39 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 22:24:47 ]
そのクソ入門書がこれ以上売れてしまわないように書名を晒すのが君の義務だ

40 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 22:25:11 ]
数時間かけて
その入門書片手にくだらないレスを考えていたんだろうから
バカでも許してやろうぜ。

41 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 23:02:29 ]
GetRand()関数について質問させてください。
0〜100の乱数の中のひとつがほしいときは、
GetRand(100)
で受け取れるんですが、100〜200の中の乱数がほしいときは
どのように記したらいいんでしょうか。
どうやっても出来ないんで、誰か助けてください。

42 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 23:09:46 ]
GetRand(100) + 100で問題あるの?



43 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 23:13:41 ]
>>42
思いつかなかったんだろうな

44 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 23:26:34 ]
すみません、知識不足すぎました。
GetRand内だけで済ませようとした自分がアフォすぎました。
低レベルすぎてすみませんでした。
お騒がせして申し訳ありませんでした。。。
では。

45 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 01:56:33 ]
アフォすぎたとへこむより、そう考えるのかーと思えないとなぁ

46 名前:デフォルトの名無しさん [2009/07/23(木) 19:50:07 ]
#ifndef HOGE_H
#define HOGE_H
#endif HOGE_H

ヘッダーのインクルードガードの#endifにマクロが記述してあるコードを見たんですが、これってどうなんですか?
どういう役割があるのか、やった方がいいのか悪いのか、誰か解説して下さい。


47 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 19:59:35 ]
どういう意味もない。無視される

48 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 20:08:25 ]
無視されることは決められてるの?
#endif //HOGE_H
というスタイルは割と見る

49 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 20:18:51 ]
無視はされないだろ
普通に#defineが何度も定義されるだけだと思うが

50 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 20:28:44 ]
詳しくお願いします。

51 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 20:31:06 ]
>>48
#ifndef HOGE_H
#define HOGE_H ←ここでHOGE_Hを#defineしてるから
#endif HOGE_H ←ここのHOGE_Hは空白に置き換えられる


52 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 20:33:50 ]
>>51
あ、そうかw

>>49は勘違い?



53 名前:49 mailto:sage [2009/07/23(木) 20:36:56 ]
勘違いでしたすいませんorz

54 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 23:40:56 ]
実装方法のスタンダードを教えてください。

自分で作ったクラスに、
 「WM_PAINT時に動かしたい paint メソッド」と、
 「WM_CREATE時に動かしたい create メソッド」と、
 「WM_CLOSE時に動かしたい close メソッド」
があるとします。
今までは、特定ウィンドウのメッセージループでいちいち
paint 等を呼び出していましたが、サブクラス化できるように
構成を変えたいと思います。

サブクラス化する手法として、もっとも一般的な実装方法を
ご教授ください。


55 名前:54 mailto:sage [2009/07/23(木) 23:42:15 ]
すみません、語弊がありました。

×サブクラス化する手法として
○サブクラス化するためのインターフェイスの手法として

よろしくおねがいします。

56 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 02:09:55 ]
>>54
その自分で作ったクラスから派生させるなり、
paint,create,closeを持ったインターフェース用意してそれを呼ぶようにしたりしちゃダメなの?

57 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 02:30:41 ]
いやいや、SetPropとかSetWindowLongPtr使えってテンプレ回答では?

58 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 13:30:12 ]
>>57
そういうことか
メッセージループでswitch文書きたくないのかと思った

59 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 14:30:01 ]
 ある関数void foo(unsigned int num)内の出来事。
 引数numに格納された値を使って、
 char* array = new char[num];
 として確保して使いたい。
 ところが使用後(fooスコープを脱出後)には自動的に破棄されるようにしたい。

これを実現するのに一番簡単な方法は何でしょうか?
デストラクタを利用して出来そうな気がするのですが。
よろしくお願いいたします。

60 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 14:35:52 ]
std::vector<char> v(num);
char *array = &v[0];

61 名前:59 mailto:sage [2009/07/24(金) 15:01:42 ]
>>60
なるほど、vectorの内部の配列は連続していることが保証されているというのを使うわけですね。
ありがとうございました。

62 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 15:04:43 ]
#include <boost/scoped_array.hpp>

boost::scoped_array<char> s( new char[num] );
char *array = &s[0];

これだとダメかな?
知ってる人いません?




63 名前:62 mailto:sage [2009/07/24(金) 15:13:36 ]
char *array = s.get();
でしたね。
失礼。

64 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 15:56:38 ]
後でサイズ変更しないならいいんじゃねぇの

65 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 16:12:04 ]
int型のベクターの初期化で楽な方法ってありますか?
int配列はint a[]={1,2,3}みたいにかけるので
今は一時的にint配列をつかってこんな風にやってるんですが

vector<int> v;
int d[]={1,3,2,5,6,17,8,0,2};
copy(d,d+sizeof(d)/sizeof(d[0]),back_inserter(v));


66 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 16:17:38 ]
vector<int> v(&d[0], &d[sizeof(d)/sizeof(d[0])]);

67 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 17:03:00 ]
ありがとうございました

68 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 20:17:36 ]
boostにそれ用のコーポネントがある。
boost::assignでぐぐれ

69 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 20:55:51 ]
C++ code - 39 lines - codepad
ttp://codepad.org/6eGTAvJT

ここにある関数
call_display_1(&d);
call_display_2(d);
call_display_3(d);
のうち、call_display_1とcall_display_3はdisplay()が仮想関数として
定義されているので挙動は理解出来ます。
call_display_2(d);
は、引数をconst参照で受け取っていますが、これでも仮想関数は必ず有効で
標準出力に"Derived Class."が出力されると保証されていますか?

「参照はポインタを使って実装されている」
と聞いたことがありますが、こういった実装上の理由ではなく、
標準C++の仕様上確かに保証されていますか?


70 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 22:16:23 ]
はい

71 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:46:26 ]
色々やってみたけど結局templateでjavaジェネリクスのextends条件はできませんでした。

72 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:41:50 ]
こんなのどうよ
class A {};
class B : public A {};
class C {};
template <typename T> class X {
public: X(){
T *t = 0;
A *a = t; // Aの派生クラスでなければここでERROR
}};
int main() {
X<A> a; // OK
X<B> b; // OK
X<C> c; // ERROR
}



73 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:51:32 ]
>>71
じゃあJavaに変えると良いよ。
スレ違い。

74 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:56:28 ]
Boost.ConceptCheckのConceptAssertとTypeTraitsのisBaseOfでできるな

75 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:56:40 ]
// boostだとこうなる。参考書丸パクリだが
#include <iostream>
#include <typeinfo>
#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>
template< typename sub_class, typename super_class, class = void >
class X{
public: X()    { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型ではありません。") << std::endl;}
};

template< typename sub_class, typename super_class >
class X< sub_class, super_class, typename boost::enable_if< boost::is_base_of< super_class, sub_class > >::type >{
public: X()    { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型です。") << std::endl;}
};

struct A{};
struct B : A{};
struct C{};

int _tmain(int argc, _TCHAR* argv[])
{
    X< B, A > x0;   // strect Bは、strect Aの派生型です。
    X< C, A > x1;   // strect Cは、strect Aの派生型ではありません。
    return 0;
}

76 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:17:15 ]
>>71
C++のtemplateは黒魔術だから、大抵何でもできる。
というか、お前釣りだろ?w
alfalfa.livedoor.biz/archives/51489493.html

最近、知ったか房みてるとどうしても↑に思える

77 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:43:04 ]
>>76
まさに真理だなw

黒魔術というか、テンプレートメタプログラミングはチューリング完全だから
効率を気にしなければ他のプログラミング言語で実現出来ることは何でも出来る。

78 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:04:03 ]
>>77
むしろ実行効率は良いという、恐ろしいことが証明されているんだよね。
ただし開発効率は発狂物だろうがww

79 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:11:28 ]
という事は超頑張ればコンパイル時にMP3を鳴らす事も!・・・

80 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:12:55 ]
>>79
本当にやってるヤツが世界にはいるのではないだろうかw


81 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:15:58 ]
C++ code - 169 lines - codepad
ttp://codepad.org/0JbIj2qe

ここにあるコードを
Windows XP HomeEd SP2
g++ (GCC) 3.4.5 (mingw special)
でコンパイルして実行したところ、
「実行時エラー」
になりました。
本来は上記のサイトにあるようにコンパイル時エラーになって欲しい物ですが、
どうして実行時エラーになってしまうのでしょうか?

ちなみに意図的にコメントアウトしてある
// friend bool operator == (const MyInt& lhs, const MyInt& rhs){return lhs.num==rhs.num;}
の部分をコメント解除すると問題無く動作するようになります。


82 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:07:19 ]
初心の者ですが、派生クラスのコンストラクタで悩んでいます。
派生クラスのコンストラクタをクラスを定義するスコープの外で定義することは可能でしょうか。

class Base {
private:
int x;
public:
Base(int x);
};
Base::Base(int x)
{
this->x = x;
}

class Derived : public Base {
private:
int y;
public:
Derived(int x, int y) : Base(x);
};

Derived::Derived(int x, int y) : Base(x)
{
this->y = y;
}
ではコンパイラから叱られてしまいます。どのように書けばいいのでしょうか。



83 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:20:49 ]
public:
Derived(int x, int y);

84 名前:69 mailto:sage [2009/07/25(土) 20:14:00 ]
>>70
ありがとうございます。

85 名前:81 mailto:sage [2009/07/25(土) 20:16:29 ]
自決しました。

どうやらコンパイラ(g++ (GCC) 3.4.5 (mingw special))の仕様のようです。
バグって言い切っていいのかは分かりませんが。


自決方法
  Windows XP HomeEd SP2
  g++ (TDM-1 mingw32) 4.4.0
  この環境でなら問題無く動作するようになります。


86 名前:71 mailto:sage [2009/07/25(土) 20:30:16 ]
>>73すみません
>>74-76ありがとうございます。そしてごめんなさい。
使用コンパイラがbcc5.5なのですが、is_base_ofの中核部分だけを取り出して
コンパイルした結果、bccではうまく判別できず、VC2008ではうまく判別できました。
どうやらbccでは定数の初期化式に関数の呼出し等があると、コンパイルは通っても
値は0?とかになってしまうようです。だめですね…

87 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 20:39:40 ]
>>85
死ぬな死ぬなw

88 名前:82 mailto:sage [2009/07/25(土) 21:42:32 ]
>>83
ありがとうございました。

89 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 22:58:33 ]
std::maxのような関数テンプレートは
どの標準ヘッダに定義されていますか??

90 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:09:41 ]
algorithm

91 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:11:15 ]
>>85
いろいろ問題がありそうなコードだけど
コンパイルエラーになることが、
"問題無く動作する"ってことなの?

92 名前:85 mailto:sage [2009/07/25(土) 23:36:04 ]
>>91
> コンパイルエラーになることが、
> "問題無く動作する"ってことなの?
はい、g++としてはコンパイル時エラーで教えてくれる方が
正しい挙動だと思いまして。

> いろいろ問題がありそうなコードだけど
例えばどこが問題でしょうか?





93 名前:89 mailto:sage [2009/07/25(土) 23:37:04 ]
>>90
ありがとうございます!!

94 名前:85 mailto:sage [2009/07/25(土) 23:41:38 ]
>>91
> いろいろ問題がありそうなコードだけど

#define OPERATOR_MY〜〜
などのマクロが登場していることや
public :
int_t num;
の様にメンバが丸裸のpublicアクセス指定されている事

以上2点はサンプルコードだからです。
さすがにこんなクソコードは実務では書きません。

なんか後出しじゃんけんみたいになってしまって恐縮です。
申し訳ありません。

95 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:18:43 ]
自決でビール吹いたw

96 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:52:39 ]
>>87を見るまで気づかなかったw

97 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 03:51:31 ]
自決やべー後からくるわ。

98 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 10:11:31 ]
自決しました
より
自決方法
にじわじわくる

XPとg++でどう死ぬんだと

99 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 14:57:26 ]
未定義動作とか使うんだろうかw

100 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:15:11 ]
鼻から出てきた百足に目を食い破られて死ぬんじゃないかなぁ

101 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:27:56 ]
それ自決じゃない
自決といえばdelete thisだろ

102 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:27:12 ]
>>101
うちの会社でよく見るコードだわ
なんとか動いてるけど恐ろしい・・・



103 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:28:30 ]
delete thisは使い方さえ間違わなければ合法だよ

104 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 18:47:24 ]
>>103
そうなんだけど、よくわからんやつが適当にいじると
そのあとメンバ触ってあぼんぬとかよくあるからさ
おまけにそのデバッグやらされるの俺だし

105 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 19:22:22 ]
今ならコンストラクタをprivateにして、shared_ptr返すファクトリ関数作る
delete thisは過去の遺物だな

106 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 21:55:34 ]
delete thisって何だ?
初めて知ったんだが。

ファクトリメソッドやshared_ptrなどは知っています。
delete thisは俺が新参者だから知らないだけか?

107 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:13:43 ]
delete p;
とかと一緒
thisを削除

108 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:20:01 ]
delete thisは、COMみたいに自分で寿命を管理するときに使う。
まぁ、前時代的な実装だね。

109 名前:106 mailto:sage [2009/07/27(月) 22:53:58 ]
ふーん。
そうなんだ。
思い返してみたけどやっぱ見たこと無ねぇな。

まあ理解しなくても良いよね。
どーも。

110 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:00:07 ]
boost::intrusive_ptrの使用例を検索してみると、
delete thisを見られるよ。

111 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:39:11 ]
Stateパターンで遷移後状態を返す直前に自状態を始末する際に
delete thisすることが多かったかな。最近はsmart pointerを
使うことが多くなったが。

112 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:53:21 ]
delete this じゃないが
デストラクタを明示的に呼ぶコードってのはたまーに使うな。
まあ大半の人が、STLコンテナの内部で使われているのを利用しているが。



113 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:56:11 ]
>>112
そうそう、デストラクタって明示的に呼べるんだよね。
いつ使うのか全然しらない。

114 名前:112 mailto:sage [2009/07/28(火) 12:00:42 ]
つながりの無い事柄みたいになっちゃったが、
要は

void T::reconstruct() {
 this->~T();
 new (this) T();
}

から連想したんだ。許してくれ。

115 名前:デフォルトの名無しさん [2009/07/28(火) 13:30:04 ]
C2227のエラーが出て解決できないのですが、どういうことが理由なのでしょうか

116 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 13:43:42 ]
>>115
たぶんVCなのだと思うが、だとすれば、間接参照不可能なポインタ変数を
間接参照しようとしているから。
これ以上はソースを見ないと言い様が無い。

117 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:28:43 ]
間接参照不可能なポインタ変数を間接参照することは問題ないだろ。
問題なのは、間接参照不可能なポインタ変数を使って間接参照することだ。

118 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:33:09 ]
日本語でおk

119 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 15:04:59 ]
>>118
じゅうぶんわかる。
間接参照不可能なポインタ変数を間接参照することは問題ないね。

120 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:32:18 ]
いやまて
間接ポインタ変数を間接参照不可能な参照で間接参照にすることは問題なんじゃないか?

121 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:52:12 ]
間接参照不可能なポインタ変数ってvoidポインタのことでしょ?
->演算子でアクセスできないことも間接参照不可能っていうの?

122 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:25:55 ]
>>121
じゃあやっぱり>>117でいいよね



123 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:39:08 ]
MyClassクラスのテンポラリオブジェクトを返す関数の戻り値は
const MyClass& temp
で受け取って束縛しても大丈夫ですよね?
そのスコープから外れるまでは有効ですよね?


124 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:44:51 ]
テンポラリオブジェクトを返す関数のスコープを抜けるまで有効です。

125 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:55:30 ]
関数の戻り値をconst指定しておけば、参照変数が生きてる間束縛される

126 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:57:08 ]
>>125
> 関数の戻り値をconst指定しておけば
おかなくてもだろ?

127 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:16:15 ]
え、まじで?無知ごめん

128 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:17:44 ]
っていうか、そうだよね。constは関係ないね。
ちょっと考えれば分かる話でしたorz

129 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:21:30 ]
>>113 placement new したオブジェクトを消すとき

130 名前:123 mailto:sage [2009/07/28(火) 19:53:50 ]
みなさんありがとうございます。

131 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:57:50 ]
>>129
placement deleteじゃだめなの?

132 名前:デフォルトの名無しさん [2009/07/28(火) 20:02:53 ]
λ式ってブースト使わないと利用不可?



133 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:03:33 ]
placement deleteはデストラクタを呼ばないから、自分でデストラクトする必要がある。

134 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:12:21 ]
>>132
Visual C++ 2010
msdn.microsoft.com/ja-jp/library/dd293608(VS.100).aspx






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<217KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef