weblog

--Weblogとは、インターネット上に個人が公開する日記の一種で、プライベートな内容を記すことよりも、むしろ話題となっているインターネット上のニュースを引用し、コメントや批評を加えたり、新しい視点を提供するといった方向性を持っているコンテンツの総称である。
なおblogという名称は1999年の四月から五月ごろにPeter Merholzによってweblogの略称として発案された。
言語学マニアのかれが冗談で語の区切りを移動してweb-logをwe-blogと戯れに理解してこの言葉を作り出したのである。--

最初に

ちょっと最近,ドタバタしてて twitter だと腰を据えて話せないなと感じたので,ちょっと最近のTDD 議論についてちゃんと僕の気持ちを書いてみようと思います.

これは僕が"今"感じてる事とか考えている事を書いているだけですので,誰かを論破したいとか,誰かを説得したいという意思は無いです.

本当に裏とかはなく,純粋に「"庄司嘉織"という人間は"今この時"にこういう事を感じてこういう事を考えた」というだけです.


もちろん明日には考えが変わるかもしれないし,逆に過去の発言とは違うかもしれませんが,「最近はこう感じている」という事をちゃんと書いておこうと思いました.


デブサミでの発表について

id:babie さんにちゃんと返事をしていなかったので,まずちゃんと返事をしておこうと思います.(遅くなってしまってすいません)


@kakutani は興味なくても、あのスライドだと @yoshiori の誤った考え方(である可能性がある)に、権威付けを与えている。「@kakutani @t_wada 直伝だ」と見える。この議論いかんであの言が偽だったら、@yoshiori はスライドを訂正した方が良い。

http://twitter.com/babie/status/9468960884

これは権威付けをしたいという気持ちは本当になく,感謝とリスペクトを含めて出していました.

また,もう一点,僕でもそうやって発表者に聞いて教えてもらったりしてるので,みんなも恐れないで聞いてみると親切に教えてもらえるよというのを伝えたくて入れています.

(本当に悩んだので両人にいちおう承諾を得ました)

もう、俺の師匠として @kakutani と @t_wada の名前を出さない方がいいのかなぁ…… リスペクトしてるから感謝の意味も含めて出すようにしてるんだけど、二人の名前を出して二人に迷惑かかっちゃってもアレだしなぁ

http://twitter.com/yoshiori/status/9109219107

@yoshiori 別に構わないですよ。名誉なことです。

http://twitter.com/t_wada/status/9109350418

@yoshiori なんのことわりもなく書籍のあとがきに書かれたこともあるので平気:-)

http://twitter.com/kakutani/status/9116364567

と,言ってもらえたので資料に入れさせていただきました.


次に

@yoshiori 「オレオレTDD」を広めるなら、但し書きを付けるなどの、誠実な対応を望みます。

http://twitter.com/babie/status/9470015080

ですが,副題に「"僕"(とドワンゴ)のXP」と入れている事で僕は僕自身が理解した XP や TDD について話しをするという事になると感じていました.


さらに発表の最初で

方向を示し(一周目),道を通す(二周目)の人たちがいた

僕ら(三周目)がすべきは高速道路の設置であって,車輪の再開発では無い

先人が学んだ事や感じた事は本やブログにいっぱいあるので,

僕らはさらにそれを読み実践し,感じた事や起った事をまた残そう

という話しをしました.

で,「今日は僕がこの一年でやった事,感じた事を話します」と.


僕が僕の言葉で僕の感じた事や学んだ事を話しているので間違った理解があるかもしれません(むしろいっぱいあると思います).

プレゼンの時は「と感じます」とか「と思います」と発表したのですが,資料にそれを書いてしまうと冗長なので書いていません.すいません.


ただ,"僕"が"僕"の言葉で"僕"の理解した事,感じた事,考えた事を発表するとそれはある意味すべて「オレオレxxx」になってしまうと思うのですがどうでしょうか?

逆に「オレオレxxx」にならない為には自分の主観を入れずに引用だけで話すしかなくなってしまうと思うのですが……


で,TDD がテスト手法かどうかについて

"僕は" TDD は開発手法であって,テスト手法では無いと感じています.

