Exercism.ioでプログラミングを学ぶ
- 演習問題を解く
- コードレビューを受ける
- コードを修正する
というフィードバックループを通してプログラミングを学ぶためのWebサイトです。
Clojure, CoffeeScript, C++, C#, Elixir, Erlang, F#, Go, Haskell, JavaScript, Lua, Objective-C, OCaml, Perl 5, Python, Ruby, Scala, Swiftといった言語の演習問題が用意されています。
今回は、Windows上でExercism.ioを使ってRubyを学ぶ方法を説明します。
なお、前提条件としてGitHubアカウントは取得済みであるものとします。
アカウントの作成
http://exercism.io/ にアクセスし、「Log in via GitHub」をクリックします。
これで自動的にアカウントが作成されます。
CLIのインストール
Exercism.ioでは、演習問題の取得・提出はCLIを用いて行われます。
Windows用のパッケージ管理システムChocolateyを使用してインストールしましょう。
- (Chocolateyをインストールしていない場合)コマンドプロンプト上で以下のコマンドをコピペして実行し、Chocolateyをインストールします。
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
$ choco install exercism-io-cli
演習問題の取得
$ exercism configure --key=YOUR_API_KEY --dir=/path/to/exercises
key
はExercism.ioのAccountで確認できます。
dir
には演習問題の保存先フォルダへのパスを指定します。指定しない場合、%USERPROFILE%
(C:\Users\ユーザー名
)になります。
設定完了後、Rubyの演習問題を取得しましょう。
$ exercism fetch ruby
dir
で指定したフォルダ(指定しなかったは場合はC:\Users\ユーザー名)配下のexercism\rubyというフォルダに演習問題がダウンロードされます。
演習問題を解く
1問目は「hamming」と題されたハミング距離を計算する問題です。
ruby. └─hamming hamming_test.rb README.md
README.mdが問題の説明、hamming_test.rbがminitestのテストケースです。
問題の説明を読み、テストケースをパスするコードを書くことが演習となります。
hamming_test.rb
require 'minitest/autorun' require_relative 'hamming' class HammingTest < MiniTest::Unit::TestCase def test_no_difference_between_identical_strands assert_equal 0, Hamming.compute('A', 'A') end # 以下略 end
このテストケースから、hamming.rbにクラスメソッドcompute
を定義したHamming
クラスを実装すればいいことがわかります。
実装後、
$ ruby hamming_test.rb
ですべてのテストケースをパスすることを確認後、解答を提出しましょう。
$ exercism submit hamming.rb
コードレビューしよう/されよう
こちらからhammingの解答一覧を参照できます。
他のユーザーの解答をレビューし、気になる点があればコメントしましょう。
または自分の解答にコメントがあった場合、コメントで指摘された点を修正して解答を再提出してよりよいものに作り変えていきましょう。
例えば、3問目の「Rna Transcription」で以下のコードを提出しました。
class Complement @dna_to_rna = { 'G' => 'C', 'C' => 'G', 'T' => 'A', 'A' => 'U' } def self.of_dna(strand) convert strand, @dna_to_rna end def self.of_rna(strand) convert strand, @dna_to_rna.invert end private def self.convert(strand, table) strand.split("").map { |chr| table[chr] }.join("") end end
このコードに以下のコメントがあったので、指摘された点を修正した修正版を提出し直しました。
まとめ
このような流れでExercism.ioでプログラミングを学ぶことができます。
Rubyの演習問題は約70問ほど用意されているので、初~中級者がプログラミングを学ぶ場として優れているのではないかと思います。Enjoy!