アカウント名:
パスワード:
CもC++もそんなことはやってくれないよ?所有権はプログラマが自分で管理するか管理するためのコードを書く。これ基本。でないとメモリリークし放題。
new/deleteの多くがコンストラクタ/デストラクタに置き換えられます。
なんてことはないし、
これらを使うとnew/deleteの多くがコンストラクタ/デストラクタに置き換えられます。そしてコンストラクタは変数の宣言時、デストラクタは変数がスコープを抜けるときに自動的に実行されます。プログラマは適切なデータ型とスコープに注意することでメモリリークを防げます。
なんて、インスタ
「スマートポインタ」は言語仕様ではない。
そう見えるようにクラスを組んであるだけであって、それはポインタじゃない。
さらに言えばnewの後にコンストラクタ、deleteの前にデストラクタが呼ばれるんであって、インスタンスと参照を混同してないか?
そうでないと言うならそのとき何が起きてるのか一実装例でいいから説明してみ?
{ string message( "Hello, world." ); cout << message << endl;}
{ vector<string> messages; messages.push_back( string( "Hello," ) ); messages.push_back( string( " " ) ); messages.push_back( string( "World." ) ); for( vector<string>::const_iterator itor = messages.begin(); itor != messages.end(); itor++ ) cout << *itor; cout << endl;}
>動的オブジェクトの所有権管理CもC++もそんなことはやってくれないよ?所有権はプログラマが自分で管理するか管理するためのコードを書く。これ基本。でないとメモリリークし放題。
Cならば文字列や配列といった「動的オブジェクトの所有権管理」がポインタを使用して必要となるが、C++ならばオブジェクトとして管理される例。
元コメントは言語仕様がどうのとは言っていません。逆に「スマートポインタ」と明言しています。後から出てきて対象範囲を狭めるのはなぜですか? それにスマートポインタは標準C++ライブラリの一部です。
そういうことを言っている訳じゃありません。適切なデータ型を選択することによって多くの場合new/deleteを呼ばなくてもいい、動的オブジェクトの管理から解放されると言っています。
そう、本来ポインタで表現することが苦しいものもCではポインタとして表されている。これこそ元コメントで「これら全然違う概念を一個で実現しようとする、そもそも無茶なキメラですよ。」と言われていることです。tarosukeさんも理解してるじゃないですか。
ほんとーにコメント読まずにコメントしてるなー
俺には管理するためのインスタンスが生成/消滅するのに伴って実体の方のインスタンスをnew/deleteしているように見えるがな。
んじゃさ、その(どっちでもいいけど)messageを何か他のインスタンスへ引数として渡すことを考えてみてー。渡す先は今いる関数が戻っても生きてるし、その引数(あるいは少なくともそれと同値なモノ)を後々まで使うという条件でね。
messages.push_back( string( "Hello," ) );
vector<string> messages;{ string message( "Hello," ); messages.push_back( message ); // 何か他のインスタンスへ引数として渡す} // 渡す先は今いる関数が戻っても(関数ではないがブロックスコープを抜けている)...
C++でポインタじゃないから何?
どれも反論になってないよ。
そのパターンがすでに書かれていることも読み取れないレベルなんですね。
deleteは記憶領域を返却するだけでなく、デストラクタも走ることをご存知ないですか?
だから何?デストラクタが走るのと所有権管理にどんな関係があると?ポインタを複製してもちゃんと管理してくれるとでも?というかデストラクタを書くのは誰?...あー、書く必要がない人なのね。
ポインタは参照や反復子を実装する手段に過ぎないともいえますね。
言えない。順序が逆。既に上げてある通りポインタを反復子として使えない使い方もある。
抽象度が高い複雑な案件でも、パフォーマンスを上げたい部分は
newで生成されたオブジェクトを指すポインタは、それを削除するための情報も内包している。
例としては文字列でもいいけど、たとえば下みたいな構造体は「ポインタは先頭を指しているだけ」という性質を使ったもの。この場合はサイズが不正なのでポインタを反復子としては使えない。struct HOGE{ ほげふが char buff[0];};
こらこら、嘘を書いちゃいかん。 自動的に const int *buff; みたいな変数宣言がされ、buffが buff[0]を指すように初期化されると思っていますか? そんな高度なことは、C/C++コンパイラはやりません。 表記が違うだけで、&buff[0]もbuffも同じものを表します。
もしかすると、あなたは *(buf+2) と buf[2] を違うものだと考えてたりしませんか?
buffは&buff[0]を指すconstポインタ。
なるほど、sizeof(buf)のような時ですね。 C/C++の言語仕様そのものがすごくコンパクトに作られているのは認めますが、ミスを誘発するような仕様が幾つかあるのが残念ですね。 char s[20] = "hello world!"; なんて記述は、便利だけど酷い仕様です。
Cのポインタは、- スカラ値への参照- 配列への参照- 動的オブジェクトの所有権管理- 反復子これら全然違う概念を一個で実現しようとする、そもそも無茶なキメラですよ。
気分を害さないでいただきたいんですが、型キャストやmalloc(そういやそんなもんありましたね)は一瞬も脳裏に浮かびませんでしたよ。ここでいう動的オブジェクトの所有権管理とは、「newで生成したオブジェクトを誰かが必ず一回、そして一回に限ってdeleteすること」以上の意味はありません。自動的にやってくれるなんて期待してませんし、そんなこと書いてないでしょ?Cなら当然プログラマが明示的にdeleteを書くんです。>実現しようとするここを読んでくれない人が何人もいるのでびっくりしました。さらに親コメントにある、>ポインタが理解できてなくても、適切な言語を選べば、動くプログラムを書けるを受けて、プログラマの意図を正確に表現する(メンテナンス性の高い・品質の良いコードを書く)方が、ポインタのメカニズムごときで混乱するよりマシだよ、と言いたかったんですがね。ま、ちゃんとわかってくれてる人もいるし、C++を学んでいれば当然のことなんですが。
沖林 正紀 IBMソフトウェア事業部 データ・マネジメント事業 推進技術部のメンバー
1997年冬にJavaに遭遇してから以降、JSPのリファレンスサイトを開設したのがきっかけで、Javaでの開発に従事。その後DB2を担当する部門に常駐し、セミナー講師などを務める。雑誌やWebへの執筆、講演多数。
メールアドレスもあって(ここには書かないけど)、メールも出されている。
セミナー講師や講演を多数行っているという紹介が本当なら、実在の人物でしょう。もしそうなら、実際に話を聞いた人も多いのでは? IBMの名刺で働いているけれども、実際には外から派遣で来ている人だとか?
沖林正紀(おきばやしまさのり)SE/プログラマを経て,WebアプリケーションやXMLなどについて雑誌記事や書籍の執筆活動を始める。大手メーカで製品資料の作成や,セミナーの講師を担当したこともある。現在は,取材記事や製品レビューなどに執筆活動の幅を広げる一方,プログラミング教材の開発も手がけている。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ見習い
まぁ、驚いたのは (スコア:0)
指摘されても問題が何か理解出来ていない編集にはビックリだな
Re:まぁ、驚いたのは (スコア:2, 興味深い)
自分でプログラミングすることなんか全く無いんでしょうね。
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
ポインタがいまいち理解できない人には朗報だ。
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
ソースを書いたら動かしてみるという発想が無いという時点で、普段プログラム書いてる人じゃないと思うんです。
まあIBMに内定している学生にとっては朗報じゃないでしょうか。
Re: (スコア:0, すばらしい洞察)
それで正しいと思います。
Cのポインタは、
- スカラ値への参照
- 配列への参照
- 動的オブジェクトの所有権管理
- 反復子
これら全然違う概念を一個で実現しようとする、そもそも無茶なキメラですよ。
私はC++使いなんですが、C++なら、状況によって参照やスマートポインタや反復子を使い分けるところです。
理解しようとするとかえって遠回りだと思います。
Re:まぁ、驚いたのは (スコア:3, 参考になる)
> これら全然違う概念を一個で実現しようとする、そもそも無茶なキメラですよ。
別コメントにもあるけど、C言語には「反復子」「所有権」という概念はありません。アセンブラ的発想で考えれば理解は速いです。逆にアセンブラの経験がなければ難しいのかな?アセンブラの経験なくCを覚えるとどうなるか?は私には想像が付かないです。私がCを覚えたときにはCの吐き出したアセンブリを見て覚えましたが、当然ポインタで悩んだりつまずいたことはありませんでした。
> 配列の参照、スカラの参照
配列だって単にスカラー値がメモリ上に連続で並んでいるだけなのでその参照はスカラー値の場合と変らない、というのがCの概念。むしろC言語で「配列への参照」と言うと配列型へのポインタ(すなわちインクリメントするとメモリ上は配列の大きさ分飛ぶ)を指すと思います。例としては、
int (*)[3]
という型のこと。
Best regards, でぃーすけ
Re: (スコア:0)
アセンブラをやってからCを学んだ人は、アセンブラを学ぶときに苦労しC言語を学ぶとき「なんだ一緒じゃないか」と思い、C言語を学んでからアセンブラをやったひとはC言語を学ぶときに苦労しアセンブラを学ぶとき「なんだ一緒じゃないか」と思う。それだけの差だと思う。C言語も各種アーキテクチャのアセンブラも言語本体は非常に小さく、理解が必要なのはむしろ両者に共通したコンピュータの仕組みの方なので。
ただ、CからアセンブラかC++からアセンブラかの差は大きいかもしれない。C言語はコンパイルしたらどんなアセンブラになるか想像しながら書くような場面で使われることも多いのに対し、C++ではシンボル名の命名ルールが標準化されていないためアセンブラと組み合わせて書くことが難しく、アセンブラレベルのことは考えないでプログラムを書くのが一般的なように思う。
# by C言語をやってからアセンブラをやったAC
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
> - スカラ値への参照
> - 配列への参照
> - 反復子
すまん アセンブラだと、こういうコードかかない?
#つーか普通のレジスタの使い方だと思ったけど
#違うのかな?
> - 動的オブジェクトの所有権管理
これは わかんないけど
Re: (スコア:0)
アドレスレジスタa0, a1, a2を、それぞれスカラへの参照、配列への参照、
反復子として使おうとしてると思ってくださいよ。
A: ; 配列
db 00h, 01h, 02h
S: ; スカラ
db 20h
main:
mov.l S,a0 ; ok. スカラ値Bへの参照をa0に入れている。
mov.b @a0,d0 ; ok. Bをd0に入れている。
mov.b @a0+1,d0 ; NG. Bは配列ではない。プログラマの意図に反している。
inc a0 ; NG. a0の指すところにデ
Re:まぁ、驚いたのは (スコア:2, すばらしい洞察)
自分の場合、C/C++ではポインタはメモリのどこかを指しているものという認識しかないですし、配列はメモリ上に連続してとられたスカラ値の集まりという認識しかないです(*1)。
だからポインタを持ってきて「スカラへの参照」「配列への参照」「反復子」として捉えることは無いですね。敢えて表現するならばポインタというものは一種類で「スカラ」「配列の先頭」「配列中のどこか」「ふめいなところ」を指していると捉えてる感覚でしょうか。
*1)なので、必ずしもメモリ上で連続していないようなコレクションの実装を指して「配列(もしくは Array)」と呼ぶのは違和感がある。
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
>動的オブジェクトの所有権管理
CもC++もそんなことはやってくれないよ?
所有権はプログラマが自分で管理するか管理するためのコードを書く。これ基本。でないとメモリリークし放題。
んとなー?抽象度の高い方から理解しようとするから理解できないんだよ。
ポインタを理解するにはメモリイメージを持つこと。これに尽きる。
Re:まぁ、驚いたのは (スコア:1)
# さりげなく「スマートポインタ」と書かれているから。
これらを使うとnew/deleteの多くがコンストラクタ/デストラクタに置き換えられます。そしてコンストラクタは変数の宣言時、デストラクタは変数がスコープを抜けるときに自動的に実行されます。プログラマは適切なデータ型とスコープに注意することでメモリリークを防げます。
これらの長所・短所を理解した上で相手に対して「んんー?あんたホントにC++使い?」と発言されているのでしょうか?
Re: (スコア:0, フレームのもと)
さらに言えばnewの後にコンストラクタ、deleteの前にデストラクタが呼ばれるんであって、
なんてことはないし、
なんて、インスタ
Re: (スコア:0)
># さりげなく「スマートポインタ」と書かれているから。
tarosuke氏が噛みついてるのはその前、Cのポインタはキメラだって主張の部分。
他の言語で何がどう実装されていようが、そんなの関係ない。
あなたの反論、ですらないが、はピントがずれてる。
Re:まぁ、驚いたのは (スコア:1)
Re:まぁ、驚いたのは (スコア:1)
んじゃさ、その(どっちでもいいけど)messageを何か他のインスタンスへ引数として渡すことを考えてみてー。渡す先は今いる関数が戻っても生きてるし、その引数(あるいは少なくともそれと同値なモノ)を後々まで使うという条件でね。 「選択」ねぇ...ま、誰かが作ったラッパにくるまれたものだけ使ってればいいんならポインタも参照も確保も解放も意識する必要はないわな。 ほんとーにコメント読まずにコメントしてるなー。だから順序が逆だってーの。
Re:まぁ、驚いたのは (スコア:1)
元コメントで「スマートポインタ」と書かれているにもかかわらず、勝手に「スマートポインタはC++言語仕様ではない」とか言い出すし。言語仕様でないから何?
「C++なら、状況によって参照やスマートポインタや反復子を使い分けるところ」をCならポインタで実現せざるを得ないと書かれているのに、「「スマートポインタ」はただのクラスであってポインタなんかじゃない」とか言い出すし。C++でポインタじゃないから何? だれもスマートポインタがポインタかどうかの話はしてません。
どれも反論になってないよ。 だから何? 「メモリリークし放題」への反論なんだからメモリリークしなければそれで説明できている。単にtarosukeさんがC++のメモリリークのしない/しづらくできる一面を知らなかっただけでしょう。new/deleteがどうの「メモリリークし放題」なコードしか書けないんでしょ。 そのパターンがすでに書かれていることも読み取れないレベルなんですね。 vector<string>::push_back()関数にstringを渡してます。そしてstring消滅後にforループでこのstringを読み出してますよ? こうやって書いてあげないと読み取れないかな?
こんな程度の人が他人に対して「んんー?あんたホントにC++使い?」と言うのはどうかと思います。
Re:まぁ、驚いたのは (スコア:1)
誰かが用意してくれたライブラリにくるまってHowTo知識があれば満足だと言うなら、もう「迷惑だからC/C++はやめれ。Javaがお勧め」くらいしか言うことはないよ。
Re:まぁ、驚いたのは (スコア:1)
あとtarosukeさんは反論でなく粘着してるだけらしいですね。春なのかなぁ。
Re: (スコア:0)
明示的にdeleteするのも所有権管理の範疇ではないでしょうか?
>ポインタを理解するにはメモリイメージを持つこと。これに尽きる。
その通りです。抽象度の高い課題には不要な理解で、生産性を下げます。
Re:まぁ、驚いたのは (スコア:1)
感覚の問題かも知れんが、少なくとも俺はそうは思わない。
なぜならその例でいうdeleteで言えばnew/deleteとは無関係にポインタでアクセスできてしまうから。
「*(int*)0 = 0;」みたいないきなり「ぬるぽガッ」なコードだって書けちゃうし。
もしnew/deleteを所有権の管理とするなら所有する主体(主語)はオブジェクトではなくプロセスという解釈が必要になる。
でも、そうだとしてそれに意味があるのかどうかはかなり疑問。
>抽象度の高い課題には不要な理解で、生産性を下げます。
不要かどうかは別にして、それはそう。
だからそういう課題でパフォーマンス的にも細かい事言われないならC/C++はそもそも不向き。
Re: (スコア:0)
>「*(int*)0 = 0;」みたいないきなり「ぬるぽガッ」なコードだって書けちゃうし。
その通りです。所有権管理と参照は分離されるべきなのです。
だけどCのポインタは分離されてないよね、というのが前言の趣旨です。
>だからそういう課題でパフォーマンス的にも細かい事言われないならC/C++はそもそも不向き。
パフォーマンスが重要な案件でも、チューニングが必要なのは一部です。
Re: (スコア:0, フレームのもと)
分離されてないも何もさっきから言ってるように、そもそもポインタには所有権管理機能なんてないんだってば。
new/deleteやmalloc/freeはプロセスがメモリ空間を占有するものであって、ポインタがその確保した領域を占有するというものではないよ。
そもそもポインタは先頭を指してるだけであって領域のことなんか知ったこっちゃない。
例としては文字列でもいいけど、たとえば下みたいな構造体は「ポインタは先頭を指しているだけ」という性質を使ったもの。
この場合はサイズが不正なのでポインタを反復子としては使えな
Re: (スコア:0, フレームのもと)
だから何?デストラクタが走るのと所有権管理にどんな関係があると?
ポインタを複製してもちゃんと管理してくれるとでも?
というかデストラクタを書くのは誰?
...あー、書く必要がない人なのね。
言えない。順序が逆。
既に上げてある通りポインタを反復子として使えない使い方もある。
Re:まぁ、驚いたのは (スコア:1)
たしかにnewすると確保サイズが保存されてdeleteでちゃんと戻してくれる。でもそれはポインタの機能じゃなくてnewとdeleteの機能。ポインタに確保サイズとか入ってる糞な処理系の存在を否定はしないけど普通の処理系ではポインタに入ってるのはアドレスだけだよ。それと別のところにも書いたけど「スマートポインタ」はただのクラスであってポインタなんかじゃないよ。 なーんて言ってるし、やっぱり件の記事と大差ないな。
Re: (スコア:0)
「FILE*はfopen()やfclose()の機能であってファイルハンドル管理とは無関係」
というわけか。
ハハハハハハハハ
Re:まぁ、驚いたのは (スコア:2, すばらしい洞察)
Javaが生まれたということはよく分かった。
優秀なエンジニア二人の手を止めてしまう訳か。
# お前らがポインタを知っている事はよく分かった。
# でも人に誤解しないように説明するスキルはそれと別だからな、ということ。
Re: (スコア:0)
学習してもC/C++のポインタ程度の事柄を理解できない人は、ポインタ以外の技術も理解できないと思う。
(大半のPGは技術を理解してる必要も無いんだけどね)
Re: (スコア:0, フレームのもと)
そういう結論に至った経緯に興味があるよ。書いてみ?
Re: (スコア:0)
この構造体のどこにポインタがでてくるの?
配列の識別子は、単体で表記する場合に、配列の先頭要素のアドレスと解釈されるという特例(&buff[0]の短縮表記)があるけど、
先頭アドレスのことをポインタと言ってるんじゃないよね?
ひょっとして、アドレスとポインタの区別が付いてない?
Re: (スコア:0)
>ひょっとして、アドレスとポインタの区別が付いてない?
つ【ブーメラン】
Re:まぁ、驚いたのは (スコア:1)
はしょりすぎて理解できなかったか?
Re: (スコア:0)
こらこら、嘘を書いちゃいかん。 自動的に const int *buff; みたいな変数宣言がされ、buffが buff[0]を指すように初期化されると思っていますか? そんな高度なことは、C/C++コンパイラはやりません。
表記が違うだけで、&buff[0]もbuffも同じものを表します。
もしかすると、あなたは *(buf+2) と buf[2] を違うものだと考えてたりしませんか?
Re:まぁ、驚いたのは (スコア:1)
Re: (スコア:0)
なるほど、sizeof(buf)のような時ですね。
C/C++の言語仕様そのものがすごくコンパクトに作られているのは認めますが、ミスを誘発するような仕様が幾つかあるのが残念ですね。
char s[20] = "hello world!";
なんて記述は、便利だけど酷い仕様です。
Re: (スコア:0)
これは酷い嘘。
「buffは&buff[0]を指すconstポインタ」ならば、&buffは、「&buff[0]を指すconstポインタ」のアドレスを返すとでも思ってるんでしょうか。
実在しないものは返せない。
ポインタとアドレスの区別をつけるのが、あなたの次のステップですね。
注釈 (スコア:0)
豊富な知識が邪魔をして、相手のコメントをよく読もうとしなかったのが敗因でしょう。
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
Re:まぁ、驚いたのは (スコア:1)
それを云うのであれば、”ポインタは”ではなく、”ポインタと型キャストの併用は”
が正しいと思いますよ。
#知っていれば当たり前の使い方ですけどね。この記事でそういった省略をしてはだめでしょう。
ポインタはただ”アドレスを指し示すだけ”の物。
「動的オブジェクトの所有権管理」は[malloc関数]で確保したメモリを扱う際の話だと思いますが、
その書き方では誤解を招きます。
#私はCの後にC++を学びました。Cのポインタの考え方を理解していれば、C++でもトラブル回避に役立ちます。
Re:まぁ、驚いたのは (スコア:1)
もしかして、(#1324338) の方は(#1323207)の方と同じ方ですか?
気分を害すなんて事はありませんよ。意見を言い合い、理解を深め合うのはよいことだと思いますから。
「実現しようとする」の部分は読んでいますが、”誰が実現しようとしているのか?”
の部分が抜け落ちているので、私は書かれている文面から勝手に推測して読んでしまいました。
>>ポインタが理解できてなくても、適切な言語を選べば、動くプログラムを書ける
>を受けて、プログラマの意図を正確に表現する(メンテナンス性の高い・品質の良いコードを書く)方が、
>ポインタのメカニズムごときで混乱するよりマシだよ、と言いたかったんですがね。
これは、はじめから書いてほしかったですよ(汗)
と云いますか「Cのポインタは~」の部分は書かずに、上記の文だけで良かったと思います。
C++の知識でCのポインタの役割(使われ方)を表現したからこそ、”要らん突っ込み”を受けていますから。
実に残念です…。
「動的オブジェクト~」ですが、私も”自動的にやってくれる”なんて思っていませんよ。
C++でもです。
小さなサイズの変数ならともかく、大規模な(サイズの)変数・領域(仮想メモリマッピングなど含む)
を確保する場合は、管理用のクラスを作ってデストラクタですべて解放するように書いたりしていますから(笑)
#Cでは面倒だったこれら“後始末”が、C++では言語仕様のおかげで使ってわかりやすく・楽に表現できるのが
#とても嬉しかった覚えがあります。もう…えー!もう10年以上昔かい! Borland C++(Turboではない)
#あの頃は仕様が細々アレだったなぁ…。
Re: (スコア:0)
という私は邪道なC++プログラマ?
void *p = my_malloc(sizeof(Hoge));
new (p) Hoge();
//(中略)
((Hoge *)p)->~Hoge();
my_free(p);
Re:まぁ、驚いたのは (スコア:1)
# 標準ライブラリ使うからダメとかかなぁ...。
Re: (スコア:0)
my_malloc/my_freeは便宜上書いただけで、実際に使った例としては、「汎用型」「なんでも型」、要はバリアントクラスを実装するために、std::vector<unsigned char>で確保したバッファの中に、動的にオブジェクトを構築するために利用しました。
初めて配置newを知ったときは、激しく感動した覚えがあります。
Re: (スコア:0)
配置newなんか使うのは組み込みプログラマ||ゲームプログラマ||STLのインプリメンタ||ウィザードだけだ!
Re:まぁ、驚いたのは (スコア:1, すばらしい洞察)
知ってたら、この人がIBMのチーフエンジニアってわかるとこ教えて下さい。
#中の人?
Re:まぁ、驚いたのは (スコア:1, 参考になる)
ちなみに、中の人なら下のリンク先で検索すると出てきます。
http://www.ibm.com/contact/employees/us/ [ibm.com]
実在している? (スコア:1, 参考になる)
沖林 正紀
IBMソフトウェア事業部
データ・マネジメント事業
推進技術部のメンバー
1997年冬にJavaに遭遇してから以降、JSPのリファレンスサイトを開設したのがきっかけで、Javaでの開発に従事。その後DB2を担当する部門に常駐し、セミナー講師などを務める。雑誌やWebへの執筆、講演多数。
メールアドレスもあって(ここには書かないけど)、メールも出されている。
セミナー講師や講演を多数行っているという紹介が本当なら、実在の人物でしょう。もしそうなら、実際に話を聞いた人も多いのでは? IBMの名刺で働いているけれども、実際には外から派遣で来ている人だとか?
Re: (スコア:0)
少なくとも、現在所属してはいないようです(派遣形態を含めて)。転職されたのでは。
#まああんまり所属まで詮索するもんじゃないけど、事実は指摘しておかないとということで一応。
Re: (スコア:0)
Re: (スコア:0)
Re: (スコア:0)
でも「チーフエンジニア」っていう情報はまだ出てきてないですね。
というか、「沖林 正紀 チーフエンジニア」でググっても、/.J しかかからないんですが…。