iOS 10 で勝手にスリープ解除されるのをやめる

iOS 10 にしてから iPhone を自分の方に向けるだけでスリープが解除されるようになったようです。

便利と言えば便利なんですが、例えば手に持ってる iPhone をポケットに入れようとしただけで、iPhone が反応してスリープ解除されちゃうのがちょっと煩わしいんですね。

この設定を OFF にする方法。

  1. 設定 > 画面表示と明るさ
  2. 手前に傾けてスリープ解除をOFF

以上です。

余談

iOS 10 にしてから 3D Touch の反応がイマイチな気がする...。

ちなみに 3D Touch は、

で感度を調整できます。

JMockit で System.currentTimeMillis を Mock 化する

JMockit で java.util.Calendar のメソッドを Mock 化する - kntmr-blog

上記のエントリでは java.util.Calendar#getTimeInMillis を Mock 化してミリ秒を取得する例を挙げましたが、そもそもミリ秒を取得するだけなら java.lang.System#currentTimeMillis を使うよね、という話。

で、java.lang.System#currentTimeMillis を Mock 化する場合。

@Mocked
System system;
@Test
public void test() {
    final long expected = 1234567890000L;
    new Expectations() {
        {
            System.currentTimeMillis(); result = expected;
        }
    };
    long actual = System.currentTimeMillis(); // 1234567890000 が返る
    assertThat(actual, is(expected));
}

今回、MockUp<T> ではなく Expectations で Mock 化してみた。ただ、@Mocked System system; って場合によっては影響範囲が大きそう…。JMockit の仕組み上、しょうがないのかもしれないけど。

Oracle Certified Java Programmer, Silver SE 8 認定資格

1Z0-808-JPN - Java SE 8 Programmer I を受験しました。

結果: 合格 / 正解率 92% (合格ライン: 65%)

という訳で『Oracle Certified Java Programmer, Silver SE 8 認定資格』を取得しました。

受験対象は「開発初心者向け」とあるので、Java の開発案件を1~2年程度やっていれば十分合格できるレベルだと思います。
また、Java SE 8 Programmer I という試験名ですが、Java 8 に関連する出題は Date and Time API や関数型インタフェースの java.util.function.Predicate<T> あたりだけのようなので、Java 8 を使ったことがないひとでも少し勉強すればなんとかなると思います。
とは言っても、普通の Web アプリの開発で2次元配列を使うことはあまりないだろうし、コンパイルは基本的に IDE 頼りなので、テキストで書いてあるコードを読んで「どこでコンパイルエラーが発生するか」という問題にはちょっと悩むことがありました。たまに引っ掛け問題みたいなのもあるし。

念のため問題集を買ってひと通り目を通しておいてよかったです。

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

今回、Silver を受験したのは Gold の前提資格になっているからです。なので、次は『Oracle Certified Java Programmer, Gold SE 8 認定資格』を目指してみようかと。

[2016/11/01 追記]
PDF 形式の認定証は CertView からダウンロードできます。ダウンロードできるようになるまでには2日程度かかるようです。

あと、Gold の問題集を買ってきました。

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


以下、個人的なメモ。

シグニチャは「メソッド名」と「引数リスト(型, 数, 順序)」のセットのことを指す。戻り値の型やアクセス修飾子はシグニチャに含まれない。
尚、オーバーロードの条件は「引数リストが異なる」こと。

フィールドの変数を初期化しない場合はデフォルト値で初期化される。メソッド内のローカル変数を初期化せずに使おうとするとコンパイルエラー。

アクセス修飾子は制限が緩いものから順に以下の通り。

  • public : すべてのクラスからアクセス可
  • protected : 同じパッケージに属するクラス、もしくは任意のパッケージに属するサブクラスからアクセス可
  • デフォルト : 同じパッケージに属するクラスからアクセス可 (パッケージプライベート)
  • private : 同じクラスからアクセス可

インタフェースを実装する場合、アクセス修飾子は変更できない。
スーパークラスのメソッドをオーバーライドする場合、アクセス修飾子を制限が厳しいものに変更することはできない。

