20211127のRailsに関する記事は8件です。

【Ruby】早期return

早期リターン 式の値を戻り値としてメソッドの実行を終了。式が省略された場合には nil を戻り値とする。 条件分岐のネストが深くなりすぎてコードを読みにくくなってしまうときに使用すると可読性が高まる。 「Guard Clause」「ガード節」「ガード条件」「ガード構文」と呼ばれることもある。 def invalid_permission?(user) if user.present? #<= この例外処理はGuard Clauseで書き直せる case user.permission when 1,2,3 false else true end else true end end def invalid_permission?(user) return true if user.blank? #<= この1行で例外チェックをネストなしで完了できる case user.permission when 1,2,3 false else true end end 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】global source linesとは何か

global source lines  Gemfileに記述されるgemに対してsource、git、pathのオプションを指定しなければ、Gemfileの一行目にある引数のサイトから取得される。 source "https://rubygems.org" このsourceメソッドの行はマニュアル内で global source lines と呼ばれる事がある。 sourceオプション  gemを検索するサイトを取得 gem "gem_name", source: "url" #全てのオプションで、ブロックを用いて一括で書ける source 'url' do gem 'gem_name1' gem 'gem_name2' end pathオプション  ファイルシステム内のパスを指定し、gemの取得先とする gem "gem_name", path: "url" gitオプション  作成されたgemのgitリポジトリから取得 gem "gem_name", git: "url"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2のメモリ空き容量が減る場合の対処法

困っている事 本番に公開しているAWSが、3日おきぐらいに再起動する なぜ本番が3日おきに再起動するのか分からない 環境 auto scaling使用 ロードバランサ使用 rails(6.1) 起動はpuma EC2プラン: t2.micro 前提情報 ログに、OOMキラーが作動したという記述あり。その後EC2インスタンスが落ちている /etc/sysctl.confで、OOMキラーが作動した時に、EC2インスタンスが再起動するように設定している EC2インスタンスが再起動したタイミングでnginxとpumaが起動するcrontabを設定している EC2インスタンスは再起動するとメモリがリセットされる 約3日後にOOMキラーが作動する、の繰り返し サイトは1日に5000人ほどのuserが登録するというアプリ 予想 メモリリーク メモリブロート(メモリ断片化) のどちらかではないか 検証 メモリリークの特徴: メモリ消費量が徐々に線形に増加 メモリ断片化の特徴: メモリ消費量が一定まで増加すると横ばいになっていく まずメモリの消費量推移を監視する必要あり cloud watchでメモリ消費量を監視する設定を行う gem puma worker killerというgemが有名だが READMEを読む限り使わない方がいいように見えるので使わない 対策 検証の結果、リークか断片化かはっきりとは分からなかった(微妙なグラフ) プランがt2.microなのでメモリが少なすぎるのでは t3.smallにした所、それ以後は一度も再起動しなくなったので、断片化が原因だったのではないか その他 よく使ったコマンド $ free -m(メモリ使用量が分かる)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

webpackerによるStimulusのインストールでハマったこと

