previousViewIdからページクラスを取得

これはMLに流れていたのを発見。先人に感謝。

// DI
public S2Container container;
public NamingConvention namingConvention;

// previousViewIdからページクラスオブジェクトを取得
String pageName = namingConvention.fromPathToPageName(previousViewId);
Class pageClass = container.getComponent(pageName).getClass();

previousViewIdを何とかして保持

previousViewIdは直前にリクエストしたページの、/viewからのHTMLパスが入っている。
以下に引用するとおり、「あるPageが以前にどこのPageから遷移してきたかを判別する」用途に使える。

previousViewId(プレビアスビューアイディ)とは、あるPageが以前にどこのPageから遷移してきたかを判別する機能です.
Pageクラスに[previousViewId]というString型のプロパティを定義しておくと、Teedaが自動的に設定してくれます.
previousViewIdには、/view/hoge/foo.htmlのような形式のHTMLまでのパスが設定されます.

http://teeda.seasar.org/ja/extension_features.html#previousViewId

が、しかし。
当然ながら、F5リロードしたら前回の値が消え、F5を押したときの画面のHTMLパスが入る。
これでは「どこから来たか」という判定には一回しか使えない。

自分の画面にいる間(ポストバック or F5更新)は、どうしても「どこから来たか」という情報を保持しておきたかったので、ちょっと考えてみた。というかだいぶ考えてしまった。
スコープアノテーションでもっと簡単にできる想定だったんだけど、よく理解していなかったので思惑通りにはいかず、結局力任せにプログラム書くことに。
ちなみに何故「どこから来たか」という情報を保持しておきたかったかというと、いや、単純に「どこから来たか」という情報を保持しておきたかった…。
previousViewIdだとF5したら内容が変わってしまうし。いまいち使いどころが思い浮かばない。。

package local.web.previous;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.convention.NamingConvention;
import org.seasar.framework.util.StringUtil;
import org.seasar.teeda.extension.annotation.scope.SubapplicationScope;

public abstract class BasePage {

	// 遷移元ページのHTMLパス(Teedaが自動セット)
	public String previousViewId;

	// 遷移元ページのHTMLパスをサブアプリケーションスコープ化するための変数
	@SubapplicationScope
	public String previous;

	public S2Container container;
	public NamingConvention namingConvention;

	public Class initialize() {

		// previousViewIdがある(=どこかのページにアクセスした)場合のみ処理
		if (!StringUtil.isEmpty(previousViewId)) {

			// previousViewIdからページクラスオブジェクトを取得
			String pageName = namingConvention.fromPathToPageName(previousViewId);
			Class pageClass = container.getComponent(pageName).getClass();

			// previousViewIdから取得したページクラスオブジェクトのシンプルな名前(クラス名だけの文字列)を取得
			String previousClassName = this.getSimpleClassName(pageClass.getSimpleName());

			// 現在アクセスしているページクラスのシンプルな名前を取得
			String thisClassName = this.getSimpleClassName(this.getClass().getSimpleName());

			// サブアプリケーションスコープ化した遷移元ページのHTMLパスがある場合のみ処理
			if (!StringUtil.isEmpty(previous)) {

				// 自画面遷移(ポストバック or F5更新)は何もしない
				if (previousClassName.equals(thisClassName)) {
					// 何もしない
				} else {
					// 自分とは違うクラスから遷移してきた場合はpreviousViewIdを保持
					previous = previousViewId;
				}

			} else {
				// 直前にアクセスしたと思われる遷移元ページのHTMLパスで、初期化
				previous = previousViewId;
			}
		}

		return this.init();
	}

	/**
	 * SimpleClassNameのStringから、単純なクラス名だけの文字列を取り出す
	 *
	 * @param className
	 *            SimpleClassNameのString
	 * @return String 単純なクラス名
	 */
	private String getSimpleClassName(String className) {
		return className.substring(0, className.indexOf("$"));
	}

	/**
	 * 子ページクラスのinitialize的メソッド
	 *
	 * @param void
	 * @return Class 遷移先ページクラス
	 */
	abstract public Class init();

}

伊達政宗の遺訓が悟りすぎ

一、仁に過ぐれば弱くなる。義に過ぐれば固くなる。礼に過ぐれば諂(へつらい)となる。智に過ぐれば嘘を吐く。信に過ぐれば損をする。
一、気長く心穏やかにして、よろずに倹約を用い金銀を備ふべし。倹約の仕方は不自由なるを忍ぶにあり、この世に客に来たと思へば何の苦しみもなし。
一、朝夕の食事はうまからずとも褒めて食ふべし。元来客の身に成れば好き嫌ひは申されまじ。
一、今日行くをおくり、子孫兄弟によく挨拶して、娑婆の御暇申すがよし。

http://ja.wikipedia.org/wiki/%E4%BC%8A%E9%81%94%E6%94%BF%E5%AE%97#.E9.81.BA.E8.A8.93

ひとつ目は、バランスが大事ということか。
偏りは良くないよね。

メンバ変数の初期化

メンバ変数はローカル変数と違い変数宣言をするだけで、インスタンスの生成と同時に、あるいはstatic変数の場合はクラス生成と同時に初期値がメンバ変数に代入される。代入される初期値を「デフォルト値」と言う。

データ型 代入される初期値
boolean型 false
byte型 0
short型 0
int型 0
long型 0L
float型 0.0F
double型 0.0
char型 '\n0000'
参照型 null

なお、ローカル変数は変数の宣言だけでは初期値が代入されないので、値を代入しないと利用することができない。

マリオカート

SFC以来のマリカーwktkが止まらない!
同梱のWiiハンドルWiiリモコンをセットしてレッツプレイ!


あ、あれー…マリカーってこんなイラつくゲームだったっけか?
従来の赤甲羅はともかく、なんか全体系の妨害アイテムが多い&うざいんですけど…
気持ちよくトップ独走してても、イナズマ食らうわなんか潰されるわで結構ストレスが…
まぁ、もうちょっとやってみますかね。
あ、そういやなんか痛いバグがあるとかなんとか…

困った

VistaにJava5.0のインストールを試みていた。

jdk-1_5_0_15-windows-i586-p.exeで。

インストールは正常終了するんだけど、javacコマンドが打てない。

binの中を確認したら、javac.exeが存在しない。PC上のどこにもない。

原因は、インストールのパスを変えたせいだった。

インストールのデフォルトパスは「C:\Program Files\Java\jdk1.5.0_15」。

パスに空白スペースが含まれるのを嫌い、「C:\jdk1.5.0.15」にしていたんだけど、試しにデフォルトパスのままインストールしたら、binの中にjavac.exeがあった。

ICカードリーダライタ

住民基本台帳カードには、

という二種類のカードタイプがある。

ビックカメラの通販で、コンビ型に対応したICカードリーダライタを注文した。
取り寄せ品だったけど、どうせ今年度には間に合わないし、まぁ気長にいこう。