メモ

色々検討しつつも、全部のプロセスかいてたら全然すすまねぇなってことで、ちょっぴり書かずに進めてまとめようとか思ってました。
んで、Butterfly使おうと思ってたので空けども、Domaってのがなんか凄く良い様に思えてきたのです。
んで、調べてたら、Mavenでまともにコンパイルできません宣言来ました。いただきましたこれ。僕の負けです。
ちなみにCayenneも調べました。ModelerもDLして起動して、理解しました。これを俺が使う時は破邪の剣ぐらいは装備してるタイミングだわって。
僕今、銅の剣買うのにお金貯めてるぐらいの感じなので、正直巻けた気分で悔しかったです。Domaどうなってんの。ほんと。
違うな。Domaは悪くないよなきっと。SUN、どうなってんの??!!Mavenどうなってんの??????!!!!!!誰かお勧めのORM教えて!!!!!

追伸

円谷プロの4/1サイトが面白いです。例年の如く。

wicket-auth-roles調べてた

さて、えっと、一日か二日ぐらい何も書いてなかったが、気を失うように眠ってしまったりしてたのは毎回書いてる時間を見ればわかってもらえると思うし、別に毎日書かなきゃいけないとかそういうアレは無いしね!仕方ない。
そして、この数日間何度も読んだのは
Wicket: 動的 Web ページの作成およびテスト用の単純化されたフレームワーク
http://rio1218.blog26.fc2.com/blog-entry-82.html
この二つだ。みんなも読んだ方が良い。前者に関してはKumarsun Nadarが優れたクリケットプレイヤーであることがよく解る名文だし、後者はwicket-auth-rolesについてもろもろ書いてあるからちゃんと読むと良いというか、これを読んだせいで色々考え直すべきところが見つかってしまって参った。ほんま大変やで。

で、前回はログインページを作ったので、すごい良い感じに出来たはずだ。ソースを思い出すと恐怖しか感じないので

	@Override
	public Class<SignInPage> getHomePage() {
		//return HomePage.class;
		return SignInPage.class;
	}

てな感じに書き直してどんな雰囲気か見てみるわけです。

いやー、ひでぇわこれ。ボタンすらないしログイン出来るわけ無い。
そんなわけでHTML部分を調整しておこう。ちょっとだけ。

あー、これは、すっげぇ良くなった。やばいね。明確なUI過ぎておばあちゃんでも使用可能だ。
で、これはこれとして置いといて、セッションのクラスというのの名前がAuthenticatedWebSessionなのです。要は認証機能付きWebSessionということなのですけれども、僕はUserに認証の機能書いてた。この前。よくよく考えたらUserに認証機能の責任を持たせるのはバカチンのやることで、認証の機能はこいつに持たせる必要がある。そんなこんなだけど、Userにすでに色々書いてあるので、それに依存する形でまずSketchSessionというクラスを作り、動くのを確認した後でメソッドを移動させてしまえばよいとまーちんふぁうらーさんが言ってたので、寝て起きたらそれをやります。

ToDo
  • サインインページの作成
  • サインイン処理の作成
    • ユーザークラスの作成
  • セッションの作成
    • Userクラスから責任の移動
      • ユーザーパスワードが正しいか確認する
    • ユーザーセッションクラスにサインイン情報保持
    • ユーザークラスをセッションに保存し、未来へと僕の記憶をつないでいく
  • サインイン後ページの作成(HomePage.java)

やっつけ仕事

馬鹿なことをしている間にもう5時だ。寝ないと死ぬ可能性がある。ぱっと出来そうなところだけやっておくことにする。
それはログインページの作成だ!あれ?ぱっと出来そうに無い!!
まずテストだ!

import org.apache.wicket.util.tester.WicketTester;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

public class SignInPageTest {

	private WicketTester tester;
	
	@Before
	public void setUp(){
		tester = new WicketTester(new SketchApplication());
	}
}

ここまではまんまWicket本から持ってきた感じだ。この先もそのまま持ってこよう。

