id:syou6162 の主催するRejectセキュリティキャンプに参加する予定です。
22日は普通に夕方ぐらいまでインターン+バイト先飲み会の予定なので、現着予定は23時。
2泊3日なのに、何考えてるんだろう。
大学は工学部だけど、こういう方面とはいまいち重ならないことがメイン。
言語的には C とか C++ とか Ruby とか。最近バイト先で iPhone をいじっているので、Objective-C ばっかり書いてる気がする。
iPhone いじるよ。
どちらかと言うと、他の人と絡んだり話したりする方が楽しみ。
作ってるものに駄目出ししたり、こんな機能・アプリいいんじゃないのとか言ってくれる人、大歓迎。ウェルカム。
彼らをあと1週間で、酒の肴にC++0xを語るレベルまでしないといけません。もうやけっぱちですよ。
2008-04-17 - Till you run out of cake. - ハチロク世代
というわけで滔々とC++の仕様を並べていってもよかったんだけど、それじゃすぐ飽きる分かりにくそうなので、課題を解きながら解説していこうか。
「足す」「引く」「スカラー倍」「内積」「回転」の機能をもったベクトルクラス (向きだけ) を定義しなさい、というのがお題。
ただし、座標の「型」は int でも double でも (数値っぽければ何でも) 大丈夫なようにしなさい、という制約つき。C++ ではこういう時、template (テンプレート) という機能をつかいます。
以下みたいな感じになるはず。
#include <iostream> #include <cmath> using namespace std; template <typename T> class Vector2 { public: Vector2() { _x = _y = 0.0; } Vector2(const T& x, const T& y) { _x = x; _y = y; } Vector2(const Vector2& rhs) { _x = rhs._x; _y = rhs._y; } virtual ~Vector2() { } Vector2& operator=(const Vector2& rhs) { _x = rhs._x; _y = rhs._y; return *this; } Vector2 operator+(const Vector2& rhs) const { return Vector2(_x + rhs._x, _y + rhs._y); } /* Vector2 operator%(const Vector2& rhs) { } */ T operator*(const Vector2& rhs) const { return _x * rhs._x + _y * rhs._y; } friend Vector2 operator*(const T& lhs, const Vector2<T>& rhs) { return Vector2(lhs * rhs._x, lhs * rhs._y); } friend ostream& operator<<(ostream& lhs, const Vector2<T>& rhs) { return lhs << "(" << rhs._x << "," << rhs._y << ")"; } Vector2 rot(const T& t) const { return Vector2(_x * cos(t) - _y * sin(t), _x * sin(t) + _y * cos(t)); } private: T _x; T _y; }; int main(int argc, char **argv) { Vector2<double> v1(0.1, 0.5); cout << "v1: " << v1 << endl; Vector2<double> v2(0.3, 0.2); cout << "v2: " << v2 << endl; Vector2<double> v3 = v1 + v2; cout << "v3: " << v3 << endl; Vector2<double> v4 = 1.5 * v3; cout << "v4: " << v4 << endl; double iprod = v1 * v2; cout << "iprod: " << iprod << endl; //Vector2<double> oprod = v1 % v2; //cout << "oprod: " << oprod << endl; Vector2<double> v5 = v4.rot(0.5 * M_PI); cout << "v5: " << v5 << endl; return 0; }
univ | |
![]()
つい先学期にCを学んだところに、いきなり C++ と template を教えようとしている。周りが悲惨な事になっている。
http://twitter.com/kiyoya/statuses/789374255
うちの学科では、つい先学期にCを学びました。
ほとんどの人はポインタとか結構まだ怪しいと思うのですが、今学期ではC++を学ぶようです。
今日覚える事柄
「今日」ってのは、2コマ=3時間。てんこ盛りすぎる。
難しすぎるとか、先生の教え方がどうとか、そういう次元をちょっと超越している気が。
開発環境として指定された Cygwin を想定して、ざっくりと解説していく。少しずつね。
細かい部分の説明とかは、分かりにくい (し面倒くさい) ので無視するから注意ね。
univ | |
![]()
細かい部分の説明とかは、分かりにくい (し面倒くさい) ので無視するから注意ね。
プログラミング応用 (1) - Till you run out of cake. - ハチロク世代
というわけで、まずは基本から。Cとほとんど同じだから、ざっくり行こう。
intとか、doubleとかいうやつ。よく使うのは以下。
| int | 整数 (-2147483648 〜 2147483647) |
|---|---|
| double | 実数 (15桁) |
| bool | 真偽値。真 (true) か 偽 (false) をとる。 |
| char | 文字 (1文字) |
| int * | ポインタ (これは intのポインタ) |
| struct | 構造体 |
| class | クラス (C++で追加) |
「ポインタ」とか「構造体」とか「クラス」ってのは、まずはそういうものだと思うこと。下手に意味を考えてはいけない。
例えば
int *pointer;
と書いてあった場合、これはint * (型) とpointer (名前) の2つに分けて読む。
意味は、「変数 pointer を、intのポインタとして宣言する」。
struct S { ... }; class C { ... };
これも読み方は上と同じで、基本はstruct (型) と S (名前)。
だけど構造体やクラスには中身があるので (後述) 、さらにおまけとして { ... } の部分がつく。
なわけなんで、{ ... } の後にはセミコロンがつくよ。 (上と比較してみよう)
S s; C c; S *s; C *c;
クラスとか構造体を定義した場合、こういう風に使う。読み方とか意味は、今までとまったく同じ。
こういうやつ。
double foobar(char *hoge, int fuga) { ... }
関数で重要なのは 「引数」と「返り値」。この2つを合わせて、その関数の「型」と言ったりする。
上の例だと、doubleが返り値で、char *hogeとint fugaが引数。
構造体とかクラスには中身がある。中身って何さ?
struct S { int value; double test() { ... } }; class C { char *p_str; bool foobar() { ... } };
まぁ見ての通り。構造体Sはint valueとdouble test()を、クラスCはchar *p_strとbool foobar()をそれぞれ持っているわけだ。
じゃぁこの2つは何が違うのか?
上のようにSとCが定義されていたとする。
S s; int i = s.value; double d = s.test();
これはできる。
C c; int i = c.value; double d = c.test();
でもこれはできない。value も test() も private だから使えねーよ!とコンパイラさんに怒られるはずだ。
構造体やクラスの中身には可視性という概念がある。「そいつらを外から使えるかどうか」っていう、権限みたいなもの。
可視性は public・protected・private の3種類。publicはズブズブの使い放題、privateは外からは全然使えない、という感じ。protectedはまだ使わないから、とりあえずいいや。
実はさっきのCとSの定義は、意味的には以下のようになる。
struct S { public: int value; double test() { ... } }; class C { private: char *p_str; bool foobar() { ... } };
public: とか private: ってのが勝手に補われてるのが分かるね。これが構造体とクラスの違いの1つ。構造体では何も言わなかったら可視性はpublicになるけど、クラスでは逆にprivateとして扱われる。
じゃぁ、さっきのCとSの定義をちょっと直してみよう。
struct S { private: int value; double test() { ... } }; class C { public: char *p_str; bool foobar() { ... } };
こうすると、コンパイルの結果は完全に逆になる。Cの方では怒られない (= コンパイルが通る) のに、Sの方では怒られるようになったよね? これが可視性。
class C { public: char *p_str; private: bool foobar() { ... } };
ちなみに可視性は複数設定できる。上の例だと、それぞれ可視性はどうなるだろう?
クラスと構造体のもう1つの違い。ポインタ、new、delete。参照。
suztomo2008/04/17 23:22これは期待。
skylab132008/04/17 23:25期待だな。
nyaxt2008/04/18 20:56sizeof(int) == 4仮定は…、たしかに大抵のシステムではそうだけど、必ずしも真ではないよ。
Kiyoya2008/04/18 23:06彼らをあと1週間で、酒の肴にC++0xを語るレベルまでしないといけません。もうやけっぱちですよ。
日本のインフラの力か、もしくはITという領域の特異性か、最新の技術で遊び、遊びから得た知識を応用して次の新しいものに手を付ける。たまに自分で新しいものを作ってみたりする。
それぞれが得意分野を持ってて、互いに一目置いている。その場のノリで僕から見たら神業としか思えないことをやってのける。
http://d.hatena.ne.jp/Hash/20080411/1207926831
プログラマとITがごちゃごちゃになってると思う。
その手の性質がIT固有のものかと言えばそうかもしれないけど、プログラマの特質では決してない。
だいたいITなんてバズワーd
http://d.hatena.ne.jp/Hash/20080411/1207926831
- ITみたいに、「思い立ったときに何処でも誰でも試行錯誤」ができない。
- 施設と知識がなければ、そもそものスタートラインにたてない
まだまだコンピュータが珍しいものだった時代。MITの学生達が夜な夜な大学の計算機室に忍び込んでたってのは、有名な話。
http://d.hatena.ne.jp/Hash/20080411/1207926831
- 操作とその効果がすぐ目に見えない。
- 視覚化それ自体が研究テーマになるくらい
これだって全然。つい最近話題になってた「Web 2.0」だって、ユーザビリティ=操作性 とか視覚化の話にすぎないんじゃないかな、突きつめてみれば。
「バイオ」といったとき、即座に「なま物」を想定してしまうからマズイのだと思う。
第一回卒研発表会で id:rindai87 が、数値という形のデータがあれば、別に何の設備も施設ももたない、さらに言えば生物学のバックグラウンドさえもたない人であっても、解析して新しい知見を得ることができる、みたいな事を言ってた (よね?)。
たとえば、あるデータなり発見なりがインターネット上で公開されていて、ちょっとした事でもいいから、今わかってる意味とか考察がブログにたくさん書いてあれば、世界中の人が自分なりのやり方でそれをハックできるって事でしょ。
それぞれが得意分野を持ってて、互いに一目置いている
人達が、それぞれのちょっとした意見や考察を共有しあい、相互補完することで新しいものを生みだしていく。これをまさに具現化したのが「Blog」であり「Trackback」だよね。
バイオインフォマティクスまでいかなくても、この手法って今すぐにでも応用できるんじゃないかなぁ、と思う。
「俺たち終わっちゃったのかなぁ」
「まだはじまっちゃいねぇよ」
http://d.hatena.ne.jp/Hash/20080411/1207926831
これからの id:Hash の活躍にご期待ください!
class A {}; A DoNothing ( A object) { return object; } main() { A object; DoNothing(object); }
「このコードを実行するとクラスAのオブジェクトは何回コンストラクトされますか?」っていうのが問題。
デフォルトコンストラクタを1回、コピーコンストラクタを2回の、計3回なんじゃないかと思うんだが……
(゚д゚)
#include<iostream> class A { public: A() { std::cout << "constructed." << std::endl; } A(const A& rhs) { std::cout << "constructed." << std::endl; } }; A DoNothing(A object) { return object; } main() { A object; DoNothing(object); }
kiyo@zinc go-kaidoku % gcc -lstdc++ test.cpp kiyo@zinc go-kaidoku % ./a.out constructed. constructed. constructed. kiyo@zinc go-kaidoku %
何か勘違いしているんだろうか。
模範解答を入力したあとのフォームで登録すると、本戦の10問がでてくるらしい。
「さすがに個人情報を入力する勇気はありませんね」(上野氏)
これはひどい。
ランキング ユーザーネーム 正解数 完成時間
1 nyaxt 10 0:13:23
6 kiyoya 0 0:03:05
https://go-kaidoku.jp/rank.html?questionGroupId=1
受け直しはできないらしい。
実に不名誉な記録が残ったところで、オチがついた。