ALGOBIT

2010/10/05

ハノイとバベルの塔 第六階 – 端末アニメ in Java

Filed under: 離散的な気まぐれ — タグ: , — Kohyama @ 03:05

第五回 の C の実装の構造をそのまま踏襲します.

class Toh06 {
	static Stack[] pegs = new Stack[3];
	static int N, w;
	static String ws = "", bar = "", grnd = "";

	static void print()
		throws InterruptedException
	{
		int i, j, k;

		Thread.sleep(w);
		System.out.print("\u001b[2J\u001b[2;1H");
		for (i = 0; i < N; i++) {
			for (j = 0; j < 3; j++) {
				if (pegs[j].depth < N - i)
					System.out.print(" " + ws + "|" + ws + " ");
				else
					System.out.print(
					  " " +
					  ws.substring(pegs[j].data(N - i - 1)) +
					  bar.substring(N - pegs[j].data(N - i - 1)) +
					  "|" +
					  bar.substring(N - pegs[j].data(N - i - 1)) +
					  ws.substring(pegs[j].data(N - i - 1)) +
					  " ");
			}
			System.out.println("");
		}
		System.out.println(grnd);
	}

	static void move(Stack src, Stack tmp, Stack dst, int n)
		throws InterruptedException
	{
		if (n == 0)
			return;
		move(src, dst, tmp, n - 1);
		dst.push(src.pop());
		print();
		move(tmp, src, dst, n - 1);
	}

	public static void main(String[] args)
		throws InterruptedException
	{
		int i;

		/*
		 * init
		 */
		N = (args.length < 1)?3:Integer.parseInt(args[0]);
		w = (args.length < 2)?500:Integer.parseInt(args[1]);
		pegs[0] = new Stack(N);
		pegs[1] = new Stack(N);
		pegs[2] = new Stack(N);
		for (i = 0; i < N; i++)
			pegs[0].push(N - i);

		/*
		 * for display
		 */
		for (i = 0; i < N; i++)
			ws += " ";
		for (i = 0; i < N; i++)
			bar += "-";
		for (i = 0; i < 6*N + 9; i++)
			grnd += "=";

		/*
		 * do
		 */
		print();
		move(pegs[0], pegs[1], pegs[2], N);
	}
}

class Stack {
	int depth;
	int[] _data;
	Stack(int n) { _data = new int[n]; depth = 0; }
	void push(int data) { _data[depth] = data; depth++; }
	int pop() { depth--; return _data[depth]; }
	int depth() { return depth; }
	int data(int position) { return _data[position]; }
}

スタックを (java.util.Stack は使わず) 内部クラスで定義.
この規模ではオブジェクト指向の良さは特に発揮できないかもしれませんが, もう少し整理された書き方ができるとは思います.

他の言語と違うところは. ファイル名とクラス名を一致させないといけないところです.
上記コードを Toh06.java として保存する必要があります.

2010/03/24

Google App Engine で java.util.Date

Filed under: 離散的な気まぐれ — タグ: , — Kohyama @ 01:50


GAE/J では java.util.Date 型を new すると, タイムゾーンがUTC のオブジェクトができます.
タイムゾーン JST で, 文字から Date 型にしたり, Date 型の値を JST で文字列化する場合の覚書.
宣言:

private java.text.SimpleDateFormat sdf;

初期化:

sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("JST"));

JSTの時刻の書かれた String s をパースして Date d へ代入:

d = sdf.parse(s);

Date d を文字列化して String s に代入:

s = sdf.format(d);

2010/03/03

Google App Engine / Java & GWT 使ってみました

Filed under: 離散的な気まぐれ — タグ: , , , — Kohyama @ 16:40

手一杯で, エントリ書いてなかった.
Mitaka.rb&三鷹プログラマーズカフェ合同忘年会2009でのLTで発表だけしてやりかけだった, GAE/J & GWT のプログラム,
PGCafe / Cafe Logger & Cafe Logs
pgcafelogger screen shot

1月28日から稼動させてます.
しかし, 本当に使ってみました的な状態で, コードもすごく汚いしエラーもでまくる.
使ってくださってる方, ありがとうございます.

つらつら感想など.
Java で書くとして, Datastore も GWT を使わないなら, 「無料で使いはじめられるレンタルサーバに, Servlet/JSP によるWEBアプリケーションを公開できる. アプリケーションのアップロードや管理は, サーバ側のOS的なことは何も知らなくてよく, 専用の管理画面やプラグインで簡単にできる」と考えてよいと思う.
仕事で Servlet/JSP の開発経験があるけれど, 個人的にWEBアプリを公開するにはサーバがない, という人にはとても良い環境かと思う.
自分の場合は, 本質的には 「DataStore と GWT を使ってみた」というべきかな.
元々DB屋ではないので, ビッグテーブルでプログラム側に処理が寄るのは, 違和感ない.
ただ, DataStore にアクセスする API に精通するのはまだいいとして, どの API を選択するかで悩むこと自体や, DataStore の制限に精通したりするのは, 汎用的に使えていく知識かどうか微妙と思う.
もちろん, 似たようなサービスを利用する場合によく起こりえる問題を含んでいると思うので, 経験値は上がるけど.
GWT (Google Web Toolkit) はすばらしい. JavaScript を一切書かないで, Ajax できるなんてすばらしい. プログラマには, サーバにRPCコールで処理を要求する Java クライアントを書いているようにしか見えない. GAE経由で知るまで知らなかったなんて, 疎すぎる俺.
しかし, サーバ側と通信する必要の無い画面上の動的処理は普通に JavaScript で書けばいいと思うよ.
あと, スタイルも, Java のコードからある程度制御できるけど, サーバ側でデータの問い合わせ結果でスタイルを動的に変えたいところ意外は, 普通に css 使えばいいと思う.

2010/01/23

Unchecked cast

Filed under: 離散的な気まぐれ — タグ: , — Kohyama @ 23:50

Java です.

List<Hoge> lh;
...
lh = (List<Hoge>)anInstance.aMethod();
for (Hoge h: lh) {

anInstance.aMethod() は, 返り値の型は Object だが, ここでは, List<Hoge> を返すと分かっているとする.
コンパイル時に “lh = ” の行で

Type safety: Unchecked cast from Object to List<Hoge>

の warning が出る.

@SuppressWarnings("unchecked")

で warning を出さないことはできるが, なんとなく気にいらないので,

List<?> lh;
...
lh = (List<?>)<em>anInstance.aMethod()</em>;
for (Object o: lh) {
h = (Hoge)o;

とする.
これもスッキリしないけど.
なんらかの方法でスッキリ済みの人には, 何を今更と怒られるかもしれませんが.

Copyright © 2010 Yoshinori Kohyama All Rights Reserved.