2014年5月6日火曜日

Google Maps JavaScript API v3でマップのサイズを変更する方法

Google Maps JavaScript API v3でマップのサイズを変更する方法をメモしておきます.

マップのサイズを動的に変更すると,次のように一部が欠けているような感じになることがあります.

これを起こさないようにするには,サイズの変更後にマップに対して「resize」イベントを送ればいいみたいです. そうすると,次のように一部が欠けることなく,マップのサイズを変更することができます.

試しに作ってみたコードは以下のとおりです.

<!DOCTYPE html>
<html>
<head>
<title>Google Maps API v3 Map Resize</title>
<style>
html {
height: 100%;
}
body {
position: relative;
height: 100%;
margin: 0;
}
#map {
position: absolute;
}
</style>
<script src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
<button id="shrink_button">-</button>
<button id="expand_button">+</button>
<div id="map"></div>
<script>
var x = 40;
var y = 40;
var width = 20;
var height = 20;
var mapElement = document.getElementById('map');
mapElement.style.left = x + "%";
mapElement.style.top = y + "%";
mapElement.style.width = width + "%";
mapElement.style.height = height + "%";
var mapOptions = {
center: new google.maps.LatLng(35.0, 135.0),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(mapElement, mapOptions);
var shrinkButtonElement = document.getElementById('shrink_button');
shrinkButtonElement.addEventListener("click", function () {
x += 5;
y += 5;
width -= 10;
height -= 10;
mapElement.style.left = x + "%";
mapElement.style.top = y + "%";
mapElement.style.width = width + "%";
mapElement.style.height = height + "%";
google.maps.event.trigger(map, 'resize');
});
var expandButtonElement = document.getElementById('expand_button');
expandButtonElement.addEventListener("click", function () {
x -= 5;
y -= 5;
width += 10;
height += 10;
mapElement.style.left = x + "%";
mapElement.style.top = y + "%";
mapElement.style.width = width + "%";
mapElement.style.height = height + "%";
google.maps.event.trigger(map, 'resize');
});
</script>
</body>
</html>

2014年4月2日水曜日

CentOS6.5をネットワークインストールするためのUSBを作成

CentOS6.5をネットワークインストールするためのUSBを作成してみました. 手順をメモしておきます.

1.Linux Live USB Creator (Version 2.8.27)をWindows 7にインストール
2.CentOS-6.5-x86_64-netinstall.isoファイルをダウンロード
3.USBメモリを装着
4.Linux Live USB Creatorを起動し,下記の通り指定し,実行
  • 装着したUSBメモリを指定
  • ダウンロードしたISOファイルを指定

2014年2月3日月曜日

[読了]BORN TO RUN

「BORN TO RUN」を読みました.

Christopher McDougall: BORN TO RUN, NHK出版, 2010-02

本書についてのメモを以下に記しておきます.

ジョギングを始めてから4年目になる.1年目は5km走るのがやっとだったが,2年目には20kmを越えて走れるようになった.当時は,ひと月の走行距離が100kmを超えていたし,1kmを5分程度で走れるようになった.でも,最近は,ひと月に50kmを走るのがやっとで,1kmを5分台で走れなくなった.

原因は左膝の痛みである.走る回数が多かったり,1度に10kmぐらい走ったりすると,左膝が痛くなる.それを我慢して走ると,数日間激痛に悩まされることになる.4年も続けると,市民マラソンとかに挑戦したくなるのだが,「出場=ジョギングリタイア」になるはずなので,そうするわけにはいかない.そんな状況に嫌気がさしていたときに目に止まったのが本書である.

本書は,走ると足が痛くなる理由や,走りと人類の進化との関係を取り上げながら.著者と様々なランナー,そしてある部族との交流を描いた物語である.彼らの交流については,本書を読んでもらうことにして,ここでは,走ると足が痛くなる理由や,走りと人類の進化との関係について簡単にまとめておく.

走ると足が痛くなるのは,シューズと走り方に原因がある.人間の足は,長い進化の過程において裸足で走ることに最適化された.そのため,シューズを履いて走ると,そのバランスが崩れて,足の各部に痛みが生じる.また,足の接地部分を踵(かかと)から爪先に移して走る方法は,足のひねりを過度に引き起こし,シューズと同様の結果を招く.本書では,「高価なシューズほど故障率が上がる」,「分厚いクッション付きのシューズが踵から接地する走り方を産んだ」,「裸足でトレーニングすると,怪我をしなくなる」などの事例を挙げながら,その原因について分析している.

走りと人類の進化の話では,人間の足が裸足で走るのに最適化された理由について答えている.他の陸上動物と比べてこれといった強みを持たない人類が現在まで生き残れたのはなぜか.それは,我々人類が走る能力を身につけたからである.走る能力といっても,我々人類が身につけたのは,短い距離を速く走る能力ではなく,長い距離を絶え間なく走る能力である.ほとんどの陸上動物が速く走る能力を選んだのに対し,我々人類は長く走る能力を選んだ.それは,速く走る動物達は,長く走り続けるとバテて動けなくなるからだ.大昔の人類は,獲物を狩る手段を得るため,長い距離を絶え間なく走る能力を獲得したのである.

いずれも目からウロコ的な話だが,真偽の程は実践で確かめてみることにしたい.どうもアフリカのマラソンランナーの走り方がベストみたいなので,それを真似てみることにした.そうすると,踵から着地せずに走れるらしい.膝痛が解消すればよいのだが,さてどうなることやら.ちなみに,本書を読むと,読者は走りたくなるそうである.その話は本当だったので,走ろうかどうか迷っている人は,本書を読んで見るのが良いかもしれない.

2014年1月29日水曜日

線形回帰をJavaで実装

文献[1]で紹介されている線形回帰をJavaで実装してみました.

線形回帰は,与えられたデータに適した関数を基底関数の線形結合から求める手法です. 多項式基底とベイズ基底について正規化項ありとなしで関数を求めてみました. 結果は次の図のとおりです.

[1] 中谷 秀洋: 線形回帰を実装してみよう, 機械学習はじめよう 第11回, http://gihyo.jp/dev/serial/01/machine-learning/0011

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.ArrayRealVector;
import org.apache.commons.math3.linear.LUDecomposition;
import org.apache.commons.math3.linear.RealMatrix;
import org.apache.commons.math3.linear.RealVector;
public class LinearRegression {
List<BasisFunction> basisFunctions = new ArrayList<BasisFunction>();
double lambda = 0.0;
RealVector weightVector;
RealMatrix identityMatrix() {
RealMatrix matrix = new Array2DRowRealMatrix(this.basisFunctions.size(), this.basisFunctions.size());
for (int i = 0; i < this.basisFunctions.size(); i++) {
matrix.setEntry(i, i, 1.0);
}
return matrix;
}
RealVector phiVector(double x) {
RealVector vector = new ArrayRealVector(this.basisFunctions.size());
for (int i = 0; i < this.basisFunctions.size(); i++) {
double term = this.basisFunctions.get(i).calculate(x);
vector.setEntry(i, term);
}
return vector;
};
RealMatrix phiMatrix(List<Example> trainingSet) {
RealMatrix matrix = new Array2DRowRealMatrix(trainingSet.size(), this.basisFunctions.size());
for (int i = 0; i < trainingSet.size(); i++) {
Example example = trainingSet.get(i);
RealVector rowVector = phiVector(example.x);
matrix.setRowVector(i, rowVector);
}
return matrix;
}
RealVector tVector(List<Example> trainingSet) {
RealVector vector = new ArrayRealVector(trainingSet.size());
for (int i = 0; i < trainingSet.size(); i++) {
Example example = trainingSet.get(i);
vector.setEntry(i, example.y);
}
return vector;
}
public void learn(List<Example> trainingSet) {
RealMatrix I = this.identityMatrix();
RealMatrix PHI = this.phiMatrix(trainingSet);
RealMatrix PHI_T = PHI.transpose();
RealVector t = this.tVector(trainingSet);
RealMatrix C = I.scalarMultiply(this.lambda).add(PHI_T.multiply(PHI));
RealVector c = PHI_T.operate(t);
this.weightVector = new LUDecomposition(C).getSolver().solve(c);
}
public double calculate(double x) {
return this.weightVector.dotProduct(this.phiVector(x));
}
public void addBaseFunction(BasisFunction baseFunction) {
this.basisFunctions.add(baseFunction);
}
public void setLambda(double lambda) {
this.lambda = lambda;
}
public static interface BasisFunction {
double calculate(double x);
}
public static class Example {
double x;
double y;
Example(double x, double y) {
this.x = x;
this.y = y;
}
}
}
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class LinearRegressionTest {
@SuppressWarnings("serial")
static List<LinearRegression.Example> trainingSet = new ArrayList<LinearRegression.Example>() {{
add(new LinearRegression.Example(0.02, 0.05));
add(new LinearRegression.Example(0.12, 0.87));
add(new LinearRegression.Example(0.19, 0.94));
add(new LinearRegression.Example(0.27, 0.92));
add(new LinearRegression.Example(0.42, 0.54));
add(new LinearRegression.Example(0.51,-0.11));
add(new LinearRegression.Example(0.64,-0.78));
add(new LinearRegression.Example(0.84,-0.79));
add(new LinearRegression.Example(0.88,-0.89));
add(new LinearRegression.Example(0.99,-0.04));
}};
@Test
public void test1() {
System.out.println("test1");
LinearRegression linearRegression = new LinearRegression();
for (int i = 0; i < 4; i++) {
linearRegression.addBaseFunction(new PolynominalBasis(i));
}
linearRegression.learn(trainingSet);
for (double x = 0.0; x <= 1.0; x += 0.01) {
double y = linearRegression.calculate(x);
System.out.printf("%.2f\t%.2f\n", x, y);
}
}
@Test
public void test2() {
System.out.println("test2");
LinearRegression linearRegression = new LinearRegression();
for (int i = 0; i < 4; i++) {
linearRegression.addBaseFunction(new PolynominalBasis(i));
}
linearRegression.setLambda(0.01);
linearRegression.learn(trainingSet);
for (double x = 0.0; x <= 1.0; x += 0.01) {
double y = linearRegression.calculate(x);
System.out.printf("%.2f\t%.2f\n", x, y);
}
}
@Test
public void test3() {
System.out.println("test3");
int N = 10;
double s = 0.1;
LinearRegression linearRegression = new LinearRegression();
for (int i = 0; i <= N; i++) {
linearRegression.addBaseFunction(new GaussianBasis(i * 1.0 / N, s));
}
linearRegression.setLambda(1.0);
linearRegression.learn(trainingSet);
for (double x = 0.0; x <= 1.0; x += 0.01) {
double y = linearRegression.calculate(x);
System.out.printf("%.2f\t%.2f\n", x, y);
}
}
@Test
public void test4() {
System.out.println("test4");
int N = 10;
double s = 0.1;
LinearRegression linearRegression = new LinearRegression();
for (int i = 0; i <= N; i++) {
linearRegression.addBaseFunction(new GaussianBasis(i * 1.0 / N, s));
}
linearRegression.setLambda(0.01);
linearRegression.learn(trainingSet);
for (double x = 0.0; x <= 1.0; x += 0.01) {
double y = linearRegression.calculate(x);
System.out.printf("%.2f\t%.2f\n", x, y);
}
}
static class PolynominalBasis implements LinearRegression.BasisFunction {
int n;
PolynominalBasis(int n) {
this.n = n;
}
@Override
public double calculate(double x) {
return Math.pow(x, n);
}
}
static class GaussianBasis implements LinearRegression.BasisFunction {
double mu;
double s;
GaussianBasis(double mu, double s) {
this.mu = mu;
this.s = s;
}
@Override
public double calculate(double x) {
return Math.exp(-1.0 * (x - this.mu) * (x - this.mu) / (2.0 * this.s * this.s));
}
}
}