おれろぐ #z_a_ki3

(・∀・) オイ!

OCJP Silver SE 7 模試1回目 つづき

zaki3.hateblo.jp

前回の続きです。

問題

gist.github.com

コンパイル、実行した結果として正しいものを1つ選択。

  • A X X X
  • B X Y X
  • C X Y Y
  • D Y Y Y
  • E コンパイルエラー
  • F 実行時エラー

解答:E
正答:D

問題見たとき、interface ZにはtoString()の定義無いやん!アクセスできないやん!!
これはコンパイルエラーで間違いない!!!

なんて思ったのでしょう。だがしかし、interfaceもclassと同様に継承してない場合は
デフォルトでObjectが親になるので、Objectが持っているtoString()メソッドであれば、
参照することができるという罠でした。

※toString()ではなくて、独自のメソッドならコンパイルエラーに。

問題

gist.github.com

コンパイル、実行ともに成功させるために修正する箇所はどこか。1つ選択。

  • A 2行目の A() の private を削除する
  • B 5行目の B() の private を削除する
  • C 6行目の play() メソッドを public にする
  • D 6行目の play() メソッドを static にする
  • E いずれも該当しない

解答:B
正答:A

コンストラクタがprivateだからやろ〜と条件反射でBを選択しちゃいました。
mainメソッドと同一のクラスだからprivateで問題ないわけで、
スーパークラスコンストラクタが暗黙的にサブクラスのコンストラクタを呼び出す際に
privateだとアクセスできないと。

Aの通り、privateを削除するか、選択肢には無いけどprotectedにすればOKだった。

問題

gist.github.com

コンパイル、実行した結果として正しいものを1つ選択。

  • A Class A Class A
  • B Class B Class A
  • C Class A Class B
  • D Class B Class B
  • E コンパイルエラー
  • F 実行時エラー

解答:E
正答:D

キャストの方向を勘違いしていた様子。7行目がダウンキャスト obj1 = obj2; なら
コンパイルエラーになるが、問題のコードはアップキャストだから問題なしでした。

問題

gist.github.com

コンパイル、実行した結果として正しいものを1つ選択。

  • A ArrayIndexOutOfBoundsException が発生する
  • B IllegalArgumentException が発生する
  • C NullPointerException が発生する
  • D StringIndexOutOfBoundsException が発生する
  • E 0 が出力される
  • F -1 が出力される

解答:A
正答:D

インデックスが範囲を超えたものはみんなArrayIndexOutOfBoundsExceptionだと思ってました。
無知を晒しました(・∀・)

問題

gist.github.com

3行目にコードを挿入してコンパイルが成功するものはどれか3つ選択

  • A throws IOException { }
  • B throws Exception { }
  • C throws SQLException { }
  • D throws FileNotFoundException { }
  • E { }

解答:A,B,E
正答:A,D,E

throwsを使用しているメソッドをオーバーライドする際の決まり

1番目の関係性を逆に考えてました。

