バックエンド

【Rails+PostgreSQL】importでの一括UPDATE速度検証

大量データをデータベースに一括登録したいとき、BULK INSERT がよく利用されます。 今回は INSERT ではなく UPDATE の処理速度について検証してみました。 Ruby on Rails + PostgreSQL での検証です。 というわけではじめまして。インゲージには9月に入社し…

APIから取得したデータを画面に表示する

こんにちは。oda@エンジニア1年目です。 前回の記事では、json形式で取得したデータを返すAPIを作成しました。 今回は、この取得したデータをAjaxで画面に表示させてみます。 (以下、Rails 6.1.6を使用しています。) 画面の準備 画面を表示させるために次…

APIをつくってみる

こんにちは。oda@エンジニア1年目です。 業務でAPIにリクエストを送って、返ってきたデータを非同期で画面に描画するという処理をすることがあります。 最近、ふと思いました。 「APIを自分で作ったことがないぞ」 というわけで、今回は自分でAPIを作ってみ…

Ruby で SMTPError#message を使う場合の注意点

やっと「シン・ウルトラマン」を映画館で観てきた id:kizashi1122 です。 弊社サービス Re:lation ではメールを扱うことが多いです。送受信のエラーもハンドルしています。 今回ご紹介するのはメール送信時のエラーについてです。 メールアドレスの @ より前…

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…