Uzabase for Engineers
https://tech.uzabase.com/
スピーダ, NewsPicksなどを開発するユーザベースのTech Blog & エンジニア採用サイト
フィード

dangerously skip permissionsをしたい!
Uzabase for Engineers
はじめに こんにちは! 株式会社ユーザベース Speeda事業 の松村です! Claude Codeに開発を任せ、人の確認を挟まずに自律的に作業してほしい。 しかし、--dangerously-skip-permissions をホストPC上でそのまま使うのは怖い。 この二つを両立するため、Claude Code専用のDev Containerを構築しました。 この記事では、複数人が共同利用するペアプロPCを前提に、認証情報や外部通信をどのように扱ったかを紹介します。 なお、今回の構成はホストPCから完全に隔離されたサンドボックスではありません。開発に必要な機能を残しながら、複数の対策を重ねて…
5日前

EC2で動いていた社内システムをLambda+S3に載せ替えてコスト削減をした話
Uzabase for Engineers
SREQAチームでは、AWSコスト削減のために社内システムのアーキテクチャを刷新しました。lambdaとS3の活用で効率化を図り、成功に至ったプロセスを紹介します。
18日前

AI 主導で office.js のモックライブラリを開発し、実際の E2E テストで使いながら育てた話
Uzabase for Engineers
こんにちは。株式会社ユーザベース スピーダ事業の沖です。 私のチームでは Excel アドインを開発しています。Excel アドインは、Web の技術(HTML / JavaScript)で作る Excel の拡張機能です。アドインから Excel を操作するには、Microsoft が提供する JavaScript ライブラリである office.js を読み込み、office.js が用意する Excel や CustomFunctions といったオブジェクトを通して操作します。 このアドインをテストするために、office.js をメモリ上で再現するモックライブラリを作り、プロダクトの…
19日前

Datadog で始める AI エージェントのオンライン評価
Uzabase for Engineers
はじめに AI エージェントの品質は、エラー率やレイテンシだけでは捉えきれません。たとえリクエストが 200 で素早く返ってきたとしても、質問にきちんと答えられていなかったり、もっともらしい誤情報を返していたりすれば、ユーザーにとっては失敗したリクエストと変わりません。 そのため、エラー率やレイテンシだけでなく、エージェントが生成した回答の内容や、必要なツールを正しく呼び出せたかといった、実際の振る舞いそのものを評価する必要があります。 また、こうした品質についても、エラー率やレイテンシと同じように SLO として定量的な目標を置いて運用していくことで、品質の悪化を継続的に捉え、どこまでを許容…
20日前

Claude Codeのスキルで社内問い合わせ業務の属人化をなくした
Uzabase for Engineers
こんにちは。ソーシャル経済メディア「NewsPicks」のPlatform Engineeringチームの崔(ちぇ)です。 チーム名から、開発者体験の向上にフォーカスした改善を主に担当するだろうなと思った方が多いと思います。 実は、弊チームはそれに加えて、ビジネスサイドの業務生産性を向上する開発を進めることが多々あります。エンジニアに限らず社員の本質的でない仕事を減らす、それがこのチームの存在意義だと考えています。 第一に思い浮かぶのは、ビジネスサイドの反復的な単純作業を自動化することで業務生産性を向上させることです。しかし、エンジニアって社内からの「これがうまくいかないです」「ユーザーさんか…
24日前

Elasticsearchの前方一致検索で「ヒットしない!」を解決する:index_prefixes の仕組みと実践
Uzabase for Engineers
こんにちは。 株式会社ユーザベース スピーダ事業の田島です。 突然ですが、ESの前方一致検索でこんな経験、ありませんか。 「たしかに登録したはずのデータが、検索しても出てこない」 全部が出てこないなら「バグだ」とすぐ気づけます。やっかいなのは、ほとんどのデータはちゃんと出てくるのに、なぜか特定のものだけが抜け落ちるというケースです。今回は、その原因不明の検索漏れの正体を調べ、Elasticsearch の index_prefixes という機能で解決できた話を書きます。 同じところで困っている方の参考になれば嬉しいです。 この記事の結論 先に、これから話すことの結論をまとめておきます。 通常…
24日前