はじめに 皆さんStimulusを使っていますか? ReactやVueを使う程学べていないけど、jQueryは使いたくないって人におすすめのフレームワークです! JaveScriptの簡単なDOM操作ができる人なら学習コストはほぼゼロで使えます! 更に、Webpackerを導入しているRailsならコマンド一発でインストールできるのも魅力的です。 ターミナル rails webpacker:install:stimulus 上記コマンドでインストールして公式サイトでサクッと勉強しながら皆さん良いStimulusライフを! 、、、としたかったのですが、インストールの際にエラーが発生して上手く動かなかったので修正点を備忘録として残しておきます。 前提 技術など バージョン等 ruby 2.7.4 Rails 6.1.4 執筆時点の日時は2021/11/27です。 調査結果 修正点とか言ってますが、ただのバージョンの問題でした。 詳しくは分かってないのですが、Rails7にStimulusは標準で組み込まれるっぽいです(現在の筆者のRailsのバージョンは6)。 それに先駆けてStimulusが色々バージョンアップしたっぽいので、Rails6ではそのままだと使えませんでした。(間違いがありましたら諸先輩方ご指摘お願いします?‍♂️) 修正内容 まずは、Stimulusのバージョンを直しましょう(すでにStimulusのバージョン3.0.0をインストールしてしまった前提です。) package.json { "name": "myapp", "private": true, "dependencies": { "@popperjs/core": "^2.10.1", "@rails/activestorage": "^6.0.0", "@rails/ujs": "^6.0.0", "@rails/webpacker": "5.4.3", // 中略 - "stimulus": "^3.0.0", + "stimulus": "^2.0.0", "turbolinks": "^5.2.0", "webpack": "^4.46.0", "webpack-cli": "^3.3.12" }, "version": "0.1.0", "devDependencies": { "webpack-dev-server": "^3" } } 上記のように3.0.0を2.0.0に修正します。 その上で、 ターミナル yarn install で、再インストールして下さい。 不安な人は、yarn.lock内を検索して、"@stimulus/core@^2.0.0":となっているか確認してみてください。 次に、app/javascript/packs/application.jsに追記をします。 application.js import Rails from "@rails/ujs"; import Turbolinks from "turbolinks"; import * as ActiveStorage from "@rails/activestorage"; // 中略 + import "controllers"; 上記のように1行だけ追加して下さい(もしかしたら自動で記述されているかもしれません) 最後に、app/javascript/controllers/ディレクトリにhello_controller.jsを作成、公式サイトのTOPにある部分とかを打ち込んで動くか確認してみて下さい。 公式サイトTOPと同じ動きをしてくれたら成功です! 終わりに 今回がQiita初投稿ですので、温かい目で見守ってくださるとありがたいです。 また、ミスやこうすると読みやすい等ご指摘がありましたらぜひコメントの方宜しくお願いします?‍♂️ 繰り返しになりますが、ReactやVueを使うほどではない簡単な動きだけならStiumulusの方が導入・開発スピードは早いと思いますので、ぜひ使ってみて下さい!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC2に700万件insertする

したい事 EC2のmysql(RDS)にレコードを700万件入れたい できるだけ短時間で入れたい 1回で入れたい 環境 docker-compose rails(6.1) localマシン: mbp 16GB EC2プラン: t3.small(メモリ2GB)、DBはRDS local 下準備 docker-compose.yml内容変更↓ version: '3' services: db: image: mysql:5.7.34 command: --max_allowed_packet=536870912 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} ports: - "4306:3306" web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" environment: TZ: Asia/Tokyo volumes: - .:/test ports: - "3000:3000" depends_on: - db ポイント: 上から5行目でmysqlのpacketを512MBに増やしている dockerのsettingを変更↓ ポイント: resourceのmemoryを8GBに増やしている localで実行 まずlocalで数百万のinsertをできるかを確認 seeds.rb内容変更↓ (例はcsvのデータをinsertする場合) # frozen_string_literal: true require "csv" def insert_all_test array = [] CSV.foreach("db/test1.csv", headers: true) do |row| array << { name: row["name"], created_at: Time.current, updated_at: Time.current } end User.insert_all array array = [] CSV.foreach("db/test2.csv", headers: true) do |row| array << { name: row["name"], created_at: Time.current, updated_at: Time.current } end User.insert_all array end insert_all_test ポイント: エラーにならない程度の量のデータを1つのループで配列に入れ、一度insert_allでDBに入れる それを繰り返し そのdefを、最終行のinsert_all_testで実行($ rails db:seed)する これで1回でinsertできる。localでは700万件insertが約15分で完了 (insert_allメソッドはcreated_atとupdate_atを自動で入れないので上記のように明記する必要) EC2 下準備 mysqlの環境を変更する DBがRDSの場合 パラメータグループでmax_allowed_packetを変更する(今回は512MBとした) デフォルトのパラメータグループの内容は変更できないので、新規で作成する必要がある ポイント: 新規でパラメータグループを作成した後は、そのグループをEC2インスタンスに適用する EC2で実行 $ rails db:seed RAILS_ENV=production プラン: t3.smallの場合 1つのcsvは約50万件 700万件のinsertに約50分掛かった プラン: t2.microの場合 1つのcsvは約30万件(50万件ではエラー。broken pipeする) プランがmicroでも、時間を掛ければ1回でできる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自動車の品質管理からエンジニアになってみて

はじめに 未経験からエンジニアに転職して、現在はフリーランスエンジニアとして活動しています。 エンジニアになった経緯などを書きますので、エンジニア転職を検討している方の参考になれば幸いです! ⬇️僕の経歴です 年月 所属 2018/04~2020/04 自動車会社(新卒入社) 2019/05~2019/10 Progate, Railsチュートリアルで独学 2019/11~2020/02 ポテパンキャンプ 2020/04~2021/10 受託会社で正社員 2021/11~ 自社開発会社でフリーランス 1. 前職の内容 前職の自動車メーカーでは、海外の自動車のリコールなどを扱う品質管理の部門にいました。 品質管理といっても実際に、製品を扱ったり、図面を書いたりするわけではなく、 海外のお客様・研究所・部品メーカーの間に入って、スケジュールの調整を行う中間部門でした。 具体的には下記のような仕事の流れでした。 お客様から訴えがある ➡️ 過去に同じ問題がないかをデータで調べる ➡️ 同じ問題が多発していれば、研究所・工場や部品メーカーに原因追及・部品の修正を依頼 ➡️ 問題が深刻な場合、リコールを実施する 前職を通して... マイナスをゼロに戻すのが仕事だったので、いろいろ大変でしたが、 各地の工場や部品メーカー、海外出張に行けたのは良い経験だったと思います。 新卒一年目から、研究所や部品メーカーのお偉いさんたちがいる会議を進行していたので、 社会人としての基本的なマナーや年上の方を相手にする度胸はつきましたが、 今後活かせるスキルはあまり身についていない感じがしました。 また、10年以上先輩の社員の方も同じ仕事内容だったため、 このまま仕事を続けていても、仕事の幅は広がりにくいのも薄々感じていました。 2. エンジニアになろうと思ったきっかけ 憧れだった会社に入社できたので、一生懸命仕事をしていましたが 入社してから1年くらい経つと、下記を感じるようになってきました。 基本は年功序列なので、仕事を頑張っても評価されにくい 希望の部署に行きにくい 勤務地、仕事内容、給料が会社に決定される このまま仕事を続けていても問題はないかもしれないですが、 「この先、何十年同じような仕事を続けていいのか?」と疑問を抱くようになりました。 エンジニアに興味を持つ それから、副業や転職についていろいろ調べていると、 エンジニアの情報をよく見かけ、エンジニアという職業に興味を持つようになりました。 そして、知り合いからフリーランンスとして活動しているエンジニアの方を紹介して頂いて、 実際に話を聞く機会を頂きました。 話を聞いてみると、 自分のスキルが評価される フリーランスでも案件は多い 会社に依存せず仕事ができる ということがわかったので、エンジニアになることを決意しました。 そしてMacbookを購入し、ProgateやRailsチュートリアルでプログラミングを勉強しました。 ポテパンキャンプを受講 ある程度独学で継続できたので、本格的にエンジニア転職を視野に入れ、プログラミングスクールを検討しました。 プログラミングスクールは数多くありますが、 オンラインで受講できる(地方在住だったため) 現役エンジニアからのレビューを受けられる 転職サービスがついている という特徴からポテパンキャンプの受講を決意しました。 そしてポテパンキャンプのカリキュラムも終えて、無事に受託会社に転職が決定しました! 3. エンジニアとして働いてみた感想(前職と比べてどう変わったか) 転職先での経験 転職後は1~2ヶ月の研修をしてから案件に配属になりました。 受託会社だったため、複数の案件に関わり、下記の経験を積むことができました。 Railsを用いたAPIサーバーの開発 React, Typescriptを用いたフロントの開発 AWSを用いたインフラ構築 SwiftでのiOSアプリ開発 エンジニアになってみて... そして、ここがみなさんが一番気になるところだと思いますが、 僕は未経験からエンジニアに転職して本当に良かったと感じています!! エンジニア(特にフリーランス)になって 前職と異なり、会社に依存しないスキルが身についた 勤務地、仕事内容、給料を自分で決められるようになった Webアプリを作れるようになった 上記のように大きく変わりました。 特に、会社に依存しないスキルが身についたのは本当に良かったと思っています。 スキルがあればキャリアや生活環境を自分で決めることができるので、幸福度は上がりました。 4. 今後はどんなエンジニアを目指したいか 今後は下記のようなエンジニアになりたいなと思っています! スキル面 インフラ側もより詳しくなりたい(アプリ全体を把握したい) Go言語で開発したい サーバーレス開発をしたい キャリア面 より上流工程から関われるようになりたい エンジニアになりたい方を応援、サポートしたい 最後に 2年間挑戦し続けた結果、目指していた働き方・ライフスタイルを手に入れることができました。 キャリアチェンジを通して、確かに辛い時期はありましたが、エンジニアになって本当に良かったと思います。 エンジニア転職に悩んでいる方は、挑戦してみる価値はあると思うので、ぜひ挑戦してみてほしいです! そしてプログラミングスクールを検討している方は、ぜひポテパンキャンプを検討してみてください! 代表の宮崎さんが相談に乗ってくれます! この記事を通して、少しでも挑戦するきっかけになれば幸いです。 最後まで読んで頂きありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コンピュータ特有の演算誤差

この記事の執筆者 プログラミング学習を始めて、5ヶ月ほど。Vue.js Typescript Railsを学習中の大学生. きっかけ Typescriptの参考書を学習中に下記のようなコードを書いたら予期しない結果になったため調べてみることにした。参考書には誤差が出る理由等は詳しく書かれていなかった。 let price = 12500 let tax = 1.1 let withTax = price * tax console.log("金額" + price ) console.log(`税込価格は、${withTax}`) 結果 金額12500 税込価格は、13750.000000000002 上記のコードは定価である12,500円に対して税率である0.1を加えたものである。 期待していた結果としては下記のようなもの 12,500 * 1.1 = 13,750 コンピューター特有の演算誤差 このような予期しない演算結果が出るのは、どうやら調べてみるとJavascriptだけではないようだ。 コンピュータの内部では2進数で計算されているため! らしいのだが2進数について完全に忘れていたため(おそらく高校で少しだけやった...)まずは2進数について調べてみた。 2進数 そもそも2進数とは 0と1で表された値 10進数 2進数 0 0 1 1 3 11 4 100 5 101 6 110 7 111 0.1 0000 0000 . 00001 1001 1001 1001 1001... どうやら 0.1は2進数で表すと0000 0000 . 0001 1001 1001 1001 1001 1001 .....以下無限に続くよう(循環小数) このように小数の一部では2進数で表すと循環小数になってしまう。よってそれを扱った演算では計算が意図しないものになることがわかった。 解決方法 let price = 12500 let tax = 1.1 * 10 let withTax = (price * tax) / 10 console.log("金額" + price ) console.log(`税込価格は、${withTax}`) 結果 金額12500 税込価格は、13750 上記のコードでは小数を10倍して整数に直す(2進数では整数の形だと循環小数にならないため) そして、計算した結果を10で割ることによって結果を出している。 他のやり方もあるそうなのでできなかった方は以下を参考にしてください。  まとめ 万能に見えていたコンピュータでも1と0しか把握できないことで意図しない計算結果を生む可能性があることがわかった。複雑な計算になればなるほどこのような箇所は見落としがちなので十分に注意したい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】jbulderの基礎・使い方

ポートフォリオ制作でjbuilderを使ったので学習した内容をまとめました。 jbuilderとは? jbuilderとは、JSON形式のデータを簡単に作成することができるgem。Railにデフォルトで導入されている。 jbuilderでできること app/view/〇〇.json.jbuilderファイル内のjsonオブジェクトに対して様々なメソッドを使うことでJSON形式の文字列のデータを簡単に作ることができる。 「APIを叩く」みたいなことができるのだと思います。(たぶん) 「APIを叩く」に関して、こちらの記事が大変参考になりました。 使い方 RailsとVue.jsを使用、取得するデータは作成済みの想定で進めます。 1. Jbuilderが導入されていることを確認する Gemfile ruby '2.7.3' gem 'rails', '~> 6.1.4' ・・・ gem 'jbuilder', '~> 2.7' 2. コントローラーの準備 localhost/api/v1/comments.jsonでデータが扱えるようにするため、コントローラーの設定を行います。 app/controller/api/v1/comments_controller.rb class Api::V1::CommentsController < ApiController def index @comments = Comment.all end end 3. jbuilderファイルの作成 各メソッドは後術します。 app/views/api/v1/comments/index.json.jbuilder json.set! :comments do json.array! @comments do |comment| json.extract! comment, :id, :context end end 4. 生成されたjsonデータを確認 http://localhost/api/v1/comments.jsonにアクセス ※二点いかがわしいコメントがありましたので隠させていただきます。 メソッド json.extract!:第一引数に指定したインスタンス変数のデータをJSON形式の文字列で返す。 〇〇json.jbundler json.extract! @commnet, :id, :context # 実行結果=> {"id": 1, "context": "hogehoge"} ネスト 入れ子構造にして属性をまとめたい場合は以下のように記述。 〇〇json.jbundler json.set! commnets do json.extract! @commnet, :id, :context end # 実行結果=> {"comments":[{"id": 1, "context": "hogehoge"}]} json.set!:キーと値がペアとなったJSON形式の文字列を返す 〇〇json.jbundler json.set! "context", "hogehoge" # 実行結果=> {"context": "hogehoge"} json.array!:モデル内のデータが配列に格納され、JSON形式の文字列のデータで返す 〇〇json.jbundler json.array! @comments, :id, :context # 実行結果=> [{"id": 1, "context": "hogehoge"},{"id": 2, "context": "hojihoji"}]  参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む