変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

2018 / 1月

CentOS7 PostgreSQL

postgreSQLのインストについてブログに何も残していなかったので・・・

# yum -y install postgresql-server
完了しました!
# postgresql-setup initdb
Initializing database ... OK

この時点で、postgreSQLは、/var/lib/pgsql/にインストされる。

# cd /var/lib/pgsql/data
# cp postgresql.conf postgresql.conf.org
# echo "listen_addresses = '*'" >> /var/lib/pgsql/data/postgresql.conf
# cp pg_hba.conf pg_hba.conf.org
# echo "# PostgreSQL Client Authentication Configuration File" > ./pg_hba.conf
# echo "# ===================================================" >> ./pg_hba.conf
# echo "local all all trust" >> ./pg_hba.conf
# echo "host all all 127.0.0.1/32 trust" >> ./pg_hba.conf
# echo "host all all ::1/128 trust" >> ./pg_hba.conf
# echo "host all all 192.168.***.0/24 md5" >> ./pg_hba.conf
# systemctl start postgresql
# systemctl enable postgresql
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql.service to /usr/lib/systemd/system/postgresql.service.

最後の192.168.***.0/24でLANから繋げる様にする。***部分は、LAN環境によって違うだろう。#ip  aで確認。

# psql -U postgres
 \password
新しいパスワード: *******
もう一度入力してください:*******

でパスワードを設定する。もっともpg_hba.confでtrust設定したIPアドレスならパスワードは何でもいい。
phpPgAdminのインストール

# yum -y install phpPgAdmin
・・・
Require local
を
Require  all granted
に変える
・・・
$conf['servers'][0]['host'] = '';
を
$conf['servers'][0]['host'] = '127.0.0.1';
・・・
他にも繋ぐなら
$conf['servers'][1]['host'] = '192.168.***.***';
の要領で配列を増やす。
※その分画面にサーバーの接続先が増えるが、配列の他の要素も[0]の分だけ追加しなければいけない。
・・・
information_schemaなどを表示する場合は
$conf['show_system'] = true;
※いっぱいゾロゾロと出てくるので普通はfalseでいいだろう。
#systemctl restart httpd

で再設定させて、ブラウザからhttp://192.168.***.***/phpPgAdmin/で開き、postgresでログインする。
あ、WindosなどからPgAdminなどで繋ぐには仮想マシンならホストからもポート5432を解放しないといけないだろう。

# firewall-cmd --add-port=5432/tcp --zone=public --permanent


WordPressのプラグインでハマる

自宅鯖ではアクセス状況を見るには丁度良かったCounterizeII。
こっちに移行してから使っていなかったので有効化してみると・・・
全く反応が無い。https://ssiscirine.iobb.net/を表示すると壁紙しか出ない様になっていた。
似たようなCounterizeを有効化してみると、https://ssiscirine.iobb.net/は普通に表示するものの、管理画面が真っ白になってしまった。
プラグインのフォルダの下のcounterizeとcounterizeiiを消してやっと復旧。
 
 
 



Gemini Lake世代のITXマザボ ASRock J4105-ITX