OCaml 5 の Effect Handler で依存性注入をやってみた
Uzabase for Engineers
はじめに こんにちは、塚田です。 OCaml 5 で Effect Handler が入りました。例外のように処理の途中から外側へ制御を渡せて、しかも外側から値を受け取って元の場所から処理を再開できる、という仕組みです。言語機能としてはかなり面白いのですが、実務のコードでうまく使えるのかは、実際に書いてみないとわかりません。 そこで、社内のマイクロサービスの API に OCaml を導入してみました。今回は、その API で Effect Handler をどう使っているかを書こうと思います。 Effect Handler とは OCaml は ML 系の静的型付け言語です。関数型言語ですが…
24日前

Clean Architecture から考える Rust の anyhow と thiserror の使い分け
Uzabase for Engineers
株式会社ユーザベースの平山です。 この記事では Rust のエラー処理ライブラリ anyhow と thiserror の使い分けについて Clean Architecture の視点から考えてみます。 一旦結論だけ ドメインエラー: 独自のエラー型を定義して thiserror を使う ユースケースエラー: 独自のエラー型を定義して thiserror を使う インフラエラー: anyhow::Error に変換するか、インフラ層でドメインエラーやユースケースエラーに変換する ユースケース や Port の signature では fn name(...) -> anyhow::Resul…
1ヶ月前

SSEでAgentの実行結果を配信するアプリにおいて、Graceful Shutdown に手こずった話
Uzabase for Engineers
はじめに こんにちは。 株式会社ユーザベースの花岡です。 私が所属するチームでは、Agentの実行結果をServer-Sent Events(SSE)で配信するアプリケーションを開発しています。 今回は、そのアプリケーションにGraceful Shutdownを導入したにも関わらず、デプロイ時にSSE接続が切れてエラーになったことについてです。 原因の調査と対応を通じて学びが多かったため、この記事で共有します。 目次 起きたこと 原因となる事実 1. デプロイ時のRollout戦略による挙動 2. アプリケーションが依存するライブラリの仕様による挙動 対応 まとめ 出典 起きたこと 私たちが開…
1ヶ月前

巨大モノレポ2つをまたぐ開発を、Claudeにちょうどよい大きさで渡す
Uzabase for Engineers
こんにちは。JPプロダクト開発本部の冨田です。 弊社のGitリポジトリはモノレポで、ほとんどすべてのアプリケーションが一つのリポジトリに入っています。なので、Claudeを利用する場合などは、「ディレクトリAとディレクトリBとディレクトリCを見て作業して」みたいな指示をすることが多いです。 今回は複数のリポジトリをまたいだ開発をする機会があったので、そのときの知見をまとめます。 前提 アプリケーションはリポジトリAに置いてあるのですが、E2Eテストやローカルで動作確認するためのバックエンドはリポジトリBに置いてありました。あまりやらないであろう特殊な状況ですが、その上でClaudeに環境構築か…
1ヶ月前

Selenium Gridでblobダウンロードが未確認.crdownloadのまま確定しないのでKotlinのテストが失敗する
Uzabase for Engineers
はじめに Buildkite上のE2EでPowerPointのダウンロード検証がタイムアウトしたのでまとめます 問題 Gauge + SelenideのE2Eで、フロントが生成したpptxのダウンロードを検証していました。 CIはリモートのSelenium Grid上のChromeで、ダウンロードはse:downloadsEnabledとHasDownloadsで取得しています。 アプリ側の保存はblob URLと<a download>です。 const objectUrl = URL.createObjectURL(content); const anchor = document.cre…
1ヶ月前

Salesforceパッケージ間の依存で苦戦した話 ~エラー事例と暫定回避アプローチ~
Uzabase for Engineers
はじめに こんにちは。株式会社ユーザベース Speeda事業の佐藤、小原、岩井です。 普段はSalesforceのパッケージ開発を行っており、今回はパッケージ開発における構想と、開発時に直面した課題、そして我々が取った対応についてご紹介したいと思います。 開発しているもの 私たちのチームでは、Speedaの情報をSalesforce上でシームレスに活用するためのパッケージ開発を進めています。 提供している主な機能は以下の通りです。 商談資料の自動生成機能:Salesforce登録企業をターゲットに、Speedaの知見を組み込んだ資料を自動生成 アカウントプランの自動生成機能:商材と戦略を掛け合…
1ヶ月前

