Hatena::Groupgeneration1986

Till you run out of cake.

id:Kiyoya (aka. kiyoya, kiyoya@gmail.com)

2008-08-04

Rejectセキュリティキャンプ

22:01 | はてなブックマーク -  Rejectセキュリティキャンプ - Till you run out of cake.  Rejectセキュリティキャンプ - Till you run out of cake. のブックマークコメント

id:syou6162 の主催するRejectセキュリティキャンプに参加する予定です。

22日は普通に夕方ぐらいまでインターン+バイト先飲み会の予定なので、現着予定は23時。

2泊3日なのに、何考えてるんだろう。

普段やってること

大学は工学部だけど、こういう方面とはいまいち重ならないことがメイン。

言語的には C とか C++ とか Ruby とか。最近バイト先で iPhone をいじっているので、Objective-C ばっかり書いてる気がする。

やりたいこと

iPhone いじるよ。

どちらかと言うと、他の人と絡んだり話したりする方が楽しみ。

一緒にやりたい人

作ってるものに駄目出ししたり、こんな機能・アプリいいんじゃないのとか言ってくれる人、大歓迎。ウェルカム。

2008-04-22

プログラミング応用 (3)

14:26 | はてなブックマーク -  プログラミング応用 (3) - Till you run out of cake.  プログラミング応用 (3) - Till you run out of cake. のブックマークコメント

前回のあらすじ

彼らをあと1週間で、酒の肴にC++0xを語るレベルまでしないといけません。もうやけっぱちですよ。

2008-04-17 - Till you run out of cake. - ハチロク世代

というわけで滔々とC++の仕様を並べていってもよかったんだけど、それじゃすぐ飽きる分かりにくそうなので、課題を解きながら解説していこうか。

2次元ベクトルクラス

「足す」「引く」「スカラー倍」「内積」「回転」の機能をもったベクトルクラス (向きだけ) を定義しなさい、というのがお題。

ただし、座標の「型」は 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;
}

2008-04-17

プログラミング応用 (1)

| 23:18 | はてなブックマーク -  プログラミング応用 (1) - Till you run out of cake.  プログラミング応用 (1) - Till you run out of cake. のブックマークコメント

つい先学期にCを学んだところに、いきなり C++ と template を教えようとしている。周りが悲惨な事になっている。

http://twitter.com/kiyoya/statuses/789374255

うちの学科では、つい先学期にCを学びました。

ほとんどの人はポインタとか結構まだ怪しいと思うのですが、今学期ではC++を学ぶようです。

今日覚える事柄

  1. コンパイルとリンク
  2. インスタンスと参照とポインタ, new, delete
  3. テンプレート
  4. クラス, コンストラクタ, デストラクタ, 演算子オーバーロード
  5. コンテナと反復子 (iterator) とアルゴリズム
  6. 関数オブジェクト
  7. 名前空間 (namespace)
  8. STL (Standard Template Library)
    1. 基本的なクラス群の利用法 : vector, list, set, map, etc.
    2. 文字列stringの利用法
    3. ストリームの利用法 : ifstream, ofstream, sstream, etc.

「今日」ってのは、2コマ=3時間。てんこ盛りすぎる。

難しすぎるとか、先生の教え方がどうとか、そういう次元をちょっと超越している気が。

というわけで

開発環境として指定された Cygwin を想定して、ざっくりと解説していく。少しずつね。

細かい部分の説明とかは、分かりにくい (し面倒くさい) ので無視するから注意ね。

プログラミング応用 (2)

| 00:26 | はてなブックマーク -  プログラミング応用 (2) - Till you run out of cake.  プログラミング応用 (2) - Till you run out of cake. のブックマークコメント

前回のあらすじ

細かい部分の説明とかは、分かりにくい (し面倒くさい) ので無視するから注意ね。