今でもJ1900のITXマザボを使っている。理由は数ワットのTDPで低発熱でまぁまぁなCPUパワーがあるから自宅鯖みたいに電源入れっぱなしなPCには丁度いい。その頃からCPUはどんどん世代交代していったが、これといって変わった感じがしない。多分メインストリームのCPUを力いっぱいパワーセーブした状態での性能と消費電力というのがほとんど変わっていないのと同じなのだろう。
以前、ITXよりも小さいスティックPCも買ってみたが、使っていると熱が籠って仕方が無いのが難点なので、付けっぱなしPCには向かないから、今ではクリプスの筒の中に眠っている。
J1900の頃は周辺が中途半端な仕様だったが、Gemini Lake世代のITXマザボ J4105-ITXでは周辺のインタフェースがかなり新しくなった。SATAが皆6Gbpsになり、M.2ソケットが付き、USB3.1の数も増え、メモリもSO-DDR4、HDMIも2K(4K?)対応、が随分とグレードアップしているので、SSDやモニターが古くなったら頃に一式丸ごと買い替えるなら丁度良い感じもする。DC電源タイプが出たら・・・買い替えるかも(笑
ちょっと心配なのは投機実行の脆弱性によるSpectre/Meltdownに対するファームウェアアップデート。ATOMベースのCPUなら無関係な気がするけど、J1900がパワーダウンしたら嫌だな・・・
 
 



Android6 アプリを外部ストレージへ移動してみる

手元のSH-M04はAndroid6.0.1しかし内部ストレージは6GB。
買った時はインストールするアプリを絞り込めば大丈夫と思っていたが、毎週のアップデートで、「アプリを削除してください」とメッセージが出る始末。
Android6からはmicroSDメモリも内部メモリ的にフォーマットできるようになっていたので、
https://decoy284.net/2016/03/12/android-6-xperia-z5-sdcard-internal-storage/
を参考に試しにやってみた。
以下、ザックりとした手順。
1.パソコンにAndroid Studio をインストする。
2.ユーザー環境変数のPATHに下記を追加
%USERPROFILE%\AppData\Local\Android\Sdk\platform-tools
3.コマンドラインを開いて、adbを起動してみる。
※adbが見つからなかったら上記の環境変数の設定を見直す。
4.スマホの設定に「開発者向けオプション」を表示させる。
USBケーブルでスマホとパソコンを繋ぐ。
5.「開発者オプション」の画面が出てくるので「ON」にする。
「USBの使用」が出る場合は「ファイル転送」を選択する。
6.パソコンのコマンドラインから
>adb shell

error: no devices/emulators found が出る場合はスマホ側の設定がADB用に変えていないせい。「USBデバッグ」を「ON」にする。これでパソコンに「SH-M04」などとスマホのアイコンが出てくる。
再び >adb shell と入力すると
7.shell@SH-M04:/ $ と出てくるので
sm list-disks と入力すると、

disk:179,64 が返ってくるので ※使用されているスマホやmicroSDによって数字は違うらしいです。

8.sm partition disk:179,64 private と入力すると、SDカードが内部ストレージっぽくフォーマットされる。
9.ここで「開発者モード」はOFFにする。
10.後はスマホの設定のアプリで適当なアプリを選択し、ストレージ(内部ストレージ)を選択。
運がいいと「使用されているストレージ」に【変更】ボタンが現れる。※変更可能なアプリのみ。
ボタンを押してmicroSDに切り替えれば、アプリはmicroSDに移動するはず。
アプリのうち数個しかmicroSDに移動できなかったので、内蔵ストレージがごっそりと空になる訳ではなかった。(残念
その対応アプリを探し出すのもかなり大変。対応アプリを絞りこむアプリもある(AppMgr III等)のでこれを使うといいだろう。
とりあえず、今のkindleは【変更】ボタンが表示されるので、さっそく移動してみた。
本をダウンロードしてみると、どれもmicroSDに落ちているようだ。
これで暫くの間は安泰。
メデタシ、メデタシ。
※Nexus 7とASUS ME572CL(K002R)は、デバイスとパソコンのUSB接続時にエラーが発生し正しいドライバーをインストールできなくなっていた。(いと悲し


JUnit う~む

JUnit4のmockitoとJMockitのサンプルを書こうと思ったが・・・
@Mockや@injectmocksを書き、パラメータ間違いのエラーを解消すると、Internl Error になってしまった。
調べてみると、今のmockito 1.xはpublicなメソッドが対象で、JUnitの使い方にもよるが・・・ほぼ全ての参照先のメソッドをスタブ化した方がマシな現状を考えると適用範囲はかなり狭く、powerMockやJMockitなどが跋扈し、これに呼応しmockito 2.x(β版)が絶賛開発中なので、ビルドパスの順序やimportsの指定などの些末な問題は垂れ流しになっているようだ。そのため、JUnit+powerMockを組み合わせる場合はJUnit+powerMock用にカスタマイズされたIDE(Eclipse等)を後生大事に使うか・・・Eclipseのimports挿入機能をOFFつか・・・コマンドラインでガチガチに書くしかないようだ。
この様な微妙な塩梅が必要な状況ではザックリとjarファイルを管理するmavenでは心もとないので、勢いGradleラブ!ということになるのだろう。
Mockは見た目上は古くからあるEJBのインジェクション機能とそう変わらない。ソース中のアノテーションとClassクラスのメソッドを使い対象クラスのメソッド情報の取得しinvokeをOverloadでフックした先にMatchした条件に応じた反応(doReturnやdoException)するものだ。そのため、一旦インジェクションしてしまったmatchパターンを元の動作に戻せなかったりする。
なので、JUnitから考え直した方がいいんじゃないのかなと思った。
JUnit5なんてのもあるようなんで、こっちに寄り道してみよう。
そのJUnit5でも扱いにくそうなら・・・
自作ラッパーでJUniTestとでも名付ければいいだろう・・・と思った。
 



JUnit4 privateなメソッド

またサンプル。

/**
 *
 */
package sample5;
/**
 * @author ssiscirine
 *
 */
public class Sample5 {
	/**
	 * @param args
	 */
	public static String publicStaticMethod1(String param1) {
		//privateStaticMethod1(param1);
		return param1;
	}
	/**
	 * @param args
	 * @throws Exception
	 */
	@SuppressWarnings("unused")
	private static String privateStaticMethod1(String param1) throws Exception {
		//Sample5 s5 = new Sample5();
		//s5.privateMethod1(param1);
		if (param1 == null) {
			throw new Exception("パラメータがnull");
		}
		return param1;
	}
	/**
	 * @param args
	 */
	public String publicMethod1(String param1) {
		return param1;
	}
	/**
	 * @param args
	 * @throws Exception
	 */
	@SuppressWarnings("unused")
	private String privateMethod1(String param1) throws Exception {
		if (param1 == null) {
			throw new Exception("パラメータがnull");
		}
		return param1;
	}
}

@SuppressWarnings(“unused”)は、privateなメソッドなのに使ってないせい。

/**
 *
 */
package sample5;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.junit.runners.MethodSorters;
/**
 * @author slani
 *
 */
//テストケースの名前順に実行する指定
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class Sample5Test {
	@Rule
	//テストケースのメソッド名を知りたくて追加。
	public TestName name = new TestName();
	/**
	 * @throws java.lang.Exception
	 */
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		//
		System.out.println("setUpBeforeClass() JUnitを開始します。");
	}
	/**
	 * @throws java.lang.Exception
	 */
	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		//
		System.out.println("tearDownAfterClass() JUnitを終了します");
	}
	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		//
		System.out.println(name.getMethodName() + "のための setUp() テストケースの事前処理を行います。");
	}
	/**
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
		//
		System.out.println(name.getMethodName() + "のための" + " tearDown() テストケースの事後処理を行います。");
	}
	//Sample5#publicStaticMethod1用
	/**
	 * {@link sample5.Sample5#publicStaticMethod1(java.lang.String)} のためのテスト・メソッド。
	 */
	@Test
	public final void testPublicStaticMethod1_success() {
		Sample5.publicStaticMethod1("parame1");
	}
	//Sample5#privateStaticMethod1用
	/**
	 * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	@Test
	public final void testPrivateStaticMethod1_Success() throws NoSuchMethodException, SecurityException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Sample5 s5 = new Sample5();
		Method m = null;
		m = Sample5.class.getDeclaredMethod("privateStaticMethod1", String.class);
		m.setAccessible(true);
		//正常ケース
		String rc = (String) m.invoke(s5, "param1");
		assertEquals("param1", rc);
	}
	/**
	 * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 */
	@Test
	public final void testPrivateStaticMethod1_NoSuchMethodException_01() throws SecurityException {
		Sample5 s5 = new Sample5();
		try {
			Sample5.class.getDeclaredMethod("privateStaticMethodX", String.class);
		} catch (NoSuchMethodException e1) {
			assumeNoException(e1.getLocalizedMessage(), e1);
		}
	}
	/**
	 * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 */
	@Test
	public final void testPrivateStaticMethod1_NoSuchMethodException_02() throws SecurityException {
		Sample5 s5 = new Sample5();
		try {
			Sample5.class.getDeclaredMethod("privateStaticMethod1", int.class);
		} catch (NoSuchMethodException e1) {
			assumeNoException(e1.getLocalizedMessage(), e1);
		}
	}
	/**
	 * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	@Test
	public final void testPrivateStaticMethod1_IllegalAccessException()
			throws NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		Sample5 s5 = new Sample5();
		Method m = null;
		m = Sample5.class.getDeclaredMethod("privateStaticMethod1", String.class);
		//異常ケース
		String rc = null;
		try {
			rc = (String) m.invoke(s5, "param1");
		} catch (IllegalAccessException e) {
			assumeNoException(e.getLocalizedMessage(), e);
		}
	}
	/**
	 * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	@Test
	public final void testPrivateStaticMethod1_IllegalArgumentException()
			throws NoSuchMethodException, SecurityException, IllegalAccessException, InvocationTargetException {
		Sample5 s5 = new Sample5();
		Method m = null;
		m = Sample5.class.getDeclaredMethod("privateStaticMethod1", String.class);
		m.setAccessible(true);
		//異常ケース
		String rc = null;
		try {
			rc = (String) m.invoke(s5, 1, 2, 3);
		} catch (IllegalArgumentException e) {
			assumeNoException(e.getLocalizedMessage(), e);
		}
	}
	/**
	 * {@link sample5.Sample5#privateStaticMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	@Test
	public final void testPrivateStaticMethod1_InvocationTargetException()
			throws NoSuchMethodException, SecurityException, IllegalAccessException {
		Sample5 s5 = new Sample5();
		Method m = null;
		m = Sample5.class.getDeclaredMethod("privateStaticMethod1", String.class);
		m.setAccessible(true);
		//異常ケース
		String rc = null;
		try {
			rc = (String) m.invoke(s5, (String) null);
		} catch (InvocationTargetException e) {
			assumeNoException("target : " + e.getTargetException() + ", msg : " + e.getLocalizedMessage(), e);
		}
	}
	//Sample5#publicMethod1用
	/**
	 * {@link sample5.Sample5#publicMethod1(java.lang.String)} のためのテスト・メソッド。
	 */
	@SuppressWarnings("static-access")
	@Test
	public final void testPublicMethod1_success() {
		Sample5 s5 = new Sample5();
		s5.publicMethod1("parame1");
	}
	//Sample5#privateMethod1用
	/**
	 * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	@Test
	public final void testPrivateMethod1_Success() throws NoSuchMethodException, SecurityException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Sample5 s5 = new Sample5();
		Method m = null;
		m = Sample5.class.getDeclaredMethod("privateMethod1", String.class);
		m.setAccessible(true);
		//正常ケース
		String rc = (String) m.invoke(s5, "param1");
		assertEquals("param1", rc);
	}
	/**
	 * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 */
	@Test
	public final void testPrivateMethod1_NoSuchMethodException_01() throws SecurityException {
		Sample5 s5 = new Sample5();
		try {
			Sample5.class.getDeclaredMethod("privateMethodX", String.class);
		} catch (NoSuchMethodException e1) {
			assumeNoException(e1.getLocalizedMessage(), e1);
		}
	}
	/**
	 * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 */
	@Test
	public final void testPrivateMethod1_NoSuchMethodException_02() throws SecurityException {
		Sample5 s5 = new Sample5();
		try {
			Sample5.class.getDeclaredMethod("privateMethod1", int.class);
		} catch (NoSuchMethodException e1) {
			assumeNoException(e1.getLocalizedMessage(), e1);
		}
	}
	/**
	 * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	@Test
	public final void testPrivateMethod1_IllegalAccessException()
			throws NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		Sample5 s5 = new Sample5();
		Method m = null;
		m = Sample5.class.getDeclaredMethod("privateMethod1", String.class);
		//異常ケース
		String rc = null;
		try {
			rc = (String) m.invoke(s5, "param1");
		} catch (IllegalAccessException e) {
			assumeNoException(e.getLocalizedMessage(), e);
		}
	}
	/**
	 * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	@Test
	public final void testPrivateMethod1_IllegalArgumentException()
			throws NoSuchMethodException, SecurityException, IllegalAccessException, InvocationTargetException {
		Sample5 s5 = new Sample5();
		Method m = null;
		m = Sample5.class.getDeclaredMethod("privateMethod1", String.class);
		m.setAccessible(true);
		//異常ケース
		String rc = null;
		try {
			rc = (String) m.invoke(s5, 1, 2, 3);
		} catch (IllegalArgumentException e) {
			assumeNoException(e.getLocalizedMessage(), e);
		}
	}
	/**
	 * {@link sample5.Sample5#privateMethod1(java.lang.String)} のためのテスト・メソッド。
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	@Test
	public final void testPrivateMethod1_InvocationTargetException()
			throws NoSuchMethodException, SecurityException, IllegalAccessException {
		Sample5 s5 = new Sample5();
		Method m = null;
		m = Sample5.class.getDeclaredMethod("privateMethod1", String.class);
		m.setAccessible(true);
		//異常ケース
		String rc = null;
		try {
			rc = (String) m.invoke(s5, (String) null);
		} catch (InvocationTargetException e) {
			assumeNoException("target : " + e.getTargetException() + ", msg : " + e.getLocalizedMessage(), e);
		}
	}
}

比較のためpublicなメソッドの呼び出しも混ぜてある。
publicなメソッドなら普通に呼び出せるが、privateなメソッドはクラスの外からは普段見えないものだから・・・
 Method m = {使いたいメソッドのクラス名}.class.getDeclaredMethod(“使いたいメソッドの名前”, 引数1.class, 引数2.class, … );
な感じでprivateなメソッドの情報を取得し、
m.setAccessible(true);
で、privateなメソッドに一時的にクラスの外から使用できるようにしてから・・・
 rc = (戻り値のキャスト) m.invoke(s5, (パラメータ1のキャスト) パラメータ1, (パラメータ2のキャスト) パラメータ2, …);
な感じでメソッドを呼び出す。
しかし、戻り値もパラメータもキャストを使うので、ミスった時はどうなるのか?
調べてみたら・・・ソースが長くなってしまった。
そのcatchの処理も、想定通りのExceptionが通ればいいが最初は大抵想定外な結果になるのでfailではなくassumeNoexceptionを使い、想定内ならIgnore、想定外ならFailになるようにした。
ちょっと判りにくいけど、InvocationTargetExceptionは呼び出し先でExceptionがThrowされた場合に処理されるので、Sample5.javaでパラメータがnullだったらExceptionをThrowしている。

setUpBeforeClass() JUnitを開始します。
testPrivateMethod1_IllegalAccessExceptionのための setUp() テストケースの事前処理を行います。
testPrivateMethod1_IllegalAccessExceptionのための tearDown() テストケースの事後処理を行います。
testPrivateMethod1_IllegalArgumentExceptionのための setUp() テストケースの事前処理を行います。
testPrivateMethod1_IllegalArgumentExceptionのための tearDown() テストケースの事後処理を行います。
testPrivateMethod1_InvocationTargetExceptionのための setUp() テストケースの事前処理を行います。
testPrivateMethod1_InvocationTargetExceptionのための tearDown() テストケースの事後処理を行います。
testPrivateMethod1_NoSuchMethodException_01のための setUp() テストケースの事前処理を行います。
testPrivateMethod1_NoSuchMethodException_01のための tearDown() テストケースの事後処理を行います。
testPrivateMethod1_NoSuchMethodException_02のための setUp() テストケースの事前処理を行います。
testPrivateMethod1_NoSuchMethodException_02のための tearDown() テストケースの事後処理を行います。
testPrivateMethod1_Successのための setUp() テストケースの事前処理を行います。
testPrivateMethod1_Successのための tearDown() テストケースの事後処理を行います。
testPrivateStaticMethod1_IllegalAccessExceptionのための setUp() テストケースの事前処理を行います。
testPrivateStaticMethod1_IllegalAccessExceptionのための tearDown() テストケースの事後処理を行います。
testPrivateStaticMethod1_IllegalArgumentExceptionのための setUp() テストケースの事前処理を行います。
testPrivateStaticMethod1_IllegalArgumentExceptionのための tearDown() テストケースの事後処理を行います。
testPrivateStaticMethod1_InvocationTargetExceptionのための setUp() テストケースの事前処理を行います。
testPrivateStaticMethod1_InvocationTargetExceptionのための tearDown() テストケースの事後処理を行います。
testPrivateStaticMethod1_NoSuchMethodException_01のための setUp() テストケースの事前処理を行います。
testPrivateStaticMethod1_NoSuchMethodException_01のための tearDown() テストケースの事後処理を行います。
testPrivateStaticMethod1_NoSuchMethodException_02のための setUp() テストケースの事前処理を行います。
testPrivateStaticMethod1_NoSuchMethodException_02のための tearDown() テストケースの事後処理を行います。
testPrivateStaticMethod1_Successのための setUp() テストケースの事前処理を行います。
testPrivateStaticMethod1_Successのための tearDown() テストケースの事後処理を行います。
testPublicMethod1_successのための setUp() テストケースの事前処理を行います。
testPublicMethod1_successのための tearDown() テストケースの事後処理を行います。
testPublicStaticMethod1_successのための setUp() テストケースの事前処理を行います。
testPublicStaticMethod1_successのための tearDown() テストケースの事後処理を行います。
tearDownAfterClass() JUnitを終了します

Junitのビューを見るとxxxxx_success は〇、他はIgnoreになっている。
次は mockかな・・・



スマホにロックをかけたら解除してもSmartWatch2に通知が届かなくなった

スマホを置き忘れたので 盗難対策ツールからロックをかけたら、全ての通知機能がOFFになるのは当然のこと。
しかしロックを解除してもSmartWatch2への通知がOFFのままで、一部を除きSmartWatch2上のアプリのアイコンはディセーブルのまま。ディセーブルになったアプリをアンインストールしてもアイコンがディセーブルのまま残ってしまう。
しかし、SmartWatch2を一旦電源OFFしてONにし直すと、復旧した。メデタシメデタシ。
あ、インストしなおさないと・・・
安価なスマートウォッチやスマートブレスレットに心拍数や血圧や睡眠モニターが付いているのでつい目が移りがち。
しかし画面サイズによってはメールや電話の通知が見にくかったり、モノによっては通知を順送りしかできなかったり、オモチャとしてはそれで充分だと思うけど、順送りした後に誰からだったかな?とか忘れたときに困りそう。もっともnanoSIM入れて単独で使用可能な方がいいけどバッテリーがちょっと心配、全機能使用時で3日ぐらい持つものもあるので日常生活用としては使えそうな気もする。あと、カメラが付いているとスマホ同様に持ち込み禁止対象になってしまう場所もあるのだけどちょっと値段がよいモノはオマケとしてカメラが付いているようでチョット難しい。



JUnit4 使ってみた

とりあえずサンプルを書いてみた。
まずはテストする対象のソース。

/**
 *
 */
package sample4;
/**
 * @author ssiscirine
 *
 */
public class Sample4 {
	public String method0() {
		return "method0";
	}
	public String method1(String param1) {
		return "method1";
	}
	public String method2(String param1, int param2) {
		return "method2(String param1:\"" + param1 + "\", int param2:" + param2 + ")";
	}
	public String method2(int param1, String param2) {
		return "method2(int param1:" + param1 + ", String param2:\"" + param2 + "\")";
	}
}

そしてJUnit用のソース。
ベースはテスト用のフォルダで右クリック⇒新規⇒その他…⇒Java⇒JUnit⇒Junitテスト・ケースで、作成するスタブのチェックを入れ、テスト元クラスを指定するとザクっと作ってくれる。
ビルドパスのJunit4が無かったら、確認した上で追加してくれる。※Eclipse 4.7.2の場合
ま、テスト内容は
fail(“まだ実装されていません”); // TODO
しか入らないけどね。

/**
 *
 */
package sample4;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.hamcrest.CoreMatchers;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.junit.runners.MethodSorters;
/**
 * @author ssiscirine
 *
 */
// テストケースの名前順に実行する指定
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class Sample4Test {
	@Rule
	//テストケースのメソッド名を知りたくて追加。
	public TestName name = new TestName();
	/**
	 * JUnitの実行で最初に実行する処理
	 * @throws java.lang.Exception
	 */
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		//
		System.out.println("setUpBeforeClass() JUnitを開始します。");
	}
	/**
	 * JUnitの実行で最後に実行する処理
	 * @throws java.lang.Exception
	 */
	@AfterClass
	public static void tearDownAfterClass() throws Exception {
		//
		System.out.println("tearDownAfterClass() JUnitを終了します");
	}
	/**
	 * 各テストケースの事前に実行する処理
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		//
		System.out.println(name.getMethodName() + "のための setUp() テストケースの事前処理を行います。");
	}
	/**
	 * 各テストケースの事後に実行する処理
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
		//
		System.out.println(name.getMethodName() + "のための" + " tearDown() テストケースの事後処理を行います。");
	}
	/**
	 * {@link sample4.Sample4#method0()} のためのテスト・メソッド。
	 */
	@Test
	public final void testMethod0() {
		System.out.println(name.getMethodName() + "() テストケース・その1");
		fail("まだ実装されていません"); // TODO
	}
	@Test
	public final void testMethod0_01() {
		System.out.println(name.getMethodName() + "() テストケース・その2");
		Sample4 sample4 = new Sample4();
		// Assert : 予想と違ったらNGに(JUnitの実行結果をX表記)する
		Assert.assertTrue(true);
		//
		Assert.assertNull(null);
		Assert.assertNotNull("Not null");
		//
		Assert.assertEquals(sample4.method0(), "method0");
		Assert.assertNotEquals(sample4.method0(), "method0_01");
		//
		Assert.assertThat(sample4.method0(), CoreMatchers.is(equalTo("method0")));
		Assert.assertThat(sample4.method0(), CoreMatchers.is(not(equalTo("method0_01"))));
		//予想と違ったら見なかったことに(JUnitの実行結果をIgnore表記)する
		Assume.assumeTrue(true);
		Assume.assumeFalse(false);
	}
	/**
	 * {@link sample4.Sample4#method1(java.lang.String)} のためのテスト・メソッド。
	 */
	@Ignore
	public final void testMethod1() {
		fail(name.getMethodName() + "() まだ実装されていません"); // TODO
	}
	/**
	 * {@link sample4.Sample4#method2(java.lang.String, int)} のためのテスト・メソッド。
	 */
	@Ignore
	public final void testMethod2StringInt() {
		fail(name.getMethodName() + "() まだ実装されていません"); // TODO
	}
	/**
	 * {@link sample4.Sample4#method2(int, java.lang.String)} のためのテスト・メソッド。
	 */
	@Ignore
	public final void testMethod2IntString() {
		fail(name.getMethodName() + "() まだ実装されていません"); // TODO
	}
}

