Rubyのcase文

RubyのCase文は === で判定される。

str = "abcdef"
case str
  when String then
    p "this is String class !"
  when Integer then
    p "this is Integer class !"
end

# => "this is String class !"

そのため、こののようにクラスで振り分けた処理を行うことが出来る。

これは

if String === str then
  p "this is String class !"
elsif Integer === str then
  p "this is Integer class !"
end

に等しい。
whenで指定した条件が左辺、先頭のcaseで指定した条件が右辺に来る点に注意。

これは

if String.===(str) then

でありClassクラスの === メソッドが呼ばれる為、最初に示したようなクラス判定が可能になる。

if str === String then

のように逆では動作しない。
Stringクラスの===メソッドは==と同じで、値が等しいかの判定を行うからだ。

なるほどなー

Ruby技術者認定試験Silverに合格しました


先日Ruby技術者認定試験のSilverを受験し、合格した。せっかくなので、試験の感想や勉強方法を記しておこうと思う。

まずは自分のスペック

  • プログラマ歴8年程度の職業プログラマ
  • Java / VB / C# etc. 他マイナーで怪しげなものいろいろ(PeopleToolsとか)
  • スクリプト系言語は趣味でRuby、その他は経験無し
  • Rubyに関してはRailsを写経で動かす程度(つまりほぼ素人)

試験を受けてみた感想

CBT(Computer Based Testing / 筆記ではなくコンピューターで受ける試験)は初めての経験だったが、受けてみればなるほど、Webで練習問題を解いているのとあまり変わらない感じだった。

会場で申し込みをすると持ち物をロッカーにしまって、他の受験者と一緒に試験ルームへ。仕切りで区切られたPCの前に座り、画面の指示に従って受験者ID等を入力したら試験スタート。

表示される問いに対して回答を選択肢から選択。あとで確認するためのチェックを付ける機能があり、50問解き終わった後に自分の解答一覧が表示される。あとで確認チェックや未回答が一覧に表示されるので、解いている途中で確信の持てない回答にはどんどんチェックを付けておいて、あとで再度確認するのがよいと思う。

解答を終えて試験終了を選べば、アンケートが始まる。アンケート入力中に採点され、その場で合否が分かる。試験ルームを出たら合格証書を受け取って終了。

確信が持てない解答が50問中10ほどあって焦ったが、ふたを開けてみれば100点中94点で合格だった。

試験の傾向

試験時間は90分、問題は50問。38問で合格。合格できるだけの力があれば時間は1時間も掛からないと思う。

試験の内容は、Rubyの文法的なものと組み込みのクラスに関する問題がメイン。文法的なものでは、偽として判定される値を問う問題や、制御構造を問う問題、変数のスコープなどなど。組み込みクラスでは、StringやNumeric、Hash、Array、正規表現にFileとIOなど、基本的なクラスのメソッドを問う問題が多い。

制御構造やメソッドの動作を知り、処理の流れを把握する力が重要。特にクラスに関しては、ひたすらメソッドを覚える。考える力よりも知識と記憶。「リファレンスを見ずに基本的なRubyのプログラムが書ける程度の能力」が問われると言っていいかもしれない。

勉強した期間

1ヶ月程度。といっても、1ヶ月毎日みっちり勉強していたわけでは無く、平日は空き時間にクラスのメソッドなどのテキストをちょこちょこっと読んで、週末に1~2時間演習問題をするといったペース。試験前はラストスパートで3日間ほど数時間、ひたすら演習問題をこなした。

参考にしたもの


Ruby技術者認定試験 公式ガイド (ITpro BOOKs)  / 伊藤忠テクノソリューションズ (著), Rubyアソシエーション (監修), ITpro (編集)

必携。試験の概要、試験内容を学習する為のテキスト、過去問に似せた演習問題2回分が収録されている。特に演習問題は実際の試験にかなり近い内容であり、試験を受けた際には一部の問題はテキストの問題そのままじゃないの?というのもあった。問題のレベルや出題傾向の把握するには一番良い。

演習問題の解答には解説も付いているので、演習を繰り返して解答を読んで、動作を意識しながら覚える。この演習問題で勉強する際は、各選択肢に対して「xxxのように動作するから正解」と、実際のプログラムの処理の流れを頭に浮かべられるように意識するとよいと思う。また不正解の選択肢に関してもプログラムの動作を意識して不正解の理由を頭の中で考えられるとなお良い。ここまでできるようになればほぼ合格できると思って良いのではなかろうか。


たのしいRuby 第3版  / 高橋 征義 (著), 後藤 裕蔵 (著), まつもと ゆきひろ (監修)

公式ガイドでは各クラスのメソッドの解説が薄いので(本自体も物理的に薄い)、その辺りを確認する補助教材として。Ruby公式のリファレンスでも確認できるけど、情報量が多いのでSilverレベルを受験しようという人には敷居が高いと思う。リファレンスが苦にならなければよいが、一目見て圧倒された人には、分かりやすくまとめられたこちらの書籍がおすすめ。試験対策でなくとも、Ruby初学者のテキストとして持っておいてよい一冊だと思います。

ミニツク – Rubyのe-ラーニング研修システム

