GitHubのPersonal Access Tokenが期限切れした場合の対処

なぜ記事を書こうと思ったか

ターミナル下でGitHubにpushをしようとした際に以下のようなエラーが確認された。

  remote: Invalid username or password.
  fatal: Authentication failed for 'https://github.com/{ユーザー名}/{リポジトリ名}/'

認証に失敗して、pushができない、、

このエラーはGitHubでPersonal Access Tokenを設定して、期限が切れた場合に発生するエラーになります。

エラー対処を何回かしていて、その度に少し調べていたので、備忘録として記事に残します。

エラー対処

1. まず、最初にブラウザでGitHubにログインをしてください。

2. ログイン後、右上のプロフィール画像をクリックし、[settings]を選択後、Developper settingsの欄を開いてください。

3. [Personal access tokens]の欄を開き、有効期限切れになったトークンの「Expires on [日時]」を選択して下さい。

スクリーンショット 2022-03-20 16 33 25

4. パスワードの入力を求められるので、アカウントを作成した際のパスワードを入力してください。

5. 「Expiration」で有効期限を設定できます。無制限も設定できますが、脆弱性につながる恐れがある為、有効期限を設定する事をおすすめします。(私の場合は、3ヶ月で設定しています。)

6. 「Regenerate token」をクリックし、新しいトークンを生成して下さい。(※トークン生成後のみでしかトークンの値が確認できない為、必ずお使いのPCのメモ帳などに残しておくようにして下さい。)

7. ターミナルに移動し、`git push`をして下さい。

8. ユーザー名とパスワードの入力を求められるので、GitHubのユーザー名と新しく生成したトークンの値を入力して下さい。

 

これで私の場合は、問題なくpushすることができました!フゥ〜...

最後に

今回は、何回か対処したことがあったので、何のエラーか直ぐに理解できたのですが、最初は「pushできないんだけどぉぉ〜!!何でだよぉ〜!」と焦ってました笑

この記事を見て、参考にして頂けたら嬉しいです。

今回の手順以外の方法もあるので、今回の記事で対処できなかった場合は、他の記事も活用してみて下さい。

ここまで読んで頂き有難うございました〜。

参考記事

Railsアプリでのマイグレーションエラーまとめ

概要

Railsアプリでmigrateする際のエラーの対処をまとめる。

エラー対処

Mysql2::Error: Duplicate column name 【カラム名

カラムが重複してるからmigrateできないという意味

原因

ブランチを行き来したことで起こったのですが、原因は分かっていません。分かり次第、更新します!

エラー解決

1. 重複しているカラムを保存しようとしているマイグレーションファイルを見つける。

  class AddCoulmnToOrganizationKeywords < ActiveRecord::Migration[6.1]
    def change
      add_column :users, :name, :string
    end
  end

2. そのマイグレーションファイルの中身をchangeメソッドを空にする。

  class AddCoulmnToOrganizationKeywords < ActiveRecord::Migration[6.1]
    def change
      # 空にする
    end
  end

Mysql2::Error: Can't DROP 【インデックス名】; check that column/key exists

【インデックス名】が削除できないから、カラム等を確認してほしいという意味

原因

エラー解決

1. エラーが起こった【インデックス名】で活用しているカラムを持つマイグレーションファイルをmigrateする。

rails db:migrate VERSION=【マイグレーションID】

2. 1.のマイグレーションファイルに依存したマイグレーションファイルを先にロールバックする。

rails db:migrate:down VERSION=【マイグレーションID】

3. 1.のマイグレーションファイルをロールバックする。

Mysql2::Error: Table 【テーブル名】 doesn't exist

【テーブル名】が存在しませんという意味

原因

エラー解決

1. エラーが起こった【テーブル名】を持つマイグレーションファイルをmigrateする。

rails db:migrate VERSION=【マイグレーションID】

2. 1.のマイグレーションファイルに依存したマイグレーションファイルを先にロールバックする。

rails db:migrate:down VERSION=【マイグレーションID】

3. 1.のマイグレーションファイルをロールバックする。

Index name 【インデックス名】 on table 【テーブル名】 is too long; the limit is 64 characters

【テーブル名】の中の【インデックス名】が長過ぎるから64文字までに抑えてという意味

