バックエンド

Integer型のカラムにdefaultを設定するとレコードの検索時間はどうなる?

こんにちは。oda@エンジニア1年目です。 先日、マイグレーションファイルを使って、テーブルにInteger型のカラムを追加しました。 必要なレコードにのみデータを入れて、その他はnullにしていたところ、次のような指摘をいただきました。 「default: 0を設…

ActiveRecord を色々試せる環境を作ってみる

こんにちは。ryohei515です。 実務で ActiveRecord の動作を確認したいときは、開発環境内の Rails Console で動かしてみるのですが、プライベートで確認したい時用に環境を作っておきたいと思い、備忘録的に残しておきます。 過去の記事で、サンプルデータ…

enumを使ってみる

こんにちは!oda@エンジニア1年目です! 業務では、今まで使っていなかったメソッドなど、様々なコードに触れる機会があります。 今回は、その中でもRuby on Railsのenumについて、整理してみたいと思います。 (以下、Rails 7.0.2.3を使用しています。) …

sidekiq の優先度設定

id:kizashi1122 です。 恥ずかしながらも最近ちゃんと理解した Sidekiq の優先度設定について書きたいと思います。 結論 github.com ここのオフィシャルをちゃんと読みましょう。 優先度と重みの設定方法 Sidekiq のキューの設定は設定ファイルに記述するこ…

migrationファイルの「change」と「up、down」

こんにちは! 4月に入社した新人エンジニアのodaです。 Ruby on Railsを使ってアプリケーション開発をされている方は、マイグレーション機能を使ってテーブル定義に変更を加えているかと思います。 私自身、個人でRailsアプリを作成しているときは、もちろん…

【SQL】NOT EXISTS で最新(MAX)の値を取得する

こんにちは。ryohei515です。 例えば履歴を蓄積するようなテーブルがあるとき、顧客毎の履歴の最新値を取りたいことがあると思います。 私はありました。その時、最新値を NOT EXISTS で取得するようにしたことで、パフォーマンスを改善できたので、残してお…

Ruby の proc や lambda でキーワード引数を使う方法

どうも、記憶力皆無の @shutooike です。 Ruby の proc や lambda でキーワード引数(keyword arguments)を使う方法いつも忘れるので未来の自分に向けて記事にします。 proc # キーワード引数 proc = Proc.new { |species:, name:| puts "吾輩は#{species}…

0埋めされていない数字文字列をソートしたい

どうも、にしむらです。今回はRails5.2 PostgreSQLの話です。 messages テーブル に 文字型 str_id に数字が0埋めなしで保存されている場合は以下のようにソートされます。 select * from messages order by str_id; id | str_id ----+------- 50 | 1000 47 …

Ruby のコードを読む! 別スレッドで例外を起こす

こんにちは masm11 です。 以前の記事で Timeout.timeout のコードを読みました。 記事はこちらです。 blog.ingage.jp 新たなスレッドを起動し、時間になったら元のスレッドで 例外を発生させているらしい、ということは解りました。 しかし、それだけでは s…

Ruby の Timeout.timeout の実装を読む

こんにちは、masm11 です。 Ruby の Timeout モジュールは便利で、 gs = TCPServer.open(0) Timeout.timeout(5) do gs.accept end このように自由にタイムアウトを設定できます。 今回はこの実装について見ていきたいと思います。 実装を見る Ruby のバージ…

N+1問題について勉強会で発表してみた

ryohei515です。 Ruby on Railsを使う上で、N+1問題は避けては通れない問題です。 インゲージでは週に1度、社内勉強会を行っているのですが、今週は私が発表担当だったため、このN+1問題を知識整理がてら、社内勉強会で共有しました。 簡単な内容ではありま…

PostgreSQLでパフォーマンスを比較してみた (EXISTSとINNER JOIN)

はじめまして。5月に入社したryohei515です。 前職ではOracleを使ってSQLを書く機会がよくあり、パフォーマンスチューニング等も行ってきました。 インゲージに入社してからSQLを書く機会があったのですが、DBがPostgreSQLであるため、これまで使っていた細…

RSpec の spec type を独自フォルダ配下の spec にも自動で付与したい

おはようございます! 最近 DMM Books の70%OFF祭りで読みたかった技術書を50冊 *1 ほど買い込んだ @shutooike です! 前回 と同様に、今回も整備中に見つけた RSpec 小ネタを共有します。 前提条件 rspec-rails: 3.9.0 spec type の自動付与とは? # spec/r…

RSpec で特定の spec type の時だけ before フックを動かしたい

おはようございます! 最近は隙間時間にインゲージのテスト環境を整備をしている @shutooike です! 今回は整備中に見つけた RSpec 小ネタを共有します。 前提条件 rspec-rails: 3.9.0 やりたいこと RSpec で特定の spec type の時だけ before フックを動か…

ActiveJob で queue を動的に指定する3つの方法

おはようございます。 @shutooike です! 業務上であるジョブのキューを条件によって動的に変えたい場面に遭遇し、ActiveJobのソースを読んだのでメモを残しておきます。 前提条件 Rails version: 5.2 queue_adapter: Sidekiq 対象のジョブクラスはこんな感…

