Project Euler with Ruby on WSL [Problem 0]

TL; DR : 前説

この記事内では環境構築だけで終わるので Problem 0 本筋から読みたい人は次の節へどうぞ。

紆余が曲折して Project Euler をやる気になった。 どうせなら記録したい。じゃあ5億年ぶりに hatena に書くか。 どうせなら ruby でやりたい。なにしろ「好きな言語は ruby です」と言い続けているが、ここ数年まともに ruby を読み書きしていない。python や Human Resource Machine のアレのほうが触ってる時間は長いだろう。これはまずい。冷静になると別に何もまずくない気もするが、今は冷静になる時ではない。こういうのは勢いが大事だ。

手元の環境(事実上ゲーム機と化してる Windows マシン)で使うことを考えると、ActiveScriptRuby か、VM か、Docker for Windows か、Bash on Ubuntu on Windows か。え、Hyper-V は Windows 10 Home だと使えないの!?マジか…。さよなら Docker Desktop. 勢いが大事なのだから、勢いを削ぐ要素は少ないほうがいい。よって、VM はやめよう。やはりワンテンポ遅れる。ActiveScriptRuby は更新されているか怪しい。Project Euler をやるうえでは何ら問題ない気がするが、後から苦しむのは面倒だ。ついでに、最近の ruby のことがわからないので(なにしろ以前の記事で ruby1.9 とか書いてる)、バージョン切り替えはしたい。 よって、構築目標は以下とする。

構築目標環境

大体の流れは Qiita のこの記事 を真似ることにする。 rails を入れたいわけではないので、node や rails は入れない。

実際の作業

ライブラリ類

とりあえず update する

$ sudo apt-get update

記憶によると readline が入ってないと irb がちゃんと動かなかった気がする 検索したら今もそうらしい が、どうも qiita の記事にあるdevel だけでいいのか? という気になってきたので追加なしで行ってみる

$ sudo apt-get install -y make gcc libssl-dev libreadline-dev zlib1g-dev

rbenv を入れるために本家に書いてあるライブラリを入れる。 えーと ubuntu/debian/mint だと

apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev

libreadline, zlib1g, libssl はもう入れたから(autoconf や build essential とかも入ってる気はするけど)

$ sudo apt-get install -y autoconf bison build-essential libyaml-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev libdb-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package libgdbm6

libgdbm6 がないとな。本家の注意書きにあったやつだな。

Depending on your version of Ubuntu/Debian/Mint, libgdbm6 won't be available. In that case, try an earlier version such as libgdbm5.

libgdbm6 -> libgdbm5 で解決。

rbenv

で、rbenv を入れる。本家によれば

Basic GitHub Checkout For a more automated install, you can use rbenv-installer. If you prefer a manual approach, follow the steps below.

ふーむ。別に manual approach を prefer という気分でもないので installer を頼ろう。

$ wget -q https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer -O- | bash

おや。何かエラーが出ておる…。

Running doctor script to verify installation...
Checking for `rbenv' in PATH: not found
  You seem to have rbenv installed in `/home/zampona/.rbenv/bin', but that
  directory is not present in PATH. Please add it to PATH by configuring
  your `~/.bashrc', `~/.zshrc', or `~/.config/fish/config.fish'.

PATH がおかしいと言っているようだ。

$ ls -l ~/.rbenv/bin/
total 0
lrwxrwxrwx 1 user user 16 May  4 10:12 rbenv -> ../libexec/rbenv

本当に path が通ってないだけだな これも本家に従おう

For Ubuntu Desktop: $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc いったん ubuntu を抜けて入りなおす(source でよい気もするが) 入りなおして

$ rbenv -v
rbenv 1.1.2-30-gc879cb0

どうやらうまくいったようだ いちおう本家に従って rbenv-doctor も走らせておこう

Verify that rbenv is properly set up using this rbenv-doctor script:

$ wget -q https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor -O- | bash
Checking for `rbenv' in PATH: /home/zampona/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: not found
  The directory `/home/zampona/.rbenv/shims' must be present in PATH for rbenv to work.
  Please run `rbenv init' and follow the instructions.

Checking `rbenv install' support: /home/zampona/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20200401-9-g3ef704e)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/home/zampona/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK

rbenv init せい、とな。

$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.bashrc:

eval "$(rbenv init -)"

ほい。

$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc

もう一回 doctor script を走らせたら SHIM も OK になった。

installing ruby

やっとだよ。

$ rbenv install -l
1.8.5-p52
1.8.5-p113
1.8.5-p114
1.8.5-p115
1.8.5-p231
1.8.6
1.8.6-p36
1.8.6-p110
1.8.6-p111
1.8.6-p114
...

リストが長すぎて笑う。 wc -l したら 488 あった。 素直に現時点(2020/05/04)の安定板 2.7.1 を入れる

$ rbenv install 2.7.1

結構待たされたが通った。 rbenv の使い方はこっちの記事のほうがいいな。 当面、2.7.1 しか使う気がないので global に指定しよう

$ rbenv global 2.7.1
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
$ irb
irb(main):001:0> puts 'a'                                                                                               a
=> nil
irb(main):002:0>             

無事動いているようだ。