SocialPLUS Tech Blogのフィード
https://zenn.dev/p/socialplus
株式会社ソーシャルPLUS 開発チームの技術ブログです。
フィード
bugsnag gem のコードからクロージャを使った Rails における実践的な遅延実行の実装をマスターする
SocialPLUS Tech Blogのフィード
masaki です。弊社では Ruby on Rails を使ったアプリケーションを開発し、バグ検知サービスに BugSnag を利用しています。今日は、Ruby のライブラリである bugsnag gem の before_bugsnag_notify がどのように動作しているか、実装を読み解きながらご紹介します。before_bugsnag_notify の内部には「クロージャを使った遅延実行」が取り入れられており、実践的な実装テクニックを学ぶことができます。ぜひ最後までお読みください。 このブログの対象者Rails アプリケーションを開発している方遅延実行の実践的な実...
9日前
ペアプロで学んだ!開発効率を向上させる3つのTips!
SocialPLUS Tech Blogのフィード
はじめに普段ペアプロやモブプロの中で開発中役立つ知識を共有いただくことがあり、開発効率が向上しました。お恥ずかしながら初めて知ったことが多かったため少しまとめてみました。 対象の読者エンジニア初心者GitHub CLIやVisual Studio Codeの便利機能について、これから使い始めたい人。Pull Requestレビュー時の効率化方法を学びたい人。効率化ツールに興味のある人開発作業を効率化する新しいツールや機能を探している人。作業効率を上げるためのヒントやテクニックを探している人。 GitHub CLIGitHub CLIは、コ...
12日前
OpenID Connect Core 1.0 の輪読会をした
SocialPLUS Tech Blogのフィード
こんにちは、 simomu です。今日は社内勉強会の一環として OpenID Connect Core 1.0 の輪読会を実施した話をします。 発端発端は OpenID Summit Tokyo 2024 の中のセッションの一つである「デジタルアイデンティティの技術を学ぼう!~認証認可にまつわる標準仕様文書を読んでみよう~」を聞いたことで、今まで少し苦手意識のあった標準仕様文章をちゃんと読んでみようと思ったことがきっかけでした。https://speakerdeck.com/ayokura/openid-summit-tokyo-2024また、ソーシャルPLUS は複数のソーシ...
13日前
ElastiCache Redis のデータベースを移行した話
SocialPLUS Tech Blogのフィード
前提条件本記事では以下のバージョンを前提としています。ElastiCache Redis エンジンバージョン 7.1 概要弊社では、元々は各サービスごとに専用の Redis インスタンスを用意していましたが、各々メンテナンスが必要となり、ダウンタイムが発生する機会が増え、インフラエンジニアの運用コストも上がるという課題がありました。そこで、Redis の DB 番号を 0 ~ 15 まで割り当てられるという特性を活かし、1台の Redis インスタンスに各サービスごとに異なる DB 番号を割り当てる運用に切り替えました。この方法により、複数のサービスが同じ Redi...
17日前
コードのコピペや自動生成をしたらまず一旦コミット
SocialPLUS Tech Blogのフィード
コードのコピペや自動生成をして、それに手を加えて実装を進めていくケース、結構ありますよね? そんなときに、コミットをわかりやすくするための小技を紹介します。これをやるだけで開発中の試行錯誤がしやすくなりますし、レビューもかなり楽になります。 コピペを元に実装していく場合は、コピペした時点で一旦コミットするコピペしてちょこっとカスタマイズ、なんだかんだでよくやると思います。既存の機能 A のコードを元にして、ちょっと違う機能 B を作りたい公式ドキュメントや他の人の例を参考にして実装したいGitHub の issue に書かれている workaround を使いたいいず...
24日前
Gem を省いた Ruby のバージョンのみを Renovate で更新する
SocialPLUS Tech Blogのフィード
現在自分が携わっている Rails のプロジェクトでは、使用している Gem のバージョンアップデートに関して Dependabot で自動で PR(Pull Request) を作成し管理しています。ただ Ruby そのもののバージョンに関しては、過去の PR を参考に手動で作成していました。そんな中 Ruby 3.3.4 のリリースで今後は遅くとも2ヶ月おきに新しいバージョンがリリースされるということが発表されました。Ruby の更新頻度が多くなり Gem だけでなく Ruby そのものについてもバージョンの記載などの基本的な箇所は自動で PR を作成していきたいという話になり...
1ヶ月前
無限に広がるマルチプレイのマインスイーパーを作りたかった話(有限である程度動くところまで)
SocialPLUS Tech Blogのフィード
はじめにこんにちは, hamaguchi ですSocialPLUS では、なにかしら技術に関係する好きなことを発表する場があり、今日はそこで発表した内容に加筆修正を行い、記事にしてみました結論としては、無限の広さを持つ盤面にはまだできておらず、とりあえず有限の盤面上である程度動くところまでという状況です記事の前半は「ぼくがかんがえたさいきょうのうぇぶさーびす」を思いついた時にどんなことを考えたのかについて、後半は実際に作ってみた内容について書いていますマインスイーパーのデータ構造なんて簡単じゃん、と思われるかもしれませんが、考えてみると結構色々なことを考える必要がありました...
1ヶ月前
BugSnagのエラーアクションとチーム内での運用
SocialPLUS Tech Blogのフィード
こんにちは、st-1985 です。弊社バックエンドチームでは Rails アプリケーションのエラー監視ツールとして BugSnag を使用しており、チーム内の当番制で確認しています。今回は BugSnag に通知された各エラーに対して行える Ignore や Snooze といったアクションの働きと、各アクションの弊社チームでの運用ついて紹介したいと思います。以下は今回の内容の簡易まとめ表になります。アクションエラーの移動先アクションの補足弊社チームでの運用AssignAssigned to anyone および Assigned to me再発して...
1ヶ月前
MSW で意図しないリクエストまでハンドリングされてハマった話
SocialPLUS Tech Blogのフィード
こんにちは、steshima です。ソーシャル PLUS ではフロントエンドの開発に MSW を用いて、ローカルサーバーを使った開発や spec、Storybook などに役立てています。今回、spec を実装していて MSW の仕様を知らずハマったポイントがあったので、この記事で紹介します。!MSW は現在 v2 が最新(執筆時点)ですが、この記事では v1 を使用しています。 ソーシャル PLUS の MSW を使った開発環境ソーシャル PLUS のフロントエンドでは、MSW の request handler を一つのファイルにまとめて定義しています。export...
1ヶ月前
Active Model Serializer で孫要素を含む場合のテストについて
SocialPLUS Tech Blogのフィード
はじめに弊社では JSON を返却する API を開発する際に、Active Model Serializer を使用してオブジェクトをシリアライズしています。https://github.com/rails-api/active_model_serializers普段の API の開発では先に Serializer とそのテストを実装し、その後に Controller とそのテストを実装することが多いです。今回は例として以下のような孫要素(comments)を含む JSON を返却する API を実装する場合について考えてみます。{ "user": { "na...
2ヶ月前
INSTANTアルゴリズムを使った巨大テーブルの効率的な列追加(削除)方法
SocialPLUS Tech Blogのフィード
okumudです。弊社では AWS Aurora MySQL を利用しており、大量のデータを持つ巨大なテーブルが存在しています。テーブルに列を追加・削除するときは、ALTER TABLE構文を使用しますが、MySQL の ALTER TABLE にはいくつかのアルゴリズムがあり、それぞれ効率やロックの挙動に違いがあります。本記事では、特にINSTANTアルゴリズムを使った、効率的で高速な列追加・削除の方法をご紹介します。 INSTANT アルゴリズムを使うメリットと具体的な使用方法INSTANT アルゴリズムは、テーブルのメタデータのみを変更するため、巨大なテーブルに対してもロ...
2ヶ月前
Reactフロントエンド開発におけるDependency Injection
SocialPLUS Tech Blogのフィード
Dependency Injection(DI)はバックエンド開発でよく使われる強力なデザインパターンですが、フロントエンド、特にReactアプリケーションでも非常に価値があります。この投稿では、DIの定義、テストにおける役割、Jestなどのモダンなテストフレームワークのモック機能との比較、およびReactでのさまざまなDIの方法について説明します。 Dependency Injectionとは?Dependency Injection (DI) とは、コンポーネントの依存関係(例:サービスや他のコンポーネント)を直接インスタンス化するのではなく、外部から提供するパターンです。こ...
2ヶ月前
ActiveStorage の service や name を変更したいとき
SocialPLUS Tech Blogのフィード
こんにちは、 simomu です。今日は ActiveStorage の service や name を変更したいときの話をします。以後断りのない場合はRuby on Rails 7.1の環境下での話とします。 ActiveStorage の service を変更したいとき ミラーサービスを利用する方法例えば、以下のような ActiveStorage の設定があるとします。config.active_storage.service = :old_amazonclass User < ApplicationRecord has_one_attache...
2ヶ月前
fluent-bit と kinesis の通信をインターフェースVPCエンドポイントに置き換えて通信料金を月$560削減した話
SocialPLUS Tech Blogのフィード
前提条件本記事では以下のバージョンを前提としています。EKS(EC2) 1.28fluent-bit(aws-for-fluent-bit) 2.28.0 概要サービスの成長に伴い、AWSのコストが増加するのは避けられないことですが、想定していた予算を超える状況になっていたため、インフラチームでコスト削減に注力することにしました。最近、いくつかの効果的なコスト削減を実現できたのですが、今回は「NatGateway-Bytes」の削減について、原因の特定から改善、効果測定までの事例をご紹介します。前回記事では「DataTransfer-Regional-Bytes」...
2ヶ月前
aspida の型情報を利用して MSW のモックを型安全に書こう
SocialPLUS Tech Blogのフィード
aspida の型情報を元にして、MSW の API モックを型安全に(そして楽に)書ける npm パッケージ、mswpida を作りました。https://www.npmjs.com/package/mswpida我ながら便利なものを作ってしまったので、この記事で紹介していきます。 使い方使い方はこんな感じです。パスパラメータ・リクエストボディ・レスポンスボディに自動で型がつきます。型注釈を手で書く必要はありません。mswpida の使い方/* * 1. aspida で生成した `api` 関数から `typedHttp` を作る */import { cre...
2ヶ月前
Docker コンテナ上の RuboCop LSP を使って Ruby コードをフォーマットする
SocialPLUS Tech Blogのフィード
masaki です。Ruby を使ったプロジェクトでは、フォーマッターとして RuboCop を使用していることが多いと思います。また、RuboCop は LSP(Language Server Protocol)に対応しているため、エディタに組み込んで利用している開発者も多いのではないでしょうか。本記事では RuboCop LSP を Docker コンテナ上で起動し、ホスト側のエディタで Ruby コードをフォーマットする設定について解説します。 この記事の対象者RuboCop を日常的に使用している Ruby 開発者LSP(Language Server Proto...
3ヶ月前
Rails 7.2で個人的に気になった変更点
SocialPLUS Tech Blogのフィード
はじめにこんにちは、kmkntです。本記事では、Rails 7.2の変更点について、CHANGELOGを読んで個人的に気になったものをまとめました。そのバージョンで目玉となるような新しい機能の追加など、大きな変更点はネット上の様々な記事で紹介されていますが、細かい変更点はあまり触れられていないので、自身のキャッチアップも兼ねて整理したいというのが趣旨になります。参考になれば幸いです。前回のRails 7.1の記事はこちらです。https://zenn.dev/socialplus/articles/814624da19d1b3 Active Record Supp...
3ヶ月前
MUI Data Grid の使い方と tips: ページネーションなし、検索機能、オーバーレイ
SocialPLUS Tech Blogのフィード
こんにちは、steshima です。MUI の Data Grid はソート、フィルタリング、ページネーションなど様々な機能を備えたリッチなテーブルコンポーネントですが、高機能ゆえに指定する props なども多く、使い方をよく調べる必要があります。この記事は Data Grid の特定のケースでの使い方や機能や tips などを備忘録も兼ねて書き残したものです。執筆時点の Data Grid のバージョンは 7.18.0 です。 ページネーション無しData Grid は MUI X のプランがフリープラン(Community プラン)の場合、ページネーションの ON/OF...
3ヶ月前
.rubocop.yml における対象バージョンの指定は省略できる
SocialPLUS Tech Blogのフィード
Ruby のプロジェクトではおなじみの Rubocop では、.rubocop.yml で基本的な設定を記述していると思います。その中に対象となる Ruby のバージョンを指定する項目(TargetRubyVersion)があるのですが、これは省略できるという話です。 なぜ省略できるのかバージョンを指定していない場合、Rubocop が別のファイルをたどって参照してくれるからです。公式の説明は以下です。https://docs.rubocop.org/rubocop/configuration.html#setting-the-target-ruby-versionIf ...
3ヶ月前
save 時に context を指定するとデフォルトの create, update のバリデーションが実行されない話
SocialPLUS Tech Blogのフィード
はじめにこんにちは, hamaguchi です今回は ActiveRecord の保存時に context を指定すると任意の条件のときだけ実行するバリデーションを定義することができるものの、注意が必要かもという話ですみなさんは ActiveRecord のバリデーションでカスタムコンテキストを使ったことはありますか?特定の処理の時だけバリデーションを実行したい場合に便利なので、システムが複雑になってくると使いたい場面が出てくると思います業務ですこし深い階層まで一気にデータを保存する際に、アソシエーションの先の方のバリデーションのためにコンテキストの指定が必要になり、 .s...
3ヶ月前