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

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

【Rails/環境構築(M1)】HomebrewインストールでInstallation successful!になったのにbrewコマンドがエラーになるときの対処方法

こんにちは。

最近徐々に天敵を感じるようになってきました。そう花粉です。

どうもハチマキです。

はじめに

最近MacBook Air(M1,2020)を購入したため、開発環境の構築を行いました。その時に発生したエラーの対処方法について書いていきます。

環境

やりたいこと

Homebrewをインストールして、brewコマンドを使えるようにしたい

問題

Homebrewからインストールコマンドをコピペして、ターミナルで実行しました。
Installation successful!と無事にインストールできたと思いきや、brewコマンドを実行するとzsh: command not found: brewとコマンドが見つからない。。

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Password:
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /usr/sbin/chown -R user-name:admin /opt/homebrew
==> Downloading and installing Homebrew...
HEAD is now at 0d1aa33f8 Merge pull request #10525 from samford/livecheck-check-stable-before-head
Warning: /opt/homebrew/bin is not in your PATH.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (or will be during this `install` run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Add Homebrew to your PATH in /Users/user-name/.zprofile:
    echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> /Users/user-name/.zprofile
    eval $(/opt/homebrew/bin/brew shellenv)
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh

これで簡単にインストール完了!と思ったのもつかの間、% brew -vを実行しても下記のようにbrewコマンドが見つからない。。
今インストールしたのに?と思いながら調査を進めました。

% brew -v
 zsh: command not found: brew

原因

単純にPATHの通し忘れでした。
インストールコマンドを実行した際に、下記のようにNext steps:の記載がありましたね。。
ちゃんと読んでおけば解決できた内容でした、、

==> Next steps:

  • Add Homebrew to your PATH in /Users/user-name/.zprofile:

解決方法

下記を実行することで無事に解消されました。

% echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> /Users/user-name/.zprofile 
% eval $(/opt/homebrew/bin/brew shellenv)

% brew helpなどを実行して、インストールが無事にできていることを確認してみましょう。

% brew help
Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA

Contributing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh

【Rails/Vue.js】'v-model.number'を定義したら「The input element's type ('number') does not support selection.」エラー発生時の対処方法

こんにちは。

最近布団が離してくれなくて、朝起きれません。

どうもハチマキです。

はじめに

Vue.jsでイベントハンドラ(v-model)を実装中、The input element's type ('number') does not support selection.のエラーが発生しました。
解決に少々苦戦したため、解決方法に関して書いていきたいと思います。

実現したいこと

  • AとBの合計金額を算出する

問題

  • 合計金額を算出する上で、'vue-model.number'をhtmlで定義したら、The input element's type ('number') does not support selection.が発生した

console.logのエラー確認

html

<input type="number" vue-model.number ="A"

ブラウザ
f:id:hachimaki37:20210126114951p:plain

調査

よく記載のあった解決方法は下記のような方法が確認できました。

  • input type="number"を定義する
  • number装飾子を追加する(vue-model.number)
  • JSファイルの対象の値を、parseInt()を指定して値を整数値で返す

これを試しましたが、なかなか解決できず苦戦しました。

解決方法

input typeを'text'に指定し、JS側で各値を整数値(parseInt())で返すことで解決に至りました。
htmlファイル

#total
 = ~~ do |i|
 
   %td= i.input :total, input_html: {type: 'text', 'vue-model' => 'A'}
   %td= i.input :total, input_html: {type: 'text', 'vue-model' => 'B'}

JSファイル(js.coffee)

init = -> 
 new Vue
 el: document.getElementById 'total'
 data:
  A: 0
  B: 0
 computed:
  total: ->
   return parseInt(A) + parseInt(B)  #parseInt(A + B)にするとABと文字列同士が演算されてしまう

これでエラー解決および演算の動作が正常になりました。

【Rails】バッチファイル(rake task)作成手順について

こんにちは。

家の作業場が外並みに寒い。。

どうもハチマキです。

はじめに

自動配信メール作成に伴い、バッチ処理を実装しました。
Railsバッチ処理を書く際によく使われる

  • rails runner
  • rake task
  • sidekiq

の中でも、今回はrake taskのビルドタスクバッチ手順について書いていこうと思います。(自分用のメモに近い内容になります)

では早速行きましょう!

本日の概要 : バッチファイル(rake task)作成手順について

TODO

  • taskの追加
  1. config/schedule.rbにバッチ処理を記述する
  2. lib/tasks/hoge_mail.rakeのファイルを作成し、送信処理を定義する
  3. lib/hoge_reminder/batch.rbファイルを作成し、送信条件を定義する
  • mailerの追加
  1. app/mailers/hoge_mailer.rbのmailer追加
  2. app/views/hoge_mailer/remind.html / text.hamlの追加
  • ymlファイルに追加
    • config/locales/ja.ymlに日本語名を追加
  • taskのテスト
    • ターミナルで実行しテストする

ステップ1:task追加

  • ゴール:ターミナルでbundle exec rake -Tコマンドを実行すると追加したタスクが表示される
ターミナル
$ bundle exec rake -T
....

rake hoge  # hogeの自動メール
rake piyo  # piyoの取り込み
1. config/schedule.rbにバッチ処理を記述する
#  hogeの自動メール(こちらのみ実装していきます)
every :day, at: '6:50 pm', roles: [:db] do
  rake 'yy:hoge_reminder:remind'
end if production?

# piyoの取り込み
every :day, at: '6:50 pm', roles: [:db] do
  rake 'yy:piyo_notifier:announce'
end if production?
2. lib/tasks/hoge_mail.rakeのファイルを作成し、送信処理を定義する
require Rails.root.join('lib/hoge_reminder/batch')

#namespaceを使用します
namespace :yy do
  namespace :hoge_reminder do
    desc 'Send hoge reminder'
    task remind: :environment do
      Hoge::Batch.new.run(dry_run: ENV['DRY_RUN'])
    end
  end
end 
3. lib/hoge_reminder/batch.rbファイルを作成し、送信条件を定義する
require 'batch_base'

module HogeReminder

class Batch < BatchBase
    def _run(*)
      target.each do |order|
        Hoge.remind(変数).deliver unless dry_run?
      end
    end

    def target
      変数 = 条件
      end
    end
  end
end 

ステップ2:mailerの追加

1. app/mailers/hoge_mailer.rbのmailer追加
class HogeMailer < ActionMailer::Base
  add_template_helper(ApplicationHelper)
  add_template_helper(ImageHelper)
  add_template_helper(ContentsHelper)
  add_template_helper(MailerHelper)
  add_template_helper(SearchHelper)

  layout 'hoge_mail'

  default from: Settings::MailAddress.noreply

  def remind(変数)
    subject = "#{t('hoge_mailer.remind_email.subject')}

    mail to: @user.email, subject: subject
  end
end
 
2. app/views/hoge_mailer/remind.html/ text.hamlの追加

text.html.haml

= "#{@user.name}さま"
\
リマインドメールです
\
= @user.id
の件につきましてご連絡させて頂きます。

ステップ3:ymlファイルに追加

config/locales/ja.ymlに日本名を追加
hoge_mailer:
    remind_email:
      subject: "リマインドメール"

ステップ4:taskのテスト

ターミナルで実行しテストする
$ bundle exec rake yy:hoge_reminder::remind
....

START
..
..

これでmailが飛ぶようになり、実装完了です。

「タスク管理アプリ」すら作れなかった未経験エンジニアが1年を経てできるようになったこと。

こんにちは。

今年最後の日となりました。
本日は1年のふりかえりを行い、来年に向けて士気を高めていきたいと思います。

どうもハチマキです。

はじめに

本日が今年最後の日です。今年1年間をふりかえると、今までにないくらい変化がたくさんあったように感じます。

また年が明けると同時に未経験からエンジニアになり、1年が経過します。
入社前は、正直エンジニアの基礎の基礎と言われる、簡単な「タスク管理アプリ」すら作れない、「開発環境の構築」すらできない未経験エンジニアでした。(笑えない)

念願のエンジニアにはなれたもの、正直この1年非常に苦い時期もありましたが、なんだかんだ心が折れず、むしろ充実した日々を送れたように感じます。
未経験からエンジニアになって、最初の貴重な1年間がどんなものだったのか、そしてどんなことができるようになったのかを簡単に振り返っていこうと思います。

もしこのブログを読んで頂いた方には、ぜひこんな「何もできない未経験エンジニア」がここまで成長できているんだ!と、頑張るエネルギーに変えてもらえたらいいなと思います。
では、早速いきましょうー!

本日の概要 : 未経験からエンジニアになって1年が経ったふりかえり

  • 成果の振り返り
    • 個人成果
    • 業務経験
  • 1年の振り返り
    • 入社当初
    • なんとなくわかるようになってきた🤔(入社7.8ヶ月目〜12月)
    • 成長できた要因
    • 課題
    • まとめ
  • 補足
    • 来年の目標
    • 今後の目標

まずは成果の振り返り

個人成果

  • Ruby技術者認定試験 Silverに合格(2020/6月)
  • ブログ投稿数:57記事(2020/03/06~2020/12/31時点)
  • 個人制作アプリはこんな感じに(2020/12/31時点)

業務経験

  • Railsを中心に開発経験を得る
  • 要件定義からリリースまでと一貫して携わることができた
  • 直近ではJavaScript等のフロント周り開発に着手

去年の1月から考えると、本当に何一つ想像もしていなかった経験を得ることができたように感じます。

1年の振り返り

入社当初

入社初日は開発環境の構築から始まり、私のエンジニア人生がスタート致しました。それも束の間、右も左もわからず、何もできませんでした。(全然先に進まない)
早速にそんな辛い日々が続き、なんだかんだ3ヶ月くらいは精神的に結構辛い時期が続きました。
正直、この先エンジニアとしてやっていけるのか?そんな焦りと不安が常に付きまとっていました。

なんとなくわかるようになってきた🤔(入社7.8ヶ月目〜12月)

抽象的ですが、やっとこの時期くらいからシステムがわかるようになってきました。
一番の要因は、「なぜそうなるのか」、「どうあるべきなのか」を考えるられるようになってきた事かと思います。

「どういうデータの流れ/処理であるべきか」、「こういうデータ処理にするためには、どうするべきか」を考えられるようになった事で、「コード」や「ログ」が読めるようになり、システム理解が進んだように感じます。

あと、ググり方のコツがわかってきた事で、「実現するための解決策」を見つけられるようになった(解決手段に気づけるようになった)ことも大きな成長だったように感じます。

成長できた要因

やっとスタートラインに立ったくらいの成長度合いではありますが、要因は大きく3つと考えております。

①(少しづつですが)継続して学び続けられたこと
結局は、プログラミングが楽しいと思えたことで、学ぶことを継続できた。これが大きかったと思います。
学ぶことで「わからないこと」が「わかるようになる」と当たり前ですが、先に進めるんです笑
そこに面白みを感じることが出来たことが非常に大きかったとふりかえると思います。

②個人アプリの作成
実は、入社前にプログラミングスクールに通っていました。しかし、業務では正直何もできなかったです。というのも、私の学習の進め方は、教材を「進めるだけ(写経)」で、結局「ほとんど身についていなかった」ということが悲しい結論です。

エンジニア半年目くらいから先輩に進められ、個人アプリ制作に着手しました。これがよかった点は、自分で考え、わからないところを調べて、「試行錯誤しながら解決していくこと」を一貫して経験できるので、このアプローチも非常に成長に繋がったように感じました。

③実務で経験を積めた事
結局はこれが1番の成長です。私が大きくコツを掴めた一つは、先輩エンジニアとのペアプログラミングです。(約3倍パフォーマンスが向上しました)
何よりコードが複雑で難問の中、開発を進めていき、先輩からコードの意味やデータ処理の流れなどの知見を伝授していただきながら、かつ質問しながら機能実装ができたことで、相当レベルアップ出来たように感じます。(運用を見据えたコードの書き方なども学ぶことができました)

④その他、環境にも本当に感謝です。

  • コードレビューを頂ける
  • 早い段階で開発に着手できた
  • テストを書く文化がある
  • 質問したらすぐ回答を頂ける
  • 過去スキルを生かしたポジションからジョインできた
  • リモートワークができた

課題

  • 納期意識
  • コードの質(運用を見据えたコード)
    • 他者が見た時や1ヶ月後の自分がコード見た時の「理解度」「わかりやすいさ」

今年1年間を通して、課題に感じた点でした。

まとめ

継続は力なり。あたり前のようで一番実行が難しいこの言葉。
突発的な行動であれば、その場の勢いでなんとかなりますが、半年、1年、むしろその先もやり抜くためにはそれなりのモチベーションと工夫が大切だと感じた一年でした。
今年は「転職」「コロナ」「リモートワーク」などなど、環境の変化がたくさんありました。
個人的に継続できた重要な要因は、

  • 設定した目標が自分自身にとって、ワクワクするかどうか

のように思います。

来年はエンジニア2年目。1年目よりも頑張らねばです。
1つでもいいから日々学ぶ。そしたら1年で365個の学びを得ることができる。
来年もしっかり先の目標に目を向け、充実した日々を送りたいと思います。

補足

来年の目標

  • 業務の独り立ち(一人称で要件定義から実装までできるように)
  • 資格1つ取得(今のところ基本情報技術者試験の合格を目指す)
  • エンジニアのつながりを10人増やす
  • 技術力の向上→JSライブラリを使用した実装チャレンジ(個人アプリ可)
  • 新たなキャッシュポイントを1つ作り、収益を生みだす
  • (2021年末に充実した一年と感じること)
  • (課題に対して、様々なソリューションを提案をできるようになること)

まずはこれらを目標に頑張って行こうと思います。

今後の目標

・20210330修正

充実した100年時代を生き抜く。これが私のキーワードです。
今後を見据えて、充実した1年間にしていきたいと思います。

                                            • -

日々勉強、時には休むこと。
良い一年をお過ごしください。

以上、ハチマキでした。

【Rails/Rspec】expected: 1 got: 0の原因は「日付」の記述方法だった!

こんにちは。

今年も残り1日。今年に悔いはない!来年よお主を待ている。

どうもハチマキです。

はじめに

rspecのテスト記述をしていて、ローカル環境ではテストが通るのに、Travis CIで落ちました。
この原因特定に結構時間をさいたので、誰かのソリューションになれば幸いです。

では早速行きましょう!

本日の概要 : expected: 1 got: 0の原因は「日付」の記述方法だった!

エラー例

#hoge.rb
省略
1.days == Date.today #こいつが原因でした


#hoge_spec.rb
Failures:
  1) test内容 〇〇が送られること
     Failure/Error: expect(ActionMailer::Base.deliveries.size).to eq(1)
       expected: 1
            got: 0
       (compared using ==)
     # ./spec/hoge_spec.rb:41:in `block (4 levels) in <top (required)>'