クラスが継承関係にある場合、スーパークラスから先に初期化される必要がある。
サブクラスのコンストラクタでスーパークラスのコンストラクタ呼び出しを記述しない場合はコンパイラによって暗黙的に super() が追加される。ただし、スーパークラスにデフォルトコンストラクタが存在しない場合、コンパイルエラーになる。
また、コンストラクタの中で super() のあとに this() を記述するとコンパイルエラー。(this() はコンストラクタの先頭に記述する必要がある)

switch 文の default はどこに記述してもよい。(switch ブロックの先頭に書いてもコンパイルエラーにはならない)

java.lang.StringBuilder クラスの append メソッドは、文字列(シーケンス)と開始/終了のインデックスを引数に取って文字列の一部を append できる。普段、1引数のメソッドしか使わないからこれは知らなかった。

StringBuilder sb = new StringBuilder();
sb.append("abcde", 2, 4); // cd が append される

コレクション APIremove メソッドは指定された要素が削除されたかどうか真偽値を返す。(なぜか削除された要素を返すと勘違いしていた...)

java.time.LocalDate クラスは「時刻」に関する情報は持っていないため、format メソッドに DateTimeFormatter.ISO_DATE_TIME を指定すると実行時に例外が発生する。

ラムダ式では、引数が1つの場合は () は省略可で型は記述できない。処理部の {} を省略する場合は return は記述できない。return を記述する場合は {} が必要。

Haskell を使ってみる 5 (型)

前回の続き

Haskell を使ってみる 4 (タプル) - kntmr-blog

型宣言

式の型は :t コマンドで調べることができる。:: は xxx の型を持つことを意味する。

Prelude> :t 'a' -- Char 型
'a' :: Char
Prelude> :t "Hello" -- Char 型のリスト
"Hello" :: [Char]
Prelude> :t ('a',True) -- (Char 型, Bool 型) を持つ (タプルは個々の要素が型を持つ)
('a',True) :: (Char, Bool)

関数に明示的な型宣言を与えることができる。

removeLowercase :: [Char] -> [Char] -- 引数に1つの文字列を取って別の文字列を返すことを意味する

型変数

型変数を使うことで、型安全を保ったまま関数を複数の型に対して動作させることができる。

Prelude> :t head
head :: [a] -> a -- a が型変数で、任意の型を引数に取ることを表す

型変数を使った関数は多相的関数と呼ばれる。head 関数の場合、任意の型のリストを引数に取り、その型の要素を1つ返すことを表す。

型クラス

型クラスは何らかの振る舞いを定義するインタフェース。ある型クラスのインスタンスである型は、型クラスが持つ振る舞いを実装する。型クラスは関数の集まりで、ある型クラスに属する関数をその型クラスのメソッドと呼ぶ。

Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool

=>型クラス制約と呼ばれる。等値性関数の場合、同じ型の引数を2つ取って Bool 型を返すことを表す。また、引数の型は Eq クラスのインスタンスであることを意味する。

等値性演算子 (==) は、実際には関数である。関数名が特殊文字から構成される場合、デフォルトで中置関数となる。その型を調べる場合や他の関数に渡す場合、前置関数として呼び出す場合は、丸括弧で囲う。

Eq 型クラス

等値性をテストできる型に使われる。Eq のインスタンス==/= を実装する。Haskell のすべての標準型は Eq のインスタンスである。

関数の型変数に Eq クラスの制約が付いている場合、その関数の定義のどこかで ==/= が使われていることを意味する。

Ord 型クラス

何らかの順序を付けられる型のための型クラス。比較演算子 (>) の場合、引数を2つ取り、それらが関係を満たすかどうかを表す Bool を返す。compare 関数の場合、Ord のインスタンスの型の引数を2つ取って Ordering を返す。Ordering は GT, LT, EQ のいずれかの値を取る型。

Prelude> :t (>)
(>) :: Ord a => a -> a -> Bool
Prelude> :t compare
compare :: Ord a => a -> a -> Ordering

Prelude> "abc" < "xyz"
True
Prelude> "abc" `compare` "xyz"
LT
Show 型クラス

ある値の型が Show 型のインスタンスであれば、文字列として表現することができる。show 関数は、ある型のインスタンスを引数に1つ取って文字列を返す。

Prelude> :t show
show :: Show a => a -> String