原因

    class CreateTableAs < ActiveRecord::Migration[6.1]
      def change
        create_table :table_a do |t|
          t.references :table_b
        end
      end
    end
  
  • rails db migrateを行う。
  • t.references で知らない内にインデックスが作成されようとする。(今回の場合は、index_table_a_on_table_b_idが作成される。)
  • インデックス名が64文字以上あり、エラーで弾かれる。

エラー解決①

t.referencesにindexオプションを付与し、インデックス名を指定する。

  class CreateTableAs < ActiveRecord::Migration[6.1]
    def change
      create_table :table_a do |t|
        t.references :table_b, index: { name: 'idx_table_a_on_table_b_id' }
      end
    end
  end

エラー解決②

t.referencesにindexオプションを付与し、falseを指定する。

  class CreateTableAs < ActiveRecord::Migration[6.1]
    def change
      create_table :table_a do |t|
        t.references :table_b, index: false
      end
    end
  end

最後に

改めて今回まとめた事でどういうものが出力できるか理解できました。どこか間違っている所があれば指摘して頂けると嬉しいです。
ここまで読んで下さりありがとうございました〜

参考資料

Railsのデータベースコマンドこれさえ見れば問題なし!

概要

Railsアプリでデータベースをmigrateする際の有用なコマンドをこの記事にまとめる。

migrateコマンドまとめ

ファイル作成コマンド

