Programming note」カテゴリーアーカイブ

paizaLvアップ問題と解答(標準入力3)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

問題7   1行目で与えられる N 個の整数の入力 (large)

1 行目で、整数 N と、続けて N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。a_1, … , a_N を改行区切りで出力してください。

入力例1
5 8 1 3 1 3
出力例1
8
1
3
1
3

解答  .shiftで最初の配列を取り除いた後に出力

a = gets.split
a.shift
puts a

問題8 1 行目で与えられる N 個の実数の入力 (large)

1 行目で、整数 N と、続けて N 個の実数 a_1, … , a_N が半角スペース区切りで与えられます。a_1, … , a_N を改行区切りでそのまま出力してください。

入力例1
5 8.13 81.3 813 0.813 1.381
出力例1
8.13
81.3
813
0.813
1.381

解答 問題7とほぼ同じだが小数点なので.to_fで入力を受け取る。問題7と同じ答えでもOK

a = gets.split.map(&:to_f)
a.shift
puts a

問題9 行ごとに要素数の異なる整数列の入力

1 行目に整数 N が与えられます。
2 行目から (N + 1) 行目までの先頭に整数 M_i (1 ≦ i ≦ N) が与えられます。
それに続いて M_i 個の整数 a_1, …, a_{M_i} が与えられます。
上から i 番目、左から j 番目の整数は a_{i,j} です。
N 行の a_1, …, a_M をそのまま出力してください。

入力例1
3
1 8
2 8 1
3 8 1 3
出力例1
8
8 1
8 1 3

解答

  1. 入力Nを受け取る
  2. N回繰り返す
  3. 2行目,3行目,4行目の入力を受け取りaに代入
  4. 配列の最初の要素を出力したくないので、.shiftで0番目(初め)の配列を取り出す。
  5. .shiftは破壊的なので、配列の0番目が抜けた配列を.join(‘ ‘)でくっつける時に半角スペースを間に挿入する
n = gets.to_i

n.times do
  a = gets.split.map(&:to_i)
  m = a.shift
    puts a.join(' ')
end

paizaLvアップ問題と解答(標準入力1)Ruby

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

問題0:1行の入力 (paizaランク D 相当)

文字列 s が 1 行で与えられるので s をそのまま出力してください。

入力例1

paiza

出力例1

paiza

解答  putsで出力できます。

# 文字列を変数に代入する(このとき改行コードを打ち消す)
strings = gets.chomp
puts strings

問題1 2 行の入力

文字列 s と t が 2 行で与えられるので、s と t の 2 行をそのまま出力してください。

入力例2
heisei31
reiwa1
出力例2
heisei31
reiwa1

解答 readlines(chomp: true)で入力を受け取って出力するだけ

# 文字列を変数に代入する(このとき改行コードを打ち消す)
strings = readlines(chomp: true)
puts strings

別解 2行だけならこちらのほうがパフォーマンスは良いです

a = gets.chomp
b = gets.chomp
puts a,b

問題2 3 行の入力 (paizaランク D 相当)

文字列 s, t, u が 3 行で与えられるので、s, t, u の 3 行をそのまま出力してください。

入力例1

abc
def
ghi

出力例1

abc
def
ghi

解答 2行のときと同じでreadlines(chomp: true)を使うと良い

strings = readlines(chomp: true)
puts strings

別解  3行だけならこちらのほうがパフォーマンスは良いです

a = gets.chomp 
b = gets.chomp
c = gets.chomp
puts a,b,c

問題3 5つの文字列の半角スペース区切りでの分割

入力される値

なし

期待する出力

one
two
three
four
five

解答 \nでむりやり改行させる(とても読みにくい)

puts "one\ntwo\nthree\nfour\nfive"

別解  配列を作成してputsで出力する。

puts ["one","two","three","four","five"]

AWS(S3)

0:S3とは?(S3の概要)

以下のようなメリットが有る

①Webサービスのストレージが画像でいっぱいになるのを防ぐ

②HTMLへのアクセスと画像へのアクセスを分けることで負荷分散できる。

サーバーの台数を増やしやすくするため

