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
ikeda-masashi
December 17, 2025
Technology
98
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
370
運用の役立たないダッシュボードの作り方。
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
500
『エンタープライズ』という言葉の重さ 〜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
プロダクトエンジニアに必要な「いい感じ」に作る能力 〜たくさん作れる時代に、どこまで作るかの決め方〜
jnishime_dresscode
1
540
Hub & Spoke 環境のネットワークルーティングを分解してみる
tsuyataku
1
510
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
1
1.7k
When Token Pruning is Worse than Random: Understanding Visual Token Information in VLLMs
sansantech
PRO
0
230
[RSJ26] NarrativeFlow: Flow-Based Vision-Language-Action Model Using Robot Velocity Fields
keio_smilab
PRO
0
130
アクセスキー流出時の対応で再認識した攻撃側と防御側の非対称性について
kazzpapa3
1
520
[RSJ26] Hierarchy-Aware Multimodal Retrieval-Augmented Generation for Embodied Question Answering
keio_smilab
PRO
1
150
Data Hubグループ 紹介資料
sansan33
PRO
0
3.2k
Kiro5兄弟のいまどきのセキュリティ基礎知識
kentapapa
0
500
V8コントリビュート超入門
riyaamemiya
0
110
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
220
Self Healing Rollouts: Automating Production Fixes with Agentic AI
kdubois
0
130
Featured
See All Featured
From π to Pie charts
rasagy
0
350
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
430
Thoughts on Productivity
jonyablonski
76
5.3k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
GitHub's CSS Performance
jonrohan
1033
470k
Designing for Timeless Needs
cassininazir
1
460
The browser strikes back
jonoalderson
0
1.6k
Deep Space Network (abreviated)
tonyrice
0
280
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内 で動くんだぞ!と意識させるとうまくいきやすい