気ままに気ままのエンジニアブログ

定期的に得た知見を気ままに発信中

【Rails】rails cしたらMissing settingでエラーになった時の解決法

こんにちは。

今日は久々の晴ればれ。気分も最高だ。
その気持ちでチャリで出かけよ!と妻に言ったらやだと言われました。

どうもハチマキです。

はじめに

さて、今回はエラー解消についてのメモを書いて行こうと思います。

コンソールを開く際に出た謎のエラー。
先輩エンジニアに質問したら秒で解決しました。

本日の概要 : Missing settingでエラーになった時の解決法

事象

$ bundle exec rails cしたらMissing settingエラーになった

エラー例

$ bundle exec rails c
/Users/ユーザ名/アプリ名/vendor/bundle/ruby/2.2.0/gems/simple_form-2.1.1/lib/simple_form/inputs/boolean_input.rb:37: warning: circular argument reference - unchecked_value
/Users/ユーザ名/アプリ名/vendor/bundle/ruby/2.2.0/gems/settingslogic-2.0.8/lib/settingslogic.rb:173:in `missing_key': Missing setting 'line' in 'social_login' section in /Users/ユーザ名/アプリ名/config/settings.yml (Settingslogic::MissingSetting)
 from /Users/ユーザ名/アプリ名/vendor/bundle/ruby/2.2.0/gems/settingslogic-2.0.8/lib/settingslogic.rb:127:in `method_missing'
 from /Users/ユーザ名/アプリ名/config/initializers/devise.rb:10:in `block in <top (required)>'
 from /Users/ユーザ名/アプリ名/vendor/bundle/ruby/2.2.0/gems/devise-2.0.6/lib/devise.rb:284:in `setup'
 from /Users/ユーザ名/アプリ名/config/initializers/devise.rb:3:in `<top (required)>'
 ・
 ・
 (省略)

問題点

おそらくsettings.ymlファイルの何かが欠けている。または空の可能性がある

解決方法

settings.ymlファイルを再作成する必要があるため、settings.yml.exampleファイルをsettings.ymlファイルにコピーすれば解決

$ cd config #config配下に移動

$ cp settings.yml.example settings.yml #cpコマンドでファイルをコピーする

$ cd .. #戻る

$ bundle exec rails c
/Users/ユーザ名/アプリ名/vendor/bundle/ruby/2.2.0/gems/simple_form-2.1.1/lib/simple_form/inputs/boolean_input.rb:37: warning: circular argument reference - unchecked_value
/Users/ユーザ名/アプリ名/lib/rack/attack/notification.rb:4: warning: circular argument reference - req
/Users/ユーザ名/アプリ名/lib/rack/attack/notification.rb:19: warning: circular argument reference - ip
/Users/ユーザ名/アプリ名/config/seory/helper.rb:56: warning: circular argument reference - collection
Loading development environment (Rails 3.2.22.2)
[1] pry(main)> 

無事に動きました!

【Rails】CSVファイルをreadメソッドを用いて読み込む

こんばんは。

もうそろそろ夏ですね〜
全力で日焼け止め塗って、将来の肌質を保ちたいと思います。

どうもハチマキです。

はじめに

今回はCSVファイルの読み込み方法について、忘れないうちにメモ程度に書いていきたいと思います。

本日の概要 : CSVファイルの読み込み方法

やること

  • pathを確認してみる
$ ls  #CSVファイルの在りかを確認してみる

$ cd Desktop/  #ディスクトップにファイルを置いていたので移動する

$ pwd  #CSVファイルのpathを確認する
/Users/ユーザ名/Desktop
  • CSVファイルデータを読み込む
$ rails c  #コンソールを開く
[1] pry(main)> csv = CSV.read('/Users/ユーザー名/Desktop/update.csv', headers: true, encoding: 'sjis')
=> #<CSV::Table mode:col_or_row row_count:4005>
#ファイル全体を一度に読み込むために、readメソッドを使用する

[2] pry(main)> csv.first
=> #<CSV::Row "first_name":"hogeta" "last_name":"ho">
#1行目を取得してみる

終わり。

【Rails / チュートリアル】「rails testが動かない時」の解決法

こんにちは。

梅雨の季節は天パにとって天敵です。
せっかく髪セットしてるのに駅までの7分間ですでに髪がうねる。
それが非常に辛い。

どうもハチマキです。

はじめに

さて、今回はrailsチュートリアルを進めている中で、なぜかrails testがびくともしなくなり、固まる現象が起きました。
色々ググった結果、解消できたのでメモ程度に書いていきたいと思います。

本日の概要 : 「rails testが動かない時」の解決法

事象

$ rails testを実行したら固まる。またはエラーが発生した

エラー例

$ rails test
Running via Spring preloader in process 97274
2020-05-31 09:22:21 WARN Selenium [DEPRECATION] Selenium::WebDriver::Chrome#driver_path= is deprecated. Use Selenium::WebDriver::Chrome::Service#driver_path= instead.
Traceback (most recent call last):
 49: from -e:1:in `<main>'
 48: from /Users/ユーザ名/.rbenv/versions/2.6.4/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
 47: from /Users/ユーザ名/.rbenv/versions/2.6.4/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
 46: from /Users/ユーザ名/アプリケーション名/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.4.3/lib/active_support/dependencies.rb:285:in `load'
 45: from /Users/ユーザ名/アプリケーション名/vendor/bundle/ruby/2.6.0/gems/activesupport-5.2.4.3/lib/active_support/dependencies.rb:257:in `load_d
 ・
 ・
 (省略)

