Mirrativ Tech Blog
https://tech.mirrativ.stream/
株式会社ミラティブの開発者(バックエンド,iOS,Android,Unity,機械学習,インフラ, etc.)によるブログです
フィード

Cloud Build 自動キャンセル
Mirrativ Tech Blog
こんにちは、バックエンド基盤チームの藤井脩紀です。 バックエンド基盤チームは、バックエンドエンジニアの生産性向上やコスト削減を目的に、エンジニア主導で課題を発見・解決している部署です。 その業務の一環として、コスト削減を目的にGoogle CloudのCloud Buildへ自動キャンセルを導入しました。本記事では、その取り組みについて紹介します。 自動キャンセルとは はじめに、自動キャンセルとは何かを説明します。例えばgit pushをトリガーに発火するビルドがある場合に、同一ブランチでpushを複数回行うと、最新のpushに対応するビルド以外を自動的にキャンセルする仕組みのことです。 ミラ…
12日前

MySQL でユニークインデックスを持つ同一レコードへの DELETE で発生したデッドロックを調査した話
Mirrativ Tech Blog
こんにちは、バックエンド基盤チームの徳森です。 バックエンド基盤チームでは、バックエンドエンジニアの生産性向上やコスト削減を目的に、エンジニア主導で課題の発見や解決を行っています。 今回は、MySQL(InnoDB) で発生したデッドロックをチームで調査した事例についてご紹介します。 要約 ユニークインデックスを持つレコードに対し、同一内容の DELETE 文が3つ以上同時に実行された際にデッドロックが発生する現象に遭遇しました。 原因は、3つのトランザクションの相互作用によって、自身が保持するロックの解放を自分自身が待つ状態が発生することでした。 これは MySQL の既知のバグ (Bug …
2ヶ月前

エモモのデザイナーが開発できるようになったいい話
Mirrativ Tech Blog
Unityエンジニアの森田です。 弊社ではAI祭りと題して全社員にClaudeのアカウントが付与されて、全員でAIを使った改善を行うという社内施策が実施されました。 弊社ではエモモのアセット制作を行うデザイナーと機能開発を行うエンジニアがエモモチームとして協力して開発・運用を行っています。エモモチームではこの祭りに先んじて2025年からClaudeを導入しており、SkillsやMCPの整備などをエンジニア主導で独自に進めていました。しかしエンジニア以外の職種向けには整備されておらず、数人のエンジニアが利用するだけに留まっていました。 エモモチームはエンジニアよりデザイナーの人数のほうが圧倒的に…
2ヶ月前

masterブランチへの意図しないマージを防ぐ仕組みをGitHub Actionsで実現した
Mirrativ Tech Blog
はじめに こんにちは。インフラ・ストリーミングチームの小河です。 本記事では GitHub リポジトリにおける master への意図しないマージを防ぐために行った取り組みについて紹介します。 私たちのチームでは、いわゆる Git-flow に少し似たブランチ運用ルールを設けています。 このブランチ運用ルールと GitHub の Pull Request との仕様の組み合わせで master ブランチへの意図しないマージが起きやすい状態になっていました。 今回実際に事故が発生してしまったため、GitHub Actions を活用して再発防止の取り組みを行いました。 なぜ意図しないマージは起こっ…
2ヶ月前

分析を"民主化"しつつ品質を保つAIエージェント基盤「ashura」の設計
Mirrativ Tech Blog
1. はじめに はじめまして。データ分析チームの Tom です。 ミラティブでは、施策や新機能の効果測定から、分析基盤の運用、AI エージェントを使った分析業務の効率化までを担当しています。 先日、社内で開催された AI 祭りという取り組みで、ミラティブの分析業務を AI エージェントで回す基盤「ashura」を発表する機会をいただき、ありがたいことに優勝することができました。今回はその ashura について、設計の全体像を紹介します。 ashura は、データ分析の依頼を受けてから報告までを Claude Code 上で完結させるためのエージェント基盤です。本記事のゴールは、AI に分析業…
2ヶ月前

【ミラティブ】try! Swift Tokyo 2026にスポンサーとして協賛します
Mirrativ Tech Blog
こんにちは、ミラティブのエンジニア採用担当です。 現在、Swiftに関する世界的な技術カンファレンス 「try! Swift Tokyo 2026」 が開催されています! 株式会社ミラティブは、ブロンズスポンサーとして協賛させていただいております。 try! Swift とは Swiftに関する国際的なカンファレンスです。Swiftの開発のコツや最新の事例を共有し、スキルを磨くことを目的としています。 開催日時: 2026年4月12日(日)〜 14日(火) 場所: 4/12:東京都立川市内 4/13〜14:立川ステージガーデン 公式URL: try! Swift Tokyo 協賛する背景 ミ…
3ヶ月前

mmap直確保でGoのGC負荷を低減する
Mirrativ Tech Blog
インフラ・ストリーミングチーム インターンの八谷です。 本記事では、ガベージコレクション(GC)への負荷を低減することを目的として、Go言語でのメモリ確保時にOSから直接mmap領域を確保する手法と、make関数でランタイムから領域を確保する場合でのGC負荷などの比較を行います。結果としては、mmap領域を直接確保することでGCが走査するオブジェクト数を削減でき、それに伴ってアプリケーションの停止(Stop-The-World)時間を短縮できることがわかりました。 前提知識1: Goにおけるメモリ管理 Goのランタイムでは、起動時や必要に応じてOSから64MB単位の領域をあらかじめ確保し、それ…
4ヶ月前

スクラム社内勉強会を発足してから 1年が経過したので 読んだ本を紹介します
Mirrativ Tech Blog
こんにちは。バックエンドエンジニアのshirakawaxです。 ミラティブでは施策開発フローとしてスクラムを採用しています。 スクラム導入から数年が経ち、フローは安定してきました。その一方で「もっと良くできるはずなのに、どこから手をつければいいんだろう」という感覚がチームの中にありました。チーム内外でスクラムへの前提知識にばらつきがあり、共通の文脈を持って議論できる場を作りたい——そんな思いから、2025年2月に「スクラム勉強会」をスタートしました。 ちょうど1年が経った今、この記事では取り上げた5冊の本と、そこから生まれたチームの気づき・変化を紹介します。 なお、スクラム導入に関するテックブ…
4ヶ月前

SpecをTruthにする:AIエージェント時代の大規模機能開発 〜 Checklist & Session Notesで"AIの文脈"を外部化する 〜
Mirrativ Tech Blog
こんにちは、バックエンドエンジニアのユンです。 現在あるプロジェクトで、AIコーディングエージェントをフルに使って開発を進めています。その中で、作成・修正などの触るファイル数が増えてくると、AIの記憶力は目に見えて低下してました。細かい指示をせずに任せた結果、アーキテクチャルールを無視してControllerがUseCaseを経由せずRepositoryを直接呼び出したり、まだ存在しないメソッドを平気で呼び出したり。命名もUserRepositoryとuserRepoなど混在し、テストは「後で書きます」のコメントだけ、もしくはテストが落ちて修正を振り返るとセッション内のコンテキストを使い切りセ…
5ヶ月前

Go製ベンチマーカーによる分散オブジェクトストレージ「b3」のピーク性能検証
Mirrativ Tech Blog
ミラティブ社内製の分散オブジェクトストレージであるb3のピーク性能検証についてインターンの取り組み
6ヶ月前

ミラティブのバックエンド基盤チームのご紹介 〜開発者体験の向上とコスト最適化の取り組み〜
Mirrativ Tech Blog
こんにちは、バックエンドのテックリード兼バックエンド基盤チームマネージャーの夏(なつ)です。 採用面接などの場で「バックエンド基盤チームって具体的に何をしているの?」と聞かれることがよくありました。これまでもバックエンド基盤チームのメンバーが取り組んできた内容は、個別のテックブログとして紹介してきました。 2022/12/15 ミラティブのインターンで趣味開発と大規模開発のギャップを体験しました 2022/12/22 Goのtestingパッケージにコミットした話 2023/09/04 GitHub APIを利用したスケーラブルなマスターデータ管理システム 2024/02/29 Cloud B…
6ヶ月前

EnvoyでVM内のトラフィックをコントロールしてデプロイを高速化した
Mirrativ Tech Blog
こんにちは、ミラティブのインフラを担当している清水です。 ミラティブは2025年8月28日に10周年を迎え、ユーザーの皆さまに長年ご愛顧いただけて感謝の極みです。 一方で、長年の運用で刷新できないまま残ったレガシーなシステムもあり、古いものと新しいものを混在したまま運用を続けています。 過去記事でもサーバサイドの技術をPerlからGoへシステム移行することを紹介していますが、ミラティブのサーバサイドのアプリケーションは現在も継続してPerlからGoへ移行しています。 このため、GoとPerlをデプロイする必要があり、それぞれの言語特性にあったデプロイの仕組みでアプリケーションを更新しています。…
6ヶ月前

Pub/Sub障害からの学び:JSONメッセージをOpenAPI Validationで守る
Mirrativ Tech Blog
こんにちは、バックエンドエンジニアの山倉です。 MirrativではPub/Subサーバーを使ってサーバー - クライアント間のリアルタイム通信を行っており、メッセージ形式はJSONを採用しています。HTTP APIについては従来からOpenAPI Validationをかけていましたが、Pub/Subサーバーで使われるJSONメッセージに対しては十分なバリデーションができていませんでした。 本記事ではJSONメッセージにOpenAPI Validationを適用する仕組みを導入した経緯と実装方法を紹介します。 きっかけは、サーバー - クライアント間のJSONの型不一致による障害でした。…
6ヶ月前

ModifierのdropShadowは何が新しいのかを考える
Mirrativ Tech Blog
Androidエンジニアの藤原(@fuji_tech7)です。 Jetpack Compose を使った UI 実装で、最近私が悩まされているのが Shadow(影)表現 です。 Material Design の仕様に忠実にしたい デザイナー指定の微妙な影を再現したい それでいてパフォーマンスは落としたくない こうした要求に対して、従来の Compose の shadow() API では 「微調整が難しい」「表現に限界がある」と感じています。 ミラティブでもFigmaで表現している影の再現に苦労する、または妥協案で許容してもらうことがありました。 Compose 1.9 では、こうした課題…
6ヶ月前

2026年の開発を気持ちよく始めるためのiOSDC Japan 2025セッションまとめ
Mirrativ Tech Blog
はじめに & 今年の振り返り みなさん、お疲れ様です!ミラティブのiOSエンジニア[いっちー]です。 年末が近づき、開発チームでもリリースやメンテナンス対応に追われる時期になりました。 思えば、iOSエンジニアにとっては今年もずっと忙しい1年間だったかもしれませんね? ちょうど1年ほど前にはCocoaPods Trunk Read-only Planが発表され、我々もSwift Package Managerへの完全移行を本格的に進め始めました。 さらに 5月にはAppleからTN3187: Migrating to the UIKit scene-based life cycleがリリースさ…
7ヶ月前

sqldefとkin-openapiにコントリビュートした話
Mirrativ Tech Blog
こんにちは、バックエンド基盤チームの徳森です。 バックエンド基盤チームでは、バックエンドエンジニアの生産性向上やコスト削減を目的に、エンジニア主導で課題の発見や解決を行っています。 今回は、チームでの具体的な業務内容の一部として、二つのOSSにコントリビュートした話を紹介します。 要約 バックエンド基盤チームでは定常業務として依存モジュールの更新を行っていますが、必要に応じてアップストリームへのコントリビュートも行っています。 今回はその中から、sqldef/sqldefとgetkin/kin-openapiに貢献した事例を紹介します。 ミラティブではバックエンド基盤チームを含め、技術的な課題…
8ヶ月前

DroidKaigi 2025 参加レポート
Mirrativ Tech Blog
Androidエンジニアの藤原(@fuji_tech7)です。9月10日〜12日に DroidKaigi 2025 が開催されました。 私はカンファレンスデーの11日、12日に参加してきたので、その内容をレポートします。 ミラティブは 2022 年から DroidKaigi に協賛しており、今年で4年目を迎えます。 tech.mirrativ.stream 更に今回はDroidKaigiカンファレンスアプリの開発リードを弊社のkitakkun (@kitakkun_pb)が務めていました。かなり大変だったと思いますがお疲れ様でした! (私自身、軽微ではありますがコントリビュートさせてもらいまし…
9ヶ月前

Dockerコンテナ上のプロセスが残り続ける問題をPTYを使って回避した話
Mirrativ Tech Blog
こんにちは、バックエンドエンジニアのogatasoです。今回はDockerコンテナ上でプロセスが残り続けてしまう問題をPTY(pseudo terminal)を噛ませたタイムアウト処理で対応した話を紹介します。 はじめに ミラティブでは、開発環境や本番環境のMySQLのレコードを確認する際、sshで踏み台サーバに接続し、docker exec -it を使ってdockerコンテナ上でMySQL接続用のスクリプトを実行しています。しかし、このときMySQLクライアントのプロセスを終了させずにターミナルを閉じてしまうと、プロセスがサーバ上に残り続けてしまうという現象に悩まされていました。 原因調査…
10ヶ月前

次世代JS標準時刻API Temporal を3年先行利用して得た知見を共有します!
Mirrativ Tech Blog
Dateに代わる新たな日時表現・操作API Temporal を3年先行利用して得た知見を共有します!
10ヶ月前

【ミラティブ】iOSDC Japan 2025 にスポンサーとして協賛します
Mirrativ Tech Blog
こんにちは、ミラティブの新嘉喜です。 ミラティブは、2025年9月19日(金)〜9月21日(日)に有明セントラルタワーホール&カンファレンス+ニコニコ生放送で開催される iOSDC Japan 2025 にスポンサーとして協賛させていただきます! iOSDC Japan 2025 については以下公式サイトをご覧ください。 iosdc.jp 協賛する背景 ミラティブは、ミッションである「わかりあう願いをつなごう」のもと、ゲーム配信プラットフォーム「Mirrativ」を運営しています。 ミラティブは「Mirrativ Tech Community & Activity Policy」を掲げ、エンジ…
10ヶ月前

【ミラティブ】DroidKaigi 2025 にスポンサーとして協賛します
Mirrativ Tech Blog
こんにちは、ミラティブの新嘉喜です。 ミラティブは、2025年9月10日(水)〜12日(金)の3日間にかけて開催される、「DroidKaigi 2025」に協賛することをお知らせいたします。 DroidKaigi とは 「DroidKaigi」は、Android技術情報の共有とコミュニケーションを目的に開催される、エンジニアが主役のAndroidカンファレンスです。 2025.droidkaigi.jp また、今年はミラティブのAndroidエンジニア kitakkun (@kitakkun_pb)が、DroidKaigi 2025 公式アプリの開発リードを担当しております! 公式アプリはオー…
1年前

Vaporを活用しMacとiPhone間で双方向通信を行う
Mirrativ Tech Blog
iOSチームの福山です。 Mirrativ iOSでは Flipper (Meta社のOSS) を使っていました。しかし Xcode 16.3 から Flipper が動かなくなるという事象が発生し、リポジトリもアーカイブされていることから、Vapor を利用して代替となる機能を作成しようと考えました。今回の記事では、その基礎となるサンプルの実装をご紹介します。 VaporはSwift言語で書かれたオープンソースのWebフレームワークです。 サンプル作成のフローは次のようになります。 VaporでMac上のWebブラウザにWebページを表示するローカルサーバーをたてる VaporでWebSoc…
1年前

みんなの「スキ」でつながろう! Mirrativ LT Party 2025Q1 を開催しました
Mirrativ Tech Blog
はいこんにちは!フロントエンドやらバックエンドやらUnityやらなんでもやってるエンジニアの どじねこ です。 今回は少し前の話題になりますが、2025年3月12日に社内で開催した「Mirrativ LT Party 2025Q1」をご紹介します。 よろしければ過去に開催したLT会についてもご覧ください。 tech.mirrativ.stream tech.mirrativ.stream
1年前

App Storeの返金情報を取得する方法
Mirrativ Tech Blog
こんにちは、バックエンドエンジニアのogatasoです。 Mirrativでは、配信者にギフトを贈る際に必要なコインをアプリ内課金で購入できます。 今回、不正の検知と対策を目的として、過去および今後のすべての返金履歴を取得し、データベースに取り込む仕組みを導入しました。 本記事では、App Storeから送られてくる返金通知をリアルタイムで受け取る方法と、過去の課金が返金されていないか調べる方法について解説します。 目次 目次 App Store Server Notificationsとは 設定 テスト通知を送る JWTの生成 通知の検証とデコード サンドボックス環境でREFUND通知を取得…
1年前

Renovateをセルフホスト with Google Cloud & Go
Mirrativ Tech Blog
こんにちは、バックエンド基盤チームの藤井脩紀です。 バックエンド基盤チームは、バックエンドエンジニアの生産性向上やコスト削減を目的に、エンジニア主導で課題を発見・解決している部署です。 このチームではCIの整備や依存関係の更新なども担当しており、その一環としてRenovateというソフトウェアのセルフホストを行ったのでそれについてお話しさせてください。 目次 Renovateとは セルフホストに至った背景 セルフホスト GitHubの下準備 Cloud Buildの設定 構成ファイルを準備 script/create-github-token.sh cloudbuild.yaml シークレット…
1年前

シェーダーでアニメーションカーブを使う
Mirrativ Tech Blog
こんにちは、Unityエンジニアのrioil(@rioil_dev)です。 Mirrativの3Dアバター(エモモ)の描画には、カスタム実装されたシェーダーを使用しています。 カスタムシェーダーにテクスチャシートを用いたアニメーション機能を追加するにあたって、シェーダーでアニメーションカーブを使えるようにしたため、今回はその方法を解説します。 検討した方法 アニメーションカーブをシェーダーで使う方法として、以下の2つの方法を検討しました。 毎フレーム、スクリプトでアニメーションカーブの値を計算して、マテリアルのプロパティにセットする アニメーションカーブをテクスチャにベイクして、シェーダーで参…
1年前

【ミラティブ】CEDEC2025 にスポンサーとして登壇 & 協賛します
Mirrativ Tech Blog
こんにちは、ミラティブの広報の新嘉喜です。 ミラティブは、2025年8月22日(火)〜24日(木)に開催される「CEDEC 2025」に、スポンサーとしてセッション登壇と協賛をすることを決定いたしました。 ※CEDEC2025については、公式サイトをご覧ください https://cedec.cesa.or.jp/2025/ セッションの内容は、以下の通りです。 ミラティブ登壇者によるセッション 登壇者 井本 大登(技術戦略本部 技術部 Unityグループ マネージャー)@adarapata タイトル ライブゲームという新しい遊びの作り方 〜スラポンコロシアム開発事例から学ぶ配信者・視聴者一体型…
1年前

AtCoderで ミラティブ プログラミングコンテスト2025 を開催します
Mirrativ Tech Blog
こんにちは、バックエンドエンジニアの makino です! この度、ミラティブは 2025年7月12日(土) にAtCoderにおいて ミラティブ プログラミングコンテスト2025 を開催します。 atcoder.jp 私自身、数年前まで競技プログラミングに熱心に取り組んでおり、夜な夜なコンテストに参加してはレートの増減に一喜一憂する日々を過ごしていました。 今では競技プログラミングから少し離れていますが、あのとき培ったスキルや知識は、日々の業務に確実に活かされていると感じています。 そんな自身の経験から、「AtCoderユーザーにもっとミラティブを知ってもらいたい」「一緒に働く仲間になってほ…
1年前

Jetpack ComposeのonLayoutRectChangedとonGloballyPositionedを比較してみた
Mirrativ Tech Blog
こんにちは、Androidエンジニアの藤原(@fuji_tech7)です。 先日、Google I/Oが開催され新しいJetpack Composeが発表されました。 www.youtube.com AutoSize textやMaterial Expressiveなど気になるものは多いのですが、個人的にはModifierに追加されたonLayoutRectChangedが最も気になっています。 onLayoutRectChangedを簡単に説明すると、Composableの座標やサイズを取得する現行のonGloballyPositionedに近いものになっています。 今回はonLayoutR…
1年前

Jetpack Composeのスクロール可能なTabRowにminWidthが設定できるようになります
Mirrativ Tech Blog
こんにちは、Androidエンジニアの藤原(@fuji_tech7)です。 Jetpack ComposeのコンポーネントにScrollableTabRowがあります。 TabRowが指定領域にタブを敷き詰めて配置するのに対しScrollableTabRowはスクロール可能にすることでより多くのタブを配置することができます。 ただし、ScrollableTabRowは制限があり期待するレイアウトを作れませんでした。 その一つがScrollableTabRow内の子要素であるTabにminWidthを設定できないことです。 この課題について、最近動きがありましたので紹介します。 本記事内では正式…
1年前