Assert.assertTrue(true); 等はassertTrueがどこのクラスのメソッドか判りやすくするための書き方で、assertTrueがpublicでstaticなメソッドなのだから import org.junit.Assert;してあれば、assertTrue(true);で十分推測可能でしょうけど、いつでもどの環境でもメソッドの上にツールチップが出る訳ではないので、faileとか、isがCoreMatchers.isなのは覚えるしかないかもしれない。
実行してみると

setUpBeforeClass() JUnitを開始します。
testMethod0のための setUp() テストケースの事前処理を行います。
testMethod0() テストケース・その1
testMethod0のための tearDown() テストケースの事後処理を行います。
testMethod0_01のための setUp() テストケースの事前処理を行います。
testMethod0_01() テストケース・その2
testMethod0_01のための tearDown() テストケースの事後処理を行います。
tearDownAfterClass() JUnitを終了します

一度、作り込んでしまえば、System.out.printlnのログをコンソールに出す必要はほとんど無い。しかし、Junitの実行時間がとても長い場合は、setUpBeforeClassやtearDownAfterClassに短いログを出した方が安心だし、時折挫折することもあるテストでは、setUpやtearDownでも何か出して欲しい。データベースの初期データを投入します。とか、データベースを初期状態にロールバックします。とかね。
また、JTestの様なツールで使うテストケースではJTest実行中は大量に出てしまい邪魔になりそうなので、System.out.printlnよりはvoid log(String msg)などを作ってソコからSystem.out.printlnに出すようにした方がいいだろう。勿論、EclipseでJUnitを使うならログを標準出力に出さないのが本道だが、環境が悪いと途中で止まってしまったかのようにも見えてしまうので用意した方がいいだろう。
JUnitのビューは
sample4.Sample4Test
 [X]testMethod0
 [O]testMethod0_01