③ウェブサーバー上に画像が保存されていると、ウェブサーバーの台数を増やしたときに、画像を同期する必要がありスケールアウトが難しい。

④画像の保存場所は分離されていた方がウェブサーバーの台数を簡単に増やすことができる。

⑤コンテンツ配信サービスから配信することで画像配信を高速化できる。

⑥安価で耐久性が高い1GB約3円/月 +容量無制限1ファイル5TBまで

⑦バケットやオブジェクトに対してアクセス制限を設定できる

バケット:オブジェクトの保存場所のこと名前はグローバルでユニークな必要がある。

オブジェクト:データ本体の事URLが付与される。

キー:オブジェクトの格納URLパス。

よくある利用シーン

静的コンテンツの配信:Image画像はS3から配信します。

ログなどの出力先:定期的にS3にログを送ります。

静的ウェブホスティング:静的なウェブサイト(ランディングページなど)をS3から公開します。

バッチ連携用のファイル置き場:S3にファイルをおいて、バッチでそのファイルを参照して処理を行います。

1:S3のバケット作成

S3で検索してS3をクリックします。

2:バケットを作成をクリックします。

続きを読む

NginxでHTTP→HTTPSに自動でリダイレクトさせるよ!

目標:http://ドメイン名でリクエストが来た時https://ドメイン名に自動でリダイレクトさせるように設定する

前提:AWS+Rails+Unicorn+Nginx

※ご注意2022年現在下記のやり方はパフォーマンス的に非推奨となっています。学習用ならありかもですが・・・

非推奨でないAWSのALBを使う場合はこちらをどうぞ

1:まずはEC2にSSH接続する(各自SSH接続の方法は異なります)

ssh my-portfolio-key-rsa

2:nginxの設定を変更するためにまずは移動

cd /etc/nginx/conf.d

3:設定ファイルを書き込む(各自異なります)

sudo vim アプリ名.conf

if ($http_x_forwarded_proto = http) {
return 301 https://$server_name$request_uri;
}

上記を追加

4:Nginxを再起動するために移動

cd /var/www/rails/Tools/
                        ↑自分のアプリ名

5:nginxを再起動

sudo nginx -s reload

nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)

上記のエラーが発生したので次のコマンドをします。

sudo touch /run/nginx.pid && service nginx restart

またエラー発生

Failed to restart nginx.service: The name org.freedesktop.PolicyKit1 was not provided by any .service files
sudo service nginx restart

こちらもsudoが必要だったようでNginxがやっと再起動できた。

http://ドメイン名で試したところ

https://ドメイン名に自動でリダイレクトしてくれるのを確認できた!

http://ドメイン名でアクセスしてhttps://IPアドレスになりエラーになる場合

前提:他のブラウザでhttp://ドメイン名でアクセスしてhttps://ドメイン名に自動でリダイレクトされるが、あるブラウザではhttps://IPアドレスになりエラーになる場合

GoogleChromeでなったときの対処法

①Googlechromeを開きショートカットキー⌘,で設定を開きます。

②セキュリティーとプライバシーをクリックして閲覧履歴データの削除をクリックします

③Cookieと他のサイトデータとキャッシュされた画像とファイルを選択してデータを削除をクリックします

自分の場合http://ドメイン名でアクセスしてhttps://ドメイン名に自動でリダイレクトしてくれるのを確認できました。

ポートフォリオをデプロイしたときのEC2の設定2(EC2+RDS+NGINX+Puma)

その1から続いています

16:GithubとSSHを接続するために鍵を作成

※EC2内で行います。(sshコマンドで接続してからだよ)

cd ~/.ssh

ssh-keygen -t rsa

例としてrsa_portfolioで作成

17:設定ファイルを作成

vim config

#以下を記述してセーブ

ここから==========================
Host github

  Hostname github.com

  User git

  IdentityFile ~/.ssh/rsa_portfolio

ここまで==========================

18:公開鍵を登録する

#公開鍵をコピーして控えておく一番うしろの部分はコピーしなくて良い
cat rsa_portfolio.pub