AIエージェント開発におけるトリレンマの解決アプローチ (エージェントと責務の分離)
Uzabase for Engineers
はじめに Google ADKを使ったPPTXスライド生成エージェントを開発している中で、トリレンマに遭遇したのでその内容と解決方法をまとめます。 開発しているエージェントには、ユーザーの指示を受けてスライドを生成する/runエンドポイントがあります。 しかし、エージェントが利用しようとした図形にスライド生成ツールが対応していない場合など、ユーザーの意図どおりにスライドを生成できないことがありました。 このとき、HTTPステータスと生成結果をどのように返すべきかを考える必要がありました。 トリレンマとは? 私がトリレンマという言葉に初めて出会ったのは、DDD(ドメイン駆動設計)をやりはじめたと…
1ヶ月前

Clojureのmapに1項目追加したら順番が変わる PersistentArrayMapとPersistentHashMap
Uzabase for Engineers
はじめに こんにちは。Product Teamの渡邉です。 私が所属するチームではアカウントプランを自動で作成してPPTXに書き出す機能を開発しています。 Clojureで、mapの内容を順番にスライドへ変換する処理を修正していました。 もともとの対象は8スライド作成済みで、その順番のままスライドへ変換されていました。 (def key->slide-info {:section-a {:title "スライド1" ...} :section-b {:title "スライド2" ...} :section-c {:title "スライド3" ...} :section-d {:title "ス…
1ヶ月前

AWS S3を活用したデータ配信の裏側 ~ Speeda Datafeed事業のパイプラインとアクセス制御 ~
Uzabase for Engineers
はじめに こんにちは。JP Product Division に所属している datafeed チームです。 Datafeed チームでは、Speeda が保有する経済情報データを、API やクラウドストレージ連携を通じてお客様へ届けています。 今回はその中でも、AWS S3 を活用したクラウドストレージ連携にフォーカスし、安全なデータ配信を支えるパイプライン設計やアクセス制御の仕組みについてお話しします。 大量かつ重要な経済情報データを継続的に提供するには、データを生成するだけでなく、更新内容の確認、異常の検知、データ品質の検証、配信範囲の制御までを一連の仕組みとして設計することが重要です。…
2ヶ月前

ADKとA2Aで動くエージェントで出力形式を切り替える
Uzabase for Engineers
はじめに こんにちは、Speeda Product Teamの横山です。 Speeda AI Agentでは、多数のAgentがA2Aプロトコルを用いて連携しています。 各Agentは基本的にマークダウン形式のテキストで出力を返します。Agentや人間が読む場合はこれでも良いのですが、プログラムで扱う際は構造化された出力が欲しいです。 今回まさにそういう用途があったので、A2A x ADKでクライアントからのリクエストに応じて出力形式を分ける方法をご紹介します。 環境: google-adk 2.8.0 / Python 3.13 A2Aの仕様 A2Aでは出力形式を表明する仕様が用意されていま…
2ヶ月前

AI時代のスピード開発を支える「生きた仕様書」— E2E×Gaugeでドキュメントの風化を防ぐ
Uzabase for Engineers
🎀 はじめに 現代のソフトウェア開発において、Claude CodeやCodexといった最先端のAIツールの導入は、エンジニアの生産性を劇的に向上させています。 私たちが開発スピードの向上を追い求める本質的な理由は、 一刻も早くリリースしてフィードバック(FB)サイクルを回し、ユーザーへの仮説検証を高速化するため と考えています。 AIツールは、アイデアを動く形にして検証サイクルに乗せるまでのリードタイムを極限まで短縮し、開発全体のFBループを大きく加速させてくれました。 しかし、この高速な開発サイクルを回し続ける中で、ある致命的なボトルネックが浮き彫りになってきました。 ドキュメント(仕様書…
2ヶ月前

事業部の手作業を自動化したら、データ分析まで自走できるようになった話
Uzabase for Engineers
はじめに こんにちは。ソーシャル経済メディア「NewsPicks」のPlatform Engineeringチームのカトマサです。 以前、新卒エンジニアとしての成長記録を書いてから約1年半、動画配信や記事編成システム周りを中心に開発を続けてきました。 今回は、広告動画制作部門の「クライアント向けレポート作成」という手作業の自動化をきっかけに、事業部の方が直接データ分析やダッシュボード作成ができる基盤まで整えた、という一石二鳥なプロジェクトの話をします。 はじめに NewsPicksのPlatform Engineeringチームとは? レポート作成自動化プロジェクトについて 解決したい課題 完…
2ヶ月前

非エンジニアがSFDC開発チームに"兼務"して見えたもの ―受注管理業務設計と開発、両方の視点を持つことの価値―
Uzabase for Engineers
皆さんこんにちは。 株式会社ユーザベース スピーダ事業Business Process Management(以下BPMと称する)チームのLeeと申します。 チームのR&Rとしては、UBグループ全体の受注以降の販売プロセスの企画・設計を通して販売/契約管理の安定運用の実現とガバナンスの担保しております。普段のSFDCとの接続は「業務としてSFDCをどう使うか」を考える側の人間で、開発経験はありません。 そんな私が、今年1月から横のチームにあるSales System Engineeringチームに兼務という形で入ることになりました。最初は正直、ワクワクもたくさんありましたが、コードも書けない自…
2ヶ月前

GitでCRLFを含むファイルを管理したい!
Uzabase for Engineers
はじめに こんにちは!株式会社ユーザベース スピーダ事業でソフトウェアエンジニアをしている阿波連、内山、撰、知念です。 私達は現在、データの取り込み業務を行っており、様々なファイルの読み込み、Speedaに取り込んでいます。 その中で、ファイルの改行コードがCRLFのものがあり、そのテストを書くために、CRLFのファイルをgit管理するときに躓いた話をブログで執筆することにしました。 問題 $ git add -A warning: in the working copy of 'path/to/crlf_include.csv', CRLF will be replaced by LF th…
2ヶ月前

ペアプロ未経験が2ヶ月間ペアプロしてみての感想
Uzabase for Engineers
XPをやっているチームに入って2ヶ月が経ちました。Product Teamで、私はここで初めてXPを経験し、多くのギャップを感じました。 今まで自分が「良い仕事の仕方」だと信じていたものが、このチームではだいたい逆だったからです。 分からないことは、調べる前に聞く 一番ギャップが大きかったのがこれでした。 私はこれまで、分からないことがあったらまず自分で調べる人でした。調べて、自分なりの案を持って、それから相談していました。人の時間を奪わないためのマナーだと思っていました。 ペアプロだとそれができません。隣に人がいて、同じ画面を見ていて、手が止まった時点で調べるより先に喋ることになります。 わ…
2ヶ月前

RAGエージェントの評価指標を評価する
Uzabase for Engineers
はじめに こんにちは! 株式会社ユーザベース スピーダ事業・プロダクトチームのドメイン特化モデルチームの飯田です。 今四半期、Gemini 2.5 Flashを使っていたエージェントの生成モデルをGemma 4に置き換え、プロダクションに導入しました。本記事では、その判断材料を作るために行った、評価観点の設計、LLM-as-a-Judgeの構築、人手評価による検証について述べます。 取り組みは、評価対象を定める、評価方法を定める、その評価方法を検証する、という3フェーズに整理できます。なお、今回の評価は検索を含むエージェント全体ではなく、主に検索後の回答生成を対象とします。したがって、本記事の…
2ヶ月前

AIによるSQL生成に潜む罠と対策 〜本番データ更新におけるAIとの正しい付き合い方〜
Uzabase for Engineers
プロダクトチームの小林です。 弊社では、エンジニアの技術力向上および自主的な挑戦を推奨する取り組みとして「ひとりプロジェクト」を実施しています。これは、通常行っているペアプログラミング環境から一度離れ、1ヶ月程度で企画・設計・実装・リリースまでを1人のエンジニアが遂行する制度です。 今回は、この取り組みの中で社内ツールを開発した際、AIコーディングアシスタントが生成したSQLを過信した結果、意図しない大規模なデータ更新を発生させてしまった失敗事例と、そこから得た「AIとの付き合い方」、および再発防止策としてのシステム的なガードレール構築についてご紹介します。 発生したインシデントの概要 今回の…
2ヶ月前

1on1 コーチングの奥義 なにもしないテクニック
Uzabase for Engineers
プロダクトチームでは週1回程度にメンバー同士でコーチングを行っています。 コーチを担当するとやったことのないコーチングに難しさを感じることがあります。 「どうやって気づきを与える質問をしたらよいかわからない」 「何を話していいのかわからない」 「悩みがないから何を話せばいいのか迷う」 「相手に気を使わせてしまっている」 コーチングにはいくつか流派がありますが、 その中でも私が実践しているカウンセリング手法を利用したコーチングについて紹介します。 このコーチング手法の特徴は、 コーチが何もしなくても勝手にコーチングが終わる このような不思議な体験が得られることです。 またコーチングのデモをみてい…
2ヶ月前

Kubernetes上の通信がなぜか15分で途切れてしまう謎を解明した話
Uzabase for Engineers
はじめに はじめまして、スピーダ事業Product Teamの清水です。 私たちのチームではKubernetesを利用してアプリケーションの運用をしております。 今回はKubernetesのあまり知られていない設定により詰まる経験をしたので、供養のため記事にしたいと思います。 今回の経緯 私たちのチームではLLM(Agent)を利用して各企業の経営課題を各種公開資料から抽出し、課題一覧として取得するということを行なっています。 こちらの処理では、企業の実態を反映した高品質な課題を抽出するため、LLM(Agent)によるレビューを何度も繰り返して最終的な出力を行います。 そのためレスポンスが返っ…
3ヶ月前

セッション管理から共有ストアを消す — 暗号化 cookie に状態を持たせる
Uzabase for Engineers
課題:短命なデータのために共有ストアを運用する手間 株式会社ユーザベースでSpeedaのソフトウェアエンジニアをしている塚田です。 今回は新しい画面の開発でOIDCでログイン機能を実装したときの学びについて書きます。 我々のアプリは複数台のレプリカ構成になっています。 この場合、各レプリカがバラバラに状態を持つとログイン状態が一致しないので、 インメモリでセッションを持つ選択肢はありません(レプリカ間で不整合になります)。 各レプリカで共有できるストアが要る、というのが従来の発想です。実際これまでもセッションは共有の KVS に持たせてきましたし、その運用が特別つらかったわけでもありません。 …
3ヶ月前

『チーム・ジャーニー』の3つの問いでチームビルディングをやってみた
Uzabase for Engineers
はじめに こんにちは。スピーダ事業Product Teamの中嶋です。 以前の記事で1週間ごとにチームのふりかえりをしていると書きました。 tech.uzabase.com ふりかえりのファシリテーターは、基本的にはチームの外から呼んできます。 今回、私は別のチームから依頼された側でしたが、状況から考えると「ふりかえりよりも先に、チームビルディングをやったほうが良いのでは?」と思い、実際にチームビルディングのファシリをしたので、そのときの話を書こうと思います。 はじめに いつもどおりのふりかえりファシリ依頼 チーム始動直後という、いつもと違うタイミング チームビルディングで何をやるか 『チーム…
3ヶ月前

全員がリーダーである世界へ シェアドリーダー×キリマンジャロへの挑戦
Uzabase for Engineers
リーダシップ研修としてキリマンジャロに登ってきました。 その中でユーザベースで行われている シェアドリーダーシップという取り組みの本質を肌身で体感したのでまとめます。 その前にシェアドリーダーシップ制度について解説します。 私たちのチームにはマネージャーやリーダーといったポジションがありません。「全員がリーダー」という考えの基、技術のことだけでなく、組織運営に関しても全員で意見を出し合い、採用やチーム予算の議論にもみんなが参加します。エンジニアの自主性や成長を重んじた組織づくりを行っています。 Product Teamには「ペアプログラミング」「テスト駆動開発」「レンタル移籍」「チームシャッフ…
3ヶ月前

80万件の Contentful エントリのマイグレーション
Uzabase for Engineers
こんにちは。株式会社Uzabaseの FO/EIチーム です。 Uzabaseでは一部サービスでContentfulを使用しているのですが、今回あるコンテントタイプを 数値型から文字列型に変更する必要が出てきました。対象エントリは約80万件です。 Contentfulのマイグレーション、特に大量データのマイグレーションはあまり情報がなく、ニッチかもしれませんが、同じ課題に直面している方の参考になればと思い、今回の移行で直面した課題と解決策を共有します。 出来るだけそのままをお伝えしたほうが良いかと思うので、上手く行かなかったものも含めお話いたします。 マイグレーション概要 マイグレーションの内…
3ヶ月前

日常に溶け込んだプラクティスをふりかえる ─ テーマを絞ったふりかえりのすすめ
Uzabase for Engineers
はじめに こんにちは。スピーダ事業Product Teamの中嶋です。 今年のはじめから先月まで、大阪拠点の開発チームでお仕事をしていました。約半年ぶりに東京拠点での開発に戻り、どんなことがやれるのか少し楽しみにしている自分がいます。 さて、私たちProduct Teamでは、どこのチームでも1週間に1回ふりかえりを行っています。基本的には1週間というタイムボックスをふりかえり、その中で見つけた課題について深掘りし、アクションを立てて終わります*1。 ふりかえりのテーマはその都度その場で見つけて深掘りしていくのですが、大阪拠点の開発チームで、あえて「アジャイルのプラクティス」にテーマを絞ったふ…
3ヶ月前