java-ja温泉に行ってきました

ブログに書くまでがjava-jaですよ、ということで。帰って速攻で書く。そしてもうちと寝たいw

自分は2日目の土曜日からの参加でした。前日の金曜日、飲んでいたら終電を逃すという相変わらずの飲んだくれっぷりを発揮し、スーツ姿で帰り着いたのが朝6:00。そして昼過ぎに熱海? なかなか強行スケジュールですね。

人間の睡眠周期で、3時間の倍数が起きやすいんだっけ。忘れちったよーw いいや、とりあえず3時間、ということで寝て起きたら正午。計算があわない。

[2009/04/18 12:05:40] Daisuke MIYAMOTOの発言: おwwwwきwwwたwwww
[2009/04/18 12:06:27] id:happy_ryoの発言: 二度寝してた…ッパネェ
[2009/04/18 12:06:41] Daisuke MIYAMOTOの発言: (゚∀゚)人(゚∀゚)ナカーマ
[2009/04/18 12:06:50] id:happy_ryoの発言: ちょw魔人さんとかぶってるwwww
(中略)
[2009/04/18 12:22:26] Daisuke MIYAMOTOの発言: デッパツする。
(中略)
[2009/04/18 12:47:16] Daisuke MIYAMOTOの発言: 品川なう
[2009/04/18 12:48:21] id:t_yanoの発言: 余裕の寝坊
[2009/04/18 12:48:35] id:shot6の発言: wwwwwwww

一泊組、軒並み寝坊ですw

あーあ。というわけで、急いでPCと着替えだけ用意して出発。ちなみに俺、独りで新幹線乗るの初めて。うひゃひゃ。改札の中に、また券売機と改札あんのねw しらねーw

駅員サンに助けてもらいながら切符買って乗車。JR東海。あれ…?喫煙所がある。JRって全面禁煙化したんじゃなかったっけ。まぁJR東西日本だけだったりするのかな。まぁ、有り難く一服させて頂く。

そして乗車したが、新幹線ってはやいねーー。すぐ熱海。寝る暇もなし。熱海でid:warufuzaketaichiに「赤ラーク100s買って来て」ということで買ってからタクシーに乗り込み、無事到着。

その後はもうカオス。なんか特筆すべき事項が少ない。本編なのにw ひたすら黙々モクモク*1とコードを書く連中(俺はココ)。ひたすらmacのsayコマンドで遊ぶ連中。ひたすらボドゲをしている連中。

そうそう、genericsの型パラメータをreflectionで取得する方法を聞いて感動した。これが今回一番の技術的収穫だったかもしれん。これは別のエントリにまとめることにする。

自分は、ひたすら地豆のリファクタリングデバッグしてた。あと、バリデータの機能強化。参加者の中にちらほら居るジマメンジャー*2と連絡取りながら。

そうそう、地豆のリリースプランも固まったので、これも別エントリにて、近々。

そしてコードを書きながら寝落ち。だいたい3時半くらいかな。翌朝、朝食のコールで目覚めて、さらにちょっとだけ地豆リファクタリング

帰りは踊り子号で品川まで。すばやく直帰。今に至る。

なんか上手くまとまらんかったけど、久々の合宿気分がとても楽しかった。皆さん、お疲れ様でした〜。そして、幹事をはじめスタッフの方々、ありがとうございました!

*1:タバコ

*2:Jiemamyコミッタ

飲み会に参加してきた