#Githubで公開鍵を登録
①GitHubにアクセスして自分のアイコンからSettingsをクリック
②SSH and GPG keysをクリック
③SSHkeyを登録する(rsa_portfolio.pub)

19:GitHubとSSH接続する

chmod 600 /home/newuser/.ssh

ssh -T github

#エラーで接続できなかった時に試します(接続できたらやらなくていいいです)
chmod 744 config

20:GitHubからクローンしてbundlerをインストールします

GitHubにてデプロイしたい自分のリポジトリのCode→SSHからコピーして

git clone git@github.com:newuser/アプリ名.git

gem install bundler -v '2.0.2'

21:gemをインストールします

cd アプリ名/

bundle install --path vendor/bundle

#エラーが出た場合バージョンを合わせる

Gemfile.lockの最下段bの BUNDLED WITH のバージョンと合わせる(例:1.16.6)

#ディレクトリは〜で行う

cd ~
gem install bundler -v '1.16.6'
bundle install --path vendor/bundle

#エラーでrmagikがインストール出来ないときのコマンド 

sudo yum -y install ImageMagick 
sudo yum -y install ImageMagick-devel
bundle install --path vendor/bundle
yarn install

22:nginxをインストールする

sudo amazon-linux-extras install nginx1

#インストールできたか確認
nginx -v

23:アプリ名.confの設定(Nginx)

sudo vim /etc/nginx/nginx.conf
#以下をコピーして貼り付けます