原因

結論は、「日時の扱い方」でした。
日付の理解が低く、記述方法に誤りがありエラーが発生しました。

具体的には、Date.todayを使用して、データを取得しておりましたが、これが原因で発生したエラーでした。

解決方法

これ「Date.today」をこう「Date.current」です!これで解決に至りました。

#hoge.rb
1.days == Date.today

#これをこうです 

1.days == Date.current 

いつも参考資料にさせていただいてる@jnchitoさんの記事に対象となる読者

  • Railsで Time.now と Time.current の違いがよくわかっていない人

完全に私でした(汗汗

下記の違いを理解していたら簡単に解決できた問題でした。

  • 素のRubyならTimeクラスを使う。
  • RailsならTimeWithZoneクラスを使う。

【heroku】作業中ブランチをHerokuにデプロイする方法

こんにちは。

本日を持ち、今年の仕事納めとなりました。

どうもハチマキです。

はじめに

現場でもそうですが、基本的に新しく作成した機能や改修を直接本番環境にデプロイすることはありません。
一度検証環境等で動作確認を行い、問題なければ本番環境へデプロイしていくという流れを踏みます。

今回は、自作アプリで同様の流れを踏みましたので、作業ブランチを(検証環境用に作成した)herokuにデプロイする方法について書いていきたいと思います。

では早速行きましょう!

本日の概要 : 作業中ブランチをHerokuにデプロイする方法

開発環境


※ブランチを切って開発していることを前提となります。

ステップ1:作業中ブランチをgit pushする

$ git push origin test

ステップ2:作業ブランチをherokuのmasterにpushする

$ git push heroku test:master
※作業中ブランチを指定して、pushする


自分用メモ:
$ git push yy-stg add_users_registration:master
Counting objects: 1570, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1425/1425), done.
Writing objects: 100% (1570/1570), 4.25 MiB | 716.00 KiB/s, done.
Total 1570 (delta 258), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
・
・
・

