STORES Product Blog
https://product.st.inc/
こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。
フィード
Action Mailerに学ぶ闇の魔術と闇の魔術に対する防衛術
1
STORES Product Blog
はじめに STORES 予約でエンジニアをやっている@ucksです。 大体年内にやりたかったタスクが捌けてきたので空いた時間でブログを書いています。 Railsからのメール送信でお世話になるAction Mailer。 インスタンスメソッドを定義しているのにクラスメソッドから呼び出しをしています。 どの様な仕組みになっているのか不思議に思ったことはないでしょうか。 様々な方法で、OSSのソースコードを追うことがあると思いますが、今回は追い方の一例として、実際のAction Mailerのロジックを追いながら、どの様な仕組みになっているのか、参考になるロジックはあるのかを、探索したり、拡張できな…
4日前
ジオコーディングとGeolocation APIを用いて店舗と現在地との距離を計算する
STORES Product Blog
はじめに 初めまして、STORES でエンジニアをしているhiromu617です。この度、STORES では、STORES モバイルオーダーというサービスをリリースしました。 www.st.inc 今回は、STORES モバイルオーダー内に現在地から店舗までの距離を表示してみようと思います。 なお、モバイルオーダーを開発する上での取り組みについて、wanijiさんが紹介されているのでこちらも合わせて閲覧していただけると幸いです。 product.st.inc やりたいこと STORES モバイルオーダーには、注文する店舗を選択するための店舗一覧画面が存在します。 モバイルオーダーの店舗一覧画面…
6日前
モノレポでのVSCode Dev Container
STORES Product Blog
STORES 予約 でエンジニアをしている水野です。VSCode Dev Containerを利用すると開発環境のセットアップが迅速化されたり必要なライブラリ、ツールをコード化できたりとメリットが多いため導入している現場も多いかと思います。 STORES 予約 でもVSCode Dev Containerを利用しています。しかし今後モノレポな環境に携わる機会が見えたとき、そういえばモノレポでもVSCode Dev Containerって使えるんだっけ?となったので調べてみました。 Multiple containers モノレポの場合は公式で紹介されているMultiple containers…
6日前
AlloyDBを業務システムのバックエンドとして利用するためのアイデア
1
STORES Product Blog
はじめに fujiuです。この記事ではGoogle CloudのフルマネージドPostgreSQL互換データベースであるAlloyDBについて、業務システムのバックエンドとして利用する方法を紹介します。 AlloyDBはPostgreSQL互換なインターフェースを備えているためOLTPのユースケースにおいて高速にクエリすることができます。 さらに、AlloyDBはカラムナエンジンという仕組みを備えており、これをうまく扱えるようなSQLでクエリすることで、OLAPのユースケースでも使えるようなパフォーマンスを発揮します。 STORES において顧客データを集約し活用することは、事業者さまのビジネ…
6日前
モバイルオーダーを開発する中で役立った5つの取り組み
STORES Product Blog
始めに STORES エンジニアの waniji です。このたび STORES では STORES モバイルオーダー というサービスをリリースしました。 www.st.inc 価値の高いプロダクトをスピード感を持って開発するため、チームでさまざまな取り組みを実施してきました。その中でも、特にやってよかったと感じた取り組みを5つ紹介します。 1. リリースフェーズを区切る モバイルオーダーで実現したいことは多岐にわたりましたが、すべてを盛り込むとリリースが後ろ倒しになってしまうため、優先順位を明確にする必要がありました。そのため、リリースまでのマイルストーンとしてリリースフェーズを区切り、そのフ…
7日前
GitHub の Sub-issues はいいぞ
56
STORES Product Blog
GitHub の Sub-issues はいいぞ はじめに こんにちは! STORES でソフトウェアエンジニアをしている @m0nch1 です。 今回は GitHub issues に新しく追加された Preview 機能の1つである Sub-issues について紹介しようと思います。 Sub-issues は GitHub Projects と組み合わせることでより便利に機能するものになっており、GitHub Projects での活用例についても紹介しようと思います。 ちなみに STORES ではバックログの管理に GitHub Projects を活用しているチームが多く、日々活用し…
7日前
自動化でスクラムを後押しする
1
STORES Product Blog
こんにちは。STORES ブランドアプリ のバックエンドエンジニアをしているotariidaeです。2024年4月に新卒入社して初めてブログを書きます。 リモートワーク環境下でのスクラムイベントの課題 みなさんはスクラムをやっていますか?透明性・検査・適応を日々実践していますか? 私が所属するチームでも開発プロセスとしてスクラムを採用しています。 また STORES ではリモートワーク中心の働き方になっており、社内の多くの会議はオンラインで行われています。スクラムイベントも例外ではありません。 スクラムイベントをオンラインで実施する上で重要なことは何でしょうか? そうですね、わいわいスレですね…
7日前
Oktaの SMS/音声認証終了に対応しました
2
STORES Product Blog
こんにちは、コーポレートエンジニアの伊藤(ito2)です。 今回は、先日対応した Okta のSMS/音声認証の停止について書いていきます。同様のケースを検討される際の参考になれば幸いです。 以下、前置きです。 私は、PX 部門 IT 本部コーポレートエンジニアリンググループに所属しています。 PX は、人事、採用、労務、広報、社内IT からなる部門で、人事はプロダクト開発と同じ、従業員と考えるのではなく、ユーザーと捉えようという考えから「People Experience(PX)」と名乗っています。社内 IT についても同じ文脈で活動しており、ユーザー体験を重視するメンバーが集まっています。…
7日前
スクラム開発で行った改善の話
1
STORES Product Blog
はじめに こんにちは、STORES のエンジニアの takeuchi です。 私が現在所属しているチームは2024年の春に新規に編成され、現在まで新規プロダクトの開発に取り組んできました。 このチームでは、スクラム開発を採用しています。2週間スプリントごとにスプリントゴールを設定し、そのスプリントゴールの達成を目指しプロダクト開発を前進させています。 本記事では、私たちのチームのスクラム開発の概要と、スプリントを重ねながらチームで改善してきたことについて紹介します。 スクラム開発の概要 スクラムイベント スクラム開発は、短い開発サイクル(スプリント)を通じて計画・作業・振り返りを繰り返すソフト…
7日前
KMP / CMPを使った新規プロダクトの開発
2
STORES Product Blog
このたび STORES では STORES モバイルオーダー というサービスをリリースしました。 www.st.inc 名前からも想像できるように、店頭から離れた場所からもスマートフォンでテイクアウト注文できる特徴をもったサービスです。 注文するお客様にとって、移動中に注文をして待ち時間を短縮できるとても利便性が良いサービスですが、お店にとっても行列を見てお客様が返ってしまう機会損失をなくしたり、電話を使わずに新規の注文を受け付けられるなどメリットがあります。 では、お客様が注文したオーダーをお店の方はどのように把握し、調理を開始するのでしょうか。また、調理が終わったら、どのように受取に来てほ…
8日前
プロと読み解くRuby 3.4 NEWS
STORES Product Blog
プロと読み解くRuby 3.4 NEWS テクノロジー部門技術基盤グループの笹田(ko1)と遠藤(mame)です。Ruby (MRI: Matz Ruby Implementation、いわゆる ruby コマンド) の開発をしています。お金をもらって Ruby を開発しているのでプロの Ruby コミッタです。 本日 12/25 に、恒例のクリスマスリリースとして、Ruby 3.4.0 がリリースされました(Ruby 3.4.0 リリース )。今年も STORES Product Blog にて Ruby 3.4 の NEWS.md ファイルの解説をします(ちなみに、STORES Adven…
8日前
STORES レジ のビルド時間を改善したかった話
STORES Product Blog
こんにちは! STORES レジ の開発をしている iOS / Android エンジニアの @satoryo056 です。 今回は STORES レジ のビルド時間を短縮するために実験したことを紹介します。 STORES レジ について STORES レジ (以下、レジアプリ)は iPadOS 専用のモバイルアプリで、実店舗とネットショップの商品・在庫・売上の管理をしたり実店舗(オフライン)でのお会計をすることができます。 最近は 予約システムとの連携機能を実装 したり、長年課題だった技術的負債の改善 に取り組んだり、プロダクト監視の時間 を設けたりと開発面・運用面でアップデートを続けていま…
8日前
enableEdgeToEdge のデフォルト引数を理解しよう
STORES Product Blog
こんにちは、naberyo(@error96num)です。今年4月に STORES へ入社し、 STORES ブランドアプリ のAndroidエンジニアをしています。 Androidエンジニアのみなさま、アプリのターゲットSDKは35に上げましたか? もし上げたなら、エッジツーエッジ対応もお済みでしょうか? Android 15 (SDK 35) 以降をターゲットとするアプリでは、画面の端から端までコンテンツが描画される「エッジツーエッジ」がデフォルトで適用 されるようになりました。この変更は、没入感あるUXを実現する素晴らしい機能ですが、対応を間違えると思わぬ落とし穴にはまる可能性があります…
9日前
Passkeyの作成・取得に関するWebAuthn APIの重要オプション解説
STORES Product Blog
はじめに こんにちは!@m11oです。 この記事はSTORES Advent Calendar 2024の17日目の記事です。今回はWebAuthn APIにおけるPasskeyの作成・取得に関する主要なオプションを網羅的に解説しようと思います。 というのも、自分がPasskeyを実装した際に、WebAuthn APIのドキュメント以外でまとまった記事が見つからず、試行錯誤したり、色々な人に教えてもらったりしながら、苦心して実装しました。 なので、この記事ではオプション一つひとつの役割や返ってくるデータを明示することで、実装時の参考にしていただければ嬉しいです。 想定読者 これからPasske…
9日前
STORES 決済から別の現場に異動した話
STORES Product Blog
はじめに こんにちは。 @nannanyです。 この記事はSTORES Advent Calendar 2024の12/20の記事です。 2024年の4月より、STORES 決済 のバックエンド開発を離れ、STORES内の別プロダクト開発に従事してきました。 現場移行に伴ってやったこと、変えたこと、感想などを綴り、STORES で働くイメージ喚起につながればと思いこの記事を執筆しました。 経緯 STORES ではネットショップ・予約システム・キャッシュレス決済・POSレジ・ブランドアプリ・ロイヤリティ・データ分析、といった複数のプロダクトを運営しています。 私自身は2021年の5月から STO…
9日前
Goのテストで GraphQL APIサーバのE2Eテストを書く方法
STORES Product Blog
はじめに こんにちは、STORESの高田です。 STORES には Go で実装した GraphQL API サーバがあり、そのプロジェクトでは Go のテスト内で E2E テストを行っています。今回はそのテスト方法についてご紹介します。 実装例 今回の E2E テストは CI でも実行したいため、再現性のある安定したテストであることが求められます。 少し工夫する必要がありますが、テスト対象となるサーバのポート確保時に、エニーポートを指定して動的にポートを割り当てることで安定したテストを実現できます。 以下のコードのように、 TestMain 内での net.Listen("tcp", "lo…
9日前
実装漏れをテストで防ぐ仕組み
STORES Product Blog
実装漏れをテストで防ぐ仕組み STORES 予約 で Web エンジニアをしている osd です。 実装漏れの問題はプロダクト開発の中でも根本的な解決が難しい問題の一つだと思っていて、その問題を解決する一例として「複製機能の実装漏れを防ぐ仕組み」についてお話しします。 予約ページとは STORES 予約 では、予約受付の設定が区切られる予約ページという概念が存在します。予約ページでは 価格の設定 支払い方法の設定 担当スタッフの設定 予約受付時間の設定 などの設定を行うことができ、よく機能追加や改修が行われる箇所の一つです。 予約ページトップ 複製機能とは 複雑な設定値を持つこともあり、設定漏…
9日前
STORES レジにおけるSwift6移行対応
STORES Product Blog
この記事は STORES Advent Calendar 2024 の16日目の記事です。 はじめに こんにちは、STORES レジ でアプリ開発している @nekowen です。 STORES のモバイルプロダクトは STORES レジ 以外に「STORES ブランドアプリ」「STORES 決済」「STORES 予約」が存在しますが、今年の下期から各プロダクトで Swift6 に移行する取り組みを行なっています。 本記事では STORES レジ で取り組んでいる Swift6 移行対応についてかんたんにご紹介します。 実施計画と見積もり 🤔 レジアプリは SwiftPM を用いたマルチモジュ…
10日前
新卒1年目を振り返る!
STORES Product Blog
こんにちは! STORES 決済 Androidチームのchukaです。 こちらはSTORES Advent Calendar 2024 16日目の記事です。 気がつけば12月ももう終わりですね。 2024年は私が新卒として STORES に入社し、たくさんの初めてに直面した1年でした。 せっかくなので、この1年で経験したことについて振り返っていきたいと思います! QRコード決済 STORES 決済 は、今年11月11日に「PayPay」などの20種類以上の主要QRコード決済に対応しました!🎉 www.st.inc こちらのQRコード決済プロジェクトに、入社して1~2ヶ月頃から携わらせていただ…
10日前
GraphQLの @oneOf ディレクティブの活用事例
STORES Product Blog
STORES でバックエンドエンジニアをしている片桐です。 みなさんはGraphQLの@oneOfというディレクティブをご存知でしょうか? このディレクティブは、GraphQLの標準仕様においてBuilt-in Directivesへの追加が検討されている新しいディレクティブです。 RFC: https://github.com/graphql/graphql-spec/pull/825 今回 STORES のプロダクトで実際に導入してみたので、このディレクティブの具体的な使用例と使用してみて気づいたことを紹介します。 @oneOf ディレクティブとは? @oneOf は input に対して…
10日前
go-cmp/cmp/cmpopts のオプション活用事例
STORES Product Blog
はじめに こんにちは、STORESの高田です。 今回は github.com/google/go-cmp/cmp のオプションの中から、実際のテストコードで使用頻度の高いオプションについてご紹介します。 基本的な使い方 cmp パッケージ用の汎用的なオプションは cmpopts package - github.com/google/go-cmp/cmp/cmpopts - Go Packages で提供されています。以下のように cmp.Diff() への引数として使うことができます。 t.Run("...", func(t *testing.T) { ... opts := cmpopts…
10日前
net/http/httptest でHTTPクライアントをテストする方法
STORES Product Blog
はじめに こんにちは、STORESの高田です。 今回は net/http/httptest でHTTPクライアントをテストする方法についてご紹介します。 外部サービスのクライアントを含めたテストを実装する際には net/http/httptest を使うと、外部依存を排除しつつ再現性のあるテストを書くことができます。 基本的な使い方 テストの一例として、 Refresh token を用いて Access token を取得する箇所での使い方を見ていきます。 使い方は以下の通りで、httptest.NewServer でテスト用のHTTPサーバを作成します。func NewServer(han…
13日前
Dependabotを活用してライブラリのアップデートを効率化
STORES Product Blog
はじめに こんにちは、STORESの高田です。 今回は Dependabot を用いてライブラリのアップデートに追従する方法についてご紹介します。 プロジェクト開始時に見落とされがちな物のうちの一つに、ライブラリのアップデートがあると思います。途中から更新に追いつこうとすると気が思い作業になるので、早めに設定しておくと後々苦労せずに済みます。 アップデート方針を決める アップデート方針はチームに合うように調整すると良いと思いますが、今回は以下の方針で設定します。 ライブラリのアップデートにはできるだけ工数をかけない セキュリティアラートは可能な限り早く対応する Dependabot の設定 D…
14日前
一括登録機能実装における設計と実装
STORES Product Blog
はじめに STORES 予約 で Web エンジニアをしている osd です。 今回は STORES 予約 で店舗一括登録を実装した際の設計、実装についてお話しします。 前提 なぜ必要とされているのか STORES 予約 では、事業者が店舗を追加する毎に開設手続きを行う必要があります。具体的にはその際に 店舗情報の登録 予約での店舗情報(業種/id 設定など) の操作を店舗数分行う必要があります。大規模な事業者になると 3 桁店舗数の作成が必要になり、開設工数の増加やミスが発生しやすい状況になります。 また、店舗ごとに予約ページ設定やスタッフ登録などの設定が必要になるため、店舗登録以外の一括設…
14日前
2024年にチャレンジしたことを振り返るぞ
STORES Product Blog
こんにちは! STORES 決済 Androidチームでお仕事しています。みっちゃんといいます。 こちらは STORES Advent Calendar 2024 の 12月19日の記事です! よろしくお願いします!! 12月なので2024年にチャレンジしたことを振り返ろうと思います。 2024年にチャレンジしたこと たくさんありますが、特に大きな挑戦を取り上げると以下の三つかなと思いました。 DroidKaigi 登壇 勉強会の企画 書籍の執筆 それでは一個ずつ振り返ります! DroidKaigi 登壇 難読化をテーマにDroidKaigi 2024に登壇しました。 speakerdeck.…
15日前
データベースのJSON型をRailsらしく扱う方法の提案
STORES Product Blog
データベースのJSON型をRailsらしく扱う方法の提案 この記事はSTORES Advent Calendar 2024の13日目の記事です。 はじめに STORES 予約のエンジニアの@ucksです。 なぜかブログはDBネタばかり書いていますが、今回もDBネタになります。 多くのRailsアプリケーションで利用されているActive RecordはRDB用のORMです。 RDBは正規化したテーブル設計を行うことが基本ですが、昨今のRDBでは非正規化データを扱えるJSON型のサポートも増えてきており、Active Recordでもサポートされています。 JSON型を活用する事で、正規化の必要…
15日前
Playwrightを活用したRESTful APIのシナリオテスト
STORES Product Blog
はじめに こんにちは、STORESの高田です 今回は Playwright を用いて RESTful API のシナリオテストを実装したことについてご紹介します Playwright ではAPIの操作フローをプログラムで書けるため、想定利用ケースをコードで明示できる上、融通の効くテストが書けます。「初期ユーザを準備する」といった何度も行う処理を再利用可能な状態で切り出せたり、ヘッダー・認証・ミドルウェア等の処理を通したテストができるため、より実態に近い状態でテストできるメリットがあります ただ、ここで直面する問題として、公開されたAPIだけではシナリオが完結できないケースが出てきます。例えば、…
15日前
モバイルアプリのリリースから振り返る STORES 決済 の 2024年
STORES Product Blog
師走っ!! こちらは STORES Advent Calendar 2024 の 13日目の記事です。 product.st.inc なんだか毎日寒いですね! さて、毎年のように 決済 モバイルアプリのリリースから1年を振り返ってますが 今年もはりきって振り返りますよ。 ということで、こんにちは! STORES 決済 モバイルチームの Engineering Manager、 iOS アプリ・SDKの開発を担当しております。 いわいです。 ※昨年同様 STORES 決済 モバイルチームはアプリ以外に STORES 決済 SDK もリリースしていますが、そちらは割愛します。 では早速2024年 …
16日前
Go言語プロダクトでテストヘルパー関数を導入した話
STORES Product Blog
はじめに こんにちは、STORESの高田です STORES には Go 言語で書かれたプロダクトがいくつかあります。今回は、その中で使用しているテストヘルパー関数である testutils.Assert と応用についてご紹介します ベースは google/go-cmp 現在のコードベースでは、テスト中でデータの比較を行うのに github.com/google/go-cmp/cmp を使っています。google/go-cmp の使用例としては以下のようになります if diff := cmp.Diff(want, got, opts...); diff != "" { t.Errorf("di…
16日前
カンファレンスへの参加・協賛が決まった時に技術広報がやること
STORES Product Blog
こんにちは、技術広報のえんじぇるです。 この記事は技術広報アドベントカレンダー17日目の記事です。 技術広報として、欠かせない業務のひとつ、カンファレンスへの参加・協賛が決まった時にやっていることを紹介します。 お金 カンファレンスの参加・協賛に欠かせないのがお金です。 カンファレンス協賛のためのお金ですが、年間の計画を立てて予算をとっています。 計画策定時には昨年度の実績を参考にするため、協賛費用の変更があった場合にはひと慌てありますが、どうにかやりくりしています。 次に参加費用です。STORES では、カンファレンスに参加するための制度『Canサポ』があります。 仕事をより効果的に行うため…
17日前