となっていて、[x]のメソッドをクリックする、障害トレースにassertXXXやasumeXXXのログが出てくる。ドキュメントはここ
勿論、privateなメソッドだったり、相手がMVCのクラスだったり、直接テスト対象にアクセスできない場合はそれなりの機能がある様だが、それは次回に続く。



キーボード・ショートカット と EXCEL と GeForce Experience

EXCELでALTとF11を同時押しすると普通はVBAの画面が表示される。
ところが・・・家のパソコンではEXCELの画面でALTとF11を同時押ししても反応が無い。
1.MS-OFFICEのグループポリシーが書き換わったのか?
参考url : https://getadmx.com/?Category=Office2016&Policy=word16.Office.Microsoft.Policies.Windows::L_Disableshortcutkeys&Language=ja-jp
だがリポジトリにそんな設定は無かった。
2.変なアドインが入ってしまったのか?
Office xxxx Editions Resource Kit Tools を入れた覚えは無いが・・・
C:\Users\{ユーザ名}\AppData\Roaming\Microsoft\Excel\XLSTART の下に  EXCELxx.ADM は無かった。そこには・・・何も無かったので、変な起動マクロでALTとF11の同時押しを封じ込められた訳ではない。
3.セキュリティーソフトか?
一時的に無効化してみたが、変化無し。
4.他のALTとFキーの同時押しはどうか?
ALT+F1