基本的にこれで作業ブランチがherokuに上がるはずです!

データベース周りの補足

データベースをマイグレーション

$ heroku run rails db:migrate

自分用メモ:
$ heroku run rails db:migrate --app yy-stg 

初期データを投入

$ heroku run rails db:seed

参考資料

作業中のブランチをHerokuにデプロイする - Qiita

                                            • -

日々勉強です。
以上、ハチマキでした。

【Rails/migrate】Mysql2::Error: Duplicate column nameの解決方法

こんにちは。

私、末端冷え性で年がら年中、手先、足先が冷たい。

どうもハチマキです。

はじめに

rails db:migrateする際に、Mysql2::Error: Duplicate column nameエラーが発生し、migrateが出来ない問題が発生しました。今回はこの解決方法に関して書いていきたいと思います。

では早速行きましょう!

本日の概要 : Mysql2::Error: Duplicate column nameの解決方法

エラー例

$ bundle exec rails db:migrate

==  AddカラムToテーブル: migrating ==================================
-- add_column(:テーブル名, :カラム名, :string)
rake aborted!
Mysql2::Error: Duplicate column name 'カラム名'
・
・
・
・

原因

結論、カラムの重複が原因です。(※僕の場合、一度migrateしてrollbackしたことが原因で発生しました)

解決方法

やることはたったの2つ!
1. migrateしたいファイルを一度空にし、$ rails db:migrateする

class AddカラムToテーブル < ActiveRecord::Migration
  def change
 # 空にする
  end
end

上記のように空に書き換えて$ rails db:migrate を実行する

$ bundle exec rails db:migrate
==  AddカラムToテーブル: migrating ==================================
==  AddカラムToテーブル: migrated (0.0000s) =========================

2. migrateしたい状態に戻し、$ rails db:migrateを実行する

class AddカラムToテーブル < ActiveRecord::Migration
  def change
    add_column :テーブル名, :カラム名, :string
  end
end
$ bundle exec rails db:migrate

これで成功するはずです!

参考資料

[エラー解決] Error: Duplicate column name ''"、カラムの重複、SQL - Qiita

                                            • -

日々勉強です。
以上、ハチマキでした。