メモの日々


2016年06月04日(土) [長年日記]

[hard] ネットワークカメラ「スマカメ」を買った

家の中の定点監視をしたくて、ネットワークカメラを買ってみた。買ったのは安くて人気のありそうなPLANEXのCS-QR20 (スマカメ)。8800円くらい。暗視機能が不要なら6500円くらいで買える。

無線LANに接続するのにWPSを初めて使った。無事に繋がったけど、ちゃんと意図したアクセスポイントに繋がっているのか確認しないと怖いな。なお、WPSを使わず有線LANでインターネットに繋いだ後にスマホから無線LAN設定をすることもできるはずです。

設定変更をしたり映像を見るにはスマホが必要。真っ暗な部屋でも割とクリアに映るので便利。録画機能(要SDカード)や動体検知機能もある。リアルタイムなら音声も聞けるけど、録画には音声が入らない。

以前は無料のWindows版クライアントソフトもあったようなのだけれど、今は見当たらなくて残念。PCからも見たい。


2016年06月06日(月) [長年日記]

[java] JUnitでparameterized testなどを使うサンプル

6月からJavaを使っている。JUnitのパラメータ化テストなどの機能を使ったので忘れないようにメモ。

を使った。パラメータ化テストは以前にTheoriesを使ったことがあるのだけれど、今回はParameterized testsを使ってみた。

次のサンプルでは、テストメソッドは testAdd(), testAdd2(), testDivide() の3つだけだけれどパラメータ化により15件のテストが実行される。testDivide()の実装はいまいち。

// テスト対象のクラス
public class Calculator {
    public static int add(int x, int y) {
        return x + y;
    }

    public static int divide(int x, int y) {
        return x / y;
    }
}
import java.util.Arrays;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import static org.hamcrest.CoreMatchers.is;
import org.junit.Rule;
import org.junit.experimental.runners.Enclosed;
import org.junit.rules.ExpectedException;
import org.junit.runners.Parameterized.Parameter;

// Calculatorのadd()とdivide()のテストを束ねるクラス。
@RunWith(Enclosed.class)
public class CalculatorTest {
    // Calculator::add のテスト
    @RunWith(Parameterized.class)
    public static class AddTest {
        // AddTest用のテストパラメータ
        @Parameters(name = "{index}: {0}")
        public static Iterable<P> data() {
            return Arrays.asList(
                    new P(1, 1, 2),
                    new P(1, 2, 3),
                    new P(0, 1, 1),
                    new P(-1, 1, 10), // わざとテストを失敗させる
                    new P(-1, 1, 0)
            );
        }

        // AddTest用テストパラメータを保持するクラス
        public static class P {
            int x;
            int y;
            int expected;

            P(int x, int y, int expected) {
                this.x = x;
                this.y = y;
                this.expected = expected;
            }

            @Override
            public String toString() {
                return String.format("x=%d, y=%d", x, y);
            }
        }

        // テストパラメータはメンバ変数に保持することになる
        @Parameter
        public P p;

        // これがテスト本体
        @Test
        public void testAdd() {
            assertThat(Calculator.add(p.x, p.y), is(p.expected));
        }

        @Test
        public void testAdd2() {
            assertThat(Calculator.add(p.y, p.x), is(p.expected));
        }
    }

    // Calculator::divide のテスト
    @RunWith(Parameterized.class)
    public static class DivideTest {
        @Parameters(name = "{index}: {0}")
        public static Iterable<P> data() {
            return Arrays.asList(
                    new P(1, 1, 1),
                    new P(1, 2, 0),
                    new P(0, 1, 0),
                    new P(-1, 0, null), // 例外が投げられるケース
                    new P(-1, 1, null)  // わざとテストを失敗させる
            );
        }

        public static class P {
            int x;
            int y;
            Integer expected;

            P(int x, int y, Integer expected) {
                this.x = x;
                this.y = y;
                this.expected = expected;
            }

