DocumentBuilderでエラー出力が出る

Java6u10

c:/temp/test.txtは実在する非XMLファイル。

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

public class Test {
	public static void main(String[] args) throws Exception {
		try {
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dbFactory.newDocumentBuilder();
			File txtFile = new File("c:/temp/test.txt");
			Document doc = builder.parse(txtFile);
		} catch (Exception e) {
		}
	}
}

結果、エラー出力が出る。例外が吐かれるだけにして欲しい。

[Fatal Error] test.txt:1:1: Content is not allowed in prolog.

コンソール入力

覚書です。バックスペースとか入力しても問題無いけど、InputStreamReaderが勝手に処理してくれるのかな?

public static String getStringFromConsole(String message) {
	StringBuilder sb = new StringBuilder();
	try {
		char c = 0;
		System.out.print(message + "> ");
		InputStreamReader fp = new InputStreamReader(System.in);
		while(true) {
			c = (char)fp.read();
			if (c == '\r' || c == '\n') {
				break;
			}
			sb.append(c);
		}
		fp.close();
	} catch (Exception e) {
		e.printStackTrace();
	}
	return sb.toString();
}

Windowsタスクを殺す方法

覚書です。実際はprocess.getInputStreamとprocess.getErrorStreamを処理する必要あり。

public static void killTask(String taskName) throws Exception {
	ProcessBuilder pb = new ProcessBuilder("taskkill", "/F", "/FI", "IMAGENAME eq " + taskName);
	Process process = pb.start();
}

原発1基の電力を太陽電池で賄うには

平均的な原子力発電所1基の出力=110万kW
太陽からのエネルギー=1kW/m^2
変換効率50%と仮定
太陽電池パネルの向きが変わらないとして、太陽光は24時間直角に照射される場合と比べて1/πの効率で照射されると仮定
日照時間や季節や緯度は無視

必要面積 = 0.5 * (1100000 kW) / (1/π kW/m^2) = 6908000 m^2 = 6.9 km^2
=2.63km四方

原発1基と同等の電力を得るにはディズニーランドとディズニーシーと葛西臨海公園を合わせた程度の面積が必要。

参考資料
Blogger
よくわかる!技術解説 - 太陽光発電

アスペクト比がおかしい動画をその場で補正して観れるようにするプログラムを作ってみた

YouTube, Pandora.TV, Veohなどの動画投稿サイトにはよくアスペクト比がおかしくて人物の顔が縦に長くなっているような動画が投稿されている。こういう動画は普通は我慢していらいらしながら観るか、FLVをダウンロードしてFLVプレーヤで補正して観るものだと思うが、私はその場で直接補正しながら観たいと思っている。

解決方法は大体下記のようなものがあると思う。

  • ディスプレイドライバをいじって任意の解像度で表示できるようにする(1600x1200のディスプレイに1200x1200を引き伸ばして表示できるようにするなど)
  • ブラウザの中身をいじって全体を横に引き伸ばして表示できるようにする
  • FlashPlayerの中身をいじってFlashの表示を横に引き伸ばせるようにする
  • swfの中身を勝手にいじってアスペクト比の変更に対応する
  • 画面をキャプチャして別の場所に横に引き伸ばした絵を表示する

上4つは少なくとも私には簡単にはできなさそうなので5つ目のものを実験的に作ってみた。

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class Scaler extends JFrame {
	public static void main(String[] args) throws Exception {
		Scaler scaler = new Scaler();
		scaler.run();
	}

	private Robot robot;
	private Graphics g;

	Insets insets;
	int x, y, w, h;
	int cx, cy, cw, ch;

	float aspectRatio = 4f / 3;
	float zoomRatio = 1.7f;

	public Scaler() throws Exception {
		x = 100;
		y = 550;
		w = 800;
		h = 600;

		cx = 300;
		cy = 100;
		cw = 480;
		ch = 450;

		robot = new Robot();
		UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
		SwingUtilities.updateComponentTreeUI(this);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(null);
		addNotify();
		insets = getInsets();
		setLocation(x, y);
		setSize(w + insets.left + insets.right, h + insets.top + insets.bottom);
		g = getGraphics();
		setVisible(true);
	}

	public void run() {
		for (;;) {
			try {
				BufferedImage img = captureImage(cx, cy, cw, ch);
				BufferedImage scaledImg = changeAspectRatio(img, Image.SCALE_FAST);
				g.drawImage(scaledImg, 0, 0, null);
				try {
					Thread.sleep(10);
				} catch (Exception e) {
				}
			} catch (Exception e) {
				e.printStackTrace();
				System.exit(0);
			}
		}
	}

	public BufferedImage captureImage(int x, int y, int w, int h) throws Exception {
		Rectangle bounds = new Rectangle(x, y, w, h);
		return robot.createScreenCapture(bounds);
	}

	public BufferedImage changeAspectRatio(Image img, int scaleType) {
		img = img.getScaledInstance((int)(img.getWidth(null) * zoomRatio),
		(int)(img.getHeight(null) / aspectRatio * zoomRatio), scaleType);
		BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
		Graphics g = bi.getGraphics();
		g.drawImage(img, 0, 0, null);
		return bi;
	}
}

見てのとおりjava.awt.Robotでスクリーンの一部をキャプチャし、java.awt.Image#getScaledInstanceでアスペクト比を修正し、ちょっと拡大して表示している。

で、結果は↓のようになった。

若干のラグはあるもののとりあえず問題なし。普通に観れる。
ちなみにImage.SCALE_FASTではなくImage.SCALE_SMOOTHを使うと私の環境では処理時間がかかりすぎてフレーム数が落ちてしまった。
気が向いたら動画部分の自動判別やウィンドウサイズとアスペクト比の連動なんかを実装するかもしれない。

私に最適なスポーツとは?

最近ダイエットを始めたけれど、自転車と腕立て伏せ以外にもうちょっと楽しいスポーツをやりたいと思い始めた。

私はスポーツの好き嫌いが多分にあるので色々と条件を書いてみる。

  • 大掛かりな設備を占有する必要がない
  • 大量の道具や動物(馬とか)が要らない
  • 初心者でも何度かやればある程度形になる
  • 少人数でできる
  • 対戦できる
  • 臨機応変に頭を使う
  • 骨折などの危険が少ない
  • 体力が付く
  • 走るだけだったりしない
  • 待ちが少ない
  • 結果が数値などわかりやすい形で出る
  • オールシーズン

うーん。近い物としてはバスケの3on3とかかなぁ。あれは初心者には敷居が高すぎるように思うけども。無い物ねだりしてもしょうがないので過去の資産を生かした案を考えてみる。

今までそれなりに戦える程度にやったことがあるものはバドミントンとフットサル。どちらもそれなりの人数を確保してフットサルコートや体育館を借りる必要がある。どちらかというと球(羽)に触れることが多いバドミントンの方が性に合っているかな。バドミントンは走らなくてもいいしね。

そんなわけで手頃なバドミントンクラブを探してみようと思う。中野近辺で土日にやってて初級者でもなんとかなるところがいいなぁ。