rails g migration クラス名`

  $ rails g migration CreateUsers
  Running via Spring preloader in process 310
    invoke  active_record
      create    db/migrate/20220913055401_create_users.rb
  • モデルファイル作成

rails g model モデル名

  $ rails g migration User
  Running via Spring preloader in process 315
      invoke  active_record
    identical    db/migrate/20220913055401_create_users.rb
      create    app/models/user.rb

本来マイグレーションファイルも作成されますが、元々モデル名に対応するマイグレーションファイルが作成されていた場合、作成はスキップされます。

データベース作成コマンド

  • database.ymlでの設定内容に基づデータベースを作成

rails db:create

  $ rails db:create
  Created database 'データベース名①'
  Created database 'データベース名②'
  • database.ymlでの設定内容に基づデータベースを作成及びseedデータを反映

rails db:setup

rails db:create と rails db:seed を行う。

マイグレーション実行コマンド

rails db:migrate

  $ rails db:migrate
  == 20220913055401 CreateUsers: migrating ==================
  -- create_table(:users)
  == 20220913055401 CreateUsers: migrated (0.2292s) =========

rails db:migrate VERSION=20220802084230

  $ rails db:migrate VERSION=20220802084230
  == 20220405101025 ChangeColumnUsers: migrating ====================================
  -- change_column(:users, :age, :integer)
    -> 0.2541s
  == 20220405101025 ChangeColumnUsers: migrated (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================

  == 20220802084230 CreateTests: migrating ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: migrated (0.2880s) ===========================

rails db:migrate:up VERSION=20220405103000

  $ rails db:migrate:up VERSION=20220405103000
  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================

rails db:migrate RAILS_ENV=◯◯

RAILS_ENVの値にproduction、testを入力することで、マイグレーションをする環境を替えられる。(デフォルトはdevelopment)

  $ rails db:migrate RAILS_ENV=production
  == 20220405101025 ChangeColumnUsers: migrating ====================================
  -- change_column(:users, :age, :integer)
    -> 0.2541s
  == 20220405101025 ChangeColumnUsers: migrated (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================

  == 20220802084230 CreateTests: migrating ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: migrated (0.2880s) ===========================

マイグレーション状況確認コマンド

rails db:migrate:status

  $ rails db:migrate:status
  Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220329033155  Create users
   up     20220329034010  Create subjects
   up     20220405101025  Change column users
   up     20220405103000  Change column subjects
   up     20220802084230  Create tests

rails db:version

  $ rails db:version
  Current version: 20220802084230

ロールバックコマンド

rails db:rollback

  $ rails db:rollback
  == 20220802084230 CreateTests: reverting ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: reverted (0.2880s) ===========================

  $ rails db:migrate:status
  Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220329033155  Create users
   up     20220329034010  Create subjects
   up     20220405101025  Change column users
   up     20220405103000  Change column subjects
  down    20220802084230  Create tests

rails db:rollback STEP=◯

  $ rails db:rollback STEP=2
  == 20220405103000 ChangeColumnSubjects: reverting ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: reverted (0.2880s) ===========================

  == 20220405101025 ChangeColumnUsers: reverting ====================================
  -- change_column(:users, :age, :integer)
    -> 0.2541s
  == 20220405101025 ChangeColumnUsers: reverted (0.2880s) ===========================

  $ rails db:migrate:status
  Status   Migration ID    Migration Name
--------------------------------------------------
   up     20220329033155  Create users
   up     20220329034010  Create subjects
  down    20220405101025  Change column users
  down    20220405103000  Change column subjects
  down    20220802084230  Create tests

rails db:migrate:down VERSION=20220329033155

  $ rails db:rollback STEP=2
  == 20220329033155 CreateUsers: reverting ====================================
  -- create_tables(:users)
    -> 0.2541s
  == 20220329033155 CreateUsers: reverted (0.2880s) ===========================

  $ rails db:migrate:status
  Status   Migration ID    Migration Name
--------------------------------------------------
  down    20220329033155  Create users
   up     20220329034010  Create subjects
  down    20220405101025  Change column users
  down    20220405103000  Change column subjects
  down    20220802084230  Create tests

マイグレーションコマンド

rails db:migrate:redo

  $ rails db:migrate:redo
  == 20220802084230 CreateTests: reverting ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: reverted (0.2880s) ===========================

  == 20220802084230 CreateTests: migrating ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: migrated (0.2880s) ===========================

rails db:migrate:redo STEP=2

  $ rails db:migrate:redo STEP=2
  == 20220802084230 CreateTests: reverting ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: reverted (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: reverting ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: reverted (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================

  == 20220802084230 CreateTests: migrating ====================================
  -- create_table(:tests)
    -> 0.2541s
  == 20220802084230 CreateTests: migrated (0.2880s) ===========================

rails db:migrate:redo VERSION=20220405103000

  $ rails db:migrate:redo VERSION=20220405103000
  == 20220405103000 ChangeColumnSubjects: reverting ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: reverted (0.2880s) ===========================

  == 20220405103000 ChangeColumnSubjects: migrating ====================================
  -- change_column(:subjects, :title, :string)
    -> 0.2541s
  == 20220405103000 ChangeColumnSubjects: migrated (0.2880s) ===========================

データベースを削除及び初期化コマンド

  • データベースを削除

rails db:drop

  $ rails db:drop
  Dropped database 'データベース名①'
  Dropped database 'データベース名②'
  • データベースを初期化する

rails db:reset

rails db:drop でデータベースを削除後、rails db:setup でseedデータを反映させたデータベースを作成

rails db:migrate:reset

rails db:drop でデータベースを削除後、rails db:create でデータベースを作成、 rails db:migrate を行う。

最後に

改めて今回まとめた事でどういうものが出力できるか理解できました。どこか間違っている所があれば指摘して頂けると嬉しいです。
ここまで読んで下さりありがとうございました〜

参考資料

会社で使用しているRubyのメソッドを簡単にまとめてみた!

なぜ記事を書こうと思ったか

Railsアプリの開発をする際に適切なメソッドを調べる時がある為、今まで知らなかった開発で使用するメソッドを中心にこの記事にまとめようと思います。

railsメソッド一覧

Regexpクラス

  • escapeメソッド

メタ文字をエスケープした結果を返す。

  pattern = Regexp.escape('1+2=3,2*3=6')
  p pattern
  # '1//+2=3,2//*3=6'

Stringクラス

  • subメソッド

文字列中で pattern にマッチした最初の部分を文字列 replace で置き換えた文字列を生成して返す。

  greeting = "I am name. My favorite food is meet."
  pattern = { "name" => "James", "meet" => "beef" }
  replaced = article.sub(/name|meet/, pattern)

  p replaced # "I am James. My favorite food is beef."

Arrayクラス

  • flattenメソッド

自身を再帰的に平坦化した配列を生成して返す。flatten! は自身を再帰的かつ破壊的に平坦化し、平坦化した場合は平坦化した自身をしてない場合は nil を返します。

  array1 = [1, 2, [3, 4], 5]
  array2 = [1, 2, 3]
  p array1.flatten # [1, 2, 3, 4, 5]
  p array1.flatten! # [1, 2, 3, 4, 5]
  p array2.flatten! # nil

Hashクラス

  • flattenメソッド

設定する引数に従って自身を平坦化した配列を生成して返します。

  hash =  {"name"=> "tanaka", "hobbies" => ["サッカー", "映画鑑賞"], "age" => 20}
  a.flatten     #=> ["name", "tanaka", hobbies, ["サッカー", "映画鑑賞"], "age", 20]
  a.flatten(1)  #=> ["name", "tanaka", hobbies, ["サッカー", "映画鑑賞"], "age", 20]
  a.flatten(2)  #=> ["name", "tanaka", hobbies, "サッカー", "映画鑑賞", "age", 20]
  a.flatten(0)  #=> [["name", "tanaka"], [hobbies, ["サッカー", "映画鑑賞"]], ["age", 20]]
  a.flatten(-1) #=> ["name", "tanaka", hobbies, "サッカー", "映画鑑賞", "age", 20]
  • has_key?

ハッシュにキーが存在するか確認する。

  hash = {"name"=> "tanaka", "hobbies" => ["サッカー", "映画鑑賞"], "age" => 20}
  hash.has_key?("name") # true
  hash.has_key?("height") # false

ハッシュに値が存在するか確認する。

  hash = {"name"=> "tanaka", "hobbies" => ["サッカー", "映画鑑賞"], "age" => 20}
  hash.has_value?(20) # true
  hash.has_value?(25) # false

JSONクラス

  • parseメソッド

JSON形式の文字列をRubyのHashオブジェクトに変換して返す

  json = "{"Name":"太郎","age":23}"
  hash = JSON.parse(json)
  p hash # {"Name"=>"太郎", "age"=>23}
  • generateメソッド

与えられたオブジェクトを一行の JSON 形式の文字列に変換して返す

  json = "{"Name":"太郎","age":23}"
  hash = JSON.generate(json)
  p hash # {\"Name\":\"太郎\", \"age\":23}

TIMEクラス

  • zoneメソッド

タイムゾーンを表す文字列を返す。

  Time.zone = 'Tokyo'
  Time.zone # #, @utc_offset=nil>
  • strftimeメソッド

時刻をフォーマット文字列に従って文字列に変換した結果を返す。

  now = Time.zone.now
  p now.strftime('%Y/%m/%d') # 2022/09/02
  • beginning_of_monthメソッド

月の初めの日付を取得

  time = Time.now
  p time.beginning_of_month # Sat, 01 Aug 2022
  • end_of_monthメソッド

月の最後の日付を取得

  time = Time.now
  p time.end_of_month # Sat, 31 Aug 2022

CGIクラス

  • escapeメソッド

与えられた文字列を URL エンコードした文字列を新しく作成し返す。

  p CGI.escape('株式会社IT')   #=> "%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BEIT"
  • unescapeメソッド

与えられた文字列を URL デコードした文字列を新しく作成し返します。

  p CGI.unescape('%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BEIT')   #=> "株式会社IT"

Exceptionクラス

  • backtraceメソッド

例外処理を行うときに、例外が発生したときのプログラムの呼び出し状況を取得する。どの部分で例外が発生したか確認できる。

  begin
    raise 'dummy'
  rescue => e
    puts e.backtrace.join("\n")
    # ["file_name.rb:2:in `method_name'", "filename.rb:2"]
  end

