SUMMER_WARSの日記

趣味や、仕事のこと、日々のことを徒然なるままに書き残すブログ

Selenium WebDriver(ChromeDriver) で「org.openqa.selenium.remote.UnreachableBrowserException」が発生する

単純にダウンロードしたChromeDriverが古かった。。。

以下のサイトから最新のバージョンを取得して使用したら無事に解決。(chromedriver_win32.zipを解凍して.exeを配置する)
(※ちなみに2.9のディレクトリがあってそれを使用していた。。。日付見ると2014年だった。。。2.9が最新と思ってしまった。。。64bitOSでも32bitを使うというかそれしかない)


sites.google.com

動的Webプロジェクトでサーバー実行すると「サーバー ローカル・ホスト の Tomcat v8.0 サーバー は始動に失敗しました。」が発生する

Servletを作っていて結構発生する人が多い。このエラーが来たらこれやろ!っていうやつ。まずはここ確認しよう。


目次

1)現象

 Servletを実行するとエラーが発生してしまう。↓こんな感じ。※詳細を見ると、「サーバー ローカル・ホスト の Tomcat v8.0 サーバー は始動に失敗しました。」ってでます。

f:id:SUMMER_WARS:20170621091126p:plain

2)環境

 Java8(動的Webプロジェクトを作成)

 Apach Tomcat 8.0.44

 MySQL 5.7.17

3)原因

 サーブレットアノテーションを使って、リクエストのURLでどのサーブレットが動くかを設定できる(※web.xml設定ファイルが不要)んやけど、そのアノテーションの文字列が被っちゃってるよ!Hey!you!っていう話。

package jp.sample;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;


この @WebServlet("/login") を他のサーブレットでも設定してたりすると発生する。
※1つサーブレット作って、他のサーブレットもこれをコピペして作ってたりすると発生する可能性大だよ~

4)対策

 アノテーションの文字列が被っているかサーブレットを確認し、別の名前に修正する。基本的にServletのクラス名から取ろう。

【追記】

2017/06/28 そもそもコンパイルが通っていない場合も同様のエラーが発生。

Servlet使っているんだがセッションからgetAttributeした値がnullになってしまうのなんでなん

目次


1)現象

 ローカル環境でsession.setAttribute("hoge", "hogehoge")で値を設定後、別サーブレットにforwardし、forward先のサーブレットでgetAttribute("hoge")するとキーがなくてnullになってしまう。(setもgetもしっかりしてるしなんで???)
 
 ※サーブレットではなくJSPにforwardし、getAttribute("hoge")すると正常に取得できるという謎現象に遭遇。これはどぎゃんかせんといかんばい。ということで備忘録。こういうのってだいたい環境の問題なんだよね。。。

2)環境

 Java8(動的Webプロジェクトを作成)

 Apach Tomcat 8.0.44

 MySQL 5.7.17

3)原因

 どうやら、Tomcatサーバーに複数のリソースを追加していたためらしい。。。
 ※スクショ自体はリソース追加していないけど、この現象が発生する条件は、リソースを2つ以上追加しているとき。

f:id:SUMMER_WARS:20170620142121p:plain

4)対策

 サーバー1つにつき1個のリソースにすることで解決。

Tomcat8 + Servlet + MySQLのコネクションプールを作る

目次

1)やりたいこと

DBのコネクションを取得するためには以下の処理で実装するんだけど、

Connection conn = null;
String url = "jdbc:mysql://localhost:3306/sample";
String user = "root";
String password = "";

try(conn = DriverManager.getConnection(url, user, password);){

  // データベースに対する処理

}catch (SQLException e){
 // エラー処理
}

↑開発する上で各メンバー毎にクローズのし忘れとか発生してしまうし、
コネクションプール作るのがベターなのでコネクションプールで実装してみた。

2)環境

 Java8(動的Webプロジェクトを作成)

 Apach Tomcat 8.0.44

 MySQL 5.7.17

環境確認方法

Tomcatのバージョンはサーバーを起動後、

http://localhost:8080/

 にアクセスすれば確認可能。※ポートは要確認


MySQLのバージョンはMySQLクライアントに接続し、

select version();

 をたたけばOK


3)やりたいことはやってみる

