memo2


RewriteEngine On
RewriteRule ^/WebApplication1/([A-Z])/login ajp://localhost:8009/WebApplication1/login?plantCd=$1 [P]

memo

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author dokyou3
 */
public class RedirectServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String[] paths = request.getRequestURL().toString().split("/");
        String plantCd = paths[paths.length-2];
        response.sendRedirect(request.getContextPath() + "/login?plantCd=" + plantCd);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>RedirectServlet</servlet-name>
        <servlet-class>RedirectServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>RedirectServlet</servlet-name>
        <url-pattern>/N/login</url-pattern>
        <url-pattern>/Q/login</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

memo

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*
* @author dokyou3
*/
public class RedirectServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String[] paths = request.getRequestURL().toString().split("/");
String plantCd = paths[paths.length-2];
response.sendRedirect(request.getContextPath() + "/login?plantCd=" + plantCd);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}

@Override
public String getServletInfo() {
return "Short description";
}

}





LoginServlet
LoginServlet


RedirectServlet
RedirectServlet


LoginServlet
/login


RedirectServlet
/N/login
/Q/login



30


神奈川J1チームの聖地

今回はこの記事をサッカーでやってみました。

horicun.hatenablog.com

神奈川県のJ1チーム(2016)で同じことをやってみます。

http://horicun.hatenablog.com/entry/2017/06/18/200726:f:id:dokyou3:20170624225437p:plain

聖地はどこだ!

まずは外心を求めてみます。

import math

# yokohama
x1 = 35.510195
y1 = 139.606362
# kawasaki
x2 = 35.593980
y2 = 139.653738
# shounan
x3 = 35.343804
y3 = 139.341233

x_n = (x1 ** 2 + y1 ** 2) * (y2 - y3) + (x2 ** 2 + y2 ** 2) * (y3 - y1) + (x3 ** 2 + y3 ** 2) * (y1 - y2)
y_n = (x1 ** 2 + y1 ** 2) * (x3 - x2) + (x2 ** 2 + y2 ** 2) * (x1 - x3) + (x3 ** 2 + y3 ** 2) * (x2 - x1)
d = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)
x = x_n / (2 * d)
y = y_n / (2 * d)

print(str(x) + "," + str(y))

実行結果がこれ

35.75784648334858,139.26616287535109

googleで調べてみると (・・?)
f:id:dokyou3:20170624233002p:plain

山??

どこだ??

f:id:dokyou3:20170624234201p:plain

神奈川J1チームの聖地が東京に…

しかも結構遠い。。。

というわけで電車の所要時間で聖地を探してみます。

public class App {
	public static void main(String[] args) throws IOException {
		final String chromeDriverPath = "chromedriver";
		System.setProperty("webdriver.chrome.driver", chromeDriverPath);
		WebDriver driver = new ChromeDriver();

		String to[] = { "日産スタジアム", "等々力競技場", "スタジアム平塚" };

		File file = new File("out.csv");
		PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));

		Scanner scanner = new Scanner(new File("station20170403free.csv"));
		scanner.nextLine();
		while (scanner.hasNextLine()) {
			String line = scanner.nextLine();
			String from = line.split(",")[2];
			double la = Double.parseDouble(line.split(",")[9]);
			double lo = Double.parseDouble(line.split(",")[10]);
			if (139.341233 < la && la < 139.653738 && 35.343804 < lo && lo < 35.593980) {
				String writeline = from + ",";
				for (int i = 0; i < to.length; i++) {
					driver.get("https://transit.yahoo.co.jp/search/result?flatlon=&from=" + from + "&tlatlon=&to="
							+ to[i]
							+ "&via=&via=&via=&y=2017&m=06&d=08&hh=17&m2=0&m1=3&type=1&ticket=ic&al=1&shin=1&ex=1&hb=1&lb=1&sr=1&s=0&expkind=1&ws=3");
					WebElement we = driver.findElements(By.className("time")).get(1);
					String text = we.getText();
					String minitus = text.split("(")[1].replaceAll("分)", "");
					writeline += minitus + ",";
				}
				pw.println(writeline);
			}
		}
		pw.close();
	}
}

seleniumはここのサイトを参考にさせてもらいました。
unagi-tabetai.hatenablog.com

で、結果がこんな感じです!

f:id:dokyou3:20170625143241p:plain

ブルーラインの駅が多いです
下飯田駅中田駅の分散が同じなので、平均時間の低い「中田駅」聖地とします!

