- 投稿日:2021-03-29T22:53:58+09:00
【Rails】An error occurred while installing pg (1.1.4), and Bundler cannot continue.時の対処法
症状
railsチュートリアルに載っていたGemの設定をコピペして、bundle updateをしたら、下記のエラーが表示され、正常にupdateできなかったようです。
Rails v6.0.3
bundle update The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`. Fetching gem metadata from https://rubygems.org/............ Fetching gem metadata from https://rubygems.org/. Resolving dependencies..... Using rake 12.3.3 Using concurrent-ruby 1.1.8 Using i18n 1.8.9 Using minitest 5.11.3 (was 5.14.4) Using thread_safe 0.3.6 Using tzinfo 1.2.9 Using zeitwerk 2.4.2 Using activesupport 6.0.3 Using builder 3.2.4 Using erubi 1.10.0 Using mini_portile2 2.5.0 Using racc 1.5.2 Using nokogiri 1.11.2 (x86_64-linux) Using rails-dom-testing 2.0.3 Using crass 1.0.6 Using loofah 2.9.0 Using rails-html-sanitizer 1.3.0 Using actionview 6.0.3 Using rack 2.2.3 Using rack-test 1.1.0 Using actionpack 6.0.3 Using nio4r 2.5.7 Using websocket-extensions 0.1.5 Using websocket-driver 0.7.3 Using actioncable 6.0.3 Using globalid 0.4.2 Using activejob 6.0.3 Using activemodel 6.0.3 Using activerecord 6.0.3 Using mimemagic 0.3.10 Using marcel 0.3.3 Using activestorage 6.0.3 Using mini_mime 1.0.3 Using mail 2.7.1 Using actionmailbox 6.0.3 Using actionmailer 6.0.3 Using actiontext 6.0.3 Using bundler 1.17.2 Using method_source 1.0.0 Using thor 1.1.0 Using railties 6.0.3 Using sprockets 3.7.2 Using sprockets-rails 3.2.2 Using rails 6.0.3 Fetching active_storage_validations 0.8.2 Installing active_storage_validations 0.8.2 Using public_suffix 4.0.6 Using addressable 2.7.0 Fetching ansi 1.5.0 Installing ansi 1.5.0 Fetching execjs 2.7.0 Installing execjs 2.7.0 Fetching autoprefixer-rails 10.2.4.0 Installing autoprefixer-rails 10.2.4.0 Fetching aws-eventstream 1.1.1 Installing aws-eventstream 1.1.1 Fetching aws-partitions 1.436.0 Installing aws-partitions 1.436.0 Fetching aws-sigv4 1.2.3 Installing aws-sigv4 1.2.3 Fetching jmespath 1.4.0 Installing jmespath 1.4.0 Fetching aws-sdk-core 3.113.0 Installing aws-sdk-core 3.113.0 Fetching aws-sdk-kms 1.43.0 Installing aws-sdk-kms 1.43.0 Fetching aws-sdk-s3 1.46.0 Installing aws-sdk-s3 1.46.0 Fetching bcrypt 3.1.13 Installing bcrypt 3.1.13 with native extensions Using bindex 0.8.1 Using msgpack 1.4.2 Using bootsnap 1.4.5 Using ffi 1.15.0 Using sassc 2.4.0 Fetching bootstrap-sass 3.4.1 Installing bootstrap-sass 3.4.1 Fetching will_paginate 3.1.8 Installing will_paginate 3.1.8 Fetching bootstrap-will_paginate 1.0.0 Installing bootstrap-will_paginate 1.0.0 Using byebug 11.0.1 Using regexp_parser 1.8.2 Using xpath 3.2.0 Using capybara 3.28.0 Using childprocess 2.0.0 Fetching coderay 1.1.3 Installing coderay 1.1.3 Fetching faker 2.1.2 Installing faker 2.1.2 Fetching formatador 0.2.5 Installing formatador 0.2.5 Using rb-fsevent 0.10.4 Using rb-inotify 0.10.1 Using ruby_dep 1.5.0 Using listen 3.1.5 Fetching lumberjack 1.2.8 Installing lumberjack 1.2.8 Fetching nenv 0.3.0 Installing nenv 0.3.0 Fetching shellany 0.0.1 Installing shellany 0.0.1 Fetching notiffany 0.1.3 Installing notiffany 0.1.3 Fetching pry 0.14.0 Installing pry 0.14.0 Fetching guard 2.16.2 Installing guard 2.16.2 Fetching guard-compat 1.2.1 Installing guard-compat 1.2.1 Fetching guard-minitest 2.4.6 Installing guard-minitest 2.4.6 Fetching mini_magick 4.9.5 Installing mini_magick 4.9.5 Fetching ruby-vips 2.1.0 Installing ruby-vips 2.1.0 Fetching image_processing 1.9.3 Installing image_processing 1.9.3 Using jbuilder 2.9.1 Fetching ruby-progressbar 1.11.0 Installing ruby-progressbar 1.11.0 Fetching minitest-reporters 1.3.8 Installing minitest-reporters 1.3.8 Fetching pg 1.1.4 Installing pg 1.1.4 with native extensions Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/pg-1.1.4/ext /home/ubuntu/.rvm/rubies/ruby-2.6.3/bin/ruby -I /home/ubuntu/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0 -r ./siteconf20210329-4274-geu1jf.rb extconf.rb checking for pg_config... no No pg_config... trying anyway. If building fails, please try again with --with-pg-config=/path/to/pg_config checking for libpq-fe.h... no Can't find the 'libpq-fe.h header *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/home/ubuntu/.rvm/rubies/ruby-2.6.3/bin/$(RUBY_BASE_NAME) --with-pg --without-pg --enable-windows-cross --disable-windows-cross --with-pg-config --without-pg-config --with-pg_config --without-pg_config --with-pg-dir --without-pg-dir --with-pg-include --without-pg-include=${pg-dir}/include --with-pg-lib --without-pg-lib=${pg-dir}/lib To see why this extension failed to compile, please check the mkmf.log which can be found here: /home/ubuntu/.rvm/gems/ruby-2.6.3/extensions/x86_64-linux/2.6.0/pg-1.1.4/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/pg-1.1.4 for inspection. Results logged to /home/ubuntu/.rvm/gems/ruby-2.6.3/extensions/x86_64-linux/2.6.0/pg-1.1.4/gem_make.out An error occurred while installing pg (1.1.4), and Bundler cannot continue. Make sure that `gem install pg -v '1.1.4' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: pg最後のほうにある「An error~」を翻訳に放り込むと、
「pg(1.1.4)のインストール中にエラーが発生し、Bundlerを続行できません。
バンドルする前に、gem install pg -v '1.1.4' --source'https:// rubygems.org / '
が成功することを確認してください。」
となりました。メッセージの通り、gem install pg -v '1.1.4' --source 'https://rubygems.org/を実施しましたが、解決しませんでした。
解決策
bundle install --without production後に、bundle updateしたら治りました。
なぜ治ったかは不明。。。#エラーが出る bundle install --without production The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`. Fetching gem metadata from https://rubygems.org/............ Fetching gem metadata from https://rubygems.org/. You have requested: minitest = 5.11.3 The bundle currently has minitest locked at 5.14.4. Try running `bundle update minitest` If you are updating multiple gems in your Gemfile at once, try passing them all to `bundle update` #updateが正常に完了できる bundle update参考
Railsチュートリアル13章
https://railstutorial.jp/chapters/user_microposts?version=6.0#code-final_gemfile
- 投稿日:2021-03-29T22:31:18+09:00
adminページのアクセス制限方法
こんにちは、たにーです。
今回もadminについてです。
admin専用のページには、adminだけが見れるのが当たり前だと思います。
ただ、チーム開発で他のチームでアクセス制限が出来ていないのが見られました。今回は、その設定方法をまとめます。
他にも方法があると思いますが、チームメンバーで考えた結果これぐらいかなと思ってます。他にあれば教えてください。
adminページのアクセス制限
下記は、現在のルートです。
adminでitemのindex~showまであるとします。terminalPrefix Verb URI Pattern Controller#Action admin_items GET /admin/items(.:format) admin/items#index POST /admin/items(.:format) admin/items#create new_admin_item GET /admin/items/new(.:format) admin/items#new edit_admin_item GET /admin/items/:id/edit(.:format) admin/items#edit admin_item GET /admin/items/:id(.:format) admin/items#showもし、アクセル制限を行わないと、
管理者でない通常のお客さんでも商品登録が出来ちゃいます。(笑)方法①
adminがもつコントローラーにそれぞれ記述する。
items_controller.rbbefore_action :authenticate_admin!autehntiateは、「認証する」という意味です。
つまりこの記述は、
「このコントローラー(items_controller)に記述してあるアクションは、adminだけが使用できるよ。
だから、アクションを実行する前に、adminであるか確認してね。」を意味します。
adminじゃなければ、ログイン画面に遷移されます。
方法②
apllicationコントローラーで纏めてアクセス制限を行う方法。
application_controller.rbclass ApplicationController < ActionController::Base before_action :authenticate_admin!, if: :admin_url def admin_url request.fullpath.include?("/admin") end end分解して解説します。
before_aciton
application_controller.rbbefore_action :authenticate_admin!, if: :admin_url=> ①で説明しているのでベースは省きます。
ifの部分ですが、「admin_urlを参照する」を意味します。
この後に、「admin_url」のメソッドが記述します。admin_url
application_controller.rbdef admin_url request.fullpath.include?("/admin") end=> request.fullpathで、飛んだ先のpathを全て取得します。
include?(val)で、valと同じ要素が含まれていれば、trueを返します。
つまり、パスに「/admin」が含まれているかどうかを確認する。です。となります。
なので、 まとめると、
「pathに/adminが含まれている全てのページは、adminでログインしないと見れないよ。」
となります。
以上、たにーでした。
参考文献
- 投稿日:2021-03-29T22:13:13+09:00
お買い物プログラム
paizaで少し苦戦したお買い物プログラムを自分なりに解釈して見ました。
以下、問題文です。RPG の道具屋での買い物をシミュレートしてみましょう。
具体的には、最初の所持金と注文履歴から、最終的な残金を計算します。
ただし、注文時に所持金が足りない場合、その注文は無視されます。入力例 1 では、お金の単位を G として、ある道具屋での単価が下の表のようになっています。
薬草 = 10G
せいすい = 100G
木の棒 = 50Gここで、初期の所持金が 300 G であり、注文履歴が
- やくそう 5 個
- せいすい 3 個
- きのぼう 1 個
- せいすい 1 個
- やくそう 3 個
であるため、残金は次のように計算できます。
- やくそう 5 個を買える所持金があるので、残金は 300 - 10 × 5 = 250 G
- せいすい 3 個を買える所持金はないので、残金は 250 G
- きのぼう 1 個を買える所持金があるので、残金は 250 - 50 × 1 = 200 G
- せいすい 1 個を買える所持金があるので、残金は 200 - 100 × 1 = 100 G
- やくそう 3 個を買える所持金があるので、残金は 100 - 10 × 3 = 70 G
よって、最終的な残金は 70 G です。
このような計算をシミュレートするプログラムを作成してください。
getsに入力されるのは以下の意味をもった数です。
3 #=> アイテム数 10 100 50 #=> アイテムの値段 300 5 #=> 所持金 買い物をする回数 1 5 #=> 商品番号 買う商品の個数 2 3 #=> 〃 3 1 #=> 〃 2 1 #=> 〃 1 3 #=> 〃完成したコードがこちら
N = gets.to_i price = gets.chomp.split(" ").map(&:to_i) a = gets.chomp.split(" ").map(&:to_i) shopping = a[1] money = a[0] shopping.times do order = gets.chomp.split(" ").map(&:to_i) order_amount = order[1] order_index = order[0] - 1 total_price = order_amount * price[order_index] if money >= total_price money -= total_price else end end puts money解答のポイント
- price(商品の値段)とorder_index(商品番号)を結びつける。
そのまま引数に指定するだけだと[1]を取得してしまうため、予め−1をすることで[0]から取得できるようにする。
最後に
問題文の中に答えがあったのでしっかり問題文を読み込むことが大事だなと感じました。
- 投稿日:2021-03-29T22:03:26+09:00
【At corder】【初心者】Welcome to AtCoder をRuby で解いてみた
はじめに
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita
こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日1問を目標としてコツコツやってきますわからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください
問題 Welcome to AtCoder
整数 a,b,cと、文字列 s が与えられます。 a+b+c の計算結果と、文字列 s を並べて表示しなさい。
入力は
a b c s出力は
a+b+cとsを空白区切りで1行に出力入力例
1 2 3 test出力例
6 test回答
a = gets.to_i b,c=gets.chomp.split(" ").map(&:to_i); s = gets.chomp print("#{a+b+c} #{s}\n")解説
get メソッドは入力を文字列で受ける。改行も含める。
.chompは改行をはずす
.to_iは数値オブジェクトに変換
二行目 入力を配列に格納(to_iなので数値として保存)
split(sep = $;, limit = 0)は第 1 引数 sep で指定されたセパレータによって文字列を limit 個まで分割し、結果を文字列の配列で返します。ブロックを指定すると、配列を返す代わりに分割した文字列でブロックを呼び出します。(今回はlimitはない)
感想
なにを使って入力を受けるのか、データ型はなにか、など基本的なことを押さえていないと入力を受け付けることすらできない。
コツコツ理解していこう参考文献
- 投稿日:2021-03-29T21:15:20+09:00
Railsコンソールを使ってレコード登録を行う方法
こんにちは、たにーです。
Railsのコンソールでadminレコードを作成したい場面がありましたので、
備忘録として記述します。rails console(コンソール)とは
rails の環境を読み込んだ状態でrubyコードを実行できるツールです。
他にも作成している rails アプリケーション内で定義したメソッドや読み込んでいる gem も実行することができます。役立つ場面
- いろんなメソッドを試しながら実装したいとき
- エラーが起こったが原因がわからないとき詳しくは今回書きませんが、
エラーが起きた際には、非常に役立つので覚えて損はありません。実際にコンソールで登録してみよう
まずは、コンソールを立ち上げます。
terminal$ rails c Running via Spring preloader in process 6516 Loading development environment (Rails 5.2.4.5) [1] pry(main)>terminal[1] pry(main)> モデル名.create(カラム名:"カラムの値")terminal[1] pry(main)> Admin.create!(email:"test1@gmail.com", password:"123456", ) (0.1ms) begin transaction Admin Exists (0.2ms) SELECT 1 AS one FROM "admins" WHERE "admins"."email" = ? LIMIT ? [["email", "tesrt1@gmail.com"], ["LIMIT", 1]] Admin Create (4.8ms) INSERT INTO "admins" ("email", "encrypted_password", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["email", "test1@gmail.com"], ["encrypted_password", "$2a$12$gtXWZK10cp32d99s7zfnjO9OT19Q4FLT0nJPdTwVMKOTcnZXMtt6q"], ["created_at", "2021-03-29 09:41:14.618946"], ["updated_at", "2021-03-29 09:41:14.618946"]] (5.3ms) commit transaction => #<Admin id: 1, email: "test1@gmail.com", created_at: "2021-03-29 09:41:14", updated_at: "2021-03-29 09:41:14">Createと出ており、無事idも付与されているのが分かります。
念の為、adminモデルに保存されているか確認しましょう。terminal[2] pry(main)> モデル名.allコントローラーの書き方と同じです。
terminal[2] pry(main)> Admin.all Admin Load (0.2ms) SELECT "admins".* FROM "admins" => [#<Admin id: 1, email: "tesrt1@gmail.com", created_at: "2021-03-29 09:41:14", updated_at: "2021-03-29 09:41:14">, [3] pry(main)>確認できましたね。
終了するときは quitまたはexitでコンソールを閉じることができます。
rails consoleの表記違い
あれ?私のと表記が違う?という方もいるのではないようでしょか?
通常であれば、、下記の表記だと思われます。terminal[1] irb(main)>私のは、irbではなく、pryになっていたかと思います。
terminal[1] pry(main)>irbとは
「Interactive Ruby」の略で、対話形式でプログラムを実行できるようになるコマンドです。
pry(プライ)とは?
標準のirbよりも機能的にすぐれた対話型ツール。
なので、よほどの理由がない限り標準のirbでconsoleを使用するよりもpryを使用すべき。
pryの導入
至って簡単です。
gemを導入するだけです。Gemfilegem 'pry-rails'その後は、budle installを実行。
terminal$ bundle installこれで、コンソールの表記は変わっていると思います。
参考文献でpryの使い方も書いてあり、
- show-model(s) (モデルのデータタイプを確認できる。)
- show-routes (早くルートを確認できる。)
は使えそうなので、今度試してみます。
以上、たにーでした。
参考文献
- 投稿日:2021-03-29T19:38:33+09:00
【Ruby】簡単なAPIを叩いてみる(郵便番号検索API)
環境
macOS: Big Sur Ver11.2.2
Ruby: 2.6.5記事の背景
「Webアプリの開発で外部APIを使わないことはほぼない!」ということを聞いて慌ててAPIについて勉強し始めました。第一歩として、郵便番号を検索する簡単なAPIでプログラムを実装。
調べていくと「Faraday」というGemがリクエストとレスポンスを比較的シンプルに書けるらしく、このGemを使った方法でも実装してみました。
どちらもRubyのファイルを単独で生成して、そこに記述してターミナル上で実行しています。実装①
Rubyの外部ライブラリをrequireして最も基本的な形で実装
上記のGemを使わず、基本に則ったやり方で実装。
potal_code.rb# このプログラムで使うメソッドが組み込みライブラリではないので必要なライブラリを読み込む必要がある # この2つは基本となるのでrequireする require 'uri' require 'net/http' # レスポンスがJson形式で返ってくるので、それをRubyのオブジェクトに変換するのに必要な外部ライブラリ require "json" def get_address(zip_code) # 引数を使って postal_code=1111111 のような形をつくる query = URI.encode_www_form(zipcode: zip_code) # リクエストを送るURIを生成 uri = URI.parse("https://zipcloud.ibsnet.co.jp/api/search?#{query}") # 上記のURIに実際にリクエストを送り、返ってくるレスポンスをresponseに格納 response = Net::HTTP.get_response(uri) # 返ってきたresponseのbody部分をJSONからRubyのハッシュに変換 result = JSON.parse(response.body) # 上記までで返ってきたレスポンスがブラウザに表示されているのと同じ状態になっている。あとは返ってきた情報を使うだけ。 postal_code = result["results"][0]["zipcode"] prefecture = result["results"][0]["address1"] city = result["results"][0]["address2"] region = result["results"][0]["address3"] puts "郵便番号は#{postal_code}、住所は#{prefecture}#{city}#{region}です" end # 上で作成したメソッドを実行 get_address(ハイフン無しの郵便番号を半角で入力)解説
流れとしては、
①リクエストと送るURLを定義し、URL末尾に渡すクエリパラメーターも定義する。
クエリパラメータの生成には、URI.encode_www_formメソッドを使う。
このメソッドは外部ライブラリを読み込んでいるから使えるようになっている!②リクエストを送り、レスポンスを得る。
①で定義したURLにNet::HTTP.get_responseメソッドでリクエストを送る(これも外部ライブラリのおかげ)。
返ってくるレスポンスを変数responseに格納。③返ってきたレスポンスはJson形式なので、JSON.parseメソッドでRubyのオブジェクトに変換が必要
④最後にハッシュ形式になっているデータから使いたいデータを取り出し、利用します。
返ってくるデータは以下を参照
郵便番号検索API実装②
Gem「Faraday」を使ってもう少し簡単に実装
基本的な流れは一緒ですが、こちらのやり方は少し記述量が減ります!
まず準備として公式ドキュメントに掲載されている通り、ターミナルでGemをインストールします。% gem install faraday % gem install faraday_middleware
あとはドキュメントを見ながら実装してみました。
# ターミナルで「gem install faraday」コマンドを打ってから require 'faraday' # ターミナルで「gem install faraday_middleware」コマンドを打ってから require 'faraday_middleware' # 外部ライブラリをrequire require "json" def get_address(zip_code) url = 'https://zipcloud.ibsnet.co.jp/api/search' response = Faraday.get(url, {zipcode: zip_code}, {'Accept' => 'application/json'}) # 返ってくるJson形式のレスポンスをRubyのオブジェクトに変換 result = JSON.parse(response.body) postal_code = result["results"][0]["zipcode"] prefecture = result["results"][0]["address1"] city = result["results"][0]["address2"] region = result["results"][0]["address3"] puts "郵便番号は#{postal_code}、住所は#{prefecture}#{city}#{region}です" end get_address(ハイフン無しの郵便番号を半角で入力)違うのは前半のリクエストURLを生成してレスポンスを送るまでのところですね。
ちなみにJSON.parseとしてRubyハッシュに変換するのは必須みたい。これやらないとデータを受け取れませんでした。最後に
今回使用したFaradayはRubyのGemの公式サイトではかなりダウンロード数も多く、実務でも使われているのではという印象。
次はYouTubeあたりのAPIを叩きたい...以上。
- 投稿日:2021-03-29T19:32:51+09:00
カラム追加
直接マイグレーションファイルに記述
(t.string :profile_photo, null: false など)または
% rails g migration AddProfilePhotoToUsers profile_photo:string
両方とも最後に
% rails db:migrate を忘れないこと
- 投稿日:2021-03-29T18:40:01+09:00
なぜあなたのプログラミングスキルは向上しないのか?
はじめに
私自身、未経験からプログラミングを学習して転職したこと、MENTAで50以上の人にプログラミングを教えている経験から、プログラミング学習の心構えについて思うことがあるので書き留めてみようと思います
5分ほどで読み終わるので、初学者の方は是非参考にしてみてください?
※ 客観的な根拠に基づく事実だけではなく、個人的見解も含まれておりますので、半分ポエムだと思ってお読みください
※ 人によっては痛いところを突かれて気分を害する可能性もあります。その場合はそっ閉じして日を改めてお読みください
? メッセージ
焦らず地道に力をつけていきましょう
(全てをまとめるとこの一言に集約されます)どんなに脳みそが優秀でも、全くの未学習・未経験の状態から1ヶ月勉強したぐらいでは実務をこなせるレベルのエンジニアにはなれません
短期的な成果ばかりに目を向けず、長期的な視点を持つようにしてください
ペンシルベニア大学心理学教授、アンジェラ・ダックワースの研究成果をまとめた「やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける」によると、
何かを成し遂げるには、才能よりもやり抜く力のほうが大事
なようです
つまり、自分が努力することを諦める理由を才能のせいにしてはいけないのです
そもそも才能(人間の性能)の違いなんてせいぜい2〜3倍程度でしょう
あなたが人類で一番才能がない状態でGoogleのトップレベルのエンジニアを目指すわけでもない限り、人並みの努力をすれば必ず中級のエンジニアにはなれるはずです
ただ、間違った努力をしても意味がないこともあるので、プログラミング学習の心構えを押さえておきたい人はこの記事の内容を意識しておくと良いかと思います
❓ なぜこの記事を書くことになったか?
初学者の多くが、「ポートフォリオを早く完成させたい」「早く就職したい」と焦っており、本質的な理解・学習ができてないと感じたからです
今思うと、これまでの学校教育でも周りを見るとそんな人が多かったように思います
宿題の答えを書くことが目的となってはいけないのです
似たような問題や見たことがない問題が出た時にも、自分の知識を活用して解けるようになることが目的のはずです
(逆に教師側は、すでにできる人にも同じ課題をやらせるのはどうかと思いますが笑)焦りやもどかしさを感じる気持ちはよくわかります
初学者はいろいろ覚えることが多く、それらが身につくまでにどうしても時間がかかってしまうからです?
しかし、時間がかかるのは人間の脳みその宿命です
早々に諦めて地道にトレーニングしましょう?️♀️補足
筆者は普段Ruby on Railsを主に扱っておりまして、言語としてはRuby, JavaScript(TypeScript)を使っておりますが、他の言語でも同じかと思います(というかプログラミングに関わらず、何かを学習する上では同じかなと)こんなことに気をつけよう
では具体的にどんなことに気をつければ良いか説明していきます
大きく分けて、やってはいけないこと(アンチパターン)とやった方がいいこと(Tips)の2種類あります
アンチパターンを避けるほうが大事なので先に書きます
?♂️ アンチパターン
? 頭が悪いとレッテルを貼る(もしくは頭が良いというレッテルを貼る)
自分は頭が悪い(才能がない)からできないんだと考えるのは、百害あって一利なしなので今すぐやめましょう
要は「やればできる感覚」を持つようにすべきということです
最近話題の自己肯定感というやつですが、やればできるという感覚は実際に学校の成績を上げることが多くの実験でわかっています
(詳しくは「マインドセット「やればできる! 」の研究」が参考になりましょう)つまり、自身のマインドに介入することは、学習効果を高める大事な要素になっているのです
ここで注意したいのは、とにかく自信を持てということではありません。
自分はできる人間(あるいは天才)だと思い込んでしまうと、失敗を極度に恐れて挑戦しなくなる危険があるのです
![]()
これは難しい問題に挑戦して失敗したときに、できる人間であるはずの自分を否定することになるからです
?♂️ 自分で調べない
簡単に諦めるとも言います
何日も同じエラーに悩んで全く先に進まないというのも問題ですが、ろくに調べもせずに答えを教えてもらおうとするのは問題です
自分で考えずに答えを聞いた場合は、自分の考えのどこが間違っていたのかを理解することなく先に進んでしまうため、次同じような問題に直面したときに自分で解決できないのです
少し苦しい経験をしないと脳は学習してくれない仕組みになっているので、少しぐらい調べて自分で仮説を立てる習慣をつけておきましょう
脳科学的な良い学習の仕方が知りたい方は、「使える脳の鍛え方 成功する学習の科学」が参考になるかと思います
? 意味を理解せずにコピペする
できない人ほどよくやりがちですが、似たようなやり方の記事を見つけて、ソースコードをそのままコピペするというものです
コピペ自体は悪いことではありません
効率的に作業ができたり、間違いが減るなどのメリットもあります問題は、なぜそのコードで動いているか理解せずに使うことです
コードの意味を理解していなければ少しアレンジしようにもできるはずがありません
そして「こんな感じにアレンジするにはどうしたらいいですか?」などと質問するのはやめましょう
教えてもらって動くコードが手に入るかもしれませんが、あなたの脳みそには「コピペして教えてもらったという出来事」以外何も残りません?
カンニングして赤点を回避するぐらいしょうもないことなので、こんなことはないようにしましょう
? Tips
ここから先は、「こんなことも意識すると良いかも」という内容です
いきなり全部やろうとするとパンクするので、少しずつ意識してできるようにしていきましょう?
? ちゃんと読む
文章を読まない人が割と多い気がします
ふつうに義務教育を終えている人であれば、文章を読めないということはないはずなので、ちゃんと読むようにしましょう
「いや、馬鹿にしてるのか」と思った方は、次にあげるものをちゃんと読んでるか自問自答してみてください
- エラー文
- 公式ドキュメント
- ネットの記事(Qiitaなど)
特にエラー文はちゃんと読みましょう
大抵の場合はエラー文に答えかヒントが書いてます英語が苦手な人は翻訳を使えば良いのです
(DeepLというアプリを使うと、「command + C + C」ですぐに翻訳してくれるので便利です)ちなみに「ちゃんと読む」とは、書き手の意図どおりに文の意味を理解するということです
(文字を眺めることでも、自分の勝手な解釈で読むことでもないのです)? 検証する
初心者ほど検証しないという気がしています
検証するというのはもう少し具体的にすると、どこまで正しくてどこで間違っているか確認するということです
正しい範囲を潰していけば、間違ってる箇所(エラー原因)を必ず特定できます
そのために必要なことは「処理の流れを理解すること」と「デバッグ作業」です
処理の流れを理解する
- どの順番で処理が動くか理解する
- 入力値が何で、出力値が何かを理解する
デバッグする
- この処理までは問題ないだろうという仮説を立てる
- 上記の箇所で処理を一時停止して、期待通りにデータが処理されてるか確認する
- 期待通りであればその先のどこかに、期待外れであればそれまでのどこかに間違いがあります
✨ 丁寧にやる
多少時間がかかっても丁寧にやりましょう
なぜ丁寧にやる必要があるかと言えば、そのほうが結果的に時間を節約できるからです
※ 完璧にやれということではないです。ちょっとの注意でできることはやるようにしましょうというお話
とりあえず初学者は以下のことに気をつけましょう
インデント
インデントがずれていても言語によっては正しく動作します
以下はRubyの例(数字が偶数か判定するメソッド)ですが、これも正しく動作しますdef even?(number) if number.even? puts 'yes' else puts 'no' end end上記は極端な例(逆に初心者には書けない笑)ですが、これだと理解に時間がかかりますし、直感的にendをつけ忘れている感じがします
インデントは特別な理由がない限り揃えましょう
タイプミス(タイポ)に気を付ける
タイポによるデメリットは以下の2つでしょう
- バグが起こりやすくなる
- 第三者から見たときにレベルが低いと思われて一気に信頼感を失う
チャットでたまに誤記するくらいなら問題ないですが(人間なのでしょうがない)、たくさんの人に見られる文章には1つでもあってはならないという気持ちでやりましょう
プログラミングでも狭いスコープ内で一時的に使われる変数名などであればタイポしてても最悪許せます(修正もそこまで手間ではない)
しかし、テーブル名やグローバル変数の名前など、影響範囲が広いものに関しては修正のコストがかかりすぎるので、これをタイポしていると絶望的です(地獄の修正作業をするか、気持ち悪さを一生引きずって今後もタイポした名前を使い続けるかの2択になります)
※ インデントやタイポは人間の注意力だけで0にすることは難しいので、Linterの力も活用しましょう
適切な名前をつける
名前を見ただけで中身がどんなものか想像できるととても読みやすくなります
例をあげればキリがないですが、初心者はひとまず以下の点に注意してみましょう
- 配列のデータが入ってる場合は複数形にする
- dataなど抽象的すぎる名前は使わない(何のデータ?ってなる)
- 何かを実行するメソッドなら動詞を入れる
- boolean型を返すメソッドなら「is」始まり、もしくは「?」で終わる名前にする(言語による)
定番ですが、「リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック」にはかなり良いことが書かれてるのでエンジニアなら一度は読んでおくことをオススメします
一気にやろうとしない
少しずつ正しく動作することを確認しながら実装していきましょう
ありがちなのが、
実装したい機能についてググる
→記事のとおりに実装
→エラーが出て解決できない
という流れです(割とみんな経験するかも)コピペしてくるだけだと、あちこちに間違ってる部分がある可能性があり、それらを一つずつ検証していくのは初学者には大変だと思います
うまくやるには、以下のようにやってみると良いかと思います
1. 日本語で処理のステップを書き出す
2. 最初のステップをコーディングする(わからなければ調べる)
3. 1つのステップが書けたら実際に動くか確かめる
4. 次のステップをコーディング(以降繰り返す)?? 基礎力をつける
基本的なことができない(あるいはわからない)と、全体的な作業スピードが遅くなり、学習スピードも落ちてしまいます
誰かに教えてもらう時も、基礎的な部分ができてないとその分余計に時間がかかってしまうので少しずつでも改善していけるようにしましょう
以下もう少し具体的な内容を書いてみます
キーの名前
MENTAで教えていて割と衝撃的でしたが、「タブ」「コロン」が通じないことがありました…
こうなると「Qの左隣」とか「Lの2つ隣」とか説明しなくてはなりません
マニアックなキーまで知っておく必要はないですが、基本的な名前は押さえておきましょう(とりあえず以下は最低限かなーと)
- 「tab」(タブ)
- 「:」(コロン)
- 「;」(セミコロン)
- 「_」(アンダースコア)
- 「'」(クォーテーション)
- 「`」(バッククォーテーション)
自信ない方はこちらのサイトなど参考にしてみてください
タイピング速度
エンジニアといえど常にタイピングしているわけじゃないですが、ある程度は早く正確にタイピングできた方が良いです
チャットでやり取りすることもあるので、PCで仕事をする必要がある時代のうちは身に付けておきましょう!
訓練さえすれば誰でもできます(逆にどんな天才も訓練しなきゃできません)
寿司打の高級10,000円コースでお釣りがもらえるぐらいにはなっておきましょう!?
ショートカットはなるべく使う
ショートカットなんて大して時間の節約にならないと思うかもしれませんが、ショートカットのメリットは時間節約だけではありません
ショートカットが使えると些末な作業の負荷が下がり、「面倒だからやりたくない」という気持ちを回避してやるべきことに集中できます
コピーペーストのショートカットは当たり前に使うかもしれませんが、以下もコピペと同じくらい当たり前に使えるようにしましょう!
- 操作系
- 「command + Z」でひとつ前の操作に戻る
- 「command + shift + Z」で戻した操作をとりやめ(次に進む)
- 「command + A」で全選択
- 検索系
- 「command + スペース」でアプリ検索&起動
- 「command + F」で単語検索
- ウインドウ操作
- 「command + tab」で開いてるウインドウ切り替え
- 「command + R」ページリロード
- 「command + T」でタブを新しく開く
- 「command + W」で現在のタブを閉じる
- カーソル移動
- 「control + P (or N or F or B)」で上(下、左、右)に移動
- 「control + A(or E)」で先頭(末尾)に移動
- おまけ
- 「Z + K (or J or H or L)」で上(下、左、右)の矢印(日本語入力時)
他にも便利なものがいろいろあるので、こちらのサイトなどを参考に少しずつ覚えましょう
エディタの便利な機能を使う
VScodeなどのエディタには便利な機能がいろいろあったりします
マルチカーソルや検索、一括置換などを使えば作業時間が短縮できるだけでなく、正確性が上がるので、無駄なエラーを出さずに済みます
こちらの記事にVScodeのよく使う基本的な機能を載せてあるので、このぐらいは使いこなして欲しいところです
用語を理解する
専門用語は少しずつ覚えていきましょう
用語の意味がわからないとドキュメントを読んでも理解することができず、解決したい課題を解決することができません。。。
覚えるべき用語がたくさんあって自分には無理だと思うかもしれません
しかし、あなたが知っている全ての知識と比べたら誤差みたいな量です必ず理解できるようになるので、着実に習得していきましょう
?♂️ 質問をうまくする
質問するにもいい質問と悪い質問があります
質問の良し悪しとは、問題の内容をいかに正確に、そしていかに早く相手に伝えられるかです
ベテランのエンジニアは質問力がうまいので、Googleでうまく検索して自分1人でも課題を解決できるのです
また実際に質問はしなくても、質問を考えるだけで解決までいけちゃうケースもあります
(ラバーダッキング効果というやつです?)以下のポイントを押さえて、質問力を高めましょう!
解決したいことを明確にする
まずは何が目的か明確にしましょう
「なんとなくこんな感じにしたい」というのはダメです
なるべく解像度を上げてイメージするようにしてくださいどんな細かい実装でも、最終的なゴールのイメージは具体的にしておきましょう
何がわからないか明確にする
初学者で質問が下手な人はここが絶望的にできてません
「なんだかよくわからないけどうまくいかない」
ということは言わないようにしましょう
ここがうまくできない場合は、前のステップに戻って「何を実現したいんだっけ?」と問い直してみましょう
自分が実現したいことと、そのために足りないことが明確になったらOKです
わかりやすい文章を書く
伝えたいことを明確にしても、わかりやすくなければ伝わりません
(改行なしでずらずら書かれた文章は、見ただけで読む気をなくしますよね?)相手にとって読みやすい文章を書くのは最低限のマナーだと思ってください
読みにくい文章を書いて無視されたとしてもしょうがないです(無視する方も悪いですが)文章を書いた後は、読み手になったつもりで読みやすいかチェックするクセをつけておくと良いです
(ちょっとした手間ですが、長期的な効果は大きいです)とりあえず以下のルールを守っておけば大きく外しません
- お願いごと1つ
- お願いごとについての説明3つまで(箇条書き)
- 補足は最後に(ここから下が補足とわかるように)
例)
MacBookを買ってください
・ MacBookがないと悲しいです
・ MacBookがあれば生産性が上がります
・ MacBookがあればオフィスの雰囲気が良くなります
---以下補足---
つらつら・・・?♂️ 運動する
?「えーっ、学習に関係ないやーん」
と思った方は考えを改めましょう
運動によるメリットはいろいろありまして、ざっくり書くと以下の3点です
- 脳の可塑性を高める(記憶領域を確保してくれる)
- メンタルを改善してくれる(ストレス解消)
- 集中力を高める
とまあ、効率よく学習したいのであれば運動しない理由はないことがわかるかと思います
運動習慣がない方は、まずはウォーキングから始めてみると良いかと
(歩くだけでもそれなりに効果はありますので)運動のメリットについて詳しく知りたい方は「脳を鍛えるには運動しかない! 最新科学でわかった脳細胞の増やし方」を読んでみると良いでしょう?
最後に
いろいろ書きましたが、どれも一朝一夕で身に付けられるものではありません
また、冒頭で人の能力の違いはせいぜい2〜3倍と書きましたが、これまで培った力についてはそれ以上に開きがある可能性があります
(↑未学習・未経験の状態といえども、深い思考習慣がある人/ない人、学習習慣がある人/ない人、やり抜く力がある人/ない人などなど、さまざまな人がいるので)
学習する上での基礎スキルが足りない人はそこも合わせて強化していく必要があるので、その分時間がかかるのはしょうがないです
(未経験からでも習得スピードに差があるのは才能以外にもこの辺の影響も大きいということです)とはいえ、プログラミングをある程度習得することに関しては、国立大学に合格することに比べたら遥かに難易度は低いと思われますので、挑戦したい気持ちがあるのであれば簡単に諦めないほうが良いかと思います
また、筆者自身も日々改善したり反省したりしながら業務をこなしており、一度身についたら終わりというものでもありません
これまでの自分を呪って学習を諦めるのは自由ですが、ちょっとした意識を変えるだけでそのへんに転がってる中級者たちは余裕で追い越せるはずなので、コツコツやっていきましょう ?♀️
補足
何がなんでも諦めるなということではありませんこんな苦労してまでエンジニアになりたくないと思うなら諦めれば良いですし、どうしても市場価値の高いエンジニアになりたいと思うのであれば、多少の苦労はあってもやり抜いてみましょうというお話でした
ここまで読んでいただきありがとうございます。
ご意見やご質問などあればコメントしていただければと思いますTwitterでも日々本の内容やプログラミング関係の情報発信しているので、良かったらフォローしてください
(アカウントはこちら)
オススメ書籍・外部サイトまとめ
書籍
- やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける
- マインドセット「やればできる! 」の研究
- 使える脳の鍛え方 成功する学習の科学
- リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
- 脳を鍛えるには運動しかない! 最新科学でわかった脳細胞の増やし方
外部サイト
- 投稿日:2021-03-29T17:37:47+09:00
collection_check_boxes を用いた中間テーブルのコールバック
collection_check_boxes を用いて中間テーブルを削除した際に、中間モデルの after_destroy のコールバックを実行したかったが上手くいきませんでした。
モデル
class Route < ApplicationRecord belongs_to :user has_many :route_spots, dependent: :destroy has_many :spots, through: :route_spots end class Spot < ApplicationRecord belongs_to :user has_many :route_spots, dependent: :destroy has_many :routes, through: :route_spots end class RouteSpot < ApplicationRecord belongs_to :route belongs_to :spot after_destroy :align_sequence private def align_sequence self.route.route_spots.order(sequence: "ASC").each_with_index{ |object, index| object.sequence = index + 1 object.save } end endコントローラ
routes_controller.rbclass RoutesController < ApplicationController before_action :authenticate_user! before_action :set_id, only: %i[edit destroy update show] ...省略 def edit @my_spots = current_user.spots end def update if @route.update(route_params) redirect_to routes_path(anchor: "id_#{@route.id}"), notice: "「#{@route.name}」を編集しました" else render :edit end end ...省略 private def route_params params.require(:route).permit(:id, :name, :memo, :sequence, spot_ids:[]) end def set_id @route = Route.find(params[:id]) end endview
views/routes/edit.html.slim= form_with model: route, local:true, id:"route_form" do |f| = f.label :name = f.text_field :name, id: 'route_name' = f.label :memo = f.text_area :memo, id: 'route_memo' = f.collection_check_boxes(:spot_ids, @my_spots, :id, :name) = f.submit '登録する' , class:'button-primary'やりたかったこと
動作自体は、Route の edit 時に、has_may な Spots の登録/登録解除を、collection_check_boxes で簡単に実装しただけのなんてことのないもの。
やりたかったのは、collection_check_boxes でチェックを外して route を update (routeのupdate と同時に route.route_spots が destroy)した際に、RouteSpotモデルの after_destroy で メソッドalign_sequence を実行したかった。しかし、after_destroy、before_destroy、どちらでも動作せず、ただ RouteSpot の destroy が完了するだけでした。
- 下記の記事を辿ると、どうにも Rails が持っているバグとのこと。
- githubのissueを見ると、どうも放置されて close しているっぽいです。状況が限定的すぎだからでしょうか。
- RouteSpot の after_destroy、before_destroyは動作しなかったが、試しにafter_createを書いてみたら、そちらは問題なく動いたので、やはりコールバック全てが動作しない訳ではなく、destroy関連のみが動かないようです。
結論
あまり良いとは言えないかもしれないですが、RouteSpot のコールバック(after_destroy)ではなく、Route のコールバック(after_update)ので処理することにしました。
もともと、route.route_spots に対し一括で連番を振り直すというものだったので、ひとまずやりたいことは問題なく動作しますので、今回はこれで妥協します。仕様と言われたら納得いきますが、バグ、しかも長期にわたって放置されているものとだと思うとちょっと微妙な気持ちです。
- 投稿日:2021-03-29T16:43:32+09:00
if → unlessへの書き換え
初めに
rubyの問題を私なりの解説で解いていこうと思います。
問題
次のif文をunlessというメソッドを用いて書き換えてください。
if a + b > 0 puts "計算結果は0より大きいです" endではまず用語について説明していきたいと思います。
unlessとは
unlessとはif文とは逆でfalseの場合に処理が実行されます。公式リファレンスもあるのでそちらもご覧ください。
公式リファレンス解答
解答は簡単です。if文と逆となので計算式を逆にしifをunlessにすればいいのです。
unless a + b < 0 puts "計算結果は0より大きいです" end上記の文で正解っぽく見えますが実はこれは不正解になります。
この場合だと0の際に条件式がfalseとなり文字列が表示されてしまいます。<を<=にして0以上とすれば0が含まれなくなります。よって以下のコードが正解になります。unless a + b <= 0 puts "計算結果は0より大きいです" end
- 投稿日:2021-03-29T16:26:36+09:00
【Ruby】先頭と末尾の空白文字を指定して取り除く方法
プログラミング勉強日記
2021年3月29日
昨日の記事ではstripメソッドの使い方について扱った。Stripメソッドは先頭と末尾の空白文字を取り除くメソッドである。今日は取り除く空白文字の位置を指定して削除する方法を簡単にまとめる。先頭の空白文字を取り除く方法
listripメソッド(listrip!メソッド)を使うと、先頭の空白文字を取り除く。listripメソッドは、取り除いた結果として新しい文字列を作成する。lstrip!メソッドは元の文字列に上書きする形で書きかえる。
使い方str = " Hello World " listripStr = str.lstrip #=> "Hello World " str = " Hello World " str.lstrip! #=> "Hello World "末尾の空白文字を取り除く方法
rstripメソッド(rstrip!メソッド)を使うと、末尾の空白文字を取り除く。rstripメソッドは、取り除いた結果として新しい文字列を作成する。rstrip!メソッドは元の文字列に上書きする形で書きかえる。
使い方str = " Hello World " listripStr = str.rstrip #=> " Hello World" str = " Hello World " str.rstrip! #=> " Hello World"参考文献
- 投稿日:2021-03-29T15:17:41+09:00
userがadminの新規登録をさせない方法
adminの新規登録を防ぐ
単純にadminの設定をしたままだと、
routesを見てもわかる通り、adminの新規会員登録ができてしまいます。つまり、管理権限を持たない一般ユーザーでも管理者アカウントを作成できてしまいます。
セキュリティーとして問題大です。解決方法としては、下記を実施。
解決方法
方法は、至って簡単です。
adminモデルファイルから:resisterableを削除models/admin:registerable, => #削除しましょう。下記が、削除後の記述になります。
models/adminclass Admin < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable,:recoverable, :rememberable, :validatable end結果
ルーティングからregitrationが消えたと思います。
terminalPrefix Verb URI Pattern Controller#Action new_admin_session GET /admin/sign_in(.:format) admin/sessions#new admin_session POST /admin/sign_in(.:format) admin/sessions#create destroy_admin_session DELETE /admin/sign_out(.:format) admin/sessions#destroy new_admin_password GET /admin/password/new(.:format) admin/passwords#new edit_admin_password GET /admin/password/edit(.:format) admin/passwords#edit admin_password PATCH /admin/password(.:format) admin/passwords#update PUT /admin/password(.:format) admin/passwords#update POST /admin/password(.:format) admin/passwords#createあとは、routesからもregitrationsを消しておきましょう。
特に影響はないと思いますが、不要な記述は削除しておくべきかと思います。routesregistrations: 'admin/registrations' => #削除しましょう。下記が、削除後のルーティングになります。
routesRails.application.routes.draw do devise_for :admin, controllers: { sessions: 'admin/sessions', passwords: 'admin/passwords', }以上、たにーでした。
参考文献
- 投稿日:2021-03-29T15:17:41+09:00
ユーザーに管理者アカウントの新規登録をさせない方法
adminの新規登録を防ぐ
単純にadminの設定をしたままだと、
routesを見てもわかる通り、adminの新規会員登録ができてしまいます。つまり、管理権限を持たない一般ユーザーでも管理者アカウントを作成できてしまいます。
セキュリティーとして問題大です。解決方法としては、下記を実施。
解決方法
方法は、至って簡単です。
adminモデルファイルから:resisterableを削除models/admin:registerable, => #削除しましょう。下記が、削除後の記述になります。
models/adminclass Admin < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable,:recoverable, :rememberable, :validatable end結果
ルーティングからregitrationが消えたと思います。
terminalPrefix Verb URI Pattern Controller#Action new_admin_session GET /admin/sign_in(.:format) admin/sessions#new admin_session POST /admin/sign_in(.:format) admin/sessions#create destroy_admin_session DELETE /admin/sign_out(.:format) admin/sessions#destroy new_admin_password GET /admin/password/new(.:format) admin/passwords#new edit_admin_password GET /admin/password/edit(.:format) admin/passwords#edit admin_password PATCH /admin/password(.:format) admin/passwords#update PUT /admin/password(.:format) admin/passwords#update POST /admin/password(.:format) admin/passwords#createあとは、routesからもregitrationsを消しておきましょう。
特に影響はないと思いますが、不要な記述は削除しておくべきかと思います。routesregistrations: 'admin/registrations' => #削除しましょう。下記が、削除後のルーティングになります。
routesRails.application.routes.draw do devise_for :admin, controllers: { sessions: 'admin/sessions', passwords: 'admin/passwords', }以上、たにーでした。
参考文献
- 投稿日:2021-03-29T13:50:50+09:00
【Rails】SendGridでメール送信(2021年3月)
SendGridの仕様がもろもろ変わったっぽいので改めて使い方をまとめる。
アカウント作成
うろ覚えだけど、日本の代理店(構造計画研究所)を通して契約すると、「サービス提供者のドメインのメールアドレスから申し込まない」みたいな制約があった記憶。受託開発とかだと面倒。
なので代理店を遠さずに、以下のURLからアカウントを作成した。
確認用メールが届くのでリンクを踏んで有効化。
sender identity(差出人情報)の登録
指示の通り、sender identityの登録を登録する。
「Create a single sender」「Authenticate a domain」の2つの方法があるけど、前者が推奨とのこと。
- From Name
- 受信者に表示される差出人名
- From Email Address
- メール送信者のメールアドレスとして表示される
- このアドレスの持ち主かチェックするため、登録後このアドレスに確認メールが届く
- リンク踏めばログインしなくてもverifyできる
- Reply to
- 受信者が返信する時の宛先にセットされるアドレス
- Nickname
- 差出人情報を一意に識別するための名前
- この名前がメール受信者に表示されることはない
なお、このページを再度表示したい時は
Marketing Campaigns
>Senders
からアクセスできる。
Railsアプリからメールを送信
メール送信の2種類の方法
SendGridを使ったメール送信には「Web API」「SMTP」の2種類の方法がある。公式はWeb APIを推奨している。
注意点として、Web APIを使うと、ActionMailerを使ったメール送信が難しくなる。
https://github.com/eddiezane/sendgrid-actionmailer
https://techracho.bpsinc.jp/yamada/2018_12_22/67222
上記のように、WebAPIを使いながらActionMailerで送信するgemや手法がいくつかヒットしたが、私のRails6の環境ではうまくいかなかった。今回は、Web APIを使い、Action Mailerは使わずにメールを送信することにした。
APIキーを取得
Email API
>Integration Guide
>Web API
>Ruby
を選択2.Create an API key
にAPIキーの名前(なんでも良い)を入力しCreate key
をクリック- 表示されたAPIキーを環境変数に保存
gemをインストール
Gemfilegem 'sendgrid-ruby'$ bundle installメール送信処理を実装
$ touch app/models/send_email.rbapp/models/send_email.rbclass SendEmail require 'sendgrid-ruby' include SendGrid def self.test_email from = Email.new(email: 'dev@example.jp') # SendGridの管理画面でSenderに登録したアドレス to = Email.new(email: 'hogehoge@gmail.com') # 送信したいアドレス subject = 'テストホゲホゲ' content = Content.new(type: 'text/plain', value: 'ハローハロー') mail = Mail.new(from, subject, to, content) sg = SendGrid::API.new(api_key: ENV['SENDGRID_WEB_API_KEY']) response = sg.client.mail._('send').post(request_body: mail.to_json) end end送信テスト
$ rails c > SendEmail.test_email => #<SendGrid::Response:0x00erererc9650 @body="", @headers= {"server"=>["nginx"], "date"=>["Mon, 29 Mar 2021 02:47:15 GMT"], "content-length"=>["0"], "connection"=>["close"]メールが届くことを確認
その他
メール送信のオプションは以下のAPI仕様書を確認
メール内のリンクがsendgrid用に置換されるのが嫌な場合、
Settings
>Tracking
>Click Tracking
設定から無効化できる。
- 投稿日:2021-03-29T12:38:10+09:00
gemの特定のバージョンが配信停止になった時の対処法(the author of mimemagic 0.3.5 has removed it)
エラー文
Fetching gem metadata from https://rubygems.org/............ Your bundle is locked to mimemagic (0.3.5), but that version could not be found in any of the sources listed in your Gemfile. If you haven't changed sources, that means the author of mimemagic (0.3.5) has removed it. You'll need to update your bundle to a version other than mimemagic (0.3.5) that hasn't been removed in order to install.大事な部分切り取る
that means the author of mimemagic (0.3.5) has removed it. You'll need to update解決方法
bundle update mimemagic
- 投稿日:2021-03-29T12:34:00+09:00
Rails 6にTailwindCSSを導入して失敗【メモ書き】
背景
新しいアプリ(ボートフォリオ用)を作成のためTailwind CSSを導入に挑む
新たな技術を学んでサクサク作れるようになれればよき
今回もQiitaさんに投稿されている方々にお世話になりました、ありがとうございます参考文献
Tailwind on Rails
RailsにTailwindCSSを導入開発環境
- Ruby 3.0.0
- Rails 6.1.3.1
- tailwindcss 2.0.4
作業工程
まずは@d0ne1sさんが投稿してくださった「Tailwind on Rails」の手順で進める
$ yarn add tailwindcss $ yarn tailwindcss init $ mkdir app/javascript/css $ touch app/javascript/css/tailwind.cssapp/javascript/css/tailwind.css@import "tailwindcss/base"; @import "tailwindcss/components"; @import "tailwindcss/utilities";app/javascript/packs/application.jsimport Rails from "@rails/ujs" import Turbolinks from "turbolinks" import "channels" import '../css/tailwind.css'; // 追記 Rails.start() Turbolinks.start()postcss.config.jsmodule.exports = { plugins: [ require('postcss-import'), require('postcss-flexbugs-fixes'), require("tailwindcss"), // 追記 require("autoprefixer"), // 追記 require('postcss-preset-env')({ autoprefixer: { flexbox: 'no-2009' }, stage: 3 }) ] }app/views/layouts/application.html.erb// 削除 <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> // 追記 <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>これで準備は整ったはず!!
では動作確認を行うため準備を・・・・app/views/tests/index.html.erb<div class="max-w-sm mx-auto bg-white shadow-lg rounded-lg overflow-hidden"> <div class="sm:flex sm:items-center px-6 py-4"> <img class="block mx-auto sm:mx-0 sm:flex-shrink-0 h-16 sm:h-24 rounded-full" src="https://randomuser.me/api/portraits/women/17.jpg" alt="Woman's Face"> <div class="mt-4 sm:mt-0 sm:ml-4 text-center sm:text-left"> <p class="text-xl leading-tight">Erin Lindford</p> <p class="text-sm leading-tight text-gray-600">Customer Support Specialist</p> <div class="mt-4"> <button class="text-purple-500 hover:text-white hover:bg-purple-500 border border-purple-500 text-xs font-semibold rounded-full px-4 py-1 leading-normal">Message</button> </div> </div> </div> </div>動作確認
では準備が出来たので「rails s」っと
あ、うまくいってませんでした・・・・
うまくいくと下記のサイトに載ってる状態になるみたいです
RailsでTailwind CSSを使用する作業工程2
次に@kazuya_minei109さんが投稿してくださったRailsにTailwindCSSを導入の手順も行う
デフォルトで入っているWebpackerを削除して、
新しいWebpackerを追加を実施$ yarn remove @rails/webpacker $ yarn add rails/webpacker#b6c2180gem spring アンインストールを実施
$ bundle exec gem uninstall spring# gem 'spring' #念の為にコメントアウト$ bundle install次に、TailwindsCSS、PostCSS、Autopfrefixer、Tailwindプラグインをインストール
yarn add tailwindcss postcss autoprefixer @tailwindcss/forms @tailwindcss/typography @tailwindcss/aspect-ratio上手くいってるな・・・・
少し調査
ここから場合分けで色々試してみた結果
- デフォルトで入っているWebpackerを削除
- 新しいWebpackerを追加を実施
- PostCSSのインストール
$ yarn remove @rails/webpacker $ yarn add rails/webpacker#b6c2180 $ yarn add postcss上記が必要であった
下記の
「tailwindcss」は既にインストール済であったこと
「autoprefixer」は postcss.config.jsに追記してあったこと
「@tailwindcss/〜」はtailwindsccのプラグイン各種をインストールすること
そのため、あまり関係ないかと思いますさいごに
PostCSSについても少し調べてみた
Rails & Webpacker環境でPostCSSを使う
しかし、理解が追いつきませんでした!!
少しずつ学んでいくしかないかな参考文献
Tailwind on Rails
RailsにTailwindCSSを導入
RailsでTailwind CSSを使用する
Rails & Webpacker環境でPostCSSを使う
- 投稿日:2021-03-29T11:47:56+09:00
【エラー】自動デプロイの際のエラー【AWS】
Aws::Sigv4::Errors::MissingCredentialsError
アプリを自動デプロイした際、下記のようなエラーが出現。
※アプリのサーバには、EC2、unicorn、Nginxを利用Aws::Sigv4::Errors::MissingCredentialsError: Cannot load `Rails.config.active_storage.service`: missing credentials, provide credentials with one of the following options: - :access_key_id and :secret_access_key - :credentials - :credentials_provider※上記のエラー内容は下記の方法にて確認した。
(ターミナルにて、EC2にログインし下記コマンドを入力。)[ec2-user@ip-000-00-0-000 アプリ名]$ cd current [ec2-user@ip-000-00-0-000 current]$ cd log [ec2-user@ip-000-00-0-000 log]$ cat unicorn.stderr.log結論
EC2の環境変数にAWSのアクセスキーが設定がされておらず、デプロイ時にActive storageが読み込まれなかった事が原因。
【EC2に環境変数の設定を行う方法】
EC2にログインした状態で下記コマンドを入力。[ec2-user@ip-000-00-00-000 ~]$ sudo vim /etc/environmenti を入力し、入力モードに変更。
AWS_ACCESS_KEY_ID='Access key ID' AWS_SECRET_ACCESS_KEY='Secret access key'アクセスキーの入力が完了したら、「esc」キー → 「:wq」の順に入力。
設定した環境変数が反映されているかを確認する為、exitコマンドにてログアウト。[ec2-user@ip-172-31-23-189 ~]$ exit
- 投稿日:2021-03-29T10:43:37+09:00
mapとeachの違い
map
配列の入った変数.map {|変数名| 処理内容 }
food = ["fish", "beef", "banana","potato"] food.map {|a| a.length} #元の配列の変更していない #戻り値は [4, 4, 6, 6]map!(破壊的メソッド)
配列の入った変数.map! {|変数名| 処理内容 }
food = ["fish", "beef", "banana","potato"] food.map! {|a| a.length} #元の配列の変更している #戻り値は [4, 4, 6, 6]each(mapとの違い)
food = ["fish", "beef", "banana","potato"] food.each {|a| a.length} #戻り値がもとの配列を返す #戻り値は ["fish", "beef", "banana","potato"]
- 投稿日:2021-03-29T10:29:02+09:00
特定条件のみに呼応するプログラムの作成
初めに
rubyの練習問題を私なりの解説で解いてこうと思います。
練習問題
今日の曜日を表示するコードをDateクラスを使用して記述してください。
ただし、金曜日だった場合だけ以下のように表示の内容を変えてください。
(出力内容)
「今日は月曜日」
「今日は金曜日だ !!!」まずはDateクラスについてまとめてきます。
Dateクラス
Dateクラスとはrubyの標準ライブラリの1つです。標準ライブラリとはruby本体をインストールした時に自動でインストールされるクラスやモジュールのことです。
Dateクラスの読み込み
Dateクラスは日付や曜日を取得することができます。初めにDateクラスを使うにはためにはDateクラスを使用しますと宣言する必要があります。よって以下の文をコードの初めに書きDateクラスを使用することを宣言します。
require "date"上記の記述によりDateクラスをライブラリから読み込みました。
次に今日の曜日を取得します。
曜日の取得は以下のような記述になります。Date.today.wdayちなみにwdayは曜日を取得することができるDateクラスに用意されているメソッドです。曜日を整数の0(日曜日)から6(土曜日)まで取得します。
しかしこのままでは使えないので上記の記述を変数dayに代入します。day = Date.today.wday上記の記述で曜日に合わせて整数を取得することができるようになりました。しかし整数だけで文字列がありません。よって配列daysを定義します。そしてその中に整数に合わせて曜日を格納します。
days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"]さて、ここまでで準備は完了です。
あとはif文を使用して問題文のような出力内容になるように記述するだけです。問題の解答
今回は金曜日の場合のみ『今日は金曜日だ!!!』と出力します。まずはif文を使い金曜日の時に上記の内容が出力されるように記述します。
if day == 5 puts "今日は#{days[day]}だ!!!"ポイントとしては曜日は日曜日から順番で0から数えることです。私は1から数えてよく間違えました。
あとは金曜日以外の記述をelseを使い記述します。else puts "今日は#{days[day]}" end解答全体のコード
require "date" day = Date.today.wday days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"] if day == 5 puts "今日は#{days[day]}だ!!!" else puts "今日は#{days[day]}" end以上です。
初学者なのでもし間違いなどありましたご指摘お願いします。
- 投稿日:2021-03-29T10:24:41+09:00
【docker】docker-compose build したらERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 7
railsアプリにローカル環境にdockerを導入していました。buildしようと、
docker-compose build
を実行したら、このようなエラーがでました。Your bundle is locked to mimemagic (0.3.5), but that version could not be found in any of the sources listed in your Gemfile. If you haven't changed sources, that means the author of mimemagic (0.3.5) has removed it. You'll need to update your bundle to a version other than mimemagic (0.3.5) that hasn't been removed in order to install. ERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 7
どうも、mimemagicというgemが悪さしてそうで、調べてみると0.3.5はyanked(公開停止)されているようでした。
対策
gem mimemagicをアップデートする。
$ bundle update mimemagicちなみにDOCKERFILEはこのように書いていました。
FROM ruby:2.6.6 RUN apt-get update -qq && \ apt-get install -y build-essential \ libpq-dev \ nodejs RUN mkdir /app_name ENV APP_ROOT /app_name WORKDIR $APP_ROOT ADD ./Gemfile $APP_ROOT/Gemfile ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock RUN gem install bundler RUN bundle install ADD . $APP_ROOT参考
- 投稿日:2021-03-29T09:42:48+09:00
SNS認証を導入する Rails6
rails6にSNS認証を導入する
まずomniauthをgemに書き込む。
gem 'omniauth-facebook' gem 'omniauth-google-oauth2' gem "omniauth-rails_csrf_protection" gem 'omniauth', '~>1.9.1'上記を記述してbundle installを行います
今回はfacebookとgoogleのomniauthを導入するので、その2つとomniauth-rails_csrf_protectionというGemをインストールして脆弱性の対策を行います。% vim ~/.zshrc # インサートモードに移行し、下記を追記 export FACEBOOK_CLIENT_ID='メモしたアプリID' export FACEBOOK_CLIENT_SECRET='メモしたapp secret' export GOOGLE_CLIENT_ID='メモしたクライアントID' export GOOGLE_CLIENT_SECRET='メモしたクライアントシークレット' # esc,:wqと入力して保存して終了 % source ~/.zshrc # 環境変数の読み込みconfig/initializers/devise.rbDevise.setup do |config| # 省略 config.omniauth :facebook,ENV['FACEBOOK_CLIENT_ID'],ENV['FACEBOOK_CLIENT_SECRET'] config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'],ENV['GOOGLE_CLIENT_SECRET'] endアプリ側で環境変数を読み込む記述をする
SNS認証のレスポンスを保存する
% rails g model sns_credential
db/migrate/XXXXXXXXXXXXXXXX_create_sns_credentials.rbcreate_table :sns_credentials do |t| t.string :provider t.string :uid t.references :user, foreign_key: true t.timestampsuidやproviderを保存。Userモデルとのアソシエーションのために、外部キーとしてuser_idを持たせておく。db:migrateを実行する。
deviseでOumniAuthを使用する
models/user.rbclass User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :omniauthable, omniauth_providers: [:facebook, :google_oauth2] has_many :sns_credentialsomniauth_providers: [:facebook, :google_oauth2]と記述することで、FacebookとGoogleのOumniAuthを使用する。SnsCredentialモデルのアソシエーションも設定する。
models/sns_credential.rbclass SnsCredential < ApplicationRecord belongs_to :user, , optional: true endoptional: true とは、レコードを保存する際に、外部キーの値がない場合でも保存ができるオプション。
deviseを再設定
ターミナルで、rails g devise:controllers usersを実行した後以下のように編集する。生成したコントローラーを使用させるためにdeviseのルーティングを変更。
config/routes.rb# 上略 devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks', registrations: 'users/registrations' }アクションの定義
controllers/users/omniauth_callbacks_controller.rbdef facebook authorization end def google_oauth2 authorization end private def authorization sns_info = User.from_omniauth(request.env["omniauth.auth"]) @user = sns_info[:user] if @user.persisted? #ユーザー情報が登録済みなので、新規登録ではなくログイン処理 sign_in_and_redirect @user, event: :authentication else #ユーザー情報が未登録なので、新規登録画面へ遷移する @sns_id = sns_info[:sns].id render template: 'devise/registrations/new' end endUserモデルから返ってきた値を@userに代入。(モデルの処理は後述)
if @user.persisted?でユーザー情報が登録されているか否かで条件分岐。
@Userには「nickname」と「email」の情報をもたせて、SNS認証の判断はsns_idで行う為、idだけビューで扱えるようにする。views/users/new.html.erb<%= link_to "Facebookで登録", user_facebook_omniauth_authorize_path, method: :post%> <%= link_to "Googleで登録", user_google_oauth2_omniauth_authorize_path, method: :post%> <%= link_to 'Facebookでログイン', user_facebook_omniauth_authorize_path, method: :post%> <%= link_to 'Googleでログイン', user_google_oauth2_omniauth_authorize_path, method: :post%>記述したアクションが呼び出されるように、ビューを編集する。
モデル内にメソッドを定義する
models/user.rbdef self.from_omniauth(auth) sns = SnsCredential.where(provider: auth.provider, uid: auth.uid).first_or_create # SNS認証を行ったことがあるかを判断して、データベースに保存 user = User.where(email: auth.info.email).first_or_initialize( nickname: auth.info.name, email: auth.info.email ) # SNS認証を行っていなかった場合、メールアドレスで検索 # userが登録済みであるか判断 if user.persisted? sns.user = user sns.save end { user: user, sns: sns } endsns = の中でsns認証したことがあればアソシエーションで取得しています。
user = の中でemailでデータベースに保存するかbuildするか判断する。first_or_initializeはwhereメソッドとともに使うことで、whereで検索した条件のレコードがあればそのレコードのインスタンスを返し、なければ新しくインスタンスを作る。
persisted?で登録済みのユーザーと判断を行い処理を実行する。新規登録時は、SnsCredentialモデルに保存されるタイミングで、user_idが確定していなかったので、SnsCredentialモデルとUserモデルは紐付いていません。ログインの際に、sns.userを更新して紐付けを行います。
最終行の記述で、SNS認証を行ったかの判断をするためにsnsに入っているsns_idをビューで扱えるようにするため、コントローラーに渡します。devise/registrations/new.html.erb<%if @sns_id.present? %> <%= hidden_field_tag :sns_auth, true %> <% else %> <div class="field"> <%= f.label :password %> <% @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em> <br /> <%= f.password_field :password, autocomplete: "new-password" %> </div> <div class="field"> <%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <% end %>SNS認証を行っているか、行っていないかの条件分岐を記述する。
controllers/users/registrations_controller.rb# POST /resource def create if params[:sns_auth] == 'true' pass = Devise.friendly_token params[:user][:password] = pass params[:user][:password_confirmation] = pass end super end #省略params[:sns_auth]を取得した時だけDevise.friendly_tokenを使ってパスワードを自動生成し、あとの処理はsuperメソッドでdeviseのregistrations#createを実行する。
superでdeviseのメソッドを継承する。SNS認証は記述が複雑な部分も多く僕自身理解しきれていない箇所もあるので、今後見返したりして理解を深めていこうと思います。。
ありがとうございました。
- 投稿日:2021-03-29T08:22:17+09:00
【Rails】Rubocopによるコード解析と修正の方法(airbnb設定)
Rubocopとは
Ruby(Rails)のコードが、コーディング規約に則っているか解析し、修正までしてくれるgem(=静的コード解析ツール)。
*開発現場では、コードの可読性や統一性を保つために、企業やプロジェクト単位で「コードの書き方のルール(コーディング規約)」が設けられていることが多い。Rubocopには様々な設定がある
Rubocopが解析する際の基準となるコーディング規約は、上述の通り、あくまで企業やプロジェクト単位で決められたルールなのでバラバラですよね。
そんな中、今回はairbnbで使用されている設定を使用します。
準備
Gemfileに以下追記 +
bundle install
Gemfilegroup :development do #中略 gem 'rubocop-airbnb' end設定ファイルの作成
アプリケーションフォルダ配下(appと同じ階層)に、.rubocop.yml、.rubocop_airbnb.ymlを作成。設定ファイルの編集
.rubocop.ymlinherit_from: - .rubocop_airbnb.yml #ここにはrubocopでコード解析したくないファイルやフォルダを指定 AllCops: Exclude: - 'db/**/*' - 'bin/*' - 'config/environments/*' - 'config/application.rb' - 'config/initializers/*' - 'config/spring.rb' - 'lib/tasks/*' - 'vendor/**/*' - 'path/ruby'rubocop_airbnb.ymlrequire: - rubocop-airbnb実行
1. 違反箇所の解析
bundle exec rubocop —-require rubocop-airbnb
2. 違反箇所の修正
基本的には、検証で使用したコマンドに-aオプションをつけて、解析対象を指定すれば良いだけ。
ファイル・フォルダ指定:
bundle exec rubocop --require rubocop-airbnb -a {解析対象ファイルorフォルダ}
origin/mainと差分があるファイルを指定:
bundle exec rubocop --require rubocop-airbnb -a $(git diff $(git merge-base origin/master HEAD) —diff-filter=d —name-only)
最後に
-aオプションで自動修正してくれる違反は全てではありません。また、公式ドキュメントでも-aは実験的オプションとありますので、使用には注意してください。
- 投稿日:2021-03-29T06:14:57+09:00
【docker】db:createすると、Plugin caching_sha2_password could not be loaded...のエラーハマった話
背景
railsで作成中のアプリに、開発環境にDockerを導入していました。
DBをcreateしようとするも下記エラー
コンテナのビルドは問題なく出来たので、次にDBを作成するべくこのコマンドを実行したら、下記のエラーに遭遇しました。
$ docker-compose run web bundle exec rake db:create Creating network "golfscore_default" with the default driver Creating golfscore_db_1 ... done Creating golfscore_web_run ... done Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory Couldn't create 'golfscore_development' database. Please check your configuration. rake aborted! Mysql2::Error::ConnectionError: Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory原因と対策
Mysql 8以降、認証プラグインの仕様が変わったためのようです。
ユーザーのプラグインをmysql_native_passwordに変更していきます。docker内のmysqlにログインし、plugin変更
まずはコンテナ内のMysqlにログインするため、コンテナIDを調べます。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bcc91696ca70 mysql:8.0.23 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 33060/tcp, 0.0.0.0:4306->3306/tcp golfscore_db_1コンテナIDがわかったので、入ります。
$ docker exec -it bcc91696ca70 bash入れました。Mysqlに入ります。
root@bcc91696ca70:/# mysql -uroot -pMysqlのパスワードを入力します。
Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 8.0.23 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.このコマンドを実行して、現在のプラグインの状況を確認します。
mysql> SELECT user, host, plugin FROM mysql.user;やはり、caching_sha2_passwordになっています。今回はこれが悪さしているようですので、変更していきます。
下記、2コマンド実行して、root user部分の2箇所を変更します。
('password'部分は各自DBのパスワードを入力)mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; Query OK, 0 rows affected (0.01 sec)mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; Query OK, 0 rows affected (0.01 sec)変更できたか確認してみます。
mysql> SELECT user, host, plugin FROM mysql.user;無事、mysql_native_passwordに変更されています。
再度、DBを作成し、無事に成功しました。
$ docker-compose run web bundle exec rake db:create Creating golfscore_web_run ... done Created database 'golfscore_development' Created database 'golfscore_test'参考
- 投稿日:2021-03-29T02:30:33+09:00
Rubyとは
Rubyとは
プログラミング言語の一種です。
作者がまつもとひろゆきさんという日本人であることもあり、
日本語のドキュメントが豊富で、プログラミングを学んだことのない方でも比較的学びやすい
言語といえます。Rubyのメリット
Rubyはインタプリタ型言語です。コードはコンピューターが理解できるように翻訳した後実行されますが、
インタプリタ型言語はコードを一つずつ随時翻訳してくれます。(コンパイル型言語は実行前に全てを翻訳して実行します)
インタープリタ方式であるRubyはコードを手軽に実行し確認することができます。
Rubyはオブジェクト指向な言語であり、あらゆるものがオブジェクトとして扱われ
開発効率が良いと定評があります。
またRubyは他の言語に比べ記述量が少なく、初学者にも学びやすい言語です。Rubyのデメリット
Rubyはインタプリタ型言語の為、コンパイル型言語に比べると実行速度が遅くなってしまいます。
また記述の自由度が高く、ある機能に対して様々記述ができる為、記述者のレベルによって
記述の仕方に差が出てしまいます。まとめ
Rubyは日本人が作った言語であり、比較的学習ハードルの低い言語だと思います。
デメリットはあるものの、WebサイトやWebアプリなど様々な開発に利用でき、
利用者の多いメジャーな言語でもあるので、プログラミング初心者が学ぶ最初の言語に適していると思います。