やっぱり模試を解いてみると理解が甘い点がはっきりと浮き彫りになりますね(´・_・`)

明日は白本の模試を解いてみたいと思います。

OCJP Silver SE 7 模試1回目

zaki3.hateblo.jp

やる気が生成されず、前回投稿からちょっと立ちましたが、現状の知識を把握するために
紫本巻末の模試をやってみました。

オラクル認定資格教科書 Javaプログラマ Silver SE 7

オラクル認定資格教科書 Javaプログラマ Silver SE 7

結果

90問中、75問正解で正答率83%・・・あまり余裕はありませんね。

しっかり復習しましょう。

間違い晒し

問題

gist.github.com

コンパイル、実行した結果として正しいものを1つ選択。

  • A main hello
  • B hello main
  • C コンパイルエラー
  • D 実行時エラー

解答:C
正答:D

へっぽこなミスで、これ、実行に必要なmainメソッドが無いだけなのでコンパイル
問題なく出来るんですよね。

こんな間違えはもったいないです。

問題

ArrayListクラスの特徴として正しいものを4つ選択

  • A AbstractListクラスを継承している
  • B Collectionクラスのsort()メソッドが使用できる
  • C RandomAccessインターフェースを実装している
  • D オブジェクトを格納できる
  • E 宣言時に必ず型宣言しなくてはいけない

解答:A,B,C,D
正答:A,B,C,D

間違えて無かったけど、Cをカンで答えたので・・・

問題

gist.github.com

2行目にコードを挿入してコンパイルが成功するものはどれか2つ選択

  • A list.indexOf(2.0d);
  • B list.get(list.size());
  • C list.add("hi");
  • D list.add("10.0");

解答:A,D
正答:A,B

Bのlist.get(list.size())で要素の範囲をオーバーすると思って、Dを選択したのですが、
ボクシングアンボクシングやキャストと違ってパースは自動的にされないですよね。

"コンパイルが成功するもの"っていうのがポイントでBは実行時エラーになるものの
コンパイルは問題なく成功するんですよね。

行間をしっかり読むのが大事だと再認識しました。。。

問題

gist.github.com

sbが保持する文字をすべて削除するコードとして正しいものを1つ選択

  • A sb.delete();
  • B sb.deleteAll();
  • C sb.delete(0, sb.length());
  • D sb.delete(0, sb.size());
  • E sb.remove();
  • F sb.removeAll();

解答:B
正答:C

StringBuilderの仕様を覚えていませんでした。
基本的なAPI仕様を読みます。。。

StringBuilder (Java Platform SE 8)

問題

gist.github.com

6行目に挿入するコードで Welcome Java World. と出力するものを2つ選択

  • A sb.append(s1).append(s2);
  • B sb.insert(s1).insert(s2);
  • C sb.append(s1 + s2);
  • D sb.insert(s1 + s2);
  • E sb += (s1 + s2);

解答:A
正答:A,C

"2つ選択"と書いてます。問題をちゃんと読みましょう。

問題

gist.github.com

コンパイル、実行した結果として正しいものを1つ選択

  • A a:null b:0
  • B a:Bar b:500
  • C a:Foo b:100
  • D コンパイルエラー
  • E 実行時エラー

解答:A
正答:C

問題を見て、これあれやん!this付けてないからメソッド実行しても値が更新しない奴やん!
フィールドは初期化してないからデフォルトの値(String=null、int=0)やろ!!

と、盲目的に解答してました。コンストラクタで初期化してるのに完全に見えなくなってます。
ちゃんと全体を見ましょう。

問題

gist.github.com

コンパイル、実行した結果として正しいものを1つ選択

  • A Helloが2回表示される
  • B Helloが1回表示された後、ClassCastException が発生する
  • C Helloが1回表示された後、IllegalStateException が発生する
  • D コンパイルエラー

解答:B
正答:D

interface Aにはshow()メソッドが定義されてないのはコンパイル時にチェックされますね。
IDEだと警告が出るのであまり考えてませんでした。
あと、2つの例外をしっかり覚えてたら消去法で解答できましたね。

ClassCastException
あるオブジェクトを継承関係にないサブクラスにキャストしようとした

IllegalStateException
(オブジェクト状態が)不正または不適切なときにメソッドが呼び出された

問題

定義可能なコードを1つ選択

  • A abstract class A extends String { // 実装コード }
  • B abstract class B extends Double { // 実装コード }
  • C abstract class C extends Integer { // 実装コード }
  • D abstract class D extends System { // 実装コード }
  • E abstract class E extends Number { // 実装コード }

解答:D
正答:E

まず、Numberクラスを知らなかったのが敗因。基本型のラッパークラスの抽象クラスだったんですね。
Systemクラスを継承してもいいのかなぁ・・・と臭いは感じていたものの間違えました。

問題

gist.github.com

コンパイル、実行した結果として正しいものを1つ選択

  • A Object
  • B Number
  • C Integer
  • D char[]
  • E コンパイルエラー
  • F 実行時エラー

解答:A
正答:E

純粋にString型を引数に持つメソッドがないのでコンパイルエラーと思ったのですが、
実際はスーパークラスのObjectに暗黙の型変換が行われて2行目が実行されるんですね。

ぐぬぬ

ちょっと長くなったので分割します。

Java SE 7 Programmer I って

先日のJavaDayTokyoで最新Java認定資格ガイドというセッションがあったので、
それを見てみると、上級者の指導のもとで実装やテストが書けるレベル感らしい。

zaki3.hateblo.jp

まぁ、確かに試験範囲的に納得は行くけど、コンパイルエラーになるかどうかの問題は
普段、IDEで解決してくれていたり、慣例的に書いていて意識していない部分も出るので、
意外と難しい印象が・・・。

それにしても後半にある

みんなのギモン:「認定試験は時間的な余裕がない!」
そう感じるように試験時間を設定しています
・オラクル認定資格の試験仕様の策定には『心理統計学者(Psychometrician)』も関与してます!

って・・・

おぃ、心理統計学者よ。

1問当たり1分30秒しか時間がない中、解けない問題に引っかかると確かに焦って
余計解けなくなるのは確かなので、そこはチェックつけて後回しにして解ける問題だけ
さくさくと解いて残り時間で2周目に取り組む方がいいのかなと思います。

で、Java8対応は5月末にのBronzeがリリースされて、7月にSilver、10月にGoldと出るけど、
資格取得の目的は社内考課の為だけなので再受験無料キャンペーンが延長になった7月までに
Java7 Goldまで取れればいいかなと思ってます。

(できればJava EE 6 Web Component Developerまでチャレンジしたいけど無理そう。)

Java SE 7 Programmer I 受験する!

期末の昇給に関わる評価とか再受験無料キャンペーンが5月いっぱいで終わるので Oracle Certified Java Programmer, Silver SE 7 を受験することにしました。

一応、JavaSEの範囲で、且つシルバーだと基本的な部分しか出てこないと思うので大丈夫かと思うのですが、テスト内容を確認していきたいと思います。

試験範囲

Javaの基本

  • 変数のスコープを定義する
  • Javaクラスの構造を定義する
  • main()メソッドがある実行可能なJavaアプリケーションを作成する
  • 他のJavaパッケージをインポートしてコードでアクセスできるようにする

Javaのデータ型の操作

  • 変数を宣言および初期化する
  • オブジェクト参照変数とプリミティブ変数を区別する
  • オブジェクトのフィールドに対して読取りと書込みを行う
  • オブジェクトのライフサイクルについて説明する
  • オブジェクトのメソッドを呼び出す
  • StringBuilderクラスおよびそのメソッドを使用してデータを操作する
  • 文字列を作成および操作する

演算子と決定構造の使用

  • Java演算子を使用する
  • カッコを使用して演算子の優先順位を変更する
  • ==とequals()を使用して文字列と他のオブジェクトが等しいかどうかをテストする
  • ifおよびif/else構造を作成する
  • switch文を使用する

配列の作成と使用

ループ構造の使用

  • whileループを作成および使用する
  • 拡張forループを含むforループを作成および使用する
  • do/whileループを作成および使用する
  • ループの構造を比較する
  • breakとcontinueを使用する

メソッドカプセル化を操作する

継承の操作

  • 継承を実装する
  • ポリモフィズムの使用例を示すコードを開発する
  • 参照の型とオブジェクトの型を区別する
  • キャストが必要なタイミングを判断する
  • superとthisを使用してオブジェクトとコンストラクタにアクセスする
  • 抽象クラスとインタフェースを使用する

例外の処理

  • チェックされる例外、RuntimeExceptionsおよびエラーを区別する
  • try/catchブロックを作成し、通常のプログラム・フローが例外によってどのように変更されるかを判断する
  • Javaで使用される例外について説明する
  • 例外をスローするメソッドを呼び出す
  • 一般的な例外クラスとカテゴリを認識する

参考

Java SE 7 Programmer I| Oracle Certification Exam

Doxygenでドキュメントを自動で生成してみる。

またまた、Twitterで・・・・

以前の現場で使っていた、ソースコードからドキュメント類を自動生成するF社製のツールについて
話題が挙がっていて、今、この手のドキュメント自動生成ツールはどんなのがあるんだろうと
調べたらDoxygenなんてものがあったので、インストール〜とりあえず生成までしてみました。

前提条件

インストール

brewでさくさくインストールします。graphvizは図を生成するのに必要です。

$ brew install doxygen
==> Downloading https://homebrew.bintray.com/bottles/doxygen-1.8.9.1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring doxygen-1.8.9.1.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/doxygen/1.8.9.1: 5 files,  15M
$
$ brew install graphviz
==> Installing graphviz dependency: libpng
==> Downloading https://homebrew.bintray.com/bottles/libpng-1.6.16.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring libpng-1.6.16.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/libpng/1.6.16: 17 files, 1.3M
==> Installing graphviz
==> Downloading https://homebrew.bintray.com/bottles/graphviz-2.38.0.yosemite.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring graphviz-2.38.0.yosemite.bottle.1.tar.gz
🍺  /usr/local/Cellar/graphviz/2.38.0: 469 files,  68M

サンプルの準備

皆さんおなじみのTwitter4Jで見てみます。

$ mkdir Doxygen
$ cd Doxygen
$ wget http://twitter4j.org/archive/twitter4j-4.0.2.zip
$ unzip twitter4j-4.0.2.zip

設定ファイル生成

ドキュメントを生成するソースのルートで doxygen -g を実行します。
カレントディレクトリに Doxyfile ファイルが出来ます。

doxygen -g [filename] でファイル名を指定できます。

$ doxygen -g


Configuration file `Doxyfile' created.

Now edit the configuration file and enter

  doxygen Doxyfile

to generate the documentation for your project

設定ファイルの変更

設定項目は非常に多いですが、とりあえず RECURSIVE = YES にすれば
ディレクトリ内を再帰的に検索してドキュメント化してくれます。

# The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well.
# The default value is: NO.

#RECURSIVE              = NO
RECURSIVE              = YES

ドキュメントの生成

doxygenコマンドでドキュメントが生成されます。
設定ファイル等で指定していなければカレントディレクトリにhtmlディレクトリが
作成され、自動生成されたドキュメント類が格納されます。

$ doxygen
Searching for include files...
Searching for example files...
Searching for images...
Searching for dot files...
Searching for msc files...
      〜略〜
Generating file index...
Generating file member index...
Generating example index...
finalizing index lists...
writing tag file...
lookup cache used 0/65536 hits=0 misses=0
finished...

ドキュメント

こんな感じにできました。

f:id:z_a_ki3:20150316235753p:plain

f:id:z_a_ki3:20150316235815p:plain

f:id:z_a_ki3:20150317000902p:plain

参考

Doxygen: Main Page
Doxygen(日本語)

メソッドの命名 ableとcan

TLでメソッド名の命名についてちょっと盛り上がっていて、エアリプしていくなかで、
1つ自己解決でスッキリしたので備忘録に。

よく、状態を確認するboolean型のメソッド名で

  • canHoge
  • isHogeable

と付けるパターンがあって、「人それぞれ、好みでしょ!」と思ってたんですが、
この記事を見て納得しました。

plaza.rakuten.co.jp

例えば、「タイプできる」

I can type.

I am able to type.

と、確かにどちらも可能ですが、can はすでに持ち合わせている能力、だからいつでもタイプできるという能力で、able は実現できる能力、いつでもできる能力という意味ではなく、発話時点で実現可能な能力です。

JavaのインタフェースでRunnableやThrowable、Iterableなどは実装することによって
その機能(能力)を実現することが出来るので〜ableと命名する。

boolean変数を返すメソッドはその機能(能力)が即時に実現(実行)できるかどうかを
返すメソッドなのでcan〜と命名する。

そう考えるとスッキリ納得することができました。

英語ネイティブの人からしたら、この辺はもう無意識に使い分けるんでしょうかね。
とりあえず基本的なことなので、少しずつしっかり理解していきたいと思います。

参考
命名規約 【Okapi Project】

オリジナルステッカー作り〜素材選び編〜

前回、ステッカー印刷をお願いする会社を選び、サンプル請求しました。

オリジナルステッカー作り〜会社選び編〜 - おれろぐ #z_a_ki3

で、届いたサンプルはこちらです!!

f:id:z_a_ki3:20150315093008j:plain

※写真では正確に質感が伝わらないことがあるので、あくまで参考としてください。

ちなみに今回はビックリマンシールのキラシールをイメージしていたので
プレミアムステッカーのサンプルを請求しました。

プレミアムステッカー|印刷通販のグラフィック|オリジナルネットプリント作成の決定版!

アセテートサテン

f:id:z_a_ki3:20150315093021j:plain

グロス

f:id:z_a_ki3:20150315104314j:plain

f:id:z_a_ki3:20150315093036j:plain

f:id:z_a_ki3:20150315093043j:plain

マット

f:id:z_a_ki3:20150315093026j:plain

f:id:z_a_ki3:20150315093050j:plain

f:id:z_a_ki3:20150315093054j:plain

ヘアラインシルバー

f:id:z_a_ki3:20150315093125j:plain

ホログラムスター

f:id:z_a_ki3:20150315093115j:plain

ホログラムハート

f:id:z_a_ki3:20150315093120j:plain

ホログラムレインボー

f:id:z_a_ki3:20150315093058j:plain

ホログラムレンズ

f:id:z_a_ki3:20150315093103j:plain

私はこの中でホログラムレインボーとレンズが気に入りました!
どっちにするかは決めかねているので、ゆっくり考えたいと思います。

サンプルは問題なさそうなので、データ作りに入っていきたいと思います。

次回

データ作成編