どんな駅か調べてみました。
https://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Nakada-Sta-2.JPG/1920px-Nakada-Sta-2.JPGf:id:dokyou3:20170625143621j:plain

地下鉄開業前は交通の便が悪いにも関わらず1960年代から宅地開発が進行していた。戸塚駅までの長後街道の慢性的な交通渋滞と不安定なバスの運行に悩まされていた中田地区の住民にとって、地下鉄開業は数十年来の悲願であった。
横浜市郊外部の特徴である農村と新興住宅地の共存が見られる地域である。
(中田駅 - Wikipedia より引用)

ちなみに平均時間だけでみると「横浜駅」がtopでした。
どこ行くのにもやっぱり横浜が便利!


聖地中田駅に今度行ってみようかな。。

Java SE 8 Silver 試験前の勉強で気になったところ その2

前回の続きです。

(前回です)
dokyou3.hatenablog.com

2. リテラル表記

リテラル表記って普通に仕事で書いてる分には、ほとんどコンパイルエラーにならないのでどういう表記がNGか覚えていませんでした。

以下のルールを覚えておくといいでしょう。試験に出ます!

  • アンダースコアはリテラルの先頭と末尾には使えない
  • アンダースコアは記号の前後には使えない

※記号は「L(long型を表す)」「F(float型を表す)」「0b(2進数を表す)」「0x(16進数を表す)」「.」

Java SE 8 Silver 試験前の勉強で気になったところ

少し前にJava SE 8の資格についてブログを書かせて頂きましたが、思いのほか反響があり自分でも驚いています。

dokyou3.hatenablog.com

さらに試験のお役に立てればと思い、勉強時に気になったところを思い出して書いてみます。よかったら参考にしてください。

Silverの勉強した本はこちらです。

徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応

徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応

問題集を最初から順番に解いていき、解けなかったところを最後にまとめて再テストするという流れで進めました。では、自分が引っかかったところをピックアップして見ます。

  1. staticインポート

業務で頻繁に使っていましたが、importはIDEが勝手にやってくれるのでちゃんと理解できていませんでした。

staticな変数やメソッドにアクセスするとき、皆さんはどうしていますか?

public class Main {
    public static void main(String[] args) {
        // static メソッド
        String str = String.valueOf(1);
    }

↑のような感じでしょうか。

ちなみにStringのjava.langパッケージはデフォルトで全クラスにインポートされるのでimport文は不要です。valueOfメソッドをstaticインポートすると下記のよう書くことができます。

import static java.lang.String.valueOf;

public class Main {
    public static void main(String[] args) {
        // メソッド名だけでOK
        String str = valueOf(1);
    }

valueOfメソッドを頻繁に使用する時は、Stringを省けるので便利です。

ここ試験に出ます!staticインポートの書式に要注意です。

import static java.lang.String.valueOf;

import の後にstaticです。staticインポートと言っていますが逆なので間違えないでください。
それからメソッド名だけで()や引数は不要です!

staticインポートについては下記の本にも載っています。

スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)

スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)

Gradleでwar

この本を参考にTomcatServletを動かすまでをやってみました。

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

まずは任意のフォルダを作成し、Javaのプロジェクトを作ります。

gradle init --type java-library

そして、build.gradleを書き変えます。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.bmuschko:gradle-tomcat-plugin:2.0'
    }
}


apply plugin: 'war'
apply plugin: 'com.bmuschko.tomcat'


repositories {
    mavenCentral()
}


dependencies {
    providedCompile 'javax:javaee-web-api:7.0'
    compile 'org.slf4j:slf4j-api:1.7.21'
    testCompile 'junit:junit:4.12'

    def tomcatVersion = '8.0.39'
        tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
               "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}"
        tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}") {
            exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj'
        }
}

一番上のbuildscriptは、Tomcatプラグインを利用するための設定です。
buildscriptについては、以下のサイトをご参考ください。
第60章 ビルドロジックの体系化

providedCompileは、ビルド時には参照にするが、生成物からは除外する場合に使います。

次にサーブレットクラスを作成します。
src/main/javaディレクトリにサーブレットを作ります。

ここまででできればあとはtomcatを実行させるのみ!
以下のコマンドで実行します。

gradle tomcatRunWar

または

gradle tRW

でもOKです。


あとはブラウザからアクセスして起動していることを確認してください。
簡単にできてびっくりでした。