プログラミング応用 (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 *hogeint fugaが引数。

中身って?

構造体とかクラスには中身がある。中身って何さ?

struct S
{
  int value;

  double test()
  {
    ...
  }
};

class C
{
  char *p_str;

  bool foobar()
  {
    ...
  }
};

まぁ見ての通り。構造体Sint valuedouble test()を、クラスCchar *p_strbool foobar()をそれぞれ持っているわけだ。

じゃぁこの2つは何が違うのか?

可視性

上のようにSCが定義されていたとする。

S s;
int i = s.value;
double d = s.test();

これはできる。

C c;
int i = c.value;
double d = c.test();

でもこれはできない。value も test() も private だから使えねーよ!とコンパイラさんに怒られるはずだ。

構造体やクラスの中身には可視性という概念がある。「そいつらを外から使えるかどうか」っていう、権限みたいなもの。

可視性は publicprotectedprivate の3種類。publicはズブズブの使い放題、privateは外からは全然使えない、という感じ。protectedはまだ使わないから、とりあえずいいや。

可視性の設定

実はさっきのCSの定義は、意味的には以下のようになる。

struct S
{
public:
  int value;

  double test()
  {
    ...
  }
};

class C
{
private:
  char *p_str;

  bool foobar()
  {
    ...
  }
};

public: とか private: ってのが勝手に補われてるのが分かるね。これが構造体とクラスの違いの1つ。構造体では何も言わなかったら可視性はpublicになるけど、クラスでは逆にprivateとして扱われる。

じゃぁ、さっきのCSの定義をちょっと直してみよう。

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。参照。

suztomosuztomo2008/04/17 23:22これは期待。

skylab13skylab132008/04/17 23:25期待だな。

nyaxtnyaxt2008/04/18 20:56sizeof(int) == 4仮定は…、たしかに大抵のシステムではそうだけど、必ずしも真ではないよ。

KiyoyaKiyoya2008/04/18 23:06彼らをあと1週間で、酒の肴にC++0xを語るレベルまでしないといけません。もうやけっぱちですよ。

2008-04-12

Re: プログラマーに比べ、バイオ研究者に飛び抜けた才能が現れない理由のひとつ

17:13 | はてなブックマーク -  Re: プログラマーに比べ、バイオ研究者に飛び抜けた才能が現れない理由のひとつ - Till you run out of cake.  Re: プログラマーに比べ、バイオ研究者に飛び抜けた才能が現れない理由のひとつ - Till you run out of cake. のブックマークコメント

日本のインフラの力か、もしくはITという領域の特異性か、最新の技術で遊び、遊びから得た知識を応用して次の新しいものに手を付ける。たまに自分で新しいものを作ってみたりする。

それぞれが得意分野を持ってて、互いに一目置いている。その場のノリで僕から見たら神業としか思えないことをやってのける。

http://d.hatena.ne.jp/Hash/20080411/1207926831

プログラマとITがごちゃごちゃになってると思う。

その手の性質がIT固有のものかと言えばそうかもしれないけど、プログラマの特質では決してない。

だいたいITなんてバズワーd

  • ITみたいに、「思い立ったときに何処でも誰でも試行錯誤」ができない。
    • 施設と知識がなければ、そもそものスタートラインにたてない
http://d.hatena.ne.jp/Hash/20080411/1207926831

まだまだコンピュータが珍しいものだった時代。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 の活躍にご期待ください!

2008-04-11

コードを解読しよう?

01:15 | はてなブックマーク -  コードを解読しよう? - Till you run out of cake.  コードを解読しよう? - Till you run out of cake. のブックマークコメント

no titleC++の方の問題なんだけどさ。

class A {};
A DoNothing ( A object)
{
		 return object;
}

main()
{
		 A object;
		 DoNothing(object);
}

「このコードを実行するとクラスAのオブジェクトは何回コンストラクトされますか?」っていうのが問題。

デフォルトコンストラクタを1回、コピーコンストラクタを2回の、計3回なんじゃないかと思うんだが……

f:id:Kiyoya:20080412011127p:image

f:id:Kiyoya:20080412011126p:image

(゚д゚)

確認してみる

#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

受け直しはできないらしい。

実に不名誉な記録が残ったところで、オチがついた。

yuyarinyuyarin2008/04/13 14:56それ僕もデフォコン*1+コピコン*2で3だと思って答えたら間違いで、これは酷いと思ったので本戦はやらなかったw