休日に新しい言語に触れたい ~Ruby編 環境構築からHello Worldまで~

# はじめに

https://qiita.com/MichaelHashimoto/items/ee3f5e9a8f99c4fd0371

この第二弾として、Rubyを触ってみました。環境構築に時間がかかり、休日1日分ではHello Worldまでしか進められませんでしたが、そこまでを記事にします。

私はC#やPythonを仕事で使っているため、これらの知識をベースにして理解を広げます。同じような境遇の方の理解の助けになれば幸いです。

# 環境構築

## 環境

OS: Ubuntu22.04
エディタ: vs code

## rbenv, ruby-buildのインストール (Ubuntuの場合)

ここでは、rbenvというrubyのバージョン管理ツールを使ってrubyをインストールすることにしました。(Pythonのpyenv的なもの)
これにより、必要に応じて、rubyのバージョンを変えられるようになります。

rbenvとそのプラグインであるruby-buildをインストールしましょう。
rbenvのリポジトリのreadmeに従ってインストールすればOKです。https://github.com/rbenv/rbenv

1. 以下のコマンドを実行すると、rbenvの設定が自動で完了します。
    ```
    git clone https://github.com/rbenv/rbenv.git ~/.rbenv
    ~/.rbenv/bin/rbenv init
    ```
1. ターミナルを再起動します
1. 以下のコマンドを実行し、ruby-buildをインストールします。
    ```
    git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
    ```
1. ターミナルを再起動します
1. 完了です
    
    :::note info
    aptでもrbenvはインストールできるのですが、こちらは保守されていないようです。注意しましょう。

## rbenv, ruby-buildのインストール (Windowsの場合)

Windowsでrbenvを直接使うことは厳しいようです。(一応rbenv-winなどのリポジトリがgithub上にありますが、保守されていなかったりするので、使えるかどうか不明です)
そのため、Windowsでは以下の記事のようにWSL上のUbuntuなどにインストールする必要があります。

https://qiita.com/ryoma5457557831/items/5253f2a9e9480af64394

## rubyのインストール

rubyのインストールにあたって、Ubuntu22.04では先にlibyaml-devをインストールしておく必要があります。これがないと、"psych"が見つからないというエラーが出ます。
```
sudo apt update
sudo apt install libyaml-dev
```

rbenvのオプションを指定したあと、インストールします。今回は、最新のバージョンであるruby 3.3.5をインストールしています。
```
export RUBY_CONFIGURE_OPTS="-with-openssl-lib=/usr/lib/x86_64-linux-gnu"
rbenv install 3.3.5
rbenv global 3.3.5
```

最初は、オプションを設定せずにインストールを試みたのですが、openssl関係のエラーが出てしまいまったので、オプションを設定しました。

<details><summary>エラー詳細</summary>
次のようなエラーメッセージが出ていました。

```
openssl:
	Could not be configured. It will not be installed.
	/tmp/ruby-build.20240908120119.182503.Suz0p0/ruby-3.3.5/ext/openssl/extconf.rb:33: OpenSSL library directory could not be found in '/home/{ユーザー名}/.rbenv/versions/3.3.5/openssl/lib'. You might want to fix this error in one of the following ways.
	  * Recompile OpenSSL by configuring it with --libdir=lib  to specify the OpenSSL library directory.
	  * Recompile Ruby by configuring it with --libdir=<dir> to specify the Ruby library directory.
	  * Compile this openssl gem with --with-openssl-include=<dir> and --with-openssl-lib=<dir> options to specify the OpenSSL include and library directories.
	Check /tmp/ruby-build.20240908120119.182503.Suz0p0/ruby-3.3.5/ext/openssl/mkmf.log for more details.
psych:
	Could not be configured. It will not be installed.
	Check /tmp/ruby-build.20240908120119.182503.Suz0p0/ruby-3.3.5/ext/psych/mkmf.log for more details.
```

opensslのlibraryのパスを指定しないといけないようだったので、Ubuntuに標準で入っているopensslのライブラリの場所"/usr/lib/x86_64-linux-gnu"を指定しました。

</details>

3.3.5は、Ubuntuに標準で入っているopenssl 3が使えましたが、3.0以前のバージョンはopenssl 1を別途インストールして使わないといけないみたいです。

    
## VS codeの設定  

コードを書きやすくするために、linterとformatterやその他の便利ツールをインストールしましょう。

色々調べたところ、自動補完や定義へのジャンプができるsolargraph(言語サーバー)と、linter/formatterであるrubocopの組み合わせが良さそうです。ただし、solargraphはauto formatをできないようなので、別の言語サーバーであるRuby LSPと組み合わせます。
デバッガーには、VSCode rdbg Ruby Debuggerを使います。

### solargraph

1. gemでsolargraphをインストールします
    ```
    gem install solargraph
    ```
1. VS codeでRuby Solargraphをインストールします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223968/a8808b88-8b59-4d2c-4250-34cebf6940f7.png)
1. Ruby Solargraphの設定で、DefinitionsとDiagnosticsをtrueにしておきます。

### Ruby LSP

1. VS codeでRuby LSPをインストールします
1. Ruby LSPの設定で、Formatterにrubocopを選択しておきます。
1. setting.jsonで、以下を追記します。
    ```
    "[ruby]": {
        "editor.defaultFormatter": "Shopify.ruby-lsp",
        "editor.formatOnSave": true
    },

    "rubyLsp.linters": [],
    ```
    これにより、FormatterにはRuby LSPが使われるようになり、rbファイルの保存時に自動でformatされるようになります。linterはSolargraphに担当してもらうため、空配列を指定することでRuby LSPの機能を無効にしました。

## VSCode rdbg Ruby Debugger

1. gemでdebugをインストールします
    ```
    gem install debug
    ```
1. VS codeでVSCode rdbg Ruby Debuggerをインストールします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223968/613d8b0e-a7f3-fb36-d097-cf636d4672de.png)
1. VSCode rdbg Ruby Debuggerの設定で、Use bundlerにチェックをいれておきます。

以上で環境が整いました。VSCodeを再起動しましょう。

## プロジェクトディレクトリの作成

適当な場所に新しくディレクトリを作成し、VS codeで開きましょう。
今回は、```HelloWorldProject```という名のディレクトリを作成し、プロジェクトディレクトリとすることにしました。

## bundlerの導入

rubyでは、外部のライブラリであるgemを複数使うことが多いですが、gem同士の互換性の問題が出てくることがあります。そこで、すべてのgemを管理してもらうために、bundlerを導入します。

1. gemでbundlerをインストールします
    ```
    gem install bundler
    ```
1. VS codeで開いたプロジェクトディレクトリにて、以下のコマンドを実行し、Gemfileを作成します。
    ```
    bundle init
    ```

## rubocop.ymlの追加

このプロジェクトにどういったコーディングルールを規定するのかを記載します。

https://qiita.com/daytwist/items/1897a5210584592d01bb

↑の記事を参考に、rubocom.ymlを生成しました。

# 動かしてみる

## とりあえずHello World

ruby_practice1.rbというファイルを作りました。

### 構成
HelloWorldProject
├── ruby_practice1.rb

### コード

```ruby
# frozen_string_literal: true

print "Hello World\n"
```

```frozen_string_literal: true```を入れているのは、rubocopに注意されたからです。

### 実行結果

Hello Worldが出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1223968/9051782a-4272-ce48-a917-edfe391d2ff7.png)