import org.apache.wicket.util.tester.FormTester;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

public class SignInPageTest {

	private WicketTester tester;

	@Before
	public void setUp(){
		tester = new WicketTester(new SketchApplication());
	}

	@Test
	public void ユーザー名とパスワードを入れてサブミットするとログイン後画面に遷移してユーザー名表示(){
		tester.startPage(SignInPage.class);
		tester.assertRenderedPage(SignInPage.class);

		final FormTester form = tester.newFormTester("LoginForm");
		assertNotNull(form);
	}
}

まずはこんなところだろう。これ以上続けると赤いバーが出てきて落ち込むからね。あと、眠いからね。
テスト結果はもちろん真っ赤。SignInPageを作ってやる必要がある。

import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.Model;

public class SignInPage extends WebPage {

	public SignInPage(final PageParameters parameters) {
		super(parameters);
		// Add the simplest type of label
		TextField<String> idField = new TextField<String>("id",new Model<String>(""));
		TextField<String> passwordField = new TextField<String>("password",new Model<String>(""));

		Form<Void> loginForm = new Form<Void>("loginForm");

		loginForm.add(idField);
		loginForm.add(passwordField);
		add(loginForm);

		// TODO Add your page's components here
	}

}

HTMLはこんな感じ。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>Insert title here</title>
	</head>
	<body>
		<div>
			<form name="loginForm" wicket:id="loginForm">
				<input wicket:id="id" type="text" />
				<input wicket:id="password" type="text" />
			</form>
		</div>
	</body>
</html>

真緑だ。5時を12分過ぎた。寝よう。

さてどうするか

深夜3時半にどうなったか?体臭が気になった。僕ももう27歳。深夜3時半ともなればお父さん的スメルを装備し始めてもおかしくない。お風呂に入りながら対策を練ろうということでWicket本片手に湯船につかりつつ、Google Guiceってその実何ぞ?という疑問を少しでも解決しようと思っていたのだが、読んでるうちに少し気になったというか、まぁ、問題ないよね。問題あっちゃ困るしね。問題ないよ。うんうん。気になるけどね。忘れようね。という文章が目に付いたのだった。デン。

これでwicket-guiceの仕様準備は整いました。GuiceComponentInjectorがWicketコンポーネントの生成を監視し、@Injectアノテーションを見つけると、オブジェクトを注入します。

あれ?僕の作ったカッチョイイUserクラス、Wicketコンポーネントと全然関係ないんだけど、これ、どうしたらいいの・・・?ん?あれ?うん。いや、大丈夫大丈夫!頑張れ日本!

Google Guiceとは!

で、Google Guiceとは結局なんなのか。なんでそんなものを使う予定なのか。理由は簡単で、なんか未来っぽいからである。未来、僕たちはこの地球を大切に生きていけるのだろうか。そんな疑問にこのグーグルガイズは答えてくれる。グーグルガイズは未来のクールガイ達だ。思い起こして欲しい。僕たちが目指した未来。それがグーグルガイズだ。大体でいうと、みんなが思う透明チューブの中をエアなんとかカーがビュンビュン走る世界がまさにそれだ。ぴたっとした服を着てビュンビュンしたい諸兄らはまず何はともあれグーグルガイズを使うことを検討して欲しい。他に副作用として、何故だかわからないがテストが簡単になったり、依存関係的なのが薄れて俺たちのクラスちゃんが一人立ちしていく感じになるとか色々あるらしいがあんまり気にする必要は無い。ちなみにグーグルジュースと読む。
で、何故テストが簡単になるのかという話ぐらいは理解しておかないと駄目だろうからしておくと、

class Ushi{

    private Gohan gohan;
    private MoguMogu onakanonaka;

    public Ushi(){
        this.gohan = new CaviarCan();
        this.onakanonaka = this.gohan.akeru();
    }

}