Rubyのお膝元、ネットワーク応用通信研究所(NaCl)が運営する無料のオンライン学習サービス。Silverの対策コースが用意されている。公式ガイドには2回分の演習問題が収録されているが、繰り返し同じ問題を解くだけで無くもう少し数をこなしてみたいと思いチャレンジしてみた。ドリル3ぐらいまではおすすめ。だいたい試験に近い内容が出ており、解説も妥当。しかし、ドリル4以降はSilverのレベルを外れる問題も多く、出題の傾向もストレートでは無くひねった物が多くなる。解説も日本語が怪しくなり、はっきり言って実用的では無い。試験を受けた後で考えてみると、公式ガイドの演習問題だけでも十分だったなぁとも思うので、余力があればという前提で、ドリル3までならやる価値あり。

ということで

これから受験しようとする人の参考になれば。

Github for Macで起動→即落ちという現象に見舞われた

普段ソースコード管理にGithub for Macを使っているのだけど、ある時突然Commit & Sync使用とするとアプリが落ちる上に、その後何度アプリを起動しても即落ちるという現象に見舞われた。せっかくなので、どのように解決した記しておこうと思う。

アプリ再起動→落ちたときの画面を復元→再度落ちる という無限ループ

ソースを修正し、Github for Macを起動。リポジトリを選択し、historyを表示。すると落ちる。原因不明。再度Github for Macを起動するも、落ちたときと同じHistoryの画面で起動するので、再度同じように落ちる。

アプリが落ち続けている間はどうしようもないので、とりあえず起動するようにしたい。「落ちたときと同じ状態で起動されるという事は、どこかに設定ファイルなりキャッシュを保持しているのでは?」と思い、とりあえずアプリを動かすためにそれらをクリアする事にした。

アプリの削除だけでは設定・キャッシュは消えない

単純にGithub for Macをゴミ箱に突っ込むだけでは設定・キャッシュファイルは削除されない。そこで今回はAppCleanerを使う事にした。

AppCleanerにGithub for Macのアイコンを突っ込むと関連するファイルが表示される。

一覧一番上がアプリ本体なので、それ以外のファイルを選択して削除する。これで設定関連がクリアされるのでGithub for Macが立ち上がるようになった。

ローカルソースの退避とリポジトリからのクローン

設定関連が全て削除されたので、githubへのログイン情報なども再度設定する必要がある。とはいえ、リポジトリ本体はサーバーにあるので、認証情報を入れてつながってくれれば、あとは特にどうということはない。

この時、ローカルHDDを検索してローカルのリポジトリクローンが一覧として上がってくる場合があるが、異常を起こしたローカルリポジトリを再読み込みすると、再度同じ現象に見舞われてループに陥ってしまうので、読み込まないように気をつける。もちろん、異常を起こしたローカルリポジトリ以外は読み込んでサーバーリポジトリと再同期してしまって構わない。

この後github for Macでサーバーのリポジトリからローカルにクローンするが、異常を起こしたローカルのリポジトリクローンは、異常を起こした事により最新ソースがコミットされていない。その為、ローカルのソースを一度フォルダごと別名にリネームするなり別の場所に移動するなりして、最新のソースを退避させる。

その後Github for Macでサーバーのリポジトリを元あった場所にクローンする。クローンが完了したら、退避していた最新のソースをローカルのクローンに上書き。github for Macで変更を検知したらCommit & Sync。とりあえずこれで復旧できた。

結局原因はなんなのさ

というのが依然、不明のままなんだけど。最初、ソースの記述内容に特殊な文字等が紛れ込んでいて異常を引き起こしていたのかと思ったけど、再度そのソースを上書きして正常に動作しているところをみると、どうもそうではない気もする。

そのうちバージョンアップで治ってくれるのを期待するか。

『はじめる!Rails3 (1)』をRails 3.1で読み進めるときのポイント その2

前回の続き。『はじめる!Rails3(1)』(黒田努 著 / 達人出版会)をRails 3.1で読む場合のポイントについて。

7.3 スタイルシートの作成

書籍では public/stylesheetstasks.css を作成するように記述されているが、これも前回の画像ファイルと同じで assets/stylesheets に配置する。また、tasks.css を自分で作成するのではなく、既に用意されている tasks.css.scss に記述する。

scss (Sassy CSS)は、CSSの文法に限りなく近づけつつ新たな文法を導入して拡張したもの。Rails 3.1から標準で入った。

CSSと互換性があるため、書籍の記述の通りに

table.tasks {
  width: 560px;
  margin: 5px auto;
  background-color: #eee;
  border-collapse: collapse;
  border-spacing: 0;
}

table.tasks tr {
  border: solid 1px #ccc;
}

table.tasks td {
  padding: 5px;
}

table.tasks col.name {
  width: 320px;
}

table.tasks col.due_date {
  background-color: #ddd;
}

とも書けるが、次のように書く事もできる。

table.tasks {
  width: 560px;
  margin: 5px auto;
  background-color: #eee;
  border-collapse: collapse;
  border-spacing: 0;

  tr {
    border: solid 1px #ccc;
  }
  td {
    padding: 5px;
  }
  col.name {
    width: 320px;
  }
  col.due_date {
    background-color: #ddd;
  }
}

table.tasksの中にネストする事で冗長な記述を省略でき、少しスッキリする。

ここまでのポイントで、Rails 3.1を使用した場合もとりあえずエラーが出ずに進められるはず。