あ、GeForce Experience がスクリーンショットを撮ろうとしている。

そうだ!GeForce Experienceに登録したショートカットはいつでもドコでも有効なのだ!

あれ?NVIDIAの通知アイコンを右クリックしてもGeForce Experienceが無い。
メニューからNVIDIA Corporation ⇒ GeForce Experienceを起動し、歯車アイコンで設定を開き、全般の「ゲーム内のオーバーレイ」の【設定】ボタンを押してみる。すると「キーボードショートカット」が観える。
いっぱい登録されている  orz
ALT+F1、ALT+F5、ALT+F6、ALT+F7、ALT+F8、ALT+F9、ALT+F10、ALT+F11、ALT+F12 などなど・・・
時分で・・・時分?時分?滅多に使わない単語だな・・・
自分で設定を変更したのかもしれないけどね・・・(完全に忘れてたのかな・・・
仕方が無いので、ALT+F11表記をクリックしてALT+Shift+F11 に変更。
これで、ALT+Shift+F11を同時押しすると、Facebookで配信中にコメントのオン/オフを切り替える様になる。(ハズ
改めてEXCELを起動。ALT+F11同時押し。
無事VBAの画面が表示された。
GeForce Experienceは自動常駐なキャプチャーソフトなので、ついその存在を忘れがち、勿論設定したショートカットも忘れがち、これは辛いかもしれない。
EXCELでALT+F11が効かなくなったら・・・GeForce Experienceも候補にあげた方がいいかもしれない。
GeForceの新しいドライバーがあったのでインストして再起動。
あれ?NVIDIAの通知アイコンを右クリックするとGeForce Experienceが出てきた。
設定変えたせいかな?



Java ObjectMapper

よく、お世話になっているObjectMapper、しかし、アゴで使うだけで、自分でこのパッケージをインストールすらしていなかったので、改めてサンプルを書いてみた。
まず、JDKにObjectMapperは入っていないので、pom.xmlで依存関係を設定する。
サンプルをMavenプロジェクトにすると、様々なjarファイルが.m2フォルダにダウンロードされる仕組みなので、外部へアクセスできない閉鎖的な開発環境では使えない。
しかし、職場に情報収集用のパソコンが用意されていれば、そこにEclipse(JDK付)を入れておけば、サンプルの動作を確認した後に、.m2フォルダからゴッソリとJarファイルをコピるだけで済むので、
様々なjarファイルの様々な依存関係を調査しながら様々なサイトから必死になってかき集める面倒さも無い。

  <dependencies>
  	<dependency>
  		<groupId>com.fasterxml.jackson.dataformat</groupId>
  		<artifactId>jackson-dataformat-xml</artifactId>
  		<version>2.9.3</version>
  	</dependency>
  </dependencies>

そして、マッピングするサンプルのデータ・クラス。

package sample3;
import java.text.SimpleDateFormat;
public class SampleData1 {
	public int id;
	public String name;
	public java.sql.Timestamp timeStamp;
	final static public String TIMESTAMP_FORMAT = "#yyyy/MM/dd HH:m:s.S(z)#"; // JSONで表記するタイムスタンプ型の書式
	public String toString() {
		SimpleDateFormat sdf = new SimpleDateFormat(TIMESTAMP_FORMAT);
		return "SampleData1 [id=" + id + ", name=\"" + name + "\", timeStamp=" + sdf.format(timeStamp) + "]";
	}
}

サンプルのデータ・クラスを使ったJSONとのデータ変換のサンプル。

package sample3;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Sample3a {
	public static void main(String[] args) throws IOException {
		ObjectMapper om = new ObjectMapper();
		om.setDateFormat(new SimpleDateFormat(SampleData1.TIMESTAMP_FORMAT));
		//
		String title = "Object⇒JSON";
		String json = "";
		{
			SampleData1 sd1 = new SampleData1();
			sd1.id = 100;
			sd1.name = "aaaaa";
			sd1.timeStamp = new Timestamp(System.currentTimeMillis());
			json = om.writeValueAsString(sd1);
			System.out.println("【" + title + "】\n " + json);
		}
		//
		/*String*/ title = "JSON⇒Object";
		{
			SampleData1 sd1 = om.readValue(json, SampleData1.class);
			System.out.println("【" + title + "】\n " + sd1);
		}
		//
		/*String*/ title = "String⇒JSON";
		{
			String str = new String();
			str = "s t r i n g";
			json = om.writeValueAsString(str);
			System.out.println("【" + title + "】\n " + json);
		}
		//
		/*String*/ title = "JSON⇒String";
		{
			String str = om.readValue(json, String.class);
			System.out.println("【" + title + "】\n " + str);
		}
		//
		/*String*/ title = "Map<String,String>⇒JSON";
		{
			Map<String, String> map = new HashMap<String, String>();
			map.put("id", "ID00001");
			json = om.writeValueAsString(map);
			System.out.println("【" + title + "】\n " + json);
		}
		//
		/*String*/ title = "JSON⇒Map<String,String>";
		{
			Map<String, String> map = om.readValue(json, new TypeReference<Map<String, String>>() {
			});
			System.out.println("【" + title + "】\n " + map);
		}
	}
}

その実行結果がこちら。

【Object⇒JSON】
 {"id":100,"name":"aaaaa","timeStamp":"#2018/01/12 22:59:11.808(JST)#"}
【JSON⇒Object】
 SampleData1 [id=100, name="aaaaa", timeStamp=#2018/01/12 22:59:11.808(JST)#]
【String⇒JSON】
 "s t r i n g"
【JSON⇒String】
 s t r i n g
【Map<String,String>⇒JSON】
 {"id":"ID00001"}
【JSON⇒Map<String,String>】
 {id=ID00001}

ちょっと面倒なのがreadValueで
出力するデータ・クラスを指定するパラメータで・・・
データ・クラスがコレクション系クラスの場合、

new TypeReference<Map<String, String>>() {
}

と妙な書き方をしなければいけないことだ。
勿論、

new TypeReference<List<Map<String, String>>>() {
}

の様にネストしてもいいので、JSONっぽいラフなデータ構造にも対応している。
それから、タイムスタンプ型データの書式は、ObjectMapperのsetDateFormatを使って、SimpleDateFormat のインスタンスを与えることで好きな様に変えられるが、いくつかの書式が混在する場合は厄介かもしれない。




top