みたいな意味不明なクラスがあったとして、キャビアの缶(CaviarCan)をちょっとnewして開けちゃうにはその前に伝説の鮫ハンターのおじいさんクラスから酒クラスを奪い取って楽しいお船クラスをプレゼントした後、娘クラスを人質にして、3時間以内に鮫クラスを手に入れてこないと色々CaviarCanクラス的には中身が空っぽになる問題があるよね。とか、ある場合、このUshiは現状でCaviarCanクラスの中身を用意してないから駄目で、そういったもろもろを作らないとテストできないとかUshiクラスの問題超えちゃってるじゃん。っていう場合がままあるっていうか、まさに今DB関係がそんな感じだから面倒だなぁって思ってるのだが、通常この場合、

class Ushi{

    private Gohan gohan;
    private MoguMogu onakanonaka;

    public Ushi(){
        gohanYoui();
        this.onakanonaka = this.gohan.akeru();
    }

    private gohanYoui(){
        this.gohan = new CaviarCan();
    }

}

としておいて、Ushiさんを呼び出すときに

ikimono = new Ushi(){
    private gohanYoui(){
        this.gohan = new Namagomi();
    }
}

とかすると、鮫ハンターを探す必要がまったく無くなるっていう素敵な方法があって、でも、これ、なんか面倒だよね。今は簡単な内容だけなんだけど、gohanYoui()がそもそも超難解かもしれないしね。難解の時点で駄目なんだけど。
で、Guiceを使うと

class Ushi{

    @Inject
    private Gohan gohan;
    private MoguMogu onakanonaka;

    public Ushi(){
        this.onakanonaka = this.gohan.akeru();
    }


}

としたら、@Injectの下にあるやつに勝手にGuiceが良い感じのいろいろを詰め込んでくれるっていう機能なんだけど、自分で理解した内容を説明してみたらなんか正しいかどうか心配になってきた。どうしよう。

今後の展開

さて、前文の意味のなさに飽き飽きした方に朗報がひとつあって、なにかというと、話が進みます。今から。具体的にはUserクラスが曲がりなりにも出来た今、この先何をするかを検討します。候補はいくつかあるのです。

ToDoを進める

あなたは予定通りに物事を運び、ビジネスでサクセスするタイプのマンカインドです。そう。僕はToDoというのを作っていた。具体的にはこれだ!

  • サインインページの作成
  • サインイン処理の作成
    • ユーザークラスの作成
      • ユーザーパスワードが正しいか確認する
    • ユーザークラスにサインイン情報保持
  • セッションの作成
    • ユーザークラスをセッションに保存し、未来へと僕の記憶をつないでいく
  • サインイン後ページの作成(HomePage.java)

これをこの先ひとつずつクリアしていくことでイカしたスケジュール管理が行えるって寸法だ!ほんのちょっとしかないしすぐ終わるよね!そう思って進めた仕事って大体時間超過して怒られるよね!まいった!でもやるべきだからToDoなんだ!忘れちゃいけない!

つーかお前DBどうしたの

そう。Userクラスは形が出来たが、DBと全然関係ない感じになってる。ちゃんとDB使わないとこの先どうしようもなくなること請け合いで、場合によっては何かしらの刑罰を受けることも、これ、ありえないとはいえない話である。ちゃんとDBを使ったユーザー認証を作ることは大切なんじゃないだろうか!

ちゃんとやり方調べてから進めろやチョコチン!

チョコチンとは僕が今思いついた罵倒の言葉です。そう。DBも忘れていた感じになっているが、心の端っこあたりにブラブラと引っかかってるわけで、それはそれで今後どうにかするんだろうしどうにかせざるを得ないだろうけど、ひとつ忘れていませんか?Google Guiceの存在を、すっかり忘れちゃいませんか?ということです。


あれ?なんでDBとかGuiceとかToDoに入っていないの?僕も不思議!この先解決していくよ!深夜3時半にその体力があればね!

最初の雑文

