メモ。
$ cp --parent foo/bar/*.json target/
コピー元のディレクトリ階層(foo/bar/)を維持した状態でコピーされる。
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 の仕組み上、しょうがないのかもしれないけど。
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 される
コレクション API の remove
メソッドは指定された要素が削除されたかどうか真偽値を返す。(なぜか削除された要素を返すと勘違いしていた...)
java.time.LocalDate
クラスは「時刻」に関する情報は持っていないため、format
メソッドに DateTimeFormatter.ISO_DATE_TIME
を指定すると実行時に例外が発生する。
ラムダ式では、引数が1つの場合は ()
は省略可で型は記述できない。処理部の {}
を省略する場合は return
は記述できない。return
を記述する場合は {}
が必要。
前回の続き
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 のインスタンスは ==
と /=
を実装する。Haskell のすべての標準型は Eq のインスタンスである。
関数の型変数に Eq クラスの制約が付いている場合、その関数の定義のどこかで ==
か /=
が使われていることを意味する。
何らかの順序を付けられる型のための型クラス。比較演算子 (>
) の場合、引数を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
関数は、ある型のインスタンスを引数に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 のインスタンスの型の値を返す。
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 のインスタンスの型には、後者関数 succ
や前者関数 pred
が定義されている。
Prelude> succ '1' '2' Prelude> pred True False
上限と下限を持つインスタンスを表すための型クラス。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 型クラスの任意のインスタンスとして振る舞うことができる。
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)
浮動小数点数を表すための型クラス。この型クラスには Float と Double が含まれる。
整数を表すための型クラス。この型クラスには 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
今回は型について。
たまに忘れるのでメモ。
リモートの origin から foo ブランチを取得して、ローカルに bar という名前でブランチを作成する。-b
を付けるとブランチの切り替えも同時にできる。
git checkout -b bar origin/foo
# ローカルリポジトリのブランチを表示 git branch # リモートリポジトリのブランチを表示 git branch -r # リモートとローカルのブランチをすべて表示 git branch -a