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
Vue.jsを用いて数万の農地データ情報を数秒で表示させるまでのカイゼンの軌跡
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
OPTiM
April 26, 2024
Technology
600
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Vue.jsを用いて数万の農地データ情報を数秒で表示させるまでのカイゼンの軌跡
OPTiM
April 26, 2024
More Decks by OPTiM
See All by OPTiM
製品の問い合わせ負荷をLLMで解消したい 〜RAGで作る「自社を知っている」チャットボット〜
optim
0
13
AI エージェントシステムの開発を AI で加速させたい!
optim
0
22
既存プロダクトのRSpec カバレッジを 40% から100% にした話
optim
1
71
最近やってよかったデザインシステム運用改善3選
optim
1
89
<install>要素は何ができて、何を変えるのか
optim
1
63
CIでリグレッションテストを実行し継続的に品質を担保する
optim
1
83
Tanstack Startを触ってみての感動
optim
1
78
移行のつらさは誰が引き受けるのか── Vue.js と Next.js を比べて見えたこと
optim
2
88
Athenaが遅すぎるので Next.js 16の Cache Componentsで倒してみた
optim
1
140
Other Decks in Technology
See All in Technology
モダンフロントエンド 開発研修
recruitengineers
PRO
3
540
サイバー捜査員研修(前半)
nomizone
1
1.9k
『三匹の子ぶた』から学ぶネットワークセキュリティの昔と今 / Network Security: Then and Now Through the Lens of The Three Little Pigs
nttcom
1
1.7k
FORENSIA: ローカルLLMフォレンジックハーネス
sumeshi
2
270
侵入は突然に 〜 IoTマルウェアと悪用される家庭の機器 ~ / When Intrusion Strikes: IoT Malware and the Abuse of Home Devices
nttcom
0
1.5k
事業価値と Engineering 2026年度版
recruitengineers
PRO
41
21k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
ボトムアップ文化が強い組織で セキュリティをどう根付かせていくかの現在進行形の話 / Making Security Stick in a Bottom-Up Organization
yamaguchitk333
0
200
SnowflakeCoCoでデータエンジニアリング!
foursue
0
180
Agent 時代の Kaggle 展望 / kaggle-in-the-agentic-era
upura
1
640
Flutterをカメラで動かしたかった話
sony
1
130
20分でわかるセキュアAPI
nwiizo
0
180
Featured
See All Featured
HDC tutorial
michielstock
2
780
The agentic SEO stack - context over prompts
schlessera
0
860
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.3k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
470
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
350
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
660
Visualization
eitanlees
152
17k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Site-Speed That Sticks
csswizardry
13
1.4k
My Coaching Mixtape
mlcsv
0
200
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
410
Transcript
© 2019-2024 OPTiM Corp. All rights reserved. 1 株式会社オプティム 西村
v-Tokyo Meetup #19 2024.03.06 Vue.jsを用いて数万の農地データ情報を 数秒で表示させるまでのカイゼンの軌跡
© 2019-2024 OPTiM Corp. All rights reserved. 2 自己紹介します!
© 2019-2024 OPTiM Corp. All rights reserved. 3 西村 ソリューション開発部
農業チーム ・趣味: お菓子作り、クラフトビール 2021年入社 自己紹介 ・現在の業務:農業プロダクトのフロントエンド、バックエンドの開発を担当 現場視察 & 作業もします ・・・
© 2019-2024 OPTiM Corp. All rights reserved. 4 会社・事業紹介
カイゼンの軌跡 最後に 今日の目次
© 2019-2024 OPTiM Corp. All rights reserved. 5 会社・事業紹介
© 2019-2024 OPTiM Corp. All rights reserved. 6 アグリテック アグリテック
アグリテック デジタルヘルス デジタルコンストラクション デジタルヘルス その他 その他 その他 オフィスDX モバイルマネジメント マーケティングDX マーケティングDX 映像管理DX オフィスDX その他 プラットフォーム プラットフォーム オフィスDX OPTiMは、AI・IoT・Cloud・Mobile・Roboticsを使った 新しい価値を創造し続け、あらゆる産業のDXを推進し、 あらゆる人々に、豊かでサステナブルな未来を実現する企業です プラットフォーム
© 2019-2024 OPTiM Corp. All rights reserved. 7 • 農薬散布のデジタル化サービスを支える
アプリケーションを開発している (Vue3移行済み) • 農薬散布を効率よく進めるための機能が盛りだくさん! • 農地データのデジタル化 • 農薬散布の計画を自動作成 • 適期計算機能 etc 事業紹介(農業DX)
© 2019-2024 OPTiM Corp. All rights reserved. 8 カイゼンの軌跡
© 2019-2024 OPTiM Corp. All rights reserved. 9 本サービスにデジタルな農地データ(ポリゴンデータ)は欠かせない そのデータはGoogle
Maps API を活用し、表示している スライドでは国土地理院の地理院地図 を使用 この枠のことを ポリゴンと呼びます
© 2019-2024 OPTiM Corp. All rights reserved. 10
© 2019-2024 OPTiM Corp. All rights reserved. 11 2022年開発初期 約100
~ 300 ポリゴン/アカウント 2022年 約1000 ~ 5000 ポリゴン 2023年 約5000 ~ 10000 ポリゴン 2024年 ~ 数万 ポリゴン 本サービスの成長とともに扱うポリゴンデータ数も増えていった 扱うポリゴンデータの数
© 2019-2024 OPTiM Corp. All rights reserved. 12 本サービスの成長とともに扱うポリゴンデータ数も増えていった 扱うデータ数が増えるほど、
パフォーマンスが悪くなっていく アプリのパフォーマンスの低下 扱うポリゴンデータの数 2022年開発初期 約100 ~ 300 ポリゴン/アカウント 2022年 約1000 ~ 5000 ポリゴン 2023年 約5000 ~ 10000 ポリゴン 2024年 ~ 数万 ポリゴン
© 2019-2024 OPTiM Corp. All rights reserved. 13 どげんかせんといかん!
© 2019-2024 OPTiM Corp. All rights reserved. 14 カイゼンに着手!
© 2019-2024 OPTiM Corp. All rights reserved. 15 大きく2つのカイゼンに着手 操作性のカイゼン
表示速度のカイゼン
© 2019-2024 OPTiM Corp. All rights reserved. 16 操作性のカイゼン
© 2019-2024 OPTiM Corp. All rights reserved. 17 何をしたか?
© 2019-2024 OPTiM Corp. All rights reserved. 18 状態管理ライブラリPinia を活用する
© 2019-2024 OPTiM Corp. All rights reserved. 19 状態管理ライブラリPinia を活用する
カイゼン前 1. API で座標込みのポリゴンデータを取得 2. ポリゴンを全て生成&描画 1 2 ポリゴンデータ ポリゴンデータ ポリゴンデータ Google Map
© 2019-2024 OPTiM Corp. All rights reserved. 20 状態管理ライブラリPinia を活用する
カイゼン後 1. API で座標込みのポリゴンデータを取得 2. ポリゴンを全て生成&描画 1. API で座標込みのポリゴンデータを取得 2. ポリゴンを全て生成 して Pinia に保持 3. マップの表示領域・ズーム倍率に応じて Pinia から必要分を取得 & 描画 1 2 1 3 2 ポリゴンデータ ポリゴンデータ ポリゴンデータ ポリゴンデータ ポリゴンデータ ポリゴンデータ カイゼン前 Google Map Google Map
© 2019-2024 OPTiM Corp. All rights reserved. 21 状態管理ライブラリPinia を活用する
カイゼン後 1. API で座標込みのポリゴンデータを取得 2. ポリゴンを全て生成 して Pinia に保持 3. マップの表示領域・ズーム倍率に応じて Pinia から必要分を取得 & 描画 1 3 2 表示領域・ズーム倍率に応じて必要な情報を 取得し、描画することで余分な描画が減り、 操作性がカイゼンされた Piniaの活用により、画面跨いだ時の 再取得も不要になった 不要なwatchを除くことができた ポリゴンデータ ポリゴンデータ ポリゴンデータ Google Map
© 2019-2024 OPTiM Corp. All rights reserved. 22 表示速度のカイゼン
© 2019-2024 OPTiM Corp. All rights reserved. 23 “推測するな、計測せよ” ロバート(ロブ)・C・パイク
© 2019-2024 OPTiM Corp. All rights reserved. 24 大まかなパフォーマンス計測の結果 (数万個のポリゴンデータ)
Frontend Backend 約3.5 ~ 4.1秒 約 13 ~ 16.5秒 約17.5秒 ~ 20秒 表示不可 (Chromeが落ちる、nginxのタイムアウト…)
© 2019-2024 OPTiM Corp. All rights reserved. 25 大まかなパフォーマンス計測の結果 (約6000個のポリゴンデータ)
Frontend Backend 約3.5 ~ 4.1秒 約 13 ~ 16.5秒 約17.5秒 ~ 20秒
© 2019-2024 OPTiM Corp. All rights reserved. 26 一番時間がかかっているのはフロントエンド側だった Frontend
Backend 約3.5 ~ 4.1秒 約 13 ~ 16.5秒 約17.5秒 ~ 20秒
© 2019-2024 OPTiM Corp. All rights reserved. 27 カイゼン前の状況整理
ポリゴンデータが多い場合、ズーム倍率が低い状態で 確認する(左図) ポリゴンデータのすべての情報って不要ではないか? 取得するデータ量やデータ構造を見直す type OldPolygonInfoState = { id: string; landNumber: string; // 住所 centerCoordinate: Coordinate; // 中心座標 polygon: google.maps.Polygon; // ポリゴン isSelect: boolean; // 選択状態 }; ポリゴンの数を クラスターで表示している (ポリゴンの中心座標でカウント)
© 2019-2024 OPTiM Corp. All rights reserved. 28 カイゼン前の状況整理
ポリゴンデータが多い場合、ズーム倍率が低い状態で 確認する(左図) ポリゴンデータのすべての情報って不要ではないか? 取得するデータ量やデータ構造を見直す type OldPolygonInfoState = { id: string; landNumber: string; // 住所 centerCoordinate: Coordinate; // 中心座標 polygon: google.maps.Polygon; // ポリゴン isSelect: boolean; // 選択状態 }; ポリゴンデータは容量が多く、生成にも時間がかかる ポリゴンデータは初回表示時は必要ない
© 2019-2024 OPTiM Corp. All rights reserved. 29 データの内容からPiniaの使い方をカイゼン カイゼン前
1. API で4点以上の座標込みのポリゴンデータを取得 2. ポリゴンを全て生成 して Pinia に保持 3. マップの表示領域・ズーム倍率に応じて Pinia から必要分を取得 & 描画 カイゼン後 1. API で中心座標(1点)のみのデータを取得 ポリゴン座標は取得しない 2. ポリゴンを生成 ぜずに Pinia に保持 type OldPolygonInfoState = { id: string; landNumber: string; // 住所 centerCoordinate: Coordinate; // 中心座標 polygon: google.maps.Polygon; // ポリゴン isSelect: boolean; // 選択状態 }; type NewPolygonInfoState = { id: string; landNumber: string; // 住所 centerCoordinate: Coordinate; // 中心座標 polygon: google.maps.Polygon | null; // 初回はnull isSelect: boolean; };
© 2019-2024 OPTiM Corp. All rights reserved. 30 データの内容からPiniaの使い方をカイゼン カイゼン前
カイゼン後 1. API で中心座標のみのポリゴンデータを取得 2. ポリゴンは生成せず Pinia に保持 3. マップの表示領域・ズーム倍率に応じてAPI で座標 込みで取得し、Pinia 保持 4. 必要分を取得 & 描画 ポリゴンデータ ポリゴンデータ ポリゴンデータ 1 3 2 1 4 2 3 ポリゴンデータ ポリゴンデータ ポリゴンデータ 1. API で4点以上の座標込みのポリゴンデータを取得 2. ポリゴンを全て生成 して Pinia に保持 3. マップの表示領域・ズーム倍率に応じて Pinia から必要分を取得 & 描画 Google Map Google Map
© 2019-2024 OPTiM Corp. All rights reserved. 31 データの内容からPiniaの使い方をカイゼン カイゼン後
1. API で中心座標のみのポリゴンデータを取得 2. ポリゴンは生成せず Pinia に保持 3. マップの表示領域・ズーム倍率に応じてAPI で座標 込みで取得し、Pinia 保持 4. 必要分を取得 & 描画 1 4 2 3 取得するデータの容量を1/3に削減! computedやwatch でのポリゴンを生成をして いたため、ポリゴンの追加・更新などの 変更があるとポリゴン全てを再生成してた →それが不要になった ポリゴンデータ ポリゴンデータ ポリゴンデータ Google Map
© 2019-2024 OPTiM Corp. All rights reserved. 32 泥臭く、計測しながら、カイゼンを進めることができた Frontend
Backend 約 13 ~ 16.5秒 約3.5 ~ 4.1秒 Frontend Backend 約 0.4 ~ 0.5 秒 約 0.5~ 1.0秒 約1.0秒 ~ 1.55秒 約 17.5秒 ~ 20.0秒 1/20のカイゼン 開発当初 (6000件のポリゴンデータ) 現在 (6000件のポリゴンデータ)
© 2019-2024 OPTiM Corp. All rights reserved. 33 泥臭く、計測しながら、カイゼンを進めることができた Frontend
Backend 約 13 ~ 16.5秒 約3.5 ~ 4.1秒 Frontend Backend 約 2.0 ~ 3.0秒 約4.0~ 4.6秒 約5.5秒 ~ 7.1秒 約 20.0 ~ 25.6秒 開発当初 (数万件のポリゴンデータ) 現在 (数万件のポリゴンデータ) 表示不可
© 2019-2024 OPTiM Corp. All rights reserved. 34 最後に
© 2019-2024 OPTiM Corp. All rights reserved. 35 本文(図解用) オプティム
採用 We Are Hiring!! ネットを空気に変える
© 2019-2024 OPTiM Corp. All rights reserved. 36