Prelude> show 1
"1"
Prelude> show 3.14
"3.14"
Prelude> show True
"True"
Read 型クラス

文字列を受け取り、任意の型のインスタンスの値を返すための型クラス。read 関数は、文字列を受け取り、Read のインスタンスの型の値を返す。

Prelude> :t read
read :: Read a => String -> a

Prelude> read "1" + 2
3
Prelude> read "[1,2,3,4]" ++ [5]
[1,2,3,4,5]

read 関数が返す値の型は Read のインスタンスであるが、具体的にどの型を返すかは返す値の使い方次第で判定する。式が取るべき型を明示する場合には型注釈 (::) を使う。

Prelude> read "1" -- これはエラー (返り値の型を推論できない)
*** Exception: Prelude.read: no parse
Prelude> read "1" :: Int -- 型注釈で型を指定する
1
Enum 型クラス

要素の値を列挙するための型クラス。Enum 型クラスのインスタンスの値はレンジの中で使うことができる。Enumインスタンスの型には、後者関数 succ や前者関数 pred が定義されている。

Prelude> succ '1'
'2'
Prelude> pred True
False
Bounded 型クラス

上限と下限を持つインスタンスを表すための型クラス。minBound 関数と maxBound 関数で調べることができる。

Prelude> :t minBound
minBound :: Bounded a => a -- 多相定数 (定数だが任意の型として振る舞うことができる)

Prelude> minBound :: Int
-9223372036854775808
Prelude> maxBound :: Char
'\1114111'

タプルを構成する要素がすべて Bounded のインスタンスであれば、そのタプル自身も Bounded になる。

Prelude> maxBound :: (Bool, Int, Char)
(True,9223372036854775807,'\1114111')
Num 型クラス

数を表すための型クラス。あらゆる数は多相定数として表されており、Num 型クラスの任意のインスタンスとして振る舞うことができる。

Prelude> 1 :: Int
1
Prelude> 1 :: Integer
1
Prelude> 1 :: Float
1.0
Prelude> 1 :: Double
1.0

* 演算子は、2つの数を引数に取って1つの数を返す。3つの数はすべて同じ型であることを意味する。

Prelude> :t (*)
(*) :: Num a => a -> a -> a

同時に複数の型のインスタンスとして振る舞うことはできない。

Prelude> (5 :: Int) * (10 :: Integer) -- これは型エラーとなる

<interactive>:109:15: error:
    • Couldn't match expected type ‘Int’ with actual type ‘Integer’
    • In the second argument of ‘(*)’, namely ‘(10 :: Integer)’
      In the expression: (5 :: Int) * (10 :: Integer)
      In an equation for ‘it’: it = (5 :: Int) * (10 :: Integer)
Floating 型クラス

浮動小数点数を表すための型クラス。この型クラスには Float と Double が含まれる。

Integral 型クラス

整数を表すための型クラス。この型クラスには Int と Integer が含まれる。Num は実数を含むすべての数を表す。fromIntegral 関数は何らかの整数を引数に取ってより一般的な数 (Num) を返す。整数と浮動小数点数を一緒に扱うような場合に使う。

Prelude> :t fromIntegral
fromIntegral :: (Num b, Integral a) => a -> b

Prelude> fromIntegral (1 :: Int) + 2.1
3.1
Prelude> (1 :: Int) + 2.0 -- これはエラー (Int と浮動小数点数を足し合わせようとしているため)

<interactive>:123:14: error:
    • No instance for (Fractional Int) arising from the literal ‘2.0’
    • In the second argument of ‘(+)’, namely ‘2.0’
      In the expression: (1 :: Int) + 2.0
      In an equation for ‘it’: it = (1 :: Int) + 2.0

今回は型について。

Git でリモートリポジトリのブランチを checkout

たまに忘れるのでメモ。

リモートの origin から foo ブランチを取得して、ローカルに bar という名前でブランチを作成する。-b を付けるとブランチの切り替えも同時にできる。

git checkout -b bar origin/foo
(メモ) ブランチを表示するときのコマンド
# ローカルリポジトリのブランチを表示
git branch

# リモートリポジトリのブランチを表示
git branch -r

# リモートとローカルのブランチをすべて表示
git branch -a