Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コーディングエージェントに 独自Extension書かせてみた
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ikeda-masashi
December 17, 2025
Technology
95
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
コーディングエージェントに 独自Extension書かせてみた
Jagu'e'r データ利活用分科会 Looker User Meetup Part 5
ikeda-masashi
December 17, 2025
More Decks by ikeda-masashi
See All by ikeda-masashi
Redshiftを中心としたAWSでのデータ基盤
mashiike
0
360
運用の役立たないダッシュボードの作り方。
mashiike
3
1.3k
Amazon Aurora MySQL と Amazon Redshift の Zero-ETL Integration について使い所を考えてみた!
mashiike
0
1k
Warningアラートを放置しない!アラート駆動でログやメトリックを自動収集する仕組みによる恩恵
mashiike
6
5.4k
Prepalert ~Mackerelアラートにログや集計値を貼り付けてくれるトイル削減ツール~
mashiike
0
2.2k
人狼ゲームで考えるデータ基盤 〜データとはいったい・・・〜
mashiike
0
490
『エンタープライズ』という言葉の重さ 〜Data Vault 2.0をやめた2022年冬〜
mashiike
2
6.2k
Redshift ServerlessとProvisioned Cluster のちょっとした違い
mashiike
0
7.5k
「北欧、暮らしの道具店」のデータ基盤の変遷
mashiike
1
3.8k
Other Decks in Technology
See All in Technology
ラジオの科学
frievea
0
290
【Google Cloud Next Tokyo'26】Gemini Enterprise と Oracle AI Database で実現する、業務データ活用を実現する AI エージェント実装
shisyu_gaku
0
240
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
650
グローバル基準のSREは、運用現場でどう機能したか:成熟度アセスメントの実践 / SRE NEXT 2026
sorawatanabe
0
170
PLATEAU で バーチャル花火大会
tatsuya1970
0
130
ホームラボ紹介
y_sera15
0
150
AIエージェントを前提としたプラットフォーム エンジニアリング:GKEで作るAgent-Ready Golden Path
legalontechnologies
PRO
2
220
Model Studio CLI × Token Plan
maigo999
0
130
Pavlokで始める電撃駆動開発
sgrsn
0
190
【AG-UI × A2UI × MCP Apps】Generative UIをやさしく解説する
nrinetcom
PRO
1
110
『三匹の子ぶた』から学ぶネットワークセキュリティの昔と今 / Network Security: Then and Now Through the Lens of The Three Little Pigs
nttcom
1
1.8k
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.4k
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.3k
We Have a Design System, Now What?
morganepeng
55
8.3k
Building AI with AI
inesmontani
PRO
1
1.1k
Product Roadmaps are Hard
iamctodd
55
12k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
The Curse of the Amulet
leimatthew05
2
14k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
310
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Transcript
コーディングエージェントに 独⾃Extension書かせてみた 〜僕にも出来るLooker Extension開発〜 2025/12/17 Looker User Meetup ⾯⽩法⼈カヤック 池⽥将⼠
先に、会社紹介 鎌倉の地にて、主にWeb技術を 用いて 人の印象に深く残るような面白コ ンテンツを作る会社 ゲームからWebサービス、ミュージアムetc… 様々なことに挑戦
弊社の特徴
弊社の特徴
弊社の特徴 サービス‧事業のライフサイクルが短い サービス‧事業の数が多い サービス‧事業の幅が広い データ整備、混ぜるな危険
@mashiike 2016年12月にカヤックにJoin - サーバーサイドエンジニア - データエンジニア 2019年 2022年 2025年 ⾃⼰紹介
@mashiike - サーバーサイドエンジニア - データエンジニア 面白法人カヤックと『北欧、暮らしの道具店』を運営する株式 会社クラシコム様との協業プロジェクト開始 ここでLookerを初めて触る https://www.kayac.com/news/2022/09/interview_kurashicom 2019年
2022年 2025年 実は、Looker歴 6年くらい 協業先でずっと触っていた。 今年になって やっと所属会社でLooker導入 ⾃⼰紹介 https://hokuohkurashi.com/ 株式会社クラシコム様 といっしょにお仕事する中で Lookerの良さを体感
@mashiike - サーバーサイドエンジニア - データエンジニア 面白法人カヤックと『北欧、暮らしの道具店』を運営する株式 会社クラシコム様との協業プロジェクト開始 ここでLookerを初めて触る https://www.kayac.com/news/2022/09/interview_kurashicom 2019年
2022年 引き続き、株式会社クラシコム様でLookerを触わって良さ を体感する。 この頃から、カヤック本体で『Lookerいいぞぉー布教活動 を始める』 カヤックの特性上の問題で予算感が合わなくて 導入できない問題 2025年 実は、Looker歴 6年くらい 協業先でずっと触っていた。 今年になって やっと所属会社でLooker導入 ⾃⼰紹介 https://www.kayac.com/ 事業多すぎ!!! やってること バラバラ過ぎ! 事業部の予算がry
@mashiike - サーバーサイドエンジニア - データエンジニア 面白法人カヤックと『北欧、暮らしの道具店』を運営する株式 会社クラシコム様との協業プロジェクト開始 ここでLookerを初めて触る https://www.kayac.com/news/2022/09/interview_kurashicom 2019年
2022年 引き続き、株式会社クラシコム様でLookerを触わって良さ を体感する。 この頃から、カヤック本体で『Lookerいいぞぉー布教活動 を始める』 カヤックの特性上の問題で予算感が合わなくて 導入できない問題 2025年 ゲーム事業の方にアプローチして、『Looker入れてみよう か!』となる。 (今ココ) カヤックの本体でやっと Lookerが入る 所属会社に Lookerに入ったので本会への参加券 Get! 実は、Looker歴 6年くらい 協業先でずっと触っていた。 今年になって やっと所属会社でLooker導入 ⾃⼰紹介 https://www.kayac.com/ir/news 2025年12月期 第3四半期 決算説明会資料 より参照 ハイカジ調子いいね! ハイカジになら Looker入れても・・・
@mashiike 2016年12月にカヤックにJoin - サーバーサイドエンジニア - データエンジニア 面白法人カヤックと『北欧、暮らしの道具店』を運営する株式 会社クラシコム様との協業プロジェクト開始 ここでLookerを初めて触る https://www.kayac.com/news/2022/09/interview_kurashicom
2019年 2022年 引き続き、株式会社クラシコム様でLookerを触わって良さ を体感する。 この頃から、カヤック本体で『Lookerいいぞぉー布教活動 を始める』 カヤックの特性上の問題で予算感が合わなくて 導入できない問題 2025年 ゲーム事業の方にアプローチして、『Looker入れてみよう か!』となる。 (今ココ) カヤックの本体でやっと Lookerが入る 所属会社に Lookerに入ったので本会への参加券 Get! 実は、Looker歴 6年くらい 協業先でずっと触っていた。 今年になって やっと所属会社で Looker導入 ⾃⼰紹介
さて、そんな僕ですが‧‧‧ 所属会社で今年に Lookerが⼊ったので Extension開発にチャレンジ!
Looker Extension開発の敷居の⾼さ LookMLはわかるけど、 TypeScript+React.jsはわからない! 高い壁がある
そうだ! Coding Agentに書いてもらおう コレで簡単に作れる!!!
そう思っていた時期が 僕にもありました…
最⼤の落とし⽳は‧‧‧ の上で動くということ
Coding Agent( ) 普通のWeb AppのReact.jsは スイスイ書けるが‧‧‧
Extension としては その書き⽅、動かない!が多い
例えば‧‧‧ import React from 'react' import { ExtensionProvider40 } from
'@looker/extension-sdk-react' export const App: React.FC = () => ( <ExtensionProvider40> <a href="https://www.google.com" target="_blank" rel="noopener noreferrer"> Googleへ </a> </ExtensionProvider40> ) こんな単純なコードで、 単純なリンクが置いてあるだけのExtensionでも‧‧‧
例えば‧‧‧ 開けなぁああああい!!! ※見る人がみると一発で原因がわかるらしいです。
例えば‧‧‧ Errorメッセージ⾒ればわかりそうですが聞いてみます。
例えば‧‧‧ Gemini君は、Buttonに変えましょう!!!と提案します。
例えば‧‧‧ buildして再度表⽰しようとすると‧‧‧ 表⽰できなあぁぁぁあああい!
例えば‧‧‧ そして、会話すること 12回⽬…
例えば‧‧‧ import React, { useContext } from 'react' import {
ExtensionProvider40, ExtensionContext40 } from '@looker/extension-sdk-react' import { ComponentsProvider, Button } from '@looker/components' const AppContext: React.FC = () => { const { extensionSDK } = useContext(ExtensionContext40) return ( <ComponentsProvider> <Button onClick={() => { extensionSDK.openBrowserWindow('https://www.google.com', '_blank') }} > Googleへ </Button> </ComponentsProvider> ) }; export const App: React.FC = () => { return ( <ExtensionProvider40> <AppContext /> </ExtensionProvider40> ) }
例えば‧‧‧ 開けた!!! 🎉
例えば‧‧‧リンクが⼤変 なんで?? 苦戦しすぎじゃないっすか?
Looker Extensionはiframeの中 https://docs.cloud.google.com/looker/docs/extension-framework-react-and-js-code-examples?hl=ja
GEMINI.mdにはこう書きます。 # Looker Extension 開発 このアプリケーションはLooker Extension Frameworkを使って書かれるアプリケーションです。 Looker Extensionはサンドボックス化されたiframeの中で動くアプリケーションであるため、普通の
Web アプリケーションのReact.jsとは趣が異なります。 普通のWebアプリケーションの常識を疑い、参考リンクをよく調べてから、コーディングに臨んで ください。 ## 参考リンク - https://docs.cloud.google.com/looker/docs/intro-to-extension-framework?hl=ja 拡張機能の概要 - https://docs.cloud.google.com/looker/docs/extension-framework-react-and-js-code-examples?hl=ja コード例
これで、多少はマシになります。
だが、しかし、そもそも 彼ら( )は ドキュメントを調べるのが 上⼿ではない…。
そこで‧‧‧
「NotebookLM + DeepResearch」の併⽤ 餅は餅屋! 調べ物はDeepResearch
None
例: React Router 例えば、StandaloneのExtensionでページを作ろうとして、リンク押してもうまく動かん! import React, { useContext, useEffect, useState
} from 'react' import { BrowserRouter, Routes, Route, Link } from 'react-router-dom' /* ... */ export const AppContent: React.FC = () => { const { extensionSDK } = useContext(ExtensionContext40) /* ... */ return ( <ComponentsProvider theme={theme}> <BrowserRouter> <!-- ... --> <Box flex={1} p="u3" overflow="auto"> <Routes> <Route exact path="/" component={DashboardCapturePage} /> <Route exact path="/canvases" component={CanvasListPage} /> <Route exact path="/canvases/:canvasId" component={CanvasPage} /> <Route component={NotFoundPage} /> </Routes> </Box> </Box> </BrowserRouter> </ComponentsProvider> ) } こんなコードを書きがちだけど…
例: React Router DeepResearchで調べてみると、なんか⾊々と書かれているなぁ… 公式リンクがあるから眺めてみるとBrowserRouter使うなって書いてる!!!!!? https://docs.cloud.google.com/looker/docs/extension-framework-react-an d-js-code-examples?hl=ja#routing_and_deep_linking
例: React Router DeepResearchの結果をCodingAgentに与えると… こういうふうに書き換える import React, { useContext, useEffect,
useState } from 'react' import { BrowserRouter, Routes, Route, Link } from 'react-router-dom' /* ... */ export const AppContent: React.FC = () => { const { extensionSDK } = useContext(ExtensionContext40) /* ... */ return ( <ComponentsProvider theme={theme}> <BrowserRouter> <!-- ... --> <Box flex={1} p="u3" overflow="auto"> <Routes> <Route exact path="/" component={DashboardCapturePage} /> <Route exact path="/canvases" component={CanvasListPage} /> <Route exact path="/canvases/:canvasId" component={CanvasPage} /> <Route component={NotFoundPage} /> </Routes> </Box> </Box> </BrowserRouter> </ComponentsProvider> ) } CodingAgentもWeb検索ツール使うけど、大量の情報から正しい情報を探し出すのは やはりDeepResearchのほうが強かった。 import React, { useContext, useEffect, useState } from 'react' import { Switch, Route, Link } from 'react-router-dom' /* ... */ export const AppContent: React.FC = () => { const { extensionSDK } = useContext(ExtensionContext40) /* ... */ return ( <ComponentsProvider theme={theme}> <!-- ... --> <Box flex={1} p="u3" overflow="auto"> <Switch> <Route exact path="/" component={DashboardCapturePage} /> <Route exact path="/canvases" component={CanvasListPage} /> <Route exact path="/canvases/:canvasId" component={CanvasPage} /> <Route component={NotFoundPage} /> </Switch> </Box> </Box> </ComponentsProvider> ) }
こうして、 コーディングエージェントに 書かせたものが こちらになります。。。
デモ
デモ ダッシュボードのキャプチャーを撮って その上からお絵かきできるExtension
まとめ コーディングエージェントにLooker Extensionを書い てもらうには⼯夫が必要 DeepResearchとNotebookLMを⽤いてドキュメント を調べて、それをコーディングエージェントに伝える とうまくいきやすい Looker Extensionはサンドボックス化されたiframe内 で動くんだぞ!と意識させるとうまくいきやすい