テスト手法としては不十分だと思います.


ここでちょっと言葉の難しいところなのですが,

「TDD はテスト手法としては不十分だけどテスト手法である」

「TDD はテスト手法としては不十分だからテスト手法ではない」

どちらでも良いと思っているのですが,今まで僕自身で経験したり人に話したり相談された経験から"僕は"「テスト手法ではない」と言ってしまった方が良いと感じました.


まずテストに何を書いていいかわからない

僕が一番最初に id:kakutani に相談したのもこの台詞だったと思いますし,また僕も一番聞かれる質問なのですがどうしても最初は UnitTest で網羅的なテストを書こうとしてしまって手が止ってしましました.


品質管理のテストとしての価値はどうなのか

TDD の話しをしていると,どうしても言われるのが,

「TDD やってたらテストの工程はいらないんですね?」

「テスト計画もなくていきなりテストを書くのか?」

的な事を言われます.

"僕は" TDD をやっていてもテストの工程は別に必要だと思ってますし,その工程ではちゃんとテスト計画もすべきだと思っています.

TDD は開発手法であって,テスト手法では無い

というような経験や考えから"僕"は「テスト手法ではない」と言ってしまった方が良いと感ています.


むしろ,TDD で開発するのは,

「emacs で開発するのか vim で開発するのか?」

「Eclipse で開発するのか NetBeans で開発するのか?」

くらいの違いだと思っています.

チーム内では揃えたほうが良いという事も含めて.

(エディタや開発環境もチーム内で揃っていた方がペアプロとかしやすい)



品質管理のテストを一緒にしてはいけないのか?

品質管理のテストを一緒にしたらいけないのかどうかも聞かれた事があるのですが,"僕"は一緒にすべきでは無いと思います.

UnitTest 的なものが一緒になってしまうとどうしても仕様変更時のメンテナンスコストが高くなってしまいます.

(もちろん,テストの工程ではメンテナンスしなくてはいけませんがそれは上記でのべたように別に設けるべきだと思っています)

また,特に DB と連携する部分などで如実に SlowTest の問題が発生してしまいます.

メンテナンスコストの肥大化や SlowTest のせいで逆に TDD がやりにくくなっては本末転倒だと思います.


デブサミで「TDD は テスト手法では無い」と発表すべきだったか?

完全に結果論なのですが,id:babie をはじめ色々な方の意見を聞く事が出来たので僕にとってはとても良かったと思っています.


僕はそもそも,

「TDD はテスト計画をせずにテストしてしまうから……」とか「品質管理のためには……」とか言われるとなぁ TDD はあくまで"開発"手法であって、テスト手法では無いんだよね。もう、TDDで品質があがるって啓蒙するの止めちゃえば、いっそ変な誤解が広がらないんじゃないかなぁ。

http://twitter.com/yoshiori/status/9102087388

という考えから「テスト手法ではない」という発表をしたので,

逆にこの「テスト手法ではない」という考えが広まってしまって凝り固まってしまってしまうような事になってしまったら,

「ヨシオリはああ言っているけど,言いすぎだ!!間違っている!!」

と発表してもらえればなぁと思います.

(もしも世間がそれで凝り固まるくらい開発のための TDD になってくれると個人的には嬉しいのですが)


あわせて読みたい

http://togetter.com/li/5878

http://togetter.com/li/6759

http://togetter.com/li/6923


【追記】BDD という言葉を使わなかった件について【後出し?】

まず、大前提として、純粋に僕が TDD として学んだ事、感じた事を発表したので TDD という言葉を使いました。

BDD としては学んでいないので)


で、それとは別になりますが、何年か前に BDD という言葉を知った時には BDD については TDD に対する混乱を名前を変える事で解決しようとしてるとしか感じず、

(そしてそれは似た様な事を表す別の言葉が出来て逆に混乱の元なのでは?)としかとらえていなかったのてちゃんと学んでいませんでした。


蛇足ですが、逆に今回の件で興味が出たので BDD 学ぼうと思います!!

2010年02月24日 21時37分 | Permalink | コメント | トラックバック

enum ってコンストラクタ持てるの?

持てる。余裕。そして便利