Sanitizationクラス

  • sanitiza_sql_like

SQL LIKEステートメント内で安全に使用できるように、 string をサニタイズし、「_」、および「%」のすべての出現をエスケープする。

User.where('name LIKE ?', "%#{ActiveRecord::Base.sanitize_sql_like("田中")}%")
  # User Load (4.4ms)  SELECT `users`.* FROM `users` WHERE (name LIKE '%田中%')

EnvironmentInquirerクラス

  • envメソッド

現在の環境を確認んすることができる

  Rails.env
  # "development"

loggerライブラリ

  • loggerメソッド

Rubyからログを出力するメソッド

  logger.debug('*debug logger')
  logger.info('*info logger')
  logger.warn('*warn logger')
  logger.error('*error logger')
  logger.fatal('*fatal logger')
  logger.unknown('*unknown logger')

  # 以下ログ出力
  D, [2017-09-22T10:08:39.414406 #16980] DEBUG -- : *debug logger
  I, [2017-09-22T10:08:39.414406 #16980]  INFO -- : *info logger
  W, [2017-09-22T10:08:39.414406 #16980]  WARN -- : *warn logger
  E, [2017-09-22T10:08:39.414406 #16980] ERROR -- : *error logger
  F, [2017-09-22T10:08:39.414406 #16980] FATAL -- : *fatal logger
  A, [2017-09-22T10:08:39.414406 #16980]   ANY -- : *unknown logger

URIライブラリ

  • encode_www_form_componentメソッド

文字列を URL-encoded form data の1コンポーネントとしてエンコードした文字列を返します。

  p URI.encode_www_form_component('エンコードしたい')
  # "%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%97%E3%81%9F%E3%81%84"

ActiveRecord

  • includesメソッド

関連するテーブルをまとめて取得

  Employee.includes(:department)
  # SELECT "employees".* FROM "employees"
  # SELECT "departments".* FROM "departments" WHERE "departments"."id" IN (1)
  • mergeメソッド

複数の条件を併合する

  question = "田中"
  User.where(age: 20)
      .merge(
        User.where('name LIKE ?',
                            "%#{ActiveRecord::Base.sanitize_sql_like(question)}%")
        .or(User.where('email LIKE ?',
                                "%#{ActiveRecord::Base.sanitize_sql_like(question)}%"))
      )
  # User Load (1.4ms)  SELECT users.* FROM `users` WHERE `age` = 20 AND (name LIKE '%田中%' OR email LIKE '%田中%')
  • maximumメソッド

カラムの最大値を返す

  User.maximum('age')
  # SELECT MAX("users"."age") AS max_id FROM "users"

1つのカラムに対して複数個の定数を持たせる為のメソッド

  enum sex: { men: 0, women: 1}
  p User.sex
  # { "men" => 0, "women" => 1}

ActiveModel

  • as_jsonメソッド

モデルをハッシュ形式のJSONに変換

  user.as_json
  # {id: 1, name: "Tanaka Taro", age: 24, created_at: "2022-08-31T17:27:133.000Z"}
  • groupメソッド

指定したカラムごとにデータをまとめることができる。

  User.group(:company_id).count
  SELECT COUNT(*) AS count_all, `users`.`company_id` AS users_company_id FROM `users` GROUP BY `users`.`company_id`
  # {1=> 22, 2=> 40}
  • eager_loadメソッド

左外部結合を使ってすべてのレコードを取得する

  User.eager_load(:company)
  # SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, ...
  # FROM "users" LEFT OUTER JOIN "companies" ON "companies"."user_id" =
  # "users"."id"

ActiveJob

  • perform_nowメソッド

同期的にSampleJobを呼び出す

  def execute_now
    puts '実行開始'
    SampleJob.perform_now('実行中')
    puts '実行終了'
  end

  # 実行開始
  # Performing SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) from Async(default) with arguments: "実行中"
  # [JOB] start: 実行中
  # [JOB] end: 実行中
  # Performed SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) from Async(default) in 3005.48ms
  # 実行終了
  • perform_laterメソッド

非同期的にSampleJobを呼び出す

  def execute_later
    puts '実行開始'
    SampleJob.perform_later('実行中')
    puts '実行終了'
  end

  # 実行開始
  # Enqueued SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) to Async(default) with arguments: "実行中"
  # Performing SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) from Async(default) with arguments: "実行中"
  # 実行終了
  # [JOB] start: 実行中
  # [JOB] end: 実行中
  # Performed SampleJob (Job ID: e6859c49-4ec4-41d2-820f-eef63615cc51) from Async(default) in 3005.48ms

最後に

改めて今回まとめた事でどういうものが出力できるか理解できました。どこか間違っている所があれば指摘して頂けると嬉しいです。
ここまで読んで下さりありがとうございました〜

参考資料