第一回チキチキ 飲みにいったら偶然「ひがやすを飲み会」が隣りでやってた飲み会!!に飲みにいったら、偶然「ひがやすを飲み会」が隣りでやってたんですよ。うわーびっくり(棒

最近イベントに参加していなかったので、実は久々なメンバーが多かったかも。またちょくちょく飲みたいな〜。

最初は「マジメな」あっち側と、「いつもの」こっち側だったんですが、最後には入り乱れてとてもバランスの良い飲み会になったんじゃないかなww (一部、ymsr先生がイジられまくったり、といつもの感じももちろん…w)

こういった、ちょっと変質したjava-jaの雰囲気が楽しかった。ホラ、なんか自重しなさすぎる連中ばっかり集まるじゃん、いつもw

1000speakers:4に参加していた、という方もいて、あらためてゆっくりお話させていただきました。なんか俺って急速にメジャーになった人らしく*1、ナニをしたらそんなんになれるんですか、と純粋に質問されたので「うん、自重しないとこうなるミタイだよw」って言っといたw

どこかで何度か話しているけど、俺の人生のターニングポイントって、ことごとく「自重しなかった事の産物」だったりしている。

  • JJUGの創立総会に、懇親会まで単身で乗り込む。
  • 初参加初開催の勉強会(EclipSKY)でスピーカーをする。
  • 初参加の勉強会(java-ja:5 - チキチキMaven2)でスピーカーをする。
  • OSS(Dolteng)のコミッタやらない? と声掛けられたら「やらしてください」って言う。
  • 勉強会(1000speakers:4)のスピーカーに勝手に応募されても受けて立つw
  • SeasarConで喋る人募集してたらとりあえず申し込んで話す。
  • @ITで記事書きませんか?って言われたらそりゃ書く。

だいたいこんなトコロですかね。こんなコトしてると、いつの間にかこんなキャラになってます。みんな、自重いくないよw

*1:id:itengineer辺りによく言われるんだけど、あんま自覚してないw

第一回チキチキ日本ペアプログラミングの会java-ja支部会

Mac童貞を捨てて2日目。無謀にも勉強会(しかもペアプロw)にMacで乗り込んでみた。自分でもいまいち使いこなせていないのにこれでペアプロするのだ。当日はマカーの人と組んで、Mac文化も覚えるんだ〜〜とか目論んでいたのだけど、なんかその場になったらそんな事を考えずにペア組んでた。

和田さんのお話を聞きながら、FizzBuzzのコードを自分のEclipse上にも再現してみようと頑張っていたのだけれど、コード補完のショートカットが上手く機能せず、フォローしきれませんでした>< でも、新しいショートカットキーが色々出てきて「おおおっ」と感動するケースが多かった。(でも、WinとMacの両キーバインドを覚えようとして、混乱したw)

休憩中、喫煙室id:Yoshioriさんに「プラッチックMacなんて」とdisられたり、懇親会ではid:t_yanoさんに「来週新しいMacBook出るらしいよ」とウソを吹き込まれたりと散々でしたorz

実際にペアプロをするにあたって、「ボーリングのスコア計算」なんていうテーマを小耳に挟んだので、そのままじゃつまらないと思い、ダーツのクリケットのスコア計算にチャレンジしてみました。

前半はkenchanと、後半はid:onkとペア。TDDというのはテストコードを真剣に書く分コーディングのスピードは明らかに遅くなる訳だけど、ペアプロというのはあーだこーだ話しながら作るのでやっぱり楽しい。つまるところ、ソロTDDっつーのは結構シンドイんじゃないかなぁ、とも思った。まぁ後々のテストの価値や安心感を考えれば、やっておく価値は十分にあるんですが。ペアプロにはそのシンドさを補填する効能というのもあるんじゃないか、と感じた次第。

実際にコードを書いてみたんですが、まだ粒度細かくメソッドを組み立てていく事に慣れず、大きい単位のメソッドのテストを作っちゃって、実装クラスを作るときに「あ、こんなメソッドも必要だよね」とか言いながら、新しい実装メソッドを作ってしまう。つまりテストの前に実装を作っちゃう訳で、TDDではなくなってしまう。という罠にいっぱい引っかかりました。

あと、TDDをやっていても「どーせ後々こういう実装になるだろうから」という、ある意味「邪念」にとらわれて、「その時点では考えるべきではない拡張性を持った実装」を書いてしまいがちでした。そこはぐっと我慢して書かなきゃいけない所なんだろうけどなぁ…。むずかすぃ。

結局途中で煮え切らないままタイムアップとなってしまったんですが、とっても楽しかった。参加してよかったなぁ、と思えるイベントでした。

ATLを出る時にkenchanと話していたんですが、こうやって大人数で集まってペアプロ大会してみるのも良いけど、企画運営も大変そう。ならさ、ペアプロなんだからさ、誰か身近な人に声掛けて「明日暇? 飲み行かない?」ってノリで「明日暇? ペアプロしねぇ?w」って感じで、数人(最悪二人でもいいし)で集まってやってみるのも良いんじゃないか、と思いました*1。こういうノリであれば、ルノアールとか、そんな気軽な場所でも開催可能ですからね。このアイデア、賛同頂ける方がいらっしゃいましたら、気軽に誘ってください。喜んでお受けします^^ もしくはコメントに「気軽なペアプロ希望」って書いておいてもらえれば、こちらからも誘わせて頂きますYo!

そして懇親会。相変わらずです。高井さんがid:Ewigkeitの腹筋クラッシャーして遊んでました。つかみんな飲み食い激しすぎww 7200円ってすげぇ。5.7回で安く済んだ分が帳消しになりました。やりましたね。

まぁそんなわけで、お話を聞かせてくれたid:t-wada(今回は間違いません!w)さん、企画立案の@yamashiroさん、会場提供してくれたATLさん、ありがとうございました。

最後に。恥ずかしい出来ですが、ペアプロで作ったコードを貼付けておきます。CodeReposに上げる、なんて話もありましたが、よく考えたらクラス1つしか作っていないので、これで十分ですね。添削等頂けたらこれまた幸せです。

package jp.xet.cricket;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

import java.util.Map;
import java.util.TreeMap;

import org.junit.Test;

public class GameTest {

	private static final int SINGLE = 1;
	private static final int TRIPLE = 3;
	private static final int DOUBLE = 2;
	private static final int BULL = 50;

	private int round = 1;
	private int throwCount = 0;

	private Map<Integer, Integer> scoreBoard = new TreeMap<Integer, Integer>();
	{
		scoreBoard.put(15, 0);
		scoreBoard.put(16, 0);
		scoreBoard.put(17, 0);
		scoreBoard.put(18, 0);
		scoreBoard.put(19, 0);
		scoreBoard.put(20, 0);
		scoreBoard.put(BULL, 0);
	}

	@Test
	public void 同じ数字に3回あたっていなければマークされていない() {
		throwDarts(15, SINGLE);
		assertThat(isMarked(15), is(false));
	}

	@Test
	public void 同じ数字に3回あたったらマークされている() {
		throwDarts(15, SINGLE);
		throwDarts(15, SINGLE);
		throwDarts(15, SINGLE);
		assertThat(isMarked(15), is(true));
	}

	@Test
	public void トリプルに1回あたったらマークされている() {
		throwDarts(15, TRIPLE);
		assertThat(isMarked(15), is(true));
	}

	@Test
	public void ダブル1回ではマークされていない() throws Exception {
		throwDarts(15, DOUBLE);
		assertThat(isMarked(15), is(false));
		throwDarts(15, SINGLE);
		assertThat(isMarked(15), is(true));
		throwDarts(15, SINGLE);
		assertThat(isMarked(15), is(true));
	}

	@Test
	public void すべてマークしたらクリア() throws Exception {
		throwDarts(15, TRIPLE);
		throwDarts(16, TRIPLE);
		throwDarts(17, TRIPLE);
		throwDarts(18, TRIPLE);
		throwDarts(19, TRIPLE);
		throwDarts(20, TRIPLE);
		throwDarts(20, TRIPLE);
		throwDarts(BULL, SINGLE);
		throwDarts(BULL, SINGLE);
		assertThat(isClear(), is(false));
		throwDarts(BULL, SINGLE);

		assertThat(isClear(), is(true));
	}

	@Test
	public void ラウンド20を投げ終わったらクリア() throws Exception {
		for (int i = 0; i < (20 * 3); i++) {
			assertThat(isClear(), is(false));
			throwDarts(0, 0);
		}
		assertThat(isClear(), is(true));
	}

	@Test
	public void ダーツを3回投げる毎にラウンドが進む() throws Exception {
		assertThat(getRound(), is(1));
		throwDarts(15, SINGLE);
		assertThat(getRound(), is(1));
		throwDarts(15, SINGLE);
		assertThat(getRound(), is(1));
		throwDarts(15, SINGLE);
		assertThat(getRound(), is(2));
		throwDarts(20, DOUBLE);
		assertThat(getRound(), is(2));
		throwDarts(20, DOUBLE);
		assertThat(getRound(), is(2));
		throwDarts(20, DOUBLE);
		assertThat(getRound(), is(3));

	}

	@Test
	public void ダーツを1回投げる毎にスローカウントが1増える() throws Exception {
		assertThat(getThrowCount(), is(0));
		throwDarts(15, SINGLE);
		assertThat(getThrowCount(), is(1));
		throwDarts(15, DOUBLE);
		assertThat(getThrowCount(), is(2));
		throwDarts(15, SINGLE);
		assertThat(getThrowCount(), is(0));
	}

	@Test
	public void 最初はスコアは0() throws Exception {
		assertThat(getScore(), is(0));
	}

	@Test
	public void 同じ数字_15_に4回あたっていれば15点() throws Exception {
		assertThat(getScore(), is(0));
		throwDarts(15, TRIPLE);
		assertThat(getScore(), is(0));
		throwDarts(15, SINGLE);
		assertThat(getScore(), is(15));
		throwDarts(15, SINGLE);
		assertThat(getScore(), is(30));
	}

	private Integer getScore() {
		int totalScore = 0;
		for (Integer score : scoreBoard.keySet()) {
			if (getCount(score) > 3) {
				totalScore += score * (getCount(score) - 3);
			}

		}
		return totalScore;
	}

	private boolean isClear() {
		if (getRound() == 21 && getThrowCount() == 0) {
			return true;
		}

		for (Integer score : scoreBoard.keySet()) {
			if (isMarked(score) == false) {
				return false;
			}
		}
		return true;
	}

	private boolean isMarked(int score) {
		return getCount(score) >= 3;
	}

	private void throwDarts(int score, int coeff) {
		int count = getCount(score);
		scoreBoard.put(score, count + coeff);
		throwCount++;
		if (throwCount == 3) {
			round++;
			throwCount = 0;
		}
	}

	private int getCount(int score) {
		Integer count = scoreBoard.get(score);
		if (count == null)
			return 0;
		return count;
	}

	public int getRound() {
		return round;
	}

	public void setRound(int round) {
		this.round = round;
	}

	public int getThrowCount() {
		return throwCount;
	}

	public void setThrowCount(int throwCount) {
		this.throwCount = throwCount;
	}
}

*1:今回のイベントが要らなかったという訳じゃなく。今回はキッカケとして大きな意味を持つイベントだったと思います。

第5.7回 突撃されるSeasarコミッタw

というわけで、金曜夜から土曜日にかけて飲んでいました、この部屋で。今回はあんまり自炊にこだわらず、お惣菜を買い込んできて広げてつまむ、学生の部屋飲みみたいな感じになりました。こうやって飲むと安いんやねぇ。結構飲み食いしたのに2500円で済んでしまった。

人を呼ぶとなると、やっぱし片付けるモチベーションになりますねぇ。かなり小ザッパリしましたよ。

例によってUstしてたんだけど、やっぱり広角のカメラが欲しいなぁ、と。レンジが狭いので、ずーーーっとえびちゃんのターンでした。

ちなみに、せとあずささんの大事なものが落ちていましたが、簀巻きにして東京湾に沈め宅急便で送りつけてみました。無事届いたようで何より。

っていうかid:tonocchiなにみつけたんだっけw 全然おぼえてねぇwww

第伍.漆回の日程決定

よくわかんないけど、ダラダラ流れてしまいそうなので、2/22に決定しちゃいます。都合のよろしい方はおいでませ。

ちなみに、参加者が5名に満たなかった場合は流局とします。

http://java-ja.yoshiori.org/index.php?%E7%AC%AC%E4%BC%8D.%E6%BC%86%E5%9B%9E

以上っ。

java-ja 第5.5.1回 id:yamashiro0217 邸で鍋大会。

ほーら、忙しくて放置しちゃったから今更感満載のエントリーが飛び出しました。

まず一番大事。id:yamashiro0217さん、会場提供から料理作りまでありがとう! かっこいいぜビリー。

というわけで、鍋をつつきーのパスタ食いーの。id:yamashiro0217手羽元煮はマジうまかった。あれはレパートリーに入れたいなぁ。今度教えてねん。id:Ewigkeitのボロネーゼのライブコーディングクッキングも凄い。パスタの味付けを自分でしたのはペペロンチーノくらいですよ。ボロネーゼとかマジつくれねー。横で見学しつつ、これもレパートリーに入れようと頑張ってました。

ちなみに俺はカレーを持ってゆきました。評判は悪くなかったようで、よかったよかった。タマネギを40分も炒めて飴色にした甲斐がありましたさ。あと、その辺のスーパーでは、骨付きラム肉ぶつ切りって売ってねーんですよ。冷凍マトンの輪切り(?)みたいな、ハムみたいな形状した薄っぺらい奴か、ラムチョップくらいしか…。

カレーにラムチョップは無しだよねぇ。二本で700円とか平気でしやがるから。というわけで、仕事帰ってから、バイクでハナマサまで仕入れに行ったって訳ですよ。しかもどのハナマサにもあるとは限らない。というか、今のところ秋葉原店でしか見たことがないw というわけで、あちこち回るよりも行っちゃった方がはえーだろと思い、バイクでかっ飛んで買ってきました。

という、料理の腕というよりかは力業で勝ち取った評判だというのはナイショです。だって元は「こくまろ」だし^H^H^H^H^H^H^H^H^H^H^H

そんなこんなで、良いテンションになりながら引き続き話を聞きに入る。みんなやっぱしプロフェッショナルだなー、と。だってば俺、話の内容わかんない事多いもん。皆さん、俺の憧れですよ、もう。

というわけで、Wicket-jaが発足する、とかいう話をしてましたね。半寝で聞いてましたw 珍しく最後の最後にサスペンド気味だった29歳冬。

第一回チキチキ(略)Maven2(ry で喋って来た。

飲み会のjava-jaには一度参加したことがあったが、勉強会としてのjava-jaには初参加。EclipsePlugin開発勉強会(eclipSKY)に引き続き、初参加でスピーカーをするライフハック発動。

いやーーーー。eclipSKYの時はふつーに話せたのだが、今回は何だろうなぁ、緊張スイッチが切れなかった。話し始めればいつも余裕になるのにw 声が震えてドモドモになってもたorz アムロみたいって言われた(笑) ネタを仕込んだから「雪崩れたらどうしよう」の緊張だったと思われるw

しかしまぁ、仕込んだ点ではしっかり笑いがとれたので良しとする。というわけで、スライド公開します。フォントのレイアウトが崩れてしまっているけど、面倒なのでスルー。
他のセッション&懇親会以降のお話は、また別のエントリーで。

続きを読む