インスタンス制御クラスもシングルトンも enum で

http://d.hatena.ne.jp/amachang/20100215/1266245521

ぶっちゃけただのクラスなので、あんまり知られてないけど,

コンストラクタどころか任意のインターフェースの実装も出来るし,

自分で抽象メソッド定義して実装する事も出来るよ!!


enum Hoge implements Runnable{
	FOO("foo"){

		@Override
		public void run() {
			// 何か処理
		}

		@Override
		public String getAddress() {
			return address;
		}
	},
	BAR("bar"){

		@Override
		public void run() {
			// 何か処理
		}

		@Override
		public String getAddress() {
			return address + "bar";
		}
	};

	String address;

	private Hoge(String address){
		this.address = address;
	}

	abstract String getAddress();
}

enum 恐しい子////


というような話しとか,Exception まわりとかも WEB+DB Vol.52 に纏めてあるので,

良かったら暇な時に読んで感想とか聞かせてくだしあ><

http://gihyo.jp/magazine/wdpress/archive/2009/vol52

WEB+DB PRESS Vol.52

WEB+DB PRESS Vol.52

2010年02月16日 14時41分 | Permalink | コメント | トラックバック

わけのかわらないタイトルですが,そのままです.


import sys;from itertools import ifilterfalse, count;[globals().__setitem__('compile',lambda bf_src : '[globals().__setitem__("dx",0), globals().__setitem__("dseg",[0] * 32768)] '+bf_src.replace('[',' and [ifilterfalse(bool$( dseg#__getitem__(dx) != 0 and [ True ').replace(']','  ] for i in count()))#next() ] ').replace('.',' and [sys#stdout#write(chr(dseg[dx]))] ').replace('+',' and [dseg#__setitem__(dx$dseg[dx] + 1 )] ').replace('-',' and [dseg#__setitem__(dx$dseg[dx] - 1 )] ').replace('>',' and [globals()#__setitem__("dx"$dx + 1 )] ').replace('<',' and [globals()#__setitem__("dx"$dx - 1 )] ').replace(',',' and [globals()#__setitem__("dx"$ord(raw_input(">")[0]))] ').replace('#','.').replace('$',',')),sys.stdout.write('from itertools import ifilterfalse, count;' + compile(sys.argv[2])) if sys.argv[1] == '-s' else eval(compile(sys.argv[1]))]

takano32 のこれを見て

http://taka.no32.tk/diary/20060908.html#p01

  • Python でも出来るかなぁ
  • あ,インデント意識しなきゃだから単純な置き換えじゃ出来なそうだなぁ
  • インタプリタ的に置き換えよう
    • ワンライナだったらいけるんじゃね??

と思って書いてみました.

yoshiori@yoshiori-ubuntu [3]$ python bf.py '>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.'
Hello World!

こんな感じになるのですが,これだけだと面白くないので,コンパイルしたソースも表示出来るようにしました.

引数に [-s] を追加すると中間コード(Python-oneliner)が出力されます.

上記の Hello Workd! を表示する bf は下記のようにコンパイルされます.

