Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コーディングエージェントに 独自Extension書かせてみた
Search
ikeda-masashi
December 17, 2025
Technology
0
21
コーディングエージェントに 独自Extension書かせてみた
Jagu'e'r データ利活用分科会 Looker User Meetup Part 5
ikeda-masashi
December 17, 2025
Tweet
Share
More Decks by ikeda-masashi
See All by ikeda-masashi
Redshiftを中心としたAWSでのデータ基盤
mashiike
0
280
運用の役立たないダッシュボードの作り方。
mashiike
3
1.2k
Amazon Aurora MySQL と Amazon Redshift の Zero-ETL Integration について使い所を考えてみた!
mashiike
0
960
Warningアラートを放置しない!アラート駆動でログやメトリックを自動収集する仕組みによる恩恵
mashiike
6
4.4k
Prepalert ~Mackerelアラートにログや集計値を貼り付けてくれるトイル削減ツール~
mashiike
0
2k
人狼ゲームで考えるデータ基盤 〜データとはいったい・・・〜
mashiike
0
410
『エンタープライズ』という言葉の重さ 〜Data Vault 2.0をやめた2022年冬〜
mashiike
2
5.6k
Redshift ServerlessとProvisioned Cluster のちょっとした違い
mashiike
0
6.8k
「北欧、暮らしの道具店」のデータ基盤の変遷
mashiike
1
3.6k
Other Decks in Technology
See All in Technology
MLflowで始めるプロンプト管理、評価、最適化
databricksjapan
1
230
Sansanが実践する Platform EngineeringとSREの協創
sansantech
PRO
2
870
ChatGPTで論⽂は読めるのか
spatial_ai_network
9
28k
ガバメントクラウド利用システムのライフサイクルについて
techniczna
0
190
業務のトイルをバスターせよ 〜AI時代の生存戦略〜
staka121
PRO
2
200
AWS Trainium3 をちょっと身近に感じたい
bigmuramura
1
140
5分で知るMicrosoft Ignite
taiponrock
PRO
0
370
Power of Kiro : あなたの㌔はパワステ搭載ですか?
r3_yamauchi
PRO
0
150
AIプラットフォームにおけるMLflowの利用について
lycorptech_jp
PRO
1
150
Database イノベーショントークを振り返る/reinvent-2025-database-innovation-talk-recap
emiki
0
180
エンジニアリングをやめたくないので問い続ける
estie
2
1.2k
生成AI時代におけるグローバル戦略思考
taka_aki
0
190
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
174
15k
RailsConf 2023
tenderlove
30
1.3k
Side Projects
sachag
455
43k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Designing for Performance
lara
610
69k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.3k
Scaling GitHub
holman
464
140k
GraphQLとの向き合い方2022年版
quramy
50
14k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
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内 で動くんだぞ!と意識させるとうまくいきやすい