MessageEncryptor の互換性を調べてみた

こんにちは、masm11 です。 Rails に MessageEncryptor というクラスがあります。 何かを暗号化/復号する際に便利ですね。 例えば、 KEY = 'somekeysomekeysomekeysomekeysomekeysomekeysomekey' enc = ActiveSupport::MessageEncryptor.new(KEY, cipher: 'a…

Rails 5.2 で Rails 6 の credentials 機能を使う

こんにちは、masm11 です。 今回は久しぶりに Rails について書きたいと思います。 Rails 5.1~5.2 で credentials 機能が一新され、 credentials.yml.enc と master.key になりましたね。 そして Rails 6 ではそれを環境ごとに用意できるようになりました。…

Rails 6.1 つまみ食い② : ActiveStorage の永続的なURL

おはようございます! 2021年はもっとJSと仲良くなりたい @shutooike です! 今回試すのは ActiveStorage の Permanent URLs です。 セットアップ blog.ingage.jp 前回の記事↑で作った Rails アプリを今回も使います! まず ActiveStorage をインストールし…

Ruby の with_index を追う

こんにちは、masm11 です。 先日、Ruby の with_index メソッドを知り、衝撃を受けました。 今回は使い方を簡単に紹介し、更に with_index の実装に迫りたいと思います。 with_index の使い方 Ruby の Array には、Array#eachメソッドがありますね。 array.e…

grape で URI パラメータとしてメールアドレスを受け取る

明けましておめでとうございます。masm11 です。今年もよろしくお願いします! grape をご存知でしょうか? Rails で API を作る時に便利ですね。 今回は、grape を使った API で URI パラメータとしてメールアドレスを受け取ろうと してハマったので、ご紹介…

Rails 6.1 つまみ食い① : 関連付けの非同期削除

おはようございます! 公私ともに2020年を納めきれるか心配になってきた @shutooike です。 今回から数回に亘って Rails 6.1 の新機能を浅く広くつまみ食いしていこうと思います! セットアップ techracho.bpsinc.jp こちらの記事を参考に dip を使って環境…

Rails で created_by と updated_by をいい感じにセットしたい

はじめまして! 8月にインゲージに入社したエンジニア1年生の @shutooike です!(保険) 突然ですが、弊社サービスの設定系のテーブルにはその設定を誰が作成・更新したものかを記録するために created_by, updated_by というログインユーザーのIDを入れる…

割り算の余りは?

こんにちは、masm11 です。 突然ですが、今回は、負の整数を正の整数で割った時の余りは 0 以上なのか 0 以下なのか、 という話を書きたいと思います。 具体的には、-22 % 3 はいくつなのか、というお話です。 実は、言語によって違うのです… 2 になるものた…

Ruby で backtrace を取得する

こんにちは、masm11 です。 Ruby で、「このコードのここに来た時、どこからどう呼ばれてきたのか知りたい!」ということは ありませんか? よくあると思います。 おそらく最近の IDE なら、問題なく、いつでも見られるのでしょう、きっと。 しかし私はそうい…

@johtani さんと弊社サービスの Elasticsearch について話しました(実装編2)

前回のエントリでは、検索アルゴリズムとしては単純な、でも弊社のサービスにはマッチしている N-gram を採用しているということをお伝えしました 。また Elasticsearch ではどういう設定しているかもお伝えしました。 検索結果のハイライト(highlighting)…

複数行 UPDATE で発生するデッドロックを回避する

こんにちは、masm11 です。 今回は、RDBMS で複数行の UPDATE すると割と簡単に起きるデッドロックを回避する方法を探ります。 Rails を用い、RDBMS としては PostgreSQL を使います。 準備 まずは、Rails のプロジェクトを作ります。 rails new proj --skip…

@johtani さんと弊社サービスの Elasticsearch について話しました(実装編1)

前回のエントリで、弊社サービス Re:lation が Elasticsearch をどういう感じで使っているのかを、主にインフラにまつわる部分を中心に書きました。 blog.ingage.jp 今回は実装に関わる部分を書いてみたいと思います。 前回の記事も含めて今回の記事につきま…

@johtani さんと弊社サービスの Elasticsearch について話しました

@kizashi1122 こと、永田です。 blog.johtani.info @johtani さんがツイートするもんだから、あいよっと返事してしまいました。 以下、@johtani さんに話したことも話してないこともツラツラと書いていこうと思います はじめに 弊社のサービスである「Re:lat…

Rails のコネクションプールから接続を取り出す処理を追う

こんにちは、masm11 です。 弊社では PostgreSQL のデータベースを Amazon Aurora に移そうとしていますが、 フェイルオーバー時の処理が気になっています。 ググってみたところ、MySQL の情報はたくさん出てくるのですが、PostgreSQL の情報は 少なく、欲し…

Ruby で Excel ファイルを作る

お久しぶりです。masm11 です。随分時間があいてしまいました。 以前、Python で Excel ファイルを作成する方法について書きました。 しかし弊社はやはり Ruby がメインなので、今回は Ruby で作成する方法について 紹介したいと思います。 Ruby で Excel フ…