竹林のゆとりブログ

山奥で生活し、日々の思いをつらつらと書くブログ。 IT、数学、アニメなど。

Ruby Silver合格報告

受かりました。

結果は90/100点。 75点合格なので、ぎりぎりではないという意味でも、ほっと一安心。

せっかくなので、振り返ります。

Ruby経験値

Rubyを使い始めたのは二年前で、書いた行数は約10ks(Rails含む)
ほとんどが趣味。遊びで触って、個人レベルのアプリを作っていた人です。

実際にしたこと

受けるにあたって対策として実際にしたことを記載します。

  1. 問題集を解く
  2. 重点カ所を特定し、その部分の教科書を読み、暗記する。
  3. 気になるところは公式のリファレンスを読み、pryで試す。

基本は1.と2.の繰り返しです。 リファレンスは量が膨大なので、リファレンスで勉強するのではなく、 教科書から意味が一意に特定できないものを確認するだけにとどめました。

僕は試験までに3ループしました

1回目

40点

ほとんどわからなくて、精神的にずたぼろになりました。

メンタルはだいぶやられまいたが、へこみ続けるわけにもいかないので、課題を分析します。 すると・・・

使ったことも聞いたこともないメソッドが多数あることに気づきました。 しかも、それは、Array,String,Hashクラスに固まっていることに気づきました。

なので、この3クラス、教科書を読んで暗記ました。

例えば以下のようなメソッドです。

  • 配列を初期化するclearメソッド
  • 配列を結びつけるzipメソッド
  • 該当する文字列の位置を返すindexメソッド

上に書いたメソッドを知らない人はメソッドをきちんと覚えるところから始めた方がいいでしょう。

気を付けたのは完璧にしすぎないこと。 この段階では、忘れるもの、細かいことに気づかないことは十分あるとので

  • メソッド名をみて、Rubyにあるか、否かがわかること
  • おおよそ、何をするか(配列から要素を減らすのか、増やすのか、配列自体を組み替えるものなのか)を理解する

これらに焦点をあてて暗記しました。

2回目

70点

一気に点数が合格圏内に近づく。 一回目の対策に意味はあったと一安心。

まだ、合格できない点数だったので、わからなかった問題をみて課題を分析します。 すると・・・

正規表現/ファイル操作、時間/の挙動の理解があいまいだと気づきます。

知らないのではなく、あいまいなのです。

なので、これらで違いがわかるようにチェックしていきます。

具体的には、こんな感じものです。

  • 正規表現|,[]の違い
  • 時間を表示するときの%Y,%yの違い
  • ファイルを読み込むときのread/gets/realinesの違い

3回目

80点

一応合格点は取れてるものの、運悪く本番知らない問題が多く出ると落ちるレベル。 試験一日前でこれはぎりぎりだなと思いながら課題を考えます。 すると・・・

変な状況 での挙動がわからなくなる。

例えば、こういうのがわかっていなかった。

  • "127A".to_iの挙動
  • 定数を破壊的メソッドで置き換えた場合の挙動
  • "AAAAAAbb".delete("A")が何回文字を消すか
  • "A" * 2 ** 4の挙動
  • a = 1,2,3;p aで何が表示されるのか
  • ヒアドキュメントの挙動(""でくくっていいのか、<<-にしていいのか)

上にあげた例だけでなく、類似で気になる部分も教科書で確認します。 ここは教科書だけじゃなわからないものもあったので、pryやリファレンスもみました。

受かるためには

模擬試験の問題とを完璧にすることを目標にすればいいと思います。

同じ問題も出た気がしますし、少なくともほとんどが類似の問題でした。 問題を解いて、理解します。また、問題をみて、問題になりそうなものを想像しましょう。

具体的には"微妙に挙動が特殊なもの"

  • !がないのに破壊的なメソッド
  • 定数は代入するとどうなるか
  • 似た名前の文字列があるけど、この中で実際に存在するメソッドはどれか
  • Scopeの確認

等も上の勉強と一緒に覚えておくといいかと思います。

問題の紹介

最後に、これでもわからなかった問題を紹介します。

ただ、問題を正確に覚えていないので、うそをついているかもしれません。

問題1

s = "line 1.\nline 2.\nline 3.\nline 4."
s.each {|line| puts line }

文字列にeachメソッドがあったことを知らなかったので、完全に面喰いました。 今調べてみるとRuby1.9でなくなったみですが…。

問題2

begin
rescue
   exit 1
ensure
  p "end"
end

Exit時のesureの挙動を覚えていませんでした。 ensureは必ず実行されます。

問題3

s = "a.txt"
p File join("",s)

./でもさすかと思っていましたが。 Windowsで試してみると、そのまま"/a.txt"となりました。 どこさすんだろ…

問題4

a = File.open("sample.rb")
a.seek(5)
p a.gets

5文字目なのか6文字目なのかわかっていませんでした。 6文字目から取得されるようです。

問題5

hash = { 'A' => 90, 'B' => 50, 'C' => 40, 'D' => 60 }
test = hash.each_with_object([]) do |(key, val), arr|
  arr << key if val >= 60
end
p test.sort

each_with_objectメソッド自体を知りませんでした。 key,val,返り値の順番、返り値があることは覚えておくといいと思います。

今回学んだ知識を活かすには

String/Array/Hash等の知識をたくさん学んだので、 文字列を整形するrubyプログラムを作るのがいいかなと思っています。

例えば、以下が候補です。

texmarkdownの変換は本当にやりたいと思っているので、真剣に手をだすと思います。

今後のRuby力アップに向けて

Rubyは自分が一番使ってきた言語なので、手になじませておきたいと考えています。 他の言語を学んだり、他の言語で実装したものを"Rubyで試す"ができる知識を維持しつつ、 他の言語、特にPython,Haskellに手を出したいと思っています。

なので、以下をゆっくりやっていきたいと思います。

  • RubyGoldの資格勉強
  • よくお世話になったGem,ActiveRecordとNokogiriのソースを読む。
  • Rubyアプリケーションの作成
  • Rubyの最新動向のキャッチアップ

ただ、数学もきっちりやりたいと思っているので、そこのバランスを見極めながら開発していきます。