さて、冒頭にてこんなことを書かざるを得ないというのは非常に悲しいことだが、僕、みんなに謝ることがあります。はてなダイアリーというのを僕はよく解ってなかったのですが、お、これいいじゃん(アーイェー)と思ったときはスターってのをつけるんですね。その日記に。悲しいかな、僕はそれを知らなかった。その事実を知ろうとしていなかった。そして、誰も僕の事なんか見てくれてないからちょっと背中に付いた電源ボタン押すわみたいな気持ちになっていた。しかし、別に誰に宣伝したわけでもないにもかかわらずこの日記を見てスターをチョイチョイして言ってくれてる人達が一日目から居たのです。これは、奇跡だ。奇跡的というか、むしろなんで君ら僕の日記ん場所知ってんのンみたいな恐怖っぽいものを感じるというか、不思議ですね。南米の方では羽の付いたストローみたいなのが空を飛んでいたり飛んでいなかったりするのが写真に写っていたりすることがあるらしい。世の中不思議がいっぱいなんですね。別にプログラムのことを書くことなく文章をダラダラ書いただけなのにヤルジャンスターを僕にチョンチョンしてくれる人達が居ることも不思議ですが、なによりも矢野勉さんに宮本むなしを奢るという話をピックアップしてスターつけてくれてる人がちょこちょこ居るのが不思議です。はっきり言って僕は矢野勉さんと面識が無いというか僕が一方的に名前を知ってるだけの状態であって、そんな全然お互いのことを知らない二人が宮本むなしに行き、僕が590円のおろしカツ定食を奢ってる姿を想像して御覧なさい。不気味を通り越してファンシーの域です。ほんと、シャーマセンッシタ!てへっ☆←これもらったやつだよぉ〜♪

あー、こいつの息の目止めたい。

さて実践

と、おおっと!ここで順番を間違えた!先にUserクラスを作ってしまったのだ。
中身は無かったことにして、まずテストから作ろう。

public class UserTest extends TestCase{
	@Test
	public void ログイン出来るUser(){
		User user = new User("admin","pass");
		assertTrue(user.isLogined);
	}

	@Test
	public void ログイン出来ないUser(){
		User user = new User("admin","test");
		assertFalse(user.isLogined);
	}

}

こんなところか。テストを動かす。かと思ったら、当然動かない。
Userの中身を作ろう。

	public String userName;
	public boolean isLogined = false;
	public User(final String username, final String password){
		this.userName = username;
		isLogined = true;
	}

jUnitがエラーを出す。「テストが無い!」そんなわけは無い。作ったはずだ。間違ってる。extends TestCaseって古いんだって!

import static org.junit.Assert.*;

public class UserTest{
	@Test
	public void ログイン出来るUser(){
		final User user = new User("admin","pass");
		assertTrue("ログイン出来る", user.isLogined);
	}

	@Test
	public void ログイン出来ないUser(){
		final User user = new User("admin","test");
		assertFalse("ログインできない", user.isLogined);
	}

}

便利な世の中だ。やっと動いた結果、二つ目のテストが通らないとわかる。当然だ。直そう。

public class User {
	public String userName;
	public boolean isLogined = false;

	public User(final String username, final String password){
		this.userName = username;
		if("pass".equals(password)){
			isLogined = true;
		}
	}
}

一瞬じゃないっすか。洒落ならん。一瞬で真緑ですよ。満足したので寝よう。明日以降、これをセッションに保存して上手にやっていくことになる。
あと、追加しておくべきことがある。パスワードが単に"pass"かどうかを見てるだけなので、これを直す必要があるが、今はいいだろう。DBを使う必要が出てからだ。出てるだろ。忘れよう。

  • サインインページの作成
  • サインイン処理の作成
    • ユーザークラスの作成
      • ユーザーパスワードが正しいか確認する
    • ユーザークラスにサインイン情報保持
  • セッションの作成
    • ユーザークラスをセッションに保存し、未来へと僕の記憶をつないでいく
  • サインイン後ページの作成(HomePage.java)