問題点

ググった結果、

springはRailsアプリケーションのプリローダーとやらで、これが機能していると、
入力したrailsコマンドの起動が次から早くなるそうですが、運が良いと固まる事があるらしい。
※仮にstopさせたとしても、railsコマンドを入力した際に自動で起動するので大丈夫らしい。

とのことで、一旦springをstopさせるため下記を実行してみる

$ spring stop
rbenv: spring: command not found

The `spring' command exists in these Ruby versions:
  2.2.4
  2.5.0

解消できず。。別のエラーが出てくる。。

解決方法

解決方法は、※「sudo」を加えて、

  1. $ sudo gem install springを実行した後
  2. $ spring stopを再度実行する

※sudoとは:スーパーユーザー(rootユーザー)の権限経由でコマンドを実行する

$ sudo gem install spring
Fetching spring-2.1.0.gem
Successfully installed spring-2.1.0
Parsing documentation for spring-2.1.0
Installing ri documentation for spring-2.1.0
Done installing documentation for spring after 0 seconds
1 gem installed

$ spring stop
Spring stopped.

無事に止まりました!
そして再度$ rails testを実行したら無事に動きました。。

$ rails test
Running via Spring preloader in process 64338
Started with run options --seed 13936

 FAIL["test_should_get_home", Minitest::Result, 6.025406999979168]
 test_should_get_home#Minitest::Result (6.03s)
        <Home | Ruby on Rails Tutorial Sample App> expected but was
        <Ruby on Rails Tutorial Sample App>..
        Expected 0 to be >= 1.
        test/controllers/static_pages_controller_test.rb:7:in `block in <class:StaticPagesControllerTest>'

 FAIL["test_should_get_contact", Minitest::Result, 6.043967999983579]
 test_should_get_contact#Minitest::Result (6.04s)
        <contact | Ruby on Rails Tutorial Sample App> expected but was
        <Contact | Ruby on Rails Tutorial Sample App>..
        Expected 0 to be >= 1.
        test/controllers/static_pages_controller_test.rb:25:in `block in <class:StaticPagesControllerTest>'

  4/4: [===================================================================================================================================] 100% Time: 00:00:06, Time: 00:00:06

Finished in 6.04579s
4 tests, 8 assertions, 2 failures, 0 errors, 0 skips

testはred(エラー)でした笑

書籍"リーダブルコード" 第3部のまとめ

こんにちは。

今月から週3日出社となり、なんか土日の有り難みをまた感じ始めました。

どうもハチマキです。

はじめに

業務で課題と感じる部分を解決するため、かの有名な「リーダブルコード」を読みました。
アウトプットとして、今回は第3部のまとめを書いていきます。

※3部では主にコードを大きく変化する技法が書かれております。

では、早速行きましょう。

本日の概要 : リーダブルコード第3部のまとめ

  • こんな方におすすめ(書籍"リーダブルコード"第1部まとめをご覧ください)
  • 第3部 コードの再構成
    • 無関係の下位問題を抽出する
    • 一度に一つのことを
    • コードに思いを込める
    • 短いコードを書く
  • 一言

第3部 コードの再構成

無関係の下位問題を抽出する

鍵となる考え
  • 関数やコードブロックをみて、「このコードの高レベルの目標は何か?」と自問する
  • コードの各行に対して「高レベルに直接的に効果があるのか?あるいは、無関係の問題を解決しているのか?」と自問する
  • 無関係の下位問題を解決しているコードが相当量あれば、それらを抽出して別の関数にする
  • 無関係の下位問題を積極的に探し出し抽出する
まとめ
  • プロジェクト固有のコードから汎用コードを分離する
    • プログラム固有の小さな核だけが残る
    • 境界線の明確な小さな問題に集中できる

一度に一つのことを

鍵となる考え
  • コードは一つずつタスクを行うようにしなければいけない
まとめ
  • 読みにくいコードがあれば、そこで行われるタスクを全て列挙する
  • タスクをどのように分割するかよりも、分割するということが大切である

コードに思いを込める

鍵となる考え
  • コードは簡単な言葉で書く
まとめ
  • コードをうまく言葉で説明できないのであれば、何かを見落としているか、詳細が明確になっていない
    • コードの動作を簡単な言葉で同僚にもわかるように説明してみる
    • その説明の中で使っているキーワードやフレーズに注目する
    • その説明に合わせてコードを書く

短いコードを書く

鍵となる考え
  • 最も読みやすいコードは、何も書かれていないコードだ
  • コードをできるだけ小さく軽量に維持する
まとめ
  • 新しいコードを書かないようにする
    • 不要な機能をプロダクトから削除する。過剰な機能は持たせない
    • 最も簡単に問題を解決できるような要求を考える
    • 定期的に全てのAPIを読んで、標準ライブラリに慣れ親しんでおく

一言

今回は、リーダブルコードの第3部についてまとめてみました。
リファクタリングなどのコード修正を意識することはまだまだできてません。
日々意識し、実践していきながら習得していきたいと思います。

                                            • -

次回は、最終部の第4部をまとめていきます。
以上、ハチマキでした。

【Rails】createの使い方

こんばんは。

もう梅雨ですね。
気持ちだけでも晴れやかに。そんなことを心掛けております。

どうもハチマキです。

はじめに

createの使い方について忘れそうなのでメモメモっと。

本日の概要 : createの使い方について

そもそもcreateとは何か?

モデルの生成と保存を同時に行うメソッド。
保存したい属性(カラム)を引数で渡すことで、正常に保存までできたら trueが、そうでない場合にはfalseが返ってくる。

使い方は2つある

createを使わない場合
store = Store.new
store.store_name = "shibuya"
store.city = "tokyo"
store.save
createを使う場合
store = Store.create(stare_name: "shibuya", city: "tokyo")

(1)あるカラムを上書きしたい場合

store = Store.find_by_store_name("yaaashibu")
store.store_name = "shibuya"
store.save

(1)をリファクタリングしてみる

store = Store.find_by_store_name("yaaashibu")
store.update_attributes(store_name: "shibuya")

1行にリファクタリングができる

補足

生成したインスタンスを使って何か処理を行いたいという場合にはnewとsaveを使う方が無難です。

書籍"リーダブルコード" 第2部のまとめ

こんにちは。

ここ数日暑すぎてもう辛い。
でも夏は好きです。

f:id:hachimaki37:20200606083345j:plain
どんな感情なん。

どうもハチマキです。

はじめに

業務で課題と感じる部分を解決するため、かの有名な「リーダブルコード」を読みました。
アウトプットとして、第2部のまとめを書いていきます。

1部では、コードの読みやすさを1行ずつ改善する方法、
2部ではより深いところに進み、コードを理解しやすくするコツが書かれております。

では、早速行きましょう。

本日の概要 : リーダブルコード第2部のまとめ

  • こんな方におすすめ(書籍"リーダブルコード"第1部まとめをご覧ください)
  • 第2部 ループとロジックの単純化
    • 制御フローを読みやすくする
    • 巨大な式を分割する
    • 変数と読みやすさ
  • 一言

第2部 ループとロジックの単純化

制御フローを読みやすくする

鍵となる考え
  • 条件やループなどの制御フローはできるだけ、「自然」にする。コードの読み手が立ち止まったり読み返したりしないように書く
    • ex) if(length >= 10), while(bytes_receive < bytes_expected) →左辺:「調査対象」の式。右辺→「比較対象」の式
  • 行数を短くするよりも、他の人が理解するのにかかる時間を短くする
    • ex) 基本的にはif/elseを使い、三項演算子はそれによって簡潔になるときだけに使う
  • 変更するときにはコードを新鮮な目で見る。一歩下がって全体を見る
まとめ
  • 比較を書くときは、変化する値を左に、より安定した値を右に配置する
  • if/else文のブロックは肯定型・単純・目立つ物を先に処理する並びに替える
  • 三項演算子・do/whileループ・gotoなどプログラミング構成要素を使うとコードが読みにくくなるため、代替えを模索する
  • 深いネストは避け、直線的なコードを選択する

巨大な式を分割する

鍵となる考え
  • 巨大な式は飲み込みやすい大きさに分割する(コードの式が大きくなれば、それだけ理解が難しくなる)
    • ex) 式を簡単に分割するには、式を表す変数を使う
  • 「頭がいい」コードに気をつける。あとで他の人がコードを読むときにわかりにくくなる
    • ex) 複雑なロジックコードになってしまったら、とにかくいつもと反対のことをやってみる
まとめ
  • 巨大な式を分割して、読み手が1つずつ読み込めるようにするためには「説明変数」を導入する
    • 巨大な式を分割できる
    • 簡潔な名前で式を説明することで、コードを文書化できる
    • コードの主要な概念を読み手が認識しやすくなる
  • 複雑なロジックを見たら、積極的に分割する(問題を否定したり、反対のことを考えてみたりする)

変数と読みやすさ

鍵となる考え
  • 変数のことが見えるコード行数をできるだけ減らす
  • 変数を操作する場所が増えると、現在値の判断が難しくなる
まとめ
  • 変数はできるだけ減らし、軽量にすることでコードは読みやすくなる
  • 邪魔な変数を削除する
  • 変数のスコープをできるだけ小さくする
  • 一度だけ書き込む変数を使う

一言

今回は、リーダブルコードの第2部についてまとめてみました。
主にコードを動かすための制御フロー・論理式・変数などのことが説明されております。

今月に入り、エンジニアになって半年が経ちます。
この半年間は目の前に必死な半年でしたが、次の半年はコードの読みやすさも意識できるような取り組みをしていきたいと思います。

                                            • -

次回は、リーダブルコードの第3部をまとめていきます。
以上、ハチマキでした。

書籍"リーダブルコード"第1部のまとめ

こんにちは。

本日からサッカー解禁!やりますよ!
この時をどれだけ待ちわびたか。。

f:id:hachimaki37:20200530092321j:plain
そう気分はもうこんな感じです。
どうもハチマキです。

はじめに

ここ最近プルリクを出した時に、良かれと思って書いたコメントについて先輩からご指摘をいただきました。

書いたコメントはこんな感じ。
# 〇〇の計算

レビュー内容はと言うと、コメントには「なぜそのようなコードにしたのか?」や「そのコードの問題点(要改善点)」などを書くようにしましょう。と。。

やってまいました。。勉強不足です。
そんな背景があり、かの有名な「リーダブルコード」を読んでみました。
今回はそのアウトプットを書いていこうと思います。

結構学びがありましたので、ぜひご参考にしていただければと思います。
では、早速行きましょう。

本日の概要 : リーダブルコード第1部のまとめ

  • こんな方におすすめ
  • 第1部 表面上の改善
    • 理解しやすいコード
    • 名前に情報を詰め込む
    • 誤解されない名前
    • 美しさ
    • コメントすべきことを知る
    • コメントは正確で簡潔に
    • 総括

こんな方におすすめ

  • エンジニアになって数ヶ月が経った方
  • 優れたコードってどんなコードなんだろ?と思っている方
  • 僕みたいにコメントなどにご指摘をいただた方
  • 良いコード、読みやすいコードを書くためのテクニックを知りたい方

などなど

第1部 表面上の改善

理解しやすいコード

鍵となる考え
  • コードは理解しやすくなければいけない
  • コードは他の人が最短時間で理解できるように書かなければいけない

名前に情報を詰め込む

鍵となる考え
  • 名前に情報を詰め込む(名前を見ただけで情報を読み取れるようにすること)
  • 気取った言い回しよりも明確で正確なほうがいい
  • 抽象的な名前よりも具体的な名前を使う
まとめ
  • 明確な単語を選ぶ
  • 汎用的な名前は避ける
  • 具体的な名前を使って、物事を追加する
  • 変数名に大切な情報を追加する
  • スコープの大きな変数には長い名前をつける
  • 大文字やアンダースコアなどに意味を含める

誤解されない名前

鍵となる考え
  • 名前が「他の意味と間違えられることはないか?」何度も自問自答する
まとめ
  • 最善の名前とは、誤解されない名前である
  • 自分が書いたコードを読んでいる人が、自分の意図を正しく理解できること
  • ex)
    • 上限の限界値を決める時:max_ / min_ を前につける
    • 包含的範囲であれば:first / lastを使う
    • ブール値に名前をつける時:is / has などを使う

美しさ

鍵となる考え
  • 一貫性のあるスタイルは「正しい」スタイルよりも大切だ
  • 優れたソースコードは目に優しいものでなければならない(使いやすい)
まとめ
  • 一貫性と意味のあるやり方でコーディングを整形すれば、素早く簡単にコードを読むことができる
  • 読み手が慣れているパターンと一貫性のあるレイアウトを使う
    • 複数のコードブロックで同じようなことをしていたら、シルエットも同じようなものにする
    • コードの「列」を整列すれば、概要が把握しやすくなる
  • 似ているコードは似ているように見せる
    • ある場所でA B Cのように並んでいたものを他の場所でB C Aのように並べてはいけない。意味のある順番を選んで、常にその順番を守る
  • 関連するコードをまとめてブロックにする
    • 空行を使って大きなブロックを論理的な「段落」に分ける

コメントすべきことを知る

鍵となる考え
  • コメントの目的は、書き手の意図を読み手に知らせることである
  • コードからすぐにわかることをコメントに書かない→今回レビューで指摘された箇所です
まとめ
  • コメントには、それだけの価値を持たせる
  • コメントすべきで「ない」こと
    • コードからすぐに抽出できること
    • ひどいコードを補う「補助的なコメント」。コメントを書くのではなくコードを修正する
  • 記録すべきこと
    • 自分の考えを記録する
    • なぜコードが他のやり方ではなくこうなっているのか
    • コードの欠 をTODO: や XXX: などの記法を使って示す
    • 定数の値にまつわる「背景」を書く
  • 読み手の立場になって考えること
    • コードを読んだ人が「疑問」に思うところを予測してコメントをつける
    • 平均的な読み手が驚くような動作は文書化しておく
    • ファイルやクラスには「全体像」のコメントを書く
    • 読み手が細部に捕われないように、コードブロックにコメントをつけて概要をまとめる

コメントは正確で簡潔に

鍵となる考え
  • コメントは領域に対する情報の比率が高く慣れればいけない
まとめ
  • コメントを書くのであれば、できるだけ明確で詳細に正確に書くべき。また、簡潔なものでなければならない
  • 複数のものを指す可能性がある「それ」「これ」などの代名詞をさける
  • 関数の動作はできるだけ正確に説明する
  • コメントに含める出力の実例を慎重に選ぶ
  • コードの意図は、詳細レベルではなく、高レベルで記述する
  • よくわからない引数にはインラインコメントを使う
  • 多くの意味が詰め込まれた言葉や表現を使って、コメントを簡潔に保つ

総括

今回は、リーダブルコードの第1部についてまとめてみました。

エンジニアになり、だいぶコードの読み書きができるようになってきましたが、正直コードの意味や意図をあまり考えられていなかった。

今回のコードレビューからまた一つ学び、リーダブルコードを通じて学んことを実績して行きたいと思います。

まずは指摘箇所でもあった「コメントすべきことを知る」を早速週明けから実践です。
まだまだ学ぶことがたくさんあります。頑張ります!!

                                            • -

次は、リーダブルコードの第2部をまとめていきます。
以上、ハチマキでした。