            @Override
            public String toString() {
                return String.format("x=%d, y=%d", x, y);
            }
        }

        @Parameter
        public P p;

        // 例外を捕捉するのにExpectedExceptionルールを使う
        @Rule
        public ExpectedException thrown = ExpectedException.none();

        @Test
        public void testDivide() {
            // expectedがnullなら例外を捕捉することにする
            if (p.expected == null) thrown.expect(ArithmeticException.class);

            int result = Calculator.divide(p.x, p.y);

            if (p.expected != null) assertThat(result, is(p.expected));
        }
    }
}
Testsuite: CalculatorTest
Tests run: 15, Failures: 3, Errors: 0, Skipped: 0, Time elapsed: 0.047 sec

Testcase: testDivide[4: x=-1, y=1](CalculatorTest$DivideTest):	FAILED
Expected test to throw an instance of java.lang.ArithmeticException
junit.framework.AssertionFailedError: Expected test to throw an instance of java.lang.ArithmeticException


Testcase: testAdd[3: x=-1, y=1](CalculatorTest$AddTest):	FAILED

Expected: is <10>
     but: was <0>
junit.framework.AssertionFailedError: 
Expected: is <10>
     but: was <0>
	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at CalculatorTest$AddTest.testAdd(CalculatorTest.java:56)


Testcase: testAdd2[3: x=-1, y=1](CalculatorTest$AddTest):	FAILED

Expected: is <10>
     but: was <0>
junit.framework.AssertionFailedError: 
Expected: is <10>
     but: was <0>
	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
	at CalculatorTest$AddTest.testAdd2(CalculatorTest.java:61)

2016年06月10日(金) [長年日記]

[java][dev] Javaがサポートするロケールの一覧

Javaがサポートするロケールについてのドキュメントは

のようだ。Java(tm)の国際化サポートというページからリンクされている。

Java 6の頃のロケール一覧のドキュメントは翻訳されている。


2016年06月13日(月) [長年日記]

[windows] Windows 8.1で非管理者ユーザで環境変数を設定する

Windows 8.1で環境変数の設定の仕方がなかなかわからなかったのでメモ。

Windowsの環境変数設定はいつも

  1. エクスプローラで「PC」を右クリックして「プロパティ」を選択。
  2. 「システム」の設定画面が表示されるので左にあるメニューから「システムの詳細設定」を選択。
  3. 「システムのプロパティ」画面が表示されるので下にある「環境変数」ボタンを押す。

で表示される画面でやっていたのだけれど、これだと管理者権限のあるユーザでないと操作ができないし、環境変数の設定対象ユーザも管理者になってしまう。

非管理者ユーザが環境変数を設定したい場合はどうしたらいいの?

おれが見つけた解法は、

  1. コントロールパネルを開く。
  2. 右上にある「コントロール パネルの検索」フィールドに「環境変数」と入力して虫眼鏡アイコンをクリックする。
  3. 検索結果に「環境変数を編集」というリンクがあるのでそれを選択。

というやり方。検索を使わずクリックだけでこの画面に辿り着く方法は分からない。

また、別解としてコマンドプロンプトからsetxコマンドを使うことでも環境変数を設定できると知った。これは便利だな。


2016年06月14日(火) [長年日記]

[windows][howto] Windows 8.1で「コンピューターの管理」を管理者として実行する

Windows 8.1で「コンピューターの管理」を管理者として実行するいい方法がわからない。自分で苦労して編み出したのは次の手順。

  1. まず非管理者で「コンピューターの管理」を起動する。スタートボタンを右クリックして「コンピューターの管理」を選択すればよい。
  2. タスクバーに今起動した「コンピューターの管理」がいるのでそれを右クリックし、そこに現れる「コンピューターの管理」を更に右クリックする。すると「管理者として実行」という選択肢が現れるのでそれを選択する。

ダミーで一回起動しないといけないのはおかしいよなあ。