株式会社ユーザベースのブログ - TECH PLAY

TECH PLAY

株式会社ユーザベース

株式会社ユーザベース の技術ブログ

全532件

株式会社ユーザベースの平山です。 この記事では Rust のエラー処理ライブラリ anyhow と thiserror の使い分けについて Clean Architecture の視点から考えてみます。 一旦結論だけ ドメインエラー: 独自のエラー型を定義して thiserror を使う ユースケースエラー: 独自のエラー型を定義して thiserror を使う インフラエラー: anyhow::Error に変換するか、インフラ層でドメインエラーやユースケースエラーに変換する ユースケース や Port の signature では fn name(...) -> anyhow::Resul…
はじめに こんにちは。 株式会社ユーザベースの花岡です。 私が所属するチームでは、Agentの実行結果をServer-Sent Events(SSE)で配信するアプリケーションを開発しています。 今回は、そのアプリケーションにGraceful Shutdownを導入したにも関わらず、デプロイ時にSSE接続が切れてエラーになったことについてです。 原因の調査と対応を通じて学びが多かったため、この記事で共有します。 目次 起きたこと 原因となる事実 1. デプロイ時のRollout戦略による挙動 2. アプリケーションが依存するライブラリの仕様による挙動 対応 まとめ 出典 起きたこと 私たちが開…
こんにちは。JPプロダクト開発本部の冨田です。 弊社のGitリポジトリはモノレポで、ほとんどすべてのアプリケーションが一つのリポジトリに入っています。なので、Claudeを利用する場合などは、「ディレクトリAとディレクトリBとディレクトリCを見て作業して」みたいな指示をすることが多いです。 今回は複数のリポジトリをまたいだ開発をする機会があったので、そのときの知見をまとめます。 前提 アプリケーションはリポジトリAに置いてあるのですが、E2Eテストやローカルで動作確認するためのバックエンドはリポジトリBに置いてありました。あまりやらないであろう特殊な状況ですが、その上でClaudeに環境構築か…
はじめに Buildkite上のE2EでPowerPointのダウンロード検証がタイムアウトしたのでまとめます 問題 Gauge + SelenideのE2Eで、フロントが生成したpptxのダウンロードを検証していました。 CIはリモートのSelenium Grid上のChromeで、ダウンロードはse:downloadsEnabledとHasDownloadsで取得しています。 アプリ側の保存はblob URLと です。 const objectUrl = URL.createObjectURL(content); const anchor = document.cre…
はじめに こんにちは。株式会社ユーザベース Speeda事業の佐藤、小原、岩井です。 普段はSalesforceのパッケージ開発を行っており、今回はパッケージ開発における構想と、開発時に直面した課題、そして我々が取った対応についてご紹介したいと思います。 開発しているもの 私たちのチームでは、Speedaの情報をSalesforce上でシームレスに活用するためのパッケージ開発を進めています。 提供している主な機能は以下の通りです。 商談資料の自動生成機能:Salesforce登録企業をターゲットに、Speedaの知見を組み込んだ資料を自動生成 アカウントプランの自動生成機能:商材と戦略を掛け合…
はじめに Google ADKを使ったPPTXスライド生成エージェントを開発している中で、トリレンマに遭遇したのでその内容と解決方法をまとめます。 開発しているエージェントには、ユーザーの指示を受けてスライドを生成する/runエンドポイントがあります。 しかし、エージェントが利用しようとした図形にスライド生成ツールが対応していない場合など、ユーザーの意図どおりにスライドを生成できないことがありました。 このとき、HTTPステータスと生成結果をどのように返すべきかを考える必要がありました。 トリレンマとは? 私がトリレンマという言葉に初めて出会ったのは、DDD(ドメイン駆動設計)をやりはじめたと…
はじめに こんにちは。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 "ス…
はじめに こんにちは、Speeda Product Teamの横山です。 Speeda AI Agentでは、多数のAgentがA2Aプロトコルを用いて連携しています。 各Agentは基本的にマークダウン形式のテキストで出力を返します。Agentや人間が読む場合はこれでも良いのですが、プログラムで扱う際は構造化された出力が欲しいです。 今回まさにそういう用途があったので、A2A x ADKでクライアントからのリクエストに応じて出力形式を分ける方法をご紹介します。 環境: google-adk 2.8.0 / Python 3.13 A2Aの仕様 A2Aでは出力形式を表明する仕様が用意されていま…
🎀 はじめに 現代のソフトウェア開発において、Claude CodeやCodexといった最先端のAIツールの導入は、エンジニアの生産性を劇的に向上させています。 私たちが開発スピードの向上を追い求める本質的な理由は、 一刻も早くリリースしてフィードバック(FB)サイクルを回し、ユーザーへの仮説検証を高速化するため と考えています。 AIツールは、アイデアを動く形にして検証サイクルに乗せるまでのリードタイムを極限まで短縮し、開発全体のFBループを大きく加速させてくれました。 しかし、この高速な開発サイクルを回し続ける中で、ある致命的なボトルネックが浮き彫りになってきました。 ドキュメント(仕様書…
はじめに こんにちは。ソーシャル経済メディア「NewsPicks」のPlatform Engineeringチームのカトマサです。 以前、新卒エンジニアとしての成長記録を書いてから約1年半、動画配信や記事編成システム周りを中心に開発を続けてきました。 今回は、広告動画制作部門の「クライアント向けレポート作成」という手作業の自動化をきっかけに、事業部の方が直接データ分析やダッシュボード作成ができる基盤まで整えた、という一石二鳥なプロジェクトの話をします。 はじめに NewsPicksのPlatform Engineeringチームとは? レポート作成自動化プロジェクトについて 解決したい課題 完…
皆さんこんにちは。 株式会社ユーザベース スピーダ事業Business Process Management(以下BPMと称する)チームのLeeと申します。 チームのR&Rとしては、UBグループ全体の受注以降の販売プロセスの企画・設計を通して販売/契約管理の安定運用の実現とガバナンスの担保しております。普段のSFDCとの接続は「業務としてSFDCをどう使うか」を考える側の人間で、開発経験はありません。 そんな私が、今年1月から横のチームにあるSales System Engineeringチームに兼務という形で入ることになりました。最初は正直、ワクワクもたくさんありましたが、コードも書けない自…
はじめに こんにちは!株式会社ユーザベース スピーダ事業でソフトウェアエンジニアをしている阿波連、内山、撰、知念です。 私達は現在、データの取り込み業務を行っており、様々なファイルの読み込み、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…
XPをやっているチームに入って2ヶ月が経ちました。Product Teamで、私はここで初めてXPを経験し、多くのギャップを感じました。 今まで自分が「良い仕事の仕方」だと信じていたものが、このチームではだいたい逆だったからです。 分からないことは、調べる前に聞く 一番ギャップが大きかったのがこれでした。 私はこれまで、分からないことがあったらまず自分で調べる人でした。調べて、自分なりの案を持って、それから相談していました。人の時間を奪わないためのマナーだと思っていました。 ペアプロだとそれができません。隣に人がいて、同じ画面を見ていて、手が止まった時点で調べるより先に喋ることになります。 わ…
はじめに こんにちは! 株式会社ユーザベース スピーダ事業・プロダクトチームのドメイン特化モデルチームの飯田です。 今四半期、Gemini 2.5 Flashを使っていたエージェントの生成モデルをGemma 4に置き換え、プロダクションに導入しました。本記事では、その判断材料を作るために行った、評価観点の設計、LLM-as-a-Judgeの構築、人手評価による検証について述べます。 取り組みは、評価対象を定める、評価方法を定める、その評価方法を検証する、という3フェーズに整理できます。なお、今回の評価は検索を含むエージェント全体ではなく、主に検索後の回答生成を対象とします。したがって、本記事の…
プロダクトチームの小林です。 弊社では、エンジニアの技術力向上および自主的な挑戦を推奨する取り組みとして「ひとりプロジェクト」を実施しています。これは、通常行っているペアプログラミング環境から一度離れ、1ヶ月程度で企画・設計・実装・リリースまでを1人のエンジニアが遂行する制度です。 今回は、この取り組みの中で社内ツールを開発した際、AIコーディングアシスタントが生成したSQLを過信した結果、意図しない大規模なデータ更新を発生させてしまった失敗事例と、そこから得た「AIとの付き合い方」、および再発防止策としてのシステム的なガードレール構築についてご紹介します。 発生したインシデントの概要 今回の…
プロダクトチームでは週1回程度にメンバー同士でコーチングを行っています。 コーチを担当するとやったことのないコーチングに難しさを感じることがあります。 「どうやって気づきを与える質問をしたらよいかわからない」 「何を話していいのかわからない」 「悩みがないから何を話せばいいのか迷う」 「相手に気を使わせてしまっている」 コーチングにはいくつか流派がありますが、 その中でも私が実践しているカウンセリング手法を利用したコーチングについて紹介します。 このコーチング手法の特徴は、 コーチが何もしなくても勝手にコーチングが終わる このような不思議な体験が得られることです。 またコーチングのデモをみてい…
はじめに はじめまして、スピーダ事業Product Teamの清水です。 私たちのチームではKubernetesを利用してアプリケーションの運用をしております。 今回はKubernetesのあまり知られていない設定により詰まる経験をしたので、供養のため記事にしたいと思います。 今回の経緯 私たちのチームではLLM(Agent)を利用して各企業の経営課題を各種公開資料から抽出し、課題一覧として取得するということを行なっています。 こちらの処理では、企業の実態を反映した高品質な課題を抽出するため、LLM(Agent)によるレビューを何度も繰り返して最終的な出力を行います。 そのためレスポンスが返っ…
課題:短命なデータのために共有ストアを運用する手間 株式会社ユーザベースでSpeedaのソフトウェアエンジニアをしている塚田です。 今回は新しい画面の開発でOIDCでログイン機能を実装したときの学びについて書きます。 我々のアプリは複数台のレプリカ構成になっています。 この場合、各レプリカがバラバラに状態を持つとログイン状態が一致しないので、 インメモリでセッションを持つ選択肢はありません(レプリカ間で不整合になります)。 各レプリカで共有できるストアが要る、というのが従来の発想です。実際これまでもセッションは共有の KVS に持たせてきましたし、その運用が特別つらかったわけでもありません。 …
はじめに こんにちは。スピーダ事業Product Teamの中嶋です。 以前の記事で1週間ごとにチームのふりかえりをしていると書きました。 tech.uzabase.com ふりかえりのファシリテーターは、基本的にはチームの外から呼んできます。 今回、私は別のチームから依頼された側でしたが、状況から考えると「ふりかえりよりも先に、チームビルディングをやったほうが良いのでは?」と思い、実際にチームビルディングのファシリをしたので、そのときの話を書こうと思います。 はじめに いつもどおりのふりかえりファシリ依頼 チーム始動直後という、いつもと違うタイミング チームビルディングで何をやるか 『チーム…
リーダシップ研修としてキリマンジャロに登ってきました。 その中でユーザベースで行われている シェアドリーダーシップという取り組みの本質を肌身で体感したのでまとめます。 その前にシェアドリーダーシップ制度について解説します。 私たちのチームにはマネージャーやリーダーといったポジションがありません。「全員がリーダー」という考えの基、技術のことだけでなく、組織運営に関しても全員で意見を出し合い、採用やチーム予算の議論にもみんなが参加します。エンジニアの自主性や成長を重んじた組織づくりを行っています。 Product Teamには「ペアプログラミング」「テスト駆動開発」「レンタル移籍」「チームシャッフ…