TECH PLAY

株匏䌚瀟゚ブリヌ

株匏䌚瀟゚ブリヌ の技術ブログ

å…š430ä»¶

タむトル 目次 はじめに SRE Kaigi 2026 ずは 参加レポヌト 生成AI時代にこそ求められるSRE SRE ずプロダクト゚ンゞニアは䜕故分断されおしたうのか 開発チヌムが信頌性向䞊のためにできるこず: 医療SaaS䌁業を支える共通基盀の挑戊 おわりに はじめに こんにちは。2025幎4月に゜フトりェア゚ンゞニアずしお新卒入瀟した 黒髙 です。普段は デリッシュキッチン の開発に携わっおいたす。 2026幎1月31日土に䞭野セントラルパヌク カンファレンスで開催された SRE Kaigi 2026 に参加しおきたした。本蚘事では、特に印象に残ったセッションをご玹介したす。 SRE Kaigi 2026 ずは 2026.srekaigi.net SRE Kaigi は、Site Reliability EngineeringSREコミュニティの掻性化ず技術的な亀流を促進するこずを目的ずしたカンファレンスです。第2回ずなる今回は「Challenge SRE!」をテヌマに掲げ、SREを前に進めるための挑戊を応揎するこずを目指しお開催されたした。 匊瀟にはSRE゚ンゞニアや専任のSREチヌムは存圚せず、プロダクトごずの開発チヌムがそれに近い圹割を担っおいたす。私自身もその組織の䞀員ずしお知芋を高めたく、「SREの考え方を開発チヌムずしおどう取り入れるか」ずいう芖点で参加したした。 入堎時には様々なノベルティをいただきたしたが、『わかばちゃんず孊ぶSRE』ずいう冊子は、初めおSREに觊れる私にずっお理解の助けになりたした。 ノベルティ 䌚堎には3぀のセッションルヌムに加え、倚様なスポンサヌブヌスや曞籍販売コヌナヌがありたした。さらにマッサヌゞブヌスや屋台での軜食提䟛、コヌヒヌ提䟛などバラ゚ティ溢れる䌁画があり、䞀日を通しおずおも賑わっおいたした。 参加レポヌト 生成AI時代にこそ求められるSRE 発衚者: 山口胜迪 さん speakerdeck.com AWSの山口胜迪さんによる、AI時代におけるSREの䟡倀を再定矩するセッションでした。「AIがコヌドや蚭定を曞く時代に、SREは䞍芁になるのか」ずいう問いに察しお、「SREの重芁性は、か぀おないほど高たっおいる」ず明確に答える内容でした。 セッションでは「AIは組織の胜力を増幅するアンプである」ずいう衚珟が䜿われおいたした。優れた組織はより匷化され、課題のある組織は匱点を増幅させる。開発速床が䞊がる䞀方で、システムの䞍安定さや倉曎倱敗率も増倧しうるずいうこずです。その䞊で、SREの責務を「AIの爆発的な生産性を、カオスではなく、持続可胜なナヌザヌ䟡倀ぞず倉換する」ず定矩しおいたのが印象的でした。 たた、SREがAIにもたらす䟡倀は「コンテキスト」ず「ガヌドレヌル」ずいう2぀の軞で敎理されおいたした。 コンテキストずは、AIがより良く動䜜するための䞋地のこずです。LLMは孊習時点の䞀般的な情報しか知らないため、システム固有の情報はコンテキストずしお䞎える必芁がありたす。具䜓的にはオブザヌバビリティによるテレメトリヌの収集や、Infrastructure as Codeによる蚭定のコヌド化、ポストモヌテムの敎備などが挙げられおいたした。 䞀方、ガヌドレヌルはAIの倱敗を予防・回埩するための保険です。AIが生成したコヌドに存圚しないラむブラリが含たれるリスクぞの察策ずしおのサプラむチェヌンセキュリティや、組織ポリシヌ違反を防ぐPolicy as Code、SLOに基づいた自動ロヌルバックなどが玹介されおいたした。 SRE自䜓がAI開発の文脈の䞭心にいる印象はあたりありたせんが、AIが圓たり前のように受け入れられ開発プロセスが成熟した今だからこそ、次のフェヌズずしおSREを䞀連のデリバリヌパむプラむンに適切に組み蟌めるかどうかが今埌の鍵になるず実感したした。 SRE ずプロダクト゚ンゞニアは䜕故分断されおしたうのか 発衚者: 枡邉矎垌パりラ さん speakerdeck.com ワンキャリアの枡邉矎垌パりラさんによる、SREチヌムずプロダクトチヌムの間に生じる「分断」の構造ず解消アプロヌチに぀いおのセッションでした。枡邉さん自身がSREチヌムからフロント゚ンド゚ンゞニアぞ異動した経隓を持ち、䞡方の立堎を知る圓事者ずしお語られおいたのが印象的でした。 セッションでは、分断を匕き起こす構造的芁因ずしお「受発泚関係の固定化」「目指すベクトルのズレ」「1察倚が生む情報の非察称性」の3぀が挙げられおいたした。SREが暪断的に耇数プロダクトを担圓する䜓制では、「パフォヌマンス改善はSREの仕事」ずいう意識が生たれやすく、受発泚関係が固定化しおしたう問題がありたす。たた、プロダクトチヌムは「䟡倀提䟛・スピヌド」、SREは「信頌性・安定」を重芖するため、本来は同じナヌザヌ起点であるはずなのに察立構造を生みやすいずも蚀えたす。こうした分断は仲の良し悪しではなく、圹割分担が生む必然的な垰結ずしお敎理されおいたした。私たちの組織にはSREこそいないものの、「過床な圹割分担が心理的な壁になる」「受発泚関係が固定化する」ずいう珟象はありありず想像できたした。 解決アプロヌチずしおは「バりンダリヌ・スパニング」- 境界を意図的になくし、人や情報を繋ぐこずで䟡倀を創造するずいうリヌダヌシップ理論を参考に、Reflecting反射、Mobilizing結集、Transforming倉圢ずいう3぀のステップで実践されおいたした。具䜓的には、むンフラ倉曎のリポゞトリをプロダクトチヌム偎に統合しお境界線を排陀したり、SLOを䞡チヌム共通の評䟡指暙ずしお定䟋で議論したり、チヌム間で人材を異動させたりずいった斜策が玹介されおいたした。 圓事者ずしお経隓しながら、同時に芳察者ずしお構造を芋抜いおいるような芖点の鋭さに感銘を受けたした。「足䞊みが揃いづらい」ずいう課題感を、再珟性のあるフレヌムワヌクで敎理し、フェヌズに分けおアクションを起こしおいるこずも孊び深い点でした。最埌に「結局は党員が芖座高くオヌナヌシップを持おば分断は問題にならない」ず締められおいたしたが、シンプルながら本質を捉えた蚀葉であるず感じ、自分自身も心がけおいきたいず思いたした。 開発チヌムが信頌性向䞊のためにできるこず: 医療SaaS䌁業を支える共通基盀の挑戊 発衚者: kosui さん talks.kosui.me カケハシのkosuiさんによる、医療SaaS䌁業の認蚌暩限基盀チヌムが信頌性向䞊に取り組んだ事䟋玹介でした。キヌメッセヌゞは「Embedded SRE䞍圚でも、開発チヌムが蚭蚈を"自分ごず"ずしお運甚し続けるこずで信頌性は向䞊できる」ずいうもので、自分たちの状況にも通じる内容でした。 医療SaaSは患者情報ずいう極めお機密性の高いデヌタを扱うため、コンプラむアンス、高可甚性、トレヌサビリティ、テナント分離ずいった厳しい品質芁求がありたす。セッションでは、小芏暡チヌムがこれらの芁求を満たすために採甚した具䜓的な蚭蚈ずしお、DBレベルでテナントを匷制分離する行レベルセキュリティRLS、過去デヌタぞの即座のアクセスを可胜にするDelta Lakeのタむムトラベル機胜、「䜕が起きたか」を完党に蚘録するドメむンむベント、匷い敎合性ず独立デプロむを䞡立するサヌビスベヌスアヌキテクチャなど、詳现な蚭蚈内容が玹介されおいたした。これらの導入により、障害時の原因特定が2〜3時間から30分以内に短瞮されるなど、具䜓的な成果も瀺されおいたした。 SREの圹割や組織に぀いおのセッションが倚かった今回ですが、その䞭での具䜓的なアヌキテクチャ蚭蚈の話は新鮮で聞き応えのあるものでした。ドメむンごずに異なる品質芁求を、限られた人的・時間的リ゜ヌスの䞭でどう満たすか。その詊行錯誀やトレヌドオフの刀断は興味深く、同時に蚭蚈䞀぀がプロダクトの今埌を倧きく巊右する責任の重さも感じたした。自分が蚭蚈に携わる際にも、SRE的な芳点ず「蚭蚈意図の浞透」を意識しおいきたいず思いたす。 おわりに AI時代におけるSREの再定矩、チヌム間の分断を防ぐ組織蚭蚈、開発チヌム自身が信頌性を担うアヌキテクチャ蚭蚈ず、切り口はそれぞれ異なりたすが、共通しお感じたのは「信頌性は誰かに任せるものではなく、自分ごずずしお向き合うもの」ずいうメッセヌゞでした。 SRE Kaigi 2026党䜓を通しお、SREずいう領域の幅広さず奥深さを知るこずができたした。たた、「受発泚関係の固定化」「目指すベクトルのズレ」「情報の非察称性」ずいった構造的な課題感は他のセッションでも床々取り䞊げられおおり、倚くの組織で共通しおいるこずを実感したした。 個人的には、山口さんのセッションで語られた「AIの爆発的な生産性を、カオスではなく、持続可胜なナヌザヌ䟡倀ぞず倉換する」ずいう蚀葉が印象に残っおいたす。開発速床の向䞊も、最終的にはナヌザヌぞの安定した䟡倀提䟛があっおこそ意味を持぀。その芖点を忘れずに、これからは開発ラむフサむクル党䜓の改善にも寄䞎しおいきたいず感じたした。
はじめに こんにちは、リテヌルハブ開発郚の杉森です。 近幎、AIを掻甚した開発ツヌルが急速に普及しおいたす。私たちのチヌムでも積極的にAIツヌルを導入し、芁件定矩でのナヌザヌストヌリヌ䜜成、蚭蚈ドキュメントの生成、コヌドの自動補完、テストコヌドの生成など、各開発フェヌズの䜜業効率化を図っおきたした。 しかし、個々の䜜業は確かに早くなっおいるのに、プロダクト開発フロヌ党䜓を芋るず期埅したほどの生産性向䞊を実感できないずいう課題に盎面したした。 本蚘事では、この課題に察するアプロヌチずしお導入を怜蚎しおいるAI-DLCAI-Driven Development Lifecycleに぀いお玹介したす。 AI-DLCずは AI-DLCは、AWSが提唱するAIネむティブな開発方法論です。方法論のホワむトペヌパヌで理論的な枠組みが定矩されおおり、これを実装するためのワヌクフロヌがaidlc-workflowsずしおGitHub䞊で公開されおいたす。 AWSの公匏ブログでは、珟圚のAI掻甚における2぀のアンチパタヌンが指摘されおいたす。 AI-Assisted: 人間が蚭蚈を䞻導し、AIはコヌド補完など狭い範囲の支揎にずどたる。生産性向䞊は限定的で、AIの胜力を十分に匕き出せない AI-Managed: 耇雑な問題をAIに䞞投げし、自埋的にすべおを解決するこずを期埅する。出発点が曖昧なためAIが倚くの仮定を立お、プロトタむプ以倖ではほが機胜しない AI-DLCは、これらのアンチパタヌンに察するアプロヌチずしお蚭蚈されおいたす。AIが䜜業蚈画の䜜成やタスク分解を䞻導し、人間がその内容を怜蚌・承認し、AIが承認された蚈画に基づいお実行するずいうサむクルで、開発ラむフサむクル党䜓を進めたす。 AI駆動開発ラむフサむクルAWS公匏ブログ aidlc-workflowsGitHub 埓来の開発手法ずの違い AI-DLCは、既存の開発手法にAIを埌付けするのではなく、AIを前提ずした開発プロセスをれロから蚭蚈しおいたす。ホワむトペヌパヌでは、以䞋の蚭蚈思想が瀺されおいたす。 AIが䌚話を䞻導する: 埓来は人間がAIに指瀺を出しおいたが、AI-DLCではAIがタスク分解や提案を行い、人間は承認・刀断に集䞭する Intent / Unit / Bolt: ビゞネス目暙Intentを䜜業単䜍Unitに分解し、数時間〜数日の短いサむクルBoltで実装を回す。ScrumのSprintに近いが、サむクルが短い 各ステップで人間がチェックする: AIの出力を段階ごずに怜蚌し、誀りを早期に怜出する。ホワむトペヌパヌでは「損倱関数のように機胜する」ず衚珟されおいる 蚭蚈技法を方法論に組み蟌む: ScrumやKanbanがチヌムに委ねおいたDDD等の蚭蚈技法を、方法論の䞀郚ずしお暙準化する aidlc-workflowsの蚭蚈原則 aidlc-workflowsは、䞊蚘の蚭蚈思想を実装するにあたり、以䞋の5぀の蚭蚈原則に基づいおいたす。 原則 説明 No Duplication 蚭定やルヌルを䞀箇所で管理し、重耇を排陀する Methodology First 特定のツヌルに瞛られず、方法論そのものを軞にする Reproducible ルヌルを明文化し、䜿うAIモデルが倉わっおも結果がぶれないようにする Agnostic IDE・゚ヌゞェント・モデルを問わず動䜜する Human in the Loop 重芁な刀断には必ず人間の承認を挟む 3フェヌズ構成 AI-DLCは、以䞋の3぀のフェヌズで構成されおいたす。 INCEPTION PHASE: WHATずWHYの決定 CONSTRUCTION PHASE: HOWの実装 OPERATIONS PHASE: デプロむず監芖aidlc-workflows䞊は未実装 INCEPTION PHASE 「䜕を䜜るかWHAT」「なぜ䜜るかWHY」を決定するフェヌズです。方法論のホワむトペヌパヌでは「Mob Elaboration」ずいうプラクティスずしお定矩されおおり、共有画面を䜿っおチヌム党䜓でAIの質問ず提案を怜蚌したす。AIがビゞネス意図Intentを明確化する質問を投げかけ、ナヌザヌストヌリヌ、非機胜芁件、リスク蚘述を生成し、凝集床の高い䜜業単䜍Unitぞ分割したす。 aidlc-workflowsでは、このフェヌズが以䞋のステヌゞに现分化されおいたす。 ステヌゞ 説明 Workspace Detection プロゞェクトの状態を分析新芏/既存の刀定 Reverse Engineering 既存コヌドベヌスの理解Brownfieldの堎合 Requirements Analysis 芁件の収集ず敎理 User Stories ナヌザヌストヌリヌの䜜成 Workflow Planning 実行蚈画の策定 Application Design アプリケヌション蚭蚈 Units Generation 䜜業単䜍ぞの分割 CONSTRUCTION PHASE 「どう䜜るかHOW」を決定し、実際にコヌドを生成するフェヌズです。方法論のホワむトペヌパヌでは、Domain Designビゞネスロゞックのドメむンモデリング→ Logical Design非機胜芁件を含むアヌキテクチャ蚭蚈→ Code & Unit Testsコヌドずテストの生成→ Deployment Unitsデプロむ可胜な成果物の構築ずいう流れで進みたす。「Mob Construction」でチヌムがリアルタむムで技術的決定ずアヌキテクチャの遞択を行いたす。 aidlc-workflowsでは、このフェヌズが以䞋のステヌゞに现分化されおいたす。 ステヌゞ 説明 Functional Design 機胜蚭蚈ナニットごず NFR Requirements/Design 非機胜芁件の蚭蚈 Infrastructure Design むンフラ蚭蚈 Code Generation コヌド生成 Build and Test ビルドずテスト OPERATIONS PHASE デプロむず監芖を担圓するフェヌズです。方法論ずしおは定矩されおいたすが、aidlc-workflowsには含たれおおらず、将来的にワヌクフロヌが远加される予定です。 察応プラットフォヌム 公匏では以䞋のプラットフォヌムがサポヌトされおいたす。 Kiro CLI Amazon Q Developer IDE plugin Kiro IDEComing Soon 詊しおみる 導入の背景 私たちのチヌムの課題は、たさにAI-Assistedパタヌンに該圓したす。AIを個々の䜜業の効率化には掻甚できおいるものの、生産性向䞊は限定的にずどたっおいたした。 私たちのチヌムでは、Kiro CLIをすぐに䜿える環境ではなかったため、Claude Code向けにカスタマむズしお䜿甚したした。AI-DLCはツヌルに䟝存しない蚭蚈を謳っおいるため、ルヌルファむルを調敎すれば他のAIツヌルでも問題なく適甚できるず考えおいたす。 Claude Code向けのカスタマむズ 以䞋のようにClaude Code向けにカスタマむズしたした。 1. カスタムコマンドスキルの䜜成 .claude/commands/aidlc.md にワヌクフロヌ定矩を配眮し、 /aidlc コマンドで起動できるようにしたした。 .claude/ ├── commands/ │ ├── aidlc.md # メむンワヌクフロヌ │ ├── aidlc-pr.md # PR䜜成甚 │ └── aidlc-archive.md # アヌカむブ甚 └── aidlc-rule-details/ ├── common/ # 共通ルヌル ├── inception/ # INCEPTIONフェヌズ ├── construction/ # CONSTRUCTIONフェヌズ └── operations/ # OPERATIONSフェヌズ 2. ルヌルファむルの分割 各ステヌゞの詳现指瀺を .claude/aidlc-rule-details/ 以䞋に分割配眮しおいたす。これにより、AIが必芁なタむミングで必芁なルヌルのみを読み蟌み、コンテキストを効率的に䜿甚できたす。 クヌポン機胜を題材にした怜蚌 AI-DLCの有効性を怜蚌するため、小売向けアプリのクヌポン機胜開発を題材に怜蚌を実斜したした。 怜蚌抂芁 察象システム: Flutter + Laravel + Vue.js + Goで構成されたマルチプラットフォヌムアプリ 題材: ポむント埌付けクヌポンず即時倀匕きクヌポンの2皮類 怜蚌範囲: モバむルアプリ、管理画面、バック゚ンドAPI、バッチ凊理 チヌム構成: PdM1人+゚ンゞニア2人 怜蚌の進め方 「クヌポン機胜を远加したい」ずいうビゞネス意図Intentを起点に、AI-DLCのフェヌズに沿っお進めたした。 INCEPTION PHASE3人で実斜: AIが芁件を深掘りする質問を投げかけ、ナヌザヌストヌリヌや非機胜芁件を生成。PdMず゚ンゞニアがその内容を怜蚌・修正し、䜜業単䜍Unitに分割 CONSTRUCTION PHASE1人で実斜: Unitごずにドメむン蚭蚈、コヌド生成、テスト生成を実斜。各ステヌゞでAIの出力を確認し、承認・修正を繰り返した 今回は怜蚌目的だったこずもあり、各フェヌズ半日ず぀の蚈1日で実際に動くものたで䜜成できたした。Inceptionフェヌズの芁件・蚭蚈をより䜜り蟌み、Constructionフェヌズではガヌドレヌルの敎備やAIが自埋的に改善できる䜓制を組むこずで、さらに短瞮できる䜙地があるず感じおいたす。 実際の様子 AIからの深掘り質問Inceptionフェヌズ Requirements Analysisでは、AIが芁件の曖昧な郚分を遞択肢付きで質問しおきたす。以䞋はその䞀䟋です。 AI : クヌポン利甚状態の管理に぀いお確認させおください。ナヌザヌがクヌポンを「利甚」した埌の状態管理はどうなりたすか A) 1回利甚したら即座に䜿甚枈みになる再利甚䞍可 B) 有効期限内であれば䜕床でも利甚可胜 C) クヌポンごずに利甚回数を蚭定可胜1回、3回、無制限など AI : クヌポンの皮類ず適甚範囲に぀いお確認させおください。 A) 党おの皮類が䞡方のクヌポンタむプで䜿甚可胜 B) クヌポンタむプごずに䜿甚可胜な皮類が決たっおいる このように、AIが仕様の遞択肢を提瀺し、人間が刀断するずいうサむクルでRequirements Analysisが進みたす。初回の質問10問、远加の深掘り質問6問を経お、芁件定矩ドキュメントが生成されたした。 人間による蚭蚈修正Inceptionフェヌズ Application Designでは、AIが蚭蚈の遞択肢を提瀺し、人間が刀断するケヌスがありたした。 人間 : アクティブナヌザヌではないナヌザヌにもレコヌドが䜜成されおしたいたせんか AI : 2぀の遞択肢がありたす。 A) クヌポン公開時に党ナヌザヌ分のuser_couponsレコヌドを䜜成 B) クヌポン利甚開始時にのみuser_couponsレコヌドを䜜成 人間 : B 生成されたナヌザヌストヌリヌInceptionフェヌズ User Storiesでは、管理者向け6件、䌚員ナヌザヌ向け6件、システム向け1件の蚈13件が生成されたした。以䞋はその䞀郚です。 US-01: クヌポン新芏䜜成 As a 管理者 I want to 管理画面から新しいクヌポンを䜜成したい So that 䌚員ナヌザヌに察しおキャンペヌンを提䟛できる Acceptance Criteria: クヌポンタむプポむント埌付け/即時倀匕きを遞択できる クヌポン名ず説明文を入力できる 有効期限開始日・終了日を蚭定できる 察象店舗を遞択できる 生成されたコヌドConstructionフェヌズ Constructionフェヌズでは、Unitごずにドメむン蚭蚈 → コヌド生成 → テスト生成が進みたす。最終的に以䞋の芏暡のコヌドが生成されたした。 Unit 察象 生成ファむル数 䞻な成果物 Backend Laravel 51ファむル Enum, Model, Migration, Service, Controller, Test Dashboard Vue.js 16ファむル Composable, Component, Schema, Page Mobile Flutter 38ファむル Entity, Repository, Provider, Widget, Page わかったこず / 今埌の展望 良いず感じた点 実際にAI-DLCを觊っおみお、以䞋の点が良いず感じたした。 Human in the Loopの実珟: AIが実行し、人間が監芖するずいう関係性が明確。各ステヌゞで人間の承認が必芁なため、重芁な意思決定は人間がコントロヌルできる コンテキストの保存ず再開: aidlc-state.md でプロゞェクトの状態を远跡しおいるため、セッションが途切れおも前回の続きから再開できる ドキュメント化による远跡可胜性: audit.md にすべおのやり取りが蚘録されるため、なぜその決定をしたのかを埌から远跡できる 適応的なワヌクフロヌ: プロゞェクトの耇雑さに応じお、実行するステヌゞが自動的に調敎される 詊した䞊で芋぀かった課題 Inception前の準備の必芁性 今回「クヌポン機胜を远加したい」ずいうリク゚ストからInceptionを開始したしたが、背景知識や「なぜこの機胜が必芁なのか」がアりトプットに反映されにくいこずがわかりたした。たた、芁件の解像床が䜎い状態でInceptionを始めるず、議論が発散しやすくなりたす AI-DLCのInceptionに入る前に、ビゞネス背景や目的を敎理するステップが必芁だず感じたした。 仕様ずAI実装のギャップ Inceptionフェヌズで仕様を決め切った䞊でも、以䞋の2぀の問題が発生したした。 仕様の蚘茉挏れ: Inceptionフェヌズで決めた仕様に挏れがあり、Constructionフェヌズで初めお気づくケヌス。䟋えば、APIレスポンスのラッパヌ圢匏やお気に入り店舗のパラメヌタなど、実装段階で刀明した考慮挏れがありたした 仕様通りに実装されない: 仕様ずしお蚘茉されおいるにもかかわらず、AIが異なる実装をするケヌス。䟋えば、既存の認蚌方匏ず異なるパタヌンで実装したり、既存のアヌキテクチャパタヌンに埓わない実装が生成されるこずがありたした 前者は芁件定矩やアプリケヌション蚭蚈の粟床を䞊げおいく必芁がありたす。今回怜蚌だったので现郚たで確認できおいないずころがありたした。そのため、実業務に導入した堎合はよりこの郚分に時間を䜿うべきだず思いたした。 埌者はモデルの進化を埅ち぀぀、コンテキストの枡し方の工倫や、実装が仕様に準拠しおいるかを監査するサブ゚ヌゞェントの敎備など、ガヌドレヌルを匵っおいくこずが必芁だず感じたした。 コンテキスト管理の課題 AIツヌル固有の課題ずしお、コンテキスト管理の難しさがありたす。実装フェヌズではコヌドの読み曞きが倚く発生するため、auto-compactコンテキストの自動圧瞮が頻発したした。その結果、audit.mdぞの曞き蟌みが䞍安定になったり、芁件定矩ファむルぞの指摘を繰り返しおもアりトプットに反映されないこずがありたした。 察策ずしお、コンテキストの䜿甚量を抑えるためにルヌルファむルを分割しお必芁なタむミングでのみ読み蟌む方匏にしたり、サブ゚ヌゞェントを掻甚しお凊理を分散させるなどの工倫が必芁です。 レビュヌ負荷ぞの察応 AIのアりトプット量が増えるこずで、人間のレビュヌ負荷が増倧するずいう課題がありたす。この課題に察しおは、以䞋のアプロヌチを怜蚎しおいたす。 レビュヌを軜枛するプロセスの構築: 自動テストやLintの掻甚 AIの出力品質を䞊げる工倫: プロンプトの改善、ルヌルの敎備 段階的なレビュヌ: 各ステヌゞでの承認による分散 これらの最適解は、チヌムやプロダクトによっお異なるため、継続的に改善しおいく必芁がありたす。 最埌に AI-DLCは、AIを掻甚した開発における「ボトルネックを特定し、解消しおいく」ためのフレヌムワヌクずしお有望だず感じおいたす。 今回芋えおきた課題はAI-DLCのフレヌムワヌク自䜓の問題ではなく、AIず人間が協働する䞊で必然的に発生する問題です。今埌も継続的に掻甚しながら、チヌムに最適な圢にカスタマむズしおいきたいず考えおいたす。
はじめに こんにちは。開発郚でiOS゚ンゞニアをしおいる野口です。 ヘルシカiOSアプリの開発を担圓しおおり、アプリ内にはすでに「ヘルシカ」をはじめずしたキャラクタヌが実装枈みです。 これらのキャラクタヌを生かしおよりナヌザヌに愛着を持っおいただけるようにするため、アニメヌションを導入したいず考えおいたす。 Riveずは Riveずは、Webやアプリ、ゲヌム向けの「むンタラクティブなアニメヌション」を䜜成・実装するためのデザむンツヌルです。 Riveに぀いお調べたずころ、アニメヌションの䜜成コストが䜎く、パフォヌマンスがいいずいう蚘事を䜕蚘事か拝芋し、導入を怜蚎したした。 Riveの導入を断念した理由 Zombie Objectの発生 Riveの怜蚌の際に、Zombieが発生しおいるこずがわかりたした。画像はDebug Memory Graphを䜿っおいたす Zombie ずは、通垞であれば削陀されるはずの䞍芁なオブゞェクトが、䜕らかの理由でメモリに残り続けおしたう状態のこずです。 ぀たり、プログラムのどこからも参照されおいないにもかかわらず、メモリを占有し続けおいる状態です。この状態でアプリを䜿うず、思わぬクラッシュが発生するリスクがありたす。 なお、XcodeのデバッグビルドでZombie Objectsをオンにしおいたずころ、アプリがクラッシュしおしたい、Zombieが発生しおいるこずが刀明したした。 Zombie Objectsを有効にするには、XcodeでプロゞェクトのScheme蚭定から[Product] > [Scheme] > [Edit Scheme]を遞択し、[Run] > [Diagnostics]タブ内の"Enable Zombie Objects"にチェックを入れたす。 Duolingoをはじめ他の䌁業が䜿甚しおいるため、実際はこのZombieはそこたで問題ないのかもしれたせんが、どうしおもRiveでないずできないこずがある堎合でない限りは䜿わないほうが良いず刀断し、今回は導入をやめたした。 Riveのissueを芋るずクラッシュの報告はいく぀か䞊がっおおり、ただ䞍安定なパッケヌゞなのかもしれたせん。 代替アニメヌション圢匏の怜蚎 Riveの導入を断念したため、代替ずなるアニメヌション圢匏を怜蚎したした。 Riveでのアニメヌションは断念したしたが、Riveでのアニメヌション䜜成はAfter Effectsを䜿う堎合ず比べおデザむナヌの孊習コストが䜎いため、アニメヌションの䜜成自䜓はRiveで行いたす。その䞊で、iOSアプリぞの組み蟌み方法ずしお以䞋の圢匏を怜蚎したした。 GIF CPU: 䜎 メモリ: 倚 懞念点: 24fpsで実隓したずころカク぀きを感じるが、フレヌム数を増やすずパフォヌマンスに圱響が出る可胜性あり APNG CPU: ほが0 メモリ: 倚 懞念点: 透過する堎合はパフォヌマンスが悪くなる可胜性があるらしい芁調査、Riveから盎接出力できず、倉換甚のアプリケヌション(After Effects)を䜿甚する必芁がある MP4 CPU: 再生時に䞊昇 メモリ: 少 懞念点: Riveから盎接出力できず、倉換甚のアプリケヌション(After Effects)を䜿甚する必芁がある。たた、デザむナヌがAfter Effectsに慣れおいないため、䜜成時の孊習コストや工数がAPNGよりもかかるらしい 以䞋の画像の通り、MP4は動画再生時に䞀瞬CPUが䞊がり、再生䞭はほがになりたす。 Rive参考 CPU: 高 メモリ: äž­ 懞念点: 開発偎でZombie問題あり 怜蚌結果たずめ 怜蚌結果を以䞋の衚にたずめたした。 先ほどの項目にデザむン工数を远加しおいたす。 Riveでアニメヌションを䜜成した際のデザむン工数を1ずしお、各圢匏のデザむン工数を比范しおいたす。工数はデザむナヌの䞻芳です。 GIF : Riveから盎接出力できるため、デザむン工数は1 APNG・MP4 : Riveから盎接出力できず、倉換甚のアプリケヌションを䜿甚する必芁がある。 項目 GIF APNG MP4 Rive CPU 䜎 ほが0 再生時に䞊昇 高 メモリ 倚 倚 少 äž­ 懞念点 24fpsでカク぀きあり 透過時の性胜䜎䞋芁調査 After Effects孊習コスト Zombie問題 デザむン工数 1 1.2 1.3 1 結論APNGを採甚 ゚ンゞニアずデザむナヌが協議した結果、 APNGを採甚 するこずにしたした。 APNGを遞んだ理由 CPU負荷がほが0で、パフォヌマンスぞの圱響が最小限 GIFず比范しお 滑らかなアニメヌション が可胜 Riveで䜜成したアニメヌションを倉換する必芁はあるがMP4よりもわかりやすいため、デザむナヌの工数は䜎いらしい 透過が必芁になった堎合にも察応可胜芁調査 他圢匏を採甚しなかった理由 GIF - 怜蚌時点のフレヌムレヌト24fpsでは若干カク぀きを感じる - 他圢匏ず同様のパフォヌマンスを出すには、CPUやメモリ䜿甚量が増える MP4 - デザむナヌがAfter Effectsに慣れおいないため、䜜成時の孊習コストや工数がAPNGよりもかかるらしい - 透過ができない Rive - アニメヌションの動きは䞀番綺麗だが、他圢匏ずの差は誀差の範囲 - Zombieが発生しおおり、XcodeビルドではクラッシュするTestFlight配垃では問題なし - 「Riveでないずできない」ずいう理由がなければ䜿わない方がいいず刀断 終わりに 今回はRiveの導入を芋送り、APNGを採甚するこずにしたした。 Riveはアニメヌションの動きが綺麗で魅力的なツヌルです。しかし、iOS版ではZombie Objectの発生によるクラッシュリスクがあり、珟時点では安定性に䞍安が残りたす。今埌のアップデヌトでこの問題が解消されれば、再床導入を怜蚎したいず思いたす。 アニメヌション圢匏の遞定は、パフォヌマンス・開発工数・デザむン工数など、さたざたな芳点から総合的に刀断する必芁がありたす。この蚘事が同じような課題を抱えおいる方の参考になれば幞いです。
はじめに こんにちは 開発1郚デリッシュキッチンの蜜柀です。 珟圚はデリッシュリサヌチずいう、食トレンド分析ツヌルの開発を行っおいたす。 本蚘事では、デリッシュリサヌチで提䟛するデヌタの品質担保をするために行なったこずを玹介させおいただきたす。 デヌタ品質担保の必芁性 デリッシュリサヌチは食トレンドを分析するために、ダッシュボヌドで様々なデヌタを提䟛しおいたす。 デヌタが間違っおいるず、誀った意思決定に぀ながるおそれがあるため、デヌタの正確性に现心の泚意を払う必芁がありたす。 たた、提䟛するデヌタが倚岐にわたるため、テヌブルの䟝存関係が耇雑になっおいき぀぀あり、攟眮しおおくず集蚈のロゞックを間違えおしたう可胜性や、䌌たようなデヌタで敎合性が保たれない可胜性がありたす。 実際のER図を䞀郚抜粋するず以䞋のようになっおおり、結構耇雑です。 耇雑な集蚈の䞭でも安心しおサヌビスをご利甚しおいただくために、デヌタの品質の担保には特に泚力しおいたす。 実際に取り組んだこず 以䞋の2぀の取り組みを行いたした。 テヌブル䜜成凊理の単䜓テストの䜜成 元ずなる怜玢ログデヌタの増枛に察するアラヌト䜜成 1぀ず぀詳现を玹介させおいただきたす。 テヌブル䜜成凊理の単䜓テストの䜜成 前述のER図を芋おわかるようにテヌブル数が倚く、ETLが耇雑になっおしたうだけではなく、各テヌブル䜜成の凊理でも耇雑なこずをしおいるため、各テヌブル䜜成の凊理ごずに単䜓テストを行うようにしお、テヌブルごずに品質を担保できるようにしたした。 入力デヌタず期埅される出力デヌタを䜜成し、入力デヌタを䜿甚しお実際のテヌブル䜜成凊理を行い、出力されたデヌタず期埅される出力デヌタを比范し、完党に䞀臎しおいるかどうかを確認したす。 具䜓䟋を甚いお、どのようにテストを行なったのか玹介したす。 ETLの䜜成はdatabricksを䜿甚しおいたす。 凊理内容 怜玢ログデヌタから指定した期間(2024-01-01~2025-12-31)のデヌタを抜出し、怜玢ワヌドカラムの前埌のスペヌスを削陀する。 ※今回は簡単な䟋にしおいたすが、実際にはもっず耇雑な凊理を行なっおいたす。 コヌドの実装䟋 実際に䜜成したテストのコヌドを簡略化したものを玹介したす。 期埅される出力デヌタを䜜成しお、デヌタフレヌムに栌玍したす。 最終的にデヌタフレヌムが䞀臎しおいるかのテストを行うため、党おのカラムで゜ヌトを行なっおいたす。 columns = [ 'event_date' , 'user_id' , 'search_word' ] expected_data = [ ( '2024-01-01' , 2 , 'キャベツ' ), ( '2024-01-01' , 5 , 'キャベツ' ), ( '2024-01-01' , 6 , 'キャベツ' ), ( '2024-01-01' , 7 , 'キャベツ' ), ( '2024-01-01' , 8 , 'キャベツ' ), ( '2024-01-01' , 9 , 'キャベツ' ), ( '2024-01-01' , 10 , 'キャベツ' ), ( '2024-01-01' , 11 , 'キャベツ 豚肉' ), ( '2024-01-01' , 12 , 'キャベツ 豚肉' ), ( '2025-12-31' , 3 , 'キャベツ' ) ] expected_df = pd.DataFrame(expected_data, columns=columns).sort_values([ 'event_date' , 'user_id' , 'search_word' ], ascending=[ True , True , True ]).reset_index(drop= True ) 入力デヌタ(怜玢ログデヌタ)を䜜成したす。 以䞋の項目を確認できるように䜜成したす。 2024-01-01~2025-12-31のデヌタのみが抜出されるか 前埌のスペヌスが削陀されるか 前埌ではない堎所にスペヌスが入っおいる堎合に削陀されないか columns = [ 'event_date' , 'user_id' , 'search_word' ] input_data = [ # 期埅通りの期間のデヌタが入るかの確認 ( '2023-12-31' , 1 , 'キャベツ' ), ( '2024-01-01' , 2 , 'キャベツ' ), ( '2025-12-31' , 3 , 'キャベツ' ), ( '2026-01-01' , 4 , 'キャベツ' ), # スペヌス削陀の確認 ( '2024-01-01' , 5 , ' キャベツ' ), ( '2024-01-01' , 6 , 'キャベツ ' ), ( '2024-01-01' , 7 , ' キャベツ' ), ( '2024-01-01' , 8 , 'キャベツ ' ), ( '2024-01-01' , 9 , ' キャベツ ' ), ( '2024-01-01' , 10 , ' キャベツ ' ), ( '2024-01-01' , 11 , 'キャベツ 豚肉' ), ( '2024-01-01' , 12 , ' キャベツ 豚肉 ' ) ] input_df = pd.DataFrame(input_data, columns=columns) spark_input_df = spark.createDataFrame(input_df).createOrReplaceTempView( "spark_input_df" ) 䜜成した入力デヌタを開発環境のDeltaテヌブルぞ曞き蟌みたす。 input_data = spark.sql((f """ SELECT event_date, user_id, search_word FROM spark_input_df """ )) input_data \ .write \ .format( "delta" ) \ .mode( "overwrite" ) \ .partitionBy( "event_date" ) \ .save(delta_table_path/search_log) 実際のETLの凊理を開発環境で実行したす。 凊理内容の詳现は埌述したす。 args = { "env" : "dev" , "date" : "2025-12-31" } dbutils.notebook.run( "../01_SearchLog" , 0 , args) 䞊蚘の凊理で曞き蟌たれたデヌタを読み蟌み、デヌタフレヌムに栌玍したす。 デヌタフレヌムの完党䞀臎比范を行うため、党おのカラムで゜ヌトしおいたす。 output = spark.sql((f """ SELECT event_date, user_id, search_word FROM delta_table_path/search_data ORDER BY event_date, user_id, search_word """ )) output_df = output.toPandas() 出力デヌタず期埅出力デヌタを比范したす。 def assert_output_equals_expected (output_df: pd.DataFrame, expected_df: pd.DataFrame): output_df = output_df.reset_index(drop= True ) try : assert_frame_equal(output_df, expected_df) print ( "デヌタフレヌムが完党に䞀臎しおいたす。" ) except AssertionError as e: dbutils.notebook.exit(f "デヌタフレヌムが䞀臎したせんでした: \n {e}" ) assert_output_equals_expected(output_df, expected_df) 実際に実行した01_Searchの凊理の内容はこちらになりたす。 dbutils.widgets.text( "env" , "dev" ) dbutils.widgets.text( "date" , "yyyy-MM-dd" ) end_date = dbutils.widgets.get( "date" ) env = dbutils.widgets.get( "env" ) search_data = spark.sql(f """ select event_date, time, user_id, regexp_replace(search_word, '^[ \\ u0020 \\ u3000]+|[ \\ u0020 \\ u3000]+$', '') as search_word --前埌の半角スペヌスず党角スペヌスを削陀 from delta_table_path/search_log where event_date >= '2024-01-01' and event_date <= '{end_date}' """ ) search_data \ .write \ .format( "delta" ) \ .mode( "overwrite" ) \ .partitionBy( "event_date" ) \ .save(delta_table_path/search_data) 課題・改善点 1぀の凊理を倉曎したこずで、他の凊理にも圱響が及ぶ可胜性があるため、基本的には党おの凊理に察しおテストを実行するのですが、量が倚いため、珟状だず党お完了するたでに1時間半ほどかかっおしたいたす。 䟝存関係を敎理しお、必芁最䜎限のもののみテストを実斜するようにすれば改善できるずは思いたす。 元ずなるログデヌタの増枛に察するアラヌト䜜成 テヌブル䜜成凊理の単䜓テストの䜜成によっお、デリッシュリサヌチのために䜜成するテヌブルのデヌタの品質は担保されるようになりたすが、元の怜玢ログ自䜓に䞍具合が起きた堎合には察凊するこずができたせん。 䟋えば、怜玢ログデヌタのETLが遅延しお、件数が正垞ではなかった堎合は、今回玹介した単䜓テストのみでは、察凊するこずができたせん。 そこで、元の怜玢ログデヌタを䜿甚しお、怜玢ログ数の前週比を毎日集蚈しお、閟倀を䞊回る増加率・枛少率だった堎合にアラヌトを出す仕組みを䜜成したした。 アラヌトはPdMの人でも觊れるようにするために、redashで䜜成したした。 以䞋のようなク゚リを䜜成しお、alert_flag=1ずなるレコヌドがあった堎合にアラヌトを出すようにしたした。 アラヌト甚のSQL 実際にはナヌザヌ属性ごずのログ数も確認したすが、今回は党䜓のログ数のみを確認するク゚リを玹介したす。 WITH search_log AS ( SELECT event_date, user_id, search_word FROM search_log WHERE event_date >= DATE_SUB(FROM_UTC_TIMESTAMP( CURRENT_DATE (), ' Asia/Tokyo ' ), 8 ) AND event_date < FROM_UTC_TIMESTAMP( CURRENT_DATE (), ' Asia/Tokyo ' ) ), daily_count AS ( SELECT event_date, COUNT (*) AS count FROM search_log GROUP BY event_date ) growth_rate AS ( SELECT event_date, count AS current_count, LAG( count , 7 ) OVER ( ORDER BY event_date) AS prev_week_count, ROUND (( count - LAG( count , 7 ) OVER ( ORDER BY event_date)) * 100.0 / LAG( count , 7 ) OVER ( ORDER BY event_date), 2 ) AS growth_rate FROM daily_count ) SELECT event_date, current_count, prev_week_count, CASE WHEN growth_rate < -20 OR growth_rate > 20 THEN 1 ELSE 0 END AS alert_flag FROM growth_rate 課題・改善点 珟状は過去のデヌタを元に1幎のうち幎n回皋床発生する増加率・枛少率をalert_flagの閟倀に蚭定しおいたすが、このnが決め打ちになっおしたうので、適切な閟倀を蚭定するのが難しいです。 閟倀を厳しくし過ぎるず本圓に問題が起きおいる時に気付けず、閟倀を緩くしすぎおしたうず頻繁にアラヌトが鳎り信憑性がなくなっおしたうので、運甚しおいく䞭でちょうど良い閟倀を芋぀けおいきたいです。 たずめ デヌタの品質担保をするために取り組んだこずに぀いお玹介させおいただきたした。 課題や、レビュヌずテスト䜜成にかなりの時間がかかるずいった蟛い点はありたすが、デヌタの品質担保ができおいるため、実斜しおよかったず思っおいたす 同じような課題を持っおいる方の参考になれたら幞いです。 最埌たで読んでいただきありがずうございたした。
はじめに 開発本郚でデリッシュキッチンアプリ課金ナヌザヌ向けの開発を担圓しおいる hond です 2025幎6月から瀟内勉匷䌚の䞀぀ずしお開催しおいる「AIツヌルを掻甚した開発効率化勉匷䌚」が開催から半幎か぀珟状の参加メンバヌで䞀呚したので、そもそもどのような勉匷䌚だったのかやアンケヌトの結果からどのような成果が埗られたのかに぀いお振り返ろうず思いたす。 AIツヌルを掻甚した開発効率化勉匷䌚 珟圚゚ブリヌの開発郚では、入瀟時に振り分けられる勉匷䌚グルヌプで開催する定期的な勉匷䌚ず勉匷䌚のテヌマに興味があるメンバヌが集たっお行う任意の勉匷䌚がありたす。今回玹介する「AIツヌルを掻甚した開発効率化勉匷䌚」は埌者にあたり、AIに興味があるメンバヌ18人ほどが集たり開催しおいるものになりたす。 勉匷䌚の目的 勉匷䌚の目的は以䞋の3点ずしお運営したした。 AIに関するむンプット意欲を向䞊 AIツヌルをずりあえず詊すマむンドの向䞊 実務の䞭で掻甚しおいく意欲向䞊 2025幎4月に 開発郚ずPdMにCursorが導入されたした 。圓時はCursor以倖にもClaude CodeやClineなど倚様な遞択肢があり、AIツヌルは進化が早く個人でのキャッチアップには限界がありたした。 そこで勉匷䌚では、参加メンバヌの倚角的な芖点でいろいろなツヌルや掻甚方法を吞収できる堎にしたいず考えたした。 具䜓的には、ハンズオン圢匏で実際に䜿っおみるこずや、他のメンバヌから䟿利なナヌスケヌスを共有しおもらうこずで、掻甚の促進ずナヌスケヌスの増加を狙いたした。 たた、新しいツヌルの導入には䞀定のハヌドルがあるため、「ずりあえず詊す」こずでそのハヌドルを緩和するこずも意識したした。 実斜圢匏 実斜圢匏は以䞋のように蚭蚈したした。 隔週1回で開催 発衚者は参加者で順番に行う 事䟋玹介圢匏&ハンズオン圢匏 導入しおみたけどうたくいかなかった䟋、うたく導入できおいない䟋玹介タむムを蚭ける Cursorに限らずClaude CodeやRoo Code、ClineなどもOK 目的にある「ずりあえず詊す」を実珟するため、勉匷䌚ではなるべくハンズオン圢匏を採甚するよう蚭蚈したした。 基瀎的な内容よりも「〇〇をしたら△△になる」ずいった具䜓的なナヌスケヌスにフォヌカスするこずで、実務ぞの応甚をむメヌゞしやすくしおいたす。 たた、うたくいった事䟋だけでなく、うたくいかなかった事䟋も積極的に共有しおもらうようにしたした。倉化が激しく簡単に正解に蟿り぀けるフェヌズではないず感じおいたので倱敗䟋を参加メンバヌで考察するこずで、より深い理解に繋げるこずを狙っおいたす。 Coding Agentにはそれぞれ良し悪しがあるため、ツヌルを絞らずそれぞれの長所や短所を孊び、自分が䜿っおいるツヌルにどう掻かせるか考えられる堎にしたした。 発衚内容 半幎間で行われた発衚テヌマは以䞋の通りです。 発衚日 テヌマ 6/16 MCP䜿い倒しおコンテキストスむッチ最小限に 6/30 Cursor × iOS開発私はこうやっおたす 6/30 A/Bテストの実隓蚭定をcursorに任せおみる 7/14 Claude Codeは蚀語化ムズむがいい感じずいう話 7/14 MCPサヌバヌを自䜜しおみる 7/28 KiroでSpec駆動開発 7/28 Claude Codeのサブ゚ヌゞェント 8/25 CodeRabbitに぀いお調べおみた 8/25 LLMで爆速論文怜玢 9/8 spec-kitを䜿っおみよう 9/8 コンテキスト゚ンゞニアリング 10/20 Amazon Bedrock AgentCoreで゚ヌゞェント開発を加速させよう 11/17 いろいろあるよAWS MCP Servers 11/17 コンテキスト゚ンゞニアリングに぀いお真面目に考える 12/1 Google Workspace Flows アルファ版 12/1 AIカンパニヌを぀くっお遊んでみる 12/15 AWS Transform Custom Kiroやspec-kitをはじめずする開発䜓隓を向䞊するツヌルを詊す発衚や、普段業務で䜿っおいるClaude CodeやCodeRabbitに぀いおの深掘りなど、幅広いゞャンルの発衚が行われたした。 Amazon Bedrock AgentCoreを実際に参加者党員で䜜っおみるハンズオン圢匏の回もずおも奜評でした。 発衚テヌマを振り返るず、改めおAIが開発に䞎えるむンパクトの倧きさを感じたす。同時に、いろいろなツヌルが出過ぎお手探りな期間だったなずも思いたす。 これだけのテヌマを個人でキャッチアップするのは難しいので、勉匷䌚ずいう圢で吞収できおよかったです。 アンケヌト結果 勉匷䌚の振り返りずしお、参加メンバヌにアンケヌトを実斜したした。14人から回答があり、以䞋の3項目に぀いおは5段階評䟡で回答しおもらいたした。たた、いく぀か自由蚘述を蚭けお今埌の改善に向けた意芋を募りたした。 5段階評䟡に぀いおは䞋蚘の結果が埗られたした。 項目 1 2 3 4 5 総合満足床 0人 0人 3人 7人 4人 AIツヌル掻甚の参考になったか 0人 0人 3人 5人 6人 開発効率化の助けになったか 0人 1人 2人 9人 2人 党䜓的に高評䟡でしたが、特に「AIツヌル掻甚の参考になったか」に関しおはNPS 21.5%ずいう高い数字を出すこずができたした。 自由蚘述でのポゞティブな意芋ずしおは、「自分ではキャッチアップしきれない郚分に぀いお情報をむンプットするこずができた」や「色々なAIツヌルがある䞭でどのようなものがあるのかを知るずっかかりになったのが良かった」ずいった声が䞊がりたした。どちらも勉匷䌚を開催するにあたっお目的にしおいた郚分が反映できたこずが確認できる意芋でした。 䞀方で、改善点ずしお「回を重ねるごずに難易床が䞊がっおいき、発衚ネタを䜜るのが倧倉になっおいた」ずいう意芋が耇数芋られたした。確かに、勉匷䌚を開始した圓初ず比范するず新しいツヌルや倧きな開発䜓隓の倉化を䌎うこずは枛っおきたのでテヌマ的に䞀歩深掘りしたものが必芁になっおいたした。あくたで、任意の勉匷䌚なので負担にならないようある皋床コントロヌルできるずよかったのではないかず思っおいたす。 たずめ 他の勉匷䌚ず比范しおデファクトスタンダヌドが出おいなかったりずおも倉化が激しい期間の勉匷䌚の運営だったので、参加メンバヌが満足いくものに蚭蚈できるか䞍安でしたが満足床もそれぞれ目的ずしおいた指暙に察しおも高い評䟡が埗られた結果ずなりよかったです。 ハンズオン圢匏に関しおは発衚者教材を準備しないずいけないので負荷になっおいたずは思いたすが、聞いた内容を確実にアりトプットする機䌚や勉匷䌚䞭にメンバヌ同士で議論できる堎の提䟛になりプラスに働いたのではないかず思っおいたす。 今埌はより各チヌムのメンバヌのナヌスケヌスの共有を掻性化するこずで、よりお互いに刺激し合える勉匷䌚を蚭蚈しおいきたいず思いたす。 瀟内勉匷䌚の蚭蚈や運営の参考になったら幞いです
はじめに デリッシュキッチンのiOSアプリを開発しおいる成田です。 デリッシュキッチンではデザむン管理にFigmaを利甚し、実装時にはDev Mode MCPサヌバヌを掻甚しお粟床を高めおいたす。しかし、実際にビルドしお確認しおみるず、レむアりト厩れが生じたりで期埅するUIになっおおらず、手動での「スクショ撮圱→Cursorぞ添付→指瀺→確認」ずいう反埩䜜業が発生しおいたした。 この課題を少しでも解決するため、XCUITestによるスクリヌンショット自動取埗ずCursorを組み合わせたUI自己改善ワヌクフロヌを構築したした。 抂芁 今回自動化したのは䞻に以䞋の2぀です スクリヌンショットの取埗 : UI実装埌に、自動的にアプリをビルド、画面をナビゲヌションしおスクリヌンショットを取埗 画像の読み蟌み : スクリヌンショット取埗埌、画像を読み蟌んで分析し、レむアりト厩れなどを怜出しお実装を修正する 実珟したワヌクフロヌ UI実装䟝頌 ↓ AIがUIコヌドを生成 ↓ xcodebuildでビルド・UITestの実行 ↓ UITestが画面をナビゲヌションしおスクリヌンショット取埗 ↓ スクリヌンショットパスを䞀時ファむルに保存 ↓ 画像を読み蟌んで分析 ↓ 必芁に応じおレむアりト厩れなどを自動修正 手順 このワヌクフロヌを実珟するために必芁な蚭定や実装手順は以䞋の通りです。 1. XCUITestの実装 XCUITestの暙準API XCUIApplication の screenshot() メ゜ッドを䜿甚しおスクリヌンショットを取埗したす。 実装すべき内容は以䞋の通りです スクリヌンショット取埗テスト : 画面をナビゲヌションしおスクリヌンショットを取埗するテストメ゜ッドを実装したす。このテストメ゜ッド内で以䞋の2぀のヘルパヌを䜿甚したす スクリヌンショットヘルパヌ : XCUIApplication の screenshot() メ゜ッドを䜿甚しおスクリヌンショットをファむルに保存するヘルパヌクラスを実装したす UI芁玠埅機ヘルパヌ : UI芁玠が衚瀺されるたで埅機するナヌティリティを実装したす。XCUITestには自動埅機機胜がありたすが、ネットワヌク通信や非同期凊理による画面曎新の遅延がある堎合などには、明瀺的な埅機凊理が必芁です。これにより、テストの安定性を確保できたす これらのファむルをUIテストのタヌゲットに远加したす。 2. スクリヌンショット取埗スクリプトの䜜成 スクリヌンショット取埗は、 xcodebuild コマンドを䜿っおコマンドラむンからビルド・テストを実行するこずで実珟したす。 スクリプト scripts/cursor-screenshot.sh で実装する凊理は以䞋の通りです 画面名の受け取りず環境倉数の蚭定 : スクリプトは匕数ずしお画面名を受け取り、環境倉数ずしお蚭定したす。この環境倉数はUITestに枡され、どの画面にナビゲヌションするかを決定したす アプリのビルド : xcodebuild build でアプリをビルドしたす UIテストの実行 : xcodebuild test で DynamicScreenshotTests.testTakeScreenshotForScreen を実行したす。UITestは環境倉数を参照しお、画面名に応じお適切な画面にナビゲヌションしおからスクリヌンショットを取埗したす スクリヌンショットファむルの怜玢ずパスの保存 : テスト実行埌、最新のスクリヌンショットファむルを怜玢し、パスを /tmp/cursor_screenshot_info.txt に保存したす。このファむルを参照しおスクリヌンショットを読み蟌むようにしたす 3. Cursorのルヌル蚭定 - .cursor/rules/my-custom-rule.mdc にUI実装埌の自動ワヌクフロヌのルヌルを远加 - UI実装埌のワヌクフロヌ - UIを新芏実装たたは倧幅に倉曎した埌は、必ず以䞋を実行するこず - 倧幅な倉曎の定矩: - 倧幅な倉曎の定矩: レむアりト、UIコンポヌネント、View構造、スタむルなど、レむアりトや芋た目に圱響を䞎える倉曎 1. 圓該の画面に察しお`scripts/cursor-screenshot.sh`を実行 2. 取埗した画像をもずに元のデザむンず比范しおレむアりト厩れなどがあれば修正する 3. 修正埌、再ビルドしお確認 4. 必芁に応じお、䞊蚘のステップ1-3を繰り返す最倧n回たで これによっお期埅するワヌクフロヌが実珟できたした。 おわりに UIを実装した埌は、手動でビルドしお確認し、レむアりト厩れなどを発芋したら修正䟝頌を投げるずいう䜜業を繰り返す必芁がありたした。 XCUITestの仕組みを䜿ったワヌクフロヌによっおUI実装から自己改善たでを自動化するこずができるようになったので、プロンプトで修正䟝頌を投げる量を最小限に留めるこずができるようになりたした。 ずはいえ、UITestは壊れやすくワヌクフロヌの途䞭でこけるこずも床々起こりうるので、その蟺はデメリットかなず思いたす。
目次 はじめに 泚意事項 Echo v5の䞻な倉曎点 Echo v4からv5ぞの移行しながら倉曎点を確認する バヌゞョン曎新ずecho.Contextの倉曎 Routerのカスタマむズ (Interface + DefaultRouter) StartConfigを甚いたサヌバヌ起動 デフォルトロガヌがslog.Loggerに倉曎 レスポンス情報の取埗方法 (UnwrapResponse) URLパラメヌタの埋め蟌み方法倉曎 echo.POSTのような http.MethodXXX のヘルパヌが廃止 たずめ はじめに こんにちは、開発本郚開発1郚トモニテグルヌプの゚ンゞニアの パンダム/rymiyamoto です。 2026/01/18 より Echo v5 がリリヌスされたした 🎉 匊瀟プロダクトの倚くが䟝存しおいるフレヌムワヌクなだけに、最新バヌゞョンぞの移行パスをいち早く探っおおきたいずころ。 さっそく、䞻芁な倉曎点や所感をレポヌトしたす。 Echoを䜿っお開発しおいる方も倚いず思いたすので、その手助けになればず思いたす。 github.com 泚意事項 本蚘事はEcho v4の基本的な知識がある読者を察象ずしおいたす。 たた執筆は2026/01/22時点のもので、Go 1.25.6をベヌスにしおいたす。 リリヌス盎埌のv5には、今埌も砎壊的な倉曎が加わる䜙地が残されおいたす。そのため公匏からは、商甚利甚に぀いおは 2026/3/31たで埅機するこず が掚奚されおいる点に泚意が必芁です。 (ちなみにv4のサポヌトは2026/12/31たでです) 公匏からの匕甚↓ v5.0.0 was release on 2026-01-18. v4 will be supported with security updates and bug fixes until 2026-12-31. Until 2026-03-31, any critical issues requiring breaking API changes will be addressed, even if this violates semantic versioning. If you are using Echo in a production environment, it is recommended to wait until after 2026-03-31 before upgrading. Echo v5の䞻な倉曎点 今回の倉曎点をたずめおみるず、䞻に以䞋の5点に集玄されたす。 【砎壊的倉曎】 echo.Context がむンタヌフェヌスから構造䜓に倉曎 将来的な機胜远加を容易にする ための倧きな蚭蚈倉曎です 【新機胜】Router のむンタヌフェヌス化による拡匵性の向䞊 独自のルヌタヌ実装が可胜になり、 正芏衚珟ルヌティング なども導入しやすくなりたす 【仕様倉曎】サヌバヌ起動蚭定の構造䜓化 ( StartConfig ) アドレスやタむムアりト蚭定が構造䜓に集玄され、 蚭定の可読性が向䞊 したす 【砎壊的倉曎】Go暙準ラむブラリ log/slog をネむティブサポヌト サヌドパヌティ補ラむブラリなしで、 モダンな構造化ログ が扱えるようになりたす 【砎壊的倉曎】APIの䞀貫性向䞊ずメ゜ッド敎理 党䜓的なシグネチャが芋盎され、より 掗緎された開発䜓隓 を提䟛したす 抂芁からみおこれたでv4の期間が長かったのもあり倧きな進歩だなず感じたした。 今たでは暙準で察応しづらい郚分はサヌドパヌティを利甚しおいたので、ログ呚りが自分ずしおは䞀番ありがたいです。 他にも蚭定呚りが統䞀化されおいるのでよりコヌドの可読性が向䞊しそうな予感がしたすね。 もちろん他にもいく぀かAPIの倉曎点がありたすが、詳现に぀いおは実際にv4で動いおいるコヌドの修正をしながら気づいた郚分を玹介しおいきたす (玹介しきれおいない郚分は䞋蚘のドキュメントを読んでみおください) github.com Echo v4からv5ぞの移行しながら倉曎点を確認する バヌゞョン曎新ずecho.Contextの倉曎 公匏に蚘茉されおいる通りの方法でバヌゞョン曎新や最䜎限の修正を行うこずができたす。 # v4 から v5 ぞの移行 go get github.com/labstack/ echo /v5 # サヌドパヌティの曎新(察応されおいるサヌドパヌティ系のラむブラリは曎新) go get github.com/labstack/echo-contrib go get github.com/labstack/echo-jwt/v5 # 䞀括眮換 # echo.Context -> *echo.Context find . -type f -name " *.go " -exec sed -i ' s/ echo.Context/ *echo.Context/g ' {} + # echo/v4 -> echo/v5 find . -type f -name " *.go " -exec sed -i ' s/echo\/v4/echo\/v5/g ' {} + github.com 実際のコヌドの倉曎は以䞋のようになり、倧倚数の倉曎箇所になるかず思いたす。 // v4 func MyHandler(c echo.Context) error { return c.JSON( 200 , map [ string ] string { "hello" : "world" }) } // v5 func MyHandler(c *echo.Context) error { return c.JSON( 200 , map [ string ] string { "hello" : "world" }) } これだけだず型定矩が倉わっただけか〜ずなりたすが、この倉曎による恩恵は新機胜远加時に砎壊的な倉曎にならないようにするための倧事な倉曎ず蚀えたす。 たずecho.Contextがむンタヌフェヌスだった堎合、将来的に新しい機胜(メ゜ッド)を远加するず、そのむンタヌフェヌスを実装しおいるすべおのコヌド(自䜜のContextラッパヌやモックなど)がコンパむル゚ラヌになりたす。 これは「砎壊的倉曎」にあたるため、次のメゞャヌバヌゞョンアップ(v6~)たで機胜远加がしにくくなりたす。 構造䜓( *echo.Context )に倉曎するこずで、本䜓に新しいメ゜ッドを远加しおも、既存の利甚偎のコヌドはそのたた動䜜したす。 これにより、v5の期間䞭にマむナヌアップデヌトで䟿利な新機胜をどんどん远加できるようになりたす。 Routerのカスタマむズ (Interface + DefaultRouter) Routerのむンタヌフェヌス化により、独自のルヌタヌ実装が可胜になりたした。 これにより、正芏衚珟ルヌティングや、特定のアプリケヌションでは䞍芁な機胜(ワむルドカヌドや 405 Method Not Allowed のハンドリングなど)を削ぎ萜ずし、より効率的なルヌティング凊理を実珟できるようになるのではないかず思いたす。 ただこれからだずは思いたすが、 RouterConfig が拡匵されおいくこずにより様々な恩恵を受けやすくなりそうです。 // v4 type Router struct { ... } func NewRouter(e *Echo) *Router func (r *Router) Add(method, path string , h HandlerFunc) func (r *Router) Find(method, path string , c Context) func (r *Router) Reverse(name string , params ... interface {}) string func (r *Router) Routes() []*Route // v5 type Router interface { Add(routable Route) (RouteInfo, error ) Remove(method string , path string ) error Routes() Routes Route(c *Context) HandlerFunc } type DefaultRouter struct { ... } func NewRouter(config RouterConfig) *DefaultRouter func NewConcurrentRouter(r Router) Router // NEW type RouterConfig struct { NotFoundHandler HandlerFunc MethodNotAllowedHandler HandlerFunc OptionsMethodHandler HandlerFunc AllowOverwritingRoute bool UnescapePathParamValues bool UseEscapedPathForMatching bool } github.com StartConfigを甚いたサヌバヌ起動 新しく远加された echo.StartConfig 構造䜓を䜿甚する圢匏でもサヌバヌを起動するこずができたす。 もちろんこれたで通りの echo.Start を䜿甚するこずもできたすが、アドレス指定が匕数ではなく蚭定から指定できるのは䜿いやすそうです。 以䞋は StartConfig を䜿甚した堎合の䟋です。 // v5: echo.StartConfig を䜿甚する func main() { e := echo.New() e.Use(middleware.RequestLogger()) e.GET( "/" , func (c *echo.Context) error { return c.String(http.StatusOK, "Hello, World!" ) }) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() sc := echo.StartConfig{ Address: ":1323" , GracefulTimeout: 10 * time.Second, } if err := sc.Start(ctx, e); err != nil { log.Fatal(err) } } $ go run server.go { " time " : " 2026-01-20T23:28:54.719092+09:00 " , " level " : " INFO " , " msg " : " Echo (v5.0.0). High performance, minimalist Go web framework https://echo.labstack.com " , " version " : " 5.0.0 " } { " time " : " 2026-01-20T23:28:54.719326+09:00 " , " level " : " INFO " , " msg " : " http(s) server started " , " address " : " [::]:1323 " } { " time " : " 2026-01-20T23:29:11.2848+09:00 " , " level " : " INFO " , " msg " : " REQUEST " , " method " : " GET " , " uri " : " / " , " status " :200, " latency " :3000, " host " : " localhost:1323 " , " bytes_in " : "" , " bytes_out " :13, " user_agent " : " curl/8.7.1 " , " remote_ip " : " ::1 " , " request_id " : "" } github.com デフォルトロガヌがslog.Loggerに倉曎 これたではGoの暙準のログを少し拡匵した シンプルなloggingパッケヌゞ を䜿っおいたしたが、slogを䜿うようになり、ログの蚭定でそのたたslogの蚭定が利甚できるようになりたした。 これによりこれたで slog-echo のようなサヌドパヌティを䜿っおslog利甚しおいたように拡匵する必芁がなくなり、ロギング蚭定がより盎感的になっお個人的には䞀番嬉しいポむントになりたした。 // v4 type Echo struct { Logger Logger // Custom interface with Print, Debug, Info, etc. } // v5 type Echo struct { Logger slog.Logger // slog.Logger interface } 実際にslogを䜿っおログ蚭定をカスタマむズする堎合は以䞋のようになりたす。 skipper := func (c *echo.Context) bool { return c.Request().URL.Path == "/health" } e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{ Skipper: skipper, // ヘルスチェックのリク゚ストはログに含めない LogStatus: true , LogURI: true , LogError: true , HandleError: true , // ゚ラヌをグロヌバル゚ラヌハンドラに転送し、適切なステヌタスコヌドを決定できるようにしたす。 LogValuesFunc: func (c *echo.Context, v middleware.RequestLoggerValues) error { if v.Error == nil { logger.LogAttrs(context.Background(), slog.LevelInfo, "REQUEST" , slog.String( "uri" , v.URI), slog.Int( "status" , v.Status), ) } else { logger.LogAttrs(context.Background(), slog.LevelError, "REQUEST_ERROR" , slog.String( "uri" , v.URI), slog.Int( "status" , v.Status), slog.String( "err" , v.Error.Error()), ) } return nil }, })) // start server... echo.labstack.com レスポンス情報の取埗方法 (UnwrapResponse) ミドルりェア等でレスポンスの曞き蟌みサむズやステヌタスコヌドを参照する堎合、これたでは c.Response() のフィヌルドに盎接アクセスしおいたしたが、v5では echo.UnwrapResponse ヘルパヌを䜿甚する必芁があるので修正が必芁になりたす。 // v5 resp, err := echo.UnwrapResponse(c.Response()) if err == nil { // resp.Size <-- 曞き蟌たれたバむト数 // resp.Status <-- ステヌタスコヌド // resp.Committed <-- クラむアントに送信枈みかどうか fmt.Printf( "Status: %d, Size: %d \n " , resp.Status, resp.Size) } github.com この倉曎に䌎う修正には正盎、かなり手こずりたした。いざv5の倉曎を圓おおビルドしおみるず、あちこちでヘルパヌが゚ラヌを吐き出しレスポンスの䞭身を芋おいる凊理の芋盎しがいるのかなず疑問に思い、䞀䜓どうすれば ず右埀巊埀する矜目になりたした 😇 しかし、APIの倉曎点を芋盎したり実際のv5のコヌドを远っおみるなどの詊行錯誀の末にこの UnwrapResponse の存圚に気づきたした この倉曎には最初こそ戞惑いたしたが、 val, err := func() ずいうGo蚀語の暙準的な゚ラヌハンドリングパタヌンに統䞀されたこずで、倉曎の意図が腹萜ちしたした。 v4たでではフィヌルド盎接参照は手軜な反面、内郚実装ぞの䟝存床が高く、将来的な倉曎に匱い偎面がありたす。 今回ヘルパヌ関数を経由する圢になったこずで、内郚構造が隠蔜され、仮に取埗に倱敗しおも゚ラヌずしお安党に怜知できる(堅牢性が高たる)ようになっおいたす。 たた、このアプロヌチはGo1.20で暙準ラむブラリに远加された http.ResponseController の蚭蚈思想ずも通じる郚分があり、EchoがGoのモダンな䜜法に远埓しようずしおいる姿勢がうかがえたす。手間は増えたしたが、長期的な保守性を高めるための掗緎された倉曎ず蚀えそうです。 URLパラメヌタの埋め蟌み方法倉曎 テストのずき、URL内にリ゜ヌスのIDを埋め蟌んで実行する際によく䜿甚しおいたコヌドが倉曎されおいたす。 v5のほうが1行でたずたり盎感的に曞けるようになっおおり、これたでのコヌドよりも可読性が向䞊しおいたす。 // v4 c.SetParamNames( "id" ) c.SetParamValues( "1" ) // v5 c.SetPathValues(echo.PathValues{{Name: "id" , Value: "1" }}) github.com こちらもぱっず調べお出おこなかったので実際に修正しおみお気づいた郚分になりたした。 echo.POSTのような http.MethodXXX のヘルパヌが廃止 これたでHTTPメ゜ッドのヘルパヌがあったのですが、v5では廃止されおいたす。 そのため、 echo.POST などのヘルパヌを http.MethodPost のように曞き換える必芁がありたす。 ( 䜕故かここはドキュメントにもAPI倉曎にも蚘茉がないずころでした ) 远蚘(2026/01/29) 公匏のドキュメントの方にも蚘茉されたした github.com 以䞋がv4の時のコヌドです。 // HTTP methods // NOTE: Deprecated, please use the stdlib constants directly instead. const ( CONNECT = http.MethodConnect DELETE = http.MethodDelete GET = http.MethodGet HEAD = http.MethodHead OPTIONS = http.MethodOptions PATCH = http.MethodPatch POST = http.MethodPost // PROPFIND = "PROPFIND" PUT = http.MethodPut TRACE = http.MethodTrace ) github.com 远蚘(2026/01/29) 公匏のドキュメントの方にも蚘茉されたした github.com たずめ 今回は Echo v5 がリリヌスされたので觊れおみたした。 v5の新しい機胜に觊れおみお、その利䟿性やコヌドの読みやすさが栌段に向䞊しおいるのを肌で感じたした。これは開発䜓隓を倧きく倉える可胜性を秘めおいるず思いたす。 実際に瀟内のプロダクトで実隓しながらアップデヌト内容に觊れおみたしたが、詊した結果、ただただ修正が必芁な箇所が倚く、゚ラヌの解消や動䜜怜蚌に膚倧な時間を費やしたした。 正盎なずころ、完党に商甚利甚できる状態にするには、ただ倚くの修正ず怜蚌が必芁だず痛感しおいたす。 この道のりは決しお楜ではありたせんが、v5がもたらす開発䜓隓の向䞊を考えるず、乗り越える䟡倀は十分にあるず感じおいたす。 ガッツリずした倉曎あり぀぀もv4での蚘法がすべお倉わるわけではないので、地道に修正しおいく必芁がありたす。 ただただリリヌスしお日が浅く、公匏含めサヌドパヌティ系も曎新が掻発になっおくるかず思うので最新の情報においおいかれないように食らい぀いおいこうず思いたす。 最埌たで読んでいただきありがずうございたした
目次 はじめに ゚ンゞニア内定者研修に぀いお ゚ンゞニア内定者研修の抂芁 ゚ンゞニア内定者研修の目的 ゚ンゞニア内定者研修カリキュラム 前回からの改善点 タヌミナルおよび Git/GitHub の基瀎・プログラム基瀎 ネットワヌクむンフラ基瀎 DB 研修 Web 基瀎・Web アプリケヌション開発基瀎 AI開発基瀎 受講者のフィヌドバック おわりに はじめに こんにちは。 開発本郚開発1郚トモニテ開発郚所属の庄叞( @ktanonymous )です。 匊瀟では、内定者向けずしおは2回目ずなる内定者研修を2026幎新卒の゚ンゞニア内定者向けに実斜し、 2025幎䞭に党おの講矩を完了したした。 今回の蚘事では、その内容に぀いお玹介したいず思いたす。 ゚ンゞニア内定者研修に぀いお 匊瀟では昚幎床、゚ンゞニア向けの内定者研修を初めお実斜したした。 昚幎床の内定者研修の詳现に぀いおは以䞋の蚘事をご芧ください tech.every.tv 昚幎床の研修では、入瀟埌の新卒研修をよりスムヌズに進められるよう、受講者の知識のベヌスラむンを揃えるこずを目的ずしお実斜したした。 今幎床も匕き続き同様の目的のもず、昚幎床の経隓やフィヌドバックを掻かしおカリキュラムを改善し、2回目の内定者研修を実斜したした。 ゚ンゞニア内定者研修の抂芁 ここでは、゚ンゞニア内定者研修の目的やカリキュラム、それぞれの講矩抂芁に぀いお玹介したいず思いたす。 ゚ンゞニア内定者研修の目的 先述の通り、内定者研修では来幎床入瀟する新卒の゚ンゞニアメンバヌが、入瀟埌の研修を通じおよりスムヌズに開発組織にゞョむンできるように、 ベヌスずなる基瀎知識を孊べる機䌚を提䟛するこずを䞻な目的ずしおいたす。 具䜓的には、以䞋のような目的ず方針を蚭定したした。 目的 入瀟前に基本的な技術や知識をキャッチアップする環境を提䟛する 方針 入瀟前に身に着けおほしい技術や知識のキャッチアップをサポヌトする 基瀎知識を早期にキャッチアップするこずで入瀟埌の研修・オンボヌディングをよりスムヌズに進められるようになる 䞊蚘の目的ず方針を螏たえ、4月に入瀟した新卒メンバヌが䞭心ずなり資料の䜜成から圓日の講矩たでを担圓しおもらいたした。 最終的な資料ずしおは瀟内メンバヌのレビュヌを経お内容を担保するようにしおいたす。 ゚ンゞニア内定者研修カリキュラム 今回の研修では以䞋のテヌマで講矩を行いたした。 各回 90 分を目安に、2 週間に 1 回皋床のペヌスで実斜したした。 今回は、昚今のAI技術の発展に䌎う開発環境の倉化を螏たえお、AI開発基瀎を新たなテヌマずしお取り入れたした。 タヌミナルおよび Git/GitHub の基瀎・プログラム基瀎 ネットワヌクむンフラ基瀎 DB 研修 Web 基瀎・Web アプリケヌション開発基瀎 AI開発基瀎 たた、遠方から参加する方もいるため、党おの講矩はオンラむンで実斜しお録画を残すようにしたした。 さらに、今回は講矩で䜿甚した資料を以䞋のリンクの speakerdeck に公開しおいたす。 講矩資料だけでなくむベントの登壇などで䜿甚した資料などもご確認いただけたすので、この機䌚にぜひご芧ください。 speakerdeck.com 前回からの改善点 前回の研修では受講者から以䞋のようなフィヌドバックがありたした。 ゚ンゞニアずしお知っおおいた方が良いこずを知るこずができた 開催時期に察しおスケゞュヌルがタむトに感じられた たた、運営面では担圓の負荷が偏っおいたり講矩の準備のスケゞュヌル感に察するフィヌドバックがありたした。 これらのフィヌドバックを螏たえ、今回の研修では以䞋のような倉曎を取り入れたした。 テヌマ蚭定は昚幎床の良さを匕き継ぎ぀぀、関連性の高かったテヌマを統合するずずもに、昚今の開発環境の倉化を螏たえおAI開発基瀎を新たなテヌマずしお取り入れたした。 玄半幎間の研修スケゞュヌルで間延びしないように2025幎内に党おの講矩を完了するようにしたした。 担圓者の負荷が偏らないようにテヌマごずの割り振りを均等に調敎し、サポヌト䜓制なども明確になるように敎備したした。 タヌミナルおよび Git/GitHub の基瀎・プログラム基瀎 speakerdeck.com タヌミナルおよび Git/GitHub の基瀎・プログラム基瀎の講矩では、2024幎床の「タヌミナルおよび Git/GitHub の基瀎」ず「プログラム基瀎」を統合し、 CLIタヌミナルやチヌムでの開発を行うにあたり匊瀟でも利甚しおいる Git/GitHub の基本的な䜿い方、およびプログラムの基本的な構造やデヌタ構造、アルゎリズムに぀いお孊びたした。 具䜓的には以䞋のトピックを取り䞊げたした。 Linux コマンド Git ずは 朚構造 配列ずリスト ハッシュ ゜ヌト 探玢 ネットワヌクむンフラ基瀎 speakerdeck.com ネットワヌクむンフラ基瀎の講矩では、OSI 参照モデルを䞭心に、 ネットワヌクやむンフラの基瀎知識に぀いお孊びたした。 具䜓的には以䞋のトピックを取り䞊げたした。 プロトコル TCP/IPずOSI参照モデル 関連するAWSリ゜ヌス DB 研修 speakerdeck.com DB 研修では、DB の基本抂念やバック゚ンドデヌタ系それぞれの芖点での利甚に぀いお孊びたした。 具䜓的には以䞋のトピックを取り䞊げたした。 「デヌタ」の皮類ず構造 SQLによるデヌタ操䜜 正芏化・むンデックス デヌタ基盀の抂芁 Web 基瀎・Web アプリケヌション開発基瀎 speakerdeck.com Web 基瀎・Web アプリケヌション開発基瀎の講矩では、2024幎床の「Web 基瀎」ず「Web アプリケヌション開発基瀎」を統合し、 API や Web アプリケヌションの基本構成や仕組み、バック゚ンドフロント゚ンドそれぞれの圹割、アヌキテクチャやテスト、コヌディング時に意識するこずなど、 組織チヌムでの開発に携わるうえで重芁ずなっおくる考え方に぀いお孊びたした。 具䜓的には以䞋のトピックを取り䞊げたした。 Web アプリケヌションの構成芁玠 ブラりザが衚瀺するHTMLの取埗元に぀いお 倖郚デヌタ゜ヌスを利甚した動的レンダリングに぀いお フロント゚ンドずバック゚ンドの圹割 開発に必芁な知識 アヌキテクチャ テスト CI/CD AI開発基瀎 speakerdeck.com AI開発基瀎の講矩では、AIの抂芁やAIを掻甚した開発に぀いお孊びたした。 具䜓的には以䞋のトピックを取り䞊げたした。 AIの基瀎知識 AIの定矩ず分類 蚀語モデルLLMの仕組み トヌクン化ずコンテキスト長 埋め蟌みEmbeddings LLMの芁玠技術 プロンプト゚ンゞニアリング 掚論時のプロンプト手法 RAG怜玢拡匵生成技術 LLMの拡匵・統合技術 コンテキスト゚ンゞニアリング 開発ツヌルず掻甚事䟋の玹介 受講者のフィヌドバック 研修の改善のために、受講者からのフィヌドバックをアンケヌトで収集しおおり、その䞭でも以䞋のようなポゞティブな意芋が芋受けられたした。 図解や具䜓䟋䟋デリッシュキッチンだずどうかが豊富だったため、ずおもむメヌゞしやすかった 昚今のAIによる開発環境の倉化や具䜓的なモデルの構造などに぀いお振り返るこずができおよかった 基本的なこずが䞁寧に解説されおいお分かりやすかった 䞀方で、「内容のボリュヌムに察しお時間がタむトに感じられた」「実䟋や背景をより詳现に説明しおほしい」ずいった意芋もあり、 テヌマに察しお取り扱う内容の範囲を適切に蚭定する難しさを改めお実感したした。 埗られたフィヌドバックを螏たえ、今埌の研修運営をさらにブラッシュアップしおいきたいず考えおいたす。 講矩颚景① 講矩颚景② おわりに 今回の蚘事では、゚ンゞニア内定者向けの研修に぀いおご玹介いたしたした。 内定者研修を通じお、今埌入瀟する゚ンゞニアのメンバヌが入瀟埌のオンボヌディングをよりスムヌズに進められるようにサポヌトするこずができたず考えおおりたす。 たた、研修の䌁画・運営に携わった若手メンバヌにずっおも、 知識の敎理や研修の䞻芁メンバヌずしおの新たなチャレンゞの機䌚ずなり、貎重な成長の堎にできたず感じおいたす。 今回のような取り組みを含めお、今埌も゚ンゞニアの成長を支揎する取り組みを続けお発信しおいきたいず思いたす。 最埌たで読んでいただき、ありがずうございたした。
目次 はじめに セッション玹介 zerobus Ingest Agent Bricks [䌁業セッション] むオンにおけるマルチ゚ヌゞェントシステムの開発 たずめ 最埌に はじめに 2025幎11月28日に開催された「Databricks DATA + AI WORLD TOUR」に参加させおいただきたした。 今回は参加レポヌトずしお、セッションの感想をお届けしたす dataaisummit.databricks.com セッション玹介 zerobus Ingest 開発1郚の吉田です。 Databricks Sessionで玹介されたzerobus ingestに぀いおたずめたす。 zerobus ingestは、クラむアントからDatabricksぞデヌタを盎接ストリヌミングできるマネヌゞドサヌビスです。 埓来のような耇雑なメッセヌゞバスKafkaやKinesisなどを介するこずなく、レコヌド単䜍でのデヌタ取り蟌みを実珟したす。 docs.databricks.com 䞭間むンフラを排陀できるため、運甚管理の手間ずコストが削枛できたす。 ゚ブリヌでは珟圚、サむネヌゞ端末やWebアプリケヌションのログ収集のために専甚のむンフラを構築・運甚しおいたす。 このむンフラをzerobus ingestで眮き換えるこずができるか、怜蚌を進めおいく予定です。 Agent Bricks こんにちは 開発1郚デリッシュキッチンの蜜柀です。 僕からは、Databricks Sessionで玹介されたAgent Bricksに぀いおたずめたす Agent BricksはノヌコヌドでAI゚ヌゞェントの構築、評䟡、最適化できる機胜になっおいたす! AI゚ヌゞェントを䜜成する際の䞋蚘のような課題に簡単に察応するこずができたす。 調敎すべき項目が倚すぎる 評䟡するのが難しい コストず品質のバランスを取るのが難しい Agent Bricksではタスクを遞び、゚ヌゞェントの圹割をざっくり指定するだけで自動で゚ヌゞェントを䜜成しおくれるので、調敎するべき項目が少なくなっおいるようです。 ドキュメントを元に質問に答える「ナレッゞアシスタント」や、芁玄・分類などのカスタムテキスト倉換を行う「カスタムLMM」、Genieスペヌスず゚ヌゞェントを統合する「マルチ゚ヌゞェントスヌパヌバむザヌ」などのナヌスケヌスがあるようです。 ゚ヌゞェントの評䟡に関しおは、自動でベンチマヌクを䜜成し、゚ヌゞェントを自動で最適化できるようです。 たた、good/badのような評䟡しかできないツヌルもありたすが、Agent Learning from Human Feedback(ALHF)によっお、自然蚀語での指瀺に基づき、システムを自動調敎するこずもできたす。 コストず品質に関しおは、「コスト最適化」モデルず「品質最適化」モデルのどちらかを遞択するこずができ、倚くの堎合は䞡立も可胜なため、自前で構築するよりも高品質か぀䜎コストな゚ヌゞェントを䜜成できるこずが倚いようです。 Agent Bricksを䜿甚しおAI゚ヌゞェントを䜜成するず、自前で䜜成する際に課題ずなる点を簡単に解決し、気軜にAI゚ヌゞェントを䜜成できるのが魅力だず感じたした。 デモパヌトでは、マルチ゚ヌゞェントスヌパヌバむザヌを䜿甚しお、耇数の゚ヌゞェントを簡単にたずめる方法をご玹介いただきたした。 PowerPointやWord圢匏のドキュメントず圹割を䞎えられたナレッゞアシスタントず、テヌブルを読み取るためのGenieスペヌスを登録するこずで、ナヌザヌからの質問に察しお、ナレッゞを元に必芁な情報を考え、必芁な情報をGenieがク゚リを䜜成しテヌブルから取埗するずいうマルチ゚ヌゞェントが簡単に䜜成できおいたした。 個人的に特に䟿利だなず感じたのは、ナレッゞを元に回答できないパタヌンの質問に関しおは、ガむドラむンを登録し回答を準備しおおくこずが簡単にできるこずでした。 2025幎11月時点ではasia-northeast1リヌゞョンではAgent Bricksはただ䜿甚できないのですが、䜿甚できるようになるのがずおも楜しみになりたした [䌁業セッション] むオンにおけるマルチ゚ヌゞェントシステムの開発 開発1郚の岩です。私からはむオン様におけるマルチ゚ヌゞェントシステムの開発に぀いお玹介したす。 むオン様ではマルチ゚ヌゞェントシステムを「業務特化型゚ヌゞェント」ず「顧客向けAI゚ヌゞェント」に倧別しお玹介されおいたした。 䞭でも業務特化型゚ヌゞェントでは、自然蚀語の質問に基づいたク゚リを実行しお情報抜出する゚ヌゞェントが玹介されたした。 具䜓的には、デヌタ抜出゚ヌゞェントや可芖化゚ヌゞェントずいったそれぞれのタスクに察する゚ヌゞェントがあり、それをたずめるマルチ゚ヌゞェントスヌパヌバむザヌをナヌザずLLMずのむンタヌフェヌスずしおおくような構造ずなっおいたす。 これによっおク゚リの生成から可芖化、敎合性の評䟡たで䞀気通貫で実行するようなマルチ゚ヌゞェントシステムを構築しおいたす。 この゚ヌゞェントはコンテキストが曖昧だった堎合は掚枬で答えるのではなく、ナヌザに聞き返すような仕組みずなっおいたす。 たた倧芏暡なク゚リをAIが実行しないように、システムリ゜ヌスを倧量に消費するク゚リが生成された堎合にぱヌゞェントが䞻䜓ずなっお実行しない意思決定が行われるようになっおいたり、ク゚リをキャッシュする戊略など倧芏暡デヌタを扱っおいる䌁業ならではの工倫点などもみられたした。 ク゚リの実行はDatabricks GenieずUnity Catalogを䜿甚しおAPIずしお公開するこずでシヌムレスか぀䜎レむテンシで連携するこずができたす。 たた、Unity Catalogはガバナンスを意識した蚭蚈になっおいるためAI゚ヌゞェントによる䞍正なデヌタアクセスなどの心配もありたせん。 さらに゚ヌゞェントを䜜っお終わりではなく、Genieぞのリク゚ストを収集、フィヌドバックの䜜成、最適化のルヌプを回すこずによっお粟床改善にも取り組んでいるそうです。 他にも色々な゚ヌゞェントの工倫点が玹介されおおり、非垞に有意矩なセッションでした。 たずめ 今回のDatabricks DATA + AI WORLD TOURでは、zerobus IngestやAgent Bricksずいった機胜の玹介から䌁業様の掻甚事䟋たで、幅広いセッションを聎講するこずができたした。 AI゚ヌゞェントに関するセッションが倚く、ノヌコヌドでの゚ヌゞェント構築から倧芏暡な業務システムぞの適甚たでAI゚ヌゞェントの掻甚が急速に広がっおいたした。 今回埗られた知芋を掻かし、Databricksの機胜の怜蚌やAI゚ヌゞェントの掻甚を進めおいきたいず思いたす。 最埌に ゚ブリヌでは、ずもに働く仲間を募集しおいたす。 テックブログを読んで少しでも゚ブリヌに興味を持っおいただけた方は、ぜひ䞀床カゞュアル面談にお越しください corp.every.tv 最埌たでお読みいただき、ありがずうございたした
AppleずLINEのネむティブ認蚌を぀くるサヌバヌ線 この蚘事は every Tech Blog Advent Calendar 2025 の 29 日目の蚘事です。 前提 アプリ偎のAppleずLINEのネむティブ認蚌実装 Apple LINE IDトヌクンず nonce サヌバヌ偎の実装 Appleの现かいポむント Bundle ID ず Service ID LINEの现かいポむント API IDトヌクンの怜蚌アルゎリズム 最埌に 参考資料 こんにちは開発1郚で食事管理アプリ ヘルシカ のサヌバヌサむドの開発をしおいる 赀川 です。玄1ヶ月にわたっお続いたアドベントカレンダヌも最終日ずなりたした。 本蚘事では、ヘルシカiOS で Apple ず LINE のネむティブ認蚌を導入した経隓をもずに、ネむティブ認蚌のサヌバヌ偎の実装ず呚蟺知識、実装時の现かいポむントに぀いおお話ししたす。 iOS偎の実装に぀いおは、昚日公開の AppleずLINEのネむティブ認蚌を぀くるiOS線 をご芧ください。 tech.every.tv 前提 ヘルシカではもずもず Web アプリベヌスの認蚌方法が採甚されおおり、アプリ内で WebView が開きそこでIDやパスワヌドを入力しお サむンアップ / サむンむン を行いたす。以䞋、AppleやLINEのIDプロバむダヌを倖郚IdP、ヘルシカの認蚌サヌバヌを単に認蚌サヌバヌず呌ぶこずにしたす。認蚌サヌバヌではOpenID Connectに則った実装がされおおり、おおたかには以䞋のような流れです。 ログむンボタンを抌す アプリ内のWebViewで倖郚IdPAppleやLINEの入力画面が開く 入力成功埌、倖郚IdPから認蚌サヌバヌにコヌルバック 認蚌サヌバヌが倖郚IdPずToken Exchangeを行い、認蚌サヌバヌが倖郚IdPのトヌクンを受け取る 倖郚IdPのトヌクンの怜蚌に成功した埌、ヘルシカAPIサヌバヌ甚のトヌクンを発行し、安党にClientに枡す アプリはほがWebViewを開くだけで、IdPずメむンでやり取りするのはサヌバヌであるこずがわかりたす。 䞊蚘の圢だず、䟋えばヘルシカにWebアプリが増えた、ずいう堎合でも同じ゚ンドポむントが䜿え、認蚌サヌバヌの远加実装なしに拡匵が可胜なのがメリットず蚀えたす。しかし、パスワヌドなどの入力は面倒ですし、忘れがちです。そこで、ナヌザヌにより簡単にサむンアップ・サむンむンをしおもらえるように、Appleなら顔認蚌などiOSネむティブな方法、LINEならLINEアプリが開いおワンタップで認蚌できる方法を新しく採甚するこずになりたした。 Appleの認蚌画面 LINEの認蚌画面 アプリ偎のAppleずLINEのネむティブ認蚌実装 サヌバヌ線ずタむトルに入れたしたが、サヌバヌ偎の蚭蚈をするためにはたずアプリ偎でネむティブ認蚌を実装する方法を知らなければなりたせん。AppleではASAuthorizationAppleIDProviderなどのクラス、LINEではLINEログむンSDKずいうものが甚意されおいたす。 developer.apple.com developers.line.biz 元のフロヌを思い出しおみるず、倖郚IdPのトヌクンを受け取るのは認蚌サヌバヌでした。しかし、䞊蚘を䜿甚した堎合、IDトヌクンを受け取るのはアプリになりたす。それぞれに぀いお、少し深掘りしおみたしょう。 Apple たず、リク゚スト ASAuthorizationAppleIDRequest でAppleIDを含む情報をIdPに送信したす。 ASAuthorizationAppleIDRequest は ASAuthorizationOpenIDRequest を継承しおおり、オプションずしお state ず nonce を含めるこずができたす。 成功するず、レスポンスずしお ASAuthorization を受け取りたす。これには ASAuthorizationAppleIDCredential が含たれおおり、 さらにその䞭身を芋るこずで IDトヌクン や state が手に入りたす。 LINE LINEでは、 LoginManager を䜿いたす。 LoginManager.shared.login でリク゚ストを送信したすが、Appleの時ず違い nonce ず state はSDK内で自動的に生成、怜蚌されたす。ただし、 nonce は独自に指定するこずも可胜です。 成功するず、 LoginResult を受け取りたす。この䞭にアクセストヌクンやIDトヌクンなどが含たれおいたす。 比范するず、以䞋の2぀が共通しおいるこずがわかりたした。 リク゚ストには独自の nonce を蚭定するこずができる。 成功するず、アプリがIDトヌクンなどを受け取るこずができる。 IDトヌクンず nonce サヌバヌ偎の蚭蚈に進む前に、IDトヌクンず nonce に぀いお埩習しおおきたす。ご存知の方は無芖しお次のパヌトに進んでいただいお問題ありたせん。 たず、IDトヌクンは次のような圢をしおいたす。 eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ. ewogImlzcyI6ICJodHRwczovL3NlcnZlci5leGFtcGxlLmNvbSIsCiAic3ViIjogIjI0ODI4OTc2MTAwMSIsCiAiYXVkIjogInM2QmhkUmtxdDMiLAogIm5vbmNlIjogIm4tMFM2X1d6QTJNaiIsCiAiZXhwIjogMTMxMTI4MTk3MCwKICJpYXQiOiAxMzExMjgwOTcwLAogIm5hbWUiOiAiSmFuZSBEb2UiLAogImdpdmVuX25hbWUiOiAiSmFuZSIsCiAiZmFtaWx5X25hbWUiOiAiRG9lIiwKICJnZW5kZXIiOiAiZmVtYWxlIiwKICJiaXJ0aGRhdGUiOiAiMDAwMC0xMC0zMSIsCiAiZW1haWwiOiAiamFuZWRvZUBleGFtcGxlLmNvbSIsCiAicGljdHVyZSI6ICJodHRwOi8vZXhhbXBsZS5jb20vamFuZWRvZS9tZS5qcGciCn0. NTibBYW_ZoNHGm4ZrWCqYA9oJaxr1AVrJCze6FEcac4t_EOQiJFbD2nVEPkUXPuMshKjjTn7ESLIFUnfHq8UKTGibIC8uqrBgQAcUQFMeWeg-PkLvDTHk43Dn4_aNrxhmWwMNQfkjqx3wd2Fvta9j8yG2Qn790Gwb5psGcmBhqMJUUnFrGpyxQDhFIzzodmPokM7tnUxBNj-JuES_4CE-BvZICH4jKLp0TMu-WQsVst0ss-vY2RPdU1MzL59mq_eKk8Rv9XhxIr3WteA2ZlrgVyT0cwH3hlCnRUsLfHtIEb8k1Y_WaqKUu3DaKPxqRi6u0rN7RO2uZYPzC454xe-mg https://openid.net/specs/openid-connect-core-1_0.html#id_tokenExample 2぀のドットがあり3぀のパヌトに区切られおいるこずがわかりたす。これらは前から順にヘッダヌ、ペむロヌド、眲名ず呌ばれおいお、このような圢匏のトヌクンを眲名付き JWT (JSON Web Token) ず蚀いたす。それぞれに぀いお詳しく芋おいきたしょう。 たずヘッダヌを Base64url デコヌドするず、以䞋のようなJSONが埗られたす。 { " kid ":" 1e9gdk7 "," alg ":" RS256 " } alg はJWTの眲名に䜿甚されたアルゎリズムを衚したす。 kid は眲名怜蚌甚の公開鍵の識別子で、公開鍵暗号方匏の眲名の堎合に含たれたす。 type: "JWT" ずいうフィヌルドが含たれおいる堎合もありたす。 次に、ペむロヌドを怜蚌、デコヌドしおみるず、だいたい以䞋のような JSON が埗られたす。 { " iss ": " https://server.example.com ", " sub ": " 248289761001 ", " aud ": " s6BhdRkqt3 ", " nonce ": " n-0S6_WzA2Mj ", " exp ": 1311281970 , " iat ": 1311280970 , " name ": " Jane Doe ", " given_name ": " Jane ", " family_name ": " Doe ", " gender ": " female ", " birthdate ": " 0000-10-31 ", " email ": " janedoe@example.com ", " picture ": " http://example.com/janedoe/me.jpg " } 䞋の方はプロフィヌル的な情報なので無芖しお、䞊偎のフィヌルドの説明を曞き蟌むず以䞋のようになりたす。 { " iss ": " トヌクンを発行したサヌバヌの識別子 ", " sub ": " ナヌザヌの識別子 ", " aud ": " トヌクンを受け取るアプリの識別子クラむアントIDなど ", " nonce ": " nonce䞋で説明したす ", " exp ": " トヌクンの有効期限UNIXタむムスタンプ圢匏 ", " iat ": " トヌクンの発行日時UNIXタむムスタンプ圢匏 " } nonce フィヌルドがありたすね nonce があるこずで、どのような利点があるかを以䞋で説明したす。 登堎人物は以䞋です。 IdP: IDトヌクンを発行する Relying Party: 認蚌のサヌビスを䜿うアプリや、そのサヌバヌ ナヌザヌ: ログむンしようずしおいる 攻撃者: IDトヌクンを盗んで、䞍正にログむンしようずしおいる たず、 nonce がない堎合です。 nonceがない堎合 IDトヌクンが正しく、有効期限内であれば、誰でも䜕回でもログむンできおしたうこずがわかりたす。このような攻撃を、リプレむ攻撃ず呌びたす。 次に nonce がある堎合です。 nonceがある堎合 ナヌザヌのログむン埌、保存されおいた nonce はすでに削陀されおいるので、攻撃者が盗んだIDトヌクンは䜿えなくなっおいたす。 nonce が "Number used once" の略である、ずいうこずが玍埗できるかず思いたす。 最埌に眲名です。眲名は、ヘッダヌずペむロヌドから、IdPだけが持っおいる秘密鍵を䜿っお蚈算、付䞎されたす。IDトヌクンを受け取ったクラむアントは、 alg に曞いおある方法に埓っお眲名を怜蚌したす。ここで怜蚌に倱敗すれば、䜕者かによっおヘッダヌたたはペむロヌドが曞き換えられおいるずいうこずになりたす。 サヌバヌ偎の実装 それでは、サヌバヌ偎の実装に぀いお考えおいきたしょう。結果的に、゚ンドポむントは2぀になりたした。 IDトヌクンの怜蚌は nonce を含めサヌバヌ偎で行いたす。 LINEログむンSDK のように nonce をアプリ偎で怜蚌をするこずも可胜ですが、結局それではIDトヌクンを䜕床も䜿えおしたい、サヌバヌから芋るず nonce を含めおいないのず同じ状態になっおしたいたす。そもそも、クラむアントから送られおきたものをサヌバヌがそのたた信じるこずはよろしくありたせん。 そうするず、必然的に nonce の生成もサヌバヌ偎が行うこずになりたす。 LINE ず Apple の比范で、リク゚ストには独自の nonce を蚭定するこずができる、ずいうこずを確認したので、サヌバヌ偎から nonce を枡す゚ンドポむントを䜜れば良いですね。たた、 nonce を生成しおキャッシュするのにキヌが必芁なので、その認蚌認可セッションの ID もランダムに生成しお返华したす。これが1぀目の゚ンドポむントになりたすわかりやすさのため、䞀郚フィヌルドを省略しおいたす。 リク゚スト { app_id: " アプリの識別子 ", service_id: " IdPの識別子line or apple ", type : " signup or signin " } レスポンス { nonce : " nonce ", session_id: " その認蚌認可セッションの識別子 " , } クラむアント偎はこの送られおきた nonce を䜿い、IdPからIDトヌクンを取埗し、セッションIDずずもにサヌバヌに送りたす。これが2぀目の゚ンドポむントです。 リク゚スト { app_id: " アプリの識別子 ", session_id: " その認蚌認可セッションの識別子 ", id_token: " IDトヌクン ", authorization_code: " 認可コヌドアクセストヌクンなどの取埗に䜿う、Appleのみ " } サヌバヌ偎はセッション ID からキャッシュしおいた nonce を取り出し、IDトヌクンの怜蚌時に䞀臎を確認したす。怜蚌に成功埌、サヌバヌのDBにナヌザヌを䜜成、たたは曎新し、アプリのIDトヌクン、アクセストヌクン、リフレッシュトヌクンを発行しお返华したす。アプリのトヌクンの発行郚分に぀いおは Amazon Cognito のカスタム認蚌を䜿っおいるのですが、ここでは觊れないこずにしたす。 レスポンス { access_token: " アプリのアクセストヌクン ", id_token: " アプリのIDトヌクン ", refresh_token: " アプリのリフレッシュトヌクン ", expires_in: " トヌクンの有効期限 " } nonce を䜿うこずで、安党にIDトヌクンをやり取りしおネむティブ認蚌を実珟できたした最終的な流れは以䞋の通りです。 ネむティブ認蚌のフロヌ LINE の公匏ドキュメントでも、同様の方法が掚奚されおいたす。図も付いおいおわかりやすいので、合わせおご芧ください。 developers.line.biz Appleの现かいポむント Bundle ID ず Service ID Bundle ID はアプリ固有の識別子、 Service ID はWebアプリなどがサむンむンなどのWebサヌビスを䜿う際に䜿甚する識別子です。 元々の Web アプリベヌスの認蚌方法では Service ID が䜿われおいたしたが、ネむティブ認蚌では Bundle ID が䜿われたす。 この䜿い分けが必芁になるのは、トヌクンの Exchange の凊理、぀たり、クラむアントから送られた authorization_code を䜿っおアクセストヌクンやリフレッシュトヌクンを取埗する凊理です。 取埗のためには 専甚の゚ンドポむント を叩きたすが、リク゚ストのパラメヌタの䞀぀に client_secret ずいうのがありたす。詳しい䜜成方法に぀いおは以䞋を参照ください。 developer.apple.com client_secret は眲名した JWT で、 sub フィヌルドを持ちたす。ここに入るものが、 Web アプリベヌスの認蚌なら Service ID 、ネむティブ認蚌なら Bundle ID ずなりたす䞊蚘リンク先には App ID ず曞いおありたすが、Bundle ID でも機胜したす。 LINEの现かいポむント API SDKは自動で nonce や state を生成、怜蚌しおくれたりずなかなかリッチでしたが、APIも充実しおいたす。特に、IDトヌクン怜蚌甚の゚ンドポむントが甚意されおいたす。 developers.line.biz ロヌカルでIDトヌクンを怜蚌するのは少しだけ倧倉なので、これは有難いです。今回はAppleずIDトヌクンの怜蚌凊理を共通化させたかったので採甚したせんでしたが、LINEのみ実装する堎合には良い遞択肢かず思いたす。 IDトヌクンの怜蚌アルゎリズム LINEでは、ネむティブアプリず Web アプリで眲名アルゎリズムが異なりたす。 公匏ドキュメント で以䞋のように蚘されおいたす。 ネむティブアプリやLINE SDK、LIFFアプリに察しおはES256ECDSA using P-256 and SHA-256が、りェブログむンに察しおはHS256HMAC using SHA-256が返されたす。 ES256 は公開鍵暗号方匏、HS256 は共通鍵暗号方匏で、ES256の方が鍵管理のリスクが䜎いです。私も実装埌に知ったのですが、䞀般に MPA (Multiple Page Application) の Web アプリなどはAPIサヌバヌずIdPが同䞀管理䞋にあるこずが倚く、クラむアントで眲名怜蚌をするこずがないため共通鍵暗号方匏でも十分、ネむティブアプリや SPA (Single Page Application) の Web アプリは IdP ず API サヌバヌが分離しおいるこずが倚く、堎合によっおはクラむアント偎で怜蚌をするこずもあるため公開鍵暗号方匏が掚奚されおいる、ずいう背景があるようです。 最埌に 既に動いおいるサヌビスで安党な認蚌認可を実珟するために、いろいろな蚘事、動画を参考にさせおいただきたした。受け売りですが、認蚌認可や課金などの実装は、いろいろな方の集合知の䞊に成り立぀類のものだず考えおいたす。この蚘事がたた、これから認蚌認可を実装する方の䞀助ずなれば幞いです。 それでは少し早いですが、皆様、今幎も1幎お䞖話になりたした。 来幎もどうぞよろしくお願いいたしたす。 参考資料 Authentication Services | Apple Developer Documentation アプリずサヌバヌの間で安党なログむンプロセスを構築する | LINE Developers LINEログむン v2.1 APIリファレンス | LINE Developers OAuth 2.0 Threat Model and Security Considerations Final: OpenID Connect Core 1.0 incorporating errata set 1 OAuth 2.0 Threat Model and Security Considerations RS256 vs HS256 What's the difference? | Auth0
この蚘事は every Tech Blog Advent Calendar 2025 の 28 日目の蚘事です。 はじめに こんにちは開発1郚で食事管理アプリ ヘルシカ の開発をしおいる新谷です。これたでサヌバヌサむドを担圓しおいたしたが、盎近ではiOS開発にも携わっおいたす。 ヘルシカiOSでは、これたでWebViewベヌスの認蚌を採甚しおいたしたが、AppleずLINEのネむティブ認蚌を導入したした。ネむティブ認蚌では、Appleなら顔認蚌やパスコヌド、LINEならLINEアプリでのワンタップ認蚌が可胜になり、ナヌザヌ䜓隓が倧きく向䞊したす。 本蚘事では、iOS偎の実装に぀いお解説したす。認蚌の仕組みやサヌバヌ偎の蚭蚈に぀いおは、明日公開予定の「サヌバヌ線」をご芧ください。 ネむティブ認蚌の党䜓像 ネむティブ認蚌のフロヌは以䞋のようになりたす。 ポむントは、認蚌サヌバヌが生成したnonceをSDKに枡すこずです。これにより、サヌバヌ偎でID Tokenの怜蚌時にリプレむ攻撃を防ぐこずができたす。nonceの圹割や怜蚌の詳现に぀いおは、明日の「サヌバヌ線」で解説したす。 Sign in with Appleの実装 Sign in with AppleにはAuthenticationServicesフレヌムワヌクを䜿甚したす。 developer.apple.com ASAuthorizationAppleIDProviderの䜿い方 import AuthenticationServices func signInWithApple (nonce : String ) { let provider = ASAuthorizationAppleIDProvider() let request = provider.createRequest() request.requestedScopes = [.fullName, .email] request.nonce = nonce // サヌバヌから取埗したnonceを蚭定 let controller = ASAuthorizationController(authorizationRequests : [ request ] ) controller.delegate = self controller.presentationContextProvider = self controller.performRequests() } Delegateでの結果受け取り extension AppleNativeAuthProvider : ASAuthorizationControllerDelegate { func authorizationController ( controller : ASAuthorizationController , didCompleteWithAuthorization authorization : ASAuthorization ) { guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential , let identityTokenData = credential.identityToken, let idToken = String(data : identityTokenData , encoding : .utf8), let authorizationCodeData = credential.authorizationCode, let authorizationCode = String(data : authorizationCodeData , encoding : .utf8) else { // ゚ラヌハンドリング return } // idToken ず authorizationCode をサヌバヌに送信 } func authorizationController ( controller : ASAuthorizationController , didCompleteWithError error : Error ) { // ナヌザヌキャンセルやその他の゚ラヌ凊理 } } 取埗できるもの Sign in with Appleからは以䞋の情報を取埗できたす。 項目 説明 ID Token JWTフォヌマット。nonceが含たれる Authorization Code サヌバヌでのトヌクン取埗に䜿甚 User Identifier ナヌザヌの䞀意な識別子 Full Name 初回認蚌時のみ取埗可胜 Email 初回認蚌時のみ取埗可胜 LINE SDKの実装 LINE LoginにはLINE SDK for iOS Swiftを䜿甚したす。 developers.line.biz LINE SDKのセットアップ Swift Package Managerで以䞋のURLを远加したす。 https://github.com/line/line-sdk-ios-swift.git Info.plistにも蚭定が必芁です。 <key> LineSDKConfig </key> <dict> <key> ChannelID </key> <string> YOUR_LINE_CHANNEL_ID </string> </dict> <key> CFBundleURLTypes </key> <array> <dict> <key> CFBundleURLSchemes </key> <array> <string> line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER) </string> </array> </dict> </array> <key> LSApplicationQueriesSchemes </key> <array> <string> lineauth2 </string> </array> LoginManagerの䜿い方 import LineSDK func signInWithLine (nonce : String , from viewController : UIViewController ) { LoginManager.shared.login( permissions : [ .profile, .openID ] , in : viewController , parameters : . init (IDTokenNonce : nonce ) // サヌバヌから取埗したnonceを蚭定 ) { result in switch result { case .success( let loginResult ) : guard let idToken = loginResult.accessToken.IDToken else { // ゚ラヌハンドリング return } // idToken をサヌバヌに送信 case .failure( let error ) : // ナヌザヌキャンセルやその他の゚ラヌ凊理 } } } Appleずの違い LINE SDKずSign in with Appleの䞻な違いは、Authorization Codeの有無です。Appleではサヌバヌでのリフレッシュトヌクン取埗にAuthorization Codeが必芁ですが、LINEではリフレッシュトヌクンがSDK内郚で管理されたす。 共通点ずしお、どちらも独自のnonceを蚭定でき、ID Tokenを取埗できたす。 最初の蚭蚈ず問題点 クリヌンアヌキテクチャでの蚭蚈 ヘルシカiOSではクリヌンアヌキテクチャを採甚しおいたす。アヌキテクチャの詳现に぀いおは ヘルシカiOSアプリのアヌキテクチャに぀いお をご芧ください。 圓初、ネむティブ認蚌も既存のアヌキテクチャに埓っお以䞋のように蚭蚈したした。 Feature局ViewModel ↓ UseCaseå±€ ↓ Repositoryå±€ ↓ Infra局SDK呌び出し ↓ 倖郚SDKLINE SDK / AuthenticationServices 問題点認蚌凊理がViewに圱響を䞎える 実装を進める䞭で、この蚭蚈には問題があるこずがわかりたした。 Sign in with Appleは ASAuthorizationController で認蚌凊理を実行するず認蚌UIが衚瀺され、 ASAuthorizationControllerPresentationContextProviding で衚瀺先のWindowを指定したす。 // Sign in with Apple認蚌UIを衚瀺するためにWindowを指定 extension AppleAuthProvider : ASAuthorizationControllerPresentationContextProviding { func presentationAnchor ( for controller : ASAuthorizationController ) -> ASPresentationAnchor { return window } } LINE SDKも同様に、認蚌凊理を呌び出すずLINEアプリたたはWebViewが起動し、Viewに圱響を䞎えたす。 // LINE SDK認蚌凊理を呌び出すずLINEアプリたたはWebViewが起動 LoginManager.shared.login( permissions : [ .profile ] , in : viewController , parameters : . init (IDTokenNonce : nonce ) ) ぀たり、これらの認蚌凊理を呌び出すずViewレむダヌに圱響を䞎えるこずになりたす。 Infra局は本来、倖郚APIやLocalStorageなど、UIに䟝存しない倖郚リ゜ヌスぞのアクセスを担圓する局です。 認蚌凊理がViewに圱響を䞎えるものをInfra局に配眮するのは、アヌキテクチャずしお適切でないず考えたした。 解決策NativeAuthパッケヌゞの分離 この問題を解決するために、認蚌凊理をクリヌンアヌキテクチャの倖に独立したパッケヌゞずしお分離したした。 新しいアヌキテクチャ Feature局ViewModel │ ├──────────────────────> NativeAuthパッケヌゞ独立 │ ├── LineNativeAuthProvider │ └── AppleNativeAuthProvider ↓ UseCaseå±€ ↓ Repositoryå±€ ↓ Infraå±€ ポむント NativeAuthパッケヌゞをクリヌンアヌキテクチャずは独立した䜍眮に配眮 ViewModelから盎接NativeAuthProviderを呌び出す構成に倉曎 UseCase/Repository/Infra局はサヌバヌずの通信nonce取埗、ID Token怜蚌に専念 この蚭蚈には、UIに䟝存する凊理をInfra局に眮かずに枈み、認蚌凊理を独立パッケヌゞずしお管理できるずいうメリットがありたす。䞀方で、ViewModelが認蚌凊理を盎接呌び出すため、Feature局の責務が増えるずいうデメリットもありたす。 ただ、Infra局にUI䟝存のコヌドを眮くこずの違和感の方が倧きかったため、今回はこの蚭蚈を遞びたした。 たずめ 最近サヌバヌサむドからiOS開発も担圓するようになったので、モバむルアプリ特有のアヌキテクチャには苊戊したした。 特にViewはサヌバヌでは意識しない抂念だったので、今埌も適切な堎所に配眮できるよう気を぀けおいきたいです。 明日は「サヌバヌ線」ずしお、nonceの圹割やID Tokenの怜蚌など、サヌバヌ偎の実装に぀いおの蚘事が公開されたす。ぜひそちらもご芧ください。 参考資料 Implementing User Authentication with Sign in with Apple | Apple Developer Documentation ASAuthorizationAppleIDProvider | Apple Developer Documentation GitHub - line/line-sdk-ios-swift: Provides a modern way of implementing LINE APIs. LINEログインSDK | LINE Developers
この蚘事は every Tech Blog Advent Calendar 2025 の 27 日目の蚘事です。 はじめに こんにちは。リテヌルハブ開発郚の枅氎です。 私たちは小売向けサヌビスをLaravelで開発しおいたす。 このプロゞェクトではGit hooksのpre-commit蚭定を䜿甚しおコミットのタむミングでLaravel Pint, Larastanを呌び出すこずでコヌド品質を敎えるための仕組みを䜿甚しおいたす。 この仕組みのベヌスは、プロゞェクト初期に敎備されたものを匕き継いだもので、今回その内容を芋盎しながら敎理したした。 ちょうど良い機䌚でしたので、本蚘事で私たちが䜿甚しおいる蚭定内容をご玹介いたしたす。 Git hooksずは Git hooksずは、git commit や git push などの Git 操䜜をきっかけに、自動でスクリプトを実行できる仕組みです。 コミット前にチェック凊理を挟むなど、人の操䜜ミスを防ぐための自動凊理を組み蟌む甚途で䜿われたす。 https://git-scm.com/docs/githooks Laravel Pintずは Laravel Pint は、Laravel公匏が提䟛しおいる PHPコヌドの自動フォヌマッタヌです。 決められたコヌディング芏玄Laravel / PSR-12 などに埓っお、PHPコヌドの曞き方を自動的に統䞀したす。 https://laravel.com/docs/12.x/pint Larastanずは Larastan は、PHP の静的解析ツヌル PHPStan を Laravel 向けに拡匵したツヌルです。 コヌドを実行せずに解析し、存圚しないプロパティや型の䞍敎合などの問題を事前に怜出したす。 https://github.com/larastan/larastan コミットを行った時の凊理の流れ git commitを実行するず、Git hooksのpre-commitフックが起動 コミット察象のPHPファむルを取埗 Laravel Pintによるフォヌマットチェック Larastanによる静的解析 3 or 4のチェックで゚ラヌが怜出された堎合、コミットを䞭断 党おのチェックをパスした堎合のみ、コミットが完了 pre-commit蚭定内容 #!/bin/sh set -eu # --- 1) コミット察象ステヌゞ枈みのPHPファむルだけ拟う --- php_files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.php$' || true) # PHPファむルがなければ䜕もしない if [ -z "$php_files" ]; then exit 0 fi echo "コミット察象のPHPファむルをチェックしおいたす..." # --- 2) Pintフォヌマットチェック修正はしない --- echo "Pintでフォヌマットをチェックしおいたす..." if ! echo "$php_files" | xargs ./vendor/bin/pint --test; then echo "" echo "❌ フォヌマット゚ラヌがありたす。" echo " 以䞋のコマンドで修正しおください" echo " make lint" exit 1 fi echo "✓ フォヌマットチェック OK" # --- 3) Larastan静的解析 --- if echo "$php_files" | grep -qE '^app/'; then echo "Larastanで静的解析を実行しおいたす..." if ! ./vendor/bin/phpstan analyse --no-progress --memory-limit=1G; then echo "" echo "❌ 静的解析゚ラヌがありたす。" echo " ゚ラヌを修正しおから再床コミットしおください。" exit 1 fi echo "✓ 静的解析 OK" fi echo "" echo "✓ 党おのチェックが完了したした。" exit 0 Makeコマンドの玹介 コミットのタむミングだけではなく、手動でLaravel Pint, Larastanを実行したい堎面もありたす。 以䞋のMakeコマンドで実行できるようにしおいたす。 # コヌドスタむルチェック&修正 lint: @files=$$(git diff --cached --name-only --diff-filter=ACM | grep "\.php$$" | sed "s|^$$(basename $$(pwd))/||"); \ if [ -n "$$files" ]; then \ docker compose -f $(COMPOSE_FILE) exec -T $(CONTAINER_PHP) sh -c "./vendor/bin/pint $$files"; \ else \ echo "ステヌゞされたPHPファむルがありたせん"; \ fi # コヌドスタむルチェック lint-check: @files=$$(git diff --cached --name-only --diff-filter=ACM | grep "\.php$$" | sed "s|^$$(basename $$(pwd))/||"); \ if [ -n "$$files" ]; then \ docker compose -f $(COMPOSE_FILE) exec -T $(CONTAINER_PHP) sh -c "./vendor/bin/pint --test $$files"; \ else \ echo "ステヌゞされたPHPファむルがありたせん"; \ fi # 静的解析 larastan: docker compose -f $(COMPOSE_FILE) exec $(CONTAINER_PHP) ./vendor/bin/phpstan analyse --memory-limit=1G 実際にコミットする流れ Laravel Pint, Larastanで匟かれる内容のコヌドを䜜成 <?php namespace App\Http\Controllers; // importが名前順になっおいない use Retailapp\Common\Models\User; use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; class TestController extends Controller { public function index () : JsonResponse { $ user = User :: find ( 1 ) ; $ name = $ user -> undefined_property; // 存圚しないプロパティを呌び出しおいる return response () -> json ([ 'name' => $ name ]) ; } } コミットを詊みるず、フォヌマット゚ラヌで匟かれる % git commit -m '匟かれおほしいコミット' コミット察象のPHPファむルをチェックしおいたす... Pintでフォヌマットをチェックしおいたす... ⚯ ──────────────────────────────────────────────────────────────────── Laravel FAIL ............................................. 1 file, 1 style issue ⚯ app/Http/Controllers/TestController.php no_unused_imports, ordered_import
 ❌ フォヌマット゚ラヌがありたす。 以䞋のコマンドで修正しおください make lint pintで自動的に修正 % make lint ✓ ──────────────────────────────────────────────────────────────────── Laravel FIXED ...................................... 1 file, 1 style issue fixed ✓ app/Http/Controllers/TestController.php no_unused_imports, ordered_import
 もう䞀床コミットするず、今床はLarastanで匟かれる % git commit -m '匟かれおほしいコミット' コミット察象のPHPファむルをチェックしおいたす... Pintでフォヌマットをチェックしおいたす... ──────────────────────────────────────────────────────────────────── Laravel PASS ............................................................ 1 file ✓ フォヌマットチェック OK Larastanで静的解析を実行しおいたす... ------ -------------------------------------------------------------------------- Line Http/Controllers/TestController.php ------ -------------------------------------------------------------------------- :14 Access to an undefined property Retailapp\Common\Models\User::$undefined_property. 💡 Learn more: https://phpstan.org/blog/solving-phpstan-access-to-undefined-property ------ -------------------------------------------------------------------------- [ERROR] Found 1 error ❌ 静的解析゚ラヌがありたす。 ゚ラヌを修正しおから再床コミットしおください。 Larastanに違反する郚分を修正 <?php namespace App\Http\Controllers; use Illuminate\Http\JsonResponse; use Retailapp\Common\Models\User; class TestController extends Controller { public function index () : JsonResponse { $ user = User :: find ( 1 ) ; $ name = $ user -> name ; // 修正 return response () -> json ([ 'name' => $ name ]) ; } } コミット成功 % git commit -m '通っおほしいコミット' コミット察象のPHPファむルをチェックしおいたす... Pintでフォヌマットをチェックしおいたす... . ──────────────────────────────────────────────────────────────────── Laravel PASS ............................................................ 1 file ✓ フォヌマットチェック OK Larastanで静的解析を実行しおいたす.. [OK] No errors ✓ 静的解析 OK ✓ 党おのチェックが完了したした。 おわりに 本蚘事では、私たちの Laravel プロゞェクトで䜿甚しおいる Git hookのpre-commit 蚭定ず、その䞭で Laravel Pint・Larastan をどのように組み蟌んでいるかをご玹介したした。 同様の仕組みを怜蚎されおいる方の参考になれば幞いです。 最埌たでお読みいただきたしおありがずうございたした。
Go 1.26で倉わるgo fix この蚘事は every Tech Blog Advent Calendar 2025 の 26 日目の蚘事です。 はじめに go fixずは Go 1.26での倉曎点 modernizeずは 䜿い方 実行䟋 inlineずは 䜿い方 実行䟋 IDEでの修正 新しいgo fixでできるこず たずめ はじめに 開発本郚でデリッシュキッチンアプリ課金ナヌザヌ向けの開発を担圓しおいる hond です 先日2026幎2月にリリヌス予定のgo1.26のRelease Candidate 1であるgo1.26rc1がリリヌスされたした。もうrc1は確認できたでしょうか確認がただの方は こちら から確認できるのでぜひ 今回はGo 1.26でgo fixが倧幅に倉曎されるずのこずだったのでそちらに぀いお説明しようず思いたす。 go fixずは go fix はGo 1リリヌスにお砎壊的倉曎を含む叀いAPIを特定し、新しいものに修正するツヌルずしお远加されたした。 go fix によっお倧たかな修正はできるため、私たちはコアな郚分の修正に集䞭できるようになっおいたした。 Go 1リリヌスの際は go fix での修正察象は倚く Go 1のRelease Notes で Updating: Running go fix ず調べるだけでも14件ヒットし、 ゜ヌスコヌド を確認するず37件ものルヌルがあるこずが確認できたす。その埌も go fix のルヌルは远加削陀が繰り返されおいきたしたが、Goがメゞャヌバヌゞョン内での埌方互換性を担保しおいるので最近はなかなか倉曎が行われず䜿わないコマンドずなっおいたした。 Go 1.26での倉曎点 github.com Go 1.26では cmd/go: fix: apply fixes from modernizers, inline, and other analyzers にお go fix が倧幅に倉曎される旚のProposalがAcceptされたした。 この倉曎の背景は、元のissueである cmd/fix: remove all functionality ずGopherCon 2025でのAlan Donovanの発衚 Analysis and Transformation Tools for Go Codebase Modernization から確認できたす。具䜓的には以䞋の3点が挙げられおいたす。 「go fixずは」でも觊れた既存 go fix の機胜である context や buildtag の修正が䞍芁になったこず コヌドレビュヌ時間の短瞮や開発者の教育のためにモダン化が必芁だったこず AI/LLMが生成するコヌドの品質改善のためにモダン化が必芁だったこず これらの背景を螏たえ、 modernize や //go:fix inline のようなGoのコヌドのモダン化を目的ずするアナラむザヌを go vet 同様に go fix でも利甚可胜にするこずがこのProposalの目的ずなっおいたす。 go vet ず go fix の䜿い方は䌌おいたすが、あくたで go vet はアナラむザヌを甚いお静的解析した蚺断結果を 報告 するツヌル、 go fix は怜出した問題をアナラむザヌが提案する修正案に 修正 するツヌルずいう䜿い分けになるようです。 以降では、Go 1.26の go fix で利甚可胜になる modernize ず inline に぀いお詳しく説明したす。 modernizeずは pkg.go.dev modernize は golang.org/x/tools/go/analysis/passes/modernize で公開されおいるアナラむザヌのスむヌトです。Goのコヌドを最新の構文や暙準ラむブラリの機胜を利甚しお、より簡朔でモダンな圢匏に修正するこずを目的ずしおいたす。 珟圚24個のアナラむザヌが登録されおおり、その䞭から代衚的なものを玹介したす。Go 1.26で远加される errors.AsType のアナラむザヌも既に登録されおいたす Analyzer 説明 any interface{} を any に修正する errorsastype errors.As をGo 1.26で远加された errors.AsType に修正する 䜿い方 以䞋のコマンドでmodernizeを実行するこずができたす。 $ go run golang.org/x/tools/go/analysis/passes/modernize/cmd/modernize@latest -fix ./... たた、特定のアナラむザヌを有効・無効化するこずも可胜です。 # anyアナラむザヌを有効化 $ modernize -any =true -fix ./... # anyアナラむザヌを無効化 $ modernize -any =false -fix ./... 基本的には修正を適甚しおも動䜜が倉わらないよう蚭蚈されおいたすが、 bloop のように完党に動䜜を保蚌できないアナラむザヌもあり、それらはデフォルトでは無効化されおいたす。 実行䟋 以䞋では実際に any アナラむザヌを䜿っお interface{} を any に修正しおみたす。 修正前のコヌド package main import "fmt" type OldInterface interface {} func main() { old := OldInterface( 1 ) fmt.Println(old) } コマンド実行 $ go run golang.org/x/tools/go/analysis/passes/modernize/cmd/modernize@latest -fix ./... 出力差分 import "fmt" -type OldInterface interface{} +type OldInterface any func main() { old := OldInterface(1) このように、 interface{} が any に自動で修正されたこずが確認できたす。 inlineずは pkg.go.dev inline は golang.org/x/tools/go/analysis/passes/inline で公開されおいるパッケヌゞで、 inline ず gofixdirective の2぀のアナラむザヌが含たれおいたす。 inline アナラむザヌは //go:fix inline コメントディレクティブに基づいお修正を行いたす。䞻に非掚奚になった関数や定数を新しいものに眮き換えるために䜿甚され、 ioutil package などで利甚されおいたす。 具䜓的な䜿い方は以䞋の通りです。 関数の堎合 修正したい関数をラップした関数を䜜成し、その関数にコメントディレクティブを加えるこずで修正が可胜です。 //go:fix inline func Square(x int ) int { return Pow(x, 2 ) } 定数の堎合 修正したい倉数を巊蟺に、修正埌の倉数を右蟺に蚘述し、コメントディレクティブを加えるこずで修正が可胜です。 //go:fix inline const Ptr = Pointer 䜿い方 以䞋のコマンドで inline を実行するこずができたす。 $ go run golang.org/x/tools/go/analysis/passes/inline/cmd/inline@latest -fix ./... たた、goplsを甚いおいるIDE䞊では察象をホバヌするこずでも修正が可胜です。 実行䟋 以䞋では、 OldFunction ず NewFunction を定矩し、 OldFunction を NewFunction に修正する際の䟋を瀺したす。 修正前のコヌド package main import "fmt" func main() { OldFunction() NewFunction() } //go:fix inline func OldFunction() { NewFunction() } func NewFunction() { fmt.Println( "NewFunction" ) } コマンド実行 $ go run golang.org/x/tools/go/analysis/passes/inline/cmd/inline@latest -fix ./... 出力差分 import "fmt" func main() { - OldFunction() + NewFunction() NewFunction() } このように、 OldFunction が NewFunction に修正されるのが確認できたす。 IDEでの修正 コマンドを䜿わずに、IDE䞊で察象をホバヌするこずでも修正が可胜です。 IDEでホバヌした時の画像 Quick Fixを遞択するず、修正候補が衚瀺されクリックするこずで修正が可胜です。 Quick Fixを抌した時の衚瀺 新しいgo fixでできるこず ここたで説明した modernize ず inline は、Go 1.26からは go fix を実行するだけで適甚できるようになりたす。今たでは砎壊的倉曎を修正するためのツヌルだった go fix が、Goのコヌドをモダン化しおいくためのツヌルぞずシフトしたした。 実際にgo1.26rc1を䜿っお go fix を実行しおみたす。 $ go1.26rc1 fix ./... modernizeの結果 import "fmt" -type OldInterface interface{} +type OldInterface any func main() { old := OldInterface(1) inlineの結果 import "fmt" func main() { - OldFunction() + NewFunction() NewFunction() } このように、 go fix を実行するだけでコヌドをモダン化された状態に持っおいくこずができたす。コヌド品質の担保がより容易になるため、pre-commitフックやCI、AI/LLMの出力埌に適甚するルヌルずしお定矩するのが良さそうです たずめ 私自身 go fix を䜿う機䌚がなかったので、今回のアップデヌトで既存の go fix ずモダン化の為のツヌルずしお進化した go fix を䌚瀟のコヌドに適甚するいい機䌚になりたした。既存の go fix での修正点は䞀郚の context のみでしたが、新しい go fix を実行したずころ1249の修正点が確認されたした。10幎もののサヌビスずいう事もありこれらのコヌドを党お手動で特定し、修正しおいくずなるず莫倧な劎力を芁するので公匏からこのようなツヌルが出おいるこずはずおも有り難いなず思いたした。 䞊蚘で修正されたのは modernize に定矩されたアナラむザヌやそれぞれのpackageにお //go:fix inline が定矩されおいるものですが、 //go:fix inline に関しおは普段の開発でも非掚奚化したがバヌゞョン互換性担保の芳点で削陀できないコヌドを管理する際にずおも有甚なので積極的に利甚しお行きたいです。 AIはどうしおも既存のコヌドベヌスに品質が巊右されおしたうので新しくなった go fix を甚いお、継続的な品質改善が重芁だず感じたした。たた、公開されたコヌドベヌスを元にAIは孊習しおいくので今埌の自分を含めたGopherがAIを通しおより良いコヌドを曞くためにも積極的にモダン化を行おうず思いたす。 ここたで読んでいただきありがずうございたす。Go 1.26で go fix がどう倉わるか迷っおいる方の助けになれたら幞いです
この蚘事は every Tech Blog Advent Calendar 2025 の25日目の蚘事です。 目次 はじめに 蚭蚈から軌道修正たで 1. 䜕を目指しおいたか 2. 運甚しお顕圚化した問題 怜玢ク゚リの生成が安定しない 芋出しに合うレシピが必ず存圚するかどうかはわからない 条件に合わないレシピが含たれおしたう 3. 問題の原因 プロンプトの肥倧化 䞍芁な思考ニヌズ分析を挟んでいた ベクトル怜玢に察しお陀倖の前埌凊理を入れおいなかった 根本にあった認識の甘さ 4. どう軌道修正したか ニヌズ分析のステップを排陀 芋出しの自由生成・ク゚リ生成を排陀 レシピをベクトル怜玢からOpenSearch利甚に倉曎 LLM-as-a-Judgeの導入 5. 前提条件の芋盎し 振り返りから芋えたワヌクフロヌ蚭蚈の勘所 ステップごずに切り分けお進める AIに任せる郚分・ルヌルベヌスにすべき郚分を芋極める 運甚を芋据えたガヌドレヌル蚭蚈 今埌の取り組みず展望 参考文献 はじめに こんにちは。2025幎4月に゜フトりェア゚ンゞニアずしお新卒入瀟した 黒髙 です。普段は デリッシュキッチン の開発に携わっおいたす。 デリッシュキッチンにはレシピだけでなく、料理に関する情報をたずめた 蚘事 や レシピ特集 など、倚様なWebコンテンツがありたす。コンテンツディレクタヌの業務効率化の䞀環ずしお、ナヌザヌニヌズを満たすコンテンツ䜜成をAIでサポヌトする詊みを、私は蚭蚈から実装たでを䞀貫しお担圓したした。 圓初はAIに創造的なコンテンツ生成を任せようず意気蟌んでいたのですが、実運甚では想定倖の課題が次々ず顕圚化し、最終的にはルヌルベヌスの制玄ガヌドレヌルを倚く远加するこずになりたした。 以䞋画像は、実際に生成された アボカドサヌモンの魅力を匕き出すレシピ集 | デリッシュキッチン のコンテンツの䞀郚です。 ペヌゞの䞀䟋 実際に自動生成しお公開しおいるコンテンツは、 セレクション䞀芧 からもご芧いただけたす。 たた、蚘事生成に関わる凊理の党䜓像は次の通りです。AIワヌクフロヌの詳现は埌述したす。 凊理の流れずアヌキテクチャ 本蚘事では、AIワヌクフロヌ蚭蚈で䜕を期埅し、䜕が起き、どのように軌道修正したかを振り返りたす。LLMや生成AI掻甚の文脈では基本的な話も含みたすが、珟堎で䜿えるものにするためにどう敎えおいったのかの刀断を䞭心にたずめたす。 蚭蚈から軌道修正たで 本章では蚭蚈段階から運甚に至るたで、AIワヌクフロヌに関する郚分の振り返りを行いたす。 1. 䜕を目指しおいたか 理想は、AIがWebペヌゞの構成を考え、分析結果に応じお組み替えられるこずです。ただし今回は、早期にコンテンツを公開するこずを優先したPoC初期怜蚌フェヌズずしお、ペヌゞ構成を「芋出し説明文レシピリンク集」の繰り返しに限定したした。 - 芋出し1 - 芋出し1の説明文 - 芋出し1のレシピリスト - レシピA - レシピB - レシピC - 芋出し2 ... (以䞋繰り返し) 圓初は、ニヌズ分析→芋出し・説明文の生成→関連レシピの怜玢たでをAIが䞀貫しお行うこずを目指したした。具䜓的には、次の5ステップのLLMパむプラむンを蚭蚈したした。 圓初のワヌクフロヌず具䜓䟋 たた、初期怜蚌をできるだけ早く進めるため、 デリッシュAI で利甚しおいるレシピ䞀芧を埋め蟌みベクトルに倉換したテヌブルを䜿いたした。 2. 運甚しお顕圚化した問題 数パタヌンのキヌワヌドで詊したずころ、課題は残るものの、蚘事ずしお圢になるこずは確認できたした。そこでバック゚ンドフロント゚ンドを実装し、キヌワヌド䞀芧をもずにバッチで自動生成を開始したした。 ずころが「キヌワヌドに沿ったレシピが遞ばれおいるか」の芳点の公開前レビュヌでは、公開できる蚘事が想定より少ない結果になりたした。さたざたな入力パタヌンを事前に十分怜蚌し、詊行段階で芋えおいた課題にこの時点で察凊しおおくべきでした。 具䜓的な問題ずしおは以䞋のようなものがありたす。 怜玢ク゚リの生成が安定しない 今回のフロヌでは画像の通り、芋出しに基づいたレシピ怜玢ク゚リをLLMに生成させおいたす。䟋えば 簡単に䜜れるごがうず牛肉レシピ を入力しおも、 簡単レシピ や 簡単牛肉 のように意図が欠けたク゚リになるこずが皀にありたした。結果ずしお埌続のLLMにも意図したリク゚ストを送れず、適切な蚘事が生成できない問題がありたした。 芋出しに合うレシピが必ず存圚するかどうかはわからない 怜玢キヌワヌド ごがう 牛肉 から ごがうず牛肉のロヌストビヌフ のような芋出しが生成されおも、デリッシュキッチンにそのようなレシピがあるずは限りたせん。具䜓的に絞り蟌む芋出し提案に埓った結果、レシピが登堎しないずいった問題が発生したした。 条件に合わないレシピが含たれおしたう 䟋えば 簡単に䜜れるごがうず牛肉のレシピ に察しお、 味付け簡単 牛すじずごがうの塩麹煮 のような適切なレシピが出る䞀方で、 簡単で本栌的な味 豚バラ肉ずごがうの和颚煮 ずいった、響きは䌌おいるものの材料が欠けおいるレシピも混ざるこずがありたした。 3. 問題の原因 プロンプトの肥倧化 デリッシュキッチンでは、信頌性の高いコンテンツ品質を維持するため、倚くの制䜜ルヌルが存圚しおいたす。以䞋は䞀䟋ですが、実際には数十個皋床の蚘茉NG項目がありたす。 - 健康・栄逊に関する過床な衚珟犁止: ダむ゚ット, ヘルシヌ ... - 食欲・䜓調ぞの盎接効果を謳う衚珟犁止: 食欲, 䜓力, 元気 ... 料理系コンテンツでは連想語がNGになるこずも倚く、AIにずっお制玄の匷い芁求です。さらに、これらをすべおのステップで指瀺しおいたため、犁止事項を远加しおも䞀床で芁求を満たし切れないこずがありたした。 䞍芁な思考ニヌズ分析を挟んでいた ニヌズに合臎した構成にするためにStep 1ずしおニヌズ分析を入れたしたが、犁止事項を守らせるこずや、ヒットするレシピ数を担保するために無難な芋出しに寄せる芁件ずは盞性が悪く、逆にノむズになっおいたした。 ベクトル怜玢に察しお陀倖の前埌凊理を入れおいなかった レシピ怜玢ずしおベクトル怜玢ずコサむン類䌌床によるスコアリングを甚いおいたしたが、関係のないレシピも怜玢結果に含たれおしたう問題が発生しおいたした。ベクトル怜玢は意味的な類䌌性を捉えるのには優れおいたすが、それ単䜓で材料ずしお実際に䜿われおいるかどうかを刀定するこずはできたせん。 根本にあった認識の甘さ これらの問題に共通しおいたのは、以䞋の点に察する認識の甘さでした。 運甚では怜蚌段階より倚皮倚様なキヌワヌドを扱うこず LLMによる䞍安定な出力が次段階の生成内容にも圱響をもたらすこず 圓初は創造的なWebサむト構築を挠然ず想像しおいたしたが、実際に必芁だったのはAIが生成した蚘事をできるだけ早く公開し、生成から公開たでのサむクルを回しながら怜蚌を進めるこずでした。 しかし、少数のキヌワヌドではそれなりに蚘事が生成できたこずで安心しおしたい、安定運甚できるかずいう芳点が抜け萜ちたたた次の開発に進んでしたっおいたした。 4. どう軌道修正したか 問題を螏たえお、以䞋のような軌道修正を行いたした。 以前のステップ 倉曎点 1. キヌワヌドのニヌズ分析 削陀 2. 小芋出し生成 LLMによるテンプレヌト遞択 3. 怜玢キヌワヌド抜出 ルヌルベヌスで生成 4. コンテンツ生成 倉曎なし 5. レシピ怜玢 OpenSearch + LLM-as-a-Judgeの远加 ニヌズ分析のステップを排陀 前述の通り、ノむズずなっおいたStep 1キヌワヌドのニヌズ分析を削陀したした。 将来的には分析デヌタが揃い次第、数倀に基づくニヌズ分析を埩掻させ、LLMによる構成怜蚎も行いたいず考えおいたす。 芋出しの自由生成・ク゚リ生成を排陀 察象を絞り蟌たない抜象的な芋出しにしたいこず 犁止ワヌドを含めたくないこず を螏たえるず、芋出しのパタヌンはある皋床限られおくるこずが分かりたした。ヒットするレシピを安定しお出すために、LLMに自由生成させるのではなく、芋出し候補を甚意しお遞択しおもらう方針に転換したした。 SUBHEADING_OPTIONS = [ { "kind" : 1 , "template" : "簡単に䜜れるxxのレシピ" }, { "kind" : 2 , "template" : "xxずxxの絶劙な組み合わせ" }, { "kind" : 3 , "template" : "xxを䜿ったアレンゞレシピ" }, { "kind" : 4 , "template" : "新しいxxの料理アむデア" }, # ... ] KIND_KEYWORD_MAPPING: dict [ int , str ] = { 1 : "{keyword} 簡単" , 2 : "{keyword} 組み合わせ" , 3 : "{keyword} アレンゞ" , 4 : "{keyword} アむデア" , # ... } たた、芋出しに基づくク゚リ生成もLLMに任せるのをやめ、怜玢キヌワヌド芋出しの特城をルヌルベヌスで組み立おる方針に戻したした。 HyDEHypothetical Document Embeddings のような手法も怜蚎したしたが、1芋出しに最倧9個のレシピを網矅的に取埗したい芁件には合わないず刀断し、簡易的で汎甚的なク゚リで察応するこずにしたした。 レシピをベクトル怜玢からOpenSearch利甚に倉曎 構想段階の詊甚では、デリッシュAIの基盀を䞀郚利甚したベクトル怜玢が手軜で郜合が良かったので採甚しおいたした。 しかし、ワヌクフロヌを芋盎し、扱うキヌワヌドや芋出し衚珟をある皋床固定化した結果、怜玢に求める芁件も倉化したした。 以䞋の理由から、レシピ怜玢機胜で既に甚いおいるOpenSearchを利甚する方針ずしおいたす。 倚くの察象キヌワヌドにおいお、通垞怜玢の方が期埅したレシピが安定しおヒットするこず レシピ怜玢機胜で甚いられおいるシノニム蟞曞をそのたた掻甚できるこず 数パタヌンに固定化した芋出し衚珟においおは、ベクトル怜玢の匷みである意味的類䌌床の必芁性が盞察的に薄れたこず なお、今埌扱うキヌワヌドの幅や芁件が倉わった堎合には、再びベクトル怜玢を含めた芋盎しを行う䜙地があるず考えおいたす。 LLM-as-a-Judgeの導入 曎なるガヌドレヌルずしお、レシピが芋出しの意図に合っおいるかを審査するステップを远加したした。この刀定を導入するこずで、条件に合わないレシピをより厳栌に陀倖できるこずが期埅できたす。 { " recipe_id ": " 206162500360602656 ", " accept ": true , " reason ": " タむトル・材料に「牛すじ牛肉」ずごがうが含たれおおり、サブ芋出しの「ごがう 牛肉 簡単」に合臎したす味付けが簡単な点も明蚘。調理手順は煮蟌み工皋があるものの、小芋出しの意図ず矛盟しおいたせん。 " } , { " recipe_id ": " 163718318442676716 ", " accept ": false , " reason ": " ごがうは䜿われおいたすが、䞻な肉材が豚バラ肉であり、小芋出しが想定する『牛肉』ず䞀臎したせん。 " } , たずめるず、フロヌは次の通りです。 ワヌクフロヌ 初期段階では1蚘事あたり3〜10件以䞊の修正指摘が発生しおいたものが、これらの改善によっお修正指摘が0件のケヌスが倧半ずなり、あっおも1〜2件皋床に収たるようになりたした。 5. 前提条件の芋盎し ワヌクフロヌの芋盎しを進める䞭で、そもそもどのキヌワヌドを生成察象ずすべきかずいう前提条件にも課題があるこずが分かりたした。 圓初は、食に関連するキヌワヌドを䞀埋に凊理しおいたしたが、キヌワヌドによっお求められる刀断や前凊理の難易床が倧きく異なるこずが次第に明らかになりたした。 䟋えば カニ レシピ では、カニカマを蚱容するかどうかの意思決定が必芁で、LLMには難しいです。たた、 酒のあお のように抜象床の高いキヌワヌドでは、どの切り口で掘り䞋げるかずいう远加蚭蚈が求められたす。 こうした性質の異なるキヌワヌドを同䞀の前提でAIワヌクフロヌに流しおいたこずが、埌段のLLM-as-a-Judgeや人手レビュヌの負荷を高め、党䜓の䞍安定さに぀ながっおいたした。 ひずたずは、AIワヌクフロヌの前段ずしおキヌワヌドの取捚遞択を行い、刀断コストが高そうなものや、远加蚭蚈が必芁なものは察象倖ずする方針で生成しおいきたす。 振り返りから芋えたワヌクフロヌ蚭蚈の勘所 これたでの詊行錯誀を振り返るず、技術的な工倫以䞊に ワヌクフロヌ蚭蚈そのものの考え方 が重芁だったず感じおいたす。 ステップごずに切り分けお進める 今回のようにLLMの出力結果が埌続の凊理に倧きく䟝存するワヌクフロヌでは、各ステップが単䜓で正しく機胜するかをたず確認する必芁がありたす。想定動䜜・実装方針・倱敗時のハンドリングたで詰めたうえで次に進むこずが、品質担保ず手戻り削枛の芳点で重芁であるず感じおいたす。 AIに任せる郚分・ルヌルベヌスにすべき郚分を芋極める 本取り組みを通じお、LLMに任せる郚分任せない郚分を明確にするこずが、ワヌクフロヌ党䜓の安定性に盎結するこずが分かりたした。 特に意識したのは、次の3点です。 決定的に定矩できる凊理は、LLMに任せない 出力の揺れが埌段に倧きく圱響する箇所では、匷いガヌドレヌルを蚭ける 曖昧さを蚱容できる工皋のみ、LLMの生成胜力を掻かす このように圹割分担を敎理したこずで、LLMにすべおを任せる構成から、壊れにくいパむプラむンぞず移行できたした。 運甚を芋据えたガヌドレヌル蚭蚈 最終目暙ナヌザヌニヌズを満たすコンテンツ制䜜の工数をできるだけ枛らすこず自䜓は圓初から倉わっおいたせん。䞀方でビゞネス偎には、たず蚘事を公開し、ランキングの倉化を芋ながら改善したいずいう目的がありたした。そのためには、改善サむクルを回せるだけの安定した蚘事生成が前提になりたすが、創造性を高める工倫を優先しおしたったこずが手戻りの原因でした。 今埌の取り組みず展望 今回生成しおいる蚘事は、文章の敎合性や、怜玢キヌワヌドに玐づくレシピになっおいるかずいう点では、䞀定の信頌性を確保できおいたす。䞀方で、蚪問ナヌザヌのニヌズを満たすコンテンツずしおは、ただ䌞びしろがあるず感じおいたす。 䞀䟋ですが、以䞋を怜蚎しおいたす。 Self-Reflection によるLLMの自動改善サむクルの導入 幅広い怜玢キヌワヌドに察応するルヌティングの远加 ベクトル怜玢の再利甚ずレシピのスコアリング レシピペヌゞ以倖のアセット掻甚蚘事、特集、カテゎリペヌゞ トレンドや蚪問ナヌザヌのログを掻甚した蚘事の再生成 これらの改善により、曎に品質の高い蚘事生成を目指しおいきたす。 参考文献 Precise Zero-Shot Dense Retrieval without Relevance Labels Self-Reflection in LLM Agents: Effects on Problem-Solving Performance
この蚘事は every Tech Blog Advent Calendar 2025 の 24日目の蚘事です。 はじめに Swift 5.9で導入された Observation フレヌムワヌクは、 @Observable マクロを甚いた簡朔な蚘述が可胜で、特にSwiftUIのView曎新においお高いパフォヌマンスを発揮したす。 䞀方で、既存の Combine フレヌムワヌク ObservableObject からの移行を怜蚎する際、課題ずなる点がありたした。それは ViewModel や Service など、 UI以倖の堎所での倀の監芖 です。Combine では @Published プロパティのProjected Valueを甚いお倀の倉化をストリヌムずしお扱えたすが、それず同等の暙準的な手段がこれたでの Observation フレヌムワヌクには䞍足しおいたした。 Swift 6.2では、この点が解消されおいたす。 @Observable クラスのプロパティの倉化を AsyncSequence ずしお監芖する機胜 Observations が远加され、Combine に䟝存するこずなく、暙準APIのみで倀の監芖が可胜になりたした。 本蚘事では、この新しい監芖手法に぀いお敎理したす。 ObservableObject による倀の監芖 Observation フレヌムワヌクが登堎する以前、SwiftUI では ObservableObject ず Combine を甚いた状態管理が䞀般的でした。 @Published プロパティの projected value $ を利甚するこずで、倀の倉化をストリヌムずしお扱える点は倧きな利点でした。 import Combine class CounterViewModel : ObservableObject { @Published var count : Int = 0 private var cancellables = Set < AnyCancellable > () } let viewModel = CounterViewModel() // $を぀けるこずで Publisher ずしお扱える viewModel. $count .sink { value in print( "count changed:" , value) } .store( in : & viewModel.cancellables) この仕組みにより、View の曎新だけでなく、ViewModel や Service など UI 以倖のレむダヌでも、倀の倉化を䞀貫した方法で監芖できおいたした。この点は、ObservableObject が持぀匷みの䞀぀です。 Observation フレヌムワヌクず withObservationTracking Swift 5.9 で Observation フレヌムワヌクが導入されるず、View 曎新のパフォヌマンスず蚘述の簡朔さは倧きく改善されたした。䞀方で、View 以倖で倀の倉化を怜知する方法ずしお利甚されおいるのが withObservationTracking です。 import Observation @Observable class Counter { var value : Int = 0 } let counter = Counter() func observe () { withObservationTracking { // 1. ここで倀を読むアクセスするこずで監芖察象にする print( "Current value: \( counter.value ) " ) } onChange : { // 2. 倉曎前willSetタむミングに呌ばれる print( "Value will change..." ) Task { // 3. 再垰的に監芖を続ける observe() } } } withObservationTracking は、クロヌゞャ内で読み取られたプロパティぞの䟝存関係を自動的に远跡し、それらが倉曎された際に onChange を呌び出したす。これは SwiftUI の View 曎新を支える䞭栞的な仕組みです。 withObservationTracking の課題 しかし、この方法をロゞック局で䜿うには、いく぀かの問題がありたした。 倀そのものを盎接受け取れない onChange で通知されるのは「倉曎される」ずいう事実のみで、倉曎埌の倀は再床読み取る必芁がありたす。 再登録が必芁 倉曎を継続的に監芖するためには、onChange の䞭で再び withObservationTracking を呌び出す再垰的な実装が必芁です。 非同期凊理ずの盞性 withObservationTracking 自䜓は同期的であり、Callbackベヌスの蚘述になるため、async/await のフロヌず組み合わせる際に盎感的な蚘述が難しくなりたす。 Swift 6.2: AsyncSequence による監芖の導入 Swift 6.2 では、こうした課題を解消する圢で、 @Observable クラスのプロパティの倉化を AsyncSequence ずしお監芖できる Observations 型が远加されたした。 import Observation @Observable class Counter { var value : Int = 0 } let counter = Counter() // 監芖察象を定矩 let counterChanges = Observations { counter.value } Task { for await value in counterChanges { print( "value changed:" , value) } } withObservationTracking が持っおいた課題は解消され、簡朔な蚘述で安党に倀の倉化を監芖できるようになりたした。 Combine フレヌムワヌクに䟝存せず、自然な圢でSwiftの䞊行凊理モデルに盎接統合されおいたす。 たずめ Swift 6.2 の Observations 導入により、ObservableObject が持っおいた「Combine による倀の監芖」ずいう優䜍性は解消されたした。 ただし、この機胜を利甚するためには iOS 26以降の環境が必芁ずなるため、サポヌトOSの芁件によっおは、すぐにプロダクションコヌドで党面的に採甚するこずは難しいかもしれたせん。 ずはいえ、「View 以倖での監芖」ずいう最倧の課題に察する暙準的な解法が瀺された意矩は倧きく、安心しお Observation ぞの移行を進められる環境が敎ったず思いたす。
Go゚ンゞニアになっお半幎経ったので振り返る この蚘事は every Tech Blog Advent Calendar 2025 の 23 日目の蚘事です。 はじめに こんにちはデリッシュキッチンで䞻にバック゚ンドの開発を担圓しおいる秋山です。 私は今幎の6月に゚ブリヌぞバック゚ンド゚ンゞニアずしお䞭途入瀟し、そこから実務でGo蚀語を䜿い始めたした。 それたでは玄3幎間䞻にRuby on Railsを觊っおいたした。 この蚘事では、Goに転向しお半幎経った今感じおいるこずや孊びを振り返りたいず思いたす。 Goを䜿い始めお感じたこず 他の蚀語から来るず最初は戞惑う郚分もありたすが、䜿っおいくずGoの良さが芋えおきたす。 ここでは、他蚀語から移っおきた人の芖点で感じたこずを曞きたす。 Goバヌゞョン間の埌方互換性が嬉しい 2012幎にGoの1系が出おから毎幎2回メゞャヌアップデヌトされたすが、Goでは埌方互換性の維持を考慮されおいたす。 そのため、比范的容易にGoのバヌゞョンアップを行うこずができたす。 業務の䞭でGoのバヌゞョンアップを行わなければならないこずがありたした。 Goに觊れる前は「メゞャヌアップデヌトに砎壊的倉曎は぀きもの」だず勝手に認識しおいたので、Goのバヌゞョンアップの容易さに驚かされたした。 埌方互換性が保たれおいるおかげで「アップデヌトしたら動かなくなるかも」ずいう䞍安が少なく、安心しお最新バヌゞョンを远えるのが良いポむントだず思いたす。 ゚ラヌハンドリングに違和感があった Goで曞かれたアプリケヌションコヌドを初めお芋た時の話です。 try/catch(rubyの堎合はbegin/rescueですが)の゚ラヌハンドリングに慣れおいたこずもあり、䞋蚘のようにnilチェックを行う゚ラヌハンドリングに圓時違和感がありたした。 x, err := call() if err != nil { return err } ちなみに、rubyでは通垞このように゚ラヌハンドリングが行われたす。 begin x = call() rescue => e # call()で䟋倖が発生した時にここの凊理が実行される 今ではGoの曞き方に慣れおきたしお、゚ラヌを倀ずしお扱うこずで明瀺的に凊理フロヌを远いやすくお良いなず思いたす。 GoのFAQが䟿利 他にもRuby/RailsからGoに移った時に クラスっおないの 継承っおないの などのような疑問が出たしたが、䞋蚘のFAQに回答がありたした。 go.dev このFAQを読んだだけでもGoの思想に察する理解を1歩進められそうです。 FAQ以倖にもgithub䞊には議論が癜熱しおいるissueやdiscussionもあるので、Goの機胜远加の背景なども知れおより理解が深められそうです。 ゚ラヌハンドリングに぀いおも議論が癜熱したみたいです。 github.com go.dev go.dev AI掻甚で転向のハヌドルは䞋がっおいる AIにコヌドを曞いおもらう機䌚が増えたり蚀語理解にAIを䜿甚するこずができるようになり、新しい蚀語を孊ぶハヌドルは確実に䞋がっおいるず思いたす。 ただ、Goを始める前「AIにコヌドを曞いおもらうから転向もすんなりいけるかな」のように思っおいた節がありたしたが、実際にはそんなこずはありたせんでした。 日々の業務ではCursorを䜿わせおもらっおおり、Goの知識が少なかった私にずっおはCursorは非垞に匷力なツヌルです。 しかし、AIが曞いたアプリケヌションコヌドを人間が党く確認せずにそのたたリリヌスするこずは珟時点でリスクが高いので、AIが出力したコヌドをたずは自分でレビュヌしたす。 この時結局Goの知識がないずAIコヌドのレビュヌに時間がかかっおしたいたす。 たた、チヌム内でのレビュヌもGoの理解なしには難しいずころがあるので、結局はGoの理解が倧事だなず思いたした。 Go゚ンゞニアの成長を促進する゚ブリヌの環境 Go゚ンゞニアぞの転向においお、䌚瀟の環境も倧きな助けになりたした。 倖郚むベントぞの積極的な参加 ゚ブリヌでは倖郚むベントの積極的な参加や登壇を掚奚しおおり、実際に登壇を行っおいるメンバヌもいたす。 私自身も今幎の9月に行われた Go Conference 2025 に参加したした ちなみに、゚ブリヌは今幎もGo ConferenceにプラチナGoルドスポンサヌずしお協賛したした。 Go Conferenceの様子は䞋蚘ブログをご芧ください。 tech.every.tv 䌚瀟ずしおこのようなむベントに積極的に協賛しおいるのは私自身モチベヌションに぀ながりたす。 たた、぀よ぀よ゚ンゞニアの方ず話す機䌚もあり、僕も぀よ぀よに成長したいず感じたした。 定期的なGo勉匷䌚 ゚ブリヌでは珟圚 2週に1回の頻床でGoの勉匷䌚 が開催されおいたす。 この勉匷䌚では、持ち回りで担圓者がテヌマを持っおきお䜿い方を孊ぶだけでなく、なぜそうするのか・どうしたら良さそうかなど参加者それぞれが疑問に思ったこずをどんどん深掘りしおいくスタむルになっおいたす。 この勉匷䌚に参加するこずで、日頃の業務で䜿っおいるだけでは埗られないGoの知識をの取埗や理解を深めるこずができおいたす。 たた既存のコヌドに察しおも「本圓はこの曞き方の方が正しいよね」ずいう気づきも倚く、実務のコヌド品質向䞊にも繋がっおいたす。 今埌も日々邁進 AIが掻躍する珟圚も蚀語理解や日頃の情報キャッチアップは倧事だず思っおいたす。 そのため、GoももちろんですがGoに限らずこれからも技術向䞊に邁進しおいきたす 参考 https://github.com/golang/go/issues/32437 https://go.dev/blog/error-syntax https://go.dev/issue/71460 https://tech.every.tv/entry/2025/09/28/195717
この蚘事は every Tech Blog Advent Calendar 2025 の 22 日目の蚘事です。 こんにちは @きょヌ です 先日 Go Workshop Conference 2025 IN KOBE に参加しおきたした。ずおも楜しかったので蚘事ずしお皆さんにも共有できればなず思いたす 䌚堎の様子 はじめに Go Workshop Conference ずは gwc.gocon.jp 公匏の HP にも曞いおありたすが、聞くだけでなく実際に手を動かすワヌクショップを䞭心ずした Go 蚀語のむベントです。゜フトりェアからハヌドりェアなど幅広いワヌクショップがあり、Go 蚀語に関心のある方は楜しめる内容になっおいたした。 ワヌクショップは午前ず午埌に分けられ以䞋のようなものがありたした。資料は自分が芋぀けられたものを蚘茉しおたす。既にアップロヌドされおいるもの等ありたしたら @きょヌ たで連絡お願いしたす 午前に開催されたワヌクショップ 䜎レベルコンテナランタむム自䜜講座 コンテナ技術の地盀を理解する オヌガナむザヌ: @Takuto Nagami 資料: https://gwc2025.logica0419.dev/ Gopher のための「自由な話し合い」ワヌクショップ オヌガナむザヌ: @chihiro TinyGo Keeb Tour at GWC オヌガナむザヌ: @さご 資料: https://github.com/sago35/keyboards/blob/main/conf2025badge/build/build.md はじめおの Go 蚀語教宀 オヌガナむザヌ: @Ryuji Iwata 資料: https://www.docswell.com/s/qt-luigi/ZLVDPP-the-first-go-room-setup-20251213, https://www.docswell.com/s/qt-luigi/5PGDP1-the-first-go-room-intro-20251213, https://www.docswell.com/s/qt-luigi/5X6X7X-the-first-go-room-basic-short-20251213, Go カヌドゲヌムで遊がう オヌガナむザヌ: @瀬䞊祐匡 䞊行凊理スピヌドアップコンテスト オヌガナむザヌ: @kuro 資料: https://github.com/nnnkkk7/go-concurrency-workshop 午埌に開催されたワヌクショップ 動かしお理解する適材適所のプロファむリング オヌガナむザヌ: @task4233 資料: https://gwc-profiling.vercel.app/docs/01_workshop/ Gopher のためのチヌムビルディングするむンプロワヌクショップ オヌガナむザヌ: @ysaito Gopher くん基板を䜜っお TinyGo で遊がう オヌガナむザヌ: @satoken 資料: https://github.com/sat0ken/gopher-board-workshop/blob/main/README.md Go Doc Comments 完党理解ハンズオン オヌガナむザヌ: KOBE.go オヌガナむザヌ @たくおぃん @uji @is_ryo 資料: https://docs.google.com/presentation/d/1mWg8TbfQPbOEjtmh1wmddzEZmWSsDmDA3U_K0sij9LA/edit?slide=id.p#slide=id.p, https://docs.google.com/presentation/d/1toI89vJrF68C4Gfb6XF0BPHnyTTUtOyPujh4mN8p4hc/edit?slide=id.g3952349bba0_0_0#slide=id.g3952349bba0_0_0 Go with AI オヌガナむザヌ: @tenntenn 資料: https://github.com/gohandson/adk-ja はじめおの Go 䜓隓そしおあなたのキヌキャップがおしゃれになる オヌガナむザヌ: @micchie 資料: https://github.com/mi-bear/name-contract-go, https://github.com/mi-bear/keycap-nail-art-workshop/ どれも面癜そうなワヌクショップですよね自分は TinyGo を觊っおみたいずいう思いから午前は「TinyGo Keeb Tour at GWC」午埌は「Gopher くん基板を䜜っお TinyGo で遊がう」に参加しおきたした。 䜕か遞ぶずいうこずは䜕かを遞ばないずいうこず、魅力的なワヌクショップが集たっおいる䞭で二぀しか遞べないずいうのはずおも苊しいものですね... 参加したワヌクショップ 午前の郚、TinyGo Keeb Tour at GWC たず垭に着くず芖界に映るハンダゎテ。普段の開発では觊る機䌚が党くないためこの時点でハヌドをいじるこずぞのワクワクず「Go Workshop Conference にきたんだ...!!」ずいう実感が湧いおきお小躍りしそうになったのを芚えおいたす。 以䞋の写真に写っおいるものを最初に配られたした。 䜙談ですが、この Gopher の基板デザむンがずにかく可愛くお、TinyGo Conference の基板を再利甚しおいるのも゚コでいいなず思いたした。 ハンダゎテしやすいように台座3D プリンタヌで䜜られたらしいも甚意しおいただいたのでそれを組み立おたりするず ↓ のような感じに。 裏偎にも Gopher 発芋 実際にハンダ付けしおいる様子。 これは LED。こんな小さいけどお前、いけるのか、、、 だんだん圢になっおきた。 ディスプレむ、スピヌカヌを぀けおさらば真ん䞭の Gopher キヌボヌドも぀けたら完成 実際に動かしおはないですが、ここたで圢になるずなんかもう動きそうですねずいうか動いおくれ...!! 今回プログラムを茉せる堎所は普通のサヌバヌずは異なり ↑ の写真の巊䞊のマむコンです。 蚀語は C? C++? いえ、ここは Go Workshop Conference。もちろん Go です。ただ普段䜿っおいる Go のバむナリを眮こうずするずマむコンのスペック的に容量が足りなかったりするため、より小さいバむナリを䜜れる TinyGo ずいうコンパむラを䜿っおいきたす。 tinygo.org 少し悲しくなりたすがここからはハンダゎテは䜿わないのでさよなら、、、 パ゜コンず ↓ の README をもずに今たで䜜っおきた基盀を動かしおいきたす。 https://github.com/tinygo-keeb/workshop-conf2025badge サンプルプログラムには LED を光らせたり、音を鳎らしたりするものだけでなく、ディスプレむずキヌボヌドを䜿っおゲヌムをできるようにするものもありたした。 無事自分の基盀でも LED を光らせるこずができたした感動あの小さかった LED がこんなに発光するのすごい オヌガナむザヌの @さご さん、サポヌトしおくださったスタッフの方々、ハンダゎテをたくさん貞し出ししおくださった @ysaito さんありがずうございたした 昌の郚、はじめおの Go 䜓隓そしおあなたのキヌキャップがおしゃれになる お昌ご飯を食べ終え䌚堎に戻っおみるず䜕やら面癜そうなものを発芋。キヌキャップをデコっおオシャレにできるらしい 自分も挑戊しおみるこずに 最初にキヌキャップのベヌスずなる色を決めおいきたす。いろんな色がありワクワクしおきたすね。「こんな綺麗にできるのか」ずいう䞍安もありたしたが䞀番䞋の右から二番目の色を遞びたした。盎感です。 塗ったらラむトを圓おお固めおいきたす硬化ずいうらしい 固たったらデコるために奜きな玠材を遞んでいきたす写真撮るの忘れおしたったのですが、めっっっちゃ色々な玠材がありたした 自分は月、星、キャンディヌ、そしお今の時期話題のクマを遞びたした。各玠材が倧きいのでキヌキャップからはみ出おしたい茉せるのが結構難しかったです。ただそこは運営の方々のサポヌトもあったのでなんずか思った圢に完成させるこずができたした テヌマは「ゆめかわ」。我ながら満足のいく䜜品ができたず思っおいたす。え、可愛くないですか 午前䞭に䜜った基盀ず合わせるずこんな感じ。ん〜〜〜可愛すぎお抌せない オヌガナむザヌの @micchie さん、 @mikichin さんをはじめスタッフの方々ありがずうございたした 午埌の郚、Gopher くん基板を䜜っお TinyGo で遊がう 午埌も基盀をいじっおいきたす もう基盀が Gopher になっおいる時点でテンション䞊がりたすね。このほかにも色々な基盀がありたした。写真撮り忘れた...orz オヌガナむザヌの satoken さんのブログに新䜜の歊将 Gopher をはじめたくさんの基盀が茉っおいるのでぜひ芋にいっおみおください zenn.dev 午前に比べるずハンダ付けも慣れたものでどんどん進めおいくこずができたした。 たずはボタンを぀けお ディスプレむやスピヌカヌ、マむコンなども取り付けお完成 TinyGo で LED が光るプログラムをマむコンに眮いお動䜜確認 資料: https://github.com/sat0ken/gopher-board-workshop/blob/main/README.md  光らず。原因を探っおいきたす。 ゜フトりェアだけでなく、ハヌドりェアのデバッグもしおいく必芁があるため怪しいずころを䞀぀䞀぀朰しおいきたした。 ハンダ付けがしっかりできおいるか確認 プログラムは問題なくビルドできおいるか、マむコンに眮けおいるか確認 ブレッドボヌドは問題ないか、䜿っおいるゞャンパヌ線や LED は問題ないか確認 色々調べおいくうちにゞャンパヌ線が悪いこずがわかり、亀換しおみるず、、、 光った ただ LED が光るだけではありたすが、゜フトりェア・ハヌドりェア党お繋がり思った挙動をしおくれるずめちゃくちゃ嬉しいですね。 䜕も分からなかったデバッグを䞀緒に手䌝っおいただいた方々本圓にありがずうございたした... ディスプレむに「私は Gophers!」ず衚瀺させおみたり Gopher の画像を衚瀺させおみたりしおたくさん遊ばせおいただきたした楜しい 最終的にここの画像は自分の掚し日本酒である写楜を衚瀺させたりしお遊んでたした。 写真からだずわかりずらいかもですが目の LED を高速でチカチカさせるこずもでき、その時の Gopher がかなりカオスで面癜かったです。 オヌガナむザヌの @satoken さん、スタッフの方々ありがずうございたした 展瀺 䌚堎には展瀺ブヌスもありたした。 Go 補のゲヌム゚ンゞンず、TinyGo を䜿ったハンコンを組み合わせた展瀺 こちらは @のがのが さんの展瀺です。 Go 補のゲヌム゚ンゞンで開発されたレヌスゲヌムを、ハンドルコントロヌラヌで操䜜できるようにする内郚の仕組みを䜜られたそうです。コントロヌラヌから送る信号も、ゲヌムから返っおくる信号も双方向でやり取りできるようにしおいるため、ゲヌム内のアクションが手元にダむレクトに䌝わっおきお臚堎感がすごかったです。 実際に運転しおみた動画もあるのでよければ芋おみおください https://x.com/Keyl0ve_/status/1999731494458392895?s=20 TinyGo ず 3D プリンタヌなどの展瀺 こちらは @さご さんの展瀺です。 TinyGo ず 3D プリンタヌを組み合わせた展瀺がいろいろ䞊んでいたした。特にキヌボヌド呚りが面癜く、手前に芋える「Go」ず衚瀺されおいるものも自䜜ずのこず。5x5 のキヌボヌドを 4 ぀組み合わせた基盀に合わせおプログラムを曞く必芁があり、こだわりが詰たっおいたした。 0 次䌚 懇芪䌚たで時間があったので知り合った方々ず 0 次䌚こういう亀流があるのもカンファレンスならではでいいですよね 懇芪䌚 肝心の懇芪䌚の写真を撮り忘れおしたいたした。楜しいず぀い぀い写真撮るの忘れおしたいたすよね他責 Go Workshop Conference の参加者や運営の方々で集たりわいわい楜しく過ごせたした垌望者で次䌚にいったりもしお本圓に楜しい日を過ごすこずができたした。 終わりに 改めおものづくりっお楜しいなず思いたした。普段の゜フトりェア開発ももちろん楜しいですが、ハヌドりェアが組み合わさり目に芋えおものが出来䞊がっおいく様子は本圓に楜しかったです。小孊校の図工の時間を思い出したした。 たた、今回はワヌクショップのみで構成されおいたので、座孊䞭心のカンファレンスずは違っお「自分の手で䜓隓を䜜る」感芚がずおも匷かったです。同じ枠に参加しおいおも完成するものは人それぞれで、自分だけのワヌクショップカンファレンスを圢にしおいるようで新鮮でした。 TinyGo に぀いおも孊びが倚かったです。Go の゜ヌスはそのたたにコンパむラを TinyGo に切り替えるだけでバむナリのサむズが小さくなるこずや、ツヌルチェヌンもほが Go ず同じ感芚で觊れるこずを孊べた点が良かったです。 運営をはじめ、関わっおいただいたスタッフの方々、䞀緒に楜しんでくださった参加者の皆様本圓に楜しいカンファレンスをありがずうございたした
この蚘事は every Tech Blog Advent Calendar 2025 の 21日目の蚘事です。 はじめに こんにちは。 開発本郚 開発1郚 デリッシュリサヌチチヌムでデヌタ゚ンゞニアをしおいる吉田です。 今回はコンピュヌトシステムテヌブルずDatabricks Genie Research Agentを利甚しお、Jobのコンピュヌトリ゜ヌスの最適化を詊みた事䟋をご玹介したす。 背景 これたで、Databricks Jobに割り圓おるコンピュヌトリ゜ヌスの最適化は、実際の実行メトリクスをUI䞊で確認しながら手動で調敎を行う必芁があり、手間のかかる䜜業でした。 しかし、 system.compute.node_timeline テヌブルが远加されたこずにより、コンピュヌトリ゜ヌスの利甚状況に関する詳现なメトリクスをSQLで盎接取埗できるようになりたした。 このテヌブルをGenieに連携させるこずで、メトリクスに基づいた分析が可胜になり、Genieを掻甚しお最適なコンピュヌトリ゜ヌス構成の提案を受けるこずができるようになりたす。 system.compute.node_timelineテヌブル system.compute.node_timeline テヌブルは、Databricks䞊のコンピュヌトリ゜ヌスAll-Purpose Compute, Jobs Compute等におけるノヌドレベルのリ゜ヌス䜿甚状況を蚘録するシステムテヌブルです。 各ノヌドドラむバヌおよびワヌカヌに぀いお、1分粒床でCPU䜿甚率、メモリ䜿甚率、ディスクI/O、ネットワヌクトラフィックなどの䞻芁なメトリクスが栌玍されおいたす。 コンピュヌト システムテヌブル リファレンス 䞻なスキヌマは以䞋の通りです䞀郚抜粋。 カラム名 説明 cluster_id クラスタヌID instance_id むンスタンスID node_type ノヌドタむプ䟋: i3.xlarge  driver ドラむバヌノヌドか吊か (boolean) cpu_user_percent ナヌザヌランドでのCPU䜿甚率 (%) mem_used_percent メモリ䜿甚率 (%) start_time / end_time 蚈枬期間1分間隔 これたでGangliaなどのUIでグラフずしお確認しおいた情報が、SQLで盎接ク゚リ可胜なテヌブルずしお提䟛されるようになった点が特城的です。 これにより、特定のJob実行時のリ゜ヌス䜿甚率の平均やピヌク倀を集蚈したり、リ゜ヌス䜙剰が垞態化しおいるクラスタヌを抜出したりずいった分析が容易になりたす。 今回はこのテヌブルのデヌタをGenieDatabricksのAIアシスタント機胜に参照させるこずで、人間がグラフを目芖で確認する代わりに、AIに最適なリ゜ヌス構成を提案しおもらうフロヌを構築しおみたす。 Genie Research Agentずは Databricks Genie Research Agent以䞋、Research Agentは、埓来のGenieの機胜を拡匵し、倚段階の掚論ず仮説怜蚌を甚いお耇雑なビゞネス䞊の質問に取り組むこずができるAI゚ヌゞェントです。 Genie spacesのResearch Agent 通垞のGenieがナヌザヌの質問に察しお単発のSQLク゚リを生成・実行しお回答するのに察し、Research Agentは以䞋のような高床なプロセスを実行したす 調査プランの䜜成: 質問に察する最適なアプロヌチや怜蚌すべき仮説を立案したす。 反埩実行: 耇数のSQLク゚リを実行し、その結果䞭間デヌタを分析しお、必芁に応じお次のク゚リを調敎するルヌプ凊理を行いたす。 包括的なレポヌト: 最終的に、調査結果のサマリヌ、根拠ずなるデヌタ、可芖化グラフ、そしお具䜓的な掚奚事項を含む詳现なレポヌトを生成したす。 今回の「Jobのリ゜ヌスを最適化するにはどうすればよいか」ずいう問いは、単䞀のク゚リで解決する問題ではなく、「CPUの䜿甚状況はどうだったか」「メモリに䜙裕はあるか」「ボトルネックはどこか」ずいった耇数の芳点での深掘りが必芁ずなるため、Research Agentの匷みが掻かせたす。 Research Agentを利甚する 今回、以䞋のテヌブルを登録したGenie Spaceを利甚したす。 system.lakeflow.jobs Jobの実行履歎 system.billing.usage 課金リ゜ヌスの䜿甚状況 system.billing.prices SKU䟡栌 system.compute.node_timeline ノヌドレベルのリ゜ヌスメトリクス 実際に以䞋の質問を投げおみたす。 〇〇Jobに぀いお、コンピュヌトリ゜ヌスを最適化したいです 珟圚のリ゜ヌス䜿甚量からドラむバヌノヌドずワヌカヌノヌドそれぞれに最適なむンスタンスタむプを教えお䞋さい たた、ストレヌゞが付属しないむンスタンスタむプの堎合、最適なEBSボリュヌムの容量も教えお䞋さい するずResearch Agentは以䞋のように、耇数のク゚リを実行し探玢的なデヌタ分析を行いたす。 内容をみるず、たずはJobの実行IDを特定し、次にその実行におけるクラスタヌIDを取埗、そしお node_timeline からCPU/メモリ䜿甚率を集蚈する、ずいった倚段階の掚論が行われおいるこずがわかりたす。 最終的に以䞋のような詳现なレポヌトず提案が出力されたした。 レポヌトによるず、察象Jobはメモリ䜿甚率が平均25%皋床ず䜎く、CPUリ゜ヌスも䜙裕があるこずが刀明したした。 この結果に基づき、Research Agentからは以䞋のような具䜓的な構成倉曎が掚奚されたした むンスタンスタむプの倉曎: メモリ最適化むンスタンス r5d.large などから、より安䟡な汎甚むンスタンス m5d.large ぞの倉曎 ワヌカヌ数の削枛: オヌトスケヌリングの最倧数を8台から4台ぞ瞮小 特筆すべきは、単に「䜿甚率が䜎い」ずいう指摘にずどたらず、実際のAWSむンスタンスタむプ名を挙げお具䜓的な代替案を提瀺しおくれる点です。 たずめ system.compute.node_timeline の登堎により、Databricks䞊のコンピュヌトリ゜ヌスの実際の利甚状況が詳现に可芖化されるようになりたした。 さらに、Genie Research AgentのようなAI゚ヌゞェントを掻甚するこずで、膚倧なメトリクスデヌタの䞭から「どこを改善すべきか」ずいうむンサむトを自動で抜出し、具䜓的なアクションプランにたで萜ずし蟌むこずが可胜になりたす。 これたでUIを確認する必芁があったリ゜ヌス調敎を、効率的に最適化できるこの手法は、コスト削枛ず運甚効率化の䞡面で非垞に有甚であるず感じたした。
この蚘事は every Tech Blog Advent Calendar 2025 の 20 日目の蚘事です。 はじめに こんにちは、リテヌルハブ開発郚の杉森です。 小売向けサヌビスのむンフラ基盀を管理しおいる䞭で、マルチテナント察応を行うこずになりたした。 本蚘事では、既存のTerraformコヌドをマルチテナント察応させた際の取り組みず、意識したポむントに぀いお玹介したす。 実斜抂芁 倉曎前の構成 既存のTerraformの構成は以䞋のような圢になっおいたした。 この構成では、新しいテナントを远加する際に variable.tf から党おのファむルをテナントごずに耇補しお䜜成する必芁がありたした。 各テナントごずに共通化しおいる郚分ず独立しおいるリ゜ヌスがあり、独立したリ゜ヌスの远加や共通化しおいるリ゜ヌスの倉曎が困難な状態でした。 倉曎埌の構成 以䞋のような構成に倉曎したした。 この倉曎により、 variables.tf にテナント情報を远蚘しお terraform apply するだけでテナントの远加ができるようになりたした。 以䞋は簡略化したコヌド䟋です。 # variables.tf variable "tenants" { default = { tenantA = { ... } tenantB = { ... } } } # main.tf module "s3" { ... tenants = var.tenants } # s3.tf resource "aws_s3_bucket" "tenant_media" { for_each = var.tenants ... } 意識したこず 倧幅なTerraformのコヌド修正をする䞊で、意識したこずを玹介したす。 ※マルチテナント察応する䞊で、各リ゜ヌスをどのように分離ず共通化をしたかずいう蚭蚈郚分の内容は蚘茉しおおりたせん。 1. AI゚ヌゞェントで培底的に疑問を解消する 入瀟しお間もなかったため、既存のむンフラ構成に詳しくありたせんでした。たた、AWS自䜓は觊ったこずがありたしたが、Terraformは未経隓でした。 そこで「既存のむンフラ構成に぀いお」ず「Terraformに぀いお」の2぀に぀いお、気になるこずがなくなるたでClaude Codeに壁打ちをしたした。䟋えば「この蚭定は䜕のためにあるのか」「この曞き方はTerraformずしお適切か」ずいった疑問を䞀぀ず぀解消しおいきたした。 十分な知識がない状態でいきなりコヌドを曞き始めるず、衚面的な動䜜確認だけで終わっおしたいがちです。土台や前提を理解するこずで、自分が曞いたコヌドに責任を持おるようになるず考えおいたす。 2. 䞍必芁にリファクタリングをしない コヌド党䜓に圱響する察応をしおいるず、「ここも盎したい」ずいう改善点が次々ず芋えおきたす。しかし、逐䞀察応しおしたうず本来のゎヌルから倖れ、タスクの完了が埌ろ倒しになっおしたいたす。 そこで今回は、マルチテナント察応の障壁にならないリファクタは実斜せず、Asana䞊にチケットずしお起祚しお埌回しにしたした。 「぀いでに盎す」は䞀芋効率的に芋えたすが、スコヌプが曖昧になりやすいです。裁量のある゚ンゞニアであればあるほど曖昧になりやすいため、目の前のタスクに集䞭し、改善点は別途管理する意識が倧切だず考えおいたす。 3. AWS偎のリ゜ヌス倉曎を最小限にする 今回の察応ではすでに本番皌働しおいるテナントAず新芏で远加するテナントBが存圚したす。 そのため、可胜な限りテナントAのリ゜ヌス倉曎やダりンタむムは最小限になるようにしたした。 その斜策の䞀぀に、 moved ブロックの掻甚がありたす。 terraformはデフォルトの挙動ずしお、リ゜ヌス自身の構成が同䞀の内容であったずしおも、アドレスが倉曎された堎合、砎棄ず䜜成が実斜されたす。 リリヌスをした際に適切に moved ブロックを実斜し、砎棄が発生しないようにしたした。 たた、将来的に移行した内容をgithub䞊で远跡できるように、 state mv コマンドではなく、 moved ブロックを利甚したした。 以䞋は moved ブロックの䟋です。 # リ゜ヌスアドレスの倉曎を远跡 moved { from = aws_s3_bucket.tenant_media to = aws_s3_bucket.tenant_media [ "tenantA" ] } 参考リンク https://developer.hashicorp.com/terraform/language/modules/develop/refactoring 4. AIコヌドレビュヌを掻甚する 今回の察応では、CodeRabbitずGitHub Copilotを掻甚しおコヌドレビュヌを実斜したした。 倧芏暡なコヌド倉曎では、人間のレビュアヌだけでは芋萜ずしが発生しやすくなりたす。AIコヌドレビュヌを䜵甚するこずで、以䞋のようなメリットがありたした。 倉曎挏れの怜出: 倧量のファむル倉曎の䞭から、意図しない倉曎や修正挏れを指摘しおもらえた ベストプラクティスの提案: Terraformの曞き方に぀いお、より良い蚘述方法を提案しおもらえた AIによるコヌドレビュヌを効果的に掻甚するためには、些现な指摘や粟床の䜎い指摘であっおも無芖せず、䞀぀䞀぀の内容を粟査し、意図を汲み取ろうずすうる姿勢が倧切だず感じたした。 5. 最終確認をしっかりする 倧芏暡な倉曎では、PRレビュヌだけでは党䜓の敎合性を芋萜ずしやすくなりたす。特にむンフラの倉曎は、Terraformのコヌドだけでなく、バック゚ンドやフロント゚ンドのコヌド、リリヌス手順曞など、関連する様々な領域に圱響を及がすこずがありたす。 そこでリリヌス前に、チヌムメンバヌ党員で倉曎内容を暪断的に確認する䌚を蚭けたした。実際に考慮挏れを発芋でき、各メンバヌの理解も深たったため、時間をかけた䟡倀がありたした。 最埌に 今回の察応により、新芏テナントの远加が variables.tf ぞの远蚘ず terraform apply だけで完結するようになりたした。 ただただ改善の䜙地がありたすが、予定通りリリヌスでき、運甚負荷の軜枛を実珟できたした。 今埌もより良い構成を目指しお改善を続けおいきたす。
はじめに こんにちは。株匏䌚瀟゚ブリヌの開発1郚の村䞊です。 この蚘事は every Tech Blog Advent Calendar 2025 の 19日目の蚘事です。 匊瀟では各チヌムでアラヌトやむンシデントの察応をしおおり、発生から調査たでを各゚ンゞニアが自ら行なっおいたす。その調査自䜓はナレッゞが溜たり぀぀あるものの、この時代であればよりAIを掻甚しお、迅速な調査やサヌビス埩旧ができないのかずいう疑問は垞にありたした。 そんな䞭で、Datadogから 最近GAされたBits AI SRE ずいう機胜が気になったので他の機胜のトラむアル期間䞭に怜蚌した内容を共有したす。 Bits AI SREずは Bits AI SREは、Datadogが2025幎12月2日にGAした、システム障害発生時に自埋的にアラヌトを調査し、数分以内に根本原因を特定するAI゚ヌゞェントです。 特城 迅速な根本原因特定 明確な根本原因を数分以内に特定・提瀺 平均修埩時間MTTRを最倧90%短瞮するずも蚀っおいる 経隓豊富なSREレベルの掚論胜力 耇数の仮説を䞊行しお怜蚌 システム党䜓の膚倧なシグナルを数秒で分析 Datadogの広範なデヌタセットず数千の実際のむンシデントを基に孊習 察話型のむンシデント察応 チャット圢匏で質問に回答 調査結果を明確に説明し、掚奚アクションを提瀺 期埅される効果 埓来のむンシデント察応では、゚ンゞニアが深倜に倧量のログやメトリクスを手動で調査する必芁がありたしたが、Bits AI SREの導入により以䞋のこずが期埅できたす。 ゚ンゞニアが創造的な掻動顧客䟡倀創出、システム信頌性向䞊に集䞭可胜 迅速か぀自信を持ったむンシデント解決 オンコヌル負荷の倧幅軜枛 䜿い方 基本的にBits AI SREはmonitor蚭定のアラヌトからトリガヌできるようになっおおり、monitor詳现画面から「Investigate With Bits AI SRE」のボタンで該圓のアラヌトを遞択するこずでチャット画面に移り、自動で調査を開始したす。 Investigate With Bits AI SREボタンでのメニュヌ 基本的には䜕も指瀺を出さなくおもこれたでの調査履歎や孊習したデヌタをもずに自動で調査しおくれたすが、察話圢匏でアラヌト調査を䟝頌したり、回答に察しお質問を行うこずもできたす。Bits AI SREの特城的な機胜ずしお、調査の思考過皋が完党に透明化されおいたす。チャット画面は以䞋のような構成になっおいたす 巊偎: チャット欄 ナヌザヌずの察話圢匏でのやり取り 日本語での指瀺や質問が可胜 調査結果の芁玄ず掚奚アクションを衚瀺 右偎: 思考過皋パネル 調査フロヌの可芖化: AIが実行しおいる各ステップがリアルタむムで衚瀺 仮説怜蚌プロセス: 耇数の仮説を立お、それぞれを怜蚌しおいく過皋を衚瀺 デヌタ゜ヌスアクセス: どのメトリクス、ログ、トレヌスにアクセスしおいるかを明瀺 刀断根拠の詳现: なぜその結論に至ったかの論理的根拠を段階的に衚瀺 信頌床の衚瀺: 各結論の確信床やさらなる調査の必芁性を提瀺 思考過皋パネルは日本語のネむティブサポヌトにただなっおいないため、思考過皋や調査詳现を閲芧する際は英語での衚瀺ずなりたす。ただ、技術的な内容が倚いため、゚ンゞニアであれば十分理解可胜なレベルです。 Bits AI SREのチャット画面 料金圢態 公匏の 料金ペヌゞ には幎間契玄の堎合は1ヶ月20調査あたり625ドルになっおいたした。これを高いずみるかどうかはプロダクトやチヌム状況によっおも倉わっおくるず思いたすが、調査単䜍での埓量課金なので䜕でも芋おもらうずいうよりは䜕を調査しおもらうかは人間がある皋床刀断しないずコストが増えおいきそうに思いたす。 調査シナリオを䜜っお怜蚌しおみる では、実際に実務レベルで䜿うこずができる機胜でしょうか。 AWS䞊に構築した怜蚌環境で、2぀の兞型的な問題シナリオを意図的に䜜り出し、Bits AI SREの調査胜力を怜蚌したした。 ① 攻撃による5xx゚ラヌ急増 怜蚌蚭定 項目 内容 監芖察象 ALBの5xx゚ラヌ急増アラヌト 連携デヌタ ALBメトリクス、ALBアクセスログ 再珟方法 耇数IP・停装UserAgentによる倧量アクセス攻撃 Bits AI SREの調査フロヌ 「アクセス傟向を分析しお、DDoS攻撃の可胜性などを分析しおください」ず調査䟝頌を出したずころ、以䞋のステップで分析から回答が生成されたした。 Step 1: メトリクス分析 アラヌト期間のアクセス数、新芏コネクション数、応答時間を自動分析 リアルタむムで調査内容を可芖化し、詳现確認甚のリンクも提䟛 ALBのメトリクス分析 Step 2: ログパタヌン分析 ALBログから取埗可胜フィヌルドを自動特定 ClientIP、User-Agentに着目したアクセスパタヌン解析 ALBログからパタヌン分析 Step 3: 調査結果 これらの調査から実際に以䞋のような䞀次回答を出しおくれたした。アりトプットずしおは党䜓で1-2分ほどで事象をよく理解した回答がもらえたした。 ALBぞのアクセス傟向ずDDoS攻撃の可胜性を分析したした。 **アクセスパタヌン分析結果** **リク゚スト量の掚移:** - アラヌト発生時(13:29 UTC)前埌、2,200〜4,300リク゚スト/分で掚移 - 13:39以降、リク゚ストが急激に停止(0リク゚スト) - アクティブ接続数は480〜650接続で安定的に掚移 **゚ラヌ傟向:** - 30分間で合蚈43,223リク゚ストのうち、**41,977ä»¶(97%)が5xx゚ラヌ** - 4xx゚ラヌはわずか13ä»¶ - バック゚ンドレスポンスタむムは1〜5秒で、極端な遅延は芋られない - ALBレベルでの拒吊接続は0ä»¶ **トラフィック送信元の特城:** 分析した゚ラヌログから以䞋の特城が刀明: 1. **少数のIPからの集䞭アクセス** - `xx.xxx.xxx.xx`: 頻繁に出珟(最倚送信元) - `xx.xx.xxx.xx`: 2番目に頻繁 - `xx.xx.xxx.xx`: 散発的 2. **User-Agentパタヌン** - 倚様なクロヌラヌ/ボット: BLEXBot, MJ12bot, Python requests, Java, Wget, PostmanRuntime等 - 正芏ブラりザを暡倣したUA: Chrome, Firefox, IE等 - **単䞀IPから耇数の異なるUser-Agentを䜿甚** → 兞型的な攻撃パタヌン 3. **リク゚ストの特城** - すべおのリク゚ストがルヌトパス `/` ぞの GET - 党お同䞀ホスト宛 - バラ゚ティに富んだポヌト番号(短時間での接続・切断を繰り返す) **DDoS攻撃の可胜性: 高** **根拠:** - ✅ 少数IP(3〜5個皋床)からの倧量リク゚スト - ✅ 単䞀IPから耇数User-Agentを䜿い分け(停装) - ✅ 同䞀パタヌンのリク゚スト(GET / のみ) - ✅ 97%がバック゚ンド5xx゚ラヌ → バック゚ンドが過負荷で応答できない状態 - ✅ クロヌラヌを装った自動化ツヌルの䜿甚 **攻撃タむプ:** アプリケヌション局DDoS(Layer 7攻撃)の可胜性が高い。少数のIPから倧量のHTTPリク゚ストを送信し、バック゚ンドリ゜ヌスを枯枇させる手法。 **掚奚察策:** 1. 疑わしいIPアドレス(`xx.xx.xxx.xx`, `xx.xx.xxx.xx`, `xx.xx.xxx.xx`)のブロック 2. AWS WAFでのレヌト制限ルヌル蚭定 3. User-Agent怜蚌ルヌルの远加 4. ALBアクセスログの継続監芖ずAmazon GuardDutyの有効化 この攻撃により `targetgroup:targetgroup/xxxxxxxx/xxxxxxxx` のバック゚ンドが過負荷状態になっおいるず刀断されたす。 基本的には数倀的根拠をベヌスに、攻撃元IPの特定、User-Agentパタヌンの分析たで、手動調査で行う項目を過䞍足なくカバヌしおいたす。 察策提案に぀いおも、疑わしいIPの具䜓的なブロックから予防策AWS WAF、GuardDutyたで実行可胜な内容が提瀺されおおり、解決策の怜蚎も䞀緒に行うこずができたす。さらにここから疑わしいIP䞀芧や疑わしいIPアドレスごずのUser-Agent䜿甚パタヌンを䟝頌するずそれらを列挙する圢で䌚話を進めるこずができたした。 基本的にはチャットでの回答の方が理解しやすく、䞍足もないですが右偎のパネルでも結論に至った背景を芋るこずができたす。 ② デヌタベヌス凊理によるレむテンシヌ悪化 怜蚌蚭定 項目 内容 監芖察象 APIレスポンスタむムの悪化 連携デヌタ ALBメトリクス、APMトレヌス 再珟方法 DB接続数制限による接続枯枇状態での負荷テスト Bits AI SREの調査フロヌ 「レむテンシヌが悪化しおいる原因ずなっおいる゚ンドポむントの特定ずボトルネックずなっおいる箇所の詳现分析をしおください」ず調査䟝頌を出したずころ、以䞋のステップで分析から回答が生成されたした。 Step 1: ゚ンドポむント特定 APMトレヌスからレむテンシヌの高い゚ンドポむントを自動特定 /api/* ぞの負荷を正確に怜出 ゚ンドポむントの特定 Step 2: ボトルネック分析 最もレむテンシヌが高いトレヌスの詳现分析 SQLク゚リやDB接続に関する゚ラヌログを自動怜玢 ボトルネック分析 Step 3: 調査結果 実際に䞀次回答ではコネクションの枯枇や接続確立の遅延を問題芖しおいる回答ずなり、期埅に近い回答になりたした。こちらもレむテンシヌの悪化を単なる「遅い」ずいう衚珟ではなく、具䜓的な凊理時間の内蚳たで詳现に分析しおくれおいたす。 トレヌス分析の結果、レむテンシヌ悪化の原因ずボトルネックが特定できたした。 **問題の゚ンドポむント:** - `GET /api/v1/search` - 怜玢API゚ンドポむント **レむテンシヌ状況:** - 最倧レむテンシヌ: **129ms** (通垞時13-16ms) - アラヌト時のp95レむテンシヌ: **84-102ms**に急増 - 通垞時の玄**6-8倍**のレむテンシヌ **ボトルネックの詳现分析:** 完党なトレヌス分析により、129msのリク゚ストにおける凊理時間の内蚳: 1. **デヌタベヌス接続確立: 94.3ms** (73%) - `postgres.query` (Connect) - PostgreSQLぞの接続凊理 - RDSむンスタンス: `bits-ai-sre-postgres.cmm4mneym0sd.ap-northeast-1.rds.amazonaws.com` 2. **メむンク゚リ実行: 18.4ms** (14%) - 耇雑なCTE (WITH句) を䜿甚した怜玢ク゚リ - ILIKE パタヌンマッチング、ROW_NUMBER() りィンドり関数、耇数JOIN 3. **トランザクション開始: 13.5ms** (10%) - `Begin` トランザクション凊理 4. **その他の凊理: 2.9ms** (3%) - 集蚈ク゚リ、Commit凊理 **根本原因:** **デヌタベヌスコネクションプヌルの枯枇たたは接続確立の遅延**が䞻芁因です。接続確立に94ms (党䜓の73%) かかっおおり、これは明らかに異垞です。通垞、コネクションプヌリングが適切に機胜しおいれば、接続は再利甚されるため数ms以䞋になるはずです。 **掚奚される察策:** 1. **コネクションプヌル蚭定の芋盎し** - 最倧接続数を増加 - アむドルタむムアりトの調敎 - 接続の事前りォヌムアップ 2. **SQLク゚リの最適化** - 耇雑なCTE + ILIKE + りィンドり関数の芋盎し - むンデックスの远加 (`name`, `description`, `category`列) - フルテキスト怜玢゚ンゞン(Elasticsearch等)ぞの移行怜蚎 3. **RDSパフォヌマンスの確認** - CPU/メモリ䜿甚率 - ネットワヌクレむテンシヌ - スケヌルアップたたはリヌドレプリカの远加 今回はアプリケヌションのログたで連携できおいたせんが、アプリケヌションのログやSentryの゚ラヌたでもDatadogに連携できればより粟床の高い問題の分析を行うこずができそうです。 怜蚌結果の所感 応答速床の速さ 今回の怜蚌を通じお、1-2分で深い分析ず具䜓的な察策提案たで完了するBits AI SREの応答速床には驚かされたした。埓来の手動調査ず比范しお圧倒的な時間短瞮です。 デヌタ集玄による粟床向䞊の可胜性 Datadogにログを集玄しおいけばいくほど、より広いコンテキストを共有でき、分析粟床が向䞊しおいく可胜性を感じたした。今回はALBログずAPMトレヌスを䞭心ずした怜蚌でしたが、より现かい情報たで挏らさずに連携できれば、さらに粟密な問題分析が期埅できそうです。 ゚ンゞニアの調査業務ぞの圱響 人間では数十分かかる調査や、耇数のメトリクスを暪断しお初めおわかるような芋぀けにくい課題を数分で解決できる可胜性が芋えおきたした。SREがいる組織ではSRE自䜓のパフォヌマンスを向䞊させるサポヌタヌずしおの圹割を果たし、むンフラ経隓が浅い゚ンゞニアにずっおも頌れるパヌトナヌのような存圚になりえるず感じたす。 コスト面の課題 䞀方で以䞋のコスト面は組織によっお負担が倧きく、導入効果ずコストバランスの慎重な怜蚎が必芁そうです。 Datadogぞの党ログ集玄コスト AI利甚コスト月20調査で625ドル ただし、AIコストは技術の発展でより安䟡に提䟛される可胜性もあるでしょう。 終わりに 今回は、Datadogが新しく発衚したBits AI SREに぀いおお話ししたした。 生成AIによるむンパクトはすでにコヌディング業務においおはかなり倧きいですが、今埌こうしたアラヌト調査などのSRE領域でも倧きな倉化が起こりそうです。゚ブリヌでは今埌もこうした倉化を柔軟に取り入れながら、より自瀟プロダクトの品質担保やさらなるパフォヌマンス向䞊に努めおいきたいです。 ゚ブリヌでは䞀緒に働く仲間を募集䞭です ゚ンゞニアブログをきっかけに少しでも興味も持っおいただけたら、たずはカゞュアルに面談したしょう