[Rails6] AmazonLinux2 で SQLite3 を使用する方法

# 動機
- Cloud9のAmazonLinux2 環境でRails6以上を使用しようとすると、「SQLite3のバージョンが古い」とエラーが出る。
```terminal
$ rails db:migrate
Your version of SQLite (3.7.17) is too old. Active Record supports SQLite >= 3.8.
```

# 原因
- AmazonLinux2にデフォルトでインストールされているSQLite3のバージョンが「3.7」
- Rails6以上を動かすには、バージョン「3.8」以上が必要

# 目的
- 以下の記事を参考にSQlite3のバージョンを上げる
(正確にはバージョン「3.8」以上をのSQLite3をインストールし、
Railsアプリで新しくインストールしたSQLite3を使用するようにする）
> https://blog.serverworks.co.jp/tech/2020/01/19/rails6/

- 各操作の詳細をなるべく理解する

# 環境
## Ruby version
```
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
```
***

# RPM package のインストール
- パッケージ管理コマンドに「rpm」と「yum」がある
    - rpm: 個々のパッケージ同士の依存関係を管理
    - yum: 全てのパッケージの依存関係を管理
> https://eng-entrance.com/linux-package-rpm-yum-def#yum

今回はyumコマンドを使用して、インストール
なぜこれらが必要かは知らない
``` 
$ sudo yum install -y \
  ruby-devel \
  rpm-build \
  git \
  gcc \
  gcc-c++ \
  zlib-devel \
  openssl-devel \
  rubygems-devel
```
### 使用したオプション
- -y : 問い合わせすべてにYesと答える
    - これをつけないと、y+Enterを押し続けることになるのだろう
> https://uxmilk.jp/9899

## Node.jsのインストール(未解決)
- Webpacker で使用するから
- インストールの際にNodejs のサイトのインストール方法参照

### Nodeのサイトの見方
> https://github.com/nodesource/distributions
- Linuxのディストリビューリョンによって、インストールコマンドが異なる
- AmazonLinux2 はRedHat 系のEnterprise Linux の一種
> https://ja.wikipedia.org/wiki/Linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

- サイトの上の方はUbuntsuとかDebianなど他のディストリビューリョンのインストール方法が書いてある
  - スクロールすると「Enterprise Linux based distributions」があるので、その下からを参考にする。
> Debian https://openstandia.jp/oss_info/debian/

- 今回は最新のversion18を実行
```
# No root privileges
$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo yum install -y nodejs
```

- エラーが出た
    - こちらは未解決 (上記のNodeJSのインストールしなくてもうまくいく）
```
$ sudo yum install -y nodejs
...
Error: Package: 2:nodejs-18.1.0-1nodesource.x86_64 (nodesource)
           Requires: libc.so.6(GLIBC_2.28)(64bit)
Error: Package: 2:nodejs-18.1.0-1nodesource.x86_64 (nodesource)
           Requires: libm.so.6(GLIBC_2.27)(64bit)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
```

## yarnのインストール
```
$ url -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ sudo yum install -y yarn
```

# SQLite3のインストール
- check the current version of sqlite
```
$ rpm -q sqlite
sqlite-3.7.17-8.amzn2.1.1.x86_64
```

## 3.30.1をダウンロード
```
$ wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz
```

### wgetコマンド
- 指定したURLのファイルをダウンロードする
```
$ wget <URL>
```
> wget説明 https://atmarkit.itmedia.co.jp/ait/articles/1606/20/news024.html

### tar.gz拡張子 （タージーゼット）
> https://wa3.i-3-i.info/word12942.html

# ダウンロードした圧縮ファイルを展開
```
$ tar xzvf sqlite-autoconf-3300100.tar.gz
```

### アーカイブ
- 複数のファイルやフォルダを一つにまとめること

### アーカイブファイル
- 複数のファイルやフォルダを一つにまとめたファイル

### tarコマンド
- tarファイルという「アーカイブファイルを作成する」コマンド
> https://www.sejuku.net/blog/51116

### 各オプション
- c: 新規にアーカイブを作成する(作成に使用)
- x: アーカイブファイルを展開（展開に使用）
- z: gzipの圧縮処理を行う（圧縮したものを一発で作成・展開したい時使用）
- v: 圧縮・展開時に詳細を表示する(作成・展開どちらでも使用）
- f: アーカイブファイルを指定する(作成・展開どちらでも使用）

### アーカイブ作成(cvfを使用)
```
$ tar cvf アーカイブ名 ファイル1 ファイル2…

# test1.txt test2.txtがtest.tarというファイルにまとめられる
$ tar cvf test.tar test1.txt test2.txt
```

### アーカイブ展開（xvfを使用）
```
$ tar xvf アーカイブ名

# test.tarファイルを展開
$ tar xvf test.tar
```

### gzipコマンド
- ファイルを「圧縮する」時につかうコマンド

両方とも、UNIX系のOS（LinuxとかMacとか）で使える。

## 展開したフォルダに移動
```
$ cd sqlite-autoconf-3300100
```

## Linux環境にアプリを「ソースコードからインストールする」
```
# もとから入っているsqliteと競合しないように /opt/sqlite/sqlite3 にインストールします
$ ./configure --prefix=/opt/sqlite/sqlite3
```
### 「./configure」
- configureという「スクリプトファイルを実行」しています(configureというコマンドがあるわけではない)。
- ダウンロードしたフォルダの中に.configureフォルダがあるから、それを実行している.
- 「MakeFile」が作成される

### 「--prefix=ディレクトリ名」
- どこにインストールするかを決める(インストール先を指定する引数)

## アプリのコンパイル
```
$ make
```

### make
- configureで作成されたMakeFileに基づいて、アプリのコンパイル
> https://qiita.com/chihiro/items/f270744d7e09c58a50a5

## アプリをインストール
```
$ sudo make install
```
- makeコマンドによってコンパイルされたアプリをインストールします。
> https://qiita.com/chihiro/items/f270744d7e09c58a50a5

## バージョン確認(インストール先確認)
```
$ /opt/sqlite/sqlite3/bin/sqlite3 --version
3.30.1 2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b
```

***

# gemの指定先を変える
- SQLite3本体は、/opt/sqlite/sqlite3にインストールしたので、gemもそちらを利用するように指定し、インストールします。
```
$ gem install sqlite3 -- --with-sqlite3-include=/opt/sqlite/sqlite3/include \
   --with-sqlite3-lib=/opt/sqlite/sqlite3/lib
```


***
# パスを通す
```
$ echo 'export LD_LIBRARY_PATH="/opt/sqlite/sqlite3/lib"' >> .bash_profile
$ source .bash_profile
```
> https://teratail.com/questions/234163
## echo
- 文字列出力、変数の中身出力するコマンド

### これを応用すると
「ファイルに追記」が可能
```
$ echo "文字列" >> ファイル名
```
> https://qiita.com/masato930/items/6031785e23d8fdbb1a5a

## LD_LIBRARY_PATHとは
- 正直よくわからない
- Rubyとかに限るものではない環境変数（OSがライブラリを探す時に使用するらしい）
> https://oshiete.goo.ne.jp/qa/1511011.html