まずは、コネクションプールを取得するクラスを作成しーの

package jp.sample.DAO;

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DataSourceManager {
	private final String JNDI = "java:comp/env/jdbc/mysql";
	protected Connection connection;

	/**
	 * データベースコネクション取得
	 */
	public DataSourceManager() {
		try {
			Context context = new InitialContext();
			DataSource dataSource = (DataSource) context.lookup(JNDI);
			connection = dataSource.getConnection();
			connection.setAutoCommit(false);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

各DAOクラスで継承する

package jp.sample.DAO;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class UserDAO extends DataSourceManager {

	// 主キー検索
	private final String SELECT_BY_ID = "SELECT * FROM USER WHERE USER_ID = ?";

	/**
	 * 主キー検索
	 * @param id
	 * @return UserVo ユーザー情報を返却、データが存在しない場合 null
	 */
	public UserVo selectById(String id) {
		UserVo result = null;
		try (PreparedStatement ps = connection.prepareStatement(SELECT_BY_ID)) {
			ps.setString(1, id);
			ResultSet rSet = ps.executeQuery();
			result = resultSetAttribute(rSet);  // 取得した値をセットするメソッドを別で作成しているのでそれを呼ぶ

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}
        
        // 以下割愛

これで終わり!ってなればいいんやけど、そうもいかない。
Tomcatのバージョンで設定方法が異なっていてserver.xmlに書けやとかうんたらで、むしろこちらの方がめんどくさかった。

/[プロジェクト名]/WebContent/META-INF/context.xml

↑結果、context.xmlに設定情報を書き込むでOK。
(パスワードとかurlとかは各DBに合わせて修正)

こんな感じ。

f:id:SUMMER_WARS:20170620125304p:plain


※注意
コネクションプールを取得するクラスで定義している"JNDI"の「java:comp/env/xxxx」とcontext.xmlの「name="xxxx"」が一致すること。

private final String JNDI = "java:comp/env/jdbc/mysql";
name="jdbc/mysql"


これで接続できるはず!!!

VisualStudioでusing文を自動的に追加してくれるショートカット

VisualStudio(2013)でusing文を自動的に追加してくれるショートカットがあるの知らなかった...

勝手に追加してくれればいいのに.... 

 

[shift] + [alt] + [F10]

NUnitが急に動作しなくなり、テストプロジェクトのリビルドが出来なくなった場合の対処法

VSの記事ばかりでそろそろ飽きてきたのですが、

やるっきゃないのでやります。備忘録です。

 

■事象

 昨日まで動いていたVSのNUnitを使用したテストプロジェクトがリビルドできなくなった。

 

■原因

 なんかNUnitで利用するxmlファイルが破損しちゃっている模様

 

■解決策

 GitHubですでに対策済みだそう。

 エラーがでているファイルをリビルド時のエラーに含めてくれる対応をしたらしい。

 なのであとは、ファイル探して削除(ちょっとこわかったのでリネームしました)し、

 リビルドし直せばOK。無事にエラー解消しました。

 ※リビルド後にこのファイルは再作成されず、テスト実行した際に再作成されてました。

 

 

 参考ページ

github.com

ローカルプロキシを使用してSSL通信を捕捉する!

業務で使用する機会があったのでメモ。

 

・背景

 iOSAndroidアプリでSSL通信をしているけど、リクエスト書き換えたら処理としてNGな動きするね、改善しようね。と指摘された。

 

 

・やりたいこと

 ローカルプロキシ(アプリ→サーバーの流れに自前のPCを挟む。アプリ→PC→サーバーの流れに!)使って、リクエスト捕捉

からの書き換えを検証する。

 

・使うもの

 BurpSuiteのFree版(現時点v1.7.19)をインストール

portswigger.net

 

※あとは以下のサイトを参考にさせていただきました。

www.securesky-tech.com

 

ちょっとはまったこと。。。

 PCとアプリを入れている端末のネットワークが異なっているのに気づかず(同じネットワーク名で周波数が異なってた....なんてこった)うまくプロキシが効いてなかった。。。同じネットワークにしてやって解決しました。

 

 

・感想

 やりたいことできたけど、、、、プロキシ挟むとめっちゃ遅い。。。。泣