yoshiori@yoshiori-ubuntu $ python bf.py -s '>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.'
import sys;from itertools import ifilterfalse, count;[globals().__setitem__("dx",0), globals().__setitem__("dseg",[0] * 32768)]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [globals().__setitem__("dx",dx - 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [globals().__setitem__("dx",dx - 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [globals().__setitem__("dx",dx - 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [globals().__setitem__("dx",dx - 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [sys.stdout.write(chr(dseg[dx]))]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [globals().__setitem__("dx",dx - 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [globals().__setitem__("dx",dx - 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [globals().__setitem__("dx",dx - 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [globals().__setitem__("dx",dx - 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [globals().__setitem__("dx",dx - 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [globals().__setitem__("dx",dx - 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [globals().__setitem__("dx",dx - 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [globals().__setitem__("dx",dx + 1 )]  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [globals().__setitem__("dx",dx - 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [sys.stdout.write(chr(dseg[dx]))]  and [ifilterfalse(bool,( dseg.__getitem__(dx) != 0 and [ True  and [dseg.__setitem__(dx,dseg[dx] - 1 )]   ] for i in count())).next() ]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [dseg.__setitem__(dx,dseg[dx] + 1 )]  and [sys.stdout.write(chr(dseg[dx]))]

これで,「難解プログラミング言語」は読めねーよ!! って人も読みやすくて有名な Python に変換されるので良かったですね!!


ちなみに id:kazuhookuマジメに素数探索を実行すると

1分くらいかかります.

yoshiori@yoshiori-ubuntu [3]$ time python bf.py '>++++[<++++++++>-]>+++++++[<++++++++>-]<+>+++++++++>>++++++++++[<++++++++++>-]<--[>[-]<[->+>+<<]>>[-<<+>>]<-[>[-]<<[->>+>+<<<]>>>[-<<<+>>>]<+[>>[-]>[-]<<[>+>+<<-]>>[<<+>>-]<>[-]+<[>-<[-]]>[-<<<<[->>+>>+<<<<]>>>>[-<<<<+>>>>]<<+>>]<<-<-]> >[-]+<[[-]>-< ]>[-<>>[-]+<<<<[-]+>>>]<<<-]>>>> >[-]+<[[-]>-< ]>[-<<<<<<<<.>>>[-]++++++[<<++++++++>>-]<<.>>++++++[<<-------->>-]<<<<.>>>>>>>>>]<<<<<<->>[-]<<<[->>+>+<<<]>>>[-<<<+>>>]<>+<[[-]>-<<<->>]>[-<<<+++++++++<->>>>]<<]'
97 89 83 79 73 71 67 61 59 53 47 43 41 37 31 29 23 19 17 13 11 07 05 03 02 
python bf.py   57.01s user 0.04s system 99% cpu 57.496 total
2010年02月08日 20時30分 | Permalink | コメント | トラックバック

java-ja 温泉開催します.


java-ja 温泉とは?

Python 温泉(PySpa)にインスパイアして開催している,というか,

PySpa が大体 6 月と 10 月開催なので 3 月くらいにもやらないの?

と思ったら,id:voluntasに「メンドイ,お前がやればいいじゃん」

と言われたのが元なので PySpa と場所も期間も変りません.

違いは「お酒飲んでもいいよ」って事だけです.


なので,ほとんど PySpa のパクりになっちゃうけど,纏めると以下になります.

  • 毎回言っておりますが、温泉旅行であり開発合宿でも勉強合宿でもありません。
  • 食事の時間以外は自由にしていただいて構いません。
    • 参考までに ... 西尾は3日間ほとんど寝てるだけでした(第2回 Python 温泉)
  • 駐車場は 3 台くらい、駅から徒歩20分くらいなので是非電車で。
  • 24 時間使える会議室
  • 24 時間入れる温泉
  • ホワイトボード(無料)
  • プロジェクタ有り(無料)
  • 無線 LAN (主催者側で準備します)
  • 有線 LAN (無料、かなり高速)
  • お茶飲み放題(お湯を準備してくれます)
  • 水飲み放題(冷たい水を準備してくれます)
  • とても理解のある宿のご主人(元プログラマとのこと)
  • 電源タップも準備されています
  • 椅子も結構イイ椅子

参加資格

@yamashiro @yoshiori という意見がありますよ RT @tomerun: @voluntas 参加資格のところがよく分からなかったのでとまどった、というのがあります

http://twitter.com/voluntas/status/8280172789

簡単に言ってしまうと

成人のチンコクラスタなのですが,もうすこし説明すると

成人男性(何かあっても自分で責任がとれる人)

です.

言語とかも関係ありません.


お金が無い人!! 安心してください!!



java-ja 育英会

無線 LAN 完備,3 日間,朝晩飯付きで 24 時間温泉に入れて 2 万円は高くないと思うのですが,

相場として高い安いは別にしても払えなくて参加出来ない人がいるのはかわいそうだよねと,

参加したいっていう折角の意気込みを「お金」がネックになっちゃうのは不毛だ!!

っていう男気溢れる人が参加費を負担してくれちゃいます!!

なんて太っ腹!!!


最初はそういう学生とかにも参加して欲しいよねって事で立ち上がったのですが,

別に学生じゃなくても良くね?って事で学生じゃなくても申し込めるので,おきがるにどうぞ!!

id:t_yanohttp://d.hatena.ne.jp/t_yano/20100105/1262668611
id:warufuzaketaichihttp://d.hatena.ne.jp/warufuzaketaichi/20091226/1261833543

日時

2010/3/20, 2010/3/21, 2010/3/22の2泊3日


場所

熱海/来宮 芳泉閣

貸し切りです

すでに予約済み


費用

2万円です.

余った金額は PySpa と協力して旅館の設備(LAN環境など)にまわします.

実際に第一回はどうだったのか?

Java 書かなきゃいけないとかの縛りもないので,みんな好き勝手に書いています.

また,ボドゲとかが大好きすぎる人間が数人いるので,大ボドゲ大会が開かれたりもしました.

お酒が入るのを少し心配していたのですが,そもそもその場で寝ちゃってもいい会場なので,

何も問題無く終りました.


まとめ

という事で,是非申し込んでくだしあ><

http://java-ja.yoshiori.org/index.php?%E7%AC%AC%E6%8D%A8Q%E5%9B%9E%E7%AC%AC%E5%BC%90%E5%9B%9Ejava-ja%E6%B8%A9%E6%B3%89

2010年02月01日 10時51分 | Permalink | コメント | トラックバック

ドワンゴのパブリックイメージってどうなんだろうねーって

このまえ社内で話してました.

「汚ない格好でコンビニ袋さげて時間関係なく出社」なんて

2ch で書かれてたりしましたし,

「ふざけてる」,「遊んでる」,「破滅」とかまぁ,そんな感じかなぁと……


で,まぁ,大体あってます.

あってるし,否定しないし,しかも,

そう思われてるのを寧ろカッコイイと思ってしまう

駄目男気な人の集りなのです.


ただ,まぁ,本当にふざけて遊んで破滅してるだけだと何も出来ないので,

実際の開発がどんな感じで進んでるのかをちょっと発表してみようと思います.

(僕は裏方の開発なのですが,サービス側の開発の話しも入れる予定)

三周遅れのXP -僕とドワンゴのXP-


そもそものはじまり

「java-ja 第1回チキチキ 地方巡業withひがやすを飲み会in富山」で発表した時に,

id:t-wada からこんなブコメを頂きました.

良い発表でした! 資料もすばらしい。ドワンゴでの試みをぜひ他所でも今後聞きたいなと思いました。私は転ぶメタファを優先するから三本柱というけど、三種の神器の方が語呂としてはカッコいいな。

http://b.hatena.ne.jp/t-wada/20090408#bookmark-12852198

このころから漠然と「あぁ,さらにプロジェクトが進んだら続きを話したいなぁ」と

思っていました.


で,次にJJUG で「15分で0からCIまで用意してTDD開発」というのをやりました.

(これはライブコーディングだったので資料ありません><)


今回の発表が集大成的な感じになるんじゃないかなぁと思っています.

TDD,CI と開発手法的なものが続きましたが,今回はそれにプラスして

タスク管理と見積りの話しをしようと思っています.


タイトル

「三周遅れ」について

遅れって書いてるとネガティブなイメージとか卑屈っぽいイメージで取られてしまうかもしれませんが,そんなつもりは毛頭ありません!!

  • ケント・ベックとかが提唱し
  • それに乗って日本でも先駆者が出て
  • そして僕達が加速する!!

という感じです.

方向を示し(一周目),道を通す(二周目)の人たちがいたからこそ

高速道路の設置が三周目で出来る事を伝えられればいいなぁという

前向きどころか前のめりな三週目です.


方向を示し,道を通してきた人達がいるからこそ,アクセル限界まで踏み込める今の環境と,さらなる高速化のための高速道路の設備的な発表です.


「XP」について

で,XP なんですが,正直僕がプログラマになったころはプログラムの文法やらアルゴリズムを覚えたり考えたりするのが精一杯で,XP とか アジャイルとかは

「何言ってるの??」的なスタンスでした.

ちょっと胡散臭い宗教的な目でも見てました.

でも,実際にやってみると,そうじゃない,例えそうであっても,その宗教の崇める神はコードであり,そこから生まれるソフトウェアであり,さらにそこから生まれる価値なんだという事がわかりました.

なので,逆に昔の僕みたいな考えの人にも是非聞いてもらいたい感じです.


タスク管理と見積りについて

なんか気がつけばサブチームのリーダになっていたので,今まで苦手で逃げてきていた,タスク管理や見積りもしなくてはいけなくなりました.

覚えなくてはいけないのでスキルとして身に付けるために,社内で有志を募って

「アジャイルな見積りと計画づくり」の読書会を開いて勉強しつつ,タスク管理や見積りをしました.


やっていくうちに感じた

「お,これってパフォーマンスチューニングなんじゃね?」

とかも含めてどうやってタスク管理しているのか,見積りしているのかを発表したいと思っています.


まとめ

(今のところ)特に箝口令とかないので,話せるギリギリまで話すつもりです.

成功の部分だけでなく実際にやって失敗したところとかも含めて話しますので

是非,聞きにきてください!!><

2010年2月19日(金)の 13:10〜14:00 ,B(夢扇)で話します!!

http://codezine.jp/devsumi/2010/

2010年01月27日 14時38分 | Permalink | コメント | トラックバック
Powered by はてな



Vox

根強い愛好家がいるフィルムカメラ。フィルムカメラを使った事はありますか?また、フィルムカメラのイメージを教えてください。 「写るんです」→「デジカメ」の世代なので微妙です。 レンズ付きフィルムをフィルムカメラに含めれば使ったことあります。

Read and post comments | Send to a friend

20080512222859.jpg

テーブルの写真を見せてください。 会社の机

Read and post comments | Send to a friend

Powered by Vox

日記

--日記とは人々が言ひたい放題の事を書連ね、無駄な駄文を残して行く行為の総称である。
なおウェブ日記の場合、検索頁からやつと辿り着いた頁がウェブ日記であつた為に、餘計な内容を読まされる事があり、更に目的の項目に辿り着いたかと思つたら期待を裏切る内容だつたりして、結局無駄骨を折る結果を招く。 --

2009年3月10日

test

foo

続きを読む "test" »

テスト

テスト

続きを読む "テスト" »

テスト

テスト

2009年2月 6日

デブサミですよ!!「なんぞwww」の説明 日記

コンテンツ委員なしんちゃんに
「なんぞwww」と微妙なコメントでお勧め(?)いただいていますが,
デブサミで「【13-A-6】ひよこクラブ ver.Engineer」やります!!

続きを読む "デブサミですよ!!「なんぞwww」の説明" »

2009年1月30日

僕の足長オジサン達 日記

R0010780.JPG
年始に bose... の人とかを呼んで子供含めて8人くらいで
ゲーム&鍋パーティーをしました.
その時に bose... さんの子供が Xbox360 のバーンアウトに
すごく楽しんでいました.

で,なんと次の日に Xbox360 ごと買ってしまったみたいです.
お年玉パワーすげぇ!!!

なんかついでに bose... もはまってたようで……
「xxx ってゲーム買っちゃった!!」
「xxx って面白いの!?」
と言い出すしまつ……
まぁ,ここまではありそうな話なのですが……

続きを読む "僕の足長オジサン達" »

<<前のエントリへ

プロフィールらしきもの

birthday

肉がダイスキで
仕事したり、本読んだり
ゲームしたり、映画みたり
自由気ままに生きています。
とりあえず最近はiPodが手放せない。
楽しく生きるために日々努力中♪

元々blog書いてたけど
周りでblogの引っ越しが流行っていたので
自分も引っ越そうと決意。
30分後、めんどくさくなったので
blogはそのまま続け、
日記を新たに書くことに。
blogはRSSで引っ張ってきているが
両方続けられるかどうかは本人も不安。

contact me

mail
My status

find alive.

アーカイブ

最近のコメント

最近のトラックバック

mobile

QR_Code

banner_mt4i_01

RSSフィード

  • Subscribe with livedoor Reader
  • Subscribe in Bloglines
  • はてなRSS
  • Add to Google
  • feedpath

あわせて読みたい

あわせて読みたい