EV3rtで "no implicit conversion of Hash into String (TypeError)" となるエラーの対処法 (rubyのバージョンの変更)

# はじめに

初めに、本記事のタイトルが[@freegod(とり 火鳥)](https://qiita.com/freegod)様の[ev3rtでno implicit conversion of Hash into String (TypeError)と出た時の備忘録](https://qiita.com/freegod/items/384b7b8bd59dee657010)という記事と似ていることをお知らせいたします。

https://qiita.com/freegod/items/384b7b8bd59dee657010

本記事では、上記の記事とは異なるアプローチで、当該エラーを解決するものになります。
(私の環境下では、上記の記事の方法では解決しませんでした…)

# 条件

- 実施日: 2023年8月
- 実行環境: Windows 10 および 11上のWSL2
- EV3rtのバージョン: 1.1

環境構築は、私の以前の記事[#2 Windows(WSL)版開発環境構築【後輩たちのためのEV3rt講座(改)】](https://qiita.com/koushiro/items/a9cd60178e0981d27020)に沿って行われたものとします。

# 症状

TOPPERSのEV3rtにて、アプリケーションのコンパイルを`make app=アプリケーション名`により実行したところ、以下のようなエラーが発生します。

```terminal:Ubuntu
XXXX@XXXX:/mnt/c/workspace/ev3rt/hrp3/sdk/workspace$ make app=helloev3
rm -rf /mnt/c/workspace/ev3rt/hrp3/sdk/workspace/.././OBJ/
Generating Makefile from ../common/Makefile.app.
make[1]: Entering directory '/mnt/c/workspace/ev3rt/hrp3/sdk/OBJ'
rm -f cfg1_out cfg1_out.o cfg1_out.c cfg1_out.syms cfg1_out.srec module_cfg.h module_cfg.c \#* *~ *.o
make[1]: Leaving directory '/mnt/c/workspace/ev3rt/hrp3/sdk/OBJ'
make[1]: Entering directory '/mnt/c/workspace/ev3rt/hrp3/sdk/OBJ'
  CFG[1]  module_cfg.h
/usr/lib/ruby/3.0.0/csv.rb:1421:in `initialize': no implicit conversion of Hash into String (TypeError)
        from /usr/lib/ruby/3.0.0/csv.rb:1421:in `open'
        from /usr/lib/ruby/3.0.0/csv.rb:1421:in `open'
        from /mnt/c/workspace/ev3rt/hrp3/cfg/pass1.rb:178:in `block in ReadSymvalTable'
        from /mnt/c/workspace/ev3rt/hrp3/cfg/pass1.rb:172:in `each'
        from /mnt/c/workspace/ev3rt/hrp3/cfg/pass1.rb:172:in `ReadSymvalTable'
        from /mnt/c/workspace/ev3rt/hrp3/cfg/pass1.rb:902:in `Pass1'
        from ../../cfg/cfg.rb:705:in `<main>'
make[1]: *** [../../target/ev3_gcc/dmloader/app/Makefile.lum:52: module_cfg.h] Error 1
make[1]: Leaving directory '/mnt/c/workspace/ev3rt/hrp3/sdk/OBJ'
make: *** [../common/Makefile.workspace:97: app] Error 2
```

エラーの発生個所を見ると

```terminal:Ubuntu
/usr/lib/ruby/3.0.0/csv.rb:1421:in `initialize': no implicit conversion of Hash into String (TypeError)
```

となっており、当該ファイルを確認したところ、1421行目の`open`という関数が悪さをしているようです。

# 結論

結論としては、rubyのバージョンが`3.0`系になっていることが原因と考えられます。

以下のコマンドにより、現在インストールされているrubyのバージョンが確認出来ます。

```terminal:Ubuntu
XXXX@XXXX:~$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux-gnu]
```

このように、`ruby 3.0.2`がインストールされていることが確認できます。

よって、以下の手順によりrubyのバージョンを`2.7`系にダウングレードします。

# 解決方法

## ruby の削除

初めに、現時点でインストールされているrubyをアンインストールします。

```terminal:Ubuntu
XXXX@XXXX:~$ sudo apt purge ruby
```

これにより、先ほどのバージョン確認コマンドを入力しても、バージョンが出力されないはずです。

```terminal:Ubuntu
XXXX@XXXX:~$ ruby -v
Command 'ruby' not found, but can be installed with:
sudo snap install ruby  # version 3.2.2, or
sudo apt  install ruby  # version 1:3.0~exp1
See 'snap info ruby' for additional versions.
```

## ruby 2.7系のインストール

こちらの記事を参考にruby 2.7をインストールしていきます。

[Ubuntu 22.04系にRuby2.7をインストール](https://manualmaton.com/2023/01/12/ubuntu-22-04%E7%B3%BB%E3%81%ABruby2-7%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)

### 依存関係のインストール

```terminal:Ubuntu
$ sudo apt install git build-essential checkinstall zlib1g-dev
```

### rbenvのインストール

```terminal:Ubuntu
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
```

### rbenvのパスを通す

```terminal:Ubuntu
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc

$ source ~/.bashrc
```

### ruby-buildのインストール

```terminal:Ubuntu
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

### OpenSSL 1.1.1のインストール

```terminal:Ubuntu
$ cd
$ wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz
$ tar xf openssl-1.1.1q.tar.gz

$ cd openssl-1.1.1q
$ ./config --prefix=/opt/openssl-1.1.1q --openssldir=/opt/openssl-1.1.1q shared zlib
$ make
$ make test
$ sudo make install
```

### シンボリックリンクを張り替える

```terminal:Ubuntu
$ sudo rm -rf /opt/openssl-1.1.1q/certs
$ sudo ln -s /etc/ssl/certs /opt/openssl-1.1.1q
```

### ruby 2.7.6をインストール

```terminal:Ubuntu
$ RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.1.1q
$ RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/openssl-1.1.1q rbenv install 2.7.6

$ rbenv global 2.7.6
```

### インストールされていることを確認

```terminal:Ubuntu
$ ruby -v
ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a) [x86_64-linux]
```

### パスを通す

初めに、rubyの場所を確認します。

```terminal:Ubuntu
$ which ruby
/home/user/.rbenv/shims/ruby
```

出力された`/home/user/.rbenv/shims/ruby`をコピーします。

次に、以下の操作により、パスを通します。

```terminal:Ubuntu
$ sudo su -
$ echo "export PATH=$PATH:/home/user1/.rbenv/shims" >> ~/.bashrc
$ source ~/.bashrc
```

ここまでで、ruby 2.7のインストールは完了です。

## shell のインストール

EV3rtのコンパイル時に、rubyのスクリプトで用いる`shell`というライブラリが必要なため、以下のコマンドによりインストールします。

```terminal:Ubuntu
$ gem install shell
```

# コンパイルの確認

workspaceフォルダに移動し、アプリケーションがコンパイル出来るか確認します。

```terminal:Ubuntu
$ make app=helloev3
```

`workspace`フォルダに`app`ファイルが出来ていれば、コンパイル完了です。