user nginx;
worker_processes auto; 
error_log /var/log/nginx/error.log; 
pid /run/nginx.pid; 
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. 
include /usr/share/nginx/modules/*.conf; 
events { 
worker_connections 1024; 
} 

http { 
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
                '$status $body_bytes_sent "$http_referer" ' 
                '"$http_user_agent" "$http_x_forwarded_for"'; 

access_log /var/log/nginx/access.log main; 

sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
keepalive_timeout 65; 
types_hash_max_size 4096; 

include /etc/nginx/mime.types; 
default_type application/octet-stream; 

# Load modular configuration files from the /etc/nginx/conf.d directory. 
# See http://nginx.org/en/docs/ngx_core_module.html#include 
# for more information. 

include /etc/nginx/conf.d/*.conf; 
gzip on; 
gzip_http_version 1.0;
gzip_proxied any; 
gzip_min_length 500; 
gzip_disable "MSIE [1-6]\."; 
gzip_types text/plain text/xml text/css 
           text/comma-separated-values 
           text/javascript application/x-javascript 
           application/atom+xml; }

24:nginxの設定をする

cd /etc/nginx/conf.d/ 
sudo vim アプリ名.conf

#以下をすべてコピーして貼り付けます
# log directory
error_log /var/www/LifeHack-Tools/log/nginx.error.log; #自分のアプリケーション名に変更
access_log /var/www/LifeHack-Tools/log/nginx.access.log; #自分のアプリケーション名に変更
# max body size
client_max_body_size 4G;

upstream app_server {
# for UNIX domain socket setups
server unix://var/www/LifeHack-Tools/tmp/sockets/puma.sock fail_timeout=0; #自分のアプリケーション名に変更
}

server {
listen 80;
server_name suzutuki-portfolio.com; #自分のElasticIP
# nginx so increasing this is generally safe...
keepalive_timeout 5;
# path for static files
root /var/www/LifeHack-Tools/public; #自分のアプリケーション名に変更
# page cache loading
try_files $uri/index.html $uri.html $uri @app;
location @app {
# HTTP headers
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
# Rails error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/LifeHack-Tools/public; #自分のアプリケーション名に変更
}
}

25:Nginxの再起動

#Nginxの再起動
sudo nginx -s reload

cd /var/www/アプリ名/
git pull origin master

26:pumaの設定をする

#pumaディレクトリがないときはmkdir /var/www/アプリ名/config/pumaで作成する
cd /var/www/アプリ名/config/puma/
sudo vim production.rb
#ここからコピーだよ↓

# bind "unix://#{Rails.root.join('tmp/sockets/puma.sock')}"だとpumactlコマンドで読み込まないため絶対パスで指定

root_dir = '/var/www/アプリ名'

max_threads_count = ENV.fetch('RAILS_MAX_THREADS', 5)

min_threads_count = ENV.fetch('RAILS_MIN_THREADS', max_threads_count)

threads min_threads_count, max_threads_count

worker_timeout 60

bind "unix://#{root_dir}/tmp/sockets/puma.sock"

environment 'production'

pidfile File.expand_path('tmp/pids/server.pid')

stdout_redirect File.expand_path('log/puma_access.log'), File.expand_path('log/puma_error.log'), true

# workerの数は適宜変更する。指定しない場合はsingle modeとなるが、指定した場合はcluster modeとなる。

plugin :tmp_restart

27:pumaの起動

cd /var/www/アプリ名

git pull origin master

bundle exec rails s -e production

28:エンドポイントの確認

まずはAWSを開き、RDSのメニューからデータベースを選択して

エンドポイントをコピーします。

29:Credentialの設定

cd /var/www/アプリ名/config

touch master.key

chmod 600 master.key

vim master.key

#ローカルにあるmaster.keyの中身をコピーして貼り付け
# 自分で作成したアプリのconfigにmaster.keyがある
# GitHubにはないので注意

30:Credentialに書き込み

cd /var/www/アプリ名

EDITOR="vi" bin/rails credentials:edit
# エラーでできない場合はこちらを試す
EDITOR='vi' bundle exec rails credentials:edit

usernameは設定からわかる。passwordはわからなくなったら変更できる。

db: 

  endpoint: ******************** #先程コピーしたエンドポイントをコピー

  user_name: ***** # マスターユーザー名

  password: ****** # RDS作成した時に作ったパスワード

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.

secret_key_base: *********** #ここは特に手を加えずにそのままで

31.database.ymlの編集

ローカルでdatabase.ymlの設定
先ほどのcredentialsに記載された情報にアクセスするには Rails.application.credentials.db[:endpoint]という書き方をする必要があり、これを利用してproduction環境用のDBに関して定義。

config/database.yml

default: &default

  adapter: mysql2
 
  encoding: utf8mb4

  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

  username: root

  password: password

  socket: /tmp/mysql.sock

  host: db

development:

  <<: *default

  database: アプリ名_development

production:

  <<: *default

  database: アプリ名_production

  adapter: mysql2

  charset: utf8mb4

  host: <%= Rails.application.credentials.db[:endpoint] %>

  username: <%= Rails.application.credentials.db[:user_name] %>

  password: <%= Rails.application.credentials.db[:password] %>

32:変更した差分を反映

cd /var/www/アプリ名/
git pull origin master

33:DBの作成とmigrate

bundle exec rake db:create RAILS_ENV=production

bundle exec rake db:migrate RAILS_ENV=production

#環境の設定
export RAILS_ENV=production

34:アセットプリコンパイル

bundle exec rake assets:precompile RAILS_ENV=production

35:ブラウザで確認する

http://ElasticIPアドレス

期待していた通りになっていたらOKです。

36:本番環境でもちゃんと動いているか確認します。

レイアウトが崩れていないか

エラーが発生しないか確認します。

ポートフォリオについて備忘録

途中まで進めていたポートフォリオについて書き込み

scssの注意点aplication.scssにこのようにインポートする

このようなディレクトリ構造で開発する

このようにインポートして変数を使うようにする(でないとエラー)

jsファイルも記述して配置する

headerの作成

header.scssを以下の記述にする

@import "variables";
@import "mixin";
@import "base";
// headerの設定担当
.header {
// 画面の上部に固定
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: $navHeight;
// 背景色を透明に
  background-color: transparent;
  display: flex;
  align-items: center;
// ヘッダーを最前面にくるようにする
  z-index: 100;

&.triggered {
  background-color: rgba(255, 255, 255, 0.9);
  box-shadow: 10px 0 25px -10px rgba(0, 0, 0, 0.5);
}

// スマホ画面ではヘッダー表示しない
&__nav {
  display: none;
}

&__ul {
  display: flex;
// 上下中央揃えにする
  align-items: center;
  padding: 0;
  margin: 0;
  list-style: none;
}

&__li {
  margin-left: 20px;

& > a {
  color: $cBlack;
  text-decoration: none !important;
// すべて大文字にする
  text-transform: uppercase;
 }
}

& .logo {
  font-size: 38px;
  justify-content: center;
}

&__inner {
  display: flex;
  justify-content: space-between;
  align-items: center;
// navとコンテンツのラインを同じにする
  @extend .content-width;
 }
}

基本的にスタイルがおかしいと気づいたときは検証を使ったほうが

圧倒的に早く問題解決できるのですること!

jsのroot-marginの設定でうまくアニメーションされないことがあるので気をつけること!

スタイルで参考になりそうなサイトを見つけて使ったほうが良い

Railsの環境構築(エラー対処録)

Railsの環境設定で手こずったので解消するまでやったことを書き留めていきます。

MacのOSは Catalina10.15.7です。

バージョンは最終的に以下のようになります

rbenv 1.1.2
Bundler 2.0.2
Ruby 2.7.5
Rails 5.2.3

1:Homebrewをインストール

Homebrewは、ソフトウェアの導入を単純化するMac OSのパッケージ管理システムです。

下記のURLからHomebrewをインストールします。

Homebrew

2:rbenvをインストールする

rbenvをインストールします。rbenvをインストールすることでrubyのバージョンの切り替えが容易にできるようになります。

brew install rbenv
brew install ruby-build

ruby-buildをインストールすることで、rbenv installというコマンドを使うことができます。

上記のコマンドを実行したらrbenvがインストールされているか確認します。以下のコマンドを実行してバージョンの情報が表示されていればインストールされています。

rbenv --version
rbenv 1.1.2

3:rbenvにPATHを通す

rbenvコマンドを利用するために、rbenvにPATHを通します。PATHを通すとは、コマンド実行ファイルを探しに行くパスを追加することです。

echo 'export PATH="HOME/.rbenv/bin:PATH"' >> ~/.bash_profile
echo 'if which rbenv > /dev/null; then eval "(rbenv init -)"; fi' >> ~/.bash_profile
source ~/.bash_profile

4:Rubyをインストールする

下記のコマンドでRubyをインストールします。

 rbenv install 2.5.1

次にグローバルで利用するバージョンを設定します。

 rbenv global 2.5.1

次にRubyのバージョンの情報を確認します。

ruby -v
ruby 3.0.0    ←ここでグローバルに変わっていない

5:rbenvにPATHを通す

OSがCatalinaでzshなのでPathを変えてみました。

~/.zshenvに
export PATH="/usr/local/bin:$PATH"
export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH" # この一行を追加

↑最後の一行を追加し、~/.zshrcに

~/.zshrc
source $HOME/.zshenv

を追加しました。

またRubyのバージョンの情報を確認します。

ruby -v
ruby 3.0.0    ←グローバルに変わっていない

ここで↓のコマンドで.ruby-versionを確認したところ

vi /Users/ユーザー名/.ruby-version

3.0.0となっていたので
2.5.1に変更します。(iでINSERTモードにして、2.5.1に書き換えてからEscを押して、:wqで上書き保存する)

ruby -v
ruby 2.5.1 ←2.5.1に変わった

6:bundlerをインストールする

bundlerとはGem同士の互換性を保ちながらパッケージの種類やバージョンを管理してくれる仕組みのことです。

bundlerをインストールします。

gem install bundler

上記のコマンドを実行したらbundlerのバージョンを確認します。バージョン情報が表示されていればインストールされています。

bundler -v
Bundler version 2.0.2

7:Railsをインストールする

最後にRailsをインストールします。以下のコマンドを実行します。

gem install rails -v 5.2.3

実行ができたら以下のコマンドでRailsのバージョンを確認します。

rails -v

bin/rails:3:in `require_relative': cannot load such file -- /Users/caimユーザー名/Desktop/config/boot (LoadError)
from bin/rails:3:in `<main>'

エラーでrailsコマンドが使えない・・・

sudoをつけてもう1回試してみる

sudo gem install rails -v 5.2.3

次のようなエラーが出ました

ERROR: Error installing rails:
There are no versions of activesupport (= 7.0.2.2) compatible with your Ruby & RubyGems. Maybe try installing an older version of the gem you're looking for?
activesupport requires Ruby version >= 2.7.0. The current ruby version is 2.6.9.207.

rubyのバージョンを2.7.0以上にしろと言ってるので

rbenv install 2.7.5
vi /Users/ユーザー名/.ruby-version

2.7.5に変更します。(iでINSERTモードにして、2.7.5に書き換えてからEscを押して、:wqで上書き保存する)

rbenv global 2.7.5
ruby -v
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin19]

2.7.5に変わったので、railsを再インストールします。

sudo gem install rails -v 5.2.3

インストールできているか確認します。

rails -v 

Rails is not currently installed on this system. 
To get the latest version, simply type:

   $ sudo gem install rails
You can then rerun your "rails" command.

↑のようなメッセージが出たので、↓のコマンドをします。

hash -r

確認します。

rails -v
Rails 5.2.3

長かったですがなんとか環境構築できました。

ALBでHTTP→HTTPSに自動でリダイレクトさせるよ!

ALBでHTTP→HTTPSに自動でリダイレクトさせるよ!

EC2のALBを使ってリダイレクトさせます。

1:「EC2」で検索→「EC2」をクリックします。

2:ロードバランサーをクリックしてリスナータブからHTTPのルールの表示/編集をクリックします。

3: +ボタンをクリック

4:+ボタンをクリックしてパス…を選択(左)+ボタンをクリックしてリダイレクト先を選択します。

5:パスに*(アスタリスク)を入力して、リダイレクト先に443を入力します。

6:チェックマークをクリックして保存をクリックします。

http://ドメイン名でアクセスしてhttps://ドメイン名に自動でリダイレクトしてくれるのを確認できたらOKです。

 

Better Errorsの使い方(エラーが起きた時見るもの Docker環境下)

Better Errorsとは?

Railsの場合、better_errors gemを使うと便利で高機能なエラー画面が表示されます。

Better Errorsの導入方法

Gemfileに以下を記述します↓

group :development do
  gem 'better_errors'      ←追加
  gem 'binding_of_caller'  ←追加
end

docker-compose buildでコンテナをビルド

docker-compose build

/config/environments/development.rbに以下を追加します↓

if Rails.env.development?
  BetterErrors::Middleware.allow_ip! "0.0.0.0/0"
end

docker-compose up などでコンテナを起動すると↓

いつもならこのような表示が

このようになる!

左のペインで処理の流れがわかりやすくなる

右にある情報で、デバッグの手がかりを探す事もできます。

その他デバッグに関しての心得

  • 開発環境であれば画面にエラーの発生箇所が表示されます。
  • 本番環境であればログを読みます。ログにもエラーの発生箇所が表示されます。
  • エラー画面やログを見て、エラーが起きたファイルと行番号を確認します。

実際にエラーが起きたのは自分が書いたコードではなく、gemやフレームワークのコードであることも多いです。Railsのエラー画面であれば Full trace リンクをクリックすると、gemやフレームワークのスタックトレース(バックトレース)が表示されます。

スタックトレースは下から上にメソッドが呼び出された順番が表示されます。スタックトレースを読むことで、エラーが発生するまでにどのファイルのどの行が呼ばれてきたのかを確認できます。

ActiveRecord::NoDatabaseError – Unknown database ‘xxx’:(エラーメッセージ対処法)

Docker + Railsで開発中の時に遭遇しました。

ActiveRecord::NoDatabaseError – Unknown database ‘xxx’:とは?

docker-compose upでコンテナを起動した時に発生

データベースが作成されていないためのエラーなのでデータベースを作成します。

$ docker-compose exec web bundle exec rake db:create

Created database ‘***’と出ていればOKです。

この状態でアクセスすると

Migrations are pending. To resolve this issue, run:というエラーが発生します。

マイグレートすれば解決するので、マイグレートします。

$ docker-compose exec web bundle exec rake db:migrate

docker-compose upでコンテナを起動してエラーが出なくなっているのを確認しました。

Migrationを保留しているというエラーだったのでMigrationを実行するとエラーが出なくなります。