おそるべきプログラミング入門サイトExercismをやってみた

Twitterで見かけたのでやってみました。

exercism.io

触った感じだと、Progate的なwebブラウザでプログラミングするタイプではなくて、truckに近く、コマンド経由でローカルに課題をダウンロードし、コマンド経由で回答を提出するという感じのプログラミング入門サイトです。これで無料なのはすごい気がする。

会員登録はGitHubAuthが使えるのでそれでしました。 特に何も打つ必要がないので便利。

課題のダウンロード/提出にはexercismというコマンド経由で行う必要があり、今はubuntuユーザーなのでsnapでinstallしました。

$sudo snap install exercism

exercismをインストールしたら、トークンを設定する必要がある。

$exercism configure --token=<トークンを貼る>

ちなみにいきなり動かそうとするとエラーがでて、トークンを発行するURLが案内される。

$ exercism download --exercise=hello-world --track=raku
Error:

    Welcome to Exercism!

    To get started, you need to configure the tool with your API token.
    Find your token at

        https://exercism.io/my/settings

    Then run the configure command:

        /snap/exercism/5/exercism configure --token=YOUR_TOKEN

exercismは他にいろいろ設定できるみたいで、作業用ディレクトリも設定可能。 初期設定だと$HOME/snap以下が作業ディレクトリとなってしまうので、今回は自分で作ったworkspaceディレクトリを設定した。 自分で作ったworkspaceにcdした状態で次のコマンドを実行。

$exercism configure -w=$PWD

これで初期設定が終わるので、あとは問題で指定されているコマンドを打って課題をローカルにダウンロードする。 課題はいろいろな言語があるのだけれど、今回はRaku(Perl6)を選んでみました。

$exercism download --exercise=hello-world --track=raku

今回はrakuの下にhello-worldというディレクトリが作られていました。

$ pwd
/home/anatofuz/workspace/exercism/raku/hello-world
$ls
HelloWorld.rakumod  hello-world.rakutest  README.md

あとはここで課題に応じてプログラムをしたり、テストを動かしたりすれば良さそう。 僕はRakuだったので、とりあえずRakuでテストをいい感じに動かすprove6をインストールした。

$zef install App::Prove6

テストを確認するとこんな感じ。Hello, World!と返すhello関数を作ればいい。

+kajika+anatofuz$ cat hello-world.rakutest
#!/usr/bin/env raku
use Test;
use lib $?FILE.IO.dirname; #`[Look for the module inside the same directory as this test file.]
use HelloWorld;
plan 1; #`[This is how many tests we expect to run.]

# Run the 'is' subroutine from the 'Test' module, with three arguments.
is(
  hello,           # Run the 'hello' subroutine, which is imported from your module.
  'Hello, World!', # The expected result to compare with 'hello'.
  'Say Hi!'        # The test description.
);

ということでHello.modを編集

$ cat HelloWorld.rakumod
#`(
  This is a 'stub' file. It's a little start on your solution.
  It is not a complete solution though; you will have to write some code.
)
unit module HelloWorld;

sub hello is export {
    return "Hello, World!";
}

prove6でテストを実行。通ってる。

+kajika+anatofuz$ prove6 .
hello-world.rakutest .. ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs
Result: PASS

ここまで出来ると課題提出が可能。submitで提出。

$exercism submit ./HelloWorld.rakumod

通っているとターミナル側でURLが生成されるので、それを開いて答えがあってるかの確認とかを行う。 答えがあってる場合は、自分の回答を公開するかどうかとかを聞かれるのでそのあたりに答えると次の課題がアンロックされる感じでした。

所感

1問くらいしか動かしてないですが、就活でのコーディング面接の雰囲気を知るとかの意味でも結構おすすめです。 全部英語なので読むのは大変かもしれませんが、わかりやすい英語ですし、テストコード見ればだいたい雰囲気がわかる感じなので、暇なときにやってみましょう。