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

TECH PLAY

株式会社ユーザベース

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

全540件

はじめに こんにちは! 株式会社ユーザベース Speeda事業 の松村です! Claude Codeに開発を任せ、人の確認を挟まずに自律的に作業してほしい。 しかし、--dangerously-skip-permissions をホストPC上でそのまま使うのは怖い。 この二つを両立するため、Claude Code専用のDev Containerを構築しました。 この記事では、複数人が共同利用するペアプロPCを前提に、認証情報や外部通信をどのように扱ったかを紹介します。 なお、今回の構成はホストPCから完全に隔離されたサンドボックスではありません。開発に必要な機能を残しながら、複数の対策を重ねて…
こんにちは。ソーシャル経済メディア「NewsPicks」のPlatform Engineeringチームでインターンをしている下山です。 最近、仕事の中で学んだことがあります。 分からないことが残っていても、確かめられるものはある。どこまで確かめるかは、効果とコストを比べて決めればいい。 ということです。 私は今、自動車免許を取るために教習を受けています。そこで習う「かもしれない運転」と「だろう運転」って覚えていますか? 「かもしれない運転」と「だろう運転」のイメージ 死角から何が出てくるかを、すべて予測することはできません。 その時に「何かあるかもしれないから備えよう」と考えるのが「かもしれ…
SREQAチームでは、AWSコスト削減のために社内システムのアーキテクチャを刷新しました。lambdaとS3の活用で効率化を図り、成功に至ったプロセスを紹介します。
こんにちは。株式会社ユーザベース スピーダ事業の沖です。 私のチームでは Excel アドインを開発しています。Excel アドインは、Web の技術(HTML / JavaScript)で作る Excel の拡張機能です。アドインから Excel を操作するには、Microsoft が提供する JavaScript ライブラリである office.js を読み込み、office.js が用意する Excel や CustomFunctions といったオブジェクトを通して操作します。 このアドインをテストするために、office.js をメモリ上で再現するモックライブラリを作り、プロダクトの…
はじめに AI エージェントの品質は、エラー率やレイテンシだけでは捉えきれません。たとえリクエストが 200 で素早く返ってきたとしても、質問にきちんと答えられていなかったり、もっともらしい誤情報を返していたりすれば、ユーザーにとっては失敗したリクエストと変わりません。 そのため、エラー率やレイテンシだけでなく、エージェントが生成した回答の内容や、必要なツールを正しく呼び出せたかといった、実際の振る舞いそのものを評価する必要があります。 また、こうした品質についても、エラー率やレイテンシと同じように SLO として定量的な目標を置いて運用していくことで、品質の悪化を継続的に捉え、どこまでを許容…
こんにちは。ソーシャル経済メディア「NewsPicks」のPlatform Engineeringチームの崔(ちぇ)です。 チーム名から、開発者体験の向上にフォーカスした改善を主に担当するだろうなと思った方が多いと思います。 実は、弊チームはそれに加えて、ビジネスサイドの業務生産性を向上する開発を進めることが多々あります。エンジニアに限らず社員の本質的でない仕事を減らす、それがこのチームの存在意義だと考えています。 第一に思い浮かぶのは、ビジネスサイドの反復的な単純作業を自動化することで業務生産性を向上させることです。しかし、エンジニアって社内からの「これがうまくいかないです」「ユーザーさんか…
こんにちは。 株式会社ユーザベース スピーダ事業の田島です。 突然ですが、ESの前方一致検索でこんな経験、ありませんか。 「たしかに登録したはずのデータが、検索しても出てこない」 全部が出てこないなら「バグだ」とすぐ気づけます。やっかいなのは、ほとんどのデータはちゃんと出てくるのに、なぜか特定のものだけが抜け落ちるというケースです。今回は、その原因不明の検索漏れの正体を調べ、Elasticsearch の index_prefixes という機能で解決できた話を書きます。 同じところで困っている方の参考になれば嬉しいです。 この記事の結論 先に、これから話すことの結論をまとめておきます。 通常…
はじめに こんにちは、塚田です。 OCaml 5 で Effect Handler が入りました。例外のように処理の途中から外側へ制御を渡せて、しかも外側から値を受け取って元の場所から処理を再開できる、という仕組みです。言語機能としてはかなり面白いのですが、実務のコードでうまく使えるのかは、実際に書いてみないとわかりません。 そこで、社内のマイクロサービスの API に OCaml を導入してみました。今回は、その API で Effect Handler をどう使っているかを書こうと思います。 Effect Handler とは OCaml は ML 系の静的型付け言語です。関数型言語ですが…
株式会社ユーザベースの平山です。 この記事では 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…