Ruby技術者認定試験Silver version 2.1を受けて…

先ほどRuby Silverを受けてきました。
Silverを取りたいという人のためになるかどうかはわからないですが対策など書いていきたいと思います。


## 勉強期間
明確に設けた勉強期間は2週間です。
その前から自学で少しRubyを触っていた（**たのしいRubyの第2部まで**）ので、初学者の方の参考にならないかもしれないですが。。。
もろもろ考えると、3週間勉強すれば受かると思います。

自分の勉強スケジュールは…

* 平日１時間 ～ １時間半
* 休日３時間

合計でたぶん40時間も勉強してないかと思います。
正直点数を見てサボりすぎたな、と思いましたｗ

## 勉強の仕方
僕は資格用のテキストは買いませんでしたので、代わりに以下を参考にして勉強していきました。

##### ミニツク - Rubyのe-ラーニング研修システム
Ruby技術者認定試験（Silver）対策コース：http://www.minituku.net/courses/1049510743/contents/775230600.html
※誤答がいくつかある


##### Rubyアソシエーション - Ruby技術者認定試験 - Ruby Association
模擬問題集：http://www.ruby.or.jp/assets/images/ja/certification/examination/exam_prep_jp.pdf
※誤答がいくつかある


##### プログラミング言語 Ruby リファレンスマニュアル
最新版：https://docs.ruby-lang.org/ja/
※試験は2.1系なので注意が必要になります


##### たのしいRuby 第５版

ミニツクと模擬問題集を２周ずつやって、わからないところがあれば適宜リファレンスとたのしいRubyで確認していく感じで進めてました。
問題にはなぜかミスがいくつかあるので、必ずコンソールで確認しながらやるべきです！（ぼくは`pry`をつかって確認してました）

テキストの問題集にもミスがあるみたいなので、買わなくてもいいと思いますｗ

## 出てきた問題(部分的に変えてます)
だまし問題や、似たようなメソッドの使い分けみたいな問題がたくさん出題されました。
見事に引っかかって減点してしまったわけですが…
もちろん普通の処理の問題も出ましたが、全体的に少なかったです（２・３問だった気がします）。  
おぼえているうちに書きだしていきます。結果は実行してみてからのお楽しみです。

### super
だいぶ前に勉強してたので油断しました。

```
class A
  attr_reader :x

  def initialize(x = 100)
    @x = x
  end
end

class B < A
  def initialize(x = 800)
    @x = x
    super
  end
end

b = B.new
p b.x
#=> ????
```
superの位置が下だから、うーんと～、でミスった問題です。
やったからと言っておぼえているわけじゃあないですよね。。。

### ハッシュの作り方
単純なんですけどやられました。
複数選択可っていう問題文がいやらしい。

```
hash = {:a => 1, b: 3, "c" => 5}
```
この三つ以外はないのでだまされないように！！！！（自戒）

## 追記
```
hash = Hash[:a, 1, :b, 3, :c, 5]
```
これもありました。危ない危ない。


### splitメソッド
出たよ、こいつ。よく`Array#join`メソッドと一緒に使われる子ですね。
`split()`と`split(//)`の違いを抑えてなかった自分が悪いんですが、まぎらわしいですよね。。。

```
"a b c d".split()
"a\nb\nc\nd".split(//)
"a\tb\tc\td".split()
"a b c d".split(//)
```
同じ結果を二つえらべ～って問題でした。複数回答はマジで嫌だ。

### zipメソッド&transposeメソッド
zipメソッドは押さえていたんですが、transposeメソッドはわかりませんでした。
これは完全に消去法でなんとかしましたが。

```
a = [1,2,3]
b = ["あ","い","う"]

何らかの処理

#=> 
[1, "あ"]
[2, "い"]
[3, "う"]

選択肢
a.zip(b) do |x, y|
  p [x, y]
end

もしくは
(a, b).transpose.each do |x, y|
  p [x, y]
end

もしくは
(a, b).transpose.each do |i|
  p i
end

あともう一つあったけど論外な書き方だったので削除
```
なんとかして間違えました。
zipメソッドがブロックをとった時の実行方法がわからなかったのが敗因です。
悔しい。

### バブルソート？
で、あってるかな？
そもそもソートは手をつけてなかったです。勉強するのわすれてましたｗ

```
hash1 = {1 => "foo", 2 => "hoge", 3 => "Baz"}
hash2 = {1 => "Foo", 2 => "hoge", 3 => "Baz"}

hash1.update(hash2).sort{ | a, b | a[1] <=> b[1] }
#=> ????
```
正直まったくわからなかったですが、updateメソッドのところで選択肢を６つから２つまで絞れたのであとはカンで選びました。
sortメソッドとはもっと仲良くなりたいですね。。。

### String#each
はい、できません。
見直したときに、「あっ、これeach_lineメソッドじゃないとできんやん！」って思いだして選び直しました。見直しまじで大事です。


### IOクラスのモードチェック
あんまり覚えてないんですがモードの役割をすべてチェックして、一度実装してみた方がいいです。
ここはなかなか頭に入りにくいところですが、何個かかいてればおぼえます！（僕は間違えましたが）


### ローカル変数としてなんとかかんとか
これ意外と重要です。同じような問題が二問出ました。
ローカル変数の定義としては

```
先頭がアルファベット小文字か「＿(アンダーバー)」で始まる
```
これさえ脳みそにぶち込んでおけば安心です。
間違いを誘発してくるような選択肢があるので間違わないように！（自戒二回目）


### なんじゃこりゃ
京都大学のもっとも短い大学入試問題をご存知でしょうか？
そうですね、「**tan1°は有理数か。**」です。
これを彷彿とさせるような問題でした。

```
p ?A
#=> ???
```
は？って感じです。さっき確認したらあってたんですが、三項演算子的な考えで解きました。
いきなりこんなのぶちこまれたら困りますよ。。。
ギネスブックにのせるべきです。


## 対策
これは模擬問題集とミニツクで共通してよく出てきたものをピックアップして重点的に勉強しました。
たとえば…

* 破壊的メソッドか否か
* 似た処理をするメソッドはなにか
* 2,8,10,16進数の計算方法と表し方
* 例外処理に関して
* 変数のスコープ（ブロックなど）
* ローカル変数に関して
* モジュールのMix-in
* 継承関係
* メソッド処理後のインスタンスの所属クラス
* 正規表現ごりごりやる

こんな感じです。
勉強してたのに全然出なかったのもあります（Procクラスとか正規表現とか）。
というか、僕が解いた問題で似たようなのはほとんど出なかったです。。。
本の問題集であれば類似問題あったのかも。
splitメソッド、sliceメソッド辺りはよく出るので要チェックです。
それ以外にもよく出るメソッドはたくさんあるんですけどね。


## 最後に
結果は80点とぎりぎり合格ｗ
画面に結果が出た時はちょっとがっかりしました。。。

僕は結構だらだらと勉強しましたが、休みの日にもっとガッツリ勉強すれば正直一週間で受かると思います。Rubyを少しでも触っていればです。
他の言語をやっていて、余裕を持ってやりたいなら２～３週間で受かるレベルの問題でした。
初学者なら余裕を持って１カ月かなと。

今回くそみたいな結果を残してしまったので、Ruby Goldを受けるときは100点目指してがんばります。
まずはパーフェクトRubyとEffective Ruby買いますね。。